Polling Agents in AI-assistenten: 11 implementatiepatronen

Betrouwbare pollingpatronen voor AI-agents.

Inhoud

Pollende agents behoren tot de minst glamourrijze onderdelen van de architectuur van AI-assistents, maar ze zijn ook een van de meest nuttige.

Een normale chat-assistent wacht tot de gebruiker iets vraagt. Een pollende agent blijft toekijken. Hij controleert een bron, merkt veranderingen op, beslist of dit van belang is en treedt vervolgens op. Deze actie kan een melding, een samenvatting, een concept, een tool-oproep of een volledige workflow zijn.

Zo verandert een assistent van “beantwoord mijn vraag” naar “houd dit voor mij in de gaten”. In plaats van reactief te zijn, wordt het een achtergrondproces dat dingen namens de gebruiker opmerkt en optreedt wanneer aan bepaalde voorwaarden wordt voldaan.

AI-agent bewaakt datastromen aan een futuristisch console

Het belangrijke ontwerppunt is simpel: laat het taalmodel niet verantwoordelijk zijn voor tijd, status, opnieuw proberen of vergrendeling. Gebruik daar normale backend-infrastructuur voor. Gebruik het model waar het waardevol is: het interpreteren van rommelige context, het maken van semantische oordelen en het produceren van nuttige taal.

Wat is een pollende agent?

Een pollende agent is een achtergrondproces dat herhaaldelijk een bron controleert en een actie van de assistent activeert wanneer een voorwaarde wordt voldaan. In de bredere AI-systemen stack — waarbij de assistent een LLM, geheugen, gereedschap, routing en observabiliteit combineert — is de polling-laag wat de assistent proactief maakt in plaats van puur reactief. Zie voor het volledige vijf-laags overzicht AI-assistentarchitectuur: LLM, geheugen, tools, routing, observabiliteit.

Voorbeelden:

  • Controleer elke ochtend een inbox en vat belangrijke berichten samen.
  • Houd een Notion-taaklijst in de gaten en voer de volgende todo-item uit.
  • Monitor een GitHub-issue totdat de status verandert.
  • Poll een langlopende AI-job totdat het resultaat klaar is.
  • Controleer een boekingslot totdat er een beschikbaar is.
  • Houd een leveranciersportaal in de gaten totdat een document verschijnt.
  • Scan wekelijks nieuwe onderzoeksartikelen en vat de relevante samen.

Een praktische pollende agent heeft vijf verantwoordelijkheden:

  1. Op het juiste moment wakker worden.
  2. Uit de bron lezen.
  3. Onthouden wat er al is gezien.
  4. Beslissen of de nieuwe status van belang is.
  5. Eenmaal, veilig en zonder zichzelf te herhalen, handelen.

Een typische productiestroom ziet er als volgt uit:

planner
  -> pollende worker
  -> bronsysteem
  -> opslag voor status
  -> deterministische filters
  -> optionele LLM-evaluatie
  -> assistentactie

Deze structuur is op de beste mogelijke manier saai. Saai systemen zijn makkelijker te debuggen om 2 uur ’s nachts.

De status die elke pollende agent nodig heeft

Pollende agents hebben duurzame status nodig. Conversatiegeschiedenis is niet genoeg. De assistent kan het gesprek onthouden, maar het systeem heeft een betrouwbare operationele registratie nodig.

Een goede statusregistratie voor polling bevat meestal:

{
  "poll_id": "poll_123",
  "user_id": "user_456",
  "source_type": "notion",
  "source_ref": "database_tasks",
  "condition": "neem één taak in Todo-status en voer deze uit",
  "interval_seconds": 600,
  "last_run_at": "2026-06-19T01:00:00Z",
  "next_run_at": "2026-06-19T01:10:00Z",
  "last_seen_cursor": "cursor_of_tijdstip",
  "last_result_hash": "b64e8a...",
  "failure_count": 0,
  "status": "actief"
}

Het exacte schema hangt af van de bron, maar de meeste systemen hebben deze concepten nodig.

Poll-definitie

Dit beschrijft wat de agent bewaakt en waarom.

poll_id
user_id
workspace_id
source_type
source_ref
condition_text
priority
status

Bijvoorbeeld:

source_type: notion
source_ref: Taken-database
condition_text: Zoek een Todo-taak, claim deze, voer deze uit en markeer deze als Voltooid.

Planning

Dit beschrijft wanneer de agent moet draaien.

interval_seconds
cron_expression
timezone
last_run_at
next_run_at
jitter

Voor een Hermes-agent die elke 10 minuten Notion controleert:

interval_seconds: 600
timezone: Australia/Melbourne

Cursor of snapshot

Dit helpt de agent om te voorkomen dat dezelfde gegevens opnieuw worden verwerkt.

Afhankelijk van de bron kan dit zijn:

last_seen_id
last_seen_timestamp
api_cursor
etag
version
content_hash

Voor een Notion-taakwachtrij is de cursor minder belangrijk dan taakstatus en claimvelden. Voor Gmail, GitHub of een synchronisatie-API is de cursor meestal cruciaal.

