1. 从 .env 那一行 Key 说起:IP 头像设计 Skill 的第一道门槛
很多人第一次跑 IP 头像设计 Skill,卡住的地方根本不是提示词写得不够好,而是.env里那行 Key 不知道该填什么。Skill 目录建好了、模板也抄了,一执行就报 401,翻半天文档才发现是 Base URL 指向了默认地址、或者 Key 在一个客户端里能用、换个客户端就失效。所以这篇不讲玄学,先把 Key 这件事讲透:在动手写.env之前,先去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=env_before_key 拿一把 Key,然后把 Base URL 统一填成https://taotoken.net/api,后面 Claude Code、Codex、CC Switch 的配置才有共同的地基。
为什么强调"统一"?因为 IP 头像设计 Skill 这类工具,本质是「一份提示词模板 + 一段调用模型的脚本 + 一套输出规范」。模板可以复制,脚本可以照抄,唯独 Key 和入口地址是每家环境都不一样的部分。TaoToken 的价值就在这里:把 Key 收在一处管理,Base URL 固定一个地址,同一个 Key 能在不同客户端里复用,不用为了一个头像 Skill 去维护三四套凭证。下面按「拿 Key → 填 Base URL → 写 Skill → 跑出图 → 排错」的顺序走一遍,每一步都能直接复制粘贴复现。
2. 三分钟拿到第一把 Key:控制台最小路径
第一步永远是拿到凭证。打开 TaoToken 官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=console_entry ,注册并登录后进控制台,找到 API Keys 页面。整个流程只有三个动作:创建一个 Key、给它起一个能看懂用途的名字、复制出来立刻保存。
关于命名,给一个实际能用的建议:不要叫test、key1这种名字。IP 头像设计 Skill 至少会涉及「调试期」和「批量出图期」两种使用强度,建议直接按用途和日期命名,例如:
avatar-skill-dev-20250101 avatar-skill-batch-20250101这样做的好处是,等你在 CC Switch 里同时挂了几个供应商配置、又想在 Claude Code 里跑别的任务时,出问题能一眼定位是哪把 Key 在报错。Key 只在创建时完整展示一次,复制后建议先粘到一个临时文本里,再写入.env。控制台入口再放一次:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=create_first_key
拿到 Key 之后,先不要急着写脚本,先建一个最小可用的环境文件。放在项目根目录,文件名.env:
# .env —— IP 头像设计 Skill 的最小凭证配置 TAOTOKEN_API_KEY=YOUR_API_KEY TAOTOKEN_BASE_URL=https://taotoken.net/api TAOTOKEN_MODEL=claude-sonnet-4-5三行的分工要说清楚:TAOTOKEN_API_KEY是刚复制的那串;TAOTOKEN_BASE_URL固定写https://taotoken.net/api,注意不要自己在后面加/v1或者斜杠,除非控制台文档明确要求;TAOTOKEN_MODEL写你要用的模型 ID,具体可用的 ID 以控制台模型列表为准,本文示例只是占位。
同时把.env加进.gitignore:
# .gitignore .env .env.local *.key output/这里多提一句output/。头像设计 Skill 会产生大量图片和中间文件,如果仓库里混进了几十张 PNG,后面想回滚配置都找不到自己改了哪一行。
3. Base URL 只有一个:https://taotoken.net/api 在三种客户端里的写法
这一节是本篇最核心的部分,也是最容易出错的部分。结论先给:Base URL 是https://taotoken.net/api,但不同客户端读取它的字段名完全不同,绝不能把ANTHROPIC_*那一套硬塞给 Codex。
3.1 Claude Code:settings.json 与 ANTHROPIC_*
Claude Code 读的是环境变量,推荐写进用户级或项目级的settings.json,而不是每次开终端都 export 一遍。项目级配置放在.claude/settings.json:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "claude-sonnet-4-5" } }三个字段一一对应:ANTHROPIC_BASE_URL是入口地址,ANTHROPIC_AUTH_TOKEN是那把 Key,ANTHROPIC_MODEL是模型 ID。如果你更习惯用 shell 环境变量,等价写法是:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_AUTH_TOKEN="YOUR_API_KEY" export ANTHROPIC_MODEL="claude-sonnet-4-5"注意settings.json里的 env 优先级通常高于 shell,两边同时配且值不一致时,以文件里的为准。这就是很多人"明明 export 了却还是 401"的原因——改错了地方。写完配置后,重启一次 Claude Code 会话再验证。
3.2 Codex:config.toml 里另起一套 provider
Codex 用的是 TOML,字段名和 Claude Code 完全不同。它通过自定义 provider 的方式接入,配置放在~/.codex/config.toml:
model = "gpt-5-codex" 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"这里有两个新手必踩的坑。第一,env_key写的是「环境变量的名字」,不是 Key 本身,所以值是TAOTOKEN_API_KEY而不是YOUR_API_KEY的内容。第二,绝对不要把ANTHROPIC_AUTH_TOKEN写到 Codex 的配置里,Codex 不认识这个字段,它只认env_key指向的那个变量。wire_api的取值按官方文档选,改错会导致请求格式不匹配、返回 400 而不是 401,报错信息看着像模型问题,其实是协议问题。
3.3 CC Switch:三件套逐项填
如果你同时要在多个供应商之间切换,用 CC Switch 这类切换工具最省事。它需要填的就是三件套:
| 字段 | 填写内容 |
|---|---|
| 供应商名称 | TaoToken(自己起,便于识别) |
| Base URL / API 地址 | https://taotoken.net/api |
| API Key | YOUR_API_KEY |
再加一个模型字段,填你要用的模型 ID。三件套填完,切换供应商就是点一下的事,不用去改settings.json也不用重开终端。判断是否填对的最简单办法:切换后随便发一句对话,如果返回正常文本,说明 Base URL 和 Key 都通了;如果报 401 就是 Key 贴错了,报 404 就是地址多了或少了路径段。
官网首页再放一次,方便你对照控制台里的说明:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=baseurl_check
4. IP 头像设计 Skill 的最小目录:SKILL.md + 模板 + 出图脚本
Key 通了之后再来看 Skill 本身。所谓「开箱即用」,指的是结构足够简单,复制目录就能跑。一个能落地的最小结构长这样:
avatar-skill/ ├── SKILL.md ├── .env ├── prompts/ │ └── avatar.md ├── scripts/ │ └── render.py └── output/SKILL.md是给模型看的说明书,写清楚这个 Skill 干什么、输入是什么、输出规范是什么。不用写长,重点是约束:
# IP 头像设计 Skill ## 用途 根据用户提供的人设关键词,生成可直接使用的 IP 头像设计方案。 ## 输入 - 人设关键词(必填,3-8 个) - 风格偏好(可选:扁平 / 描边 / 拟物 / 像素) - 主色调(可选,十六进制) ## 输出规范 1. 先输出 300 字以内的设计说明(构图、配色、识别特征) 2. 再输出一段可直接渲染的 SVG 代码,尺寸 512x512 3. SVG 必须包含 viewBox="0 0 512 512",不得依赖外部字体 4. 不要输出 base64 图片,不要输出多余解释prompts/avatar.md是提示词模板,把变量位置留出来:
请为以下人设设计一个 IP 头像: 人设关键词:{{keywords}} 风格偏好:{{style}} 主色调:{{color}} 要求: - 图形元素控制在 3 个以内,保证小尺寸下仍可辨认 - 主体占比不低于画面 60% - 输出设计说明 + SVG 代码,不要输出其他内容关键点在于「输出 SVG」。相比直接生成位图,SVG 有两个巨大优势:一是纯文本,模型一次性输出即可,不需要额外的图片存储链路;二是可编辑,配色不满意直接改fill值,不用重新跑一遍。对于零基础的人来说,"能拿到东西、能改、能立刻看到效果"比什么都重要。
5. 启动命令与可复现产出:从一张 SVG 头像到六宫格风格矩阵
有了目录结构,接下来写调用脚本。用 OpenAI 兼容的 SDK 最省事,因为大多数客户端和聚合入口都兼容这套调用方式:
# scripts/render.py import os import re import pathlib from openai import OpenAI from dotenv import load_dotenv load_dotenv() client = OpenAI( api_key=os.environ["TAOTOKEN_API_KEY"], base_url=os.environ["TAOTOKEN_BASE_URL"], ) TEMPLATE = pathlib.Path("prompts/avatar.md").read_text(encoding="utf-8") def build_prompt(keywords, style="扁平", color="#3B82F6"): return ( TEMPLATE .replace("{{keywords}}", keywords) .replace("{{style}}", style) .replace("{{color}}", color) ) def extract_svg(text): match = re.search(r"<svg[\s\S]*?</svg>", text) return match.group(0) if match else None def generate(keywords, style, color, out_dir="output"): resp = client.chat.completions.create( model=os.environ["TAOTOKEN_MODEL"], messages=[{"role": "user", "content": build_prompt(keywords, style, color)}], temperature=0.8, ) content = resp.choices[0].message.content svg = extract_svg(content) if not svg: raise RuntimeError("模型没有返回合法 SVG,检查 SKILL.md 的输出约束") pathlib.Path(out_dir).mkdir(exist_ok=True) name = keywords.replace(" ", "_")[:20] + ".svg" out = pathlib.Path(out_dir) / name out.write_text(svg, encoding="utf-8") print(f"saved -> {out}") return out if __name__ == "__main__": generate("戴眼镜的橘猫 程序员", "扁平", "#F97316")依赖装两条就够:
pip install openai python-dotenv启动命令:
python scripts/render.py预期产出是一行日志加一个文件:
saved -> output/戴眼镜的橘猫_程序员.svg用浏览器直接打开这个 SVG,就能看到头像。如果你装了 VS Code,预览插件也能直接渲染。这一步的意义在于:它把「设计」变成了「可版本管理的文件」,你可以拿两张 SVG 做 diff,看看到底是配色变了还是构图变了。
想一次出一组风格矩阵,把主函数换成循环即可:
STYLES = ["扁平", "描边", "像素"] COLORS = ["#F97316", "#3B82F6"] for s in STYLES: for c in COLORS: generate("戴眼镜的橘猫 程序员", s, c)跑完output/里就是 6 张 SVG,对应 3 种风格 × 2 种配色。这一步跑通,就说明整条链路——Key、Base URL、模型、提示词、文件落盘——全部是通的。
6. 报错排查:401 / 404 / 429 / 超时分别改哪里
配置阶段最常见的四类报错,按下面这个顺序排查,基本能覆盖九成问题。
401 未授权。三种可能:Key 复制时带了空格或换行;.env里有引号但引号是中文全角;或者客户端根本没读到.env。先在终端里验证变量确实被加载了:
python -c "import os; from dotenv import load_dotenv; load_dotenv(); print(os.environ.get('TAOTOKEN_API_KEY', 'NOT_FOUND')[:8])"只打印前 8 位,避免把完整 Key 输出到日志。如果显示NOT_FOUND,说明.env不在当前工作目录,或者变量名拼错了。
404 找不到路径。绝大多数是 Base URL 写错。正确值是https://taotoken.net/api。常见错误包括:写成https://taotoken.net/api/v1、末尾多了斜杠、或者把 deep link 里的?utm_source=...一起复制进去了。带查询参数的地址是给浏览器用的,SDK 里必须填干净的接口地址。
429 请求过于频繁。批量出图时最容易撞上。解决办法不是换 Key,而是把并发降下来、加退避重试:
import time, random def generate_with_retry(*args, retries=3, **kwargs): for i in range(retries): try: return generate(*args, **kwargs) except Exception as e: if "429" not in str(e) or i == retries - 1: raise wait = (2 ** i) + random.random() print(f"rate limited, retry in {wait:.1f}s") time.sleep(wait)同时把批量循环改成串行,或者手工控制并发数,别一上来就开 20 个线程。
连接超时。先确认你的网络能正常访问官网页面,排除本地网络因素;再确认 Base URL 没有手滑打错域名。如果是大文件请求超时,可以在客户端里单独调大超时时间,而不是反复重试。
排错时还有一个通用手段:把请求的完整 URL 打印出来。很多 SDK 报的错信息很抽象,看到真实请求地址,问题往往一眼就暴露了。
配置相关的说明文档建议对照着看:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=troubleshoot_doc
7. 把 Skill 变成流水线:命名规范、批量与版本留档
单张头像跑通之后,真正提升效率的是流程规范。三个建议。
命名规范统一。输出文件名里带上日期和风格,例如20250101_扁平_橘猫.svg。这样output/目录按名称排序就是按时间排序,找历史版本不用翻文件夹。
提示词模板版本化。在prompts/下用avatar_v1.md、avatar_v2.md这样的命名,脚本里通过参数指定用哪个版本。当你发现 v2 的配色更好但构图变差时,能立刻切回 v1 对比,而不是靠记忆。
批量任务写清单文件。不要直接把关键词写死在 Python 里,用一个tasks.yaml:
- keywords: 戴眼镜的橘猫 程序员 style: 扁平 color: "#F97316" - keywords: 短发女生 插画师 style: 描边 color: "#8B5CF6"脚本读清单循环执行,想加任务就改 YAML,不用动代码。这套做法在头像数量上到几十张的时候优势非常明显。
还有一个容易被忽略的点:把每次生成的请求参数记一份日志。不用复杂,一行 JSON 就够:
import json, datetime with open("output/run.log", "a", encoding="utf-8") as f: f.write(json.dumps({ "ts": datetime.datetime.now().isoformat(), "keywords": keywords, "style": style, "color": color, "model": os.environ["TAOTOKEN_MODEL"], }, ensure_ascii=False) + "\n")日后想复现某张图,看日志就够了,不用去猜当时用的什么模型。
8. 下一步:Key 管好了,Skill 才算真的开箱即用
回头看,IP 头像设计 Skill 本身并不复杂:一份提示词模板、一个约束清楚的SKILL.md、一段几十行的调用脚本。真正消耗时间的,是 Key 该放哪、Base URL 该填什么、换了客户端怎么迁移。把这三件事一次性理顺——Key 统一在 TaoToken 控制台管理、Base URL 统一为https://taotoken.net/api、不同客户端用各自正确的字段名——后面再遇到任何新的 Skill,接入成本都接近于零。
如果你现在还没动手,建议按这个顺序走一遍:先去模型对话页面直接体验一下效果,确认能正常返回;再考虑订阅方案,看是否满足日常出图频率;然后在控制台创建一把专门给这个 Skill 用的 Key;最后把 Claude Code 的接入文档过一遍,确保settings.json里的字段没有写漏。
- 先试试效果:https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=cta_chat_try
- 看方案是否合适:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=cta_plan
- 创建专属 Key:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=cta_new_key
- 对照客户端配置文档:https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=cta_cc_doc
最后提醒一句:.env永远不要提交到仓库,Key 泄露比配置写错麻烦得多。把凭证和代码分开管理,Skill 才能长期稳定地用下去,而不是每次换环境都从排错开始。