TaoToken 的统一通道地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end能用的 Key 就在那里建。但今天真正要拆的是 Trae 里那份 launch.json想让examples.web_ui用-m的方式跑起来得先把包结构里的__init__.py补齐debugpy 配置里要用module字段把入口指到examples.web_ui而真正决定请求发往哪里的是env里注入的AUTOSKILL_GENERIC_LLM_URL、AUTOSKILL_GENERIC_API_KEY、AUTOSKILL_GENERIC_LLM_MODEL这三个变量。原文里 URL 指向https://api.deepseek.comKey 位置只留了一个占位符很多人就是在这里停住的——不知道去哪拿一把能用的 Key也不确定换完地址以后调试器还认不认这套配置。1. debugpy 起不来之前先看 examples.web_ui 的包结构和三个 AUTOSKILL_GENERIC 变量1.1 为什么 -m examples.web_ui 会报 No module namedpython -m xxx的本质是把xxx当成一条模块路径去导入。写成examples.web_ui意思是examples是一个包web_ui是它下面的子包或子模块。如果examples/里没有__init__.py导入行为就会落到命名空间包那一套规则上能不能找到入口取决于运行目录和sys.path的拼接结果调试器再自己解析一遍路径时很容易直接抛出No module named examples.web_ui。所以正确顺序是先看包再看配置确认examples/__init__.py存在确认examples/web_ui/是一个包内部有__init__.py或者本身就是一个可导入的模块文件最后才轮到 launch.json 里的module: examples.web_ui。不少人顺序反了先在 launch.json 里把 module 写上去按 F5 报错然后回来反复改配置改半天还是同一个错——因为病灶根本不在 JSON 里而在目录结构里少了一个空文件。1.2 URL、Key、Model 三个变量各自管什么env这三个变量看着不起眼但它们才是真正吃 Token 的那条模型通道。AUTOSKILL_GENERIC_LLM_URL管请求打到哪个根地址AUTOSKILL_GENERIC_API_KEY管你是谁AUTOSKILL_GENERIC_LLM_MODEL管用哪个模型。原文前两个一个是别人的域名、一个是占位符本篇要动的手就是把这两处换掉。变量名管什么本篇要填的值AUTOSKILL_GENERIC_LLM_URL模型请求的根地址https://taotoken.net/apiAUTOSKILL_GENERIC_API_KEY调用凭证YOUR_API_KEY从官网创建AUTOSKILL_GENERIC_LLM_MODEL使用哪个模型原文写的是deepseek-v4-flash实际以模型广场当时列表为准提示AUTOSKILL_GENERIC_LLM_URL只填根地址末尾不要跟/v1也不要挂任何查询参数。注册、看模型、看用量都在落地页那是浏览器打开的地址两者的用途别混在一起。2. 占位 key 换掉AUTOSKILL_GENERIC_API_KEY 的真实来源2.1 打开官网、注册、创建一把 Key这一步对应原文里最含糊的那句「Key 位置写了个占位 key」。打开 TaoToken注册登录后进控制台在 API Keys 页面新建一把复制出来先放一边。顺手去模型广场扫一眼当前可用的模型 ID别把版本号和日期后缀凭记忆写进去配置里的模型名必须能在那儿找到对应的条目。如果你已经有账号直接跳到 控制台 API Keys 新建即可不用重复注册。新建出来的 Key 只在创建那一刻完整显示复制完就存进密码管理器或临时记事本别等到要粘贴的时候才发现剪贴板已经被覆盖了。2.2 把新 URL 和新 Key 写回 env只改env这一块就够了配置骨架不用重写。把原文的域名换成https://taotoken.net/api把占位符换成刚才复制到的那串 Keyenv: { AUTOSKILL_GENERIC_LLM_MODEL: deepseek-v4-flash, AUTOSKILL_GENERIC_LLM_URL: https://taotoken.net/api, AUTOSKILL_GENERIC_API_KEY: YOUR_API_KEY }模型名先按原文的deepseek-v4-flash写跑之前去模型广场核对一次对不上就换成列表里实际存在的那个。这里不建议顺手写个带日期的变体调试器不认识那个 ID 时报的错会让你以为是网络问题白折腾一圈。3. 一份完整的 launch.jsontype / module / console / cwd / env 全部对齐3.1 可以直接粘的完整配置把下面这段整份放进工作区根目录的.vscode/launch.json。Trae、VSCode、Cursor 都走 VSCode 系的调试面板读到的是同一份 JSON所以配一次就能在三处复用{ version: 0.2.0, configurations: [ { name: Python: examples.web_ui, type: debugpy, request: launch, module: examples.web_ui, console: integratedTerminal, cwd: ${workspaceFolder}, justMyCode: false, env: { AUTOSKILL_GENERIC_LLM_MODEL: deepseek-v4-flash, AUTOSKILL_GENERIC_LLM_URL: https://taotoken.net/api, AUTOSKILL_GENERIC_API_KEY: YOUR_API_KEY } } ] }3.2 type、module、console、cwd、env 五个字段逐个对照type写debugpy这是当前 Python 调试器的名字不是老版本的python写错会提示找不到调试器类型。request用launch表示由编辑器拉起进程不是 attach 到已有进程。module是最容易踩坑的一个它代替了program字段值就是examples.web_ui前提是 1.1 里那套包结构已经成立。console建议留integratedTerminal因为你要在终端里看模型请求有没有发出去、返回状态码是什么换成internalConsole也能跑但输出会被收在一个小面板里排查 401 时很不方便。cwd用${workspaceFolder}保证-m解析模块时的工作目录就是仓库根目录否则同样的配置换个文件夹打开就失效。env就是第 2 节那三个变量一个都不能少。3.3 三个编辑器复用时的两个小差异同一个工作区里这份 JSON 在 Trae、VSCode、Cursor 都能直接选到调试项一般不需要各写一份。真正会出岔子的地方是工作目录如果你只打开了仓库的某个子文件夹${workspaceFolder}指向的就不是仓库根examples自然变成不可导入的包报错和第 1.1 节一模一样。另一个差异是解释器选择三个编辑器各自记得自己的 Python 版本确认调试配置里的解释器路径指向装了依赖的那一个。4. 让 Codex 按init.py 补结构顺手把 config.toml 的 base_url 指过来4.1 给 Codex 的指令要写清楚边界包结构这类活很适合交给 Codex但要把它该做什么说死。下面这段可以直接贴进对话读一下仓库里 examples/ 目录下的文件和 __init__.py 情况判断 examples.web_ui 作为 python -m 入口还缺哪些包标记文件。只输出需要新增或修改的文件清单和最小内容 不要改动其他业务逻辑也不要执行任何调试命令。注意这里的分工Codex 负责读目录、生成__init__.py、把 launch.json 里type / module / console / cwd / env这五个字段对齐真正按 F5 起进程的是你自己。别指望它去把调试跑起来替你看结果那一步只能在你本地发生报错信息也得你贴回来它才好判断。4.2 ~/.codex/config.toml 里把供应商指到同一条通道Codex 自己也要有一条能用的通道配置在~/.codex/config.toml字段是model_provider和base_url和 Python 的env完全不是一套东西model deepseek-v4-flash model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api chat注意Codex 用的是env_key指定的那个环境变量去读 Key不要把ANTHROPIC_*那套变量名抄进 config.toml两边混在一起最常见的结果是「配置写了但不生效」。字段名以 Codex 当前版本的文档为准升级后偶尔会有微调。5. 按 F5 之后integratedTerminal 里的正常输出与 401 排查5.1 怎么算跑通配置保存后按 F5integratedTerminal会先打出调试器的启动信息接着是examples.web_ui自己的日志。判断标准很简单终端里能看到向https://taotoken.net/api发出的模型请求记录并且拿到了返回内容程序按预期继续往下走而不是停在某个异常上。这一步通了说明包结构、debugpy 的 module 指向、三个 env 变量都已经串起来了。顺便留意一下终端里有没有出现「连接某某域名」的字样。如果打出来的还是原来的域名说明你改的是另一个配置节或者编辑器读的 launch.json 不是你以为的那一份——工作区里有多个.vscode目录时特别容易发生。5.2 401 先查 Key 和额度No module named 先查init.py按原文这套配置最可能撞上的就两类错。一类是AuthenticationError或状态码 401这基本只和 Key 有关回去打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 确认这把 Key 还在、没有被删、额度也没见底再检查粘贴时有没有多带空格或换行。Key 复制不完整也会报 401肉眼几乎看不出来。另一类是No module named examples.web_ui和 Key 一点关系都没有回到第 1.1 节看包标记文件是不是真的落盘了cwd是不是指向仓库根。两种情况别混着查报的是导入错误就只查目录报的是鉴权错误就只查 Key 和额度混着改只会让变量越换越乱。6. 调试信号发出去之后回控制台对一次调用跑通之后别急着关终端先去 TaoToken 模型对话 用同一把 Key 发一条测试消息确认模型 ID 和地址这一对在脱离调试器的情况下也成立。如果这条链路准备长期用来写代码可以顺手看下 Coding Plan 的额度是否够用需要再建几把 Key 分给不同项目直接在 控制台 API Keys 里加就行。最后回到控制台看一眼刚才那次调试有没有记上账有记录说明 launch.json 里的AUTOSKILL_GENERIC_LLM_URL确实生效了不是某个缓存里的旧地址在顶着。这套配置一旦在 Trae 里跑通把同一份 launch.json 放到 VSCode 和 Cursor 的工作区就能直接复用后面换模型只改AUTOSKILL_GENERIC_LLM_MODEL一行包结构那部分不用再动。
