三方Agent接入

如果多模态交互开发套件里内置的技能或Agent不满足需求,可以参考本文调用三方Agent的能力。

协议标准

需基于Google A2A协议进行集成(参见A2A 0.2.5规范

接入流程

1. 配置AgentCard

image

  • 步骤3的返回结果及示例,请参见AgentCard

2. 调用Agent

image

字段说明

AgentCard

字段名称

类型

是否必填

说明

name

String

Agent名称。

description

String

Agent描述。

url

String

Agent服务的基础HTTPS URL。

支持流式传输时自动添加/stream后缀。

version

String

Agent版本。

protocolVersion

String

Agent支持的A2A协议版本。

capabilities

AgentCapabilities

指定支持的可选 A2A 协议功能(例如,流式传输)。

security

String[]

Agent进行通信的安全要求。

目前支持apiKey安全策略,当配置时向Agent发起的请求中会包含如下Header:

X-API-KEY: <value> //在管控台中的配置项

defaultInputModes

String[]

Agent接受的输入媒体类型。

当前支持:"text/plain"

defaultOutputModes

String[]

Agent生成的输出媒体类型。

当前支持:"text/plain"

skills

AgentSkill[]

Agent技能列表(至少1项目)。

AgentCapabilities

字段名称

类型

是否必填

说明

streaming

Boolean

是否支持 SSE 流式传输。

extensions

AgentExtension[]

支持的扩展列表。

AgentExtension

字段名称

类型

是否必填

说明

uri

String

支持的扩展的 URI,包含对扩展能力的说明。

params

Map<String, Object>

配置参数。

AgentSkill

字段名称

类型

是否必填

说明

id

String

Agent内的唯一技能标识符。

name

String

技能名称。

description

String

技能描述。

examples

String[]

技能使用示例。

inputModes

String[]

接收的媒体类型,设置时会覆盖defaultInputModes

outputModes

String[]

输出的媒体类型,设置时会覆盖defaultOutputModes

示例

{
  "name": "超级AI助理",
  "description": "可以复读用户的话,计算两个数'相加',记录并数出用户说了几句话,进行闪光,可以教你打蓝球、踢足球。总之,无所不能",
  "protocolVersion": "0.2.5",
  "url": "https://example/a2a/demo/v1",
  "version": "1.0.0",
  "capabilities": {
    "streaming": true,
    "extensions": []
  },
  "security": [],
  "defaultInputModes": [
    "text/plain"
  ],
  "defaultOutputModes": [
    "text/plain"
  ],
  "skills": [
    {
      "id": "ai-repeat",
      "name": "AI复读",
      "description": "重复用户说的话",
      "tags": [
        "demo",
        "repeat"
      ],
      "examples": [
        "示例: 重复我说的话"
      ]
    },
    {
      "id": "ai-calculate",
      "name": "AI计算",
      "description": "计算两个数'相加'",
      "tags": [
        "demo",
        "calculate"
      ],
      "examples": [
        "示例: 1与2相加是多少"
      ]
    },
    {
      "id": "ai-count",
      "name": "AI数数",
      "description": "记录并数出用户说了几句话",
      "tags": [
        "demo",
        "count"
      ],
      "examples": [
        "示例: 数一下我说了几句话"
      ]
    },
    {
      "id": "ai-flash",
      "name": "AI闪光",
      "description": "可以进行闪光",
      "tags": [
        "demo",
        "flash"
      ],
      "examples": [
        "示例: 进行闪光"
      ]
    },
    {
      "id": "ai-coach",
      "name": "AI教练",
      "description": "可以教你打蓝球、踢足球",
      "tags": [
        "demo",
        "coach"
      ],
      "examples": [
        "示例: 如何打好蓝球"
      ]
    }
  ]
}

Agent调用请求字段

字段名称

类型

是否必填

说明

jsonrpc

String

固定为:"2.0"。

method

String

  • "message/stream":AgentCard支持SSE流式请求。

  • "message/send":AgentCard支不持SSE流式请求。

params

MessageSendParams

请求参数。

id

String

请求ID。

MessageSendParams

字段名称

类型

是否必填

说明

message

Message

要发送的消息内容

Message

字段名称

类型

是否必填

说明

kind

String

固定为:"message"。

role

String

  • "user" :表示当前消息是用户发送的消息。

  • "agent" :表示当前消息是Agent返回的消息。

parts

Part[]

内容部分数组。至少包含一个。

messageId

String

由消息发送方生成的消息标识符。

contextId

String

与消息相关联的上下文标识符。

metadata

Map<String, Object>

与此消息关联的元数据。

Part

字段名称

类型

是否必填

说明

kind

String

标识此部分的内容类型。text:文本类型。

text

String

该部分的文本内容,kind=text时填写。

示例

HTTP请求
{
  "jsonrpc": "2.0",
  "id": "request-1",
  "method": "message/send",
  "params": {
    "message": {
      "messageId": "msg-1",
      "kind": "message",
      "role": "user",
      "parts": [
        {
          "kind": "text",
          "text": "今天会下雨吗?"
        }
      ]
    }
  }
}
HTTP SSE请求
{
  "jsonrpc": "2.0",
  "id": "request-1",
  "method": "message/stream",
  "params": {
    "message": {
      "messageId": "msg-1",
      "kind": "message",
      "role": "user",
      "parts": [
        {
          "kind": "text",
          "text": "今天会下雨吗?"
        }
      ]
    }
  }
}

Agent调用返回字段

字段名称

类型

是否必填

说明

jsonrpc

String

固定为:"2.0"。

id

String

请求ID,与JSONRPCRequest.id值相同。

result

Task | TaskStatusUpdateEvent | TaskArtifactUpdateEvent

请求处理成功时返回。

error

JSONRpcError

请求处理失败时返回。

Task

字段名称

类型

是否必填

说明

id

String

服务器生成的唯一任务标识符(例如 UUID)。

contextId

String

跨多轮交互的上下文对齐的服务器生成 ID。

status

TaskStatus

任务的当前状态。

artifacts

Artifact[]

此任务中Agent生成的输出结果。

TaskStatus

字段名称

类型

是否必填

说明

state

String

任务的当前生命周期状态:

  • submitted:任务已由Agent接收并确认,但处理尚未开始。

  • working:该任务正在由Agent处理中。客户端可能期待进一步的更新或最终状态。

  • completed:任务已成功完成。

  • failed:由于处理过程中发生错误。

  • input-required:Agent需要从用户获取额外输入才能继续。此时多模态交互服务会把用户的下一轮输入也给到该Agent。

  • rejected:任务已终止。此时会由多模态交互服务接管本轮请求的处理。

timestamp

String

记录此状态的时间戳(推荐使用 UTC 时间)。

Artifact

字段名称

类型

是否必填

说明

artifactId

String

Agent生成的结果的标识符。

parts

Part[]

结果的内容,至少有一个。

metadata

Map<String, Object>

与此消息关联的元数据。

TaskStatusUpdateEvent

字段名称

类型

是否必填

说明

taskId

String

正在更新的任务 ID。

contextId

String

关联任务的上下文 ID。

kind

String

固定为:status-update。

status

TaskStatus

新的 TaskStatus 状态。

final

Boolean

如果 true ,表示这是当前流循环的最终状态更新。服务器通常在之后关闭 SSE 连接。

TaskArtifactUpdateEvent

字段名称

类型

是否必填

说明

taskId

String

与生成的结果部分相关联的任务 ID。

contextId

String

关联任务的上下文 ID。

kind

String

固定为:artifact-update。

artifact

Artifact

结果数据。可以是完整的结果,也可以是增量结果。

append

Boolean

true 表示将该部分追加到已返回结果中;false (默认)表示替换掉已返回结果。

lastChunk

Boolean

true 表示这是该结果的最终更新。

JSONRpcError

字段名称

类型

是否必填

说明

code

Integer

错误代码。

message

String

错误描述信息。

示例

HTTP返回
{
  "id": "request-1",
  "jsonrpc": "2.0",
  "result": {
    "id": "task-1",
    "contextId": "context-1",
    "kind": "task",
    "status": {
      "state": "completed",
      "timestamp": "2025-07-15T14:50:28.575338Z"
    },
    "artifacts": [
      {
        "artifactId": "c3fee4d5-7234-48a1-8d2c-cfb715c5ce9e",
        "parts": [
          {
            "kind": "text",
            "text": "今天天气晴,"
          }
        ]
      },
      {
        "artifactId": "c3fee4d5-7234-48a1-8d2c-cfb715c5ce9e",
        "parts": [
          {
            "kind": "text",
            "text": "没有雨。"
          }
        ]
      }
    ]
  }
}
HTTP SSE返回
{
  "id": "request-1",
  "jsonrpc": "2.0",
  "result": {
    "id": "task-1",
    "contextId": "context-1",
    "kind": "task",
    "status": {
      "state": "submitted",
      "timestamp": "2025-07-15T14:52:28.277547Z"
    }
  }
}

{
  "id": "request-1",
  "jsonrpc": "2.0",
  "result": {
    "taskId": "task-1",
    "contextId": "context-1",
    "kind": "artifact-update",
    "artifact": {
      "artifactId": "82eb84b9-0d73-4072-95f8-03655adfbf25",
      "parts": [
        {
          "kind": "text",
          "text": "今天天气晴,"
        }
      ]
    },
    "append": true,
    "lastChunk": false
  }
}

{
  "id": "request-1",
  "jsonrpc": "2.0",
  "result": {
    "taskId": "task-1",
    "contextId": "context-1",
    "kind": "artifact-update",
    "artifact": {
      "artifactId": "82eb84b9-0d73-4072-95f8-03655adfbf25",
      "parts": [
        {
          "kind": "text",
          "text": "没有雨。"
        }
      ]
    },
    "append": true,
    "lastChunk": true
  }
}

{
  "id": "request-1",
  "jsonrpc": "2.0",
  "result": {
    "taskId": "task-1",
    "contextId": "context-1",
    "kind": "status-update",
    "status": {
      "state": "completed",
      "timestamp": "2025-07-15T14:52:28.277643Z"
    },
    "final": true
  }
}

接入示例

在管控台填入https://example/.well-known/agent.json可体验接入自研Agent的流程:

image

进一步集成

至此,您已经完成了自研Agent与多模态交互套件的基础集成,如需进一步集成,请参见: