permissionPolicy.type 设置为 always_ask。尚未配置工具时,也可以先完成文字对话和刷新恢复部分。
1. 创建会话,提交任务
下面使用 curl、jq 和登录取得的用户 token,方便在本地验证与控制台相同的交互。接入业务后端时,可以改用入口指南中已经授权的 Application key。将示例中的 ID 替换为实际资源 ID;如果 Agent 已配置默认 Environment,也可以省略创建请求中的environmentId。本地安装的 Gateway 默认端口为 18080。
SESSION_ID,让聊天页面的路由能够定位这段对话;同时保存 TURN_ID,用于识别刚提交的任务。只有用户新建会话时才创建新的 Session。如果用户只是刷新页面,应用应读取原有记录,而不是再次创建会话或发送问题。
示例中的两个幂等键分别用于创建会话和提交任务。网络超时后重试同一次操作时,应沿用原来的 key 和相同的请求内容。用户确实新建另一段对话或提出下一个问题时,应用才为相应请求生成新的 key。
2. 先恢复内容,再订阅 SSE
turn_id 的 turn.completed 事件或查询得到的 Turn 状态,判断这次任务是否成功。事件去重、断线续传和后台通知的完整说明见SSE 与事件续传。
3. 接到自己的页面
控制台 Session 的 Execution 页签已经把这些交互连接起来,对应的组件是agentscope-service/frontend/src/components/SessionExecution.tsx。可以先在这里提交任务、查看工具调用和回答待办,了解一次完整交互如何进行,再把相同能力接到自己的业务页面。
下面的连接代码可以放在控制台的 src/ 下,复用 api/agentSessions.ts 读取快照和事件,再通过 api/agentSessionView.ts 把事件应用到页面状态。这两个文件是控制台的客户端实现。迁移到其他应用时,还需要一并适配 api/http.ts 的认证依赖和会话类型,并使用自己的 Gateway 地址与登录方式。
mountConversation(sessionId, render, showError) 来恢复内容并订阅后续事件。离开页面或切换到另一个会话之前,调用它返回的清理函数,停止接收旧会话的事件。render 根据消息 ID 和工具调用 ID 更新已有卡片,让一次回复或工具调用在同一个位置持续展示。
短暂断网时,客户端从已经成功应用的 cursor 重连;刷新后走新 snapshot。不要只把 cursor 放入 localStorage 却丢掉对应视图,否则前半段内容不会再次播放。非可恢复的认证/请求错误通过 showError 交给页面处理。
工具参数还在生成时,也可能刷新页面;状态更新器利用 snapshot 中保留的 active_tool_call_id 接上省略调用 ID 的后续参数片段。同一任务可产生多条 assistant item 和多个工具调用,不能把全部增量拼到最后一条消息。
4. 把用户操作接到正确的 API
下面将聊天页面上的操作对应到 Session API。所有路径都相对于SESSION_URL;应用使用服务返回的 Session、Turn 和请求 ID 定位已有工作,由服务管理具体执行过程。
创建 Turn、调整要求、补充背景和回答待办时,都应为这一次操作提供稳定的
Idempotency-Key。下面演示用户检查工具请求并点击“允许”后,应用如何提交确认答复。REQUEST_ID 必须来自当前待办卡片中的 request_id,不能用工具调用 ID 替代:
payload 中提交实际的 output 和 is_error;需要指定人员确认时,则使用该人员有权限的用户身份。如何定位待办和处理命令回执见回答 required action。这些答复是在推进原来的任务,最终是否完成仍以 Turn 的结果为准。
5. 用真实工具走完一次流程
要验证整个交互过程,可以给资料助手绑定至少两个可用的工具操作,并让其中一个需要用户确认。随后提交与工具能力匹配的任务,例如“读取两份材料,分别核对后写出汇总”。当 Agent 调用工具并继续整理结果时,分别尝试下面的页面操作,检查应用是否能恢复已有内容并接上后续执行。
上面的页面恢复只是在重新显示已有工作。恢复旧 checkpoint 会改变 Agent 的上下文,之后需要提交新的 Turn;如果需要继续被中断的原任务,则应检查恢复条件后使用
resume。这两类执行操作见会话、任务与预算。
当聊天页面还需要让用户上传材料或下载结果时,可以按文件与产物接入对应能力。如果希望用户离开后由业务后端接收完成通知,则在SSE 与事件续传中继续配置 Webhook。