1. 从 pnpm 构建脚本报错到模型 Top10:DSH 规模化的第一道坎
如果你在 DSH 里撞到pnpm v9+ 默认禁止依赖包运行 install 脚本,或者发现会话轨迹只能看本机当前会话,先把模型供应商切到 TaoToken:TaoToken 官网。在官网拿到 API Key 后,把 Base URL 统一写成https://taotoken.net/api。这一步看起来只是换地址,实际决定了后面能不能把 DSH 的模型调用、腾讯云 Agent 可观测的 Span、以及不同 Agent 的 Token 账本串到同一条线上。
DSH 是 DeepSeek 开源的编码 Agent 框架,命令行名dsh。它采用 Cordis 微内核加插件化组织能力,模型适配器、工具集、沙箱策略、会话持久化都能按 profile 装配。一次用户任务是一个 turn,turn 内每一轮推理、工具调用、观察结果是一个 step。执行结构由模型在运行时决定,因此你很难在跑之前知道它会调用几次模型、哪些工具、消耗多少 Token。DSH 自带会话轨迹、Session 事件流落盘和工具调用检索,这些能力对单人、单机、单会话调试很友好;但当你有一批机器、多个 profile、多个 Agent 同时跑,问题就变成:模型调用 Top10 是谁?哪个 Agent 在消耗?Token 是输入长还是输出长?失败重试有没有重复计费?这些答案不能只靠翻本机 JSONL,需要跨会话、跨机器、长期留存的结构化调用链。
本文围绕一个具体目标展开:在 DSH 里接入 TaoToken 作为模型入口,再通过tencentcloud-agentobs-sdk-dsh上报运行时事件,最终在腾讯云 Agent 可观测里产出模型 DSH 调用 Top10 视图,并用 Agent 维度筛选解释 Token 消耗来源。你会看到可复制的环境变量、cordis.patch.yml配置、pnpm v9+ 构建脚本报错处理,以及 Claude Code、Codex、CC Switch 的同一套 Key 复用方式。
2. TaoToken 接入 DSH:Base URL、Key 与模型适配器配置
TaoToken 的角色是统一模型入口和 Key 管理。先去 TaoToken 官网 完成注册,然后创建 API Key。Key 占位符在本文里统一写成YOUR_API_KEY,不要提交到代码仓库,也不要把真实 Key 写进 profile 文件后推送到 Git。
DSH 的模型适配器是插件,不同版本、不同 profile 读取的配置键名可能不同。下面给两种方式:优先用环境变量注入,再用cordis.patch.yml做显式覆盖。如果你的适配器支持 OpenAI 兼容协议,先设置:
# 统一模型入口 export TAOTOKEN_API_KEY="YOUR_API_KEY" export OPENAI_API_KEY="${TAOTOKEN_API_KEY}" export OPENAI_BASE_URL="https://taotoken.net/api" # 默认模型按你的 DSH 适配器实际支持的名称填写 export DSH_DEFAULT_MODEL="deepseek-chat"如果 DSH 的模型适配器插件自己声明了baseURL、apiKey、model等字段,则把cordis.patch.yml里的对应段落指向 TaoToken。下面是一个结构示意,键名以你当前 profile 已安装的适配器为准:
# $DSH_HOME/profiles/default/cordis.patch.yml # 可观测插件 + 模型适配器落点示意 plugins: tencentcloud-agentobs-sdk-dsh: topicId: ${CLS_TOPIC_ID} secretId: ${TENCENTCLOUD_SECRET_ID} secretKey: ${TENCENTCLOUD_SECRET_KEY} region: ap-guangzhou captureContent: false modelProvider: baseURL: https://taotoken.net/api apiKey: ${TAOTOKEN_API_KEY} defaultModel: deepseek-chat显式插件配置通常优先于环境变量。因此建议把敏感信息留在环境变量或密钥管理工具里,配置文件只写变量引用。这样同一台机器上的多个 DSH profile 可以共享配置结构,只替换 Key 和模型名。
2.1 多 Agent 多 Key:让“谁在消耗”有归因基础
如果你的团队同时跑代码生成、代码审查、测试补全、文档同步、夜间批处理,建议不要所有 Agent 共用一个 Key。去 TaoToken API Keys 页面按角色创建多个 Key,命名带业务含义:
| Agent 角色 | DSH profile | TaoToken Key 别名 | 主要任务 |
|---|---|---|---|
| 代码生成 | codegen | taotoken-dsh-codegen | 补丁生成、函数补全 |
| 代码审查 | review | taotoken-dsh-review | diff 审查、风险提示 |
| 测试补全 | test | taotoken-dsh-test | 单测生成、边界用例 |
| 文档同步 | doc | taotoken-dsh-doc | README、注释、变更说明 |
| 批处理 | batch | taotoken-dsh-batch | 夜间仓库扫描与汇总 |
然后在每个 profile 的启动脚本里注入不同 Key:
# ~/.dsh/profiles/codegen/env.sh export TAOTOKEN_API_KEY="YOUR_API_KEY" export OPENAI_API_KEY="${TAOTOKEN_API_KEY}" export OPENAI_BASE_URL="https://taotoken.net/api" export AGENT_NAME="codegen" export PROJECT_NAME="my-repo" export ENV="prod"这样在可观测侧可以按应用、资源属性或 Key 别名筛选,在 TaoToken 侧也能按 Key 看调用与消耗。模型 Top10 回答“哪些模型被调用最多”,Agent 维度回答“谁把 Token 花掉了”。
3. 上报链路:安装 tencentcloud-agentobs-sdk-dsh 并解决 pnpm v9+ 构建脚本
要让模型 Top10 和 Agent 维度筛选有数据,必须先把 DSH 运行时事件变成结构化 Span。tencentcloud-agentobs-sdk-dsh是挂在 DSH 插件层的采集插件:它旁路订阅运行时事件,在流式输出外做只读观察,维护状态树,把一次任务还原为带父子关系和时间区间的调用链,再批量上报到腾讯云 Agent 可观测。它不要求你改业务代码,也不需要额外常驻采集进程。
当前版本对 DSH 和 Node.js 有要求,先核对:
node -v # 期望 >=22.19.0 npm i -g deepseek-harness dsh --version # 期望 >=0.1.0-rc.6 <0.2.0安装插件:
cd ~/.dsh/profiles/default pnpm add tencentcloud-agentobs-sdk-dshpnpm v9+ 默认禁止依赖包运行 install 脚本。如果安装时看到构建脚本被忽略,进入对应 profile 目录执行一次批准:
cd ~/.dsh/profiles/default pnpm approve-builds # 交互提示里选中 tencentcloud-agentobs-sdk-dsh如果团队使用 headless 或 harness profile,把路径换成~/.dsh/profiles/headless或~/.dsh/profiles/harness。安装或更新插件后,需要重启 DSH 服务才会生效。
3.1 创建 Agent 可观测应用并拿到 CLS_TOPIC_ID
进入日志服务控制台,左侧导航选择 Agent 可观测,单击应用接入,创建应用时接入方式选择 DeepSeek Harness。进入应用详情,在日志主题列表里找到名称为{应用名称}-trace-topic的日志主题,复制它的 ID。这个 ID 对应配置里的CLS_TOPIC_ID或topicId。
准备访问凭证:
export CLS_TOPIC_ID="你的日志主题ID" export TENCENTCLOUD_SECRET_ID="你的SecretId" export TENCENTCLOUD_SECRET_KEY="你的SecretKey" export TENCENTCLOUD_REGION="ap-guangzhou"建议使用 CAM 子账号或临时密钥,并只授予日志写入所需权限。启动并验证:
dsh service restart dsh run "读取当前目录 package.json 并总结依赖"至少触发一次模型调用后,在 Agent 可观测控制台查看 Traces、Spans、Sessions。如果暂时不想采集提示词、响应和工具参数,保持:
plugins: tencentcloud-agentobs-sdk-dsh: captureContent: false需要卸载时:
cd ~/.dsh/profiles/default pnpm remove tencentcloud-agentobs-sdk-dsh dsh service restart3.2 五层调用树:模型 Top10 的数据地基
插件把一次任务映射为五层 Span:entry、agent、step、chat、tool。一个 turn 对应一条 trace,多轮对话通过gen_ai.session.id横向关联;每次真实模型调用生成独立 chat Span,用dsh.llm.attempt标记序号,因此重试不会被合并;流未收尾、step 提前结束、用户中断等场景也会补发带错误码的 Span。各层属性遵循 OpenTelemetry GenAI 语义约定,便于和既有可观测体系对齐。模型 Top10 的原始数据就来自 chat Span 上的模型名称、输入 Token、输出 Token、耗时、结束原因和重试次数。
4. 模型 DSH 调用 Top10 视图怎么读:调用次数、Token、耗时与错误率
进入腾讯云 Agent 可观测后,总览仪表盘通常能看到请求数、错误数、模型调用次数、Input/Output Tokens、Agent 与模型 Top10、平均 TTFT。性能页有耗时直方图和 P50/P90/P99 分位趋势,以及模型平均耗时 Top10。成本 & Token 页可以继续按会话、模型、工具聚合。你要关注的不只是排名,而是排名背后的口径。
| 指标 | 含义 | 排查用途 |
|---|---|---|
| 调用次数 | 记录到的 chat Span 数量 | 谁调用最频繁 |
| Input Tokens | 输入 Token 总和 | 提示词、历史会话、工具返回是否膨胀 |
| Output Tokens | 输出 Token 总和 | 生成代码、长回答是否过多 |
| 总 Tokens | 输入 + 输出 | 成本排行主指标 |
| 平均 TTFT | 首 Token 延迟 | 交互体验 |
| P95 耗时 | 长尾耗时 | 慢模型、慢工具定位 |
| 错误率 | 失败 Span 比例 | 模型侧失败、工具侧失败 |
| 重试次数 | dsh.llm.attempt序号 | 重复消耗与稳定性 |
模型 Top10 有两种排序方式:按调用次数排序,适合看哪个模型被 Agent 高频使用;按总 Tokens 排序,适合看成本集中在哪里。很多团队第一次接完可观测会发现,调用次数最多的不是成本最高的,某个 Agent 用强模型做长上下文总结,Input Tokens 会远远压过其他任务。
为了避免 Top10 被拆散,模型命名要统一。在 DSH 模型适配器里固定defaultModel,不要一个 profile 写deepseek-chat,另一个写deepseek或带日期的别名。否则控制台会把它当成多个模型,排行失真。需要区分版本时,用单独的属性字段,不要混在模型名里。
下钻路径可以按这个顺序:
- 总览页看模型 Top10,先按总 Tokens 排序。
- 选中 Top1 模型,跳到成本 & Token。
- 按 Agent 属性过滤,确认是哪个 Agent 贡献。
- 按 Session 排序,找 Token 最高的会话。
- 打开 Trace,展开到 chat Span。
- 对比同一 step 内 tool Span 的返回大小。
- 检查
dsh.llm.attempt是否大于 1。 - 记录优化前后的 P95 与总 Tokens。
5. Agent 维度筛选:TaoToken 下哪些 Agent 在消耗
模型 Top10 只能说明哪个模型被调用得多,不能直接回答“哪个 Agent 在消耗”。Agent 维度筛选需要额外的标识。最稳的做法是把 Agent 身份放进 DSH profile、应用名和资源属性里,同时在 TaoToken 侧用不同 Key 做账单隔离。
推荐标记字段:
| 维度 | 配置方式 | 控制台筛选 |
|---|---|---|
| Agent 角色 | 每个角色独立 DSH profile | 按应用名或资源属性 |
| 项目 | 环境变量PROJECT_NAME | 自定义属性 |
| 环境 | 环境变量ENV=prod/staging | 自定义属性 |
| Key 别名 | TaoToken API Keys 页面 | 账单、审计、按 Key 归因 |
| 会话 | gen_ai.session.id | 会话视图 |
| 调用轮次 | step Span | 下钻推理轮次 |
如果插件当前支持自定义资源属性,把AGENT_NAME、PROJECT_NAME、ENV注入到上报属性中。筛选时先看 Agent Top10,再切到某个 Agent 看模型分布。如果插件版本暂不支持自定义属性,用物理隔离:一个 Agent 一个 Agent 可观测应用,或者一个 Agent 一个日志主题。应用列表里会显示已接入应用、上报中应用、昨日写入量与昨日 Token 总数,横向对比也能定位消耗大户。
假设你有五个 Agent,筛选后的观察可以这样记录:
| Agent | 主要模型 | 调用特征 | 可能问题 |
|---|---|---|---|
| codegen | deepseek-chat | 输出 Token 高 | 生成补丁过长 |
| review | deepseek-chat | 输入 Token 高 | diff 和上下文太大 |
| test | deepseek-chat | 调用次数高 | 单测用例拆得太碎 |
| doc | 轻量模型 | 总 Tokens 中等 | 可接受 |
| batch | 强模型 | 夜间集中 | 重试导致重复消耗 |
在 TaoToken API Keys 页面按别名创建 Key 后,每个 Agent 的调用会落在不同 Key 上。结合可观测里的应用名和属性,你可以同时回答两个问题:可观测链路里哪个 Agent 调用最多,TaoToken 账单里哪个 Key 消耗最多。两边对齐后,成本归属就不再靠猜。
6. Token 消耗来源拆解:输入、输出、工具返回与重试
五层调用树里,chat Span 承载模型调用信息,tool Span 承载工具执行信息。Token 统计主要在 chat Span。要解释消耗来源,需要把输入和输出分开看。
输入 Token 常见来源:
- 系统提示与角色说明;
- 历史会话上下文;
- 文件片段与代码搜索结果;
- 工具返回的命令输出、日志、diff;
- 失败重试时重复发送的上下文。
输出 Token 常见来源:
- 模型推理内容;
- 工具调用参数;
- 代码补丁;
- 总结与说明文字。
最容易导致成本突然上升的是工具返回膨胀。一个读取大文件的工具把完整内容塞回上下文,下一轮模型调用就要重新处理这些输入。修复方式不是简单换模型,而是在 DSH 工具层限制输出长度、只保留 diff、分页读取、对命令输出做截断和摘要。
重试也会造成重复消耗。插件把每次真实模型调用画成独立 chat Span,并用dsh.llm.attempt标记序号。如果某个模型错误率高,重试次数多,Top10 里的总 Tokens 会包含这些重复调用。排查时按错误类型筛选:工具调用失败、LLM 调用失败、Root span 状态码异常、Agent 执行失败。模型侧失败和工具侧失败要分开处理。
一个可执行的排查清单:
- 总览页按总 Tokens 排序模型 Top10。
- 选中 Top1 模型,进入成本 & Token。
- 按 Agent 筛选,找出贡献最大的 Agent。
- 按 Session 排序,定位 Token 最高的会话。
- 打开 Trace,找到 Input Tokens 最大的 chat Span。
- 看它前一个 tool Span 的返回体积。
- 检查是否出现多次
dsh.llm.attempt。 - 优化工具返回、历史会话摘要或模型选择。
- 对比优化前后的总 Tokens、P95 和错误率。
优化动作可以分四类:为不同 Agent 分配不同模型,代码生成用强模型,文档总结用轻量模型;工具返回统一截断,避免把大段日志直接回灌;长会话定期摘要,减少历史上下文;失败重试加退避和上限,避免无效重试放大成本。
7. 同一套 TaoToken Key 复用到 Claude Code、Codex 与 CC Switch
很多团队不是只用 DSH,还会同时用 Claude Code、Codex 等 Coding Agent。TaoToken 的 Base URL 和 Key 可以复用,但变量名和配置文件不要混用。Claude Code 走settings.json和ANTHROPIC_*,Codex 走config.toml,不要把ANTHROPIC_*套到 Codex。
Claude Code 配置文件~/.claude/settings.json:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "claude-sonnet-4-5" } }Codex 配置文件~/.codex/config.toml:
model = "deepseek-chat" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY"CC Switch 场景下先确认三件套:
供应商:TaoToken Base URL:https://taotoken.net/api API Key:YOUR_API_KEY 默认模型:按团队规范选择如果你在 DSH 里已经用环境变量注入TAOTOKEN_API_KEY,Claude Code 和 Codex 可以复用同一个 Key,但建议按工具或项目分 Key,避免账单混在一起。需要 Claude Code 的完整变量格式时,可以查看 Claude Code 文档。
8. 总结:从 Top10 到可执行的降本动作
DSH 原生的会话轨迹、事件流落盘和工具检索解决了本机、单会话、实时调试问题。tencentcloud-agentobs-sdk-dsh把同一批运行时事件还原成五层调用链,补上跨会话聚合、跨机汇聚、长期留存和告警。再配合 TaoToken 作为统一模型入口,按 Agent 分配 Key,模型 DSH 调用 Top10 就不再只是一个排名,而是可以下钻到 Agent、Session、Trace、chat Span 和 tool Span 的成本账本。
落地顺序建议是:先拿 Key,把 Base URL 设为https://taotoken.net/api;再装可观测插件,确认 Trace 能上报;然后按 Agent 拆 Key、拆 profile;最后用模型 Top10 和 Agent 维度筛选定位消耗来源。如果你还没注册,从 TaoToken 官网 开始。
想先验证模型响应,走 模型对话;准备长期跑 Agent,看 Coding Plan;要给多个 Agent 分 Key,进 API Keys;Claude Code 的配置格式,直接对照 Claude Code 文档。