跳转到内容

Webhook 调度器

openpr-webhook 是一个基于 Axum 构建的 Rust 服务,将 OpenPR 的项目管理事件与 AI 编码代理桥接起来。它接收 Webhook 事件,验证其真实性,并启动相应的代理来处理任务。

OpenPR ──webhook──▶ openpr-webhook ──CLI──▶ AI 代理
│ │
│◀─────callback─────────┘
WSS 隧道(可选,用于 NAT 穿透)

该服务暴露一个 HTTP 端点来接收 OpenPR Webhook 事件。每个传入请求都使用 HMAC-SHA256 签名验证,基于 OpenPR 和调度器之间配置的共享密钥。

支持的事件类型包括 issue.createdissue.updated 和其他 OpenPR 生命周期事件。调度器过滤这些事件以识别机器人任务——指派人是机器人用户的事件——并忽略仅人类的分配。

调度器支持五种代理类型:

代理类型说明
openclawOpenPRX 默认编码代理
openprx通用 OpenPRX 代理
webhook将事件转发到外部 Webhook
custom用户自定义代理,带自定义配置
cli本地执行的基于 CLI 的代理

CLI 执行器是主要的派发机制。它以受控参数将编码代理作为子进程启动。

仅允许以下 CLI 工具:

CLI说明
codexOpenAI Codex CLI 代理
claude-codeAnthropic Claude Code CLI 代理
opencode开源编码代理

任何尝试执行不在白名单中的二进制文件都会被拒绝。

参数默认值说明
工作目录每个代理配置代码仓库的检出路径
超时900 秒(15 分钟)强制终止前的最大执行时间
提示词模板每代理类型带有 Issue 上下文占位符的模板

提示词模板支持从 Webhook 事件载荷中填充的占位符:

You are working on project {{project_name}}.
Issue #{{issue_number}}: {{issue_title}}
Description:
{{issue_description}}
Please implement the required changes and report your results.

代理完成工作后,结果通过以下方式发回 OpenPR:

  • MCP — 代理直接调用 OpenPR 的 MCP 工具来更新 Issue 状态、添加评论和转换状态
  • API — 直接调用 OpenPR HTTP 端点的 REST API

回调使用代理的输出更新 Issue,并转换其状态(成功时通常从 in_progressdone,失败时添加包含错误详情的评论)。

对于代理主机位于 NAT 或防火墙后的部署,openpr-webhook 支持到 OpenPR 控制面的出站 WebSocket Secure (WSS) 隧道

隧道流程:

  1. openpr-webhook 打开到 OpenPR 的出站 WSS 连接
  2. OpenPR 通过隧道推送任务事件
  3. 调度器确认接收,在本地执行代理
  4. 结果通过同一隧道连接返回

这避免了代理主机上的入站端口转发或公共 IP 地址需求。

openpr-webhook 采用纵深防御设计:

所有功能都在功能门控后面,默认为 false

功能默认值说明
cli_executorfalse启用本地 CLI 代理执行
wss_tunnelfalse启用 WSS 隧道连接
webhook_forwardfalse启用转发到外部 Webhook
custom_agentfalse启用自定义代理配置

启用安全模式后,调度器以只读观察模式运行:事件被接收和记录,但不派发代理。这对于在启用执行之前测试 Webhook 连接和验证事件载荷很有用。

严格的 CLI 白名单(codexclaude-codeopencode)防止任意命令执行。白名单编译到二进制文件中,不能仅通过配置在运行时修改。

[webhook]
secret = "your-hmac-secret"
listen = "0.0.0.0:8091"
[executor]
working_dir = "/opt/repos"
timeout_secs = 900
safe_mode = false
[agents.default]
type = "cli"
cli = "claude-code"
prompt_template = "default.txt"
Terminal window
# 构建
cargo build --release
# 使用默认配置运行
./target/release/openpr-webhook
# 使用自定义配置路径运行
./target/release/openpr-webhook --config /etc/openpr-webhook/config.toml