聚合 DSH 模型调用次数,TaoToken 的 Input/Output 怎么分开统计

发布时间:2026/9/18 16:37:35

聚合 DSH 模型调用次数,TaoToken 的 Input/Output 怎么分开统计 1. 从 pnpm 构建脚本报错和 cordis.patch.yml 说起模型出口没切到 TaoTokenToken 数就只是一笔糊涂账如果你在 DSH 里装完可观测插件后pnpm v9提示依赖的 install 脚本被忽略或者cordis.patch.yml里的模型适配器仍指向旧端点那么会话轨迹里看到的 Token 用量往往只能说明“这次任务花了多少”无法回答“哪个模型被调了多少次、Input 和 Output 各占多少”。TaoToken 官网入口先放这里https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentdsh_cost_intro。去那里拿到 Key 后把 DSH 的 Base URL 设为https://taotoken.net/api再通过事件流与可观测插件重建 chat Span才能按模型聚合调用次数把 Input/Output 分列成报表并产出 Token 消耗排行。DeepSeek Harness 本身并不难用难的是规模上来之后的成本归因。单会话、单机器的轨迹视图能看一轮任务用了多少 Token但团队真正要管的是昨天deepseek-chat被调了多少次claude系列被调了多少次输入 Token 和输出 Token 分别是多少哪几个会话消耗最多哪些重试在悄悄放大成本。这些问题的答案不在一个 turn 的总数里而在每一次真实模型调用里。DSH 的执行模型是 ReAct 循环一次用户任务可以理解为一个 turnturn 内部有若干 step每个 step 可能触发模型推理也可能触发工具调用。模型调用和工具调用混在同一条时间线上如果只按 turn 或 step 统计就会出现两个偏差第一把工具执行时间算进模型耗时第二把重试合并成一次调用导致调用次数偏低、单次成本偏高。要解决这个问题先要统一模型出口再让每一次模型调用都带上可识别的模型名、Input/Output Token 和尝试序号。TaoToken 在这里承担的是统一入口角色。DSH、Claude Code、Codex、CC Switch 都可以把 Base URL 指到https://taotoken.net/api模型请求经过同一个聚合层后返回的 usage 字段会包含prompt_tokens、completion_tokens、total_tokens。其中prompt_tokens就是 Inputcompletion_tokens就是 Output。后续所有报表本质上都是把这两个值从响应里拆出来再按模型、会话、时间窗口聚合。2. 把 DSH 的模型出口切到 TaoTokenKey、Base URL 与 profile 配置DSH 采用 Cordis 微内核加插件化装配模型适配器、工具集、沙箱策略、会话持久化都在插件层。不同 profile 可以使用不同模型配置。要做成本统计第一步不是先写报表而是先让 DSH 的模型请求稳定地走 TaoToken。建议用环境变量保存 Key不要把YOUR_API_KEY写进仓库。# 终端环境建议写入 ~/.bashrc 或 ~/.zshrc export DSH_HOME$HOME/.dsh export TAOTOKEN_API_KEYYOUR_API_KEY export OPENAI_API_KEY$TAOTOKEN_API_KEY export OPENAI_BASE_URLhttps://taotoken.net/api然后在 DSH 的 profile 补丁文件里显式指定 OpenAI 兼容适配器。下面是一个示意配置插件名与字段名请按你当前安装的适配器版本调整核心是baseURL、apiKey、model和流式 usage 开关# ~/.dsh/profiles/default/cordis.patch.yml plugins: model-openai-compatible: baseURL: https://taotoken.net/api apiKey: ${TAOTOKEN_API_KEY} model: deepseek-chat stream: true streamOptions: includeUsage: true如果你的 DSH 版本使用别的模型插件名不要硬套上面的插件名。保持三件事正确即可请求地址是https://taotoken.net/api鉴权使用YOUR_API_KEY流式响应开启 usage 返回。非流式请求通常会在响应体里直接带 usage流式请求如果客户端不主动请求 usage最后一个 chunk 可能没有 Token 数报表就会缺行。配置完成后先用一次最小请求验证连通性。可以用 curl 在本地测试不要连生产库也不要在 Agent 里直接执行高风险命令curl https://taotoken.net/api/chat/completions \ -H Authorization: Bearer YOUR_API_KEY \ -H Content-Type: application/json \ -d { model: deepseek-chat, messages: [{role: user, content: 只回复 ok}], stream: false }返回体里如果能看到类似下面的结构就说明 Input/Output 已经可拆{ usage: { prompt_tokens: 12, completion_tokens: 3, total_tokens: 15 } }同一套口径可以延伸到其他编码工具。Claude Code 用settings.json或ANTHROPIC_*环境变量注意不要把它套到 Codex 上{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: YOUR_CLAUDE_MODEL_ID } }Codex 使用config.toml鉴权字段和 Claude Code 不同model_provider taotoken model YOUR_MODEL_ID [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY如果使用 CC Switch 管理多套配置三件套要填清楚不要混用 Anthropic 与 OpenAI 字段供应商名称TaoToken Base URLhttps://taotoken.net/api API KeyYOUR_API_KEY到这里模型出口已经统一。接下来要解决的是DSH 的事件流里哪些记录算一次模型调用哪些字段能拆出 Input/Output。3. DSH 事件流里哪些字段能拆出 Input/Output不要拿 turn 当模型调用DSH 原生会把 Session 事件流以 zstd 压缩的 JSONL 落盘在$DSH_HOME/sessions/下。这个数据很完整但它是按时间排列的事件序列不是天然的成本报表。一个 turn 里可能有多个 step一个 step 里可能有模型调用也可能有工具调用模型调用失败后还可能重试。如果只数 turn就会漏掉重试如果只数 step就会把工具调用也算进去。更稳的做法是把每一次真实模型请求还原成一条llm_spans记录。判断依据不是 turn 编号而是这次事件是否真正向模型发起了请求并且是否拿到了 usage。一次成功调用是一条一次失败后重试重试也是独立一条流式响应如果被用户中断只要服务端返回了 usage 或插件补发了 usage也应该保留下来。这样统计调用次数时COUNT(*)才接近真实请求次数。可观测插件通常会把链路建成五层entry / agent / step / chat / tool。其中 chat 层对应模型调用tool 层对应工具执行。做模型成本报表时只筛 chat 层不筛 tool 层。chat 层里需要关注这些字段{ type: chat, model: deepseek-chat, trace_id: trace-xxx, session_id: session-xxx, attempt: 1, usage: { prompt_tokens: 2310, completion_tokens: 512, total_tokens: 2822 }, finish_reason: stop, status: OK }不同插件版本字段名可能略有差异例如input_tokens/output_tokens或者嵌套在response.usage下。解析时建议做兼容映射prompt_tokens或input_tokens→ Inputcompletion_tokens或output_tokens→ Outputmodel或request.model→ 模型名attempt或dsh.llm.attempt→ 尝试序号status或status_code→ 成功、失败、中断finish_reason→ 结束原因用于区分正常结束、长度截断、工具调用结束。这里有一个容易忽略的点工具调用的参数和返回结果也会进入上下文下一轮模型调用的 Input Token 会因此变大。也就是说Output Token 高通常意味着模型生成内容多Input Token 高往往意味着上下文膨胀。两者分开统计后才能判断成本到底花在“模型说了很多”还是“上下文带了很多”。4. 本地落库把 DSH 的 JSONL 事件流还原成 llm_spans 表如果你暂时不想接完整可观测平台先用本地 SQLite 也能快速产出报表。思路是读取$DSH_HOME/sessions/下的 JSONL 或 zstd JSONL筛出模型调用事件把模型名、Input、Output、状态、会话 ID 写入 SQLite。下面脚本是可直接修改运行的示例字段映射按你的事件结构调整import json import sqlite3 import zstandard as zstd from pathlib import Path DB dsh_tokens.db ROOT Path.home() / .dsh / sessions conn sqlite3.connect(DB) conn.execute( CREATE TABLE IF NOT EXISTS llm_spans ( trace_id TEXT, session_id TEXT, span_id TEXT, model TEXT, input_tokens INTEGER, output_tokens INTEGER, status_code TEXT, start_time TEXT, end_time TEXT, attempt INTEGER, finish_reason TEXT ) ) def iter_lines(path: Path): if path.suffix .zst: with open(path, rb) as f: reader zstd.ZstdDecompressor().stream_reader(f) for line in reader: yield line else: with open(path, r, encodingutf-8) as f: for line in f: yield line def get_usage(ev): u ev.get(usage) or {} if not u and isinstance(ev.get(response), dict): u ev[response].get(usage) or {} input_tokens int(u.get(prompt_tokens) or u.get(input_tokens) or 0) output_tokens int(u.get(completion_tokens) or u.get(output_tokens) or 0) return input_tokens, output_tokens for path in ROOT.rglob(*.jsonl*): for raw in iter_lines(path): try: ev json.loads(raw) except Exception: continue event_type ev.get(type) or ev.get(event) or if event_type not in (chat, llm, model_call, generation): continue input_tokens, output_tokens get_usage(ev) model ev.get(model) or ev.get(request, {}).get(model) or unknown conn.execute( INSERT INTO llm_spans VALUES (?,?,?,?,?,?,?,?,?,?,?), ( ev.get(trace_id) or ev.get(traceId) or , ev.get(session_id) or ev.get(sessionId) or path.stem, ev.get(span_id) or ev.get(spanId) or , model, input_tokens, output_tokens, ev.get(status) or ev.get(status_code) or OK, ev.get(start_time) or ev.get(startTime) or , ev.get(end_time) or ev.get(endTime) or , int(ev.get(attempt) or ev.get(dsh.llm.attempt) or 1), ev.get(finish_reason) or ev.get(finishReason) or , ), ) conn.commit() conn.close() print(done:, DB)运行前先安装依赖pip install zstandard python parse_dsh_tokens.py如果数据量很大不要每次全量重跑。可以记录已处理的文件 mtime或者用trace_id span_id做唯一索引避免重复插入。SQL 和命令都在本地执行不要把它接到生产数据库上。5. 三张报表模型调用次数、Input/Output 分列、Token 消耗排行到了这一步报表其实就是 SQL 聚合。第一张表看模型调用次数与 Input/Output 分列这是成本统计的地基SELECT model, COUNT(*) AS calls, SUM(input_tokens) AS input_tokens, SUM(output_tokens) AS output_tokens, SUM(input_tokens output_tokens) AS total_tokens, ROUND(AVG(input_tokens output_tokens), 2) AS avg_tokens_per_call FROM llm_spans WHERE status_code OK GROUP BY model ORDER BY total_tokens DESC;结果可以整理成这样modelcallsinput_tokensoutput_tokenstotal_tokensavg_tokens_per_calldeepseek-chat128456000780005340004171.88claude-sonnet42210000960003060007285.71其他156200018000800005333.33第二张表看 Token 消耗排行。可以按会话排找出最贵的会话SELECT session_id, COUNT(*) AS calls, SUM(input_tokens) AS input_tokens, SUM(output_tokens) AS output_tokens, SUM(input_tokens output_tokens) AS total_tokens FROM llm_spans GROUP BY session_id ORDER BY total_tokens DESC LIMIT 20;第三张表看按天趋势判断成本是否随着任务量线性增长SELECT substr(start_time, 1, 10) AS day, model, COUNT(*) AS calls, SUM(input_tokens) AS input_tokens, SUM(output_tokens) AS output_tokens, SUM(input_tokens output_tokens) AS total_tokens FROM llm_spans GROUP BY day, model ORDER BY day DESC, total_tokens DESC;如果只想看模型调用次数排行不关心 TokenSELECT model, COUNT(*) AS calls FROM llm_spans GROUP BY model ORDER BY calls DESC;如果还要看失败与重试SELECT model, COUNT(*) AS total_calls, SUM(CASE WHEN status_code NOT IN (OK, UNSET, ) THEN 1 ELSE 0 END) AS error_calls, SUM(CASE WHEN attempt 1 THEN 1 ELSE 0 END) AS retry_calls FROM llm_spans GROUP BY model ORDER BY total_calls DESC;当 Input 和 Output 分开后你会发现很多“成本异常”并不是模型调用次数暴涨而是输入上下文膨胀。比如工具返回了大量 JSON、日志或文件内容被原样塞进下一轮请求Input Token 就会快速上升。另一种情况是输出被截断后自动续写Output Token 反复累加。只有分列报表才能把这两类问题区分开。6. 接入可观测插件时的坑pnpm v9、captureContent、批量上报与重试如果你希望不自己维护解析脚本可以接入 DSH 可观测插件把运行时事件还原为结构化调用链。插件通常挂载在 DSH 的插件层订阅生命周期事件并在模型流式管道上旁路观察不改业务代码。它最终会生成带父子关系的 Span并批量上报。配置模型出口仍然走 TaoTokenhttps://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentdsh_cost_plugin。安装或更新插件后先检查 DSH 和 Node 版本。版本不匹配时插件可能能被加载但事件字段缺失dsh --version node --version pnpm --versionpnpm v9 及以上默认会限制依赖包的 install 脚本。如果安装时看到Ignored build scripts或类似提示可在对应 profile 目录处理一次cd ~/.dsh/profiles/default pnpm approve-builds # 或将相关依赖加入允许列表后执行 pnpm rebuildheadless / harness profile 同理cd ~/.dsh/profiles/headless pnpm approve-builds cd ~/.dsh/profiles/harness pnpm approve-builds插件配置一般会涉及接收端 topic、批量大小、刷新间隔和内容捕获。默认情况下prompts、responses、tool arguments/results 可能被附到 span 上成本排障阶段很方便但涉及敏感内容时建议关闭# ~/.dsh/profiles/default/cordis.patch.yml plugins: tencentcloud-agentobs-sdk-dsh: topicId: ${CLS_TOPIC_ID} captureContent: false batch: maxSize: 100 flushIntervalMs: 3000显式插件配置通常优先于环境变量。访问凭证属于敏感信息建议通过环境变量或密钥管理工具注入不要把真实 SecretId、SecretKey 或 TaoToken Key 提交到代码仓库。模型侧 Key 用YOUR_API_KEY占位接收端凭证单独管理两者不要混用。安装或更新插件后需要重启 DSH 服务。重启后发起一次测试任务至少触发一次模型调用然后在调用链视图里确认 chat Span 是否存在。检查项包括模型名是否与实际请求一致Input/Output Token 是否非零重试是否生成了独立 chat Span中断或失败是否带错误状态同一会话的多条 trace 是否通过 session id 关联。如果报表里模型名是unknown优先检查模型适配器是否把 model 字段传入事件如果 Input/Output 都是 0优先检查流式 usage 是否开启如果调用次数明显低于实际请求数优先检查是否把重试合并了。7. 成本视角的告警与优化Input/Output 分开后先看什么有了按模型聚合的调用次数和 Input/Output 分列成本优化就不再是拍脑袋。第一优先级看 Input Token 排行因为输入通常占总 Token 的大头。重点排查三类会话工具结果超长工具返回的 JSON、日志、目录列表没有裁剪直接进入下一轮上下文多轮会话没有摘要长会话每轮都携带全部历史Input 随轮次线性增长系统提示与规则过长每次调用都重复携带大量固定文本调用次数越多浪费越大。第二优先级看 Output Token 排行。输出高不一定是坏事可能任务确实需要生成代码或长文档。但要看finish_reason如果大量是长度截断说明模型在反复续写成本可能翻倍。第三优先级看重试。重试次数不一定要告警但重试率对应模型侧失败或超时应该和错误率一起看。可以配置几类简单规则单会话总 Token 超过阈值时提醒某模型 Input Token 环比增长超过固定比例时提醒模型调用失败率或重试率超过阈值时提醒单次调用 Input Token 超过上下文预算时提醒。这些规则不需要一开始就很复杂。先有按模型、按会话、按天的三张报表再根据真实分布设阈值。DSH 的失败可能来自模型侧、工具侧或循环中断调用链里每层 Span 有独立状态后续可以把模型失败和工具失败分开告警避免所有问题都算到模型成本上。8. 总结与 CTADSH 原生的轨迹视图和事件流落盘解决的是本机、单会话、实时调试问题。要把模型成本管起来需要先统一模型出口去 TaoToken 官网获取 Key把 Base URL 设为https://taotoken.net/api让每次模型调用都返回可拆分的 usage。然后用事件流或可观测插件把 chat 层单独抽出来按每次真实模型调用落库最终产出模型调用次数、Input/Output 分列报表和 Token 消耗排行。这条链路的好处是可验证调用次数来自 chat SpanInput 来自prompt_tokensOutput 来自completion_tokens排行来自 SQL 聚合。它不依赖单会话视图也不把工具耗时混进模型耗时。规模越大这种结构化口径越重要。如果你准备把 DSH 接到 TaoToken可以从下面顺序开始先体验模型对话确认模型与返回格式模型对话需要长期跑编码任务看 Coding PlanCoding Plan创建自己的 API Key填入YOUR_API_KEY的位置API Keys如果同时使用 Claude Code按文档配置settings.json或ANTHROPIC_*Claude Code 文档配置完成后先跑一次最小对话请求确认返回体里有prompt_tokens与completion_tokens再让 DSH 发起一次真实任务。看到 chat Span 里的 Input/Output 分列你就已经有了成本统计的第一张底表。
延伸阅读

