
为什么写这个工具
最近在用 OpenCode 跑 AI 编码任务,很快遇到一个痛点:opencode run 一次只能跑一个 prompt,想做"先 plan 再 build"这种多步流水线,或者同时给几个项目分头派活,就得自己开一堆终端窗口手动串。
写 shell 脚本编排也能干,但看不到每个任务的实时日志、失败了不知道是哪一步、想停还得挨个找 PID。于是我用 Python 标准库撸了一个 tkinter GUI,把 opencode run 包成可视化任务队列,开源在 GitHub:
零依赖 ------只用标准库,Python 3.8+ 直接跑,不需要 pip install 任何东西。
核心功能
- 任务队列 GUI --- 新增 / 编辑 / 排序 / 单击启用切换;每个任务独立的工作目录、提示词、Agent(plan/build)和模型(模型列表自动从
opencode models拉取) - 最多 6 路并发 --- 1 路就是顺序执行,共享同一个任务队列
- 失败策略 --- 可选「某任务失败后中止后续任务」
- 假成功防护 --- 三道闸门,见下文详解
- 断点续跑 --- 状态实时持久化,重跑自动跳过已成功任务,中途关窗口也不丢进度
- 定时启动 --- 每天定时 / 间隔循环(1-1440 分钟)/ 一次性定时三种模式,到点等同点击「开始执行」
- 右键批量操作 --- Shift/Ctrl 多选后批量改状态、批量切模型
- 日志分 tab --- 「全部」汇总 + 每个任务独立 tab,日志跨多次运行持续追加
- 秒级停止 ---
taskkill /T杀整个进程树,看门狗保证 UI 不卡死 - 安全退出 --- 运行中关窗需确认,退出前自动停止所有任务并保存状态
亮点:假成功防护
用 AI 跑自动化任务最烦的不是失败,是假成功------进程退出码 0,但实际啥也没干,或者 AI 反问一句"是否按此方案实施?"就停了。这个工具内置三道闸门:
- 等待确认语句检测 --- 扫描输出末尾,匹配"是否按此方案实施?""要不要我继续?"这类反问模式,命中即判失败
expect_change目录快照对比 --- 任务执行前后对目录做文件快照,一个字节都没变就判假成功verify_cmd验收命令 --- 任务退出码 0 之后再跑一条用户自定义命令(比如python -m py_compile main.py),非 0 判失败
三道闸门都可以按任务粒度开关,默认全开。
快速开始
bash
# 前提:Python 3.8+,且 opencode CLI 在 PATH 中
python opencode_orchestrator.py
- 点 新增任务 --- 选项目目录、填提示词,可选 Agent 和模型
- 设置 并发数 (1-6)、失败后中止 、跳过已完成 开关
- 点 ▶ 开始执行 ,在 tab 里看各任务日志;■ 停止 立即终止全部进程
- 中断后重开,已成功的任务自动跳过;点 重置状态 全部重来
配置长这样
任务列表持久化为 JSON,可以直接手编也可以 GUI 操作:
json
{
"concurrency": 2,
"stop_on_fail": true,
"skip_done": true,
"schedule": {
"enabled": true,
"mode": "daily",
"time": "08:00",
"fired": false
},
"tasks": [
{
"path": "D:/projects/app",
"prompt": "分析项目结构,输出技术方案到 plan.md",
"agent": "plan",
"model": "deepseek-api/deepseek-v4-flash",
"enabled": true
},
{
"path": "D:/projects/app",
"prompt": "按照 plan.md 中的方案执行重构",
"agent": "build",
"verify_cmd": "python -m py_compile main.py",
"expect_change": true,
"enabled": true
}
]
}
任务间传上下文
每个 opencode run 都是独立会话,任务之间通过中间文件 传递产物:前一个任务输出 plan.md,后一个任务的提示词引用它------这就是 OpenCode 官方推荐的 plan → build 串联模式,GUI 只是把它可视化、可重跑化。
定时启动
支持三种模式,设置随配置持久化,重启自动恢复:
- 每天定时 --- 到点触发,错过不补跑(适合上班前自动开跑)
- 间隔循环 --- 1-1440 分钟,适合持续集成式巡检
- 一次性定时 --- 指定日期时间,fire 一次后自动失效
一些实现细节
整个工具是单文件 tkinter 应用,约 1000 行,零依赖。几个值得说的点:
- 线程模型 --- 工作线程绝不直接操作 tkinter 控件,所有 UI 更新走
queue.Queue,主线程每 100ms 排空一次。这是 tkinter 多线程的标准做法,避免了一堆诡异的竞态崩溃 - 进程树终止 --- Windows 下用
taskkill /F /T /PID杀整棵树,配合CREATE_NO_WINDOW避免弹控制台黑窗 - 子进程输出解码 --- 统一
encoding="utf-8", errors="replace",遇到非 UTF-8 输出优雅降级而不是崩溃 - 状态机约束 ---
Task.__init__会把持久化的status: "running"强制归一化为"pending"------配置文件不可能复活"执行中"状态,避免上次异常退出留下的脏状态误导 UI
适合谁
- 已经在用 OpenCode CLI,想批量/定时跑任务的人
- 想做"AI 流水线"但又不想引入 Airflow / Dagster 这种大家伙的人
- 需要把 AI 编码任务接入 CI 之前,先在本机手动验证流程的人
项目地址
GitHub: https://github.com/YiShan-X/opencode-task-orchestrator
MIT 协议,欢迎 Star / Issue / PR。如果你也在用 OpenCode 做自动化,不妨试试,有问题随时提 Issue。