1. 从 OpenRouter 周请求榜切到可查账的 DeepSeek 调用
最近 OpenRouter 周请求榜和开源权重模型的讨论很多,TaoToken 官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=openrouter_deepseek_ledger 可以直接拿 Key。对做应用开发或模型评测的工程师来说,榜单只能说明热度,真正要落地时,绕不开三个问题:请求头发什么、Base URL 填什么、模型名和 token 用量怎么记。本文不走新闻评论路线,而是围绕 DeepSeek 这类开源权重模型,给你一套可复现的接入与记账方案:先从 TaoToken 获取 Key,把 Base URL 固定为https://taotoken.net/api,再用 OpenAI 兼容接口发请求,最后把响应里的usage字段写成 JSONL/CSV,方便和 OpenRouter 周请求数、模型用量做本地复盘。
这里要先明确一个工程原则:供应商入口和调用入口要分开管理。入口用 TaoToken 官网完成注册、创建 Key、查看额度与用量;调用入口只认 Base URL 和模型名。这样你在 Claude Code、Codex、CC Switch、Python 脚本之间切换时,不会因为把不同工具的配置变量混在一起而出现 401、404、模型不存在等问题。
先看最小可运行请求。假设你已经在 TaoToken 控制台创建了 Key,并且把 Key 放在环境变量里:
export TAOTOKEN_API_KEY="YOUR_API_KEY"然后用curl验证请求头和 Base URL 是否正确:
curl -sS https://taotoken.net/api/chat/completions \ -H "Authorization: Bearer ${TAOTOKEN_API_KEY}" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-chat", "messages": [ { "role": "user", "content": "用三句话说明开源权重模型评测时最应该记录哪些指标" } ], "temperature": 0.2 }'这个请求里有两个关键点。第一,Authorization必须是Bearer YOUR_API_KEY,不是Basic,也不是把 Key 拼到 URL 上。第二,Base URL 是https://taotoken.net/api,请求路径按 OpenAI 兼容形式拼成/chat/completions。如果你使用 OpenAI SDK,通常只需要设置base_url,SDK 会自动拼接路径。
from openai import OpenAI client = OpenAI( api_key="YOUR_API_KEY", base_url="https://taotoken.net/api" ) resp = client.chat.completions.create( model="deepseek-chat", messages=[ {"role": "user", "content": "用三句话说明开源权重模型评测时最应该记录哪些指标"} ], temperature=0.2 ) print(resp.choices[0].message.content) print(resp.usage)运行后,重点看resp.usage。它通常会包含prompt_tokens、completion_tokens、total_tokens。这三个字段就是后面记账的基础。模型名不要凭印象写,建议到 TaoToken 模型对话页复制当前可用的模型名:https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat_first 。不同模型别名、上下文长度、是否支持流式用量返回,都可能影响你的评测脚本。
2. 在 TaoToken 创建 Key:请求头、Base URL 与模型名核对
这一节按可跟做步骤来。先打开 TaoToken 官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=create_key_flow ,完成登录后进入 API Keys 页面:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys 。创建 Key 后,你会得到一串只显示一次或部分隐藏的密钥。把它填到本地环境变量,不要直接写进代码仓库。
建议本地建一个.env文件,只用于测试,并且加入.gitignore:
# .env TAOTOKEN_API_KEY=YOUR_API_KEY TAOTOKEN_BASE_URL=https://taotoken.net/api TAOTOKEN_DEFAULT_MODEL=deepseek-chat然后在 Python 或 shell 中读取。Python 可以用python-dotenv:
import os from dotenv import load_dotenv from openai import OpenAI load_dotenv() client = OpenAI( api_key=os.environ["TAOTOKEN_API_KEY"], base_url=os.environ["TAOTOKEN_BASE_URL"] ) model = os.environ.get("TAOTOKEN_DEFAULT_MODEL", "deepseek-chat") resp = client.chat.completions.create( model=model, messages=[{"role": "user", "content": "返回一个 JSON,包含 ok 字段和当前模型名"}], temperature=0 ) print(resp.model) print(resp.usage.total_tokens)在核对配置时,建议做一个检查清单:
- Base URL 是否为
https://taotoken.net/api,不要带 UTM,也不要随手加多余的/v1,除非你使用的工具文档明确要求。 - 请求头是否为
Authorization: Bearer YOUR_API_KEY和Content-Type: application/json。 - 模型名是否从 TaoToken 控制台或模型页复制,而不是从旧笔记里抄。
- 环境变量是否真的被当前终端加载。可以在终端执行
echo $TAOTOKEN_API_KEY检查,但不要截图或发到公开渠道。 - 如果使用代理或网关,只设置标准 HTTP 代理变量,不要把 Key 放到 URL 参数里。
请求头配置样例可以固定成下面这样,后续 Claude Code、Codex、CC Switch 都围绕这个标准来排查:
POST /chat/completions HTTP/1.1 Host: taotoken.net Authorization: Bearer YOUR_API_KEY Content-Type: application/json Accept: application/json如果你用 HTTP 客户端,例如 Pythonrequests,可以这样写:
import os import requests url = "https://taotoken.net/api/chat/completions" headers = { "Authorization": f"Bearer {os.environ['TAOTOKEN_API_KEY']}", "Content-Type": "application/json", "Accept": "application/json", } payload = { "model": "deepseek-chat", "messages": [{"role": "user", "content": "只输出 pong"}], "temperature": 0, } r = requests.post(url, headers=headers, json=payload, timeout=60) r.raise_for_status() data = r.json() print(data["choices"][0]["message"]["content"]) print(data["usage"])requests版本的好处是你能清楚看到 URL、headers、payload 三部分,排障时比 SDK 更容易定位问题。无论用哪种方式,最终目标都一样:让请求以标准 OpenAI 兼容格式进入https://taotoken.net/api,并把返回的usage记录下来。
3. 评测脚本:把 DeepSeek 的模型名和 token 用量写成 JSONL/CSV
做模型评测时,最怕的不是调用失败,而是调用成功但账记错了。比如一次评测跑了 200 条 prompt,模型名换了两次,流式和非流式混用,最后只记了一个总数,没法归因。建议从一开始就用 JSONL 记录每次调用,再用 CSV 做汇总。
下面是一个可运行的记录脚本。它会调用 TaoToken 的 OpenAI 兼容接口,保存模型名、耗时、prompt_tokens、completion_tokens、total_tokens 和请求 ID。模型名示例用deepseek-chat,实际请以控制台为准。
import os import csv import json import time import uuid from datetime import datetime, timezone from openai import OpenAI client = OpenAI( api_key=os.environ["TAOTOKEN_API_KEY"], base_url="https://taotoken.net/api" ) MODEL = os.environ.get("TAOTOKEN_DEFAULT_MODEL", "deepseek-chat") JSONL_PATH = "taotoken_usage.jsonl" CSV_PATH = "taotoken_usage.csv" def ask(prompt: str, tag: str = "eval"): started = time.time() resp = client.chat.completions.create( model=MODEL, messages=[ {"role": "system", "content": "你是严谨的模型评测助手,回答尽量短。"}, {"role": "user", "content": prompt}, ], temperature=0.2, ) elapsed_ms = int((time.time() - started) * 1000) usage = resp.usage row = { "request_id": getattr(resp, "id", str(uuid.uuid4())), "created_at": datetime.now(timezone.utc).isoformat(), "tag": tag, "model": resp.model or MODEL, "prompt": prompt, "answer": resp.choices[0].message.content, "prompt_tokens": usage.prompt_tokens if usage else None, "completion_tokens": usage.completion_tokens if usage else None, "total_tokens": usage.total_tokens if usage else None, "elapsed_ms": elapsed_ms, } with open(JSONL_PATH, "a", encoding="utf-8") as f: f.write(json.dumps(row, ensure_ascii=False) + "\n") return row if __name__ == "__main__": for i, p in enumerate([ "解释一下模型评测中的 pass@k。", "用一句话说明 token 用量为什么要按 prompt 和 completion 分开记。", "给出一个开源权重模型服务稳定性的检查项。", ]): row = ask(p, tag=f"deepseek_eval_{i}") print(row["model"], row["total_tokens"], row["elapsed_ms"], "ms")运行后,你会得到一个 JSONL 文件,每行一条调用记录。接着用 Python 汇总成 CSV:
import json import csv from collections import defaultdict agg = defaultdict(lambda: { "calls": 0, "prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0, }) with open("taotoken_usage.jsonl", "r", encoding="utf-8") as f: for line in f: row = json.loads(line) key = row["model"] agg[key]["calls"] += 1 agg[key]["prompt_tokens"] += row["prompt_tokens"] or 0 agg[key]["completion_tokens"] += row["completion_tokens"] or 0 agg[key]["total_tokens"] += row["total_tokens"] or 0 with open("taotoken_usage.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(["model", "calls", "prompt_tokens", "completion_tokens", "total_tokens"]) for model, v in agg.items(): writer.writerow([model, v["calls"], v["prompt_tokens"], v["completion_tokens"], v["total_tokens"]])这样你就能回答几个关键问题:同一个模型名下跑了多少次、输入和输出 token 比例是多少、某次评测是否因为 prompt 太长导致成本异常。如果你同时对比多个开源权重模型,只要在脚本里把MODEL改成控制台里的模型名,并在tag里标记版本即可。不要把不同模型的结果混在同一列里,否则后面很难复盘。
对于流式响应,usage不一定在每个 chunk 都返回。可以在请求中显式要求包含用量,如果服务端支持,通常在最后一个 chunk 给出统计:
stream = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": "输出 50 字以内的接入建议"}], stream=True, stream_options={"include_usage": True} ) final_usage = None for chunk in stream: if chunk.choices and chunk.choices[0].delta.content: print(chunk.choices[0].delta.content, end="") if getattr(chunk, "usage", None): final_usage = chunk.usage print() print(final_usage)如果final_usage为空,先确认你使用的模型和接口是否支持该参数,再退回非流式调用做对账。不要用估算值替代真实usage,尤其在评测报告里,估算会让不同模型的比较失去意义。
4. Claude Code 配置:settings.json 里使用 ANTHROPIC_* 指向 TaoToken
如果你在 Claude Code 里使用 TaoToken,配置方式与 OpenAI SDK 不同。Claude Code 侧通常使用ANTHROPIC_*系列环境变量,而不是OPENAI_*。你可以在settings.json里配置,也可以在 shell 中导出。先看settings.json示例:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" } }如果你更习惯用 shell,可以这样:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_AUTH_TOKEN="YOUR_API_KEY" export ANTHROPIC_MODEL="claude-sonnet-4-20250514"这里要特别注意:ANTHROPIC_BASE_URL填https://taotoken.net/api,不要带 UTM 参数。ANTHROPIC_AUTH_TOKEN填你在 TaoToken 创建的YOUR_API_KEY。ANTHROPIC_MODEL填你实际要用的模型名,具体以 TaoToken Claude Code 文档和模型页为准:https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=claude_code_doc 。如果你把ANTHROPIC_*写到 Codex 的配置里,就会出现工具读不到配置或鉴权失败的问题,下一节会单独说明 Codex 的正确做法。
配置完成后,建议新开一个终端窗口,再启动 Claude Code。可以用下面命令确认环境变量已经进入当前进程:
env | grep ANTHROPIC输出中应该能看到ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_MODEL。不要把完整 Key 输出到共享屏幕或日志里。如果 Claude Code 报 401,先检查ANTHROPIC_AUTH_TOKEN是否被其他 shell 配置覆盖;如果报模型不存在,检查ANTHROPIC_MODEL是否从 TaoToken 侧复制;如果报连接错误,检查ANTHROPIC_BASE_URL是否被误写成带/v1或带查询参数的地址。
另外,Claude Code 的会话可能会产生多轮请求,每轮请求的 token 用量会分散在工具日志中。如果你要做用量对账,建议同时保留 TaoToken 控制台的用量记录和本地会话日志。控制台看总量,本地日志看单次调用,二者结合才能定位异常。
5. Codex 配置:config.toml 使用 model_providers,不要混 ANTHROPIC_*
Codex 的配置入口通常不是settings.json,也不应该使用ANTHROPIC_*。它一般读取~/.codex/config.toml,通过model_provider指定供应商。下面是一个面向 TaoToken 的配置示例:
model = "gpt-5-codex" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "chat"然后在 shell 中设置环境变量:
export TAOTOKEN_API_KEY="YOUR_API_KEY"如果你在 Windows PowerShell 中,写法不同:
$env:TAOTOKEN_API_KEY="YOUR_API_KEY"Codex 侧的关键点是env_key。它告诉 Codex 从哪个环境变量读取 Key。这里用TAOTOKEN_API_KEY是为了和 Claude Code 的ANTHROPIC_AUTH_TOKEN区分开。不要把 Claude Code 的ANTHROPIC_BASE_URL或ANTHROPIC_AUTH_TOKEN直接搬到 Codex 配置里,因为 Codex 不按这套变量读取,最终表现就是请求没有带上正确鉴权,或者请求发到了非预期地址。
配置完成后,可以先用一个简单项目测试:
codex "用一句话说明当前项目的入口文件"如果 Codex 报 404,优先检查base_url是否为https://taotoken.net/api,以及wire_api是否与 TaoToken 文档要求一致。如果报 401,检查TAOTOKEN_API_KEY是否在当前终端可用。如果报模型不存在,检查model字段是否与控制台模型名一致。
Codex 和 Claude Code 可以共用同一个 TaoToken Key,但不建议共用同一套环境变量名。Key 可以相同,配置命名要分开。这样排障时你能快速判断是 Claude Code 的问题,还是 Codex 的问题,而不是在多个变量之间互相覆盖。
6. CC Switch 三件套:把 TaoToken 做成可切换供应商
如果你同时使用 Claude Code、Codex 或多个模型供应商,CC Switch 这类工具可以把配置切换做得更顺。核心不是装完就完,而是把“三件套”填对:Base URL、API Key、默认模型。对于 TaoToken,三件套建议如下:
供应商名称:TaoToken Base URL:https://taotoken.net/api API Key:YOUR_API_KEY 默认模型:deepseek-chat如果 CC Switch 里区分 Claude 和 Codex,建议建两个配置项,而不是一个配置到处复用:
配置一:TaoToken-ClaudeCode Base URL:https://taotoken.net/api API Key:YOUR_API_KEY 模型:claude-sonnet-4-20250514 配置二:TaoToken-Codex Base URL:https://taotoken.net/api API Key:YOUR_API_KEY 模型:gpt-5-codex这样切换时不会把 Claude Code 的模型名带到 Codex,也不会把 Codex 的model_provider逻辑套到 Claude Code。切换后一定要重启对应客户端或新开终端,因为很多工具只在启动时读取环境变量。验证方式很简单:在 Claude Code 中问一个短问题,看是否返回;在 Codex 中执行一个只读命令,看是否正常。两边都通过,再开始跑批量评测。
CC Switch 的另一个价值是保留多套供应商配置,方便做对比。例如你可以保留一个默认供应商,再保留一个 TaoToken 配置,用同一个评测脚本分别跑。但要注意,脚本侧不要依赖 CC Switch 的切换状态,最好在每次运行时显式打印当前base_url和model,写进 JSONL。这样即使中途切换过配置,历史记录也不会混乱。
7. 排障:401、404、429、模型名与 usage 对不上
接入 TaoToken 时,常见问题可以按状态码和字段来定位。
第一,401 Unauthorized。先检查请求头是否为Authorization: Bearer YOUR_API_KEY。常见错误包括:把 Key 写成YOUR_API_KEY字符串没有替换;环境变量名写错;shell 配置文件没有重新加载;在 JSON 配置里漏了引号;Key 前后有空格或换行。用curl复现时,可以临时把-H打印出来检查,但不要输出完整 Key。
第二,404 Not Found。多数情况是 Base URL 或路径拼错。Base URL 应是https://taotoken.net/api,不要带 UTM,不要重复写/api,也不要随手加/v1除非工具文档明确要求。如果你用 OpenAI SDK,设置base_url="https://taotoken.net/api"后,SDK 会拼接/chat/completions。如果你手写 HTTP 请求,URL 写成https://taotoken.net/api/chat/completions。
第三,429 Too Many Requests。先降低并发,增加重试退避。批量评测时不要一次性开几百个并发,先用 1 到 3 个并发跑通,再逐步增加。重试逻辑建议只对 429 和 5xx 做指数退避,不要对 401 和 404 盲目重试。
第四,模型名不存在。不同供应商的模型别名可能不同,必须以 TaoToken 控制台为准。到模型对话页 https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat_first 复制模型名,不要从旧文章里抄。模型名大小写、连字符、版本后缀都可能导致失败。
第五,usage 对不上。先区分prompt_tokens、completion_tokens、total_tokens。有些请求可能包含 system message,有些可能启用了流式,有些可能在客户端做了重试。每次请求都要记录request_id,并把本地记录和控制台用量按时间窗口对齐。如果使用流式,确认是否支持stream_options,不支持时改用非流式做基准。不要把缓存命中、重试请求、失败请求混入成功用量。
第六,日志脱敏。记录请求时只记录模型名、Base URL 主机、状态码、耗时和 usage,不要记录完整 Key。如果需要排查鉴权,可以记录 Key 的后四位或哈希,不要记录完整值。TaoToken 官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=troubleshoot 可以用于查看控制台状态和用量入口,但对外分享日志前一定要清理敏感字段。
8. 文末 CTA:先在模型对话试,再用 Coding Plan,最后创建 Key 与 Claude Code 文档
如果你准备把这套 DeepSeek 记账流程跑起来,建议按下面的高转化路径操作。第一步,先到模型对话页做一轮最小验证,确认模型名和返回格式:https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat_first 。第二步,如果你要把模型接入日常开发流程,可以查看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan 。第三步,到 API Keys 页面创建或管理 Key,并把 Base URL 填为https://taotoken.net/api:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys 。第四步,如果你使用 Claude Code,直接对照 Claude Code 文档完成settings.json或ANTHROPIC_*配置:https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=claude_code_doc 。
最后再强调一次工程顺序:先用一个 prompt 验证Authorization: Bearer YOUR_API_KEY和https://taotoken.net/api,再写脚本记录model、prompt_tokens、completion_tokens、total_tokens,最后扩展到 Claude Code、Codex 和 CC Switch。OpenRouter 周请求榜和开源权重模型热度会变化,但你本地这套请求头、配置文件和用量账本是可以复用的。把模型名、Base URL、Key、usage 四个字段管好,DeepSeek 一类模型的评测和接入就不会停留在“看起来热闹”,而是变成可追踪、可复盘、可对比的真实数据。