1. Agent 上线之后,为什么“能跑”不等于“好管”
Agent 可观测性与成本优化,说白了就是给你的智能体装一套“行车记录仪 + 油耗表”。它能做什么?把一次用户提问背后的每一次模型调用、每一次工具执行、每一段 Token 消耗都记录下来,让你在费用翻倍、延迟飙升、回答出错时能快速定位。适合谁?已经跑通单 Agent 或 多 Agent 流程、准备上生产或已经上线的团队,尤其是那些“评估集全绿、线上却天天被投诉”的项目。
我见过太多团队卡在同一个坎上:Demo 阶段 Agent 回答得挺聪明,一上量就出问题。运维群里最常见的三句话是“这次请求为什么 25 秒”“这个月 Token 费用怎么翻倍了”“用户说答错了,怎么复现”。这三个问题分别对应链路追踪、成本归因、会话回放,本质都是可观测性缺失。
传统 APM 工具在这里会失灵。一个 HTTP 请求经过 N 个微服务,链路是确定的;但 Agent 的执行路径不确定——同一个问题可能调 2 个工具,也可能调 5 个,ReAct 循环次数每次都不一样。更麻烦的是中间状态是自然语言文本(Thought),不是结构化返回值,传统追踪根本抓不住“Agent 为什么做了这个决策”。成本模型也完全不同:传统服务看 CPU 和内存,Agent 看 Token,一次 Tool Calling 循环可能烧 2000 Token,也可能烧 8000 Token。
所以这篇不聊虚的,直接给可复制的配置片段、埋点字段、看板指标,最后做一次端到端对账演示。统一入口我用 TaoToken 的 Key 来串,因为多 Agent 场景下如果每个 Agent 各配一套 Key,成本归因会变成一团乱麻。官网在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api ,后面配置里会反复用到。
先明确五大支柱,后面每一节都围绕它们展开:链路追踪记录 ReAct 每一步;指标监控看 Token、延迟、工具频率、错误率;结构化日志存 Thought 和输入输出;会话回放重现完整对话;告警体系在成本超标、延迟异常时实时通知。这五件事做扎实,“能跑”的 Agent 才谈得上“好管”。
2. TaoToken 统一 Key 接入:多 Agent 成本归因的前置动作
多 Agent 生产化最先崩的往往不是技术,是账。三个 Agent 各用各的 Key,月底账单来了根本分不清哪个 Agent 烧的钱。TaoToken 统一 Key 的价值就在这里:所有 Agent 走同一个 API 通道,配合请求头里的业务标签,成本归因从“猜”变成“查”。
接入本身不复杂,关键是配置要一次到位。下面这份settings.json是 Claude Code 场景的写法,路径和字段名保持原样,你可以直接对照改:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "sk-你的TaoToken密钥", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" } }三件套必须写全:Base URL 指向https://taotoken.net/api,Key 用你在控制台生成的令牌,Model ID 按实际使用的模型填。少任何一个,请求都会在鉴权或路由阶段挂掉。如果你用的是 Cline 或 Codex 这类工具,配置思路一致,只是字段名不同。Codex 的auth.json长这样:
{ "OPENAI_API_KEY": "sk-你的TaoToken密钥", "OPENAI_BASE_URL": "https://taotoken.net/api", "model": "gpt-4o" }Cline 的 MCP 配置则写在cline_mcp_settings.json里,把 provider 的 baseURL 指向同一个地址即可。这里有个我踩过的坑:很多人只改了 baseURL 忘了改 model 字段,结果请求发出去返回model not found,排查半天以为是 Key 问题。
Key 生成入口在 https://taotoken.net/api-keys ,建议按 Agent 维度建多个 Key,而不是所有 Agent 共用一个。为什么?因为 Key 本身就是最粗粒度的归因维度。Agent A 用 Key-A,Agent B 用 Key-B,账单天然分开。再细一层,可以在请求头里加自定义标签:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的TaoToken密钥" \ -H "Content-Type: application/json" \ -H "X-Agent-Id: energy-agent" \ -H "X-Session-Id: sess-20260827-001" \ -d '{ "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "分析C栋近一周能耗"}] }'X-Agent-Id和X-Session-Id这两个头是你自己的埋点字段,TaoToken 通道会透传,你在日志侧接住就能做归因。这一步做完,后面所有追踪数据才有统一的“身份证”。控制台在 https://taotoken.net/console ,可以看 Key 维度的用量概览,作为对账的第一层校验。
3. 可复制配置:追踪埋点、成本看板与告警规则
这一节是全文最硬的部分,直接给能跑的配置。先说追踪埋点的数据模型,Agent 的追踪结构是一棵树而不是线性链路:
Trace: user-query-12345 ├── Span: llm-call-1 (意图理解) │ ├── Input: "分析C栋近一周能耗,异常就通知张工" │ ├── Output: Thought + Tool Call │ ├── Tokens: prompt=450, completion=120 │ └── Duration: 1.2s ├── Span: tool-call-1 (query_energy_trend) │ ├── Input: {areaName: "C栋", days: 7} │ ├── Output: "平均8734kWh,超出均值84%" │ └── Duration: 0.3s ├── Span: llm-call-2 (推理:判断是否异常) │ ├── Tokens: prompt=680, completion=95 │ └── Duration: 0.8s └── Span: llm-call-3 (最终回答生成) ├── Tokens: prompt=820, completion=85 └── Duration: 0.9s埋点字段至少要有这些:traceId、spanId、callIndex、modelName、promptTokens、completionTokens、durationMs、status、toolName、toolArgs、toolResult。少一个,后面看板就缺一块。
追踪拦截器的核心逻辑是异步写入,追踪开销控制在 5% 以内,别阻塞主流程。采样率生产环境建议 10% 完整追踪 + 100% 错误请求追踪,这样既省存储又不漏异常。下面这段是拦截器的关键实现:
public Response<AiMessage> traceLlmCall( String traceId, int callIndex, ChatLanguageModel model, List<ChatMessage> messages) { if (!shouldTrace()) { return model.generate(messages); } String spanId = UUID.randomUUID().toString().substring(0, 8); long startTime = System.nanoTime(); LlmCallSpan span = LlmCallSpan.builder() .traceId(traceId).spanId(spanId) .callIndex(callIndex).inputMessages(messages) .startTime(Instant.now()).build(); try { Response<AiMessage> response = model.generate(messages); span.setOutputMessage(response.content()); span.setDurationMs((System.nanoTime() - startTime) / 1_000_000); span.setPromptTokens(response.tokenUsage().inputTokenCount()); span.setCompletionTokens(response.tokenUsage().outputTokenCount()); span.setStatus("success"); return response; } catch (Exception e) { span.setStatus("error"); span.setErrorMessage(e.getMessage()); throw e; } finally { traceRepo.saveAsync(span); } }成本看板的数据来自多维度聚合。按用户聚合识别高成本用户,按工具聚合识别“Token 黑洞”——通常是某个工具返回了过长数据,导致后续 LLM 推理 Prompt 暴涨。告警规则用 YAML 配置最省事:
alerts: - name: "单次查询成本过高" metric: cost.per_query.avg threshold: 0.05 window: 60 level: WARNING cooldown: 30 - name: "小时成本突增" metric: cost.hourly.total threshold: 5.0 window: 60 level: CRITICAL cooldown: 60 - name: "P95 延迟超标" metric: latency.p95 threshold: 15000 window: 15 level: WARNING cooldown: 15 - name: "工具调用失败率升高" metric: tool.failure_rate threshold: 0.10 window: 30 level: CRITICAL cooldown: 30告警去重很关键,同一规则在冷却期内不重复发送,否则半夜被轰炸。这套配置落地后,你至少能在成本翻倍的当天收到通知,而不是月底看账单才发现。
4. 验证请求与端到端对账:从一次调用到一张账单
配置写完必须验证,不然都是纸上谈兵。第一步用 curl 打一次带标签的请求,确认通道通、标签透传:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的TaoToken密钥" \ -H "Content-Type: application/json" \ -H "X-Agent-Id: energy-agent" \ -d '{ "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "只回复OK"}], "max_tokens": 10 }' | jq '.usage'返回里应该能看到prompt_tokens和completion_tokens两个字段。如果返回 401,先查 Key 是否带sk-前缀、是否复制完整;如果返回model not found,查 Model ID 拼写。这一步通了,说明 Base URL + Key + Model ID 三件套没问题。
第二步做端到端对账。假设你跑了一次完整的能耗分析对话,追踪系统记录如下:
| 步骤 | 类型 | prompt | completion | 耗时 |
|---|---|---|---|---|
| 1 | llm-call | 450 | 120 | 1.2s |
| 2 | tool-call | - | - | 0.3s |
| 3 | llm-call | 680 | 95 | 0.8s |
| 4 | tool-call | - | - | 0.1s |
| 5 | llm-call | 820 | 85 | 0.9s |
| 合计 | - | 1950 | 300 | 3.3s |
按 gpt-4o-mini 的 Input $0.15/1M、Output $0.60/1M 算,这次对话成本约1950×0.15/1e6 + 300×0.60/1e6 ≈ $0.00047。看起来很小,但如果这个 Agent 每天跑 5 万次,就是 $23.5/天,一个月 700 美元。这就是为什么单次成本必须监控——单看一次不痛,乘上量级就痛了。
对账的最后一环是拿追踪系统汇总的数字,去 TaoToken 控制台 https://taotoken.net/console 核对 Key 维度的用量。两边数字对得上,说明埋点没漏;对不上,通常是采样率导致追踪侧偏少,或者有请求绕过了你的拦截器。我建议每周做一次这样的对账,养成习惯后成本异常基本当天就能发现。
验证模型本身是否正常,可以直接在 https://taotoken.net/models 里对话测试,确认模型可用再接入生产链路,避免把模型侧问题误判成自己的代码问题。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
排障这节按真实报错来,每个都给你定位路径。
401 Unauthorized:最常见。九成是 Key 问题——没带Bearer前缀、Key 复制时多了空格、或者用了已删除的 Key。先确认请求头格式是Authorization: Bearer sk-xxx,再去 https://taotoken.net/api-keys 重新生成一个测试。如果换了新 Key 还 401,检查是不是环境变量里旧值没刷新,很多工具会缓存 env。
local proxy failed:这个报错通常出现在本地工具(Cline、Claude Code)配置了错误的 baseURL 时。检查你的settings.json或auth.json里ANTHROPIC_BASE_URL/OPENAI_BASE_URL是否写成了https://taotoken.net/api,注意不要多写/v1或少写协议头。有些工具要求 baseURL 不带/v1,有些要求带,按工具文档来。改完重启工具,别指望热加载。
reading choices 相关报错:一般是响应结构解析失败,常见于流式返回被中途截断,或者模型返回了非预期格式。先确认stream参数和你的解析逻辑匹配;如果用了自定义拦截器,检查是不是在流式场景下提前读了choices字段。这类问题在追踪日志里看status=error的 span 最快定位。
OAuth 相关报错:如果你用的是 Claude Code 的 OAuth 登录流程,报错通常和 token 过期或回调地址不匹配有关。检查settings.json里是否同时配了 OAuth 和 API Key,两者冲突时会优先走 OAuth 导致鉴权失败。生产环境建议统一用 API Key 方式,少一层变量。
排查通用套路:先看 HTTP 状态码,再看响应体里的error.message,最后对照追踪日志里对应 span 的status和errorMessage。三层下来,九成问题能定位。如果追踪日志里根本没有这条请求,说明请求没走到你的拦截器,检查工具是否绕过了你配置的通道。
6. 把 Agent 变成可运营系统:从追踪到成本优化的闭环
可观测性搭好之后,成本优化才有抓手。三个最见效的方向:工具返回值压缩、模型路由、Prompt 缓存。
工具返回值压缩是性价比最高的。一个查询能耗趋势的工具如果返回 30 天逐日原始数据,约 800 Token;压缩成“周期 + 均值 + 峰值 + 趋势 + 异常日”的摘要,约 120 Token,直接省 85%。关键是模型根本不需要那么多细节,它要的是结论。
模型路由按任务复杂度选模型。意图分类、摘要、提取这类简单任务用 gpt-4o-mini,单步工具调用用中模型,多步推理和复合分析才上大模型。实测总成本能降 40%~60%,质量损失很小。判断复杂度可以用规则引擎,不必再调一次 LLM:用户消息超过 200 字、包含“如果/若/当”这类条件词、动作数大于 1,就判为复合任务。
Prompt 缓存的核心是“不变内容在前,变化内容在后”。System Prompt 里的角色定义和工具描述放最前,用户画像次之,RAG 结果和对话历史放后面。这样前缀命中缓存,缓存部分 Token 只收一半价格。结构对了,同一会话内重复的长 System Prompt 成本直接砍半。
最后是看板。一个够用的运营看板至少要有:今日对话数、今日成本、P95 延迟、错误率四个数字卡;7 天成本趋势图;工具调用 Top 5;成本分布(LLM / RAG / 记忆检索);最近告警列表。这些指标全部来自前面埋的点,不用额外开发。
长期跑编码类 Agent 或需要多 Agent 协作的团队,可以考虑 Coding Plan,把额度管理和成本预算绑在一起,比按量计费更好控。入口在 https://taotoken.net/coding-plan 。接入文档在 https://taotoken.net/doc ,配置细节和字段说明都在里面,遇到不确定的参数先查文档再改配置,能省不少试错时间。
整套跑下来,你的 Agent 就从“能跑”变成了“好管”:每次请求有迹可循,每笔花费有账可查,每个异常有警可告。这才是生产化该有的样子。