成绩领先的 Iris,Search Agent 调用改 TaoToken 入口
2026/9/18 10:35:30 网站建设 项目流程

1. Iris 本地评测前:TaoToken 入口与 Token 消耗点定位

TaoToken(https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=iris_eval_intro)是这篇 Iris 本地评测的 API 入口。很多人在本地跑 AllSpark 开源的 Search Agent 模型 Iris 时,第一反应是检查 35B 还是 397B 权重有没有正确加载,但更常见的报错来自评测脚本里的 OpenAI 兼容 client:OPENAI_BASE_URL还是旧地址,或者 shell 里残留了一个空 Key,结果搜索规划第一次请求就 401。Iris 的权重和评测代码已经公开,35B 与 397B 两个规模都适合拿来做 Search Agent 复现;真正持续消耗 Token 的环节,通常不是本地检索库读取,而是搜索规划阶段的 query 重写、证据筛选,以及最终答案汇总时的 API 调用。先把入口切到 TaoToken,拿到 Key 后把base_url统一设成https://taotoken.net/api,再去跑评测命令,日志里就能清楚看到每次请求的延迟和 token 用量。

本文按一条可复现路径展开:从 TaoToken 官网拿 Key,到改 Iris 评测脚本里的 OpenAI 兼容配置,再到 Claude Code、Codex、CC Switch 的分工具配置,最后用评测日志核对 401、404、429 这类常见错误。注意,Claude Code 使用ANTHROPIC_*,Codex 使用config.tomlmodel_providers,两套变量不要互相复制,尤其不要把ANTHROPIC_AUTH_TOKEN写进 Codex 配置里。

Iris 这类 Search Agent 的评测链路一般可以拆成五段:

  1. 读取问题集,例如questions.json
  2. 搜索规划器把原始问题改写成多条检索 query;
  3. 本地或远程检索器返回证据片段;
  4. 证据压缩与筛选,去掉低相关段落;
  5. 答案汇总器根据证据生成最终答案,随后由评测器打分。

其中第 2 步和第 5 步最容易产生 API 调用,也是你替换供应商时要重点检查的位置。如果你的评测脚本里把检索器写在本地,那么检索本身不经过外部 API;但只要它调用 OpenAI 兼容接口做规划或汇总,就需要一个稳定的入口。TaoToken 的 Base URL 是:

https://taotoken.net/api

这个地址在工具配置里不加 UTM,Key 用占位符YOUR_API_KEY。先不要急着改全部代码,先用最小请求确认入口、Key、模型名三者都能通。最小验证通过后,再把 Iris 评测脚本里的 client 初始化替换掉。

2. 在 TaoToken 官网创建 Key 并做最小兼容性验证

第一步是到 TaoToken 官网完成注册或登录。入口在这里:

https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=iris_eval_key_page

进入控制台后创建 API Key,创建页在这里:

https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=iris_eval_api_keys

复制出来的 Key 不要直接写进 Git 仓库,先用环境变量保存。本文所有示例都使用YOUR_API_KEY作为占位符,你回填自己的 Key 即可。

先做 curl 验证。下面的命令用于确认/chat/completions能不能正常返回:

export TAOTOKEN_API_KEY="YOUR_API_KEY" curl -sS https://taotoken.net/api/chat/completions \ -H "Authorization: Bearer ${TAOTOKEN_API_KEY}" \ -H "Content-Type: application/json" \ -d '{ "model": "YOUR_MODEL", "messages": [ { "role": "user", "content": "只回答 OK" } ], "temperature": 0 }'

这里的YOUR_MODEL不要凭记忆填,按 TaoToken 控制台或模型列表里实际可用的模型名填写。Base URL 已经写成https://taotoken.net/api,不要在后面手写/v1,也不要在代码块里加 UTM 参数。工具配置只认干净的 API 地址。

如果 curl 返回 401,优先检查三个点:

  • Bearer和 Key 之间是否只有一个空格;
  • Key 是否复制完整,前后有没有换行;
  • shell 里是否还存在旧的OPENAI_API_KEY覆盖了新 Key。

如果返回 404,通常是模型名写错,或者 Base URL 被改成了不存在的路径。如果返回 429,说明请求频率或并发超过了当前限制,先把并发降下来,并在评测脚本里加指数退避。

再用 Python SDK 做一次验证。下面的代码使用 OpenAI 兼容方式初始化 client:

