Messages and delivery
Opdrachtwachtrij
We serialiseren inkomende automatische antwoordruns (alle kanalen) via een kleine wachtrij binnen het proces om te voorkomen dat meerdere agentruns met elkaar botsen, terwijl veilige parallelle uitvoering over sessies heen mogelijk blijft.
Waarom
- Automatische antwoordruns kunnen duur zijn (LLM-aanroepen) en kunnen botsen wanneer meerdere inkomende berichten kort na elkaar binnenkomen.
- 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).
runEmbeddedAgentplaatst in de wachtrij op sessiesleutel (lanesession:<key>) om te garanderen dat er maar één actieve run per sessie is.- Elke sessierun wordt daarna in een globale lane geplaatst (
mainstandaard), zodat de totale parallelle uitvoering 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 enqueue geactiveerd (wanneer ondersteund door het kanaal), 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"
Sturen binnen dezelfde beurt is de standaard. Een prompt die midden in een run binnenkomt, wordt geïnjecteerd in de actieve runtime wanneer de run sturing kan accepteren, zodat er geen tweede sessie- run wordt gestart. Als de actieve run geen sturing kan accepteren, wacht OpenClaw tot de actieve run is voltooid voordat de prompt wordt gestart.
Wachtrijmodi
/queue bepaalt wat normale inkomende berichten doen terwijl een sessie al
een actieve run heeft:
steer: injecteer berichten in de actieve runtime. OpenClaw levert alle wachtende stuurberichten nadat de huidige assistentbeurt klaar is met het uitvoeren van zijn toolaanroepen, vóór de volgende LLM-aanroep; Codex app-server ontvangt één gebatchteturn/steer. Als de run niet actief streamt of sturing niet beschikbaar is, wacht OpenClaw totdat de actieve run eindigt voordat de prompt wordt gestart.followup: stuur niet. Plaats elk bericht in de wachtrij voor een latere agentbeurt nadat de huidige run is geëindigd.collect: stuur niet. Voeg berichten in de wachtrij samen tot één enkele opvolgbeurt na het stille venster. Als berichten verschillende kanalen/threads targeten, worden ze afzonderlijk verwerkt om routering te behouden.interrupt: breek de actieve run voor die sessie af en voer daarna het nieuwste bericht uit.
Zie voor runtime-specifieke timing en afhankelijkheidsgedrag
Sturingswachtrij. Zie voor de expliciete opdracht /steer <message>
Sturen.
Configureer globaal of per kanaal via messages.queue:
{ messages: { queue: { mode: "steer", debounceMs: 500, cap: 20, drop: "summarize", byChannel: { discord: "collect" }, }, },}Wachtrijopties
Opties zijn van toepassing op levering vanuit de wachtrij. debounceMs stelt ook het stille venster
voor Codex-sturing in de modus steer in:
debounceMs: stil venster voordat opvolgberichten of verzamelbatches uit de wachtrij worden verwerkt; in Codexsteer-modus, stil venster voordat gebatchteturn/steerwordt verzonden. Kale getallen zijn milliseconden; eenhedenms,s,m,hendworden geaccepteerd door/queue-opties.cap: maximaal aantal berichten in de wachtrij per sessie. Waarden lager dan1worden genegeerd.drop: "summarize": standaard. Verwijder zo nodig de oudste items uit de wachtrij, bewaar compacte samenvattingen en injecteer die als een synthetische opvolgprompt.drop: "old": verwijder zo nodig de oudste items uit de wachtrij, zonder samenvattingen te bewaren.drop: "new": weiger het nieuwste bericht wanneer de wachtrij al vol is.
Standaarden: debounceMs: 500, cap: 20, drop: summarize.
Sturen en streaming
Wanneer kanaalstreaming partial of block is, kan sturing eruitzien als meerdere
korte zichtbare antwoorden terwijl de actieve run runtimegrenzen bereikt:
partial: de preview kan vroeg worden afgerond, waarna een nieuwe preview start nadat sturing is geaccepteerd.block: blokken van conceptgrootte kunnen hetzelfde opeenvolgende uiterlijk geven.- Zonder streaming valt sturing terug op een opvolgbericht na de actieve run wanneer de runtime geen sturing binnen dezelfde beurt kan accepteren.
steer breekt tools die al worden uitgevoerd niet af. Gebruik /queue interrupt wanneer het nieuwste
bericht de huidige run moet afbreken.
Voorrang
Voor modusselectie lost OpenClaw het volgende op:
- Inline of opgeslagen
/queue-override per sessie. messages.queue.byChannel.<channel>.messages.queue.mode.- Standaard
steer.
Voor opties winnen inline of opgeslagen /queue-opties van configuratie. Daarna worden
kanaalspecifieke debounce (messages.queue.debounceMsByChannel), Plugin-
debouncestandaarden, globale messages.queue-opties en ingebouwde standaarden
toegepast. cap en drop zijn globale/sessieopties, geen configuratiesleutels
per kanaal.
Overrides per sessie
- Verstuur
/queue <steer|followup|collect|interrupt>als zelfstandige opdracht om de wachtrijmodus 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.
Bereik en garanties
- Van toepassing op automatische agentruns voor antwoorden over alle inkomende kanalen die de Gateway-antwoordpipeline gebruiken (WhatsApp web, Telegram, Slack, Discord, Signal, iMessage, webchat, enz.).
- Standaardlane (
main) is procesbreed voor inkomende berichten + main-heartbeats; stelagents.defaults.maxConcurrentin om meerdere sessies parallel toe te staan. - Er kunnen aanvullende 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 interne agentuitvoeringcron-nestedgebruikt; beide gebruikencron.maxConcurrentRuns. Gedeelde niet-cronnested-flows behouden hun eigen lanegedrag. Deze losgekoppelde runs worden gevolgd als achtergrondtaken. - Lanes per sessie garanderen dat slechts één agentrun tegelijk een bepaalde sessie aanraakt.
- Geen externe afhankelijkheden of achtergrondworkerthreads; pure TypeScript + promises.
Probleemoplossing
- Als opdrachten lijken vast 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.
- Codex app-server-runs die een beurt accepteren en daarna stoppen met voortgang uitsturen, worden onderbroken door de Codex-adapter zodat de actieve sessielane kan vrijkomen in plaats van te wachten op de timeout van de buitenste run.
- Wanneer diagnostiek is ingeschakeld, worden sessies die langer dan
diagnostics.stuckSessionWarnMsinprocessingblijven zonder waargenomen antwoord, tool, status, blok of ACP-voortgang geclassificeerd op basis van huidige activiteit. Actief werk wordt gelogd alssession.long_running; beheerde stille modelaanroepen blijven ooksession.long_runningtotdiagnostics.stuckSessionAbortMs, zodat trage of niet-streamende providers niet te vroeg als vastgelopen worden gerapporteerd. Actief werk zonder recente voortgang wordt gelogd alssession.stalled; beheerde modelaanroepen schakelen over naarsession.stalledop of na de afbreekdrempel, en eigenaarloze verouderde model-/toolactiviteit wordt niet verborgen als langlopend.session.stuckis gereserveerd voor herstelbare verouderde sessieboekhouding, inclusief inactieve sessies in de wachtrij met verouderde eigenaarloze model-/toolactiviteit, en alleen dat pad kan de getroffen sessielane vrijgeven zodat werk in de wachtrij wordt verwerkt. Herhaaldesession.stuck-diagnostiek valt terug zolang de sessie ongewijzigd blijft.