1. 先把 Iris 评测链路里的 Key 回填点找出来
本地评测 AllSpark 开源的 Search Agent 模型 Iris 时,先到 TaoToken 官网 拿 Key。AllSpark 已经把 Iris 的权重和评测代码公开,35B 与 397B 两个规格都可以在本地拉起;训练数据和配方说明后续还会补齐。很多同学下载完权重后第一反应是直接跑 benchmark,但 Search Agent 的评测不是单轮对话:它通常包含问题理解、搜索规划、查询改写、网页或文档片段筛选、证据聚合、最终答案汇总。真正产生 API 调用和 Token 消耗的,往往不是本地权重生成那一步,而是搜索规划与答案汇总这两个环节。
如果评测脚本把这些环节抽象成 OpenAI 兼容客户端,那么你就要关注三个字段:base_url、api_key、model。本次可复现的做法是:base_url统一设为https://taotoken.net/api,api_key回填从 TaoToken 创建的YOUR_API_KEY,model从模型对话页复制实际 ID。这样做的目的不是让 Iris 权重跑在远端,而是让评测 harness 中的搜索规划、摘要重排、答案汇总调用走一个可追踪入口,方便控制 Token 去向。
常见卡点也很集中:401 invalid_api_key、404 model_not_found、400 invalid_request_error、连接超时。401 通常是没有把YOUR_API_KEY写进评测脚本真正读取的那个环境变量,或者 Key 复制时带了空格。404 多半是模型名不对,或者工具把 Anthropic 协议当成了 OpenAI 协议。400 常见于 base_url 被误写成带/v1、带 UTM、带多余路径。先把调用点找出来,再动手回填,后面会顺很多。
你可以按下面顺序定位:
- 找评测入口:
eval、run_eval、search_agent、planner、summarizer相关文件。 - 找 LLM 客户端初始化:搜索
OpenAI(、base_url、api_key、OPENAI_API_KEY。 - 找配置文件:
configs/*.yaml、*.toml、.env、settings.json。 - 找命令行覆盖参数:
--api-key、--base-url、--model、--planner-model。 - 确认日志级别:至少能看到 planner 请求、search 调用、summarizer 返回三类事件。
只有确认哪些步骤真的会发 HTTP 请求,你才能判断 Token 到底消耗在搜索规划、网页摘要,还是最终答案汇总。否则跑完 Iris 35B 和 397B 后,只看到一个总费用或总 Token,很难解释差异来自模型本身还是搜索轮次。
2. 到 TaoToken 创建 Key:让 Iris 评测的 Token 去向可追踪
先打开 TaoToken 官网,登录后进入控制台,在 API Keys 页面创建一个专用于 Iris 评测的 Key。建议命名iris35b-eval或iris397b-eval,不要和日常聊天、Coding Plan 混用。创建后只显示一次,复制到安全位置;本文和示例代码里统一使用YOUR_API_KEY占位。如果团队协作,不要把真实 Key 提交到 Git,只提交.env.example。
创建 Key 时建议注意四件事:
- 用途命名清晰,例如
iris35b-eval-2025。 - 额度或权限按评测规模设置,先小批量探活,再跑完整任务集。
- 35B 与 397B 最好用不同 Key,便于在调用记录里区分。
- 如果控制台支持查看调用记录,保留时间戳、模型名、Token 数,后面和本地日志对齐。
环境变量可以这样写:
export TAOTOKEN_API_KEY="YOUR_API_KEY" export OPENAI_API_KEY="$TAOTOKEN_API_KEY" export OPENAI_BASE_URL="https://taotoken.net/api"有些评测脚本读OPENAI_API_KEY,有些读TAOTOKEN_API_KEY,有些读IRIS_LLM_API_KEY。不要在每个脚本里到处硬编码,最好用一个入口变量转发。Base URL 固定https://taotoken.net/api,不要加 UTM 参数,也不要加空格。TaoToken 的价值在于让 Key 的用途、额度、调用记录集中管理,这样 Iris 评测里的搜索规划与答案汇总消耗了多少 Token,才有办法回溯。
如果你还没有确定模型 ID,可以先在模型对话页面验证调用方式,再到控制台创建 Key。注意,Base URL 和 Key 是两套东西:Base URL 是请求入口,Key 是身份与权限凭证。不要把 UTM 链接当成 API 地址,也不要把控制台页面地址写进 SDK 的base_url。
3. 最小探活:先确认 Key、Base URL、模型名三者匹配
在改 Iris 评测配置之前,先用一个最小 Python 脚本确认 TaoToken 的 Key、Base URL、模型名能正常返回。这个步骤可以避免你把网络问题、模型名问题和评测脚本问题混在一起排查。
from openai import OpenAI client = OpenAI( api_key="YOUR_API_KEY", base_url="https://taotoken.net/api", ) resp = client.chat.completions.create( model="YOUR_MODEL_NAME", messages=[ {"role": "user", "content": "只回复 ok"} ], temperature=0, ) print(resp.choices[0].message.content)保存为check_taotoken.py后运行:
python check_taotoken.py期望输出类似:
ok如果出现 401,优先检查:
YOUR_API_KEY是否换成了真实 Key。- Key 前后是否有空格、换行、引号。
- 当前终端是否真的导出了环境变量。
- 脚本是否读取了另一个变量名。
- 是否误用了过期 Key 或被删除的 Key。
如果出现 404,优先检查:
YOUR_MODEL_NAME是否从模型对话页复制。- 当前工具使用 OpenAI 兼容协议,还是 Anthropic 兼容协议。
- 模型 ID 是否区分大小写、版本号、日期后缀。
- 是否把渠道名、显示名当成模型 ID。
如果出现 400,优先检查:
base_url是否写成了https://taotoken.net/api。- 是否额外拼接了多余路径。
- 请求体字段是否符合 OpenAI 兼容格式。
- 是否把 Anthropic 的
messages结构直接发给了 OpenAI 兼容端点。
探活通过后,再把这个配置复制到 Iris 评测脚本中。不要在评测脚本里反复改 Key,而是让评测脚本读取同一组环境变量或同一个 YAML 配置。
4. 把 Iris 35B 与 397B 评测配置改成 TaoToken 供应商
不同仓库的 Iris 评测入口可能不一样,但核心配置通常可以抽象成下面这份 YAML。它不假设 Iris 权重在远端,只把搜索规划和答案汇总的模型调用统一到 TaoToken 的 OpenAI 兼容入口。
llm: provider: openai_compatible base_url: https://taotoken.net/api api_key_env: OPENAI_API_KEY planner_model: YOUR_MODEL_NAME summarizer_model: YOUR_MODEL_NAME temperature: 0 timeout_seconds: 120 search: max_turns: 8 max_search_calls: 12 max_context_tokens: 32000 eval: dataset: eval/search_tasks.jsonl output: logs/iris35b_taotoken_run1.jsonl log_file: logs/iris35b_taotoken_run1.log这里有几个点需要解释:
provider写openai_compatible,表示按 OpenAI 兼容协议发请求。base_url必须是https://taotoken.net/api,不要带 UTM。api_key_env建议写OPENAI_API_KEY,这样现有脚本大多能直接读取。planner_model和summarizer_model可以相同,也可以不同。如果你想区分搜索规划和答案汇总的消耗,可以给它们分别配置模型。max_turns控制搜索迭代轮次,轮次越多,规划调用越多。max_search_calls控制搜索工具调用次数,次数越多,后续摘要上下文越长。max_context_tokens影响答案汇总时的输入规模,设置过大可能让 Token 快速上涨。
然后设置环境变量并跑评测:
export OPENAI_API_KEY="YOUR_API_KEY" export OPENAI_BASE_URL="https://taotoken.net/api" python -m iris_eval.run \ --config configs/iris35b_eval.yaml \ --model-path /models/Iris-35B \ --tasks eval/search_tasks.jsonl \ --output logs/iris35b_taotoken_run1.jsonl \ 2>&1 | tee logs/iris35b_taotoken_run1.log如果你的仓库入口不是python -m iris_eval.run,请替换成实际命令。关键是确认评测入口读取的配置和环境变量与探活脚本一致。397B 版本同理,只需要换配置文件和权重路径:
python -m iris_eval.run \ --config configs/iris397b_eval.yaml \ --model-path /models/Iris-397B \ --tasks eval/search_tasks.jsonl \ --output logs/iris397b_taotoken_run1.jsonl \ 2>&1 | tee logs/iris397b_taotoken_run1.log跑完后不要只看最终准确率。你应该同时保留三份材料:
- 评测输出 JSONL:每个任务的答案、引用、搜索轮次。
- 运行日志:planner 和 summarizer 的调用时间、Token、错误。
- TaoToken 控制台调用记录:用于确认请求确实走了
https://taotoken.net/api。
这样 35B 与 397B 的评测结果才具备可复现性。否则你只得到了一个分数,却不知道分数背后的搜索策略和 Token 去向。
5. Claude Code、Codex、CC Switch 三件套不要串错
虽然这篇文章主线是 Iris 评测,但很多同学会同时使用 Claude Code、Codex、CC Switch 做辅助开发。这里最容易犯的错误是把 Anthropic 环境变量套到 Codex 上,导致工具读不到 Key。访问 TaoToken 官网 获取 Key 后,按工具分别配置。
Claude Code 使用settings.json和ANTHROPIC_*变量,例如:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" } }注意:Claude Code 可以读ANTHROPIC_*,但不要把这一组变量复制给 Codex。Codex 使用config.toml,更接近 OpenAI 兼容配置:
model = "gpt-5" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY"对应的环境变量是:
export TAOTOKEN_API_KEY="YOUR_API_KEY"如果你使用的是 CC Switch,可以把 TaoToken 作为一个供应商条目维护。不同版本 UI 字段可能不同,但核心字段类似:
{ "provider": "taotoken", "base_url": "https://taotoken.net/api", "api_key": "YOUR_API_KEY", "protocol": "openai_compatible" }三件套的分工可以这样记:
- Claude Code:
settings.json+ANTHROPIC_*。 - Codex:
config.toml+ OpenAI 兼容 provider。 - CC Switch:供应商切换条目,Base URL 统一
https://taotoken.net/api。
如果你在 CC Switch 中同时维护 Claude Code 和 Codex 两套配置,建议给供应商名称加上用途后缀,例如taotoken-claude、taotoken-codex。这样切换时不会把 Anthropic 协议和 OpenAI 协议混在一起。Claude Code 的详细配置可以参考文末文档链接。
6. 跑评测时看哪些日志字段,才能判断 Token 去哪了
Iris 评测跑起来后,日志里最好能拆出以下事件。不同仓库字段名可能不同,但信息类型基本一致:
[planner.start] round=1 model=YOUR_MODEL_NAME [planner.end] round=1 input_tokens=... output_tokens=... [search.query] q=... [search.result] doc_count=... [summarizer.start] docs=... [summarizer.end] input_tokens=... output_tokens=... [eval.task_done] id=... latency_ms=...重点观察这些指标:
planner_rounds:搜索规划轮次。轮次越多,规划调用越多。search_calls:搜索工具调用次数。次数越多,后续摘要输入越长。summarizer_calls:答案汇总调用次数。多轮汇总会增加 Token。input_tokens与output_tokens:输入通常远大于输出,尤其是拼接多个搜索结果时。latency_ms:延迟变化能帮助你判断是模型慢,还是搜索工具慢。error_count:重试会放大 Token 消耗。
对照 Token 去向时,可以按下面方法做:
- 在本地日志中记录每次 planner 和 summarizer 请求的时间戳。
- 在 TaoToken 控制台查看对应时间段的调用记录。
- 按模型名、时间戳、Token 数进行匹配。
- 如果响应头或日志里有 request id,优先按 request id 对齐。
- 如果发现本地日志没有请求,但最终答案有生成,说明可能命中了本地缓存或本地模型,并没有走远程 API。
如果 Token 比预期高,不要急着改模型。先检查:
max_turns是否过大。max_search_calls是否没有上限。- 是否把整页搜索结果都拼进 summarizer。
- 是否对同一问题重复调用 planner。
- 是否失败重试次数过多。
- 是否把 35B 和 397B 的日志混在一起统计。
把搜索规划和答案汇总分开看,才能判断 Token 是花在“找什么”上,还是花在“写答案”上。对于 Search Agent 评测,这两者的优化方式完全不同。
7. 常见报错排查顺序
第一类:401 未授权。检查YOUR_API_KEY是否替换,检查变量名是否一致,检查子进程是否继承环境变量。如果是 systemd、Docker、conda 环境,环境变量可能没有传进去。
第二类:404 模型不存在。检查YOUR_MODEL_NAME是否来自模型对话页,检查协议是否匹配。OpenAI 兼容端点和 Anthropic 兼容端点的请求路径、Header 都不同。不要把 Claude Code 的ANTHROPIC_*配置直接塞给 Codex。
第三类:400 请求错误。检查base_url是否严格为https://taotoken.net/api。不要在 base_url 后面追加/v1、/chat/completions或 UTM 参数。SDK 通常会自动拼接路径。
第四类:429 限流或额度不足。先降低并发和评测任务数,确认是瞬时限流还是额度问题。如果控制台有额度配置,检查 Key 的权限。
第五类:超时。检查timeout_seconds,检查搜索工具本身是否慢,检查 summarizer 输入是否过长。不要用无限重试掩盖问题,否则 Token 会快速上涨。
第六类:配置覆盖顺序错误。很多评测脚本支持 CLI 参数、环境变量、YAML 三层配置。最终生效的是哪一层,要看代码。建议在日志里打印生效的base_url、model、provider,但不要打印完整 Key,只打印前几位或YOUR_API_KEY标记。
第七类:本地缓存导致误判。有些 Search Agent 框架会缓存搜索结果或模型响应。你以为在调用 TaoToken,其实读的是缓存。排查时可以临时关闭缓存,或换一个任务 ID。
8. 把 35B 与 397B 的评测配置固化成脚本
为了避免每次手动导出环境变量,可以写一个run_iris35b.sh:
#!/usr/bin/env bash set -euo pipefail export OPENAI_API_KEY="${TAOTOKEN_API_KEY:?请先设置 TAOTOKEN_API_KEY}" export OPENAI_BASE_URL="https://taotoken.net/api" python -m iris_eval.run \ --config configs/iris35b_eval.yaml \ --model-path "${IRIS_35B_PATH:-/models/Iris-35B}" \ --tasks eval/search_tasks.jsonl \ --output logs/iris35b_taotoken_run1.jsonl \ 2>&1 | tee logs/iris35b_taotoken_run1.log397B 脚本只需替换配置和路径:
#!/usr/bin/env bash set -euo pipefail export OPENAI_API_KEY="${TAOTOKEN_API_KEY:?请先设置 TAOTOKEN_API_KEY}" export OPENAI_BASE_URL="https://taotoken.net/api" python -m iris_eval.run \ --config configs/iris397b_eval.yaml \ --model-path "${IRIS_397B_PATH:-/models/Iris-397B}" \ --tasks eval/search_tasks.jsonl \ --output logs/iris397b_taotoken_run1.jsonl \ 2>&1 | tee logs/iris397b_taotoken_run1.log配套的.env.example可以这样写:
TAOTOKEN_API_KEY=YOUR_API_KEY OPENAI_BASE_URL=https://taotoken.net/api IRIS_35B_PATH=/models/Iris-35B IRIS_397B_PATH=/models/Iris-397B不要提交真实.env。评测日志和输出 JSONL 可以归档,但 Key 不要写进日志。建议在脚本开头检查TAOTOKEN_API_KEY是否存在,避免空 Key 跑完整评测。官网也有控制台和 API Keys 管理入口,可以到 TaoToken 官网 查看 Key 与调用记录。
最后,把 35B 和 397B 的结果分开目录保存:
logs/ iris35b_taotoken_run1.log iris35b_taotoken_run1.jsonl iris397b_taotoken_run1.log iris397b_taotoken_run1.jsonl这样后续对比搜索轮次、Token 消耗、答案质量时,不会把两个版本的数据混在一起。
9. 从模型对话到 API Key:按这条路径完成 Iris 评测接入
如果你准备把 Iris 35B 或 397B 的本地评测跑起来,可以按下面顺序操作:
先到模型对话页验证模型 ID 与调用效果:
https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=iris35b_chat如果要把辅助开发工具也接上,了解 Coding Plan:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=iris35b_coding_plan创建和管理 Iris 评测专用 API Key:
https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=iris35b_api_keys需要配置 Claude Code 时,查看 Claude Code 文档:
https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=iris35b_claude_code_doc
整体流程就是:先拿 Key,再把 OpenAI 兼容调用的base_url设为https://taotoken.net/api,回填YOUR_API_KEY,跑最小探活,最后启动 Iris 35B 与 397B 评测并对照日志。这样搜索规划与答案汇总阶段的 Token 去向就能被记录、拆解和复现。