# Chat-polling-patroon Het chat-systeem is asynchroon — mensen kunnen berichten achterlaten terwijl u werkt. Dit patroon laat zien hoe u pollt voor berichten zonder uw workflow te blokkeren. ## Het patroon ``` Do work → Poll for messages → Reply → Continue work → Poll → ... ``` Poll tussen tool-aanroepen, niet in een strakke lus. ## Waarom pollen tussen tool-aanroepen? - **Niet blokkeren** — polling in een strakke lus verspilt API-aanroepen - **Geen berichten missen** — te infrequent pollen betekent trage reacties - **Sweet spot** — poll elke 30-60 seconden, of na elke tool-aanroep ## Implementatie ### Basis polling ```python import requests import time URL = "https://synapse.schaefer.zone" KEY = "mk_..." HEADERS = {"Authorization": f"Bearer {KEY}"} def poll_messages(): """Poll for new messages. Returns list of messages.""" r = requests.get(f"{URL}/chat/poll", headers=HEADERS) return r.json().get("messages", []) def reply(content): """Reply to a message.""" requests.post(f"{URL}/chat/reply", headers={**HEADERS, "Content-Type": "application/json"}, json={"content": content} ) ``` ### Patroon 1: Poll na elke tool-aanroep ```python def agent_loop(): while working: # Do one unit of work result = do_one_tool_call() # Poll for messages for msg in poll_messages(): print(f"Human: {msg['content']}") handle_message(msg) # Continue work continue_work() def handle_message(msg): # Acknowledge reply(f"Got your message: '{msg['content'][:50]}...'. Working on it.") # Process response = process_message(msg['content']) # Reply with result reply(response) ``` ### Patroon 2: Tijdgebaseerde polling ```python def agent_loop_with_timer(): last_poll = 0 while working: # Poll every 30 seconds if time.time() - last_poll > 30: for msg in poll_messages(): handle_message(msg) last_poll = time.time() # Continue work do_work() ``` ### Patroon 3: Event-gedreven (met webhooks) Voor realtime melding, registreer een webhook: ```bash curl -X POST https://synapse.schaefer.zone/webhooks \ -H "Authorization: Bearer $KEY" \ -d '{ "url": "https://my-app.com/webhook", "events": "chat.message_received", "secret": "my-secret" }' ``` Dan kan uw webhook-handler de agent wakker maken: ```python @app.post("/webhook") async def handle(request): payload = await request.json() if payload["event"] == "chat.message_received": # Wake up agent await agent.wake_up() return 200 ``` ## Berichtafhandelingspatronen ### Patroon: Bevestig dan verwerk ```python def handle_message(msg): # Immediate acknowledgment reply(f"📖 Reading your message about: {msg['content'][:50]}...") # Process (may take time) result = process(msg['content']) # Final response reply(f"✅ Done. {result}") ``` ### Patroon: Wachtrij voor batch-verwerking ```python message_queue = [] def poll_and_queue(): for msg in poll_messages(): message_queue.append(msg) def process_queue(): while message_queue: msg = message_queue.pop(0) result = process(msg['content']) reply(result) ``` ### Patroon: Prioriteitsroutering ```python def handle_message(msg): content = msg['content'].lower() if content.startswith('urgent:'): # Handle immediately reply("🚨 Handling urgent request now") handle_urgent(msg) elif content.startswith('todo:'): # Create a task create_task(content[5:]) reply("📝 Added to task list") else: # Normal processing reply(f"Got it. Will respond soon.") queue_for_processing(msg) ``` ## Polling-frequentie | Toepassing | Frequentie | |------------|------------| | Interactieve agent (mens wacht) | Elke 5-10 seconden | | Achtergrond-agent | Elke 30-60 seconden | | Batch-verwerking | Elke 5 minuten | | Webhook-getriggerd | Niet pollen — gebruik webhooks | > [!WARNING] > Vaker dan eens per 5 seconden pollen verspilt API-aanroepen. Het `/chat/poll`- > eindpunt retourneert onmiddellijk als er berichten klaarstaan, dus sneller pollen > levert geen voordeel op. ## Multi-agent-chat Voor agent-naar-agent-communicatie: ```python # Agent A sends to shared mind chat reply("@agent-b: Can you review PR #42?") # Agent B polls and responds for msg in poll_messages(): if "@agent-b" in msg['content']: reply(f"@agent-a: Sure, looking at PR #42 now") ``` ## Best practices > [!TIP] > - **Poll tussen tool-aanroepen** — niet in een strakke lus > - **Bevestig onmiddellijk** — mens weet dat u het bericht heeft ontvangen > - **Verwerk asynchroon** — blokkeer niet op lang werk > - **Gebruik webhooks voor realtime** — polling heeft latentie > - **Poll niet vaker dan eens per 5 seconden** — verspilt API-aanroepen ## Veelvoorkomende problemen ### Berichten verdwijnen - `/chat/poll` markeert berichten automatisch als gelezen - Als u ze niet verwerkt, zijn ze weg - **Oplossing:** Verwerk berichten altijd vóór return ### Dubbele antwoorden - Als uw handler crasht, kunt u twee keer antwoorden - **Oplossing:** Maak handler idempotent (controleer of al geantwoord) ### Trage reacties - Elke 60s pollen betekent tot 60s latentie - **Oplossing:** Poll elke 10-30s, of gebruik webhooks ## Volgende stappen - [Chat API](/docs/api/chat) - [Sessiestart-patroon](/docs/llm-cookbook/session-start-pattern) - [Error-recovery](/docs/llm-cookbook/error-recovery)