import os from openai import OpenAI client = OpenAI( api_key=os.environ["TAOTOKEN_API_KEY"], base_url="https://taotoken.net/api", ) resp = client.chat.completions.create( model=os.getenv("TAOTOKEN_MODEL", "YOUR_MODEL"), messages=[ {"role": "user", "content": "返回 OK"} ], temperature=0, ) print(resp.choices[0].message.content) if resp.usage: print("prompt_tokens:", resp.usage.prompt_tokens) print("completion_tokens:", resp.usage.completion_tokens)

运行前补上环境变量:

export TAOTOKEN_API_KEY="YOUR_API_KEY" export TAOTOKEN_MODEL="YOUR_MODEL" python check_taotoken.py

只要能稳定打印出 OK 和 token 用量,就说明入口可用。接下来才进入 Iris 评测脚本的改造。

3. 把 Iris 评测脚本的 base_url 切到 TaoToken

假设你的 Iris 评测目录里有一个eval_search_agent.py,或者你把评测命令封装成了类似脚本。无论文件名是什么,核心都是找到所有 OpenAI 兼容 client 的初始化位置。常见写法有三种:

  1. 直接在代码里写OpenAI(api_key="...", base_url="...")
  2. .env读取OPENAI_BASE_URL
  3. 通过命令行参数传入--base-url

推荐统一改成环境变量加默认值的方式。下面给出一段可运行的评测骨架,重点展示搜索规划和答案汇总两个消耗 Token 的环节:

import argparse import json import os import time from pathlib import Path from openai import OpenAI BASE_URL = os.getenv("OPENAI_BASE_URL", "https://taotoken.net/api") API_KEY = os.getenv("TAOTOKEN_API_KEY", "YOUR_API_KEY") MODEL = os.getenv("TAOTOKEN_MODEL", "YOUR_MODEL") client = OpenAI( api_key=API_KEY, base_url=BASE_URL, ) def chat(messages, temperature=0.0): start = time.time() resp = client.chat.completions.create( model=MODEL, messages=messages, temperature=temperature, ) latency = time.time() - start usage = resp.usage print(json.dumps({ "provider": "taotoken", "base_url": BASE_URL, "model": MODEL, "latency_sec": round(latency, 3), "prompt_tokens": usage.prompt_tokens if usage else None, "completion_tokens": usage.completion_tokens if usage else None, }, ensure_ascii=False)) return resp.choices[0].message.content def plan_queries(question): prompt = f"""你是 Search Agent 的搜索规划器。 针对用户问题生成 3 条检索 query,每行一条,不要编号,不要解释。 用户问题:{question}""" text = chat( [{"role": "user", "content": prompt}], temperature=0.0, ) queries = [x.strip() for x in text.splitlines() if x.strip()] return queries[:3] def summarize_answer(question, evidences): context = "\n\n".join( f"[{i + 1}] {e}" for i, e in enumerate(evidences[:8]) ) prompt = f"""你是 Search Agent 的答案汇总器。 请只根据给定证据回答用户问题。证据不足时明确说“证据不足”。 用户问题:{question} 证据: {context} 答案:""" return chat( [{"role": "user", "content": prompt}], temperature=0.2, ) def main(): parser = argparse.ArgumentParser() parser.add_argument("--questions", required=True) parser.add_argument("--out", default="iris_eval_logs.jsonl") args = parser.parse_args() questions = json.loads( Path(args.questions).read_text(encoding="utf-8") ) with open(args.out, "w", encoding="utf-8") as f: for question in questions: queries = plan_queries(question) # 这里请替换成你自己的本地检索器或远程检索器。 # 本地检索不经过 API,因此不会消耗 TaoToken Token。 evidences = [ f"本地检索占位证据 {i + 1}:{question}" for i in range(3) ] answer = summarize_answer(question, evidences) row = { "question": question, "queries": queries, "answer": answer, } f.write(json.dumps(row, ensure_ascii=False) + "\n") print(json.dumps(row, ensure_ascii=False)) if __name__ == "__main__": main()

这段代码没有把检索器写死,因为 Iris 评测里检索部分可能来自本地索引、文件库或你自己的搜索服务。你只需要确认:搜索规划和答案汇总两个函数最终都走OpenAI(base_url="https://taotoken.net/api")

运行命令如下:

export TAOTOKEN_API_KEY="YOUR_API_KEY" export OPENAI_BASE_URL="https://taotoken.net/api" export TAOTOKEN_MODEL="YOUR_MODEL" python eval_search_agent.py \ --questions questions.json \ --out iris_eval_logs.jsonl

