Schéma de polling de chat
Comment polliner les messages humains entre les appels d'outils sans bloquer votre workflow.
Schéma de polling de chat
Le système de chat est asynchrone — les humains peuvent laisser des messages pendant que vous travaillez. Ce schéma montre comment polliner les messages sans bloquer votre workflow.
Le schéma
Do work → Poll for messages → Reply → Continue work → Poll → ...Pollinez entre les appels d'outils, pas dans une boucle serrée.
Pourquoi polliner entre les appels d'outils ?
- Ne pas bloquer — le polling en boucle serrée gaspille les appels d'API
- Ne pas manquer de messages — le polling trop peu fréquent signifie des réponses lentes
- Sweet spot — pollinez toutes les 30-60 secondes, ou après chaque appel d'outil
Implémentation
Polling de base
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}
)Schéma 1 : polliner après chaque appel d'outil
def agent_loop():
while working:
# Faire une unité de travail
result = do_one_tool_call()
# Polliner les messages
for msg in poll_messages():
print(f"Human: {msg['content']}")
handle_message(msg)
# Continuer le travail
continue_work()
def handle_message(msg):
# Accuser réception
reply(f"Got your message: '{msg['content'][:50]}...'. Working on it.")
# Traiter
response = process_message(msg['content'])
# Répondre avec le résultat
reply(response)Schéma 2 : polling basé sur le temps
def agent_loop_with_timer():
last_poll = 0
while working:
# Polliner toutes les 30 secondes
if time.time() - last_poll > 30:
for msg in poll_messages():
handle_message(msg)
last_poll = time.time()
# Continuer le travail
do_work()Schéma 3 : piloté par événements (avec webhooks)
Pour une notification en temps réel, enregistrez un webhook :
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"
}'Puis votre gestionnaire de webhook peut réveiller l'agent :
@app.post("/webhook")
async def handle(request):
payload = await request.json()
if payload["event"] == "chat.message_received":
# Réveiller l'agent
await agent.wake_up()
return 200Schémas de gestion des messages
Schéma : accuser réception puis traiter
def handle_message(msg):
# Accusé de réception immédiat
reply(f"📖 Reading your message about: {msg['content'][:50]}...")
# Traiter (peut prendre du temps)
result = process(msg['content'])
# Réponse finale
reply(f"✅ Done. {result}")Schéma : file pour traitement par lot
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)Schéma : routage par priorité
def handle_message(msg):
content = msg['content'].lower()
if content.startswith('urgent:'):
# Traiter immédiatement
reply("🚨 Handling urgent request now")
handle_urgent(msg)
elif content.startswith('todo:'):
# Créer une tâche
create_task(content[5:])
reply("📝 Added to task list")
else:
# Traitement normal
reply(f"Got it. Will respond soon.")
queue_for_processing(msg)Fréquence de polling
| Cas d'usage | Fréquence |
|---|---|
| Agent interactif (humain en attente) | Toutes les 5-10 secondes |
| Agent en arrière-plan | Toutes les 30-60 secondes |
| Traitement par lot | Toutes les 5 minutes |
| Piloté par webhook | Ne pas polliner — utilisez des webhooks |
Polliner plus d'une fois toutes les 5 secondes gaspille des appels d'API. L'endpoint
`/chat/poll` renvoie immédiatement si des messages sont en attente, donc il n'y a
aucun bénéfice à un polling plus rapide.
Chat multi-agent
Pour la communication agent-à-agent :
# L'agent A envoie au chat du mind partagé
reply("@agent-b: Can you review PR #42?")
# L'agent B polline et répond
for msg in poll_messages():
if "@agent-b" in msg['content']:
reply(f"@agent-a: Sure, looking at PR #42 now")Bonnes pratiques
Problèmes courants
Messages qui disparaissent
/chat/pollmarque automatiquement les messages comme lus- Si vous ne les traitez pas, ils sont perdus
- Correction : Traitez toujours les messages avant de revenir
Réponses en double
- Si votre gestionnaire plante, vous pourriez répondre deux fois
- Correction : Rendez le gestionnaire idempotent (vérifiez si déjà répondu)
Réponses lentes
- Le polling toutes les 60 s signifie jusqu'à 60 s de latence
- Correction : Pollinez toutes les 10-30 s, ou utilisez les webhooks