Claim of lease

Dit voorkomt dat twee workers dezelfde job aanpakken.

claimed_by
claimed_at
claim_expires_at
run_id

Bijvoorbeeld, een Notion-taak kan worden gewijzigd van:

Status: Todo

naar:

Status: InProgress
ClaimedBy: hermes
ClaimedAt: 2026-06-19T01:00:00Z
ClaimExpiresAt: 2026-06-19T01:30:00Z
RunId: run_789

Dit is het verschil tussen “Ik hoop dat slechts één worker het oppakt” en “het systeem heeft een claimprotocol”.

Uitvoeringsregistratie

Dit registreert wat er tijdens een run is gebeurd.

run_id
poll_id
source_object_id
started_at
finished_at
status
items_checked
items_changed
decision_summary
error

De uitvoeringsregistratie moet in de backend van de assistent leven, niet alleen in Notion of een ander extern hulpmiddel. Notion is goed voor menselijke zichtbaarheid. Het is niet ideaal als je enige uitvoeringslogboek.

Dedupe-registratie

Dit voorkomt dubbele meldingen of herhaalde acties.

dedupe_key
poll_id
source_object_id
condition_version
action_type
delivered_at

Bijvoorbeeld:

user_456:poll_123:notion_page_999:execute:v1

Als dezelfde actie opnieuw wordt geprobeerd, kan het systeem deze onderdrukken.

Methode 1: Gepoldeerde pollende worker

Dit is het eenvoudigste betrouwbare patroon.

Een planner wordt elke vaste interval wakker en roept een worker aan. De worker leest de bron, werkt de status bij en activeert een assistentactie indien nodig.

planner
  -> worker
  -> bron-API
  -> database
  -> assistentactie

Hoe het werkt

De planner is verantwoordelijk voor de tijd. Het kan cron zijn, een cloudplanner, een Kubernetes CronJob of een kleine interne planner.

Elke interval start hij een worker-run. De worker laadt zijn configuratie, queryt de doelbron, vergelijkt het resultaat met de opgeslagen status en treedt op indien nodig.

Voor een eenvoudige assistent is dit vaak voldoende. Een enkele planner en een lichtgewicht workerproces kunnen tientallen dagelijkse controles afhandelen zonder dat wachtrijen, leases of gedistribueerde coördinatie nodig zijn.

Statusmodel

De planner slaat weinig op. Meestal weet hij alleen wanneer hij een job moet triggeren.

De applicatiedatabase bewaart de belangrijke status:

poll-definitie
planning
cursor of snapshot
laatste run-tijd
aantal fouten
status

De worker moet stateless zijn. Hij kan tijdelijke gegevens bevatten tijdens het draaien, maar de duurzame waarheid hoort in de database.

Voorbeeldstroom

Elke 10 minuten:
  trigger Hermes pollende worker

Worker:
  laadt actieve poll-configuratie
  queryt bron
  vergelijkt met vorige status
  voert deterministische controles uit
  roept LLM alleen aan indien nodig
  werkt status bij
  zendt assistentgebeurtenis uit

Beste toepassing

Gebruik gepoldeerde pollende workers voor:

  • Dagelijkse samenvattingen.
  • Uurtelijke controles.
  • Kleine interne automatiseringen.
  • Eenvoudige “houd dit in de gaten”-taken.
  • Assistentaakjes met laag tot medium volume.

Zwakke punten

Gepoldeerde polling is makkelijk te begrijpen, maar kan kwetsbaar worden bij schaal. Als veel polls tegelijk draaien, kun je je workers overbelasten of tegen rate limits van providers aanlopen. Opnieuw proberen kan ook rommelig worden als de planner het werk direct start.

Methode 2: Wachtrijgebaseerde pollende workers

Wachtrijgebaseerde polling is meestal de beste standaard voor productie-AI-assistents.

De planner voert de poll niet direct uit. Hij zet een job op een wachtrij. Workerprocessen consumeren jobs uit de wachtrij.

planner
  -> wachtrij
  -> worker-pool
  -> bron-API
  -> opslag voor status
  -> assistentactie

Hoe het werkt

Een planner scant op polls die aan de beurt zijn en voegt jobs toe aan de wachtrij. Workers halen jobs op wanneer ze capaciteit hebben.

Dit geeft je backpressure. Als het systeem druk is, wachten jobs in de wachtrij in plaats van de bron-API of de LLM-provider over te laden.

Statusmodel

De database bewaart de poll-status:

poll_id
user_id
source_ref
condition_text
next_run_at
cursor
status
failure_count

Het wachtrijbericht moet klein blijven:

{
  "poll_id": "poll_123",
  "scheduled_for": "2026-06-19T01:10:00Z",
  "attempt": 1
}

De worker laadt de volledige status uit de database wanneer hij start.

Voorbeeldstroom

Elke minuut:
  planner vindt polls waarbij next_run_at <= nu
  planner voegt jobs toe aan wachtrij

Workers:
  halen jobs uit wachtrij
  vergrendelen of leasen van de poll
  queryt de bron
  werkt status bij
  zendt assistentactie uit indien nodig
  stelt next_run_at in

Beste toepassing

Gebruik wachtrijgebaseerde polling voor:

  • AI-assistents met meerdere gebruikers.
  • Veel gelijktijdige polls.
  • Integraties met rate limits.
  • Opnieuw te proberen achtergrondwerk.
  • Jobs die verschillende hoeveelheden tijd kunnen kosten.
  • SaaS-producten waarbij betrouwbaarheid belangrijk is.

Zwakke punten

Wachtrijen voegen infrastructuur toe. Je hebt Dead Letter-handling, idempotentie, zichtbaarheidstijdsduren en retry-beleid nodig. Dit is het waard voor productsystemen, maar waarschijnlijk overkill voor een klein prototype.

Methode 3: Extern hulpmiddel als taakwachtrij

Dit is het patroon in het Notion-plus-Hermes-voorbeeld.

Het externe hulpmiddel is niet alleen een databron. Het wordt de voor mensen zichtbare taakwachtrij. De agent controleert periodiek het hulpmiddel, claimt één taak, voert deze uit en werkt de taakstatus bij.

planner
  -> Hermes worker
  -> Notion-database
  -> claim één taak
  -> voer taak uit
  -> werk Notion-status bij

Hoe het werkt

Elke 10 minuten queryt Hermes de Notion-database voor één taak in Todo-status. Hij kiest de volgende taak, meestal op basis van prioriteit en creatietijd. Vervolgens claimt hij de taak door deze op InProgress te zetten.

Daarna voert Hermes de taak uit. Als de uitvoering slaagt, markeert hij de taak als Complete. Als de uitvoering faalt, markeert hij de taak als Failed of brengt hij deze terug naar Todo met een retry-teller.

Statusmodel

Notion bewaart de voor mensen zichtbare taakstatus:

Titel
Beschrijving
Status: Todo | InProgress | Complete | Failed
Prioriteit
CreatedAt
ClaimedBy
ClaimedAt
ClaimExpiresAt
RunId
RetryCount
LastError
CompletedAt

Hermes-backend bewaart de operationele uitvoeringsstatus:

run_id
notion_page_id
started_at
finished_at
execution_status
tool_calls
LLM-trace
foutdetails
idempotency_key

Deze splitsing is belangrijk. Notion is uitstekend voor zichtbaarheid en handmatig bewerken. Hermes-backend is beter voor logs, opnieuw proberen, deduping en auditgeschiedenis.

Voorbeeldstroom

Elke 10 minuten:
  Hermes wordt wakker

Hermes:
  queryt Notion voor één taak waarbij Status = Todo
  sorteer op Prioriteit, CreatedAt
  werkt geselecteerde taak bij naar InProgress
  stelt ClaimedBy, ClaimedAt, ClaimExpiresAt, RunId in
  voert de taak uit
  schrijft uitvoeringslogboek
  stelt taak in op Complete of Failed

Beste toepassing

Gebruik dit patroon wanneer:

  • Mensen al werk beheren in Notion, Jira, Linear, Trello of een ander hulpmiddel.
  • Je wilt dat de assistent zichtbare taken verwerkt.
  • Het taskboard de gebruikersinterface is.
  • Je een eenvoudig human-in-the-loop-automatiseringsmodel nodig hebt.

Zwakke punten

Externe hulpmiddelen zijn zelden perfecte wachtrijen. Atomics claims kunnen beperkt zijn. Queryconsistentie kan achterlopen. Rate limits kunnen van toepassing zijn. Als de agent in meerdere instanties kan draaien, heb je een zorgvuldige claim- of lease-strategie nodig.

De praktische aanbeveling is om Notion te gebruiken als de voor mensen zichtbare taakinbox, terwijl alle uitvoeringslogs, retry-registraties, traces en idempotentie-sleutels in Hermes blijven. Notion geeft gebruikers zichtbaarheid; Hermes houdt het systeem betrouwbaar. Zie voor de dispatcher- en concurrentiemechanica die achter dit patroon in Hermes zitten Kanban in Hermes Agent voor zelfgehoste LLM-workflows.

Methode 4: Langlopende worker-loop

Een langlopende loop is de eenvoudigste implementatie.

while True:
    due_polls = db.find_due_polls()
    for poll in due_polls:
        run_poll(poll)
    sleep(30)

Dit patroon combineert planning en uitvoering in één service, wat het het eenvoudigste mogelijke startpunt maakt voor achtergrondagentwerk.

Hoe het werkt

Het workerproces draait continu. Elke paar seconden of minuten controleert het de database op polls die aan de beurt zijn en voert deze uit. Het is makkelijk te bouwen, makkelijk te begrijpen en snel te itereren tijdens ontwikkeling.

Statusmodel

De database bewaart nog steeds duurzame status:

poll-configuratie
next_run_at
cursor
laatste resultaat
aantal fouten
status

Het procesgeheugen moet alleen tijdelijke status bevatten:

huidige batch
kortlevende cache
in-flight run

