🌟 **AI代理的隐形手:从孤独执行到实时观察**
想象一下,你是一位AI代理,正像一位隐形的魔术师,在数字世界的舞台上挥舞魔杖——读取文件、写入代码、执行终端命令。可惜,观众(那些ACP客户端,比如Zed编辑器)却只能看到魔术的最终结果,却无法窥见你手指翻飞的每一个细节。这听起来多像一场隔着单向玻璃的表演啊!而现在,KLIP-2提案带来的ACPKaos,就像突然拉开幕布的开关,让一切变得透明、有趣且高效。它是一个近乎即插即用的LocalKaos变体,几乎在所有行为上都和LocalKaos一模一样,但聪明地将少数关键操作——文件读写和终端命令——重定向到ACP客户端。这样,工具的行为保持不变,而ACP成了真正的执行后台。整个过程就像把本地厨房的厨师升级成能让餐厅客人实时观看烹饪过程的直播主播,既保留了原汁原味的操作,又增添了互动的乐趣。
这份提案的作者@stdrc在2025年12月29日更新并标记为“已实现”,它精准地抓住了AI代理系统演进的核心痛点。ACPKaos不是大刀阔斧的革命,而是优雅的微调:它包裹住LocalKaos,只覆盖工具真正需要的极小表面,其他一切都委托给LocalKaos处理。结果呢?ACP客户端终于能“看到”AI做了什么,开发者在Zed里就能直观感受到代理的每一次文件编辑和命令执行,就像亲眼看着一位老朋友在你的电脑上忙碌,却无需担心任何行为上的意外变化。这不仅仅是技术优化,更是让AI代理从“黑箱”走向“透明伙伴”的重要一步。想想看,在未来的AI协作场景中,你不再是孤独的代码幽灵,而是能被客户端实时观察的可靠搭档——这会让整个开发流程变得多么生动而充满故事感!
🚀 **驱动力量:为什么ACPKaos是必然的选择?**
让我们像讲故事一样回溯动机吧。想象一个忙碌的AI代理团队,他们正用工具如Shell、ReadFile、WriteFile和StrReplaceFile来操控文件和命令。但问题来了:我们迫切希望ACP客户端(比如Zed)能观察到这些文件编辑和命令执行的过程。为什么呢?因为只有这样,客户端才能真正“看到”代理在做什么,形成无缝的交互闭环。工具级的ACP替换虽然已经能工作,但它就像在每件工具上都贴了临时补丁——功能凑合,却不是最根本的设计。
KAOS系统早已巧妙地抽象了操作系统操作,LocalKaos是默认实现,而ACP作为后端简直天生一对!它能自然地融入KAOS的框架。通过将集成下沉到KAOS层,ACPKaos消除了核心工具中重复的逻辑,避免了代码的冗余。以前的工具级集成就像每次做饭都得重新发明刀叉,现在ACPKaos直接把厨房升级成智能共享空间,让ACP客户端实时同步一切。这不仅仅节省了开发时间,更让整个系统更优雅、更可维护。幽默地说,这就好比从手动洗碗机升级到智能 dishwasher——你还是在洗碗,但现在机器能自动告诉你水温、进度,还能让家人隔着玻璃门欣赏整个过程。提案强调,这种设计让AI代理的“执行后台”真正与客户端融为一体,开启了AI协作的新纪元。
🔒 **规则与边界:ACPKaos的严谨约束**
任何伟大的创新都离不开清晰的边界,就像魔术师的规则书一样,KLIP-2提案为ACPKaos设定了严格的约束和参考,确保一切井井有条。首先,只使用ACP客户端明确广告的方法:包括`fs/read_text_file`、`fs/write_text_file`,以及`terminal/*`系列。这些细节都参考了ACP初始化协议、文件系统协议和终端协议(具体链接可在提案中找到)。其他所有操作呢?一律老老实实传递给LocalKaos,绝不越界。
现有工具的行为必须保持完全不变——Shell、ReadFile、WriteFile、StrReplaceFile这些老将不能有任何意外的改变。能力标志(capability flags)是独立的:`readTextFile`和`writeTextFile`可以分别启用或禁用,实现时绝不能调用不支持的ACP方法。这就像给ACPKaos戴上“安全手套”,防止它在客户端不支持某些功能时乱来。比喻一下,这就好比你去一家高级餐厅点菜,必须先看菜单上标明的可用食材,不能硬要厨房做没有的菜品。这样的设计既尊重了客户端的实际能力,又确保了系统的鲁棒性,让ACPKaos在各种环境中都能优雅运行,而不会引发任何兼容性闹剧。
🏗️ **当前基础:KAOS抽象层的智慧舞台**
在深入ACPKaos的设计前,我们先来欣赏一下现有KAOS舞台的精妙布景。KAOS是一个基于contextvar的抽象层,LocalKaos是默认实现,就像宇宙中的默认物理法则。工具们都乖乖调用KAOS来完成任务:Shell工具通过`kaos.exec`执行命令;ReadFile工具则依赖`KaosPath.exists`、`is_file`和`read_lines`来检查和读取文件;WriteFile和StrReplaceFile则通过`KaosPath.read_text`、`write_text`和`append_text`来处理写入操作。目前的ACP集成还停留在工具层面,比如终端替换实验,但文件工具的ACP后端替换已经在本地尝试过,只是尚未合并。
这种基础设计就像一座精心搭建的数字大厦:KAOS是地基,LocalKaos是默认的砖瓦,而工具们是住在里面的居民。现在ACPKaos要做的,就是在不拆掉大厦的前提下,为特定“房间”安装透明玻璃窗,让ACP客户端能从外面看到里面的忙碌场景。这份提案清晰地指出,当前工具链在读取前会先检查`KaosPath.exists/is_file`,这些检查仍用LocalKaos实现——这为后续的局限性埋下了伏笔,但也保证了兼容性。整个baseline就像一个平稳运行的生态系统,ACPKaos的到来只是优雅的升级,而非颠覆。
🔬 **设计蓝图:一页纸上的ACPKaos优雅实现**
现在进入最精彩的设计部分,就像揭开魔术师的道具箱!ACPKaos包裹LocalKaos,只覆盖工具所需的最小表面,其他一切委托给LocalKaos。提案用一页纸的篇幅就勾勒出清晰蓝图:最小覆盖包括`exec`重定向到ACP终端操作、`readtext`调用ACP的`fs/read_text_file`、`writetext`对应`fs/write_text_file`(append逻辑则根据caps灵活处理),`readlines`可选通过ACP分页或更新ReadFile来用`readtext`拆分行,`stat`则保留LocalKaos(可选ACP回退,如果未保存缓冲区重要的话)。
提案还特别提到已知局限:ACP的`fs/read_text_file`能暴露编辑器中尚未保存到磁盘的缓冲区,但当前工具链在读取前会用LocalKaos检查`KaosPath.exists/is_file`,这些文件只存在于缓冲区时会返回false。所以暂时接受这个局限,保持`stat/exists/is_file`本地。如果未来想让未保存缓冲区端到端工作,就得重新审视这些检查。比喻来说,这就像餐厅厨房能展示半成品食材,但客人点单前服务员还是先确认冰箱里有没有——聪明但有边界。
来看看伪代码的生动解读吧!它就像ACPKaos的“DNA蓝图”:
```
ACPKaos {
init(client, session_id, caps, fallback=local_kaos)
# 根据caps一次性绑定ACP还是本地函数
self._readtext = caps.fs.readTextFile ? acp_readtext : fallback.readtext
self._writetext = caps.fs.writeTextFile ? acp_writetext : fallback.writetext
self._exec = caps.terminal ? acp_exec : fallback.exec
self._appendtext = (caps.fs.readTextFile && caps.fs.writeTextFile)
? acp_appendtext
: fallback_appendtext # 通过fallback.writetext(mode="a")实现
# 直通操作
pathclass/normpath/gethome/getcwd/chdir/stat/iterdir/glob/readbytes/writebytes/mkdir
-> fallback
readtext(path):
return self._readtext(abs(path))
readlines(path):
# 用readtext拆分成行,保持ReadFile行为不变
text = self._readtext(abs(path))
return text.splitlines(keepends=True)
writetext(path, data, mode):
if mode == "a":
return self._appendtext(abs(path), data)
return self._writetext(abs(path), data, mode)
exec(args...):
return self._exec(args...)
}
```
这个init逻辑多聪明啊!它像一位管家,先根据客户端“菜单”(caps)决定用哪种食材,然后所有读写执行都走对应通道。readlines通过拆分保持原有行为不变,writetext根据mode智能切换append——如果两者caps都支持就用ACP,否则fallback。这避免了重复,扩展解释起来:想象你在写日记,append模式就像在末尾加页,如果客户端支持就直接用它的“智能笔记本”,否则还是用旧本子续写。所有路径都用绝对路径(abs(path)),避免chdir带来的惊喜——这就像导航时永远用GPS坐标,而不是相对路标,确保万无一失。
> **注解:什么是caps和fallback?**
> 在ACPKaos中,caps(capability flags)是客户端广告的支持能力列表,就像餐厅的当日特供菜单。如果客户端支持`fs.readTextFile`,就用ACP的读函数,否则fallback到LocalKaos的本地实现。这确保了兼容性,不会强行调用不支持的方法。fallback则是LocalKaos实例,作为安全网兜住所有未覆盖操作。详细来说,这种设计让ACPKaos在不同环境中都能平稳运行:支持ACP时更智能,不支持时无缝回退,就像汽车的智能驾驶辅助系统——有传感器就用,没传感器就手动驾驶,但驾驶体验始终一致。
🛠️ **ACPProcess:终端适配器的幕后英雄**
终端命令部分同样精彩!ACPProcess实现了KaosProcess接口,因为Shell工具期望一个兼容的对象。它的spawn方法用`client.create_terminal`创建终端,带上command、args、session_id、cwd和outputByteLimit,然后启动后台轮询(terminal_output)来刷新输出。stdout和stderr呢?ACP没有分开stderr,所以选择只用stdout,并文档化说明——这就像把双声道音频简化成单声道,但清晰度不减。
wait方法更像一场并发大戏:同时等待退出状态和终端输出,处理截断情况——如果输出被截断或不再包含上次看到的尾部,就重置delta基线并注明。finally块里必须调用terminal/release,即使出错或取消也要执行,因为release会杀死运行中的命令。kill方法则直接用`client.terminal/kill`。整个过程幽默又实用:想象AI在终端里跑命令,就像厨师在直播间炒菜,ACPProcess就是摄影师,确保观众实时看到火候、听到“滋啦”声,还能在意外时安全关火。提案强调,release是MUST,因为它保证资源不泄漏,让系统像一台永不卡顿的精密仪器。
🔌 **集成要点:让ACPKaos无缝融入生态**
集成就像给大厦安装新电梯——简单却关键。每个ACP会话都创建一个ACPKaos实例,持有`client`、`session_id`和`client_capabilities`。然后在`prompt`里设置`current_kaos`(contextvars是任务局部的),确保覆盖完整一轮交互。chdir行为保持完整,ACPKaos委托给LocalKaos。关于工具级替换:首选是ACPKaos激活时跳过替换,过渡期则保留作为无ACPKaos环境的fallback。所有ACP调用都用绝对路径,避免chdir惊喜。
这设计像一出精心排练的戏剧:KAOS上下文确保每个“演员”(工具)都在正确舞台上表演,而ACPKaos是幕后导演,只在需要时切换灯光(ACP)。结果是,AI代理的每一步都既高效又可见,开发者在Zed里能实时看到文件变化和命令输出,仿佛亲手参与了一场代码冒险。
✅ **验证之路:从单元测试到真实战场**
最后,提案为ACPKaos铺好了验证之路,就像给新发明做全面体检。单元测试聚焦ACPKaos:确认当caps允许时读写调用命中ACP,append正确使用read+write,exec返回输出和退出码。集成测试则运行Shell、ReadFile、WriteFile、StrReplaceFile这些工具,确保ACPKaos激活下一切正常。
手动测试在Zed中进行:读取未保存缓冲区、写入更改、运行命令并确认UI更新。测试需要模拟ACP客户端,可以借鉴ACP Python SDK测试的模式。整个验证过程强调:ACPKaos不是纸上谈兵,而是经过严格把关的可靠升级。它让AI代理从“幕后英雄”变成“舞台明星”,让整个系统更智能、更人性化。
通过ACPKaos,我们看到了AI执行后台的未来:不是冷冰冰的代码,而是充满故事和互动的数字生态。想象未来,你在Zed里编写提示,AI代理实时编辑文件、运行命令,你能亲眼看到每一步——这不只是技术进步,更是人与AI共舞的美丽篇章。KLIP-2的ACPKaos,正悄然开启这个新时代!
------
**参考文献**
1. KLIP-2: ACPKaos, a LocalKaos variant that redirects operations to ACP clients (Author: <span class="mention-invalid">@stdrc</span>, Updated: 2025-12-29).
2. Agent Client Protocol Initialization (https://agentclientprotocol.com/protocol/initialization).
3. Agent Client Protocol File System (https://agentclientprotocol.com/protocol/file-system).
4. Agent Client Protocol Terminals (https://agentclientprotocol.com/protocol/terminals).
5. KAOS Contextvar-based Abstraction and LocalKaos Implementation (Internal KAOS baseline documentation).
登录后可参与表态
讨论回复
7 条回复
✨步子哥 (steper)
#1
2026-04-29 02:28
登录后可参与表态
✨步子哥 (steper)
#2
2026-04-29 02:43
登录后可参与表态
✨步子哥 (steper)
#3
2026-04-29 02:52
登录后可参与表态
✨步子哥 (steper)
#4
2026-04-29 03:01
登录后可参与表态
✨步子哥 (steper)
#5
2026-04-29 03:36
登录后可参与表态
✨步子哥 (steper)
#6
2026-04-29 03:55
登录后可参与表态
✨步子哥 (steper)
#7
2026-04-29 04:05
登录后可参与表态