ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Opencode 开源 AI 助手使用指南:CLI 接入 TaoToken 与 Skills 配置

Opencode 开源 AI 助手使用指南:CLI 接入 TaoToken 与 Skills 配置 1. 为什么要在 Opencode 里统一管理多模型 KeyOpencode 是一个开源的 AI 编程助手 CLI 工具能做什么简单说它把「终端里跟大模型结对写代码」这件事做成了一个可扩展的平台支持多模型切换、支持 Skills 扩展、支持 MCP 协议还能和 Obsidian 这类知识库工具串起来。适合谁适合那些不想被单一厂商绑定、希望把 Claude、GPT、Gemini 以及国产模型放在同一个入口里调用的开发者。但真正用起来第一个卡点往往不是功能而是 Key 管理。我一开始的做法很原始每个供应商一个环境变量ANTHROPIC_API_KEY、OPENAI_API_KEY、GEMINI_API_KEY各存一份配置文件里再写一遍 base_url。结果就是三套账单、三套额度、三套限流规则切换模型时还要改配置重启终端。更麻烦的是某些供应商的 endpoint 在国内访问不稳定写代码写到一半请求超时排查半天发现是网络链路问题而不是代码问题。所以这篇的核心目标很明确把 Opencode 的 endpoint 和 API Key 统一改到一个聚合入口上用一份 Key 管理多个模型同时把 Skills 配置和 Obsidian 笔记流跑通最后用一次真实请求验证返回正常。整个过程我会给出可直接复制的配置片段包括 JSON 和 TOML 两种格式路径和字段名都按 Opencode 的实际约定来写。需要提前说明的是Opencode 的配置体系分两层一层是全局配置放在用户目录下另一层是项目级配置放在项目根目录。全局配置决定默认供应商和默认模型项目级配置可以覆盖它。Skills 则是独立的 markdown 文件放在指定目录里被自动加载。这三者的关系理清楚后面配置就不会乱。另外提醒一点Opencode 本身是开源免费的它不绑定任何特定供应商。你接哪家模型、用哪个 endpoint完全由配置文件决定。这也是它比很多闭源助手更灵活的地方——你可以今天用 A 模型写架构明天用 B 模型改 bug配置改一行就行。2. TaoToken 前置准备拿到 Base URL 和 API Key在改 Opencode 配置之前你需要先准备好两样东西一个可用的 Base URL和一个 API Key。TaoToken 在这里扮演的角色是统一的模型接入层你不需要为每个模型单独申请 Key也不需要记多个 endpoint。第一步打开官网注册并登录https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。注册流程很常规邮箱加密码即可这里不展开。第二步进入控制台创建 API Key。控制台地址是 https://taotoken.net/console 登录后找到 API Keys 页面点新建复制生成的 Key。这个 Key 只显示一次建议立刻存到密码管理器里。API Keys 页面的直达链接是 https://taotoken.net/api-keys 后面如果忘了在哪建直接走这个链接。第三步确认 Base URL。TaoToken 的 API 入口是 https://taotoken.net/api 注意这个地址不带任何查询参数配置里就写这个。有些工具要求结尾带/v1Opencode 这边按它的 provider 约定来下面配置片段里我会写清楚。第四步确认你要用的 Model ID。TaoToken 支持多种模型具体可用列表在文档里查https://taotoken.net/doc 。Model ID 的写法通常是厂商/模型名这种格式比如anthropic/claude-sonnet-4之类。配置时这个 ID 必须和文档里完全一致大小写错了会直接报模型不存在。这里有个容易踩的坑很多人把 Base URL 写成https://taotoken.net/api/带尾斜杠或者写成https://taotoken.net/api/v1。Opencode 在拼接请求路径时如果 Base URL 已经带了/v1最终请求会变成/v1/v1/chat/completions直接 404。所以记住Base URL 就写https://taotoken.net/api不要自作主张加后缀。还有一点API Key 不要硬编码在会提交到 git 的配置文件里。Opencode 支持从环境变量读取 Key推荐做法是把 Key 放到 shell 的 profile 文件里配置文件里用变量引用。这样即使项目配置被推到公开仓库Key 也不会泄露。准备好这三样——Base URL、API Key、Model ID——就可以进入下一步改配置了。3. 可复制配置Opencode 接入 TaoToken 的 JSON 与 TOML 片段Opencode 的配置文件位置和格式不同版本略有差异。目前主流版本支持 JSON 和 TOML 两种格式全局配置一般放在~/.config/opencode/config.json或~/.config/opencode/config.toml项目级配置放在项目根目录的.opencode/config.json。下面两种格式我都给出来你按自己实际用的版本选一种。先看 JSON 格式。这是全局配置路径~/.config/opencode/config.json{ provider: { taotoken: { type: openai-compatible, baseURL: https://taotoken.net/api, apiKey: {env:TAOTOKEN_API_KEY}, models: { claude-sonnet-4: { id: anthropic/claude-sonnet-4, name: Claude Sonnet 4 }, gpt-4o: { id: openai/gpt-4o, name: GPT-4o } } } }, defaultProvider: taotoken, defaultModel: claude-sonnet-4 }这里几个字段要解释清楚。type写openai-compatible因为 TaoToken 的接口兼容 OpenAI 的 chat completions 协议Opencode 用这个类型去发请求。baseURL就是上一步确认的https://taotoken.net/api。apiKey用{env:TAOTOKEN_API_KEY}这种语法表示从环境变量读取Opencode 启动时会去解析。models下面每个条目是一个模型别名id是发给 TaoToken 的真实 Model IDname是显示名。再看 TOML 格式路径~/.config/opencode/config.tomldefaultProvider taotoken defaultModel claude-sonnet-4 [provider.taotoken] type openai-compatible baseURL https://taotoken.net/api apiKey {env:TAOTOKEN_API_KEY} [provider.taotoken.models.claude-sonnet-4] id anthropic/claude-sonnet-4 name Claude Sonnet 4 [provider.taotoken.models.gpt-4o] id openai/gpt-4o name GPT-4oTOML 的层级用点号表示[provider.taotoken.models.claude-sonnet-4]对应 JSON 里的嵌套结构。两种格式语义完全一致选你顺手的。接下来设置环境变量。在~/.zshrc或~/.bashrc里加一行export TAOTOKEN_API_KEY你的实际Key然后source ~/.zshrc让它生效。验证一下echo $TAOTOKEN_API_KEY能打印出 Key 就说明环境变量没问题。如果你用的是项目级配置路径是项目根目录的.opencode/config.json内容可以只覆盖 provider 部分defaultModel 继承全局。这样不同项目可以用不同模型比如写前端用 GPT-4o写后端用 Claude。配置改完后用opencode --version确认 CLI 能正常启动再用opencode config之类的子命令具体看版本检查配置是否被正确加载。如果启动时报provider not found八成是 provider 名字拼错了或者配置文件路径不对。4. 验证请求一次完整调用与成功结果确认配置写完不算完必须发一次真实请求确认链路通。Opencode 的验证方式有两种一种是用 CLI 直接发一条 prompt另一种是进交互模式跑一轮对话。我先说 CLI 方式。最直接的验证命令是让 Opencode 用指定模型回答一个简单问题opencode run --model taotoken/claude-sonnet-4 用一句话解释什么是递归如果配置正确你会看到终端里流式输出一段回答类似「递归是函数调用自身来解决问题的方法」。同时请求会打到https://taotoken.net/api返回 200。如果报 401说明 Key 没读到或者 Key 无效如果报 404说明 Base URL 或 Model ID 有问题。第二种方式是进交互模式opencode进去之后默认用defaultModel你可以直接输入问题。交互模式的好处是能看到完整的会话上下文方便调试 Skills。验证通过后我们来做一次带 Skills 的完整调用。Skills 是 Opencode 的扩展机制本质是一个 markdown 文件里面用自然语言描述某个任务该怎么做。假设我们要做一个「把需求文档转成 Excalidraw 架构图」的 Skill先在 Skills 目录下建文件。Skills 目录通常在~/.config/opencode/skills/或项目级.opencode/skills/。新建~/.config/opencode/skills/excalidraw-diagram/SKILL.md内容大致是--- name: excalidraw-diagram description: 根据需求文档生成 Excalidraw 架构图 --- 当用户提供需求文档时按以下步骤生成架构图 1. 提取系统的主要分层用户层、逻辑层、数据层、外部服务层 2. 为每层列出关键组件 3. 用 Excalidraw 的 JSON 格式输出包含矩形节点和带箭头的连线 4. 节点按层分组用不同颜色区分 5. 连线表示数据流向标注方向然后在 Opencode 里调用opencode run --model taotoken/claude-sonnet-4 --skill excalidraw-diagram 根据这份需求生成架构图一个笔记应用用户能创建笔记笔记存到数据库支持导出 PDF如果 Skill 被正确加载模型会按 SKILL.md 里的步骤输出结构化的 Excalidraw JSON。你可以把这段 JSON 贴到 Excalidraw 里看效果。这一步验证的是「配置 Skills 模型」三者串通。关于 Obsidian 笔记流我的做法是用 Opencode 桌面端或 CLI 生成内容输出成 markdown然后放到 Obsidian 的 vault 目录里。Obsidian 只负责查看和整理不参与生成。这样避免了在 Obsidian 里装插件、还要后台常驻 CLI 的麻烦。如果你确实想用 Obsidian 插件社区有个opencode-obsidian但需要手动装而且依赖 CLI 后台运行体验一般不推荐作为主力方案。验证成功的标志有三个终端有流式输出、没有报错、返回内容符合预期。三个都满足说明整条链路通了。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth配置过程中最容易撞上的几类报错我按实际遇到的顺序列出来每个都给排查路径。401 Unauthorized。这是最高频的。原因通常有三个一是环境变量没生效echo $TAOTOKEN_API_KEY打印为空说明 profile 没 source 或者写错了文件二是配置文件里 apiKey 字段写的是字面量而不是{env:...}语法Opencode 没去读环境变量三是 Key 本身失效或被删了去控制台 https://taotoken.net/api-keys 确认一下 Key 还在不在。排查顺序先确认环境变量再确认配置语法最后确认 Key 有效性。local proxy failed。这个报错说明 Opencode 尝试走本地代理但失败了。常见原因是系统里设了HTTP_PROXY或HTTPS_PROXY环境变量但代理服务没启动。检查env | grep -i proxy如果有残留的代理变量unset 掉再试。另一个可能是配置文件里写了proxy字段但地址不对。Opencode 直连https://taotoken.net/api即可不需要额外代理配置。Error reading choices / reading choices 相关报错。这类报错通常出现在流式响应解析阶段说明返回的数据格式和 Opencode 预期的 OpenAI 格式对不上。原因可能是 Model ID 写错了请求打到了不兼容的接口或者 Base URL 多写了/v1导致路径拼接错误。检查 Model ID 是否和文档一致Base URL 是否是https://taotoken.net/api不带后缀。OAuth 相关报错。如果你之前配过某些需要 OAuth 的 provider比如通过 OAuth 接 Google 的模型切换配置后可能残留 OAuth 缓存导致 Opencode 还在尝试走旧认证。清理~/.config/opencode/下的 auth 缓存文件或者直接删掉旧的 provider 配置块。OAuth 和 API Key 是两套认证机制不要混用。模型不存在 / model not found。Model ID 大小写敏感anthropic/claude-sonnet-4和Anthropic/Claude-Sonnet-4是两个不同的字符串。去文档 https://taotoken.net/doc 复制准确的 ID不要手打。Skills 不生效。检查 SKILL.md 的 frontmatter 格式name和description必须有且name要和目录名一致。另外确认 Skills 目录路径对不对全局是~/.config/opencode/skills/项目级是.opencode/skills/。调用时--skill参数的值要和name一致。排查的核心思路是先确认配置被加载再确认请求发对了地址最后确认返回格式兼容。三步走下来大部分问题都能定位。6. 长期使用建议与接入入口跑通之后日常使用还有几个优化点。第一把常用模型配成别名比如fast指向便宜快的模型smart指向能力强的模型切换时只改--model参数。第二Skills 按项目组织通用 Skill 放全局项目专属 Skill 放项目目录避免全局目录臃肿。第三定期检查 Key 的用量和额度控制台 https://taotoken.net/console 能看到调用记录。如果你主要做长期编码或者 Agent 类任务可以考虑 Coding Plan入口是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。如果只是想先验证模型效果用模型对话页面快速试一下https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 遇到配置问题先翻文档。最后说一个实际经验Opencode 的配置改动后最好重启一次终端再验证因为环境变量和配置缓存有时不会热加载。我踩过的坑就是改完配置直接跑结果读的还是旧配置白白排查了半小时。重启终端这个动作能省掉很多莫名其妙的报错。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进