{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://a-im.cn/schemas/a2a-v1.json",
  "title": "AIM A2A JSON-RPC 2.0 Request",
  "type": "object",
  "required": ["jsonrpc", "id", "method", "params"],
  "properties": {
    "jsonrpc": {"const": "2.0"},
    "id": {"oneOf": [{"type": "string"}, {"type": "integer"}]},
    "method": {"enum": ["SendMessage", "SendStreamingMessage", "ContinueTask", "GetTask", "ListTasks", "CancelTask", "SubscribeToTask", "aim.realtime.GetSession", "aim.realtime.RegisterEndpoint", "aim.realtime.JoinSession", "aim.realtime.EndSession", "aim.realtime.SendInteraction", "aim.realtime.GetCommand", "aim.realtime.GetOperation"]},
    "params": {"type": "object"}
  },
  "additionalProperties": false,
  "allOf": [
    {"if": {"properties": {"method": {"enum": ["SendMessage", "SendStreamingMessage"]}}}, "then": {"properties": {"params": {"$ref": "#/$defs/sendParams"}}}},
    {"if": {"properties": {"method": {"const": "ContinueTask"}}}, "then": {"properties": {"params": {"$ref": "#/$defs/continueParams"}}}},
    {"if": {"properties": {"method": {"enum": ["GetTask", "CancelTask", "SubscribeToTask"]}}}, "then": {"properties": {"params": {"$ref": "#/$defs/taskParams"}}}},
    {"if": {"properties": {"method": {"const": "ListTasks"}}}, "then": {"properties": {"params": {"$ref": "#/$defs/listParams"}}}},
    {"if": {"properties": {"method": {"const": "aim.realtime.GetSession"}}}, "then": {"properties": {"params": {"$ref": "#/$defs/realtimeGetSessionParams"}}}},
    {"if": {"properties": {"method": {"const": "aim.realtime.RegisterEndpoint"}}}, "then": {"properties": {"params": {"$ref": "#/$defs/realtimeRegisterEndpointParams"}}}},
    {"if": {"properties": {"method": {"const": "aim.realtime.JoinSession"}}}, "then": {"properties": {"params": {"$ref": "#/$defs/realtimeJoinSessionParams"}}}},
    {"if": {"properties": {"method": {"const": "aim.realtime.EndSession"}}}, "then": {"properties": {"params": {"$ref": "#/$defs/realtimeEndSessionParams"}}}},
    {"if": {"properties": {"method": {"const": "aim.realtime.SendInteraction"}}}, "then": {"properties": {"params": {"$ref": "#/$defs/realtimeSendInteractionParams"}}}},
    {"if": {"properties": {"method": {"const": "aim.realtime.GetCommand"}}}, "then": {"properties": {"params": {"$ref": "#/$defs/realtimeGetCommandParams"}}}},
    {"if": {"properties": {"method": {"const": "aim.realtime.GetOperation"}}}, "then": {"properties": {"params": {"$ref": "#/$defs/realtimeGetOperationParams"}}}}
  ],
  "$defs": {
    "uuid": {"type": "string", "format": "uuid"},
    "part": {
      "type": "object",
      "properties": {
        "text": {"type": "string"},
        "raw": {"type": "string", "minLength": 1, "maxLength": 699052},
        "url": {"type": "string"},
        "data": {},
        "mediaType": {"type": "string", "maxLength": 127},
        "filename": {"type": "string", "minLength": 1, "maxLength": 255},
        "metadata": {}
      },
      "oneOf": [
        {"required": ["text"]},
        {"required": ["raw", "mediaType"]},
        {"required": ["url", "mediaType"]},
        {"required": ["data"]}
      ],
      "additionalProperties": false
    },
    "message": {
      "type": "object",
      "required": ["messageId", "role", "parts"],
      "properties": {
        "messageId": {"type": "string", "minLength": 1, "maxLength": 128},
        "role": {"const": "ROLE_USER"},
        "parts": {"type": "array", "minItems": 1, "maxItems": 17, "items": {"$ref": "#/$defs/part"}},
        "contextId": {"type": ["string", "null"]},
        "taskId": {"type": ["string", "null"]},
        "metadata": {},
        "extensions": {"type": "array", "items": {"type": "string"}},
        "referenceTaskIds": {"type": "array", "maxItems": 0}
      },
      "additionalProperties": false
    },
    "sendParams": {
      "type": "object",
      "required": ["message"],
      "properties": {
        "message": {"allOf": [{"$ref": "#/$defs/message"}, {"properties": {"taskId": {"type": "null"}}}]},
        "configuration": {
          "type": "object",
          "properties": {
            "returnImmediately": {"type": "boolean"},
            "acceptedOutputModes": {"type": "array", "items": {"enum": ["text/plain", "image/*", "application/octet-stream"]}},
            "historyLength": {"type": ["integer", "null"], "minimum": 0},
            "taskPushNotificationConfig": {"type": "null"}
          },
          "additionalProperties": false
        },
        "metadata": {}
      },
      "additionalProperties": false
    },
    "continueParams": {
      "type": "object",
      "required": ["id", "requirementId", "expectedVersion", "actionDigest", "message"],
      "properties": {
        "id": {"$ref": "#/$defs/uuid"},
        "requirementId": {"$ref": "#/$defs/uuid"},
        "expectedVersion": {"type": "integer", "minimum": 0},
        "actionDigest": {"type": "string", "pattern": "^sha256:[0-9a-f]{64}$"},
        "message": {
          "allOf": [
            {"$ref": "#/$defs/message"},
            {"type": "object", "required": ["taskId"], "properties": {
              "taskId": {"$ref": "#/$defs/uuid"},
              "parts": {"type": "array", "minItems": 1, "maxItems": 17, "items": {
                "allOf": [{"$ref": "#/$defs/part"}, {"not": {"anyOf": [{"required": ["raw"]}, {"required": ["url"]}]}}]
              }}
            }}
          ],
          "x-aim-crossFieldConstraints": ["message.taskId equals params.id", "message.contextId, when supplied, equals the task contextId"]
        },
        "historyLength": {"type": ["integer", "null"], "minimum": 0}
      },
      "additionalProperties": false
    },
    "taskParams": {
      "type": "object",
      "required": ["id"],
      "properties": {
        "id": {"$ref": "#/$defs/uuid"},
        "historyLength": {"type": ["integer", "null"], "minimum": 0}
      },
      "additionalProperties": false
    },
    "realtimeGetSessionParams": {"type":"object","required":["sessionId"],"properties":{"sessionId":{"$ref":"#/$defs/uuid"}},"additionalProperties":false},
    "realtimeRegisterEndpointParams": {"type":"object","required":["sessionId","sessionEpoch","commandId","clientEndpointKey","capabilities"],"properties":{"sessionId":{"$ref":"#/$defs/uuid"},"sessionEpoch":{"type":"integer","minimum":1},"commandId":{"$ref":"#/$defs/uuid"},"clientEndpointKey":{"type":"string","minLength":1,"maxLength":128},"capabilities":{"$ref":"#/$defs/realtimeEndpointCapabilities"}},"additionalProperties":false},
    "realtimeEndpointCapabilities": {"type":"object","required":["audioInput","audioOutput","camera","screen","interactions"],"properties":{"audioInput":{"type":"boolean"},"audioOutput":{"type":"boolean"},"camera":{"type":"boolean"},"screen":{"type":"boolean"},"interactions":{"type":"array","items":{"enum":["text","pointer","tool","confirmation"]},"uniqueItems":true}},"additionalProperties":false},
    "realtimeJoinSessionParams": {"type":"object","required":["sessionId","sessionEpoch","endpointId","commandId"],"properties":{"sessionId":{"$ref":"#/$defs/uuid"},"sessionEpoch":{"type":"integer","minimum":1},"endpointId":{"$ref":"#/$defs/uuid"},"commandId":{"$ref":"#/$defs/uuid"}},"additionalProperties":false},
    "realtimeEndSessionParams": {"type":"object","required":["sessionId","commandId","reason"],"properties":{"sessionId":{"$ref":"#/$defs/uuid"},"commandId":{"$ref":"#/$defs/uuid"},"reason":{"type":"string","minLength":1,"maxLength":128}},"additionalProperties":false},
    "realtimeSendInteractionParams": {"type":"object","required":["sessionId","sessionEpoch","commandId","type","payload"],"properties":{"sessionId":{"$ref":"#/$defs/uuid"},"sessionEpoch":{"type":"integer","minimum":1},"commandId":{"$ref":"#/$defs/uuid"},"type":{"enum":["input.text","visual.select","response.interrupt","operation.confirm","operation.cancel","media.request","media.decide","media.prepare","media.stop","media.revoke"]},"payload":{"type":"object"}},"additionalProperties":false},
    "realtimeGetCommandParams": {"type":"object","required":["sessionId","commandId"],"properties":{"sessionId":{"$ref":"#/$defs/uuid"},"commandId":{"$ref":"#/$defs/uuid"}},"additionalProperties":false},
    "realtimeGetOperationParams": {"type":"object","required":["sessionId","operationId"],"properties":{"sessionId":{"$ref":"#/$defs/uuid"},"operationId":{"$ref":"#/$defs/uuid"}},"additionalProperties":false},
    "realtimeSessionCreate": {"type":"object","required":["operation","clientSessionId","requested","requiredCapabilities","recording","retention"],"properties":{"operation":{"const":"session.create"},"clientSessionId":{"$ref":"#/$defs/uuid"},"requested":{"type":"object","required":["mediaBinding","audio","userVideoSources","agentVideoSources","interactions"],"properties":{"mediaBinding":{"const":"livekit-webrtc-v1"},"audio":{"const":"bidirectional"},"userVideoSources":{"type":"array","items":{"enum":["camera","screen"]}},"agentVideoSources":{"type":"array","items":{"enum":["camera","screen"]}},"interactions":{"type":"array","items":{"enum":["text","pointer","tool","confirmation"]}}},"additionalProperties":false},"requiredCapabilities":{"type":"array","items":{"enum":["audio_input","audio_output","vision_input"]}},"recording":{"const":"off"},"retention":{"type":"object","required":["transcript","summary"],"properties":{"transcript":{"enum":["off","on"],"description":"Explicit on retains stable user and Agent text in the existing direct chat; audio/video recording remains off. Current Provider transcriptHistory capability is required."},"summary":{"const":"off"}},"additionalProperties":false}},"additionalProperties":false},
    "listParams": {
      "type": "object",
      "properties": {
        "contextId": {"type": ["string", "null"]},
        "status": {"enum": ["TASK_STATE_SUBMITTED", "TASK_STATE_WORKING", "TASK_STATE_COMPLETED", "TASK_STATE_FAILED", "TASK_STATE_CANCELED", "TASK_STATE_INPUT_REQUIRED", "TASK_STATE_REJECTED", "TASK_STATE_AUTH_REQUIRED", null]},
        "pageSize": {"type": ["integer", "null"], "minimum": 1, "maximum": 100},
        "pageToken": {"type": ["string", "null"]},
        "historyLength": {"type": ["integer", "null"], "minimum": 0},
        "statusTimestampAfter": {"type": ["string", "null"], "format": "date-time"},
        "includeArtifacts": {"type": "boolean"}
      },
      "additionalProperties": false
    }
  },
  "x-aim-transport": {
    "versionHeader": {"name": "A2A-Version", "required": true},
    "realtimeExtensionHeader": {"name": "A2A-Extensions", "valueMustContain": "urn:aim:a2a:realtime:v1", "requiredForMethodsPrefix": "aim.realtime."},
    "realtimeSessionCreateDataPart": {"mediaType": "application/json", "schema": "#/$defs/realtimeSessionCreate", "extension": "urn:aim:a2a:realtime:v1"},
    "oauthScopes": {
      "SendMessage": "a2a.invoke",
      "SendStreamingMessage": "a2a.invoke",
      "ContinueTask": "a2a.invoke",
      "GetTask": "a2a.tasks.read",
      "ListTasks": "a2a.tasks.read",
      "SubscribeToTask": "a2a.tasks.read",
      "CancelTask": "a2a.tasks.cancel",
      "aim.realtime.GetSession": "a2a.tasks.read",
      "aim.realtime.RegisterEndpoint": "a2a.invoke",
      "aim.realtime.JoinSession": "a2a.invoke",
      "aim.realtime.EndSession": "a2a.invoke",
      "aim.realtime.SendInteraction": "a2a.invoke",
      "aim.realtime.GetCommand": "a2a.tasks.read",
      "aim.realtime.GetOperation": "a2a.tasks.read"
    }
  }
}
