cetas-acp 通过 stdio 把 Cetas 以 Agent Client Protocol 暴露出来。任何 ACP 客户端都能拉起它,于是你在终端里认识的那个 agent,会带着编辑器自己的权限 UI 出现在编辑器里。
接入之前
编辑器入口读的是和其他入口同一个 home 目录,而且没有供应商就拒绝启动 —— 没有模型的 agent 服务不了任何 prompt。所以先在终端里配好:
/login
/model然后拿到二进制:从发布归档里解出 cetas-acp,或者自己从源码构建。
Zed
在 Zed 的 settings 里加一条顶层 agent_servers:
{
"agent_servers": {
"Cetas": {
"type": "custom",
"command": "/absolute/path/to/cetas-acp",
"args": [],
"env": {}
}
}
}Windows 上用 cetas-acp.exe。如果你的 Zed 版本要求不同的 schema,按 Zed 的自定义 agent 文档来。
然后打开 agent 面板,选 Cetas。Zed 在 initialize 时会自报身份,所以这个会话的记录会落在 <CETAS_HOME>/.cetas/sessions/zed/。
Lody
Lody 把外部 agent 当作一份 Agent Config 来管,靠一条启动命令注册。Cetas 只需要登记一次:
- 打开 Settings → Agent Config,新增一条配置。
- 命名为
Cetas。 - CLI Type 选 Custom ACP。
- Launch command 填绝对路径 ——
/absolute/path/to/cetas-acp。 - 需要的话,在同一个 Agent Config 里补环境变量(见下面的表)。
- 点 Test。Lody 会拉起 agent、读取它的能力和模型列表;这一步失败基本就是供应商还没配好。
- 保存,然后在新建会话时选择这条配置。
Lody 会把启动命令拆成“命令 + 参数”直接 spawn —— 引号支持,但管道、重定向、glob 和 $VARS 都不会被求值。所以环境变量写在 Agent Config 里,别塞进命令。
Lody 的会话落在 <CETAS_HOME>/.cetas/sessions/lody/。
每个会话拿到什么
每个 ACP 会话都有自己的一套可变机制 —— 模型路由、权限策略、MCP 桥、记录存储、正在跑的回合 —— 所以不同会话上的 prompt 可以并发执行,而不会串权限、串审批。供应商配置和模型目录只组装一次,之后只读共享。
对话记录归客户端所有:客户端存会话内容和 session id,session/resume 时把 id 递回来。Cetas 把已提交的记录落盘,是为了重启之后从磁盘恢复,而不是靠内存。
会话级配置项
ACP 会话对外提供这几项配置:
model—— 改成功后会持久化,作为下次启动的选择。effort—— 当前模型有推理档位时会持久化。permission—— 只在运行时、只属于这个会话,故意不持久化。
变更通过 session/set_config_option 进来。连不上时,先看编辑器的 ACP 日志,再看 agent 的 stderr —— 所有诊断都在 stderr,因为 stdout 上只有 JSON-RPC 帧。
环境变量
| 变量 | 作用 |
|---|---|
CETAS_HOME |
覆盖平台 home;状态落在 <CETAS_HOME>/.cetas |
CETAS_PERMISSION_MODE |
启动姿态:readonly、workspace_write、interactive、auto、yolo。不设是 yolo;取值不认识会警告一次并降回 workspace_write |
CETAS_MCP_MODE=eager |
启动时就连配置好的 MCP 服务器,而不是等到第一个回合 |
CETAS_DELEGATE_FS=host |
文件读写走编辑器的 fs/* 反向调用,而不是本地文件系统 |
CETAS_DEBUG_WIRE=1 |
把这个会话的线上流量追加到 <CETAS_HOME>/.cetas/debug/<session-id>-wire.jsonl |
CETAS_DEBUG_MCP_CATALOG=1 |
把这个会话的工具目录 dump 到 <CETAS_HOME>/.cetas/debug/<session-id>-catalog.json |