Bewaar belangrijke voortgang nooit alleen in het geheugen. Als het proces crasht, is elke status die niet naar duurzame opslag is geschreven weg, en heeft de volgende run geen manier om te weten waar het is blijven zitten.

Beste toepassing

Gebruik langlopende loops voor:

  • Prototypes.
  • Lokale ontwikkeling.
  • Interne tools.
  • Single-tenant-systemen.
  • Agents met laag volume.

Zwakke punten

Dit patroon wordt riskant met meerdere replicaten. Zonder leases kunnen twee workers dezelfde poll uitvoeren. Het mist ook de operationele functies van een echte wachtrij of workflow-engine.

Een langlopende loop is niet verkeerd als startpunt, maar het is geen gedistribueerde planner en mag niet als zodanig worden behandeld. Zodra je meerdere replicaten of sterkere betrouwbaarheids garanties nodig hebt, zul je moeten overstappen naar een van de gestructureerdere patronen hierboven.

Methode 5: Webhook-first met polling als fallback

Als de bron webhooks ondersteunt, gebruik ze dan. Polling zou vaak de backup moeten zijn, niet het primaire mechanisme. Dezelfde splitsing verschijnt in agentprotocolontwerp: A2A-pushmeldingen wekken een client-handler wakker, die vervolgens GetTask polt voor volledige status, zoals beschreven in A2A-streaming en asynche taken voor langlopende agentworkflows.

extern systeem
  -> webhook-eindpunt
  -> gebeurtenisopslag
  -> assistentactie

herstelpoll
  -> bron-API
  -> vergelijk met gebeurtenisopslag
  -> repareer gemiste gebeurtenissen

Hoe het werkt

Het externe systeem stuurt gebeurtenissen naar je webhook-eindpunt als er iets verandert. Je systeem bewaart de gebeurtenis en verwerkt deze asynchroon.

Een langzamere herstelpoll draait elke paar uur of een keer per dag. Hij controleert of er gebeurtenissen zijn gemist.

Statusmodel

De gebeurtenisopslag registreert inkomende webhooks:

event_id
source_type
source_object_id
event_type
received_at
payload_hash
processed_at
signature_valid

De herstelpoll bewaart:

last_reconciliation_at
last_seen_cursor
last_seen_version

De bronobjecttabel bewaart de laatst bekende status:

external_id
current_status
external_updated_at
last_processed_event_id

Beste toepassing

Gebruik webhook-first-architectuur voor:

  • GitHub-gebeurtenissen.
  • Stripe-gebeurtenissen.
  • Slack-gebeurtenissen.
  • CRM-updates.
  • Deployeringsmeldingen.
  • Ticketingsystemen.

Zwakke punten

Webhooks vereisen een publiek eindpunt, signatuurvalidatie, replay-bescherming en gebeurtenisdeduping. Sommige providers sturen ook onvolledige gebeurtenissen, dus je moet mogelijk nog steeds het volledige object ophalen.

Toch is polling elke minuut meestal verspilling als goede webhooks bestaan.

Methode 6: Provider-gebaseerde achtergrondjobpolling

Soms is hetgeen dat wordt gepolld de AI-job zelf.

De applicatie start een langlopende providerjob, bewaart de job-ID en controleert later of deze is voltooid.

app
  -> start AI-achtergrondjob
  -> bewaar provider-job-ID
  -> poll status
  -> haal resultaat op
  -> meld gebruiker

Hoe het werkt

De assistent start een job bij de provider. De provider retourneert een ID. Je backend bewaart die ID en controleert de status totdat de job slaagt, faalt, verloopt of time-out geeft.

Statusmodel

Je backend bewaart:

assistant_task_id
provider_job_id
user_id
status
created_at
last_checked_at
expires_at
result_ref

De provider bewaart de tijdelijke jobstatus en -output.

Als de output belangrijk is, kopieer deze dan zo snel mogelijk naar je eigen duurzame opslag zodra de job is voltooid. Provider-gebaseerde resultaatopslag heeft korte retentievensters en is geen vervanging voor een juiste archief in je eigen systeem.

Beste toepassing

Gebruik provider-gebaseerde achtergrondjobpolling voor:

  • Lange AI-onderzoekstaken.
  • Grote documentverwerking.
  • Codebase-analyse.
  • Rapportgeneratie.
  • Data-extractiejobs.
  • Taken die normale HTTP-aanvraagtijdsduren overschrijden.

Zwakke punten

Dit patroon lost één probleem op: wachten op een lange providerjob. Het vervangt niet je workflow-engine, planner, wachtrij of business-statusopslag.

Methode 7: Duurzame workflow-engine

Een duurzame workflow-engine beheert langlopende uitvoering, timers, opnieuw proberen en herstel. Temporal is de meest voorkomende keuze voor Go- en Python-gebaseerde assistantbackends; zie voor een volledige implementatiegids Implementeren van workflow-applicaties met Temporal in Go.

In plaats van elke wachtpauze en retry handmatig te bedraden, modelleer je het proces als een workflow.

