---
title: 同时运行多个 Agent
description: 让一支 Agent 队伍并排工作，一眼读出它们的实时状态，并知道每个 Agent 是通过哪条信号汇报的——program status 协议、hooks、终端标题，还是最后才用的屏幕。
x-i18n:
  source_path: agents.mdx
  source_hash: 4897b782df49736b9fc60cdb5895565591a82aa8ba57decab8cf5a79de0b5a34
  generated_at: 2026-10-10
---

Fyolo 就是为同时运行多个 Agent 造的。侧栏是你的控制台：每个会话是一行，每一行都汇报
它的 Agent 此刻在做什么。任何终端都能让你同时开好几个 Agent；这里换来的是你不必盯着
它们。

## 内置的 Agent

Fyolo 开箱即认常见的编程 Agent：

| Agent | 命令行 |
| --- | --- |
| Claude Code | `claude` |
| Codex | `codex` |
| OpenCode | `opencode` |
| OpenCode 2 | `opencode2` |
| Pi | `pi` |
| Amp | `amp` |
| Droid | `droid` |
| Cursor | `cursor-agent` |
| Copilot | `copilot` |
| Kimi | `kimi` |
| Qwen Code | `qwen` |
| Antigravity | `agy` |
| Crush | `crush` |
| Cline | `cline` |
| Hermes | `hermes` |
| Grok | `grok` |

其中任何一个只要装在你的 `PATH` 上，就会出现在启动选项里。普通 shell 始终可用。用的是
别的工具？任何命令行工具都能成为一等 Agent——参见
[自定义 Agent](/zh-CN/docs/custom-agents)。

这里的 `PATH` 指那台机器自己的 `PATH`：Fyolo 会去工作区所在的机器上找它们，所以一台
VPS 提供的是装在它上面的那些。**设置 ▸ Agent** 会直接在那一行里说出来——*未安装在
`devbox` 上*——而不是把它藏在一个设备选择器后面。

<DocsImage
  src="/screenshots/docs/17-agents-settings.png"
  alt="Fyolo 的 Agent 设置显示完整内置目录，并选中 Claude Code"
  width={1664}
  height={1288}
/>

Fyolo 通过你真正的登录 shell 启动每个 Agent，所以你的 shell 配置准备的一切——版本管理器、
往 `PATH` 里加的路径、凭据——都和在 iTerm 里一模一样地在那儿。如果一个 Agent 明明装了，
Fyolo 却说找不到，那几乎总是 `PATH` 的问题；Agent 页会把这件事说出来，并且命令字段接受
绝对路径。

## 每个 Agent 汇报什么 [#what-each-agent-reports]

