# 长时间运行的智能体：让一个任务跨越多个会话持续推进

> 长时间运行的智能体，是在一个任务上跨越多个上下文窗口工作的智能体，每个新会话开始时都不记得上一个会话做过什么。状态由 harness 保存：一份需求说明、一份每项带通过标记的功能清单、一个进度文件和 git 历史。每个会话先读这些文件，完成一个功能，做端到端检查，提交代码，再更新笔记。

Mindket 编辑部 · 发布于 2026-11-06 · 更新于 2026-11-06 · https://mindket.com/cn/learn/harness-engineering/long-running-agents

## 要点

- 动手写代码之前，先把整件工作拆成一条条可以检查的项目。
- 每个新会话先读笔记、重跑一项核心测试，再碰新的工作。
- 交给脚本去重启智能体，并给并行的智能体一个认领任务的文件。
- 只在工作能干净拆开的地方加智能体，因为多智能体系统用掉的 token 约是一次对话的 15 倍。

## 智能体一连跑几个小时，会在哪里出问题

让一个编程智能体去做一个 claude.ai 的克隆版，然后放手让它跑，会出现两种失败。Anthropic 用 Claude Agent SDK 上的 Opus 4.5 做过这个实验，并把两种失败都写进了一篇[讲长时间运行智能体的工程文章](https://www.anthropic.com/research/effective-harnesses-for-long-running-agents)。第一种出现在开头：智能体想一口气把整个应用做完，做到一半上下文用光了，留给下一个会话的是一个做了一半、没有任何说明的功能。第二种出现在后期：一个新会话看了一圈，发现已经有不少能跑的代码，就宣布任务完成了，其实并没有。

较早的模型还有第三种失败。Anthropic 的 Labs 团队发现，Claude Sonnet 4.5 在接近它以为的上下文上限时会提前收尾，他们把这叫作“上下文焦虑”。单靠压缩治不好它，所以那套 harness 改成清空上下文，再把一份写好的交接说明交给一个新的智能体。

[Anthropic 对 Claude Code 会话的研究](https://www.anthropic.com/research/measuring-agent-autonomy)看了最长的那些回合（第 99.9 百分位）。它们在 2025 年 10 月到 2026 年 1 月之间几乎翻了一倍，从不到 25 分钟变成超过 45 分钟。文章还写道，从 1 月中旬起，极端的回合时长已有所下降。上下文窗口是模型一次调用能看到的全部文字，而长时间运行的智能体就是为跨越许多个窗口而设计的：一个任务，许多个会话，每个会话都从空白开始。

## 开始之前

这一课接着[什么是智能体 harness](https://mindket.com/cn/learn/harness-engineering/what-is-an-agent-harness)里的循环，以及第 2 课的工具设计往下讲。压缩、记忆文件和上下文编辑能让一个会话撑得更久，[智能体记忆](https://mindket.com/cn/learn/context-engineering/agent-memory)那一课专门讲它们。这一课要解决的，是会话与会话之间的断档。

示例用的是 Anthropic 在 GitHub 上的 [autonomous-coding 快速入门](https://github.com/anthropics/claude-quickstarts/tree/main/autonomous-coding)，一个用 Python 写、基于 Claude Agent SDK 的智能体 harness，也就是模型外围的那层代码。

运行它需要 [Claude Code CLI](https://code.claude.com/docs/en/setup)、Python 和 `ANTHROPIC_API_KEY`，它的 README 也提醒，做完一个完整应用要跨很多个会话、花上好几个小时。

这个快速入门仍然导入旧的 `claude_code_sdk` 包。现在这个 SDK 的包名是 `claude-agent-sdk`，它的 README 写明了 `ClaudeCodeOptions` 已改名为 `ClaudeAgentOptions`。

## 布置第一个会话：需求说明、功能清单、初始化脚本和 git

第一个会话几乎不写应用代码，这是有意为之。Anthropic 把它叫作初始化智能体。它和之后的每个会话用同一套系统提示词、工具和 harness，只有第一条用户消息不同。它的任务，是把需求说明变成一套陌生人也能接手的文件。

防止过早宣布完成的，就是这份功能清单。清单里每一项都是一个端到端测试，带一个 `passes` 标记，所有标记一开始都是 false。下面的格式原样摘自快速入门的[初始化提示词](https://github.com/anthropics/claude-quickstarts/blob/main/autonomous-coding/prompts/initializer_prompt.md)。Anthropic 选 JSON 的原因是，和 Markdown 文件相比，模型更不容易乱改或覆盖 JSON 文件。

````json
[
  {
    "category": "functional",
    "description": "Brief description of the feature and what this test verifies",
    "steps": [
      "Step 1: Navigate to relevant page",
      "Step 2: Perform action",
      "Step 3: Verify expected result"
    ],
    "passes": false
  },
  {
    "category": "style",
    "description": "Brief description of UI/UX requirement",
    "steps": [
      "Step 1: Navigate to page",
      "Step 2: Take screenshot",
      "Step 3: Verify visual requirements"
    ],
    "passes": false
  }
]
````

1. 把需求说明放进 `app_spec.txt`，并让初始化智能体先读它。
2. 让它根据需求说明写出 `feature_list.json`。快速入门要求写 200 个测试，按优先级排列，短的检查和十步以上的长测试都要有。它的 README 建议，想快点看到演示效果，可以减到 20 到 50 个。
3. 用明确的话禁止修改清单。提示词用全大写写着，删除或修改功能是灾难性的，之后的会话只能改 `passes` 这一个字段。
4. 让它写出 `init.sh`，负责安装依赖、启动开发服务器，这样之后的会话不必再花上下文去摸索怎么运行应用。
5. 把清单、脚本和一份 README 做成第一次 git 提交，再在上下文用满之前写好 `claude-progress.txt`。

## 之后的每个会话，都用同一套开场

第一个会话之后的每个会话，都是一个毫无记忆的编程智能体。它的提示词以一套固定流程开头，用七条命令从文件里重新拼出全貌。下面这段原样摘自快速入门的[编程提示词](https://github.com/anthropics/claude-quickstarts/blob/main/autonomous-coding/prompts/coding_prompt.md)。

接下来流程就变得严格了。开始新工作之前，智能体要重跑一两项已经标为通过的核心测试，因为上一个会话可能把它们弄坏了，发现问题先修。然后它挑出优先级最高的未通过功能，只做这一个，并像用户那样在浏览器里点一遍、截图检查。只有到这一步，它才能把 `passes` 改成 true、提交代码，并在进度文件里写下这次做了什么、下一步该做什么。

Anthropic 发现，让模型用写清楚的提交说明提交到 git，再把进展写进一个摘要文件，是[让它每次都把代码留在干净状态的最好办法](https://www.anthropic.com/research/effective-harnesses-for-long-running-agents)，git 还让它能撤回坏的改动。下表把每种失败和对应的做法一一对上。

````bash
# 1. See your working directory
pwd

# 2. List files to understand project structure
ls -la

# 3. Read the project specification to understand what you're building
cat app_spec.txt

# 4. Read the feature list to see all work
cat feature_list.json | head -50

# 5. Read progress notes from previous sessions
cat claude-progress.txt

# 6. Check recent git history
git log --oneline -20

# 7. Count remaining tests
cat feature_list.json | grep '"passes": false' | wc -l
````

| 出了什么问题 | 第一个会话准备什么 | 之后每个会话做什么 |
| --- | --- | --- |
| 智能体宣布整个项目已完成 | 根据需求说明写出的功能清单 | 读清单，挑一个未通过的功能 |
| 缺陷和没记下的进展被带进下一轮 | git 仓库和进度文件 | 读笔记和 git 日志，重跑一项基础测试，再提交并更新笔记 |
| 功能过早被标为完成 | 功能清单 | 自己核查每个功能，仔细测试过才标为通过 |
| 时间都花在弄清怎么运行应用上 | 一个 `init.sh` 脚本 | 一开始先读 `init.sh` |

> 端到端检查也有盲区。文章提到，Claude 通过 Puppeteer MCP 服务器看不到浏览器原生的弹窗提示，依赖这类弹窗的功能问题也更多。

## 用一个循环重启智能体

一个会话结束时，总得有东西启动下一个。在快速入门里，这是一个 [Python 循环](https://github.com/anthropics/claude-quickstarts/blob/main/autonomous-coding/agent.py)。它为每个会话新建一个客户端，第一次发初始化提示词，之后都发编程提示词，等三秒再来一轮。它自己永远不会停下。`--max-iterations` 参数限制会话的数量，按 Ctrl+C 会暂停，再运行同一条命令就能接着跑。

Anthropic 安全防护团队的研究员 Nicholas Carlini 只用一个简单的 shell 循环，就让 16 个智能体在将近 2,000 个 Claude Code 会话里用 Rust 写出了一个 C 编译器。这个编译器约 100,000 行，能在 x86、ARM 和 RISC-V 上构建 Linux 6.9。

下面的循环原样摘自[他的文章](https://www.anthropic.com/research/building-c-compiler)，文章在它正上方写了一句：在容器里运行，不要在你自己的机器上运行。循环里那个参数会关掉所有权限确认，下一课[智能体护栏](https://mindket.com/cn/learn/harness-engineering/agent-guardrails)讲的，就是该在它外面加些什么。

多个智能体共用一个仓库之后，他的 harness 还有几条经验：

````bash
#!/bin/bash

while true; do
    COMMIT=$(git rev-parse --short=6 HEAD)
    LOGFILE="agent_logs/agent_${COMMIT}.log"

    claude --dangerously-skip-permissions \
           -p "$(cat AGENT_PROMPT.md)" \
           --model claude-opus-X-Y &> "$LOGFILE"
done
````

- 智能体认领任务的方式，是往 `current_tasks/` 里写一个文本文件，比如 `current_tasks/parse_if_statement.txt`。如果两个智能体认领了同一项任务，git 的同步会让后到的那个另挑一项。
- 测试输出是写给模型看的。测试 harness 不该打印成千上万字节没用的内容，失败的那一行以 ERROR 开头，原因写在同一行，这样 grep 就能找到。
- 慢的测试集只抽样跑。默认的 `--fast` 选项会随机跑 1% 或 10% 的测试。
- 每个智能体都在一个全新的容器里启动，所以提示词要求它随时更新 README 和进度文件。

## 什么时候把工作拆给多个智能体

多加智能体，换来的是并行的工作和每个工作者各自干净的上下文，代价是 token。Claude 的研究功能做的就是这笔交易。一个主智能体先规划研究，把计划存进记忆，因为上下文窗口超过 200,000 个 token 就会被截断。然后它启动几个子智能体并行搜索。

每个子智能体把发现交回给主智能体。文章末尾的建议里还说，子智能体可以把工作成果存进外部系统，只交回一个轻量的引用，这样长结果在层层转述中损失更少。在 [Anthropic 内部的研究评估](https://www.anthropic.com/research/multi-agent-research-system)里，由 Claude Opus 4 带领 Claude Sonnet 4 子智能体的系统，比单个 Claude Opus 4 智能体高出 90.2%。

token 消耗涨得很快，见下图：Anthropic 说，智能体通常用掉的 token 约是一次对话的 4 倍，多智能体系统约是 15 倍。在 BrowseComp 这项测试浏览智能体能否找到冷僻信息的评估里，光是 token 用量一项，就解释了得分差异的 80%。换作我们，编程任务会先用一个智能体加一套好笔记开始，只有彼此不相干的部分才另派工作者。原因文章里也写了：大多数编程任务里真正能并行的部分比研究少，所有智能体都需要同一份上下文的工作，目前也不适合多智能体系统。

**一个任务用掉的 token，以一次对话为基准** Anthropic 针对自家系统给出的大致倍数。

- 一次对话: 1×
- 一个智能体: 4×
- 一个多智能体系统: 15×

来源：[Anthropic Engineering: How we built our multi-agent research system](https://www.anthropic.com/research/multi-agent-research-system) (2026-11-06 查阅)

## 为什么每换一代模型，harness 就变小一些

harness 里写着我们对“模型自己做不到什么”的猜测，而新模型会让其中一些猜测过时。Anthropic 的 Labs 团队为要花几个小时才能做完的应用搭了一套[三智能体 harness](https://www.anthropic.com/research/harness-design-long-running-apps)。规划者把一到四句话的提示扩写成完整的需求说明，生成者按功能逐个实现。评估者用 Playwright MCP 服务器在运行中的应用里点来点去，只要有一项评分低于门槛，这一轮冲刺就判为失败。同样一个做 2D 复古游戏制作器的提示，单个智能体跑了 20 分钟，三个智能体齐上的 harness 跑了六个小时。

OpenAI 的 Codex 团队把同样的部件放进了文件，而不是交给多个智能体。在[一次运行](https://developers.openai.com/blog/run-long-horizon-tasks-with-codex)里，GPT-5.3-Codex 在 Extra High 推理档位上，从一个空仓库开始做一个设计工具，持续了大约 25 小时，用了大约 13M 个 token，写了大约 30k 行代码。它遵循四个 Markdown 文件：一份带 “Done when” 小节的需求说明、一份带验证命令的里程碑计划、一份操作手册和一份状态日志。检查一旦失败，就先修好再往下走。

换模型时，就重新审视你的 harness。一次只拿掉一个部件，在同一批任务上比较结果，怎么衡量可以看 [AI 评估课程](https://mindket.com/cn/learn/ai-evals/what-are-llm-evals)。

**Anthropic 的长任务 harness 是怎么变的**

1. **2025年6月13日** 主智能体加并行子智能体。研究功能把一个问题拆给几个上下文干净的工作者。
2. **2025年11月26日** 两套提示词，一个 harness。初始化会话准备好功能清单、init.sh 和 git，之后每个编程会话添加一个功能。
3. **2026年2月5日** 16 个智能体，一个仓库。shell 循环里的智能体用锁文件认领任务，合力写出一个 C 编译器。
4. **2026年3月24日** 部件开始减少。为 Sonnet 4.5 准备的上下文重置，到 Opus 4.5 就去掉了。到 Opus 4.6，冲刺也去掉了，评估改为最后统一做一次。

来源：[Anthropic Engineering: How we built our multi-agent research system](https://www.anthropic.com/research/multi-agent-research-system) (2026-11-06 查阅)；[Anthropic Engineering: Effective harnesses for long-running agents](https://www.anthropic.com/research/effective-harnesses-for-long-running-agents) (2026-11-06 查阅)；[Anthropic Engineering: Building a C compiler with a team of parallel Claudes](https://www.anthropic.com/research/building-c-compiler) (2026-11-06 查阅)；[Anthropic Engineering: Harness design for long-running application development](https://www.anthropic.com/research/harness-design-long-running-apps) (2026-11-06 查阅)

## Claude Code 的作者怎样让长任务一直跑下去

Boris Cherny 是 Claude Code 的作者，在 Anthropic 做 Claude。2026 年 1 月 2 日，他在 X 上一个[讲自己配置的帖子串](https://x.com/bcherny/status/2007179858435281082)里，第 12 条列了三种让 Claude 坚持做完长任务的办法，引文见下。第二种最值得搬进你自己的 harness：Claude 想结束时会触发 Stop 钩子，由代码里的检查来决定工作是否真的做完了。

第三种是 ralph-wiggum 插件，他说这个点子最早出自 Geoffrey Huntley，现在它以 [ralph-loop](https://github.com/anthropics/claude-plugins-official/tree/main/plugins/ralph-loop) 的名字放在 Anthropic 的插件仓库里。

Anthropic 在 2025 年 11 月 26 日[发帖介绍那篇 harness 文章](https://x.com/AnthropicAI/status/1993733817849303409)，说的正是这一课开头的问题：智能体跨越多个上下文窗口时依然吃力。它的答案借鉴了人类工程师交接班的方式，所以上面的步骤靠的是文件和提交，而不是更聪明的提示词。下面的工作坊来自 AI Engineer 频道，由 Anthropic 的工程师主讲。

> 我会选下面三种做法之一：（a）在它做完后，提示 Claude 用一个后台智能体来核查自己的工作；（b）用智能体的 Stop 钩子，更确定地做这件事；（c）用 ralph-wiggum 插件
>
> Boris Cherny, Claude Code 作者，在 Anthropic 做 Claude，引文为译文, [X](https://x.com/bcherny/status/2007179858435281082) (2026-11-06 查阅)

[![Boris Cherny（@bcherny）2026 年 1 月 2 日在 X 上的配置串第 12 条：遇到特别长的任务，他会在做完后让 Claude 用后台智能体核查自己的工作，或者用智能体 Stop 钩子更确定地做这件事，或者用最早由 Geoffrey Huntley 想出的 ralph-wiggum 插件。](https://mindket.com/blog/shots/x-bcherny-long-running-tasks.webp?v=986970e2bae1)](https://x.com/bcherny/status/2007179858435281082)

Boris Cherny 在 X 上，2026 年 1 月 2 日

[![Anthropic（@AnthropicAI）2025 年 11 月 26 日在 X 上发帖：Anthropic 工程博客新文章。长时间运行的 AI 智能体在跨越多个上下文窗口工作时依然面临挑战，我们从人类工程师身上找灵感，做出了更有效的智能体 harness。](https://mindket.com/blog/shots/x-anthropicai-long-running-harness.webp?v=20627805a55d)](https://x.com/AnthropicAI/status/1993733817849303409)

Anthropic 在 X 上，2025 年 11 月 26 日

[Anthropic Workshop: Build Agents That Run for Hours, Ash Prabaker and Andrew Wilson](https://www.youtube.com/watch?v=mR-WAvEPRwE)

AI Engineer 的 YouTube 频道上，Ash Prabaker 和 Andrew Wilson 主讲的 Anthropic 工作坊，标题是 Build Agents That Run for Hours。

> X 官方嵌入卡片的截图，拍摄于 2026-11-06，时间为 UTC。点击截图可到 X 上打开原帖。Boris Cherny 的那条帖子被 X 用“Show more”截短了。

## 常见错误

- 功能清单还没写，就开始写应用代码。
- 把任务清单放在 Markdown 文件里，任由之后的会话随意改写。
- 代码能编译、curl 返回 200，就把功能标为完成。快速入门要求在界面上截图检查。
- 没有先重跑核心测试就开始新工作，让上一个会话留下的缺陷扩散开。
- 在容器之外跑跳过权限确认的循环。
- 把成千上万行测试输出倒进智能体的上下文，让它自己去读。
- 给一个没什么可并行部分的编程任务加子智能体，白白多付几倍的 token。

## 自己试一试

- 为一个你熟悉的小应用写一份五项的 `feature_list.json`，每项的步骤都能在浏览器里照着做。
- 把快速入门的初始化提示词减到十个功能，用 `--max-iterations 3` 运行，每个会话结束后读一读 `claude-progress.txt` 和 `git log`。
- 在两个会话之间，亲手把一个已通过的功能弄坏。下一个会话会在开始新工作之前发现它吗？
- 让你的测试程序每个失败只打印一行 ERROR，比较改动前后一次失败的运行占用了多少上下文。

## 自测一下

1. 为什么第一个会话要在写应用代码之前先写功能清单？

   A. 这样测试还没通过时，之后的会话就没法宣布完成
   B. 因为 Agent SDK 需要这个文件才能启动
   C. 为了让上下文窗口更大
   D. 这样智能体就能跳过端到端检查

   答案：A。 每一项的 passes 一开始都是 false，没做完的工作对每个新会话都一目了然。

2. 编程会话在开始一个新功能之前要做什么？

   A. 删掉进度文件
   B. 重写一份功能清单
   C. 读笔记和 git 日志，再重跑一项已通过的核心测试
   D. 再向用户要一次需求说明

   答案：C。 上一个会话可能弄坏了什么，所以快速入门先检查一个核心功能，修好之后再做新工作。

3. 在那个 C 编译器的 harness 里，16 个智能体中的一个怎样认领任务？

   A. 向主智能体要一个
   B. 往 current_tasks/ 里写一个文本文件
   C. 开一个拉取请求
   D. 修改功能清单

   答案：B。 像 current_tasks/parse_if_statement.txt 这样的文件，就是这项任务的锁。

4. 按 Anthropic 那篇研究文章的说法，哪种工作最不适合多智能体系统？

   A. 一个范围很广的研究问题
   B. 可以同时进行的几路搜索
   C. 对许多互不相关的资料做调查
   D. 每个智能体都需要同一份上下文的编程工作

   答案：D。 大多数编程工作可并行的部分比研究少，需要共享同一份上下文的工作目前不适合多智能体系统。

## 常见问题

### 什么是长时间运行的智能体？

凡是为一个目标工作得比一个上下文窗口还久的智能体都算。做整个应用的编程智能体是，共用一个仓库的一组智能体也是。每次重启都会抹掉模型的记忆，能留下来的只有文件和提交。

### 只靠压缩，够不够让智能体做完一个长任务？

不一定够。在 Anthropic 的实验里，一个较早的 Claude 模型即使有压缩也还是会提前收尾，于是团队改用清空上下文加书面交接。磁盘上的文件不受任何重置影响，所以 harness 把状态放在那里。

### 功能清单该写多少项？

多到每一项都能在一个会话里完成就行。快速入门的数量是按一整个网页应用定的，它的 README 建议做演示时少写很多。智能体在一个上下文窗口里做不完、查不完的项，就再拆开。

### 进度文件里该写些什么？

这个会话做了什么、完成了哪些测试、发现或修好了哪些问题、下一步该做什么，以及总共有多少测试已经通过。这正是快速入门的编程提示词要求写的内容。

### 什么是 Ralph Wiggum 循环？

它在智能体每次停下时，把同一个提示词再喂给它一遍，这个点子出自 Geoffrey Huntley。在 Claude Code 里，ralph-loop 插件用 Stop 钩子来做这件事，遇到约定的完成短语就结束。它的 README 要求始终设置 `--max-iterations` 作为保险。

## 资料来源

- [Anthropic Engineering: Effective harnesses for long-running agents](https://www.anthropic.com/research/effective-harnesses-for-long-running-agents) (2026-11-06 查阅)
- [GitHub: anthropics/claude-quickstarts, autonomous-coding README](https://github.com/anthropics/claude-quickstarts/tree/main/autonomous-coding) (2026-11-06 查阅)
- [GitHub: autonomous-coding initializer prompt](https://github.com/anthropics/claude-quickstarts/blob/main/autonomous-coding/prompts/initializer_prompt.md) (2026-11-06 查阅)
- [GitHub: autonomous-coding coding prompt](https://github.com/anthropics/claude-quickstarts/blob/main/autonomous-coding/prompts/coding_prompt.md) (2026-11-06 查阅)
- [GitHub: autonomous-coding agent.py session loop](https://github.com/anthropics/claude-quickstarts/blob/main/autonomous-coding/agent.py) (2026-11-06 查阅)
- [GitHub: anthropics/claude-agent-sdk-python README](https://github.com/anthropics/claude-agent-sdk-python) (2026-11-06 查阅)
- [Anthropic Engineering: How we built our multi-agent research system](https://www.anthropic.com/research/multi-agent-research-system) (2026-11-06 查阅)
- [Anthropic Engineering: Harness design for long-running application development](https://www.anthropic.com/research/harness-design-long-running-apps) (2026-11-06 查阅)
- [Anthropic Engineering: Building a C compiler with a team of parallel Claudes](https://www.anthropic.com/research/building-c-compiler) (2026-11-06 查阅)
- [Anthropic Research: Measuring AI agent autonomy in practice](https://www.anthropic.com/research/measuring-agent-autonomy) (2026-11-06 查阅)
- [OpenAI Developers: Run long horizon tasks with Codex](https://developers.openai.com/blog/run-long-horizon-tasks-with-codex) (2026-11-06 查阅)
- [GitHub: anthropics/claude-plugins-official, ralph-loop plugin](https://github.com/anthropics/claude-plugins-official/tree/main/plugins/ralph-loop) (2026-11-06 查阅)
- [X: Boris Cherny on long-running tasks](https://x.com/bcherny/status/2007179858435281082) (2026-11-06 查阅)
- [X: Anthropic shares its post on long-running agent harnesses](https://x.com/AnthropicAI/status/1993733817849303409) (2026-11-06 查阅)
- [YouTube (AI Engineer): Anthropic Workshop, Build Agents That Run for Hours](https://www.youtube.com/watch?v=mR-WAvEPRwE) (2026-11-06 查阅)

[浏览 AI 智能体](https://mindket.com/cn/agents)
