Clix supports both A2A V1 and legacy V0. New integrations should use V1 by sending A2A-Version: 1.0.
If you omit the A2A-Version header, Clix resolves the request as V0 (0.3).
Method Mapping
| V1 | V0 |
|---|
SendMessage | message/send |
SendStreamingMessage | message/stream |
GetTask | tasks/get |
ListTasks | tasks/list |
CancelTask | tasks/cancel |
SubscribeToTask | tasks/resubscribe |
CreateTaskPushNotificationConfig | tasks/pushNotificationConfig/set |
GetTaskPushNotificationConfig | tasks/pushNotificationConfig/get |
ListTaskPushNotificationConfigs | tasks/pushNotificationConfig/list |
DeleteTaskPushNotificationConfig | tasks/pushNotificationConfig/delete |
GetExtendedAgentCard | agent/getAuthenticatedExtendedCard |
Agent Card
| Area | V1 | V0 |
|---|
| Endpoint metadata | supportedInterfaces | url, preferredTransport, additionalInterfaces |
| Auth metadata | securitySchemes, securityRequirements | securitySchemes, security |
| Extended card capability | capabilities.extendedAgentCard | supportsAuthenticatedExtendedCard |
| Protocol version field | Per interface protocolVersion | Top-level protocolVersion |
Message and Task Objects
| Area | V1 | V0 |
|---|
| Part discriminator | No kind field | kind is required on parts |
| Message shape | messageId, role, parts | Same camelCase fields plus kind: "message" |
| Task shape | id, contextId, status, artifacts | Same camelCase fields plus kind: "task" |
| Stream events | JSON-RPC envelope with v1 StreamResponse result | JSON-RPC envelope with V0 event objects such as kind: "status-update" |
| Area | V1 | V0 |
|---|
| Request params | pageSize, pageToken | limit, offset |
| Response shape | { tasks, nextPageToken, pageSize, totalSize } | Array of tasks |
| Total count | First page only in current Clix implementation | Not returned |
Push Notification Config Params
| Operation | V1 | V0 |
|---|
| Create | params is the config object itself with taskId, url, id?, token?, authentication? | params is { taskId, pushNotificationConfig: { ... } } |
| Get | { taskId, id } | { id, pushNotificationConfigId } |
| List | { taskId } | { id } |
| Delete | { taskId, id } | { id, pushNotificationConfigId } |
SendMessage Result Shape
| Version | Result |
|---|
| V1 | { "result": { "task": { ... } } } |
| V0 | { "result": { ...task... } } |
Role and State Values
The protocol values are the same across Clix V0 and V1:
- Roles serialize as
user, agent, and unspecified
- Task states serialize as
submitted, working, completed, failed, and other lowercase protocol values
The main compatibility differences are method names, container shapes, and pagination models, not the role or state strings.
Example Migration
V0 request
{
"jsonrpc": "2.0",
"id": "req-1",
"method": "message/send",
"params": {
"message": {
"kind": "message",
"messageId": "msg-1",
"role": "user",
"parts": [
{
"kind": "data",
"data": {
"skill": "create-user",
"projectUserId": "user_123"
}
}
]
}
}
}
V1 request
Send this request with A2A-Version: 1.0. If you omit the header, Clix interprets the request as V0.
{
"jsonrpc": "2.0",
"id": "req-1",
"method": "SendMessage",
"params": {
"message": {
"messageId": "msg-1",
"role": "user",
"parts": [
{
"data": {
"skill": "create-user",
"projectUserId": "user_123"
}
}
]
}
}
}
Migration Checklist
- Start sending
A2A-Version: 1.0 on every request, including the public Agent Card request.
- Rename JSON-RPC methods from slash-style V0 names to the PascalCase V1 names.
- Remove
kind fields from message parts and stop expecting kind on messages, tasks, and stream events.
- Update
SendMessage callers to read result.task instead of reading the task directly from result.
- Replace
limit and offset with pageSize and pageToken, and update your parser for the paged ListTasks response object.
- Update task webhook config params to the V1
taskId and id field names.
When to Keep V0
Keep V0 only if you already have a deployed client that depends on the older method names or older object wrappers. For any new integration, V1 is the stable documentation target.