agent-client 业务系统接入
业务系统调用智能体的客户端 SDK:三种调用模式、只认自己的调用句柄、本地工具默认不暴露、断流不等于失败。
依据 agent-solution 0.1.3 · main@bf702bc9(2026-11-03)核实
它解决什么
前面几关讲的是服务端。业务系统(比如订单系统)要调智能体,还得处理一堆客户端的麻烦事:流式输出、断线重连、超时重发、智能体反过来要调本地能力……agent-client 把这些封装成 SDK。
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 映射。
- 本地工具默认不暴露,两级策略取交集;有副作用的工具默认要审批。
- 断流先查真实状态,查不清就给恢复线索,不伪造成功或失败。
源码出处
- agent-solution/common/agent-client/README.mdSDK 概览与集成手册
- agent-solution/common/agent-client/agent-client-sdk-for-jvm/src/main/java/com/openjiuwen/client/tool/spi/ToolExposurePolicy.java:25
public final class ToolExposurePolicy本地工具暴露策略 - agent-solution/common/agent-client/agent-client-sdk-for-jvm/src/main/java/com/openjiuwen/client/tool/spi/ToolExposurePolicy.java:109
public ToolExposurePolicy and(两级策略取交集
链接指向固定提交,仓库后续更新不影响这里的行号。
过关测验
1. 业务代码应该用哪个标识去查询、续传一次调用?
2. 注册了一个本地工具 submitOrder,没有设置暴露策略,远端智能体能调用它吗?
3. 流式调用中 SSE 断了,而且主动查询也确认不了状态,SDK 会怎样?