We serialiseren inkomende runs voor automatisch antwoorden (alle kanalen) via een kleine wachtrij binnen het proces om te voorkomen dat meerdere agent-runs botsen, terwijl veilige paralleliteit tussen sessies mogelijk blijft.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Waarom
- Runs voor automatisch antwoorden kunnen kostbaar zijn (LLM-aanroepen) en kunnen botsen wanneer meerdere inkomende berichten kort na elkaar aankomen.
- Serialiseren voorkomt concurrentie om gedeelde resources (sessiebestanden, logs, CLI-stdin) en verkleint de kans op upstream-snelheidslimieten.
Hoe het werkt
- Een lane-bewuste FIFO-wachtrij verwerkt elke lane met een configureerbare concurrency-limiet (standaard 1 voor niet-geconfigureerde lanes; main standaard 4, subagent 8).
runEmbeddedPiAgentzet taken in de wachtrij op basis van sessiesleutel (lanesession:<key>) om te garanderen dat er slechts één actieve run per sessie is.- Elke sessierun wordt daarna in een globale lane (
mainstandaard) gezet, zodat de totale paralleliteit wordt begrensd dooragents.defaults.maxConcurrent. - Wanneer uitgebreide logging is ingeschakeld, geven runs in de wachtrij een korte melding als ze meer dan ~2s hebben gewacht voordat ze starten.
- Typindicatoren worden nog steeds direct bij het in de wachtrij plaatsen geactiveerd (wanneer het kanaal dit ondersteunt), zodat de gebruikerservaring ongewijzigd blijft terwijl we op onze beurt wachten.
Standaarden
Wanneer niet ingesteld, gebruiken alle inkomende kanaaloppervlakken:mode: "steer"debounceMs: 500cap: 20drop: "summarize"
steer is de standaard omdat dit de actieve modelbeurt responsief houdt zonder
een tweede sessierun te starten. Als de huidige run geen sturing kan accepteren,
valt OpenClaw terug op een follow-up-item in de wachtrij.
Wachtrijmodi
Inkomende berichten kunnen de huidige run sturen, wachten op een follow-upbeurt, of beide doen:steer: zet een sturingsbericht in de wachtrij voor de actieve Pi-run. Pi levert dit nadat de huidige assistentbeurt klaar is met het uitvoeren van zijn toolaanroepen, vóór de volgende LLM-aanroep. Als de run niet actief streamt of sturing niet beschikbaar is, valt OpenClaw terug op een follow-up-item in de wachtrij.followup: zet elk bericht in de wachtrij voor een latere agentbeurt nadat de huidige run eindigt.collect: voeg berichten in de wachtrij samen tot een enkele follow-upbeurt na het stiltevenster. Als berichten verschillende kanalen/threads targeten, worden ze afzonderlijk verwerkt om routering te behouden.steer-backlog(ooksteer+backlog): stuur nu en bewaar hetzelfde bericht voor een follow-upbeurt.interrupt(legacy): breek de actieve run voor die sessie af en voer daarna het nieuwste bericht uit.queue(legacy-alias): hetzelfde alssteer.
collect/steer als je
één antwoord per inkomend bericht wilt.
Configureer globaal of per kanaal via messages.queue:
Wachtrijopties
Opties zijn van toepassing opfollowup, collect en steer-backlog (en op steer wanneer dit terugvalt op follow-up):
debounceMs: stiltevenster voordat follow-ups in de wachtrij worden verwerkt. Kale getallen zijn milliseconden; de eenhedenms,s,m,hendworden geaccepteerd door/queue-opties.cap: maximaal aantal berichten in de wachtrij per sessie. Waarden onder1worden genegeerd.drop: "summarize": standaard. Verwijder de oudste items in de wachtrij waar nodig, bewaar compacte samenvattingen en injecteer ze als een synthetische follow-upprompt.drop: "old": verwijder de oudste items in de wachtrij waar nodig, zonder samenvattingen te bewaren.drop: "new": wijs het nieuwste bericht af wanneer de wachtrij al vol is.
debounceMs: 500, cap: 20, drop: summarize.
Voorrang
Voor modeselectie lost OpenClaw dit op:- Inline of opgeslagen
/queue-override per sessie. messages.queue.byChannel.<channel>.messages.queue.mode.- Standaard
steer.
/queue-opties van configuratie. Daarna worden
kanaalspecifieke debounce (messages.queue.debounceMsByChannel), Plugin-
debounce-standaarden, globale messages.queue-opties en ingebouwde standaarden
toegepast. cap en drop zijn globale/sessieopties, geen configuratiesleutels
per kanaal.
Overrides per sessie
- Verstuur
/queue <mode>als zelfstandige opdracht om de modus voor de huidige sessie op te slaan. - Opties kunnen worden gecombineerd:
/queue collect debounce:0.5s cap:25 drop:summarize /queue defaultof/queue resetwist de sessie-override.
Scope en garanties
- Is van toepassing op auto-reply-agent-runs over alle inkomende kanalen die de Gateway-antwoordpipeline gebruiken (WhatsApp web, Telegram, Slack, Discord, Signal, iMessage, webchat, enz.).
- Standaardlane (
main) is procesbreed voor inkomend verkeer + main-Heartbeats; stelagents.defaults.maxConcurrentin om meerdere sessies parallel toe te staan. - Er kunnen extra lanes bestaan (bijv.
cron,cron-nested,nested,subagent) zodat achtergrondtaken parallel kunnen draaien zonder inkomende antwoorden te blokkeren. Geïsoleerde Cron-agentbeurten houden eencron-slot vast terwijl hun innerlijke agentuitvoeringcron-nestedgebruikt; beide gebruikencron.maxConcurrentRuns. Gedeelde niet-Cron-nested-flows behouden hun eigen lane-gedrag. Deze losgekoppelde runs worden bijgehouden als achtergrondtaken. - Lanes per sessie garanderen dat slechts één agent-run tegelijk een bepaalde sessie aanraakt.
- Geen externe afhankelijkheden of achtergrondworkerthreads; pure TypeScript + promises.
Probleemoplossing
- Als opdrachten vast lijken te zitten, schakel uitgebreide logs in en zoek naar regels met “queued for …ms” om te bevestigen dat de wachtrij wordt verwerkt.
- Als je wachtrijdiepte nodig hebt, schakel uitgebreide logs in en let op timingregels voor de wachtrij.
- Wanneer diagnostiek is ingeschakeld, loggen sessies die langer dan
diagnostics.stuckSessionWarnMsinprocessingblijven een waarschuwing voor een vastgelopen sessie. Actieve ingebedde runs, actieve antwoordoperaties en actieve lanetaken blijven standaard alleen waarschuwingen; verouderde startup-boekhouding zonder actief sessiewerk kan de getroffen sessielane vrijgeven zodat werk in de wachtrij wordt verwerkt.