2026-05-20 21:39:12 +08:00

2.8 KiB
Raw Blame History

title created updated type tags sources
Clarify Tool 澄清工具 2026-04-16 2026-04-16 entity
tool
agent
websocket
packages/backend/src/modules/netaclaw/tools/builtin/clarify.ts
packages/backend/src/modules/netaclaw/runtime/attempt.ts
packages/backend/src/modules/netaclaw/gateway/server.ts
packages/frontend/src/modules/agent/components/clarify-card.vue

Clarify Tool 澄清工具

概述

Agent 在 ReAct 循环中向用户提出澄清问题的交互工具。支持选择题最多4项和开放式问题。通过 Promise 阻塞 Agent 执行,等待用户回答后继续。注册在 tool-cataloginteraction 工具集。

Schema 定义

const ClarifyParams = Type.Object({
  question: Type.String({ description: '要问用户的问题' }),
  choices: Type.Optional(Type.Array(Type.String(), {
    maxItems: 4, description: '预设选项最多4个'
  })),
});

数据流

Agent 调用 clarify → attempt.ts 检测 → onClarifyRequest 回调
    ↓
WebSocket 网关: 生成 requestId → clarifyResolvers.set() → 发送 clarify_request
    ↓
前端 Store: 创建 role='clarify' 消息 → 渲染 clarify-card 组件
    ↓
用户点击选项/输入回答 → sendClarifyResponse() → 发送 clarify_response
    ↓
WebSocket 网关: clarifyResolvers.get(requestId).resolve(answer)
    ↓
Agent 继续 ReAct 循环

核心文件

文件 职责
tools/builtin/clarify.ts 工具定义 + Schema
runtime/attempt.ts:72-93 特殊处理:检测 clarify 调用,触发回调
gateway/server.ts:263-269 生成 requestIdPromise 阻塞,转发 WS 事件
gateway/protocol.ts:132-136 clarify_request / clarify_response 协议定义
前端 store/chat.ts:248-258 接收事件,创建 clarify 消息
前端 components/clarify-card.vue 渲染问题+选项按钮+自定义输入
service/agent_channel.ts:347-384 微信渠道纯文本降级

微信渠道降级

微信不支持 WebSocket 交互,采用纯文本 + 数字映射方案:

  1. 构造文本消息:❓ 问题\n1. 选项1\n2. 选项2\n请回复数字或直接输入
  2. 通过微信 API 发送,存入 pendingClarify Map
  3. 用户回复数字 → 映射到 choices[num-1];回复文本 → 直接使用
  4. 解决 PromiseAgent 继续

WebSocket 协议

// 服务端 → 客户端
{ type: 'clarify_request', sessionId, data: { requestId, question, choices? } }

// 客户端 → 服务端
{ type: 'clarify_response', sessionId, requestId, answer }

关联页面