协作约 13 分钟

agent-client 业务系统接入

业务系统调用智能体的客户端 SDK:三种调用模式、只认自己的调用句柄、本地工具默认不暴露、断流不等于失败。

依据 agent-solution 0.1.3 · main@bf702bc9(2026-11-03)核实

它解决什么

前面几关讲的是服务端。业务系统(比如订单系统)要调智能体,还得处理一堆客户端的麻烦事:流式输出、断线重连、超时重发、智能体反过来要调本地能力……agent-client 把这些封装成 SDK。

源码agent-client READMEagent-solution/common/agent-client/README.md@bf702bc9
说明

README 开头标注模块状态是"Skeleton + Prototype"。目前有 JVM 版(JDK 17),默认传输走 A2A JSON-RPC over HTTP + SSE;TypeScript 版目录已建。

三个标识,各归各的

标识归谁含义
conversationId业务应用一段会话,多次调用可复用
invocationRef客户端一次调用的句柄,后续操作都用它
taskRef运行时服务端 Task 的权威标识

业务代码只见 invocationRef,服务端的 taskId 由 SDK 内部映射。这样服务端怎么换 Task、怎么重建,都不影响业务侧。

三种调用模式

模式用法
STREAMING订阅事件流,边算边看
BLOCKING等最终结果;服务端只受理没完成时,SDK 有界轮询
ASYNC受理即返回,后续由业务自己查

事件流是一个封闭的类型集合:受理、状态变化、增量内容、需要输入、需要确认工具调用、完成、失败等,业务可以穷尽处理。

本地工具:注册不等于暴露

智能体有时要反过来调业务系统的本地能力,比如"读当前页面""提交订单"。SDK 允许注册本地工具,但默认一个都不暴露,必须显式放行:

client.exposeInConversation("conv-1",
        ToolExposurePolicy.allow("readPage", "submitOrder"));

InvocationRequest req = InvocationRequest.gatewayBuilder("target-agent")
        .conversationId("conv-1")
        .exposure(ToolExposurePolicy.allow("readPage"))  // 本次只放行 readPage
        .build();
说明

示意代码,取自 README 的用法示例;本站没有运行它。

会话级和调用级两层策略取交集,所以调用级只能收紧、不能放大。

源码ToolExposurePolicy.andagent-solution/common/agent-client/agent-client-sdk-for-jvm/src/main/java/com/openjiuwen/client/tool/spi/ToolExposurePolicy.java:109@bf702bc9

有副作用的工具(ACTION)默认要经审批;只读的(OBSERVATION)直接执行。执行顺序是:

可见性校验 → 解析工具 → 参数校验 → 策略守卫 → (需要时)审批 → 执行 → 落库

任何一步拒绝,工具都不执行,结果以"已拒绝"续传给服务端。同一个 toolCallId 最多执行一次。

注意

SDK 的"最多一次"只针对同一个 toolCallId。两次不同的工具调用可能指向同一张订单,业务系统自己还要用订单号这类业务键防重。

断流不等于失败

SSE 断了,SDK 按最后看到的状态判断:

情形处理
已到终态正常结束
在等用户输入服务端按约定关流,等续传
其他非终态先主动查询服务端真实状态,查到就据此恢复
查也查不清发出 ProgressUncertain,附恢复线索
创建还没被确认用同一幂等键、同样内容有界重发,网关回放原任务

恢复线索会明确告诉业务:是"稍后查询,不要重新发起",还是"用同一幂等键原样重发"。默认重试 3 次,按 200、400、800 毫秒退避。

最后一行正好和网关那一关的幂等规则接上:只要幂等键和内容不变,重发多少次服务端都只有一个任务。

小结

  • 业务只用自己的调用句柄,服务端 Task 由 SDK 映射。
  • 本地工具默认不暴露,两级策略取交集;有副作用的工具默认要审批。
  • 断流先查真实状态,查不清就给恢复线索,不伪造成功或失败。

源码出处

链接指向固定提交,仓库后续更新不影响这里的行号。

过关测验

  1. 1. 业务代码应该用哪个标识去查询、续传一次调用?

  2. 2. 注册了一个本地工具 submitOrder,没有设置暴露策略,远端智能体能调用它吗?

  3. 3. 流式调用中 SSE 断了,而且主动查询也确认不了状态,SDK 会怎样?

通关条件

  • ○ 测验全部答对