
1. 先定位 3Dworkshop skill 的模型调用链Token 花在哪复现 3Dworkshop 时最容易卡住的不是 Rodin 建模而是 skill 里默认模型端点与 Key 不匹配请求打到旧地址出现 401、404 或 model not found。先去 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_content3dworkshop_intro 创建 Key再把模型调用地址换成 https://taotoken.net/api。这样文本/代码模型调用、Key 消耗和报错都能在一个控制台里对照。3Dworkshop 这类 GitHub skill本质是把一条创作流水线脚本化先让对话/代码模型生成参考图描述、页面结构和交互逻辑再调用 Hyper3D Rodin 生成 3D 资产最后把模型拆成零件并组装成可浏览的网页。整个流程里至少有两类外部调用文本/代码模型调用生成参考图提示词、HTML/CSS/JS、装配脚本、错误修复建议。3D 生成服务调用Hyper3D Rodin 或对应 MCP 工具负责模型生成与导出。TaoToken 主要接管第一类调用也就是 skill 中原先指向某个 OpenAI 兼容或 Anthropic 兼容端点的请求。你需要在克隆后的仓库里找到这些调用点把 Key 换成 TaoToken 控制台创建的 Key把 Base URL 换成https://taotoken.net/api。注意不要盲目把 3D 生成服务的鉴权也覆盖掉除非该 3D 服务本身提供 OpenAI 兼容接口否则 Rodin 的 MCP/服务配置仍按原 skill 说明保留。这一步的目标不是“把整个仓库所有 Key 都改掉”而是建立一张调用地图3Dworkshop/ ├── .env.example # 通常放 API Key、Base URL、模型名 ├── config/ │ ├── provider.yaml # 文本模型供应商配置 │ └── hyper3d.yaml # 3D 生成服务配置谨慎改 ├── skills/ │ └── portfolio-builder/ │ ├── SKILL.md # skill 使用说明可能写环境变量 │ ├── manifest.json # 环境变量映射、默认模型、入口脚本 │ └── scripts/ │ ├── gen_reference.py │ ├── gen_rodin.py │ └── assemble_parts.py ├── outputs/ └── package.json上面的目录只是常见抽象具体文件名以你克隆下来的 3Dworkshop 仓库为准。关键是先找出“谁在调文本模型”。用下面的命令在仓库根目录扫描不要漏掉.env、YAML、JSON、Python、JScd 3Dworkshop grep -RIn --exclude-dir.git --exclude-dirnode_modules \ -E OPENAI|ANTHROPIC|API_KEY|BASE_URL|base_url|baseURL|endpoint|apiKey .你会看到几类结果.env.example或.env最外层 Key。config/*.yaml、config/*.json供应商、Base URL、模型名。skills/*/manifest.jsonskill 启动时注入的环境变量。scripts/*.py、*.js、*.tsSDK 初始化处可能硬编码了默认地址。~/.claude/settings.json或项目.claude/settings.json如果 3Dworkshop 是通过 Claude Code skill 运行这里也会影响调用。先不要改全局环境。给仓库建一个副本所有实验都在副本里做。这样即使配置写错也不会污染你本机其他项目。cp -a 3Dworkshop 3Dworkshop-taotoken cd 3Dworkshop-taotoken cp .env.example .env然后去 TaoToken 控制台创建 Key。创建后先不要急着跑完整 3D 流程先做一次最小文本调用确认 Key、Base URL、模型名三件套可用。curl -sS https://taotoken.net/api/models \ -H Authorization: Bearer YOUR_API_KEY | head -c 500如果仓库使用的是 OpenAI SDK最小验证也可以直接放在 Python 里import os from openai import OpenAI client OpenAI( api_keyos.environ[OPENAI_API_KEY], base_urlos.environ.get(OPENAI_BASE_URL, https://taotoken.net/api), ) resp client.chat.completions.create( modelos.environ.get(CHAT_MODEL, YOUR_CHAT_MODEL), messages[ {role: system, content: 你只输出一个 JSON 对象。}, {role: user, content: 返回 {\ok\: true, \stage\: \smoke-test\}}, ], temperature0, ) print(resp.choices[0].message.content)只要这一步返回正常再进入 3Dworkshop 的完整流程。否则你会在生成参考图、Rodin 建模、拆件装配多个阶段反复看到同一个 401却误以为是 skill 脚本坏了。2. 克隆后第一轮改造把 Key 与 Base URL 从默认端点迁到 TaoToken克隆 3Dworkshop 后第一轮改造只做两件事设置环境变量替换文本模型调用地址。不要一上来就改hyper3d.yaml或 Rodin 的 MCP 配置因为那部分可能不是 OpenAI 兼容协议改错以后 3D 生成会直接失败。先创建.envcat .env EOF OPENAI_API_KEYYOUR_API_KEY OPENAI_BASE_URLhttps://taotoken.net/api TAOTOKEN_BASE_URLhttps://taotoken.net/api CHAT_MODELYOUR_CHAT_MODEL CODE_MODELYOUR_CODE_MODEL SMALL_MODELYOUR_SMALL_MODEL EOF这里的YOUR_API_KEY必须替换成你在 TaoToken 控制台创建的 Key。Base URL 固定写https://taotoken.net/api不要在后面自行拼/v1、/v1/v1。模型名从 TaoToken 模型列表或控制台复制不要凭记忆写gpt-6、claude-*之类的猜测值。接着检查config/provider.yaml或同类供应商配置。如果原仓库长这样provider: openai api_key: ${OPENAI_API_KEY} base_url: https://api.example.com model: some-default-model改成provider: openai-compatible api_key: ${OPENAI_API_KEY} base_url: https://taotoken.net/api model: ${CHAT_MODEL}如果原仓库是 JSON{ provider: openai-compatible, apiKey: ${OPENAI_API_KEY}, baseUrl: https://taotoken.net/api, model: ${CHAT_MODEL} }注意不要在 JSON 里写${OPENAI_API_KEY}后又不做环境变量展开。有些 skill 只做字符串读取不会自动替换${}。这种情况下在manifest.json里保留变量名在脚本入口处显式读取import os api_key os.environ.get(OPENAI_API_KEY) base_url os.environ.get(OPENAI_BASE_URL, https://taotoken.net/api) model os.environ.get(CHAT_MODEL) if not api_key: raise SystemExit(OPENAI_API_KEY 未设置请先检查 .env 或 shell 环境) if not model: raise SystemExit(CHAT_MODEL 未设置请从 TaoToken 控制台复制模型名)再检查skills/portfolio-builder/manifest.json。不少 skill 会在这里声明运行环境。如果看到类似的硬编码把它改成变量名{ name: portfolio-builder, env: { OPENAI_API_KEY: ${OPENAI_API_KEY}, OPENAI_BASE_URL: https://taotoken.net/api, CHAT_MODEL: ${CHAT_MODEL}, CODE_MODEL: ${CODE_MODEL} }, entry: scripts/build_portfolio.py }如果你的仓库没有manifest.json不要强行创建。以SKILL.md、README或脚本里的实际读取方式为准。改造完成后重新加载 skill确认它读到的是 TaoToken 配置而不是系统里遗留的旧环境变量。unset OLD_OPENAI_API_KEY source .env python scripts/check_env.py如果仓库没有check_env.py用一段独立脚本验证import os from openai import OpenAI print(base_url , os.environ.get(OPENAI_BASE_URL)) print(model , os.environ.get(CHAT_MODEL)) client OpenAI( api_keyos.environ[OPENAI_API_KEY], base_urlos.environ[OPENAI_BASE_URL], ) resp client.chat.completions.create( modelos.environ[CHAT_MODEL], messages[{role: user, content: 只回复taotoken-ok}], max_tokens16, ) print(resp.choices[0].message.content)如果这一步输出taotoken-ok说明 Key 和 Base URL 已经接通。接下来才处理 3Dworkshop 的完整流水线。TaoToken 官网入口在这里https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_content3dworkshop_env 。如果你还没创建 Key先去控制台创建再回到仓库继续替换。不要把 Key 写进 Git 跟踪文件.env要确认在.gitignore中。grep -n .env .gitignore || echo .env .gitignore git status --short3. Claude Code / Codex / CC Switch 三套配置对照3Dworkshop 用哪套3Dworkshop 是 GitHub skill但实际运行时可能挂在 Claude Code、Codex 或 CC Switch 这类工具下面。三套配置不要混用尤其是不要把 Claude Code 的ANTHROPIC_*环境变量塞进 Codex 的config.toml那不会生效还会让你误判 Key 有问题。先判断你用的是哪套如果 skill 通过 Claude Code 运行改settings.json使用ANTHROPIC_*。如果通过 Codex CLI 运行改~/.codex/config.toml使用model_provider和env_key。如果通过 CC Switch 管理多个供应商填三件套Base URL、API Key、默认模型。3.1 Claude Code 配置settings.json ANTHROPIC_*Claude Code 的项目级配置可以放在.claude/settings.json用户级配置通常放在~/.claude/settings.json。如果 3Dworkshop 是作为 Claude Code skill 使用优先放在项目级避免影响其他项目。{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: YOUR_CHAT_MODEL, ANTHROPIC_SMALL_FAST_MODEL: YOUR_SMALL_MODEL } }改完后重启终端和 Claude Code让环境变量重新加载。验证方式是让 Claude Code 执行一个只读命令确认 skill 能正常启动claude然后在 Claude Code 里要求它读取3Dworkshop的SKILL.md不要直接跑完整建模。先确认它能通过 TaoToken 返回文本结果。如果报 401检查ANTHROPIC_AUTH_TOKEN是否填成Bearer YOUR_API_KEY通常这里只填空 Key不要重复加Bearer。如果报 model not found回到 TaoToken 控制台复制准确的模型名。3.2 Codex 配置config.toml不要用 ANTHROPIC_*Codex 走的是config.toml不要在里面写ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN。正确做法是定义一个 provider然后把env_key指向保存 Key 的环境变量。model YOUR_CHAT_MODEL model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY然后在 shell 里设置export TAOTOKEN_API_KEYYOUR_API_KEY如果你使用.env确认 Codex 启动前已经source .env或者把变量写进 shell 配置。Codex 不会读取 Claude Code 的settings.json所以三套配置之间不要互相猜。3.3 CC Switch 三件套Base URL、API Key、默认模型CC Switch 这类切换工具的核心是三件套配置项填写值说明Base URLhttps://taotoken.net/api不要加 UTM不要自行拼/v1/v1API KeyYOUR_API_KEY从 TaoToken 控制台创建默认模型YOUR_CHAT_MODEL从 TaoToken 模型列表复制如果 CC Switch 还要求填写供应商类型选择 OpenAI 兼容或 Anthropic 兼容时以你的工具实际支持协议为准。Claude Code 场景选 Anthropic 兼容时仍使用ANTHROPIC_*Codex 场景选 OpenAI 兼容时使用config.toml。不要把两套变量混写到同一个配置文件里。配置完成后建议按这个顺序验证# 1. 检查环境变量 env | grep -E TAOTOKEN|OPENAI|ANTHROPIC # 2. 检查 Codex 配置 cat ~/.codex/config.toml # 3. 检查 Claude Code 项目配置 cat .claude/settings.json # 4. 最小请求 curl -sS https://taotoken.net/api/models \ -H Authorization: Bearer $TAOTOKEN_API_KEY | headTaoToken 官网控制台可以创建和管理 Keyhttps://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_content3dworkshop_keyswitch 。如果你在多台机器上复现 3Dworkshop建议每台机器单独创建 Key便于排查哪台机器消耗异常。4. Key 替换点清单.env、provider 配置与 skill manifest 怎么改为了避免“改了但没生效”把替换点列成清单逐个打勾。下面是一张通用对照表文件路径以你的 3Dworkshop 仓库为准。文件/位置常见字段旧值特征新值.envOPENAI_API_KEY旧平台 KeyYOUR_API_KEY.envOPENAI_BASE_URL旧域名或空https://taotoken.net/apiconfig/provider.yamlbase_urlapi.example.comhttps://taotoken.net/apiconfig/provider.yamlmodel硬编码模型名${CHAT_MODEL}skills/*/manifest.jsonenv硬编码 Key${OPENAI_API_KEY}scripts/*.pyOpenAI(...)默认 base_url读取OPENAI_BASE_URL.claude/settings.jsonANTHROPIC_BASE_URL旧 Anthropic 端点https://taotoken.net/api.claude/settings.jsonANTHROPIC_AUTH_TOKEN旧 TokenYOUR_API_KEY~/.codex/config.tomlbase_url旧 providerhttps://taotoken.net/api~/.codex/config.tomlenv_key旧变量名TAOTOKEN_API_KEY用命令快速定位硬编码grep -RIn --exclude-dir.git --exclude-dirnode_modules \ -E sk-[A-Za-z0-9_-]|Bearer [A-Za-z0-9._-]|api\.example\.com|old-provider .如果发现脚本里直接写了client OpenAI( api_keysk-旧Key, base_urlhttps://old.example.com/v1 )改成import os from openai import OpenAI client OpenAI( api_keyos.environ[OPENAI_API_KEY], base_urlos.environ.get(OPENAI_BASE_URL, https://taotoken.net/api), )如果发现 YAML 里写了openai: api_key: sk-旧Key base_url: https://old.example.com改成openai: api_key: ${OPENAI_API_KEY} base_url: https://taotoken.net/api如果发现manifest.json里写了{ env: { OPENAI_API_KEY: sk-旧Key, OPENAI_BASE_URL: https://old.example.com } }改成{ env: { OPENAI_API_KEY: ${OPENAI_API_KEY}, OPENAI_BASE_URL: https://taotoken.net/api } }改完以后不要只看文件内容要看运行时真实值。在 skill 入口脚本前加一行调试输出确认环境变量已经注入import os for key in [OPENAI_API_KEY, OPENAI_BASE_URL, CHAT_MODEL, CODE_MODEL]: value os.environ.get(key) if key OPENAI_API_KEY and value: value value[:4] **** value[-4:] print(f{key}{value})不要打印完整 Key。调试结束后移除这行或者只在本地临时运行。5. 跑通 3Dworkshop参考图、Rodin、零件动画三段结果对照当最小文本调用通过后就可以按 3Dworkshop 的流水线跑完整流程。建议分三段跑不要一次性从参考图跑到网页否则报错时很难定位是模型调用、Rodin 服务还是装配脚本的问题。第一段参考图与交互代码。source .env python scripts/gen_reference.py \ --prompt 一个可浏览的 3D 个人作品集低多边形明亮展厅 \ --out outputs/reference这一段主要消耗文本/代码模型 Token。你要观察outputs/reference下是否生成提示词、参考图描述、页面结构 JSON。如果只有空文件检查脚本是否把模型返回内容写到了别的路径。第二段Rodin 3D 模型生成。python scripts/gen_rodin.py \ --input outputs/reference \ --out outputs/rodin这一段调用 Hyper3D Rodin 或对应 MCP 工具。这里不要拿 TaoToken 的文本模型 Key 去覆盖 Rodin 的鉴权。检查outputs/rodin是否出现模型文件或导出任务 ID。如果原本需要 MCP 服务确认 MCP 服务已经启动且没有被你改坏的hyper3d.yaml影响。第三段零件拆分与网页装配。python scripts/split_parts.py \ --input outputs/rodin \ --out outputs/parts python scripts/assemble_site.py \ --parts outputs/parts \ --out dist python -m http.server 8080 -d dist打开浏览器访问http://localhost:8080检查模型能否浏览、旋转、点击零件级动画是否按结构触发。这里如果报错多半是装配脚本或前端资源路径问题不一定是 TaoToken Key 问题。运行结果对照可以做成下面这张表阶段主要调用Token 观察点正确表现错误表现最小 smoke testTaoToken 文本模型一次短请求返回固定文本401、404、model not found参考图生成TaoToken 文本/代码模型提示词长度、返回 JSON 大小生成参考图描述与页面结构空内容、JSON 解析失败Rodin 建模Hyper3D Rodin/MCP任务 ID、模型导出状态输出模型文件MCP 未启动、3D 服务鉴权失败拆件装配本地脚本为主基本不消耗文本 Token生成独立零件与网页路径错误、零件丢失网页运行本地 HTTP 服务无模型调用可浏览、可交互资源 404、JS 报错特别提醒skill 复现时 Token 消耗容易失控的地方不是单次请求而是循环和重试。比如生成 35 个场景对象时如果每个对象都重新把完整上下文塞给模型输入 Token 会线性增长如果脚本失败后自动无限重试消耗会更快。建议在脚本里加最大重试次数和日志import time MAX_RETRY 2 for attempt in range(MAX_RETRY 1): try: resp client.chat.completions.create( modelos.environ[CHAT_MODEL], messagesmessages, max_tokens1024, temperature0.2, ) break except Exception as exc: print(fattempt{attempt} error{exc}) if attempt MAX_RETRY: raise time.sleep(2)同时把长任务拆开不要每次重跑都重新生成全部资产。给outputs/reference、outputs/rodin、outputs/parts加缓存判断已经存在的文件就跳过。from pathlib import Path def need_generate(path: Path) - bool: return not path.exists() or path.stat().st_size 0这样复现 3Dworkshop 时TaoToken 的文本模型调用只发生在真正缺失的阶段而不是每次调试前端颜色都重跑一遍全流程。6. 常见报错与 Token 成本排查401、404、model not found、重复调用接入 TaoToken 后3Dworkshop 的报错大多集中在四类。第一类401 Unauthorized。Error: 401 Unauthorized排查顺序echo ${OPENAI_API_KEY:0:4}**** echo $OPENAI_BASE_URL env | grep -E ANTHROPIC|OPENAI|TAOTOKEN确认 Key 来自 TaoToken 控制台且没有多余空格。Claude Code 场景检查ANTHROPIC_AUTH_TOKENCodex 场景检查TAOTOKEN_API_KEY。如果你在Authorization里手动写了Bearer Bearer YOUR_API_KEY也会 401。第二类404 Not Found。Error: 404 page not found常见原因是 Base URL 拼错。统一使用https://taotoken.net/api不要在代码里再拼一层/v1/v1。如果 SDK 或工具要求带/v1以工具文档为准但产品配置入口先按https://taotoken.net/api填写。出现 404 时先看请求日志里的完整 URL再对照配置文件。第三类model not found。Error: model not found这不是 Key 错而是模型名不在当前账号可用范围。回到 TaoToken 控制台复制准确模型名写入.env的CHAT_MODEL、CODE_MODEL或ANTHROPIC_MODEL。不要在 3Dworkshop 脚本里保留多个候选模型名脚本可能随机选一个导致有时成功有时失败。建议只保留一个默认模型其他模型通过环境变量覆盖。CHAT_MODELYOUR_CHAT_MODEL CODE_MODELYOUR_CODE_MODEL SMALL_MODELYOUR_SMALL_MODEL第四类Token 消耗比预期快。先从日志里区分调用来源grep -RIn --exclude-dir.git --exclude-dirnode_modules \ -E chat\.completions|messages\.create|generate|retry|while scripts skills如果发现循环里每次都重新读取大文件就把大文件转成摘要后缓存。如果发现失败重试没有上限就加MAX_RETRY。如果发现每次调试都重跑参考图就用need_generate跳过已有产物。如果发现 Claude Code 或 Codex 后台也在消耗确认是否两个工具同时开着同一个 Key。TaoToken 控制台可以查看 Key 和调用情况https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_content3dworkshop_troubleshoot 。建议给 3Dworkshop 单独建一个 Key命名里带3dworkshop和机器名方便对照。7. 文末 CTA从模型对话到 Coding Plan 再到 Key如果你还没有开始接入按这个顺序走一遍即可先在模型对话里验证模型可用https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_content3dworkshop_chat如果你要长期跑 3Dworkshop、Claude Code 或 Codex查看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_content3dworkshop_plan创建并管理 API Keyhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_content3dworkshop_keys需要 Claude Code 具体接入方式时对照文档https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_content3dworkshop_claudecode最后再确认一次 3Dworkshop 的改造闭环克隆仓库副本复制.env.example为.env把文本/代码模型调用的 Key 换成YOUR_API_KEYBase URL 换成https://taotoken.net/apiClaude Code 改settings.json里的ANTHROPIC_*Codex 改config.toml里的model_providerCC Switch 填 Base URL、API Key、默认模型三件套。然后依次跑最小 smoke test、参考图生成、Rodin 建模、零件拆分和网页装配。这样你复现 3Dworkshop 时遇到的每个 401、404、model not found 都能快速定位到具体配置而不是在一整个下午的流水线里盲猜。