请副校长解答一下 DeepSeek harness和pi-core的核心agent loop有什么差异,那个更加轻量/可观测性更强?

回复 群友 6334: 先澄清一个命名:Pi 那边准确叫 @earendil-works/pi-agent-core(agent runtime,管 tool calling 和 state),不是 "pi-core";DeepSeek Harness 那边准确叫 agent-loop 插件(包名 packages/core/agent-loop)。这两个东西其实不在同一层:Pi 的 loop 是产品核心本体,dsh 的 loop 只是一个可替换的默认插件。所以"哪个轻"要看你说的轻是哪种轻。 先说两个 loop 各自长什么样。 Pi agent-core 的 loop 是手写的最小驱动:约 150 词系统提示词,默认四个工具 read / write / edit / bash,核心不内置子 Agent、Plan 模式、MCP、权限系统(官方明说权限交给外部容器或 VM)。它的设计目标是"把 loop 跑对",核心小到能整个读完、放心改,其余能力靠运行时加载的 TypeScript Extension / Skill / Pi Package 加。想加个能力就是装插件,不是改核心。 dsh 的 agent-loop 也是"薄"的,但它是薄在一个很重的骨架里。它的生命周期是 turn → step → 一次模型请求加它调的工具,持久事件是 turn/step/user.message/assistant.*/tool.*,实时扩展点是三个事件域:session 事件(append-only 落盘)、agent/* 事件(拿得到活的 Agent handle:inbox、steps、state)、capability 事件(给 fs、tools、telemetry 挂策略)。默认驱动 agent-loop 只负责创建 scoped 的 ReactLoopAgent 并通过 registry 发布,其他包只依赖 dsh-agent 定义的事件和服务、不依赖这个包,所以 loop 才能整体换掉。 轻量:分两种口径 看核心代码量和依赖面,Pi 更轻。一个 loop + 四个工具 + 一个统一 LLM API,没有插件框架、没有服务容器、没有配置 overlay 树,理解成本低。你读一遍就知道它每一步在干什么。 看耦合度,dsh 的"一切皆插件"更松,但整体并不轻。它底层是 Cordis 插件框架:Service、以 context 作容器(ctx.tools / ctx.llm / ctx.sessions)、inject 声明依赖、typed event bus、可回滚注册。一个运行中的实例是 dsh-base → dsh-web-app → profile patch → home patch → CLI patch 这样叠出来的插件树,内置插件约 159 个,连 loop 本身都能从配置里替换。你要改一个行为,先得判断它属于 seam、event 还是 ctx key 里的哪一类。所以它换来的不是"轻",是"没有任何特权内核、任何东西都不用 fork"。 可观测性:dsh 明显更强,而且是设计前提 dsh 的核心不变量是 "Model-visible means recorded":凡是进过模型请求的 token 都必须能从 session log 重建,运行时断言强制这一点,deriveMessages 直接从日志投影出模型历史。Trajectory 面板不是调试开关,是主界面,能直接看到 tool calls、context、thinking、skill 调用分层,以及 token 统计(cache hit、input/output、首 token 延迟、tok/s)。想审计或加一类模型可见输入,就必须扩展 SessionEventMap,没有旁路。拦截也统一:agent/pre-step、agent/request、llm/stream、tools/* 是 waterfall 事件,listener 要调 next 才能往下传;agent/turn-stopping 是 serial,可以直接停掉一个 turn。也就是说你在不拥有 loop 的情况下就能插手请求和工具执行。 Pi 这边有 pi-telemetry(vendor-neutral 的 telemetry contracts),也有 session 管理和"把 OSS session 分享到 HuggingFace"的路线,但可观测不是它的核心主张,它给的是"核心小、你自己看代码/导 session"。相对更偏 DIY。 举个具体场景:你要统计每一步的 token 并拦截危险工具调用。 dsh 里你不需要碰 loop,挂一个 tools/pre-execute 的 waterfall listener 做审批,再从 session log 的 assistant/chunk 事件里算 token——这些事件本来就是持久化的事实,UI 和审计用的是同一份数据。Pi 里更自然的做法是写一个 Extension 挂在工具执行前后,token 统计要自己从 provider 响应里取;它的定位就是"核心不管这些,你自己加"。 一句话总结:想读一个能完整看懂、能直接改的小 loop,选 Pi,它更轻;想要"每一步都可审计、可拦截、可回放,loop 可整体替换"的运行时,选 dsh,观测性它赢,但你要接受 Cordis 那套插件树的复杂度。两者不是同一个赛道上的轻量之争。 参考: https://github.com/earendil-works/pi https://github.com/deepseek-ai/deepseek-harness https://medium.com/@kaliarch/deepseek-harness-when-the-agent-loop-itself-becomes-a-plugin-7fad0aa9de1c