mirror of
https://github.com/QwenLM/qwen-code.git
synced 2025-12-20 08:47:44 +00:00
- 将 WebView 调整到编辑器右侧 - 添加 ChatHeader 组件,实现会话下拉菜单 - 替换模态框为紧凑型下拉菜单 - 更新会话切换逻辑,显示当前标题 - 清理旧的会话选择器样式 基于 Claude Code v2.0.43 UI 分析实现。
10 KiB
10 KiB
ACP 协议实现状态对比
概述
ACP (Agent Communication Protocol) 是基于 JSON-RPC 2.0 的双向通信协议,用于 IDE 客户端与 AI Agent 服务器之间的通信。
- 协议定义: Google 开源的标准协议(Apache-2.0 License)
- 协议版本: 1
- 传输格式: JSON-RPC 2.0,通过 stdin/stdout 进行行分隔的 JSON 通信
架构说明
┌─────────────────┐ ┌──────────────────┐
│ IDE Client │ │ Agent Server │
│ (VSCode 扩展) │◄──── JSON-RPC ────►│ (qwen CLI) │
└─────────────────┘ └──────────────────┘
角色定义
-
Client (VSCode 扩展):
- 提供 UI 界面
- 处理文件读写
- 请求用户权限
- 接收并展示 Agent 的消息
-
Server (qwen CLI):
- 处理 LLM 交互
- 执行工具调用
- 管理会话状态
- 流式返回响应
协议方法对比
1. Agent Methods (CLI 实现,VSCode 调用)
这些是 qwen CLI 作为 Server 实现的方法,VSCode 扩展 作为 Client 调用:
| 方法 | CLI 实现 | VSCode 调用 | 功能描述 | 文件位置 |
|---|---|---|---|---|
initialize |
✅ | ✅ | 协议初始化,交换能力信息 | CLI: zedIntegration.ts:105-136VSCode: AcpConnection.ts:439-461 |
authenticate |
✅ | ✅ | 用户认证(OAuth/API Key) | CLI: zedIntegration.ts:138-148VSCode: AcpConnection.ts:463-471 |
session/new |
✅ | ✅ | 创建新的聊天会话 | CLI: zedIntegration.ts:150-191VSCode: AcpConnection.ts:473-485 |
session/load |
❌ | ✅ | 加载历史会话 | CLI: 已定义但禁用(返回 loadSession: false)VSCode: AcpConnection.ts:541-553 |
session/prompt |
✅ | ✅ | 发送用户消息给 Agent | CLI: zedIntegration.ts:234-240VSCode: AcpConnection.ts:487-496 |
session/cancel |
✅ | ❌ | 取消当前生成 | CLI: zedIntegration.ts:226-232VSCode: 未实现 |
自定义扩展方法(非标准 ACP):
| 方法 | CLI 实现 | VSCode 调用 | 功能描述 | 文件位置 |
|---|---|---|---|---|
session/list |
❌ | ✅ | 列出所有会话 | VSCode: AcpConnection.ts:498-511 |
session/switch |
❌ | ✅ | 切换到指定会话 | VSCode: AcpConnection.ts:513-521 |
2. Client Methods (VSCode 实现,CLI 调用)
这些是 VSCode 扩展 作为 Client 实现的方法,qwen CLI 作为 Server 调用:
| 方法 | VSCode 实现 | CLI 调用 | 功能描述 | 文件位置 |
|---|---|---|---|---|
session/update |
✅ | ✅ | 流式发送会话更新(notification) | CLI: acp.ts:69-74VSCode: AcpConnection.ts:280-283 (via callback) |
session/request_permission |
✅ | ✅ | 请求用户授权工具执行 | CLI: acp.ts:82-89VSCode: AcpConnection.ts:330-359 |
fs/read_text_file |
✅ | ✅ | 读取文件内容 | CLI: acp.ts:91-98VSCode: AcpConnection.ts:361-403 |
fs/write_text_file |
✅ | ✅ | 写入文件内容 | CLI: acp.ts:100-107VSCode: AcpConnection.ts:405-436 |
Session Update 类型对比
session/update 是一个 notification(不需要响应),支持多种更新类型:
| 更新类型 | CLI 发送 | VSCode 处理 | 功能描述 | 实现位置 |
|---|---|---|---|---|
user_message_chunk |
✅ | ✅ | 用户消息片段 | CLI: zedIntegration.ts:N/A (echo back)VSCode: Webview 渲染 |
agent_message_chunk |
✅ | ✅ | Agent 回复片段 | CLI: zedIntegration.ts:310-322VSCode: Webview 渲染 |
agent_thought_chunk |
✅ | ⚠️ | Agent 思考过程 | CLI: zedIntegration.ts:318 (thought=true)VSCode: 需要特殊样式 |
tool_call |
✅ | ✅ | 工具调用开始 | CLI: zedIntegration.ts:500-509VSCode: 显示 ToolCall 组件 |
tool_call_update |
✅ | ✅ | 工具调用完成/失败 | CLI: zedIntegration.ts:560-566VSCode: 更新 ToolCall 状态 |
plan |
✅ | ⚠️ | 任务计划(TodoList) | CLI: zedIntegration.ts:547-552VSCode: 需要实现 Plan UI |
功能缺失对比
VSCode 扩展缺失的功能
| 功能 | 影响 | 建议优先级 |
|---|---|---|
session/cancel 方法 |
用户无法取消正在运行的请求 | 🔴 高 |
agent_thought_chunk 展示 |
看不到 Agent 的思考过程 | 🟡 中 |
plan 类型展示 |
看不到 Agent 的任务计划 | 🟡 中 |
| Audio/Image content blocks | 不支持多模态输入 | 🟢 低 |
| Embedded resources | 不支持嵌入式资源 | 🟢 低 |
session/load |
CLI 本身不支持,优先级低 | 🟢 低 |
CLI 缺失的功能
| 功能 | 影响 | 建议优先级 |
|---|---|---|
session/load |
无法恢复历史会话 | 🟡 中 |
session/list |
需要 VSCode 扩展自己管理 | 🟢 低 |
session/switch |
需要 VSCode 扩展自己管理 | 🟢 低 |
能力声明对比
CLI Agent Capabilities
{
protocolVersion: 1,
authMethods: [
{ id: 'use_openai', name: 'Use OpenAI API key' },
{ id: 'qwen_oauth', name: 'Qwen OAuth' }
],
agentCapabilities: {
loadSession: false, // ❌ 不支持加载历史会话
promptCapabilities: {
image: true, // ✅ 支持图片输入
audio: true, // ✅ 支持音频输入
embeddedContext: true // ✅ 支持嵌入式上下文
}
}
}
VSCode Client Capabilities
{
protocolVersion: 1,
clientCapabilities: {
fs: {
readTextFile: true, // ✅ 支持读文件
writeTextFile: true // ✅ 支持写文件
}
}
}
工具类型 (Tool Kinds)
所有工具调用都有一个 kind 字段,用于分类:
| Kind | 描述 | 示例 |
|---|---|---|
read |
读取操作 | Read, ReadManyFiles, Glob |
edit |
编辑操作 | Edit, Write |
delete |
删除操作 | Delete files/directories |
move |
移动操作 | Move/rename files |
search |
搜索操作 | Grep, Search |
execute |
执行操作 | Bash, RunCommand |
think |
思考操作 | Task (sub-agent) |
fetch |
网络请求 | WebFetch, API calls |
other |
其他操作 | TodoWrite, etc. |
权<EFBFBD><EFBFBD><EFBFBD>确认流程
sequenceDiagram
participant CLI as qwen CLI
participant VSCode as VSCode Extension
participant User as User
CLI->>VSCode: session/request_permission
Note over CLI,VSCode: 包含 toolCall 详情和选项
VSCode->>User: 显示权限请求 UI
User->>VSCode: 选择选项 (allow_once/always/reject)
VSCode->>CLI: 返回用户选择
CLI->>CLI: 根据选择执行或取消工具
权限选项类型:
allow_once: 仅允许一次allow_always: 始终允许(针对文件/命令/服务器)reject_once: 拒绝一次reject_always: 始终拒绝
Schema <20><><EFBFBD>证
如何使用 Schema
VSCode 扩展现在有完整的 Zod schema 定义:
import * as schema from './acp/schema.js';
// 验证请求
const params: schema.InitializeRequest = {
protocolVersion: schema.PROTOCOL_VERSION,
clientCapabilities: { ... }
};
// 运行时验证
schema.initializeRequestSchema.parse(params);
验证的好处
- 类型安全: TypeScript 编译时检查
- 运行时验证: 捕获协议不匹配错误
- 文档化: Schema 即文档
- 一目了然: 清楚知道哪些字段是必需的
下一步建议
高优先级
-
实现
session/cancel: 允许用户取消正在运行的请求- 在
AcpConnection中实现cancel()方法 - 在 Webview UI 添加取消按钮
- 在
-
实现
agent_thought_chunk展示: 显示 Agent 的思考过程- 在 Webview 中添加 "思考中..." 样式
- 可折叠显示详细思考内容
中优先级
-
实现
plan类型展示: 显示任务计划列表- 设计 Todo/Plan 组件
- 实时更新任务状态
-
添加 Schema 验证: 在更多关键位置添加运行时验证
session/new参数验证session/prompt参数验证- 所有
session/update类型验证
低优先级
- 支持多模态内容: 图片、音频输入
- 支持嵌入式资源: Resource blocks
- 实现
session/load: 需要先等 CLI 支持
参考资源
- Schema 定义:
packages/vscode-ide-companion/src/acp/schema.ts - CLI 实现:
packages/cli/src/zed-integration/ - VSCode 实现:
packages/vscode-ide-companion/src/acp/AcpConnection.ts - 协议来源: Google (Apache-2.0 License)