如果你之前已经在.env里写过旧地址,要确认加载顺序。一般建议只保留一个事实来源:要么全部用 shell 环境变量,要么全部用.env,不要在settings.jsonconfig.toml.env和当前 shell 里同时维护不同值。

4. Claude Code 配置:settings.json 与 ANTHROPIC_* 的正确写法

Claude Code 的配置和 Codex 完全不同。Claude Code 使用ANTHROPIC_*系列变量,常见做法是写入~/.claude/settings.json,或者通过 shell 环境变量注入。先到 TaoToken 官网确认入口:

https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=iris_eval_claude_code

然后在settings.json中写:

{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "YOUR_MODEL" } }

如果你更习惯用 shell,也可以这样临时验证:

export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_AUTH_TOKEN="YOUR_API_KEY" export ANTHROPIC_MODEL="YOUR_MODEL" claude

进入 Claude Code 后,可以先让它做一个最小文件读取任务,观察终端是否出现认证错误。如果出现 401,优先检查ANTHROPIC_AUTH_TOKEN是否等于YOUR_API_KEY的回填值,不要误填成ANTHROPIC_API_KEY。如果出现 404,检查ANTHROPIC_MODEL是否在当前入口可用。Claude Code 的详细参数可以看官方文档,文末会给出带 UTM 的 deep link。

这里再强调一次:ANTHROPIC_*是给 Claude Code 用的,不要把这组变量复制到 Codex 的config.toml里。很多配置错乱都来自“把 A 工具的变量拿给 B 工具用”。

5. Codex 配置:config.toml 与别混用 ANTHROPIC_*

Codex 使用~/.codex/config.toml,它依赖的是 model provider 配置,不是ANTHROPIC_*。一个可复制的写法如下:

model = "YOUR_MODEL" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "chat"

然后设置环境变量:

export TAOTOKEN_API_KEY="YOUR_API_KEY"

如果你的 Codex 版本要求使用OPENAI_API_KEY,也可以把env_key改成:

env_key = "OPENAI_API_KEY"

但不要写成env_key = "ANTHROPIC_AUTH_TOKEN"。Codex 的 provider 名称必须和model_provider对应,例如上面写的是model_provider = "taotoken",下面就必须有[model_providers.taotoken],名字不一致时会提示找不到 provider。

验证配置是否生效:

codex --model YOUR_MODEL

进入后让它解释一个本地文件,观察是否正常返回。如果失败,按以下顺序排查:

  1. ~/.codex/config.toml是否在正确位置;
  2. TAOTOKEN_API_KEY是否在当前 shell 可见;
  3. base_url是否误写成了带 UTM 的地址;
  4. model是否在 TaoToken 入口可用;
  5. wire_api是否与当前 Codex 版本匹配。

如果要把 Codex 和 Claude Code 放在同一台机器上使用,建议把 Key 放在不同的环境变量名里:Claude Code 用ANTHROPIC_AUTH_TOKEN,Codex 用TAOTOKEN_API_KEY。这样排查 401 时不会互相干扰。

6. CC Switch 三件套:Provider、Key、Model 的切换清单

如果你使用 CC Switch 管理多个工具配置,可以把接入 TaoToken 的过程理解成三件套:Provider、Key、Model。

  • Provider:新增一个供应商,名称可以是TaoToken
  • Key:填入YOUR_API_KEY
  • Model:按 TaoToken 平台当前可用的模型名填写。

界面字段可以这样对应:

Provider Name: TaoToken Base URL: https://taotoken.net/api API Key: YOUR_API_KEY Model: YOUR_MODEL

如果 CC Switch 支持配置文件导入,可以用类似下面的结构表达:

{ "providers": [ { "name": "TaoToken", "base_url": "https://taotoken.net/api", "api_key": "YOUR_API_KEY", "model": "YOUR_MODEL" } ] }

切换完成后,建议重启终端或重新加载 shell,避免旧环境变量残留。可以用下面的命令查看当前生效的变量:

env | grep -E "ANTHROPIC|OPENAI|TAOTOKEN"

如果同时看到旧的OPENAI_BASE_URL和新的TAOTOKEN_API_KEY,就要确认你的评测脚本到底读取哪一个。CC Switch 的优势是切换方便,但风险也在这里:切到 Codex 时不要带着 Claude Code 的ANTHROPIC_*,切到 Claude Code 时也不要依赖 Codex 的config.toml

