核心能力验证
技术研究 人工智能 OpenCode
关键发现: 命令是研究场景的核心入口。该命令执行完毕后进程会自然退出,退出码为 0 表示成功,非 0 表示失败。这为进程包装方案提供了基础。
OpenCode API 分析
现有API能力
1. CLI 命令接口
OpenCode 提供了以下可用于程序化执行的命令:
| 命令 | 功能 | 适用场景 |
|---|---|---|
opencode run "prompt" | 执行单次提示并退出 | 单次研究任务,非交互式 |
opencode serve | 启动 HTTP API 服务器 | 外部系统集成,服务端调用 |
opencode --prompt="..." | 带提示启动 TUI | 需要交互式输出的场景 |
opencode --continue | 继续上次会话 | 会话恢复 |
opencode --session=<id> | 指定会话 ID | 多会话管理 |
关键发现:opencode run 命令是研究场景的核心入口。该命令执行完毕后进程会自然退出,退出码为 0 表示成功,非 0 表示失败。这为进程包装方案提供了基础。
2. Server Mode HTTP API
OpenCode 提供 opencode serve 模式,暴露 HTTP 端点:
POST /v1/chat/completions
Content-Type: application/json
{
"model": "opencode",
"messages": [{"role": "user", "content": "帮我调研电动车行业"}]
}
分析:虽然 Server Mode 提供了 API 接口,但官方文档未明确说明如何:
- 监听任务完成事件
- 获取任务执行状态
- 管理会话生命周期
3. Plugin 系统
OpenCode 支持插件扩展,插件目录:
- 项目级:
.opencode/plugins/ - 全局级:
~/.config/opencode/plugins/
分析:插件系统允许在启动时加载自定义逻辑,但没有发现支持以下能力的证据:
- 任务完成钩子(Task completion hooks)
- 进程退出监听(Process exit listeners)
- 外部事件触发(External event triggers)
API限制
明确不支持的能力:
-
生命周期钩子(Lifecycle Hooks)
- ❌ 无
onStart、onComplete、onFailure回调机制 - ❌ 无任务状态变更事件订阅
- ❌ 无进程退出钩子
- ❌ 无
-
进程间通信(IPC)
- ❌ 无暴露给外部的 IPC 接口
- ❌ 无法通过 API 查询运行中进程的状态
- ❌ 无法远程终止或控制进程
-
会话管理 API
- ❌ 无程序化创建新会话的 API(
/new只能通过 TUI 触发) - ❌ 无会话列表查询接口
- ❌ 无会话强制终止接口
- ❌ 无程序化创建新会话的 API(
能力差距分析
原生支持情况
结论:OpenCode 原生不支持跨仓库集成所需的进程管理功能
| 需求 | 原生支持 | 备注 |
|---|---|---|
| 进程退出状态捕获 | ⚠️ 部分支持 | 通过 shell 退出码可间接获取 |
| 任务完成通知 | ❌ 不支持 | 无内置通知机制 |
| 触发新会话 | ❌ 不支持 | /new 只能通过 TUI 交互触发 |
| 进程自动清理 | ❌ 不支持 | 需外部脚本实现 |
| 跨仓库通信 | ❌ 不支持 | 需自行设计通信协议 |
详细分析:
-
进程退出状态捕获(部分支持)
opencode run命令执行完成后会返回退出码- 退出码 0 = 成功,非 0 = 失败
- 但无法获取详细的错误信息或输出内容
- 局限性:如果 opencode 内部执行了异步操作(如 git push),退出码可能无法准确反映最终状态
-
任务完成通知(不支持)
- 无任何内置的 Webhook、回调函数或事件通知机制
- 无法配置当研究任务完成时自动调用外部接口
- 必须通过外部包装器来检测进程退出并发送通知
-
触发新会话(不支持)
/new命令是 TUI 交互命令,无法通过 CLI 参数直接触发- 没有 API 端点用于创建新会话
- 变通方案:终止当前进程后重新启动新进程(但这会丢失上下文)
-
进程自动清理(不支持)
- opencode 不会自动清理自己创建的子进程
- 没有
--timeout或--max-duration参数 - 需要通过
pkill、kill或进程管理器来实现
缺失的功能
关键缺失功能清单:
| 缺失功能 | 影响程度 | 变通方案 |
|---|---|---|
| 任务完成回调 | 🔴 高 | Shell 包装脚本捕获退出码 |
| 进程状态查询 API | 🔴 高 | 使用 PID 文件 + ps 命令 |
| 会话管理 API | 🟡 中 | 进程重启模拟新会话 |
| 跨进程事件广播 | 🟡 中 | 文件信号或消息队列 |
| 配置化 Webhook | 🟢 低 | 外部脚本实现 HTTP 调用 |
验证方法
文档审查
已审查的文档来源:
-
OpenCode 官方文档(https://opencode.ai/docs/)
- CLI 命令参考:确认了
run、serve等命令的存在和参数 - Plugin 文档:确认了插件加载机制,但无生命周期钩子说明
- Config 文档:确认配置选项中无进程管理相关设置
- CLI 命令参考:确认了
-
OpenCode Server Mode 文档(https://open-code.ai/en/docs/server)
- HTTP API 端点说明
- 未提及任务状态查询或事件订阅接口
-
社区资源
- DEV Community 文章《Does OpenCode Support Hooks?》
- 结论:OpenCode 当前版本不支持 hooks,但插件系统提供了有限的扩展能力
文档审查结论:官方文档明确展示了 OpenCode 的能力边界。对于进程管理和生命周期事件,没有任何原生支持。
黑盒测试建议
为了进一步验证 OpenCode 的行为,建议进行以下测试:
测试1:退出码行为测试
# 测试成功场景
opencode run "echo hello"
echo "Exit code: $?" # 应该输出 0
# 测试失败场景
opencode run "invalid_command_that_fails"
echo "Exit code: $?" # 应该输出非 0
测试2:信号处理测试
# 启动 opencode 进程
opencode run "sleep 60" &
PID=$!
# 发送 SIGTERM
kill -TERM $PID
wait $PID
echo "Exit code after SIGTERM: $?"
测试3:子进程行为测试
# 检查 opencode 是否会创建子进程
opencode run "git status" &
sleep 1
pstree -p | grep opencode
测试4:会话管理测试
# 测试是否可以非交互式触发 /new
opencode --new # 检查是否有此参数
opencode new # 检查是否有此子命令
参考资料
- OpenCode CLI Docs - CLI commands and flags
- OpenCode Server Mode - HTTP API documentation
- Does OpenCode Support Hooks? - Community analysis of extensibility
- OpenCode Plugins - Plugin system documentation