Show HN:Recurse——更快开发和部署专用 Agent
英文标题:🔶 Show HN: Recurse – Develop and deploy specialist agents faster
Recurse 展示了一套用于开发、评估和部署专用 Agent 的命令行工作流。演示中,Agent 可调用搜索与验证工具,并通过规划、测量、修订和反思循环持续优化;样本评估记录显示,得分 0.91 的结果被保留,而得分 0.87 的结果被丢弃。该工具还可将 Agent 部署为 MCP 服务,并通过 `codex mcp add recurse` 和 `claude mcp add recurse` 接入 Codex 与 Claude。对开发者而言,这意味着可将 Agent 的工具注册、输入输出校验、测试和部署流程组织为可重复执行的工程化链路。
9.4 KB
9.8 KB
26.7 KB
21.3 KB
22.0 KB
39.9 KB
中文
运行 Agent:调用搜索工具、执行验证并返回结果,状态显示为 ready。
text $ recurse run ./agent ── ⚡ tools.search() ── │ ├── verify() │ └── return result ── > _ ready ── ░▒▓ ██ ▓▒░ ── $ recurse run ./agent ── ⚡ tools.search() ── │ ├── verify() │ └── return result ── > _ ready ── ░▒▓ ██ ▓▒░ ── $ recurse run ./agent ── ⚡ tools.search() ── │ ├── verify() │ └── return result ── > _ ready ── ░▒▓ ██ ▓▒░ ── $ recurse run ./agent ── ⚡ tools.search() ── │ ├── verify() │ └── return result ── > _ ready ── ░▒▓ ██ ▓▒░ ── $ recurse run ./agent ── ⚡ tools.search() ── │ ├── verify() │ └── return result ── > _ ready ── ░▒▓ ██ ▓▒░ ── $ recurse run ./agent ── ⚡ tools.search() ── │ ├── verify() │ └── return result ── > _ ready ── ░▒▓ ██ ▓▒░ ──
任务规划与修订:生成候选方案 07,进行测量,修订后等待评分。
text │ task.plan() ── ✓ candidate 07 ── ⟩ measure() ── ⚙ revise ── ▓▒░ ░▒▓ ── > await score ── │ task.plan() ── ✓ candidate 07 ── ⟩ measure() ── ⚙ revise ── ▓▒░ ░▒▓ ── > await score ── │ task.plan() ── ✓ candidate 07 ── ⟩ measure() ── ⚙ revise ── ▓▒░ ░▒▓ ── > await score ── │ task.plan() ── ✓ candidate 07 ── ⟩ measure() ── ⚙ revise ── ▓▒░ ░▒▓ ── > await score ── │ task.plan() ── ✓ candidate 07 ── ⟩ measure() ── ⚙ revise ── ▓▒░ ░▒▓ ── > await score ── │ task.plan() ── ✓ candidate 07 ── ⟩ measure() ── ⚙ revise ── ▓▒░ ░▒▓ ── > await score ──
构建并部署 Agent:固定 manifest,校验输入与输出,并部署为 MCP。
text ⟩ agent.build() ── █ manifest.pin ── ├── inputs.validate() ── │ outputs.check ── ░░▒▒▓▓██ ── $ recurse deploy --as mcp ── ⟩ agent.build() ── █ manifest.pin ── ├── inputs.validate() ── │ outputs.check ── ░░▒▒▓▓██ ── $ recurse deploy --as mcp ── ⟩ agent.build() ── █ manifest.pin ── ├── inputs.validate() ── │ outputs.check ── ░░▒▒▓▓██ ── $ recurse deploy --as mcp ── ⟩ agent.build() ── █ manifest.pin ── ├── inputs.validate() ── │ outputs.check ── ░░▒▒▓▓██ ── $ recurse deploy --as mcp ── ⟩ agent.build() ── █ manifest.pin ── ├── inputs.validate() ── │ outputs.check ── ░░▒▒▓▓██ ── $ recurse deploy --as mcp ── ⟩ agent.build() ── █ manifest.pin ── ├── inputs.validate() ── │ outputs.check ── ░░▒▒▓▓██ ── $ recurse deploy --as mcp ──
搜索样本评估:得分 0.91 的结果保留,得分 0.87 的结果丢弃;随后查询状态。
text ├── search.sample() ── ⚡ score 0.91 ── │ └── keep ── > score 0.87 · discard ── ▒▓██▓▒ ── $ recurse status ── ├── search.sample() ── ⚡ score 0.91 ── │ └── keep ── > score 0.87 · discard ── ▒▓██▓▒ ── $ recurse status ── ├── search.sample() ── ⚡ score 0.91 ── │ └── keep ── > score 0.87 · discard ── ▒▓██▓▒ ── $ recurse status ── ├── search.sample() ── ⚡ score 0.91 ── │ └── keep ── > score 0.87 · discard ── ▒▓██▓▒ ── $ recurse status ── ├── search.sample() ── ⚡ score 0.91 ── │ └── keep ── > score 0.87 · discard ── ▒▓██▓▒ ── $ recurse status ── ├── search.sample() ── ⚡ score 0.91 ── │ └── keep ── > score 0.87 · discard ── ▒▓██▓▒ ── $ recurse status ──
保持契约并注册工具:执行运行实例 run_9fd3c2,修订 prompt,随后 Agent 进入空闲状态。
text │ contract.hold ── ✓ tool.register ── ⟩ run_9fd3c2 ── ⚙ prompt.revise ── ░▒▓ ▓▒░ ── > agent.idle ── │ contract.hold ── ✓ tool.register ── ⟩ run_9fd3c2 ── ⚙ prompt.revise ── ░▒▓ ▓▒░ ── > agent.idle ── │ contract.hold ── ✓ tool.register ── ⟩ run_9fd3c2 ── ⚙ prompt.revise ── ░▒▓ ▓▒░ ── > agent.idle ── │ contract.hold ── ✓ tool.register ── ⟩ run_9fd3c2 ── ⚙ prompt.revise ── ░▒▓ ▓▒░ ── > agent.idle ── │ contract.hold ── ✓ tool.register ── ⟩ run_9fd3c2 ── ⚙ prompt.revise ── ░▒▓ ▓▒░ ── > agent.idle ── │ contract.hold ── ✓ tool.register ── ⟩ run_9fd3c2 ── ⚙ prompt.revise ── ░▒▓ ▓▒░ ── > agent.idle ──
候选方案 08:生成 1 个产物,执行测试校验并继续循环;随后将 Recurse 添加至 Codex MCP。
text ⟩ candidate 08 ── █ artifacts: 1 ── ├── test.validate ── │ loop.continue ── ██▓▒░░▒▓ ── $ codex mcp add recurse ── ⟩ candidate 08 ── █ artifacts: 1 ── ├── test.validate ── │ loop.continue ── ██▓▒░░▒▓ ── $ codex mcp add recurse ── ⟩ candidate 08 ── █ artifacts: 1 ── ├── test.validate ── │ loop.continue ── ██▓▒░░▒▓ ── $ codex mcp add recurse ── ⟩ candidate 08 ── █ artifacts: 1 ── ├── test.validate ── │ loop.continue ── ██▓▒░░▒▓ ── $ codex mcp add recurse ── ⟩ candidate 08 ── █ artifacts: 1 ── ├── test.validate ── │ loop.continue ── ██▓▒░░▒▓ ── $ codex mcp add recurse ── ⟩ candidate 08 ── █ artifacts: 1 ── ├── test.validate ── │ loop.continue ── ██▓▒░░▒▓ ── $ codex mcp add recurse ──
接入 Claude:添加 Recurse MCP,部署 mcp_7fc21a,端点就绪后开始提供专用 Agent 服务。
text $ claude mcp add recurse ── ⚡ deploy mcp_7fc21a ── │ ├── endpoint.ready │ └── specialist.serve ── > _ complete ── ░▒▓██▓▒░ ── $ claude mcp add recurse ── ⚡ deploy mcp_7fc21a ── │ ├── endpoint.ready │ └── specialist.serve ── > _ complete ── ░▒▓██▓▒░ ── $ claude mcp add recurse ── ⚡ deploy mcp_7fc21a ── │ ├── endpoint.ready │ └── specialist.serve ── > _ complete ── ░▒▓██▓▒░ ── $ claude mcp add recurse ── ⚡ deploy mcp_7fc21a ── │ ├── endpoint.ready │ └── specialist.serve ── > _ complete ── ░▒▓██▓▒░ ── $ claude mcp add recurse ── ⚡ deploy mcp_7fc21a ── │ ├── endpoint.ready │ └── specialist.serve ── > _ complete ── ░▒▓██▓▒░ ── $ claude mcp add recurse ── ⚡ deploy mcp_7fc21a ── │ ├── endpoint.ready │ └── specialist.serve ── > _ complete ── ░▒▓██▓▒░ ──
循环结束:维持稳定契约与自适应执行,跟踪测量结果并由 Agent 反思。
text │ stable contract ── ✓ adaptive execution ── ⟩ measure.track() ── ⚙ agent.reflect ── ▓▒░ ██ ░▒▓ ── > loop.end ── │ stable contract ── ✓ adaptive execution ── ⟩ measure.track() ── ⚙ agent.reflect ── ▓▒░ ██ ░▒▓ ── > loop.end ── │ stable contract ── ✓ adaptive execution ── ⟩ measure.track() ── ⚙ agent.reflect ── ▓▒░ ██ ░▒▓ ── > loop.end ── │ stable contract ── ✓ adaptive execution ── ⟩ measure.track() ── ⚙ agent.reflect ── ▓▒░ ██ ░▒▓ ── > loop.end ── │ stable contract ── ✓ adaptive execution ── ⟩ measure.track() ── ⚙ agent.reflect ── ▓▒░ ██ ░▒▓ ── > loop.end ── │ stable contract ── ✓ adaptive execution ── ⟩ measure.track() ── ⚙ agent.reflect ── ▓▒░ ██ ░▒▓ ── > loop.end ──
English / 原文
$ recurse run ./agent ── ⚡ tools.search() ── │ ├── verify() │ └── return result ── > _ ready ── ░▒▓ ██ ▓▒░ ── $ recurse run ./agent ── ⚡ tools.search() ── │ ├── verify() │ └── return result ── > _ ready ── ░▒▓ ██ ▓▒░ ── $ recurse run ./agent ── ⚡ tools.search() ── │ ├── verify() │ └── return result ── > _ ready ── ░▒▓ ██ ▓▒░ ── $ recurse run ./agent ── ⚡ tools.search() ── │ ├── verify() │ └── return result ── > _ ready ── ░▒▓ ██ ▓▒░ ── $ recurse run ./agent ── ⚡ tools.search() ── │ ├── verify() │ └── return result ── > _ ready ── ░▒▓ ██ ▓▒░ ── $ recurse run ./agent ── ⚡ tools.search() ── │ ├── verify() │ └── return result ── > _ ready ── ░▒▓ ██ ▓▒░ ──
│ task.plan() ── ✓ candidate 07 ── ⟩ measure() ── ⚙ revise ── ▓▒░ ░▒▓ ── > await score ── │ task.plan() ── ✓ candidate 07 ── ⟩ measure() ── ⚙ revise ── ▓▒░ ░▒▓ ── > await score ── │ task.plan() ── ✓ candidate 07 ── ⟩ measure() ── ⚙ revise ── ▓▒░ ░▒▓ ── > await score ── │ task.plan() ── ✓ candidate 07 ── ⟩ measure() ── ⚙ revise ── ▓▒░ ░▒▓ ── > await score ── │ task.plan() ── ✓ candidate 07 ── ⟩ measure() ── ⚙ revise ── ▓▒░ ░▒▓ ── > await score ── │ task.plan() ── ✓ candidate 07 ── ⟩ measure() ── ⚙ revise ── ▓▒░ ░▒▓ ── > await score ──
⟩ agent.build() ── █ manifest.pin ── ├── inputs.validate() ── │ outputs.check ── ░░▒▒▓▓██ ── $ recurse deploy --as mcp ── ⟩ agent.build() ── █ manifest.pin ── ├── inputs.validate() ── │ outputs.check ── ░░▒▒▓▓██ ── $ recurse deploy --as mcp ── ⟩ agent.build() ── █ manifest.pin ── ├── inputs.validate() ── │ outputs.check ── ░░▒▒▓▓██ ── $ recurse deploy --as mcp ── ⟩ agent.build() ── █ manifest.pin ── ├── inputs.validate() ── │ outputs.check ── ░░▒▒▓▓██ ── $ recurse deploy --as mcp ── ⟩ agent.build() ── █ manifest.pin ── ├── inputs.validate() ── │ outputs.check ── ░░▒▒▓▓██ ── $ recurse deploy --as mcp ── ⟩ agent.build() ── █ manifest.pin ── ├── inputs.validate() ── │ outputs.check ── ░░▒▒▓▓██ ── $ recurse deploy --as mcp ──
├── search.sample() ── ⚡ score 0.91 ── │ └── keep ── > score 0.87 · discard ── ▒▓██▓▒ ── $ recurse status ── ├── search.sample() ── ⚡ score 0.91 ── │ └── keep ── > score 0.87 · discard ── ▒▓██▓▒ ── $ recurse status ── ├── search.sample() ── ⚡ score 0.91 ── │ └── keep ── > score 0.87 · discard ── ▒▓██▓▒ ── $ recurse status ── ├── search.sample() ── ⚡ score 0.91 ── │ └── keep ── > score 0.87 · discard ── ▒▓██▓▒ ── $ recurse status ── ├── search.sample() ── ⚡ score 0.91 ── │ └── keep ── > score 0.87 · discard ── ▒▓██▓▒ ── $ recurse status ── ├── search.sample() ── ⚡ score 0.91 ── │ └── keep ── > score 0.87 · discard ── ▒▓██▓▒ ── $ recurse status ──
│ contract.hold ── ✓ tool.register ── ⟩ run_9fd3c2 ── ⚙ prompt.revise ── ░▒▓ ▓▒░ ── > agent.idle ── │ contract.hold ── ✓ tool.register ── ⟩ run_9fd3c2 ── ⚙ prompt.revise ── ░▒▓ ▓▒░ ── > agent.idle ── │ contract.hold ── ✓ tool.register ── ⟩ run_9fd3c2 ── ⚙ prompt.revise ── ░▒▓ ▓▒░ ── > agent.idle ── │ contract.hold ── ✓ tool.register ── ⟩ run_9fd3c2 ── ⚙ prompt.revise ── ░▒▓ ▓▒░ ── > agent.idle ── │ contract.hold ── ✓ tool.register ── ⟩ run_9fd3c2 ── ⚙ prompt.revise ── ░▒▓ ▓▒░ ── > agent.idle ── │ contract.hold ── ✓ tool.register ── ⟩ run_9fd3c2 ── ⚙ prompt.revise ── ░▒▓ ▓▒░ ── > agent.idle ──
⟩ candidate 08 ── █ artifacts: 1 ── ├── test.validate ── │ loop.continue ── ██▓▒░░▒▓ ── $ codex mcp add recurse ── ⟩ candidate 08 ── █ artifacts: 1 ── ├── test.validate ── │ loop.continue ── ██▓▒░░▒▓ ── $ codex mcp add recurse ── ⟩ candidate 08 ── █ artifacts: 1 ── ├── test.validate ── │ loop.continue ── ██▓▒░░▒▓ ── $ codex mcp add recurse ── ⟩ candidate 08 ── █ artifacts: 1 ── ├── test.validate ── │ loop.continue ── ██▓▒░░▒▓ ── $ codex mcp add recurse ── ⟩ candidate 08 ── █ artifacts: 1 ── ├── test.validate ── │ loop.continue ── ██▓▒░░▒▓ ── $ codex mcp add recurse ── ⟩ candidate 08 ── █ artifacts: 1 ── ├── test.validate ── │ loop.continue ── ██▓▒░░▒▓ ── $ codex mcp add recurse ──
$ claude mcp add recurse ── ⚡ deploy mcp_7fc21a ── │ ├── endpoint.ready │ └── specialist.serve ── > _ complete ── ░▒▓██▓▒░ ── $ claude mcp add recurse ── ⚡ deploy mcp_7fc21a ── │ ├── endpoint.ready │ └── specialist.serve ── > _ complete ── ░▒▓██▓▒░ ── $ claude mcp add recurse ── ⚡ deploy mcp_7fc21a ── │ ├── endpoint.ready │ └── specialist.serve ── > _ complete ── ░▒▓██▓▒░ ── $ claude mcp add recurse ── ⚡ deploy mcp_7fc21a ── │ ├── endpoint.ready │ └── specialist.serve ── > _ complete ── ░▒▓██▓▒░ ── $ claude mcp add recurse ── ⚡ deploy mcp_7fc21a ── │ ├── endpoint.ready │ └── specialist.serve ── > _ complete ── ░▒▓██▓▒░ ── $ claude mcp add recurse ── ⚡ deploy mcp_7fc21a ── │ ├── endpoint.ready │ └── specialist.serve ── > _ complete ── ░▒▓██▓▒░ ──
│ stable contract ── ✓ adaptive execution ── ⟩ measure.track() ── ⚙ agent.reflect ── ▓▒░ ██ ░▒▓ ── > loop.end ── │ stable contract ── ✓ adaptive execution ── ⟩ measure.track() ── ⚙ agent.reflect ── ▓▒░ ██ ░▒▓ ── > loop.end ── │ stable contract ── ✓ adaptive execution ── ⟩ measure.track() ── ⚙ agent.reflect ── ▓▒░ ██ ░▒▓ ── > loop.end ── │ stable contract ── ✓ adaptive execution ── ⟩ measure.track() ── ⚙ agent.reflect ── ▓▒░ ██ ░▒▓ ── > loop.end ── │ stable contract ── ✓ adaptive execution ── ⟩ measure.track() ── ⚙ agent.reflect ── ▓▒░ ██ ░▒▓ ── > loop.end ── │ stable contract ── ✓ adaptive execution ── ⟩ measure.track() ── ⚙ agent.reflect ── ▓▒░ ██ ░▒▓ ── > loop.end ──