7. 运行 Iris 评测与日志对照:401/404/429 排查

配置完成后,跑一次完整评测:

export TAOTOKEN_API_KEY="YOUR_API_KEY" export OPENAI_BASE_URL="https://taotoken.net/api" export TAOTOKEN_MODEL="YOUR_MODEL" python eval_search_agent.py \ --questions questions.json \ --out iris_eval_logs.jsonl 2>&1 | tee iris_eval.log

然后检查日志:

grep -E "provider|base_url|latency_sec|prompt_tokens|401|404|429" iris_eval.log

理想情况下,你会看到类似输出:

{"provider": "taotoken", "base_url": "https://taotoken.net/api", "model": "YOUR_MODEL", "latency_sec": 1.234, "prompt_tokens": 812, "completion_tokens": 96}

如果日志里出现旧域名,说明某个配置文件还在覆盖当前环境。重点检查.envsettings.jsonconfig.toml和 shell 启动脚本。如果出现 401,检查 Key 是否回填、是否过期、是否含有空格。如果出现 404,检查模型名和 Base URL,尤其确认没有多写/v1。如果出现 429,降低并发,并在代码中增加重试:

import time from openai import RateLimitError def chat_with_retry(messages, max_retries=5): for attempt in range(max_retries): try: return chat(messages) except RateLimitError: wait = 2 ** attempt print(f"rate limited, wait {wait}s") time.sleep(wait) raise RuntimeError("chat retries exhausted")

如果出现超时,先缩短证据片段长度,再降低单次请求的max_tokens。Search Agent 的答案汇总经常因为证据太长导致响应慢,控制上下文比反复重试更有效。

对于 Iris 35B 与 397B 的本地评测,建议把运行记录写成 JSONL,至少包含:

{ "run_id": "iris-eval-local-001", "model_scale": "35B", "provider": "taotoken", "base_url": "https://taotoken.net/api", "planner_tokens": 1234, "summarizer_tokens": 5678, "question_count": 100, "retriever_version": "local-index-v1", "log_file": "iris_eval.log" }

这样下次换模型、换检索器、换并发参数时,可以直接对比 token 消耗和延迟,而不是凭感觉判断。

8. 把评测结果沉淀为可复现实验记录

本地评测最怕的不是一次报错,而是跑完之后说不清“当时到底用了什么配置”。建议在项目里固定一个runs/目录,每次评测生成独立子目录:

runs/ └── iris-eval-local-001/ ├── config.snapshot.json ├── questions.json ├── iris_eval_logs.jsonl ├── iris_eval.log └── summary.json

config.snapshot.json可以记录:

{ "provider": "taotoken", "base_url": "https://taotoken.net/api", "model": "YOUR_MODEL", "temperature_planner": 0.0, "temperature_summarizer": 0.2, "max_evidence": 8, "concurrency": 1 }

不要记录完整 Key,只记录“已设置”或 Key 的后四位。运行命令也建议写入run.sh

#!/usr/bin/env bash set -euo pipefail export TAOTOKEN_API_KEY="YOUR_API_KEY" export OPENAI_BASE_URL="https://taotoken.net/api" export TAOTOKEN_MODEL="YOUR_MODEL" python eval_search_agent.py \ --questions questions.json \ --out runs/iris-eval-local-001/iris_eval_logs.jsonl

这样你每次只需要替换 Key 和模型名,其他参数保持一致。对于 35B 与 397B 两个规模,可以复制两份run.sh或通过参数区分,但 Base URL 和 Key 来源保持一致。

9. 文末 CTA:模型对话、Coding Plan、创建 Key、Claude Code 文档

如果你还没有创建 Key,建议先走模型对话确认入口连通:

https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=iris_eval_chat

需要固定额度做批量 Iris 评测时,可以查看 Coding Plan:

https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=iris_eval_coding_plan

创建 API Key 的入口在这里:

https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=iris_eval_api_keys

Claude Code 的详细配置看这里:

https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=iris_eval_claude_doc

最后记住两个固定值:OpenAI 兼容调用的 Base URL 是https://taotoken.net/api,Key 占位符是YOUR_API_KEY。先把最小请求跑通,再改 Iris 评测脚本里的搜索规划与答案汇总,最后对照日志确认每次请求都命中 TaoToken 入口。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询