workflow-engine
  -> activiteit: controleer bron
  -> timer: wacht
  -> activiteit: evalueer resultaat
  -> activiteit: meld gebruiker

Hoe het werkt

De workflow start eenmaal en controleert vervolgens zijn eigen wachten. Hij kan minuten, dagen of weken slapen. Als het workerproces crasht, kan de workflow-engine hervatten vanuit de geregistreerde status.

Statusmodel

De workflow-engine bewaart:

workflow_id
executiegeschiedenis
timerstatus
activiteitspogingen
retry-beleid
huidige workflowstatus

Je applicatiedatabase bewaart:

voor mensen zichtbare poll-definitie
autorisatiereferenties
businessregistraties
meldingsregistraties

De workflow-engine bezit processtatus — uitvoeringsgeschiedenis, timers, opnieuw proberen en activiteitspogingen. Je database bezit businessstatus — gebruikersconfiguraties, autorisatieregistraties, meldingen en auditlogs. Het apart houden van deze lagen voorkomt dat elke laag een verwarde hybride van beide wordt.

Beste toepassing

Gebruik duurzame workflows voor:

  • Multi-step businessprocessen.
  • Langlopende automatiseringen.
  • Menselijke goedkeuringsstromen.
  • Betrouwbare retries.
  • Auditabele achtergrondwerkzaamheden.
  • Processen die na een storing moeten worden hervat.

Zwakke punten

Workflow-engines voegen concepten en infrastructuur toe. Ze zijn uitstekend wanneer het proces belangrijk is, maar zwaar voor eenvoudige uurtelijke controles.

Methode 8: Persistente agentruntime

Sommige agentframeworks kunnen agentstatus persistent maken, uitvoering checkpointen en later hervatten.

Dit is nuttig wanneer de agent zelf een multi-step redeneringsproces heeft.

planner of workflow
  -> agentruntime
  -> laad checkpoint
  -> roep tools aan
  -> sla checkpoint op
  -> hervat later

Hoe het werkt

Een externe planner of workflow start de agent. De agentruntime laadt vorige status, voert de volgende stap uit, roept tools aan indien nodig en schrijft een checkpoint.

De agentruntime mag niet je enige planner zijn. Hij is beter te behandelen als de redeneringslaag binnen een grotere backendarchitectuur.

Statusmodel

Agentcheckpointopslag bevat:

huidige node
berichten
tool-outputs
intermediare redeneringsstatus
pending actie

Langdurig geheugen bevat:

stabiele gebruikersvoorkeuren
feiten
projectcontext
bronreferenties

Operationele status hoort nog steeds elders:

poll-planning
cursor
status
retry-aantal
dedupe-registraties

Een nuttige regel: geheugen is geen cursor, en een checkpoint is geen wachtrij. Agentgeheugen bewaart wat het model weet; operationele status bijhoudt waar het proces is en wat het heeft gedaan. Het vermengen van de twee leidt tot subtiele bugs die pas bij concurrentie of na een restart verschijnen. De volledige ontwerpruimte voor werkgeheugen, duurzame status en ophaallagen is te vinden in Geheugensystemen in AI-assistents.

Beste toepassing

Gebruik persistente agentruntime voor:

  • Multi-step onderzoek.
  • Agents die pauzeren en hervatten.
  • Human-in-the-loop-werk.
  • Tool-zware redenering.
  • Taken waarbij context door de tijd heen accumuleert.

Zwakke punten

Agentpersistentie is niet hetzelfde als operationele betrouwbaarheid. Je hebt nog steeds planning, vergrendeling, opnieuw proberen, rate limits en auditlogs nodig.

Methode 9: Databasesynchronisatie plus waningevaluatie

In dit patroon wordt polling gebruikt om externe data te synchroniseren met je eigen database. De assistent reageert vervolgens op lokale databaseveranderingen in plaats van externe API’s direct te queryen tijdens elke evaluatiecyclus.

sync-poller
  -> externe API
  -> lokale database
  -> waningevaluatie
  -> assistentactie

Dit scheidt datasynchronisatie van assistentintelligentie. De sync-worker is verantwoordelijk voor het actueel houden van lokale records; de evaluator is verantwoordelijk voor het beslissen wat er met veranderingen moet gebeuren. Elke laag kan onafhankelijk worden getest, gemonitord en geschaald.

Hoe het werkt

De sync-worker haalt periodiek externe veranderingen op en schrijft genormaliseerde records in je database. Een tweede worker of changestream detecteert bijgewerkte rijen en beslist of de assistent moet optreden.

Statusmodel

De synctabel bewaart:

external_id
source_type
raw_payload
normalized_fields
external_updated_at
synced_at
version
content_hash

De syncstatus bewaart:

source_cursor
last_sync_at
rate_limit_status
failure_count

De assistentevaluatietabel bewaart:

object_id
evaluation_status
last_evaluated_hash
decision
notification_id

Beste toepassing

Gebruik dit patroon voor:

  • CRM-synchronisatie.
  • Ticketingsystemen.
  • Administratieve documenten.
  • Productinventaris.
  • Compliance-review.
  • Zoekindexering.
  • Interne dashboards.

