# OpenCode对接IDEA免费模型
**Repository Path**: web/open-code-to-idea
## Basic Information
- **Project Name**: OpenCode对接IDEA免费模型
- **Description**: OpenCode对接IDEA免费模型
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-10-29
- **Last Updated**: 2026-10-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
---
## ✨ 核心特性
- **Adapter 可扩展架构**:新增一个 IDE 客户端 = 写一个适配器文件 + 注册一行,主程序自动识别 UI 和路由
- **隔离运行时**:在数据目录内放一份独立的 OpenCode,自动下载/校验/启动,与系统 OpenCode 互不干扰
- **并发检测**:3 路并发探测每个免费模型能否按客户端的工具协议产生动作
- **判定缓存**:成功判定 6 小时、失败原因按类别 10 分钟到 1 小时分级过期,**重启基本秒开**
- **一键写入**:WorkBuddy 的 `models.json`、DSH 的 `cordis.patch.yml`、以及未来更多 IDE 配置
- **本机转发口**:只监听 127.0.0.1 的 OpenAI 兼容端点(41980),客户端填进去就能用
- **审批围栏**:模型永远不能自己执行本机动作,所有外部调用必须通过客户端的工具协议
## 界面
浅色 / 深色两套主题,托盘常驻,控制面板四档状态一眼可读。

