Blog · Anleitung · 29. Oktober 2026
Einen AEGIS-Workflow per signiertem Webhook starten
Offenlegung: Wir bei 100monkeys.ai entwickeln AEGIS, lesen Sie diese Anleitung also als Bericht des Herstellers. Einer unserer KI-Agenten hat sie aus der öffentlichen AEGIS-Dokumentation (auf Englisch) entworfen, der Seite Configuring Webhooks, und das Unternehmen hat sie geprüft; diese deutsche Fassung ist eine Übersetzung der englischen Originalanleitung. Jeder Befehl und jeder Codeblock unten ist von dieser Seite kopiert; für diese Anleitung wurde nichts davon ausgeführt. Zitate bleiben auf Englisch, mit der Übersetzung daneben. Wo die Dokumentation eine Frage offen lässt, sagt es der letzte Abschnitt.
AEGIS by 100monkeys.ai, in beta, kann einen Workflow starten, wenn ein anderes System ihm ein Ereignis schickt: ein Push auf GitHub, ein fertiger CI-Job, jeder Dienst, der eine HTTP-Anfrage stellen kann. Der Absender braucht kein Konto auf Ihrem Knoten. In den Worten der Dokumentation: "Authentication is handled by HMAC-SHA256 signature verification, not OAuth." (Die Authentifizierung erfolgt über die Prüfung einer HMAC-SHA256-Signatur, nicht über OAuth.) Diese Anleitung richtet eine Quelle von Anfang bis Ende ein, vom gemeinsamen Secret bis zur getesteten Anfrage, und behandelt die Fehler, denen Sie unterwegs begegnen.
Schritt 1. Die Quelle benennen
Jeder Webhook kommt bei POST /v1/webhooks/{source} an. Die Quelle ist "a lowercase slug that identifies the system sending the event" (ein Slug in Kleinbuchstaben, der das sendende System bezeichnet), etwa github, stripe oder my-ci. Wählen Sie einen pro sendendem System: Secret, Route und Dublettenprüfung hängen alle daran.
Schritt 2. Das gemeinsame Secret am Orchestrator setzen
Secrets gelten pro Mandant und Quelle; zwei Mandanten, die ihre Quelle beide github nennen, halten also "completely independent secrets" (völlig unabhängige Secrets). Jedes Paar ist eine Umgebungsvariable am Orchestrator, benannt nach diesem Muster:
# Pattern: AEGIS_WEBHOOK_SECRET_<UPPER_TENANT>_<UPPER_SOURCE>
# Hyphens and dots in tenant id and source name are replaced with underscores
export AEGIS_WEBHOOK_SECRET_U_ABC123_GITHUB="your-shared-secret-here"
export AEGIS_WEBHOOK_SECRET_U_ABC123_STRIPE="another-secret"
export AEGIS_WEBHOOK_SECRET_U_DEF456_MY_CI="third-secret"
Mandant u-abc123 mit der Quelle my-ci liest also AEGIS_WEBHOOK_SECRET_U_ABC123_MY_CI. Fehlt die Variable für das ermittelte Paar, wird die Anfrage mit 401 secret_not_found abgelehnt. Geben Sie dasselbe Secret dem Absender und sonst niemandem.
Schritt 3. Die Quelle an einen Workflow leiten
Eine direkte Route bildet die Quelle auf einen Workflow ab, das Routing ist also "instant and deterministic" (sofort und deterministisch). In der aktuellen Version werden direkte Routen "configured via orchestrator workflow routing configuration" (über die Workflow-Routing-Konfiguration des Orchestrators eingestellt), und die Seite merkt an: "there is no aegis stimulus routes CLI command yet" (es gibt noch keinen CLI-Befehl aegis stimulus routes). Ohne direkte Route greift die Pipeline auf einen konfigurierten RouterAgent zurück, der das Ereignis mit einem Sprachmodell einordnet. Fehlt beides, scheitert die Anfrage mit 422 no_router_configured. Für einen einzelnen, bekannten Absender ist die direkte Route die richtige: Dasselbe Ereignis startet immer denselben Workflow.
Schritt 4. Den rohen Body beim Absender signieren
Der Absender berechnet mit dem gemeinsamen Secret einen HMAC-SHA256 über den rohen Anfrage-Body und schickt ihn in X-Aegis-Signature mit dem Präfix sha256=. Das Python-Beispiel der Dokumentation:
import hashlib
import hmac
import json
import requests
def sign_payload(body: bytes, secret: str) -> str:
sig = hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
return f"sha256={sig}"
payload = json.dumps({"event": "push", "ref": "refs/heads/main"}).encode()
signature = sign_payload(payload, WEBHOOK_SECRET)
requests.post(
"https://your-aegis-node/v1/webhooks/github",
data=payload,
headers={
"Content-Type": "application/json",
"X-Aegis-Signature": signature,
},
)
Die Seite zeigt dasselbe auch in Node.js. Die eine Regel, die sie fett setzt: den HMAC über die rohen Bytes des Bodys berechnen, vor jedem Parsen, denn "Computing over a re-serialized object will produce a different signature." (Über ein neu serialisiertes Objekt berechnet, ergibt sich eine andere Signatur.) Signieren Sie genau die Bytes, die Sie senden.
Schritt 5. Den Endpunkt mit curl testen
# Generate a test signature
SECRET="your-shared-secret-here"
BODY='{"event":"push","ref":"refs/heads/main"}'
SIG="sha256=$(echo -n "$BODY" | openssl dgst -sha256 -hmac "$SECRET" | awk '{print $2}')"
# Send the test webhook
curl -X POST https://your-aegis-node/v1/webhooks/github \
-H "Content-Type: application/json" \
-H "X-Aegis-Signature: $SIG" \
-d "$BODY"
Ein Erfolg antwortet mit zwei IDs:
{
"stimulus_id": "stim-uuid",
"workflow_execution_id": "wfex-uuid"
}
Die zweite ist der Workflow-Lauf, den das Ereignis gestartet hat; verfolgen Sie ihn wie jeden anderen Lauf.
Schritt 6. Doppelte Zustellungen stoppen
Absender wiederholen Zustellungen. Reichen Sie die Zustell-ID des Anbieters als X-Idempotency-Key weiter: bei GitHub ist das X-GitHub-Delivery, bei Ihrem eigenen Absender "Any stable per-event UUID" (jede stabile UUID pro Ereignis). Der Orchestrator dedupliziert 24 Stunden lang nach Quelle und Schlüssel, und eine Wiederholung antwortet mit 409:
{
"error": "idempotent_duplicate",
"original_stimulus_id": "stim-original-uuid"
}
Schritt 7. Den Fehler lesen, den Sie bekommen
Die Fehlertabelle der Seite, in der Reihenfolge, in der Sie ihr wahrscheinlich begegnen:
401 missing_signature: kein HeaderX-Aegis-Signature.400 malformed_signature: Der Header hat nicht die Formsha256=<hex>;400 invalid_hex: Der Hex-Teil enthält andere Zeichen.401 secret_not_found: keine Variable für den ermittelten Mandanten und die Quelle.401 invalid_signature: Der Digest stimmt nicht; ein vor dem Signieren neu serialisierter Body ist der Fall, vor dem die Seite warnt.409 idempotent_duplicate: innerhalb von 24 Stunden bereits verarbeitet.422 classification_failed: Die Konfidenz des RouterAgent lag unter seiner Schwelle;422 no_router_configured: keine direkte Route und kein RouterAgent.
Schritt 8. Für interne Aufrufer den authentifizierten Endpunkt nutzen
Ein Dienst, der bereits ein Keycloak-Konto hat, kann das gemeinsame Secret auslassen und stattdessen mit einem Bearer-Token an POST /v1/stimuli senden, mit source, content und einem idempotency_key im Body. Behalten Sie die Webhook-Route für Systeme, die Sie nicht selbst betreiben.
Was die Dokumentation offen lässt
- Wie man eine direkte Route schreibt. Die Seite sagt, dass Routen in der Workflow-Routing-Konfiguration des Orchestrators liegen, nennt aber keinen Schlüssel, keine Datei und kein Beispiel, und die Configuration Reference ist bei diesem Schritt nicht verlinkt.
- Wie ein Webhook registriert wird. Der Mandant "is resolved from the (tenant, source_name) registration written when the webhook was registered" (wird aus der Registrierung (tenant, source_name) ermittelt, die bei der Registrierung des Webhooks geschrieben wurde); diese Registrierung zeigt die Seite nicht.
- Was der Workflow erhält. Die Seite sagt nicht, wie Nutzlast und Header in der Eingabe oder im Blackboard des gestarteten Workflows erscheinen.
- Ein Secret rotieren. Kein Überlappungsfenster ist beschrieben, und die Seite sagt nicht, ob eine geänderte Variable ohne Neustart des Orchestrators wirkt.
Weiter
Der Workflow, den ein Webhook startet, ist ein Zustandsautomat, den Sie schreiben. Unsere Anleitung AEGIS-Workflow-Zustände und -Übergänge, Schritt für Schritt baut einen. AEGIS wird mit dem Befehl installiert, der auf 100monkeys.ai steht:
curl -fsSL https://get.100monkeys.ai | bash