81 lines
2.8 KiB
Markdown
Raw Normal View History

2026-05-20 21:39:12 +08:00
---
title: Clarify Tool 澄清工具
created: 2026-04-16
updated: 2026-04-16
type: entity
tags: [tool, agent, websocket]
sources: [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-catalog]] 的 `interaction` 工具集。
## Schema 定义
```typescript
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 协议
```typescript
// 服务端 → 客户端
{ type: 'clarify_request', sessionId, data: { requestId, question, choices? } }
// 客户端 → 服务端
{ type: 'clarify_response', sessionId, requestId, answer }
```
## 关联页面
- [[tool-catalog]] — 工具目录interaction 工具集)
- [[agent-runtime]] — ReAct 循环中的 clarify 回调
- [[websocket-gateway]] — clarify 事件转发
- [[agent-channel]] — 微信渠道降级实现
- [[tool-system]] — 工具系统总览