Webhooki
Gateway może udostępniać niewielki punkt końcowy HTTP webhook do wyzwalaczy zewnętrznych.Włączanie
hooks.tokenjest wymagane, gdyhooks.enabled=true.hooks.pathdomyślnie ma wartość/hooks.
Uwierzytelnianie
Każde żądanie musi zawierać token hooka. Preferowane są nagłówki:Authorization: Bearer <token>(zalecane)x-openclaw-token: <token>- Tokeny w query-string są odrzucane (
?token=...zwraca400).
Punkty końcowe
POST /hooks/wake
Ładunek:
textwymagane (string): Opis zdarzenia (np. „Nowy e‑mail odebrany”).modeopcjonalne (now|next-heartbeat): Czy wyzwolić natychmiastowy heartbeat (domyślnienow) czy poczekać na kolejne okresowe sprawdzenie.
- Kolejkuje zdarzenie systemowe dla sesji głównej
- Jeśli
mode=now, wyzwala natychmiastowy heartbeat
POST /hooks/agent
Ładunek:
messagewymagane (string): Prompt lub wiadomość do przetworzenia przez agenta.nameopcjonalne (string): Czytelna dla człowieka nazwa hooka (np. „GitHub”), używana jako prefiks w podsumowaniach sesji.agentIdopcjonalne (string): Kieruje ten hook do konkretnego agenta. Nieznane identyfikatory powodują powrót do domyślnego agenta. Po ustawieniu hook uruchamia się z użyciem workspace i konfiguracji rozwiązanego agenta.sessionKeyopcjonalne (string): Klucz używany do identyfikacji sesji agenta. Domyślnie to pole jest odrzucane, chyba że ustawionohooks.allowRequestSessionKey=true.wakeModeopcjonalne (now|next-heartbeat): Czy wyzwolić natychmiastowy heartbeat (domyślnienow) czy poczekać na kolejne okresowe sprawdzenie.deliveropcjonalne (boolean): Jeślitrue, odpowiedź agenta zostanie wysłana do kanału komunikacyjnego. Domyślnietrue. Odpowiedzi będące wyłącznie potwierdzeniami heartbeat są automatycznie pomijane.channelopcjonalne (string): Kanał komunikacyjny do dostarczenia. Jeden z:last,whatsapp,telegram,discord,slack,mattermost(plugin),signal,imessage,msteams. Domyślnielast.toopcjonalne (string): Identyfikator odbiorcy dla kanału (np. numer telefonu dla WhatsApp/Signal, identyfikator czatu dla Telegram, identyfikator kanału dla Discord/Slack/Mattermost (plugin), identyfikator konwersacji dla MS Teams). Domyślnie ostatni odbiorca w sesji głównej.modelopcjonalne (string): Nadpisanie modelu (np.anthropic/claude-3-5-sonnetlub alias). Musi znajdować się na liście dozwolonych modeli, jeśli obowiązują ograniczenia.thinkingopcjonalne (string): Nadpisanie poziomu myślenia (np.low,medium,high).timeoutSecondsopcjonalne (number): Maksymalny czas trwania uruchomienia agenta w sekundach.
- Uruchamia izolowaną turę agenta (własny klucz sesji)
- Zawsze publikuje podsumowanie w sesji głównej
- Jeśli
wakeMode=now, wyzwala natychmiastowy heartbeat
Polityka klucza sesji (breaking change)
NadpisaniasessionKey w ładunku /hooks/agent są domyślnie wyłączone.
- Zalecane: ustaw stały
hooks.defaultSessionKeyi wyłącz nadpisania w żądaniach. - Opcjonalne: zezwalaj na nadpisania w żądaniach tylko w razie potrzeby i ogranicz prefiksy.
POST /hooks/<name> (mapowane)
Niestandardowe nazwy hooków są rozwiązywane przez hooks.mappings (zob. konfigurację). Mapowanie może
zamienić dowolne ładunki na akcje wake lub agent, z opcjonalnymi szablonami lub
transformacjami kodu.
Opcje mapowania (podsumowanie):
hooks.presets: ["gmail"]włącza wbudowane mapowanie Gmail.hooks.mappingspozwala zdefiniowaćmatch,actionoraz szablony w konfiguracji.hooks.transformsDir+transform.moduleładuje moduł JS/TS dla logiki niestandardowej.hooks.transformsDir(jeśli ustawione) musi pozostawać w katalogu głównym transforms w Twoim katalogu konfiguracyjnym OpenClaw (zwykle~/.openclaw/hooks/transforms).transform.modulemusi być rozwiązywany w efektywnym katalogu transforms (ścieżki traversal/escape są odrzucane).
- Użyj
match.source, aby zachować generyczny punkt ingestu (routing sterowany ładunkiem). - Transformacje TS wymagają loadera TS (np.
bunlubtsx) albo wstępnie skompilowanego.jsw czasie wykonania. - Ustaw
deliver: true+channel/tow mapowaniach, aby kierować odpowiedzi na powierzchnię czatu (channeldomyślnie ma wartośćlasti w razie potrzeby przełącza się na WhatsApp). agentIdkieruje hook do określonego agenta; nieznane identyfikatory powodują powrót do domyślnego agenta.hooks.allowedAgentIdsogranicza jawne kierowanie przezagentId. Pomiń tę opcję (lub uwzględnij*), aby zezwolić na dowolnego agenta. Ustaw[], aby zablokować jawne kierowanie przezagentId.hooks.defaultSessionKeyustawia domyślną sesję dla uruchomień agenta hook, gdy nie podano jawnego klucza.hooks.allowRequestSessionKeyokreśla, czy ładunki/hooks/agentmogą ustawiaćsessionKey(domyślnie:false).hooks.allowedSessionKeyPrefixesopcjonalnie ogranicza jawne wartościsessionKeyz ładunków żądań i mapowań.allowUnsafeExternalContent: truewyłącza zewnętrzną otoczkę bezpieczeństwa treści dla tego hooka (niebezpieczne; tylko dla zaufanych źródeł wewnętrznych).openclaw webhooks gmail setupzapisuje konfiguracjęhooks.gmaildlaopenclaw webhooks gmail run. Zobacz Gmail Pub/Sub dla pełnego przepływu watch Gmail.
Odpowiedzi
200dla/hooks/wake202dla/hooks/agent(uruchomienie asynchroniczne rozpoczęte)401w przypadku niepowodzenia uwierzytelniania429po powtarzających się nieudanych próbach uwierzytelnienia z tego samego klienta (sprawdźRetry-After)400w przypadku nieprawidłowego ładunku413w przypadku zbyt dużych ładunków
Przykłady
Użycie innego modelu
Dodajmodel do ładunku agenta (lub mapowania), aby nadpisać model dla tego uruchomienia:
agents.defaults.models, upewnij się, że model nadpisania jest na niej uwzględniony.
Bezpieczeństwo
- Trzymaj punkty końcowe hooków za loopback, w tailnecie lub za zaufanym reverse proxy.
- Używaj dedykowanego tokenu hooka; nie używaj ponownie tokenów uwierzytelniania gateway.
- Powtarzające się nieudane próby uwierzytelnienia są ograniczane (rate limit) per adres klienta, aby spowolnić próby brute-force.
- Jeśli używasz routingu wieloagentowego, ustaw
hooks.allowedAgentIds, aby ograniczyć jawny wybóragentId. - Utrzymuj
hooks.allowRequestSessionKey=false, chyba że wymagane są sesje wybierane przez wywołującego. - Jeśli włączysz żądania z
sessionKey, ograniczhooks.allowedSessionKeyPrefixes(na przykład[“hook:”]). - Unikaj umieszczania w logach webhooków wrażliwych surowych ładunków.
- Ładunki hooków są domyślnie traktowane jako niezaufane i opakowywane granicami bezpieczeństwa.
Jeśli musisz wyłączyć to dla konkretnego hooka, ustaw
allowUnsafeExternalContent: truew mapowaniu tego hooka (niebezpieczne).