Skip to content

feat: A2A extension mechanism with header negotiation#17

Open
zeroasterisk wants to merge 1 commit intoactioncard:mainfrom
zeroasterisk:feat/v1-extensions
Open

feat: A2A extension mechanism with header negotiation#17
zeroasterisk wants to merge 1 commit intoactioncard:mainfrom
zeroasterisk:feat/v1-extensions

Conversation

@zeroasterisk
Copy link
Copy Markdown

Part of #13 (A2A v1.0 Protocol Support)

What This PR Does

Adds A2A extension negotiation via HTTP headers, per the v1.0 spec.

New Module: A2A.AgentExtension

Struct representing a protocol extension declaration (from a2a.proto AgentExtension):

  • uri — unique extension identifier (required)
  • description — human-readable description
  • required — if true, client must support this extension
  • params — optional configuration parameters

Server Side (A2A.Plug)

  • New :extensions init option accepts a list of %A2A.AgentExtension{} structs
  • Reads A2A-Extensions request header (comma-separated extension URIs)
  • Validates client declares all server-required extensions
  • Returns ExtensionSupportRequiredError (-32008) for missing required extensions
  • Sets A2A-Extensions response header listing all server-supported extension URIs

Client Side (A2A.Client)

  • New :extensions option on new/2 sends A2A-Extensions header with requests
  • New parse_extensions_header/1 reads server-supported extensions from response

New Error Codes

  • ExtensionSupportRequiredError (-32008)
  • VersionNotSupportedError (-32009)

Tests

14 new tests covering:

  • Extension negotiation happy path (optional + required extensions)
  • Missing required extension error
  • Multiple required extensions validation
  • Response header with all supported URIs
  • Client header sending and struct storage
  • AgentExtension struct creation and validation

All 401 existing tests continue to pass.

Fixes part of #13

Server side (A2A.Plug):
- Read A2A-Extensions request header (comma-separated extension URIs)
- Validate client declares all server-required extensions
- Return ExtensionSupportRequiredError (-32008) for missing required extensions
- Set A2A-Extensions response header with all server-supported extension URIs
- Add :extensions option to Plug init (list of A2A.AgentExtension structs)

Client side (A2A.Client):
- Add :extensions option to new/2 that sends A2A-Extensions header
- Add parse_extensions_header/1 to read server-supported extensions from response

New modules:
- A2A.AgentExtension struct (uri, description, required, params)
- ExtensionSupportRequiredError (-32008) and VersionNotSupportedError (-32009) error codes

14 new tests covering extension negotiation, header parsing, and error cases.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant