【RPI 更新】把 rpi Agent 装进你的zed 编辑器

💡 原文中文,约1900字,阅读约需5分钟。
📝

内容提要

rpi-acp 是让 Zed 通过 ACP 协议调用 rpi 的桥接扩展。它接管 stdio,为每个会话启动 rpi RPC 子进程,模型与工具均在子进程运行。事件映射支持流式文本、工具调用与计划;会话以 UUID 持久化到 JSONL,可恢复重放。权限弹窗映射为标准请求,多选问题经 _meta 协商。支持自动注册 Zed,也可编译独立二进制。

🔎

延伸解读

桥接层不跑模型,行为与终端一致

rpi-acp 作为 cdylib 扩展,只负责接管 stdio、实现 ACP v1 协议,并为每个会话启动一个 rpi --mode rpc 子进程。模型、工具、认证和技能全部在子进程中运行,因此通过 Zed 使用 rpi 与直接在终端运行 rpi 的行为完全一致,不会因编辑器集成而改变核心逻辑。

会话持久化与恢复机制

每个会话使用稳定 UUID,历史以原生 JSONL 格式保存在 ~/.rpi/agent/acp/sessions 目录下,可通过 RPI_ACP_SESSION_DIR 环境变量覆盖。进程退出后会话仍保留,session/load 会恢复并重放历史,session/resume 则恢复但不重放。未知会话会返回错误,不会静默开启空对话。

权限与多选问题的处理方式

插件弹窗(如 bash 确认)被映射为标准 session/request_permission 请求,用户选择会回传给插件,默认启用 --permission-gate。由于 ACP v1 没有通用多选方法,双方在 initialize 阶段通过 _meta 协商,只有广告了 v1 的客户端才会收到 _rpi/request_question,超时默认 300 秒,并配套 _rpi/dialog_closed 通知回收 UI。

安装与独立二进制选项

可通过 rpi install rpi-acp 或 task install 安装,并在 Zed 的 settings.json 中配置 agent_servers。--acp 会自动注册到 Zed,幂等且保留 JSONC 注释,设置 RPI_ACP_NO_AUTO_REGISTER_ZED=1 可关闭。此外,同一 server 可编译为独立二进制 rpi-acp-bridge,原生拥有 stdin/stdout,无需 ownsStdio,可直接对接 stock rpi。

❓

Q&A

rpi-acp 是什么?它有什么作用?

rpi-acp 是一个 cdylib 扩展,作为桥接层让 Zed 编辑器通过 ACP 协议调用 rpi。它接管 stdio,为每个会话启动一个 rpi --mode rpc 子进程,模型与工具均在子进程运行,因此行为与终端中运行 rpi 一致。

rpi-acp 如何解决 stdio 被宿主抢占的问题?

当带 --acp 参数时,扩展在注册阶段声明 {"ownsStdio": true},宿主随即停止 drain stdin,改走 StdioLifecycle,将 stdin/stdout 交给扩展。从终端直接运行 --acp 会快速失败(一条消息 + exit 2),要注册需使用 rpi --install-zed。

rpi-acp 如何映射 rpi RPC 事件到 ACP 更新?

映射关系包括:text_delta/thinking_delta 映射为 agent_message_chunk/agent_thought_chunk;tool_execution_start 映射为 tool_call(edit/write 带 diff);tool_execution_update/_end 映射为 tool_call_update;plan_mode_complete 映射为 plan;outcome aborted/completed 映射为 stopReason: cancelled/end_turn。流式文本使用累积快照加 finalText 去重,不重发已发过的 chunk。

rpi-acp 的会话持久化是如何工作的?

会话使用稳定 UUID,原生 JSONL 历史保存在 ~/.rpi/agent/acp/sessions(可用 RPI_ACP_SESSION_DIR 覆盖),进程退出后仍存在。session/load 会恢复并重放,session/resume 恢复但不重放。未知会话返回错误,不会静默开空对话。

rpi-acp 如何处理权限请求和用户问题?

权限方面,插件弹窗(如 bash 确认)映射成标准 session/request_permission,用户选择回传插件,默认带 --permission-gate。问题方面,ACP v1 没有通用多选方法,双方在 initialize 里用 _meta: {"pi-rust/questions": 1} 协商,只有广告了 v1 的客户端才收到 _rpi/request_question,超时默认 300s,配套 _rpi/dialog_closed 通知回收 UI。

如何安装和配置 rpi-acp 到 Zed 编辑器?

安装命令:rpi install rpi-acp 或 task install。在 Zed 的 settings.json 中添加:{"agent_servers": {"rpi": {"type": "custom", "command": "rpi", "args": ["--acp"]}}}。args 可透传普通 flag,如 ["--acp", "--model", "gateway/model"]。--acp 会自动注册到 Zed(幂等、原子写、保留 JSONC 注释),设 RPI_ACP_NO_AUTO_REGISTER_ZED=1 可关闭自动注册。

rpi-acp-bridge 独立二进制是什么?如何构建?

rpi-acp-bridge 是同样的 server 编译成的独立二进制,原生拥有 stdin/stdout,不需要 ownsStdio,可直接对着 stock rpi 运行。查找 agent 的顺序:RPI_BIN → 自身 → 兄弟文件 → PATH。构建命令:cargo build --release -p rpi-acp --bin rpi-acp-bridge,打包命令:task pack-acp。

🏷️

标签

➡️

继续阅读