1. 给 Rene 换 TaoToken Key:41 份 newsletter 的 Token 账要先算清
在让 Rene 读 41 份 newsletter 之前,先到 TaoToken 官网创建 Key:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=rene_newsletter_start。Rene 是一个 iMessage 智能体,multiplayer-first,发短信就能用;它能调浏览器、能写代码、能购物、能上线网站、能做幻灯片和图片,而且不用装 App,也不用注册。一个很典型的用法是:我一夜收到 41 份 newsletter,让 Rene 阅读、摘要、筛选,最后挑 3 篇值得报道的研究论文发回短信。这个任务真正消耗 Token 的地方,不是最后那条回复,而是前面的阅读调用、摘要调用、去重调用、打分调用和筛选调用。如果 Key 混用,你只能看到总消耗,看不到“哪一步贵、哪份 newsletter 长、哪个提示词导致输出膨胀”。所以先创建 TaoToken Key,再把请求入口设为https://taotoken.net/api,让 Rene 相关的模型请求都归因到同一个 Key 或同一组 Key 下。
本文按“Token 消耗归因 + Key 管理”的视角,把这件事拆成可复现的三件产出:第一,Key 替换步骤;第二,调用记录模板;第三,论文选择对照表。你可以在本地用 Claude Code 或 Codex 做批处理,也可以只在 TaoToken 控制台看 Key 维度的消耗。核心原则很简单:Rene 负责 iMessage 交互,模型调用负责阅读、摘要和筛选,TaoToken 负责 Key、Base URL 和调用记录。不要让一个 Key 同时服务 Rene、本地脚本、Claude Code 和 Codex,否则后面排障时很难区分是智能体循环调用,还是批处理脚本重复读信。
2. Key 替换步骤:从 Rene 到 TaoToken 的最小改动
先到 TaoToken 官网创建 Key,不要直接复用旧供应商的 Key。打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=rene_newsletter_create_key ,进入控制台后创建名为rene-newsletter的 Key,复制一次并保存到密码管理器。这个 Key 专门给 Rene 的阅读、摘要、筛选调用使用。然后再创建一个rene-local-batch,给本地批处理脚本使用;如果还要用 Claude Code 和 Codex,再分别创建claude-code-local、codex-local。Key 的命名不是为了好看,而是为了后面在控制台按 Key 看消耗,快速判断是 iMessage 智能体在持续调用,还是本地脚本在重跑 41 份 newsletter。
2.1 环境变量替换
如果 Rene 所在的运行环境支持自定义 OpenAI 兼容端点,优先用环境变量替换,不要把 Key 写进代码。可以这样设置:
export TAOTOKEN_API_KEY="YOUR_API_KEY" export OPENAI_API_KEY="$TAOTOKEN_API_KEY" export OPENAI_BASE_URL="https://taotoken.net/api"如果 Rene 的底层调用走 Anthropic SDK,则使用:
export ANTHROPIC_AUTH_TOKEN="YOUR_API_KEY" export ANTHROPIC_BASE_URL="https://taotoken.net/api"注意,这里的ANTHROPIC_*只用于对应支持 Anthropic 协议的工具或应用。后面配置 Codex 时,不要把这些变量复制到 Codex 的config.toml里,Codex 使用另一套配置结构。把 Base URL 统一设为https://taotoken.net/api,不要在后面拼 UTM,UTM 只用于网页链接,不用于 API 请求入口。
2.2 验证 Key 是否可用
替换完成后,先用一条最小请求验证 Key,不要一上来就让 Rene 跑 41 份 newsletter。可以在本地执行:
curl -sS https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "YOUR_MODEL_ID", "messages": [ {"role": "user", "content": "只回复 ok"} ], "max_tokens": 8 }'如果返回正常,再进入 Rene 的 iMessage 工作流。如果返回 401,先检查 Key 是否复制完整、是否有多余空格;如果返回 404,检查 Base URL 是否被写成了网页地址,而不是https://taotoken.net/api;如果返回模型不存在,检查YOUR_MODEL_ID是否与控制台可用模型一致。这里不要把ANTHROPIC_*和OPENAI_*混在一起排查,先确定 Rene 用的是哪套 SDK,再按对应变量检查。
2.3 托管智能体无法改后端时的替代路径
如果 Rene 是托管型 iMessage 智能体,你无法直接改它的模型供应商,那就不要让 Rene 直接读 41 份原始 newsletter。更稳的做法是:先把 41 份 newsletter 导出为.eml、.md或纯文本,在本地做预处理,再用 TaoToken 完成摘要、去重、打分和筛选。最后只把 3 篇入选论文的标题、链接、入选理由发回 iMessage,让 Rene 负责对话呈现。这样 Token 消耗就集中在本地批处理,Key 管理也更清楚:
newsletter 导出 -> 本地清洗正文 -> TaoToken 摘要 -> TaoToken 打分 -> 人工复核 -> 发回 iMessage这条路径的好处是:阅读、摘要、筛选三个阶段可以分别记录调用日志,不会和 Rene 的其他 iMessage 任务混在一起。你还可以给本地批处理设置每日额度或并发上限,避免 41 份 newsletter 因为重复重试而放大消耗。
2.4 Key 管理检查清单
在正式跑 41 份 newsletter 前,逐项检查:
- Rene 是否使用独立 Key,例如
rene-newsletter。 - 本地批处理是否使用独立 Key,例如
rene-local-batch。 - Claude Code 是否使用
ANTHROPIC_*和settings.json。 - Codex 是否使用
config.toml,并且没有写入ANTHROPIC_*。 - Base URL 是否统一为
https://taotoken.net/api。 - Key 是否只存在于环境变量、密钥管理器或本地配置,没有进入 Git。
- 是否能在 TaoToken 控制台看到对应 Key 的调用记录。
这套检查做完,再让 Rene 开始读信,后面才有可复现的 Token 归因。
3. 调用记录:把 41 份 newsletter 的 Token 消耗拆到每一步
Token 消耗归因的关键不是看总数,而是给每次模型调用打标签。建议把 Rene 的 newsletter 任务拆成六个阶段:ingest、read、summarize、dedupe、score、final_reply。其中ingest可以不用模型,只做正文抽取和格式清洗;read是模型快速判断这封 newsletter 是否包含论文线索;summarize是把长文压缩成结构化摘要;dedupe是判断多份 newsletter 是否报道同一篇论文;score是按新颖性、相关性、证据强度打分;final_reply是生成最终 3 篇推荐和落选原因。
每次调用记录至少包含这些字段:
{ "trace_id": "rene-2025-06-01-001", "newsletter_id": "nl-001", "stage": "summarize", "model": "YOUR_MODEL_ID", "key_alias": "rene-newsletter", "input_tokens": 0, "output_tokens": 0, "cache_read_tokens": 0, "total_tokens": 0, "status": "ok", "note": "newsletter 正文已清洗,去掉 HTML 和追踪参数" }如果你一次处理 41 份 newsletter,不要只记录一条总日志。可以按 newsletter 和阶段分别写 JSONL:
{"trace_id":"rene-2025-06-01-001","newsletter_id":"nl-001","stage":"read","model":"YOUR_MODEL_ID","key_alias":"rene-newsletter","input_tokens":0,"output_tokens":0,"cache_read_tokens":0,"total_tokens":0,"status":"ok"} {"trace_id":"rene-2025-06-01-002","newsletter_id":"nl-001","stage":"summarize","model":"YOUR_MODEL_ID","key_alias":"rene-newsletter","input_tokens":0,"output_tokens":0,"cache_read_tokens":0,"total_tokens":0,"status":"ok"} {"trace_id":"rene-2025-06-01-003","newsletter_id":"nl-001","stage":"score","model":"YOUR_MODEL_ID","key_alias":"rene-newsletter","input_tokens":0,"output_tokens":0,"cache_read_tokens":0,"total_tokens":0,"status":"ok"}当 41 份都跑完后,你可以先做一轮汇总:
总 Token ≈ Σ(read) + Σ(summarize) + Σ(dedupe) + Σ(score) + final_reply然后回答三个问题:
- 哪一步消耗最多?通常
summarize是输入 Token 大头,因为 newsletter 正文很长。 - 哪份 newsletter 最贵?按
newsletter_id聚合即可看到。 - 哪些调用可以省?如果
read只是为了判断是否有论文,可以用更短提示词和更小 max_tokens;如果dedupe可以用标题和摘要做匹配,就不必把全文再传一次。
在 TaoToken 控制台里,你可以按 Key 看消耗趋势。建议把rene-newsletter和rene-local-batch分开看:前者反映 iMessage 智能体交互,后者反映本地批处理。这样当消耗突然上升时,你能快速判断是 Rene 被频繁唤醒,还是本地脚本重跑了 41 份 newsletter。
另外,调用记录要和 Key 管理一起用。比如给summarize阶段单独建一个 Key,或者至少用key_alias字段区分。如果发现某个 Key 在深夜持续调用,先检查是不是 Rene 会话没有结束,或者本地任务重复执行。记录的目的不是填表,而是让“41 份 newsletter 挑 3 篇论文”从一次黑盒调用变成可解释流程。
4. 论文选择对照表:从 41 到 3 的可复现筛选
让 Rene 挑 3 篇论文,最容易出现的问题是:它给出了 3 个标题,但你不知道另外 38 份为什么落选。为了可复现,要求 Rene 或本地筛选脚本输出完整对照表。最少保留这些列:
| newsletter_id | 标题 | 来源 | 主题 | 新颖性 1-5 | 相关性 1-5 | 证据强度 1-5 | 是否重复 | 总分 | 是否入选 | 落选原因 |
|---|---|---|---|---|---|---|---|---|---|---|
| nl-001 | 示例论文 A | newsletter 名称 | 推理优化 | 4 | 5 | 4 | 否 | 13 | 是 | |
| nl-002 | 示例论文 B | newsletter 名称 | 多模态 | 3 | 4 | 3 | 否 | 10 | 否 | 与 nl-007 主题重叠,证据不足 |
| nl-003 | 示例论文 C | newsletter 名称 | 智能体 | 5 | 3 | 3 | 是 | 11 | 否 | 与 nl-012 重复报道 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
实际运行时,可以让模型按 JSON 输出候选:
{ "newsletter_id": "nl-007", "title": "候选论文标题", "source_url": "本地记录中的来源", "topic": "research topic", "summary": "两到三句摘要", "scores": { "novelty": 4, "relevance": 5, "evidence": 4, "total": 13 }, "duplicate_of": null, "selected": true, "reason": "与当前报道方向高度匹配,且提供了可验证实验" }最终只把selected: true的 3 条发给 Rene 呈现,但对照表要保留全部 41 条。这样你可以复核:是不是相关性权重太高,导致新颖性强的论文被漏掉;是不是去重阶段误杀了同一主题下的不同论文;是不是某份 newsletter 因为正文抽取失败,根本没有进入打分阶段。
论文选择对照还可以和 Token 记录关联。每条候选都带newsletter_id,就能把入选论文与摘要调用、打分调用对应起来。比如某篇论文入选,但它的摘要调用消耗异常高,说明原文很长或结构化很差;如果某篇落选,但打分调用反复重试,说明提示词可能不稳定。把这些记录下来,下一次让 Rene 读新的 41 份 newsletter 时,就可以沿用同一套评分字段和同一套 Key 策略。
5. Claude Code settings.json:在本地复现 Rene 的阅读与筛选
如果你用 Claude Code 在本地做 newsletter 批处理,把 TaoToken 作为模型入口,配置写在settings.json里,使用ANTHROPIC_*环境变量。不要把 Codex 的config.toml混进来。全局配置可以放在~/.claude/settings.json,项目级配置可以放在项目目录下的.claude/settings.json:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "YOUR_MODEL_ID" } }保存后,重开终端或重启 Claude Code,让它读取新的环境变量。你可以先用一个很小的任务验证,例如让 Claude Code 读取当前目录下的newsletter-summary.md,然后输出三行摘要。确认调用成功,再让它批量处理 41 份文件。批处理时建议把任务拆成两步:第一步只做摘要,第二步再做打分和筛选。这样即使某一步失败,也不需要把所有 newsletter 重新读一遍。
CC Switch 的三件套可以这样填:
供应商名称:TaoToken Base URL:https://taotoken.net/api API Key:YOUR_API_KEY在 CC Switch 中保存为独立配置,例如TaoToken-ClaudeCode,不要和旧供应商配置混在一起。切换后,Claude Code 会通过ANTHROPIC_BASE_URL指向 TaoToken。这里再次强调:Claude Code 用的是 Anthropic 协议变量,Codex 用的是 TOML 配置。不要把ANTHROPIC_*复制到 Codex,否则 Codex 不会按预期读取,容易出现鉴权失败或路由错误。
如果你希望 Key 管理更细,可以给 Claude Code 单独创建claude-code-localKey。这样在控制台看到claude-code-local消耗时,你就知道是本地批处理,而不是 Rene 的 iMessage 调用。对于 41 份 newsletter 这种批量任务,单独 Key 还能帮你设置预算和告警。
6. Codex config.toml:Codex 用 TOML,不要抄 ANTHROPIC_*
如果你的工作流里用 Codex 做论文摘要、代码实验或结构化输出,配置方式完全不同。Codex 使用config.toml,不是settings.json,也不是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"然后设置环境变量:
export TAOTOKEN_API_KEY="YOUR_API_KEY"这里的关键点是:Codex 通过env_key读取TAOTOKEN_API_KEY,通过base_url指向https://taotoken.net/api。不要写ANTHROPIC_BASE_URL,也不要写ANTHROPIC_AUTH_TOKEN。如果你的 Codex 版本字段名有差异,以本地codex --help和实际报错为准,但供应商切换的逻辑是一样的:模型名、provider、base_url、env_key 四件事对齐。
Codex 适合做结构化筛选,比如把 41 份 newsletter 摘要转换成统一 JSON,再按分数排序。你可以让它只输出 JSONL,每行一个候选,最后用本地脚本汇总。这样 Codex 的调用记录也能和 Rene 的阅读记录分开:Rene 负责 iMessage 侧的交互,Codex 负责本地结构化处理,Claude Code 负责批处理或代码实验,三者各自使用独立 Key。
7. 把 3 篇论文发回 iMessage:最小闭环与排障顺序
当本地已经完成 41 份 newsletter 的摘要、去重和打分,最后一步才是把 3 篇论文发回 iMessage。建议输出格式固定为:
今日 41 选 3: 1. 论文标题 一句话理由: 来源 newsletter: 建议报道角度: 2. 论文标题 一句话理由: 来源 newsletter: 建议报道角度: 3. 论文标题 一句话理由: 来源 newsletter: 建议报道角度: 落选摘要:已保留 38 条对照,可在本地 CSV 查看。这样 Rene 只负责把结果组织成短信风格,不再重新读 41 份全文。Token 消耗也因此集中在可控的批处理阶段。如果最终短信里出现标题错误,按以下顺序排查:
- 检查
newsletter_id是否和摘要记录一一对应。 - 检查
selected: true是否只有 3 条。 - 检查去重阶段是否把不同论文合并。
- 检查最终回复调用是否重新读取了全文,导致上下文膨胀。
- 检查 Rene 使用的 Key 是否与本地批处理 Key 混用。
排障时不要先改模型参数,先看调用记录。调用记录能告诉你问题发生在阅读、摘要、筛选还是最终回复。如果summarize阶段正常,score阶段也正常,但最终短信不对,那问题就在final_reply的提示词或模板。如果read阶段大量失败,优先检查 newsletter 正文抽取,而不是换模型。
8. 从模型对话到 Coding Plan:文末 CTA 路径
如果你准备把 Rene 的 41 份 newsletter 工作流固定下来,可以按下面顺序走一遍:
- 先在模型对话里验证 TaoToken Key 是否可用:模型对话
- 如果每天都要让 Rene 读几十份 newsletter,可以了解 Coding Plan:Coding Plan
- 创建和管理独立 Key,给 Rene、本地批处理、Claude Code、Codex 分开使用:API Keys
- 需要 Claude Code 接入细节时,查看文档:Claude Code 文档
如果你还没有创建 Key,先回到 TaoToken 官网:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=rene_newsletter_final 。创建后把请求入口设为https://taotoken.net/api,再把 Key 占位符YOUR_API_KEY替换到你的环境变量或对应工具配置中。最后记住这套流程的产出物:Key 替换步骤、调用记录、论文选择对照。先让这三样跑通,再让 Rene 从 41 份 newsletter 里挑 3 篇论文,整个过程才可复现、可排障、可归因。