Flusso dei messaggi (alto livello)
messages.*per prefissi, accodamento e comportamento dei gruppi.agents.defaults.*per le impostazioni predefinite di streaming a blocchi e suddivisione in chunk.- Override dei canali (
channels.whatsapp.*,channels.telegram.*, ecc.) per limiti e toggle di streaming.
Deduplicazione in ingresso
I canali possono riconsegnare lo stesso messaggio dopo le riconnessioni. OpenClaw mantiene una cache di breve durata con chiave per canale/account/peer/sessione/id messaggio, così le consegne duplicate non avviano un’altra esecuzione dell’agente.Debouncing in ingresso
Messaggi consecutivi rapidi dallo stesso mittente possono essere raggruppati in un singolo turno dell’agente tramitemessages.inbound. Il debouncing ha ambito per canale + conversazione
e usa il messaggio più recente per threading/ID della risposta.
Configurazione (predefinito globale + override per canale):
- Il debounce si applica ai messaggi solo testo; media/allegati svuotano subito il buffer.
- I comandi di controllo aggirano il debouncing, così restano autonomi. I canali che aderiscono esplicitamente alla coalescenza DM dello stesso mittente possono mantenere i comandi DM dentro la finestra di debounce, così un payload inviato a pezzi può unirsi allo stesso turno dell’agente.
Sessioni e dispositivi
Le sessioni sono di proprietà del Gateway, non dei client.- Le chat dirette confluiscono nella chiave di sessione principale dell’agente.
- Gruppi/canali ottengono chiavi di sessione proprie.
- Lo store delle sessioni e le trascrizioni vivono sull’host del Gateway.
Metadati dei risultati degli strumenti
Ilcontent del risultato di uno strumento è il risultato visibile al modello. I details del risultato di uno strumento sono
metadati runtime per rendering UI, diagnostica, consegna di media e Plugin.
OpenClaw mantiene esplicito questo confine:
toolResult.detailsviene rimosso prima del replay del provider e dell’input di Compaction.- Le trascrizioni di sessione persistite mantengono solo
detailslimitati; i metadati sovradimensionati vengono sostituiti con un riepilogo compatto marcatopersistedDetailsTruncated: true. - Plugin e strumenti devono mettere il testo che il modello deve leggere in
content, non solo indetails.
Corpi in ingresso e contesto della cronologia
OpenClaw separa il corpo del prompt dal corpo del comando:BodyForAgent: testo primario rivolto al modello per il messaggio corrente. I Plugin di canale devono mantenerlo focalizzato sul testo corrente del mittente che contiene il prompt.Body: fallback legacy del prompt. Può includere envelope del canale e wrapper opzionali della cronologia, ma i canali correnti non devono affidarsi a questo come input primario del modello quandoBodyForAgentè disponibile.CommandBody: testo utente grezzo per il parsing di direttive/comandi.RawBody: alias legacy perCommandBody(mantenuto per compatibilità).
[Chat messages since your last reply - for context][Current message - respond to this]
CommandBody (o
RawBody) sul testo originale del messaggio e mantenere Body come prompt combinato.
Cronologia strutturata, risposte, messaggi inoltrati e metadati di canale vengono renderizzati come
blocchi di contesto non attendibili con ruolo utente durante l’assemblaggio del prompt.
I buffer della cronologia sono configurabili tramite messages.groupChat.historyLimit (predefinito
globale) e override per canale come channels.slack.historyLimit o
channels.telegram.accounts.<id>.historyLimit (imposta 0 per disabilitare).
Accodamento e follow-up
Se un’esecuzione è già attiva, i messaggi in ingresso vengono indirizzati nell’esecuzione corrente per impostazione predefinita.messages.queue seleziona se i messaggi durante un’esecuzione attiva devono indirizzare, accodarsi per
dopo, raccogliersi in un turno successivo unico oppure interrompere l’esecuzione attiva.
- Configura tramite
messages.queue(emessages.queue.byChannel). - La modalità predefinita è
steer, con un debounce di 500 ms per batch di indirizzamento Codex e code follow-up/collect. - Modalità:
steer,followup,collecteinterrupt.
Proprietà dell’esecuzione del canale
I Plugin di canale possono preservare l’ordinamento, applicare debounce all’input e applicare backpressure del trasporto prima che un messaggio entri nella coda della sessione. Non devono imporre un timeout separato intorno al turno dell’agente stesso. Una volta instradato un messaggio a una sessione, il lavoro a lunga esecuzione è governato dal ciclo di vita della sessione, dello strumento e del runtime, così tutti i canali segnalano e recuperano dai turni lenti in modo coerente.Streaming, suddivisione in chunk e batching
Lo streaming a blocchi invia risposte parziali mentre il modello produce blocchi di testo. La suddivisione in chunk rispetta i limiti di testo del canale ed evita di spezzare codice fenced. Impostazioni principali:agents.defaults.blockStreamingDefault(on|off, predefinito off)agents.defaults.blockStreamingBreak(text_end|message_end)agents.defaults.blockStreamingChunk(minChars|maxChars|breakPreference)agents.defaults.blockStreamingCoalesce(batching basato su inattività)agents.defaults.humanDelay(pausa simile a quella umana tra risposte a blocchi)- Override dei canali:
*.blockStreaminge*.blockStreamingCoalesce(i canali non Telegram richiedono*.blockStreaming: trueesplicito)
Visibilità del ragionamento e token
OpenClaw può esporre o nascondere il ragionamento del modello:/reasoning on|off|streamcontrolla la visibilità.- Il contenuto di ragionamento conta comunque nell’uso dei token quando viene prodotto dal modello.
- Telegram supporta lo streaming del ragionamento in una bolla di bozza transitoria che viene eliminata dopo la consegna finale; usa
/reasoning onper output di ragionamento persistente.
Prefissi, threading e risposte
La formattazione dei messaggi in uscita è centralizzata inmessages:
messages.responsePrefix,channels.<channel>.responsePrefixechannels.<channel>.accounts.<id>.responsePrefix(cascata dei prefissi in uscita), piùchannels.whatsapp.messagePrefix(prefisso in ingresso WhatsApp)- Threading delle risposte tramite
replyToModee predefiniti per canale
Risposte silenziose
Il token silenzioso esattoNO_REPLY / no_reply significa “non consegnare una risposta visibile all’utente”.
Quando un turno ha anche media di strumenti in sospeso, come audio TTS generato, OpenClaw
rimuove il testo silenzioso ma consegna comunque l’allegato media.
OpenClaw risolve quel comportamento in base al tipo di conversazione:
- Le conversazioni dirette non ricevono mai istruzioni di prompt
NO_REPLY. Se un’esecuzione diretta restituisce accidentalmente un token silenzioso nudo, OpenClaw lo sopprime invece di riscriverlo o consegnarlo. - Gruppi/canali consentono il silenzio per impostazione predefinita solo per risposte automatiche di gruppo.
In modalità di risposta visibile
message_tool, silenzio significa che il modello non chiamamessage(action=send). - L’orchestrazione interna consente il silenzio per impostazione predefinita.
/verbose full è abilitato.
I predefiniti vivono sotto agents.defaults.silentReply; surfaces.<id>.silentReply
può sovrascrivere la policy di gruppo/interna per superficie.
Le risposte silenziose nude vengono scartate su tutte le superfici, così le sessioni padre restano silenziose
invece di riscrivere testo sentinella in chiacchiericcio di fallback.
Correlati
- Refactor del ciclo di vita dei messaggi - design target durevole per invio e ricezione
- Streaming — consegna dei messaggi in tempo reale
- Retry — comportamento di nuovo tentativo della consegna dei messaggi
- Coda — coda di elaborazione dei messaggi
- Canali — integrazioni con piattaforme di messaggistica