评估方 METR 的脚本把 API 入口改到 TaoToken
2026/9/17 23:11:38 网站建设 项目流程

如果你正在维护 METR 或 Redwood Research 风格的红队评估脚本,第一件要改的通常不是提示词,而是 API 入口。把评估脚本的 Base URL 指向 TaoToken(https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=metr_eval_intro),并在新建调用凭据后统一使用 https://taotoken.net/api,能减少脚本里散落的 endpoint、key 和日志格式差异。最近关于 Anthropic 与 OpenAI 引入驻场第三方安全评估的讨论,让 METR、Redwood Research 这类独立评估方的系统访问方式再次被关注;评估机构是否足够独立可以继续讨论,但对脚本维护者来说,更实际的问题是:红队脚本里的模型调用层如何做到可替换、可审计、可复现。本文从评估脚本/API 调用方视角,给出一条从新建 Key、改 Base URL、到 curl 与调用日志对照的完整路径。你会在 TaoToken 官网完成凭据创建,然后把 Claude Code、Codex、CC Switch 以及自定义红队脚本的入口统一到同一个网关地址,最后用日志逐条定位 401、404、429。整个过程不依赖某个固定模型的私有 endpoint,而是把“评估脚本调用外部模型”这件事收敛成可维护的配置项。

1. METR 风格红队脚本的入口层:Base URL、Key 与调用日志三者对齐

METR 或 Redwood Research 风格的红队脚本,通常不会只有一个入口文件。比较常见的是:一个runner.py负责批量跑样本,一个judge.py负责对模型输出打分,一个export.py负责把对话记录落盘,另外还有一些 shell 脚本用于并发调度。问题往往出在入口层不统一:有的脚本从OPENAI_API_KEY读取 Key,有的从ANTHROPIC_API_KEY读取;有的直接写死https://api.openai.com/v1,有的用ANTHROPIC_BASE_URL;日志里只打印了模型名,却没有打印真实请求地址和 request id。评估结束后,你很难回答“这次红队测试到底调用了哪个网关、用了哪把 Key、请求有没有被限速”。

把 API 入口改到 TaoToken,建议先做一次入口层盘点。你可以把评估脚本里的模型调用相关配置分成三类:

  1. 地址类:Base URL、完整 endpoint、代理地址、超时设置。
  2. 凭据类:API Key、组织 ID、项目 ID、鉴权头名称。
  3. 模型类:模型 ID、最大输出长度、温度、top_p、系统提示词版本。

这三类里,地址类和凭据类必须统一到 TaoToken。推荐的值是:

TAOTOKEN_BASE_URL="https://taotoken.net/api" TAOTOKEN_API_KEY="YOUR_API_KEY" TAOTOKEN_MODEL="YOUR_MODEL_ID"

注意,Base URL 不加 UTM 参数,工具配置里只写https://taotoken.net/api。UTM 参数只用于官网入口和文档跳转,不参与 API 请求签名,也不应写进base_url。如果你把带 UTM 的链接误填到 SDK 的base_url,轻则路径拼接错误,重则 404。评估脚本的日志里建议显式打印:

base_url=https://taotoken.net/api endpoint=https://taotoken.net/api/v1/chat/completions model=YOUR_MODEL_ID auth=Bearer YOUR_API_KEY

不要把完整 Key 打印到公开日志里,可以只打印前 6 位和后 4 位,例如sk-abc...xyz。但在本地排障阶段,你可以先用YOUR_API_KEY占位符跑通,再替换成真实 Key。评估脚本的调用日志如果只记录模型输出,不记录请求地址和状态码,后续复盘会非常被动。尤其是红队测试经常需要重放某一条样本,如果日志里没有 request id,就很难在控制台侧定位同一次调用。

2. 在 TaoToken 新建评估专用凭据:从官网入口到 API Keys 页面

评估脚本不建议复用日常聊天或 IDE 插件的 Key。红队测试通常批量并发、输出较长、失败重试多,和交互式工具的使用模式完全不同。新建一把评估专用 Key,至少有三个好处:第一,限速或异常时可以单独停用;第二,账单和调用量更容易归因;第三,轮换 Key 时不会影响 Claude Code、Codex 等本地工具。

新建调用凭据的入口在 TaoToken 官网:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=metr_key_create 。登录后进入控制台,在 API Keys 页面创建新 Key。建议命名成能看出用途和时间的格式,例如metr-redteam-eval-localredwood-judge-script。创建完成后,你会得到一串 Key,把它替换到环境变量里的YOUR_API_KEY

export TAOTOKEN_BASE_URL="https://taotoken.net/api" export TAOTOKEN_API_KEY="YOUR_API_KEY" export TAOTOKEN_MODEL="YOUR_MODEL_ID"

如果你使用.env文件管理评估脚本配置,可以写成:

# .env.taotoken.eval TAOTOKEN_BASE_URL=https://taotoken.net/api TAOTOKEN_API_KEY=YOUR_API_KEY TAOTOKEN_MODEL=YOUR_MODEL_ID

然后在 Python 里用os.environ读取,不要硬编码到runner.py。这一点对 METR 风格脚本尤其重要,因为评估脚本经常会被复制到不同机器或容器里运行。硬编码 Key 不仅难以轮换,还容易在共享日志、错误堆栈、版本控制里泄露。评估专用 Key 也不建议给所有子脚本使用同一把。更细的做法是:runner.py用一把 Key,judge.py用另一把 Key,这样当 judge 出现大量 429 时,不会影响 runner 的采样任务。

在控制台里新建 Key 后,建议立刻做一次最小 curl 验证,不要等到跑完整红队任务再发现鉴权问题。最小验证请求只需要一条 system 消息和一条 user 消息,温度设为 0,便于复现。你可以把响应和 HTTP 状态码一起保存到本地文件,作为后续日志对照的基线。

3. 把硬编码端点改成环境变量:curl 与 Python 的最小可复现片段

评估脚本改造的第一步,是把所有硬编码 endpoint 替换成环境变量。下面这段 curl 命令可以直接复制到本地终端执行。它显式使用TAOTOKEN_BASE_URL,并在后面拼接/v1/chat/completions。如果你的评估脚本原来写的是 OpenAI 兼容调用,这种改造成本最低。

export TAOTOKEN_BASE_URL="https://taotoken.net/api" export TAOTOKEN_API_KEY="YOUR_API_KEY" export TAOTOKEN_MODEL="YOUR_MODEL_ID" curl -sS "${TAOTOKEN_BASE_URL}/v1/chat/completions" \ -H "Authorization: Bearer ${TAOTOKEN_API_KEY}" \ -H "Content-Type: application/json" \ -d "{ \"model\": \"${TAOTOKEN_MODEL}\", \"messages\": [ {\"role\": \"system\", \"content\": \"You are a defensive red-team evaluator. Only produce safety test checklists.\"}, {\"role\": \"user\", \"content\": \"给出三条对模型越狱风险的防御性测试建议,并说明每条建议的预期日志字段。\"} ], \"temperature\": 0 }" | tee /tmp/metr_eval_response.json

这段命令的价值在于:它不依赖任何 IDE 插件,也不依赖某个模型的私有 SDK。只要 Base URL 和 Key 正确,你就能在终端里看到原始 HTTP 响应。接下来把同一套配置迁移到 Python。下面是一个最小调用片段,适用于 OpenAI 兼容 SDK:

import os from openai import OpenAI client = OpenAI( api_key=os.environ["TAOTOKEN_API_KEY"], base_url=os.environ.get("TAOTOKEN_BASE_URL", "https://taotoken.net/api"), timeout=60.0, ) resp = client.chat.completions.create( model=os.environ.get("TAOTOKEN_MODEL", "YOUR_MODEL_ID"), messages=[ {"role": "system", "content": "You are a METR-style defensive red-team evaluator."}, {"role": "user", "content": "输出三条对模型越狱风险的防御性测试建议。"}, ], temperature=0, ) print(resp.choices[0].message.content)

如果你原来的脚本使用requests而不是 OpenAI SDK,也可以直接构造 URL:

import os import requests base_url = os.environ.get("TAOTOKEN_BASE_URL", "https://taotoken.net/api") api_key = os.environ["TAOTOKEN_API_KEY"] model = os.environ.get("TAOTOKEN_MODEL", "YOUR_MODEL_ID") url = f"{base_url}/v1/chat/completions" headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json", } payload = { "model": model, "messages": [ {"role": "system", "content": "You are a defensive red-team evaluator."}, {"role": "user", "content": "生成一条防御性评估记录模板。"}, ], "temperature": 0, } resp = requests.post(url, headers=headers, json=payload, timeout=60) resp.raise_for_status() print(resp.json()["choices"][0]["message"]["content"])

改造时要注意:不要只改runner.py,还要检查judge.pyscorer.pybatch_runner.shdocker-compose.ymlk8s job yaml里的模型配置。很多评估脚本的 Key 并不是在 Python 文件里写死的,而是在 CI/CD 变量、容器环境变量、甚至 Jupyter Notebook 的第一个 cell 里。统一改到 TaoToken 后,建议把TAOTOKEN_BASE_URLTAOTOKEN_API_KEYTAOTOKEN_MODEL作为必填环境变量,并在脚本启动时做一次 fail-fast 检查:

required = ["TAOTOKEN_BASE_URL", "TAOTOKEN_API_KEY", "TAOTOKEN_MODEL"] missing = [name for name in required if not os.environ.get(name)] if missing: raise RuntimeError(f"missing env: {', '.join(missing)}")

这样做的好处是,脚本不会跑到一半才因为 Key 缺失而失败。红队评估通常批量任务多,失败重试成本高,入口层校验越早越好。

4. Claude Code、Codex 与 CC Switch 三件套:变量名、配置文件不要混用

评估脚本之外,很多工程师还会用 Claude Code、Codex 或 CC Switch 辅助查看代码、生成测试用例、整理调用日志。这些工具的配置方式和评估脚本不同,最容易犯的错误是把ANTHROPIC_*变量套到 Codex 上。Claude Code 使用settings.jsonANTHROPIC_*环境变量;Codex 使用config.toml和模型供应商配置。两者不能混用。

Claude Code 的settings.json可以这样配置。路径通常是~/.claude/settings.json,你也可以根据本机安装方式调整。

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

如果你使用 shell 环境变量启动 Claude Code,也可以写成:

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

Codex 则使用config.toml。不要把ANTHROPIC_BASE_URLANTHROPIC_AUTH_TOKEN写进 Codex 配置,否则工具会读取不到正确的供应商信息。一个可参考的 Codex 配置如下:

model = "YOUR_MODEL_ID" 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"

CC Switch 这类配置切换工具,建议维护三件套:Claude Code 配置、Codex 配置、通用 OpenAI-compatible 配置。三件套的 Base URL 都指向https://taotoken.net/api,但变量名和配置文件格式各自独立。下面是一个结构示意:

{ "claudeCode": { "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "YOUR_MODEL_ID" } }, "codex": { "model": "YOUR_MODEL_ID", "model_provider": "taotoken", "model_providers": { "taotoken": { "name": "TaoToken", "base_url": "https://taotoken.net/api", "env_key": "TAOTOKEN_API_KEY", "wire_api": "chat" } } }, "openaiCompatible": { "baseUrl": "https://taotoken.net/api", "apiKey": "YOUR_API_KEY", "model": "YOUR_MODEL_ID" } }

这样做的好处是,切换工具时不会把 Claude Code 的变量带到 Codex,也不会把 Codex 的model_provider配置误填到 Claude Code。红队评估脚本如果需要同时调用多个模型,也可以借助 CC Switch 把不同工具配置分开管理,但脚本本身仍然只认TAOTOKEN_BASE_URLTAOTOKEN_API_KEYTAOTOKEN_MODEL这三个入口变量。

5. 调用日志逐行对照:401、404、429 在评估脚本里的定位顺序

当评估脚本从原来的 API 入口改到 TaoToken 后,最常见的报错是 401、404、429。不要一上来就改代码,先看日志。下面给出三种日志对照。你可以把 curl 的-v输出,或者 Python 的requests日志级别调到 DEBUG,然后逐行比对。

正常调用日志应该长这样:

[10:21:03] POST /v1/chat/completions [10:21:03] host=taotoken.net [10:21:03] base=https://taotoken.net/api [10:21:03] auth=Bearer YOUR_API_KEY [10:21:03] model=YOUR_MODEL_ID [10:21:04] HTTP/1.1 200 OK [10:21:04] x-request-id: req_metr_eval_001 [10:21:04] content-type: application/json

关键字段有三个:base必须是https://taotoken.net/apiauth使用 Bearer 形式;x-request-id用于在控制台或工单里定位同一次请求。评估脚本建议把这三个字段写入本地运行日志,但不要记录完整 Key。

401 日志通常表示 Key 无效、缺失或格式不对:

[10:22:10] POST https://taotoken.net/api/v1/chat/completions [10:22:10] HTTP/1.1 401 Unauthorized [10:22:10] body={"error":{"message":"invalid api key","type":"invalid_request_error"}} [10:22:10] hint=检查 TAOTOKEN_API_KEY 是否来自 TaoToken 控制台,是否完整,是否带多余空格

排查顺序:

  1. 确认 Key 是在 TaoToken 官网新建的,而不是其他平台的 Key。
  2. 确认环境变量没有换行、空格、引号嵌套错误。
  3. 确认请求头是Authorization: Bearer YOUR_API_KEY,不是x-api-key或其他自定义头。
  4. 如果脚本从.env读取,确认加载顺序没有覆盖。

404 日志通常表示路径拼接错误:

[10:23:20] POST https://taotoken.net/api/chat/completions [10:23:20] HTTP/1.1 404 Not Found [10:23:20] body={"error":{"message":"unknown endpoint"}} [10:23:20] hint=检查 base_url 与 endpoint 拼接,Base URL 应为 https://taotoken.net/api

排查顺序:

  1. 确认base_url没有多写/v1或少写/v1,取决于你的 SDK 是否自动拼接。
  2. curl 命令里显式写${TAOTOKEN_BASE_URL}/v1/chat/completions
  3. OpenAI SDK 的base_urlhttps://taotoken.net/api,由 SDK 拼接对话端点。
  4. 不要把带 UTM 参数的官网链接填进base_url

429 日志表示限速或配额触发:

[10:24:30] POST https://taotoken.net/api/v1/chat/completions [10:24:30] HTTP/1.1 429 Too Many Requests [10:24:30] body={"error":{"message":"rate limit exceeded","type":"rate_limit_error"}} [10:24:30] hint=降低并发,增加指数退避,区分 token 限速与请求数限速

排查顺序:

  1. 评估脚本是否开了过高的并发,例如一次性拉起几十个runner.py
  2. 是否对失败请求立即重试,导致雪崩。
  3. 是否 runner 和 judge 共用同一把 Key,互相抢占限额。
  4. 是否未设置超时,导致连接堆积。

对红队评估脚本来说,建议默认加入指数退避和随机抖动:

import random import time def backoff(attempt: int) -> None: base = min(2 ** attempt, 30) sleep = base + random.uniform(0, 1) time.sleep(sleep)

在日志里记录attemptsleeprequest_id,复盘时就能看出是限速还是脚本逻辑问题。排障时也可以先回到官网入口确认 Key 状态和可用模型:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=metr_troubleshoot 。如果控制台里看到 Key 被停用或模型不可用,先处理控制台侧,再改脚本。

6. 评估闭环收尾:模型对话、Coding Plan、创建 Key 与 Claude Code 文档

把 METR 风格红队脚本的 API 入口改到 TaoToken,不是为了替换某一次模型调用,而是为了让评估调用层变得可复用。你可以把这套配置沉淀成团队内部的评估模板:.env.taotoken.eval管环境变量,taotoken_client.py管客户端初始化,run_log.jsonl管请求日志,metrics.py管成功率和延迟统计。这样下一次红队评估换模型、换脚本、换并发策略时,只需要改TAOTOKEN_MODEL和并发参数,不需要再翻遍所有文件找 endpoint。

如果你还没有创建评估专用 Key,可以先去控制台完成创建;如果你只是想先验证调用是否通,可以用模型对话页面做一次最小请求;如果评估脚本需要长期批量运行,可以了解 Coding Plan 的额度与调用方式;如果你同时使用 Claude Code 查看评估代码,记得按 Claude Code 文档配置settings.jsonANTHROPIC_*变量。

文末按推荐路径给出入口:

  1. 模型对话:https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=metr_chat
  2. Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=metr_coding_plan
  3. 创建 Key:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=metr_api_keys
  4. Claude Code 文档:https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=metr_claude_code_doc

最后再强调一次配置边界:评估脚本和 OpenAI-compatible 工具使用https://taotoken.net/api作为 Base URL,Key 使用YOUR_API_KEY占位后替换成控制台新建的凭据;Claude Code 使用settings.jsonANTHROPIC_*;Codex 使用config.toml[model_providers.taotoken];CC Switch 三件套各自独立维护。只要入口层统一,METR、Redwood Research 风格的红队脚本就能把更多精力放在评估样本、评分逻辑和日志审计上,而不是反复处理 API 地址、Key 轮换和环境差异。

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

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

立即咨询