Claude Code 挂 GLM4.7 修router/index.ts的动态导入报错,一小时烧光 5 小时限额,这次把模型通道改走 TaoToken。官网入口:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
这篇不讨论“模型到底行不行”,只解决一个接入层问题:Claude Code 的每次请求从哪个通道出去。原来的链路是 Claude Code 直接挂在 GLM4.7 的 5 小时限额套餐上,Agent 循环读文件、跑命令、清缓存、重启 dev server、再把新日志回灌,一轮接一轮。前端工具链日志又长又反复进上下文,Failed to fetch dynamically imported module .../router/index.ts没收敛,token 先见了底。更麻烦的是中间还夹着 exit code 127/137 导致的空转验证,验证环节不可靠,模型只能继续猜、继续跑、继续消耗。
改法很窄:只动“模型通道从哪来”这一步。先打开官网注册并创建 Key,再回到 Claude Code 的settings.json,把env里的 Base URL 指向https://taotoken.net/api,Key 用刚创建的那一把。之后 Claude Code 的每次读文件、跑命令、回灌日志都从 TaoToken 出去。TaoToken 在这里只负责给 Key 和 Base URL,不参与改文件,不替代 Vite/Webpack 的排查。通道配通之后,动态 import 的根因还是要按前端工程的方法继续定位。
原问题与场景:router/index.ts 报错被 Agent 循环放大
这次的前端 Bug 类型很常见:页面运行时报动态导入失败,信息里能看到Failed to fetch dynamically imported module .../router/index.ts。它看起来像“某个文件没加载到”,但根因可能散在构建配置、base/publicPath、路由 history 模式、tsconfig alias、依赖缓存、HMR、本地启动方式差异里。它不是一道给足信息就能直接出答案的题,更像现场排雷,需要不断缩小范围、做最小复现、做二分定位。
Claude Code 的工作方式会把这个问题放大。它不是一问一答的聊天,而是一个持续跑的循环:读一批文件,给出判断,改一处,跑一次命令,把新日志再丢回去继续推理。这个循环本身没有错,但前端日志太长,Vite/Webpack、HMR、warning、stack trace 每次重启都会多出一坨新内容,上一轮 log、下一轮 log、模型自己的总结、提过的假设,全部在上下文里累积。于是 token 消耗不是由“问了多少句”决定,而是由“跑了多少轮”决定。
更贵的是尝试式修复。猜一个原因,改一下,跑一下,不行再换一个猜法。方向一开始偏了,后面就是持续试错。再叠上 exit code 127/137,脚本找不到、进程被 kill、权限或内存不稳,验证命令都跑不通,Agent 得不到稳定反馈,只能在雾里摸。一小时 3000 万+ token、5 小时套餐见底、Bug 还在,就是这么来的。
所以这篇文章把问题拆成两层:第一层是模型通道从哪来,改settings.json就能换出口;第二层是router/index.ts的动态导入为什么失败,必须靠前端工具链和最小验证收敛。TaoToken 只处理第一层。
TaoToken 前置:先拿 Key 和 Base URL
进入官网后先完成注册,然后在控制台创建 API Key。Key 只在创建时完整显示,复制后先放到安全位置,不要贴到聊天记录、截图或公开仓库里。API Key 管理入口在这里:
https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=glm47-settings-json
创建完 Key 之后,不需要在本地装一堆额外组件,也不需要把项目代码上传到任何地方。接下来要用的只有两个值:
- Base URL:
https://taotoken.net/api - API Key:
YOUR_API_KEY
注意 Base URL 不带/v1,也不加任何 UTM 参数。/v1通常由客户端自己拼接,写进配置里容易变成重复路径。UTM 是给网页链接做来源标记的,不要写进ANTHROPIC_BASE_URL。
如果你对接入参数、模型 ID 或返回格式不确定,先看接入文档:
https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=claude-code-settings
TaoToken 在这里的角色很单一:提供 Key 和 Base URL,让 Claude Code 的请求从 TaoToken 出去。它不会替你看router/index.ts,不会替你判断 Vite 的 base 配得对不对,也不会替你跑二分定位。把通道配通之后,前端问题仍然要按前端问题来查。
可复制配置:Claude Code 的 settings.json 这样写
Claude Code 的配置可以放在用户级,也可以放在项目级。常见位置是:
- 用户级:
~/.claude/settings.json - 项目级:项目根目录下的
.claude/settings.json - 本地覆盖:项目根目录下的
.claude/settings.local.json
如果你希望所有项目都走 TaoToken,改用户级。如果只想让当前项目走 TaoToken,改项目级。项目级和本地级通常会覆盖用户级,所以排查“为什么不生效”时,先确认到底哪一份在起作用。
配置内容如下,把YOUR_API_KEY换成你刚创建的那把 Key,把MODEL_ID换成接入文档里对应的模型 ID:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "MODEL_ID", "ANTHROPIC_SMALL_FAST_MODEL": "MODEL_ID" } }几个关键点:
ANTHROPIC_BASE_URL必须是https://taotoken.net/api,不要写成https://taotoken.net/api/v1,也不要带?utm_source=...这类参数。ANTHROPIC_AUTH_TOKEN就是你的 TaoToken Key。如果你的 Claude Code 版本或包装方式识别的是ANTHROPIC_API_KEY,可以保持同一把 Key,但不要同时塞多个来源冲突的值。ANTHROPIC_MODEL和ANTHROPIC_SMALL_FAST_MODEL都填可用模型 ID。小模型用于轻量任务,填同一个模型 ID 也可以,后面按实际消耗再调整。- JSON 不能有尾逗号,不能有注释。保存前用编辑器格式化一次,避免因为一个逗号导致整个
settings.json被忽略。 - 如果你之前把
ANTHROPIC_BASE_URL写在 shell 的.bashrc、.zshrc或系统环境变量里,先确认它和settings.json里是同一个值。环境变量和配置文件同时存在时,容易出现“我改了但没生效”的错觉。
改完之后不需要改项目里的 Vite 配置,也不需要改router/index.ts。这一步只换了 Claude Code 请求的出口。
验证请求与成功结果:先 curl 再进 Claude Code
不要直接开一个长 Agent 循环来验证通道。先用一个短请求确认 Key、Base URL 和模型 ID 能通。下面是一个 Anthropic 格式的验证示例,模型 ID 和鉴权头以接入文档为准:
curl -sS https://taotoken.net/api/v1/messages \ -H "content-type: application/json" \ -H "x-api-key: YOUR_API_KEY" \ -H "anthropic-version: 2023-06-01" \ -d '{ "model": "MODEL_ID", "max_tokens": 64, "messages": [ { "role": "user", "content": "只回复 pong" } ] }'成功时你会看到 HTTP 200 和一段 JSON 响应。如果返回 401,优先检查 Key 是否复制完整、有没有多余空格或换行。如果返回 404,优先检查 Base URL 是否多写了/v1,以及模型 ID 是否存在于当前账户可用列表。如果返回 400,检查请求体 JSON 是否合法,模型 ID 是否写对。
curl 通过后,再进 Claude Code 做一次只读验证。进入项目目录,启动 Claude Code,先执行/status查看当前生效的配置,确认端点指向taotoken.net/api,模型 ID 是你配置的那个。然后让它做一个不落盘的动作,例如读取router/index.ts的前几十行并总结导入关系,或者列出当前路由文件里动态 import 的写法。这个动作只验证通道能不能正常读到项目内容、能不能正常返回结果,不涉及修改文件。
成功结果有几个标志:
- Claude Code 不再报鉴权和端点错误;
- 请求能正常返回,不出现长时间卡死;
/status里看到的模型和端点是你在settings.json里写的值;- 读取
router/index.ts这类只读操作能稳定完成,而不是跑一轮就断。
这一步通过,说明“模型通道从哪来”已经改完。接下来再面对Failed to fetch dynamically imported module,就是纯前端排查,不要再把通道问题和业务 Bug 混在一起。
本篇常见错排查:settings.json 不生效、/v1 重复、exit 127/137 空转
配置改完不生效,通常不是 TaoToken 的问题,而是下面这些点。
第一,检查settings.json的作用域。你改的是用户级,但项目里存在.claude/settings.json或.claude/settings.local.json,项目级把用户级覆盖了。反过来,你改的是项目级,但启动 Claude Code 时不在这个项目目录,用户级配置仍然生效。用/status确认当前实际加载的是哪一份。
第二,检查 shell 环境变量。在终端执行:
env | grep -i anthropic如果这里有旧的ANTHROPIC_BASE_URL或ANTHROPIC_AUTH_TOKEN,它可能优先于settings.json。把旧的导出删掉,重新开一个终端,再启动 Claude Code。
第三,检查 Base URL 是否重复拼接。ANTHROPIC_BASE_URL应该是https://taotoken.net/api。写成https://taotoken.net/api/v1后,客户端再拼一次/v1/messages,就会变成/api/v1/v1/messages。也不要从浏览器地址栏直接复制带 UTM 的官网链接填进去。
第四,检查 Key 的复制质量。前后空格、换行、引号、中文标点都会导致鉴权失败。把 Key 重新复制一次,只替换YOUR_API_KEY这一段。
第五,检查模型 ID。MODEL_ID不是随便填的字符串。接入文档里列出的可用模型 ID 才是有效值。填错模型 ID 常见表现是 404 或 400,而不是 401。
第六,检查 exit code 127/137。127 一般表示命令找不到,137 一般表示进程被强制结束,常见于内存不足或超时被杀。只要验证命令本身跑不通,Agent 循环就会空转。正确顺序是先让dev起得来、脚本能执行、端口和内存稳定,再让 Claude Code 进入排错循环。否则换什么模型通道都只是换一个地方烧 token。
第七,把前端问题留在前端。router/index.ts动态导入失败,优先查这些方向:Vite/Webpack 的 base 与 publicPath、路由 history 模式与服务器 fallback、tsconfig alias 与构建解析是否一致、依赖是否重复或缓存损坏、HMR 与冷启动差异、动态 import 的路径是静态可分析还是运行时拼接。每一项都给一个最小验证方式,比让 Agent 连续猜十轮更省。
配合原文总结的止损规则一起用:
- 先要 3 个最可能的根因,每个根因配一个最小验证方式,不要直接开改;
- 日志只给首次报错点和关键配置,不要把整屏日志塞进上下文;
- 验证命令必须先跑通,127/137 没解决前不进入下一轮;
- 每次改动小步提交,方便回滚;
- 10 轮不收敛就停下,换人工二分定位。
这些规则和 TaoToken 不冲突。TaoToken 负责让请求从稳定通道出去,止损规则负责让请求不要无意义地变多。
语义一致 CTA:接入配置、通道验证、长期 Agent 分开走
如果你正在改 Claude Code 的settings.json,或者遇到鉴权失败、端点 404、配置不生效,先去 API Keys 页面创建和检查 Key,再对照接入文档确认 Base URL、模型 ID 和请求格式:
- API Keys:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=settings-json-cta
- 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=claude-code-cta
如果你只是想确认模型通道是否已经通了,不想启动完整项目,可以去模型对话里发一条短消息验证:
https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=model-chat-verify
如果你准备长期把 Claude Code 挂在 Agent 循环里跑前端排错、日志回灌、多轮验证,建议先看 Coding Plan,把长期编码场景的用量和通道安排好:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=long-term-agent
需要查看账户、用量和 Key 状态时,从控制台进入:
https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=console-cta
Claude Code 接入 Anthropic 兼容通道的说明页也放在这里,方便对照ANTHROPIC_*环境变量:
https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=claude-code-anthropic
回到这次翻车本身:router/index.ts的动态导入报错没有因为换通道自动消失,但模型通道从 GLM4.7 直连改成 TaoToken 之后,请求出口、Key 和 Base URL 变成可控项。剩下的工作,是把日志裁到首次报错点和关键配置,把验证命令先跑通,把根因假设压到三个以内,每一轮都小步提交。通道归通道,排错归排错,额度才不会被一个不收敛的循环继续烧下去。