终端 coding agent 见得多了,Prime Agent 还是让我停下来看了半天:模型手里只有一个工具,跑过的经验能沉淀回自身,关了终端会话也接着跑。
它是 PrimeIntellect 开源的 coding / research agent,官方定位就一个词——self-improving,自我进化;TUI 与 agent 基座借自开源的 pi,MIT 协议。这篇是通读文档和源码之后的笔记。

只有一个工具

一般的 coding agent 给模型发一把工具:读文件、写文件、跑命令、搜索,各是各的调用。Prime Agent 只内建一个 ipython——一个持久的 IPython 内核:读写文件、跑 shell(%%bash 单元)、变换数据、调 skill、开子 agent,全部写成代码。

这套设计他们叫 RLM(Recursive Language Model):上下文是变量(prompt-as-a-variable),子 agent 是函数调用,模型在一个常驻 REPL 里编程。直接的好处是 Python 状态跨工具调用、跨 compaction 存活——变量、import、解析到一半的结果、任务句柄都还在;几万行日志不必塞进上下文,存进变量切片查询就是。

provider 调用、会话持久化、子 agent 生命周期、调度、安全策略全留在 TypeScript 宿主,IPython 只是模型面对的编程界面
Python 侧要动宿主状态(goal、消息、compaction)走类型化的 host request,宿主校验后执行,凭据与转录写入从不进内核

RLM 循环

子 agent 是函数调用

内核里预载了可调用的 rlm 对象:

python
handle = await rlm("Review the authentication flow for security issues", name="auth-reviewer")

调用在任务受理后立刻返回句柄,从不返回子 agent 的答案。子 agent 是一个完整的 AgentSession,独立上下文、独立会话目录,默认继承父的模型、provider、skill 与工具;结果只通过显式的 agent_message 或文件回流。父上下文因此始终瘦着——子 agent 干了多少活,父这边只看到它主动汇报的部分。

子注册表活过 compaction、内核重启和父会话恢复,跑完的子 agent 仍留有地址可以追问:

python
children = await rlm.list_subagents()
await agent_message.send(
    "Check the newly added regression test.",
    receiver_role="child",
    receiver_name="api-reviewer",
)

消息不限父子:daemon 给活跃会话和保留的子 agent 之间路由直发消息,auto 模式对忙碌目标转向注入、对空闲目标立即投递,也可以 follow_up 等对方干完手头的活再说。发件人身份由 daemon 推定,消息大小、频率、待投队列都有上限。

常驻的四层

进程分层

终端 UI 只管渲染和键盘,不拥有执行。执行住在常驻 worker 进程里:本地 daemon supervisor 负责路由、attach 和崩溃恢复,每个 worker 拥有一棵会话树——根 AgentSession、调度器、IPython 内核、全部 RLM 子孙。关掉终端只是 detach,工作照常:

bash
prime-agent agents                  # 看在跑的、闲置的、存过的会话
prime-agent attach <agent>          # 接回一个在跑的会话
prime-agent schedule add worker "0 9 * * 1-5" -- "Review open work"

转录按 JSONL 落盘,worker 或 supervisor 重启后能恢复会话、日程,连保留的已完成子 agent 一起还魂。到点的定时任务先认领再投递,崩溃不会重放拿不准的提示;漏过的 tick 合并处理,不攒积压。

长跑的家当都在这一层:

/heartbeat every 10m ...:当前会话一条可见的周期性指令;agent 自己还能用 rlm_heartbeat 编程式地建多条内部心跳
/goal:持久目标,跨回合一直顶着,直到 goal.complete() 或用户清除;可设 token 预算
/autonomous:无人值守的有界续跑,质量闸命令不过就把输出喂回去再来,工作区没变化不重复跑同一个闸;回合、token、墙钟都有上限
自动 compaction 总结旧上下文、保留近期消息,内核不死,goal、心跳、子会话也不受影响

自我进化

标题里的 self-improving 落在 /refine,他们叫 Continual Harness:对当前轨迹做一次专门复盘,往持久状态里做小而有据的增删改——补充提示、记忆、可复用的 skill 描述、子 agent 规格。每次 refinement 记快照可回滚,基础 system prompt 永远不动;进化不碰权重也不碰底稿,全部发生在这层可审查的补充状态里。状态默认只随当前会话,存在工件目录的 harness/harness_state.json,明确标为全局的才进 ~/.prime/agent/harness/

另有一条 opt-in 的 /traces 把轨迹上传给 Prime——他们主业是分布式 RL 训练,verifiers 和 PRIME-RL 都是同门,多半是在给模型侧的进化攒料,不过那是产品之外的事了。

skill 这边走 Agent Skills 标准,还多一层:Python-backed skill 在 SKILL.md 之外带一个真 Python 包,装进内核虚拟环境后按 import 名直接调:

python
report = await release_audit(repository=".", target_version="0.4.0")

对模型来说 skill 不再是「读一篇说明照着做」,而是可以 help()、可以传参、实现里还能再 rlm(...) 递归委托的函数。内置的 skill-creator 会教 agent 自己打包新 skill;~/.claude/skills 这类别家的 skill 目录也能直接挂进来用。

怎么用

bash
curl -fsSL https://app.primeintellect.ai/prime-agent/install.sh | sh
cd /path/to/project
prime-agent

首次 /login 选认证:订阅有 Claude Pro/Max、ChatGPT Plus/Pro(Codex)、GitHub Copilot,API key 设环境变量或存 auth.json 都行。一次性任务 prime-agent -p "...",另有 JSON 与 RPC 模式留给自动化管道。

边界

worker 和内核的进程隔离是为了生命周期与故障遏制,不是安全沙箱:模型生成的 Python 和项目命令拿着你的用户权限跑。不受信的仓库、指令、skill 请放进外部沙箱;skill 能指挥模型做任何事、还能携带可执行代码,装之前先过目。
/refine 只维护描述性的持久状态,替代不了真正打包一个可执行 skill;质量闸通过只说明闸门查的那件事过了,摸到预算上限更不等于任务完成。
安装脚本只发 macOS / Linux;Windows 得从源码跑(node ≥ 22.8),还要备一个 bash,Git Bash 即可。

回头找个不要紧的仓库让它挂一晚,看它早上主动汇报点什么。