1. 先把三个容易混淆的东西拆开看
Claude Code 用久了会发现,claude agents、/agents、/tasks这三个词长得像亲戚,但管的事情完全不一样。我一开始也把它们当成同一套东西,结果在排查后台任务时绕了不少弯路。这篇笔记就按我实际踩坑的顺序,把多 Agent 协作、后台通知、优雅退出这条链路讲清楚,并且用 TaoToken 统一 Key 把多 Agent 的配置骨架搭起来,让你在本地能直接复现一套可观测的工作流。
先说结论式的区分,方便你建立心智模型:
claude agents是 CLI 命令,管的是 background session,也就是后台独立运行的完整 Claude Code 会话。它跨项目,是一个全局的后台会话管理器。
/agents是交互会话里的 slash command,管的是 subagent,也就是当前会话派出去的专用助手,比如 code-reviewer、Explore 这类有独立上下文窗口的角色。
/tasks也是 slash command,管的是当前会话内部的任务列表,类似一个 todo 面板,看的是工作项而不是执行者。
一句话记忆:claude agents看后台会话,/agents看或管理 subagents,/tasks看当前会话任务项。这三者关注的对象不同,混用会导致你在错误的地方找信息。比如你想看后台跑完没有,去/tasks是找不到的;你想看当前会话拆了几步,去claude agents也是看不到的。
理解了这个分层,后面配置 TaoToken 统一 Key、挂 hooks 通知、做优雅退出才有清晰的落点。因为多 Agent 协作的本质,就是让不同的执行单元(后台会话、subagent、任务项)各自跑在正确的轨道上,而你需要一个统一的入口去观测它们。
2. 用 TaoToken 统一 Key 打通多 Agent 配置
多 Agent 场景下最烦的事情之一是 Key 管理。后台会话、subagent、不同项目目录,如果每个地方都塞一份不同的 Key,改起来就是灾难。我的做法是用 TaoToken 作为统一的 API 通道,所有 Claude Code 会话都指向同一个入口,这样无论开多少个后台 agent,鉴权和计费口径都是一致的。
TaoToken 的官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api ,注意 API 地址不带 UTM 参数。你需要先在控制台创建 API Key,控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,Key 管理页面在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,遇到字段不确定的时候对着文档核对最稳。
这里要强调一点:TaoToken 是合规的 API 通道服务,不是所谓的中转,也不涉及任何网络访问工具。你只是把 Claude Code 的模型请求指向一个统一的 API 入口,方便多 Agent 共享同一套鉴权配置。这一点在团队协作里尤其重要,因为 Key 集中管理后,轮换和审计都简单很多。
配置的核心落在~/.claude/settings.json。这个文件同时承载了模型通道配置和 hooks 配置,所以后面讲通知的时候还会回到它。建议你先备份一份原始文件,再动手改:
cp ~/.claude/settings.json ~/.claude/settings.json.bak如果你还没有这个文件,直接新建即可。下面给出一个可复制的配置骨架,把 TaoToken 的 API 通道和基础环境变量放进去。注意ANTHROPIC_BASE_URL指向 TaoToken 的 API 地址,ANTHROPIC_AUTH_TOKEN填你在控制台创建的 Key:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "sk-你的TaoToken密钥" }, "preferredNotifChannel": "auto" }这个骨架的好处是,所有从这个环境启动的 Claude Code 会话,包括claude --bg创建的后台会话,都会自动继承这套通道配置。你不需要在每个项目里重复写 Key,也不用担心某个后台 agent 用了旧的鉴权信息。
如果你有多个项目需要隔离计费或权限,可以在项目级配置里覆盖,但大多数个人开发场景下,全局统一一套就够了。改完之后用下面的命令确认 JSON 没写坏:
jq . ~/.claude/settings.json >/dev/null && echo "settings.json OK"输出settings.json OK就说明格式没问题。这一步看着简单,但后面 hooks 配置一旦写错,整份文件可能被忽略,所以每次改完都验一下是值得养成的习惯。
3. 可复制的多 Agent 与 hooks 通知配置
现在把多 Agent 协作真正需要的东西补全。后台会话跑长任务时,你最怕的是它跑完了你不知道,或者它卡在权限确认上等你半天。Claude Code 的 hooks 机制就是解决这个的:在特定事件发生时触发本地命令,比如弹一个系统通知。
下面这份配置在上一节的基础上,加入了后台 agent 完成、任务完成、需要权限、需要输入这几类事件的通知。macOS 用osascript触发系统通知,Linux 可以换成notify-send,Windows 可以用 PowerShell 的 BurntToast 之类方案,这里以 macOS 为例:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "sk-你的TaoToken密钥" }, "preferredNotifChannel": "auto", "hooks": { "SubagentStop": [ { "matcher": "", "hooks": [ { "type": "command", "command": "osascript -e 'display notification \"后台 agent 已完成\" with title \"Claude Code\"'" } ] } ], "TaskCompleted": [ { "hooks": [ { "type": "command", "command": "osascript -e 'display notification \"Claude 任务已完成\" with title \"Claude Code\"'" } ] } ], "Notification": [ { "matcher": "permission_prompt|idle_prompt", "hooks": [ { "type": "command", "command": "osascript -e 'display notification \"Claude 需要你的处理\" with title \"Claude Code\"'" } ] } ], "PermissionRequest": [ { "matcher": "Bash|Edit|Write|Read|MultiEdit|NotebookEdit|AskUserQuestion", "hooks": [ { "type": "command", "command": "osascript -e 'display notification \"Claude 正在等待权限确认\" with title \"Claude Code\"'" } ] } ], "Elicitation": [ { "hooks": [ { "type": "command", "command": "osascript -e 'display notification \"Claude 正在等待你的输入\" with title \"Claude Code\"'" } ] } ] } }如果你原来已经有 hooks,千万不要整段覆盖,要把新的事件节点合并进去。JSON 里同一个 key 重复出现会以后者为准,直接覆盖会丢掉你之前的配置。
各事件的分工可以对照下面这张表理解:
| 事件 | 触发场景 | 是否关键 |
|---|---|---|
| SubagentStop | 子 agent 或后台 agent 结束 | 后台任务提醒的核心 |
| TaskCompleted | task 被标记完成 | 任务进度提醒 |
| Notification | 权限提示、空闲提示等内部通知 | 需要你回来处理 |
| PermissionRequest | Claude 准备请求工具权限 | 避免卡在授权 |
| Elicitation | Claude 需要用户输入或确认 | 避免长时间空等 |
| Stop | 当前这一轮响应结束 | 可选,粒度较细 |
如果只关心后台任务做完提醒,重点配SubagentStop和TaskCompleted。如果还关心需要你回来处理,把Notification、PermissionRequest、Elicitation一起加上。多 Agent 并行时,这几个通知能显著降低你来回切窗口的频率。
4. 验证请求与成功结果
配置写完不代表生效,得实际触发一次才算数。验证分三层:JSON 格式、通知命令本身、hook 节点是否被识别。
第一层,确认 JSON 没坏:
jq . ~/.claude/settings.json >/dev/null && echo "settings.json OK"第二层,确认系统通知命令能弹出来:
osascript -e 'display notification "Claude Code 通知测试" with title "Claude Code"'如果这条命令能弹通知,说明系统通知本身没问题。弹不出来就去系统设置的通知里,检查 Terminal、iTerm2、Warp 这些终端应用是否被允许通知。
第三层,确认 hook 节点确实写进去了:
jq -e '.hooks.SubagentStop and .hooks.TaskCompleted and .hooks.Notification and .hooks.PermissionRequest' ~/.claude/settings.json输出true就说明节点都在。这三层只能证明配置存在、命令能跑,要验证 hook 真的被 Claude Code 触发,还得制造真实事件。
验证后台 agent 完成通知,启动一个简单的后台会话:
claude --bg --name "notify-test" "简单总结当前目录下有哪些文件,只输出摘要,不修改文件"然后用claude agents查看会话列表,等它跑完后应该能看到系统通知弹出「后台 agent 已完成」。如果没弹,先确认这个会话确实结束了,再看claude logs <id>有没有正常输出。
验证权限提醒,可以让 Claude 执行一个需要确认的命令,比如让它运行pwd。如果当前权限模式会弹确认,那么应该同时看到系统通知。如果没触发,可能是这个命令已经被 allow 了,换一个尚未授权的工具再试。
验证模型通道是否走通,可以直接用模型对话页面发一条测试消息,地址是 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite ,确认返回正常就说明 Key 和通道没问题。这一步和 Claude Code 的配置是同一套鉴权,能帮你快速定位是 Key 问题还是本地配置问题。
如果配置改了但没生效,可以在 Claude Code 里打开/hooks让它重新加载,或者直接重启。还要检查一下 hooks 有没有被全局禁用:
jq '.disableAllHooks' ~/.claude/settings.json如果输出true,说明 hooks 被关掉了,改成false或删掉这个字段。
5. 本篇常见错排查
多 Agent 配置最容易出问题的地方,我整理成几条,按出现频率排序。
第一条,claude agents看到的结果跨项目,导致误操作。这个我实测下来确实如此,它更像一个全局后台会话管理器,不是当前项目专属列表。如果你同时在多个项目里开了后台会话,列表会混在一起。降低风险的做法是创建时带名字,比如claude --bg --name "my-app-test-check" "检查当前项目测试失败原因",查看时用claude agents --cwd ~/projects/my-app过滤,停止或删除前先claude logs <id>看日志,不确定就先claude attach <id>确认归属。
第二条,把claude agents和/agents当成一回事。前者是 CLI 命令,管后台会话;后者是 slash command,管 subagent。你在终端里敲claude agents和在会话里敲/agents,看到的是完全不同的东西。这个混淆会导致你以为后台任务没了,其实只是看错了地方。
第三条,hooks 配置覆盖了原有内容。合并时一定要保留已有节点,JSON 里同名 key 后者覆盖前者,直接粘贴会丢配置。改完用jq验证,别凭肉眼。
第四条,通知不弹。先确认系统通知权限给了终端应用,再确认osascript命令单独能跑通,最后确认 hook 节点存在。三层都过了还不弹,就检查disableAllHooks是不是true。
第五条,删除后台会话时连带清掉 worktree。如果 Claude 为后台会话创建了独立 worktree,删除会话可能清理对应 worktree,里面有未提交改动就会一起没。删除前确认这个会话有没有 worktree、里面有没有未保存的改动。相对保守的做法是用claude rm <id>命令行删除,对有未提交改动的 worktree 通常会更谨慎,可能保留路径并提示你手动处理。
第六条,优雅退出的按键语义搞错。在claude agents视图里,Ctrl+X第一次是 stop session,短时间内第二次才是 delete session。只是想离开界面让 agent 继续跑,用Esc;已经 attach 进去的,用←或Ctrl+Z只是 detach,不会停止后台会话。想真正停止用claude stop <id>,想删除用claude rm <id>。
第七条,Key 配了但请求失败。先确认ANTHROPIC_BASE_URL是https://taotoken.net/api,注意 API 地址不带 UTM 参数;再确认ANTHROPIC_AUTH_TOKEN是控制台里创建的有效 Key。如果还是不行,去接入文档核对字段,或者用模型对话页面单独测一下 Key 是否可用。
6. 长期编码与 Agent 工作流的入口
如果你打算把 Claude Code 当成长期运行的开发助手,而不是一次性问答工具,那后台会话、任务追踪、hooks 通知这几块能力会越来越重要。它们解决的不是「Claude 会不会写代码」,而是「长任务跑完我能不能知道」「需要我授权时我能不能及时回来」「多个后台会话并行时我怎么管理」「结束后我怎么安全清理」这些实际协作问题。
多 Agent 协作的推荐分工是:主会话负责决策、整合、确认方向;后台会话负责搜索、分析、验证这类长任务;/tasks负责追踪当前主线任务进度。这样claude agents里看后台会话,/tasks里看当前事情做到哪了,职责清晰,不容易乱。
如果你主要在本地做长期编码、跑 Agent 工作流,可以了解一下 Coding Plan,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,它更适合这种持续性的编码场景。需要管理多个 Key 或做团队协作时,API Keys 页面在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite ,接入细节随时对照 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。Claude Code 相关的接入说明也可以看 https://taotoken.net/claudecode-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode-anthropic&utm_campaign=rewrite ,里面有更贴近 Claude Code 的配置示例。
最后留一个我自己的使用习惯:创建后台会话时一定带--name,名字里带项目或任务信息;删除前先logs再attach,确认归属再stop或rm。这套流程跑顺之后,Claude Code 的后台能力就更像一个可管理、可追踪、可提醒的 AI 开发工作台,而不是一堆散落的会话。