Prime Agent 长时运行与后台 Agent 完全指南:Daemon 会话、消息路由、定时任务、持久目标与自治模式
【免费下载链接】prime-agentA self-improving RLM agent for coding workflows and long-running autonomous tasks.项目地址: https://gitcode.com/GitHub_Trending/pr/prime-agent
Prime Agent 将"终端关闭"与"任务结束"彻底解耦:所有交互式会话都运行在由本地 daemon supervisor 管理的常驻 worker 进程中,客户端可以随时 detach,而队列、调度、会话、Python kernel、子 Agent 与持久状态继续由 worker 独占托管。本文基于 long-running-agents.md 展开,结合 daemon 架构、RLM 编程模型与核心源码,系统讲解后台会话的生命周期管理、Agent 间直接通信、三类调度表面(用户 heartbeat / RLM heartbeat / 通用 schedule)、持久目标(goal)与有界自治模式(autonomous mode)的配置与使用,读完即可搭建一套"无人值守、可恢复、可自治"的长期运行编码工作流。
运行时全貌:从 TUI 到常驻 worker
要理解长时运行特性,先看它们共享的会话与 worker 运行时。下面是文档给出的核心运行时流程图:
关键结论:客户端可以在任何时刻 detach,常驻 worker 继续独占持有队列(prompt queue)、调度(schedule)、会话(AgentSession)、内核(Python kernel)、后代(RLM children)与持久化状态。会话产物落盘为 JSONL transcript 与 session artifacts,重启后可以从这些产物恢复会话状态,而不是把终端客户端当作工作的"所有者"。
从进程拓扑看(详见 daemon.md),supervisor 只负责公共 socket、客户端 attach、路由、Agent 消息投递、worker 健康、命令日志与协调更新,不执行provider、工具、compaction、bash、kernel、调度与 transcript 扫描;这些全部由每个常驻 worker 内的根AgentSessionRuntime承担。worker 按根会话树进行进程隔离,用于生命周期与故障隔离——注意它不是安全沙箱,通常与客户端拥有相同的操作系统权限。
Daemon 支撑的会话:detach、attach 与生命周期命令
正常交互式会话运行在由 supervisor 管理的常驻 worker 进程中。worker 拥有根会话、Python kernel、定时任务与 RLM 后代。关闭 TUI 只会 detach 客户端,不会停止 worker。
列出并重连活动 Agent:
prime-agent list prime-agent attach <agent>其余生命周期命令一览:
prime-agent agents # 打开 agents 视图 prime-agent rename <agent> <name> # 给 Agent 起一个稳定的可读名称 prime-agent stop <agent> # 停止单个 Agent prime-agent status # 检查后台服务状态 prime-agent doctor [--fix] # 诊断或修复服务状态 prime-agent shutdown [--force] # 停止所有 Agent 与服务其中--force会一并终止无响应的 worker 进程组与被跟踪的子进程;doctor适合在异常退出后自检恢复服务。rename尤其重要——后续attach、send、schedule都依赖一个稳定的可寻址名称。
从实现层面看(daemon.md):
- supervisor 为每个活动根会话树启动一个独立的进程组;
- worker 描述符、认证 token、活动会话 ID、会话路径与恢复日志都以仅属主可读写的权限写入 agent 目录;
- worker 监视公共 supervisor socket,若其消失,一个 worker 会通过原子启动租约拉起替代 supervisor,并收养现有 worker 及其活动会话 ID;
- worker 崩溃只影响一个根会话树,恢复按 250 ms、1 s、5 s 重试,连续三次失败才将该根标记为失败;
- 每个持久化会话都由基于规范化 JSONL 路径的进程安全租约保护,避免 daemon worker 与一次性客户端并发写同一 transcript(并发打开会返回
session_already_active)。
worker 与 supervisor 重启后,可以恢复会话状态与调度,并重新水合已完成的 RLM 子会话。
Agent 与 Agent 之间的直接通信
daemon 在活动会话与保留的 daemon-backed 子 Agent 之间路由直接消息。从 shell 发送:
prime-agent send <agent> "Please verify the latest migration"从 Python kernel 中使用预加载的agent_observe与agent_messagePython 技能(源码位于 skills/agent-observe 与 skills/agent-message):
roster = await agent_observe.list_agents() receipt = await agent_message.send( "Recheck the endpoint after the latest edit", receiver_role="sibling", receiver_name="api-reviewer", mode="auto", ) print(receipt["deliveryStatus"])对当前父 Agent 的直接 RLM 子会话,优先使用父作用域的注册表:
children = await rlm.list_subagents() child = next(item for item in children if item.session_name == "api-reviewer") await agent_message.send( "Continue with the updated diff", receiver_role="child", receiver_name=child.session_name, )投递模式(delivery mode)
| 模式 | 行为 |
|---|---|
auto | 目标忙碌时"引导"(steer),目标空闲时立即投递 |
steer | 有意将消息注入目标当前进行中的工作 |
follow_up | 等待目标当前工作结束后再投递 |
回执语义
delivered:消息已进入空闲目标的上下文;queued:已接受,等待稍后投递。
agent_message.send("all", message)只在家族花名册(family roster)内广播。sender 身份由 daemon 推导,并强制执行消息大小、速率与待处理队列上限。
源码细节印证(skills/agent-message/src/agent_message/init.py):receiver_role只能是parent、sibling、child三者之一;发往parent时不允许带receiver_name,而发往sibling/child时receiver_name必填;所有路由与 sender 身份都位于 TypeScript daemon 侧,kernel 内只是rlm.host_request("agent_message.send", payload)的薄封装。这与 rlm.md 的 Host Bridge 设计一致:凭证、provider 执行、transcript 写入、worker 路由与调度都不进入 Python。
心跳与定时提示:三类调度表面
Prime Agent 提供三张相关的调度表面:
| 表面 | 所有者 | 用途 |
|---|---|---|
/heartbeat | 用户 | 当前会话中一条可见的循环指令 |
rlm_heartbeat | Agent | 由程序管理的、会话内部的多条循环指令 |
prime-agent schedule | 用户或自动化 | 面向某个 Agent 的通用一次性或 cron 提示 |
用户心跳(User heartbeat)
创建与管理当前会话的可见心跳:
/heartbeat every 10m Check the deployment and report meaningful changes /heartbeat status /heartbeat pause /heartbeat resume /heartbeat clear心跳投递默认会"引导"正在进行的活动工作;若希望循环提示等到当前回合结束再投递,加上--follow-up。用/heartbeats(复数)统一查看和管理用户与 Agent 创建的心跳。
Agent 创建的 RLM 心跳
Agent 可以在 kernel 内以编程方式创建多个内部心跳(技能位于 skills/rlm-heartbeat):
first = await rlm_heartbeat.create( "check whether the test run finished", interval="5m", label="tests", ) second = await rlm_heartbeat.create( "inspect the deployment status", interval="10m", label="deploy", delivery_mode="follow_up", ) await rlm_heartbeat.list() await rlm_heartbeat.update(first["heartbeat"]["id"], status="pause")RLM 心跳与用户的/heartbeat相互独立——Python 技能不能替换或清除用户拥有的心跳,权限边界由 TypeScript host 强制。
通用调度(General schedules)
为一个可寻址 Agent 调度一次性或循环提示:
prime-agent schedule add worker "in 30m" -- "Check the benchmark result" prime-agent schedule add worker "0 9 * * 1-5" -- "Review open work" prime-agent schedule list --all prime-agent schedule cancel <job-id>--之后是实际要发送的提示文本,因此消息内容中带空格、--或特殊字符都不会被 CLI 解析干扰。
可靠性设计(实现见 daemon.md):调度任务按会话持久化到session-artifacts/<session-id>/scheduled-jobs.json,不存在全局共享的 cron 文件;每个 worker 为其根会话及后代运行一个 scheduler。到期 tick 在投递前先被认领(claim),因此崩溃不会重放一次不确定的提示;错过的 tick 会被合并(coalesce)而不是累积成无限积压。worker 崩溃恢复时把不确定的认领标记为中断、保留已推进的调度、仅恢复未来的 tick;supervisor 负责路由调度命令并汇总 worker 的调度列表以支持全局schedule list。
持久目标(Persistent Goals):跨回合的持久目标
goal 是一个持久的客观目标,harness 会在每个回合持续呈现,直到它被完成、暂停、预算受限、出错或被清除。创建持久目标必须是用户或宿主(host)的显式动作,Agent 不应从每个任务中自行推断出目标。
从 TUI 显式启动:
/goal Ship the release and verify every published artifact /goal --budget 200000 Complete the repository migration管理其状态:
/goal status /goal pause /goal resume /goal clear模型侧使用 kernel 内的goal技能(skills/goal)检查或完成目标:
state = await goal.get() await goal.complete()goal 状态记录 token 用量、已用时间、continuation 计数与可选的显式 token 预算。harness 会在普通 assistant 回合之后持续提示活动目标;只有goal.complete()才标记为成功完成——即使预算接近耗尽或准备收尾,也不应调用它。
源码印证(skills/goal/src/goal/init.py):goal.get()返回含goal、remaining_tokens、completion_budget_report的字典,其中goal字段携带 objective、status、token budget 与用量;goal.create()在仍有 pending(active/paused/budget-limited)目标时失败,只有已完成或出错的目标可被替换;所有 goal 状态都保存在 TypeScript host 中,Python 只是rlm.host_request("goal.get" / "goal.create" / "goal.complete")的类型化封装。
自治模式(Autonomous Mode):有界的无人值守运行
自治模式是一种有界的宿主策略,适用于不预期有人类输入的运行。Prime Agent 会持续追加 follow-up continuation,直到配置的质量门(gate)通过,或达到 continuation / turn / token / 墙钟时长上限。
交互式会话中开启
/autonomous on接受与 CLI 相同的预算参数,因此交互式运行可以自定义预算,而不必停在默认的三次 continuation:
/autonomous on --max-continuations 10 --max-turns 40 --max-tokens 500000 /autonomous on --gate "npm run check" --gate-retries 2 /autonomous status /autonomous off从 CLI 配置一次运行
prime-agent \ --autonomous \ --autonomous-gate "npm run check" \ --autonomous-max-turns 20 \ "Implement and verify the requested change"预算参数语法细节
斜杠命令的旗标(--max-continuations、--max-turns、--max-tokens、--timeout-ms、--gate、--gate-retries、--gate-timeout-ms)同时接受--flag <value>与--flag=<value>两种写法,且 CLI 的完整拼写(如--autonomous-max-continuations)可作为别名。数字值允许使用,或_作为千位分隔符(如--max-tokens 100,000,000,000)。
四个预算上限还接受unlimited以移除对应上限。没有 gate 时,unlimited 的运行只会因错误或手动中止而停止,所以把 unlimited 预算与质量 gate 搭配使用。具名预算旗标定义整体预算:任何未具名的上限都会变成 unlimited,因此/autonomous on --max-tokens 100,000会一直运行到该 token 预算耗尽。完全不指定预算旗标时,仍应用配置或默认上限。重复--gate会追加多个 gate。
默认值与实现原理
从核心实现 src/core/autonomous.ts 可以确认默认值:
| 项 | 默认值 |
|---|---|
maxContinuations | 3 |
maxTurns | 12 |
maxTokens | 80,000 |
timeoutMs | 30 分钟 |
gatemaxRetries | 3 |
gatetimeoutMs | 5 分钟 |
| gate 输出上限 | 6,000 字符 |
这就是文档所说"默认三次 continuation"的来源。unlimited在实现中以Number.MAX_SAFE_INTEGER哨兵值表示,保证 JSON 可序列化且不参与实际限制判断。gate 命令在会话可能结束前运行,失败的 gate 会把有界的输出交还给 Agent 继续尝试;同时 Prime Agent 会基于 git worktree 快照(status/diff/untracked hash)避免在工作区未变化时重跑同一个失败的 gate。
goal 与 autonomous 的分工
两者互补但本质不同:
- goal跨回合存储目标及其进度状态;
- autonomous mode依据证据、gate 与上限决定是否注入下一次 continuation。
压缩与连续性(Compaction and Continuity)
长任务期间上下文会持续增长,自动压缩负责处理:在溢出或接近配置阈值时,Prime Agent 会摘要较旧消息、保留近期上下文并继续。Python kernel 在压缩期间保持存活,因此变量、import、辅助函数与任务状态都仍然可用。
Agent 可以编程检查或请求压缩(技能位于 skills/compact):
await compact.status() await compact.run("Preserve the failing tests and remaining migration steps")压缩不是完成信号:它不会停止 goal、自治 continuation、心跳或已存在的子会话;后续父回合会从压缩后的上下文继续。
与 RLM 编程模型的配合
长时运行能力并非孤立特性,而是 RLM(recursive language model)运行时"状态设计为跨回合存活"这一核心不变量(见 rlm.md)的自然延伸:
- 自动压缩摘要旧上下文、保留近期消息与 kernel 状态;
- daemon-backed worker 在客户端 detach 后继续运行活动会话;
- 子注册表与会话产物让子 Agent 可恢复;
- 心跳与调度提示在之后重新进入会话;
- 持久 goal 一直持续到目标完成或用户改变其状态;
- autonomous mode 提供有界 continuation 与可选质量 gate。
所有这些能力(goal、agent_message、rlm_heartbeat、compact)都通过 kernel 预加载对象上的rlm.host_request(...)调用 TypeScript host,由 host 校验请求并持有状态转换的权威权——这正是"Python 是模型面的编程面,TypeScript host 是状态权威"的架构体现。
实践建议与安全边界
- 长期任务的首选形态:把目标用
/goal显式声明,用/heartbeat或prime-agent schedule安排检查节奏,需要深度工作再配rlm.spawn子 Agent,需要无人值守收尾时开启/autonomous on并务必带上 gate 或预算上限。 - 调度可靠性:由于到期 tick 先认领再投递、错过的 tick 会合并,崩溃或短暂停机不会重放不确定的提示,也不会积压成雪崩。
- 安全边界:daemon worker 是进程隔离而非安全沙箱,Python kernel 以 worker 的操作系统权限运行模型生成的 Python 与项目命令(信任模型详见 rlm.md)。对不可信仓库与指令,请使用外部沙箱或受限环境。
延伸阅读
- Daemon 架构:进程拓扑、会话租约、恢复日志、公共协议与更新协调
- RLM 编程模型:
rlm.spawn子会话、bash()、Host Bridge 与信任模型 - RLM Runtime 架构:递归子会话生命周期的实现细节
- Sessions:会话存储、
/tree、/fork、/clone与分支摘要 - Skills:Python-backed 技能的结构、发现与创建
- Autonomous 核心实现:自治状态机、预算归一化与 gate 执行
【免费下载链接】prime-agentA self-improving RLM agent for coding workflows and long-running autonomous tasks.项目地址: https://gitcode.com/GitHub_Trending/pr/prime-agent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考