## 工作流程
```mermaid
flowchart LR
A["托盘 / 控制面板"] -->|读取模型目录| B["隔离 OpenCode 运行时"]
B --> C{"并发检测
能否按协议产生动作"}
C -->|产生正确动作| D["判定缓存
成功 6 小时"]
C -->|只回文本| E["可用 · 仅对话
工具关闭"]
C -->|超时 / 限流| F["记录原因
分级自动重试"]
D --> H["Adapter 写入目标
WorkBuddy / DSH / ..."]
E --> H
H --> I["IDE 客户端"]
I -->|"OpenAI 兼容请求"| J["本机转发口
127.0.0.1:41980"]
J --> K["审批围栏 · 动作转交"]
K --> B
A -->|退出| L["摘掉自己导入的条目
保留手写配置"]
```
## 快速开始
### 终端用户
先安装 WorkBuddy 或 DeepSeek Harness(DSH)。**不需要另外装 Node.js**。
- **macOS(Apple 芯片)**:下载 `OpenCodeToIdea-1.0.0-mac-arm64.dmg`,双击打开,把 `OpenCodeToIdea` 拖进「应用程序」,再双击启动。
未做 Apple 公证,首次打开可能要右键 →「打开」。若提示「已损坏」:
```bash
xattr -dr com.apple.quarantine "/Applications/OpenCodeToIdea.app"
```
- **Windows**:运行 `OpenCodeToIdea-Setup-1.0.0-win-x64.exe`,桌面图标双击即开。
安装包会写入**开机自启**(托盘常驻、不开弹窗),卸载时自动摘干净。
首次启动会自动准备 OpenCode、扫描免费模型、并发检测,**检测完自动写入一次**。之后重新检测**不会**自动改客户端,需要点导入按钮。
### 开发者
```sh
npm ci
npm test # 91 项自动测试,不访问网络
npm run desktop # 起 Electron(窗口 + 托盘 + 后台服务)
npm start # 只起后台服务(无界面),用于调试
npm run build:mac # 打 macOS 的 .app + zip + dmg(ad-hoc 签名 + 深度严格校验)
npm run build:dmg # 只重打安装包(复用已构建的 .app,几秒钟)
npm run build:win # 打 Windows 安装包(NSIS,桌面图标 + 开机自启)
npm run build:win:portable # 打 Windows 便携版(不写注册表、不自启)
npm run build:win:arm64 # 打 Windows ARM64 安装包
npm run build:linux # 打 Linux AppImage(实验性)
$env:PATH = "C:\Windows\System32\WindowsPowerShell\v1.0;" + $env:PATH
npm run build:win:portable
```
Windows 构建前置条件:确保 PowerShell 在系统 PATH 里(`C:\Windows\System32\WindowsPowerShell\v1.0`),否则会报 `spawn powershell.exe ENOENT`。electron 下载已配置国内镜像 npmmirror。
$env:ELECTRON_MIRROR="https://npmmirror.com/mirrors/electron/"; npm install electron --save-dev 2>&1 | Select-Object -Last 15
## 数据目录
| 系统 | 应用数据 | WorkBuddy 配置 | DSH 配置 |
|---|---|---|---|
| macOS | `~/Library/Application Support/OpenCodeToIdea` | `~/.workbuddy/models.json` | `~/.dsh/profiles/*/cordis.patch.yml` |
| Windows | `%APPDATA%\OpenCodeToIdea` | `%USERPROFILE%\.workbuddy\models.json` | `%USERPROFILE%\.dsh\profiles\*\cordis.patch.yml` |
| Linux(实验性) | `$XDG_CONFIG_HOME/OpenCodeToIdea` | `~/.workbuddy/models.json` | `~/.dsh/profiles/*/cordis.patch.yml` |
数据目录里:`api-key`(本机转发口密钥)、`status.json`、`settings.json`、`probe-cache.json`(判定缓存)、`runtime/`(托管运行时)、`opencode/`(隔离 OpenCode 目录)。
### 环境变量(调试用)
`FERRY_DATA_DIR`、`FERRY_PORT`(默认 41980)、`FERRY_MODELS_FILE`、`FERRY_NO_SYNC=1`(完全不写客户端配置)、`DSH_HOME`(默认 `~/.dsh`)、`FERRY_OPENCODE_PATH`、`FERRY_PROBE_CONCURRENCY`(并发度,默认 3,上限 6)、`FERRY_PROBE_TTL_MINUTES`(成功判定有效期,默认 360 分钟)、`WORKBUDDY_CONFIG_DIR` / `WORKBUDDY_DATA_FOLDER_NAME`。
### 本机接口
所有路由都要 `Authorization: Bearer <数据目录>/api-key`,带 `Origin` 头的请求一律 403。
```
GET /health # 完整状态
GET /v1/models # 已判定可用的模型(id 为 "OC · 名字")
POST /v1/chat/completions # 转发,支持 stream;并发上限 4
POST /admin/refresh | /admin/probe | /admin/import | /admin/selection
POST /admin/target # {target:"workbuddy"|"dsh"|...} 切换写入目标
POST /admin/system-proxy | /admin/find-config
```
## 代码结构
```
src/
main.js 编排:状态机 / 检测队列 / 刷新 / 写入目标 / 退出清理
adapters/index.js Adapter 注册表 + CAP 能力位常量
adapters/workbuddy-adapter.js 薄接口层,只 import ./config/workbuddy-config.js
adapters/dsh-adapter.js 薄接口层,只 import ./config/dsh-config.js
adapters/vscode-adapter.js 薄接口层,只 import ./config/vscode-config.js
adapters/config/ 所有 adapter 专属实现层统一目录
workbuddy-config.js WorkBuddy resolve / validate / sync(内部引用 sync.js / config-finder.js)
dsh-config.js DSH profile patch 的 provider 合并 / 摘除 / 备份
vscode-config.js VSCode chatLanguageModels.json customendpoint provider 读写
config-finder.js Windows 自动查找配置(只读 agent 辅助)
backend.js OpenCode 会话、审批围栏、事件流、动作转交与翻译
runtime.js 运行时发现 · 下载 · 校验 · 隔离启动
protocol.js 请求校验 / 信封编解码 / usage 换算 / SSE
probe.js 检测请求与判定规则
probe-cache.js 判定缓存:跨重启复用,按能力指纹与过期时间失效
repair.js 翻译兜底:系统提示、材料打包、诊断重发
handoff.js 本机动作 → 外部工具的映射与 schema 复核
sync.js 共享基础设施:合并 / 加锁 / 备份 / 原子写(多 adapter 共享)
server.js 本机 HTTP 面(鉴权、来源围栏、转发)
platform.js system-proxy.js atomic.js json.js
service-instance.js model-status.js reasoning.js
desktop/
main.cjs Electron:窗口、托盘、受限 IPC、服务生命周期
preload.cjs 只暴露状态订阅与固定动作
index.html style.css renderer.js 控制面板
activity.cjs 托盘与面板共用的阶段文案
test/ 91 项自动测试
docs/
多客户端扩展方案.md Adapter 架构设计文档
adapter-开发指南.md 新增 IDE 适配器的完整开发流程
设计说明.md 架构、协议、机制与边界
screenshots/ 界面截图
```
## 扩展一个 IDE 客户端
OpenCodeToIdea 采用 Adapter 模式架构。VSCode Copilot Chat(Custom Endpoint)已作为内置实现,新增其他 IDE(例如 Cursor、JetBrains)**必须成对创建两个文件**:
1. **`src/adapters/-adapter.js`** —— 薄接口层,只声明 `id` / `name` / `capabilities` + 转发到 config 层的方法。adapter 层**严禁**直接 import `sync.js`、`json.js` 等共享模块。
2. **`src/adapters/config/-config.js`** —— 实现层,所有文件读写、格式合并、OWNER 标记、备份原子写逻辑全部在这里。共享模块用 `../../sync.js` 形式引用。
3. 把 adapter 文件名加到 `src/adapters/index.js` 的 `ADAPTER_FILES` 数组。
主程序会自动检测、自动渲染切换按钮、自动路由写入。详细流程、CAP 位说明、完整骨架代码见 [adapter-开发指南.md](docs/adapter-开发指南.md)。
## 诚实交代
- 启动后会自动发送简短的检测请求,**会使用少量免费额度**
- 检测通过只代表"这一次能按协议产生动作",不代表完整工作流都验证过
- 不可用的模型只在窗口里保留记录,**不会**提供给客户端
- 免费模型与额度由上游决定,随时可能变化
- 系统代理只支持手动 HTTP/HTTPS 配置,**不支持 PAC/SOCKS**
## 本项目来源
本项目由 [RuiC-oc-ferry](https://github.com/HRuiCcc/RuiC-oc-ferry) 改造而来,基于其 MIT 协议授权。
## License
[MIT](LICENSE)
---
如果这个工具帮到了你,可以请我喝杯咖啡 ☕