Zwakke punten

Alles synchroniseren kan duur en onnodig zijn. Het kan ook privacy- en retentieverplichtingen creëren. Gebruik dit patroon wanneer lokale data waarde heeft buiten een enkele assistentactie.

Methode 10: Adaptieve polling

Adaptieve polling verandert frequentie op basis van status, urgentie of recente activiteit.

actief object: poll elke 1 minuut
wachtend object: poll elke 1 uur
verouderd object: poll een keer per dag
voltooid object: stop met pollen

Hoe het werkt

Na elke run beslist de worker wanneer de volgende run moet plaatsvinden.

Als het object onlangs is veranderd, poll dan sneller. Als er al lang niets is veranderd, vertraag dan. Als de taak is voltooid, stop dan.

Statusmodel

De pollstatus bevat:

current_interval
minimum_interval
maximum_interval
backoff_policy
last_activity_at
priority
stop_condition

De bronsnapshot bevat:

status
updated_at
activity_level
expected_next_change

Beste toepassing

Gebruik adaptieve polling voor:

  • Deployeringsstatus.
  • Bezorgingsvolging.
  • Beschikbaarheid van kalenderSlots.
  • Prijsmonitoring.
  • Build-jobs.
  • Langlopende providertaken.
  • Elke bron met bursty updates.

Zwakke punten

Adaptieve polling kan moeilijker te begrijpen zijn. Als een taak op een strikt moment moet draaien, houd het dan strikt. Maak compliance-taken niet slim.

Methode 11: Semantische polling met een LLM-evaluator

Semantische polling wordt gebruikt wanneer de voorwaarde vaag is.

Code kan antwoorden:

Is status gelijk aan Voltooid?
Is prijs onder 100?
Is er een nieuw bericht?

Een LLM kan helpen antwoorden:

Klinkt dit e-mail urgent?
Is deze klant waarschijnlijk ontevreden?
Is dit onderzoeksartikel relevant?
Vereist deze verandering mijn aandacht?

Hoe het werkt

De worker past eerst goedkope deterministische filters toe. Alleen kandidaat-items gaan naar de LLM.

nieuw item?
voldoet aan bronfilters?
niet al verwerkt?
niet duidelijk irrelevant?

Vervolgens evalueert de LLM de kleinere kandidaatset en retourneert gestructureerde output.

{
  "should_notify": true,
  "urgency": "high",
  "reason": "De klant meldt een productie-uitval."
}

Statusmodel

De poll-definitie bewaart:

semantic_condition
examples
negative_examples
user_preference_summary
model_config

Het evaluatielogboek bewaart:

input_reference
model
prompt_version
structured_output
confidence
cost
latency

De pollstatus bewaart:

last_seen_ids
last_evaluated_hashes
last_decision
last_decision_reason

Beste toepassing

Gebruik semantische polling voor:

  • Detectie van belangrijke e-mails.
  • Klant sentiment monitoring.
  • Onderzoeksalerts.
  • Detectie van verkoopkansen.
  • Security triage.
  • Uitvoerende samenvattingen.

Zwakke punten

LLM-oproepen kosten geld en voegen latentie toe. Ze kunnen ook inconsistent zijn als prompts en schemas losjes zijn. Gebruik eerst deterministische filters. Vraag het model alleen wanneer oordeel echt nodig is.

Beslissingstabel: Een pollende agentmethode kiezen

Methode Beste toepassing Voordelen Nadelen
Gepoldeerde pollende worker Eenvoudige terugkerende assistentaakjes Makkelijk te bouwen, makkelijk te debuggen, minimale infrastructuur Beperkte schaalbaarheid, basis retries, kan workers overbelasten als veel polls tegelijk afvuren
Wachtrijgebaseerde pollende workers Productie-SaaS-assistents met veel gebruikers Schaalbaar, veerkrachtig, ondersteunt opnieuw proberen en backpressure Vereist wachtrijinfrastructuur, idempotentie, Dead Letter-handling
Extern hulpmiddel als taakwachtrij Notion, Jira, Linear, Trello-gebaseerde taakuitvoering Mensvriendelijk, makkelijk te inspecteren, werkt met bestaande workflows Externe hulpmiddelen zijn geen perfecte wachtrijen, atomic claim kan moeilijk zijn
Langlopende worker-loop Prototypes en interne tools Zeer eenvoudig, snel te implementeren, weinig bewegende delen Zwakke betrouwbaarheid, slecht gedrag bij meerdere replicaten, beperkte operationele controle
Webhook-first met polling als fallback Gebeurtenis-gedreven integraties Snelle reactie, minder API-aanroepen, herstel vangt gemiste gebeurtenissen Vereist publiek eindpunt, gebeurtenisvalidatie, deduping, provider-webhookondersteuning
Provider-gebaseerde achtergrondjobpolling Langlopende AI-providerjobs Handelt langzame AI-taken af, eenvoudig statusmodel, goed voor asynche UX Beheert alleen provider-jobstatus, niet volledige businessworkflow
Duurzame workflow-engine Langlopende multi-step processen Sterke retries, timers, auditgeschiedenis, herstel na crashes Meer infrastructuur en concepten, zwaar voor eenvoudige polling
Persistente agentruntime Multi-step redeneringsagents Bewaart agentcontext, ondersteunt pauzeren en hervatten, goed voor tool-zware taken Geen vervanging voor planner of wachtrij, heeft nog steeds operationele backend nodig
Databasesynchronisatie plus waningevaluatie Systemen waarbij externe data lokale waarde heeft Schone scheiding, lokale rapportage, minder herhaalde externe aanroepen Meer opslag, meer sync-complexiteit, mogelijke privacy- en retentiebezorgdheden
Adaptieve polling Bursty bronnen of taken met variabele urgentie Vermindert kosten, respecteert rate limits, reageert sneller bij hoge activiteit Moeilijker te begrijpen, niet ideaal voor strikte planning
Semantische polling met LLM-evaluator Vage voorwaarden die oordeel vereisen Handelt natuurlijke taalintenties af, nuttige samenvattingen, flexibele beslissingen Kosten, latentie, risicokwaliteit van prompts, mag geen vervanging zijn voor eenvoudige codecontroles