状态并不是对每个 Agent 都用同一种方式猜出来的，而当一个状态点不动时，这个差别值得知道。
每个 Agent 在自己的[清单](/zh-CN/docs/atp)里声明它的通道，只有一个例外：**program status**
是 Agent 用 [program status 协议](https://mitchellh.com/writing/program-status-osc7501)（`OSC 7501`）通过终端汇报自己的状态，它在汇报时
高于其他所有信号。**hooks** 是 Agent 自己汇报每一轮，在没有 program status 的地方就是权威；
**标题**是从终端标题里读出来的带内信号；**进度**是 `OSC 9;4`
进度序列。这些都没声明的 Agent，就从窗格本身来读——看它的输出还动不动，而不是去匹配屏幕上
的词；后者只发生在清单把模式写明了的 Agent 身上。

| Agent | 状态信号 | 能恢复对话 |
| --- | --- | --- |
| Claude Code | program status + hooks + 标题 | 是 |
| Codex | hooks + 标题 | 是 |
| Grok | hooks + 标题 + 进度 | 是 |
| Qwen Code | hooks + 标题 | 是 |
| Pi | program status | 是 |
| OpenCode | hooks（插件） | 是 |
| OpenCode 2 | hooks（插件） | —— |
| Amp | hooks | —— |
| Cursor | hooks | —— |
| Copilot | hooks | —— |
| Kimi | hooks | —— |
| Cline | hooks | —— |
| Droid | hooks | —— |
| Crush | 屏幕规则 + 进度 | —— |
| Antigravity | 输出活动 | —— |
| Hermes | 输出活动 | —— |

program status 需要 Claude Code 2.1.295 或 Pi 1.1.0 及更新版本。Claude Code 的 hook 现在只补充
它正在运行的工具；Pi 完全不需要 hook。更早的版本汇报得更少：Claude Code 的状态点跟着它的终端
标题走，Pi 的跟着它的输出走。

「能恢复对话」的意思是，重新打开会话会把 Agent 放回*同一段*对话，而不是一段空白——参见
[什么会留下来](/zh-CN/docs/persistence)。没有这一项的 Agent 会在同一个目录里重新跑一遍。

打开 **Agent 实时状态**后，hooks 会按每台设备各自替你装好。一台在你打开这个开关之前就设置
好的机器上没有 hooks，这就是远程会话的状态点始终不动的常见原因——参见
[状态 hooks 与会话控制](/zh-CN/docs/session-control)。

## 一眼读出状态

每个会话行都带一个实时状态点——**工作中**、**空闲**、**完成**，或**需要你**。
[侧栏指南](/zh-CN/docs/sidebar#status)解释了每种状态的含义，
[核心概念](/zh-CN/docs/concepts#status)讲了信号从哪里来。

真正重要的区别是**完成**和**需要你**。一轮跑完是*完成*——一个平静的提示，告诉你有活儿在
你不在的时候落地了。*需要你*留给那种确实无法继续的 Agent：一个权限提示、一个问题、一个
选择。把这两者混为一谈，正是让一支队伍变成一堆警报的原因，所以 Fyolo 让「好了」保持安静，
把响亮的那个状态留给唯一那种走开就要赔上时间的情况。

<DocsImage
  src="/screenshots/docs/05-session-statuses.png"
  alt="Fyolo 侧栏和 fyolo sessions list 输出显示空闲、工作中、完成和需要你状态"
  width={2424}
  height={1664}
/>

状态会向上汇总。项目那一行概括它里面的会话，菜单栏托盘概括全部——所以你可以整个人在别的
应用里，仍然在第一时间知道有东西需要你。

## 跳过权限提示

不少 Agent 都带一个让它不再每次调用工具前都问的标志。只要有，Fyolo 就把它接到一个开关上，
而不是让你去记它怎么拼：在**设置 ▸ Agent** 里为某个 Agent 打开，Fyolo 就会在启动时追加
那个 Agent 自己的标志。

这是关于这个 Agent 的一个长期决定，所以和它的命令路径不同，它**不是**按设备的——这个标志
会跟着这个 Agent 的每一次启动，在每一台机器上。打开开关之前先看清那个标志：它们是厂商自己
的逃生口，有些交出去的东西不止是提示。Codex 的是
`--dangerously-bypass-approvals-and-sandbox`，在放弃审批的同时也放弃了它的沙箱。Fyolo
只追加厂商写明的东西；它自己不加任何沙箱。

<Callout type="note">
  一个无人看管运行的 Agent，恰恰是你最想给它一条真正状态通道的那个。先打开 hooks，再关掉
  提示，否则你失去的正是那条本来会告诉你它停下来了的信号。
</Callout>

## 切换而不丢失位置

点一个会话会立刻把它带到前面；其余的继续在后台跑。因为每个会话都是跑在它那台机器上的真实
进程，Agent 不会因为不在屏幕上而暂停——你切换工作区、关掉窗口时也一样。在一个会话里起一段
长任务，切到另一个，等第一个举手时再回来。

当会话多到一只手数不过来时，`⇧⌘O` 能直接按名字跳到任意一个——参见
[导航](/zh-CN/docs/navigation)。

## 让两个 Agent 别动同一批文件

两个 Agent 在同一个检出里一定会撞车：同一个工作树、同一个索引、同一个分支。解法不是协调，
而是分开——给每条线一个自己的 Git worktree，各指一个 Agent 过去。Fyolo 直接从 Git 读
worktree 并把它们嵌在项目下面，所以这是一次右键，而不是一步配置。参见
[Git worktree](/zh-CN/docs/worktrees)。

## 让 Agent 互相驱动

一旦一支队伍变成常态，你接下来想要的就是让一个 Agent 来管这支队伍。`fyolo sessions` 就是
这套 API：一个 Agent 可以列出它的同级、按一个提示词开出新的、回答一个卡住的会话，以及阻塞
到某一轮结束——全都走一个本地 socket，并限定在它自己的项目里。

```bash
fyolo sessions list
fyolo sessions spawn "update the changelog for 0.54" --agent codex
fyolo sessions watch
```

它是可选的，打开它的同时还会安装一个小技能，让你的 Agent 知道这些命令存在。完整的动词参考
见[命令行工具](/zh-CN/docs/cli)，开关见[会话控制](/zh-CN/docs/session-control)。

<Cards>
  <Card href="/zh-CN/docs/custom-agents" title="自定义 Agent">
    用一份小小的 JSON 清单教会 Fyolo 任何命令行工具。
  </Card>
  <Card href="/zh-CN/docs/persistence" title="什么会留下来">
    你关闭、退出或重启时，正在跑的 Agent 会怎么样。
  </Card>
  <Card href="/zh-CN/docs/cli" title="命令行工具">
    `fyolo sessions` 编排 API，一个动词一个动词地讲。
  </Card>
</Cards>
