opencode 如何重启服务,如何指定哪个文件夹内的,哪个文件中的哪一行,需要修改一下或者添加新的...
Erstellt am: 30. Januar 2026
Erstellt am: 30. Januar 2026
opencode 如何重启服务,如何指定哪个文件夹内的,哪个文件中的哪一行,需要修改一下或者添加新的处理方法
https://github.com/anomalyco/opencode
下面按你说的 3 件事来讲:如何重启服务、如何指定“哪个文件夹/哪个文件/哪一行”、要“加一个新的处理方法”该改哪里(给你 3 条最常用的扩展方式:命令 / 工具 / 插件)。
OpenCode 的“服务”通常指两种:
/exit 退出,然后在终端里重新启动(也有人提需求希望有 /restart,但还在讨论中)。(GitHub)启动(当前目录):
opencode启动(指定目录):
opencode /path/to/project (OpenCode)opencode serve(HTTP Server)文档里明确 opencode serve 是一个 headless HTTP server:(OpenCode)
opencode serve --port 4096 --hostname 127.0.0.1 (OpenCode)如果你是用 systemd / docker 把
opencode serve当常驻服务跑:那就按你自己的管理方式重启(例如systemctl restart xxx或docker restart xxx)。OpenCode 本身不“接管”你宿主机的服务管理。
最简单就是启动时指定工作目录:
opencode /path/to/project(启动 TUI 并以该目录作为工作目录)(OpenCode)cd /path/to/project && opencode服务器模式同理:你在哪个目录启动
opencode serve,后续实例/会话的目录上下文就是那套(工具里也会拿到 directory/worktree 这些上下文)。(OpenCode)
在 TUI 里,直接用 @ 引用文件路径即可(会 fuzzy search 并把文件内容带进上下文):(OpenCode)
例子:
请解释 @packages/opencode/src/.../xxx.ts 里这个逻辑在 IDE 集成(VS Code/Cursor 等)里,官方示例支持这种行号标注:
@File#L37-42 (OpenCode)(在纯 TUI 文档里只明确了 @file 引用;你要精确行范围,最稳的是用 IDE 的 @File#Lx-y 或者在消息里手动写“请看第 N 行到 M 行”。)
你这句“处理方法”可能有 3 种常见诉求,我给你分别对应该改哪个文件夹:
/test、/lint)放到项目里:
.opencode/commands/*.md (OpenCode)例如你建一个:
.opencode/commands/my-flow.md然后在 TUI 里就能 /my-flow 跑。(OpenCode)
什么时候用它?
你想“一键触发一套提示词”,但不需要真正新增可被 LLM 调用的“函数”。
放到项目里:
.opencode/tools/ (OpenCode)最小例子(官方文档结构):
.opencode/tools/database.ts 里用 tool() helper 定义 execute(),文件名就是工具名(如 database)。(OpenCode)并且工具 execute(args, context) 能拿到:
context.directory(会话工作目录)context.worktree(git 根目录)
等上下文信息。(OpenCode)什么时候用它?
你说的“添加新的处理方法”大概率就是这个:比如“新增一个调用内部接口/跑脚本/查数据库/处理日志”的能力。
✅ 注意:tools/plugins/commands 这类扩展都是启动时加载的,所以你改完通常要重启 opencode(/exit 后再开,或重启 serve)。(OpenCode)
放到项目里:
.opencode/plugins/(项目级)
或全局:~/.config/opencode/plugins/ (OpenCode)文档也说明了加载顺序、npm 插件如何安装缓存等。(OpenCode)
仓库是 monorepo,核心 CLI + HTTP server 在 packages/opencode 里;架构说明里也提到 server 入口在 packages/opencode/src/command/serve.ts(API 层 / HTTP server 相关)。(DeepWiki)
这类改动属于贡献源码,而不是“扩展”。一般建议你先用 Custom Tools / Plugins,除非你确定要改框架层。
如果你告诉我你说的“服务”具体是哪一种(TUI 还是 opencode serve,以及你想加的“处理方法”是:一条命令、一个可调用工具、还是hook 行为的插件),我可以直接给你一个“应放置的目录结构 + 示例文件内容 + 如何触发验证”的完整模板。
如下是我opencode的配置,我觉得这样配置模型思考时间太长了,能否修改一下,让思考但时间不要超过1分钟
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"Elysiz": {
"npm": "@ai-sdk/openai-compatible",
"name": "Elysiz",
"options": {
"baseURL": "https://elysia.h-e.top/v1",
"apiKey": "sk-SSEr9Vxk9rOA50xZudDoWmm6SOxuQiaVmrwixdFOUdvseG"
},
"models": {
"claude-4.5-sonnet-real": {
"name": "claude-4.5-sonnet-real",
"thinking": true
},
"claude-4.5-sonnet": {
"name": "claude-4.5-sonnet",
"thinking": true
},
"gemini-3-pro-preview": {
"name": "gemini-3-pro-preview",
"thinking": true
},
"gpt-5.2": {
"name": "gpt-5.2",
"thinking": true,
"options": {
"include": [
"reasoning.encrypted_content"
],
"store": false
},
"variants": {
"xhigh": {
"reasoningEffort": "xhigh",
"textVerbosity": "medium",
"reasoningSummary": "auto"
},
"high": {
"reasoningEffort": "high",
"textVerbosity": "medium",
"reasoningSummary": "auto"
},
"medium": {
"reasoningEffort": "medium",
"textVerbosity": "medium",
"reasoningSummary": "auto"
}
}
}
}
},
"BoHe": {
"npm": "@ai-sdk/openai-compatible",
"name": "BoHe",
"options": {
"baseURL": "https://x666.me/v1",
"apiKey": "sk-IQrzxa9pkDC7igKlVI83AHGDmIdf631qRTLlrYZVzTXEe6"
},
"models": {
"gpt-5.2-high": {
"name": "gpt-5.2-high",
"thinking": true
},
"gemini-3-pro-preview-bs": {
"name": "gemini-3-pro-preview-bs",
"thinking": true
},
"gpt-5.2": {
"name": "gpt-5.2",
"thinking": true
}
}
},
"B4U": {
"npm": "@ai-sdk/openai-compatible",
"name": "B4U",
"options": {
"baseURL": "https://b4u.qzz.io/v1",
"apiKey": "sk-T51gpwsP5bze6fd7lMpcbRzvqaVnrcbrIhCRsRc10wKX0S"
},
"models": {
"claude-4.5-sonnet": {
"name": "claude-4.5-sonnet",
"thinking": true
},
"claude-4.5-sonnet-think": {
"name": "claude-4.5-sonnet-think",
"thinking": true
}
}
},
"QAQ": {
"npm": "@ai-sdk/openai-compatible",
"name": "QAQ",
"options": {
"baseURL": "https://ai.qaq.al",
"apiKey": "sk-df87dc1f3a78b272243b198e48b53fc3c59de3b97ba0fc0ecda0c4057a2f0e"
},
"models": {
"gpt-5.2-codex": {
"name": "gpt-5.2-codex",
"options":{
"reasoningEffort": "high",
"textVerbosity": "medium",
"reasoningSummary": "auto"
}
},
"gpt-5.2": {
"name": "gpt-5.2",
"thinking": true
}
}
}
}
}
可以的,而且OpenCode 本身就支持“1 分钟超时”——你现在“思考太久”,本质上是两件事叠加:
thinking: true(会更慢)provider.options.timeout 是毫秒,默认 300000ms。 (OpenCode)下面给你一套“仍然允许思考,但单次请求不超过 60 秒”的改法。
把每个 provider 的 options 里加上:
jsonc"timeout": 60000
因为 OpenCode 支持 provider.<id>.options.timeout(单位毫秒)。 (OpenCode)
例如(以你的 Elysiz 为例):
jsonc"provider": { "Elysiz": { "npm": "@ai-sdk/openai-compatible", "name": "Elysiz", "options": { "baseURL": "https://elysia.h-e.top/v1", "apiKey": "…", "timeout": 60000 }, "models": { ... } } }
同样给 BoHe / B4U / QAQ 都加上 timeout: 60000。
这个是硬限制:超过 60s 还没返回就会被 OpenCode 断掉(你就不会再等 2~5 分钟了)。
你现在 gpt-5.2 还定义了 variants,但最高有 xhigh,而且模型本体还 thinking: true,这很容易变“深度思考模式”。
OpenCode 的模型配置里,**OpenAI 类(reasoningEffort)**常见档位是 none / minimal / low / medium / high / xhigh。(OpenCode)
minimal 或 lowxhigh 禁用掉,避免误切到超慢档示例(只展示 gpt-5.2 这一段):
jsonc"gpt-5.2": { "name": "gpt-5.2", "thinking": true, "options": { "include": ["reasoning.encrypted_content"], "store": false }, "variants": { "minimal": { "reasoningEffort": "minimal", "textVerbosity": "medium", "reasoningSummary": "auto" }, "low": { "reasoningEffort": "low", "textVerbosity": "medium", "reasoningSummary": "auto" }, "medium": { "reasoningEffort": "medium", "textVerbosity": "medium", "reasoningSummary": "auto" }, "xhigh": { "disabled": true } } }
这样你依然能用
minimal/low/medium思考,但不会一不小心切到xhigh慢到怀疑人生。
opencode run 支持 --variant(例如 --variant low / --variant minimal)。这个在社区/文档里有提到,并且近期就是围绕 --variant 在讨论增强。(GitHub)variant_cycle 的 keybind 在不同 variant 间快速切换(文档在 Models 里专门提到 Cycle variants)。(OpenCode)你贴的片段里,gpt-5.2 的 options 后面有一个多余的逗号:
jsonc"store": false },
JSON/JSONC 里这会直接导致解析失败或行为异常(取决于你用的加载器)。建议你把整份文件过一遍 JSONC 校验。
这几个 sk-... 已经暴露了,强烈建议立刻吊销/重置,然后换成新的再写回配置文件(或者用环境变量//connect 管理)。
(我这里不复述你的 key,避免二次扩散。)
"timeout": 60000(硬 1 分钟上限) (OpenCode)minimal 或 low,并禁用 xhigh(软提速) (OpenCode)如果你愿意,我也可以直接把你这份配置整理成一份完整的、可直接粘贴的合法 JSONC(保留你的 provider 结构,但把 timeout/variants/语法问题一次性修好)。