Associazione
Comandi slash
Risoluzione dei problemi dei canali
Configurazione rapida
Crea un’applicazione Discord con un bot, aggiungi il bot al tuo server e associalo a OpenClaw. Se possibile, usa un server privato; se necessario, creane prima uno (Create My Own > For me and my friends).Crea un'applicazione Discord e un bot
Abilita gli intenti privilegiati
- Message Content Intent (obbligatorio)
- Server Members Intent (consigliato; obbligatorio per gli elenchi di ruoli consentiti, la corrispondenza tra nomi e ID e i gruppi di accesso al pubblico dei canali)
- Presence Intent (facoltativo; solo per gli aggiornamenti di presenza)
Copia il token del bot
Genera un URL di invito e aggiungi il bot al server
botapplications.commands
- View Channels
- Send Messages
- Read Message History
- Embed Links
- Attach Files
- Add Reactions (facoltativo)
Abilita la modalità sviluppatore e raccogli gli ID
- User Settings (icona a forma di ingranaggio) → Developer → attiva Developer Mode (su dispositivo mobile: App Settings → Advanced)
- Fai clic con il pulsante destro sull’icona del server → Copy Server ID
- Fai clic con il pulsante destro sul tuo avatar → Copy User ID
Consenti i messaggi diretti dai membri del server
Imposta il token del bot in modo sicuro (non inviarlo in chat)
openclaw gateway run.
Per le installazioni come servizio gestito, esegui openclaw gateway install da una shell in cui è impostata DISCORD_BOT_TOKEN, oppure archivia la variabile in ~/.openclaw/.env affinché il servizio possa risolvere il SecretRef dell’ambiente dopo il riavvio.
Se il tuo host è bloccato o soggetto a limitazione della frequenza dalla ricerca dell’applicazione eseguita da Discord all’avvio, imposta l’ID applicazione/client dal Developer Portal in modo che l’avvio possa ignorare tale chiamata REST: channels.discord.applicationId per l’account predefinito oppure channels.discord.accounts.<accountId>.applicationId per ciascun bot.Configura OpenClaw ed esegui l'associazione
- Chiedi al tuo agente
- CLI / configurazione
“Ho già impostato il token del mio bot Discord nella configurazione. Completa la configurazione di Discord con l’ID utente<user_id>e l’ID server<server_id>.”
Approva la prima associazione tramite messaggio diretto
- Chiedi al tuo agente
- CLI
“Approva questo codice di associazione Discord: <CODE>”
DISCORD_BOT_TOKEN viene usata solo per l’account predefinito.
Se due account Discord abilitati vengono risolti nello stesso token del bot, OpenClaw avvia un solo monitor del Gateway per tale token: un token proveniente dalla configurazione ha la precedenza sulla variabile di ambiente di riserva; in caso contrario, ha la precedenza il primo account abilitato e l’account duplicato viene segnalato come disabilitato con il motivo duplicate bot token.
Per le chiamate in uscita avanzate (strumento per i messaggi/azioni dei canali), viene usato un token esplicito specifico per la chiamata. Questo vale per le azioni di invio e per quelle di lettura/verifica (lettura/ricerca/recupero/discussione/messaggi fissati/autorizzazioni). Le impostazioni dei criteri e dei nuovi tentativi dell’account provengono comunque dall’account selezionato nell’istantanea di runtime attiva.Consigliato: configura uno spazio di lavoro nel server
Quando i messaggi diretti funzionano, puoi trasformare il server in uno spazio di lavoro completo in cui ogni canale dispone di una propria sessione dell’agente con un contesto dedicato. Questa soluzione è consigliata per i server privati in cui sono presenti solo tu e il tuo bot.Aggiungi il server all'elenco dei server consentiti
- Chiedi al tuo agente
- Configurazione
“Aggiungi il mio ID server Discord <server_id> all’elenco dei server consentiti”
Consenti le risposte senza @menzione
messages.groupChat.visibleReplies: "message_tool" affinché l’agente possa rimanere in ascolto e pubblicare solo quando ritiene utile una risposta nel canale. Questa modalità funziona meglio con modelli di ultima generazione affidabili nell’uso degli strumenti, come GPT-5.6 Sol. Gli eventi ambientali della stanza rimangono silenziosi, a meno che lo strumento non invii un messaggio. Consulta Eventi ambientali delle stanze per la configurazione completa della modalità di ascolto.Se Discord mostra l’indicatore di digitazione e i registri indicano l’utilizzo di token, ma non viene pubblicato alcun messaggio, verifica se il turno è stato configurato come evento ambientale della stanza o se sono state abilitate le risposte visibili tramite lo strumento per i messaggi.- Chiedi al tuo agente
- Configurazione
“Consenti al mio agente di rispondere in questo server senza dover essere @menzionato”
Pianifica l'uso della memoria nei canali del server
- Chiedi al tuo agente
- Manuale
“Quando pongo domande nei canali Discord, usa memory_search o memory_get se ti serve il contesto a lungo termine di MEMORY.md.”
#coding, #home, #research o qualsiasi altra suddivisione adatta al tuo flusso di lavoro.
Modello di runtime
- Il Gateway gestisce la connessione a Discord.
- L’instradamento delle risposte è deterministico: le risposte ai messaggi in ingresso da Discord vengono inviate nuovamente a Discord.
- I metadati del server/canale Discord vengono aggiunti al prompt del modello come contesto non attendibile, non come prefisso visibile all’utente nella risposta. Se un modello ricopia tale involucro, OpenClaw rimuove i metadati copiati dalle risposte in uscita e dal contesto delle riproduzioni future.
- Per impostazione predefinita (
session.dmScope=main), le chat dirette condividono la sessione principale dell’agente (agent:main:main). - I canali del server usano chiavi di sessione isolate (
agent:<agentId>:discord:channel:<channelId>). - I messaggi diretti di gruppo vengono ignorati per impostazione predefinita (
channels.discord.dm.groupEnabled=false). - I comandi slash nativi vengono eseguiti in sessioni di comando isolate (
agent:<agentId>:discord:slash:<userId>), pur continuando a trasmettereCommandTargetSessionKeyalla sessione di conversazione instradata. - La consegna su Discord degli annunci Cron/Heartbeat di solo testo viene ridotta alla risposta finale visibile dell’assistente, inviata una sola volta. I contenuti multimediali e i payload dei componenti strutturati rimangono composti da più messaggi quando l’agente produce più payload consegnabili.
Canali forum
I canali forum e multimediali di Discord accettano solo post nelle discussioni. OpenClaw supporta due modalità per crearli:- Invia un messaggio al canale principale del forum (
channel:<forumId>) per creare automaticamente una discussione. Il titolo della discussione è la prima riga non vuota del messaggio (troncata al limite di 100 caratteri imposto da Discord per il nome della discussione). - Usa
openclaw message thread createper creare direttamente una discussione. Non passare--message-idper i canali forum.
channel:<threadId>).
Componenti interattivi
OpenClaw supporta i contenitori dei componenti Discord v2 per i messaggi dell’agente. Usa lo strumento per i messaggi con un payloadcomponents. I risultati delle interazioni vengono reindirizzati all’agente come normali messaggi in entrata e rispettano le impostazioni Discord replyToMode esistenti.
Blocchi supportati:
text,section,separator,actions,media-gallery,file- Le righe di azioni consentono fino a 5 pulsanti oppure un singolo menu di selezione
- Tipi di selezione:
string,user,role,mentionable,channel
components.reusable=true per consentire l’uso ripetuto di pulsanti, selezioni e moduli fino alla scadenza.
Per limitare chi può fare clic su un pulsante, imposta allowedUsers su quel pulsante (ID utente Discord, tag oppure *). Gli utenti non corrispondenti ricevono un rifiuto effimero.
Per impostazione predefinita, le callback dei componenti scadono dopo 30 minuti. Imposta channels.discord.agentComponents.ttlMs per modificare la durata del registro delle callback per l’account predefinito oppure channels.discord.accounts.<accountId>.agentComponents.ttlMs per ciascun account. Il valore è espresso in millisecondi, deve essere un numero intero positivo ed è limitato a 86400000 (24 ore). Durate più lunghe sono adatte ai flussi di revisione e approvazione che richiedono pulsanti utilizzabili più a lungo, ma estendono il periodo durante il quale un vecchio messaggio Discord può ancora attivare un’azione. Preferisci la durata più breve adatta allo scopo e mantieni quella predefinita quando callback obsolete potrebbero risultare inattese.
I comandi slash /model e /models aprono un selettore interattivo del modello con menu a discesa per provider, modello e runtime compatibili, seguito da un passaggio Submit. /models add è deprecato e restituisce un messaggio di deprecazione invece di registrare modelli dalla chat. La risposta del selettore è effimera e può essere usata solo dall’utente che l’ha richiamato. I menu di selezione Discord sono limitati a 25 opzioni, quindi aggiungi voci provider/* a agents.defaults.models quando vuoi che il selettore mostri i modelli rilevati dinamicamente solo per provider selezionati, come openai o vllm.
Allegati:
- I blocchi
filedevono fare riferimento a un allegato (attachment://<filename>) - Fornisci l’allegato tramite
media/path/filePath(file singolo); usamedia-galleryper più file - Usa
filenameper sovrascrivere il nome del caricamento quando deve corrispondere al riferimento dell’allegato
- Aggiungi
components.modalcon un massimo di 5 campi - Tipi di campo:
text,checkbox,radio,select,role-select,user-select - OpenClaw aggiunge automaticamente un pulsante di attivazione
Controllo degli accessi e instradamento
- DM policy
- Access groups
- Guild policy
- Mentions and group DMs
channels.discord.dmPolicy controlla l’accesso ai messaggi diretti. channels.discord.allowFrom è l’elenco consentiti canonico per i messaggi diretti.pairing(predefinito)allowlist(richiede almeno un mittente inallowFrom)open(richiede chechannels.discord.allowFromincluda"*")disabled
pairing).Precedenza con più account:channels.discord.accounts.default.allowFromsi applica solo all’accountdefault.- Per un account,
allowFromha la precedenza sul precedentedm.allowFrom. - Gli account denominati ereditano
channels.discord.allowFromquando i rispettiviallowFrome il precedentedm.allowFromnon sono impostati. - Gli account denominati non ereditano
channels.discord.accounts.default.allowFrom.
channels.discord.dm.policy e channels.discord.dm.allowFrom vengono ancora letti per compatibilità. openclaw doctor --fix li migra a dmPolicy e allowFrom quando può farlo senza modificare l’accesso.Formato della destinazione dei messaggi diretti per la consegna:user:<id>- menzione
<@id>
allowFrom effettivo dei messaggi diretti dell’account vengono trattati come destinazioni utente per compatibilità.Instradamento degli agenti basato sui ruoli
Usabindings[].match.roles per instradare i membri dei server Discord verso agenti diversi in base all’ID del ruolo. Le associazioni basate sui ruoli accettano solo ID di ruolo e vengono valutate dopo le associazioni tra interlocutori o interlocutori principali e prima delle associazioni basate esclusivamente sul server. Se un’associazione imposta anche altri campi di corrispondenza (ad esempio peer + guildId + roles), tutti i campi configurati devono corrispondere.
Comandi nativi e autorizzazione dei comandi
commands.nativeusa"auto"per impostazione predefinita ed è abilitato per Discord.- Sostituzione per singolo canale:
channels.discord.commands.native. commands.native=falseevita la registrazione e la pulizia dei comandi slash di Discord durante l’avvio. I comandi registrati in precedenza potrebbero rimanere visibili in Discord finché non vengono rimossi dall’app Discord.- L’autorizzazione dei comandi nativi usa gli stessi elenchi consentiti e le stesse policy di Discord usati per la normale gestione dei messaggi.
- I comandi potrebbero comunque essere visibili nell’interfaccia di Discord agli utenti non autorizzati; durante l’esecuzione viene applicata l’autorizzazione di OpenClaw e viene restituita la risposta “non autorizzato”.
- Impostazioni predefinite dei comandi slash:
ephemeral: true(channels.discord.slashCommand.ephemeral).
Dettagli delle funzionalità
Tag di risposta e risposte native
Tag di risposta e risposte native
[[reply_to_current]][[reply_to:<id>]]
channels.discord.replyToMode:off(predefinito): nessuna organizzazione implicita delle risposte in thread; i tag espliciti[[reply_to_*]]vengono comunque rispettatifirst: associa il riferimento implicito della risposta nativa al primo messaggio Discord in uscita del turnoall: lo associa a ogni messaggio in uscitabatched: lo associa solo quando l’evento in ingresso era un batch con debounce di più messaggi; utile quando si desiderano risposte native principalmente per chat ambigue con messaggi a raffica, anziché per ogni turno con un singolo messaggio
Anteprime dei link
Anteprime dei link
channels.discord.accounts.<id>.suppressEmbeds per sostituire il comportamento di un account. Gli invii effettuati tramite lo strumento messaggi dell’agente possono anche passare suppressEmbeds: false per un singolo messaggio. I payload embeds espliciti di Discord non vengono eliminati dall’impostazione predefinita delle anteprime dei link.Anteprima del flusso in tempo reale
Anteprima del flusso in tempo reale
channels.discord.streaming.mode accetta off | partial | block | progress (predefinito quando non è impostata alcuna chiave streaming o la chiave legacy streamMode). streamMode è un alias legacy; esegui openclaw doctor --fix per riscrivere la configurazione persistente nella struttura annidata canonica streaming.offdisabilita le modifiche dell’anteprima di Discord.partialmodifica un singolo messaggio di anteprima man mano che arrivano i token.blockemette blocchi delle dimensioni di una bozza; regola dimensioni e punti di interruzione constreaming.preview.chunk(minChars,maxChars,breakPreference), con limiti imposti datextChunkLimit. Quando lo streaming a blocchi è abilitato esplicitamente, OpenClaw omette il flusso di anteprima per evitare un doppio streaming.progressmantiene un’unica bozza di stato modificabile e la aggiorna con l’avanzamento degli strumenti fino alla consegna finale; l’etichetta iniziale condivisa è una riga scorrevole, quindi scompare scorrendo come il resto quando vengono visualizzate abbastanza attività.- I risultati finali con contenuti multimediali, errori e risposte esplicite annullano le modifiche dell’anteprima in sospeso.
streaming.preview.toolProgress(predefinitotrue) controlla se gli aggiornamenti degli strumenti e dell’avanzamento riutilizzano il messaggio di anteprima.- Le righe relative agli strumenti e all’avanzamento vengono visualizzate in forma compatta con emoji, titolo e dettagli, quando disponibili, ad esempio
🛠️ Bash: esegui i testo🔎 Ricerca web: per "query". streaming.progress.commentary(predefinitofalse) abilita il testo di commento o preambolo dell’assistente nella bozza temporanea di avanzamento. Il commento viene ripulito prima della visualizzazione, rimane temporaneo e non modifica la consegna della risposta finale.streaming.progress.maxLineCharscontrolla il limite per riga dell’anteprima di avanzamento. Il testo discorsivo viene abbreviato rispettando i confini delle parole; i dettagli relativi a comandi e percorsi mantengono i suffissi utili.streaming.preview.commandText/streaming.progress.commandTextcontrolla i dettagli dei comandi e delle esecuzioni nelle righe compatte di avanzamento:raw(predefinito) ostatus(solo l’etichetta dello strumento).
Cronologia, contesto e comportamento dei thread
Cronologia, contesto e comportamento dei thread
channels.discord.historyLimit, valore predefinito20- ripiego:
messages.groupChat.historyLimit 0disabilita la funzionalità
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
- I thread di Discord vengono instradati come sessioni di canale ed ereditano la configurazione del canale principale, salvo sostituzioni.
- Le sessioni dei thread ereditano la selezione
/modela livello di sessione del canale principale solo come ripiego per il modello; le selezioni/modellocali del thread hanno la precedenza e la cronologia della trascrizione principale non viene copiata, a meno che non sia abilitata l’ereditarietà della trascrizione. channels.discord.thread.inheritParent(predefinitofalse) abilita per i nuovi thread automatici l’inizializzazione dalla trascrizione principale. Sostituzione per singolo account:channels.discord.accounts.<id>.thread.inheritParent.- Le reazioni dello strumento messaggi possono risolvere destinazioni di messaggi diretti
user:<id>. guilds.<guild>.channels.<channel>.requireMention: falseviene mantenuto durante il ripiego dell’attivazione nella fase di risposta.
Sessioni associate ai thread per i sottoagenti
Sessioni associate ai thread per i sottoagenti
/focus <target>associa il thread corrente o nuovo a una destinazione di sottoagente o sessione/unfocusrimuove l’associazione del thread corrente/agentsmostra le esecuzioni attive e lo stato delle associazioni/session idle <duration|off>esamina o aggiorna la rimozione automatica dell’associazione dopo un periodo di inattività per le associazioni con stato attivo/session max-age <duration|off>esamina o aggiorna la durata massima assoluta per le associazioni con stato attivo
session.threadBindings.*imposta i valori predefiniti globali;channels.discord.threadBindings.*sostituisce il comportamento di Discord.spawnSessionscontrolla la creazione e l’associazione automatiche dei thread persessions_spawn({ thread: true })e per le generazioni di thread ACP. Valore predefinito:true.defaultSpawnContextcontrolla il contesto nativo del sottoagente per le generazioni associate ai thread. Valore predefinito:"fork".- Le chiavi deprecate
spawnSubagentSessions/spawnAcpSessionsvengono migrate daopenclaw doctor --fix. - Se le associazioni dei thread sono disabilitate per un account,
/focuse le relative operazioni di associazione dei thread non sono disponibili.
Associazioni persistenti dei canali ACP
Associazioni persistenti dei canali ACP
bindings[] con type: "acp" e match.channel: "discord"./acp spawn codex --bind hereassocia direttamente il canale o il thread corrente e mantiene i messaggi futuri nella stessa sessione ACP. I messaggi del thread ereditano l’associazione del canale principale.- In un canale o thread associato,
/newe/resetreimpostano direttamente la stessa sessione ACP. Le associazioni temporanee dei thread possono sostituire la risoluzione della destinazione mentre sono attive. spawnSessionscontrolla la creazione e l’associazione dei thread secondari tramite--thread auto|here.
Notifiche delle reazioni
Notifiche delle reazioni
guilds.<id>.reactionNotifications):offown(predefinito)allallowlist(usaguilds.<id>.users)
Reazioni di conferma
Reazioni di conferma
ackReaction invia un’emoji di conferma mentre OpenClaw elabora un messaggio in ingresso.Ordine di risoluzione:channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- ripiego sull’emoji dell’identità dell’agente (
agents.list[].identity.emoji, altrimenti ”👀”)
- Discord accetta emoji Unicode o nomi di emoji personalizzate.
- Usa
""per disabilitare la reazione per un canale o un account.
messages.ackReactionScope):Valori: "all" (messaggi diretti + gruppi, inclusi gli eventi ambientali delle stanze), "direct" (solo messaggi diretti), "group-all" (ogni messaggio di gruppo, esclusi gli eventi ambientali delle stanze; nessun messaggio diretto), "group-mentions" (gruppi quando viene menzionato il bot; nessun messaggio diretto, valore predefinito), "off" / "none" (disabilitato)."group-mentions") non attiva reazioni di conferma nei messaggi diretti o negli eventi ambientali delle stanze. Per ottenere una reazione di conferma sui messaggi diretti Discord in ingresso e sugli eventi delle stanze silenziose, imposta messages.ackReactionScope su "all".Scrittura della configurazione
Scrittura della configurazione
/config set|unset, quando le funzionalità dei comandi sono abilitate.Per disabilitarle:Proxy del Gateway
Proxy del Gateway
channels.discord.proxy.
L’uso del proxy per il WebSocket del Gateway Discord è esplicito; le connessioni WebSocket non ereditano le variabili d’ambiente del proxy del processo Gateway. Le richieste REST di avvio usano questo proxy quando channels.discord.proxy è configurato.Supporto per PluralKit
Supporto per PluralKit
- le liste di elementi consentiti possono usare
pk:<memberId> - i nomi visualizzati dei membri vengono confrontati per nome/slug solo quando
channels.discord.dangerouslyAllowNameMatching: true - le ricerche interrogano l’API PluralKit con l’ID del messaggio originale
- se la ricerca non riesce, i messaggi inoltrati tramite proxy vengono trattati come messaggi di bot e scartati, a meno che
allowBotsnon ne consenta il passaggio
Alias delle menzioni in uscita
Alias delle menzioni in uscita
mentionAliases quando gli agenti necessitano di menzioni in uscita deterministiche per utenti Discord noti. Le chiavi sono handle senza la @ iniziale; i valori sono ID utente Discord. Gli handle sconosciuti, @everyone, @here e le menzioni all’interno di frammenti di codice Markdown rimangono invariati.Configurazione della presenza
Configurazione della presenza
activity):- 0: In gioco
- 1: In streaming (richiede
activityUrl;activityUrlrichiede a sua voltaactivityType: 1) - 2: In ascolto
- 3: In visione
- 4: Personalizzata (usa il testo dell’attività come stato; l’emoji è facoltativa)
- 5: In competizione
intervalMs 30000, minUpdateIntervalMs 15000 (deve essere minore o uguale a intervalMs). Sostituzioni facoltative del testo:autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(supporta il segnaposto{reason})
Approvazioni in Discord
Approvazioni in Discord
channels.discord.execApprovals.enabledchannels.discord.execApprovals.approvers(facoltativo; quando possibile, usa come ripiegocommands.ownerAllowFrom)channels.discord.execApprovals.target(dm|channel|both, valore predefinito:dm)agentFilter,sessionFilter,cleanupAfterResolve
enabled non è impostato o è "auto" ed è possibile determinare almeno un approvatore, da execApprovals.approvers oppure da commands.ownerAllowFrom. Discord non deduce gli approvatori delle esecuzioni da allowFrom del canale, dal precedente dm.allowFrom o da defaultTo dei messaggi diretti. Imposta enabled: false per disabilitare esplicitamente Discord come client di approvazione nativo.Per i comandi di gruppo sensibili riservati al proprietario, come /diagnostics e /export-trajectory, OpenClaw invia privatamente le richieste di approvazione e i risultati finali. Tenta prima di usare un messaggio diretto Discord quando il proprietario che ha invocato il comando dispone di una route proprietario Discord; altrimenti usa come ripiego la prima route proprietario disponibile in commands.ownerAllowFrom, ad esempio Telegram.Quando target è channel o both, la richiesta di approvazione è visibile nel canale. Solo gli approvatori determinati possono usare i pulsanti; gli altri utenti ricevono un rifiuto effimero. Le richieste di approvazione includono il testo del comando, quindi abilita l’invio nel canale solo nei canali attendibili. Se non è possibile ricavare l’ID del canale dalla chiave di sessione, OpenClaw usa come ripiego l’invio tramite messaggio diretto.Discord visualizza i pulsanti di approvazione condivisi usati dagli altri canali di chat; l’adattatore Discord nativo aggiunge principalmente l’instradamento dei messaggi diretti agli approvatori e la distribuzione nei canali. Quando questi pulsanti sono presenti, costituiscono l’esperienza utente principale per l’approvazione; OpenClaw deve includere un comando manuale /approve solo quando il risultato dello strumento indica che le approvazioni via chat non sono disponibili o che l’approvazione manuale è l’unico percorso. Se il runtime nativo delle approvazioni Discord non è attivo, OpenClaw mantiene visibile la richiesta locale deterministica /approve <id> <decision>. Se il runtime è attivo ma non è possibile recapitare una scheda nativa ad alcuna destinazione, OpenClaw invia nella stessa chat un avviso di ripiego con il comando /approve esatto dell’approvazione in sospeso.L’autenticazione del Gateway e la risoluzione delle approvazioni seguono il contratto condiviso del client Gateway (gli ID plugin: vengono risolti tramite plugin.approval.resolve; gli altri ID tramite exec.approval.resolve). Per impostazione predefinita, le approvazioni scadono dopo 30 minuti.Consulta Approvazioni delle esecuzioni.Strumenti e controlli delle azioni
Le azioni dei messaggi Discord comprendono messaggistica, amministrazione dei canali, moderazione, presenza e metadati. Esempi principali:- messaggistica:
sendMessage,readMessages,editMessage,deleteMessage,threadReply - reazioni:
react,reactions,emojiList - moderazione:
timeout,kick,ban - presenza:
setPresence
event-create accetta un parametro facoltativo image (URL o percorso di un file locale) per impostare l’immagine di copertina dell’evento programmato.
I controlli delle azioni si trovano in channels.discord.actions.*.
Comportamento predefinito dei controlli:
Interfaccia utente Components v2
OpenClaw usa Components v2 di Discord per le approvazioni delle esecuzioni e gli indicatori tra contesti. Le azioni dei messaggi Discord possono anche accettarecomponents per un’interfaccia utente personalizzata (funzionalità avanzata; richiede la creazione di un payload di componenti tramite lo strumento Discord), mentre i precedenti embeds rimangono disponibili ma non sono consigliati.
channels.discord.ui.components.accentColorimposta il colore di accento usato dai contenitori dei componenti Discord (esadecimale). Per account:channels.discord.accounts.<id>.ui.components.accentColor.channels.discord.agentComponents.ttlMscontrolla per quanto tempo le callback dei componenti Discord inviati rimangono registrate (valore predefinito1800000, massimo86400000). Per account:channels.discord.accounts.<id>.agentComponents.ttlMs.- Gli
embedsvengono ignorati quando sono presenti Components v2. - Le anteprime degli URL semplici vengono soppresse per impostazione predefinita. Imposta
suppressEmbeds: falsein un’azione di messaggio quando deve essere espanso un singolo collegamento in uscita.
Voce
Discord dispone di due superfici vocali distinte: i canali vocali in tempo reale (conversazioni continue) e gli allegati di messaggi vocali (il formato di anteprima con forma d’onda). Il Gateway supporta entrambe.Canali vocali
Elenco di controllo per la configurazione:- Abilita Message Content Intent nel Discord Developer Portal.
- Abilita Server Members Intent quando vengono usate liste di ruoli/utenti consentiti.
- Invita il bot con gli ambiti
boteapplications.commands. - Concedi Connect, Speak, Send Messages e Read Message History nel canale vocale di destinazione.
- Abilita i comandi nativi (
commands.nativeochannels.discord.commands.native). - Configura
channels.discord.voice.
/vc join|leave|status per controllare le sessioni. Il comando usa l’agente predefinito dell’account e segue le stesse regole relative alle liste di elementi consentiti e ai criteri di gruppo degli altri comandi Discord.
- La voce di Discord è facoltativa per le configurazioni di solo testo; imposta
channels.discord.voice.enabled=true(oppure mantieni un bloccochannels.discord.voiceesistente) per abilitare i comandi/vc, il runtime vocale e l’intent GatewayGuildVoiceStates.channels.discord.intents.voiceStatespuò sostituire esplicitamente la sottoscrizione all’intent; lascialo non impostato per seguire l’abilitazione vocale effettiva. voice.modecontrolla il percorso della conversazione. Il valore predefinito èagent-proxy: un front-end vocale in tempo reale gestisce la temporizzazione dei turni, le interruzioni e la riproduzione, delega il lavoro sostanziale all’agente OpenClaw instradato tramiteopenclaw_agent_consulte tratta il risultato come un prompt Discord digitato da quell’interlocutore.stt-ttsmantiene il precedente flusso STT in batch più TTS.bidiconsente al modello in tempo reale di conversare direttamente, esponendo al contempoopenclaw_agent_consultper il cervello OpenClaw.voice.agentSessioncontrolla quale conversazione OpenClaw riceve i turni vocali. Lascialo non impostato per usare la sessione propria del canale vocale, oppure imposta{ mode: "target", target: "channel:<text-channel-id>" }affinché il canale vocale agisca come estensione microfono/altoparlante della sessione di un canale di testo Discord esistente, come#maintainers.voice.modelsostituisce il cervello dell’agente OpenClaw per le risposte vocali Discord e le consultazioni in tempo reale. Lascialo non impostato per ereditare il modello dell’agente instradato. È distinto davoice.realtime.model.voice.followUsersconsente al bot di entrare, spostarsi e uscire dai canali vocali Discord insieme agli utenti selezionati. Consulta Seguire gli utenti nei canali vocali.agent-proxyinstrada il parlato tramitediscord-voice, che conserva la normale autorizzazione del proprietario e degli strumenti per l’interlocutore e la sessione di destinazione, ma nasconde lo strumentottsdell’agente perché la riproduzione è gestita dalla voce Discord. Per impostazione predefinita,agent-proxyconcede alla consultazione un accesso agli strumenti completo ed equivalente a quello del proprietario per gli interlocutori proprietari (voice.realtime.toolPolicy: "owner") e privilegia fortemente la consultazione dell’agente OpenClaw prima delle risposte sostanziali (voice.realtime.consultPolicy: "always"). In questa modalitàalwayspredefinita, il livello in tempo reale non pronuncia automaticamente frasi riempitive prima della risposta della consultazione; acquisisce e trascrive il parlato, quindi pronuncia la risposta OpenClaw instradata. Se più risposte di consultazioni forzate terminano mentre Discord sta ancora riproducendo la prima risposta, le successive risposte con parlato esatto vengono accodate fino a quando la riproduzione non è inattiva, anziché sostituire il parlato a metà frase.- In modalità
stt-tts, STT usatools.media.audio;voice.modelnon influisce sulla trascrizione. - Nelle modalità in tempo reale,
voice.realtime.provider,voice.realtime.modelevoice.realtime.speakerVoiceconfigurano la sessione audio in tempo reale. Per OpenAI Realtime 2.1 con il cervello Codex, usavoice.realtime.model: "gpt-realtime-2.1"evoice.model: "openai/gpt-5.6-sol". - Per impostazione predefinita, le modalità vocali in tempo reale includono piccoli file di profilo
IDENTITY.md,USER.mdeSOUL.mdnelle istruzioni del fornitore in tempo reale, affinché i turni diretti rapidi mantengano la stessa identità, lo stesso ancoraggio all’utente e la stessa persona dell’agente OpenClaw instradato. Impostavoice.realtime.bootstrapContextFilessu un sottoinsieme per personalizzare questo comportamento, oppure su[]per disabilitarlo. Sono supportati solo questi file di profilo;AGENTS.mdrimane nel normale contesto dell’agente. Il contesto di profilo inserito non sostituisceopenclaw_agent_consultper il lavoro nell’area di lavoro, i fatti correnti, la ricerca nella memoria o le azioni supportate da strumenti. - Nella modalità in tempo reale
agent-proxydi OpenAI, impostavoice.realtime.requireWakeName: trueper mantenere silenziosa la voce Discord in tempo reale finché una trascrizione non inizia o termina con un nome di attivazione. I nomi di attivazione configurati devono essere composti da una o due parole. Sevoice.realtime.wakeNamesnon è impostato, OpenClaw usa ilnamedell’agente instradato piùOpenClaw, ripiegando sull’ID dell’agente piùOpenClaw. Il controllo tramite nome di attivazione disabilita la risposta automatica del fornitore in tempo reale, instrada i turni accettati attraverso il percorso di consultazione dell’agente OpenClaw e fornisce un breve riscontro vocale quando un nome di attivazione iniziale viene riconosciuto dalla trascrizione parziale prima dell’arrivo della trascrizione finale. - Il fornitore in tempo reale OpenAI accetta i nomi degli eventi Realtime 2 correnti e gli alias legacy compatibili con Codex per gli eventi dell’audio di output e della trascrizione, consentendo alle istantanee compatibili del fornitore di divergere senza perdere l’audio dell’assistente.
voice.realtime.bargeIncontrolla se gli eventi di inizio parlato di un interlocutore Discord interrompono la riproduzione in tempo reale attiva. Se non impostato, segue l’impostazione di interruzione tramite audio di input del fornitore in tempo reale.voice.realtime.minBargeInAudioEndMscontrolla la durata minima della riproduzione dell’assistente prima che un’interruzione in tempo reale OpenAI tronchi l’audio. Valore predefinito:250. Imposta0per l’interruzione immediata in ambienti con poco eco, oppure aumenta il valore per configurazioni con altoparlanti soggette a forte eco.voice.ttssostituiscemessages.ttssolo per la riproduzione vocalestt-tts; le modalità in tempo reale usano invecevoice.realtime.speakerVoice. Per una voce OpenAI nella riproduzione Discord, impostavoice.tts.provider: "openai"e scegli una voce di sintesi vocale invoice.tts.providers.openai.speakerVoice.cedarè una valida scelta dal timbro maschile con l’attuale modello TTS di OpenAI.- Le sostituzioni
systemPromptDiscord specifiche per canale si applicano ai turni delle trascrizioni vocali di quel canale vocale. - I turni delle trascrizioni vocali derivano lo stato di proprietario da
allowFrom(odm.allowFrom) di Discord per i comandi e le azioni del canale riservati al proprietario. La visibilità degli strumenti dell’agente segue la politica degli strumenti configurata per la sessione instradata. - Se
voice.autoJoincontiene più voci per lo stesso server, OpenClaw entra nell’ultimo canale configurato per quel server. voice.allowedChannelsè una lista consentita facoltativa per la permanenza. Lascialo non impostato per consentire a/vc joindi entrare in qualsiasi canale vocale Discord autorizzato. Quando è impostato,/vc join, l’ingresso automatico all’avvio e gli spostamenti dello stato vocale del bot sono limitati alle voci{ guildId, channelId }elencate. Impostalo su un array vuoto per impedire tutti gli ingressi nei canali vocali Discord. Se Discord sposta il bot al di fuori della lista consentita, OpenClaw lascia quel canale e rientra nella destinazione di ingresso automatico configurata, se disponibile.voice.daveEncryptionevoice.decryptionFailureTolerancevengono passati alle opzioni di ingresso di@discordjs/voice; i valori predefiniti a monte sonodaveEncryption=trueedecryptionFailureTolerance=24.- OpenClaw usa il codec
libopus-wasmincluso per la ricezione vocale Discord e la riproduzione PCM grezza in tempo reale. Include una build WebAssembly di libopus con versione bloccata e non richiede componenti aggiuntivi opus nativi. voice.connectTimeoutMscontrolla l’attesa iniziale dello stato Ready di@discordjs/voiceper/vc joine i tentativi di ingresso automatico. Valore predefinito:30000.voice.reconnectGraceMscontrolla per quanto tempo OpenClaw attende che una sessione vocale disconnessa inizi a riconnettersi prima di eliminarla. Valore predefinito:15000.- In modalità
stt-tts, la riproduzione vocale non si interrompe solo perché un altro utente inizia a parlare. Per evitare cicli di feedback, OpenClaw ignora le nuove acquisizioni vocali durante la riproduzione TTS; per il turno successivo, parla al termine della riproduzione. Le modalità in tempo reale inoltrano gli inizi del parlato come segnali di interruzione al fornitore in tempo reale. - Nelle modalità in tempo reale, l’eco degli altoparlanti captato da un microfono aperto può essere interpretato come un’interruzione e fermare la riproduzione. Per le stanze Discord con forte eco, imposta
voice.realtime.providers.openai.interruptResponseOnInputAudio: falseper impedire a OpenAI di interrompersi automaticamente in presenza di audio di input. Aggiungivoice.realtime.bargeIn: truese vuoi comunque che gli eventi di inizio parlato di Discord interrompano la riproduzione attiva. Il bridge in tempo reale OpenAI ignora i troncamenti della riproduzione più brevi divoice.realtime.minBargeInAudioEndMs, considerandoli probabile eco o rumore, e li registra come ignorati anziché cancellare la riproduzione Discord. voice.captureSilenceGraceMscontrolla per quanto tempo OpenClaw attende dopo che Discord segnala che un interlocutore ha smesso di parlare, prima di finalizzare quel segmento audio per STT. Valore predefinito:2000; aumentalo se Discord suddivide le pause normali in trascrizioni parziali frammentarie.- Quando ElevenLabs è il fornitore TTS selezionato, la riproduzione vocale Discord usa il TTS in streaming e inizia dal flusso di risposta del fornitore. I fornitori senza supporto per lo streaming ripiegano sul percorso del file temporaneo sintetizzato.
- OpenClaw monitora gli errori di decrittazione in ricezione e si ripristina automaticamente uscendo e rientrando nel canale vocale dopo errori ripetuti in un breve intervallo.
- Se, dopo un aggiornamento, i registri di ricezione mostrano ripetutamente
DecryptionFailed(UnencryptedWhenPassthroughDisabled), raccogli un rapporto sulle dipendenze e i registri. La versione inclusa di@discordjs/voicecomprende la correzione a monte del padding dalla PR #11449 di discord.js, che ha chiuso il problema #11419 di discord.js. - Gli eventi di ricezione
The operation was abortedsono previsti quando OpenClaw finalizza un segmento acquisito dell’interlocutore; sono informazioni diagnostiche dettagliate, non avvisi. - I registri vocali dettagliati di Discord includono un’anteprima delimitata su una riga della trascrizione STT per ogni segmento accettato dell’interlocutore, così il debug mostra sia il lato dell’utente sia quello della risposta dell’agente senza riversare testo di trascrizione senza limiti.
- In modalità
agent-proxy, il ripiego della consultazione forzata ignora i frammenti di trascrizione probabilmente incompleti, come il testo che termina con...o con un connettivo finale come “e”, oltre alle ovvie chiusure che non richiedono azioni, come “torno subito” o “ciao”. I registri mostranoforced agent consult skipped reason=...quando ciò impedisce una risposta obsoleta in coda.
Seguire gli utenti nei canali vocali
Usavoice.followUsers quando vuoi che il bot vocale Discord rimanga con uno o più utenti Discord noti, anziché entrare in un canale fisso all’avvio o attendere /vc join.
followUsersaccetta ID utente Discord grezzi e valoridiscord:<id>. OpenClaw normalizza entrambe le forme prima di confrontare gli eventi dello stato vocale.followUsersEnabledassume come valore predefinitotruequandofollowUsersè configurato. Impostalo sufalseper conservare l’elenco salvato ma interrompere il seguito vocale automatico.- Quando un utente seguito entra in un canale vocale consentito, OpenClaw entra in quel canale. Quando l’utente si sposta, OpenClaw si sposta con lui. Quando l’utente seguito attivo si disconnette, OpenClaw esce.
- Se più utenti seguiti si trovano nello stesso server e l’utente seguito attivo esce, OpenClaw si sposta nel canale di un altro utente seguito monitorato prima di lasciare il server. Se più utenti seguiti si spostano contemporaneamente, prevale l’ultimo evento dello stato vocale osservato.
allowedChannelscontinua ad applicarsi. Un utente seguito in un canale non consentito viene ignorato e una sessione appartenente alla funzione di seguito si sposta presso un altro utente seguito oppure esce.- OpenClaw riconcilia gli eventi dello stato vocale persi all’avvio e a intervalli limitati. La riconciliazione campiona i server configurati e limita le ricerche REST per esecuzione, quindi elenchi
followUsersmolto grandi potrebbero richiedere più di un intervallo per convergere. - Se Discord o un amministratore sposta il bot mentre sta seguendo un utente, OpenClaw ricrea la sessione vocale e conserva la titolarità del seguito quando la destinazione è consentita. Se il bot viene spostato al di fuori di
allowedChannels, OpenClaw esce e rientra nella destinazione configurata, se esiste. - Il ripristino della ricezione DAVE può uscire e rientrare nello stesso canale dopo ripetuti errori di decrittazione. Le sessioni appartenenti alla funzione di seguito mantengono tale titolarità durante questo percorso di ripristino, quindi una successiva disconnessione dell’utente seguito provoca comunque l’uscita dal canale.
- Usa
followUsersper configurazioni personali o operative in cui il bot deve trovarsi automaticamente nel canale vocale quando ci sei tu. - Usa
autoJoinper bot destinati a stanze fisse, che devono essere presenti anche quando nessun utente monitorato si trova in un canale vocale. - Usa
/vc joinper ingressi occasionali o stanze in cui una presenza vocale automatica sarebbe inattesa.
- I registri di ricezione vocale mostrano
discord voice: opus decoder: libopus-wasm. - La riproduzione in tempo reale codifica il PCM stereo grezzo a 48 kHz in Opus con lo stesso pacchetto
libopus-wasmincluso, prima di consegnare i pacchetti a@discordjs/voice. - La riproduzione da file e da flusso del fornitore transcodifica in PCM stereo grezzo a 48 kHz con ffmpeg, quindi usa
libopus-wasmper il flusso di pacchetti Opus inviato a Discord.
- L’acquisizione PCM di Discord viene convertita in un file WAV temporaneo.
tools.media.audiogestisce la conversione da voce a testo, ad esempioopenai/gpt-4o-mini-transcribe.- La trascrizione viene inviata attraverso l’ingresso e l’instradamento di Discord mentre il modello linguistico di risposta viene eseguito con una politica di output vocale che nasconde lo strumento
ttsdell’agente e richiede la restituzione di testo, poiché la voce Discord gestisce la riproduzione finale della sintesi vocale. voice.model, quando impostato, sostituisce solo il modello linguistico di risposta per questo turno del canale vocale.voice.ttsviene sovrapposto amessages.tts; i provider che supportano lo streaming alimentano direttamente il lettore, altrimenti il file audio risultante viene riprodotto nel canale a cui il bot si è unito.
voice.agentSession, ogni canale vocale dispone di una propria sessione OpenClaw instradata. Ad esempio, /vc join channel:234567890123456789 comunica con la sessione di quel canale vocale Discord. Il modello in tempo reale costituisce soltanto l’interfaccia vocale; le richieste sostanziali vengono passate all’agente OpenClaw configurato. Se il modello in tempo reale produce una trascrizione finale senza chiamare lo strumento di consultazione, OpenClaw forza la consultazione come ripiego, affinché il comportamento predefinito rimanga equivalente a parlare con l’agente.
Esempio di riconoscimento vocale più sintesi vocale precedente:
agent-proxy, il bot si unisce al canale vocale configurato, ma i turni dell’agente OpenClaw utilizzano l’agente e la normale sessione instradata del canale di destinazione. La sessione vocale in tempo reale pronuncia il risultato restituito nel canale vocale. L’agente supervisore può comunque utilizzare i normali strumenti di messaggistica in base alla propria politica degli strumenti, compreso l’invio di un messaggio Discord separato se questa è l’azione appropriata.
Mentre è attiva un’esecuzione OpenClaw delegata, le nuove trascrizioni vocali di Discord vengono trattate come controllo in tempo reale dell’esecuzione prima di avviare un altro turno dell’agente. Frasi come “stato”, “annulla”, “usa la correzione più piccola” o “quando hai finito controlla anche i test” vengono classificate come input di stato, annullamento, guida o follow-up per la sessione attiva. Gli esiti relativi a stato, annullamento, guida accettata e follow-up vengono pronunciati nel canale vocale, in modo che il chiamante sappia se OpenClaw ha gestito la richiesta.
Forme di destinazione utili:
target: "channel:123456789012345678"instrada attraverso la sessione di un canale testuale Discord.target: "123456789012345678"viene considerato come destinazione di un canale.target: "dm:123456789012345678"otarget: "user:123456789012345678"instrada attraverso la sessione di messaggistica diretta corrispondente.
bargeIn: true consente agli eventi di inizio intervento di Discord e all’audio di un interlocutore già attivo di annullare le risposte in tempo reale attive prima che il turno acquisito successivo raggiunga OpenAI. I segnali di interruzione molto precoci con audioEndMs inferiore a minBargeInAudioEndMs vengono considerati probabile eco o rumore e ignorati, affinché il modello non si interrompa al primo fotogramma di riproduzione.
Log vocali previsti:
- All’ingresso:
discord voice: joining ... voiceSession=... supervisorSession=... agentSessionMode=... voiceModel=... realtimeModel=... - All’avvio in tempo reale:
discord voice: realtime bridge starting ... autoRespond=false interruptResponse=false bargeIn=false minBargeInAudioEndMs=... - Sull’audio dell’interlocutore:
discord voice: realtime speaker turn opened ...,discord voice: realtime input audio started ... outputAudioMs=... outputActive=...ediscord voice: realtime speaker turn closed ... chunks=... discordBytes=... realtimeBytes=... interruptedPlayback=... - Quando viene ignorato un parlato obsoleto:
discord voice: realtime forced agent consult skipped reason=incomplete-transcript ...oreason=non-actionable-closing ... - Al completamento della risposta in tempo reale:
discord voice: realtime audio playback finishing reason=response.done ... audioMs=... chunks=... - All’arresto o alla reimpostazione della riproduzione:
discord voice: realtime audio playback stopped reason=... audioMs=... elapsedMs=... chunks=... - Alla consultazione in tempo reale:
discord voice: realtime consult requested ... voiceSession=... supervisorSession=... question=... - Alla risposta dell’agente:
discord voice: agent turn answer ... - Quando viene accodato il parlato esatto:
discord voice: realtime exact speech queued ... queued=... outputAudioMs=... outputActive=..., seguito dadiscord voice: realtime exact speech dequeued reason=player-idle ... - Al rilevamento dell’interruzione:
discord voice: realtime barge-in detected source=speaker-start ...odiscord voice: realtime barge-in detected source=active-speaker-audio ..., seguito dadiscord voice: realtime barge-in requested reason=... outputAudioMs=... outputActive=... - All’interruzione in tempo reale:
discord voice: realtime model interrupt requested client:response.cancel reason=barge-in, seguito dadiscord voice: realtime model audio truncated client:conversation.item.truncate reason=barge-in audioEndMs=...oppurediscord voice: realtime model interrupt confirmed server:response.done status=cancelled ... - Quando vengono ignorati eco o rumore:
discord voice: realtime model interrupt ignored client:conversation.item.truncate.skipped reason=barge-in audioEndMs=0 minAudioEndMs=250 - Quando l’interruzione è disabilitata:
discord voice: realtime capture ignored during playback (barge-in disabled) ... - Durante la riproduzione inattiva:
discord voice: realtime barge-in ignored reason=... outputActive=false ... playbackChunks=0
realtime audio playback startedindica che Discord ha iniziato a riprodurre l’audio dell’assistente. Da questo momento, il bridge inizia a contare i segmenti di output dell’assistente, i byte PCM di Discord, i byte in tempo reale del provider e la durata dell’audio sintetizzato.realtime speaker turn openedindica che un interlocutore Discord è diventato attivo. Se la riproduzione è già attiva ebargeInè abilitato, può essere seguito dabarge-in detected source=speaker-start.realtime input audio startedindica il primo fotogramma audio effettivo ricevuto per il turno di quell’interlocutore.outputActive=trueo un valoreoutputAudioMsdiverso da zero indica che il microfono sta inviando input mentre la riproduzione dell’assistente è ancora attiva.barge-in detected source=active-speaker-audioindica che OpenClaw ha rilevato audio in tempo reale dell’interlocutore mentre era attiva la riproduzione dell’assistente. Ciò è utile per distinguere un’interruzione reale da un evento di inizio intervento di Discord privo di audio utile.barge-in requested reason=...indica che OpenClaw ha chiesto al provider in tempo reale di annullare o troncare la risposta attiva. IncludeoutputAudioMs,outputActiveeplaybackChunks, consentendo di vedere quanto audio dell’assistente fosse stato effettivamente riprodotto prima dell’interruzione.realtime audio playback stopped reason=...è il punto di reimpostazione della riproduzione locale di Discord. Il motivo indica chi ha arrestato la riproduzione:barge-in,player-idle,provider-clear-audio,forced-agent-consult,stream-closeosession-close.realtime speaker turn closedriepiloga il turno di input acquisito.chunks=0ohasAudio=falseindica che il turno dell’interlocutore è stato aperto, ma nessun audio utilizzabile ha raggiunto il bridge in tempo reale.interruptedPlayback=trueindica che quel turno di input si è sovrapposto all’output dell’assistente e ha attivato la logica di interruzione.
outputAudioMs: durata dell’audio dell’assistente generato dal provider in tempo reale prima della riga di log.audioMs: durata dell’audio dell’assistente conteggiata da OpenClaw prima dell’arresto della riproduzione.elapsedMs: tempo trascorso effettivo tra l’apertura e la chiusura del flusso di riproduzione o del turno dell’interlocutore.discordBytes: byte PCM stereo a 48 kHz inviati alla voce Discord o ricevuti da essa.realtimeBytes: byte PCM nel formato del provider inviati al provider in tempo reale o ricevuti da esso.playbackChunks: segmenti audio dell’assistente inoltrati a Discord per la risposta attiva.sinceLastAudioMs: intervallo tra l’ultimo fotogramma audio acquisito dell’interlocutore e la chiusura del suo turno.
- Un’interruzione immediata con
source=active-speaker-audio, un valoreoutputAudioMsridotto e lo stesso utente nelle vicinanze indica generalmente che l’eco degli altoparlanti entra nel microfono. Aumentarevoice.realtime.minBargeInAudioEndMs, ridurre il volume degli altoparlanti, utilizzare cuffie oppure impostarevoice.realtime.providers.openai.interruptResponseOnInputAudio: false. source=speaker-startseguito daspeaker turn closed ... hasAudio=falseindica che Discord ha segnalato l’inizio di un intervento, ma nessun audio ha raggiunto OpenClaw. Può trattarsi di un evento vocale transitorio di Discord, del comportamento della soglia del rumore o di un client che attiva brevemente il microfono.audio playback stopped reason=stream-closesenza un’interruzione o un eventoprovider-clear-audionelle vicinanze indica che il flusso di riproduzione locale di Discord è terminato inaspettatamente. Controllare i log precedenti del provider e del lettore Discord.capture ignored during playback (barge-in disabled)indica che OpenClaw ha intenzionalmente scartato l’input mentre l’audio dell’assistente era attivo. Abilitarevoice.realtime.bargeInse si desidera che il parlato interrompa la riproduzione.barge-in ignored ... outputActive=falseindica che Discord o il rilevamento dell’attività vocale del provider ha segnalato del parlato, ma OpenClaw non disponeva di una riproduzione attiva da interrompere. Ciò non dovrebbe interrompere l’audio.
voice.model, autenticazione del riconoscimento vocale per tools.media.audio, autenticazione della sintesi vocale per messages.tts/voice.tts e autenticazione del provider in tempo reale per voice.realtime.providers o per la normale configurazione di autenticazione del provider.
Messaggi vocali
I messaggi vocali Discord mostrano un’anteprima della forma d’onda e richiedono audio OGG/Opus. OpenClaw genera automaticamente la forma d’onda, ma necessita diffmpeg e ffprobe sull’host del Gateway per eseguire l’analisi e la conversione.
- Fornire un percorso di file locale (gli URL vengono rifiutati).
- Omettere il contenuto testuale (Discord rifiuta testo e messaggio vocale nello stesso payload).
- È accettato qualsiasi formato audio; OpenClaw lo converte in OGG/Opus secondo necessità.
Risoluzione dei problemi
Sono stati usati intenti non consentiti oppure il bot non vede i messaggi del server
Sono stati usati intenti non consentiti oppure il bot non vede i messaggi del server
- abilita Message Content Intent
- abilita Server Members Intent quando dipendi dalla risoluzione di utenti/membri
- riavvia il Gateway dopo aver modificato gli intent
Guild messages blocked unexpectedly
Guild messages blocked unexpectedly
- verifica
groupPolicy - verifica l’elenco consentiti delle gilde in
channels.discord.guilds - se esiste una mappa
channelsper una gilda, sono consentiti solo i canali elencati - verifica il comportamento di
requireMentione i modelli di menzione
Require mention false but still blocked
Require mention false but still blocked
groupPolicy="allowlist"senza un elenco consentiti corrispondente per gilda/canalerequireMentionconfigurato nella posizione errata (deve trovarsi inchannels.discord.guildso in una voce di canale)- mittente bloccato dall’elenco consentiti
usersdella gilda/del canale
Long-running Discord turns or duplicate replies
Long-running Discord turns or duplicate replies
Slow listener detected ...stuck session: sessionKey=agent:...:discord:... state=processing ...
- account singolo:
channels.discord.eventQueue.listenerTimeout - account multipli:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout - questo controlla solo il lavoro del listener del Gateway Discord, non la durata del turno dell’agente
Gateway metadata lookup timeout warnings
Gateway metadata lookup timeout warnings
/gateway/bot. In caso di errori temporanei, usa come fallback l’URL predefinito del Gateway Discord e limita la frequenza dei log.Parametri del timeout dei metadati:- account singolo:
channels.discord.gatewayInfoTimeoutMs - account multipli:
channels.discord.accounts.<accountId>.gatewayInfoTimeoutMs - fallback tramite variabile d’ambiente quando la configurazione non è impostata:
OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS - valore predefinito:
30000(30 secondi), massimo:120000
Gateway READY timeout restarts
Gateway READY timeout restarts
READY del Gateway Discord durante l’avvio e dopo le riconnessioni del runtime. Le configurazioni con più account e avvio scaglionato possono richiedere una finestra READY di avvio più lunga rispetto al valore predefinito.Parametri del timeout READY:- avvio con account singolo:
channels.discord.gatewayReadyTimeoutMs - avvio con account multipli:
channels.discord.accounts.<accountId>.gatewayReadyTimeoutMs - fallback di avvio tramite variabile d’ambiente quando la configurazione non è impostata:
OPENCLAW_DISCORD_READY_TIMEOUT_MS - valore predefinito all’avvio:
15000(15 secondi), massimo:120000 - runtime con account singolo:
channels.discord.gatewayRuntimeReadyTimeoutMs - runtime con account multipli:
channels.discord.accounts.<accountId>.gatewayRuntimeReadyTimeoutMs - fallback del runtime tramite variabile d’ambiente quando la configurazione non è impostata:
OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS - valore predefinito del runtime:
30000(30 secondi), massimo:120000
Permissions audit mismatches
Permissions audit mismatches
channels status --probe funzionano solo con ID canale numerici.Se utilizzi chiavi slug, la corrispondenza durante l’esecuzione può comunque funzionare, ma la verifica non può controllare completamente le autorizzazioni.DM and pairing issues
DM and pairing issues
- messaggi diretti disabilitati:
channels.discord.dm.enabled=false - criterio dei messaggi diretti disabilitato:
channels.discord.dmPolicy="disabled"(legacy:channels.discord.dm.policy) - approvazione dell’associazione in attesa in modalità
pairing
Bot to bot loops
Bot to bot loops
channels.discord.allowBots=true, utilizza regole rigide per le menzioni e gli elenchi consentiti per evitare cicli.
Preferisci channels.discord.allowBots="mentions" per accettare solo i messaggi dei bot che menzionano il bot.OpenClaw include anche una protezione condivisa dai cicli tra bot. Ogni volta che allowBots consente ai messaggi creati dai bot di raggiungere l’inoltro, Discord associa l’evento in ingresso ai dati (account, channel, bot pair) e il controllo generico della coppia la sospende dopo che supera il budget di eventi configurato. Il controllo impedisce i cicli incontrollati tra due bot che in precedenza dovevano essere arrestati dai limiti di frequenza di Discord; non influisce sulle distribuzioni con un solo bot né sulle risposte isolate dei bot che rimangono entro il budget.Impostazioni predefinite (attive quando è impostato allowBots):maxEventsPerWindow: 20— la coppia di bot può scambiarsi 20 messaggi nella finestra mobilewindowSeconds: 60— durata della finestra mobilecooldownSeconds: 60— una volta superato il budget, ogni ulteriore messaggio tra bot in entrambe le direzioni viene scartato per un minuto
channels.defaults.botLoopProtection, quindi applica un override per Discord quando un flusso di lavoro legittimo richiede un margine maggiore. L’ordine di precedenza è:channels.discord.accounts.<account>.botLoopProtectionchannels.discord.botLoopProtectionchannels.defaults.botLoopProtection- valori predefiniti integrati
maxEventsPerWindow, windowSeconds e cooldownSeconds.Voice STT drops with DecryptionFailed(...)
Voice STT drops with DecryptionFailed(...)
- mantieni OpenClaw aggiornato (
openclaw update) per disporre della logica di ripristino della ricezione vocale di Discord - verifica che
channels.discord.voice.daveEncryption=true(valore predefinito) - parti da
channels.discord.voice.decryptionFailureTolerance=24(valore predefinito a monte) e regolalo solo se necessario - controlla nei log:
discord voice: DAVE decrypt failures detecteddiscord voice: repeated decrypt failures; attempting rejoin
- se gli errori continuano dopo la riconnessione automatica, raccogli i log e confrontali con la cronologia a monte della ricezione DAVE in discord.js #11419 e discord.js #11449
Riferimento della configurazione
Riferimento principale: Riferimento della configurazione - Discord.High-signal Discord fields
High-signal Discord fields
- avvio/autenticazione:
enabled,token,applicationId,accounts.*,allowBots - criteri:
groupPolicy,dmPolicy,allowFrom,dm.*,guilds.*,guilds.*.channels.* - comandi:
commands.native,commands.useAccessGroups(globale),configWrites,slashCommand.ephemeral - coda degli eventi:
eventQueue.listenerTimeout(budget del listener, valore predefinito120000),eventQueue.maxQueueSize(valore predefinito10000),eventQueue.maxConcurrency(valore predefinito50) - Gateway:
proxy,gatewayInfoTimeoutMs,gatewayReadyTimeoutMs,gatewayRuntimeReadyTimeoutMs - risposte/cronologia:
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - recapito:
textChunkLimit(valore predefinito2000),maxLinesPerMessage(valore predefinito17) - streaming:
streaming.mode,streaming.chunkMode,streaming.preview.*,streaming.progress.*,streaming.block.*(le chiavi piatte legacystreamMode,draftChunk,blockStreaming,blockStreamingCoalesce,chunkModevengono migrate instreaming.*daopenclaw doctor --fix) - contenuti multimediali/nuovi tentativi:
mediaMaxMb(limita i caricamenti Discord in uscita, valore predefinito100),retry - azioni:
actions.* - presenza:
activity,status,activityType,activityUrl,autoPresence.* - interfaccia utente:
ui.components.accentColor - funzionalità:
threadBindings,bindings[]di primo livello (type: "acp"),pluralkit,execApprovals,intents,agentComponents.enabled,agentComponents.ttlMs,heartbeat,responsePrefix
Sicurezza e operazioni
- Tratta i token dei bot come segreti (
DISCORD_BOT_TOKENè preferibile negli ambienti supervisionati). - Concedi a Discord autorizzazioni con privilegi minimi.
- Se la distribuzione o lo stato dei comandi non è aggiornato, riavvia il Gateway e ricontrolla con
openclaw channels status --probe.