Logo
热心市民王先生

核心能力验证

技术研究 人工智能 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限制

明确不支持的能力

  1. 生命周期钩子(Lifecycle Hooks)

    • ❌ 无 onStartonCompleteonFailure 回调机制
    • ❌ 无任务状态变更事件订阅
    • ❌ 无进程退出钩子
  2. 进程间通信(IPC)

    • ❌ 无暴露给外部的 IPC 接口
    • ❌ 无法通过 API 查询运行中进程的状态
    • ❌ 无法远程终止或控制进程
  3. 会话管理 API

    • ❌ 无程序化创建新会话的 API(/new 只能通过 TUI 触发)
    • ❌ 无会话列表查询接口
    • ❌ 无会话强制终止接口

能力差距分析

原生支持情况

结论:OpenCode 原生不支持跨仓库集成所需的进程管理功能

需求原生支持备注
进程退出状态捕获⚠️ 部分支持通过 shell 退出码可间接获取
任务完成通知❌ 不支持无内置通知机制
触发新会话❌ 不支持/new 只能通过 TUI 交互触发
进程自动清理❌ 不支持需外部脚本实现
跨仓库通信❌ 不支持需自行设计通信协议

详细分析

  1. 进程退出状态捕获(部分支持)

    • opencode run 命令执行完成后会返回退出码
    • 退出码 0 = 成功,非 0 = 失败
    • 但无法获取详细的错误信息或输出内容
    • 局限性:如果 opencode 内部执行了异步操作(如 git push),退出码可能无法准确反映最终状态
  2. 任务完成通知(不支持)

    • 无任何内置的 Webhook、回调函数或事件通知机制
    • 无法配置当研究任务完成时自动调用外部接口
    • 必须通过外部包装器来检测进程退出并发送通知
  3. 触发新会话(不支持)

    • /new 命令是 TUI 交互命令,无法通过 CLI 参数直接触发
    • 没有 API 端点用于创建新会话
    • 变通方案:终止当前进程后重新启动新进程(但这会丢失上下文)
  4. 进程自动清理(不支持)

    • opencode 不会自动清理自己创建的子进程
    • 没有 --timeout--max-duration 参数
    • 需要通过 pkillkill 或进程管理器来实现

缺失的功能

关键缺失功能清单

缺失功能影响程度变通方案
任务完成回调🔴 高Shell 包装脚本捕获退出码
进程状态查询 API🔴 高使用 PID 文件 + ps 命令
会话管理 API🟡 中进程重启模拟新会话
跨进程事件广播🟡 中文件信号或消息队列
配置化 Webhook🟢 低外部脚本实现 HTTP 调用

验证方法

文档审查

已审查的文档来源

  1. OpenCode 官方文档https://opencode.ai/docs/)

    • CLI 命令参考:确认了 runserve 等命令的存在和参数
    • Plugin 文档:确认了插件加载机制,但无生命周期钩子说明
    • Config 文档:确认配置选项中无进程管理相关设置
  2. OpenCode Server Mode 文档https://open-code.ai/en/docs/server)

    • HTTP API 端点说明
    • 未提及任务状态查询或事件订阅接口
  3. 社区资源

    • 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    # 检查是否有此子命令

参考资料