# Automatyzacja webhookami Webhooki pozwalają wyzwalać systemy zewnętrzne, gdy uruchamiają się zdarzenia Synapse. Ten przewodnik obejmuje typowe wzorce automatyzacji. ## Typowe wzorce ### Wzorzec 1: powiadomienie o krytycznym wspomnieniu Wysłanie wiadomości Slack, gdy zapisywane jest krytyczne wspomnienie: ```python # Obsługa webhooka (twój serwer) @app.post("/webhook") async def handle(request): payload = await request.json() # Weryfikacja podpisu if not verify_signature(payload, request.headers): return 401 if payload["event"] == "memory.store": memory = payload["data"] if memory.get("priority") == "critical": # Wysłanie powiadomienia Slack await slack.post( f"🚨 Critical memory stored: {memory['key']}\n{memory['content'][:200]}" ) return 200 ``` Rejestracja webhooka: ```bash curl -X POST https://synapse.schaefer.zone/webhooks \ -H "Authorization: Bearer YOUR_MIND_KEY" \ -H "Content-Type: application/json" \ -d '{ "url": "https://my-app.com/webhook", "events": "memory.store", "secret": "my-hmac-secret" }' ``` ### Wzorzec 2: synchronizacja z systemem zewnętrznym Synchronizacja wspomnień z Notion, Obsidian lub dowolną zewnętrzną bazą wiedzy: ```python @app.post("/webhook") async def sync_to_notion(request): payload = await request.json() if payload["event"] == "memory.store": memory = payload["data"] # Utworzenie strony w Notion await notion.create_page( title=memory["key"], content=memory["content"], tags=memory.get("tags", []) ) elif payload["event"] == "memory.delete": # Usunięcie z Notion await notion.delete_page(memory_id=payload["data"]["id"]) return 200 ``` ### Wzorzec 3: wyzwalanie CI/CD Wyzwalanie wdrożenia, gdy zapisywane jest wspomnienie „release": ```python @app.post("/webhook") async def trigger_deploy(request): payload = await request.json() if payload["event"] == "memory.store": memory = payload["data"] if memory.get("key", "").startswith("release_"): # Wyzwolenie pipeline GitLab await gitlab.trigger_pipeline( project="synapse", ref="main", variables={"RELEASE_MEMORY_ID": memory["id"]} ) return 200 ``` ### Wzorzec 4: przebudzenie agenta przy wiadomości człowieka Wyzwolenie uruchomienia agenta LLM, gdy człowiek wysyła wiadomość czatu: ```python @app.post("/webhook") async def wake_agent(request): payload = await request.json() if payload["event"] == "chat.message_received": message = payload["data"] # Zakolejkowanie zadania przetwarzania agenta await job_queue.enqueue( "process_message", message_id=message["id"], content=message["content"] ) return 200 ``` ### Wzorzec 5: agregacja metryk Śledzenie wzrostu pamięci, aktywności czatu, ukończenia zadań: ```python @app.post("/webhook") async def track_metrics(request): payload = await request.json() event = payload["event"] metrics = { "memory.store": "memories_stored_total", "memory.delete": "memories_deleted_total", "chat.message_received": "messages_received_total", "task.created": "tasks_created_total", "task.completed": "tasks_completed_total", } if event in metrics: await prometheus.increment(metrics[event]) return 200 ``` ## Weryfikacja podpisu Zawsze weryfikować podpisy webhooków, aby zapobiec fałszerstwu: ```python import hmac import hashlib def verify_signature(payload_body: bytes, headers, secret: str) -> bool: signature = headers.get("X-Synapse-Signature", "") if not signature.startswith("sha256="): return False expected = hmac.new( secret.encode(), payload_body, hashlib.sha256 ).hexdigest() return hmac.compare_digest(f"sha256={expected}", signature) ``` ## Logika ponowień Synapse ponawia nieudane webhooki z wykładniczym wycofywaniem. Obsługa powinna: 1. **Szybko zwracać 200** — nie wykonywać ciężkiej pracy synchronicznie 2. **Kolejkować pracę** — użyć systemu zadań w tle 3. **Być idempotentna** — to samo zdarzenie może być dostarczone dwa razy ```python @app.post("/webhook") async def handle(request): payload = await request.json() # Kolejkowanie do asynchronicznego przetwarzania await job_queue.enqueue("process_webhook", payload) # Natychmiastowy zwrot return 200 ``` ## Debugowanie webhooków ### Sprawdzenie historii dostarczeń Dostarczenia webhooków są logowane. Sprawdzić ostatnie dostarczenia webhooka: ```bash # Pobranie szczegółów webhooka z ostatnimi dostarczeniami curl -H "Authorization: Bearer YOUR_MIND_KEY" \ https://synapse.schaefer.zone/webhooks/wh_001 ``` ### Ręczne testowanie webhooka ```bash # Wyzwolenie zdarzenia testowego curl -X POST https://synapse.schaefer.zone/webhooks/wh_001/test \ -H "Authorization: Bearer YOUR_MIND_KEY" ``` ### Częste problemy | Problem | Rozwiązanie | |-------|-----| | Odpowiedzi 4xx | Sprawdzić, czy obsługa zwraca 200 | | Odpowiedzi 5xx | Błąd serwera — sprawdzić logi aplikacji | | Timeout | Szybko zwrócić 200, kolejkować pracę asynchronicznie | | Duplikaty dostaw | Uczynić obsługę idempotentną | | Niedopasowanie podpisu | Zweryfikować poprawność sekretu | ## Najlepsze praktyki > [!TIP] > - **Zawsze weryfikować podpisy** — nigdy tego nie pomijać > - **Szybko zwracać 200** — nie blokować Synapse > - **Być idempotentnym** — obsługiwać duplikaty dostaw > - **Używać konkretnych zdarzeń** — `memory.store`, nie `*` > - **Monitorować błędy dostaw** — skonfigurować alertowanie ## Następne kroki - [Webhooks API](/docs/api/webhooks) - [Cron i Scheduler](/docs/api/cron) - [Trwały agent LLM](/docs/guides/persistent-llm-agent)