Skip to content
Эта страница создана и переведена с помощью ИИ. Если вы заметили неточности, помогите нам улучшить её. Редактировать на GitHub

Справочник исполнителей

На этой странице подробно документированы все 5 типов исполнителей, включая их поля конфигурации, поведение и примеры.

openclaw

Отправляет уведомления через платформы обмена сообщениями (Signal, Telegram) с помощью инструмента CLI OpenClaw.

Принцип работы: Формирует shell-команду, которая вызывает бинарный файл OpenClaw с аргументами --channel, --target и --message.

Конфигурация:

toml
[[agents]]
id = "my-openclaw"
name = "Signal Notifier"
agent_type = "openclaw"
message_template = "[{project}] {key}: {title}"

[agents.openclaw]
command = "/usr/local/bin/openclaw"   # Путь к бинарному файлу OpenClaw
channel = "signal"                     # Канал: "signal" или "telegram"
target = "+1234567890"                 # Номер телефона, ID группы или имя канала

Поля:

ПолеОбязательноеОписание
commandДаПуть к CLI-бинарному файлу OpenClaw
channelДаКанал обмена сообщениями (signal, telegram)
targetДаИдентификатор получателя (номер телефона, ID группы и т.д.)

openprx

Отправляет сообщения через инфраструктуру обмена сообщениями OpenPRX. Поддерживает два режима: HTTP API (Signal daemon) или CLI-команда.

Режим 1: Signal API (предпочтительный)

Отправляет JSON POST на REST API daemon signal-cli:

toml
[[agents]]
id = "my-openprx"
name = "OpenPRX Signal"
agent_type = "openprx"

[agents.openprx]
signal_api = "http://127.0.0.1:8686"  # Базовый URL REST API signal-cli
account = "+1234567890"                 # Номер телефона отправителя
target = "+0987654321"                  # Номер телефона или UUID получателя
channel = "signal"                      # По умолчанию: "signal"

HTTP-запрос, отправляемый к Signal API:

POST {signal_api}/api/v1/send/{account}
Content-Type: application/json

{
  "recipients": ["{target}"],
  "message": "..."
}

Режим 2: CLI-команда

Откатывается к выполнению shell-команды, если signal_api не задан:

toml
[agents.openprx]
command = "openprx message send"
channel = "signal"
target = "+0987654321"

Поля:

ПолеОбязательноеОписание
signal_apiНетБазовый URL HTTP API Signal daemon
accountНетНомер телефона аккаунта (используется с signal_api)
targetДаНомер телефона или UUID получателя
channelНетИмя канала (по умолчанию: signal)
commandНетCLI-команда (откат, когда signal_api не задан)

Должно быть указано хотя бы одно из signal_api или command.


webhook

Пересылает полный webhook-payload как есть на HTTP-эндпоинт. Полезно для интеграции с Slack, Discord, пользовательскими API или цепочки к другому webhook-сервису.

Принцип работы: Отправляет JSON POST на настроенный URL с оригинальным payload. Опционально подписывает исходящие запросы с помощью HMAC-SHA256.

toml
[[agents]]
id = "slack-forward"
name = "Slack Forwarder"
agent_type = "webhook"

[agents.webhook]
url = "https://hooks.slack.com/services/T.../B.../xxx"
secret = "outbound-signing-secret"  # Опционально: подпись исходящих запросов

Поля:

ПолеОбязательноеОписание
urlДаЦелевой URL
secretНетСекрет HMAC-SHA256 для исходящей подписи (отправляется как заголовок X-Webhook-Signature)

При установке secret, исходящий запрос включает заголовок X-Webhook-Signature: sha256=..., вычисленный над телом JSON, позволяя принимающей стороне проверить подлинность.


custom

Выполняет произвольную shell-команду, передавая отформатированное сообщение в качестве аргумента. Полезно для пользовательских интеграций, логирования или запуска внешних скриптов.