更多相关文章

2026/9/18 16:37:35

有限元软件学习避坑指南:从PPT操作到工程可信仿真

简介:本资源是一份面向高校力学、机械、土木等工科专业高年级本科生及研究生的《有限元软件学习》教学课件,聚焦有限元法在二维工程问题中的核心建模与求解逻辑。课件系统讲解平面应力与平面应变两类典型问题的理论基础,包括应力/应变状态判据…

2026/9/18 16:32:35

晶圆清洗工艺全解析:从RCA到参数调优,攻克良率瓶颈

简介:半导体晶圆制造中的污染杂质与清洗技术,是决定器件良率的关键环节。这份PDF文档面向半导体工艺工程师、封装测试人员及微电子相关专业师生,可作为产线问题排查与学术研究的实用参考文献。内容系统梳理了颗粒、有机物、金属离子和氧化物四…

2026/9/18 16:32:35

医院供配电系统设计核心逻辑与工程实践

简介:本资源是一份完整的高校电气工程类课程设计实践材料,面向电气、建筑电气与智能化等相关专业本科生,聚焦医院这一特殊民用建筑场景的供配电系统设计全流程训练。内容涵盖负荷分级与计算、变压器选型、短路电流分析、高低压主接线设计、设…

2026/9/18 19:12:54

