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

81 lines
2.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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]] — 工具系统总览