For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt, and this page is available as Markdown at /features/interactions.md.
外观 ◐
让站点跟随你的 ChatKit打开主题工作台 →

追问与审批

智能体在执行中停下来问用户(追问),或在执行命令、改文件前请用户放行(审批),chatkit 画默认卡片,用户回答后交给适配器继续。

触发追问或审批,答复后继续执行Mock 演示全屏 ↗
正在加载真实示例…

接入 SOP

前提条件:后端需提供交互请求与答复能力;部分连接协议使用自定义卡片。

  1. 按协议将问题或审批挂到工具交互信息上。
  2. 默认卡片走 respond;Codex 等特定连接按对应适配器页提供卡片和回答方式。
  3. 保留 pending、answering、answered 或取消状态,处理发送失败与重复点击。

验证结果

使用真实后端触发问题,回答后检查执行继续;拒绝或失败后应进入相应状态。

排错入口

Mock 通用对话不能证明审批服务已接通;只读卡片先检查 respond 或连接专用回答函数。

完整文件可从本页示例下载;对应配置参考与公开入口用于核对准确签名。

什么时候出现

适配器在工具调用片段的 metadata['chatkit.interaction'] 上挂交互请求,界面按它画卡片:

交互请求默认卡片回答
追问(kind: 'question')问题标题、带编号的选项(推荐项加标记)、自由填写框;单独成块,不收进折叠的执行流点选项或填写后发送
审批(kind: 'approval')说明、待执行的命令、后端给的决定按钮点一个决定
等外部结果(kind: 'external')没有默认卡片,照常是一行工具由接入方自己画、自己回答

回答后追问卡片只留下问题本身,回答显示为一条用户消息(顶部引用被回答的问题),之后的回答另起一条。

回答怎么发出

卡片调用 actions.respond(toolCallId, response)(运行时上是 runtime.respond({ toolCallId, response })):

  • 回答作为新的一轮交给适配器的 respond 能力函数;有一轮在进行时不受理;
  • 交互请求立刻标为回答中(answering),新的一轮有了产出后记为已回答(answered),没受理时退回等待(pending),可以再答;
  • 适配器没有 respond 时卡片只读,选项不可点。

各适配器从协议里怎么认出交互请求、respond 要发什么,见对应的接入页,例如 ADK · 长时工具与追问。

换成自己的卡片

按工具名登记整行接管,默认卡片就不再出现;自己的卡片里用 getChatkitInteraction 读请求,用 useChatkitActions().respond 回答。也可以直接用导出的 ChatkitInteractionCard 包一层:

import { ChatkitInteractionCard, getChatkitInteraction, useChatkitActions } from '@volcengine/chatkit';

function AskUser({ toolCallId, metadata }: ChatkitToolViewProps) {
  const { respond } = useChatkitActions();
  const interaction = getChatkitInteraction(metadata);
  if (!interaction) return null;
  return (
    <ChatkitInteractionCard
      interaction={interaction}
      onRespond={respond ? response => respond(toolCallId, response) : undefined}
    />
  );
}

<Chatkit sessions={sessions} renderers={{ tools: { ask_user: { render: AskUser } } }} />;