词元之母TOK.MOM - 平台充值汇率 1:1 即 1 人民币充值到账 1 美元,支持一个 Key 调用近 600+ 海内外模型,限时特价模型低至 1 折,欢迎上岸!
💡 一句话总结:把公司统一登录拿到的 Token 接进 OpenCode,让团队不用手填 Key,默认就能走内网模型干活。

auth.command 保存 token;后续启动只注入已保存 token + 拉取组织默认配置(不自动续期)/.well-known/opencode 给团队下发默认配置(比如强制走内部 AI 网关)
corpctl token、sso login --print-token)https://<host>/.well-known/opencodehttps://ai.company.internalopencode auth login <url>。<url>/.well-known/opencode,读到 auth.command 和 auth.env,然后在本机执行 auth.command 取回 Token 并保存(源码:packages/opencode/src/cli/cmd/auth.ts)。type: "wellknown" 的凭据,它会在运行时设置 process.env[auth.env]=token,并把 <url>/.well-known/opencode 里的 config 当成“组织默认配置”合并进来(源码:packages/opencode/src/config/config.ts)。/.well-known/ 是一个约定俗成的“固定目录”,常用来放服务发现信息:客户端只要访问一个固定路径,就能拿到机器可读的配置。/.well-known/opencode。auth:告诉 OpenCode 用什么命令拿到 Token(auth.command),以及把 Token 注入到哪个环境变量(auth.env)config:组织默认配置(会被合并进 OpenCode 的配置系统)auth.command(源码:packages/opencode/src/cli/cmd/auth.ts)。而且启动时也会拉取 config 并合并(源码:packages/opencode/src/config/config.ts)。config 里如果包含 plugin,OpenCode 可能会自动安装插件包并 import() 执行(源码:packages/opencode/src/plugin/index.ts)。/.well-known/opencode 当成“组织发给开发机的配置入口”,只应该部署在你们可控、可信的内网域名上。/.well-known/opencode(组织默认)~/.config/opencode/{config.json,opencode.json,opencode.jsonc})OPENCODE_CONFIG)opencode.json{,c}).opencode/ 目录配置(包含 .opencode/opencode.json{,c} 和 .opencode/plugin/ 等)OPENCODE_CONFIG_DIR 指定一个额外的配置目录(它会被当成目录来源的一部分加载,源码:packages/opencode/src/config/config.ts)OPENCODE_CONFIG_CONTENT)packages/opencode/src/config/config.ts)。wellknown.config 更适合做“团队默认开箱体验”。plugin/instructions 这类数组字段在合并时是“合并并去重”,不是简单覆盖(源码:packages/opencode/src/config/config.ts 的 merge 逻辑:用 Set 按完整字符串值去重)。plugin 还会再做一次“按插件名去重”,并且高优先级来源会覆盖低优先级来源的同名插件(源码:packages/opencode/src/config/config.ts 的 deduplicatePlugins())。| 你们的现状 | 选哪种 |
|---|---|
| 已经有固定 Key(或你能在 K8s/CI 里很方便注入 Token) | 环境变量 |
| 能用一条命令输出 Token,且想把默认配置统一下发 | well-known |
| 必须走 OAuth/设备码/需要自动刷新/需要签名或改 headers/params | 认证插件 |
opencode.json 配一个内网 provider,并明确它从哪个环境变量读 key:// opencode.json
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"corp-gateway": {
"name": "Company AI Gateway",
"env": ["COMPANY_AI_TOKEN"],
"api": "https://ai-gateway.company.internal/v1",
"npm": "@ai-sdk/openai-compatible",
"models": {
"qwen2.5-72b": {
"name": "Qwen 2.5 72B",
"tool_call": true,
"reasoning": true,
"temperature": true,
"limit": { "context": 128000, "output": 8192 }
}
}
}
},
"model": "corp-gateway/qwen2.5-72b"
}$env:COMPANY_AI_TOKEN = "<your-token>"
opencode run -m corp-gateway/qwen2.5-72b "ping"opencode run 能返回模型输出。COMPANY_AI_TOKEN 做成 K8s Secret 或 CI Secret 注入就行,不需要每个人在本机登录。https://<host>/.well-known/opencode。auth.command 只在你执行 opencode auth login <url> 时运行一次,并把 token 保存到本机。
/.well-known/opencode 响应opencode auth login <url> 的行为完全由这个 JSON 驱动:它告诉 OpenCode 用什么命令获取 Token、把 Token 放到哪个环境变量,以及要下发哪些组织默认配置。https://ai.company.internal/.well-known/opencode 返回它):{
"auth": {
"command": ["corpctl", "ai", "token", "--format=plain"],
"env": "COMPANY_AI_TOKEN"
},
"config": {
"$schema": "https://opencode.ai/config.json",
// 可选:强制禁用外网 Provider(示例)
"disabled_providers": ["openai", "anthropic", "openrouter"],
// 配置公司内部 AI 网关(OpenAI Compatible)
"provider": {
"corp-gateway": {
"name": "Company AI Gateway",
"env": ["COMPANY_AI_TOKEN"],
"api": "https://ai-gateway.company.internal/v1",
"npm": "@ai-sdk/openai-compatible",
"models": {
"qwen2.5-72b": {
"name": "Qwen 2.5 72B",
"tool_call": true,
"reasoning": true,
"temperature": true,
"limit": { "context": 128000, "output": 8192 }
}
}
}
},
// 让团队默认就用内网模型
"model": "corp-gateway/qwen2.5-72b"
}
}https://ai.company.internal/.well-known/opencode 能返回上面的 JSON。auth.command 必须能在开发机/容器里运行;它的 stdout 会被当成 Token。auth.env 是环境变量名。OpenCode 启动时会在当前进程里设置 process.env[auth.env]=token(不等同于写入你的系统全局环境变量)。opencode auth login 把凭据写入本机type: "wellknown" 的凭据落到本机的 auth.json 里。之后每次启动 OpenCode,它都会自动注入环境变量并拉取远程 config。Running \corpctl ai token --format=plain``Logged into https://ai.company.internalhttps://ai.company.internal wellknown(provider 名称可能直接显示成 URL)。run)opencode run,看它能否用你们的内网模型完成任务。.opencode/plugin/corp-auth.ts:import type { Plugin } from "@opencode-ai/plugin"
const plugin: Plugin = async () => {
return {
auth: {
// 这里要和你配置的 provider id 一致
provider: "corp-gateway",
methods: [
{
type: "api",
label: "Login with Company SSO",
async authorize() {
// 换成你们的取 token 逻辑:命令行/HTTP/本地缓存等
const token = "<replace-me>"
return { type: "success", key: token }
},
},
],
async loader(getAuth) {
const auth = await getAuth()
if (!auth || auth.type !== "api") return {}
return {
apiKey: auth.key,
// headers: { "X-Tenant": "..." },
}
},
},
// 真要改 headers/params/签名,走这些 hook 更直接
// "chat.headers": async (_input, output) => { output.headers["X-Sign"] = "..." },
// "chat.params": async (_input, output) => { output.options["seed"] = 1 },
}
}
export default plugin.opencode/plugin/ 目录后,OpenCode 会自动扫描并加载(不需要额外写 opencode.json)。file://... URL:// opencode.json
{
"plugin": ["./.opencode/plugin/corp-auth.ts"]
}opencode auth login 走插件登录corp-gateway)通常不会出现在这里Other,再输入 provider id:corp-gateway,然后进入你插件 methods 定义的登录流程opencode run -m corp-gateway/qwen2.5-72b ... 能跑通https://<host>/.well-known/opencode 能返回 JSON,且 opencode auth login <url> 能成功opencode auth login 能走插件登录并保存凭据model: "corp-gateway/...")| 现象 | 原因 | 解决 |
|---|---|---|
登录后在另一个终端里 echo $COMPANY_AI_TOKEN 没有值 | well-known 的 token 是在 OpenCode 启动时写入当前进程的 process.env,不会写进你的 .zshrc/.bashrc | 不影响 OpenCode 调用模型;用 opencode run -m corp-gateway/... 验证即可;如果你确实需要在 shell 里看到,得自己 export COMPANY_AI_TOKEN=... |
opencode auth login 直接报 404/2000+ | /.well-known/opencode 不可达 | 先用浏览器/curl 验证 URL 可访问 |
提示 Failed / 没有 Logged into ... | auth.command 退出码非 0 | 确保命令能在当前机器运行,且 stdout 输出 Token |
| OpenCode 启动时报错并退出 | 远程 well-known 拉取失败会抛错,中断配置加载 | 先保证 <url>/.well-known/opencode 可达;排障时可用 opencode auth logout 移除这条 URL 凭据再启动 |
opencode auth login 找不到你们的 provider | 你们的 provider 不在 models.dev 列表 | 选 Other,手动输入 provider id(例如 corp-gateway) |
| 登录成功但配置不生效 | 只保存了 Token,没有返回 config | 在 well-known JSON 里补上 config 字段 |
| 容器里能登录,本地不行(或反过来) | 命令/证书链差异 | 确保容器和本机都装了公司根证书,并且 auth.command 在两边都可用 |
| 内网网关返回 401 | Token 未被 provider 读取到或已过期 | 检查 auth.env 名称是否一致;用第 4 步 opencode run -m ... 复测;必要时重新 opencode auth login <url> |
插件放进 .opencode/plugin/ 但没生效 | 依赖准备未完成:OpenCode 会对扫描到的目录调用 installDependencies(dir)。目录里没有 package.json/.gitignore 才会写入;并尝试执行 bun add @opencode-ai/plugin@<version> --exact 与 bun install(两条 bun 命令失败会被吞;写文件没有 catch)。只有当 <dir>/node_modules 不存在时才会等待安装流程;如果已存在则安装会后台触发、不等待完成 | 确保能访问 npm/内网镜像;必要时手动进对应目录执行 bun install,或把依赖提前打进镜像/缓存(源码:packages/opencode/src/config/config.ts 的 installDependencies()) |
| 担心 well-known 不安全 | 远程 JSON 既能下发 auth.command(会在本机执行),也能下发 config(启动时会被拉取并合并;其中 plugin 可能触发插件安装与执行) | 把 /.well-known/opencode 当成“组织发配置的入口”:只部署在可信内网域名;限制访问;对返回内容做审计;非必要不要在远程 config 里下发 plugin |
下一课我们会把认证和网关能力做得更灵活:学会插件系统后,你可以写出真正“企业级”的自定义登录流程和请求改写。 下一课:5.12a 插件基础。
更新时间:2026-02-05
| 功能 | 文件路径 | 行号 |
|---|---|---|
opencode auth login <url>:拉取 /.well-known/opencode 并执行 auth.command,保存 type: wellknown 凭据 | src/cli/cmd/auth.ts | 231-252 |
启动时加载 well-known:把 token 写入 auth.env 环境变量,并合并远程 config | src/config/config.ts | 62-91 |
认证信息存储结构(oauth/api/wellknown)与 auth.json 写入逻辑 | src/auth/index.ts | 7-69 |
插件认证钩子 auth 的类型定义(methods/loader) | packages/plugin/src/index.ts | 37-156 |
| OpenCode 插件加载机制(内置插件 + 配置里的插件列表) | src/plugin/index.ts | 15-90 |
opencode run 命令参数(-m provider/model) | src/cli/cmd/run.ts | 28-94 |
Auth.WellKnown:{ type: "wellknown", key: string, token: string }AuthHook:插件认证接口,支持 api / oauth 两种 methods