1. 从一次线上告警说起:为什么需要把外部事件推入会话
凌晨两点,CI 流水线挂了,但没人知道。第二天早上打开 Claude Code 会话,发现昨晚的部署任务早就跑完了,只是失败信息躺在日志里没人看。这个场景我猜很多做后端或者 DevOps 的朋友都遇到过——自动化任务跑是跑了,但结果没人收口,等于白跑。
Claude Code 的 Channels 和计划任务(CronCreate)就是来解决这个问题的。简单说,Channels 负责把外部事件(Telegram 消息、Discord 通知、CI 回调、自定义 webhook)主动推进当前会话,让 Claude 实时处理;计划任务负责让 Claude 按时间节奏自己轮询或提醒。两者配合,才能形成"事件进来 → Claude 处理 → 结果出去"的闭环。
这套东西适合谁?三类人:一是需要把告警、CI 状态、监控事件自动接入 AI 会话的开发者;二是想让 Claude 定时做代码巡检、日志扫描、数据备份的运维同学;三是正在搭 Agent 工作流、需要事件驱动而非纯对话驱动的工程师。如果你只是偶尔问问代码问题,那/loop和 Channels 对你意义不大,但如果你在搭自动化流水线,这篇值得看完。
我实测下来最大的感受是:Channels 和计划任务是两个正交的能力,很多人一上来就搞混,结果配了半天发现方向错了。所以下面先讲清楚决策逻辑,再给可复制的配置。
2. 前置准备:TaoToken 统一 Key 与 API 通道
在配 Channels 之前,得先把模型通道打通。Claude Code 本身支持多种接入方式,但如果你想让 Channels 推过来的事件能稳定调用模型,建议用统一的 API 通道,避免每个 channel 各配一套 key 导致管理混乱。
TaoToken 在这里的角色是提供一个统一的 Key 和 API 入口,Claude Code 的模型请求、Channels 的事件处理、计划任务的定时调用,都走同一个通道。这样你只需要维护一份凭证,换模型、调额度、看用量都在一个地方。
具体操作:先到官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 注册账号,然后在控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite 创建一个 API Key。这个 Key 后面会写进 Claude Code 的配置文件里。
拿到 Key 之后,Claude Code 侧的配置分两块:一块是模型通道(settings.json),一块是 Channels 插件配置(config.toml)。下面直接给骨架。
注意:API 地址统一用 https://taotoken.net/api,不要加 UTM 参数,这是给程序调用的,不是给浏览器点的。
3. 可复制配置:settings.json 与 config.toml 骨架
3.1 settings.json:模型通道与全局开关
Claude Code 的 settings.json 一般放在~/.claude/settings.json(用户级)或项目根目录.claude/settings.json(项目级)。项目级优先于用户级。下面这份是我实测能跑通的骨架:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-your-taotoken-key-here", "CLAUDE_CODE_DISABLE_CRON": "0" }, "permissions": { "allow": [ "Bash(git status)", "Bash(git diff:*)", "Read", "Write" ] }, "channels": { "enabled": true, "allowedChannelPlugins": [ "plugin:fakechat@claude-plugins-official", "plugin:telegram@claude-plugins-official" ] } }几个关键点解释一下。ANTHROPIC_BASE_URL指向 TaoToken 的 API 入口,ANTHROPIC_API_KEY填你刚才在控制台创建的 Key。CLAUDE_CODE_DISABLE_CRON设为0表示启用计划任务调度器,如果你完全不需要定时功能,设成1可以彻底关掉。channels.enabled是总开关,allowedChannelPlugins是白名单——只有列在这里的插件才能注册成 channel,这是安全边界的第一层。
3.2 config.toml:Channels 插件级配置
Channels 的插件配置走 config.toml,一般放在~/.claude/config.toml。不同 channel 的配置项不一样,但结构类似:
[channels.fakechat] enabled = true port = 8787 allowlist = ["local"] [channels.telegram] enabled = true bot_token = "123456:ABC-your-bot-token" allowlist = ["your_telegram_username"] pairing_required = true [channels.discord] enabled = false bot_token = "" allowlist = []allowlist是核心安全机制。不是"谁知道 bot 就能发消息进来",而是"只有被允许的 sender 才能推消息"。Telegram 的pairing_required = true表示首次使用需要配对码验证,防止陌生人直接给你的 bot 发指令。
3.3 计划任务相关配置
计划任务不需要单独配置文件,它通过会话内的命令和.claude/loop.md来管理。如果你想自定义/loop不带参数时的默认行为,创建.claude/loop.md:
# 自定义循环任务默认行为 ## 优先级设置 1. 检查 CI/CD 流水线状态 2. 扫描日志中的错误模式 3. 检查未处理的 PR review comments ## 执行策略 - 每次循环间隔:10分钟 - 失败重试:最多3次 - 通知方式:仅当发现异常时通知项目级.claude/loop.md优先于用户级~/.claude/loop.md。修改后下一次迭代自动生效,不需要重启。
4. 验证请求:从 fakechat 到真实事件闭环
配置写完,先别急着接 Telegram,用 fakechat 插件验证整条链路最安全。fakechat 是官方提供的本地测试 channel,不依赖任何外部平台。
4.1 安装并启动 fakechat
# 安装官方插件市场(如果还没装) /plugin marketplace add anthropics/claude-plugins-official # 安装 fakechat 插件 /plugin install fakechat@claude-plugins-official # 重载插件 /reload-plugins # 退出当前会话,用 --channels 参数重新启动 claude --channels plugin:fakechat@claude-plugins-official启动后,浏览器打开http://localhost:8787,在页面里输入任意消息,比如 "Hello from fakechat!"。回到 Claude Code 会话,你会看到类似这样的消息:
<channel source="fakechat">Hello from fakechat!</channel>这说明事件已经成功推入会话。接下来让 Claude 处理它:
/process "Hello from fakechat!"4.2 验证计划任务
计划任务的验证更直接。在会话里输入:
/loop 5m check if the deployment finished and tell me what happenedClaude 会确认循环任务已创建,并告诉你下一次触发时间。等 5 分钟,或者直接输入what scheduled tasks do I have?查看当前任务列表。
如果你想测试 CronCreate 的精确调度:
CronCreate "*/2 * * * *" "check system health"这表示每 2 分钟执行一次健康检查。用CronList查看,用CronDelete <task_id>删除。
4.3 验证成功的结果长什么样
一次完整的闭环验证应该看到这些:
| 步骤 | 命令 | 预期结果 |
|---|---|---|
| 启动 channel | claude --channels plugin:fakechat@... | 会话启动,channel 注册成功 |
| 推送事件 | 浏览器输入消息 | 会话出现<channel source="fakechat">标签 |
| 处理事件 | /process "..." | Claude 响应并执行对应动作 |
| 创建定时任务 | /loop 5m ... | 返回任务 ID 和下次触发时间 |
| 查看任务 | CronList | 列出所有活跃任务 |
| 删除任务 | CronDelete <id> | 任务从列表消失 |
全部通过,说明你的 TaoToken 通道、Channels 插件、计划任务调度器都工作正常。
5. 本篇常见错排查
5.1 channel 启动后收不到消息
最常见的原因是 allowlist 没配对。Telegram 的pairing_required = true时,你需要先执行/telegram:access pair <pairing_code>完成配对,再执行/telegram:access policy allowlist设置策略。少了任何一步,消息都会被静默丢弃。
另一个原因是--channels参数没加。即使.mcp.json里配了 server,也不代表它能推送消息。必须当前会话显式用claude --channels plugin:xxx@marketplace启动。
5.2 计划任务不触发
先检查CLAUDE_CODE_DISABLE_CRON是不是被设成了1。这个环境变量一旦为1,整个调度器直接关闭,所有/loop和 CronCreate 都不工作。
其次检查会话是否还活着。本地计划任务是 session-scoped 的,会话结束任务就没了。如果你关了终端,任务自然不触发。需要 always-on 的话,用 tmux 或 screen 保持会话,或者考虑 Cloud scheduled tasks。
还有一个容易忽略的点:recurring task 7 天后自动过期。官方默认策略是循环任务 7 天后自动过期,最后再触发一次然后删除。这是为了防止遗忘的轮询长期跑下去。
5.3 模型调用报 401 或 403
大概率是 API Key 或 Base URL 配错了。检查settings.json里的ANTHROPIC_BASE_URL是不是https://taotoken.net/api,注意不要带 UTM 参数。ANTHROPIC_API_KEY是不是从控制台复制完整了,有没有多余空格。
如果 Key 没问题但还是报错,去控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite 看一下额度是否用完,或者 Key 是否被禁用。
5.4 多个 channel 同时启动冲突
--channels参数支持空格分隔多个插件:
claude --channels plugin:telegram@claude-plugins-official plugin:discord@claude-plugins-official但要注意端口冲突。fakechat 默认占 8787,如果同时跑多个本地 channel,需要改 config.toml 里的 port。
5.5 自定义 channel 插件加载失败
开发自定义 channel 插件时,需要加--dangerously-load-development-channels参数绕过 marketplace 验证:
claude --channels plugin:my-channel --dangerously-load-development-channels这个参数仅用于本地开发调试,不要在生产环境用。
6. 下一步:把通道用起来
配置跑通之后,建议按这个顺序推进。先接一个真实的事件源,比如把 CI 的 webhook 指向你的 channel,让构建失败时自动推消息进会话。然后在会话里配一个/loop做定期巡检,比如每 30 分钟扫一次日志错误。最后把常用的排障命令固化到.claude/loop.md里,让默认循环行为符合你的工作流。
如果你需要长期跑编码任务或者 Agent 工作流,建议了解一下 Coding Plan,它比按次调用更适合高频场景。模型对话入口可以用来快速验证通道是否正常,接入文档里有更详细的参数说明。API Keys 管理页面可以创建多个 Key 做权限隔离,比如给 CI 用一个、给本地开发用一个。
整套东西的核心就一句话:有事件就用 Channels,没有事件源才考虑/loop或/schedule。别用轮询去解决推送问题,那是更慢、更贵、更臃肿的方案。