# ACP 编辑器接入 README  ·  English  ·  使用指南  ·  ACP 规范 Reasonix 实现了 Agent Client Protocol(ACP)v1,通过标准输入输出提供 NDJSON JSON-RPC 2.0 agent。编辑器和其他 ACP host 负责启动进程、打开一个或多个工作区会话, 并接收流式消息、工具活动、计划、权限请求和配置更新。 ## 启动 agent ACP host 应启动以下命令之一: ```sh reasonix acp reasonix acp --model deepseek-pro reasonix acp --profile delivery ``` 客户端未覆盖模型时,`--model` 用于选择启动模型;`--profile` 把启动工作模式设为 `economy`、`balanced` 或 `delivery`。初始化后,两者仍可按会话切换。 标准输出专用于 ACP 消息,Reasonix 会把诊断写入标准错误,因此 host 不应合并这两个 流。尚未配置 provider 时先运行 `reasonix setup`;initialize 响应也会声明一个启动 `reasonix setup` 的 terminal authentication method。 ## 初始化与能力协商 客户端应在打开会话前调用 `initialize`。Reasonix 会声明以下能力结构(省略无关字段): ```json { "protocolVersion": 1, "agentCapabilities": { "loadSession": true, "sessionCapabilities": { "list": {}, "resume": {}, "close": {}, "delete": {} }, "promptCapabilities": { "image": false, "audio": false, "embeddedContext": true }, "mcpCapabilities": { "http": true, "sse": false }, "_meta": { "reasonix.io": { "sessionSteer": { "method": "_reasonix.io/session/steer" } } } } } ``` 客户端声明 `fs.readTextFile`、`fs.writeTextFile` 或 `terminal` 后,Reasonix 会让 适用的文件操作经过编辑器的未保存 buffer,并让适用的前台命令在客户端持有的 terminal 中运行。客户端没有声明这些能力时,常规工作区工具会在 Reasonix 进程内本地运行。 ## 会话生命周期 每个 ACP 会话都拥有独立的 Reasonix Controller、工作区根目录、模型、工作模式、协作 模式、审批模式、MCP 集合和持久化 transcript,会话之间不会泄漏状态。 | 方法 | 行为 | | --- | --- | | `session/new` | 为绝对路径 `cwd` 打开会话并返回配置状态。 | | `session/load` | 打开持久化 ACP 会话,并通过 `session/update` 通知回放 transcript。 | | `session/resume` | 打开持久化会话,但不回放 transcript。 | | `session/prompt` | 执行一轮任务,流式发送更新,最后返回停止原因。 | | `session/cancel` | 取消活动回合;它是一条 notification。 | | `session/list` | 列出活动和持久化 ACP 会话,可按绝对路径 `cwd` 过滤。 | | `session/close` | 停止活动会话并释放资源,但不删除历史。 | | `session/delete` | 停止会话并删除其持久化 ACP 历史。 | `session/new`、`session/load` 和 `session/resume` 可以携带 `mcpServers`。 Reasonix 支持 stdio、Streamable HTTP 和 legacy SSE server。 stdio `env` 和 HTTP `headers` 支持 ACP 官方的 `[{"name":"...","value":"..."}]` 结构,同时继续接受旧版 object-map 结构。 ## 会话控制 Reasonix 把互不相关的选择拆成独立控制轴,而不是混在一个 mode selector 中: | 控制项 | 可选值 | 协议入口 | | --- | --- | --- | | 协作模式 | `normal`、`plan`、`goal` | `modes` 和 `session/set_mode` | | 模型 | 已配置的 `provider/model` | id 为 `model` 的 `configOptions` | | 推理强度 | provider 支持的等级或 `auto` | id 为 `effort` 的 `configOptions` | | 工作模式 | `economy`、`balanced`、`delivery` | id 为 `work_mode` 的 `configOptions` | | 工具审批 | `ask`、`auto`、`yolo` | id 为 `tool_approval` 的 `configOptions` | 模型、推理强度、工作模式和工具审批统一使用 `session/set_config_option`。切换模型、 推理强度或工作模式时会重建会话 Controller,同时保留历史和其他控制轴;切换工具审批 只更新 gate,不重建 Controller。 旧客户端仍可使用 `session/set_model`。`session/set_mode` 也继续接受 legacy 值 `default` 和 `auto`,分别表示“常规 + 询问”和“常规 + Yolo”;新客户端应使用上面的 独立 selector。 ## Prompt、更新与审批 `session/prompt` 支持文本 block 和内嵌文本 resource,不声明图片或音频能力。执行回合 期间,Reasonix 可能发送: - agent 消息和思考内容 chunk; - pending 和 completed 工具调用更新; - 从 `todo_write` 生成的完整计划更新; - 可用的斜杠命令; - 当前 mode 和配置项更新; - 针对受权限控制工具及用户问题的 `session/request_permission` 请求。 Host 应让 `session/prompt` 请求保持打开,直到 Reasonix 返回停止原因;期间仍需同时处理 双向 request 和 notification。 ## 回合中引导扩展 Reasonix 通过 ACP v1 厂商扩展提供回合中引导。它不是 ACP 核心方法,也不是仍未发布的 ACP v2 `session/inject` 提案。 ### 发现能力 从以下位置读取方法名: ```text agentCapabilities._meta["reasonix.io"].sessionSteer.method ``` 不要假设该扩展一定存在,也不要调用无命名空间的 `session/steer`。ACP 为核心协议保留 所有不以下划线开头的方法名。 ### 发送引导 在 `session/prompt` 仍处于活动状态时调用声明的方法: ```json { "jsonrpc": "2.0", "id": 2, "method": "_reasonix.io/session/steer", "params": { "sessionId": "session-id", "prompt": [ {"type": "text", "text": "把用户名改成邮箱"} ] } } ``` 成功返回 `{}` 表示活动回合已接受引导。Reasonix 会在下一个安全的模型调用边界前把它 作为 user message 加入上下文,不会取消回合,也不会额外消耗工具步骤预算。该消息会进入 正常历史;回放 transcript 时显示用户原文,不显示 Reasonix 内部 steer marker。 | 条件 | JSON-RPC 结果 | | --- | --- | | 活动 prompt 接受引导 | `{}` | | session 不存在或 prompt 为空 | `-32602 InvalidParams` | | session 没有活动 prompt | `-32600 InvalidRequest` | | 客户端调用 `session/steer` | `-32601 MethodNotFound` | 收到 `InvalidRequest` 时,引导没有入队。客户端可以等待活动 prompt 结束,再让用户把该 文本作为普通新 prompt 提交,但不能把失败的 steer 静默显示为已接受。 ## 兼容性与缓存行为 | 表面 | 旧版或非 Reasonix 客户端的行为 | 结论 | | --- | --- | --- | | 现有 ACP v1 方法 | 方法名和响应结构不变。 | 兼容 | | Capability `_meta` | 可以忽略未知 metadata。 | 兼容 | | 持久化 transcript | 不需要新增持久化 schema。 | 兼容 | | CLI、Desktop、Bot steer | 保留现有 idle fallback。 | 兼容 | Steer 只会把用户请求的消息追加到正常会话历史,不改变 system prompt、工具 schema、工具 顺序或其他稳定的 provider prefix 字节。下一次 provider 请求必然包含这条新消息,和任何 普通新用户消息一样会改变新增后缀,但此前的稳定前缀仍可复用。 ## 客户端接入检查清单 1. 启动 `reasonix acp`,分离 stdin、stdout 和 stderr。 2. 调用 `initialize`,同时遵守标准 capability 和 `_meta` capability。 3. 使用绝对工作区路径打开会话,并隔离保存各 session id。 4. Prompt 运行期间继续处理 agent 发往客户端的文件、terminal 和权限请求。 5. 只有在 Reasonix 声明 capability 且 prompt 活动时才显示 steer UI。 6. 把成功的 steer 响应理解为“引导已入队”,而不是“模型已立即完成处理”。 7. 用 `session/close` 释放资源;只有用户明确要删除持久化历史时才调用 `session/delete`。