1. 从一次真实的 Skills 踩坑说起
Claude 与 Google 双栈下的 Skills,本质是把「可复用的提示词 + 工具权限 + 上下文隔离」打包成一个个可被主对话按需调用的能力单元。它能做什么?简单说,你写一次代码审查规范,之后每个项目都能让同一个 Skill 自动执行;你定义一次数据库只读约束,之后任何模型都不能越界写库。适合谁?适合已经在用 Claude Code 或 Gemini CLI 做日常开发、但被「每次都要重复贴提示词」「上下文被日志刷爆」「不同项目配置各写一遍」折磨的开发者。
我试过把一套代码审查 Skill 同时挂到 Claude 和 Google 两条链路上,最大的感受是:Skills 的价值不在「写」,而在「统一入口 + 隔离执行」。主对话只负责决策,脏活累活丢给 Skill 在自己的上下文窗口里跑,跑完只回传摘要。这样主对话的 token 不会被测试日志、依赖树、大段 diff 撑爆,成本也更可控。
但双栈落地有两个现实问题:一是 Claude 和 Google 的配置格式不一样,一个吃settings.json,一个吃config.toml,字段名还对不上;二是两边的 Key 管理分散,切来切去容易乱。这篇就按「先跑通单栈 Skill → 再用统一 Key 打通双栈 → 逐条验证」的顺序走,所有配置都能直接复制。
2. TaoToken 前置:统一 Key 与双栈接入准备
在动手写 Skill 之前,先把 Key 这层理顺。TaoToken 的作用是给 Claude 和 Google 两条链路提供统一的 API 入口和 Key 管理,你不用为每个模型单独维护一套凭证。官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api (这个地址不加 UTM 参数,配置里直接写它)。
你需要先拿到一个 Key。进入控制台创建:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,然后在 API Keys 页面生成:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。生成后复制那串sk-开头的字符串,后面两条链路的配置都要用它。
注意:Key 只显示一次,建议生成后立刻写进本地环境变量或配置文件,别只留在浏览器里。
环境变量建议这样设,Claude 和 Google 共用同一个 Key 变量,减少心智负担:
export TAOTOKEN_API_KEY="sk-你的key" export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="$TAOTOKEN_API_KEY" export GOOGLE_API_BASE="https://taotoken.net/api" export GOOGLE_API_KEY="$TAOTOKEN_API_KEY"如果你更习惯用配置文件而不是环境变量,Claude 侧写~/.claude/settings.json,Google 侧写~/.config/gcloud/config.toml或项目级config.toml。下面两节分别给骨架。
3. 可复制配置:settings.json 与 config.toml 骨架
3.1 Claude 侧 settings.json 骨架
Claude Code 的 Skill(子代理)定义在~/.claude/agents/或项目.claude/agents/下,是带 YAML 前置元数据的 Markdown 文件。而settings.json负责全局权限、钩子和模型路由。先给一份能直接用的~/.claude/settings.json:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的key" }, "permissions": { "allow": ["Read", "Grep", "Glob", "Bash(git diff:*)"], "deny": ["Task(Explore)"] }, "hooks": { "SubagentStart": [ { "matcher": "code-reviewer", "hooks": [ { "type": "command", "command": "./scripts/setup-review.sh" } ] } ], "SubagentStop": [ { "matcher": "code-reviewer", "hooks": [ { "type": "command", "command": "./scripts/cleanup-review.sh" } ] } ] } }这里env段把请求指向 TaoToken 的 API 基址,permissions.deny里禁掉了内置 Explore 子代理(按需保留),hooks段演示了子代理生命周期钩子。接着写一个代码审查 Skill,存到~/.claude/agents/code-reviewer.md:
--- name: code-reviewer description: Expert code review specialist. Proactively reviews code for quality, security, and maintainability. Use immediately after writing or modifying code. tools: Read, Grep, Glob, Bash model: inherit --- You are a senior code reviewer ensuring high standards of code quality and security. When invoked: 1. Run git diff to see recent changes 2. Focus on modified files 3. Begin review immediately Review checklist: - Code is clear and readable - Functions and variables are well-named - No duplicated code - Proper error handling - No exposed secrets or API keys - Input validation implemented Provide feedback organized by priority: - Critical issues (must fix) - Warnings (should fix) - Suggestions (consider improving)model: inherit表示跟随主对话模型;如果你想省钱,可以改成haiku,把审查这种相对轻量的活路由到更快更便宜的模型。
3.2 Google 侧 config.toml 骨架
Google 这条链路(以 Gemini CLI 为例)用config.toml管理模型和端点。项目级配置放在项目根目录的.gemini/config.toml,用户级放在~/.config/gemini/config.toml:
[api] base_url = "https://taotoken.net/api" api_key = "sk-你的key" timeout = 60 [model] default = "gemini-2.5-pro" fast = "gemini-2.5-flash" [skills] enabled = true dir = "./skills" [skills.code_review] description = "Review code for quality, security, and best practices" tools = ["read_file", "search_files", "run_shell"] model = "gemini-2.5-flash"Google 侧的 Skill 用目录 + 描述文件组织,skills/code_review/SKILL.md里写提示词正文,config.toml里声明它的工具和模型。这样两条链路虽然格式不同,但语义对齐:都是「描述触发 + 工具限制 + 模型选择」。
提示:两边都指向
https://taotoken.net/api,Key 也用同一个,切换时只改模型名,不用改凭证。
4. 验证请求:逐条跑通并看结果
配置写完别急着信,逐条验证。第一步,确认 Claude 侧能连上:
claude --version claude -p "用一句话说明你当前使用的模型"如果返回正常文本,说明ANTHROPIC_BASE_URL和 Key 生效。第二步,验证 Skill 被加载:
claude # 进入交互后输入: /agents你应该能在列表里看到code-reviewer。第三步,实际触发一次委托。在任意 git 仓库里改一行代码,然后:
claude -p "使用 code-reviewer 子代理审查我最近的更改"预期结果是:主对话把任务委托给code-reviewer,子代理跑git diff、读文件、返回按优先级分组的审查意见。如果它没委托,多半是description写得不够明确,加上「Proactively use after code changes」这类触发词。
第四步,验证 Google 侧:
gemini --version gemini -p "读取 config.toml 并告诉我当前 base_url"返回里应包含https://taotoken.net/api。第五步,验证 Google 侧 Skill:
gemini -p "对当前目录运行 code_review skill"成功时你会看到它调用read_file、search_files并输出审查结论。第六步,验证统一 Key 是否真的共用——把TAOTOKEN_API_KEY换成一个错误值,两边都应该报鉴权失败;换回正确值,两边都恢复。这一步能确认你没有在某处硬编码了旧 Key。
想直接在网页里对比两个模型对同一段代码的审查结果,可以用模型对话入口:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite ,把 diff 贴进去分别选 Claude 和 Gemini 跑一遍,直观感受差异。
5. 本篇常见错排查
报错一:401 Unauthorized。九成是 Key 没生效。检查echo $TAOTOKEN_API_KEY是否有值,settings.json里有没有写错成sk-以外的前缀。注意ANTHROPIC_API_KEY和GOOGLE_API_KEY都要指向同一个 Key。
报错二:Skill 不触发,主对话自己干了。这是description的问题。Claude 靠描述决定是否委托,描述里要写清「什么时候用」。把description改成包含动作场景的句子,比如「Use proactively after code changes to review quality and security」,再重启会话。
报错三:config.toml改了没反应。Google 侧配置有优先级,项目级覆盖用户级。确认你改的是当前项目根目录下的那份,而不是~/.config里的。改完用gemini -p "print config"确认实际加载值。
报错四:子代理后台运行失败。后台子代理会继承父级权限并自动拒绝未预先批准的操作,且后台不提供 MCP 工具。如果它因缺权限失败,让 Claude 把它恢复到前台重试,或在permissions.allow里补上对应工具。
报错五:钩子脚本不执行。检查脚本有没有chmod +x,路径是否和command字段完全一致。钩子通过 stdin 收 JSON,用jq解析时确认jq已安装。退出码 2 表示阻止操作并把 stderr 反馈给模型,退出码 0 表示放行。
报错六:上下文还是被刷爆。说明高容量操作没真正隔离。确认你把测试、日志、依赖分析这类任务显式委托给了子代理,而不是在主对话里直接跑。子代理的详细输出留在它自己的上下文,只有摘要回传。
6. 双栈长期使用与 Coding Plan
单次跑通只是开始,真正省事的是把 Skills 变成团队资产。项目级 Skill 建议检入版本控制,.claude/agents/和skills/目录一起提交,团队成员拉下来就能用同一套规范。用户级 Skill 放个人目录,跨项目复用。两条链路的 Skill 描述尽量对齐,这样同一句「审查这段代码」在 Claude 和 Google 下行为一致。
如果你要把这套东西长期挂在编码和 Agent 工作流上,按量计费容易失控,可以考虑 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,它更适合高频、长时间的编码场景。接入细节和字段说明看文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,Claude Code 相关的专项说明在 https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode&utm_campaign=rewrite 。
最后留一个我踩过的坑:别把 Skill 的tools开得太宽。审查类 Skill 只给Read/Grep/Glob,调试类才给Edit/Bash,数据库类用PreToolUse钩子卡住写操作。权限收得越紧,模型越不容易在你不注意的时候改坏东西。