Mainstream messaging

Discord

Pronto per DM e canali di gilda tramite il gateway ufficiale di Discord.

Configurazione rapida

Dovrai creare una nuova applicazione con un bot, aggiungere il bot al tuo server e associarlo a OpenClaw. Ti consigliamo di aggiungere il bot al tuo server privato. Se non ne hai ancora uno, creane prima uno (scegli Create My Own > For me and my friends).

  • Crea un'applicazione Discord e un bot

    Vai al Discord Developer Portal e fai clic su New Application. Assegnale un nome come "OpenClaw".

    Fai clic su Bot nella barra laterale. Imposta Username su qualunque nome tu dia al tuo agente OpenClaw.

  • Abilita gli intent privilegiati

    Sempre nella pagina Bot, scorri fino a Privileged Gateway Intents e abilita:

    • Message Content Intent (obbligatorio)
    • Server Members Intent (consigliato; obbligatorio per allowlist dei ruoli e corrispondenza nome-ID)
    • Presence Intent (facoltativo; necessario solo per gli aggiornamenti di presenza)
  • Copia il token del bot

    Scorri di nuovo verso l'alto nella pagina Bot e fai clic su Reset Token.

    Copia il token e salvalo da qualche parte. Questo è il tuo Bot Token e ti servirà a breve.

  • Genera un URL di invito e aggiungi il bot al tuo server

    Fai clic su OAuth2 nella barra laterale. Genererai un URL di invito con le autorizzazioni corrette per aggiungere il bot al tuo server.

    Scorri fino a OAuth2 URL Generator e abilita:

    • bot
    • applications.commands

    Sotto comparirà una sezione Bot Permissions. Abilita almeno:

    General Permissions

    • View Channels Text Permissions
    • Send Messages
    • Read Message History
    • Embed Links
    • Attach Files
    • Add Reactions (facoltativo)

    Questo è l'insieme di base per i normali canali di testo. Se prevedi di pubblicare nei thread di Discord, inclusi flussi di lavoro di canali forum o media che creano o continuano un thread, abilita anche Send Messages in Threads. Copia l'URL generato in basso, incollalo nel browser, seleziona il tuo server e fai clic su Continue per connettere. Ora dovresti vedere il tuo bot nel server Discord.

  • Abilita Developer Mode e raccogli i tuoi ID

    Torna nell'app Discord: devi abilitare Developer Mode per poter copiare gli ID interni.

    1. Fai clic su User Settings (icona a ingranaggio accanto al tuo avatar) → Advanced → attiva Developer Mode
    2. Fai clic con il tasto destro sulla tua server icon nella barra laterale → Copy Server ID
    3. Fai clic con il tasto destro sul tuo own avatarCopy User ID

    Salva il tuo Server ID e User ID insieme al Bot Token: invierai tutti e tre a OpenClaw nel passaggio successivo.

  • Consenti DM dai membri del server

    Perché l'associazione funzioni, Discord deve consentire al bot di inviarti DM. Fai clic con il tasto destro sulla tua server iconPrivacy Settings → attiva Direct Messages.

    Questo consente ai membri del server (inclusi i bot) di inviarti DM. Mantienilo abilitato se vuoi usare i DM di Discord con OpenClaw. Se prevedi di usare solo canali di gilda, puoi disabilitare i DM dopo l'associazione.

  • Imposta il token del bot in modo sicuro (non inviarlo in chat)

    Il token del bot Discord è un segreto (come una password). Impostalo sulla macchina che esegue OpenClaw prima di inviare messaggi al tuo agente.

    export DISCORD_BOT_TOKEN="YOUR_BOT_TOKEN"
    cat > discord.patch.json5 <<'JSON5'
    {
    channels: {
    discord: {
      enabled: true,
      token: { source: "env", provider: "default", id: "DISCORD_BOT_TOKEN" },
    },
    },
    }
    JSON5
    openclaw config patch --file ./discord.patch.json5 --dry-run
    openclaw config patch --file ./discord.patch.json5
    openclaw gateway
    

    Se OpenClaw è già in esecuzione come servizio in background, riavvialo tramite l'app OpenClaw per Mac oppure arrestando e riavviando il processo openclaw gateway run. Per installazioni come servizio gestito, esegui openclaw gateway install da una shell in cui DISCORD_BOT_TOKEN è presente, oppure archivia la variabile in ~/.openclaw/.env, così il servizio può risolvere il SecretRef env dopo il riavvio. Se il tuo host è bloccato o limitato da Discord durante la ricerca dell'applicazione all'avvio, imposta l'ID applicazione/client Discord dal Developer Portal così l'avvio può saltare quella chiamata REST. Usa channels.discord.applicationId per l'account predefinito, oppure channels.discord.accounts.<accountId>.applicationId quando esegui più bot Discord.

  • Configura OpenClaw e associa

    Chiedi al tuo agente

    Chatta con il tuo agente OpenClaw su qualsiasi canale esistente (ad esempio Telegram) e comunicaglielo. Se Discord è il tuo primo canale, usa invece la scheda CLI / config.

    "Ho già impostato il token del mio bot Discord nella configurazione. Completa la configurazione di Discord con User ID <user_id> e Server ID <server_id>."

    CLI / config

    Se preferisci una configurazione basata su file, imposta:

    {
    channels: {
    discord: {
    enabled: true,
    token: {
    source: "env",
    provider: "default",
    id: "DISCORD_BOT_TOKEN",
    },
    },
    },
    }
    

    Fallback env per l'account predefinito:

    DISCORD_BOT_TOKEN=...
    

    Per configurazioni tramite script o remote, scrivi lo stesso blocco JSON5 con openclaw config patch --file ./discord.patch.json5 --dry-run e poi riesegui senza --dry-run. I valori token in testo normale sono supportati. Anche i valori SecretRef sono supportati per channels.discord.token tra provider env/file/exec. Consulta Gestione dei segreti.

    Per più bot Discord, mantieni ogni token bot e ID applicazione nel relativo account. Un channels.discord.applicationId di livello superiore viene ereditato dagli account, quindi impostalo lì solo quando ogni account deve usare lo stesso ID applicazione.

    {
    channels: {
    discord: {
    enabled: true,
    accounts: {
    personal: {
      token: { source: "env", provider: "default", id: "DISCORD_PERSONAL_TOKEN" },
      applicationId: "111111111111111111",
    },
    work: {
      token: { source: "env", provider: "default", id: "DISCORD_WORK_TOKEN" },
      applicationId: "222222222222222222",
    },
    },
    },
    },
    }
    
  • Approva la prima associazione DM

    Attendi che il gateway sia in esecuzione, quindi invia un DM al bot in Discord. Risponderà con un codice di associazione.

    Chiedi al tuo agente

    Invia il codice di associazione al tuo agente sul canale esistente:

    "Approva questo codice di associazione Discord: &lt;CODE&gt;"

    CLI

    openclaw pairing list discord
    openclaw pairing approve discord &lt;CODE&gt;
    

    I codici di associazione scadono dopo 1 ora.

    Ora dovresti poter chattare con il tuo agente in Discord tramite DM.

  • Consigliato: configura uno spazio di lavoro di gilda

    Una volta che i DM funzionano, puoi configurare il tuo server Discord come spazio di lavoro completo in cui ogni canale ottiene la propria sessione agente con il proprio contesto. Questo è consigliato per server privati in cui ci siete solo tu e il tuo bot.

  • Aggiungi il tuo server alla allowlist di gilda

    Questo consente al tuo agente di rispondere in qualsiasi canale del tuo server, non solo nei DM.

    Chiedi al tuo agente

    "Aggiungi il mio Discord Server ID <server_id> alla allowlist di gilda"

    Config

    {
    channels: {
    discord: {
    groupPolicy: "allowlist",
    guilds: {
    YOUR_SERVER_ID: {
      requireMention: true,
      users: ["YOUR_USER_ID"],
    },
    },
    },
    },
    }
    
  • Consenti risposte senza @mention

    Per impostazione predefinita, il tuo agente risponde nei canali di gilda solo quando viene @menzionato. Per un server privato, probabilmente vuoi che risponda a ogni messaggio.

    Nei canali di gilda, le normali risposte finali dell'assistente restano private per impostazione predefinita. L'output visibile di Discord deve essere inviato esplicitamente con lo strumento message, così l'agente può restare in ascolto per impostazione predefinita e pubblicare solo quando decide che una risposta nel canale è utile.

    Questo significa che il modello selezionato deve chiamare gli strumenti in modo affidabile. Se Discord mostra la digitazione e i log mostrano uso di token ma nessun messaggio pubblicato, controlla il log della sessione per testo dell'assistente con didSendViaMessagingTool: false. Questo significa che il modello ha prodotto una risposta finale privata invece di chiamare message(action=send). Passa a un modello più forte nella chiamata degli strumenti, oppure usa la configurazione sotto per ripristinare le risposte finali automatiche legacy.

    Chiedi al tuo agente

    "Consenti al mio agente di rispondere su questo server senza dover essere @menzionato"

    Config

    Imposta requireMention: false nella configurazione della gilda:

    {
    channels: {
    discord: {
    guilds: {
    YOUR_SERVER_ID: {
      requireMention: false,
    },
    },
    },
    },
    }
    

    Per ripristinare le risposte finali automatiche legacy per stanze di gruppo/canale, imposta messages.groupChat.visibleReplies: "automatic".

  • Pianifica la memoria nei canali di gilda

    Per impostazione predefinita, la memoria a lungo termine (MEMORY.md) viene caricata solo nelle sessioni DM. I canali di gilda non caricano automaticamente MEMORY.md.

    Chiedi al tuo agente

    "Quando faccio domande nei canali Discord, usa memory_search o memory_get se ti serve contesto a lungo termine da MEMORY.md."

    Manuale

    Se ti serve contesto condiviso in ogni canale, inserisci le istruzioni stabili in AGENTS.md o USER.md (vengono iniettate in ogni sessione). Mantieni le note a lungo termine in MEMORY.md e accedi a esse su richiesta con gli strumenti di memoria.

  • Ora crea alcuni canali sul tuo server Discord e inizia a chattare. Il tuo agente può vedere il nome del canale e ogni canale ottiene la propria sessione isolata, quindi puoi configurare #coding, #home, #research o qualunque cosa si adatti al tuo flusso di lavoro.

    Modello runtime

    • Gateway possiede la connessione Discord.
    • L'instradamento delle risposte è deterministico: le risposte in ingresso da Discord tornano a Discord.
    • I metadati di guild/canale Discord vengono aggiunti al prompt del modello come contesto non attendibile, non come prefisso della risposta visibile all'utente. Se un modello copia di nuovo quell'involucro, OpenClaw rimuove i metadati copiati dalle risposte in uscita e dal contesto di replay futuro.
    • Per impostazione predefinita (session.dmScope=main), le chat dirette condividono la sessione principale dell'agente (agent:main:main).
    • I canali di guild sono chiavi di sessione isolate (agent:<agentId>:discord:channel:<channelId>).
    • I DM 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 mantenendo CommandTargetSessionKey verso la sessione di conversazione instradata.
    • La consegna di annunci cron/Heartbeat solo testuali a Discord usa una sola volta la risposta finale visibile all'assistente. I payload multimediali e dei componenti strutturati rimangono multi-messaggio quando l'agente emette più payload consegnabili.

    Canali forum

    I canali forum e media di Discord accettano solo post nei thread. OpenClaw supporta due modi per crearli:

    • Invia un messaggio al forum padre (channel:<forumId>) per creare automaticamente un thread. Il titolo del thread usa la prima riga non vuota del tuo messaggio.
    • Usa openclaw message thread create per creare direttamente un thread. Non passare --message-id per i canali forum.

    Esempio: invia al forum padre per creare un thread

    openclaw message send --channel discord --target channel:<forumId> \
      --message "Topic title\nBody of the post"
    

    Esempio: crea esplicitamente un thread forum

    openclaw message thread create --channel discord --target channel:<forumId> \
      --thread-name "Topic title" --message "Body of the post"
    

    I forum padre non accettano componenti Discord. Se hai bisogno di componenti, invia al thread stesso (channel:<threadId>).

    Componenti interattivi

    OpenClaw supporta i contenitori di componenti v2 di Discord per i messaggi degli agenti. Usa lo strumento messaggio con un payload components. I risultati delle interazioni vengono instradati di nuovo all'agente come normali messaggi in ingresso e seguono le impostazioni Discord replyToMode esistenti.

    Blocchi supportati:

    • text, section, separator, actions, media-gallery, file
    • Le righe di azioni consentono fino a 5 pulsanti o un singolo menu di selezione
    • Tipi di selezione: string, user, role, mentionable, channel

    Per impostazione predefinita, i componenti sono monouso. Imposta components.reusable=true per consentire a pulsanti, selezioni e moduli di essere usati più volte finché non scadono.

    Per limitare chi può fare clic su un pulsante, imposta allowedUsers su quel pulsante (ID utente Discord, tag o *). Quando configurato, gli utenti non corrispondenti ricevono un rifiuto effimero.

    I comandi slash /model e /models aprono un selettore di modelli interattivo con menu a discesa per provider, modello e runtime compatibile, più un passaggio di invio. /models add è deprecato e ora 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 invocata.

    Allegati di file:

    • I blocchi file devono puntare a un riferimento di allegato (attachment://<filename>)
    • Fornisci l'allegato tramite media/path/filePath (file singolo); usa media-gallery per più file
    • Usa filename per sovrascrivere il nome di caricamento quando deve corrispondere al riferimento dell'allegato

    Moduli modali:

    • Aggiungi components.modal con un massimo di 5 campi
    • Tipi di campo: text, checkbox, radio, select, role-select, user-select
    • OpenClaw aggiunge automaticamente un pulsante di attivazione

    Esempio:

    {
      channel: "discord",
      action: "send",
      to: "channel:123456789012345678",
      message: "Optional fallback text",
      components: {
        reusable: true,
        text: "Choose a path",
        blocks: [
          {
            type: "actions",
            buttons: [
              {
                label: "Approve",
                style: "success",
                allowedUsers: ["123456789012345678"],
              },
              { label: "Decline", style: "danger" },
            ],
          },
          {
            type: "actions",
            select: {
              type: "string",
              placeholder: "Pick an option",
              options: [
                { label: "Option A", value: "a" },
                { label: "Option B", value: "b" },
              ],
            },
          },
        ],
        modal: {
          title: "Details",
          triggerLabel: "Open form",
          fields: [
            { type: "text", label: "Requester" },
            {
              type: "select",
              label: "Priority",
              options: [
                { label: "Low", value: "low" },
                { label: "High", value: "high" },
              ],
            },
          ],
        },
      },
    }
    

    Controllo degli accessi e instradamento

    Criterio DM

    channels.discord.dmPolicy controlla l'accesso ai DM. channels.discord.allowFrom è l'allowlist canonica per i DM.

    • pairing (predefinito)
    • allowlist
    • open (richiede che channels.discord.allowFrom includa "*")
    • disabled

    Se il criterio DM non è aperto, gli utenti sconosciuti vengono bloccati (o viene richiesto loro l'abbinamento in modalità pairing).

    Precedenza multi-account:

    • channels.discord.accounts.default.allowFrom si applica solo all'account default.
    • Per un account, allowFrom ha precedenza su dm.allowFrom legacy.
    • Gli account denominati ereditano channels.discord.allowFrom quando il proprio allowFrom e il dm.allowFrom legacy non sono impostati.
    • Gli account denominati non ereditano channels.discord.accounts.default.allowFrom.

    I campi legacy 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 del target DM per la consegna:

    • user:<id>
    • menzione <@id>

    Gli ID numerici semplici normalmente vengono risolti come ID canale quando è attivo un predefinito di canale, ma gli ID elencati nel DM effettivo allowFrom dell'account vengono trattati come target DM utente per compatibilità.

    Gruppi di accesso DM

    I DM Discord possono usare voci dinamiche accessGroup:<name> in channels.discord.allowFrom.

    I nomi dei gruppi di accesso sono condivisi tra i canali di messaggistica. Usa type: "message.senders" per un gruppo statico i cui membri sono espressi nella normale sintassi allowFrom di ciascun canale, oppure type: "discord.channelAudience" quando l'audience ViewChannel corrente di un canale Discord deve definire dinamicamente l'appartenenza. Il comportamento condiviso dei gruppi di accesso è documentato qui: Gruppi di accesso.

    {
    accessGroups: {
    operators: {
      type: "message.senders",
      members: {
        "*": ["global-owner-id"],
        discord: ["discord:123456789012345678"],
        telegram: ["987654321"],
      },
    },
    },
    channels: {
    discord: {
      dmPolicy: "allowlist",
      allowFrom: ["accessGroup:operators"],
    },
    },
    }
    

    Un canale testuale Discord non ha un elenco membri separato. type: "discord.channelAudience" modella l'appartenenza così: il mittente del DM è membro della guild configurata e dispone attualmente del permesso effettivo ViewChannel sul canale configurato dopo l'applicazione dei ruoli e delle sovrascritture del canale.

    Esempio: consenti a chiunque possa vedere #maintainers di inviare DM al bot, mantenendo i DM chiusi per tutti gli altri.

    {
    accessGroups: {
    maintainers: {
      type: "discord.channelAudience",
      guildId: "1456350064065904867",
      channelId: "1456744319972282449",
      membership: "canViewChannel",
    },
    },
    channels: {
    discord: {
      dmPolicy: "allowlist",
      allowFrom: ["accessGroup:maintainers"],
    },
    },
    }
    

    Puoi combinare voci dinamiche e statiche:

    {
    accessGroups: {
    maintainers: {
      type: "discord.channelAudience",
      guildId: "1456350064065904867",
      channelId: "1456744319972282449",
    },
    },
    channels: {
    discord: {
      dmPolicy: "allowlist",
      allowFrom: ["accessGroup:maintainers", "discord:123456789012345678"],
    },
    },
    }
    

    Le ricerche falliscono in modo chiuso. Se Discord restituisce Missing Access, la ricerca del membro fallisce, oppure il canale appartiene a una guild diversa, il mittente del DM viene trattato come non autorizzato.

    Abilita Server Members Intent nel Discord Developer Portal per il bot quando usi gruppi di accesso basati sull'audience del canale. I DM non includono lo stato di membro della guild, quindi OpenClaw risolve il membro tramite Discord REST al momento dell'autorizzazione.

    Criterio guild

    La gestione delle guild è controllata da channels.discord.groupPolicy:

    • open
    • allowlist
    • disabled

    La baseline sicura quando esiste channels.discord è allowlist.

    Comportamento di allowlist:

    • la guild deve corrispondere a channels.discord.guilds (id preferito, slug accettato)
    • allowlist facoltative dei mittenti: users (ID stabili consigliati) e roles (solo ID ruolo); se una delle due è configurata, i mittenti sono consentiti quando corrispondono a users O roles
    • la corrispondenza diretta per nome/tag è disabilitata per impostazione predefinita; abilita channels.discord.dangerouslyAllowNameMatching: true solo come modalità di compatibilità di emergenza
    • nomi/tag sono supportati per users, ma gli ID sono più sicuri; openclaw security audit avvisa quando vengono usate voci nome/tag
    • se una guild ha channels configurato, i canali non elencati vengono negati
    • se una guild non ha un blocco channels, tutti i canali in quella guild in allowlist sono consentiti

    Esempio:

    {
    channels: {
    discord: {
      groupPolicy: "allowlist",
      guilds: {
        "123456789012345678": {
          requireMention: true,
          ignoreOtherMentions: true,
          users: ["987654321098765432"],
          roles: ["123456789012345678"],
          channels: {
            general: { allow: true },
            help: { allow: true, requireMention: true },
          },
        },
      },
    },
    },
    }
    

    Se imposti solo DISCORD_BOT_TOKEN e non crei un blocco channels.discord, il fallback runtime è groupPolicy="allowlist" (con un avviso nei log), anche se channels.defaults.groupPolicy è open.

    Menzioni e DM di gruppo

    I messaggi di guild sono filtrati per menzione per impostazione predefinita.

    Il rilevamento delle menzioni include:

    • menzione esplicita del bot
    • pattern di menzione configurati (agents.list[].groupChat.mentionPatterns, fallback messages.groupChat.mentionPatterns)
    • comportamento implicito di risposta al bot nei casi supportati

    Quando scrivi messaggi Discord in uscita, usa la sintassi di menzione canonica: <@USER_ID> per gli utenti, <#CHANNEL_ID> per i canali e <@&ROLE_ID> per i ruoli. Non usare la forma legacy di menzione del nickname <@!USER_ID>.

    requireMention è configurato per guild/canale (channels.discord.guilds...). ignoreOtherMentions facoltativamente elimina i messaggi che menzionano un altro utente/ruolo ma non il bot (esclusi @everyone/@here).

    DM di gruppo:

    • predefinito: ignorati (dm.groupEnabled=false)
    • allowlist facoltativa tramite dm.groupChannels (ID canale o slug)

    Instradamento degli agenti basato sui ruoli

    Usa bindings[].match.roles per instradare i membri di guild Discord verso agenti diversi in base all'ID ruolo. I binding basati sui ruoli accettano solo ID ruolo e vengono valutati dopo i binding peer o parent-peer e prima dei binding solo guild. Se un binding imposta anche altri campi di corrispondenza (per esempio peer + guildId + roles), tutti i campi configurati devono corrispondere.

    {
      bindings: [
        {
          agentId: "opus",
          match: {
            channel: "discord",
            guildId: "123456789012345678",
            roles: ["111111111111111111"],
          },
        },
        {
          agentId: "sonnet",
          match: {
            channel: "discord",
            guildId: "123456789012345678",
          },
        },
      ],
    }
    

    Comandi nativi e autorizzazione dei comandi

    • commands.native usa per impostazione predefinita "auto" ed è abilitato per Discord.
    • Override per canale: channels.discord.commands.native.
    • commands.native=false salta 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 li rimuovi dall'app Discord.
    • L'autenticazione dei comandi nativi usa le stesse allowlist/policy di Discord della normale gestione dei messaggi.
    • I comandi potrebbero comunque essere visibili nella UI di Discord per gli utenti non autorizzati; l'esecuzione applica comunque l'autenticazione di OpenClaw e restituisce "non autorizzato".

    Consulta Comandi slash per il catalogo e il comportamento dei comandi.

    Impostazioni predefinite dei comandi slash:

    • ephemeral: true

    Dettagli della funzionalità

    Tag di risposta e risposte native

    Discord supporta i tag di risposta nell'output dell'agente:

    • [[reply_to_current]]
    • [[reply_to:<id>]]

    Controllati da channels.discord.replyToMode:

    • off (predefinito)
    • first
    • all
    • batched

    Nota: off disabilita il threading implicito delle risposte. I tag espliciti [[reply_to_*]] vengono comunque rispettati. first collega sempre il riferimento implicito alla risposta nativa al primo messaggio Discord in uscita per il turno. batched collega il riferimento implicito alla risposta nativa di Discord solo quando il turno in ingresso era un batch con debounce di più messaggi. Questo è utile quando vuoi risposte native principalmente per chat ambigue con messaggi a raffica, non per ogni turno con un singolo messaggio.

    Gli ID dei messaggi sono esposti nel contesto/nella cronologia, così gli agenti possono indirizzare messaggi specifici.

    Anteprima dello stream live

    OpenClaw può trasmettere risposte bozza inviando un messaggio temporaneo e modificandolo man mano che arriva il testo. channels.discord.streaming accetta off | partial | block | progress (predefinito). progress mantiene una bozza di stato modificabile e la aggiorna con l'avanzamento degli strumenti fino alla consegna finale; streamMode è un alias runtime legacy. Esegui openclaw doctor --fix per riscrivere la configurazione persistente usando la chiave canonica.

    Imposta channels.discord.streaming.mode su off per disabilitare le modifiche dell'anteprima di Discord. Se lo streaming a blocchi di Discord è abilitato esplicitamente, OpenClaw salta lo stream di anteprima per evitare il doppio streaming.

    {
    channels: {
    discord: {
      streaming: {
        mode: "progress",
        progress: {
          label: "auto",
          maxLines: 8,
          toolProgress: true,
        },
      },
    },
    },
    }
    
    • partial modifica un singolo messaggio di anteprima man mano che arrivano i token.
    • block emette blocchi di dimensione bozza (usa draftChunk per regolare dimensioni e punti di interruzione, limitati a textChunkLimit).
    • Finali con media, errore e risposta esplicita annullano le modifiche di anteprima in sospeso.
    • streaming.preview.toolProgress (predefinito true) controlla se gli aggiornamenti di strumento/avanzamento riutilizzano il messaggio di anteprima.
    • streaming.preview.commandText / streaming.progress.commandText controlla il dettaglio di comando/esecuzione nelle righe di avanzamento compatte: raw (predefinito) o status (solo etichetta dello strumento).

    Nascondi il testo grezzo di comando/esecuzione mantenendo le righe di avanzamento compatte:

    {
      "channels": {
        "discord": {
          "streaming": {
            "mode": "progress",
            "progress": {
              "toolProgress": true,
              "commandText": "status"
            }
          }
        }
      }
    }
    

    Lo streaming di anteprima è solo testo; le risposte con media tornano alla consegna normale. Quando lo streaming block è abilitato esplicitamente, OpenClaw salta lo stream di anteprima per evitare il doppio streaming.

    Cronologia, contesto e comportamento dei thread

    Contesto della cronologia della guild:

    • valore predefinito di channels.discord.historyLimit: 20
    • fallback: messages.groupChat.historyLimit
    • 0 disabilita

    Controlli della cronologia DM:

    • channels.discord.dmHistoryLimit
    • channels.discord.dms["<user_id>"].historyLimit

    Comportamento dei thread:

    • I thread Discord vengono instradati come sessioni di canale ed ereditano la configurazione del canale padre, salvo override.
    • Le sessioni dei thread ereditano la selezione /model a livello di sessione del canale padre come fallback solo per il modello; le selezioni /model locali al thread hanno comunque la precedenza e la cronologia della trascrizione del padre non viene copiata a meno che l'ereditarietà della trascrizione non sia abilitata.
    • channels.discord.thread.inheritParent (predefinito false) fa sì che i nuovi auto-thread vengano inizializzati dalla trascrizione padre. Gli override per account si trovano in channels.discord.accounts.<id>.thread.inheritParent.
    • Le reazioni dello strumento messaggi possono risolvere destinazioni DM user:<id>.
    • guilds.<guild>.channels.<channel>.requireMention: false viene preservato durante il fallback di attivazione nella fase di risposta.

    Gli argomenti dei canali vengono iniettati come contesto non attendibile. Le allowlist regolano chi può attivare l'agente, non costituiscono un confine completo di redazione del contesto supplementare.

    Sessioni associate a thread per i subagent

    Discord può associare un thread a un target di sessione, così i messaggi successivi in quel thread continuano a essere instradati alla stessa sessione (incluse le sessioni dei subagent).

    Comandi:

    • /focus <target> associa il thread corrente/nuovo a un target di subagent/sessione
    • /unfocus rimuove l'associazione del thread corrente
    • /agents mostra le esecuzioni attive e lo stato dell'associazione
    • /session idle <duration|off> ispeziona/aggiorna l'auto-unfocus per inattività per le associazioni focalizzate
    • /session max-age <duration|off> ispeziona/aggiorna l'età massima rigida per le associazioni focalizzate

    Configurazione:

    {
    session: {
    threadBindings: {
      enabled: true,
      idleHours: 24,
      maxAgeHours: 0,
    },
    },
    channels: {
    discord: {
      threadBindings: {
        enabled: true,
        idleHours: 24,
        maxAgeHours: 0,
        spawnSessions: true,
        defaultSpawnContext: "fork",
      },
    },
    },
    }
    

    Note:

    • session.threadBindings.* imposta i valori predefiniti globali.
    • channels.discord.threadBindings.* sovrascrive il comportamento di Discord.
    • spawnSessions controlla la creazione/associazione automatica dei thread per sessions_spawn({ thread: true }) e gli spawn di thread ACP. Predefinito: true.
    • defaultSpawnContext controlla il contesto nativo del subagent per gli spawn associati a thread. Predefinito: "fork".
    • Le chiavi deprecate spawnSubagentSessions/spawnAcpSessions vengono migrate da openclaw doctor --fix.
    • Se le associazioni dei thread sono disabilitate per un account, /focus e le operazioni correlate di associazione dei thread non sono disponibili.

    Consulta Sub-agent, Agenti ACP e Riferimento di configurazione.

    Associazioni persistenti dei canali ACP

    Per workspace ACP stabili e "sempre attivi", configura associazioni ACP tipizzate di primo livello che puntano a conversazioni Discord.

    Percorso di configurazione:

    • bindings[] con type: "acp" e match.channel: "discord"

    Esempio:

    {
    agents: {
    list: [
      {
        id: "codex",
        runtime: {
          type: "acp",
          acp: {
            agent: "codex",
            backend: "acpx",
            mode: "persistent",
            cwd: "/workspace/openclaw",
          },
        },
      },
    ],
    },
    bindings: [
    {
      type: "acp",
      agentId: "codex",
      match: {
        channel: "discord",
        accountId: "default",
        peer: { kind: "channel", id: "222222222222222222" },
      },
      acp: { label: "codex-main" },
    },
    ],
    channels: {
    discord: {
      guilds: {
        "111111111111111111": {
          channels: {
            "222222222222222222": {
              requireMention: false,
            },
          },
        },
      },
    },
    },
    }
    

    Note:

    • /acp spawn codex --bind here associa il canale o thread corrente sul posto e mantiene i messaggi futuri sulla stessa sessione ACP. I messaggi del thread ereditano l'associazione del canale padre.
    • In un canale o thread associato, /new e /reset reimpostano sul posto la stessa sessione ACP. Le associazioni temporanee dei thread possono sovrascrivere la risoluzione del target mentre sono attive.
    • spawnSessions regola la creazione/associazione dei thread figli tramite --thread auto|here.

    Consulta Agenti ACP per i dettagli sul comportamento delle associazioni.

    Notifiche di reazione

    Modalità di notifica delle reazioni per guild:

    • off
    • own (predefinito)
    • all
    • allowlist (usa guilds.<id>.users)

    Gli eventi di reazione vengono trasformati in eventi di sistema e allegati alla sessione Discord instradata.

    Reazioni di conferma

    ackReaction invia un'emoji di conferma mentre OpenClaw sta elaborando un messaggio in ingresso.

    Ordine di risoluzione:

    • channels.discord.accounts.<accountId>.ackReaction
    • channels.discord.ackReaction
    • messages.ackReaction
    • fallback emoji dell'identità dell'agente (agents.list[].identity.emoji, altrimenti "👀")

    Note:

    • Discord accetta emoji unicode o nomi di emoji personalizzate.
    • Usa "" per disabilitare la reazione per un canale o account.
    Scritture di configurazione

    Le scritture di configurazione avviate dal canale sono abilitate per impostazione predefinita.

    Questo influisce sui flussi /config set|unset (quando le funzionalità dei comandi sono abilitate).

    Disabilita:

    {
    channels: {
    discord: {
      configWrites: false,
    },
    },
    }
    
    Proxy del Gateway

    Instrada il traffico WebSocket del Gateway Discord e le ricerche REST di avvio (ID applicazione + risoluzione allowlist) tramite un proxy HTTP(S) con channels.discord.proxy.

    {
    channels: {
    discord: {
      proxy: "http://proxy.example:8080",
    },
    },
    }
    

    Override per account:

    {
    channels: {
    discord: {
      accounts: {
        primary: {
          proxy: "http://proxy.example:8080",
        },
      },
    },
    },
    }
    
    Supporto PluralKit

    Abilita la risoluzione PluralKit per mappare i messaggi proxati all'identità del membro di sistema:

    {
    channels: {
    discord: {
      pluralkit: {
        enabled: true,
        token: "pk_live_...", // optional; needed for private systems
      },
    },
    },
    }
    

    Note:

    • le allowlist possono usare pk:<memberId>
    • i nomi visualizzati dei membri vengono confrontati per nome/slug solo quando channels.discord.dangerouslyAllowNameMatching: true
    • le ricerche usano l'ID del messaggio originale e sono limitate da una finestra temporale
    • se la ricerca non riesce, i messaggi proxati vengono trattati come messaggi bot e scartati a meno che allowBots=true
    Alias di menzione in uscita

    Usa mentionAliases quando gli agenti hanno bisogno 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 code span Markdown restano invariati.

    {
    channels: {
    discord: {
      mentionAliases: {
        Vladislava: "123456789012345678",
      },
      accounts: {
        ops: {
          mentionAliases: {
            OpsLead: "234567890123456789",
          },
        },
      },
    },
    },
    }
    
    Configurazione della presenza

    Gli aggiornamenti della presenza vengono applicati quando imposti un campo di stato o attività, oppure quando abiliti la presenza automatica.

    Esempio solo stato:

    {
    channels: {
    discord: {
      status: "idle",
    },
    },
    }
    

    Esempio di attività (lo stato personalizzato è il tipo di attività predefinito):

    {
    channels: {
    discord: {
      activity: "Focus time",
      activityType: 4,
    },
    },
    }
    

    Esempio di streaming:

    {
    channels: {
    discord: {
      activity: "Live coding",
      activityType: 1,
      activityUrl: "https://twitch.tv/openclaw",
    },
    },
    }
    

    Mappa dei tipi di attività:

    • 0: Playing
    • 1: Streaming (richiede activityUrl)
    • 2: Listening
    • 3: Watching
    • 4: Custom (usa il testo dell'attività come stato; l'emoji è facoltativa)
    • 5: Competing

    Esempio di presenza automatica (segnale di salute del runtime):

    {
    channels: {
    discord: {
      autoPresence: {
        enabled: true,
        intervalMs: 30000,
        minUpdateIntervalMs: 15000,
        exhaustedText: "token exhausted",
      },
    },
    },
    }
    

    La presenza automatica mappa la disponibilità runtime allo stato Discord: healthy => online, degraded o unknown => idle, exhausted o unavailable => dnd. Override di testo facoltativi:

    • autoPresence.healthyText
    • autoPresence.degradedText
    • autoPresence.exhaustedText (supporta il segnaposto {reason})
    Approvals in Discord

    Discord supporta la gestione delle approvazioni basata su pulsanti nei DM e può facoltativamente pubblicare prompt di approvazione nel canale di origine.

    Percorso di configurazione:

    • channels.discord.execApprovals.enabled
    • channels.discord.execApprovals.approvers (facoltativo; ricorre a commands.ownerAllowFrom quando possibile)
    • channels.discord.execApprovals.target (dm | channel | both, predefinito: dm)
    • agentFilter, sessionFilter, cleanupAfterResolve

    Discord abilita automaticamente le approvazioni exec native quando enabled non è impostato o è "auto" e almeno un approvatore può essere risolto, da execApprovals.approvers o da commands.ownerAllowFrom. Discord non deduce gli approvatori exec da allowFrom del canale, dal legacy dm.allowFrom o dal defaultTo dei messaggi diretti. Imposta enabled: false per disabilitare esplicitamente Discord come client di approvazione nativo.

    Per comandi di gruppo sensibili riservati agli owner, come /diagnostics e /export-trajectory, OpenClaw invia privatamente i prompt di approvazione e i risultati finali. Prova prima il DM Discord quando l'owner che invoca il comando dispone di una route owner Discord; se non è disponibile, ricorre alla prima route owner disponibile da commands.ownerAllowFrom, come Telegram.

    Quando target è channel o both, il prompt di approvazione è visibile nel canale. Solo gli approvatori risolti possono usare i pulsanti; gli altri utenti ricevono un diniego effimero. I prompt di approvazione includono il testo del comando, quindi abilita la consegna nel canale solo in canali attendibili. Se l'ID del canale non può essere derivato dalla chiave di sessione, OpenClaw ricorre alla consegna tramite DM.

    Discord renderizza anche i pulsanti di approvazione condivisi usati da altri canali di chat. L'adapter Discord nativo aggiunge principalmente il routing DM degli approvatori e il fanout sul canale. Quando questi pulsanti sono presenti, sono la UX di approvazione principale; OpenClaw dovrebbe includere un comando manuale /approve solo quando il risultato dello strumento indica che le approvazioni in chat non sono disponibili o che l'approvazione manuale è l'unico percorso. Se il runtime di approvazione nativo Discord non è attivo, OpenClaw mantiene visibile il prompt locale deterministico /approve <id> <decision>. Se il runtime è attivo ma una scheda nativa non può essere consegnata a nessun target, OpenClaw invia un avviso di fallback nella stessa chat con il comando /approve esatto dall'approvazione in sospeso.

    L'autenticazione Gateway e la risoluzione delle approvazioni seguono il contratto client Gateway condiviso (gli ID plugin: si risolvono tramite plugin.approval.resolve; gli altri ID tramite exec.approval.resolve). Le approvazioni scadono dopo 30 minuti per impostazione predefinita.

    Vedi Approvazioni exec.

    Strumenti e gate delle azioni

    Le azioni dei messaggi Discord includono azioni di 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

    L'azione event-create accetta un parametro facoltativo image (URL o percorso di file locale) per impostare l'immagine di copertina dell'evento pianificato.

    I gate delle azioni si trovano in channels.discord.actions.*.

    Comportamento predefinito dei gate:

    Gruppo di azioni Predefinito
    reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions abilitato
    roles disabilitato
    moderation disabilitato
    presence disabilitato

    UI Components v2

    OpenClaw usa i componenti Discord v2 per le approvazioni exec e i marker cross-context. Le azioni dei messaggi Discord possono anche accettare components per UI personalizzate (avanzato; richiede la costruzione di un payload componente tramite lo strumento discord), mentre i legacy embeds restano disponibili ma non sono consigliati.

    • channels.discord.ui.components.accentColor imposta il colore di accento usato dai contenitori dei componenti Discord (esadecimale).
    • Impostalo per account con channels.discord.accounts.<id>.ui.components.accentColor.
    • embeds vengono ignorati quando sono presenti componenti v2.

    Esempio:

    {
      channels: {
        discord: {
          ui: {
            components: {
              accentColor: "#5865F2",
            },
          },
        },
      },
    }
    

    Voce

    Discord ha due superfici vocali distinte: canali vocali in tempo reale (conversazioni continue) e allegati di messaggi vocali (il formato di anteprima con forma d'onda). Il Gateway supporta entrambe.

    Canali vocali

    Checklist di configurazione:

    1. Abilita Message Content Intent nel Discord Developer Portal.
    2. Abilita Server Members Intent quando vengono usate allowlist di ruoli/utenti.
    3. Invita il bot con gli scope bot e applications.commands.
    4. Concedi Connect, Speak, Send Messages e Read Message History nel canale vocale target.
    5. Abilita i comandi nativi (commands.native o channels.discord.commands.native).
    6. Configura channels.discord.voice.

    Usa /vc join|leave|status per controllare le sessioni. Il comando usa l'agente predefinito dell'account e segue le stesse regole di allowlist e policy di gruppo degli altri comandi Discord.

    /vc join channel:<voice-channel-id>
    /vc status
    /vc leave
    

    Esempio di auto-join:

    {
      channels: {
        discord: {
          voice: {
            enabled: true,
            model: "openai/gpt-5.4-mini",
            autoJoin: [
              {
                guildId: "123456789012345678",
                channelId: "234567890123456789",
              },
            ],
            daveEncryption: true,
            decryptionFailureTolerance: 24,
            connectTimeoutMs: 30000,
            reconnectGraceMs: 15000,
            tts: {
              provider: "openai",
              openai: { voice: "onyx" },
            },
          },
        },
      },
    }
    

    Note:

    • voice.tts sovrascrive messages.tts solo per la riproduzione vocale.
    • voice.model sovrascrive l'LLM usato solo per le risposte nei canali vocali Discord. Lascialo non impostato per ereditare il modello dell'agente instradato.
    • STT usa tools.media.audio; voice.model non influisce sulla trascrizione.
    • Gli override Discord systemPrompt per canale si applicano ai turni di trascrizione vocale per quel canale vocale.
    • I turni di trascrizione vocale derivano lo stato owner da allowFrom di Discord (o dm.allowFrom); gli speaker non owner non possono accedere agli strumenti riservati agli owner (per esempio gateway e cron).
    • La voce Discord è opt-in per configurazioni solo testo; imposta channels.discord.voice.enabled=true (o mantieni un blocco channels.discord.voice esistente) per abilitare i comandi /vc, il runtime vocale e l'intent Gateway GuildVoiceStates.
    • channels.discord.intents.voiceStates può sovrascrivere esplicitamente la sottoscrizione all'intent dello stato vocale. Lascialo non impostato perché l'intent segua l'abilitazione vocale effettiva.
    • voice.daveEncryption e voice.decryptionFailureTolerance vengono passati alle opzioni di join di @discordjs/voice.
    • I valori predefiniti di @discordjs/voice sono daveEncryption=true e decryptionFailureTolerance=24 se non impostati.
    • voice.connectTimeoutMs controlla l'attesa Ready iniziale di @discordjs/voice per /vc join e i tentativi di auto-join. Predefinito: 30000.
    • voice.reconnectGraceMs controlla per quanto tempo OpenClaw attende che una sessione vocale disconnessa inizi a riconnettersi prima di distruggerla. Predefinito: 15000.
    • OpenClaw monitora anche gli errori di decrittazione in ricezione e recupera automaticamente uscendo e rientrando nel canale vocale dopo errori ripetuti in una finestra breve.
    • Se i log di ricezione mostrano ripetutamente DecryptionFailed(UnencryptedWhenPassthroughDisabled) dopo l'aggiornamento, raccogli un report delle dipendenze e i log. La linea @discordjs/voice inclusa contiene la correzione upstream del padding dalla PR discord.js #11449, che ha chiuso l'issue discord.js #11419.

    Pipeline dei canali vocali:

    • La cattura PCM di Discord viene convertita in un file temporaneo WAV.
    • tools.media.audio gestisce STT, per esempio openai/gpt-4o-mini-transcribe.
    • La trascrizione viene inviata tramite l'ingress e il routing Discord mentre l'LLM di risposta viene eseguito con una policy di output vocale che nasconde lo strumento tts dell'agente e richiede testo restituito, perché la voce Discord possiede la riproduzione TTS finale.
    • voice.model, quando impostato, sovrascrive solo l'LLM di risposta per questo turno di canale vocale.
    • voice.tts viene unito sopra messages.tts; l'audio risultante viene riprodotto nel canale unito.

    Le credenziali vengono risolte per componente: autenticazione della route LLM per voice.model, autenticazione STT per tools.media.audio e autenticazione TTS per messages.tts/voice.tts.

    Messaggi vocali

    I messaggi vocali Discord mostrano un'anteprima con forma d'onda e richiedono audio OGG/Opus. OpenClaw genera automaticamente la forma d'onda, ma richiede ffmpeg e ffprobe sull'host Gateway per ispezionare e convertire.

    • Fornisci un percorso di file locale (gli URL vengono rifiutati).
    • Ometti il contenuto testuale (Discord rifiuta testo + messaggio vocale nello stesso payload).
    • È accettato qualsiasi formato audio; OpenClaw converte in OGG/Opus se necessario.
    message(action="send", channel="discord", target="channel:123", path="/path/to/audio.mp3", asVoice=true)
    

    Risoluzione dei problemi

    Used disallowed intents or bot sees no guild messages
    • 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
    • verifica groupPolicy
    • verifica l'allowlist della guild in channels.discord.guilds
    • se esiste la mappa channels della guild, sono consentiti solo i canali elencati
    • verifica il comportamento di requireMention e i pattern di menzione

    Controlli utili:

    openclaw doctor
    openclaw channels status --probe
    openclaw logs --follow
    
    Require mention false but still blocked

    Cause comuni:

    • groupPolicy="allowlist" senza allowlist di guild/canale corrispondente
    • requireMention configurato nel posto sbagliato (deve trovarsi in channels.discord.guilds o nella voce del canale)
    • mittente bloccato dall'allowlist users di guild/canale
    Long-running Discord turns or duplicate replies

    Log tipici:

    • Slow listener detected ...
    • stuck session: sessionKey=agent:...:discord:... state=processing ...

    Parametri della coda del gateway Discord:

    • account singolo: channels.discord.eventQueue.listenerTimeout
    • multi-account: channels.discord.accounts.<accountId>.eventQueue.listenerTimeout
    • questo controlla solo il lavoro del listener del gateway Discord, non la durata del turno dell'agente

    Discord non applica un timeout di proprietà del canale ai turni dell'agente in coda. I listener dei messaggi passano il lavoro immediatamente, e le esecuzioni Discord in coda preservano l'ordine per sessione finché il ciclo di vita di sessione/strumento/runtime completa o interrompe il lavoro.

    {
    channels: {
    discord: {
      accounts: {
        default: {
          eventQueue: {
            listenerTimeout: 120000,
          },
        },
      },
    },
    },
    }
    
    Avvisi di timeout della ricerca dei metadati del Gateway

    OpenClaw recupera i metadati Discord /gateway/bot prima di connettersi. Gli errori transitori ripiegano sull'URL gateway predefinito di Discord e vengono limitati nei log.

    Opzioni di timeout dei metadati:

    • account singolo: channels.discord.gatewayInfoTimeoutMs
    • più account: channels.discord.accounts.<accountId>.gatewayInfoTimeoutMs
    • fallback env quando la configurazione non è impostata: OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS
    • predefinito: 30000 (30 secondi), massimo: 120000
    Riavvii per timeout READY del Gateway

    OpenClaw attende l'evento READY del gateway Discord durante l'avvio e dopo le riconnessioni di runtime. Le configurazioni con più account e avvio scaglionato possono richiedere una finestra READY di avvio più lunga rispetto a quella predefinita.

    Opzioni di timeout READY:

    • avvio account singolo: channels.discord.gatewayReadyTimeoutMs
    • avvio più account: channels.discord.accounts.<accountId>.gatewayReadyTimeoutMs
    • fallback env di avvio quando la configurazione non è impostata: OPENCLAW_DISCORD_READY_TIMEOUT_MS
    • predefinito di avvio: 15000 (15 secondi), massimo: 120000
    • runtime account singolo: channels.discord.gatewayRuntimeReadyTimeoutMs
    • runtime più account: channels.discord.accounts.<accountId>.gatewayRuntimeReadyTimeoutMs
    • fallback env di runtime quando la configurazione non è impostata: OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS
    • predefinito di runtime: 30000 (30 secondi), massimo: 120000
    Disallineamenti nell'audit dei permessi

    I controlli dei permessi di channels status --probe funzionano solo per gli ID numerici dei canali.

    Se usi chiavi slug, la corrispondenza di runtime può comunque funzionare, ma il probe non può verificare completamente i permessi.

    Problemi di DM e abbinamento
    • DM disabilitati: channels.discord.dm.enabled=false
    • criterio DM disabilitato: channels.discord.dmPolicy="disabled" (legacy: channels.discord.dm.policy)
    • in attesa dell'approvazione dell'abbinamento in modalità pairing
    Loop da bot a bot

    Per impostazione predefinita, i messaggi scritti dai bot vengono ignorati.

    Se imposti channels.discord.allowBots=true, usa regole rigorose di menzione e allowlist per evitare comportamenti di loop. Preferisci channels.discord.allowBots="mentions" per accettare solo i messaggi dei bot che menzionano il bot.

    {
    channels: {
    discord: {
      accounts: {
        mantis: {
          // Mantis listens to other bots only when they mention her.
          allowBots: "mentions",
        },
        molty: {
          // Molty listens to all bot-authored Discord messages.
          allowBots: true,
          mentionAliases: {
            // Lets Molty write "@Mantis" and send a real Discord mention.
            Mantis: "MANTIS_DISCORD_USER_ID",
          },
        },
      },
    },
    },
    }
    
    Cadute STT vocali con DecryptionFailed(...)
    • mantieni OpenClaw aggiornato (openclaw update) in modo che sia presente la logica di recupero della ricezione vocale Discord
    • conferma channels.discord.voice.daveEncryption=true (predefinito)
    • parti da channels.discord.voice.decryptionFailureTolerance=24 (predefinito upstream) e regola solo se necessario
    • controlla nei log:
      • discord voice: DAVE decrypt failures detected
      • discord voice: repeated decrypt failures; attempting rejoin
    • se gli errori continuano dopo il rientro automatico, raccogli i log e confrontali con la cronologia upstream della ricezione DAVE in discord.js #11419 e discord.js #11449

    Riferimento di configurazione

    Riferimento principale: Riferimento di configurazione - Discord.

    Campi Discord ad alto segnale
    • avvio/autenticazione: enabled, token, accounts.*, allowBots
    • criterio: groupPolicy, dm.*, guilds.*, guilds.*.channels.*
    • comando: commands.native, commands.useAccessGroups, configWrites, slashCommand.*
    • coda eventi: eventQueue.listenerTimeout (budget del listener), eventQueue.maxQueueSize, eventQueue.maxConcurrency
    • Gateway: gatewayInfoTimeoutMs, gatewayReadyTimeoutMs, gatewayRuntimeReadyTimeoutMs
    • risposta/cronologia: replyToMode, historyLimit, dmHistoryLimit, dms.*.historyLimit
    • consegna: textChunkLimit, chunkMode, maxLinesPerMessage
    • streaming: streaming (alias legacy: streamMode), streaming.preview.toolProgress, draftChunk, blockStreaming, blockStreamingCoalesce
    • media/riprova: mediaMaxMb (limita gli upload Discord in uscita, predefinito 100MB), retry
    • azioni: actions.*
    • presenza: activity, status, activityType, activityUrl
    • UI: ui.components.accentColor
    • funzionalità: threadBindings, bindings[] di primo livello (type: "acp"), pluralkit, execApprovals, intents, agentComponents, heartbeat, responsePrefix

    Sicurezza e operazioni

    • Tratta i token dei bot come segreti (DISCORD_BOT_TOKEN preferito negli ambienti supervisionati).
    • Concedi i permessi Discord con privilegi minimi.
    • Se il deploy/lo stato dei comandi è obsoleto, riavvia il gateway e ricontrolla con openclaw channels status --probe.

    Correlati