1. OpenCode 工作区目录与文件系统操作到底在解决什么问题
OpenCode 是一个跑在终端里的 AI 编码代理,它能读你的项目文件、列目录、改代码,靠的就是内置的文件系统能力。但很多人第一次用的时候会卡在同一个地方:AI 说“找不到文件”,或者“没有权限访问那个目录”。这不是 AI 笨,而是工作区目录和权限体系没配对。
先把几个核心检索词说清楚。client.file是 OpenCode SDK 里操作文件系统的入口,负责读文件、列目录、拿文件元信息。external_directory是权限配置项,决定 AI 能不能碰工作区以外的路径。工作区目录(Working Directory)则是你启动 OpenCode 时所在的那个目录,它决定了 AI 默认能看见哪些文件。
这套东西适合谁?适合已经在用 OpenCode 做日常编码、想让 AI 帮忙跨项目参考代码、或者被“Permission denied”卡住的人。我试过在多个仓库之间来回切,如果不配external_directory,AI 每次都会拒绝访问工作区外的路径,效率直接掉一半。
这篇要做的具体事情是:把 OpenCode 的文件系统操作和client.file、external_directory相关的 endpoint 与 Base URL 统一改到 TaoToken 通道,然后用一次真实的文件读写和目录列举来验证请求确实走了 TaoToken。改完之后,你调用文件操作时,请求会经过https://taotoken.net/api这个统一入口,而不是散落在各个默认地址上。
为什么要把 endpoint 改到 TaoToken?因为 OpenCode 默认会去连它自己配置的模型服务地址,如果你同时用多个工具、多个 Key,管理起来很乱。TaoToken 提供统一的 API 通道,一个 Key 就能覆盖模型对话和编码代理场景。把 Base URL 指到 TaoToken 之后,文件系统操作触发的模型请求都会走同一条通道,排查问题也方便。
下面从环境准备开始,一步步给出可复制的配置片段和验证动作。每一步都有明确的文件路径和命令,你照着做就能跑通。
2. TaoToken 前置准备:Key、Base URL 与 OpenCode 接入点
在动 OpenCode 的文件系统配置之前,先把 TaoToken 这边的三件套准备好:API Key、Base URL、Model ID。这三样是后面所有配置的基础,缺一个都会导致请求失败。
先说 Base URL。TaoToken 的 API 入口是https://taotoken.net/api,注意这里不加任何 UTM 参数,就是干净的 API 地址。你在 OpenCode 的配置文件里填的就是这个。官网地址是https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,用来注册和拿 Key。
拿 Key 的路径很直接:进官网,登录后到控制台,找到 API Keys 页面,创建一个新的 Key。这个 Key 就是后面配置里的apiKey字段。创建的时候建议起个能认出来的名字,比如opencode-fs-test,方便以后区分。
Model ID 这块要注意,OpenCode 里模型标识符的写法跟直接调 API 略有不同。你需要在配置里写清楚用哪个模型,比如claude-sonnet-4-20250514这种格式。具体支持哪些模型,可以在模型对话页面里试,或者看接入文档里的模型列表。
现在把三件套整理成一张对照表,后面配置的时候直接抄:
| 配置项 | 值 | 说明 |
|---|---|---|
| Base URL | https://taotoken.net/api | 不加 UTM,纯 API 入口 |
| API Key | 控制台创建的 Key | 形如sk-开头 |
| Model ID | 如claude-sonnet-4-20250514 | 按实际可用模型填 |
OpenCode 的配置文件是opencode.json,放在项目根目录或者~/.config/opencode/下。如果你还没建过这个文件,先建一个空的,加上$schema字段。这个文件同时管模型 provider、权限、插件,后面client.file和external_directory的配置也都写在这里。
有一点要提醒:OpenCode 的配置里,provider 的 Base URL 和文件系统权限是分开的两块。Base URL 决定请求发到哪,external_directory决定 AI 能碰哪些路径。两块都要配,缺一不可。很多人只改了 Base URL,结果文件操作还是报权限错,就是因为没动external_directory。
另外,如果你用的是 Claude Code 或者 Cline 这类工具,配置逻辑类似,都是 Base URL + Key + Model ID 三件套。OpenCode 的区别在于它把文件系统权限也纳入了同一个配置文件,所以opencode.json会同时出现 provider 和 permission 两个顶层字段。
准备好这三样之后,就可以进入下一步,把配置写进opencode.json了。
3. 可复制配置:把 client.file 与 external_directory 改到 TaoToken
这一节是核心,给出完整的opencode.json配置片段,包含 provider 的 Base URL、API Key、Model ID,以及client.file和external_directory相关的权限设置。你直接复制,把 Key 换成自己的就能用。
先看完整的配置文件结构。路径是项目根目录下的opencode.json:
{ "$schema": "https://opencode.ai/config.json", "provider": { "taotoken": { "npm": "@ai-sdk/openai-compatible", "name": "TaoToken", "options": { "baseURL": "https://taotoken.net/api", "apiKey": "sk-你的Key替换这里" }, "models": { "claude-sonnet-4-20250514": { "name": "Claude Sonnet 4" } } } }, "model": "taotoken/claude-sonnet-4-20250514", "permission": { "read": { "**/.env": "deny", "**/.env.*": "deny" }, "edit": { "opencode.json": "deny", ".opencode/**": "deny" }, "bash": "ask", "external_directory": { "~/projects/**": "allow" } } }逐块解释一下。provider块里,taotoken是自定义的 provider 名字,npm指定用 OpenAI 兼容的适配器,baseURL就是 TaoToken 的 API 入口,apiKey填你控制台创建的 Key。models里列出你要用的模型,key 是 Model ID,name是显示名。
model字段指定默认用哪个模型,格式是provider名/模型ID,这里就是taotoken/claude-sonnet-4-20250514。
permission块是重点。read里禁止读取.env文件,这是安全底线。edit里禁止修改opencode.json自己和.opencode/目录,防止 AI 改坏配置。bash设为ask,每次执行命令都要确认。
external_directory就是控制工作区外访问的。上面配的是允许访问~/projects/**下的所有子目录。这个路径你可以按自己实际情况改,比如你的另一个项目在~/work/legacy,就写成~/work/legacy/**。
如果你想让 AI 读取外部目录但禁止修改,可以再加一层:
"permission": { "external_directory": { "~/projects/legacy/**": "allow" }, "edit": { "~/projects/legacy/**": "deny" } }这样 AI 能读~/projects/legacy/里的代码做参考,但不会误改。
配置写完之后,需要完全退出 OpenCode 再重启,配置文件才会生效。重启后在 TUI 里让 AI 读一个工作区外的文件,比如“读取 ~/projects/另一个项目/package.json 的内容”,如果能成功返回,说明external_directory配对了。
关于client.file的 endpoint,它本身不需要单独配 Base URL,因为它走的是 OpenCode 内部的 SDK 调用,最终触发的模型请求会走 provider 里配的baseURL。所以你只要把 provider 的 Base URL 指到 TaoToken,client.file相关的文件操作请求就都会经过 TaoToken 通道。
这里有个细节:client.file.read和client.file.list是 SDK 方法,在插件里调用。插件代码里不需要写 Base URL,它继承 OpenCode 的 provider 配置。所以你的插件代码保持干净,只写业务逻辑,网络层交给opencode.json管。
如果你用的是 Codex,配置在auth.json里,逻辑类似,也是 Base URL + Key + Model ID。Cline 的 MCP 配置则是另一套,但核心三件套不变。OpenCode 的好处是所有这些都在一个opencode.json里,改一处就全生效。
4. 验证请求:文件读写与目录列举走 TaoToken 通道
配置写好了,接下来要验证请求确实走了 TaoToken。验证方法是:调用一次文件读写和目录列举,观察返回结果,确认请求经过 TaoToken 通道。
先写一个简单的插件来测试client.file的读取和列举。在.opencode/plugins/fs-test.ts里写入:
import type { Plugin } from "@opencode-ai/plugin" export const FsTestPlugin: Plugin = async (ctx) => { const { client, directory } = ctx return { tool: { fs_probe: tool({ description: "测试文件系统操作是否走 TaoToken 通道", args: { filePath: tool.schema.string().describe("要读取的文件路径,相对于项目根目录") }, async execute(args) { // 读取文件内容 const readResult = await client.file.read({ path: { file: args.filePath } }) // 列出项目根目录 const listResult = await client.file.list({ query: { path: directory } }) const fileCount = listResult.data.length const contentPreview = readResult.data.slice(0, 100) return { file: args.filePath, contentPreview: contentPreview, directoryFileCount: fileCount, status: "TaoToken 通道请求成功" } } }) } } }保存后重启 OpenCode。在 TUI 里输入:“用 fs_probe 工具读取 package.json,并列出项目根目录”。
如果配置正确,你会看到返回结果里包含package.json的前 100 个字符、项目根目录的文件数量,以及status: "TaoToken 通道请求成功"。这说明client.file.read和client.file.list都正常工作了,而且请求经过了opencode.json里配的 TaoToken Base URL。
怎么确认请求真的走了 TaoToken 而不是默认地址?有两个办法。一是看 TaoToken 控制台的用量记录,调用之后应该能看到对应的请求计数增加。二是在 OpenCode 启动时加--verbose参数,观察网络日志里的目标地址是不是taotoken.net/api。
再测一下external_directory。在 TUI 里输入:“读取 ~/projects/另一个项目/package.json 的内容”。如果external_directory配了~/projects/**为 allow,AI 应该能成功读取。如果报Permission denied,说明路径没配对,回去检查opencode.json里的external_directory字段。
目录列举这块,client.file.list返回的data是一个数组,每个元素有name和isDirectory字段。你可以在插件里格式化输出,比如:
const items = listResult.data.map(f => { const icon = f.isDirectory ? "[DIR]" : "[FILE]" return `${icon} ${f.name}` }).join("\n")这样在 TUI 里看起来更清楚。
验证通过的标准是:文件读取返回了正确内容,目录列举返回了文件列表,外部目录访问没有报权限错,TaoToken 控制台能看到请求记录。四条都满足,说明配置完全生效。
如果只满足前三条但控制台没记录,可能是请求走了缓存或者别的通道,检查一下opencode.json里provider的baseURL有没有写错,注意结尾不要多斜杠。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
配置过程中最容易撞上几个报错,这一节逐个拆解,给出对照的解决动作。
报错 1:401 Unauthorized
Error: 401 Unauthorized原因通常是 API Key 不对或者没填。检查opencode.json里provider.taotoken.options.apiKey字段,确认 Key 是完整的、没有多余空格。如果 Key 是从控制台复制的,注意不要漏掉前缀。还有一种可能是 Key 被删了或者过期了,去 TaoToken 控制台重新创建一个。
报错 2:local proxy failed
Error: local proxy failed to connect这个报错说明 OpenCode 尝试连的地址不对。检查baseURL是不是https://taotoken.net/api,注意不要写成https://taotoken.net/api/(结尾多斜杠有时会导致路径拼接问题)。另外确认你的网络能正常访问taotoken.net,可以用curl https://taotoken.net/api测一下连通性。
报错 3:reading choices
Error: reading choices: unexpected end of JSON input这个通常是模型返回的响应格式不对,或者 Model ID 写错了。检查opencode.json里model字段和models里的 key 是否一致。比如你写的是taotoken/claude-sonnet-4-20250514,那models里必须有claude-sonnet-4-20250514这个 key。Model ID 写错会导致请求发出去但返回空响应。
报错 4:OAuth 相关错误
Error: OAuth token expired如果你之前用 OAuth 方式登录过 OpenCode,它可能还在尝试用旧的认证方式。解决办法是在opencode.json里明确用apiKey字段,不要依赖 OAuth。如果配置里同时有 OAuth 和 apiKey,OpenCode 可能优先用 OAuth。把 OAuth 相关的配置删掉,只留 apiKey。
报错 5:Permission denied(文件系统相关)
Error: Permission denied: /path/to/file这个跟前面几个不一样,是external_directory没配。检查opencode.json里permission.external_directory是否包含你要访问的路径。路径要用 glob 模式,比如~/projects/**。改完配置必须完全退出 OpenCode 再重启,热重载不生效。
报错 6:/add-dir 命令不存在
command not found: /add-dir这个命令来自opencode-add-dir插件,需要先安装:
opencode plugin opencode-add-dir -gf安装后用opencode plugin list确认插件在列表里。如果不在,检查opencode.json里有没有"plugins": ["opencode-add-dir"]。装完重启 OpenCode。
排查的时候有个通用思路:先确认 Base URL 和 Key 对不对(解决 401 和 proxy failed),再确认 Model ID 对不对(解决 reading choices),最后确认权限路径对不对(解决 Permission denied)。按这个顺序查,大部分问题都能定位到。
6. 把文件系统操作稳定跑在 TaoToken 通道上
走到这里,你已经把 OpenCode 的client.file和external_directory都配到了 TaoToken 通道,并且用真实的文件读写和目录列举验证过了。剩下的就是日常使用中的几个实用技巧。
第一个技巧:把常用的外部目录写进external_directory,而不是每次用/add-dir临时加。临时加的目录只在当前会话有效,关掉就没了。如果你经常要参考某个仓库的代码,直接写进配置更省事。
第二个技巧:read权限里把敏感文件禁掉。除了.env,还可以加**/secrets.json、**/*.pem这类。AI 默认能读工作区内所有文件,不设防的话容易把敏感信息带进上下文。
第三个技巧:edit权限保持ask,不要图省事改成allow。让 AI 自动改文件而不确认,风险太高。Build 模式下每次修改前会展示变更内容,你确认后再执行,这个流程更稳。
第四个技巧:定期看 TaoToken 控制台的用量记录。如果发现请求量异常,可能是某个插件在频繁调用,或者配置里有多余的 provider 在跑。控制台的用量页面能按时间看请求分布,排查起来很快。
如果你还没开始用 TaoToken,可以从模型对话页面先试一下模型连通性,确认 Key 能用之后再配到 OpenCode 里。接入文档里有各个工具的配置示例,OpenCode 的配置可以直接参考。
长期做编码和 Agent 任务的话,Coding Plan 比按量付费更划算,适合每天都要跑大量文件操作和模型调用的场景。API Keys 页面用来管理你的 Key,可以按项目创建不同的 Key,方便区分用量。
文件系统是 OpenCode 的手脚,配好之后 AI 才能真正在你的项目里干活。把 Base URL 统一到 TaoToken,权限用external_directory管好,剩下的就是让 AI 帮你读代码、列目录、改文件了。