Принцип работы: Запускает sh -c '{command} "{message}"', где {message} — отрисованный шаблон со специальными экранированными символами.

toml
[[agents]]
id = "custom-logger"
name = "Log to File"
agent_type = "custom"
message_template = "{event} | {key} | {title}"

[agents.custom]
command = "/usr/local/bin/log-event.sh"
args = ["--format", "json"]  # Опциональные дополнительные аргументы

Поля:

ПолеОбязательноеОписание
commandДаПуть к исполняемому файлу или shell-команда
argsНетДополнительные аргументы командной строки

Примечание по безопасности: Пользовательский исполнитель запускает shell-команды. Убедитесь, что путь к команде надёжен и не контролируется пользователем.


cli

Выполняет AI-кодирующие агенты для обработки задач. Это наиболее мощный тип исполнителя, предназначенный для автоматической генерации кода и решения задач.

Требует: features.cli_enabled = true в конфигурации. Блокируется при OPENPR_WEBHOOK_SAFE_MODE=1.

Поддерживаемые исполнители (белый список):

ИсполнительБинарныйПаттерн команды
codexcodexcodex exec --full-auto "{prompt}"
claude-codeclaudeclaude --print --permission-mode bypassPermissions [--mcp-config path] "{prompt}"
opencodeopencodeopencode run "{prompt}"

Любой исполнитель, не входящий в этот белый список, будет отклонён.

Конфигурация:

toml
[features]
cli_enabled = true
callback_enabled = true  # Требуется для переходов состояний

[[agents]]
id = "my-coder"
name = "Code Agent"
agent_type = "cli"

[agents.cli]
executor = "claude-code"               # Один из: codex, claude-code, opencode
workdir = "/opt/projects/backend"      # Рабочая директория для CLI-инструмента
timeout_secs = 900                     # Таймаут в секундах (по умолчанию: 900)
max_output_chars = 12000               # Макс. символов для захвата из stdout/stderr (по умолчанию: 12000)
prompt_template = "Fix issue {issue_id}: {title}\nContext: {reason}"

# Переходы состояний (требует callback_enabled)
update_state_on_start = "in_progress"  # Установить состояние задачи при запуске
update_state_on_success = "done"       # Установить состояние задачи при успехе
update_state_on_fail = "todo"          # Установить состояние задачи при ошибке/таймауте

# Конфигурация обратного вызова
callback = "mcp"                       # Режим обратного вызова: "mcp" или "api"
callback_url = "http://127.0.0.1:8090/mcp/rpc"
callback_token = "bearer-token"        # Опциональный Bearer-токен для обратного вызова

# MCP closed-loop (v0.3.0+)
skip_callback_state = true             # Пропустить обновления состояния через callback (AI управляет через MCP)
# mcp_instructions = "..."            # Пользовательские инструкции MCP-инструмента (переопределяет стандартные)
# mcp_config_path = "/path/to/mcp.json"  # Путь к конфигурации MCP для claude-code --mcp-config

# Переменные окружения для агента
[agents.cli.env_vars]
OPENPR_API_URL = "http://localhost:3000"
OPENPR_BOT_TOKEN = "opr_xxx"
OPENPR_WORKSPACE_ID = "e5166fd1-..."

Поля:

ПолеОбязательноеПо умолчаниюОписание
executorДаИмя CLI-инструмента (codex, claude-code, opencode)
workdirНетРабочая директория
timeout_secsНет900Таймаут процесса
max_output_charsНет12000Лимит захвата хвоста вывода
prompt_templateНетFix issue {issue_id}: {title}\nContext: {reason}Промпт, отправляемый CLI-инструменту
update_state_on_startНетСостояние задачи при запуске
update_state_on_successНетСостояние задачи при успехе
update_state_on_failНетСостояние задачи при ошибке или таймауте
callbackНетmcpПротокол обратного вызова (mcp или api)
callback_urlНетURL для отправки обратных вызовов
callback_tokenНетBearer-токен для аутентификации обратного вызова
skip_callback_stateНетfalseПропустить обновления состояния в обратных вызовах (когда AI управляет состоянием через MCP)
mcp_instructionsНетвстроенныеПользовательские инструкции MCP-инструмента, добавляемые к промпту
mcp_config_pathНетПуть к файлу конфигурации MCP (передаётся в claude-code через --mcp-config)
env_varsНет{}Дополнительные переменные окружения, внедряемые в subprocess исполнителя

