# Webhook 自動化 Webhook を使用すると、Synapse イベント発生時に外部システムをトリガーできます。本ガイドでは一般的な自動化パターンを説明します。 ## 一般的なパターン ### パターン 1:クリティカルメモリの通知 クリティカルメモリ保存時に Slack メッセージを送信します。 ```python # Webhook handler (your server) @app.post("/webhook") async def handle(request): payload = await request.json() # Verify signature if not verify_signature(payload, request.headers): return 401 if payload["event"] == "memory.store": memory = payload["data"] if memory.get("priority") == "critical": # Send Slack notification await slack.post( f"🚨 Critical memory stored: {memory['key']}\n{memory['content'][:200]}" ) return 200 ``` Webhook を登録します。 ```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" }' ``` ### パターン 2:外部システムへの同期 メモリを Notion、Obsidian、その他の外部 KB に同期します。 ```python @app.post("/webhook") async def sync_to_notion(request): payload = await request.json() if payload["event"] == "memory.store": memory = payload["data"] # Create Notion page await notion.create_page( title=memory["key"], content=memory["content"], tags=memory.get("tags", []) ) elif payload["event"] == "memory.delete": # Delete from Notion await notion.delete_page(memory_id=payload["data"]["id"]) return 200 ``` ### パターン 3:CI/CD のトリガー 「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_"): # Trigger GitLab pipeline await gitlab.trigger_pipeline( project="synapse", ref="main", variables={"RELEASE_MEMORY_ID": memory["id"]} ) return 200 ``` ### パターン 4:人間メッセージでのエージェント起動 人間がチャットメッセージを送信したときに LLM エージェント実行をトリガーします。 ```python @app.post("/webhook") async def wake_agent(request): payload = await request.json() if payload["event"] == "chat.message_received": message = payload["data"] # Queue agent processing job await job_queue.enqueue( "process_message", message_id=message["id"], content=message["content"] ) return 200 ``` ### パターン 5:メトリクス集計 メモリ増加、チャット活動、タスク完了を追跡します。 ```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 ``` ## 署名検証 なりすましを防ぐため、Webhook 署名を常に検証してください。 ```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) ``` ## 再試行ロジック Synapse は失敗した Webhook を指数バックオフで再試行します。ハンドラは以下を行うべきです。 1. **200 を素早く返す** — 同期的に重い作業をしない 2. **作業をキューに入れる** — バックグラウンドジョブシステムを使用 3. **冪等にする** — 同じイベントが 2 回配信される可能性 ```python @app.post("/webhook") async def handle(request): payload = await request.json() # Queue for async processing await job_queue.enqueue("process_webhook", payload) # Return immediately return 200 ``` ## Webhook のデバッグ ### 配信履歴の確認 Webhook 配信はログに記録されます。Webhook の最近の配信を確認します。 ```bash # Get webhook details including recent deliveries curl -H "Authorization: Bearer YOUR_MIND_KEY" \ https://synapse.schaefer.zone/webhooks/wh_001 ``` ### Webhook の手動テスト ```bash # Trigger a test event curl -X POST https://synapse.schaefer.zone/webhooks/wh_001/test \ -H "Authorization: Bearer YOUR_MIND_KEY" ``` ### よくある問題 | 問題 | 修正 | |-------|-----| | 4xx レスポンス | ハンドラが 200 を返すか確認 | | 5xx レスポンス | サーバーエラー — アプリログを確認 | | タイムアウト | 200 を素早く返し、作業を非同期でキューに | | 重複配信 | ハンドラを冪等にする | | 署名不一致 | secret が正しいか確認 | ## ベストプラクティス > [!TIP] > - **署名を常に検証** — 絶対にスキップしない > - **200 を素早く返す** — Synapse をブロックしない > - **冪等にする** — 重複配信を処理 > - **具体的なイベントを使用** — `*` ではなく `memory.store` > - **配信失敗を監視** — アラートを設定 ## 次のステップ - [Webhooks API](/docs/api/webhooks) - [Cron & Scheduler](/docs/api/cron) - [Persistent LLM Agent](/docs/guides/persistent-llm-agent)