# 一直活着的 Agent

> The One 的 Agent 不是调用完就消失的函数：每个 Agent 有自己一直运转的生命循环，睡着、出错、应用重启之后都还在。

The One 的 Agent 是活着的，不是被调用一次就结束的函数。每个能运行的 Agent 都有自己一条不停的生命循环，并且只通过自己的工具决定自己的状态。

## 醒着、睡着、出错 [#醒着睡着出错]

* **醒着**：一轮接一轮地推理和行动，见 [ReAct 与回合](./react)。
* **睡着**：Agent 用 `sleep_node` 歇下，但它没有消失。它的循环每秒看一眼自己的状态，你的消息、别人交过来的工作、一个回答或一个后台结果，都会叫醒它。它的上下文一直都在，随时可以查看。
* **出错**：模型服务出错、连不上时，Agent 不会被放弃。它按越来越长的间隔重试，间隔最长 10 分钟，之后就按这个间隔一直试下去；服务商要它多等时（比如用量窗口用完了），就等得更久。如果是凭据被拒，你在设置里换了这个连接的凭据后，它会在几秒内再试一次；在对话里点**现在就试**也一样。

## 存下来的状态才是真的 [#存下来的状态才是真的]

一个 Agent 醒没醒、在做什么，以存下来的状态为准，而不是以某段内存为准。叫醒一个 Agent，就是把它的状态写成“醒着”；它的循环读到，就醒来。所以：

* 你关掉应用、电脑重启，或者应用崩溃了，什么都不会丢。再打开时，每次运行都照存下的样子回来，只是先暂停着；正干到一半的 Agent 标着出错，让你看得出它被打断过。你恢复这次运行，或者给它发一条消息，原来在干活的 Agent 就接着干。触发器开的运行会自己接着做；Agent 自己要求的重启（`restart_desktop_application`）也一样，重启后原来在跑的运行自己接着跑。
* 一个本该在跑的 Agent 万一丢了它的循环，宿主每分钟巡检一次，把它找回来。
* 新消息和“这一轮结束”同时到时，新消息赢：Agent 醒着去回，不会出现消息存下了、Agent 却睡着没人回的情况。

## 暂停和打断 [#暂停和打断]

* **暂停**是协作式的：Agent 先做完手上这一步，在两轮之间停下。宿主自己只用这种暂停，比如用量到了你设的边界。
* **打断**和**急停**只有你能做，而且立刻生效。打断一个 Agent，它手上的这一步就停下；**急停所有 Agent** 中断所有 Agent，结束它们启动的命令，并暂停所有运行，直到你恢复。恢复以后，原来在干活的 Agent 接着干。见[行动记录、撤回和急停](../../the-one-app/action-log)。

## 为什么这样设计 [#为什么这样设计]

一个要替你长期做事的助理，不能因为一次报错就放弃，也不能因为应用重启就忘了手上的活。每个 Agent 一直活着、以存下来的状态为准，它才能像一个靠得住的同事：歇下了，叫一声就回来；出错了，过一会儿自己再试；你不在的时候，事情照样往前走。

Source: https://the-zeroth.com/zh/docs/multi-agent-architecture/single-agent/life
