1. OpenCode 里 glob 工具提示词到底在解决什么问题
如果你最近在折腾 OpenCode 这类本地 Agent 工具,大概率会遇到一个很具体的场景:你让 Agent 帮你找某个文件,它却像无头苍蝇一样在目录里乱翻,或者干脆只搜了当前目录就告诉你“没找到”。这不是模型笨,而是 glob 工具的提示词没配对。
glob 工具的本质,是把命令行里的 glob 模式(注意是模式语法,不是命令本身)封装成 Agent 能调用的一个动作。它的职责非常单一:根据文件名特征快速定位文件位置。比如**/*.ts匹配所有子目录下的 TypeScript 文件,src/**/*.test.js只匹配 src 下的测试文件。它不读内容,只找路径,所以速度极快,哪怕仓库里有几十万个文件也能稳定返回。
但问题在于,Agent 不会自动知道“什么时候该用 glob、什么时候该用 grep、什么时候该升级到 Task 工具”。这些判断全靠提示词来约束。提示词写得好,Agent 会先批量 glob 定位文件,再针对性读内容;提示词写得含糊,Agent 就会串行地一个类型一个类型地搜,白白浪费等待时间。
这篇要落地的,就是 OpenCode 中 glob 工具提示词的配置骨架,以及怎么用 TaoToken 的统一 Key 把整条工具调用链跑通。适合已经在本地装了 OpenCode、想让 Agent 真正能“找得到文件”的开发者。下面从接入准备开始,一步步给出可复制的配置和验证动作。
2. TaoToken 统一 Key 接入前置准备
OpenCode 本身是一个本地 Agent 运行框架,它需要调用大模型来完成推理和工具调用决策。这里用 TaoToken 作为统一入口,好处是一个 Key 可以覆盖多种模型,不用在多个平台之间来回切换配置。
先到官网注册并拿到 Key:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。注册后在控制台创建 API Key,建议单独建一个给 OpenCode 用的 Key,方便后续排查问题时定位。
拿到 Key 之后,需要确认两件事:一是 API 基地址,二是模型名称。TaoToken 的 API 入口是 https://taotoken.net/api ,这个地址在配置里会作为 baseURL 使用。模型名称根据你实际要用的来填,比如做代码类任务可以选擅长代码的模型。
这里有个容易踩的坑:很多人把 baseURL 写成带/v1的完整路径,结果 OpenCode 又自动拼了一次,导致 404。正确做法是 baseURL 只写到https://taotoken.net/api,让客户端自己处理版本路径。如果你不确定,可以先在模型对话页面手动发一条消息验证 Key 是否可用:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
Key 的管理入口在控制台的 API Keys 页面:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。建议把 Key 存到环境变量里,而不是硬编码进 settings.json,这样配置文件可以安全地提交到版本库。
3. settings.json 配置骨架与 glob 提示词落地
OpenCode 的配置核心是 settings.json。下面给出一份可以直接复制修改的骨架,重点是把模型接入和 glob 工具提示词两部分都覆盖到。
{ "provider": { "taotoken": { "type": "openai-compatible", "baseURL": "https://taotoken.net/api", "apiKey": "${TAOTOKEN_API_KEY}", "models": { "default": { "name": "你的模型名称", "maxTokens": 8192 } } } }, "agent": { "tools": { "glob": { "enabled": true, "description": "根据文件名模式快速定位文件路径。支持标准 glob 语法,如 **/*.js 匹配所有子目录下的 js 文件,src/**/*.ts 只匹配 src 下的 ts 文件。结果按修改时间倒序排列,优先返回最近改动的文件。", "parameters": { "pattern": { "type": "string", "description": "glob 模式字符串,例如 **/*.ts 或 src/**/*.test.js", "required": true }, "path": { "type": "string", "description": "搜索起始目录,默认为当前工作目录", "required": false } }, "prompt": "当需要根据文件名特征查找文件位置时使用此工具。如果已知文件名的部分特征,直接调用 glob 一步到位。如果是开放式搜索任务(例如查找某段逻辑的定义位置并确认是否有测试),应先用 glob 定位候选文件,再配合 grep 搜索内容,必要时升级到 Task 工具进行多轮规划。鼓励预判性批量搜索:当可能涉及多种文件类型时,在同一次回复中并行发出多个 glob 请求,避免串行等待。" } } } }这份配置里有几个关键点值得展开说。
第一,baseURL只写到https://taotoken.net/api,不要自己加/v1。OpenCode 的 openai-compatible 类型会自动补全路径。
第二,apiKey用${TAOTOKEN_API_KEY}引用环境变量。在终端里执行export TAOTOKEN_API_KEY="你的Key",或者在.env文件里配置后由启动脚本加载。
第三,glob 的prompt字段是整份配置的灵魂。它明确告诉 Agent 三件事:什么时候用 glob、什么时候不该只用 glob、以及要批量并行搜索。特别是“鼓励预判性批量搜索”这一句,直接决定了 Agent 会不会串行地一个类型一个类型地搜。
第四,description里强调了结果按修改时间倒序。这一点在实际使用中很关键,因为 Agent 通常最关心最近改动的文件,按时间排序能让它第一时间看到最相关的候选。
如果你还想让 Agent 在复杂搜索场景下自动升级到 Task 工具,可以在 prompt 里保留“必要时升级到 Task 工具”的表述。Task 工具允许 Agent 自主规划多轮搜索,而不是只跑一次 glob 就结束。
4. 验证 glob 工具是否真正生效
配置写完之后,必须做一次实际触发验证,否则你无法确认提示词是否被 Agent 正确加载。
第一步,确认环境变量已生效:
echo $TAOTOKEN_API_KEY如果输出为空,说明环境变量没加载,需要重新 export 或检查 shell 配置文件。
第二步,在项目根目录启动 OpenCode,然后输入一个明确需要 glob 的指令:
帮我找一下这个项目里所有的 TypeScript 测试文件,列出路径。第三步,观察 Agent 的行为。如果提示词生效,你应该看到它在一次回复里并行发出多个 glob 请求,比如同时搜**/*.test.ts和**/*.spec.ts,而不是先搜一个、等结果、再搜另一个。返回结果应该按修改时间倒序排列,最近改动的测试文件排在最前面。
第四步,检查返回的路径是否完整。glob 返回的是文件路径列表,不包含文件内容。如果你发现 Agent 直接开始读文件内容,说明它可能跳过了 glob 直接用了 read,这时候要回头检查 prompt 里“根据文件名特征查找”的表述是否足够明确。
一个更严格的验证方式是故意构造一个开放式任务:
帮我找一下用户登录逻辑定义在哪里,顺便看看有没有相关测试。理想情况下,Agent 应该先用 glob 定位可能的文件(比如**/*auth*、**/*login*),再用 grep 搜内容,而不是一上来就盲目读文件。如果它直接开始读一堆不相关的文件,说明 glob 的 prompt 里“开放式任务应先 glob 定位”的约束没起作用。
验证通过后,你可以把这次成功的交互记录下来,作为后续调整提示词的基线。每次改 prompt 之后,用同样的指令复测,对比 Agent 的行为变化。
5. 本篇常见错误排查
配置过程中最容易遇到几类问题,这里集中列一下排查思路。
报错一:401 Unauthorized。通常是 Key 没传对。先确认环境变量名和 settings.json 里的引用名一致,再确认 Key 本身没有多余空格。如果用的是控制台新建的 Key,注意有些 Key 只在创建时显示一次,复制时别漏字符。
报错二:404 Not Found。九成是 baseURL 写错了。检查是不是写成了https://taotoken.net/api/v1或者结尾多了斜杠。正确写法就是https://taotoken.net/api。
报错三:glob 返回空结果。先确认path参数是否指向了正确的起始目录。如果 Agent 没传 path,默认是当前工作目录,而你启动 OpenCode 的位置不对,就会搜不到。另外检查 pattern 是否写得太窄,比如*.ts只匹配当前目录,不包含子目录,应该用**/*.ts。
报错四:Agent 不调用 glob,直接读文件。这说明 prompt 的触发条件不够明确。可以在 prompt 开头加一句“当需要根据文件名查找文件时,优先使用此工具”,把优先级提上去。
报错五:Agent 串行搜索,速度很慢。检查 prompt 里有没有“并行发出多个请求”的明确指令。如果只写了“支持 glob 模式”,Agent 不会自动并行。必须显式鼓励批量搜索。
报错六:结果排序不对。如果返回的文件没有按修改时间倒序,检查 description 里是否写明了排序规则。有些实现需要显式配置排序参数,具体看 OpenCode 版本。
排查时建议打开 OpenCode 的日志输出,能看到每次工具调用的实际参数和返回结果。这样定位问题比猜要快得多。如果 Key 本身有问题,可以直接到 API Keys 页面重新生成一个:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
6. 长期编码场景下的接入建议
如果你只是偶尔用 OpenCode 跑几个小任务,上面的配置已经够用了。但如果你打算把 OpenCode 作为日常编码助手,长期高频使用,建议关注 Coding Plan 这类更适合持续调用的方案:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
原因很直接:Agent 类工具的特点是单次任务可能触发多轮模型调用和多次工具调用,token 消耗比普通对话高不少。用按量计费的方式,月底账单可能会让你意外。Coding Plan 这类套餐更适合这种高频、多轮的使用模式。
另外,glob 提示词的调优是一个持续过程。不同项目的文件结构差异很大,你可能需要根据实际使用情况微调 prompt。比如前端项目里**/*.tsx很常见,后端项目里**/*.go更多,把这些项目特征写进 prompt 能让 Agent 的搜索更精准。
接入文档里有更完整的参数说明和示例:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。如果你用的是 Claude Code 类的工具链,也可以参考对应的接入方式:https://taotoken.net/claudecode-anthropic?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
最后提醒一点:glob 工具再强,也只是文件定位。真正让 Agent 变聪明的,是提示词里对“什么时候用 glob、什么时候升级到 Task”的边界界定。把这条边界写清楚,比堆砌一堆参数更有用。