Заполнители шаблона промпта (специфичные для cli):

ЗаполнительИсточник
{issue_id}payload.data.issue.id
{title}payload.data.issue.title
{reason}payload.bot_context.trigger_reason

Payload обратного вызова (режим MCP):

При callback = "mcp", сервис отправляет JSON-RPC-подобный POST на callback_url:

json
{
  "method": "issue.comment",
  "params": {
    "issue_id": "42",
    "run_id": "run-1711234567890",
    "executor": "claude-code",
    "status": "success",
    "summary": "cli execution completed",
    "exit_code": 0,
    "duration_ms": 45000,
    "stdout_tail": "...",
    "stderr_tail": "...",
    "state": "done"
  }
}

Жизненный цикл перехода состояний:

Событие получено
    |
    v
[update_state_on_start] --> состояние задачи = "in_progress"
    |
    v
CLI-инструмент запущен (до timeout_secs)
    |
    +-- успех --> [update_state_on_success] --> состояние задачи = "done"
    |
    +-- ошибка --> [update_state_on_fail] --> состояние задачи = "todo"
    |
    +-- таймаут --> [update_state_on_fail] --> состояние задачи = "todo"

При skip_callback_state = true все переходы состояний выше подавляются — ожидается, что AI-агент будет управлять состоянием задачи напрямую через MCP-инструменты.


MCP Closed-Loop Автоматизация

Когда AI-агент имеет доступ к MCP-инструментам OpenPR, он может автономно читать полный контекст задачи, исправить проблему и записать результаты обратно — формируя полный замкнутый цикл.

Принцип работы:

  1. openpr-webhook получает webhook-событие bot-задачи
  2. Формирует промпт из prompt_template и добавляет MCP-инструкции (стандартные или пользовательские)
  3. CLI-исполнитель запускается с внедрёнными env_vars (например, OPENPR_BOT_TOKEN)
  4. AI-агент использует MCP-инструменты для чтения деталей задачи, исправления кода, публикации комментариев и обновления состояния
  5. Обратный вызов сообщает метаданные выполнения (длительность, код выхода), но пропускает обновления состояния

Стандартные MCP-инструкции (добавляются автоматически при наличии mcp_instructions, mcp_config_path или env_vars):

1. Вызвать work_items.get с work_item_id="{issue_id}" для чтения полных деталей задачи
2. Вызвать comments.list с work_item_id="{issue_id}" для чтения всех комментариев
3. Вызвать work_items.list_labels с work_item_id="{issue_id}" для чтения меток
4. После завершения исправления вызвать comments.create для публикации резюме
5. Вызвать work_items.update для установки состояния "done" при успехе

Эти инструкции можно переопределить через поле mcp_instructions.

Переменные окружения (env_vars):

Внедряйте переменные окружения для каждого агента в subprocess исполнителя. Полезно для предоставления разных API URL, токенов или ID рабочих пространств разным агентам:

toml
[agents.cli.env_vars]
OPENPR_API_URL = "http://localhost:3000"
OPENPR_BOT_TOKEN = "opr_bot_token_here"
OPENPR_WORKSPACE_ID = "e5166fd1-..."

Путь конфигурации MCP (mcp_config_path):

Для исполнителя claude-code, если агенту нужна не глобальная конфигурация MCP, укажите путь:

toml
mcp_config_path = "/etc/openpr-webhook/mcp-config.json"

Это добавляет --mcp-config /etc/openpr-webhook/mcp-config.json к команде claude.

Released under the Apache-2.0 License.