ADK
ADK(Agent Development Kit)是用来开发和部署 Agent 的框架,它的服务端通过 run_sse 接口以 SSE 事件流返回 Agent 的执行过程。
这一页说明怎么接一个提供 ADK run_sse 接口的后端:每个函数收到什么、要返回什么,以及这个协议要注意的地方。
结论
- 本适配器编码 run_sse 请求,解析 ADK 事件、会话详情和会话数组。实际部署是否提供对应接口,需要逐项确认。
- 停止、续接、插话、重新生成、编辑后重发、改名的示例采用接入方扩展,后端须按后端约定另外提供。
- 请求内容里没有应用名和用户 ID,由接入方在函数里补。
- 发起对话之前会话要已经存在。
最简接入
只给 run,直连本机的服务:
会话要先存在
适配器不替接入方建会话。两种做法:
上面的代码演示第二种,但仅按 404 判断且没有检查建会话响应。接入生产时应先确认 404 原因、检查创建成功并处理并发创建,不能把任意 404 都当作会话不存在。后端对不存在的会话返回什么、能不能用指定的编号建会话,以后端的实际行为为准, 确认办法见后端约定。
走自己的代理
生产环境的请求发给自己的服务:
代理要做的事:
全部能力
注释里标了「另外提供」的函数,地址和字段只是一种排法,以和后端团队商定的为准。
每个函数收到什么、要返回什么
表中“事件流”指未配置 subscribe 时的 Response 或异步事件序列。配置 subscribe 后,run / resume / regenerate / edit 只返回受理 Response,输出全部走订阅;其余能力仍返回 Response。
响应的格式和例子见后端约定 · ADK。
编号
业务状态与内容扩展
聊天里的业务字段通过 transformOutput 转成内容变更。独立业务状态由应用维护,再交给插槽组件;适配器不提供业务状态通知或累积状态 getter。
输入怎么放进请求
后端约定了别的字段时用 transformInput 改。它拿到默认的请求内容,返回要发出去的请求内容:
注意点
当前历史解析的限制
history 必须返回包含 events 数组的会话对象;空历史使用 events: []。非法 JSON、缺少 events 或错误类型会按历史请求失败处理,保留界面中原有的内容。
当前 ADK history 只重建事件内容和可选的会话摘要、active_run,不输出 runSnapshots;即使 events 含错误,也不会重建可操作的历史终态轮次。因此:
多副本部署的会话亲和
多副本部署靠响应头把同一个会话的请求送到同一个副本时,适配器不处理这个响应头。在自己的函数里记下并带回:
流中途断开
连接状态与执行结果分开:断线或缺少终态只表示结果未知。给了 history 时刷新消息与轮次结论;有已收到的游标与 resume 时续流。恢复不会重新调用 run。停止后仍接收输出,远端受理取消不等于已经停止。详见断线恢复与停止确认。
错误
会话业务
会话目录、创建、删除、改名和 fork 由应用调用业务 API,取得真实 sessionId 后传给 useChatSessions。Adapter 不提供 sessions 配置。历史仍由 history 能力函数转换。详见会话契约。
SDK 识别的结束与扩展
当前读取器把 data: [DONE]、turnComplete: true 或 type: run.completed 视为完成;普通 EOF 不会完成。这里描述的是 SDK 识别规则,不保证 ADK 官方服务会发送这些标记。部署若仅靠 EOF 结束,需由有可靠执行结论的服务补标记,不能把意外断线转换成完成。errorCode、旧式 error 是失败证据;SSE event: error 被当作连接中断。
直接流用事件 data.id 作为协议游标,SSE id 不代替缺失的 ADK 事件 id;transformOutput.context.eventId 则取 SSE id,可能为空或与协议游标不同。普通事件的 invocationId 还用于映射后端轮次;targetRunId 也会使用已知的后端编号。
输入附件的 MIME 不被适配器限制,但后端支持范围另行确认。会话列表和历史都不分页。列表标题读 state.title;history 的会话摘要由公共解析器读取顶层 session 或顶层字段,不会自动把 state.title 作为摘要标题。
示例地址和“标准服务”注释仅作为接入模板,不能视为所有 ADK 版本的接口与结束行为保证。