chore(i18n): refresh it translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-16 08:20:21 +00:00
parent 66b61bda2e
commit e7724be3f3
5 changed files with 883 additions and 532 deletions

View File

@ -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 `<active_memory_plugin>...</active_memory_plugin>` 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):
</active_memory_plugin>
```
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/<agent>/sessions/active-memory/<blocking-memory-sub-agent-session-id>.jsonl
@ -523,15 +608,15 @@ agents/<agent>/sessions/active-memory/<blocking-memory-sub-agent-session-id>.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 p 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)

View File

@ -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 dellhandshake.
## 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
delloperatore 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`.
Lambito 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 dellapprovazione, 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 listantanea 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 lidentità del dispositivo gateway usata dai flussi di relay e
pairing.
- `system-presence` restituisce lo snapshot corrente della presenza dei dispositivi
- `system-presence` restituisce listantanea 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 lultimo evento Heartbeat persistito.
- `set-heartbeats` abilita o disabilita lelaborazione 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 dellagente 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 lattuale 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` è lRPC 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 linventario 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 listantanea 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 lintero 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 dallinterfaccia, 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 allutente 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.
laggiornamento 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 lidentità effettiva dellassistente 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 unesecuzione e restituisce listantanea 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 lindice 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
- lesecuzione 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
`<tool_call>...</tool_call>`, `<function_call>...</function_call>`,
`<tool_calls>...</tool_calls>`, `<function_calls>...</function_calls>` 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.
`<tool_calls>...</tool_calls>`, `<function_calls>...</function_calls>`, 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 lesatto `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 lassociazione dei nodi e la verifica
del bootstrap.
- `node.list` e `node.describe` restituiscono lo stato dei nodi noti/connessi.
- `node.rename` aggiorna unetichetta 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 uniniezione 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`: lindice delle sessioni o i metadati sono cambiati.
- `presence`: aggiornamenti dellistantanea della presenza di sistema.
- `tick`: evento periodico di keepalive / rilevamento attività.
- `health`: aggiornamento dellistantanea 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 dellassociazione 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.
dellapprovazione exec.
- `plugin.approval.requested` / `plugin.approval.resolved`: ciclo di vita
dellapprovazione 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 lelenco corrente degli eseguibili delle Skills
per i controlli di auto-allow.
### Metodi helper dell'operatore
### Metodi helper delloperator
- 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 linventario dei comandi a runtime per un
agente.
- `agentId` è facoltativo; ometterlo per leggere lo spazio di lavoro dellagente 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 linventario 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 linventario visibile delle
Skills per un agente.
- `agentId` è facoltativo; ometterlo per leggere lo spazio di lavoro dellagente 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.<skillKey>` 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 dellagente predefinito.
- modalità installer del gateway: `{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }`
esegue unazione dichiarata `metadata.openclaw.install` sullhost 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 dellagente predefinito.
- la modalità config aggiorna con patch i valori `skills.entries.<skillKey>` 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 lambito `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 lapprovazione, 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 linoltro finale approvato di `system.run`, il
gateway rifiuta lesecuzione invece di fidarsi del payload modificato.
## Fallback di consegna dell'agente
## Fallback di consegna dellagente
- 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 allesecuzione 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 allhandshake.
## Auth
- L'auth del gateway con segreto condiviso usa `connect.params.auth.token` oppure
- Lautenticazione 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 lauth di connessione con secret condiviso; non esporre questa modalità su ingressi pubblici/non affidabili.
- Dopo lassociazione, 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 linsieme di ambiti approvati memorizzato per quel token. Questo preserva laccesso di lettura/verifica/stato
già concesso ed evita che le riconnessioni si riducano silenziosamente a un
ambito implicito più ristretto limitato alladmin.
- 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.
- Lauto-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, quellinsieme 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 lambito `operator.pairing`).
- Lemissione/rotazione del token resta limitata allinsieme 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 lapprovazione 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 linsieme 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 alloperatore.
## Identità del dispositivo + pairing
- I nodi devono includere un'identità del dispositivo stabile (`device.id`) derivata da una
- I nodi dovrebbero includere unidentità 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
lauto-approvazione locale.
- Lauto-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 lidentità `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`.

View File

@ -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
</Tab>
<Tab title="Gemini CLI (OAuth)">
**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.
<Warning>
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.
</Step>
<Step title="Accedi tramite OAuth">
```bash
@ -117,8 +117,8 @@ Scegli il metodo di autenticazione che preferisci e segui i passaggi di configur
(Oppure le varianti `GEMINI_CLI_*`.)
<Note>
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.
</Note>
<Note>
@ -126,37 +126,38 @@ Scegli il metodo di autenticazione che preferisci e segui i passaggi di configur
sia installato e presente nel `PATH`.
</Note>
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`.
</Tab>
</Tabs>
## 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ì |
<Tip>
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`.
</Tip>
## 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:
```
<Note>
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.
</Note>
## 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:
```
<Note>
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.
</Note>
## 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:
```
<Note>
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.
</Note>
## 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]]
```
<Note>
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.
</Note>
## Configurazione avanzata
<AccordionGroup>
<Accordion title="Riutilizzo diretto della cache Gemini">
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
</Accordion>
<Accordion title="Note sull'uso JSON di Gemini CLI">
Quando si usa il provider OAuth `google-gemini-cli`, OpenClaw normalizza
<Accordion title="Note sull'uso del JSON di Gemini CLI">
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`.
</Accordion>
<Accordion title="Configurazione dell'ambiente e del daemon">
<Accordion title="Configurazione di ambiente e daemon">
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`).
</Accordion>
</AccordionGroup>
@ -298,12 +343,12 @@ Vedi [Generazione musicale](/it/tools/music-generation) per i parametri condivis
Scegliere provider, riferimenti ai modelli e comportamento di failover.
</Card>
<Card title="Generazione di immagini" href="/it/tools/image-generation" icon="image">
Parametri condivisi dello strumento immagine e selezione del provider.
Parametri condivisi dello strumento per le immagini e selezione del provider.
</Card>
<Card title="Generazione video" href="/it/tools/video-generation" icon="video">
Parametri condivisi dello strumento video e selezione del provider.
Parametri condivisi dello strumento per i video e selezione del provider.
</Card>
<Card title="Generazione musicale" href="/it/tools/music-generation" icon="music">
Parametri condivisi dello strumento musicale e selezione del provider.
Parametri condivisi dello strumento per la musica e selezione del provider.
</Card>
</CardGroup>

View File

@ -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=<runId>, 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:<runId>`).
### 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.

View File

@ -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'autoTTS è **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à autoTTS (`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.<id>`: 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.<id>`: 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.<id>` 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
-> 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: <primary> -> <used>` 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: