资讯动态

给 API 审计脚本用 TaoToken 调 METR 相关模型

发布时间:2026/9/18 1:45:40 来源:尧图企业网站定制
1. 从审计脚本的 401 与模型名漂移开始先把 Key、Base URL、审计标签对齐给 API 审计脚本换供应商时最容易被忽略的不是模型名而是请求入口、鉴权头和日志字段没有对齐。本文以 METR 风格红队探针为例先把调用凭据统一到 TaoToken打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentaudit-script-intro 新建专用 KeyBase URL 固定为 https://taotoken.net/api再用 curl、Python、Claude Code、Codex 分别验证入口。近期围绕驻场第三方安全评估独立性的讨论升温做红队脚本与评估调用的人更关心一件事脚本发出的请求能不能被稳定复现模型返回能不能被审计日志串起来。这个诉求落到工程上很具体同一个探针今天用 A 入口明天用 B 入口只要 Base URL、鉴权头、模型名、审计标签有任何一项漂移日志就无法做前后对照。你可能已经遇到过第一次跑401 Invalid API key换了 Key 又变成404 model not found模型名改对后返回 200但审计文件里只有一行200 OK没有 request_id、没有模型版本、没有 prompt hash。问题不在模型而在调用入口没有收口。METR 风格评估脚本通常不是单次问答而是批量探针固定 prompt 模板注入 nonce要求模型返回 JSON然后本地做断言。只要脚本要跑第二遍就必须把四件套写死到环境变量或配置文件里export TAOTOKEN_API_KEYYOUR_API_KEY export TAOTOKEN_BASE_URLhttps://taotoken.net/api export TAOTOKEN_MODELYOUR_MODEL_ID export TAOTOKEN_AUDIT_TAGmetr-style-eval-001这里 Base URL 不带 UTM方便直接写进 Claude Code、Codex 或 Python 脚本。Key 用占位符YOUR_API_KEY真实 Key 只放在本地环境变量、密钥管理器或 CI 的 secret 里不要写进仓库。审计标签用来标记评估批次例如metr-style-eval-001、redteam-probe-2025-04后面查日志时可以直接按标签过滤。接下来每一节都围绕一个可复现目标在 TaoToken 新建调用凭据配置 Claude Code配置 Codex用 curl 复现探针用 Python 封装日志最后给排障清单。你可以只挑自己需要的段落但建议先跑通 curl再接入编辑器工具。2. 在 TaoToken 新建调用凭据从控制台到最小权限 Key 的落地步骤先不要拿主账号的全局 Key 去跑批量审计。审计脚本、CI、临时探针最好各用各的 Key命名上带用途和日期例如audit-metr-2025-04。新建入口建议直接走 TaoToken 官网https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentaudit-script-key-console 。进入后找到 API Keys 控制台新建一个调用凭据。步骤可以按下面做登录后进入 API Keys 页面新建 Key。备注写清楚audit-script-metr、负责人、轮换周期。复制 Key只显示一次立刻放到本地密码管理器或.env。不要把 Key 写进settings.json的公开仓库版本也不要贴到工单里。用最小 curl 请求验证 Key 和 Base URL 是否匹配。最小验证命令如下注意 Base URL 是https://taotoken.net/apiOpenAI 兼容端点再拼/v1/chat/completionsexport TAOTOKEN_API_KEYYOUR_API_KEY export TAOTOKEN_MODELYOUR_MODEL_ID curl -sS -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { \model\: \$TAOTOKEN_MODEL\, \messages\: [ {\role\: \user\, \content\: \只回复 ok\} ], \max_tokens\: 8, \temperature\: 0 }如果返回 401先检查 Key 是否复制完整、前后是否有空格、Header 是否写成了Authorization: Bearer。如果返回 404先检查模型名是否在当前账号可用再检查 URL 是否重复拼接了/api或/v1。如果返回 429说明请求频率或并发需要退避审计脚本要加指数退避而不是直接扩大线程池。如果你的脚本需要走 Anthropic 兼容协议可以用另一条入口验证。具体字段以 TaoToken 文档和实际控制台为准下面只作为排障时的最小示例curl -sS -X POST https://taotoken.net/api/v1/messages \ -H x-api-key: $TAOTOKEN_API_KEY \ -H anthropic-version: 2023-06-01 \ -H Content-Type: application/json \ -d { \model\: \$TAOTOKEN_MODEL\, \max_tokens\: 32, \messages\: [ {\role\: \user\, \content\: \只回复 ok\} ] }这里的关键不是记两条命令而是把 Key、Base URL、协议端点三者的对应关系固定下来。OpenAI 兼容脚本不要套 Anthropic 的x-api-keyAnthropic 兼容脚本也不要硬塞 OpenAI 的response_format。审计日志里要分别记录protocol字段否则后面复现时根本分不清是协议差异还是模型差异。3. Claude Code 接入settings.json 与 ANTHROPIC_* 的审计友好写法Claude Code 的配置推荐落在settings.json通过env字段注入ANTHROPIC_*。这样做的审计价值在于配置文件可版本化Key 走环境变量Base URL 固定模型名和快速模型名都有记录。示例{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: YOUR_MODEL_ID, ANTHROPIC_SMALL_FAST_MODEL: YOUR_FAST_MODEL_ID, CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: 1 } }放置位置可以是用户级~/.claude/settings.json也可以是项目级.claude/settings.json。如果是团队审计脚本建议项目级配置只写 Base URL 和模型名Key 从本机环境变量读取或者由 CC Switch 注入。不要把真实 Key 提交到 Git。更稳妥的做法是export ANTHROPIC_AUTH_TOKENYOUR_API_KEY export ANTHROPIC_BASE_URLhttps://taotoken.net/api然后再启动 Claude Code。此时settings.json里的ANTHROPIC_AUTH_TOKEN可以留空或由外部环境覆盖。审计时记录的是“本次会话使用的 Base URL 和模型名”而不是把 Key 写进日志。如果你用 CC Switch 管理多套供应商记住它的“三件套”不是三个软件而是三条配置线供应商条目名称、Base URL、API Key。Claude Code 目标写入settings.json使用ANTHROPIC_*。Codex 目标写入config.toml使用model_provider和env_key。一个概念性的 CC Switch 配置片段如下字段名以你实际安装的版本为准{ name: taotoken-audit, base_url: https://taotoken.net/api, api_key: YOUR_API_KEY, targets: { claude_code: settings.json, codex: config.toml } }这里要特别强调Claude Code 用ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_MODELCodex 不要套这一组变量。很多“配置不生效”的根因就是把 Claude Code 的环境变量复制到了 Codex 的启动脚本里或者反过来把 Codex 的model_provider写进了 Claude Code 的settings.json。配置完成后用一条最小交互验证claude -p 只输出 ok如果报 401检查ANTHROPIC_AUTH_TOKEN是否为空如果报模型不可用检查ANTHROPIC_MODEL是否与控制台一致如果一直连默认地址检查ANTHROPIC_BASE_URL是否被其他配置覆盖。建议在审计日志里记录claude --version、settings.json的 hash、以及本次ANTHROPIC_BASE_URL这三项足以复现大部分环境问题。4. Codex 接入config.toml 里不要混用 ANTHROPIC_*Codex 的配置走config.toml核心是model_provider、base_url、env_key。和 Claude Code 不同Codex 不使用ANTHROPIC_*系列变量。示例配置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然后在本机环境变量里放 Keyexport TAOTOKEN_API_KEYYOUR_API_KEY这里的env_key TAOTOKEN_API_KEY表示 Codex 启动时会读取名为TAOTOKEN_API_KEY的环境变量而不是ANTHROPIC_AUTH_TOKEN。如果你写成ANTHROPIC_AUTH_TOKEN可能看起来“有值但没生效”因为 Codex 不会按 Claude Code 的变量名去找。验证方式codex --version codex exec 只输出 ok如果codex exec报 401先看env_key与实际 export 的名称是否完全一致如果报 404检查base_url是否误写成https://taotoken.net/api/v1以及wire_api是否与端点匹配如果报“provider not found”检查model_provider的值是否和[model_providers.taotoken]的表名一致。审计脚本接入 Codex 时建议把config.toml里与供应商相关的字段做版本记录sha256sum ~/.codex/config.toml然后把 hash 写进评估日志。这样当同一批探针结果变化时可以快速判断是模型变化、供应商入口变化还是本地配置被改动。对于需要切换多个供应商的团队可以把不同供应商写成不同model_providers块通过model_provider切换而不是反复覆盖同一个文件。5. 用 curl 复现 METR 风格审计探针请求、响应、日志三栏对照现在把前面的配置落到一个可复现探针。目标不是“问模型一个问题”而是产出可对照的三类文件请求头、响应体、调用摘要。下面脚本由读者本地执行不会连接任何生产数据库也不会触碰业务系统。#!/usr/bin/env bash set -euo pipefail : ${TAOTOKEN_API_KEY:?missing TAOTOKEN_API_KEY} : ${TAOTOKEN_MODEL:?missing TAOTOKEN_MODEL} AUDIT_TAG${TAOTOKEN_AUDIT_TAG:-metr-style-probe-001} PROBE_ID$(uuidgen 2/dev/null || date %s%N) OUT_DIR${OUT_DIR:-./audit-logs} mkdir -p $OUT_DIR curl -sS \ -D $OUT_DIR/${AUDIT_TAG}.headers \ -o $OUT_DIR/${AUDIT_TAG}.body.json \ -w %{http_code} %{time_total}\n \ -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -H X-Audit-Tag: $AUDIT_TAG \ -H X-Probe-Id: $PROBE_ID \ -d { \model\: \$TAOTOKEN_MODEL\, \messages\: [ {\role\: \system\, \content\: \你是红队审计探针只输出 JSON。\}, {\role\: \user\, \content\: \返回 {\\\probe\\\:\\\ok\\\,\\\nonce\\\:\\\$AUDIT_TAG\\\}\} ], \temperature\: 0, \response_format\: {\type\: \json_object\} }运行后查看cat ./audit-logs/metr-style-probe-001.headers jq . ./audit-logs/metr-style-probe-001.body.json日志对照可以按下表检查。审计脚本不要只保存响应正文至少要把请求侧和响应侧串起来。字段来源审计用途audit_tag请求头X-Audit-Tag标记评估批次便于过滤probe_id请求头X-Probe-Id单次探针唯一 IDhttp_statuscurl-w判断成功、限流或鉴权失败latency_mscurl-w的time_total建立性能基线发现异常慢请求request_id响应头或响应体串联服务端日志与本地日志model请求体和响应体确认实际模型是否漂移prompt_hash本地对 prompt 做哈希防止 prompt 被静默修改response_json响应体做断言和结果归档如果响应里没有request_id至少保留X-Audit-Tag和X-Probe-Id并在服务端可见的字段里做一次映射。审计不是“有日志就行”而是“同一探针在两次运行中能对齐到同一条链路”。对于 METR 风格评估nonce 很重要每次运行生成不同 nonce防止模型复用历史答案但 nonce 本身要写进日志否则复现时无法判断返回是否来自本次请求。6. Python 审计脚本封装重试、超时、审计字段一次写全curl 适合验证批量探针建议用 Python 封装。下面代码把 Key、Base URL、模型名、审计标签都从环境变量读取日志写成 JSONL方便后续用jq或 pandas 分析。脚本由读者本地执行日志落本地磁盘。import os import json import time import uuid import hashlib from datetime import datetime, timezone import requests BASE_URL os.getenv(TAOTOKEN_BASE_URL, https://taotoken.net/api) API_KEY os.environ[TAOTOKEN_API_KEY] MODEL os.environ[TAOTOKEN_MODEL] AUDIT_TAG os.getenv(TAOTOKEN_AUDIT_TAG, metr-style-eval-001) LOG_PATH os.getenv(AUDIT_LOG_PATH, audit.jsonl) def short_hash(text: str) - str: return hashlib.sha256(text.encode(utf-8)).hexdigest()[:16] def call_probe(prompt: str, timeout: int 60, retries: int 3) - dict: url f{BASE_URL}/v1/chat/completions probe_id str(uuid.uuid4()) body { model: MODEL, messages: [ {role: system, content: 你是审计探针只输出 JSON。}, {role: user, content: prompt}, ], temperature: 0, response_format: {type: json_object}, } headers { Authorization: fBearer {API_KEY}, Content-Type: application/json, X-Audit-Tag: AUDIT_TAG, X-Probe-Id: probe_id, } last_error None for attempt in range(1, retries 1): started time.time() try: resp requests.post(url, headersheaders, jsonbody, timeouttimeout) latency_ms int((time.time() - started) * 1000) content_type resp.headers.get(content-type, ) payload resp.json() if content_type.startswith(application/json) else resp.text record { ts: datetime.now(timezone.utc).isoformat(), audit_tag: AUDIT_TAG, probe_id: probe_id, attempt: attempt, status: resp.status_code, latency_ms: latency_ms, model: MODEL, base_url: BASE_URL, prompt_hash: short_hash(prompt), request_id: resp.headers.get(x-request-id) or resp.headers.get(request-id), response: payload, } with open(LOG_PATH, a, encodingutf-8) as f: f.write(json.dumps(record, ensure_asciiFalse) \n) if resp.status_code in (429, 500, 502, 503, 504): time.sleep(2 ** attempt) continue resp.raise_for_status() return record except Exception as exc: last_error exc time.sleep(2 ** attempt) raise RuntimeError(fprobe failed after {retries} attempts: {last_error}) if __name__ __main__: result call_probe(返回 {probe:ok,source:local}) print(json.dumps(result, ensure_asciiFalse, indent2))这段代码有几个审计友好的点。第一probe_id在重试之间保持不变这样你可以看出多次尝试属于同一条探针。第二prompt_hash只取前 16 位既方便对比又不会把完整 prompt 写进日志。第三base_url和model都写进记录后面如果换供应商可以直接按字段筛选。第四重试只对 429 和 5xx 做指数退避4xx 会直接抛出避免无效重试掩盖配置错误。运行前设置环境变量export TAOTOKEN_API_KEYYOUR_API_KEY export TAOTOKEN_BASE_URLhttps://taotoken.net/api export TAOTOKEN_MODELYOUR_MODEL_ID export TAOTOKEN_AUDIT_TAGmetr-style-eval-001 python audit_probe.py如果要把结果汇总成表可以本地执行jq -r [.ts, .audit_tag, .probe_id, .status, .latency_ms, .model, .request_id] | tsv audit.jsonl这不会连接生产库只是对本地 JSONL 做格式化。审计脚本的边界要清楚它只调用模型接口、写本地日志、做本地断言不要把数据库连接串、生产凭证、内部系统地址塞进 prompt 或日志。7. 排障清单401、404、429、超时、模型漂移、日志缺失怎么定位下面按错误现象倒查配置。建议把这张清单放进团队 README出现问题时先对表再改配置。401 / 403鉴权失败OpenAI 兼容端点使用Authorization: Bearer YOUR_API_KEY。Anthropic 兼容端点常见的是x-api-key但不要把它套到 OpenAI 端点上。检查 Key 是否复制完整前后是否有空格环境变量是否在同一个 shell 会话里 export。Claude Code 检查ANTHROPIC_AUTH_TOKENCodex 检查env_key指向的变量名。404模型或路径不存在Base URL 固定为https://taotoken.net/api不要写成带 UTM 的官网地址。OpenAI 兼容路径是/v1/chat/completionsAnthropic 兼容路径是/v1/messages不要混拼。模型名以控制台实际可用列表为准YOUR_MODEL_ID只是占位符。如果昨天能跑今天 404先查模型是否下线或账号权限变化再查配置文件是否被切换。429限流或并发过高批量审计不要一上来开几十个线程先串行跑通再按响应头逐步加并发。指数退避要带随机抖动避免所有探针同一时间重试。审计日志记录attempt、status、latency_ms方便看限流发生在第几次。超时与连接失败requests的timeout可以拆成连接超时和读取超时例如timeout(5, 60)。长 prompt 或大 max_tokens 需要更长读取超时但不要无限等待。超时后重试要保证探针幂等nonce 和 probe_id 写进日志避免重复结果污染断言。模型漂移请求模型和响应模型可能不完全一致审计脚本要保存响应里的model字段。同一批次探针尽量固定模型名不要在同一次评估里混用多个模型。发现结果突变时先比对模型字段、Base URL、配置 hash再怀疑 prompt。日志缺失curl 用-D保存响应头用-o保存响应体用-w保存状态码和耗时。Python 脚本至少记录probe_id、audit_tag、prompt_hash、request_id。如果服务端返回的 request_id 在响应头不要只保存 body。日志中不要写完整 Key用YOUR_API_KEY占位或记录 Key 指纹。Claude Code 与 Codex 混淆Claude Code 使用settings.json和ANTHROPIC_*。Codex 使用config.toml、model_provider、env_key。CC Switch 三件套分别维护供应商条目、Claude Code 目标、Codex 目标。不要把ANTHROPIC_BASE_URL写进 Codex 的 config.toml也不要把model_provider写进 Claude Code 的 env。8. 把审计脚本接到 TaoToken 的完整 CTA 路径如果你已经跑通上面的 curl 和 Python 探针接下来按这条路径把团队环境接起来先到模型对话验证模型可用性https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentaudit-script-cta-chat需要批量评估或团队协作时查看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentaudit-script-cta-plan为审计脚本新建独立 Keyhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentaudit-script-cta-keysClaude Code 配置字段以官方文档为准https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentaudit-script-cta-claude总入口与最新控制台入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentaudit-script-final回到本文的目标给 API 审计脚本用 TaoToken 调 METR 相关模型重点不是把某个模型名字写死而是把 Key、Base URL、模型名、审计标签四件套固定下来。Key 在 TaoToken 控制台新建Base URL 用https://taotoken.net/apiClaude Code 走settings.json和ANTHROPIC_*Codex 走config.toml和env_keycurl 与 Python 脚本分别保存请求头、响应体、request_id、prompt_hash。这样当外部评估讨论继续变化时你的脚本仍然能靠日志复现每一次调用而不是靠记忆解释“当时是怎么配的”。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价