Aanbevolen standaardarchitectuur

Voor de meeste productie-AI-assistents, begin met dit:

polls-tabel
  -> planner
  -> wachtrij
  -> stateless workers
  -> deterministische filters
  -> optionele LLM-evaluator
  -> melding of assistentactie

Een minimale 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)
);

Dit geeft je een schone scheiding:

planner bezit tijd
wachtrij bezit buffering
worker bezit uitvoering
database bezit status
LLM bezit semantisch oordeel
assistent bezit gebruikersinteractie

Die scheiding is het hart van een betrouwbare pollende agent.

Voorbeeld: Hermes-agent verwerkt Notion-taken

Laten we de architectuur nu toepassen op een concreet geval.

Stel dat een Notion-database taken bevat. Hermes moet elke 10 minuten draaien, één taak in Todo-status pakken, deze op InProgress zetten, uitvoeren en vervolgens als Complete markeren.

Dit is het beste te beschrijven als:

extern hulpmiddel als taakwachtrij
+
gepoldeerde pollende worker
+
claim- of leasegebaseerde uitvoering

Voor een productieve versie wordt het:

wachtrijgebaseerde polling met Notion als de voor mensen zichtbare taakinbox

Notion-taakeigenschappen

De Notion-database moet velden bevatten zoals:

Naam
Status: Todo | InProgress | Complete | Failed
Prioriteit
CreatedAt
ClaimedBy
ClaimedAt
ClaimExpiresAt
RunId
RetryCount
LastError
CompletedAt

De belangrijke velden zijn ClaimedAt, ClaimExpiresAt en RunId. Ze maken de taakclaim zichtbaar en te herstellen.

Hermes-uitvoeringsstatus

Hermes moet ook zijn eigen uitvoeringsregistratie bijhouden:

run_id
notion_page_id
started_at
finished_at
status
input_snapshot
tool_calls
result_summary
error
idempotency_key

Dit beschermt je als Notion handmatig wordt bewerkt, als een API-aanroep faalt, of als je moet controleren wat Hermes daadwerkelijk heeft gedaan.

Uitvoeringsstroom

Elke 10 minuten:
  Hermes-planner maakt een run

Hermes-worker:
  vindt één Notion-taak waarbij Status = Todo
  sorteer op Prioriteit en CreatedAt
  claimt de taak door Status in te stellen op InProgress
  schrijft ClaimedBy, ClaimedAt, ClaimExpiresAt en RunId
  voert de taak uit
  schrijft uitvoeringslogs naar Hermes-backend
  stelt Notion-Status in op Complete bij succes
  stelt Notion-Status in op Failed bij falen

Als Hermes crasht nadat hij een taak heeft geclaimd, kan de lease verlopen:

Status = InProgress
ClaimExpiresAt < nu

Een toekomstige run kan de taak dan herstellen of als mislukt markeren.

Foutafhandeling

Bij succes:

Status = Complete
CompletedAt = nu
LastError = leeg

Bij herstelbaar falen:

Status = Todo
RetryCount = RetryCount + 1
LastError = korte foutmelding

Bij niet-herstelbaar falen:

Status = Failed
LastError = duidelijke uitleg

Voor veiligheid moet Hermes ook een idempotentie-sleutel gebruiken:

notion_page_id + task_version + action_type

Dit voorkomt dat dezelfde taak twee keer wordt uitgevoerd als een retry op het verkeerde moment plaatsvindt.

Waarom dit niet alleen polling is

Het polling-deel is alleen het wakermakend mechanisme. De echte architectuur is taakclaiming en betrouwbare uitvoering.

Een naïeve implementatie zegt:

Elke 10 minuten, vind een Todo-taak en doe het.

Een betrouwbare implementatie zegt:

Elke 10 minuten, claim precies één geschikte taak, registreer de run, voer idempotent uit en verplaats de taak naar een eindstatus.