大地测量学基础:从重力等位面到高斯投影的测绘知识链路

简介:这份试题资料源自武汉大学,聚焦《大地测量学基础》课程核心考点,面向测绘工程、地理信息科学、地球物理等专业学生及考研备考生。试卷按填空、看图识别、公式填图、简述、计算方法等题型编排,系统覆盖重力等位面、水准面与大…

2026/9/18 19:12:54

员工个人信息保护合规清单:字段盘点、Python 生成与自动化核查

简介:《员工个人信息保护合规清单》面向企业人力资源、法务与合规岗位人员,围绕员工个人信息从制度构建到离职处理的全流程,梳理出一份可直接对照自查的合规条目清单。资源包内含1个docx文档,约17KB,以勾选式问句形式逐…

2026/9/18 19:12:54

GARCH模型族原理与Python实战:波动率建模全解析

简介:本资源是一份面向金融工程、计量经济学及量化投资学习者的GARCH模型族教学课件,聚焦金融时间序列波动性建模这一核心难点。课件系统梳理了从ARCH到各类GARCH扩展模型(含IGARCH、TGARCH、EGARCH、GARCH-M、PARCH等)的理论逻辑…

2026/9/18 19:12:54

ASP.NET Core 选课系统高并发名额扣减与冲突判定

简介:这份基于ASP.NET的学生选课系统设计与实现文档,面向计算机相关专业的本科生、课程设计或毕业设计参考者,也适合刚接触Web开发、希望理解三层架构与教学管理系统落地的初学者。正文围绕系统设计、数据库设计、功能模块实现、测试部署与维…

