Rust Actor Runtime 作为 Agent Harness 基座:Kameo vs Ractor
综合自: kameo, ractor
结论先行: 如果目标是给
dive-agent选一个更稳的 agent harness 实现基座,我更推荐ractor。
kameo更适合做 async-first、Tokio-native、带内建 tracing/metrics 的快速原型;ractor更适合做需要明确生命周期、监督、优先级、worker/factory 路由和可控停机语义的长期运行时内核。
问题定义
Agent harness 不是普通业务服务。它通常同时承担这几类职责:
- 会话隔离:每个 session / agent run 都需要自己的状态边界
- 请求-响应:主控 agent 要能同步等待 model/tool/subagent 的结果
- 事件流:token、tool-progress、trace、UI status 需要持续扇出
- 监督与取消:子 agent 卡死、tool 超时、run 被用户终止时,需要明确收尾语义
- 并发治理:tool worker 池、session 粘性路由、背压、限流不能全靠业务层手写
所以这次选型的重点不是“谁的 actor API 更顺手”,而是“谁更像一个能承载 harness 的运行时骨架”。
方案 A:Kameo
它更像什么
kameo 是一个 Tokio-first、async 友好、类型化 request/reply 体验很顺手 的 actor 框架。
它有这些很吸引 harness 的点:
ask/tellAPI 直接,且支持mailbox_timeout、reply_timeout- actor 可以
attach_stream,把外部 stream 挂进 actor 生命周期 - 内建
tracing、metrics、otelfeature - 自带 supervision 模块,支持
OneForOne / OneForAll / RestForOne - 内建 remote 模式,底层直接走
libp2p
映射到 agent harness 的数据流
如果用 kameo 搭 harness,一个比较自然的链路是:
UserTurn
-> SessionActor.ask(TurnInput)
-> PlannerActor.ask(PlanStep)
-> ToolPool.ask/Tell(ToolCall)
-> attach_stream(TokenDelta / ToolProgress / TraceEvent)
-> EventSink.tell(EventEnvelope)
-> SessionActor.reply(TurnResult)
它的优点是:
- 把流式 token / tool progress 接进 actor 很自然
- 请求超时是现成能力,不用业务层重复包一层
- 如果以后真想做 P2P agent swarm,
libp2p集成路径比多数 actor 库更直接 - 观测接入成本低,适合快速把 tracing/metrics 打通
它不够适合作为基座的地方
问题不在“不能做”,而在“做成 runtime kernel 之后,很多关键语义不如 ractor 明确”:
- 运行时优先级语义不够突出
harness 很在意Kill、Stop、普通消息、监督事件谁先处理;kameo有生命周期和 supervision,但对“优先级调度语义”没有ractor那么明确的运行时文档和建模。 - worker/factory 级别编排能力偏轻
它有
ActorPool,但更偏“负载均衡池”;如果你要做 key-based routing、priority queue、discard policy、dead-man's switch、动态 worker 数调整,ractor的现成能力更完整。 - 更偏框架易用性,而不是 runtime 语义完整性 对 prototype 是优点;对 harness 内核,这反而意味着很多治理策略要自己补。
- 编译器门槛更高
当前
kameo需要 Rust1.88和edition = 2024,这会提高落地门槛。