Skip to content
Diese Seite wurde mit KI-Unterstützung erstellt und übersetzt. Falls Ihnen Ungenauigkeiten auffallen, helfen Sie gerne bei der Verbesserung. Auf GitHub bearbeiten

Executor-Referenz

Diese Seite dokumentiert alle 5 Executor-Typen im Detail, einschließlich ihrer Konfigurationsfelder, ihres Verhaltens und Beispiele.

openclaw

Sendet Benachrichtigungen über Messaging-Plattformen (Signal, Telegram) via das OpenClaw-CLI-Tool.

Funktionsweise: Konstruiert einen Shell-Befehl, der das OpenClaw-Binary mit --channel-, --target- und --message-Argumenten aufruft.

Konfiguration:

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

[agents.openclaw]
command = "/usr/local/bin/openclaw"   # Pfad zum OpenClaw-Binary
channel = "signal"                     # Kanal: "signal" oder "telegram"
target = "+1234567890"                 # Telefonnummer, Gruppen-ID oder Kanalname

Felder:

FeldErforderlichBeschreibung
commandJaPfad zum OpenClaw-CLI-Binary
channelJaMessaging-Kanal (signal, telegram)
targetJaEmpfängeridentifikator (Telefonnummer, Gruppen-ID usw.)

openprx

Sendet Nachrichten über die OpenPRX-Messaging-Infrastruktur. Unterstützt zwei Modi: HTTP-API (Signal-Daemon) oder CLI-Befehl.

Modus 1: Signal-API (bevorzugt)

Sendet einen JSON-POST an einen Signal-CLI-REST-API-Daemon:

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

[agents.openprx]
signal_api = "http://127.0.0.1:8686"  # signal-cli REST-API-Basis-URL
account = "+1234567890"                 # Absender-Telefonnummer
target = "+0987654321"                  # Empfänger-Telefonnummer oder UUID
channel = "signal"                      # Standard: "signal"

Die an die Signal-API gesendete HTTP-Anfrage:

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

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

Modus 2: CLI-Befehl

Fällt auf die Ausführung eines Shell-Befehls zurück, wenn signal_api nicht gesetzt ist:

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

Felder:

FeldErforderlichBeschreibung
signal_apiNeinSignal-Daemon-HTTP-API-Basis-URL
accountNeinKonto-Telefonnummer (wird mit signal_api verwendet)
targetJaEmpfänger-Telefonnummer oder UUID
channelNeinKanalname (Standard: signal)
commandNeinCLI-Befehl (Fallback, wenn signal_api nicht gesetzt ist)

Mindestens eines von signal_api oder command muss angegeben werden.


webhook

Leitet die vollständige Webhook-Nutzlast unverändert an einen HTTP-Endpunkt weiter. Nützlich für die Integration mit Slack, Discord, benutzerdefinierten APIs oder das Verketten zu einem anderen Webhook-Dienst.

Funktionsweise: Sendet einen JSON-POST an die konfigurierte URL mit der ursprünglichen Nutzlast. Signiert ausgehende Anfragen optional mit 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"  # Optional: ausgehende Anfragen signieren

Felder:

FeldErforderlichBeschreibung
urlJaZiel-URL
secretNeinHMAC-SHA256-Secret für ausgehende Signatur (als X-Webhook-Signature-Header gesendet)

Wenn secret gesetzt ist, enthält die ausgehende Anfrage einen X-Webhook-Signature: sha256=...-Header, der über den JSON-Body berechnet wird, sodass die Empfängerseite die Authentizität verifizieren kann.


custom

Führt einen beliebigen Shell-Befehl aus und übergibt die formatierte Nachricht als Argument. Nützlich für benutzerdefinierte Integrationen, Protokollierung oder das Auslösen externer Skripte.

Funktionsweise: Führt sh -c '{command} "{message}"' aus, wobei {message} die gerenderte Vorlage mit maskierten Sonderzeichen ist.

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"]  # Optionale zusätzliche Argumente

Felder:

FeldErforderlichBeschreibung
commandJaPfad zur ausführbaren Datei oder Shell-Befehl
argsNeinZusätzliche Befehlszeilenargumente

Sicherheitshinweis: Der Custom-Executor führt Shell-Befehle aus. Sicherstellen, dass der Befehlspfad vertrauenswürdig und nicht benutzerkontrollierbar ist.


cli

Führt KI-Coding-Agenten aus, um Issues zu verarbeiten. Dies ist der leistungsfähigste Executor-Typ, konzipiert für automatisierte Code-Generierung und Issue-Lösung.

Erfordert: features.cli_enabled = true in der Konfiguration. Wird bei OPENPR_WEBHOOK_SAFE_MODE=1 blockiert.

Unterstützte Executors (Whitelist):

ExecutorBinaryBefehlsmuster
codexcodexcodex exec --full-auto "{prompt}"
claude-codeclaudeclaude --print --permission-mode bypassPermissions [--mcp-config path] "{prompt}"
opencodeopencodeopencode run "{prompt}"

Jeder Executor, der nicht in dieser Whitelist ist, wird abgelehnt.

Konfiguration:

toml
[features]
cli_enabled = true
callback_enabled = true  # Erforderlich für Zustandsübergänge

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

[agents.cli]
executor = "claude-code"               # Eines von: codex, claude-code, opencode
workdir = "/opt/projects/backend"      # Arbeitsverzeichnis für das CLI-Tool
timeout_secs = 900                     # Timeout in Sekunden (Standard: 900)
max_output_chars = 12000               # Max. Zeichen aus stdout/stderr erfassen (Standard: 12000)
prompt_template = "Fix issue {issue_id}: {title}\nContext: {reason}"