2026/9/18 19:12:54

C#抽象类与多态实战:从EyeColor到Area的运行时绑定

简介:这是一份面向编程初学者的C#面向对象编程(OOP)入门教程PDF,聚焦抽象类、继承、多态等核心概念,帮助读者夯实C#语言基础并掌握实际编码范式。资源为单文件PDF文档(59KB),内容结构…

2026/9/18 19:07:53

STM32CubeProgrammer安装与嵌入式AI固件烧录实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 14:13:01

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/18 0:01:09

Google Colab 实战:运行模型、数据加载与报错排查

1. 为什么我劝你先搞懂 Colab 的运行模型1.1 Colab 到底是什么,跟本地跑代码差在哪Google Colab 简单说就是一台跑在浏览器里的 Linux 虚拟机,你打开一个 Notebook,背后就连上了一台带 GPU 的远程机器。你在单元格里敲的每一行 Python&#x…

2026/9/18 0:01:09

C语言数据类型与表达式详解

1. C语言数据与数据类型概述在C语言编程中,数据是程序处理的核心对象。理解数据的分类和特性是掌握C语言的基础。C语言中的数据主要分为四大类:常量、变量、表达式和函数。这些数据类型构成了C语言程序的基本元素,每种类型都有其独特的特性和…

2026/9/18 0:01:09

SQL时间字段指定时间段查询:区间语义、索引与时区避坑

上周排查一个线上问题&#xff0c;用户反馈"昨天的订单一条都没查到"&#xff0c;但数据库里明明躺着两千多条。最后定位下来&#xff0c;不是数据丢了&#xff0c;也不是接口挂了&#xff0c;而是那个查询条件把时间段写成了> 2024-05-20 00:00:00 AND < 2024…

2026/9/18 14:13:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/18 14:13:02

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/18 14:13:02

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码