
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/apiapi_key回填从 TaoToken 创建的YOUR_API_KEYmodel从模型对话页复制实际 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_KEYYOUR_API_KEY export OPENAI_API_KEY$TAOTOKEN_API_KEY export OPENAI_BASE_URLhttps://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_keyYOUR_API_KEY, base_urlhttps://taotoken.net/api, ) resp client.chat.completions.create( modelYOUR_MODEL_NAME, messages[ {role: user, content: 只回复 ok} ], temperature0, ) 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_KEYYOUR_API_KEY export OPENAI_BASE_URLhttps://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 \ 21 | 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 \ 21 | 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_KEYYOUR_API_KEY如果你使用的是 CC Switch可以把 TaoToken 作为一个供应商条目维护。不同版本 UI 字段可能不同但核心字段类似{ provider: taotoken, base_url: https://taotoken.net/api, api_key: YOUR_API_KEY, protocol: openai_compatible }三件套的分工可以这样记Claude Codesettings.jsonANTHROPIC_*。Codexconfig.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] round1 modelYOUR_MODEL_NAME [planner.end] round1 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_URLhttps://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 \ 21 | 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_URLhttps://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 \ 21 | tee logs/iris397b_taotoken_run1.log配套的.env.example可以这样写TAOTOKEN_API_KEYYOUR_API_KEY OPENAI_BASE_URLhttps://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_sourcetaotoken_aicg_blog_endutm_contentiris35b_chat如果要把辅助开发工具也接上了解 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentiris35b_coding_plan创建和管理 Iris 评测专用 API Keyhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentiris35b_api_keys需要配置 Claude Code 时查看 Claude Code 文档https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentiris35b_claude_code_doc整体流程就是先拿 Key再把 OpenAI 兼容调用的base_url设为https://taotoken.net/api回填YOUR_API_KEY跑最小探活最后启动 Iris 35B 与 397B 评测并对照日志。这样搜索规划与答案汇总阶段的 Token 去向就能被记录、拆解和复现。