最近一直在折腾 OpenCode,发现 GPT 类模型在处理某些敏感或复杂指令时,经常会触发拒绝回答。为了优化使用体验,我顺手写了一个工具箱:opencode-gpt-unlocked。
该项目发布仅 1 天,目前在 GitHub 上已收获 36 Stars 和 9 Forks。
这个项目提供了两种实现方案,分别应对“事后修复”和“实时干预”两种场景。
1. OpenCode Patcher (数据库修复)
这是我最常用的方式,直接对 OpenCode 的本地 SQLite 数据库 (opencode.db) 下手。当你在某个重要会话里被模型“拒了”,或者推理块导致界面转圈圈时,它可以一键修复。
核心逻辑
- 一键脱敏: 自动搜寻最新会话,把最后一条拒绝消息替换为“确认协助”之类的积极占位符。这种方案的核心在于通过修改上下文,让模型误以为自己已经答应了要求。为了保证人设的一致性,模型通常会顺着这个“假象”继续执行任务。需要注意的是,如果后续对话过长,模型可能会在推理过程中重新识别出原始指令的违规性并再次拒绝。
- 推理清理: 删除
reasoning分片,防止前端解析异常。 - 自动定位: 脚本会自动去 XDG 路径或用户目录找数据库,不需要手动敲路径。
使用方法
安装后直接敲命令即可,修改前会自动备份 .bak 文件,安全第一。
pip install -e .
opencode-patcher --select # 交互式挑选需要修复的会话2. Refusal Patcher Plugin (实时拦截)
如果你觉得手动修库太麻烦,我也顺便写了一个 TS 插件,可以直接加载到 OpenCode 的插件系统里。
工作原理
它通过实时拦截 API 交互,在模型输出时进行关键词检测和 AI 二次判定。如果判定为拒绝,插件会自动干预:
- 实时改写: 将拒绝文本改写成积极的回复。
- AI 判定: 通过调用 OpenAI API,判断当前回复是否属于拒绝,如果是则进行改写。
- 静默处理: 自动清空后台数据库中的推理块,防止后续报错。
- npm 包形式: 直接发布到 npm,安装后在
opencode.json中配置即可。
配置方式
在 opencode.json 的 plugin 数组中加入包名或脚本绝对路径即可:
{
"plugin": ["opencode-gpt-unlocked@latest"],
"experimental": {
"refusal_patcher": {
"enabled": true,
"ai_rewrite": true,
"base_url": "https://api.openai.com/v1",
"api_key": "your-key",
"model": "gpt-5-4-mini"
}
}
}