
1. 先分清Cloudflare Disallow AI Training 管的是外部爬虫不是站内摘要的模型调用Cloudflare 把 Disallow AI Training 这类开关推出来后独立站站长最容易踩的一个误区是以为开了这个设置所有“AI 相关”的流量都会被挡住账单自然会降。TaoToken 官网入口先放在这里https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentcf_disallow_ai_training 。它提供的是模型 Key 与 Base URL 出口不替代 Cloudflare 的爬虫策略。Cloudflare 的规则作用在“外部请求进入你的站点”这一层而你站内 AI 摘要、文章 TL;DR、站内问答是“你的后端主动请求模型服务”这一层。前者被拦后者照常运行Token 当然继续消耗。Cloudflare 新增的 Disallow AI Training 设置本质是把“搜索引擎抓取”和“AI 训练抓取”拆成两个可分别处理的策略站长可以继续让搜索爬虫收录页面同时拒绝内容被用于模型训练。这个动作解决的是外部爬虫访问源站、边缘节点或内容接口的问题但它管不到你服务器里的fetch、axios、openai、anthropic等 SDK 调用。站内 AI 摘要只要还有用户点击“生成摘要”、页面滚动触发预取、定时任务扫文章、站内搜索问答被调用模型请求就会继续产生 Token。所以排查顺序应该是先确认 Cloudflare 后台是否真的开启了 Disallow AI Training并且搜索引擎爬虫仍然允许。再看站内 AI 摘要服务的请求日志区分“外部搜索爬虫流量”和“站内用户触发的模型调用”。最后检查站内摘要服务用的是什么 Key、什么 Base URL、是否还在走旧出口。把站内模型请求切到 TaoToken 的 Key 与 Base URL 后做 Token 消耗前后对比。这四步里Cloudflare 只负责第一步。后面三步属于应用层和模型接入层。很多站长把“外部训练爬虫被拦”误认为“所有 AI 消耗都被控制”结果 Cloudflare 规则生效了站内摘要仍在烧 Token账单没有明显变化于是开始怀疑规则没生效。实际上要分开看Cloudflare 拦的是别人来抓你TaoToken 换的是你主动去调模型时的 Key 出口。两者不是替代关系而是上下游关系。本文视角就是独立站站长或全栈开发者站点已经有 AI 摘要、问答或内容辅助场景Cloudflare 规则已经开了但 Token 还在跑。下面直接给可复现步骤Cloudflare 怎么配、日志怎么打、环境变量怎么换、Claude Code / Codex / CC Switch 怎么填、Token 前后对比怎么做。2. Cloudflare 后台可跟做开启 Disallow AI Training 同时保留搜索爬虫先处理 Cloudflare 侧。不同套餐、不同时间点的后台菜单名称可能略有差异但核心动作是找到 AI 爬虫或训练爬虫相关设置把训练用途拦掉同时确认搜索用途仍允许。2.1 操作路径登录 Cloudflare Dashboard选择你要处理的域名。进入Security或Bots相关区域查找AI Scrapers and Crawlers、Block AI training bots、Disallow AI Training等类似选项。将 AI 训练相关策略设为阻止、拒绝或 Disallow。若界面提供多个选项优先选择“拒绝用于 AI 训练”而不是“阻止所有 AI 爬虫”避免误伤搜索引擎的 AI 摘要展示或正常收录。确认Search Engine Crawlers、Verified Bots或搜索引擎白名单仍为允许状态。保存后到Security Events或Bot Analytics里看请求事件确认训练爬虫被拦、搜索爬虫仍能抓取。建议截图留档三张AI 爬虫策略配置页搜索引擎爬虫允许状态规则生效后的 Security Events 过滤结果。这样后续你和团队复盘时能证明“外部训练爬虫被拦”这件事已经做过而不是只凭记忆。2.2 配置对照表配置项建议值作用范围是否影响站内摘要 TokenDisallow AI Training开启/拒绝外部训练爬虫访问站点不影响Search Engine Crawlers允许搜索引擎正常收录不影响AI Scrapers and Crawlers按需阻止训练类外部 AI 爬虫访问站点不影响站内 AI 摘要服务走应用层模型调用你的后端主动请求模型影响 TokenTaoToken Base URLhttps://taotoken.net/api站内模型请求出口影响 Key 与计费出口这里要特别强调Cloudflare 的 Disallow AI Training 不会自动帮你减少站内摘要的模型调用。你甚至可能看到 Cloudflare 事件里训练爬虫少了但因为站内用户活跃度上升、摘要缓存没做好、定时任务重复生成Token 反而更多。所以必须进入下一步把请求日志打出来。如果你还没有 TaoToken Key可以统一从官网入口进入https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentcf_rule_ready 。后文会具体写 Key 和 Base URL 怎么配。3. 站内 AI 摘要 Token 消耗拆解从 Nginx/应用日志到模型请求日志要区分“搜索爬虫流量”和“站内用户触发的模型调用”不能只看 Cloudflare 的请求数也不能只看模型平台的总用量。你需要把链路串起来外部请求进了哪个 URL、命中什么缓存、有没有触发摘要任务、摘要任务调用模型时用了哪个 Key 和 Base URL。3.1 Nginx 访问日志先标记触发来源在 Nginx 中给 AI 摘要相关接口单独打日志。下面示例只做字段扩展具体路径按你的站点替换。log_format ai_summary $remote_addr - $request_id [$time_local] $request $status $body_bytes_sent $http_user_agent $http_referer trigger$arg_trigger cache$upstream_cache_status; access_log /var/log/nginx/ai_summary.log ai_summary;然后在摘要接口请求里带上trigger参数或请求头例如triggeruser_click用户点击“生成摘要”triggerpage_prefetch页面预取triggercron_scan定时任务扫描triggersearch_bot搜索爬虫触发triggerunknown未分类。这样你在日志里能先看到到底是搜索爬虫在触发摘要接口还是站内用户点击在触发。3.2 应用日志给每次模型调用加 trace_id应用层不要只记录“摘要成功”要记录模型调用。以 Python 为例import logging import uuid logger logging.getLogger(ai_summary) def summarize_article(article_id: str, source: str, text: str): trace_id str(uuid.uuid4()) logger.info( ai_summary_start trace_id%s article_id%s source%s text_len%s, trace_id, article_id, source, len(text) ) # 这里放置你的模型调用逻辑 # 调用成功后记录 usage prompt_tokens 0 completion_tokens 0 total_tokens 0 logger.info( ai_summary_done trace_id%s article_id%s source%s prompt_tokens%s completion_tokens%s total_tokens%s base_url_host%s, trace_id, article_id, source, prompt_tokens, completion_tokens, total_tokens, taotoken.net )关键字段建议固定下来字段示例用途trace_iduuid串联 Nginx 与应用日志article_id1024判断是否同一文章重复生成sourceuser_click区分触发来源modelYOUR_MODEL观察模型用量prompt_tokens812输入消耗completion_tokens236输出消耗total_tokens1048总消耗base_url_hosttaotoken.net确认出口statussuccess/fail失败重试排查3.3 本地只读分析SQL 对比不同来源的 Token把日志导出到本地表或只读副本后再执行聚合查询。不要在线上生产库直接做大范围扫描。SELECT date_trunc(hour, created_at) AS hour_bucket, source, count(*) AS call_count, sum(prompt_tokens) AS prompt_tokens, sum(completion_tokens) AS completion_tokens, sum(total_tokens) AS total_tokens FROM ai_summary_log WHERE created_at now() - interval 7 days GROUP BY 1, 2 ORDER BY 1 DESC, total_tokens DESC;你重点看三件事sourceuser_click的调用量是否远大于预期sourcecron_scan是否在重复生成同一篇文章摘要sourcesearch_bot是否真的触发了模型调用。如果搜索爬虫只抓页面、不触发摘要接口那 Token 消耗就不该算到它头上。这一步做完你才能理直气壮地说Cloudflare 拦的是外部训练爬虫站内 Token 是用户或任务触发的模型调用。接下来才是换 Key 出口。4. 把站内摘要服务切到 TaoToken环境变量、Base URL 与最小请求示例TaoToken 在这里的角色很明确提供模型请求的 Key 和 Base URL。它不替代 Cloudflare 的爬虫策略也不负责拦截外部训练爬虫。你要做的是把站内 AI 摘要服务的模型出口从旧配置切到 TaoToken。4.1 先拿 Key 和 Base URL进入 TaoToken 官网https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentkey_setup 。注册或登录后到控制台创建 API Key。Key 不要写死在代码里放到环境变量或密钥管理服务中。本文统一用占位符YOUR_API_KEY。Base URL 使用https://taotoken.net/api注意这个 Base URL 不要额外带 UTM 参数也不要随意在后面重复拼/v1。不同 SDK 对路径拼接方式不同先按 SDK 文档和下面示例来。4.2 环境变量对照表变量名推荐值说明AI_SUMMARY_API_KEYYOUR_API_KEY从 TaoToken 控制台创建AI_SUMMARY_BASE_URLhttps://taotoken.net/api模型请求 Base URLAI_SUMMARY_MODEL按控制台可用模型填写不要留空AI_SUMMARY_TIMEOUT30秒按业务调整AI_SUMMARY_MAX_RETRIES2避免失败风暴如果你用.env管理本地开发环境可以这样写AI_SUMMARY_API_KEYYOUR_API_KEY AI_SUMMARY_BASE_URLhttps://taotoken.net/api AI_SUMMARY_MODELYOUR_MODEL AI_SUMMARY_TIMEOUT30 AI_SUMMARY_MAX_RETRIES2生产环境不要提交.env到仓库使用平台密钥管理或 CI/CD 变量注入。4.3 Python 最小请求示例import os from openai import OpenAI client OpenAI( api_keyos.environ[AI_SUMMARY_API_KEY], base_urlos.environ[AI_SUMMARY_BASE_URL], ) resp client.chat.completions.create( modelos.environ[AI_SUMMARY_MODEL], messages[ {role: system, content: 你是站点摘要助手只输出摘要正文。}, {role: user, content: 请为下面文章生成 120 字摘要\n\n{article_text}}, ], temperature0.3, ) print(resp.choices[0].message.content) print(resp.usage)把{article_text}替换成你实际的文章内容变量。打印usage是为了后续做 Token 前后对比。4.4 Node.js 最小请求示例import OpenAI from openai; const client new OpenAI({ apiKey: process.env.AI_SUMMARY_API_KEY, baseURL: process.env.AI_SUMMARY_BASE_URL, }); const resp await client.chat.completions.create({ model: process.env.AI_SUMMARY_MODEL, messages: [ { role: system, content: 你是站点摘要助手只输出摘要正文。 }, { role: user, content: 请为下面文章生成 120 字摘要\n\n${articleText} }, ], temperature: 0.3, }); console.log(resp.choices[0].message.content); console.log(resp.usage);注意 Node 示例里的baseURL大小写与 SDK 版本有关按你安装的 SDK 类型定义为准。核心是https://taotoken.net/api。4.5 缓存优先别让同一篇文章反复烧 Token换 Key 出口能解决“走哪个供应商”的问题但如果不加缓存同一篇文章被不同用户点击、同一爬虫反复触发、定时任务重复扫描Token 还是会涨。建议在摘要服务前加一层缓存以article_id content_hash model prompt_version作为缓存键摘要生成成功后写缓存设置合理 TTL用户点击时先查缓存未命中再调用模型定时任务只处理content_hash变化的文章对同一trace_id的并发请求做合并避免击穿。这样你才能把“Cloudflare 规则 TaoToken 出口 应用缓存”三件事串起来。5. Claude Code、Codex、CC Switch 的配置模板别把 ANTHROPIC_* 套到 Codex如果你除了站内摘要服务还会在本地用 Claude Code、Codex 或 CC Switch 做排障和配置验证这里给一份可复制模板。核心原则Claude Code 用settings.json/ANTHROPIC_*Codex 用config.toml不要把 Claude Code 的ANTHROPIC_*填到 Codex 里。5.1 Claude Codesettings.json 与 ANTHROPIC_*Claude Code 常见做法是通过环境变量指向自定义 Base URL 和 Key。示例{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: YOUR_MODEL } }如果你使用的版本或客户端要求ANTHROPIC_API_KEY则按对应文档替换但不要同时保留冲突值。配置完成后本地启动 Claude Code观察请求是否走到taotoken.net。5.2 Codexconfig.tomlCodex 使用config.toml不要套用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然后在 shell 或系统环境变量中设置export TAOTOKEN_API_KEYYOUR_API_KEY这里env_key指向的是 Codex 读取环境变量的名字不是让你把 Key 写进config.toml。生产或共享机器上不要明文保存 Key。5.3 CC Switch 三件套CC Switch 这类切换工具本质上就是管理三件套三件套填写值注意Provider 名称TaoToken自定义可识别名称Base URLhttps://taotoken.net/api不加 UTM 参数API KeyYOUR_API_KEY不要提交到仓库在 CC Switch 中切换后建议回到终端验证一次请求而不是只看配置界面显示成功。5.4 配置检查清单Claude Codesettings.json里的ANTHROPIC_BASE_URL是否指向https://taotoken.net/api。Claude CodeANTHROPIC_AUTH_TOKEN或对应 Key 字段是否为YOUR_API_KEY。Codexconfig.toml是否使用base_url https://taotoken.net/api。Codex是否错误地把ANTHROPIC_*写进了config.toml如果是删掉。CC Switch三件套是否完整切换后是否重启了对应终端会话。所有配置Key 是否只存在于环境变量或密钥管理不在代码仓库。如果你还没有创建 Key可以从 API Keys 页面进入https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentcc_switch 。创建后按YOUR_API_KEY替换。6. 验证 Token 消耗前后对比三个指标和一张回滚清单换 Key 出口后不要凭感觉说“好像省了”。要留下可复现产出。6.1 先用 curl 做最小验证在本地终端执行不要在生产服务器上直接跑大批量请求。curl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer YOUR_API_KEY \ -H Content-Type: application/json \ -d { model: YOUR_MODEL, messages: [ {role: user, content: ping} ] }如果返回里有usage记录下prompt_tokens、completion_tokens、total_tokens。若返回 404先检查 Base URL 是否重复拼接了/v1。SDK 会自动拼接路径时Base URL 用https://taotoken.net/api直接 curl 时用完整路径/api/v1/chat/completions。6.2 对比三个指标指标观察窗口对比方式调用次数切换前后各 24 小时按source分组总 Token切换前后各 7 天看趋势不看单点失败率与重试切换前后各 24 小时401/404/429/超时分别统计缓存命中率切换前后各 7 天看摘要接口命中缓存占比单篇平均 Token同一批文章控制变量对比推荐做一张简单表切换前 24h - user_click 调用xxx 次 - cron_scan 调用xxx 次 - total_tokensxxx - 失败率x% 切换后 24h - user_click 调用xxx 次 - cron_scan 调用xxx 次 - total_tokensxxx - 失败率x%如果切换后总 Token 没降先别怪出口。回去看第 3 节日志是不是缓存没命中、定时任务重复跑、用户点击量本身上升。TaoToken 解决的是 Key 与 Base URL 出口问题不解决业务层重复调用问题。6.3 回滚清单保留旧 Base URL 和旧 Key 的备份位置。保留 Cloudflare 规则截图与事件导出。保留切换前 7 天 Token 日志。保留新配置的环境变量对照表。如果出现大面积 401 或 404先恢复旧出口再单点排查。如果只是某几个模型不可用先降级到备用模型不要全站回滚。可复现产出建议打包成Cloudflare 规则配置截图环境变量API_KEY/ Base URL 对照表AI 摘要请求日志样例Token 消耗前后对比表搜索爬虫流量与站内用户触发的分类统计。7. 常见报错401、404、429、流式中断分别怎么排换出口过程中最常见的就是几类错误。下面按报错现象拆。报错现象可能原因排查动作401 UnauthorizedKey 缺失、错误、过期、Bearer 拼写错误检查YOUR_API_KEY是否替换Header 是否为Authorization: Bearer403 Forbidden权限不足、模型未开通、环境限制到控制台确认 Key 权限与可用模型404 Not FoundBase URL 路径多拼或少拼/v1模型名错确认 Base URL 为https://taotoken.net/api模型名与控制台一致429 Too Many Requests并发过高、限流、余额或配额不足降低并发增加重试退避检查控制台用量502/504 或超时网络抖动、流式连接被代理缓冲增大超时关闭代理缓冲检查 SSE流式中断中间层缓冲、连接提前关闭检查 Nginxproxy_buffering、应用超时、SDK 流式解析返回空内容提示词被过滤、模型输出为空、解析字段错打印原始响应检查choices[0].message.content流式场景尤其要注意如果你在 Nginx 后面跑流式接口可能需要关闭缓冲location /api/ai-summary/stream { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Connection ; proxy_buffering off; proxy_cache off; chunked_transfer_encoding on; }这段只是示例按你的实际路由和端口替换。核心是不要让中间层把流式响应缓存成一整块。8. 文末 CTA模型对话 → Coding Plan → 创建 Key → Claude Code 文档如果你已经完成 Cloudflare 的 Disallow AI Training 配置也确认了搜索爬虫仍可抓取下一步就是把站内 AI 摘要的模型出口真正切到 TaoToken。建议按下面顺序走先到模型对话页面验证模型可用性与返回格式https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentcta_chat如果你不只是站内摘要还要长期跑 Claude Code、Codex 或本地开发流可以看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcta_plan创建 API Key替换代码里的YOUR_API_KEYhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentcta_keysClaude Code 用户按文档配置settings.json/ANTHROPIC_*https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentcta_claude_codeBase URL 统一使用https://taotoken.net/apiKey 占位符统一使用YOUR_API_KEY最后再强调一次边界Cloudflare 的 Disallow AI Training 负责“外部训练爬虫不要来抓”TaoToken 的 Key 与 Base URL 负责“你站内摘要请求模型时走哪个出口”。两边都配好再配合应用层日志、缓存和 Token 对比表你才能清楚看到搜索爬虫流量归搜索爬虫站内用户触发归站内用户模型消耗归模型消耗。这样排查不再是猜账单而是按链路逐段验证。