1. 当 settings.json 里的校验通道开始告警:先把写入前校验拆出来
当你用 Claude Code 跑长期记忆写入任务时,如果settings.json里的ANTHROPIC_BASE_URL同时承担生成与校验,最常见的现象是 429、校验 Token 不可归因、日志串通道。把校验通道单独切到 TaoToken(https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=memory_curation_intro),Base URL 用 https://taotoken.net/api,是本文要复现的动作。
这篇内容围绕一个具体工程问题展开:长期运行的智能体在把经验写入持久记忆之前,如何先经过一个只读环境的独立记忆智能体做校验。相关论文把这类流程称为 environment-probing curation,并在 CLBench 上报告了通过率从 39% 提升到 73% 的区间。我们不把这件事写成论文摘要,而是把它落到可接入、可排障、可记录 Token 的配置层面:生成通道继续用你原有的模型,校验通道切到 TaoToken,然后用本地 CLBench 子集输出通过率与 Token 消耗对照。
为什么需要独立校验通道?因为“写入前校验”不是一次普通推理,它至少包含三类调用:候选记忆生成、只读环境探测、正确性与可复用性评分。三类调用的提示词长度、输出格式、重试策略、超时阈值都不一样。如果它们和主执行体共用同一把 Key、同一个 Base URL、同一套并发限制,一旦校验侧开始重试,主任务就会被 429 打断;反过来,主任务的长上下文也会把校验侧的 Token 账单搅在一起。把校验侧切到 TaoToken 的独立通道,既能隔离限流,也能单独统计“校验智能体消耗了多少 Token”。
先给结论:你需要准备三件事。第一,去 TaoToken 官网拿一把独立 Key,链接是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=memory_curation_key ,Key 占位符统一用YOUR_API_KEY。第二,Claude Code 用settings.json和ANTHROPIC_*环境变量;Codex 用config.toml,不要混用ANTHROPIC_*。第三,CC Switch 三件套要把“供应商、凭证、模型映射”拆开,校验模型和生成模型可以在同一个 Base URL 下用不同模型名。下面按“流程拆解 → 配置切换 → 可复现实验 → 排障 → CTA”推进。
2. 环境探测式记忆校验:谁在读、谁在写、谁在审
把长期运行智能体的记忆写入想象成一条流水线。执行智能体在任务中产生大量交互轨迹,它不会把所有内容都写进持久记忆,而是先提出“候选记忆”。候选记忆可能是一条规则、一段工具调用经验、一个失败恢复策略,或者某个环境的配置约束。问题在于,执行智能体自己往往带着上下文偏见:它认为正确的经验,可能只在当前会话成立;它认为可复用的策略,可能依赖一个临时变量。
环境探测式记忆校验把这条流水线拆成三个角色:
- 执行智能体(writer):产生候选记忆。它读任务上下文、工具返回、错误日志,输出结构化的候选记忆条目。
- 只读环境探针(probe):只读访问环境。它可以查文件、读配置、跑只读命令、取快照,但不能修改环境。探针的作用是给校验智能体提供“事实依据”。
- 独立记忆智能体(curator):在写入前做校验。它根据探针返回的事实,判断候选记忆是否正确、是否可复用,然后决定写入、拒绝或要求重写。
这个拆分的关键是“写入前”。不是先写进持久记忆,等以后发现错了再删除;而是在写之前就挡住错误。论文报告 CLBench 通过率从 39% 到 73%,说明写入前校验对长期任务的成功率影响很大。但工程上随之而来的是一个成本问题:校验智能体自己要消耗 Token,探针调用也要消耗 Token,重试还会放大消耗。如果校验通道和生成通道混在一起,你很难回答“通过率提升的代价是多少”。
所以本文的视角槽是:写入前校验智能体消耗 Token。我们要把校验通道切到 TaoToken,让校验侧的 Token 可以单独计量,然后输出一张对照表:切换前通过率与 Token、切换后通过率与 Token。你不需要把生产库接给智能体,探针只读本地 fixture 或只读快照即可;所有命令由读者本地执行,SQL 也在本地跑。
先定义一个最小可复现的校验流程:
# 伪代码:写入前校验的最小闭环 # 所有调用都走 TaoToken 校验通道 # Base URL: https://taotoken.net/api # Key: YOUR_API_KEY from dataclasses import dataclass from typing import Literal @dataclass class CandidateMemory: content: str source_task: str env_scope: str @dataclass class ProbeResult: facts: list[str] readonly: bool = True def writer_propose(task_log: str) -> CandidateMemory: """执行智能体提出候选记忆。实际调用可走生成通道。""" ... def probe_readonly_env(candidate: CandidateMemory) -> ProbeResult: """只读探针:读本地 fixture、配置快照、日志切片。不连生产库。""" ... def curator_validate(candidate: CandidateMemory, probe: ProbeResult) -> dict: """独立记忆智能体校验:正确性 + 可复用性。走 TaoToken 校验通道。""" ... return { "decision": "accept", # accept / reject / rewrite "correctness_score": 0.0, "reusability_score": 0.0, "reason": "" }这段伪代码里,curator_validate是 Token 消耗重点。它要读候选记忆、探针事实、校验模板,输出结构化 JSON。如果输出不强制 JSON,模型可能写一大段解释,Token 直接飙升。配置 TaoToken 通道时,建议在校验侧单独设置max_tokens、temperature=0、response_format,并记录usage.prompt_tokens与usage.completion_tokens。
3. TaoToken 通道切换:Claude Code、Codex、CC Switch 三件套配置
这一节是可直接复制的配置。核心原则只有一条:校验通道单独走 TaoToken,生成通道可以保持不变。TaoToken 的 Base URL 是 https://taotoken.net/api,不要在后面拼 UTM。Key 从官网获取,链接 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=memory_curation_config ,占位符用YOUR_API_KEY。
3.1 Claude Code:settings.json 与 ANTHROPIC_*
Claude Code 读取settings.json中的env字段。把校验通道指向 TaoToken 时,不要动你原来的生成配置,而是新增一个校验专用的 profile 或环境变量前缀。最简做法是在settings.json里写:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "YOUR_CURATOR_MODEL_ID", "ANTHROPIC_SMALL_FAST_MODEL": "YOUR_FAST_MODEL_ID", "ANTHROPIC_MAX_TOKENS": "1024", "ANTHROPIC_TEMPERATURE": "0" } }如果你的 Claude Code 同时要跑生成和校验,建议用两个终端会话或两个配置目录:一个会话的ANTHROPIC_BASE_URL指向原生成通道,另一个会话的ANTHROPIC_BASE_URL指向https://taotoken.net/api,专门跑 curator。不要在同一进程里交替覆盖ANTHROPIC_AUTH_TOKEN,否则日志会串。
如果你只想让校验侧走 TaoToken,而生成侧继续用原供应商,可以在校验脚本里显式设置环境变量:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_AUTH_TOKEN="YOUR_API_KEY" export ANTHROPIC_MODEL="YOUR_CURATOR_MODEL_ID"然后运行校验入口。注意:Claude Code 的配置使用ANTHROPIC_*,这套变量不要套到 Codex 上。
3.2 Codex:config.toml 独立 provider
Codex 使用config.toml,不是ANTHROPIC_*。你要在~/.codex/config.toml中增加一个 provider,把校验模型指向 TaoToken:
model = "YOUR_CURATOR_MODEL_ID" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "responses"然后在 shell 里设置:
export TAOTOKEN_API_KEY="YOUR_API_KEY"如果 Codex 的版本使用chat而不是responses,按你本地版本调整wire_api。关键是base_url保持https://taotoken.net/api,env_key指向独立的TAOTOKEN_API_KEY。不要写ANTHROPIC_AUTH_TOKEN,也不要写ANTHROPIC_BASE_URL。
3.3 CC Switch 三件套:供应商、凭证、模型映射
CC Switch 的作用是快速切换不同供应商配置。所谓三件套,可以拆成:
| 项 | 作用 | 示例值 |
|---|---|---|
| 供应商 | 决定 Base URL 与协议 | TaoToken |
| 凭证 | 决定 Key 与鉴权头 | YOUR_API_KEY |
| 模型映射 | 决定生成模型与校验模型 | writer 用生成模型,curator 用校验模型 |
一个可读的 CC Switch 配置块可以写成:
{ "provider": "taotoken", "baseUrl": "https://taotoken.net/api", "apiKey": "YOUR_API_KEY", "models": { "writer": "YOUR_WRITER_MODEL_ID", "curator": "YOUR_CURATOR_MODEL_ID", "probe": "YOUR_FAST_MODEL_ID" }, "defaults": { "curator": { "temperature": 0, "maxTokens": 1024, "responseFormat": "json_object" } } }这里的三件套不是三个孤立的开关,而是三层隔离:供应商层决定请求发往https://taotoken.net/api;凭证层决定用哪把 Key 计量;模型映射层决定校验智能体用哪个模型。把curator单独映射出来,你才能在统计 Token 时区分“写入前校验”消耗了多少。
3.4 环境变量与密钥安全
不要把YOUR_API_KEY提交到 Git。推荐用.env.local或系统钥匙串,然后在启动脚本里读取。校验侧和生成侧尽量用不同的 Key,这样 Token 账单天然隔离。如果你在一个 CI 任务里跑记忆校验,可以把TAOTOKEN_API_KEY设为 secret,把ANTHROPIC_AUTH_TOKEN留给本地 Claude Code 测试。所有 Key 都可以在 TaoToken 控制台创建,入口在文末 CTA 中给出。
4. 可复现实验:切换校验通道到 TaoToken,输出通过率与 Token 对照
这一节给出一套可复现的跑批方法。目标不是复现论文的全部实验,而是把“校验通道”作为唯一变量,观察两件事:CLBench 通过率、校验智能体 Token 消耗。
4.1 实验设计
准备两组配置:
- A 组:共用通道。生成与校验都走同一个 Base URL、同一把 Key。校验调用和 writer 调用共享并发限制。
- B 组:独立校验通道。生成保持原通道,校验走 TaoToken,Base URL 为
https://taotoken.net/api,Key 为YOUR_API_KEY。
固定内容:
- 同一批 CLBench 任务样本,建议先取 50 到 100 条本地可跑的子集。
- 同一个 writer 模型与同一套提示词。
- 同一个 curator 提示词,强制输出 JSON:
decision、correctness_score、reusability_score、reason。 - 同一个只读探针 fixture,不连生产库,不执行写操作。
- 记录每次 curator 调用的
prompt_tokens、completion_tokens和重试次数。
4.2 记录 Token 的脚本骨架
下面是一段可改写的 Python 骨架。实际 SDK 方法名按你本地安装的版本调整;Base URL 使用https://taotoken.net/api,Key 使用环境变量。
import json import os import time from openai import OpenAI # 校验通道:TaoToken curator_client = OpenAI( base_url="https://taotoken.net/api", api_key=os.environ["TAOTOKEN_API_KEY"] ) def curator_validate(candidate: dict, probe_facts: list[str]) -> dict: system_prompt = ( "You are a memory curator. Validate correctness and reusability. " "Return strict JSON with keys: decision, correctness_score, " "reusability_score, reason." ) user_prompt = json.dumps({ "candidate": candidate, "probe_facts": probe_facts }, ensure_ascii=False) start = time.time() resp = curator_client.chat.completions.create( model=os.environ.get("CURATOR_MODEL", "YOUR_CURATOR_MODEL_ID"), messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_prompt} ], temperature=0, max_tokens=1024, response_format={"type": "json_object"} ) latency_ms = int((time.time() - start) * 1000) usage = resp.usage return { "result": json.loads(resp.choices[0].message.content), "prompt_tokens": usage.prompt_tokens, "completion_tokens": usage.completion_tokens, "total_tokens": usage.total_tokens, "latency_ms": latency_ms }如果你用的是 Anthropic SDK 或 Claude Code 内部调用,也保持同样的计量思路:把校验调用的 usage 单独落盘。不要只记录总 Token,否则你无法回答“通过率提升是不是靠更多 Token 换来的”。
4.3 对照表模板
跑完之后,把结果填进下面这张表。论文报告的通过率区间是 39% 到 73%,你的本地子集可能不同;Token 列按你本地跑批结果填写。
| 组别 | 校验通道 | CLBench 通过率 | 校验 Token/样本 | 写入 Token/样本 | 总 Token/样本 | 重试次数 | 备注 |
|---|---|---|---|---|---|---|---|
| A 共用通道 | 生成通道复用 | 待填 | 待填 | 待填 | 待填 | 待填 | 共享限流,日志混合 |
| B 独立校验 | TaoToken | 待填 | 待填 | 待填 | 待填 | 待填 | 独立 Key,可归因 |
如果你只关心校验侧成本,可以再加两列:curator_prompt_tokens和curator_completion_tokens。通常completion_tokens是波动最大的部分,因为模型可能不按 JSON 输出。强制response_format=json_object和max_tokens能显著降低这部分。
4.4 跑批入口与本地执行
你可以写一个本地 runner:
# 本地执行,不连生产库 export TAOTOKEN_API_KEY="YOUR_API_KEY" export CURATOR_MODEL="YOUR_CURATOR_MODEL_ID" python run_clbench_memory_curation.py \ --subset ./data/clbench_sample_100.jsonl \ --output ./runs/taotoken_curator.jsonl \ --probe-fixture ./fixtures/readonly_envrun_clbench_memory_curation.py的职责是:读样本、调 writer 产生候选记忆、调只读探针取事实、调 curator 校验、记录 decision 与 usage、最后汇总通过率。所有文件都在本地,探针只读,命令由你执行。不要把只读探针改成写接口,也不要把持久记忆库直接暴露给智能体。
5. 排障:校验智能体 Token 飙升、429、日志串通道
切到 TaoToken 后,常见问题不在模型能力,而在通道隔离和计量。下面按现象排查。
5.1 429 仍然出现
如果校验侧已经切到 TaoToken,但 429 还在,先检查是不是生成侧和校验侧共用了一把 Key。TaoToken 的 Key 可以在控制台创建多把,建议校验专用一把。再检查并发:curator 的批量跑批是否开了 20 个并发?如果是,把并发降到 4 到 8,观察 429 是否下降。最后检查重试策略:指数退避是否没有上限?给重试加max_retries=2,避免失败调用放大 Token。
5.2 校验 Token 飙升
Token 飙升通常有三个原因:
- 输出太长。curator 没有被强制 JSON,模型写了长篇解释。解决:
response_format={"type": "json_object"},并在提示词里写“只输出 JSON,不要 Markdown”。 - 探针事实太多。只读探针把整个日志文件塞进上下文。解决:先做切片和摘要,只把与候选记忆相关的行传给 curator。
- 重试没有缓存。同一个候选记忆被反复校验。解决:用候选记忆的哈希做本地缓存,命中则跳过模型调用。
5.3 日志串通道
如果你在 Claude Code 里同时跑生成和校验,日志里出现两个 Base URL,说明环境变量被覆盖。检查settings.json的env是否在当前项目目录生效;检查 shell 里是否残留ANTHROPIC_BASE_URL;检查 CC Switch 是否把两个 profile 写到了同一个配置文件。最稳妥的方式是:校验任务单独开一个终端,显式 export TaoToken 的ANTHROPIC_BASE_URL和ANTHROPIC_AUTH_TOKEN,生成任务另开终端,不要交叉。
5.4 Codex 报 provider 不识别
Codex 的config.toml里,model_provider必须和[model_providers.taotoken]的命名一致。如果你把ANTHROPIC_*写到 Codex 配置里,它不会生效。检查:
model_provider = "taotoken" [model_providers.taotoken] base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY"然后确认TAOTOKEN_API_KEY已经在当前 shell 中导出。如果仍然报错,用echo $TAOTOKEN_API_KEY检查是否为空,不要打印完整 Key。
5.5 通过率没有提升
通过率不提升,先看校验是否真的挡住了错误记忆。打开runs/taotoken_curator.jsonl,统计decision分布:如果全部是accept,说明 curator 太宽松;如果全部是reject,说明提示词太严格或探针事实不足。再看correctness_score和reusability_score的分布,必要时调整阈值。通过率提升来自“写入前拦截”,而不是“写入后补救”。
排障时如果需要确认 Key 和 Base URL,回到 TaoToken 官网检查配置:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=memory_curation_troubleshoot 。Base URL 始终是 https://taotoken.net/api,不要带查询参数。
6. 把校验通道切到 TaoToken 的推荐路径
如果你已经看到这里,建议按下面顺序落地,不要一上来就全量替换。
第一步,先用模型对话验证 Key 和模型名。进入模型对话页面,发一条结构化 JSON 请求,确认返回格式和 usage 字段。入口:https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=memory_curation_chat
第二步,如果你准备长期跑校验批任务,看 Coding Plan 是否覆盖你的并发和 Token 需求。入口:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=memory_curation_plan
第三步,创建校验专用 API Key,不要和生成 Key 混用。入口:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=memory_curation_keys
第四步,按 Claude Code 文档配置settings.json和ANTHROPIC_*,或者按 Codexconfig.toml配置独立 provider。Claude Code 文档入口:https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=memory_curation_doc
最后,用本地 CLBench 子集跑 A/B 两组,填完通过率与 Token 对照表。记住:写入前校验的价值不只在通过率数字,还在于你能把校验智能体的 Token 消耗单独看见。切到 TaoToken 通道后,https://taotoken.net/api是统一的 Base URL,YOUR_API_KEY换成你在控制台创建的那把 Key,剩下的就是让 curator 在只读环境事实之上做判断,而不是让执行体自己给自己发通行证。