Dual-Engine Agent 是一个本地桌面 AI 编程代理。它把任务拆成两个阶段执行:
- Planner:把用户请求拆解成可执行的子任务。
- Worker:读取/修改工作区文件、运行命令、打开浏览器预览,并把执行过程展示在聊天里。
应用基于 Electron、React、Vite、TypeScript 和 Vercel AI SDK 构建,面向本地代码工作区使用。
- 打开本地工作区,浏览文件树,查看和编辑文件。
- 使用 Monaco Editor 查看代码和 diff。
- 通过聊天让代理执行编码任务。
- 自动记录任务状态、工具调用、终端日志和 API 调用次数。
- 支持文件工具:
readFilecreateFilewriteFileeditFileContent
- 支持命令工具和浏览器预览工具。
- 支持多提供商配置和主/副模型分离选择。
- 内置 Responses API Adapter,用于把部分 OpenAI Chat Completions 请求转换到 Responses API。
- 保存工作区状态和聊天历史,重启后可恢复。
设置面板中使用“配置管理”作为核心结构。一个配置包含:
- 配置名称
- 提供商类型
- API Key 或 OAuth Token
- Base URL
- 默认转换器
- 按模型覆盖的转换器
当前内置的提供商类型:
- OpenAI-compatible
- SenseNova
- Anthropic
- Google Gemini
主模型和副模型可以选择不同配置下的不同模型。聊天栏里的模型选择器按两层显示:
- 左侧选择配置。
- 右侧选择该配置下的模型。
选中后,聊天栏只显示模型名,避免占用太多空间。
项目内置 Responses API Adapter 转换器,不依赖外部脚本或桌面上的协议转换服务。
它会启动本地代理:
http://127.0.0.1:18765
当某个配置或某个模型启用该转换器时,运行时 Base URL 会被重写到内置代理,再由代理决定是否转换请求。
当前转换的模型包括:
gpt-5.5gpt-5.4gpt-5.4-xhighgpt-5.3-codexgpt-5.3-codex-spark
其他模型会透传到原始提供商地址。推荐做法是只给需要 Responses API 的模型设置“模型级转换器覆盖”,例如让 gpt-5.5 使用 Responses API Adapter,而同一配置里的其他 OpenAI-compatible 模型保持 None。
- Node.js 18 或更高版本
- pnpm
pnpm installpnpm dev开发模式会启动 Vite 和 Electron。默认渲染端地址:
http://localhost:5173/
pnpm exec tsc --noEmitpnpm build- 启动应用。
- 打开一个本地文件夹作为工作区。
- 进入设置面板,创建或选择提供商配置。
- 填写 API Key / Base URL / OAuth 设置。
- 分别选择主模型和副模型。
- 在聊天框输入任务。
常见任务示例:
检查这个项目的启动错误并修复
给当前 HTML 项目加一个可玩的坦克大战 demo,并打开浏览器预览
阅读 README 和 package.json,帮我总结项目结构
应用会把全局配置、工作区状态和聊天历史保存到 Electron 的 userData 目录。
Windows 默认路径类似:
%APPDATA%\Dual-Engine Agent
其中常见文件:
global-config.json:提供商配置、模型选择、上次工作区。workspace-state.json:打开的标签页、当前文件等。chat-history.json:按工作区保存的聊天历史。
API Key 会保存在本机配置文件中。这个项目目前没有实现系统钥匙串或加密存储,请只在可信设备上使用。
dual-engine-agent/
├── electron/
│ ├── converters/
│ │ └── responsesProxy.ts # 内置 Responses API Adapter 代理
│ ├── ipc/ # Electron IPC 处理
│ ├── tools/ # Worker 可调用工具
│ ├── main.ts # Electron 主进程入口
│ ├── planner.ts # Planner 引擎
│ └── worker.ts # Worker 引擎
├── src/
│ ├── components/ # React UI 组件
│ ├── hooks/ # 配置、工作区、会话、滚动等状态逻辑
│ ├── converterPlugins.ts # 渲染端转换器插件注册
│ ├── App.tsx # 应用主界面
│ └── main.tsx # React 入口
├── package.json
├── vite.config.ts
└── electron-builder.json5
Worker 的系统提示要求模型使用专用工具完成文件和浏览器操作:
- 读文件必须使用
readFile。 - 创建或修改文件必须使用
createFile、writeFile或editFileContent。 - 预览网页必须使用
openBrowser。
editFileContent 需要传入当前文件中精确存在的 targetContent。如果目标块找不到,工具会返回最接近的当前代码块和第一处差异,并提示模型重新读取文件后再编辑,减少重复失败。
确认当前配置的 Base URL 和 API Key 能返回完整模型列表。OpenAI-compatible 配置不会再只过滤 gpt-* 模型,因此类似 Ornith 这类模型也应显示。
这类模型可能只支持 Responses API。给该模型设置模型级转换器覆盖,选择 Responses API Adapter。
通常表示 Worker 已完成第一轮工具调用,正在等待模型基于工具结果继续分析。大文件或慢模型会导致等待时间较长。后续可以在任务执行层增加超时和更细的等待状态提示。
说明模型使用的目标代码块和当前文件内容不一致,常见原因是文件刚被前一步改过。工具会返回最接近匹配块,模型应重新读取文件并使用最新内容重试。
日志窗口现在采用和聊天窗口一致的贴底逻辑:滚动条接近底部时新日志会自动跟随;手动往上查看旧日志时不会被强制拉到底部。
提交前建议至少运行:
pnpm exec tsc --noEmit如果改动了 Electron 主进程、IPC、工具或转换器逻辑,开发模式下通常会触发 Electron 重建和重启。正在运行中的代理任务可能会被重启打断,调试时注意避开长任务执行期间修改主进程代码。