OpenCode 用 Glob 搜文件没反应?TaoToken 通道排查 /v1 是否多填
在 OpenCode 里让 Agent 用 Glob 工具找文件,pattern 明明写了**/*.ts,结果它要么返回空列表,要么工具调用直接失败,甚至干脆不调用 Glob,改用 Bash find 去猜。很多人第一反应是 pattern 语法写错了,或者 path 填得不对。但排障多了会发现,有一类“没反应”根本不是 Glob 工具本身的问题,而是模型通道地址配错:在 TaoToken 的 API 地址https://taotoken.net/api后面多填了/v1。TaoToken 官网是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=opencode-glob ,先在那里创建 Key,然后把 OpenCode 的 Base URL 填成https://taotoken.net/api,不要带/v1。TaoToken 在整条排查链路里只负责提供正确的模型通道,Glob 的工具逻辑仍然按 OpenCode 原来的 pattern/path 提示词走。通道配通之后,Agent 才能正常发起工具调用,Glob 也才能把文件列表稳定返回。下面按排障顺序,把现象、前置、配置、验证和常见错因拆开讲。
原问题与场景:OpenCode Glob 工具“没反应”的三种表现
OpenCode 的 Glob 工具本质上是一个文件名匹配器,它按 pattern 去匹配文件路径,返回结果会按时间戳排序,让 Agent 优先看到最近修改的文件。它不负责读文件内容,内容级搜索应该交给 Grep。也正因为 Glob 是本地工具,很多人会误以为“它不依赖网络,所以没反应肯定是 pattern 写错了”。这个判断只对了一半:Glob 执行确实在本地,但是否发起 Glob 调用、用什么参数调用,是由模型决定的。如果模型通道不通,Agent 在第一步就失败了,后面根本走不到 Glob 执行。
实际排障时,OpenCode 用 Glob 搜文件没反应,通常有三种表现。
第一种,Agent 回复“没有找到文件”,工具返回空数组。文件明明在项目里,但 Glob 就是搜不出来。这时要分两种情况:如果模型请求正常,Glob 也真的执行了,那多半是 pattern 或 path 的问题;如果模型请求本身就报错,或者工具调用日志里根本没有glob这个工具名,那就要先查通道。
第二种,工具调用直接报错,日志里出现 404、invalid endpoint、not found 之类的信息。这类报错最典型的原因就是 Base URL 多填了/v1。TaoToken 的 API 地址是https://taotoken.net/api,如果再拼上/v1,请求路径就变成了https://taotoken.net/api/v1/...,和实际端点不匹配,模型请求会先失败。OpenCode 的 Agent 拿不到模型返回,自然不会继续调用 Glob。
第三种,Agent 不调用 Glob,改用 Bash 的 find、ls,或者直接猜路径。这种情况不一定是通道坏了,也可能是模型没有正确理解工具提示词。OpenCode 给 Glob 的提示词里强调:pattern 必填,使用标准 Glob 语法;path 可选,默认当前工作目录;不要给 path 填undefined或null;想缩小范围时再填具体路径。如果模型没按这个提示词走,它可能会绕过 Glob。但排障顺序仍然建议先确认通道,再调提示词和参数,因为通道问题会放大所有工具调用的不确定性。
本篇聚焦的场景很明确:OpenCode 里 Glob 搜文件没反应,怀疑模型通道地址多填了/v1。先把 Base URL 改回https://taotoken.net/api,再去看 pattern 和 path,能少走很多弯路。
TaoToken 前置:先拿 Key,再确认 API 地址与 opencode.json
排障的第一步不是改 pattern,而是确认模型通道的入口。到 TaoToken 官网创建 Key,地址是:
https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=opencode-glob
创建完成后,你会拿到一个 API Key。本文里统一用YOUR_API_KEY表示,实际配置时替换成你自己的 Key。Key 不要提交到 Git 仓库,也不要用截图发到公开渠道。
接着确认两个地址:
- 官网入口:
https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=opencode-glob - API 地址:
https://taotoken.net/api
注意 API 地址后面不要加/v1。这是本篇最关键的检查点。很多 OpenAI 兼容工具的习惯是 Base URL 填https://api.openai.com/v1,所以有人会顺手把 TaoToken 的地址也写成https://taotoken.net/api/v1。但 TaoToken 的兼容层已经处理了路径,Base URL 应该是https://taotoken.net/api。多填/v1后,底层 SDK 再拼上/chat/completions,就会变成/api/v1/chat/completions,请求自然失败。
还要确认模型 ID。OpenCode 需要知道调用哪个模型,MODEL_ID要换成 TaoToken 当前支持的模型标识。模型 ID 写错时,常见表现是 400 或 404,而不是 Glob 本身报错。所以排障时要区分:404 可能是地址多填/v1,也可能是模型 ID 不存在;401 多半是 Key 无效;403 可能是权限或余额问题。先看报错类型,再决定改哪里。
如果你使用 Claude Code,对应的是settings.json和ANTHROPIC_*环境变量;如果使用 Codex,对应的是config.toml。OpenCode 的配置入口通常是opencode.json,下面给出可复制版本。不同 OpenCode 版本字段可能有差异,最终以接入文档为准。
可复制配置:opencode.json 里 Base URL 不要带 /v1
OpenCode 的配置可以放在项目根目录的opencode.json,也可以放在全局配置目录。排障时建议先用项目级配置,减少全局环境变量干扰。下面是一个 OpenAI 兼容 provider 的示例:
{ "$schema": "https://opencode.ai/config.json", "provider": { "taotoken": { "npm": "@ai-sdk/openai-compatible", "name": "TaoToken", "options": { "baseURL": "https://taotoken.net/api", "apiKey": "YOUR_API_KEY" }, "models": { "MODEL_ID": { "name": "MODEL_ID" } } } }, "model": "taotoken/MODEL_ID" }这段配置里,baseURL必须是https://taotoken.net/api,末尾没有/v1,也没有多余的斜杠。apiKey换成你的真实 Key。MODEL_ID换成你能用的模型标识,两处保持一致。保存后重启 OpenCode,因为配置通常在启动时加载。
如果你不想改 JSON,也可以用环境变量做一次快速验证:
export OPENAI_BASE_URL="https://taotoken.net/api" export OPENAI_API_KEY="YOUR_API_KEY"注意,不同 OpenCode 版本读取的环境变量名可能不同,有些版本会从 provider 配置里读取,有些会走底层 SDK 的默认变量。环境变量只适合临时排查,长期使用还是建议写进opencode.json,避免和系统里旧的OPENAI_BASE_URL冲突。
如果你已经安装了 TaoToken CLI,也可以用命令行快速确认通道是否可用:
npm i -g @taotoken/taotoken taotoken cc -k YOUR_API_KEY -u https://taotoken.net/api -m MODEL_ID这条命令的作用是验证 Key、API 地址和模型 ID 是否匹配。它不替代 OpenCode 的 Glob 工具,只是帮你把“模型通道”和“工具参数”这两层问题分开。通道验证通过后,再回到 OpenCode 里测 Glob,思路会清晰很多。
配置完成后,检查一下有没有旧配置覆盖。比如项目里存在多个opencode.json,或者全局配置里还有一份旧的 provider,OpenCode 可能会读到旧地址。排障时可以把旧的 provider 临时注释掉,只保留 TaoToken 这一份。
验证请求:让 Agent 再跑一次 Glob 并检查返回
配置改好并重启 OpenCode 后,不要直接丢一个模糊任务,而是给 Agent 一个明确的 Glob 指令。比如在项目根目录启动 OpenCode,然后输入:
请用 Glob 工具搜索 **/*.md,path 省略,不要用 Bash find。这条指令同时约束了三件事:使用 Glob 工具、给出 pattern、明确 path 省略。接下来观察 OpenCode 的工具调用日志。如果通道正常,你会看到类似这样的调用:
tool: glob pattern: "**/*.md" path: (empty)如果返回结果里列出了文件,并且顺序和修改时间有关,说明模型通道和 Glob 工具都通了。此时如果结果不符合预期,再去调 pattern 和 path。
如果日志里出现 404 或 invalid endpoint,优先检查baseURL是不是写成了https://taotoken.net/api/v1。把它改回https://taotoken.net/api,重启 OpenCode 再试。如果出现 401 或 403,检查 Key 是否复制完整、是否已经替换YOUR_API_KEY、账户是否有可用权限。如果出现 400,检查模型 ID 是否正确。
如果通道验证通过,但 Glob 返回空,可以按下面的顺序排查:
- pattern 是否用了标准 Glob 语法。Glob 支持通配符,但不要把完整正则塞进 pattern。多个文件类型建议并发调用多次,而不是在一个 pattern 里写复杂表达式。
- path 是否误填了
undefined或null。Glob 提示词明确警告不要这样填,想用默认工作目录就直接省略该字段。 - 当前工作目录是否就是项目根目录。如果 OpenCode 从别的目录启动,Glob 的默认搜索范围也会变。
- 是否把搜索范围放得太大,扫进了
node_modules或dist。这类目录文件多、噪声大,建议用 path 缩小范围。 - 是否应该用 Grep。Glob 按文件名找文件,Grep 按文件内容找代码。想搜
log.*Error这类内容,应该换 Grep。
你也可以用模型对话页面单独验证模型通道,排除 OpenCode 配置本身的干扰:
https://taotoken.net/console/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=opencode-glob
在对话页面发一条简单消息,如果正常返回,说明 Key 和 API 地址没问题。再回到 OpenCode 里测 Glob,问题范围就缩小到工具参数或提示词上了。
本篇常见错排查:/v1、模型 ID、Key 与代理变量
第一个高频错误:Base URL 多填/v1。这是本篇标题对应的核心问题。正确写法是https://taotoken.net/api,不是https://taotoken.net/api/v1。改完必须重启 OpenCode。
第二个错误:Key 没有替换。配置文件里还留着YOUR_API_KEY,或者复制时少了字符。检查 Key 时不要用眼睛数,直接重新复制一次。
第三个错误:模型 ID 写错。MODEL_ID只是占位符,必须换成实际支持的模型标识。模型 ID 错误时,Glob 可能还没执行,模型请求就先返回 400 或 404。
第四个错误:环境变量冲突。系统里可能还存在旧的OPENAI_BASE_URL、OPENAI_API_KEY,或者 Claude Code 的ANTHROPIC_BASE_URL。这些变量可能覆盖opencode.json里的配置。排障时先清掉无关变量,或者用env | grep -i openai、env | grep -i anthropic检查一遍。
第五个错误:配置层级冲突。项目级opencode.json、全局配置、环境变量可能同时存在。OpenCode 读取顺序不同,最终生效的地址可能不是你以为的那个。建议先用一份最小配置验证,通过后再合并。
第六个错误:path 填了null或undefined。Glob 提示词里专门强调过,想用默认工作目录就省略该字段,不要填这两个词。填了之后工具行为可能不符合预期。
第七个错误:pattern 写成复杂正则。Glob 是文件名匹配工具,不是内容正则工具。function\s+\w+这类应该交给 Grep,Glob 只负责用**/*.ts、src/**/*.md这样的通配符找文件。
第八个错误:在node_modules、dist、.git里大面积搜索。Glob 虽然能扛住大仓库,但搜索结果会被噪声淹没。更合理的做法是先用宽泛 pattern 找候选,再用 path 缩小范围,最后用 Grep 做内容级筛选。
第九个错误:Agent 不调用 Glob。如果通道正常、参数也正常,但模型就是不调用 Glob,可以在指令里明确写“使用 Glob 工具”“不要用 Bash find”“path 省略”。OpenCode 的 Glob 提示词本身鼓励饱和式搜索和批量调用,但模型是否遵循,还取决于模型能力和上下文。
排障顺序建议固定为:先验证模型通道,再验证 Glob 参数,最后看工作目录和搜索范围。这样不会把通道 404 误判成 pattern 写错。
语义一致 CTA:通道对了,Glob 才有结果
OpenCode 用 Glob 搜文件没反应,排障时不要一上来就改 pattern。先确认 TaoToken 的 Base URL 是不是https://taotoken.net/api,有没有多填/v1;再确认 Key 是否替换、模型 ID 是否有效;最后才去调 pattern、path 和工作目录。TaoToken 在这条链路里提供的是模型通道,Glob 的工具逻辑仍然由 OpenCode 的提示词和参数控制。两层分开排查,问题会清楚很多。
如果你需要创建或管理 Key,可以走 API Keys 页面:
https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=opencode-glob
如果你需要核对 OpenCode、OpenAI 兼容 provider、Base URL 的完整写法,可以看接入文档:
https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=opencode-glob
如果你只是想先验证模型通道是否可用,可以去模型对话页面发一条消息:
https://taotoken.net/console/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=opencode-glob
如果你准备长期用 OpenCode 做编码和 Agent 任务,可以了解 Coding Plan:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=opencode-glob
把 Base URL 末尾的/v1去掉,Key 和模型 ID 核对好,再让 Agent 用 Glob 搜一次,通常就能看到文件列表。通道通了,Glob 的 pattern 和 path 才有意义。