Polling-Agenten in KI-Assistenten: 11 Implementierungsmuster
Zuverlässige Polling-Muster für KI-Agenten.
Polling-Agenten gehören zu den wenig glamourösen Aspekten der Architektur von KI-Assistenten, sind jedoch gleichzeitig eine der nützlichsten Komponenten.
Ein herkömmlicher Chat-Assistent wartet darauf, dass der Benutzer eine Frage stellt. Ein Polling-Agent (Abfrage-Agent) beobachtet kontinuierlich. Er überprüft eine Datenquelle, erkennt Änderungen, entscheidet, ob diese relevant sind, und handelt dann entsprechend. Diese Handlung kann eine Benachrichtigung, eine Zusammenfassung, ein Entwurf, ein Tool-Aufruf oder ein vollständiger Workflow sein.
So entwickelt sich ein Assistent von der Funktion „Beantworte meine Frage“ hin zur Funktion „Behalte dies für mich im Auge“. Anstatt reaktiv zu sein, wird er zu einem Hintergrundprozess, der im Namen des Benutzers Dinge bemerkt und handelt, wenn bestimmte Bedingungen erfüllt sind.

Der wichtige Designgedanke ist einfach: Machen Sie das Sprachmodell nicht für Zeit, Zustand, Wiederholungsversuche oder Sperren verantwortlich. Verwenden Sie dafür normale Backend-Infrastruktur. Nutzen Sie das Modell dort, wo es wertvoll ist: bei der Interpretation unstrukturierten Kontexts, beim Treffen semantischer Urteile und bei der Erzeugung nützlicher Sprache.
Was ist ein Polling-Agent?
Ein Polling-Agent ist ein Hintergrundprozess, der wiederholt eine Quelle überprüft und eine Assistentenaktion auslöst, wenn eine Bedingung erfüllt ist. In der breiteren AI Systems-Architektur – wo der Assistent ein LLM (Large Language Model), Speicher, Tooling, Routing und Observability kombiniert – ist die Polling-Schicht das Element, das den Assistenten proaktiv statt rein reaktiv macht. Für das vollständige Fünf-Schichten-Modell siehe AI Assistant Architecture: LLM, Memory, Tools, Routing, Observability.
Beispiele:
- Prüfe jeden Morgen einen Posteingang und fasse wichtige Nachrichten zusammen.
- Beobachte eine Notion-Aufgabenliste und führe den nächsten Todo-Ausführungsschritt aus.
- Überwache ein GitHub-Issue, bis sich der Status ändert.
- Polling eines lang laufenden KI-Jobs, bis das Ergebnis bereit ist.
- Prüfe einen Buchungstermin, bis einer verfügbar wird.
- Beobachte ein Lieferantenportal, bis ein Dokument erscheint.
- Scanne einmal pro Woche neue Forschungsarbeiten und fasse relevante zusammen.
Ein praktischer Polling-Agent hat fünf Verantwortlichkeiten:
- Zur richtigen Zeit aufwachen.
- Aus der Quelle lesen.
- Sich merken, was bereits gesehen wurde.
- Entscheiden, ob der neue Zustand relevant ist.
- Einmalig, sicher und ohne sich selbst zu wiederholen, handeln.
Ein typischer Produktionsablauf sieht wie folgt aus:
Scheduler
-> Polling-Worker
-> Quellsystem
-> Zustandspeicher
-> deterministische Filter
-> optionale LLM-Auswertung
-> Assistentenaktion
Diese Struktur ist auf die bestmögliche Weise langweilig. Langweilige Systeme sind um 2 Uhr morgens leichter zu debuggen.
Der Zustand, den jeder Polling-Agent benötigt
Polling-Agenten benötigen einen persistenten Zustand. Konversationsverlauf reicht nicht aus. Der Assistent kann sich die Konversation merken, aber das System benötigt eine zuverlässige operative Aufzeichnung.
Ein guter Polling-Zustandsdatensatz enthält normalerweise:
{
"poll_id": "poll_123",
"user_id": "user_456",
"source_type": "notion",
"source_ref": "database_tasks",
"condition": "Nimm eine Aufgabe im Todo-Zustand und führe sie aus",
"interval_seconds": 600,
"last_run_at": "2026-06-19T01:00:00Z",
"next_run_at": "2026-06-19T01:10:00Z",
"last_seen_cursor": "cursor_or_timestamp",
"last_result_hash": "b64e8a...",
"failure_count": 0,
"status": "active"
}
Das genaue Schema hängt von der Quelle ab, aber die meisten Systeme benötigen diese Konzepte.
Poll-Definition
Dies beschreibt, was der Agent beobachtet und warum.
poll_id
user_id
workspace_id
source_type
source_ref
condition_text
priority
status
Zum Beispiel:
source_type: notion
source_ref: Tasks database
condition_text: Finde eine Todo-Aufgabe, beanspruche sie, führe sie aus und markiere sie als Fertig.
Zeitplan
Dies beschreibt, wann der Agent laufen soll.
interval_seconds
cron_expression
timezone
last_run_at
next_run_at
jitter
Für einen Hermes-Agenten, der Notion alle 10 Minuten überprüft:
interval_seconds: 600
timezone: Australia/Melbourne
Cursor oder Snapshot
Dies hilft dem Agenten, das gleiche Datenmaterial nicht erneut zu verarbeiten.
Je nach Quelle kann dies sein:
last_seen_id
last_seen_timestamp
api_cursor
etag
version
content_hash
Für eine Notion-Aufgabenwarteschlange ist der Cursor möglicherweise weniger wichtig als der Aufgabenstatus und die Claim-Felder. Für Gmail, GitHub oder eine Sync-API ist der Cursor normalerweise kritisch.
Claim oder Lease (Miete)
Dies verhindert, dass zwei Worker dieselbe Aufgabe übernehmen.
claimed_by
claimed_at
claim_expires_at
run_id
Zum Beispiel kann eine Notion-Aufgabe geändert werden von:
Status: Todo
zu:
Status: InProgress
ClaimedBy: hermes
ClaimedAt: 2026-06-19T01:00:00Z
ClaimExpiresAt: 2026-06-19T01:30:00Z
RunId: run_789
Dies ist der Unterschied zwischen „Ich hoffe, nur ein Worker wählt sie“ und „das System hat ein Claim-Protokoll“.
Ausführungsprotokoll
Dies protokolliert, was während einer Ausführung geschehen ist.
run_id
poll_id
source_object_id
started_at
finished_at
status
items_checked
items_changed
decision_summary
error
Das Ausführungsprotokoll sollte im Assistenten-Backend leben, nicht nur in Notion oder einem anderen externen Tool. Notion ist gut für die Sichtbarkeit durch Menschen. Es ist nicht ideal als einziges Ausführungsprotokoll.
Dedupe-Protokoll (Entdopplung)
Dies verhindert doppelte Benachrichtigungen oder wiederholte Aktionen.
dedupe_key
poll_id
source_object_id
condition_version
action_type
delivered_at
Zum Beispiel:
user_456:poll_123:notion_page_999:execute:v1
Wenn dieselbe Aktion erneut versucht wird, kann das System sie unterdrücken.
Methode 1: Geplanter Polling-Worker
Dies ist das einfachste zuverlässige Muster.
Ein Scheduler wacht alle festen Intervalle auf und ruft einen Worker auf. Der Worker liest die Quelle, aktualisiert den Zustand und löst bei Bedarf eine Assistentenaktion aus.
Scheduler
-> Worker
-> Quell-API
-> Datenbank
-> Assistentenaktion
Wie es läuft
Der Scheduler ist für die Zeit verantwortlich. Es könnte Cron, ein Cloud-Scheduler, ein Kubernetes CronJob oder ein kleiner interner Scheduler sein.
In jedem Intervall startet er einen Worker-Lauf. Der Worker lädt seine Konfiguration, fragt die Zielquelle ab, vergleicht das Ergebnis mit dem gespeicherten Zustand und handelt bei Bedarf.
Für einen einfachen Assistenten reicht dies oft aus. Ein einzelner Scheduler und ein leichtgewichtiger Worker-Prozess können dutzende tägliche Prüfungen bewältigen, ohne Warteschlangen, Leases oder verteilte Koordination zu benötigen.
Zustandsmodell
Der Scheduler speichert sehr wenig. Normalerweise weiß er nur, wann er einen Job auslösen soll.
Die Anwendungsdatenbank speichert den wichtigen Zustand:
Poll-Definition
Zeitplan
Cursor oder Snapshot
Letzte Ausführungszeit
Fehleranzahl
Status
Der Worker sollte zustandslos sein. Er kann temporäre Daten während der Ausführung halten, aber die persistente Wahrheit gehört in die Datenbank.
Beispielablauf
Alle 10 Minuten:
Hermes-Polling-Worker auslösen
Worker:
aktive Poll-Konfiguration laden
Quelle abfragen
mit vorherigem Zustand vergleichen
deterministische Checks ausführen
LLM nur aufrufen, wenn nötig
Zustand aktualisieren
Assistenten-Ereignis emittieren
Beste Anwendung
Verwenden Sie geplante Polling-Worker für:
- Tägliche Zusammenfassungen.
- Stündliche Checks.
- Kleine interne Automatisierungen.
- Einfache „Behalte dies im Auge“-Aufgaben.
- Assistentenjobs mit niedriger bis mittlerer Volumenbelastung.
Schwächen
Geplantes Polling ist einfach zu verstehen, kann aber im großen Maßstab zerbrechlich werden. Wenn viele Polls gleichzeitig laufen, können Sie Ihre Worker überlasten oder die Rate-Limits der Anbieter erreichen. Wiederholungsversuche können auch unübersichtlich werden, wenn der Scheduler die Arbeit direkt startet.
Methode 2: Warteschlangenbasierte Polling-Worker
Warteschlangenbasiertes Polling ist in der Regel das beste Standardverfahren für Produktions-KI-Assistenten.
Der Scheduler führt den Poll nicht direkt aus. Er stellt einen Job in eine Warteschlange. Worker-Prozesse entnehmen Jobs aus der Warteschlange.
Scheduler
-> Warteschlange
-> Worker-Pool
-> Quell-API
-> Zustandspeicher
-> Assistentenaktion
Wie es läuft
Ein Scanner sucht nach fälligen Polls und stellt Jobs in die Warteschlange. Worker ziehen Jobs ab, wenn sie Kapazität haben.
Dies gibt Ihnen Backpressure (Gegendruck). Wenn das System beschäftigt ist, warten Jobs in der Warteschlange, anstatt die Quell-API oder den LLM-Anbieter zu überfordern.
Zustandsmodell
Die Datenbank speichert den Poll-Zustand:
poll_id
user_id
source_ref
condition_text
next_run_at
cursor
status
failure_count
Die Warteschlangen-Nachricht sollte klein bleiben:
{
"poll_id": "poll_123",
"scheduled_for": "2026-06-19T01:10:00Z",
"attempt": 1
}
Der Worker lädt den vollständigen Zustand aus der Datenbank, wenn er startet.
Beispielablauf
Alle Minute:
Scheduler findet Polls, bei denen next_run_at <= jetzt ist
Scheduler stellt Jobs in die Warteschlange
Worker:
entnehmen Jobs aus der Warteschlange
sperren oder mieten den Poll
Quelle abfragen
Zustand aktualisieren
bei Bedarf Assistentenaktion emittieren
next_run_at setzen
Beste Anwendung
Verwenden Sie warteschlangenbasiertes Polling für:
- KI-Assistenten mit mehreren Benutzern.
- Viele simultane Polls.
- Integrationen mit Rate-Limits.
- Wiederholbare Hintergrundarbeit.
- Jobs, die unterschiedlich lange dauern können.
- SaaS-Produkte, bei denen Zuverlässigkeit wichtig ist.
Schwächen
Warteschlangen fügen Infrastruktur hinzu. Sie benötigen Dead-Letter-Handling, Idempotenz, Sichtbarkeits-Timeouts und Wiederholungsrichtlinien. Das lohnt sich für Produktionssysteme, ist aber wahrscheinlich für einen kleinen Prototyp übertrieben.
Methode 3: Externes Tool als Aufgabenwarteschlange
Dies ist das Muster im Beispiel mit Notion plus Hermes.
Das externe Tool ist nicht nur eine Datenquelle. Es wird zur menschenfreundlichen Aufgabenwarteschlange. Der Agent prüft das Tool regelmäßig, beansprucht eine Aufgabe, führt sie aus und aktualisiert den Aufgabenstatus.
Scheduler
-> Hermes-Worker
-> Notion-Datenbank
-> eine Aufgabe beanspruchen
-> Aufgabe ausführen
-> Notion-Status aktualisieren
Wie es läuft
Alle 10 Minuten fragt Hermes die Notion-Datenbank nach einer Aufgabe im Zustand Todo ab. Er wählt die nächste Aufgabe, normalerweise nach Priorität und Erstellungszeit. Dann beansprucht er die Aufgabe, indem er sie auf InProgress setzt.
Danach führt Hermes die Aufgabe aus. Wenn die Ausführung erfolgreich ist, markiert er die Aufgabe als Complete. Wenn die Ausführung fehlschlägt, markiert er die Aufgabe als Failed oder gibt sie mit einer Wiederholungsanzahl nach Todo zurück.
Zustandsmodell
Notion speichert den menschenfreundlichen Aufgabenzustand:
Titel
Beschreibung
Status: Todo | InProgress | Complete | Failed
Priorität
CreatedAt
ClaimedBy
ClaimedAt
ClaimExpiresAt
RunId
RetryCount
LastError
CompletedAt
Das Hermes-Backend speichert den operativen Ausführungszustand:
run_id
notion_page_id
started_at
finished_at
execution_status
tool_calls
LLM trace
error details
idempotency_key
Diese Aufteilung ist wichtig. Notion ist hervorragend für Sichtbarkeit und manuelle Bearbeitung. Das Hermes-Backend ist besser für Protokolle, Wiederholungsversuche, Entdopplung und Audit-Historie.
Beispielablauf
Alle 10 Minuten:
Hermes wacht auf
Hermes:
Notion abfragen nach einer Aufgabe, wo Status = Todo
sortieren nach Priorität, CreatedAt
ausgewählte Aufgabe auf InProgress aktualisieren
ClaimedBy, ClaimedAt, ClaimExpiresAt, RunId setzen
die Aufgabe ausführen
Ausführungsprotokoll schreiben
Aufgabe auf Complete oder Failed setzen
Beste Anwendung
Verwenden Sie dieses Muster, wenn:
- Menschen die Arbeit bereits in Notion, Jira, Linear, Trello oder einem anderen Tool verwalten.
- Sie möchten, dass der Assistent sichtbare Aufgaben verarbeitet.
- Das Task-Board die Benutzeroberfläche ist.
- Sie ein einfaches Human-in-the-Loop-Automatisierungsmodell benötigen.
Schwächen
Externe Tools sind selten perfekte Warteschlangen. Atomare Claims können begrenzt sein. Die Abfragekonsistenz kann verzögert sein. Rate-Limits können gelten. Wenn der Agent in mehreren Instanzen laufen kann, benötigen Sie eine sorgfältige Claim- oder Lease-Strategie.
Die praktische Empfehlung ist, Notion als menschenfreundlichen Aufgabenposteingang zu verwenden, während alle Ausführungsprotokolle, Wiederholungsprotokolle, Traces und Idempotenzschlüssel in Hermes bleiben. Notion gibt Benutzern Sichtbarkeit; Hermes hält das System zuverlässig. Für die Dispatcher- und Konkurzenzmechanik, die sich hinter diesem Muster in Hermes befinden, siehe Kanban in Hermes Agent for Self Hosted LLM Workflows.
Methode 4: Lang laufender Worker-Loop
Ein lang laufender Loop ist die einfachste Implementierung.
while True:
due_polls = db.find_due_polls()
for poll in due_polls:
run_poll(poll)
sleep(30)
Dieses Muster kombiniert Planung und Ausführung in einem Dienst, was es zum einfachstmöglichen Ausgangspunkt für Hintergrund-Agent-Arbeit macht.
Wie es läuft
Der Worker-Prozess läuft kontinuierlich. Alle paar Sekunden oder Minuten prüft er die Datenbank auf fällige Polls und führt sie aus. Es ist einfach zu bauen, einfach zu verstehen und schnell zu iterieren während der Entwicklung.
Zustandsmodell
Die Datenbank speichert weiterhin persistenten Zustand:
Poll-Konfiguration
next_run_at
cursor
last result
failure count
status
Der Prozessspeicher sollte nur temporären Zustand enthalten:
current batch
short-lived cache
in-flight run
Speichern Sie wichtigen Fortschritt niemals nur im Speicher. Wenn der Prozess abstürzt, ist jeder Zustand, der nicht in den persistenten Speicher geschrieben wurde, verloren, und der nächste Lauf hat keine Möglichkeit zu wissen, wo die Dinge aufgehört haben.
Beste Anwendung
Verwenden Sie lang laufende Loops für:
- Prototypen.
- Lokale Entwicklung.
- Interne Tools.
- Single-Tenant-Systeme.
- Agents mit niedriger Volumenbelastung.
Schwächen
Dieses Muster wird riskant mit mehreren Replikaten. Ohne Leases können zwei Worker denselben Poll ausführen. Es fehlen auch die operativen Funktionen einer echten Warteschlange oder Workflow-Engine.
Ein lang laufender Loop ist als Ausgangspunkt nicht falsch, aber er ist kein verteilter Scheduler und sollte nicht als solcher behandelt werden. Sobald Sie mehrere Replikate oder stärkere Zuverlässigkeitsgarantien benötigen, müssen Sie zu einem der oben genannten strukturierten Muster wechseln.
Methode 5: Webhook-First mit Polling-Fallback
Wenn die Quelle Webhooks unterstützt, verwenden Sie diese. Polling sollte oft das Backup sein, nicht der primäre Mechanismus. Dieselbe Aufteilung erscheint im Agent-Protokoll-Design: A2A-Push-Benachrichtigungen wecken einen Client-Handler, der dann GetTask für den vollständigen Zustand abfragt, wie in A2A Streaming and Async Tasks for Long-Running Agent Workflows beschrieben.
externes System
-> Webhook-Endpunkt
-> Ereignisspeicher
-> Assistentenaktion
Rekonziliations-Poll
-> Quell-API
-> Vergleich mit Ereignisspeicher
-> Reparatur verpasster Ereignisse
Wie es läuft
Das externe System sendet Ereignisse an Ihren Webhook-Endpunkt, wenn sich etwas ändert. Ihr System speichert das Ereignis und verarbeitet es asynchron.
Ein langsamerer Rekonziliations-Poll läuft alle paar Stunden oder einmal pro Tag. Er prüft, ob Ereignisse verpasst wurden.
Zustandsmodell
Der Ereignisspeicher protokolliert eingehende Webhooks:
event_id
source_type
source_object_id
event_type
received_at
payload_hash
processed_at
signature_valid
Der Rekonziliations-Poll speichert:
last_reconciliation_at
last_seen_cursor
last_seen_version
Die Quellobjekt-Tabelle speichert den letzten bekannten Zustand:
external_id
current_status
external_updated_at
last_processed_event_id
Beste Anwendung
Verwenden Sie Webhook-First-Architektur für:
- GitHub-Ereignisse.
- Stripe-Ereignisse.
- Slack-Ereignisse.
- CRM-Updates.
- Bereitstellungsbenachrichtigungen.
- Ticketing-Systeme.
Schwächen
Webhooks erfordern einen öffentlichen Endpunkt, Signaturvalidierung, Replay-Schutz und Ereignis-Entdopplung. Einige Anbieter senden auch unvollständige Ereignisse, sodass Sie möglicherweise trotzdem das vollständige Objekt abrufen müssen.
Dennoch ist Polling alle Minute normalerweise verschwenderisch, wenn gute Webhooks existieren.
Methode 6: Provider-seitiges Hintergrund-Job-Polling
Manchmal ist das Abgefragte der KI-Job selbst.
Die Anwendung startet einen lang laufenden Provider-Job, speichert die Job-ID und prüft später, ob er abgeschlossen ist.
App
-> KI-Hintergrundjob starten
-> Provider-Job-ID speichern
-> Status abfragen
-> Ergebnis abrufen
-> Benutzer benachrichtigen
Wie es läuft
Der Assistent startet einen Job mit dem Anbieter. Der Anbieter gibt eine ID zurück. Ihr Backend speichert diese ID und prüft ihren Status, bis der Job erfolgreich ist, fehlschlägt, abläuft oder ein Timeout erreicht.
Zustandsmodell
Ihr Backend speichert:
assistant_task_id
provider_job_id
user_id
status
created_at
last_checked_at
expires_at
result_ref
Der Anbieter speichert den temporären Job-Zustand und die Ausgabe.
Wenn die Ausgabe wichtig ist, kopieren Sie sie so bald wie möglich nach Abschluss des Jobs in Ihren eigenen persistenten Speicher. Provider-seitige Ergebnisspeicherung hat kurze Aufbewahrungszeitfenster und ist kein Ersatz für ein ordnungsgemäßes Archiv in Ihrem eigenen System.
Beste Anwendung
Verwenden Sie provider-seitiges Hintergrund-Job-Polling für:
- Lange KI-Forschungsaufgaben.
- Großes Dokumentenprocessing.
- Codebasis-Analyse.
- Berichterstellung.
- Datenextraktionsjobs.
- Aufgaben, die normale HTTP-Anfrage-Timeouts überschreiten.
Schwächen
Dieses Muster löst ein Problem: Warten auf einen langen Provider-Job. Es ersetzt nicht Ihre Workflow-Engine, Ihren Scheduler, Ihre Warteschlange oder Ihren Geschäftszustandspeicher.
Methode 7: Durable Workflow Engine (Persistente Workflow-Engine)
Eine persistente Workflow-Engine verwaltet lang laufende Ausführung, Timer, Wiederholungsversuche und Wiederherstellung. Temporal ist die häufigste Wahl für Go- und Python-basierte Assistenten-Backends; für einen vollständigen Implementierungsleitfaden siehe Implementing Workflow Applications with Temporal in Go.
Anstatt jedes Warten und jede Wiederholung manuell zu verdrahten, modellieren Sie den Prozess als Workflow.
Workflow-Engine
-> Aktivität: Quelle überprüfen
-> Timer: warten
-> Aktivität: Ergebnis auswerten
-> Aktivität: Benutzer benachrichtigen
Wie es läuft
Der Workflow startet einmal und steuert dann sein eigenes Warten. Er kann minuten-, tageweise oder wochenlang schlafen. Wenn der Worker-Prozess abstürzt, kann die Workflow-Engine vom aufgezeichneten Zustand aus wieder aufnehmen.
Zustandsmodell
Die Workflow-Engine speichert:
workflow_id
execution history
timer state
activity attempts
retry policy
current workflow state
Ihre Anwendungsdatenbank speichert:
user-facing poll definition
authorization references
business records
notification records
Die Workflow-Engine besitzt den Prozesszustand – Ausführungshistorie, Timer, Wiederholungsversuche und Aktivitätsversuche. Ihre Datenbank besitzt den Geschäftszustand – Benutzerkonfigurationen, Autorisierungsprotokolle, Benachrichtigungen und Audit-Logs. Das Trennen dieser beiden verhindert, dass jede Schicht zu einem verwirrten Hybrid aus beiden wird.
Beste Anwendung
Verwenden Sie persistente Workflows für:
- Mehrstufige Geschäftsprozesse.
- Lang laufende Automatisierungen.
- Human-Approval-Flows.
- Zuverlässige Wiederholungsversuche.
- Auditierbare Hintergrundarbeit.
- Prozesse, die nach einem Fehler wieder aufgenommen werden müssen.
Schwächen
Workflow-Engines fügen Konzepte und Infrastruktur hinzu. Sie sind hervorragend, wenn der Prozess wichtig ist, aber schwerfälling für einfache stündliche Checks.
Methode 8: Persistenter Agent-Runtime
Einige Agent-Frameworks können Agent-Zustand persistieren, Ausführung checkpointen und später wieder aufnehmen.
Dies ist nützlich, wenn der Agent selbst einen mehrstufigen Reasoning-Prozess hat.
Scheduler oder Workflow
-> Agent-Runtime
-> Checkpoint laden
-> Tools aufrufen
-> Checkpoint speichern
-> später wieder aufnehmen
Wie es läuft
Ein externer Scheduler oder Workflow startet den Agenten. Die Agent-Runtime lädt den vorherigen Zustand, führt den nächsten Schritt aus, ruft bei Bedarf Tools auf und schreibt einen Checkpoint.
Die Agent-Runtime sollte nicht Ihr einziger Scheduler sein. Sie ist besser als die Reasoning-Schicht innerhalb einer größeren Backend-Architektur zu betrachten.
Zustandsmodell
Agent-Checkpoint-Speicher enthält:
current node
messages
tool outputs
intermediate reasoning state
pending action
Langzeitspeicher enthält:
stable user preferences
facts
project context
source references
Operativer Zustand gehört weiterhin woanders hin:
poll schedule
cursor
status
retry count
dedupe records
Eine nützliche Regel: Speicher ist kein Cursor, und ein Checkpoint ist keine Warteschlange. Agent-Speicher speichert, was das Modell weiß; operativer Zustand verfolgt, wo der Prozess ist und was es getan hat. Das Vermischen der beiden führt zu subtilen Bugs, die nur unter Konkurrenz oder nach einem Neustart auftreten. Der gesamte Designraum für Arbeitsspeicher, persistenten Zustand und Retrieval-Schichten wird in Memory Systems in AI Assistants behandelt.
Beste Anwendung
Verwenden Sie persistente Agent-Runtime für:
- Mehrstufige Forschung.
- Agenten, die pausieren und fortfahren.
- Human-in-the-Loop-Arbeit.
- Tool-lastige Reasoning-Aufgaben.
- Aufgaben, bei denen sich Kontext im Laufe der Zeit ansammelt.
Schwächen
Agent-Persistenz ist nicht dasselbe wie operative Zuverlässigkeit. Sie benötigen immer noch Planung, Sperren, Wiederholungsversuche, Rate-Limits und Audit-Logs.
Methode 9: Datenbank-Sync plus Änderungsauswertung
In diesem Muster wird Polling verwendet, um externe Daten in Ihre eigene Datenbank zu synchronisieren. Der Assistent reagiert dann auf lokale Datenbankänderungen, anstatt bei jedem Auswertungszyklus direkt externe APIs abzufragen.
Sync-Poller
-> externe API
-> lokale Datenbank
-> Änderungsauswertung
-> Assistentenaktion
Dies trennt die Datensynchronisierung von der Assistentenintelligenz. Der Sync-Worker ist dafür verantwortlich, lokale Datensätze aktuell zu halten; der Auswerter ist dafür verantwortlich, zu entscheiden, was mit Änderungen geschehen soll. Jede Schicht kann unabhängig getestet, überwacht und skaliert werden.
Wie es läuft
Der Sync-Worker holt regelmäßig externe Änderungen ab und schreibt normalisierte Datensätze in Ihre Datenbank. Ein zweiter Worker oder Änderungsstrom erkennt aktualisierte Zeilen und entscheidet, ob der Assistent handeln soll.
Zustandsmodell
Die Sync-Tabelle speichert:
external_id
source_type
raw_payload
normalized_fields
external_updated_at
synced_at
version
content_hash
Der Sync-Zustand speichert:
source_cursor
last_sync_at
rate_limit_status
failure_count
Die Assistenten-Auswertungstabelle speichert:
object_id
evaluation_status
last_evaluated_hash
decision
notification_id
Beste Anwendung
Verwenden Sie dieses Muster für:
- CRM-Sync.
- Ticketing-Systeme.
- Buchhaltungsunterlagen.
- Produktinventar.
- Compliance-Überprüfung.
- Suchindexierung.
- Interne Dashboards.
Schwächen
Das Synchronisieren von allem kann teuer und unnötig sein. Es kann auch Datenschutz- und Aufbewahrungspflichten schaffen. Verwenden Sie dieses Muster, wenn lokale Daten einen Wert jenseits einer einzelnen Assistentenaktion haben.
Methode 10: Adaptives Polling
Adaptives Polling ändert die Frequenz basierend auf Zustand, Dringlichkeit oder jüngster Aktivität.
aktives Objekt: alle 1 Minute pollen
wartendes Objekt: alle 1 Stunde pollen
veraltetes Objekt: einmal pro Tag pollen
abgeschlossenes Objekt: Polling stoppen
Wie es läuft
Nach jedem Lauf entscheidet der Worker, wann der nächste Lauf stattfinden soll.
Wenn sich das Objekt kürzlich geändert hat, pollen Sie früher. Wenn sich lange nichts geändert hat, verlangsamen Sie. Wenn die Aufgabe abgeschlossen ist, stoppen Sie.
Zustandsmodell
Der Poll-Zustand enthält:
current_interval
minimum_interval
maximum_interval
backoff_policy
last_activity_at
priority
stop_condition
Der Quell-Snapshot enthält:
status
updated_at
activity_level
expected_next_change
Beste Anwendung
Verwenden Sie adaptives Polling für:
- Bereitstellungsstatus.
- Sendungsverfolgung.
- Kalenderterminverfügbarkeit.
- Preisüberwachung.
- Build-Jobs.
- Lang laufende Provider-Aufgaben.
- Jede Quelle mit burstartigen Updates.
Schwächen
Adaptives Polling kann schwerer zu verstehen sein. Wenn eine Aufgabe zu einer strengen Zeit laufen muss, halten Sie es streng. Machen Sie Compliance-Jobs nicht clever.
Methode 11: Semantisches Polling mit einem LLM-Auswerter
Semantisches Polling wird verwendet, wenn die Bedingung ungenau ist.
Code kann antworten:
Ist Status gleich Fertig?
Ist Preis unter 100?
Gibt es eine neue Nachricht?
Ein LLM kann helfen zu antworten:
Klingt diese E-Mail dringend?
Ist dieser Kunde wahrscheinlich unzufrieden?
Ist diese Forschungsarbeit relevant?
Erfordert diese Änderung meine Aufmerksamkeit?
Wie es läuft
Der Worker wendet zuerst billige deterministische Filter an. Nur Kandidatenelemente gehen zum LLM.
neues Element?
entspricht Quellfiltern?
nicht bereits verarbeitet?
nicht offensichtlich irrelevant?
Dann wertet das LLM die kleinere Kandidatenmenge aus und gibt strukturierte Ausgabe zurück.
{
"should_notify": true,
"urgency": "high",
"reason": "Der Kunde meldet einen Produktionsausfall."
}
Zustandsmodell
Die Poll-Definition speichert:
semantic_condition
examples
negative_examples
user_preference_summary
model_config
Das Auswertungsprotokoll speichert:
input_reference
model
prompt_version
structured_output
confidence
cost
latency
Der Poll-Zustand speichert:
last_seen_ids
last_evaluated_hashes
last_decision
last_decision_reason
Beste Anwendung
Verwenden Sie semantisches Polling für:
- Erkennung wichtiger E-Mails.
- Überwachung der Kundengefüge.
- Forschungsalarme.
- Erkennung von Verkaufschancen.
- Sicherheits-Triage.
- Executive-Briefings.
Schwächen
LLM-Aufrufe kosten Geld und fügen Latenz hinzu. Sie können auch inkonsistent sein, wenn Prompts und Schemata lose sind. Verwenden Sie zuerst deterministische Filter. Fragen Sie das Modell nur, wenn Urteil tatsächlich benötigt wird.
Entscheidungstabelle: Wahl einer Polling-Agent-Methode
| Methode | Beste Anwendung | Vorteile | Nachteile |
|---|---|---|---|
| Geplanter Polling-Worker | Einfache wiederkehrende Assistentenaufgaben | Einfach zu bauen, einfach zu debuggen, minimale Infrastruktur | Begrenzte Skalierung, grundlegende Wiederholungsversuche, kann Worker überlasten, wenn viele Polls gleichzeitig feuern |
| Warteschlangenbasierte Polling-Worker | Produktions-SaaS-Assistenten mit vielen Benutzern | Skalierbar, widerstandsfähig, unterstützt Wiederholungsversuche und Backpressure | Erfordert Warteschlangeninfrastruktur, Idempotenz, Dead-Letter-Handling |
| Externes Tool als Aufgabenwarteschlange | Notion, Jira, Linear, Trello-basierte Aufgabenausführung | Menschenfreundlich, einfach zu inspizieren, funktioniert mit bestehenden Workflows | Externe Tools sind keine perfekten Warteschlangen, atomare Claims können schwierig sein |
| Lang laufender Worker-Loop | Prototypen und interne Tools | Sehr einfach, schnell zu implementieren, wenige bewegliche Teile | Schwache Zuverlässigkeit, schlechtes Multi-Replikat-Verhalten, begrenzter operativer Control |
| Webhook-First mit Polling-Fallback | Ereignisgesteuerte Integrationen | Schnelle Reaktion, weniger API-Aufrufe, Rekonziliation fängt verpasste Ereignisse ab | Benötigt öffentlichen Endpunkt, Ereignisvalidierung, Entdopplung, Provider-Webhook-Unterstützung |
| Provider-seitiges Hintergrund-Job-Polling | Lang laufende KI-Provider-Jobs | Handhabt langsame KI-Aufgaben, einfaches Status-Modell, gut für asynchrone UX | Verwaltet nur Provider-Job-Status, nicht den vollständigen Geschäftsworkflow |
| Persistente Workflow-Engine | Lang laufende mehrstufige Prozesse | Starke Wiederholungsversuche, Timer, Audit-Historie, Wiederherstellung nach Abstürzen | Mehr Infrastruktur und Konzepte, schwerfällig für einfaches Polling |
| Persistenter Agent-Runtime | Mehrstufige Reasoning-Agenten | Bewahrt Agent-Kontext, unterstützt Pause und Fortsetzung, gut für tool-lastige Aufgaben | Kein Ersatz für Scheduler oder Warteschlange, benötigt weiterhin operatives Backend |
| Datenbank-Sync plus Änderungsauswertung | Systeme, in denen externe Daten lokalen Wert haben | Sauberer Trennung, lokale Berichterstattung, weniger wiederholte externe Aufrufe | Mehr Speicher, mehr Sync-Komplexität, mögliche Datenschutz- und Aufbewahrungsbedenken |
| Adaptives Polling | Quellen mit Burst-Aktivität oder variabler Dringlichkeit | Reduziert Kosten, respektiert Rate-Limits, reagiert schneller bei hoher Aktivität | Schwerer zu verstehen, nicht ideal für strenge Zeitpläne |
| Semantisches Polling mit LLM-Auswerter | Ungenauige Bedingungen, die Urteil erfordern | Handhabt natürliche Sprachabsicht, nützliche Zusammenfassungen, flexible Entscheidungen | Kosten, Latenz, Prompt-Qualitätsrisiko, sollte einfache Code-Checks nicht ersetzen |
Empfohlene Standardarchitektur
Für die meisten Produktions-KI-Assistenten beginnen Sie damit:
polls table
-> Scheduler
-> Warteschlange
-> zustandslose Worker
-> deterministische Filter
-> optionaler LLM-Auswerter
-> Benachrichtigung oder Assistentenaktion
Ein minimales Schema:
CREATE TABLE polls (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
source_type TEXT NOT NULL,
source_ref TEXT NOT NULL,
condition_text TEXT NOT NULL,
schedule_type TEXT NOT NULL,
interval_seconds INTEGER,
timezone TEXT,
next_run_at TIMESTAMP NOT NULL,
last_run_at TIMESTAMP,
cursor_value TEXT,
last_hash TEXT,
status TEXT NOT NULL,
failure_count INTEGER NOT NULL DEFAULT 0,
last_error TEXT,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL
);
CREATE TABLE poll_runs (
id TEXT PRIMARY KEY,
poll_id TEXT NOT NULL,
started_at TIMESTAMP NOT NULL,
finished_at TIMESTAMP,
status TEXT NOT NULL,
items_checked INTEGER,
items_matched INTEGER,
decision_summary TEXT,
error TEXT
);
CREATE TABLE notifications (
id TEXT PRIMARY KEY,
poll_id TEXT NOT NULL,
user_id TEXT NOT NULL,
dedupe_key TEXT NOT NULL,
title TEXT NOT NULL,
body TEXT NOT NULL,
delivered_at TIMESTAMP,
UNIQUE (dedupe_key)
);
Dies gibt Ihnen eine saubere Trennung:
Scheduler besitzt Zeit
Warteschlange besitzt Pufferung
Worker besitzt Ausführung
Datenbank besitzt Zustand
LLM besitzt semantisches Urteil
Assistent besitzt Benutzerinteraktion
Diese Trennung ist das Herz eines zuverlässigen Polling-Agenten.
Beispiel: Hermes-Agent verarbeitet Notion-Aufgaben
Wenden wir nun die Architektur auf einen konkreten Fall an.
Gehen Sie davon aus, dass eine Notion-Datenbank Aufgaben enthält. Hermes sollte alle 10 Minuten laufen, eine Aufgabe im Todo-Zustand nehmen, sie auf InProgress setzen, sie ausführen und dann als Complete markieren.
Dies ist am besten beschrieben als:
externes Tool als Aufgabenwarteschlange
+
geplanter Polling-Worker
+
claim- oder lease-basierte Ausführung
Für eine Produktionsversion wird es zu:
warteschlangenbasiertes Polling mit Notion als menschenfreundlichem Aufgabenposteingang
Notion-Aufgabendaten
Die Notion-Datenbank sollte Felder wie diese enthalten:
Name
Status: Todo | InProgress | Complete | Failed
Priorität
CreatedAt
ClaimedBy
ClaimedAt
ClaimExpiresAt
RunId
RetryCount
LastError
CompletedAt
Die wichtigen Felder sind ClaimedAt, ClaimExpiresAt und RunId. Sie machen den Aufgaben-Claim sichtbar und wiederherstellbar.
Hermes-Ausführungszustand
Hermes sollte auch sein eigenes Ausführungsprotokoll führen:
run_id
notion_page_id
started_at
finished_at
status
input_snapshot
tool_calls
result_summary
error
idempotency_key
Dies schützt Sie, falls Notion manuell bearbeitet wird, ein API-Aufruf fehlschlägt oder Sie auditieren müssen, was Hermes tatsächlich getan hat.
Ausführungsablauf
Alle 10 Minuten:
Hermes-Scheduler erstellt einen Lauf
Hermes-Worker:
findet eine Notion-Aufgabe, wo Status = Todo
sortiert nach Priorität und CreatedAt
beansprucht die Aufgabe, indem er Status = InProgress setzt
schreibt ClaimedBy, ClaimedAt, ClaimExpiresAt und RunId
führt die Aufgabe aus
schreibt Ausführungsprotokolle in das Hermes-Backend
setzt Notion-Status auf Complete bei Erfolg
setzt Notion-Status auf Failed bei Fehler
Wenn Hermes nach dem Beantragen einer Aufgabe abstürzt, kann der Lease ablaufen:
Status = InProgress
ClaimExpiresAt < jetzt
Ein zukünftiger Lauf kann dann die Aufgabe wiederherstellen oder als fehlgeschlagen markieren.
Fehlerbehandlung
Bei Erfolg:
Status = Complete
CompletedAt = jetzt
LastError = leer
Bei wiederholbarem Fehler:
Status = Todo
RetryCount = RetryCount + 1
LastError = kurze Fehlermeldung
Bei nicht wiederholbarem Fehler:
Status = Failed
LastError = klare Erklärung
Zur Sicherheit sollte Hermes auch einen Idempotenzschlüssel verwenden:
notion_page_id + task_version + action_type
Dies verhindert, dass dieselbe Aufgabe doppelt ausgeführt wird, wenn ein Wiederholungsversuch zum falschen Zeitpunkt erfolgt.
Warum dies nicht nur Polling ist
Der Polling-Teil ist nur der Aufwachmechanismus. Die echte Architektur ist Aufgaben-Claiming und zuverlässige Ausführung.
Eine naive Implementierung sagt:
Alle 10 Minuten, finde eine Todo-Aufgabe und mache sie.
Eine zuverlässige Implementierung sagt:
Alle 10 Minuten, beanspruche genau eine eligible Aufgabe, protokolliere den Lauf, führe idempotent aus und bewege die Aufgabe in einen terminalen Zustand.
Das ist der Unterschied zwischen einer Demo und einem Agenten, dem Sie vertrauen können.
Häufige Polling-Agent-Fehler
Fehler 1: Kein Claim-Protokoll
Wenn zwei Worker dieselbe Aufgabe sehen können, können sie beide sie ausführen.
Verwenden Sie:
ClaimedBy
ClaimedAt
ClaimExpiresAt
RunId
Selbst wenn Sie aktuell nur einen Worker laufen lassen, designen Sie so, als ob ein zweiter Worker später erscheinen könnte.
Fehler 2: Kein Dedupe-Key
Jede externe Aktion sollte einen Dedupe-Key haben.
user_id + poll_id + source_object_id + action_type + condition_version
Dies verhindert wiederholte Benachrichtigungen, wiederholte E-Mails, wiederholte Aufgabenausführung und wiederholte Tool-Aufrufe. Die breiteren Prinzipien hinter dem Scoping, Speichern und Testen dieser Schlüssel gelten hier gleichermaßen – siehe Idempotency in Distributed Systems That Actually Works.
Fehler 3: Zu frühes Aufrufen des LLM
Fragen Sie das Modell nicht, Datenbankfilterung zu erledigen.
Schlecht:
Senden Sie alle Aufgaben an das LLM und fragen Sie, welche Todo ist.
Besser:
Verwenden Sie den Notion-API-Filter, um Todo-Aufgaben abzurufen.
Verwenden Sie dann das LLM nur, wenn Aufgabeninterpretation benötigt wird.
Fehler 4: Notion als einzigen Backend behandeln
Notion ist eine gute Benutzeroberfläche. Es ist kein vollständiger Ausführungsbackend.
Behalten Sie Ausführungsprotokolle, Wiederholungsversuche, Traces und Idempotenzprotokolle in Hermes.
Fehler 5: Unendliches Polling
Jeder Poll sollte eine Stop-Bedingung haben.
Beispiele:
stoppen nach Erfolg
stoppen nach Datum
stoppen nach maximalen Wiederholungsversuchen
stoppen, wenn Benutzer es deaktiviert
stoppen nach wiederholter Autorisierungsfehler
Ein Polling-Agent ohne Stop-Bedingung ist eine stille Kostenleakage.
Fehler 6: Keine Observability
Sie sollten in der Lage sein zu antworten:
Was hat der Agent ausgeführt?
Warum hat er ausgeführt?
Was hat er gelesen?
Was hat er geändert?
Warum ist er fehlgeschlagen?
Hat er den Benutzer benachrichtigt?
Hat er zweimal ausgeführt?
Wenn Sie diese Fragen nicht beantworten können, ist das System nicht bereit für wichtige Arbeit.
Observability-Checkliste
Verfolgen Sie Metriken wie:
polls_due
polls_started
polls_succeeded
polls_failed
tasks_claimed
tasks_completed
tasks_failed
claim_expired_count
duplicate_suppressed_count
llm_calls
llm_cost
rate_limit_count
average_run_duration
Protokollieren Sie Felder wie:
poll_id
run_id
source_type
source_object_id
claim_id
cursor_before
cursor_after
decision
dedupe_key
error
Erstellen Sie eine Admin-Ansicht für:
aktive Polls
stuck InProgress-Aufgaben
jüngste Fehler
Aufgaben mit hoher Wiederholungsrate
Dead-Letter-Jobs
teure LLM-Auswertungen
deaktivierte Integrationen
Polling-Agenten laufen im Hintergrund, wo Ausfälle leise sind und Probleme sich anhäufen können, bevor jemand es bemerkt. Hintergrundsysteme benötigen von Anfang an eingebauten Sichtbarkeit, nicht als nachträglichen Gedanken, wenn etwas schiefgeht. Für den vollständigen Observability-Stack für KI- und LLM-gestützte Systeme – Metriken, Traces, strukturierte Logs und SLOs – siehe Observability for LLM Systems: Metrics, Traces, Logs, and Testing in Production.
Finale Empfehlung
Polling-Muster handhaben die proaktive Planungsschicht unter einem Multi-Agent-System. Sobald Sie mehrere Agenten haben, die miteinander koordinieren müssen – nicht nur unabhängig pollen – ist die nächste Designentscheidung, wie sie koordinieren: Hub-and-Spoke, Pipeline, Fan-Out oder Swarm. Multi-Agent Orchestration Patterns behandelt diese Koordinations-Topologien mit Ausfallmodi und einem Entscheidungsframework.
Für einen ernsthaften KI-Assistenten beginnen Sie mit warteschlangenbasierten Polling-Workern und einem persistenten Zustandspeicher. Fügen Sie Webhooks hinzu, wo Anbieter sie unterstützen. Verwenden Sie adaptives Polling, wenn Rate-Limits wichtig sind. Verwenden Sie eine persistente Workflow-Engine, wenn der Prozess lang läuft und mehrere Schritte umfasst. Verwenden Sie persistente Agent-Runtime, wenn der Agent über die Zeit hinweg reasonen muss.
Für das Hermes- und Notion-Beispiel ist die richtige Architektur:
Notion als menschenfreundlicher Aufgabenposteingang
Hermes-Scheduler alle 10 Minuten
Hermes-Worker mit Claim- oder Lease-Logik
Hermes-Backend für Ausführungsprotokolle und Idempotenz
Notion-Statusupdates für Sichtbarkeit
Das Polling-Intervall ist nicht der harte Teil. Der harte Teil ist sicherzustellen, dass der Agent eine Aufgabe beansprucht, sie einmal ausführt, protokolliert, was passiert ist, und das System in einem Zustand zurücklässt, den Menschen verstehen können.
Das ist es, was ein Polling-Skript in einen zuverlässigen KI-Assistenten verwandelt – nicht das Intervall, nicht das Modell, sondern die Disziplin beim Claiming von Arbeit, beim Protokollieren und beim Zurücklassen des Systems in einem Zustand, den Menschen und zukünftige Läufe beide verstehen können.