# Zustandsübergänge (erfordert callback_enabled)
update_state_on_start = "in_progress"  # Issue-Status beim Taskstart setzen
update_state_on_success = "done"       # Issue-Status bei Erfolg setzen
update_state_on_fail = "todo"          # Issue-Status bei Fehler/Timeout setzen

# Callback-Konfiguration
callback = "mcp"                       # Callback-Modus: "mcp" oder "api"
callback_url = "http://127.0.0.1:8090/mcp/rpc"
callback_token = "bearer-token"        # Optionales Bearer-Token für Callback

# MCP Closed-Loop (v0.3.0+)
skip_callback_state = true             # Callback-Statusaktualisierungen überspringen (KI verwaltet via MCP)
# mcp_instructions = "..."            # Benutzerdefinierte MCP-Tool-Anweisungen (überschreibt Standard)
# mcp_config_path = "/path/to/mcp.json"  # claude-code --mcp-config Pfad

# Umgebungsvariablen pro Agent
[agents.cli.env_vars]
OPENPR_API_URL = "http://localhost:3000"
OPENPR_BOT_TOKEN = "opr_xxx"
OPENPR_WORKSPACE_ID = "e5166fd1-..."

Felder:

FeldErforderlichStandardBeschreibung
executorJa--CLI-Tool-Name (codex, claude-code, opencode)
workdirNein--Arbeitsverzeichnis
timeout_secsNein900Prozess-Timeout
max_output_charsNein12000Ausgabe-Tail-Erfassungslimit
prompt_templateNeinFix issue {issue_id}: {title}\nContext: {reason}An das CLI-Tool gesendete Eingabeaufforderung
update_state_on_startNein--Issue-Status beim Taskstart
update_state_on_successNein--Issue-Status bei Erfolg
update_state_on_failNein--Issue-Status bei Fehler oder Timeout
callbackNeinmcpCallback-Protokoll (mcp oder api)
callback_urlNein--URL zum Senden von Callbacks
callback_tokenNein--Bearer-Token für Callback-Auth
skip_callback_stateNeinfalseStatusaktualisierungen in Callbacks überspringen (wenn KI den Status via MCP verwaltet)
mcp_instructionsNeineingebautBenutzerdefinierte MCP-Tool-Anweisungen, an den Prompt angehängt
mcp_config_pathNein--Pfad zur MCP-Konfigurationsdatei (an claude-code via --mcp-config übergeben)
env_varsNein{}Zusätzliche Umgebungsvariablen, in den Executor-Unterprozess injiziert

Prompt-Vorlagen-Platzhalter (CLI-spezifisch):

PlatzhalterQuelle
{issue_id}payload.data.issue.id
{title}payload.data.issue.title
{reason}payload.bot_context.trigger_reason

Callback-Nutzlast (MCP-Modus):

Wenn callback = "mcp", sendet der Dienst einen JSON-RPC-artigen POST an 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"
  }
}

Zustandsübergangs-Lebenszyklus:

Event empfangen
    |
    v
[update_state_on_start] --> Issue-Status = "in_progress"
    |
    v
CLI-Tool läuft (bis timeout_secs)
    |
    +-- Erfolg --> [update_state_on_success] --> Issue-Status = "done"
    |
    +-- Fehler --> [update_state_on_fail] --> Issue-Status = "todo"
    |
    +-- Timeout --> [update_state_on_fail] --> Issue-Status = "todo"

Wenn skip_callback_state = true, werden alle obigen Statusübergänge unterdrückt -- der KI-Agent soll den Issue-Status direkt via MCP-Tools verwalten.


MCP Closed-Loop-Automatisierung

Wenn der KI-Agent über OpenPR-MCP-Tools verfügt, kann er autonom vollständige Issue-Informationen lesen, das Problem beheben und Ergebnisse zurückschreiben -- und so einen vollständigen Closed-Loop bilden.

Funktionsweise:

  1. openpr-webhook empfängt ein Bot-Task-Webhook-Event
  2. Es erstellt einen Prompt aus prompt_template und hängt MCP-Anweisungen an (Standard oder benutzerdefiniert)
  3. Der CLI-Executor läuft mit injizierten env_vars (z.B. OPENPR_BOT_TOKEN)
  4. Der KI-Agent nutzt MCP-Tools, um Issue-Details zu lesen, den Code zu korrigieren, Kommentare zu posten und den Status zu aktualisieren
  5. Der Callback meldet Ausführungsmetadaten (Dauer, Exit-Code), überspringt aber Statusaktualisierungen

Standard-MCP-Anweisungen (automatisch angehängt, wenn mcp_instructions, mcp_config_path oder env_vars konfiguriert sind):

1. Call work_items.get with work_item_id="{issue_id}" to read full issue details
2. Call comments.list with work_item_id="{issue_id}" to read all comments
3. Call work_items.list_labels with work_item_id="{issue_id}" to read labels
4. After completing the fix, call comments.create to post a summary
5. Call work_items.update to set state to "done" if successful

Diese können mit einem benutzerdefinierten Feld mcp_instructions überschrieben werden.

Umgebungsvariablen (env_vars):

Umgebungsvariablen pro Agent in den Executor-Unterprozess injizieren. Nützlich, um verschiedenen Agenten unterschiedliche API-URLs, Token oder Workspace-IDs bereitzustellen:

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

MCP-Konfigurationspfad (mcp_config_path):

Wenn der Agent für den claude-code-Executor eine nicht-globale MCP-Konfiguration benötigt, den Pfad angeben:

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

Dies fügt --mcp-config /etc/openpr-webhook/mcp-config.json zum claude-Befehl hinzu.

Released under the Apache-2.0 License.