diff --git a/docs/it/concepts/active-memory.md b/docs/it/concepts/active-memory.md index 1eaec973c..37145c090 100644 --- a/docs/it/concepts/active-memory.md +++ b/docs/it/concepts/active-memory.md @@ -2,35 +2,35 @@ read_when: - Vuoi capire a cosa serve Active Memory - Vuoi attivare Active Memory per un agente conversazionale - - Vuoi regolare il comportamento di Active Memory senza abilitarlo ovunque -summary: Un sotto-agente di memoria bloccante gestito dal Plugin che inserisce la memoria pertinente nelle sessioni di chat interattive + - Vuoi regolare il comportamento di Active Memory senza abilitarla ovunque +summary: Un sottoagente di memoria bloccante di proprietà del Plugin che inietta la memoria pertinente nelle sessioni di chat interattive title: Active Memory x-i18n: - generated_at: "2026-04-14T02:08:38Z" + generated_at: "2026-04-16T08:18:36Z" model: gpt-5.4 provider: openai - source_hash: b151e9eded7fc5c37e00da72d95b24c1dc94be22e855c8875f850538392b0637 + source_hash: ab36c5fea1578348cc2258ea3b344cc7bdc814f337d659cdb790512b3ea45473 source_path: concepts/active-memory.md workflow: 15 --- # Active Memory -Active Memory è un sotto-agente di memoria bloccante opzionale gestito dal Plugin che viene eseguito +Active Memory è un sottoagente di memoria bloccante opzionale di proprietà del Plugin che viene eseguito prima della risposta principale per le sessioni conversazionali idonee. Esiste perché la maggior parte dei sistemi di memoria è capace ma reattiva. Si affida all'agente principale per decidere quando cercare nella memoria, oppure all'utente per dire cose -come "ricorda questo" o "cerca nella memoria". A quel punto, il momento in cui la memoria -avrebbe reso la risposta naturale è già passato. +come "ricorda questo" o "cerca nella memoria". A quel punto, il momento in cui la memoria avrebbe +reso la risposta naturale è già passato. -Active Memory dà al sistema una possibilità delimitata di far emergere la memoria pertinente +Active Memory offre al sistema un'unica opportunità limitata di far emergere la memoria pertinente prima che venga generata la risposta principale. ## Incolla questo nel tuo agente -Incolla questo nel tuo agente se vuoi che abiliti Active Memory con una -configurazione autonoma e sicura per impostazione predefinita: +Incolla questo nel tuo agente se vuoi che abiliti Active Memory con una configurazione +autosufficiente e sicura per impostazione predefinita: ```json5 { @@ -56,9 +56,9 @@ configurazione autonoma e sicura per impostazione predefinita: } ``` -Questo attiva il plugin per l'agente `main`, lo mantiene limitato per impostazione predefinita alle sessioni -in stile messaggio diretto, gli consente prima di ereditare il modello della sessione corrente e -usa il modello di fallback configurato solo se non è disponibile alcun modello esplicito o ereditato. +Questo attiva il Plugin per l'agente `main`, lo mantiene limitato per impostazione predefinita alle +sessioni in stile messaggio diretto, gli consente prima di ereditare il modello della sessione corrente +e usa il modello di fallback configurato solo se non è disponibile alcun modello esplicito o ereditato. Dopo, riavvia il Gateway: @@ -73,11 +73,11 @@ Per ispezionarlo in tempo reale in una conversazione: /trace on ``` -## Attiva active memory +## Attiva Active Memory La configurazione più sicura è: -1. abilitare il plugin +1. abilitare il Plugin 2. scegliere come target un agente conversazionale 3. mantenere il logging attivo solo durante la regolazione @@ -114,23 +114,108 @@ openclaw gateway Cosa significa: -- `plugins.entries.active-memory.enabled: true` attiva il plugin -- `config.agents: ["main"]` abilita la active memory solo per l'agente `main` -- `config.allowedChatTypes: ["direct"]` mantiene la active memory attiva per impostazione predefinita solo per le sessioni in stile messaggio diretto -- se `config.model` non è impostato, la active memory eredita prima il modello della sessione corrente -- `config.modelFallback` fornisce facoltativamente il tuo provider/modello di fallback per il richiamo -- `config.promptStyle: "balanced"` usa lo stile di prompt generale predefinito per la modalità `recent` -- la active memory viene comunque eseguita solo su sessioni di chat interattive persistenti idonee +- `plugins.entries.active-memory.enabled: true` attiva il Plugin +- `config.agents: ["main"]` abilita Active Memory solo per l'agente `main` +- `config.allowedChatTypes: ["direct"]` mantiene Active Memory attivo per impostazione predefinita solo per le sessioni in stile messaggio diretto +- se `config.model` non è impostato, Active Memory eredita prima il modello della sessione corrente +- `config.modelFallback` fornisce facoltativamente il tuo provider/modello di fallback per il recupero +- `config.promptStyle: "balanced"` usa lo stile di prompt predefinito per uso generale per la modalità `recent` +- Active Memory viene comunque eseguito solo nelle sessioni di chat persistenti interattive idonee -## Come vederla +## Consigli sulla velocità -La active memory inserisce un prefisso di prompt nascosto non attendibile per il modello. Non +La configurazione più semplice è lasciare `config.model` non impostato e lasciare che Active Memory usi +lo stesso modello che già usi per le risposte normali. Questa è l'impostazione predefinita più sicura +perché segue le tue preferenze esistenti di provider, autenticazione e modello. + +Se vuoi che Active Memory sembri più veloce, usa un modello di inferenza dedicato +invece di riutilizzare il modello principale della chat. + +Esempio di configurazione con provider veloce: + +```json5 +models: { + providers: { + cerebras: { + baseUrl: "https://api.cerebras.ai/v1", + apiKey: "${CEREBRAS_API_KEY}", + api: "openai-completions", + models: [{ id: "gpt-oss-120b", name: "GPT OSS 120B (Cerebras)" }], + }, + }, +}, +plugins: { + entries: { + "active-memory": { + enabled: true, + config: { + model: "cerebras/gpt-oss-120b", + }, + }, + }, +} +``` + +Opzioni di modello veloce da prendere in considerazione: + +- `cerebras/gpt-oss-120b` per un modello di recupero dedicato e veloce con una superficie degli strumenti ridotta +- il tuo normale modello di sessione, lasciando `config.model` non impostato +- un modello di fallback a bassa latenza come `google/gemini-3-flash` quando vuoi un modello di recupero separato senza cambiare il tuo modello principale della chat + +Perché Cerebras è una valida opzione orientata alla velocità per Active Memory: + +- la superficie degli strumenti di Active Memory è ridotta: chiama solo `memory_search` e `memory_get` +- la qualità del recupero conta, ma la latenza conta più che nel percorso della risposta principale +- un provider veloce dedicato evita di legare la latenza del recupero della memoria al tuo provider principale della chat + +Se non vuoi un modello separato ottimizzato per la velocità, lascia `config.model` non impostato +e lascia che Active Memory erediti il modello della sessione corrente. + +### Configurazione di Cerebras + +Aggiungi una voce provider come questa: + +```json5 +models: { + providers: { + cerebras: { + baseUrl: "https://api.cerebras.ai/v1", + apiKey: "${CEREBRAS_API_KEY}", + api: "openai-completions", + models: [{ id: "gpt-oss-120b", name: "GPT OSS 120B (Cerebras)" }], + }, + }, +} +``` + +Poi fai puntare Active Memory a quel modello: + +```json5 +plugins: { + entries: { + "active-memory": { + enabled: true, + config: { + model: "cerebras/gpt-oss-120b", + }, + }, + }, +} +``` + +Avvertenza: + +- assicurati che la chiave API di Cerebras abbia effettivamente accesso al modello che scegli, perché la sola visibilità di `/v1/models` non garantisce l'accesso a `chat/completions` + +## Come vederlo + +Active Memory inietta un prefisso di prompt nascosto non attendibile per il modello. Non espone i tag grezzi `...` nella normale risposta visibile al client. ## Attivazione/disattivazione della sessione -Usa il comando del plugin quando vuoi mettere in pausa o riprendere la active memory per la +Usa il comando del Plugin quando vuoi sospendere o riprendere Active Memory per la sessione di chat corrente senza modificare la configurazione: ```text @@ -143,7 +228,7 @@ Questo vale per la sessione corrente. Non modifica `plugins.entries.active-memory.enabled`, il targeting dell'agente o altre configurazioni globali. -Se vuoi che il comando scriva la configurazione e metta in pausa o riprenda la active memory per +Se vuoi che il comando scriva la configurazione e sospenda o riprenda Active Memory per tutte le sessioni, usa la forma globale esplicita: ```text @@ -153,27 +238,27 @@ tutte le sessioni, usa la forma globale esplicita: ``` La forma globale scrive `plugins.entries.active-memory.config.enabled`. Lascia -`plugins.entries.active-memory.enabled` attivo in modo che il comando rimanga disponibile per -riattivare la active memory in seguito. +`plugins.entries.active-memory.enabled` attivo così il comando rimane disponibile per +riattivare Active Memory in seguito. -Se vuoi vedere cosa sta facendo la active memory in una sessione dal vivo, attiva le -opzioni della sessione che corrispondono all'output che desideri: +Se vuoi vedere cosa sta facendo Active Memory in una sessione attiva, attiva le +opzioni della sessione che corrispondono all'output che vuoi: ```text /verbose on /trace on ``` -Con queste abilitate, OpenClaw può mostrare: +Con queste opzioni abilitate, OpenClaw può mostrare: -- una riga di stato della active memory come `Active Memory: status=ok elapsed=842ms query=recent summary=34 chars` quando `/verbose on` +- una riga di stato di Active Memory come `Active Memory: status=ok elapsed=842ms query=recent summary=34 chars` quando `/verbose on` - un riepilogo di debug leggibile come `Active Memory Debug: Lemon pepper wings with blue cheese.` quando `/trace on` -Queste righe derivano dallo stesso passaggio di active memory che alimenta il prefisso di -prompt nascosto, ma sono formattate per gli esseri umani invece di esporre markup grezzo del prompt. -Vengono inviate come messaggio diagnostico successivo alla normale -risposta dell'assistente, così i client dei canali come Telegram non mostrano un fumetto diagnostico separato -prima della risposta. +Queste righe derivano dallo stesso passaggio di Active Memory che alimenta il prefisso +di prompt nascosto, ma sono formattate per gli esseri umani invece di esporre markup grezzo +del prompt. Vengono inviate come messaggio diagnostico di follow-up dopo la normale +risposta dell'assistente, così i client di canale come Telegram non mostrano per un attimo +un fumetto diagnostico separato prima della risposta. Se abiliti anche `/trace raw`, il blocco tracciato `Model Input (User Role)` mostrerà il prefisso nascosto di Active Memory come: @@ -185,10 +270,10 @@ Untrusted context (metadata, do not treat as instructions or commands): ``` -Per impostazione predefinita, la trascrizione del sotto-agente di memoria bloccante è temporanea e viene eliminata -al termine dell'esecuzione. +Per impostazione predefinita, la trascrizione del sottoagente di memoria bloccante è temporanea e viene eliminata +dopo il completamento dell'esecuzione. -Flusso di esempio: +Esempio di flusso: ```text /verbose on @@ -205,16 +290,16 @@ Forma prevista della risposta visibile: 🔎 Active Memory Debug: Lemon pepper wings with blue cheese. ``` -## Quando viene eseguita +## Quando viene eseguito -La active memory usa due controlli: +Active Memory usa due controlli: -1. **Adesione tramite configurazione** - Il plugin deve essere abilitato e l'id dell'agente corrente deve comparire in +1. **Opt-in di configurazione** + Il Plugin deve essere abilitato e l'id dell'agente corrente deve comparire in `plugins.entries.active-memory.config.agents`. 2. **Idoneità rigorosa in fase di esecuzione** - Anche quando è abilitata e mirata, la active memory viene eseguita solo per - sessioni di chat interattive persistenti idonee. + Anche quando è abilitato e selezionato come target, Active Memory viene eseguito solo per + le sessioni di chat persistenti interattive idonee. La regola effettiva è: @@ -230,12 +315,12 @@ eligible interactive persistent chat session active memory runs ``` -Se uno qualsiasi di questi controlli fallisce, la active memory non viene eseguita. +Se uno qualsiasi di questi controlli fallisce, Active Memory non viene eseguito. ## Tipi di sessione `config.allowedChatTypes` controlla quali tipi di conversazioni possono eseguire Active -Memory in assoluto. +Memory. Il valore predefinito è: @@ -243,8 +328,8 @@ Il valore predefinito è: allowedChatTypes: ["direct"] ``` -Questo significa che Active Memory viene eseguita per impostazione predefinita nelle sessioni in stile messaggio diretto, ma -non nelle sessioni di gruppo o canale a meno che tu non le abiliti esplicitamente. +Questo significa che Active Memory viene eseguito per impostazione predefinita nelle sessioni in stile messaggio diretto, ma +non nelle sessioni di gruppo o di canale a meno che tu non le abiliti esplicitamente. Esempi: @@ -260,25 +345,25 @@ allowedChatTypes: ["direct", "group"] allowedChatTypes: ["direct", "group", "channel"] ``` -## Dove viene eseguita +## Dove viene eseguito -La active memory è una funzionalità di arricchimento conversazionale, non una -funzionalità di inferenza estesa a tutta la piattaforma. +Active Memory è una funzionalità di arricchimento conversazionale, non una +funzionalità di inferenza valida per tutta la piattaforma. -| Surface | Viene eseguita la active memory? | -| ------------------------------------------------------------------- | ------------------------------------------------------- | -| Sessioni persistenti di chat in Control UI / web chat | Sì, se il plugin è abilitato e l'agente è mirato | -| Altre sessioni di canale interattive sullo stesso percorso di chat persistente | Sì, se il plugin è abilitato e l'agente è mirato | -| Esecuzioni headless una tantum | No | -| Esecuzioni Heartbeat/in background | No | -| Percorsi interni generici `agent-command` | No | -| Esecuzione di sotto-agenti/helper interni | No | +| Surface | Esegue Active Memory? | +| ------------------------------------------------------------------- | ------------------------------------------------------ | +| Control UI / sessioni persistenti della chat web | Sì, se il Plugin è abilitato e l'agente è selezionato come target | +| Altre sessioni di canale interattive sullo stesso percorso di chat persistente | Sì, se il Plugin è abilitato e l'agente è selezionato come target | +| Esecuzioni headless one-shot | No | +| Esecuzioni Heartbeat/in background | No | +| Percorsi interni generici `agent-command` | No | +| Esecuzione interna del sottoagente/helper | No | -## Perché usarla +## Perché usarlo -Usa la active memory quando: +Usa Active Memory quando: -- la sessione è persistente e rivolta all'utente +- la sessione è persistente e visibile all'utente - l'agente ha una memoria a lungo termine significativa in cui cercare - continuità e personalizzazione contano più del puro determinismo del prompt @@ -288,16 +373,16 @@ Funziona particolarmente bene per: - abitudini ricorrenti - contesto utente a lungo termine che dovrebbe emergere in modo naturale -È poco adatta per: +È poco adatto per: - automazione - worker interni -- attività API una tantum -- punti in cui una personalizzazione nascosta sarebbe sorprendente +- attività API one-shot +- contesti in cui una personalizzazione nascosta sarebbe sorprendente ## Come funziona -La forma del runtime è: +La struttura in esecuzione è: ```mermaid flowchart LR @@ -308,7 +393,7 @@ flowchart LR I --> M["Main Reply"] ``` -Il sotto-agente di memoria bloccante può usare solo: +Il sottoagente di memoria bloccante può usare solo: - `memory_search` - `memory_get` @@ -317,20 +402,20 @@ Se la connessione è debole, dovrebbe restituire `NONE`. ## Modalità di query -`config.queryMode` controlla quanta parte della conversazione vede il sotto-agente di memoria bloccante. +`config.queryMode` controlla quanta parte della conversazione vede il sottoagente di memoria bloccante. ## Stili di prompt -`config.promptStyle` controlla quanto il sotto-agente di memoria bloccante sia +`config.promptStyle` controlla quanto il sottoagente di memoria bloccante sia propenso o rigoroso nel decidere se restituire memoria. Stili disponibili: -- `balanced`: valore predefinito per uso generale per la modalità `recent` -- `strict`: meno propenso; ideale quando vuoi pochissima contaminazione dal contesto vicino +- `balanced`: impostazione predefinita per uso generale per la modalità `recent` +- `strict`: il meno propenso; ideale quando vuoi pochissima influenza dal contesto vicino - `contextual`: il più favorevole alla continuità; ideale quando la cronologia della conversazione dovrebbe contare di più -- `recall-heavy`: più disposto a far emergere memoria su corrispondenze più deboli ma comunque plausibili -- `precision-heavy`: preferisce aggressivamente `NONE` a meno che la corrispondenza non sia evidente +- `recall-heavy`: più incline a far emergere memoria su corrispondenze più deboli ma comunque plausibili +- `precision-heavy`: preferisce in modo aggressivo `NONE` a meno che la corrispondenza non sia evidente - `preference-only`: ottimizzato per preferiti, abitudini, routine, gusti e fatti personali ricorrenti Mappatura predefinita quando `config.promptStyle` non è impostato: @@ -341,7 +426,7 @@ recent -> balanced full -> contextual ``` -Se imposti `config.promptStyle` esplicitamente, tale override prevale. +Se imposti `config.promptStyle` esplicitamente, quell'override ha la precedenza. Esempio: @@ -360,7 +445,7 @@ explicit plugin model -> optional configured fallback model ``` -`config.modelFallback` controlla il passaggio di fallback configurato. +`config.modelFallback` controlla il passaggio del fallback configurato. Fallback personalizzato facoltativo: @@ -369,31 +454,31 @@ modelFallback: "google/gemini-3-flash" ``` Se non viene risolto alcun modello esplicito, ereditato o di fallback configurato, Active Memory -salta il richiamo per quel turno. +salta il recupero per quel turno. `config.modelFallbackPolicy` viene mantenuto solo come campo di compatibilità deprecato -per configurazioni meno recenti. Non modifica più il comportamento in fase di esecuzione. +per le configurazioni meno recenti. Non modifica più il comportamento in fase di esecuzione. -## Vie di fuga avanzate +## Meccanismi avanzati di emergenza Queste opzioni intenzionalmente non fanno parte della configurazione consigliata. -`config.thinking` può sovrascrivere il livello di thinking del sotto-agente di memoria bloccante: +`config.thinking` può sovrascrivere il livello di ragionamento del sottoagente di memoria bloccante: ```json5 thinking: "medium" ``` -Predefinito: +Valore predefinito: ```json5 thinking: "off" ``` -Non abilitarlo per impostazione predefinita. Active Memory viene eseguita nel percorso della risposta, quindi tempo di -thinking aggiuntivo aumenta direttamente la latenza visibile all'utente. +Non abilitarlo per impostazione predefinita. Active Memory viene eseguito nel percorso della risposta, quindi il tempo di +ragionamento aggiuntivo aumenta direttamente la latenza visibile all'utente. -`config.promptAppend` aggiunge istruzioni operative extra dopo il prompt predefinito di Active +`config.promptAppend` aggiunge istruzioni extra dell'operatore dopo il prompt predefinito di Active Memory e prima del contesto della conversazione: ```json5 @@ -401,15 +486,15 @@ promptAppend: "Prefer stable long-term preferences over one-off events." ``` `config.promptOverride` sostituisce il prompt predefinito di Active Memory. OpenClaw -continua comunque ad aggiungere il contesto della conversazione dopo: +aggiunge comunque il contesto della conversazione in seguito: ```json5 promptOverride: "You are a memory search agent. Return NONE or one compact user fact." ``` La personalizzazione del prompt non è consigliata a meno che tu non stia testando deliberatamente un -contratto di richiamo diverso. Il prompt predefinito è regolato per restituire `NONE` -oppure un contesto compatto di fatti utente per il modello principale. +contratto di recupero diverso. Il prompt predefinito è ottimizzato per restituire `NONE` +oppure un contesto compatto di fatti dell'utente per il modello principale. ### `message` @@ -421,17 +506,17 @@ Latest user message only Usa questa modalità quando: -- vuoi il comportamento più rapido -- vuoi il bias più forte verso il richiamo di preferenze stabili +- vuoi il comportamento più veloce +- vuoi il bias più forte verso il recupero di preferenze stabili - i turni successivi non richiedono contesto conversazionale Timeout consigliato: -- inizia intorno a `3000` fino a `5000` ms +- inizia intorno a `3000`-`5000` ms ### `recent` -Vengono inviati l'ultimo messaggio dell'utente più una piccola coda conversazionale recente. +Vengono inviati l'ultimo messaggio dell'utente più una piccola coda recente della conversazione. ```text Recent conversation tail: @@ -445,8 +530,8 @@ Latest user message: Usa questa modalità quando: -- vuoi un migliore equilibrio tra velocità e radicamento conversazionale -- le domande di follow-up spesso dipendono dagli ultimi pochi turni +- vuoi un miglior equilibrio tra velocità e ancoraggio conversazionale +- le domande di follow-up dipendono spesso dagli ultimi pochi turni Timeout consigliato: @@ -454,7 +539,7 @@ Timeout consigliato: ### `full` -L'intera conversazione viene inviata al sotto-agente di memoria bloccante. +L'intera conversazione viene inviata al sottoagente di memoria bloccante. ```text Full conversation context: @@ -466,7 +551,7 @@ user: ... Usa questa modalità quando: -- la massima qualità del richiamo conta più della latenza +- la massima qualità di recupero conta più della latenza - la conversazione contiene una configurazione importante molto indietro nel thread Timeout consigliato: @@ -482,17 +567,17 @@ message < recent < full ## Persistenza della trascrizione -Le esecuzioni del sotto-agente di memoria bloccante di Active Memory creano una vera -trascrizione `session.jsonl` durante la chiamata del sotto-agente di memoria bloccante. +Le esecuzioni del sottoagente di memoria bloccante di Active Memory creano una vera trascrizione `session.jsonl` +durante la chiamata del sottoagente di memoria bloccante. -Per impostazione predefinita, tale trascrizione è temporanea: +Per impostazione predefinita, quella trascrizione è temporanea: - viene scritta in una directory temporanea -- viene usata solo per l'esecuzione del sotto-agente di memoria bloccante -- viene eliminata immediatamente al termine dell'esecuzione +- viene usata solo per l'esecuzione del sottoagente di memoria bloccante +- viene eliminata subito dopo la fine dell'esecuzione -Se vuoi conservare su disco queste trascrizioni del sotto-agente di memoria bloccante per debug o -ispezione, attiva esplicitamente la persistenza: +Se vuoi mantenere su disco queste trascrizioni del sottoagente di memoria bloccante per il debug o +l'ispezione, attiva esplicitamente la persistenza: ```json5 { @@ -511,11 +596,11 @@ ispezione, attiva esplicitamente la persistenza: } ``` -Quando è abilitata, la active memory archivia le trascrizioni in una directory separata sotto la -cartella delle sessioni dell'agente di destinazione, non nel percorso principale della -trascrizione della conversazione utente. +Quando è abilitato, Active Memory archivia le trascrizioni in una directory separata nella +cartella delle sessioni dell'agente di destinazione, non nel percorso principale della trascrizione +della conversazione dell'utente. -La struttura predefinita è concettualmente: +La disposizione predefinita è concettualmente: ```text agents//sessions/active-memory/.jsonl @@ -523,15 +608,15 @@ agents//sessions/active-memory/.jso Puoi cambiare la sottodirectory relativa con `config.transcriptDir`. -Usalo con attenzione: +Usa questa opzione con cautela: -- le trascrizioni del sotto-agente di memoria bloccante possono accumularsi rapidamente nelle sessioni molto attive +- le trascrizioni del sottoagente di memoria bloccante possono accumularsi rapidamente nelle sessioni molto attive - la modalità di query `full` può duplicare molto contesto conversazionale -- queste trascrizioni contengono contesto di prompt nascosto e memorie richiamate +- queste trascrizioni contengono contesto di prompt nascosto e memorie recuperate ## Configurazione -Tutta la configurazione della active memory si trova sotto: +Tutta la configurazione di Active Memory si trova in: ```text plugins.entries.active-memory @@ -539,32 +624,32 @@ plugins.entries.active-memory I campi più importanti sono: -| Key | Type | Significato | -| --------------------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | -| `enabled` | `boolean` | Abilita il plugin stesso | -| `config.agents` | `string[]` | Id degli agenti che possono usare la active memory | -| `config.model` | `string` | Riferimento facoltativo al modello del sotto-agente di memoria bloccante; se non impostato, la active memory usa il modello della sessione corrente | -| `config.queryMode` | `"message" \| "recent" \| "full"` | Controlla quanta parte della conversazione vede il sotto-agente di memoria bloccante | -| `config.promptStyle` | `"balanced" \| "strict" \| "contextual" \| "recall-heavy" \| "precision-heavy" \| "preference-only"` | Controlla quanto il sotto-agente di memoria bloccante sia propenso o rigoroso nel decidere se restituire memoria | -| `config.thinking` | `"off" \| "minimal" \| "low" \| "medium" \| "high" \| "xhigh" \| "adaptive"` | Override avanzato del livello di thinking per il sotto-agente di memoria bloccante; predefinito `off` per velocità | -| `config.promptOverride` | `string` | Sostituzione avanzata completa del prompt; non consigliata per l'uso normale | -| `config.promptAppend` | `string` | Istruzioni extra avanzate aggiunte al prompt predefinito o sostituito | -| `config.timeoutMs` | `number` | Timeout rigido per il sotto-agente di memoria bloccante | -| `config.maxSummaryChars` | `number` | Numero massimo totale di caratteri consentiti nel riepilogo active-memory | -| `config.logging` | `boolean` | Emette log della active memory durante la regolazione | -| `config.persistTranscripts` | `boolean` | Mantiene su disco le trascrizioni del sotto-agente di memoria bloccante invece di eliminare i file temporanei | -| `config.transcriptDir` | `string` | Directory relativa delle trascrizioni del sotto-agente di memoria bloccante sotto la cartella delle sessioni dell'agente | +| Key | Type | Meaning | +| --------------------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | +| `enabled` | `boolean` | Abilita il Plugin stesso | +| `config.agents` | `string[]` | Id agente che possono usare Active Memory | +| `config.model` | `string` | Riferimento facoltativo al modello del sottoagente di memoria bloccante; se non impostato, Active Memory usa il modello della sessione corrente | +| `config.queryMode` | `"message" \| "recent" \| "full"` | Controlla quanta parte della conversazione vede il sottoagente di memoria bloccante | +| `config.promptStyle` | `"balanced" \| "strict" \| "contextual" \| "recall-heavy" \| "precision-heavy" \| "preference-only"` | Controlla quanto il sottoagente di memoria bloccante sia propenso o rigoroso nel decidere se restituire memoria | +| `config.thinking` | `"off" \| "minimal" \| "low" \| "medium" \| "high" \| "xhigh" \| "adaptive"` | Sovrascrittura avanzata del ragionamento per il sottoagente di memoria bloccante; valore predefinito `off` per la velocità | +| `config.promptOverride` | `string` | Sostituzione avanzata completa del prompt; non consigliata per l'uso normale | +| `config.promptAppend` | `string` | Istruzioni extra avanzate aggiunte al prompt predefinito o sovrascritto | +| `config.timeoutMs` | `number` | Timeout rigido per il sottoagente di memoria bloccante | +| `config.maxSummaryChars` | `number` | Numero massimo totale di caratteri consentiti nel riepilogo active-memory | +| `config.logging` | `boolean` | Emette log di Active Memory durante la regolazione | +| `config.persistTranscripts` | `boolean` | Mantiene su disco le trascrizioni del sottoagente di memoria bloccante invece di eliminare i file temporanei | +| `config.transcriptDir` | `string` | Directory relativa delle trascrizioni del sottoagente di memoria bloccante nella cartella delle sessioni dell'agente | Campi utili per la regolazione: -| Key | Type | Significato | -| ----------------------------- | -------- | ------------------------------------------------------------ | +| Key | Type | Meaning | +| ----------------------------- | -------- | ------------------------------------------------------------- | | `config.maxSummaryChars` | `number` | Numero massimo totale di caratteri consentiti nel riepilogo active-memory | | `config.recentUserTurns` | `number` | Turni utente precedenti da includere quando `queryMode` è `recent` | | `config.recentAssistantTurns` | `number` | Turni assistente precedenti da includere quando `queryMode` è `recent` | -| `config.recentUserChars` | `number` | Numero massimo di caratteri per ogni turno utente recente | -| `config.recentAssistantChars` | `number` | Numero massimo di caratteri per ogni turno assistente recente | -| `config.cacheTtlMs` | `number` | Riutilizzo della cache per query identiche ripetute | +| `config.recentUserChars` | `number` | Numero massimo di caratteri per ciascun turno utente recente | +| `config.recentAssistantChars` | `number` | Numero massimo di caratteri per ciascun turno assistente recente | +| `config.cacheTtlMs` | `number` | Riutilizzo della cache per query identiche ripetute | ## Configurazione consigliata @@ -591,30 +676,30 @@ Inizia con `recent`. ``` Se vuoi ispezionare il comportamento in tempo reale durante la regolazione, usa `/verbose on` per la -normale riga di stato e `/trace on` per il riepilogo di debug active-memory invece -di cercare un comando di debug active-memory separato. Nei canali chat, queste +normale riga di stato e `/trace on` per il riepilogo di debug di active-memory invece +di cercare un comando di debug separato per active-memory. Nei canali di chat, quelle righe diagnostiche vengono inviate dopo la risposta principale dell'assistente invece che prima. Poi passa a: - `message` se vuoi una latenza inferiore -- `full` se decidi che il contesto extra vale la pena di avere un sotto-agente di memoria bloccante più lento +- `full` se decidi che il contesto aggiuntivo vale la lentezza del sottoagente di memoria bloccante -## Debug +## Debugging -Se la active memory non compare dove te l'aspetti: +Se Active Memory non appare dove te lo aspetti: -1. Conferma che il plugin sia abilitato in `plugins.entries.active-memory.enabled`. +1. Conferma che il Plugin sia abilitato in `plugins.entries.active-memory.enabled`. 2. Conferma che l'id dell'agente corrente sia elencato in `config.agents`. -3. Conferma di stare eseguendo il test tramite una sessione di chat interattiva persistente. +3. Conferma che il test avvenga tramite una sessione di chat persistente interattiva. 4. Attiva `config.logging: true` e osserva i log del Gateway. 5. Verifica che la ricerca in memoria funzioni con `openclaw memory status --deep`. -Se i risultati di memoria sono rumorosi, restringi: +Se i risultati della memoria sono rumorosi, restringi: - `maxSummaryChars` -Se la active memory è troppo lenta: +Se Active Memory è troppo lento: - riduci `queryMode` - riduci `timeoutMs` @@ -625,56 +710,57 @@ Se la active memory è troppo lenta: ### Il provider di embedding è cambiato in modo imprevisto -Active Memory usa la normale pipeline `memory_search` sotto +Active Memory usa la normale pipeline `memory_search` in `agents.defaults.memorySearch`. Questo significa che la configurazione del provider di embedding è un -requisito solo quando la tua configurazione di `memorySearch` richiede embedding per il comportamento +requisito solo quando la tua configurazione `memorySearch` richiede embedding per il comportamento che desideri. In pratica: -- la configurazione esplicita del provider è **obbligatoria** se vuoi un provider che non viene +- la configurazione esplicita del provider è **obbligatoria** se vuoi un provider che non venga rilevato automaticamente, come `ollama` - la configurazione esplicita del provider è **obbligatoria** se il rilevamento automatico non risolve alcun provider di embedding utilizzabile per il tuo ambiente -- la configurazione esplicita del provider è **fortemente consigliata** se vuoi una selezione del provider - deterministica invece di "vince il primo disponibile" +- la configurazione esplicita del provider è **fortemente consigliata** se vuoi una selezione + deterministica del provider invece di "vince il primo disponibile" - la configurazione esplicita del provider di solito **non è obbligatoria** se il rilevamento automatico già risolve il provider che desideri e quel provider è stabile nel tuo deployment -Se `memorySearch.provider` non è impostato, OpenClaw rileva automaticamente il primo provider di embedding disponibile. +Se `memorySearch.provider` non è impostato, OpenClaw rileva automaticamente il primo +provider di embedding disponibile. Questo può creare confusione nei deployment reali: -- una nuova chiave API disponibile può cambiare quale provider usa memory search -- un comando o una superficie diagnostica può far sembrare il provider selezionato - diverso dal percorso che stai effettivamente usando durante la sincronizzazione live della memoria o - il bootstrap della ricerca -- i provider hosted possono fallire con errori di quota o di rate limit che compaiono solo - quando Active Memory inizia a eseguire ricerche di richiamo prima di ogni risposta +- una nuova chiave API disponibile può cambiare quale provider usa la ricerca in memoria +- un comando o una superficie diagnostica possono far sembrare il provider selezionato + diverso dal percorso che stai effettivamente raggiungendo durante la sincronizzazione della memoria in tempo reale o il + bootstrap della ricerca +- i provider ospitati possono fallire con errori di quota o rate limit che compaiono solo + quando Active Memory inizia a eseguire ricerche di recupero prima di ogni risposta Active Memory può comunque funzionare senza embedding quando `memory_search` può operare -in una modalità degradata solo lessicale, cosa che in genere accade quando non è possibile risolvere alcun -provider di embedding. +in modalità degradata solo lessicale, cosa che di solito avviene quando non è possibile risolvere +alcun provider di embedding. -Non dare per scontato lo stesso fallback in caso di errori di runtime del provider come esaurimento della quota, -rate limit, errori di rete/provider o modelli locali/remoti mancanti dopo che un provider è già stato selezionato. +Non dare per scontato lo stesso fallback in caso di errori in fase di esecuzione del provider, come esaurimento +della quota, rate limit, errori di rete/provider o modelli locali/remoti mancanti dopo che un provider è già stato selezionato. In pratica: -- se non è possibile risolvere alcun provider di embedding, `memory_search` può degradarsi a - recupero solo lessicale +- se non è possibile risolvere alcun provider di embedding, `memory_search` può degradare a + un recupero solo lessicale - se un provider di embedding viene risolto e poi fallisce in fase di esecuzione, OpenClaw - al momento non garantisce un fallback lessicale per quella richiesta -- se ti serve una selezione deterministica del provider, fissa + attualmente non garantisce un fallback lessicale per quella richiesta +- se hai bisogno di una selezione deterministica del provider, fissa `agents.defaults.memorySearch.provider` -- se ti serve il failover del provider in caso di errori di runtime, configura - esplicitamente `agents.defaults.memorySearch.fallback` +- se hai bisogno di failover del provider in caso di errori in fase di esecuzione, configura + `agents.defaults.memorySearch.fallback` esplicitamente -Se dipendi da richiamo basato su embedding, indicizzazione multimodale o da uno specifico +Se dipendi da un recupero supportato da embedding, indicizzazione multimodale o da uno specifico provider locale/remoto, fissa esplicitamente il provider invece di affidarti al rilevamento automatico. -Esempi comuni di impostazione esplicita: +Esempi comuni di configurazione fissa: OpenAI: @@ -721,8 +807,8 @@ Ollama: } ``` -Se ti aspetti il failover del provider in caso di errori di runtime come esaurimento della quota, -impostare esplicitamente un provider da solo non è sufficiente. Configura anche un fallback esplicito: +Se ti aspetti il failover del provider in caso di errori in fase di esecuzione come esaurimento della quota, +fissare solo un provider non basta. Configura anche un fallback esplicito: ```json5 { @@ -739,29 +825,29 @@ impostare esplicitamente un provider da solo non è sufficiente. Configura anche ### Debug dei problemi del provider -Se Active Memory è lenta, vuota o sembra cambiare provider in modo imprevisto: +Se Active Memory è lento, vuoto o sembra cambiare provider in modo imprevisto: - osserva i log del Gateway mentre riproduci il problema; cerca righe come `active-memory: ... start|done`, `memory sync failed (search-bootstrap)` o errori di embedding specifici del provider -- attiva `/trace on` per mostrare nella sessione il riepilogo di debug di Active Memory gestito dal Plugin +- attiva `/trace on` per mostrare nella sessione il riepilogo di debug di Active Memory di proprietà del Plugin - attiva `/verbose on` se vuoi anche la normale riga di stato `🧩 Active Memory: ...` dopo ogni risposta - esegui `openclaw memory status --deep` per ispezionare l'attuale backend di - memory search e lo stato dell'indice + ricerca in memoria e lo stato dell'indice - controlla `agents.defaults.memorySearch.provider` e la relativa autenticazione/configurazione per assicurarti che il provider che ti aspetti sia davvero quello che può essere risolto in fase di esecuzione - se usi `ollama`, verifica che il modello di embedding configurato sia installato, per - esempio `ollama list` + esempio con `ollama list` -Ciclo di debug di esempio: +Esempio di ciclo di debug: ```text -1. Avvia il Gateway e osserva i suoi log -2. Nella sessione di chat, esegui /trace on -3. Invia un messaggio che dovrebbe attivare Active Memory -4. Confronta la riga di debug visibile nella chat con le righe di log del Gateway -5. Se la scelta del provider è ambigua, fissa esplicitamente agents.defaults.memorySearch.provider +1. Start the gateway and watch its logs +2. In the chat session, run /trace on +3. Send one message that should trigger Active Memory +4. Compare the chat-visible debug line with the gateway log lines +5. If provider choice is ambiguous, pin agents.defaults.memorySearch.provider explicitly ``` Esempio: @@ -793,11 +879,11 @@ Oppure, se vuoi embedding Gemini: } ``` -Dopo aver cambiato provider, riavvia il Gateway ed esegui un nuovo test con -`/trace on` in modo che la riga di debug di Active Memory rifletta il nuovo percorso di embedding. +Dopo aver cambiato il provider, riavvia il Gateway ed esegui un nuovo test con +`/trace on` così la riga di debug di Active Memory rifletta il nuovo percorso di embedding. ## Pagine correlate - [Memory Search](/it/concepts/memory-search) - [Riferimento della configurazione della memoria](/it/reference/memory-config) -- [Configurazione di Plugin SDK](/it/plugins/sdk-setup) +- [Configurazione del Plugin SDK](/it/plugins/sdk-setup) diff --git a/docs/it/gateway/protocol.md b/docs/it/gateway/protocol.md index f80263058..ff89c3054 100644 --- a/docs/it/gateway/protocol.md +++ b/docs/it/gateway/protocol.md @@ -3,23 +3,23 @@ read_when: - Implementazione o aggiornamento dei client WS del gateway - Debug del protocollo non corrispondente o degli errori di connessione - Rigenerazione dello schema/dei modelli del protocollo -summary: 'Protocollo WebSocket del Gateway: handshake, frame, versioning' -title: Protocollo del Gateway +summary: 'Protocollo WebSocket del Gateway: handshake, frame, versionamento' +title: Protocollo Gateway x-i18n: - generated_at: "2026-04-10T08:14:12Z" + generated_at: "2026-04-16T08:18:40Z" model: gpt-5.4 provider: openai - source_hash: 83c820c46d4803d571c770468fd6782619eaa1dca253e156e8087dec735c127f + source_hash: 683e61ebe993a2d739bc34860060b0e3eda36b5c57267a2bcc03d177ec612fb3 source_path: gateway/protocol.md workflow: 15 --- -# Protocollo del gateway (WebSocket) +# Protocollo Gateway (WebSocket) -Il protocollo WS del Gateway è il **singolo control plane + trasporto dei nodi** per +Il protocollo WS del Gateway è il **singolo piano di controllo + trasporto dei nodi** per OpenClaw. Tutti i client (CLI, interfaccia web, app macOS, nodi iOS/Android, nodi headless) si connettono tramite WebSocket e dichiarano il proprio **ruolo** + **ambito** -al momento dell'handshake. +al momento dell’handshake. ## Trasporto @@ -80,11 +80,25 @@ Gateway → Client: "type": "res", "id": "…", "ok": true, - "payload": { "type": "hello-ok", "protocol": 3, "policy": { "tickIntervalMs": 15000 } } + "payload": { + "type": "hello-ok", + "protocol": 3, + "server": { "version": "…", "connId": "…" }, + "features": { "methods": ["…"], "events": ["…"] }, + "snapshot": { "…": "…" }, + "policy": { + "maxPayload": 26214400, + "maxBufferedBytes": 52428800, + "tickIntervalMs": 15000 + } + } } ``` -Quando viene emesso un token del dispositivo, `hello-ok` include anche: +`server`, `features`, `snapshot` e `policy` sono tutti obbligatori nello schema +(`src/gateway/protocol/schema/frames.ts`). `auth` e `canvasHostUrl` sono facoltativi. + +Quando viene emesso un token dispositivo, `hello-ok` include anche: ```json { @@ -96,7 +110,8 @@ Quando viene emesso un token del dispositivo, `hello-ok` include anche: } ``` -Durante il passaggio affidabile del bootstrap, `hello-ok.auth` può anche includere voci di ruolo aggiuntive limitate in `deviceTokens`: +Durante il passaggio affidabile del bootstrap, `hello-ok.auth` può includere anche +voci di ruolo aggiuntive limitate in `deviceTokens`: ```json { @@ -115,10 +130,12 @@ Durante il passaggio affidabile del bootstrap, `hello-ok.auth` può anche includ } ``` -Per il flusso di bootstrap integrato nodo/operatore, il token principale del nodo rimane -`scopes: []` e qualsiasi token operatore passato rimane limitato alla allowlist dell'operatore di bootstrap (`operator.approvals`, `operator.read`, -`operator.talk.secrets`, `operator.write`). I controlli degli ambiti di bootstrap restano con prefisso del ruolo: le voci operatore soddisfano solo richieste operatore, e i ruoli non operatore -richiedono comunque ambiti con il prefisso del proprio ruolo. +Per il flusso di bootstrap integrato node/operator, il token primario del nodo resta +`scopes: []` e qualsiasi token operator trasferito resta limitato alla allowlist +dell’operatore di bootstrap (`operator.approvals`, `operator.read`, +`operator.talk.secrets`, `operator.write`). I controlli degli ambiti del bootstrap restano +con prefisso del ruolo: le voci operator soddisfano solo richieste operator, e i ruoli non operator +continuano a richiedere ambiti con il prefisso del proprio ruolo. ### Esempio di nodo @@ -167,8 +184,8 @@ I metodi con effetti collaterali richiedono **chiavi di idempotenza** (vedi sche ### Ruoli -- `operator` = client del control plane (CLI/UI/automazione). -- `node` = host delle capacità (camera/screen/canvas/system.run). +- `operator` = client del piano di controllo (CLI/UI/automazione). +- `node` = host di capacità (`camera`/`screen`/`canvas`/`system.run`). ### Ambiti (`operator`) @@ -184,91 +201,92 @@ Ambiti comuni: `talk.config` con `includeSecrets: true` richiede `operator.talk.secrets` (o `operator.admin`). -I metodi RPC del gateway registrati dai plugin possono richiedere il proprio ambito operatore, ma -i prefissi amministrativi core riservati (`config.*`, `exec.approvals.*`, `wizard.*`, +I metodi RPC del gateway registrati dai Plugin possono richiedere il proprio ambito operator, ma +i prefissi admin core riservati (`config.*`, `exec.approvals.*`, `wizard.*`, `update.*`) vengono sempre risolti in `operator.admin`. -L'ambito del metodo è solo il primo controllo. Alcuni slash command raggiunti tramite -`chat.send` applicano controlli più rigorosi a livello di comando. Ad esempio, le scritture persistenti -`/config set` e `/config unset` richiedono `operator.admin`. +L’ambito del metodo è solo il primo controllo. Alcuni slash command raggiunti tramite +`chat.send` applicano controlli più rigidi a livello di comando. Ad esempio, le scritture persistenti +di `/config set` e `/config unset` richiedono `operator.admin`. -`node.pair.approve` ha anche un controllo aggiuntivo dell'ambito al momento dell'approvazione oltre all'ambito base del metodo: +`node.pair.approve` ha anche un controllo di ambito aggiuntivo al momento dell’approvazione, oltre al +controllo di base del metodo: - richieste senza comandi: `operator.pairing` -- richieste con comandi del nodo non `exec`: `operator.pairing` + `operator.write` +- richieste con comandi del nodo non exec: `operator.pairing` + `operator.write` - richieste che includono `system.run`, `system.run.prepare` o `system.which`: `operator.pairing` + `operator.admin` -### `caps`/`commands`/`permissions` (`node`) +### Caps/commands/permissions (`node`) -I nodi dichiarano le capacità richieste al momento della connessione: +I nodi dichiarano le proprie capacità al momento della connessione: - `caps`: categorie di capacità di alto livello. -- `commands`: allowlist dei comandi per `invoke`. +- `commands`: allowlist di comandi per `invoke`. - `permissions`: interruttori granulari (ad esempio `screen.record`, `camera.capture`). -Il Gateway tratta questi elementi come **dichiarazioni** e applica allowlist lato server. +Il Gateway le tratta come **dichiarazioni** e applica allowlist lato server. -## Presenza +## Presence - `system-presence` restituisce voci indicizzate per identità del dispositivo. -- Le voci di presenza includono `deviceId`, `roles` e `scopes` così che le UI possano mostrare una singola riga per dispositivo +- Le voci di presenza includono `deviceId`, `roles` e `scopes` così le UI possono mostrare una singola riga per dispositivo anche quando si connette sia come **operator** sia come **node**. ## Famiglie comuni di metodi RPC Questa pagina non è un dump completo generato, ma la superficie WS pubblica è più ampia -degli esempi di handshake/auth sopra. Queste sono le principali famiglie di metodi che il +dei soli esempi di handshake/auth sopra. Queste sono le principali famiglie di metodi che il Gateway espone oggi. -`hello-ok.features.methods` è un elenco di discovery conservativo costruito da -`src/gateway/server-methods-list.ts` più le esportazioni dei metodi di plugin/canali caricati. -Trattalo come feature discovery, non come un dump generato di ogni helper invocabile +`hello-ok.features.methods` è un elenco conservativo di rilevamento funzionalità costruito da +`src/gateway/server-methods-list.ts` più le esportazioni dei metodi caricate da plugin/canali. +Trattalo come rilevamento delle funzionalità, non come un dump generato di ogni helper invocabile implementato in `src/gateway/server-methods/*.ts`. ### Sistema e identità -- `health` restituisce lo snapshot di salute del gateway memorizzato in cache o appena verificato. +- `health` restituisce l’istantanea di stato del gateway memorizzata in cache o appena verificata. - `status` restituisce il riepilogo del gateway in stile `/status`; i campi sensibili sono - inclusi solo per i client operatore con ambito admin. -- `gateway.identity.get` restituisce l'identità del dispositivo gateway usata dai flussi di relay e + inclusi solo per i client operator con ambito admin. +- `gateway.identity.get` restituisce l’identità del dispositivo gateway usata dai flussi di relay e pairing. -- `system-presence` restituisce lo snapshot corrente della presenza dei dispositivi +- `system-presence` restituisce l’istantanea corrente della presenza per i dispositivi operator/node connessi. - `system-event` aggiunge un evento di sistema e può aggiornare/trasmettere il contesto di presenza. -- `last-heartbeat` restituisce l'ultimo evento heartbeat persistito. -- `set-heartbeats` attiva o disattiva l'elaborazione degli heartbeat sul gateway. +- `last-heartbeat` restituisce l’ultimo evento Heartbeat persistito. +- `set-heartbeats` abilita o disabilita l’elaborazione degli Heartbeat sul gateway. ### Modelli e utilizzo -- `models.list` restituisce il catalogo dei modelli consentiti dal runtime. -- `usage.status` restituisce le finestre di utilizzo dei provider e i riepiloghi della quota rimanente. +- `models.list` restituisce il catalogo dei modelli consentiti a runtime. +- `usage.status` restituisce riepiloghi delle finestre di utilizzo del provider/quota rimanente. - `usage.cost` restituisce riepiloghi aggregati dei costi di utilizzo per un intervallo di date. -- `doctor.memory.status` restituisce lo stato di prontezza della memoria vettoriale / degli embedding per il - workspace predefinito attivo dell'agente. +- `doctor.memory.status` restituisce lo stato di prontezza della memoria vettoriale / degli embedding per lo + spazio di lavoro dell’agente predefinito attivo. - `sessions.usage` restituisce riepiloghi di utilizzo per sessione. -- `sessions.usage.timeseries` restituisce serie temporali di utilizzo per una sessione. +- `sessions.usage.timeseries` restituisce la serie temporale di utilizzo per una sessione. - `sessions.usage.logs` restituisce le voci del log di utilizzo per una sessione. ### Canali e helper di login -- `channels.status` restituisce riepiloghi di stato dei canali/plugin integrati e bundled. +- `channels.status` restituisce riepiloghi di stato dei canali/plugin integrati + inclusi. - `channels.logout` esegue il logout di un canale/account specifico dove il canale supporta il logout. -- `web.login.start` avvia un flusso di login QR/web per il provider del canale web attuale con supporto QR. +- `web.login.start` avvia un flusso di login QR/web per l’attuale provider di canale web con supporto QR. - `web.login.wait` attende il completamento di quel flusso di login QR/web e avvia il - canale in caso di successo. + canale in caso di esito positivo. - `push.test` invia una push APNs di test a un nodo iOS registrato. -- `voicewake.get` restituisce i trigger wake-word memorizzati. -- `voicewake.set` aggiorna i trigger wake-word e trasmette la modifica. +- `voicewake.get` restituisce i trigger della parola di attivazione memorizzati. +- `voicewake.set` aggiorna i trigger della parola di attivazione e ne trasmette la modifica. ### Messaggistica e log -- `send` è l'RPC diretto di consegna in uscita per invii mirati a canale/account/thread - al di fuori del runner di chat. -- `logs.tail` restituisce il tail del log file del gateway configurato con controlli di cursore/limite e - byte massimi. +- `send` è l’RPC di consegna diretta in uscita per invii + verso canale/account/thread di destinazione al di fuori del runner della chat. +- `logs.tail` restituisce la coda del log file del gateway configurato con cursore/limite e + controlli di byte massimi. ### Talk e TTS @@ -276,108 +294,109 @@ implementato in `src/gateway/server-methods/*.ts`. richiede `operator.talk.secrets` (o `operator.admin`). - `talk.mode` imposta/trasmette lo stato corrente della modalità Talk per i client WebChat/Control UI. -- `talk.speak` sintetizza il parlato tramite il provider speech Talk attivo. -- `tts.status` restituisce lo stato di abilitazione del TTS, il provider attivo, i provider di fallback - e lo stato della configurazione del provider. -- `tts.providers` restituisce l'inventario visibile dei provider TTS. +- `talk.speak` sintetizza la voce tramite il provider speech Talk attivo. +- `tts.status` restituisce lo stato di abilitazione TTS, il provider attivo, i provider di fallback + e lo stato di configurazione del provider. +- `tts.providers` restituisce l’inventario visibile dei provider TTS. - `tts.enable` e `tts.disable` attivano o disattivano lo stato delle preferenze TTS. - `tts.setProvider` aggiorna il provider TTS preferito. - `tts.convert` esegue una conversione text-to-speech una tantum. -### Secrets, configurazione, aggiornamento e wizard +### Secret, configurazione, aggiornamento e wizard -- `secrets.reload` risolve di nuovo i SecretRef attivi e sostituisce lo stato segreto del runtime - solo in caso di successo completo. -- `secrets.resolve` risolve le assegnazioni di secret mirate ai comandi per uno specifico insieme di comando/target. -- `config.get` restituisce lo snapshot e l'hash della configurazione corrente. +- `secrets.reload` risolve nuovamente i SecretRef attivi e sostituisce lo stato dei secret a runtime + solo in caso di pieno successo. +- `secrets.resolve` risolve le assegnazioni di secret di destinazione dei comandi per un insieme specifico + di comando/destinazione. +- `config.get` restituisce l’istantanea della configurazione corrente e il relativo hash. - `config.set` scrive un payload di configurazione validato. - `config.patch` unisce un aggiornamento parziale della configurazione. -- `config.apply` valida + sostituisce il payload completo della configurazione. +- `config.apply` valida + sostituisce l’intero payload di configurazione. - `config.schema` restituisce il payload dello schema di configurazione live usato da Control UI e - dagli strumenti CLI: schema, `uiHints`, versione e metadati di generazione, inclusi + strumenti CLI: schema, `uiHints`, versione e metadati di generazione, inclusi i metadati di schema di plugin + canali quando il runtime può caricarli. Lo schema - include metadati dei campi `title` / `description` derivati dalle stesse etichette - e dallo stesso testo di aiuto usati dalla UI, incluse le diramazioni annidate di object, wildcard, array-item - e composizione `anyOf` / `oneOf` / `allOf` quando esiste documentazione dei campi + include i metadati dei campi `title` / `description` derivati dalle stesse etichette + e testo di aiuto usati dall’interfaccia, inclusi oggetti nidificati, wildcard, elementi di array, + e rami di composizione `anyOf` / `oneOf` / `allOf` quando esiste la documentazione del campo corrispondente. - `config.schema.lookup` restituisce un payload di lookup con ambito di percorso per un percorso di configurazione: - percorso normalizzato, un nodo di schema superficiale, hint corrispondente + `hintPath`, e - riepiloghi dei figli immediati per drill-down UI/CLI. - - I nodi di schema di lookup mantengono la documentazione rivolta all'utente e i campi di validazione comuni: + percorso normalizzato, un nodo di schema superficiale, `hint` + `hintPath` corrispondenti, e + riepiloghi immediati dei figli per il drill-down in UI/CLI. + - I nodi di schema del lookup mantengono la documentazione rivolta all’utente e i comuni campi di validazione: `title`, `description`, `type`, `enum`, `const`, `format`, `pattern`, - limiti numerici/stringa/array/object e flag booleani come + limiti numerici/stringa/array/oggetto e flag booleani come `additionalProperties`, `deprecated`, `readOnly`, `writeOnly`. - I riepiloghi dei figli espongono `key`, `path` normalizzato, `type`, `required`, `hasChildren`, più `hint` / `hintPath` corrispondenti. - `update.run` esegue il flusso di aggiornamento del gateway e pianifica un riavvio solo quando - l'aggiornamento stesso è riuscito. + l’aggiornamento stesso è riuscito. - `wizard.start`, `wizard.next`, `wizard.status` e `wizard.cancel` espongono il wizard di onboarding tramite WS RPC. ### Famiglie principali esistenti -#### Helper per agente e workspace +#### Helper per agente e spazio di lavoro - `agents.list` restituisce le voci degli agenti configurati. - `agents.create`, `agents.update` e `agents.delete` gestiscono i record degli agenti e - il wiring del workspace. -- `agents.files.list`, `agents.files.get` e `agents.files.set` gestiscono i - file del workspace di bootstrap esposti per un agente. -- `agent.identity.get` restituisce l'identità effettiva dell'assistente per un agente o + il collegamento dello spazio di lavoro. +- `agents.files.list`, `agents.files.get` e `agents.files.set` gestiscono i file + dello spazio di lavoro di bootstrap esposti per un agente. +- `agent.identity.get` restituisce l’identità effettiva dell’assistente per un agente o una sessione. -- `agent.wait` attende la fine di un'esecuzione e restituisce lo snapshot terminale quando +- `agent.wait` attende il termine di un’esecuzione e restituisce l’istantanea finale quando disponibile. #### Controllo della sessione -- `sessions.list` restituisce l'indice corrente delle sessioni. -- `sessions.subscribe` e `sessions.unsubscribe` attivano o disattivano le sottoscrizioni agli eventi di modifica delle sessioni - per il client WS corrente. +- `sessions.list` restituisce l’indice corrente delle sessioni. +- `sessions.subscribe` e `sessions.unsubscribe` attivano o disattivano le sottoscrizioni agli eventi + di modifica della sessione per il client WS corrente. - `sessions.messages.subscribe` e `sessions.messages.unsubscribe` attivano o disattivano - le sottoscrizioni agli eventi di trascrizione/messaggio per una sessione. + le sottoscrizioni agli eventi di trascrizione/messaggi per una sessione. - `sessions.preview` restituisce anteprime limitate della trascrizione per specifiche chiavi di sessione. - `sessions.resolve` risolve o canonicalizza una destinazione di sessione. - `sessions.create` crea una nuova voce di sessione. - `sessions.send` invia un messaggio in una sessione esistente. -- `sessions.steer` è la variante interrupt-and-steer per una sessione attiva. +- `sessions.steer` è la variante interrompi-e-guida per una sessione attiva. - `sessions.abort` interrompe il lavoro attivo per una sessione. -- `sessions.patch` aggiorna i metadati/le override della sessione. -- `sessions.reset`, `sessions.delete` e `sessions.compact` eseguono la manutenzione - della sessione. +- `sessions.patch` aggiorna i metadati/le sostituzioni della sessione. +- `sessions.reset`, `sessions.delete` e `sessions.compact` eseguono la + manutenzione della sessione. - `sessions.get` restituisce la riga completa della sessione memorizzata. -- l'esecuzione della chat continua a usare `chat.history`, `chat.send`, `chat.abort` e +- l’esecuzione della chat continua a usare `chat.history`, `chat.send`, `chat.abort` e `chat.inject`. -- `chat.history` è normalizzato per la visualizzazione per i client UI: i tag delle direttive inline vengono - rimossi dal testo visibile, i payload XML plain-text delle tool call (inclusi +- `chat.history` è normalizzato per la visualizzazione per i client UI: i tag direttiva inline vengono + rimossi dal testo visibile, i payload XML delle chiamate agli strumenti in testo semplice (inclusi `...`, `...`, - `...`, `...` e - blocchi di tool call troncati) e i token di controllo del modello ASCII/full-width trapelati - vengono rimossi, le righe dell'assistente composte solo da token silenziosi come `NO_REPLY` / - `no_reply` esatti vengono omesse, e le righe troppo grandi possono essere sostituite con segnaposto. + `...`, `...`, e + blocchi di chiamata agli strumenti troncati) e i token di controllo del modello ASCII/a larghezza piena trapelati + vengono rimossi, le righe assistant composte solo da token silenziosi come l’esatto `NO_REPLY` / + `no_reply` vengono omesse e le righe troppo grandi possono essere sostituite con segnaposto. -#### Pairing dei dispositivi e token dispositivo +#### Associazione dei dispositivi e token dispositivo - `device.pair.list` restituisce i dispositivi associati in attesa e approvati. - `device.pair.approve`, `device.pair.reject` e `device.pair.remove` gestiscono - i record di pairing dei dispositivi. -- `device.token.rotate` ruota un token di dispositivo associato entro i limiti del ruolo - e degli ambiti approvati. + i record di associazione dei dispositivi. +- `device.token.rotate` ruota un token di dispositivo associato entro i limiti approvati di ruolo + e ambito. - `device.token.revoke` revoca un token di dispositivo associato. -#### Pairing dei nodi, invoke e lavoro in sospeso +#### Associazione dei nodi, invoke e lavoro in sospeso - `node.pair.request`, `node.pair.list`, `node.pair.approve`, - `node.pair.reject` e `node.pair.verify` coprono il pairing dei nodi e la - verifica del bootstrap. -- `node.list` e `node.describe` restituiscono lo stato dei nodi conosciuti/connessi. -- `node.rename` aggiorna un'etichetta di nodo associato. + `node.pair.reject` e `node.pair.verify` coprono l’associazione dei nodi e la verifica + del bootstrap. +- `node.list` e `node.describe` restituiscono lo stato dei nodi noti/connessi. +- `node.rename` aggiorna un’etichetta di nodo associato. - `node.invoke` inoltra un comando a un nodo connesso. - `node.invoke.result` restituisce il risultato di una richiesta invoke. -- `node.event` trasporta nel gateway gli eventi originati dal nodo. -- `node.canvas.capability.refresh` aggiorna i token di capacità canvas con ambito. +- `node.event` trasporta gli eventi originati dal nodo di nuovo nel gateway. +- `node.canvas.capability.refresh` aggiorna i token di capacità canvas con ambito limitato. - `node.pending.pull` e `node.pending.ack` sono le API di coda dei nodi connessi. -- `node.pending.enqueue` e `node.pending.drain` gestiscono il lavoro in sospeso durevole +- `node.pending.enqueue` e `node.pending.drain` gestiscono il lavoro durevole in sospeso per nodi offline/disconnessi. #### Famiglie di approvazione @@ -385,211 +404,247 @@ implementato in `src/gateway/server-methods/*.ts`. - `exec.approval.request`, `exec.approval.get`, `exec.approval.list` e `exec.approval.resolve` coprono le richieste di approvazione exec one-shot più la ricerca/riproduzione delle approvazioni in sospeso. -- `exec.approval.waitDecision` attende una decisione di approvazione exec in sospeso e restituisce - la decisione finale (oppure `null` in caso di timeout). -- `exec.approvals.get` e `exec.approvals.set` gestiscono gli snapshot della policy di approvazione exec +- `exec.approval.waitDecision` attende una approvazione exec in sospeso e restituisce + la decisione finale (o `null` in caso di timeout). +- `exec.approvals.get` e `exec.approvals.set` gestiscono le istantanee delle policy di approvazione exec del gateway. -- `exec.approvals.node.get` e `exec.approvals.node.set` gestiscono la policy locale del nodo per exec - tramite comandi relay del nodo. +- `exec.approvals.node.get` e `exec.approvals.node.set` gestiscono la policy di approvazione exec + locale del nodo tramite comandi relay del nodo. - `plugin.approval.request`, `plugin.approval.list`, `plugin.approval.waitDecision` e `plugin.approval.resolve` coprono - i flussi di approvazione definiti dai plugin. + i flussi di approvazione definiti dai Plugin. #### Altre famiglie principali - automazione: - - `wake` pianifica un'iniezione di testo wake immediata o al prossimo heartbeat + - `wake` pianifica un’iniezione di testo wake immediata o al prossimo Heartbeat - `cron.list`, `cron.status`, `cron.add`, `cron.update`, `cron.remove`, `cron.run`, `cron.runs` -- skills/tool: `commands.list`, `skills.*`, `tools.catalog`, `tools.effective` +- Skills/strumenti: `commands.list`, `skills.*`, `tools.catalog`, `tools.effective` ### Famiglie comuni di eventi - `chat`: aggiornamenti della chat UI come `chat.inject` e altri eventi di chat solo di trascrizione. -- `session.message` e `session.tool`: aggiornamenti dello stream di trascrizione/eventi per una sessione sottoscritta. -- `sessions.changed`: l'indice della sessione o i metadati sono cambiati. -- `presence`: aggiornamenti dello snapshot della presenza di sistema. -- `tick`: evento periodico di keepalive / liveness. -- `health`: aggiornamento dello snapshot di salute del gateway. -- `heartbeat`: aggiornamento dello stream di eventi heartbeat. -- `cron`: evento di modifica di esecuzione/job cron. -- `shutdown`: notifica di spegnimento del gateway. -- `node.pair.requested` / `node.pair.resolved`: ciclo di vita del pairing del nodo. -- `node.invoke.request`: broadcast di richiesta invoke del nodo. +- `session.message` e `session.tool`: aggiornamenti del flusso di eventi/trascrizione per una + sessione sottoscritta. +- `sessions.changed`: l’indice delle sessioni o i metadati sono cambiati. +- `presence`: aggiornamenti dell’istantanea della presenza di sistema. +- `tick`: evento periodico di keepalive / rilevamento attività. +- `health`: aggiornamento dell’istantanea di stato del gateway. +- `heartbeat`: aggiornamento del flusso di eventi Heartbeat. +- `cron`: evento di modifica di esecuzione/job Cron. +- `shutdown`: notifica di arresto del gateway. +- `node.pair.requested` / `node.pair.resolved`: ciclo di vita dell’associazione dei nodi. +- `node.invoke.request`: trasmissione della richiesta invoke del nodo. - `device.pair.requested` / `device.pair.resolved`: ciclo di vita del dispositivo associato. -- `voicewake.changed`: la configurazione dei trigger della wake-word è cambiata. +- `voicewake.changed`: la configurazione dei trigger della parola di attivazione è cambiata. - `exec.approval.requested` / `exec.approval.resolved`: ciclo di vita - dell'approvazione exec. -- `plugin.approval.requested` / `plugin.approval.resolved`: ciclo di vita dell'approvazione del plugin. + dell’approvazione exec. +- `plugin.approval.requested` / `plugin.approval.resolved`: ciclo di vita + dell’approvazione del Plugin. ### Metodi helper del nodo -- I nodi possono chiamare `skills.bins` per recuperare l'elenco corrente degli eseguibili delle skill +- I nodi possono chiamare `skills.bins` per recuperare l’elenco corrente degli eseguibili delle Skills per i controlli di auto-allow. -### Metodi helper dell'operatore +### Metodi helper dell’operator -- Gli operatori possono chiamare `commands.list` (`operator.read`) per recuperare l'inventario dei comandi runtime per un agente. - - `agentId` è facoltativo; omettilo per leggere il workspace dell'agente predefinito. - - `scope` controlla quale superficie viene presa di mira dal `name` primario: - - `text` restituisce il token del comando testuale primario senza la barra iniziale `/` - - `native` e il percorso predefinito `both` restituiscono nomi nativi aware del provider +- Gli operator possono chiamare `commands.list` (`operator.read`) per recuperare l’inventario dei comandi a runtime per un + agente. + - `agentId` è facoltativo; ometterlo per leggere lo spazio di lavoro dell’agente predefinito. + - `scope` controlla quale superficie prende di mira il `name` primario: + - `text` restituisce il token primario del comando testuale senza la `/` iniziale + - `native` e il percorso predefinito `both` restituiscono nomi nativi dipendenti dal provider quando disponibili - `textAliases` contiene alias slash esatti come `/model` e `/m`. - - `nativeName` contiene il nome del comando nativo aware del provider quando esiste. - - `provider` è facoltativo e influisce solo sulla denominazione nativa più sulla disponibilità dei - comandi nativi del plugin. - - `includeArgs=false` omette dai risultati i metadati serializzati degli argomenti. -- Gli operatori possono chiamare `tools.catalog` (`operator.read`) per recuperare il catalogo dei tool runtime per un - agente. La risposta include tool raggruppati e metadati di provenienza: + - `nativeName` contiene il nome del comando nativo dipendente dal provider quando esiste. + - `provider` è facoltativo e influenza solo il naming nativo più la disponibilità dei comandi + nativi del Plugin. + - `includeArgs=false` omette dal risultato i metadati serializzati degli argomenti. +- Gli operator possono chiamare `tools.catalog` (`operator.read`) per recuperare il catalogo degli strumenti a runtime per un + agente. La risposta include strumenti raggruppati e metadati di provenienza: - `source`: `core` o `plugin` - - `pluginId`: proprietario del plugin quando `source="plugin"` - - `optional`: se un tool del plugin è facoltativo -- Gli operatori possono chiamare `tools.effective` (`operator.read`) per recuperare l'inventario dei tool effettivo del runtime + - `pluginId`: proprietario del Plugin quando `source="plugin"` + - `optional`: se uno strumento del Plugin è facoltativo +- Gli operator possono chiamare `tools.effective` (`operator.read`) per recuperare l’inventario effettivo degli strumenti a runtime per una sessione. - `sessionKey` è obbligatorio. - Il gateway deriva il contesto runtime affidabile dalla sessione lato server invece di accettare - contesto auth o di consegna fornito dal chiamante. - - La risposta è limitata alla sessione e riflette ciò che la conversazione attiva può usare in questo momento, - inclusi tool core, plugin e canali. -- Gli operatori possono chiamare `skills.status` (`operator.read`) per recuperare l'inventario visibile - delle skill per un agente. - - `agentId` è facoltativo; omettilo per leggere il workspace dell'agente predefinito. + contesti auth o di consegna forniti dal chiamante. + - La risposta ha ambito di sessione e riflette ciò che la conversazione attiva può usare in questo momento, + inclusi strumenti core, Plugin e canale. +- Gli operator possono chiamare `skills.status` (`operator.read`) per recuperare l’inventario visibile delle + Skills per un agente. + - `agentId` è facoltativo; ometterlo per leggere lo spazio di lavoro dell’agente predefinito. - La risposta include idoneità, requisiti mancanti, controlli di configurazione e opzioni di installazione sanificate senza esporre valori segreti grezzi. -- Gli operatori possono chiamare `skills.search` e `skills.detail` (`operator.read`) per i - metadati di discovery di ClawHub. -- Gli operatori possono chiamare `skills.install` (`operator.admin`) in due modalità: - - Modalità ClawHub: `{ source: "clawhub", slug, version?, force? }` installa una - cartella skill nella directory `skills/` del workspace dell'agente predefinito. - - Modalità installer del gateway: `{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }` - esegue un'azione dichiarata `metadata.openclaw.install` sull'host del gateway. -- Gli operatori possono chiamare `skills.update` (`operator.admin`) in due modalità: - - La modalità ClawHub aggiorna uno slug tracciato o tutte le installazioni ClawHub tracciate nel - workspace dell'agente predefinito. - - La modalità Config applica patch ai valori `skills.entries.` come `enabled`, - `apiKey` e `env`. +- Gli operator possono chiamare `skills.search` e `skills.detail` (`operator.read`) per i + metadati di rilevamento di ClawHub. +- Gli operator possono chiamare `skills.install` (`operator.admin`) in due modalità: + - modalità ClawHub: `{ source: "clawhub", slug, version?, force? }` installa una + cartella Skill nella directory `skills/` dello spazio di lavoro dell’agente predefinito. + - modalità installer del gateway: `{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }` + esegue un’azione dichiarata `metadata.openclaw.install` sull’host del gateway. +- Gli operator possono chiamare `skills.update` (`operator.admin`) in due modalità: + - la modalità ClawHub aggiorna uno slug tracciato o tutte le installazioni ClawHub tracciate nello + spazio di lavoro dell’agente predefinito. + - la modalità config aggiorna con patch i valori `skills.entries.` come `enabled`, + `apiKey` ed `env`. ## Approvazioni exec -- Quando una richiesta exec necessita di approvazione, il gateway trasmette `exec.approval.requested`. -- I client operatore risolvono chiamando `exec.approval.resolve` (richiede l'ambito `operator.approvals`). -- Per `host=node`, `exec.approval.request` deve includere `systemRunPlan` (`argv`/`cwd`/`rawCommand`/metadati della sessione canonici). Le richieste senza `systemRunPlan` vengono rifiutate. -- Dopo l'approvazione, le chiamate inoltrate `node.invoke system.run` riutilizzano quel +- Quando una richiesta exec richiede approvazione, il gateway trasmette `exec.approval.requested`. +- I client operator risolvono chiamando `exec.approval.resolve` (richiede l’ambito `operator.approvals`). +- Per `host=node`, `exec.approval.request` deve includere `systemRunPlan` (`argv`/`cwd`/`rawCommand`/metadati di sessione canonici). Le richieste senza `systemRunPlan` vengono rifiutate. +- Dopo l’approvazione, le chiamate inoltrate `node.invoke system.run` riutilizzano quel `systemRunPlan` canonico come contesto autorevole di comando/cwd/sessione. - Se un chiamante modifica `command`, `rawCommand`, `cwd`, `agentId` o - `sessionKey` tra `prepare` e l'inoltro finale approvato di `system.run`, il - gateway rifiuta l'esecuzione invece di fidarsi del payload modificato. + `sessionKey` tra la preparazione e l’inoltro finale approvato di `system.run`, il + gateway rifiuta l’esecuzione invece di fidarsi del payload modificato. -## Fallback di consegna dell'agente +## Fallback di consegna dell’agente - Le richieste `agent` possono includere `deliver=true` per richiedere la consegna in uscita. -- `bestEffortDeliver=false` mantiene il comportamento rigoroso: le destinazioni di consegna irrisolte o solo interne restituiscono `INVALID_REQUEST`. -- `bestEffortDeliver=true` consente il fallback all'esecuzione solo in sessione quando non è possibile risolvere alcun percorso di consegna esterno (ad esempio sessioni interne/webchat o configurazioni multi-canale ambigue). +- `bestEffortDeliver=false` mantiene il comportamento rigoroso: le destinazioni di consegna non risolte o solo interne restituiscono `INVALID_REQUEST`. +- `bestEffortDeliver=true` consente il fallback all’esecuzione solo di sessione quando non è possibile risolvere alcun percorso esterno consegnabile (ad esempio sessioni interne/webchat o configurazioni multi-canale ambigue). -## Versioning +## Versionamento -- `PROTOCOL_VERSION` si trova in `src/gateway/protocol/schema.ts`. +- `PROTOCOL_VERSION` si trova in `src/gateway/protocol/schema/protocol-schemas.ts`. - I client inviano `minProtocol` + `maxProtocol`; il server rifiuta le incompatibilità. -- Schemi + modelli vengono generati a partire dalle definizioni TypeBox: +- Schemi + modelli sono generati dalle definizioni TypeBox: - `pnpm protocol:gen` - `pnpm protocol:gen:swift` - `pnpm protocol:check` +### Costanti del client + +Il client di riferimento in `src/gateway/client.ts` usa questi valori predefiniti. I valori sono +stabili nel protocollo v3 e rappresentano la base prevista per i client di terze parti. + +| Costante | Predefinito | Origine | +| ----------------------------------------- | ----------------------------------------------------- | ---------------------------------------------------------- | +| `PROTOCOL_VERSION` | `3` | `src/gateway/protocol/schema/protocol-schemas.ts` | +| Timeout della richiesta (per RPC) | `30_000` ms | `src/gateway/client.ts` (`requestTimeoutMs`) | +| Timeout preauth / connect-challenge | `10_000` ms | `src/gateway/handshake-timeouts.ts` (clamp `250`–`10_000`) | +| Backoff iniziale di riconnessione | `1_000` ms | `src/gateway/client.ts` (`backoffMs`) | +| Backoff massimo di riconnessione | `30_000` ms | `src/gateway/client.ts` (`scheduleReconnect`) | +| Clamp di tentativo rapido dopo chiusura con device-token | `250` ms | `src/gateway/client.ts` | +| Periodo di tolleranza force-stop prima di `terminate()` | `250` ms | `FORCE_STOP_TERMINATE_GRACE_MS` | +| Timeout predefinito di `stopAndWait()` | `1_000` ms | `STOP_AND_WAIT_TIMEOUT_MS` | +| Intervallo tick predefinito (prima di `hello-ok`) | `30_000` ms | `src/gateway/client.ts` | +| Chiusura per timeout tick | codice `4000` quando il silenzio supera `tickIntervalMs * 2` | `src/gateway/client.ts` | +| `MAX_PAYLOAD_BYTES` | `25 * 1024 * 1024` (25 MB) | `src/gateway/server-constants.ts` | + +Il server pubblicizza i valori effettivi `policy.tickIntervalMs`, `policy.maxPayload` +e `policy.maxBufferedBytes` in `hello-ok`; i client dovrebbero rispettare tali valori +anziché i predefiniti precedenti all’handshake. + ## Auth -- L'auth del gateway con segreto condiviso usa `connect.params.auth.token` oppure +- L’autenticazione del gateway con secret condiviso usa `connect.params.auth.token` oppure `connect.params.auth.password`, a seconda della modalità auth configurata. -- Le modalità che trasportano identità, come Tailscale Serve +- Le modalità che portano identità come Tailscale Serve (`gateway.auth.allowTailscale: true`) o `gateway.auth.mode: "trusted-proxy"` - su endpoint non-loopback, soddisfano il controllo auth di connessione dagli header - della richiesta invece che da `connect.params.auth.*`. -- `gateway.auth.mode: "none"` su ingressi privati salta completamente l'auth di connessione con segreto condiviso; non esporre questa modalità su ingressi pubblici/non affidabili. -- Dopo il pairing, il Gateway emette un **token dispositivo** limitato al ruolo + agli ambiti della connessione. Viene restituito in `hello-ok.auth.deviceToken` e deve essere - persistito dal client per le connessioni future. -- I client devono persistere il `hello-ok.auth.deviceToken` primario dopo ogni + non-loopback soddisfano il controllo auth di connessione tramite + gli header della richiesta invece di `connect.params.auth.*`. +- `gateway.auth.mode: "none"` per ingressi privati salta completamente l’auth di connessione con secret condiviso; non esporre questa modalità su ingressi pubblici/non affidabili. +- Dopo l’associazione, il Gateway emette un **token dispositivo** con ambito limitato al ruolo + agli ambiti della connessione. Viene restituito in `hello-ok.auth.deviceToken` e il client dovrebbe + salvarlo per le connessioni future. +- I client dovrebbero salvare il `hello-ok.auth.deviceToken` primario dopo ogni connessione riuscita. -- La riconnessione con quel token dispositivo **memorizzato** deve anche riutilizzare l'insieme di ambiti approvati memorizzato per quel token. Questo preserva l'accesso - già concesso in lettura/probe/status ed evita che le riconnessioni si riducano silenziosamente a un - ambito implicito solo admin più ristretto. -- La precedenza auth normale della connessione è: token/password condiviso esplicito per primo, poi - `deviceToken` esplicito, poi token per dispositivo memorizzato, poi token di bootstrap. -- Le voci aggiuntive `hello-ok.auth.deviceTokens` sono token di handoff del bootstrap. - Persistile solo quando la connessione ha usato auth di bootstrap su un trasporto affidabile - come `wss://` o loopback/pairing locale. -- Se un client fornisce un `deviceToken` **esplicito** o `scopes` espliciti, quell'insieme di ambiti richiesto dal chiamante rimane autorevole; gli ambiti in cache vengono riutilizzati solo quando il client sta riutilizzando il token per dispositivo memorizzato. +- Quando si riconnette con quel token dispositivo **memorizzato**, il client dovrebbe anche riutilizzare l’insieme di ambiti approvati memorizzato per quel token. Questo preserva l’accesso di lettura/verifica/stato + già concesso ed evita che le riconnessioni si riducano silenziosamente a un + ambito implicito più ristretto limitato all’admin. +- Composizione auth di connessione lato client (`selectConnectAuth` in + `src/gateway/client.ts`): + - `auth.password` è ortogonale e viene sempre inoltrato quando impostato. + - `auth.token` viene popolato in ordine di priorità: prima il token condiviso esplicito, + poi un `deviceToken` esplicito, poi un token per-dispositivo memorizzato (indicizzato da + `deviceId` + `role`). + - `auth.bootstrapToken` viene inviato solo quando nessuno dei precedenti ha risolto un + `auth.token`. Un token condiviso o qualsiasi token dispositivo risolto lo sopprime. + - L’auto-promozione di un token dispositivo memorizzato nel retry one-shot + `AUTH_TOKEN_MISMATCH` è limitata **solo agli endpoint affidabili** — + loopback, oppure `wss://` con `tlsFingerprint` fissato. `wss://` pubblico + senza pinning non è considerato idoneo. +- Le voci aggiuntive `hello-ok.auth.deviceTokens` sono token di passaggio bootstrap. + Salvale solo quando la connessione ha usato auth bootstrap su un trasporto affidabile + come `wss://` o loopback/local pairing. +- Se un client fornisce un `deviceToken` **esplicito** o `scopes` espliciti, quell’insieme di ambiti richiesto dal chiamante resta autorevole; gli ambiti in cache vengono riutilizzati solo + quando il client sta riutilizzando il token per-dispositivo memorizzato. - I token dispositivo possono essere ruotati/revocati tramite `device.token.rotate` e - `device.token.revoke` (richiede l'ambito `operator.pairing`). -- L'emissione/la rotazione dei token rimane limitata all'insieme di ruoli approvato registrato nella - voce di pairing di quel dispositivo; la rotazione di un token non può espandere il dispositivo a un - ruolo che l'approvazione del pairing non ha mai concesso. -- Per le sessioni di token di dispositivi associati, la gestione del dispositivo è limitata al proprio ambito a meno che il + `device.token.revoke` (richiede l’ambito `operator.pairing`). +- L’emissione/rotazione del token resta limitata all’insieme di ruoli approvato registrato nella + voce di pairing di quel dispositivo; la rotazione di un token non può estendere il dispositivo a un + ruolo che l’approvazione del pairing non ha mai concesso. +- Per le sessioni di token di dispositivo associato, la gestione del dispositivo ha ambito limitato al dispositivo stesso a meno che il chiamante non abbia anche `operator.admin`: i chiamanti non admin possono rimuovere/revocare/ruotare solo la **propria** voce di dispositivo. -- `device.token.rotate` controlla anche l'insieme di ambiti operatore richiesto rispetto agli +- `device.token.rotate` controlla anche l’insieme di ambiti operator richiesto rispetto agli ambiti della sessione corrente del chiamante. I chiamanti non admin non possono ruotare un token verso - un insieme di ambiti operatore più ampio di quello che già possiedono. -- I fallimenti auth includono `error.details.code` più suggerimenti per il recupero: + un insieme di ambiti operator più ampio di quello che già possiedono. +- I fallimenti auth includono `error.details.code` più suggerimenti di recupero: - `error.details.canRetryWithDeviceToken` (boolean) - `error.details.recommendedNextStep` (`retry_with_device_token`, `update_auth_configuration`, `update_auth_credentials`, `wait_then_retry`, `review_auth_configuration`) - Comportamento del client per `AUTH_TOKEN_MISMATCH`: - - I client affidabili possono tentare un singolo retry limitato con un token per dispositivo in cache. - - Se quel retry fallisce, i client devono interrompere i loop di riconnessione automatica e mostrare indicazioni per l'azione dell'operatore. + - I client affidabili possono tentare un retry limitato con un token per-dispositivo in cache. + - Se quel retry fallisce, i client dovrebbero interrompere i loop di riconnessione automatica e mostrare indicazioni operative all’operatore. ## Identità del dispositivo + pairing -- I nodi devono includere un'identità del dispositivo stabile (`device.id`) derivata da una +- I nodi dovrebbero includere un’identità del dispositivo stabile (`device.id`) derivata da una fingerprint della coppia di chiavi. - I gateway emettono token per dispositivo + ruolo. -- Le approvazioni di pairing sono richieste per i nuovi ID dispositivo a meno che l'approvazione automatica locale - non sia abilitata. -- L'approvazione automatica del pairing è incentrata sulle connessioni dirette local loopback. -- OpenClaw ha anche un percorso self-connect backend/container-local limitato per - flussi helper affidabili con segreto condiviso. +- Le approvazioni di pairing sono necessarie per nuovi ID dispositivo a meno che non sia abilitata + l’auto-approvazione locale. +- L’auto-approvazione del pairing è centrata sulle connessioni loopback locali dirette. +- OpenClaw ha anche un percorso ristretto di self-connect backend/container-local per flussi helper con secret condiviso affidabili. - Le connessioni tailnet o LAN sullo stesso host sono comunque trattate come remote per il pairing e richiedono approvazione. -- Tutti i client WS devono includere l'identità `device` durante `connect` (operator + node). +- Tutti i client WS devono includere l’identità `device` durante `connect` (`operator` + `node`). Control UI può ometterla solo in queste modalità: - - `gateway.controlUi.allowInsecureAuth=true` per compatibilità HTTP non sicura solo localhost. - - auth operator Control UI riuscita con `gateway.auth.mode: "trusted-proxy"`. - - `gateway.controlUi.dangerouslyDisableDeviceAuth=true` (break-glass, grave downgrade della sicurezza). + - `gateway.controlUi.allowInsecureAuth=true` per compatibilità HTTP non sicura solo su localhost. + - autenticazione riuscita di Control UI operator con `gateway.auth.mode: "trusted-proxy"`. + - `gateway.controlUi.dangerouslyDisableDeviceAuth=true` (break-glass, grave downgrade di sicurezza). - Tutte le connessioni devono firmare il nonce `connect.challenge` fornito dal server. -### Diagnostica della migrazione dell'auth del dispositivo +### Diagnostica di migrazione auth del dispositivo Per i client legacy che usano ancora il comportamento di firma pre-challenge, `connect` ora restituisce -codici di dettaglio `DEVICE_AUTH_*` sotto `error.details.code` con un `error.details.reason` stabile. +codici di dettaglio `DEVICE_AUTH_*` in `error.details.code` con un `error.details.reason` stabile. Errori di migrazione comuni: -| Messaggio | details.code | details.reason | Significato | -| --------------------------- | -------------------------------- | ------------------------ | -------------------------------------------------- | -| `device nonce required` | `DEVICE_AUTH_NONCE_REQUIRED` | `device-nonce-missing` | Il client ha omesso `device.nonce` (o lo ha inviato vuoto). | -| `device nonce mismatch` | `DEVICE_AUTH_NONCE_MISMATCH` | `device-nonce-mismatch` | Il client ha firmato con un nonce obsoleto/errato. | -| `device signature invalid` | `DEVICE_AUTH_SIGNATURE_INVALID` | `device-signature` | Il payload della firma non corrisponde al payload v2. | -| `device signature expired` | `DEVICE_AUTH_SIGNATURE_EXPIRED` | `device-signature-stale` | Il timestamp firmato è fuori dallo skew consentito. | -| `device identity mismatch` | `DEVICE_AUTH_DEVICE_ID_MISMATCH` | `device-id-mismatch` | `device.id` non corrisponde alla fingerprint della chiave pubblica. | -| `device public key invalid` | `DEVICE_AUTH_PUBLIC_KEY_INVALID` | `device-public-key` | Il formato/canonicalizzazione della chiave pubblica non è riuscito. | +| Messaggio | details.code | details.reason | Significato | +| ---------------------------- | -------------------------------- | ------------------------ | --------------------------------------------------- | +| `device nonce required` | `DEVICE_AUTH_NONCE_REQUIRED` | `device-nonce-missing` | Il client ha omesso `device.nonce` (o lo ha inviato vuoto). | +| `device nonce mismatch` | `DEVICE_AUTH_NONCE_MISMATCH` | `device-nonce-mismatch` | Il client ha firmato con un nonce obsoleto/errato. | +| `device signature invalid` | `DEVICE_AUTH_SIGNATURE_INVALID` | `device-signature` | Il payload della firma non corrisponde al payload v2. | +| `device signature expired` | `DEVICE_AUTH_SIGNATURE_EXPIRED` | `device-signature-stale` | Il timestamp firmato è fuori dallo skew consentito. | +| `device identity mismatch` | `DEVICE_AUTH_DEVICE_ID_MISMATCH` | `device-id-mismatch` | `device.id` non corrisponde alla fingerprint della chiave pubblica. | +| `device public key invalid` | `DEVICE_AUTH_PUBLIC_KEY_INVALID` | `device-public-key` | Il formato/canonicalizzazione della chiave pubblica non è riuscito. | Obiettivo della migrazione: -- Attendere sempre `connect.challenge`. -- Firmare il payload v2 che include il nonce del server. -- Inviare lo stesso nonce in `connect.params.device.nonce`. -- Il payload di firma preferito è `v3`, che vincola `platform` e `deviceFamily` +- Attendi sempre `connect.challenge`. +- Firma il payload v2 che include il nonce del server. +- Invia lo stesso nonce in `connect.params.device.nonce`. +- Il payload di firma preferito è `v3`, che associa `platform` e `deviceFamily` oltre ai campi device/client/role/scopes/token/nonce. -- Le firme legacy `v2` restano accettate per compatibilità, ma il pinning dei metadati - del dispositivo associato continua a controllare la policy dei comandi alla riconnessione. +- Le firme legacy `v2` restano accettate per compatibilità, ma il pinning dei + metadati del dispositivo associato continua a controllare la policy dei comandi alla riconnessione. ## TLS + pinning - TLS è supportato per le connessioni WS. -- I client possono facoltativamente fare pinning della fingerprint del certificato del gateway (vedi configurazione `gateway.tls` - più `gateway.remote.tlsFingerprint` o il flag CLI `--tls-fingerprint`). +- I client possono facoltativamente fissare la fingerprint del certificato del gateway (vedi configurazione `gateway.tls` + più `gateway.remote.tlsFingerprint` o la CLI `--tls-fingerprint`). ## Ambito -Questo protocollo espone l'**API completa del gateway** (status, channels, models, chat, -agent, sessions, nodes, approvals, ecc.). La superficie esatta è definita dagli +Questo protocollo espone l’**API completa del gateway** (stato, canali, modelli, chat, +agente, sessioni, nodi, approvazioni, ecc.). La superficie esatta è definita dagli schemi TypeBox in `src/gateway/protocol/schema.ts`. diff --git a/docs/it/providers/google.md b/docs/it/providers/google.md index 3c02c0f61..26574f261 100644 --- a/docs/it/providers/google.md +++ b/docs/it/providers/google.md @@ -2,13 +2,13 @@ read_when: - Vuoi usare i modelli Google Gemini con OpenClaw - Hai bisogno della chiave API o del flusso di autenticazione OAuth -summary: Configurazione di Google Gemini (chiave API + OAuth, generazione di immagini, comprensione dei media, ricerca web) +summary: Configurazione di Google Gemini (chiave API + OAuth, generazione di immagini, comprensione dei media, TTS, ricerca web) title: Google (Gemini) x-i18n: - generated_at: "2026-04-12T23:30:45Z" + generated_at: "2026-04-16T08:18:32Z" model: gpt-5.4 provider: openai - source_hash: 64b848add89061b208a5d6b19d206c433cace5216a0ca4b63d56496aecbde452 + source_hash: ec2d62855f5e80efda758aad71bcaa95c38b1e41761fa1100d47a06c62881419 source_path: providers/google.md workflow: 15 --- @@ -16,12 +16,12 @@ x-i18n: # Google (Gemini) Il Plugin Google fornisce accesso ai modelli Gemini tramite Google AI Studio, oltre a -generazione di immagini, comprensione dei media (immagine/audio/video) e ricerca web tramite +generazione di immagini, comprensione dei media (immagini/audio/video), sintesi vocale e ricerca web tramite Gemini Grounding. - Provider: `google` -- Auth: `GEMINI_API_KEY` o `GOOGLE_API_KEY` -- API: API Google Gemini +- Autenticazione: `GEMINI_API_KEY` o `GOOGLE_API_KEY` +- API: Google Gemini API - Provider alternativo: `google-gemini-cli` (OAuth) ## Per iniziare @@ -38,7 +38,7 @@ Scegli il metodo di autenticazione che preferisci e segui i passaggi di configur openclaw onboard --auth-choice gemini-api-key ``` - Oppure passa la chiave direttamente: + Oppure passa direttamente la chiave: ```bash openclaw onboard --non-interactive \ @@ -72,7 +72,7 @@ Scegli il metodo di autenticazione che preferisci e segui i passaggi di configur - **Ideale per:** riutilizzare un accesso esistente a Gemini CLI tramite PKCE OAuth invece di una chiave API separata. + **Ideale per:** riutilizzare un accesso Gemini CLI esistente tramite OAuth PKCE invece di una chiave API separata. Il provider `google-gemini-cli` è un'integrazione non ufficiale. Alcuni utenti @@ -91,8 +91,8 @@ Scegli il metodo di autenticazione che preferisci e segui i passaggi di configur npm install -g @google/gemini-cli ``` - OpenClaw supporta sia le installazioni Homebrew sia le installazioni npm globali, inclusi - i layout comuni Windows/npm. + OpenClaw supporta sia le installazioni Homebrew sia quelle npm globali, inclusi + i layout comuni di Windows/npm. ```bash @@ -117,8 +117,8 @@ Scegli il metodo di autenticazione che preferisci e segui i passaggi di configur (Oppure le varianti `GEMINI_CLI_*`.) - Se le richieste OAuth di Gemini CLI falliscono dopo l'accesso, imposta `GOOGLE_CLOUD_PROJECT` o - `GOOGLE_CLOUD_PROJECT_ID` sull'host gateway e riprova. + Se le richieste OAuth di Gemini CLI falliscono dopo l'accesso, imposta `GOOGLE_CLOUD_PROJECT` oppure + `GOOGLE_CLOUD_PROJECT_ID` sull'host del Gateway e riprova. @@ -126,37 +126,38 @@ Scegli il metodo di autenticazione che preferisci e segui i passaggi di configur sia installato e presente nel `PATH`. - Il provider solo OAuth `google-gemini-cli` è una superficie separata di inferenza testuale. - La generazione di immagini, la comprensione dei media e Gemini Grounding restano sul - provider `google`. + Il provider solo OAuth `google-gemini-cli` è una superficie separata di + inferenza testuale. La generazione di immagini, la comprensione dei media e Gemini Grounding restano sul + provider con id `google`. -## Capability +## Capacità -| Capability | Supportata | +| Capacità | Supportato | | ---------------------- | ----------------- | | Completamenti chat | Sì | -| Generazione di immagini | Sì | +| Generazione di immagini| Sì | | Generazione musicale | Sì | -| Comprensione delle immagini | Sì | +| Sintesi vocale | Sì | +| Comprensione immagini | Sì | | Trascrizione audio | Sì | | Comprensione video | Sì | -| Ricerca web (Grounding) | Sì | -| Thinking/reasoning | Sì (Gemini 3.1+) | +| Ricerca web (Grounding)| Sì | +| Thinking/ragionamento | Sì (Gemini 3.1+) | | Modelli Gemma 4 | Sì | -I modelli Gemma 4 (per esempio `gemma-4-26b-a4b-it`) supportano la modalità thinking. OpenClaw +I modelli Gemma 4 (ad esempio `gemma-4-26b-a4b-it`) supportano la modalità thinking. OpenClaw riscrive `thinkingBudget` in un `thinkingLevel` Google supportato per Gemma 4. -Impostare thinking su `off` mantiene il thinking disabilitato invece di mapparlo a +Impostare thinking su `off` mantiene thinking disabilitato invece di mapparlo a `MINIMAL`. ## Generazione di immagini -Il provider bundle di generazione immagini `google` usa per impostazione predefinita +Il provider di generazione immagini `google` incluso usa come predefinito `google/gemini-3.1-flash-image-preview`. - Supporta anche `google/gemini-3-pro-image-preview` @@ -179,16 +180,16 @@ Per usare Google come provider di immagini predefinito: ``` -Vedi [Generazione di immagini](/it/tools/image-generation) per i parametri condivisi dello strumento, la selezione del provider e il comportamento di failover. +Consulta [Generazione di immagini](/it/tools/image-generation) per i parametri condivisi dello strumento, la selezione del provider e il comportamento di failover. ## Generazione video -Il Plugin bundle `google` registra anche la generazione video tramite lo strumento condiviso +Il Plugin `google` incluso registra anche la generazione video tramite lo strumento condiviso `video_generate`. - Modello video predefinito: `google/veo-3.1-fast-generate-preview` -- Modalità: text-to-video, image-to-video e flussi con riferimento a singolo video +- Modalità: testo in video, immagine in video e flussi con riferimento a singolo video - Supporta `aspectRatio`, `resolution` e `audio` - Limite attuale della durata: **da 4 a 8 secondi** @@ -207,12 +208,12 @@ Per usare Google come provider video predefinito: ``` -Vedi [Generazione video](/it/tools/video-generation) per i parametri condivisi dello strumento, la selezione del provider e il comportamento di failover. +Consulta [Generazione video](/it/tools/video-generation) per i parametri condivisi dello strumento, la selezione del provider e il comportamento di failover. ## Generazione musicale -Il Plugin bundle `google` registra anche la generazione musicale tramite lo strumento condiviso +Il Plugin `google` incluso registra anche la generazione musicale tramite lo strumento condiviso `music_generate`. - Modello musicale predefinito: `google/lyria-3-clip-preview` @@ -220,7 +221,7 @@ Il Plugin bundle `google` registra anche la generazione musicale tramite lo stru - Controlli del prompt: `lyrics` e `instrumental` - Formato di output: `mp3` per impostazione predefinita, più `wav` su `google/lyria-3-pro-preview` - Input di riferimento: fino a 10 immagini -- Le esecuzioni supportate dalla sessione vengono scollegate tramite il flusso condiviso di task/stato, incluso `action: "status"` +- Le esecuzioni supportate da sessione si staccano tramite il flusso condiviso attività/stato, incluso `action: "status"` Per usare Google come provider musicale predefinito: @@ -237,21 +238,65 @@ Per usare Google come provider musicale predefinito: ``` -Vedi [Generazione musicale](/it/tools/music-generation) per i parametri condivisi dello strumento, la selezione del provider e il comportamento di failover. +Consulta [Generazione musicale](/it/tools/music-generation) per i parametri condivisi dello strumento, la selezione del provider e il comportamento di failover. + + +## Sintesi vocale + +Il provider vocale `google` incluso usa il percorso TTS della Gemini API con +`gemini-3.1-flash-tts-preview`. + +- Voce predefinita: `Kore` +- Autenticazione: `messages.tts.providers.google.apiKey`, `models.providers.google.apiKey`, `GEMINI_API_KEY` o `GOOGLE_API_KEY` +- Output: WAV per i normali allegati TTS, PCM per Talk/telefonia +- Output nativo di note vocali: non supportato su questo percorso Gemini API perché l'API restituisce PCM invece di Opus + +Per usare Google come provider TTS predefinito: + +```json5 +{ + messages: { + tts: { + auto: "always", + provider: "google", + providers: { + google: { + model: "gemini-3.1-flash-tts-preview", + voiceName: "Kore", + }, + }, + }, + }, +} +``` + +Il TTS della Gemini API accetta tag audio espressivi tra parentesi quadre nel testo, come +`[whispers]` o `[laughs]`. Per tenere i tag fuori dalla risposta visibile in chat mentre +li invii al TTS, inseriscili in un blocco `[[tts:text]]...[[/tts:text]]`: + +```text +Ecco il testo pulito della risposta. + +[[tts:text]][whispers] Ecco la versione parlata.[[/tts:text]] +``` + + +Una chiave API di Google Cloud Console limitata alla Gemini API è valida per questo +provider. Questo non è il percorso separato dell'API Cloud Text-to-Speech. ## Configurazione avanzata - Per le esecuzioni dirette dell'API Gemini (`api: "google-generative-ai"`), OpenClaw - passa un handle `cachedContent` configurato alle richieste Gemini. + Per le esecuzioni dirette della Gemini API (`api: "google-generative-ai"`), OpenClaw + passa un handle `cachedContent` configurato direttamente alle richieste Gemini. - - Configura parametri per modello o globali con - `cachedContent` o il legacy `cached_content` - - Se entrambi sono presenti, `cachedContent` ha la precedenza + - Configura i parametri per modello o globali con + `cachedContent` oppure il legacy `cached_content` + - Se sono presenti entrambi, `cachedContent` ha la precedenza - Valore di esempio: `cachedContents/prebuilt-context` - - L'utilizzo cache-hit di Gemini viene normalizzato in `cacheRead` di OpenClaw a partire da + - L'uso di Gemini con cache hit è normalizzato in OpenClaw `cacheRead` a partire da `cachedContentTokenCount` upstream ```json5 @@ -272,21 +317,21 @@ Vedi [Generazione musicale](/it/tools/music-generation) per i parametri condivis - - Quando si usa il provider OAuth `google-gemini-cli`, OpenClaw normalizza + + Quando usi il provider OAuth `google-gemini-cli`, OpenClaw normalizza l'output JSON della CLI come segue: - Il testo della risposta proviene dal campo JSON `response` della CLI. - - L'uso torna a `stats` come fallback quando la CLI lascia vuoto `usage`. - - `stats.cached` viene normalizzato in `cacheRead` di OpenClaw. + - L'utilizzo ricade su `stats` quando la CLI lascia vuoto `usage`. + - `stats.cached` viene normalizzato in OpenClaw `cacheRead`. - Se `stats.input` manca, OpenClaw ricava i token di input da `stats.input_tokens - stats.cached`. - + Se il Gateway viene eseguito come daemon (launchd/systemd), assicurati che `GEMINI_API_KEY` - sia disponibile per quel processo (per esempio, in `~/.openclaw/.env` o tramite + sia disponibile per quel processo (ad esempio in `~/.openclaw/.env` o tramite `env.shellEnv`). @@ -298,12 +343,12 @@ Vedi [Generazione musicale](/it/tools/music-generation) per i parametri condivis Scegliere provider, riferimenti ai modelli e comportamento di failover. - Parametri condivisi dello strumento immagine e selezione del provider. + Parametri condivisi dello strumento per le immagini e selezione del provider. - Parametri condivisi dello strumento video e selezione del provider. + Parametri condivisi dello strumento per i video e selezione del provider. - Parametri condivisi dello strumento musicale e selezione del provider. + Parametri condivisi dello strumento per la musica e selezione del provider. diff --git a/docs/it/refactor/async-exec-duplicate-completion-investigation.md b/docs/it/refactor/async-exec-duplicate-completion-investigation.md new file mode 100644 index 000000000..e97d195c0 --- /dev/null +++ b/docs/it/refactor/async-exec-duplicate-completion-investigation.md @@ -0,0 +1,132 @@ +--- +x-i18n: + generated_at: "2026-04-16T08:18:26Z" + model: gpt-5.4 + provider: openai + source_hash: 95e56c5411204363676f002059c942201503e2359515d1a4b409882cc2e04920 + source_path: refactor/async-exec-duplicate-completion-investigation.md + workflow: 15 +--- + +# Indagine sul completamento duplicato di Async Exec + +## Ambito + +- Sessione: `agent:main:telegram:group:-1003774691294:topic:1` +- Sintomo: lo stesso completamento async exec per sessione/run `keen-nexus` è stato registrato due volte in LCM come turni utente. +- Obiettivo: identificare se la causa più probabile sia una duplicazione dell'iniezione nella sessione oppure un semplice retry della consegna in uscita. + +## Conclusione + +Con maggiore probabilità si tratta di **duplicazione dell'iniezione nella sessione**, non di un puro retry della consegna in uscita. + +La lacuna più significativa lato gateway è nel **percorso di completamento exec del Node**: + +1. Un completamento exec lato Node emette `exec.finished` con il `runId` completo. +2. Il Gateway `server-node-events` lo converte in un evento di sistema e richiede un Heartbeat. +3. L'esecuzione dell'Heartbeat inietta il blocco di eventi di sistema drenati nel prompt dell'agente. +4. Il runner incorporato persiste quel prompt come un nuovo turno utente nel transcript della sessione. + +Se lo stesso `exec.finished` raggiunge il gateway due volte per lo stesso `runId` per qualsiasi motivo (replay, duplicato su reconnessione, resend a monte, producer duplicato), OpenClaw attualmente **non ha alcun controllo di idempotenza con chiave `runId`/`contextKey`** su questo percorso. La seconda copia diventerà un secondo messaggio utente con lo stesso contenuto. + +## Percorso del codice esatto + +### 1. Producer: evento di completamento exec del Node + +- `src/node-host/invoke.ts:340-360` + - `sendExecFinishedEvent(...)` emette `node.event` con evento `exec.finished`. + - Il payload include `sessionKey` e il `runId` completo. + +### 2. Ingestione eventi del Gateway + +- `src/gateway/server-node-events.ts:574-640` + - Gestisce `exec.finished`. + - Costruisce il testo: + - `Exec finished (node=..., id=, code ...)` + - Lo accoda tramite: + - `enqueueSystemEvent(text, { sessionKey, contextKey: runId ? \`exec:${runId}\` : "exec", trusted: false })` + - Richiede immediatamente un risveglio: + - `requestHeartbeatNow(scopedHeartbeatWakeOptions(sessionKey, { reason: "exec-event" }))` + +### 3. Debolezza nella deduplica degli eventi di sistema + +- `src/infra/system-events.ts:90-115` + - `enqueueSystemEvent(...)` sopprime solo i **duplicati consecutivi del testo**: + - `if (entry.lastText === cleaned) return false` + - Memorizza `contextKey`, ma **non** usa `contextKey` per l'idempotenza. + - Dopo il drain, la soppressione dei duplicati si azzera. + +Questo significa che un `exec.finished` riprodotto con lo stesso `runId` può essere accettato di nuovo in seguito, anche se il codice aveva già un candidato stabile per l'idempotenza (`exec:`). + +### 4. La gestione del risveglio non è il duplicatore principale + +- `src/infra/heartbeat-wake.ts:79-117` + - I risvegli vengono coalescenti per `(agentId, sessionKey)`. + - Le richieste di risveglio duplicate per la stessa destinazione collassano in una sola voce di risveglio in attesa. + +Questo rende **la sola gestione duplicata dei risvegli** una spiegazione meno convincente rispetto alla duplicazione nell'ingestione eventi. + +### 5. L'Heartbeat consuma l'evento e lo trasforma in input del prompt + +- `src/infra/heartbeat-runner.ts:535-574` + - Il preflight esamina gli eventi di sistema in attesa e classifica le esecuzioni exec-event. +- `src/auto-reply/reply/session-system-events.ts:86-90` + - `drainFormattedSystemEvents(...)` drena la coda per la sessione. +- `src/auto-reply/reply/get-reply-run.ts:400-427` + - Il blocco di eventi di sistema drenato viene anteposto al corpo del prompt dell'agente. + +### 6. Punto di iniezione nel transcript + +- `src/agents/pi-embedded-runner/run/attempt.ts:2000-2017` + - `activeSession.prompt(effectivePrompt)` invia il prompt completo alla sessione PI incorporata. + - Questo è il punto in cui il prompt derivato dal completamento diventa un turno utente persistito. + +Quindi, una volta che lo stesso evento di sistema viene ricostruito due volte nel prompt, messaggi utente duplicati in LCM sono il comportamento atteso. + +## Perché un semplice retry della consegna in uscita è meno probabile + +Esiste un reale percorso di errore in uscita nel runner dell'Heartbeat: + +- `src/infra/heartbeat-runner.ts:1194-1242` + - La risposta viene generata prima. + - La consegna in uscita avviene dopo tramite `deliverOutboundPayloads(...)`. + - Un errore lì restituisce `{ status: "failed" }`. + +Tuttavia, per la stessa voce della coda di eventi di sistema, questo **da solo non è sufficiente** a spiegare i turni utente duplicati: + +- `src/auto-reply/reply/session-system-events.ts:86-90` + - La coda degli eventi di sistema è già stata drenata prima della consegna in uscita. + +Quindi un retry dell'invio sul canale, da solo, non ricreerebbe esattamente lo stesso evento accodato. Può spiegare una consegna esterna mancante o fallita, ma non da solo un secondo messaggio utente identico nella sessione. + +## Possibilità secondaria, con confidenza più bassa + +Esiste un ciclo di retry dell'intera esecuzione nel runner dell'agente: + +- `src/auto-reply/reply/agent-runner-execution.ts:741-1473` + - Alcuni errori transitori possono ritentare l'intera esecuzione e reinviare lo stesso `commandBody`. + +Questo può duplicare un prompt utente persistito **all'interno della stessa esecuzione di risposta** se il prompt era già stato aggiunto prima che si verificasse la condizione di retry. + +La considero meno probabile rispetto alla duplicazione dell'ingestione di `exec.finished` perché: + +- il gap osservato era di circa 51 secondi, che sembra più un secondo risveglio/turno che un retry in-process; +- il report menziona già ripetuti errori di invio messaggi, il che punta di più a un turno separato successivo che a un retry immediato del modello/runtime. + +## Ipotesi sulla causa radice + +Ipotesi con il livello di confidenza più alto: + +- Il completamento `keen-nexus` è passato attraverso il **percorso di evento exec del Node**. +- Lo stesso `exec.finished` è stato consegnato due volte a `server-node-events`. +- Il Gateway ha accettato entrambe le copie perché `enqueueSystemEvent(...)` non deduplica in base a `contextKey` / `runId`. +- Ogni evento accettato ha attivato un Heartbeat ed è stato iniettato come turno utente nel transcript PI. + +## Piccola correzione chirurgica proposta + +Se si desidera una correzione, la modifica minima ad alto valore è: + +- far sì che l'idempotenza di exec/eventi di sistema rispetti `contextKey` per un breve intervallo, almeno per ripetizioni esatte di `(sessionKey, contextKey, text)`; +- oppure aggiungere una deduplica dedicata in `server-node-events` per `exec.finished`, con chiave `(sessionKey, runId, tipo di evento)`. + +Questo bloccherebbe direttamente i duplicati di `exec.finished` dovuti a replay prima che diventino turni di sessione. diff --git a/docs/it/tools/tts.md b/docs/it/tools/tts.md index fa56d6390..50e5c9435 100644 --- a/docs/it/tools/tts.md +++ b/docs/it/tools/tts.md @@ -1,62 +1,64 @@ --- read_when: - - Abilitare la sintesi vocale per le risposte - - Configurare provider o limiti TTS - - Usare i comandi `/tts` + - Abilitazione della sintesi vocale per le risposte + - Configurazione dei provider TTS o dei limiti + - Uso dei comandi `/tts` summary: Sintesi vocale (TTS) per le risposte in uscita title: Sintesi vocale x-i18n: - generated_at: "2026-04-12T23:33:43Z" + generated_at: "2026-04-16T08:18:34Z" model: gpt-5.4 provider: openai - source_hash: ad79a6be34879347dc73fdab1bd219823cd7c6aa8504e3e4c73e1a0554c837c5 + source_hash: de7c1dc8831c1ba307596afd48cb4d36f844724887a13b17e35f41ef5174a86f source_path: tools/tts.md workflow: 15 --- # Sintesi vocale (TTS) -OpenClaw può convertire le risposte in uscita in audio usando ElevenLabs, Microsoft, MiniMax o OpenAI. +OpenClaw può convertire le risposte in uscita in audio usando ElevenLabs, Google Gemini, Microsoft, MiniMax o OpenAI. Funziona ovunque OpenClaw possa inviare audio. ## Servizi supportati - **ElevenLabs** (provider primario o di fallback) -- **Microsoft** (provider primario o di fallback; l'implementazione integrata attuale usa `node-edge-tts`) +- **Google Gemini** (provider primario o di fallback; usa Gemini API TTS) +- **Microsoft** (provider primario o di fallback; l'implementazione bundled corrente usa `node-edge-tts`) - **MiniMax** (provider primario o di fallback; usa l'API T2A v2) - **OpenAI** (provider primario o di fallback; usato anche per i riepiloghi) -### Note sulla voce Microsoft +### Note sulla sintesi vocale Microsoft -Il provider vocale Microsoft integrato usa attualmente il servizio TTS neurale -online di Microsoft Edge tramite la libreria `node-edge-tts`. È un servizio ospitato (non -locale), usa endpoint Microsoft e non richiede una chiave API. -`node-edge-tts` espone opzioni di configurazione della voce e formati di output, ma -non tutte le opzioni sono supportate dal servizio. La configurazione legacy e l'input delle direttive -che usano `edge` continuano a funzionare e vengono normalizzati a `microsoft`. +Il provider bundled per la sintesi vocale Microsoft usa attualmente il servizio +TTS neurale online di Microsoft Edge tramite la libreria `node-edge-tts`. È un +servizio ospitato (non locale), usa endpoint Microsoft e non richiede una chiave API. +`node-edge-tts` espone opzioni di configurazione vocale e formati di output, ma +non tutte le opzioni sono supportate dal servizio. La configurazione legacy e l'input +delle direttive che usa `edge` continuano a funzionare e vengono normalizzati in `microsoft`. -Poiché questo percorso è un servizio web pubblico senza SLA o quota pubblicati, -consideralo best-effort. Se hai bisogno di limiti garantiti e supporto, usa OpenAI +Poiché questo percorso usa un servizio web pubblico senza uno SLA o una quota pubblicati, +consideralo come best-effort. Se ti servono limiti garantiti e supporto, usa OpenAI o ElevenLabs. ## Chiavi facoltative -Se vuoi OpenAI, ElevenLabs o MiniMax: +Se vuoi usare OpenAI, ElevenLabs, Google Gemini o MiniMax: - `ELEVENLABS_API_KEY` (o `XI_API_KEY`) +- `GEMINI_API_KEY` (o `GOOGLE_API_KEY`) - `MINIMAX_API_KEY` - `OPENAI_API_KEY` -La voce Microsoft **non** richiede una chiave API. +La sintesi vocale Microsoft **non** richiede una chiave API. -Se sono configurati più provider, viene usato prima il provider selezionato e gli altri diventano opzioni di fallback. +Se sono configurati più provider, il provider selezionato viene usato per primo e gli altri diventano opzioni di fallback. Il riepilogo automatico usa il `summaryModel` configurato (o `agents.defaults.model.primary`), quindi anche quel provider deve essere autenticato se abiliti i riepiloghi. ## Link ai servizi - [Guida OpenAI Text-to-Speech](https://platform.openai.com/docs/guides/text-to-speech) -- [Riferimento API Audio OpenAI](https://platform.openai.com/docs/api-reference/audio) +- [Riferimento OpenAI Audio API](https://platform.openai.com/docs/api-reference/audio) - [ElevenLabs Text to Speech](https://elevenlabs.io/docs/api-reference/text-to-speech) - [Autenticazione ElevenLabs](https://elevenlabs.io/docs/api-reference/authentication) - [API MiniMax T2A v2](https://platform.minimaxi.com/document/T2A%20V2) @@ -65,15 +67,15 @@ quindi anche quel provider deve essere autenticato se abiliti i riepiloghi. ## È abilitato per impostazione predefinita? -No. L'auto-TTS è **disattivato** per impostazione predefinita. Abilitalo nella configurazione con -`messages.tts.auto` o localmente con `/tts on`. +No. L'auto‑TTS è **disattivato** per impostazione predefinita. Abilitalo nella configurazione con +`messages.tts.auto` oppure localmente con `/tts on`. Quando `messages.tts.provider` non è impostato, OpenClaw sceglie il primo provider vocale configurato nell'ordine di selezione automatica del registro. ## Configurazione -La configurazione TTS si trova sotto `messages.tts` in `openclaw.json`. +La configurazione TTS si trova in `messages.tts` in `openclaw.json`. Lo schema completo è in [Configurazione del Gateway](/it/gateway/configuration). ### Configurazione minima (abilitazione + provider) @@ -177,7 +179,33 @@ Lo schema completo è in [Configurazione del Gateway](/it/gateway/configuration) } ``` -### Disabilitare la voce Microsoft +### Google Gemini primario + +```json5 +{ + messages: { + tts: { + auto: "always", + provider: "google", + providers: { + google: { + apiKey: "gemini_api_key", + model: "gemini-3.1-flash-tts-preview", + voiceName: "Kore", + }, + }, + }, + }, +} +``` + +Google Gemini TTS usa il percorso della chiave API Gemini. Una chiave API di Google Cloud Console +limitata alla Gemini API è valida anche qui, ed è lo stesso tipo di chiave usato +dal provider bundled di generazione immagini Google. L'ordine di risoluzione è +`messages.tts.providers.google.apiKey` -> `models.providers.google.apiKey` -> +`GEMINI_API_KEY` -> `GOOGLE_API_KEY`. + +### Disattivare la sintesi vocale Microsoft ```json5 { @@ -193,7 +221,7 @@ Lo schema completo è in [Configurazione del Gateway](/it/gateway/configuration) } ``` -### Limiti personalizzati + percorso delle preferenze +### Limiti personalizzati + percorso prefs ```json5 { @@ -208,7 +236,7 @@ Lo schema completo è in [Configurazione del Gateway](/it/gateway/configuration) } ``` -### Rispondi solo con audio dopo un messaggio vocale in ingresso +### Rispondere con audio solo dopo un messaggio vocale in ingresso ```json5 { @@ -220,7 +248,7 @@ Lo schema completo è in [Configurazione del Gateway](/it/gateway/configuration) } ``` -### Disabilitare il riepilogo automatico per le risposte lunghe +### Disattivare il riepilogo automatico per le risposte lunghe ```json5 { @@ -240,28 +268,28 @@ Poi esegui: ### Note sui campi -- `auto`: modalità auto-TTS (`off`, `always`, `inbound`, `tagged`). +- `auto`: modalità auto‑TTS (`off`, `always`, `inbound`, `tagged`). - `inbound` invia audio solo dopo un messaggio vocale in ingresso. - `tagged` invia audio solo quando la risposta include direttive `[[tts:key=value]]` o un blocco `[[tts:text]]...[[/tts:text]]`. - `enabled`: interruttore legacy (doctor lo migra in `auto`). -- `mode`: `"final"` (predefinito) o `"all"` (include risposte di tool/blocco). -- `provider`: id del provider vocale come `"elevenlabs"`, `"microsoft"`, `"minimax"` o `"openai"` (il fallback è automatico). -- Se `provider` **non è impostato**, OpenClaw usa il primo provider vocale configurato nell'ordine di selezione automatica del registro. -- Il valore legacy `provider: "edge"` continua a funzionare e viene normalizzato a `microsoft`. +- `mode`: `"final"` (predefinito) o `"all"` (include risposte di strumenti/blocchi). +- `provider`: id del provider vocale, ad esempio `"elevenlabs"`, `"google"`, `"microsoft"`, `"minimax"` o `"openai"` (il fallback è automatico). +- Se `provider` **non** è impostato, OpenClaw usa il primo provider vocale configurato nell'ordine di selezione automatica del registro. +- Il legacy `provider: "edge"` continua a funzionare e viene normalizzato in `microsoft`. - `summaryModel`: modello economico facoltativo per il riepilogo automatico; per impostazione predefinita usa `agents.defaults.model.primary`. - Accetta `provider/model` o un alias di modello configurato. -- `modelOverrides`: consente al modello di emettere direttive TTS (attivo per impostazione predefinita). - - `allowProvider` è `false` per impostazione predefinita (il cambio provider è opt-in). -- `providers.`: impostazioni gestite dal provider, con chiave pari all'id del provider vocale. +- `modelOverrides`: consente al modello di emettere direttive TTS (attivato per impostazione predefinita). + - `allowProvider` è `false` per impostazione predefinita (il cambio di provider è opt-in). +- `providers.`: impostazioni gestite dal provider, indicizzate per id del provider vocale. - I blocchi provider legacy diretti (`messages.tts.openai`, `messages.tts.elevenlabs`, `messages.tts.microsoft`, `messages.tts.edge`) vengono migrati automaticamente in `messages.tts.providers.` al caricamento. - `maxTextLength`: limite rigido per l'input TTS (caratteri). `/tts audio` fallisce se viene superato. - `timeoutMs`: timeout della richiesta (ms). -- `prefsPath`: sovrascrive il percorso JSON locale delle preferenze (provider/limite/riepilogo). -- I valori `apiKey` usano come fallback le variabili env (`ELEVENLABS_API_KEY`/`XI_API_KEY`, `MINIMAX_API_KEY`, `OPENAI_API_KEY`). -- `providers.elevenlabs.baseUrl`: sovrascrive l'URL base API di ElevenLabs. -- `providers.openai.baseUrl`: sovrascrive l'endpoint TTS OpenAI. +- `prefsPath`: sovrascrive il percorso JSON delle preferenze locali (provider/limite/riepilogo). +- I valori `apiKey` usano come fallback le variabili d'ambiente (`ELEVENLABS_API_KEY`/`XI_API_KEY`, `GEMINI_API_KEY`/`GOOGLE_API_KEY`, `MINIMAX_API_KEY`, `OPENAI_API_KEY`). +- `providers.elevenlabs.baseUrl`: sovrascrive l'URL base dell'API ElevenLabs. +- `providers.openai.baseUrl`: sovrascrive l'endpoint OpenAI TTS. - Ordine di risoluzione: `messages.tts.providers.openai.baseUrl` -> `OPENAI_TTS_BASE_URL` -> `https://api.openai.com/v1` - - I valori non predefiniti vengono trattati come endpoint TTS compatibili con OpenAI, quindi sono accettati nomi personalizzati di modello e voce. + - I valori diversi da quello predefinito vengono trattati come endpoint TTS compatibili con OpenAI, quindi sono accettati nomi personalizzati di modello e voce. - `providers.elevenlabs.voiceSettings`: - `stability`, `similarityBoost`, `style`: `0..1` - `useSpeakerBoost`: `true|false` @@ -269,21 +297,25 @@ Poi esegui: - `providers.elevenlabs.applyTextNormalization`: `auto|on|off` - `providers.elevenlabs.languageCode`: ISO 639-1 a 2 lettere (ad esempio `en`, `de`) - `providers.elevenlabs.seed`: intero `0..4294967295` (determinismo best-effort) -- `providers.minimax.baseUrl`: sovrascrive l'URL base API di MiniMax (predefinito `https://api.minimax.io`, env: `MINIMAX_API_HOST`). +- `providers.minimax.baseUrl`: sovrascrive l'URL base dell'API MiniMax (predefinito `https://api.minimax.io`, env: `MINIMAX_API_HOST`). - `providers.minimax.model`: modello TTS (predefinito `speech-2.8-hd`, env: `MINIMAX_TTS_MODEL`). - `providers.minimax.voiceId`: identificatore della voce (predefinito `English_expressive_narrator`, env: `MINIMAX_TTS_VOICE_ID`). -- `providers.minimax.speed`: velocità di riproduzione `0.5..2.0` (predefinito 1.0). +- `providers.minimax.speed`: velocità di riproduzione `0.5..2.0` (predefinita 1.0). - `providers.minimax.vol`: volume `(0, 10]` (predefinito 1.0; deve essere maggiore di 0). -- `providers.minimax.pitch`: variazione del tono `-12..12` (predefinito 0). -- `providers.microsoft.enabled`: consente l'uso della voce Microsoft (predefinito `true`; nessuna chiave API). +- `providers.minimax.pitch`: variazione di tonalità `-12..12` (predefinita 0). +- `providers.google.model`: modello Gemini TTS (predefinito `gemini-3.1-flash-tts-preview`). +- `providers.google.voiceName`: nome della voce predefinita Gemini (predefinito `Kore`; è accettato anche `voice`). +- `providers.google.baseUrl`: sovrascrive l'URL base della Gemini API. È accettato solo `https://generativelanguage.googleapis.com`. + - Se `messages.tts.providers.google.apiKey` è omesso, TTS può riutilizzare `models.providers.google.apiKey` prima del fallback alle variabili d'ambiente. +- `providers.microsoft.enabled`: consente l'uso della sintesi vocale Microsoft (predefinito `true`; nessuna chiave API). - `providers.microsoft.voice`: nome della voce neurale Microsoft (ad esempio `en-US-MichelleNeural`). - `providers.microsoft.lang`: codice lingua (ad esempio `en-US`). - `providers.microsoft.outputFormat`: formato di output Microsoft (ad esempio `audio-24khz-48kbitrate-mono-mp3`). - - Consulta i formati di output Microsoft Speech per i valori validi; non tutti i formati sono supportati dal trasporto integrato basato su Edge. + - Consulta i formati di output Microsoft Speech per i valori validi; non tutti i formati sono supportati dal trasporto bundled basato su Edge. - `providers.microsoft.rate` / `providers.microsoft.pitch` / `providers.microsoft.volume`: stringhe percentuali (ad esempio `+10%`, `-5%`). - `providers.microsoft.saveSubtitles`: scrive sottotitoli JSON accanto al file audio. -- `providers.microsoft.proxy`: URL proxy per le richieste vocali Microsoft. -- `providers.microsoft.timeoutMs`: override del timeout della richiesta (ms). +- `providers.microsoft.proxy`: URL proxy per le richieste Microsoft speech. +- `providers.microsoft.timeoutMs`: sovrascrittura del timeout della richiesta (ms). - `edge.*`: alias legacy per le stesse impostazioni Microsoft. ## Override guidati dal modello (attivi per impostazione predefinita) @@ -292,13 +324,13 @@ Per impostazione predefinita, il modello **può** emettere direttive TTS per una Quando `messages.tts.auto` è `tagged`, queste direttive sono necessarie per attivare l'audio. Quando è attivo, il modello può emettere direttive `[[tts:...]]` per sovrascrivere la voce -per una singola risposta, più un blocco facoltativo `[[tts:text]]...[[/tts:text]]` per -fornire tag espressivi (risate, segnali di canto, ecc.) che dovrebbero comparire -solo nell'audio. +per una singola risposta, oltre a un blocco facoltativo `[[tts:text]]...[[/tts:text]]` per +fornire tag espressivi (risate, indicazioni di canto, ecc.) che devono comparire solo +nell'audio. Le direttive `provider=...` vengono ignorate a meno che `modelOverrides.allowProvider: true`. -Esempio di payload della risposta: +Esempio di payload di risposta: ``` Ecco qui. @@ -307,19 +339,19 @@ Ecco qui. [[tts:text]](ride) Leggi di nuovo la canzone.[[/tts:text]] ``` -Chiavi di direttiva disponibili (quando abilitate): +Chiavi direttiva disponibili (quando abilitate): -- `provider` (id del provider vocale registrato, ad esempio `openai`, `elevenlabs`, `minimax` o `microsoft`; richiede `allowProvider: true`) -- `voice` (voce OpenAI) o `voiceId` (ElevenLabs / MiniMax) -- `model` (modello TTS OpenAI, model id ElevenLabs o modello MiniMax) +- `provider` (id del provider vocale registrato, per esempio `openai`, `elevenlabs`, `google`, `minimax` o `microsoft`; richiede `allowProvider: true`) +- `voice` (voce OpenAI), `voiceName` / `voice_name` / `google_voice` (voce Google), o `voiceId` (ElevenLabs / MiniMax) +- `model` (modello OpenAI TTS, id del modello ElevenLabs o modello MiniMax) oppure `google_model` (modello Google TTS) - `stability`, `similarityBoost`, `style`, `speed`, `useSpeakerBoost` - `vol` / `volume` (volume MiniMax, 0-10) -- `pitch` (tono MiniMax, da -12 a 12) +- `pitch` (tonalità MiniMax, da -12 a 12) - `applyTextNormalization` (`auto|on|off`) - `languageCode` (ISO 639-1) - `seed` -Disabilitare tutti gli override del modello: +Disattivare tutti gli override del modello: ```json5 { @@ -333,7 +365,7 @@ Disabilitare tutti gli override del modello: } ``` -Allowlist facoltativa (abilita il cambio provider mantenendo configurabili gli altri controlli): +Allowlist facoltativa (abilita il cambio di provider mantenendo configurabili gli altri parametri): ```json5 { @@ -351,7 +383,7 @@ Allowlist facoltativa (abilita il cambio provider mantenendo configurabili gli a ## Preferenze per utente -I comandi slash scrivono gli override locali in `prefsPath` (predefinito: +I comandi slash scrivono override locali in `prefsPath` (predefinito: `~/.openclaw/settings/tts.json`, sovrascrivibile con `OPENCLAW_TTS_PREFS` o `messages.tts.prefsPath`). @@ -359,7 +391,7 @@ Campi memorizzati: - `enabled` - `provider` -- `maxLength` (soglia del riepilogo; predefinito 1500 caratteri) +- `maxLength` (soglia del riepilogo; predefinita 1500 caratteri) - `summarize` (predefinito `true`) Questi sovrascrivono `messages.tts.*` per quell'host. @@ -370,26 +402,27 @@ Questi sovrascrivono `messages.tts.*` per quell'host. - 48kHz / 64kbps è un buon compromesso per i messaggi vocali. - **Altri canali**: MP3 (`mp3_44100_128` da ElevenLabs, `mp3` da OpenAI). - 44.1kHz / 128kbps è il bilanciamento predefinito per la chiarezza del parlato. -- **MiniMax**: MP3 (modello `speech-2.8-hd`, frequenza di campionamento 32kHz). Il formato nota vocale non è supportato in modo nativo; usa OpenAI o ElevenLabs per messaggi vocali Opus garantiti. +- **MiniMax**: MP3 (modello `speech-2.8-hd`, frequenza di campionamento 32kHz). Il formato nota vocale non è supportato nativamente; usa OpenAI o ElevenLabs per messaggi vocali Opus garantiti. +- **Google Gemini**: Gemini API TTS restituisce PCM grezzo a 24kHz. OpenClaw lo incapsula come WAV per gli allegati audio e restituisce PCM direttamente per Talk/telefonia. Il formato nota vocale Opus nativo non è supportato da questo percorso. - **Microsoft**: usa `microsoft.outputFormat` (predefinito `audio-24khz-48kbitrate-mono-mp3`). - - Il trasporto integrato accetta un `outputFormat`, ma non tutti i formati sono disponibili dal servizio. - - I valori di formato output seguono i formati di output Microsoft Speech (inclusi Ogg/WebM Opus). + - Il trasporto bundled accetta un `outputFormat`, ma non tutti i formati sono disponibili dal servizio. + - I valori del formato di output seguono i formati di output Microsoft Speech (inclusi Ogg/WebM Opus). - Telegram `sendVoice` accetta OGG/MP3/M4A; usa OpenAI/ElevenLabs se ti servono messaggi vocali Opus garantiti. - - Se il formato Microsoft configurato fallisce, OpenClaw riprova con MP3. + - Se il formato di output Microsoft configurato fallisce, OpenClaw riprova con MP3. I formati di output OpenAI/ElevenLabs sono fissi per canale (vedi sopra). -## Comportamento dell'auto-TTS +## Comportamento auto-TTS Quando è abilitato, OpenClaw: -- salta il TTS se la risposta contiene già media o una direttiva `MEDIA:`. +- salta il TTS se la risposta contiene già contenuti multimediali o una direttiva `MEDIA:`. - salta le risposte molto brevi (< 10 caratteri). - riepiloga le risposte lunghe quando abilitato usando `agents.defaults.model.primary` (o `summaryModel`). - allega l'audio generato alla risposta. -Se la risposta supera `maxLength` e il riepilogo è disattivato (oppure manca una chiave API per il +Se la risposta supera `maxLength` e il riepilogo è disattivato (oppure non c'è alcuna chiave API per il modello di riepilogo), l'audio viene saltato e viene inviata la normale risposta testuale. @@ -398,23 +431,23 @@ viene saltato e viene inviata la normale risposta testuale. ``` Risposta -> TTS abilitato? no -> invia testo - sì -> contiene media / MEDIA: / è breve? + sì -> contiene media / MEDIA: / è breve? sì -> invia testo no -> lunghezza > limite? no -> TTS -> allega audio sì -> riepilogo abilitato? no -> invia testo - sì -> riepiloga (summaryModel o agents.defaults.model.primary) + sì -> riepiloga (`summaryModel` o `agents.defaults.model.primary`) -> TTS -> allega audio ``` ## Utilizzo del comando slash -Esiste un unico comando: `/tts`. -Vedi [Comandi slash](/it/tools/slash-commands) per i dettagli di abilitazione. +Esiste un solo comando: `/tts`. +Vedi [Comandi slash](/it/tools/slash-commands) per i dettagli sull'abilitazione. Nota Discord: `/tts` è un comando integrato di Discord, quindi OpenClaw registra -`/voice` come comando nativo lì. Il testo `/tts ...` continua comunque a funzionare. +`/voice` come comando nativo lì. Il testo `/tts ...` continua a funzionare. ``` /tts off @@ -428,8 +461,8 @@ Nota Discord: `/tts` è un comando integrato di Discord, quindi OpenClaw registr Note: -- I comandi richiedono un mittente autorizzato (si applicano comunque le regole di allowlist/proprietario). -- Devono essere abilitati `commands.text` o la registrazione dei comandi nativi. +- I comandi richiedono un mittente autorizzato (continuano ad applicarsi le regole di allowlist/proprietario). +- `commands.text` o la registrazione dei comandi nativi devono essere abilitati. - La configurazione `messages.tts.auto` accetta `off|always|inbound|tagged`. - `/tts on` scrive la preferenza TTS locale su `always`; `/tts off` la scrive su `off`. - Usa la configurazione quando vuoi impostazioni predefinite `inbound` o `tagged`. @@ -439,15 +472,15 @@ Note: - fallback riuscito: `Fallback: -> ` più `Attempts: ...` - errore: `Error: ...` più `Attempts: ...` - diagnostica dettagliata: `Attempt details: provider:outcome(reasonCode) latency` -- Gli errori API di OpenAI ed ElevenLabs ora includono dettagli di errore del provider analizzati e l'id richiesta (quando restituito dal provider), che viene mostrato negli errori/log del TTS. +- Gli errori API di OpenAI ed ElevenLabs ora includono i dettagli dell'errore del provider analizzati e l'id richiesta (quando restituito dal provider), che viene mostrato negli errori/log TTS. -## Strumento agente +## Strumento dell'agente Lo strumento `tts` converte il testo in parlato e restituisce un allegato audio per la consegna della risposta. Quando il canale è Feishu, Matrix, Telegram o WhatsApp, -l'audio viene consegnato come messaggio vocale anziché come allegato file. +l'audio viene consegnato come messaggio vocale invece che come allegato file. -## Gateway RPC +## RPC Gateway Metodi Gateway: