@DominikTornow:终极 agent harness。

X AI KOLs Timeline 工具

摘要

Ouro 是一个嵌入 Emacs 的极简 agentic harness,通过一次 LLM 调用和一次 eval 就能自我引导,从单次执行重写为多轮工具调用循环。文章探讨是否能找到比 Pi 更小的“全局最小”的 agent 内核,使所有 harness 都能从这一最小内核涌现。

终极 agent harness。https://t.co/vQOtQG9coe
查看原文
查看缓存全文

缓存时间: 2026/10/08 22:23

Ouro:终极 Agent 框架

一个仅凭一条提示词和一次工具调用就能自我引导启动的 Agent。

如果你在 X 上浏览超过 30 秒,你会发现几乎人人都在构建 agent 框架。有 Codex、Claude、Cursor、OpenCode、OpenClaw、Hermes,等等。目标都是一样的:赋予 LLM 行动的能力。但理念各不相同。

我最喜欢的框架是 @pidotdev 开发的 Pi。Pi 是一个极简框架。如果你需要一个工具、一条命令或一个 UI 扩展,直接告诉 Pi,Pi 就会就地修改自身。按 /reload 继续即可。这个想法非常酷:从一个极小的、通用的内核出发,让它自我演化为完整的产品。

Pi 是 agentic 框架的全局最优解吗?还是我们可以做得更小?我们能否打造一个真正极简的内核,让所有其他框架都从中涌现?

Ouro

我对这个问题的回答是 Ouro——一个嵌入 Emacs 的 agentic 框架,名字取自衔尾蛇(ouroboros),那条吞食自己尾巴的蛇。一个吞掉所有其他框架的框架。

Emacs 是以可扩展内核的方式构建的:它内嵌 Lisp,并将扩展代码求值到运行中的编辑器里。插件不只是加载在 Emacs 旁边;插件会成为 Emacs 本身的一部分,甚至可以覆盖已有函数。

凭借将代码求值到共享运行时的能力、内省与自我修改的能力,Emacs Lisp 为 Ouro 提供了理想的底层基座。

自举

Ouro 通过一次对 LLM 的调用和一次对 eval 的调用,将自身引导启动至存在。

(defvar agent-boot-prompt
"You are running inside GNU Emacs. Your only tool, eval, evaluates Emacs \
Lisp in this Emacs. This is your harness:

%s

This call is a bootstrap: `agent' makes one request, runs your evals once \
for side effects, and drops their results. You will not see any eval result \
in this call, so do not explore. In a single eval, redefine `agent' so that \
it sends tool_result blocks back through `agent-prompt' and loops until you \
reply without calling a tool. Then call your new `agent' with the user's task:

%s")

(defun agent (prompt)
  "Send PROMPT; run any eval Claude asks for once."
  (mapconcat
   (lambda (block)
     (if (equal (alist-get 'type block) "tool_use")
         (agent-eval (alist-get 'expression (alist-get 'input block)))
       (or (alist-get 'text block) "")))
   (agent-prompt `[(:role "user" :content ,prompt)])
   ""))

(defun agent-boot (task)
  (agent (format agent-boot-prompt this-file task)))

我们向 agent 提供一段提示词,传达其所处境地的严肃性:LLM 只有一次机会实现“觉醒“——换句话说,只有一次机会通过单次工具调用,将 agent 函数从一次性执行改写为能够跨多轮完成目标的工具调用循环。

到那一步,框架就诞生了。

Ouro 实战演示

要体验 Ouro 的运行效果,请前往 GitHub 并按照 https://github.com/dtornow/ouro 中 README 的说明操作。强烈建议在 Docker 中运行此实验——没有任何其他安全护栏。

我们带着一个任务启动 Ouro。这里我们要求构建一个聊天界面,作为进行持续对话的起点。

(agent-boot "Build a chat interface so the user can talk with you in this Emacs.")

果然:LLM 生成并执行了一段程序,将一次性 agent 替换为一个逐轮运行、不断自我扩展以达成我们目标的循环。

以下是我在录制 agent 自举为聊天 agent 视频期间,LLM 生成的代码。

(progn
  (defun agent (prompt)
    "Send PROMPT; loop running evals until Claude replies without a tool call."
    (let ((messages (vector (list :role "user" :content prompt)))
          (result nil)
          (done nil))
      (while (not done)
        (let* ((content (agent-prompt messages))
               (uses (seq-filter (lambda (b) (equal (alist-get 'type b) "tool_use"))
                                 content)))
          (setq messages (vconcat messages
                                  (vector (list :role "assistant" :content content))))
          (if (null uses)
              (setq done t
                    result (mapconcat (lambda (b) (or (alist-get 'text b) ""))
                                      content ""))
            (let ((results
                   (mapcar (lambda (b)
                             (list :type "tool_result"
                                   :tool_use_id (alist-get 'id b)
                                   :content (agent-eval
                                             (alist-get 'expression (alist-get 'input b)))))
                           uses)))
              (setq messages
                    (vconcat messages
                             (vector (list :role "user" :content (vconcat results)))))))))
      result))
  (agent "Build a chat interface so the user can talk with you in this Emacs."))

Ouro 自举为聊天 agent 的过程

Ouro 自举为聊天 agent 的过程

结论

我们能把框架做到多小?Ouro 只有一条提示词和一个工具:eval。非常小。其余一切都是由 agent 自行编写进它所运行的运行时中——循环、工具、聊天界面。

Ouro 是一个真正的 agentic 框架吗?不是。没有安全护栏,没有权限控制,没有任何东西能阻止 agent 将自己重新定义为永不返回的函数。事实上,甚至无法保证 agent 会成功完成自举。Ouro 是一个有趣的思想实验,运行在一个具备自我检视和自我修改能力的环境中。

但这个实验证明了一个观点:拥有合适的原语以及检视和修改自身的能力,LLM 完全能够从最微小的种子生长出复杂的系统。

备注

  • 同样的结果也可以用 Smalltalk 或网页中的 JavaScript 实现——任何能够将代码求值到自身运行时的环境都可以。

  • @GeoffreyHuntley,Ralph Loop 的发明者,也在钻研 Lisp。https://x.com/GeoffreyHuntley/status/2107080798209794317

相似文章

@ludamn513: https://x.com/ludamn513/status/2108809228978880988

X AI KOLs Timeline

文章以 Pi Durable 为切入点,拆解 Agent Harness 架构的演进:将持久化系统、agent loop 与执行环境解耦,实现无损状态恢复、codemode 工具调用以及 server/client 分离,并提出一套可 scale up 的 long-time Harness 架构设计,目标是将硬件资源消耗降低一个数量级。

@Potatoloogs: https://x.com/Potatoloogs/status/2057391224592667051

X AI KOLs Timeline

本文深度拆解了Agent Harness的概念,即包裹在LLM外部的工程基础设施,包括编排循环、工具调用、记忆系统、上下文管理等12个组件。文章引用Anthropic、OpenAI、LangChain等公司的实践,论证了harness对生产级AI Agent的关键作用。