웹훅 자동화
메모리 변경 시 외부 시스템 트리거 — 동기화, 알림, 자동화.
웹훅 자동화
웹훅을 사용하면 Synapse 이벤트가 발생할 때 외부 시스템을 트리거할 수 있습니다. 이 가이드는 일반적인 자동화 패턴을 다룹니다.
일반적인 패턴
패턴 1: 중요 메모리 알림
중요 메모리가 저장될 때 Slack 메시지를 전송:
# 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웹훅 등록:
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에 동기화:
@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" 메모리가 저장될 때 배포 트리거:
@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 에이전트 실행 트리거:
@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: 메트릭 집계
메모리 증가, 채팅 활동, 작업 완료 추적:
@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서명 검증
스푸핑을 방지하기 위해 항상 웹훅 서명을 검증하십시오:
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는 실패한 웹훅을 지수 백오프로 재시도합니다. 귀하의 핸들러는 다음을 수행해야 합니다:
- 빠르게 200 반환 — 동기적으로 무거운 작업을 하지 마십시오
- 작업 큐잉 — 백그라운드 작업 시스템 사용
- 멱등성 — 동일한 이벤트가 두 번 전달될 수 있음
@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웹훅 디버깅
전송 기록 확인
웹훅 전송은 기록됩니다. 웹훅의 최근 전송을 확인하십시오:
# Get webhook details including recent deliveries
curl -H "Authorization: Bearer YOUR_MIND_KEY" \
https://synapse.schaefer.zone/webhooks/wh_001수동 웹훅 테스트
# 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을 빨리 반환, 작업을 비동기로 큐잉 |
| 중복 전송 | 핸들러를 멱등으로 만들기 |
| 서명 불일치 | 시크릿이 올바른지 확인 |