Dat is het verschil tussen een demo en een agent die je kunt vertrouwen.

Veelgemaakte fouten bij pollende agents

Fout 1: Geen claimprotocol

Als twee workers dezelfde taak kunnen zien, kunnen ze deze beide uitvoeren.

Gebruik:

ClaimedBy
ClaimedAt
ClaimExpiresAt
RunId

Zelfs als je momenteel één worker draait, ontwerp dan alsof er later een tweede worker kan verschijnen.

Fout 2: Geen dedupe-sleutel

Elke externe actie moet een dedupe-sleutel hebben.

user_id + poll_id + source_object_id + action_type + condition_version

Dit voorkomt herhaalde meldingen, herhaalde e-mails, herhaalde taakuitvoering en herhaalde tool-aanroepen. De bredere principes achter scoping, opslaan en testen van deze sleutels zijn hier eveneens van toepassing — zie Idempotentie in gedistribueerde systemen die daadwerkelijk werkt.

Fout 3: Te vroeg de LLM aanroepen

Vraag het model niet om databasefiltering te doen.

Slecht:

Stuur alle taken naar de LLM en vraag welke Todo is.

Beter:

Gebruik de Notion-API-filter om Todo-taken op te halen.
Gebruik de LLM alleen als taakinterpretatie nodig is.

Fout 4: Notion behandelen als de enige backend

Notion is een goede menselijke interface. Het is geen complete uitvoeringsbackend.

Bewaar uitvoeringslogs, retries, traces en idempotentieregistraties in Hermes.

Fout 5: Oneindige polling

Elke poll moet een stopconditie hebben.

Voorbeelden:

stop na succes
stop na datum
stop na max retries
stop wanneer gebruiker het uitschakelt
stop na herhaalde autorisatiefouten

Een pollende agent zonder stopconditie is een stille kostenlek.

Fout 6: Geen observabiliteit

Je moet in staat zijn om te beantwoorden:

Wat heeft de agent uitgevoerd?
Waarom heeft het uitgevoerd?
Wat heeft het gelezen?
Wat heeft het veranderd?
Waarom is het mislukt?
Heeft het de gebruiker gemeld?
Heeft het twee keer uitgevoerd?

Als je die vragen niet kunt beantwoorden, is het systeem niet klaar voor belangrijk werk.

Observabiliteitscontrolelijst

Houd metingen bij zoals:

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

Log velden zoals:

poll_id
run_id
source_type
source_object_id
claim_id
cursor_before
cursor_after
decision
dedupe_key
error

Bouw een admin-view voor:

actieve polls
vastgelopen InProgress-taken
recente fouten
taken met hoge retry
Dead Letter-jobs
duurzame LLM-evaluaties
uitgeschakelde integraties

Pollende agents draaien op de achtergrond, waar fouten stil zijn en problemen kunnen opstapelen voordat iemand het merkt. Achtergrondsysteem hebben zichtbaarheid nodig die vanaf het begin is ingebouwd, niet als een nagedachte toevoeging wanneer er iets misgaat. Zie voor de volledige observabiliteitsstack voor AI- en LLM-gesponsorde systemen — metingen, traces, gestructureerde logs en SLO’s — Observabiliteit voor LLM-systemen: metingen, traces, logs en testen in productie.

Eindaanbeveling

Pollingpatronen behandelen de proactieve planningslaag onder een multi-agentsysteem. Zodra je meerdere agents hebt die met elkaar moeten coördineren — niet alleen onafhankelijk pollen — is het volgende ontwerpbepalende besluit hoe ze coördineren: hub-and-spoke, pipeline, fan-out of zwerm. Multi-Agent Orkestratiepatronen behandelt die coördinatielogeometrieën met faalmodi en een beslissingsframework.

Voor een serieuze AI-assistent, begin met wachtrijgebaseerde pollende workers en een duurzame statusopslag. Voeg webhooks toe waar providers ze ondersteunen. Gebruik adaptieve polling wanneer rate limits belangrijk zijn. Gebruik een duurzame workflow-engine wanneer het proces langlopend en multi-step is. Gebruik persistente agentruntime wanneer de agent door de tijd heen moet redeneren.

Voor het Hermes- en Notion-voorbeeld is de juiste architectuur:

Notion als de voor mensen zichtbare taakinbox
Hermes-planner elke 10 minuten
Hermes-worker met claim- of lease-logica
Hermes-backend voor uitvoeringslogs en idempotentie
Notion-statusupdates voor zichtbaarheid

Het polling-interval is niet het moeilijke deel. Het moeilijke deel is ervoor zorgen dat de agent één taak claimt, deze één keer uitvoert, registreert wat er is gebeurd en het systeem in een staat laat die mensen kunnen begrijpen.

Dat is wat een polling-script omzet in een betrouwbare AI-assistent — niet het interval, niet het model, maar de discipline rondom het claimen van werk, het registreren ervan en het achterlaten van het systeem in een staat die zowel mensen als toekomstige runs kunnen begrijpen.

Abonneren

Ontvang nieuwe berichten over systemen, infrastructuur en AI-engineering.