
1. 巡检机器人账单失控的现场不是模型笨是调用账本缺位巡检机器人每隔 5 分钟醒来一次日志里重复出现429、timeout和context_length_exceeded。你以为是模型不稳定其实是没有成本账本。TaoToken 官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentagent-cost-audit 先在该页面拿到 Key并把 Base URL 统一为 https://taotoken.net/api。外部讨论里Grok Bot 创始人会议那批 Agent 实操建议被反复转述。作为 Agent 成本负责人我不关心金句只关心三件事第一能用 API 拿数据的场景不要让 Agent 去模拟点击屏幕第二用终稿和草稿的差分对比把人工纠正固化为长期技能第三群聊里多个 Agent 默认静默只有被点名才发言登录 Cookie 按最小权限下发。这三件事背后是同一个问题自动化系统崩掉往往不是模型智商不够而是缺少成本审计和权限隔离制度。很多团队做 Agent 监控时第一反应是看模型返回质量第二反应是看接口成功率。但真正让账单失控的往往是那些“看起来很勤快”的巡检机器人它们每几分钟轮询一次重复提交相同上下文遇到限流就重试失败后还继续点屏幕。你感觉它很忙实际上它在空转。你感觉成本不高实际上每个 Agent 都在悄悄消耗 Token。这篇文章不写概念直接给一套可复现的 Agent 成本审计方案用 TaoToken 收口 Key 和 Base URL让巡检机器人记账生成一张能标注“哪个 Agent 消耗 Token”的成本审计表并清理空转任务。如果你是 Agent 成本负责人或者正在维护一堆群聊机器人、巡检机器人、Coding Agent这套方法可以照着落地。2. 让巡检机器人调用 API 前先在 TaoToken 收口 Key 与 Base URL在让巡检机器人调用 API 之前先把供应商入口统一。打开 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentkey-baseurl 进入控制台创建 API Key。不要在各个 Agent 的脚本里硬编码 Key也不要把 Key 写进 git。统一用环境变量export TAOTOKEN_API_KEYYOUR_API_KEY export TAOTOKEN_BASE_URLhttps://taotoken.net/api确认连通性时用最小请求验证。Base URL 不加 UTM必须是https://taotoken.net/api可以用下面命令检查返回是否正常curl -sS ${TAOTOKEN_BASE_URL}/models \ -H Authorization: Bearer ${TAOTOKEN_API_KEY} \ | head -c 500如果出现401先查 Key 是否复制完整是否有多余空格。如果出现404先查 Base URL 是否写成了别的路径。很多 Agent 成本审计做不下去不是因为没有日志而是因为每个 Agent 用的入口不同有的走旧地址有的走测试 Key有的在本地缓存里写死了另一套配置。最后账单和日志对不上谁都不知道 Token 是谁花的。统一入口之后还要建立一条最小记账规则所有 Agent 调用大模型必须经过统一的 Base URLhttps://taotoken.net/api。每次调用必须生成一个trace_id可以用 UUID。入库时必须记录agent_name、task_type、model_name。如果接口返回usage必须记录输入 Token、输出 Token、总 Token。心跳调用、健康检查调用必须标记is_heartbeat1不要和业务任务混在一起。定时巡检机器人只读本地账本不直接连接生产库。空转任务要能标记并且能按 Agent 维度汇总。人工纠正过的任务要记录corrected_by_human和终稿/草稿哈希。这套规则听起来简单但执行后你会第一次看清原来最贵的不是那个“聪明”的分析 Agent而是那个每隔两分钟重复发送相同 prompt 的巡检 Agent。3. Claude Code 的 settings.jsonANTHROPIC_* 只留给 Claude Code如果巡检机器人里嵌了 Claude Code配置要放在settings.json中。全局配置通常放在~/.claude/settings.json项目级配置可以放在项目目录的.claude/settings.json。示例{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: YOUR_CLAUDE_MODEL, ANTHROPIC_SMALL_FAST_MODEL: YOUR_SMALL_FAST_MODEL } }这里要特别注意几点ANTHROPIC_BASE_URL填https://taotoken.net/api不要加 UTM 参数。ANTHROPIC_AUTH_TOKEN用YOUR_API_KEY占位实际值从环境变量或安全配置读取。ANTHROPIC_MODEL和ANTHROPIC_SMALL_FAST_MODEL以 TaoToken 控制台可用模型名为准。这套ANTHROPIC_*只用于 Claude Code不要把它复制到 Codex 配置里。巡检机器人可以调用 Claude Code 的非交互模式例如claude -p 只输出 JSON当前待处理任务数量、失败任务数量、最近一次成功时间 \ --output-format json /tmp/agent_claude_check.json然后把/tmp/agent_claude_check.json和调用时间写入本地账本。这样做的好处是Claude Code 不再是一个黑盒。你能知道它每次巡检消耗了多少 Token也能知道它有没有重复执行同一个检查。如果 Claude Code 返回model not found优先检查模型名是否在当前 Key 的权限范围内。如果返回connection error检查ANTHROPIC_BASE_URL是否写错。如果返回401检查ANTHROPIC_AUTH_TOKEN是否还是占位符YOUR_API_KEY。不要把 Claude Code 的配置复制给 Codex也不要在 Codex 里使用ANTHROPIC_*变量。协议不同配置项不同混用只会增加排障成本。4. Codex 只认 config.toml不要把 ANTHROPIC_* 塞进来Codex CLI 的配置通常放在~/.codex/config.toml。如果巡检机器人里也调用了 Codex应按下面方式配置model YOUR_CODEX_MODEL model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api chat环境变量单独设置export TAOTOKEN_API_KEYYOUR_API_KEY这里不要再写ANTHROPIC_BASE_URL也不要写ANTHROPIC_AUTH_TOKEN。Codex 和 Claude Code 的配置边界要清晰Claude Code 用settings.json和ANTHROPIC_*Codex 用config.toml和TAOTOKEN_API_KEY。混用的典型症状是Claude Code 能通Codex 报404或者 Codex 能通Claude Code 报401。最后你会误以为是 Key 问题其实是协议和配置项不匹配。如果你用 CC Switch 管理多个 Coding Agent建议只维护三件套Base URLhttps://taotoken.net/apiAPI KeyYOUR_API_KEY默认模型以 TaoToken 控制台可用列表为准CC Switch 的作用是切换供应商配置不是替代 Agent 自身逻辑。每次切换后让巡检机器人发一条最小请求验证并记录agent_name、provider_name、model_name。官网入口可以放在这里https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentcc-switch 。切换完成后不要忘记把旧供应商配置从环境变量和历史脚本里清理掉否则账本里会出现两套来源成本审计表会变得不可信。5. 巡检机器人记账规则每条调用都要能回答“哪个 Agent 花了 Token”接下来是核心部分记账规则和成本审计表。建议用本地 SQLite 先跑通不必一开始就上复杂数仓。SQL 和命令由读者在本地执行不要让 Agent 直连生产库。先建表CREATE TABLE IF NOT EXISTS agent_token_ledger ( id INTEGER PRIMARY KEY AUTOINCREMENT, trace_id TEXT NOT NULL, agent_name TEXT NOT NULL, task_type TEXT NOT NULL, model_name TEXT NOT NULL, input_tokens INTEGER DEFAULT 0, output_tokens INTEGER DEFAULT 0, cache_read_tokens INTEGER DEFAULT 0, cache_write_tokens INTEGER DEFAULT 0, total_tokens INTEGER DEFAULT 0, cost_estimate REAL DEFAULT 0, prompt_hash TEXT, draft_hash TEXT, final_hash TEXT, corrected_by_human INTEGER DEFAULT 0, is_heartbeat INTEGER DEFAULT 0, is_empty_run INTEGER DEFAULT 0, created_at TEXT DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX IF NOT EXISTS idx_ledger_agent_time ON agent_token_ledger(agent_name, created_at); CREATE INDEX IF NOT EXISTS idx_ledger_prompt ON agent_token_ledger(prompt_hash);每次 Agent 调用后写一条记录。Python 示例import hashlib import os import sqlite3 import uuid from openai import OpenAI client OpenAI( base_urlhttps://taotoken.net/api, api_keyos.environ[TAOTOKEN_API_KEY], ) def sha256(text: str) - str: normalized .join(text.strip().split()) return hashlib.sha256(normalized.encode(utf-8)).hexdigest() def call_agent(agent_name: str, task_type: str, model_name: str, prompt: str): response client.chat.completions.create( modelmodel_name, messages[{role: user, content: prompt}], ) usage response.usage conn sqlite3.connect(agent_ledger.db) conn.execute( INSERT INTO agent_token_ledger (trace_id, agent_name, task_type, model_name, input_tokens, output_tokens, total_tokens, prompt_hash) VALUES (?, ?, ?, ?, ?, ?, ?, ?) , ( str(uuid.uuid4()), agent_name, task_type, model_name, usage.prompt_tokens, usage.completion_tokens, usage.total_tokens, sha256(prompt), ), ) conn.commit() conn.close() return response巡检机器人清理空转任务时只读本地账本import sqlite3 from datetime import datetime, timedelta conn sqlite3.connect(agent_ledger.db) since (datetime.utcnow() - timedelta(minutes15)).isoformat() rows conn.execute( SELECT agent_name, prompt_hash, COUNT(*) AS repeat_count FROM agent_token_ledger WHERE created_at ? AND is_heartbeat 0 AND is_empty_run 0 GROUP BY agent_name, prompt_hash HAVING repeat_count 3 , (since,), ).fetchall() for agent_name, prompt_hash, repeat_count in rows: conn.execute( UPDATE agent_token_ledger SET is_empty_run 1 WHERE agent_name ? AND prompt_hash ? AND created_at ? , (agent_name, prompt_hash, since), ) conn.commit() conn.close()这段逻辑的意思是如果同一个 Agent 在 15 分钟内重复提交相同 prompt 达到 3 次并且不是心跳调用就标记为空转。实际阈值可以按你的业务调整。关键是先跑起来再优化阈值。然后生成成本审计表SELECT agent_name, SUM(total_tokens) AS total_tokens, ROUND(SUM(cost_estimate), 4) AS cost_estimate, SUM(is_empty_run) AS empty_runs, SUM(corrected_by_human) AS corrected_tasks FROM agent_token_ledger WHERE created_at datetime(now, -1 day) GROUP BY agent_name ORDER BY total_tokens DESC;这张表能直接回答“哪个 Agent 消耗 Token”。如果再加一列empty_run_rate就能看出谁在空转SELECT agent_name, SUM(total_tokens) AS total_tokens, SUM(is_empty_run) AS empty_runs, ROUND( 1.0 * SUM(is_empty_run) / COUNT(*), 4 ) AS empty_run_rate FROM agent_token_ledger WHERE created_at datetime(now, -1 day) GROUP BY agent_name ORDER BY empty_run_rate DESC, total_tokens DESC;成本负责人每天先看总 Token再看空转率再看修正率。三者结合基本就能定位问题。6. 成本审计表怎么读按 Agent、任务、空转率、修正率下钻一张可用的成本审计表不应只有总 Token。建议至少包含这些字段字段含义agent_name哪个 Agent 消耗了 Tokentask_type任务类型如巡检、分析、群聊回复、代码修复model_name实际调用的模型total_tokens输入、输出、缓存合计cost_estimate估算成本可按模型单价换算empty_runs空转次数corrected_tasks人工纠正次数draft_final_diff草稿与终稿是否有差异base_url是否统一走https://taotoken.net/api按任务类型下钻SELECT task_type, SUM(total_tokens) AS total_tokens, SUM(is_empty_run) AS empty_runs, ROUND(AVG(is_empty_run), 4) AS empty_run_rate FROM agent_token_ledger GROUP BY task_type ORDER BY total_tokens DESC;如果某个task_type的 Token 很高但空转率也高说明它在做重复劳动。优先清理。如果某个task_type的修正率很高说明人工经常需要纠正它应该把纠正逻辑固化为长期技能。差分对比可以这样记录SELECT agent_name, SUM(CASE WHEN draft_hash final_hash THEN 1 ELSE 0 END) AS revised_tasks, COUNT(*) AS total_tasks, ROUND( 1.0 * SUM(CASE WHEN draft_hash final_hash THEN 1 ELSE 0 END) / COUNT(*), 4 ) AS revision_rate FROM agent_token_ledger WHERE final_hash IS NOT NULL GROUP BY agent_name ORDER BY revision_rate DESC;这一步对应前面提到的第二个动作用终稿和草稿做差分。每次人工改完 Agent 输出后把草稿哈希和终稿哈希都记下来。长期看如果某个 Agent 的修正率一直很高说明它的提示词、工具权限或任务边界有问题。把它修好比单纯换模型更有价值。成本审计表的结论通常有三类高 Token、高空转优先清理或降频。高 Token、低空转、高修正优化提示词和技能沉淀。低 Token、低空转、高修正可能是模型能力不足或任务拆分不合理。低 Token、低空转、低修正保留并作为其他 Agent 的参考配置。不要只看总账单。按 Agent 拆开按任务拆开按空转和修正拆开才能知道钱花在哪里。7. 群聊多 Agent 的静默策略与最小权限 Cookie群聊里多个 Agent 最容易烧钱。它们会围观每条消息甚至互相回复。你以为是协作实际上是无限对话循环。建议在配置层强制静默策略agents: - name: inspector-bot listen: mention_only channels: - ops-alerts quiet_hours: - 00:00-07:00 permissions: cookie_scope: read:health can_write: false can_click: false can_call_api: - health.check - ledger.query这里的重点是listen: mention_only默认静默只有被点名才响应。quiet_hours非工作时段不主动巡检除非有告警。cookie_scopeCookie 按最小权限下发只给读取健康状态的范围。can_write: false不允许写操作。can_click: false能走 API 就不要模拟点击屏幕。can_call_api只允许调用白名单内的接口。如果你在 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentminimal-permission 创建了多个 Key也建议按 Agent 或环境拆分权限。不要所有 Agent 共用一个万能 Key。否则一旦某个 Agent 空转或被误触发你很难在账单里定位来源。另外群聊机器人不要把登录 Cookie 交给 Agent 自由使用。最小权限的原则是巡检机器人只读健康状态分析 Agent 只读脱敏数据执行 Agent 如果需要写操作必须经过人工审批或单独通道。成本审计和权限隔离必须一起做否则你只能看到账单涨看不到原因。8. 排障路径429、重复调用、账本不平怎么查Agent 成本审计落地后常见问题会集中出现。下面是一份排障清单。第一429频繁出现。不要直接加钱也不要无脑重试。先看是不是巡检机器人并发太高。给重试加指数退避for i in 1 2 3 4 5; do curl -sS ${TAOTOKEN_BASE_URL}/models \ -H Authorization: Bearer ${TAOTOKEN_API_KEY} break sleep $((2 ** i)) done第二重复调用。检查prompt_hash是否在短时间内高频出现。如果是给任务加幂等键或者把巡检频率从 1 分钟改成 5 分钟。第三账本不平。检查所有 Agent 的 Base URL 是否统一为https://taotoken.net/api。可以在本地代码库里搜索grep -R base_url\|BASE_URL\|ANTHROPIC_BASE_URL . \ --exclude-dir.git \ --exclude-dirnode_modules如果发现旧地址先改配置再重启 Agent。不要一边改一边跑否则账本会出现断档。第四401。检查 Key 是否有效是否还是YOUR_API_KEY占位符。如果 Key 按 Agent 拆分检查当前 Agent 用的是否是对应 Key。第五404。检查模型名和 Base URL。Claude Code 和 Codex 的配置不要混用。Claude Code 看ANTHROPIC_*Codex 看config.toml。第六空转率高。检查is_empty_run的标记逻辑。如果同一 Agent 在短时间内重复相同 prompt优先降频或加缓存。对于只读巡检可以先用本地缓存拦截重复请求。第七成本高但 Token 不高。检查是否有额外调用没进账本或者是否有些 Agent 走了未统一入口。成本审计最怕漏记漏记会让所有分析失真。第八修正率高。检查草稿和终稿差异把人工纠正规则写回提示词、工具白名单或技能库。不要让同一个人工纠正重复发生。9. 下一步模型对话 → Coding Plan → 创建 Key → Claude Code 文档如果你准备把这套成本审计方案落到自己的巡检机器人上建议按下面路径操作先进入模型对话验证你的模型和 Key 是否能正常调用https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentagent-cost-audit-chat如果要把 Coding Agent 纳入统一管理查看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentagent-cost-audit-plan然后创建 API Key把YOUR_API_KEY替换成真实值并统一 Base URLhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentagent-cost-audit-keys如果你使用 Claude Code按文档配置settings.json和ANTHROPIC_*https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentagent-cost-audit-claude最后再强调一次Base URL 填https://taotoken.net/api不要加 UTM。Key 用YOUR_API_KEY占位实际值放在环境变量或安全配置里。巡检机器人先记账再清理空转先统一入口再谈成本优化。成本审计不是财务的事后报表而是 Agent 系统能不能长期稳定运行的基础设施。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。