chore(i18n): refresh it translations
This commit is contained in:
parent
13131876af
commit
da963bfe1e
@ -1,31 +1,30 @@
|
||||
---
|
||||
read_when:
|
||||
- Lavoro sulle funzionalità del canale Microsoft Teams
|
||||
summary: Stato del supporto del bot Microsoft Teams, capacità e configurazione
|
||||
- Lavorando sulle funzionalità del canale Microsoft Teams
|
||||
summary: stato del supporto del bot Microsoft Teams, capacità e configurazione
|
||||
title: Microsoft Teams
|
||||
x-i18n:
|
||||
generated_at: "2026-04-05T13:47:21Z"
|
||||
generated_at: "2026-04-12T00:18:53Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 99fc6e136893ec65dc85d3bc0c0d92134069a2f3b8cb4fcf66c14674399b3eaf
|
||||
source_hash: 3e6841a618fb030e4c2029b3652d45dedd516392e2ae17309ff46b93648ffb79
|
||||
source_path: channels/msteams.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Microsoft Teams
|
||||
|
||||
> "Lasciate ogni speranza, voi che entrate qui."
|
||||
> "Lasciate ogni speranza, voi ch'entrate."
|
||||
|
||||
Aggiornato: 2026-01-21
|
||||
Aggiornato: 2026-03-25
|
||||
|
||||
Stato: il testo + gli allegati DM sono supportati; l'invio di file in canali/gruppi richiede `sharePointSiteId` + autorizzazioni Graph (vedi [Invio di file nelle chat di gruppo](#sending-files-in-group-chats)). I sondaggi vengono inviati tramite Adaptive Cards. Le azioni del messaggio espongono `upload-file` esplicito per gli invii con file come primo elemento.
|
||||
Stato: testo + allegati nei DM sono supportati; l'invio di file in canali/gruppi richiede `sharePointSiteId` + autorizzazioni Graph (vedi [Invio di file nelle chat di gruppo](#sending-files-in-group-chats)). I sondaggi vengono inviati tramite Adaptive Cards. Le azioni sui messaggi espongono `upload-file` esplicito per gli invii incentrati sui file.
|
||||
|
||||
## Plugin incluso
|
||||
|
||||
Microsoft Teams viene fornito come plugin incluso nelle attuali versioni di OpenClaw, quindi
|
||||
non è necessaria alcuna installazione separata nella normale build pacchettizzata.
|
||||
Microsoft Teams è distribuito come plugin incluso nelle attuali release di OpenClaw, quindi non è richiesta alcuna installazione separata nella normale build pacchettizzata.
|
||||
|
||||
Se usi una build precedente o un'installazione personalizzata che esclude Teams incluso,
|
||||
Se usi una build meno recente o un'installazione personalizzata che esclude Teams incluso,
|
||||
installalo manualmente:
|
||||
|
||||
```bash
|
||||
@ -38,19 +37,19 @@ Checkout locale (quando esegui da un repository git):
|
||||
openclaw plugins install ./path/to/local/msteams-plugin
|
||||
```
|
||||
|
||||
Dettagli: [Plugins](/tools/plugin)
|
||||
Dettagli: [Plugin](/it/tools/plugin)
|
||||
|
||||
## Configurazione rapida (principianti)
|
||||
|
||||
1. Assicurati che il plugin Microsoft Teams sia disponibile.
|
||||
- Le attuali versioni pacchettizzate di OpenClaw lo includono già.
|
||||
- Le installazioni precedenti/personalizzate possono aggiungerlo manualmente con i comandi sopra.
|
||||
2. Crea un **Azure Bot** (ID app + client secret + ID tenant).
|
||||
- Le attuali release pacchettizzate di OpenClaw lo includono già.
|
||||
- Le installazioni meno recenti/personalizzate possono aggiungerlo manualmente con i comandi sopra.
|
||||
2. Crea un **Azure Bot** (App ID + client secret + tenant ID).
|
||||
3. Configura OpenClaw con queste credenziali.
|
||||
4. Esponi `/api/messages` (porta 3978 per impostazione predefinita) tramite un URL pubblico o un tunnel.
|
||||
5. Installa il pacchetto app Teams e avvia il gateway.
|
||||
5. Installa il pacchetto dell'app Teams e avvia il gateway.
|
||||
|
||||
Configurazione minima:
|
||||
Configurazione minima (client secret):
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -66,13 +65,15 @@ Configurazione minima:
|
||||
}
|
||||
```
|
||||
|
||||
Nota: le chat di gruppo sono bloccate per impostazione predefinita (`channels.msteams.groupPolicy: "allowlist"`). Per consentire le risposte nei gruppi, imposta `channels.msteams.groupAllowFrom` (oppure usa `groupPolicy: "open"` per consentire qualsiasi membro, con gate basato su menzione).
|
||||
Per i deployment di produzione, valuta l'uso di [autenticazione federata](#federated-authentication-certificate--managed-identity) (certificato o managed identity) invece dei client secret.
|
||||
|
||||
Nota: le chat di gruppo sono bloccate per impostazione predefinita (`channels.msteams.groupPolicy: "allowlist"`). Per consentire le risposte nei gruppi, imposta `channels.msteams.groupAllowFrom` (oppure usa `groupPolicy: "open"` per consentire qualsiasi membro, con vincolo di menzione).
|
||||
|
||||
## Obiettivi
|
||||
|
||||
- Parlare con OpenClaw tramite DM Teams, chat di gruppo o canali.
|
||||
- Parlare con OpenClaw tramite DM, chat di gruppo o canali di Teams.
|
||||
- Mantenere il routing deterministico: le risposte tornano sempre al canale da cui sono arrivate.
|
||||
- Adottare per impostazione predefinita un comportamento sicuro nei canali (menzioni richieste salvo diversa configurazione).
|
||||
- Adottare per impostazione predefinita un comportamento sicuro nei canali (menzioni obbligatorie salvo configurazione diversa).
|
||||
|
||||
## Scritture di configurazione
|
||||
|
||||
@ -86,7 +87,7 @@ Disabilita con:
|
||||
}
|
||||
```
|
||||
|
||||
## Controllo degli accessi (DM + gruppi)
|
||||
## Controllo accessi (DM + gruppi)
|
||||
|
||||
**Accesso DM**
|
||||
|
||||
@ -95,11 +96,11 @@ Disabilita con:
|
||||
- UPN/nomi visualizzati sono modificabili; la corrispondenza diretta è disabilitata per impostazione predefinita e viene abilitata solo con `channels.msteams.dangerouslyAllowNameMatching: true`.
|
||||
- La procedura guidata può risolvere i nomi in ID tramite Microsoft Graph quando le credenziali lo consentono.
|
||||
|
||||
**Accesso ai gruppi**
|
||||
**Accesso di gruppo**
|
||||
|
||||
- Predefinito: `channels.msteams.groupPolicy = "allowlist"` (bloccato a meno che non aggiungi `groupAllowFrom`). Usa `channels.defaults.groupPolicy` per sovrascrivere il valore predefinito quando non è impostato.
|
||||
- `channels.msteams.groupAllowFrom` controlla quali mittenti possono attivarsi nelle chat di gruppo/canali (con fallback a `channels.msteams.allowFrom`).
|
||||
- Imposta `groupPolicy: "open"` per consentire qualsiasi membro (comunque con gate basato su menzione per impostazione predefinita).
|
||||
- Predefinito: `channels.msteams.groupPolicy = "allowlist"` (bloccato a meno che tu non aggiunga `groupAllowFrom`). Usa `channels.defaults.groupPolicy` per sovrascrivere il valore predefinito quando non è impostato.
|
||||
- `channels.msteams.groupAllowFrom` controlla quali mittenti possono attivare nelle chat di gruppo/canali (ripiega su `channels.msteams.allowFrom`).
|
||||
- Imposta `groupPolicy: "open"` per consentire qualsiasi membro (comunque con vincolo di menzione per impostazione predefinita).
|
||||
- Per non consentire **alcun canale**, imposta `channels.msteams.groupPolicy: "disabled"`.
|
||||
|
||||
Esempio:
|
||||
@ -115,14 +116,14 @@ Esempio:
|
||||
}
|
||||
```
|
||||
|
||||
**Teams + allowlist canali**
|
||||
**Allowlist Teams + canale**
|
||||
|
||||
- Limita le risposte in gruppi/canali elencando team e canali in `channels.msteams.teams`.
|
||||
- Limita le risposte di gruppo/canale elencando team e canali in `channels.msteams.teams`.
|
||||
- Le chiavi dovrebbero usare ID team stabili e ID conversazione del canale.
|
||||
- Quando `groupPolicy="allowlist"` ed è presente una allowlist di team, vengono accettati solo team/canali elencati (con gate basato su menzione).
|
||||
- La procedura guidata di configurazione accetta voci `Team/Channel` e le memorizza per te.
|
||||
- All'avvio, OpenClaw risolve i nomi nelle allowlist di team/canali e utenti in ID (quando le autorizzazioni Graph lo consentono)
|
||||
e registra la mappatura; i nomi di team/canali non risolti vengono mantenuti così come digitati ma ignorati per il routing per impostazione predefinita, a meno che non sia abilitato `channels.msteams.dangerouslyAllowNameMatching: true`.
|
||||
- Quando `groupPolicy="allowlist"` ed è presente una allowlist dei team, vengono accettati solo i team/canali elencati (con vincolo di menzione).
|
||||
- La procedura guidata di configurazione accetta voci `Team/Canale` e le memorizza per te.
|
||||
- All'avvio, OpenClaw risolve i nomi di team/canale e degli utenti nelle allowlist in ID (quando le autorizzazioni Graph lo consentono)
|
||||
e registra la mappatura; i nomi di team/canale non risolti vengono mantenuti come digitati ma ignorati per il routing per impostazione predefinita, a meno che non sia abilitato `channels.msteams.dangerouslyAllowNameMatching: true`.
|
||||
|
||||
Esempio:
|
||||
|
||||
@ -146,28 +147,28 @@ Esempio:
|
||||
## Come funziona
|
||||
|
||||
1. Assicurati che il plugin Microsoft Teams sia disponibile.
|
||||
- Le attuali versioni pacchettizzate di OpenClaw lo includono già.
|
||||
- Le installazioni precedenti/personalizzate possono aggiungerlo manualmente con i comandi sopra.
|
||||
2. Crea un **Azure Bot** (ID app + secret + ID tenant).
|
||||
3. Crea un **pacchetto app Teams** che faccia riferimento al bot e includa le autorizzazioni RSC qui sotto.
|
||||
- Le attuali release pacchettizzate di OpenClaw lo includono già.
|
||||
- Le installazioni meno recenti/personalizzate possono aggiungerlo manualmente con i comandi sopra.
|
||||
2. Crea un **Azure Bot** (App ID + secret + tenant ID).
|
||||
3. Crea un **pacchetto app Teams** che faccia riferimento al bot e includa le autorizzazioni RSC riportate sotto.
|
||||
4. Carica/installa l'app Teams in un team (o nell'ambito personale per i DM).
|
||||
5. Configura `msteams` in `~/.openclaw/openclaw.json` (o variabili d'ambiente) e avvia il gateway.
|
||||
6. Per impostazione predefinita, il gateway ascolta il traffico webhook Bot Framework su `/api/messages`.
|
||||
6. Per impostazione predefinita, il gateway resta in ascolto del traffico webhook Bot Framework su `/api/messages`.
|
||||
|
||||
## Configurazione Azure Bot (prerequisiti)
|
||||
## Configurazione di Azure Bot (Prerequisiti)
|
||||
|
||||
Prima di configurare OpenClaw, devi creare una risorsa Azure Bot.
|
||||
|
||||
### Passaggio 1: crea Azure Bot
|
||||
### Passaggio 1: creare Azure Bot
|
||||
|
||||
1. Vai a [Create Azure Bot](https://portal.azure.com/#create/Microsoft.AzureBot)
|
||||
1. Vai a [Crea Azure Bot](https://portal.azure.com/#create/Microsoft.AzureBot)
|
||||
2. Compila la scheda **Basics**:
|
||||
|
||||
| Campo | Valore |
|
||||
| ------------------ | -------------------------------------------------------- |
|
||||
| **Bot handle** | Il nome del tuo bot, ad esempio `openclaw-msteams` (deve essere univoco) |
|
||||
| **Bot handle** | Il nome del tuo bot, ad es. `openclaw-msteams` (deve essere univoco) |
|
||||
| **Subscription** | Seleziona la tua sottoscrizione Azure |
|
||||
| **Resource group** | Creane uno nuovo o usane uno esistente |
|
||||
| **Resource group** | Creane uno nuovo o usa uno esistente |
|
||||
| **Pricing tier** | **Free** per sviluppo/test |
|
||||
| **Type of App** | **Single Tenant** (consigliato - vedi nota sotto) |
|
||||
| **Creation type** | **Create new Microsoft App ID** |
|
||||
@ -176,27 +177,169 @@ Prima di configurare OpenClaw, devi creare una risorsa Azure Bot.
|
||||
|
||||
3. Fai clic su **Review + create** → **Create** (attendi ~1-2 minuti)
|
||||
|
||||
### Passaggio 2: ottieni le credenziali
|
||||
### Passaggio 2: ottenere le credenziali
|
||||
|
||||
1. Vai alla tua risorsa Azure Bot → **Configuration**
|
||||
2. Copia **Microsoft App ID** → questo è il tuo `appId`
|
||||
3. Fai clic su **Manage Password** → vai all'App Registration
|
||||
3. Fai clic su **Manage Password** → vai alla registrazione dell'app
|
||||
4. In **Certificates & secrets** → **New client secret** → copia il **Value** → questo è il tuo `appPassword`
|
||||
5. Vai a **Overview** → copia **Directory (tenant) ID** → questo è il tuo `tenantId`
|
||||
5. Vai su **Overview** → copia **Directory (tenant) ID** → questo è il tuo `tenantId`
|
||||
|
||||
### Passaggio 3: configura l'endpoint di messaggistica
|
||||
### Passaggio 3: configurare l'endpoint di messaggistica
|
||||
|
||||
1. In Azure Bot → **Configuration**
|
||||
2. Imposta **Messaging endpoint** sul tuo URL webhook:
|
||||
- Produzione: `https://your-domain.com/api/messages`
|
||||
- Sviluppo locale: usa un tunnel (vedi [Sviluppo locale](#local-development-tunneling) sotto)
|
||||
|
||||
### Passaggio 4: abilita il canale Teams
|
||||
### Passaggio 4: abilitare il canale Teams
|
||||
|
||||
1. In Azure Bot → **Channels**
|
||||
2. Fai clic su **Microsoft Teams** → Configure → Save
|
||||
3. Accetta i Termini di servizio
|
||||
|
||||
## Autenticazione federata (certificato + Managed Identity)
|
||||
|
||||
> Aggiunto in 2026.3.24
|
||||
|
||||
Per i deployment di produzione, OpenClaw supporta **l'autenticazione federata** come alternativa più sicura ai client secret. Sono disponibili due metodi:
|
||||
|
||||
### Opzione A: autenticazione basata su certificato
|
||||
|
||||
Usa un certificato PEM registrato nella registrazione app Entra ID.
|
||||
|
||||
**Configurazione:**
|
||||
|
||||
1. Genera o ottieni un certificato (formato PEM con chiave privata).
|
||||
2. In Entra ID → Registrazione app → **Certificates & secrets** → **Certificates** → carica il certificato pubblico.
|
||||
|
||||
**Config:**
|
||||
|
||||
```json5
|
||||
{
|
||||
channels: {
|
||||
msteams: {
|
||||
enabled: true,
|
||||
appId: "<APP_ID>",
|
||||
tenantId: "<TENANT_ID>",
|
||||
authType: "federated",
|
||||
certificatePath: "/path/to/cert.pem",
|
||||
webhook: { port: 3978, path: "/api/messages" },
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
**Variabili d'ambiente:**
|
||||
|
||||
- `MSTEAMS_AUTH_TYPE=federated`
|
||||
- `MSTEAMS_CERTIFICATE_PATH=/path/to/cert.pem`
|
||||
|
||||
### Opzione B: Azure Managed Identity
|
||||
|
||||
Usa Azure Managed Identity per un'autenticazione senza password. È l'opzione ideale per i deployment su infrastruttura Azure (AKS, App Service, VM Azure) dove è disponibile una managed identity.
|
||||
|
||||
**Come funziona:**
|
||||
|
||||
1. Il pod/VM del bot ha una managed identity (assegnata dal sistema o dall'utente).
|
||||
2. Una **federated identity credential** collega la managed identity alla registrazione app Entra ID.
|
||||
3. In fase di esecuzione, OpenClaw usa `@azure/identity` per acquisire token dall'endpoint Azure IMDS (`169.254.169.254`).
|
||||
4. Il token viene passato all'SDK Teams per l'autenticazione del bot.
|
||||
|
||||
**Prerequisiti:**
|
||||
|
||||
- Infrastruttura Azure con managed identity abilitata (AKS workload identity, App Service, VM)
|
||||
- Federated identity credential creata sulla registrazione app Entra ID
|
||||
- Accesso di rete a IMDS (`169.254.169.254:80`) dal pod/VM
|
||||
|
||||
**Config (managed identity assegnata dal sistema):**
|
||||
|
||||
```json5
|
||||
{
|
||||
channels: {
|
||||
msteams: {
|
||||
enabled: true,
|
||||
appId: "<APP_ID>",
|
||||
tenantId: "<TENANT_ID>",
|
||||
authType: "federated",
|
||||
useManagedIdentity: true,
|
||||
webhook: { port: 3978, path: "/api/messages" },
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
**Config (managed identity assegnata dall'utente):**
|
||||
|
||||
```json5
|
||||
{
|
||||
channels: {
|
||||
msteams: {
|
||||
enabled: true,
|
||||
appId: "<APP_ID>",
|
||||
tenantId: "<TENANT_ID>",
|
||||
authType: "federated",
|
||||
useManagedIdentity: true,
|
||||
managedIdentityClientId: "<MI_CLIENT_ID>",
|
||||
webhook: { port: 3978, path: "/api/messages" },
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
**Variabili d'ambiente:**
|
||||
|
||||
- `MSTEAMS_AUTH_TYPE=federated`
|
||||
- `MSTEAMS_USE_MANAGED_IDENTITY=true`
|
||||
- `MSTEAMS_MANAGED_IDENTITY_CLIENT_ID=<client-id>` (solo per quelle assegnate dall'utente)
|
||||
|
||||
### Configurazione AKS Workload Identity
|
||||
|
||||
Per deployment AKS che usano workload identity:
|
||||
|
||||
1. **Abilita workload identity** sul cluster AKS.
|
||||
2. **Crea una federated identity credential** sulla registrazione app Entra ID:
|
||||
|
||||
```bash
|
||||
az ad app federated-credential create --id <APP_OBJECT_ID> --parameters '{
|
||||
"name": "my-bot-workload-identity",
|
||||
"issuer": "<AKS_OIDC_ISSUER_URL>",
|
||||
"subject": "system:serviceaccount:<NAMESPACE>:<SERVICE_ACCOUNT>",
|
||||
"audiences": ["api://AzureADTokenExchange"]
|
||||
}'
|
||||
```
|
||||
|
||||
3. **Annota il service account Kubernetes** con l'ID client dell'app:
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: my-bot-sa
|
||||
annotations:
|
||||
azure.workload.identity/client-id: "<APP_CLIENT_ID>"
|
||||
```
|
||||
|
||||
4. **Etichetta il pod** per l'iniezione della workload identity:
|
||||
|
||||
```yaml
|
||||
metadata:
|
||||
labels:
|
||||
azure.workload.identity/use: "true"
|
||||
```
|
||||
|
||||
5. **Assicurati l'accesso di rete** a IMDS (`169.254.169.254`) — se usi NetworkPolicy, aggiungi una regola di uscita che consenta traffico verso `169.254.169.254/32` sulla porta 80.
|
||||
|
||||
### Confronto dei tipi di autenticazione
|
||||
|
||||
| Metodo | Config | Vantaggi | Svantaggi |
|
||||
| -------------------- | ---------------------------------------------- | ---------------------------------- | ------------------------------------- |
|
||||
| **Client secret** | `appPassword` | Configurazione semplice | Rotazione del secret richiesta, meno sicuro |
|
||||
| **Certificate** | `authType: "federated"` + `certificatePath` | Nessun secret condiviso sulla rete | Sovraccarico nella gestione dei certificati |
|
||||
| **Managed Identity** | `authType: "federated"` + `useManagedIdentity` | Senza password, nessun secret da gestire | Richiede infrastruttura Azure |
|
||||
|
||||
**Comportamento predefinito:** quando `authType` non è impostato, OpenClaw usa per impostazione predefinita l'autenticazione con client secret. Le configurazioni esistenti continuano a funzionare senza modifiche.
|
||||
|
||||
## Sviluppo locale (tunneling)
|
||||
|
||||
Teams non può raggiungere `localhost`. Usa un tunnel per lo sviluppo locale:
|
||||
@ -205,7 +348,7 @@ Teams non può raggiungere `localhost`. Usa un tunnel per lo sviluppo locale:
|
||||
|
||||
```bash
|
||||
ngrok http 3978
|
||||
# Copia l'URL https, ad esempio https://abc123.ngrok.io
|
||||
# Copia l'URL https, ad es. https://abc123.ngrok.io
|
||||
# Imposta l'endpoint di messaggistica su: https://abc123.ngrok.io/api/messages
|
||||
```
|
||||
|
||||
@ -221,12 +364,12 @@ tailscale funnel 3978
|
||||
Invece di creare manualmente un file ZIP del manifest, puoi usare il [Teams Developer Portal](https://dev.teams.microsoft.com/apps):
|
||||
|
||||
1. Fai clic su **+ New app**
|
||||
2. Compila le informazioni di base (nome, descrizione, informazioni sullo sviluppatore)
|
||||
2. Compila le informazioni di base (nome, descrizione, informazioni sviluppatore)
|
||||
3. Vai a **App features** → **Bot**
|
||||
4. Seleziona **Enter a bot ID manually** e incolla il tuo Azure Bot App ID
|
||||
4. Seleziona **Enter a bot ID manually** e incolla l'App ID del tuo Azure Bot
|
||||
5. Seleziona gli ambiti: **Personal**, **Team**, **Group Chat**
|
||||
6. Fai clic su **Distribute** → **Download app package**
|
||||
7. In Teams: **Apps** → **Manage your apps** → **Upload a custom app** → seleziona il file ZIP
|
||||
7. In Teams: **Apps** → **Manage your apps** → **Upload a custom app** → seleziona lo ZIP
|
||||
|
||||
Spesso è più semplice che modificare manualmente i manifest JSON.
|
||||
|
||||
@ -236,27 +379,27 @@ Spesso è più semplice che modificare manualmente i manifest JSON.
|
||||
|
||||
1. In Azure Portal → la tua risorsa Azure Bot → **Test in Web Chat**
|
||||
2. Invia un messaggio: dovresti vedere una risposta
|
||||
3. Questo conferma che il tuo endpoint webhook funziona prima della configurazione Teams
|
||||
3. Questo conferma che il tuo endpoint webhook funziona prima della configurazione di Teams
|
||||
|
||||
**Opzione B: Teams (dopo l'installazione dell'app)**
|
||||
|
||||
1. Installa l'app Teams (sideload o catalogo org)
|
||||
1. Installa l'app Teams (sideload o catalogo organizzazione)
|
||||
2. Trova il bot in Teams e invia un DM
|
||||
3. Controlla i log del gateway per l'attività in ingresso
|
||||
|
||||
## Configurazione (solo testo minima)
|
||||
## Configurazione (solo testo, minima)
|
||||
|
||||
1. **Assicurati che il plugin Microsoft Teams sia disponibile**
|
||||
- Le attuali versioni pacchettizzate di OpenClaw lo includono già.
|
||||
- Le installazioni precedenti/personalizzate possono aggiungerlo manualmente:
|
||||
- Le attuali release pacchettizzate di OpenClaw lo includono già.
|
||||
- Le installazioni meno recenti/personalizzate possono aggiungerlo manualmente:
|
||||
- Da npm: `openclaw plugins install @openclaw/msteams`
|
||||
- Da un checkout locale: `openclaw plugins install ./path/to/local/msteams-plugin`
|
||||
|
||||
2. **Registrazione del bot**
|
||||
- Crea un Azure Bot (vedi sopra) e annota:
|
||||
- ID app
|
||||
- Client secret (password app)
|
||||
- ID tenant (single-tenant)
|
||||
- App ID
|
||||
- Client secret (password dell'app)
|
||||
- Tenant ID (single-tenant)
|
||||
|
||||
3. **Manifest dell'app Teams**
|
||||
- Includi una voce `bot` con `botId = <App ID>`.
|
||||
@ -286,35 +429,40 @@ Spesso è più semplice che modificare manualmente i manifest JSON.
|
||||
- `MSTEAMS_APP_ID`
|
||||
- `MSTEAMS_APP_PASSWORD`
|
||||
- `MSTEAMS_TENANT_ID`
|
||||
- `MSTEAMS_AUTH_TYPE` (facoltativo: `"secret"` o `"federated"`)
|
||||
- `MSTEAMS_CERTIFICATE_PATH` (federated + certificato)
|
||||
- `MSTEAMS_CERTIFICATE_THUMBPRINT` (facoltativo, non richiesto per l'autenticazione)
|
||||
- `MSTEAMS_USE_MANAGED_IDENTITY` (federated + managed identity)
|
||||
- `MSTEAMS_MANAGED_IDENTITY_CLIENT_ID` (solo MI assegnata dall'utente)
|
||||
|
||||
5. **Endpoint del bot**
|
||||
- Imposta l'Azure Bot Messaging Endpoint su:
|
||||
- `https://<host>:3978/api/messages` (o il tuo percorso/porta scelti).
|
||||
- Imposta il Messaging Endpoint di Azure Bot su:
|
||||
- `https://<host>:3978/api/messages` (oppure il percorso/porta che hai scelto).
|
||||
|
||||
6. **Esegui il gateway**
|
||||
- Il canale Teams si avvia automaticamente quando il plugin incluso o installato manualmente è disponibile e la configurazione `msteams` esiste con le credenziali.
|
||||
|
||||
## Azione informazioni membro
|
||||
|
||||
OpenClaw espone un'azione `member-info` supportata da Graph per Microsoft Teams in modo che agenti e automazioni possano risolvere i dettagli dei membri del canale (nome visualizzato, email, ruolo) direttamente da Microsoft Graph.
|
||||
OpenClaw espone un'azione `member-info` supportata da Graph per Microsoft Teams, così agenti e automazioni possono risolvere direttamente da Microsoft Graph i dettagli dei membri del canale (nome visualizzato, email, ruolo).
|
||||
|
||||
Requisiti:
|
||||
|
||||
- Autorizzazione RSC `Member.Read.Group` (già presente nel manifest consigliato)
|
||||
- Per ricerche tra team diversi: autorizzazione applicazione Graph `User.Read.All` con consenso amministratore
|
||||
- Autorizzazione RSC `Member.Read.Group` (già inclusa nel manifest consigliato)
|
||||
- Per ricerche tra team diversi: autorizzazione applicativa Graph `User.Read.All` con consenso amministratore
|
||||
|
||||
L'azione è controllata da `channels.msteams.actions.memberInfo` (predefinito: abilitata quando sono disponibili credenziali Graph).
|
||||
|
||||
## Contesto cronologia
|
||||
|
||||
- `channels.msteams.historyLimit` controlla quanti messaggi recenti di canale/gruppo vengono inseriti nel prompt.
|
||||
- Usa come fallback `messages.groupChat.historyLimit`. Imposta `0` per disabilitare (predefinito 50).
|
||||
- La cronologia del thread recuperata viene filtrata tramite allowlist dei mittenti (`allowFrom` / `groupAllowFrom`), quindi l'inizializzazione del contesto del thread include solo messaggi di mittenti consentiti.
|
||||
- Il contesto degli allegati citati (`ReplyTo*` derivato dall'HTML di risposta Teams) viene attualmente passato così come ricevuto.
|
||||
- In altre parole, le allowlist controllano chi può attivare l'agente; oggi vengono filtrati solo specifici percorsi di contesto supplementare.
|
||||
- Ripiega su `messages.groupChat.historyLimit`. Imposta `0` per disabilitare (predefinito 50).
|
||||
- La cronologia del thread recuperata viene filtrata dalle allowlist dei mittenti (`allowFrom` / `groupAllowFrom`), quindi il seeding del contesto del thread include solo messaggi provenienti da mittenti consentiti.
|
||||
- Il contesto degli allegati citati (`ReplyTo*` derivato dall'HTML di risposta di Teams) attualmente viene passato così come ricevuto.
|
||||
- In altre parole, le allowlist controllano chi può attivare l'agente; oggi solo alcuni percorsi di contesto supplementare specifici vengono filtrati.
|
||||
- La cronologia DM può essere limitata con `channels.msteams.dmHistoryLimit` (turni utente). Override per utente: `channels.msteams.dms["<user_id>"].historyLimit`.
|
||||
|
||||
## Autorizzazioni RSC Teams attuali (Manifest)
|
||||
## Autorizzazioni RSC Teams attuali (manifest)
|
||||
|
||||
Queste sono le **attuali autorizzazioni resourceSpecific** nel nostro manifest dell'app Teams. Si applicano solo all'interno del team/chat in cui l'app è installata.
|
||||
|
||||
@ -382,72 +530,72 @@ Esempio minimo e valido con i campi richiesti. Sostituisci ID e URL.
|
||||
}
|
||||
```
|
||||
|
||||
### Limitazioni del manifest (campi obbligatori)
|
||||
### Avvertenze sul manifest (campi indispensabili)
|
||||
|
||||
- `bots[].botId` **deve** corrispondere all'Azure Bot App ID.
|
||||
- `webApplicationInfo.id` **deve** corrispondere all'Azure Bot App ID.
|
||||
- `bots[].botId` **deve** corrispondere all'App ID di Azure Bot.
|
||||
- `webApplicationInfo.id` **deve** corrispondere all'App ID di Azure Bot.
|
||||
- `bots[].scopes` deve includere le superfici che intendi usare (`personal`, `team`, `groupChat`).
|
||||
- `bots[].supportsFiles: true` è richiesto per la gestione dei file nell'ambito personale.
|
||||
- `authorization.permissions.resourceSpecific` deve includere lettura/invio canale se vuoi traffico canale.
|
||||
- `authorization.permissions.resourceSpecific` deve includere lettura/invio del canale se vuoi traffico del canale.
|
||||
|
||||
### Aggiornare un'app esistente
|
||||
|
||||
Per aggiornare un'app Teams già installata (ad esempio, per aggiungere autorizzazioni RSC):
|
||||
Per aggiornare un'app Teams già installata (ad esempio per aggiungere autorizzazioni RSC):
|
||||
|
||||
1. Aggiorna il tuo `manifest.json` con le nuove impostazioni
|
||||
2. **Incrementa il campo `version`** (ad esempio `1.0.0` → `1.1.0`)
|
||||
3. **Ricomprimi** il manifest con le icone (`manifest.json`, `outline.png`, `color.png`)
|
||||
2. **Incrementa il campo `version`** (ad es. `1.0.0` → `1.1.0`)
|
||||
3. **Ricrea lo ZIP** del manifest con le icone (`manifest.json`, `outline.png`, `color.png`)
|
||||
4. Carica il nuovo zip:
|
||||
- **Opzione A (Teams Admin Center):** Teams Admin Center → Teams apps → Manage apps → trova la tua app → Upload new version
|
||||
- **Opzione B (Sideload):** In Teams → Apps → Manage your apps → Upload a custom app
|
||||
5. **Per i canali team:** reinstalla l'app in ogni team affinché le nuove autorizzazioni abbiano effetto
|
||||
6. **Chiudi completamente e riavvia Teams** (non solo chiudere la finestra) per cancellare i metadati dell'app memorizzati nella cache
|
||||
5. **Per i canali del team:** reinstalla l'app in ogni team affinché le nuove autorizzazioni abbiano effetto
|
||||
6. **Chiudi completamente e riavvia Teams** (non limitarti a chiudere la finestra) per svuotare i metadati dell'app nella cache
|
||||
|
||||
## Capacità: solo RSC vs Graph
|
||||
|
||||
### Con **solo Teams RSC** (app installata, nessuna autorizzazione API Graph)
|
||||
### Con **solo Teams RSC** (app installata, senza autorizzazioni API Graph)
|
||||
|
||||
Funziona:
|
||||
|
||||
- Lettura del contenuto **testuale** dei messaggi di canale.
|
||||
- Invio del contenuto **testuale** dei messaggi di canale.
|
||||
- Ricezione di allegati file **personali (DM)**.
|
||||
- Leggere il contenuto **testuale** dei messaggi del canale.
|
||||
- Inviare il contenuto **testuale** dei messaggi del canale.
|
||||
- Ricevere allegati di file nei **messaggi personali (DM)**.
|
||||
|
||||
NON funziona:
|
||||
|
||||
- **Contenuto di immagini o file** in canali/gruppi (il payload include solo uno stub HTML).
|
||||
- Contenuti di **immagini o file** in canali/gruppi (il payload include solo uno stub HTML).
|
||||
- Download di allegati archiviati in SharePoint/OneDrive.
|
||||
- Lettura della cronologia messaggi (oltre l'evento webhook in tempo reale).
|
||||
- Lettura della cronologia dei messaggi (oltre l'evento webhook live).
|
||||
|
||||
### Con **Teams RSC + autorizzazioni applicazione Microsoft Graph**
|
||||
### Con **Teams RSC + autorizzazioni applicative Microsoft Graph**
|
||||
|
||||
Aggiunge:
|
||||
|
||||
- Download dei contenuti ospitati (immagini incollate nei messaggi).
|
||||
- Download degli allegati file archiviati in SharePoint/OneDrive.
|
||||
- Download di contenuti ospitati (immagini incollate nei messaggi).
|
||||
- Download di allegati di file archiviati in SharePoint/OneDrive.
|
||||
- Lettura della cronologia dei messaggi di canale/chat tramite Graph.
|
||||
|
||||
### RSC vs API Graph
|
||||
|
||||
| Capacità | Autorizzazioni RSC | API Graph |
|
||||
| ----------------------- | -------------------- | ----------------------------------- |
|
||||
| Capacità | Autorizzazioni RSC | API Graph |
|
||||
| ----------------------- | --------------------- | ----------------------------------- |
|
||||
| **Messaggi in tempo reale** | Sì (tramite webhook) | No (solo polling) |
|
||||
| **Messaggi storici** | No | Sì (può interrogare la cronologia) |
|
||||
| **Complessità di setup** | Solo manifest app | Richiede consenso amministratore + flusso token |
|
||||
| **Messaggi storici** | No | Sì (può interrogare la cronologia) |
|
||||
| **Complessità di configurazione** | Solo manifest dell'app | Richiede consenso amministratore + flusso token |
|
||||
| **Funziona offline** | No (deve essere in esecuzione) | Sì (interrogabile in qualsiasi momento) |
|
||||
|
||||
**In sintesi:** RSC serve per l'ascolto in tempo reale; l'API Graph serve per l'accesso storico. Per recuperare i messaggi persi mentre si è offline, serve l'API Graph con `ChannelMessage.Read.All` (richiede consenso amministratore).
|
||||
**In sintesi:** RSC serve per l'ascolto in tempo reale; l'API Graph serve per l'accesso storico. Per recuperare i messaggi persi mentre eri offline, ti serve l'API Graph con `ChannelMessage.Read.All` (richiede consenso amministratore).
|
||||
|
||||
## Media + cronologia abilitati da Graph (richiesti per i canali)
|
||||
|
||||
Se hai bisogno di immagini/file nei **canali** o vuoi recuperare la **cronologia dei messaggi**, devi abilitare le autorizzazioni Microsoft Graph e concedere il consenso amministratore.
|
||||
Se ti servono immagini/file nei **canali** o vuoi recuperare la **cronologia dei messaggi**, devi abilitare le autorizzazioni Microsoft Graph e concedere il consenso amministratore.
|
||||
|
||||
1. In Entra ID (Azure AD) **App Registration**, aggiungi autorizzazioni Microsoft Graph **Application**:
|
||||
- `ChannelMessage.Read.All` (allegati canale + cronologia)
|
||||
1. In Entra ID (Azure AD) **App Registration**, aggiungi autorizzazioni **Application** Microsoft Graph:
|
||||
- `ChannelMessage.Read.All` (allegati dei canali + cronologia)
|
||||
- `Chat.Read.All` o `ChatMessage.Read.All` (chat di gruppo)
|
||||
2. **Concedi il consenso amministratore** per il tenant.
|
||||
3. Incrementa la **versione del manifest** dell'app Teams, ricaricala e **reinstalla l'app in Teams**.
|
||||
4. **Chiudi completamente e riavvia Teams** per cancellare i metadati dell'app memorizzati nella cache.
|
||||
3. Incrementa la **versione del manifest** dell'app Teams, ricaricalo e **reinstalla l'app in Teams**.
|
||||
4. **Chiudi completamente e riavvia Teams** per svuotare i metadati dell'app nella cache.
|
||||
|
||||
**Autorizzazione aggiuntiva per le menzioni utente:** le @mention utente funzionano subito per gli utenti nella conversazione. Tuttavia, se vuoi cercare dinamicamente e menzionare utenti che **non sono nella conversazione corrente**, aggiungi l'autorizzazione `User.Read.All` (Application) e concedi il consenso amministratore.
|
||||
|
||||
@ -455,73 +603,78 @@ Se hai bisogno di immagini/file nei **canali** o vuoi recuperare la **cronologia
|
||||
|
||||
### Timeout webhook
|
||||
|
||||
Teams consegna i messaggi tramite webhook HTTP. Se l'elaborazione richiede troppo tempo (ad esempio risposte LLM lente), potresti vedere:
|
||||
Teams consegna i messaggi tramite webhook HTTP. Se l'elaborazione richiede troppo tempo (ad es. risposte LLM lente), potresti vedere:
|
||||
|
||||
- Timeout del gateway
|
||||
- Teams che ritenta il messaggio (causando duplicati)
|
||||
- Risposte perse
|
||||
|
||||
OpenClaw gestisce questo problema restituendo rapidamente e inviando le risposte in modo proattivo, ma risposte molto lente possono comunque causare problemi.
|
||||
OpenClaw lo gestisce rispondendo rapidamente e inviando le risposte in modo proattivo, ma risposte molto lente possono comunque causare problemi.
|
||||
|
||||
### Formattazione
|
||||
|
||||
Il markdown di Teams è più limitato di Slack o Discord:
|
||||
Il markdown di Teams è più limitato rispetto a Slack o Discord:
|
||||
|
||||
- La formattazione di base funziona: **grassetto**, _corsivo_, `code`, link
|
||||
- Il markdown complesso (tabelle, elenchi annidati) potrebbe non essere renderizzato correttamente
|
||||
- Le Adaptive Cards sono supportate per sondaggi e invii arbitrari di card (vedi sotto)
|
||||
- Markdown complesso (tabelle, elenchi annidati) potrebbe non essere renderizzato correttamente
|
||||
- Le Adaptive Cards sono supportate per i sondaggi e per l'invio arbitrario di card (vedi sotto)
|
||||
|
||||
## Configurazione
|
||||
|
||||
Impostazioni principali (vedi `/gateway/configuration` per i pattern canale condivisi):
|
||||
Impostazioni chiave (vedi `/gateway/configuration` per i modelli condivisi dei canali):
|
||||
|
||||
- `channels.msteams.enabled`: abilita/disabilita il canale.
|
||||
- `channels.msteams.appId`, `channels.msteams.appPassword`, `channels.msteams.tenantId`: credenziali del bot.
|
||||
- `channels.msteams.webhook.port` (predefinito `3978`)
|
||||
- `channels.msteams.webhook.path` (predefinito `/api/messages`)
|
||||
- `channels.msteams.dmPolicy`: `pairing | allowlist | open | disabled` (predefinito: pairing)
|
||||
- `channels.msteams.allowFrom`: allowlist DM (consigliati ID oggetto AAD). La procedura guidata risolve i nomi in ID durante la configurazione quando l'accesso Graph è disponibile.
|
||||
- `channels.msteams.dangerouslyAllowNameMatching`: interruttore di emergenza per riabilitare la corrispondenza con UPN/nome visualizzato modificabili e il routing diretto per nome team/canale.
|
||||
- `channels.msteams.textChunkLimit`: dimensione chunk testo in uscita.
|
||||
- `channels.msteams.chunkMode`: `length` (predefinito) o `newline` per dividere sulle righe vuote (confini di paragrafo) prima del chunking per lunghezza.
|
||||
- `channels.msteams.mediaAllowHosts`: allowlist per host di allegati in ingresso (predefinito: domini Microsoft/Teams).
|
||||
- `channels.msteams.mediaAuthAllowHosts`: allowlist per allegare header Authorization ai retry dei media (predefinito: host Graph + Bot Framework).
|
||||
- `channels.msteams.allowFrom`: allowlist DM (consigliati gli ID oggetto AAD). La procedura guidata risolve i nomi in ID durante la configurazione quando è disponibile l'accesso a Graph.
|
||||
- `channels.msteams.dangerouslyAllowNameMatching`: interruttore di emergenza per riattivare la corrispondenza con UPN/nomi visualizzati modificabili e il routing diretto per nome di team/canale.
|
||||
- `channels.msteams.textChunkLimit`: dimensione dei blocchi di testo in uscita.
|
||||
- `channels.msteams.chunkMode`: `length` (predefinito) oppure `newline` per suddividere sulle righe vuote (confini di paragrafo) prima della suddivisione per lunghezza.
|
||||
- `channels.msteams.mediaAllowHosts`: allowlist per gli host degli allegati in ingresso (predefinita ai domini Microsoft/Teams).
|
||||
- `channels.msteams.mediaAuthAllowHosts`: allowlist per allegare header Authorization nei tentativi di recupero dei media (predefinita agli host Graph + Bot Framework).
|
||||
- `channels.msteams.requireMention`: richiede @mention in canali/gruppi (predefinito true).
|
||||
- `channels.msteams.replyStyle`: `thread | top-level` (vedi [Stile di risposta](#reply-style-threads-vs-posts)).
|
||||
- `channels.msteams.teams.<teamId>.replyStyle`: override per team.
|
||||
- `channels.msteams.teams.<teamId>.requireMention`: override per team.
|
||||
- `channels.msteams.teams.<teamId>.tools`: override predefiniti dei criteri strumenti per team (`allow`/`deny`/`alsoAllow`) usati quando manca un override di canale.
|
||||
- `channels.msteams.teams.<teamId>.toolsBySender`: override predefiniti dei criteri strumenti per team per mittente (`"*"` wildcard supportato).
|
||||
- `channels.msteams.teams.<teamId>.tools`: override predefiniti per team delle policy degli strumenti (`allow`/`deny`/`alsoAllow`) usati quando manca un override di canale.
|
||||
- `channels.msteams.teams.<teamId>.toolsBySender`: override predefiniti per team delle policy degli strumenti per mittente (supportato il wildcard `"*"`).
|
||||
- `channels.msteams.teams.<teamId>.channels.<conversationId>.replyStyle`: override per canale.
|
||||
- `channels.msteams.teams.<teamId>.channels.<conversationId>.requireMention`: override per canale.
|
||||
- `channels.msteams.teams.<teamId>.channels.<conversationId>.tools`: override dei criteri strumenti per canale (`allow`/`deny`/`alsoAllow`).
|
||||
- `channels.msteams.teams.<teamId>.channels.<conversationId>.toolsBySender`: override dei criteri strumenti per canale per mittente (`"*"` wildcard supportato).
|
||||
- `channels.msteams.teams.<teamId>.channels.<conversationId>.tools`: override delle policy degli strumenti per canale (`allow`/`deny`/`alsoAllow`).
|
||||
- `channels.msteams.teams.<teamId>.channels.<conversationId>.toolsBySender`: override delle policy degli strumenti per mittente a livello di canale (supportato il wildcard `"*"`).
|
||||
- Le chiavi `toolsBySender` dovrebbero usare prefissi espliciti:
|
||||
`id:`, `e164:`, `username:`, `name:` (le chiavi legacy senza prefisso continuano a essere mappate solo a `id:`).
|
||||
- `channels.msteams.actions.memberInfo`: abilita o disabilita l'azione informazioni membro supportata da Graph (predefinito: abilitata quando sono disponibili credenziali Graph).
|
||||
- `channels.msteams.sharePointSiteId`: ID sito SharePoint per caricamenti file in chat di gruppo/canali (vedi [Invio di file nelle chat di gruppo](#sending-files-in-group-chats)).
|
||||
- `channels.msteams.authType`: tipo di autenticazione — `"secret"` (predefinito) oppure `"federated"`.
|
||||
- `channels.msteams.certificatePath`: percorso del file certificato PEM (federated + autenticazione con certificato).
|
||||
- `channels.msteams.certificateThumbprint`: thumbprint del certificato (facoltativo, non richiesto per l'autenticazione).
|
||||
- `channels.msteams.useManagedIdentity`: abilita l'autenticazione con managed identity (modalità federated).
|
||||
- `channels.msteams.managedIdentityClientId`: ID client per managed identity assegnata dall'utente.
|
||||
- `channels.msteams.sharePointSiteId`: ID sito SharePoint per i caricamenti di file nelle chat di gruppo/canali (vedi [Invio di file nelle chat di gruppo](#sending-files-in-group-chats)).
|
||||
|
||||
## Routing e sessioni
|
||||
|
||||
- Le chiavi di sessione seguono il formato agente standard (vedi [/concepts/session](/concepts/session)):
|
||||
- Le chiavi di sessione seguono il formato standard degli agenti (vedi [/concepts/session](/it/concepts/session)):
|
||||
- I messaggi diretti condividono la sessione principale (`agent:<agentId>:<mainKey>`).
|
||||
- I messaggi di canale/gruppo usano l'id conversazione:
|
||||
- I messaggi di canale/gruppo usano l'ID conversazione:
|
||||
- `agent:<agentId>:msteams:channel:<conversationId>`
|
||||
- `agent:<agentId>:msteams:group:<conversationId>`
|
||||
|
||||
## Stile di risposta: thread vs post
|
||||
|
||||
Teams ha recentemente introdotto due stili UI per i canali sullo stesso modello dati sottostante:
|
||||
Teams ha recentemente introdotto due stili UI per i canali sulla stessa struttura dati sottostante:
|
||||
|
||||
| Stile | Descrizione | `replyStyle` consigliato |
|
||||
| ----------------------- | -------------------------------------------------------- | ------------------------ |
|
||||
| **Posts** (classico) | I messaggi appaiono come card con risposte in thread sotto | `thread` (predefinito) |
|
||||
| **Threads** (simile a Slack) | I messaggi scorrono linearmente, più come Slack | `top-level` |
|
||||
| Stile | Descrizione | `replyStyle` consigliato |
|
||||
| ------------------------ | -------------------------------------------------------- | ------------------------ |
|
||||
| **Posts** (classico) | I messaggi appaiono come card con risposte in thread sotto | `thread` (predefinito) |
|
||||
| **Threads** (simile a Slack) | I messaggi scorrono linearmente, più simili a Slack | `top-level` |
|
||||
|
||||
**Il problema:** l'API Teams non espone quale stile UI usa un canale. Se usi il `replyStyle` sbagliato:
|
||||
|
||||
- `thread` in un canale in stile Threads → le risposte appaiono annidate in modo scomodo
|
||||
- `top-level` in un canale in stile Posts → le risposte appaiono come post top-level separati invece che nel thread
|
||||
- `top-level` in un canale in stile Posts → le risposte appaiono come post separati di primo livello invece che nel thread
|
||||
|
||||
**Soluzione:** configura `replyStyle` per canale in base a come è configurato il canale:
|
||||
|
||||
@ -548,27 +701,27 @@ Teams ha recentemente introdotto due stili UI per i canali sullo stesso modello
|
||||
|
||||
**Limitazioni attuali:**
|
||||
|
||||
- **DM:** immagini e allegati file funzionano tramite le API file del bot Teams.
|
||||
- **Canali/gruppi:** gli allegati vivono nello storage M365 (SharePoint/OneDrive). Il payload webhook include solo uno stub HTML, non i byte effettivi del file. **Sono richieste autorizzazioni API Graph** per scaricare gli allegati dei canali.
|
||||
- Per invii espliciti file-first, usa `action=upload-file` con `media` / `filePath` / `path`; `message` opzionale diventa il testo/commento di accompagnamento, e `filename` sovrascrive il nome caricato.
|
||||
- **DM:** immagini e allegati di file funzionano tramite le API file del bot Teams.
|
||||
- **Canali/gruppi:** gli allegati risiedono nello storage M365 (SharePoint/OneDrive). Il payload del webhook include solo uno stub HTML, non i byte reali del file. **Le autorizzazioni API Graph sono richieste** per scaricare gli allegati del canale.
|
||||
- Per invii espliciti incentrati sul file, usa `action=upload-file` con `media` / `filePath` / `path`; `message` facoltativo diventa il testo/commento di accompagnamento e `filename` sostituisce il nome caricato.
|
||||
|
||||
Senza autorizzazioni Graph, i messaggi di canale con immagini verranno ricevuti solo come testo (il contenuto dell'immagine non è accessibile al bot).
|
||||
Per impostazione predefinita, OpenClaw scarica media solo da host Microsoft/Teams. Sovrascrivi con `channels.msteams.mediaAllowHosts` (usa `["*"]` per consentire qualsiasi host).
|
||||
Per impostazione predefinita, OpenClaw scarica media solo da hostname Microsoft/Teams. Puoi sovrascrivere con `channels.msteams.mediaAllowHosts` (usa `["*"]` per consentire qualsiasi host).
|
||||
Gli header Authorization vengono allegati solo per gli host in `channels.msteams.mediaAuthAllowHosts` (predefinito: host Graph + Bot Framework). Mantieni questo elenco rigoroso (evita suffissi multi-tenant).
|
||||
|
||||
## Invio di file nelle chat di gruppo
|
||||
|
||||
I bot possono inviare file nei DM usando il flusso FileConsentCard (integrato). Tuttavia, **l'invio di file nelle chat di gruppo/canali** richiede configurazione aggiuntiva:
|
||||
I bot possono inviare file nei DM usando il flusso FileConsentCard (integrato). Tuttavia, **l'invio di file nelle chat di gruppo/canali** richiede una configurazione aggiuntiva:
|
||||
|
||||
| Contesto | Come vengono inviati i file | Configurazione necessaria |
|
||||
| ------------------------ | ----------------------------------------- | ------------------------------------------------ |
|
||||
| **DM** | FileConsentCard → l'utente accetta → il bot carica | Funziona subito |
|
||||
| **Chat di gruppo/canali** | Caricamento su SharePoint → link di condivisione | Richiede `sharePointSiteId` + autorizzazioni Graph |
|
||||
| **Immagini (qualsiasi contesto)** | Inline con codifica Base64 | Funziona subito |
|
||||
| **Immagini (qualsiasi contesto)** | Inline con codifica Base64 | Funziona subito |
|
||||
|
||||
### Perché i gruppi richiedono SharePoint
|
||||
### Perché le chat di gruppo richiedono SharePoint
|
||||
|
||||
I bot non hanno un drive personale OneDrive (l'endpoint Graph API `/me/drive` non funziona per identità applicative). Per inviare file in chat di gruppo/canali, il bot carica su un **sito SharePoint** e crea un link di condivisione.
|
||||
I bot non hanno un drive OneDrive personale (l'endpoint API Graph `/me/drive` non funziona per le identità applicative). Per inviare file nelle chat di gruppo/canali, il bot carica su un **sito SharePoint** e crea un link di condivisione.
|
||||
|
||||
### Configurazione
|
||||
|
||||
@ -578,7 +731,7 @@ I bot non hanno un drive personale OneDrive (l'endpoint Graph API `/me/drive` no
|
||||
|
||||
2. **Concedi il consenso amministratore** per il tenant.
|
||||
|
||||
3. **Ottieni il tuo ID sito SharePoint:**
|
||||
3. **Ottieni l'ID del tuo sito SharePoint:**
|
||||
|
||||
```bash
|
||||
# Tramite Graph Explorer o curl con un token valido:
|
||||
@ -605,42 +758,42 @@ I bot non hanno un drive personale OneDrive (l'endpoint Graph API `/me/drive` no
|
||||
}
|
||||
```
|
||||
|
||||
### Comportamento di condivisione
|
||||
### Comportamento della condivisione
|
||||
|
||||
| Autorizzazione | Comportamento di condivisione |
|
||||
| ---------------------------------------- | --------------------------------------------------------- |
|
||||
| `Sites.ReadWrite.All` soltanto | Link di condivisione a livello organizzazione (chiunque nell'org può accedere) |
|
||||
| `Sites.ReadWrite.All` + `Chat.Read.All` | Link di condivisione per utente (solo i membri della chat possono accedere) |
|
||||
| Autorizzazione | Comportamento della condivisione |
|
||||
| ----------------------------------------- | -------------------------------------------------------- |
|
||||
| `Sites.ReadWrite.All` soltanto | Link di condivisione a livello organizzazione (chiunque nell'organizzazione può accedere) |
|
||||
| `Sites.ReadWrite.All` + `Chat.Read.All` | Link di condivisione per utente (solo i membri della chat possono accedere) |
|
||||
|
||||
La condivisione per utente è più sicura perché solo i partecipanti alla chat possono accedere al file. Se manca l'autorizzazione `Chat.Read.All`, il bot usa come fallback la condivisione a livello organizzazione.
|
||||
La condivisione per utente è più sicura perché solo i partecipanti alla chat possono accedere al file. Se manca l'autorizzazione `Chat.Read.All`, il bot ripiega sulla condivisione a livello organizzazione.
|
||||
|
||||
### Comportamento di fallback
|
||||
|
||||
| Scenario | Risultato |
|
||||
| ------------------------------------------------- | -------------------------------------------------- |
|
||||
| Chat di gruppo + file + `sharePointSiteId` configurato | Caricamento su SharePoint, invio link di condivisione |
|
||||
| Chat di gruppo + file + nessun `sharePointSiteId` | Tentativo di caricamento su OneDrive (può fallire), invio solo testo |
|
||||
| Chat di gruppo + file + `sharePointSiteId` configurato | Carica su SharePoint, invia il link di condivisione |
|
||||
| Chat di gruppo + file + nessun `sharePointSiteId` | Tenta il caricamento su OneDrive (potrebbe fallire), invia solo testo |
|
||||
| Chat personale + file | Flusso FileConsentCard (funziona senza SharePoint) |
|
||||
| Qualsiasi contesto + immagine | Inline con codifica Base64 (funziona senza SharePoint) |
|
||||
|
||||
### Posizione dei file archiviati
|
||||
### Posizione di archiviazione dei file
|
||||
|
||||
I file caricati vengono archiviati in una cartella `/OpenClawShared/` nella raccolta documenti predefinita del sito SharePoint configurato.
|
||||
|
||||
## Sondaggi (Adaptive Cards)
|
||||
|
||||
OpenClaw invia i sondaggi Teams come Adaptive Cards (non esiste un'API nativa dei sondaggi Teams).
|
||||
OpenClaw invia i sondaggi di Teams come Adaptive Cards (non esiste un'API nativa per i sondaggi in Teams).
|
||||
|
||||
- CLI: `openclaw message poll --channel msteams --target conversation:<id> ...`
|
||||
- I voti vengono registrati dal gateway in `~/.openclaw/msteams-polls.json`.
|
||||
- Il gateway deve restare online per registrare i voti.
|
||||
- I sondaggi non pubblicano ancora automaticamente riepiloghi dei risultati (se necessario, ispeziona il file dello store).
|
||||
- I sondaggi non pubblicano ancora automaticamente i riepiloghi dei risultati (se necessario, ispeziona il file di archiviazione).
|
||||
|
||||
## Adaptive Cards (arbitrarie)
|
||||
|
||||
Invia qualsiasi JSON Adaptive Card a utenti o conversazioni Teams usando lo strumento `message` o la CLI.
|
||||
|
||||
Il parametro `card` accetta un oggetto JSON Adaptive Card. Quando `card` è fornito, il testo del messaggio è facoltativo.
|
||||
Il parametro `card` accetta un oggetto JSON Adaptive Card. Quando viene fornito `card`, il testo del messaggio è facoltativo.
|
||||
|
||||
**Strumento agente:**
|
||||
|
||||
@ -665,18 +818,18 @@ openclaw message send --channel msteams \
|
||||
--card '{"type":"AdaptiveCard","version":"1.5","body":[{"type":"TextBlock","text":"Hello!"}]}'
|
||||
```
|
||||
|
||||
Vedi [la documentazione Adaptive Cards](https://adaptivecards.io/) per schema ed esempi delle card. Per i dettagli sul formato target, vedi [Formati target](#target-formats) sotto.
|
||||
Vedi la [documentazione di Adaptive Cards](https://adaptivecards.io/) per lo schema delle card e gli esempi. Per i dettagli sul formato del target, vedi [Formati target](#target-formats) sotto.
|
||||
|
||||
## Formati target
|
||||
|
||||
I target MSTeams usano prefissi per distinguere utenti e conversazioni:
|
||||
I target MSTeams usano prefissi per distinguere tra utenti e conversazioni:
|
||||
|
||||
| Tipo di target | Formato | Esempio |
|
||||
| --------------------- | ------------------------------- | --------------------------------------------------- |
|
||||
| Utente (per ID) | `user:<aad-object-id>` | `user:40a1a0ed-4ff2-4164-a219-55518990c197` |
|
||||
| Utente (per nome) | `user:<display-name>` | `user:John Smith` (richiede API Graph) |
|
||||
| Gruppo/canale | `conversation:<conversation-id>` | `conversation:19:abc123...@thread.tacv2` |
|
||||
| Gruppo/canale (raw) | `<conversation-id>` | `19:abc123...@thread.tacv2` (se contiene `@thread`) |
|
||||
| Tipo di target | Formato | Esempio |
|
||||
| ---------------------- | ------------------------------- | --------------------------------------------------- |
|
||||
| Utente (per ID) | `user:<aad-object-id>` | `user:40a1a0ed-4ff2-4164-a219-55518990c197` |
|
||||
| Utente (per nome) | `user:<display-name>` | `user:John Smith` (richiede API Graph) |
|
||||
| Gruppo/canale | `conversation:<conversation-id>` | `conversation:19:abc123...@thread.tacv2` |
|
||||
| Gruppo/canale (raw) | `<conversation-id>` | `19:abc123...@thread.tacv2` (se contiene `@thread`) |
|
||||
|
||||
**Esempi CLI:**
|
||||
|
||||
@ -695,7 +848,7 @@ openclaw message send --channel msteams --target "conversation:19:abc...@thread.
|
||||
--card '{"type":"AdaptiveCard","version":"1.5","body":[{"type":"TextBlock","text":"Hello"}]}'
|
||||
```
|
||||
|
||||
**Esempi strumento agente:**
|
||||
**Esempi dello strumento agente:**
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -719,23 +872,23 @@ openclaw message send --channel msteams --target "conversation:19:abc...@thread.
|
||||
}
|
||||
```
|
||||
|
||||
Nota: senza il prefisso `user:`, i nomi sono interpretati per impostazione predefinita come risoluzione gruppo/team. Usa sempre `user:` quando indirizzi persone per nome visualizzato.
|
||||
Nota: senza il prefisso `user:`, i nomi vengono interpretati per impostazione predefinita come risoluzione di gruppo/team. Usa sempre `user:` quando indirizzi persone per nome visualizzato.
|
||||
|
||||
## Messaggistica proattiva
|
||||
|
||||
- I messaggi proattivi sono possibili **solo dopo** che un utente ha interagito, perché a quel punto memorizziamo i riferimenti alla conversazione.
|
||||
- I messaggi proattivi sono possibili solo **dopo** che un utente ha interagito, perché a quel punto memorizziamo i riferimenti della conversazione.
|
||||
- Vedi `/gateway/configuration` per `dmPolicy` e il controllo tramite allowlist.
|
||||
|
||||
## ID team e canale (problema comune)
|
||||
## ID team e canale (errore comune)
|
||||
|
||||
Il parametro di query `groupId` negli URL Teams **NON** è l'ID team usato per la configurazione. Estrai invece gli ID dal percorso URL:
|
||||
Il parametro di query `groupId` negli URL di Teams **NON** è l'ID team usato per la configurazione. Estrai invece gli ID dal percorso dell'URL:
|
||||
|
||||
**URL team:**
|
||||
|
||||
```
|
||||
https://teams.microsoft.com/l/team/19%3ABk4j...%40thread.tacv2/conversations?groupId=...
|
||||
└────────────────────────────┘
|
||||
ID team (decodifica questo URL)
|
||||
ID team (decodifica URL)
|
||||
```
|
||||
|
||||
**URL canale:**
|
||||
@ -743,12 +896,12 @@ https://teams.microsoft.com/l/team/19%3ABk4j...%40thread.tacv2/conversations?gro
|
||||
```
|
||||
https://teams.microsoft.com/l/channel/19%3A15bc...%40thread.tacv2/ChannelName?groupId=...
|
||||
└─────────────────────────┘
|
||||
ID canale (decodifica questo URL)
|
||||
ID canale (decodifica URL)
|
||||
```
|
||||
|
||||
**Per la configurazione:**
|
||||
|
||||
- ID team = segmento del percorso dopo `/team/` (decodificato URL, ad esempio `19:Bk4j...@thread.tacv2`)
|
||||
- ID team = segmento del percorso dopo `/team/` (decodificato URL, ad es. `19:Bk4j...@thread.tacv2`)
|
||||
- ID canale = segmento del percorso dopo `/channel/` (decodificato URL)
|
||||
- **Ignora** il parametro di query `groupId`
|
||||
|
||||
@ -756,17 +909,17 @@ https://teams.microsoft.com/l/channel/19%3A15bc...%40thread.tacv2/ChannelName?gr
|
||||
|
||||
I bot hanno supporto limitato nei canali privati:
|
||||
|
||||
| Funzionalità | Canali standard | Canali privati |
|
||||
| ---------------------------- | ------------------ | ---------------------- |
|
||||
| Installazione bot | Sì | Limitata |
|
||||
| Messaggi in tempo reale (webhook) | Sì | Potrebbe non funzionare |
|
||||
| Autorizzazioni RSC | Sì | Potrebbero comportarsi diversamente |
|
||||
| @mentions | Sì | Se il bot è accessibile |
|
||||
| Cronologia API Graph | Sì | Sì (con autorizzazioni) |
|
||||
| Funzionalità | Canali standard | Canali privati |
|
||||
| ---------------------------- | ----------------- | --------------------- |
|
||||
| Installazione del bot | Sì | Limitata |
|
||||
| Messaggi in tempo reale (webhook) | Sì | Potrebbe non funzionare |
|
||||
| Autorizzazioni RSC | Sì | Potrebbero comportarsi in modo diverso |
|
||||
| @mentions | Sì | Se il bot è accessibile |
|
||||
| Cronologia API Graph | Sì | Sì (con autorizzazioni) |
|
||||
|
||||
**Soluzioni alternative se i canali privati non funzionano:**
|
||||
|
||||
1. Usa canali standard per le interazioni col bot
|
||||
1. Usa canali standard per le interazioni con il bot
|
||||
2. Usa i DM - gli utenti possono sempre inviare messaggi direttamente al bot
|
||||
3. Usa l'API Graph per l'accesso storico (richiede `ChannelMessage.Read.All`)
|
||||
|
||||
@ -775,38 +928,38 @@ I bot hanno supporto limitato nei canali privati:
|
||||
### Problemi comuni
|
||||
|
||||
- **Le immagini non vengono mostrate nei canali:** mancano autorizzazioni Graph o consenso amministratore. Reinstalla l'app Teams e chiudi/riapri completamente Teams.
|
||||
- **Nessuna risposta nel canale:** le menzioni sono richieste per impostazione predefinita; imposta `channels.msteams.requireMention=false` oppure configura per team/canale.
|
||||
- **Version mismatch (Teams mostra ancora il vecchio manifest):** rimuovi e aggiungi di nuovo l'app, quindi chiudi completamente Teams per aggiornare.
|
||||
- **401 Unauthorized dal webhook:** previsto quando si testa manualmente senza JWT Azure - significa che l'endpoint è raggiungibile ma l'autenticazione è fallita. Usa Azure Web Chat per testare correttamente.
|
||||
- **Nessuna risposta nel canale:** per impostazione predefinita le menzioni sono richieste; imposta `channels.msteams.requireMention=false` o configura per team/canale.
|
||||
- **Versione non corrispondente (Teams mostra ancora il vecchio manifest):** rimuovi e aggiungi di nuovo l'app e chiudi completamente Teams per aggiornare.
|
||||
- **401 Unauthorized dal webhook:** previsto quando fai test manuali senza JWT Azure - significa che l'endpoint è raggiungibile ma l'autenticazione non è riuscita. Usa Azure Web Chat per testare correttamente.
|
||||
|
||||
### Errori di caricamento del manifest
|
||||
### Errori nel caricamento del manifest
|
||||
|
||||
- **"Icon file cannot be empty":** il manifest fa riferimento a file icona da 0 byte. Crea icone PNG valide (32x32 per `outline.png`, 192x192 per `color.png`).
|
||||
- **"Icon file cannot be empty":** il manifest fa riferimento a file icona di 0 byte. Crea icone PNG valide (32x32 per `outline.png`, 192x192 per `color.png`).
|
||||
- **"webApplicationInfo.Id already in use":** l'app è ancora installata in un altro team/chat. Trovala e disinstallala prima, oppure attendi 5-10 minuti per la propagazione.
|
||||
- **"Something went wrong" durante il caricamento:** carica invece tramite [https://admin.teams.microsoft.com](https://admin.teams.microsoft.com), apri DevTools del browser (F12) → scheda Network, e controlla il corpo della risposta per l'errore effettivo.
|
||||
- **Sideload non riuscito:** prova "Upload an app to your org's app catalog" invece di "Upload a custom app" - spesso aggira le restrizioni sul sideload.
|
||||
- **"Something went wrong" durante il caricamento:** carica invece tramite [https://admin.teams.microsoft.com](https://admin.teams.microsoft.com), apri i DevTools del browser (F12) → scheda Network, e controlla il corpo della risposta per l'errore effettivo.
|
||||
- **Sideload non riuscito:** prova "Upload an app to your org's app catalog" invece di "Upload a custom app" - spesso questo aggira le restrizioni del sideload.
|
||||
|
||||
### Le autorizzazioni RSC non funzionano
|
||||
|
||||
1. Verifica che `webApplicationInfo.id` corrisponda esattamente all'App ID del tuo bot
|
||||
2. Ricarica l'app e reinstallala nel team/chat
|
||||
3. Controlla se l'amministratore dell'organizzazione ha bloccato le autorizzazioni RSC
|
||||
3. Controlla se l'amministratore della tua organizzazione ha bloccato le autorizzazioni RSC
|
||||
4. Conferma di usare l'ambito corretto: `ChannelMessage.Read.Group` per i team, `ChatMessage.Read.Chat` per le chat di gruppo
|
||||
|
||||
## Riferimenti
|
||||
|
||||
- [Create Azure Bot](https://learn.microsoft.com/en-us/azure/bot-service/bot-service-quickstart-registration) - guida alla configurazione Azure Bot
|
||||
- [Crea Azure Bot](https://learn.microsoft.com/en-us/azure/bot-service/bot-service-quickstart-registration) - guida alla configurazione di Azure Bot
|
||||
- [Teams Developer Portal](https://dev.teams.microsoft.com/apps) - crea/gestisci app Teams
|
||||
- [Teams app manifest schema](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema)
|
||||
- [Receive channel messages with RSC](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/channel-messages-with-rsc)
|
||||
- [RSC permissions reference](https://learn.microsoft.com/en-us/microsoftteams/platform/graph-api/rsc/resource-specific-consent)
|
||||
- [Teams bot file handling](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bots-filesv4) (canale/gruppo richiede Graph)
|
||||
- [Proactive messaging](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages)
|
||||
- [Schema manifest app Teams](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema)
|
||||
- [Ricevere messaggi di canale con RSC](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/channel-messages-with-rsc)
|
||||
- [Riferimento autorizzazioni RSC](https://learn.microsoft.com/en-us/microsoftteams/platform/graph-api/rsc/resource-specific-consent)
|
||||
- [Gestione file del bot Teams](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bots-filesv4) (canale/gruppo richiede Graph)
|
||||
- [Messaggistica proattiva](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages)
|
||||
|
||||
## Correlati
|
||||
|
||||
- [Panoramica canali](/it/channels) — tutti i canali supportati
|
||||
- [Pairing](/it/channels/pairing) — autenticazione DM e flusso di pairing
|
||||
- [Gruppi](/it/channels/groups) — comportamento della chat di gruppo e gate basato su menzione
|
||||
- [Routing del canale](/it/channels/channel-routing) — routing della sessione per i messaggi
|
||||
- [Sicurezza](/gateway/security) — modello di accesso e hardening
|
||||
- [Gruppi](/it/channels/groups) — comportamento della chat di gruppo e vincolo di menzione
|
||||
- [Routing canale](/it/channels/channel-routing) — routing della sessione per i messaggi
|
||||
- [Sicurezza](/it/gateway/security) — modello di accesso e hardening
|
||||
|
||||
@ -1,58 +1,51 @@
|
||||
---
|
||||
read_when:
|
||||
- Stai modificando il runtime incorporato dell'agente o il registro harness
|
||||
- Stai registrando un agent harness da un plugin bundled o trusted
|
||||
- Stai modificando il runtime dell'agente incorporato o il registro dell'harness
|
||||
- Stai registrando un harness dell'agente da un plugin incluso o attendibile
|
||||
- Devi capire come il plugin Codex si relaziona ai provider di modelli
|
||||
sidebarTitle: Agent Harness
|
||||
summary: Superficie SDK sperimentale per plugin che sostituiscono l'esecutore incorporato dell'agente di basso livello
|
||||
title: Plugin Agent Harness
|
||||
summary: Superficie SDK sperimentale per i plugin che sostituiscono l'esecutore dell'agente incorporato di basso livello
|
||||
title: Plugin Harness dell'agente
|
||||
x-i18n:
|
||||
generated_at: "2026-04-11T02:46:05Z"
|
||||
generated_at: "2026-04-12T00:19:02Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 43c1f2c087230398b0162ed98449f239c8db1e822e51c7dcd40c54fa6c3374e1
|
||||
source_hash: 62b88fd24ce8b600179db27e16e8d764a2cd7a14e5c5df76374c33121aa5e365
|
||||
source_path: plugins/sdk-agent-harness.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Plugin Agent Harness
|
||||
# Plugin Harness dell'agente
|
||||
|
||||
Un **agent harness** è l'esecutore di basso livello per un singolo turno di agente
|
||||
OpenClaw già preparato. Non è un provider di modelli, non è un canale e non è un registro degli strumenti.
|
||||
Un **agent harness** è l'esecutore di basso livello per un turno preparato di un agente OpenClaw. Non è un provider di modelli, non è un canale e non è un registro di strumenti.
|
||||
|
||||
Usa questa superficie solo per plugin nativi bundled o trusted. Il contratto è
|
||||
ancora sperimentale perché i tipi dei parametri rispecchiano intenzionalmente l'attuale
|
||||
runner incorporato.
|
||||
Usa questa superficie solo per plugin nativi inclusi o attendibili. Il contratto è ancora sperimentale perché i tipi dei parametri rispecchiano intenzionalmente l'attuale runner incorporato.
|
||||
|
||||
## Quando usare un harness
|
||||
|
||||
Registra un agent harness quando una famiglia di modelli ha il proprio runtime
|
||||
di sessione nativo e il normale trasporto provider di OpenClaw è l'astrazione sbagliata.
|
||||
Registra un agent harness quando una famiglia di modelli ha un proprio runtime di sessione nativo e il normale trasporto provider di OpenClaw è l'astrazione sbagliata.
|
||||
|
||||
Esempi:
|
||||
|
||||
- un server di agente di coding nativo che gestisce thread e compattazione
|
||||
- una CLI o un daemon locale che deve trasmettere eventi nativi di piano/ragionamento/strumenti
|
||||
- un runtime di modello che necessita del proprio resume id oltre alla
|
||||
trascrizione di sessione OpenClaw
|
||||
- un server nativo per agenti di coding che gestisce thread e compattazione
|
||||
- una CLI o un demone locale che deve trasmettere eventi nativi di piano/ragionamento/strumenti
|
||||
- un runtime di modelli che ha bisogno di un proprio ID di ripresa oltre alla trascrizione di sessione OpenClaw
|
||||
|
||||
**Non** registrare un harness solo per aggiungere una nuova API LLM. Per normali API di modelli HTTP o
|
||||
WebSocket, crea un [plugin provider](/it/plugins/sdk-provider-plugins).
|
||||
**Non** registrare un harness solo per aggiungere una nuova API LLM. Per normali API di modelli HTTP o WebSocket, crea un [plugin provider](/it/plugins/sdk-provider-plugins).
|
||||
|
||||
## Cosa continua a essere gestito dal core
|
||||
## Cosa rimane di competenza del core
|
||||
|
||||
Prima che venga selezionato un harness, OpenClaw ha già risolto:
|
||||
|
||||
- provider e modello
|
||||
- stato auth del runtime
|
||||
- livello di ragionamento e budget di contesto
|
||||
- la trascrizione/sessione OpenClaw
|
||||
- policy di workspace, sandbox e strumenti
|
||||
- stato di autenticazione del runtime
|
||||
- livello di reasoning e budget di contesto
|
||||
- la trascrizione OpenClaw / il file di sessione
|
||||
- workspace, sandbox e policy degli strumenti
|
||||
- callback di risposta del canale e callback di streaming
|
||||
- policy di fallback del modello e di cambio modello live
|
||||
- fallback del modello e policy di cambio del modello live
|
||||
|
||||
Questa separazione è intenzionale. Un harness esegue un tentativo preparato; non sceglie
|
||||
provider, non sostituisce la consegna del canale e non cambia silenziosamente modello.
|
||||
Questa separazione è intenzionale. Un harness esegue un tentativo preparato; non sceglie i provider, non sostituisce la consegna del canale e non cambia silenziosamente modello.
|
||||
|
||||
## Registrare un harness
|
||||
|
||||
@ -90,66 +83,51 @@ export default definePluginEntry({
|
||||
});
|
||||
```
|
||||
|
||||
## Policy di selezione
|
||||
## Criterio di selezione
|
||||
|
||||
OpenClaw sceglie un harness dopo la risoluzione di provider/modello:
|
||||
|
||||
1. `OPENCLAW_AGENT_RUNTIME=<id>` forza un harness registrato con quell'id.
|
||||
2. `OPENCLAW_AGENT_RUNTIME=pi` forza l'harness PI integrato.
|
||||
3. `OPENCLAW_AGENT_RUNTIME=auto` chiede agli harness registrati se supportano il
|
||||
provider/modello risolto.
|
||||
4. Se nessun harness registrato corrisponde, OpenClaw usa PI a meno che il fallback a PI non sia
|
||||
disabilitato.
|
||||
3. `OPENCLAW_AGENT_RUNTIME=auto` chiede agli harness registrati se supportano il provider/modello risolto.
|
||||
4. Se nessun harness registrato corrisponde, OpenClaw usa PI a meno che il fallback a PI non sia disabilitato.
|
||||
|
||||
Gli errori di un harness plugin forzato emergono come errori di esecuzione. In modalità `auto`,
|
||||
OpenClaw può tornare a PI quando l'harness plugin selezionato fallisce prima che un
|
||||
turno abbia prodotto effetti collaterali. Imposta `OPENCLAW_AGENT_HARNESS_FALLBACK=none` oppure
|
||||
`embeddedHarness.fallback: "none"` per rendere invece quel fallback un errore definitivo.
|
||||
Gli errori forzati dell'harness del plugin emergono come errori di esecuzione. In modalità `auto`, OpenClaw può ricadere su PI quando l'harness del plugin selezionato fallisce prima che un turno produca effetti collaterali. Imposta `OPENCLAW_AGENT_HARNESS_FALLBACK=none` o `embeddedHarness.fallback: "none"` per rendere invece quel fallback un errore irreversibile.
|
||||
|
||||
Il plugin Codex bundled registra `codex` come id del proprio harness. Il core tratta questo
|
||||
come un normale id di harness plugin; gli alias specifici di Codex appartengono al plugin
|
||||
o alla configurazione dell'operatore, non al selettore runtime condiviso.
|
||||
Il plugin Codex incluso registra `codex` come ID del proprio harness. Il core lo tratta come un normale ID di harness del plugin; gli alias specifici di Codex appartengono al plugin o alla configurazione dell'operatore, non al selettore di runtime condiviso.
|
||||
|
||||
## Associazione provider più harness
|
||||
|
||||
La maggior parte degli harness dovrebbe registrare anche un provider. Il provider rende i riferimenti ai modelli,
|
||||
lo stato auth, i metadati del modello e la selezione `/model` visibili al resto di
|
||||
OpenClaw. L'harness poi rivendica quel provider in `supports(...)`.
|
||||
La maggior parte degli harness dovrebbe anche registrare un provider. Il provider rende visibili al resto di OpenClaw i riferimenti ai modelli, lo stato di autenticazione, i metadati del modello e la selezione `/model`. L'harness poi rivendica quel provider in `supports(...)`.
|
||||
|
||||
Il plugin Codex bundled segue questo schema:
|
||||
Il plugin Codex incluso segue questo schema:
|
||||
|
||||
- id provider: `codex`
|
||||
- riferimenti modello utente: `codex/gpt-5.4`, `codex/gpt-5.2` o un altro modello restituito
|
||||
dal server app Codex
|
||||
- riferimenti ai modelli per l'utente: `codex/gpt-5.4`, `codex/gpt-5.2` o un altro modello restituito dal server app Codex
|
||||
- id harness: `codex`
|
||||
- auth: disponibilità sintetica del provider, perché l'harness Codex gestisce il
|
||||
login/sessione Codex nativo
|
||||
- richiesta al server app: OpenClaw invia l'id modello nudo a Codex e lascia che
|
||||
l'harness parli con il protocollo nativo del server app
|
||||
- autenticazione: disponibilità sintetica del provider, perché l'harness Codex gestisce il login/sessione Codex nativo
|
||||
- richiesta al server app: OpenClaw invia l'ID del modello senza prefissi a Codex e lascia che l'harness comunichi con il protocollo nativo del server app
|
||||
|
||||
Il plugin Codex è additivo. I semplici riferimenti `openai/gpt-*` restano riferimenti del provider OpenAI
|
||||
e continuano a usare il normale percorso provider di OpenClaw. Seleziona `codex/gpt-*`
|
||||
quando vuoi auth gestita da Codex, rilevamento modelli Codex, thread nativi e
|
||||
esecuzione del server app Codex. `/model` può passare tra i modelli Codex restituiti
|
||||
dal server app Codex senza richiedere credenziali del provider OpenAI.
|
||||
Il plugin Codex è aggiuntivo. I riferimenti semplici `openai/gpt-*` restano riferimenti del provider OpenAI e continuano a usare il normale percorso provider di OpenClaw. Seleziona `codex/gpt-*` quando vuoi autenticazione gestita da Codex, rilevamento dei modelli Codex, thread nativi ed esecuzione del server app Codex. `/model` può passare tra i modelli Codex restituiti dal server app Codex senza richiedere credenziali del provider OpenAI.
|
||||
|
||||
Per la configurazione dell'operatore, esempi di prefisso modello e configurazioni solo Codex, vedi
|
||||
[Codex Harness](/it/plugins/codex-harness).
|
||||
Per la configurazione dell'operatore, esempi di prefissi di modello e configurazioni solo Codex, vedi [Codex Harness](/it/plugins/codex-harness).
|
||||
|
||||
OpenClaw richiede Codex app-server `0.118.0` o successivo. Il plugin Codex controlla
|
||||
l'handshake di inizializzazione del server app e blocca server più vecchi o senza versione, così
|
||||
OpenClaw viene eseguito solo contro la superficie di protocollo su cui è stato testato.
|
||||
OpenClaw richiede Codex app-server `0.118.0` o successivo. Il plugin Codex controlla l'handshake di inizializzazione dell'app-server e blocca i server più vecchi o senza versione, così OpenClaw viene eseguito solo sulla superficie di protocollo con cui è stato testato.
|
||||
|
||||
### Modalità harness Codex nativa
|
||||
|
||||
L'harness `codex` incluso è la modalità Codex nativa per i turni degli agenti OpenClaw incorporati. Abilita prima il plugin `codex` incluso e includi `codex` in `plugins.allow` se la tua configurazione usa una allowlist restrittiva. È diverso da `openai-codex/*`:
|
||||
|
||||
- `openai-codex/*` usa OAuth ChatGPT/Codex tramite il normale percorso provider di OpenClaw.
|
||||
- `codex/*` usa il provider Codex incluso e instrada il turno tramite il server app Codex.
|
||||
|
||||
Quando questa modalità è in esecuzione, Codex gestisce l'ID del thread nativo, il comportamento di ripresa, la compattazione e l'esecuzione dell'app-server. OpenClaw continua comunque a gestire il canale di chat, il mirror della trascrizione visibile, la policy degli strumenti, le approvazioni, la consegna dei contenuti multimediali e la selezione della sessione. Usa `embeddedHarness.runtime: "codex"` con `embeddedHarness.fallback: "none"` quando devi dimostrare che viene usato il percorso del server app Codex e che il fallback a PI non sta nascondendo un harness nativo non funzionante.
|
||||
|
||||
## Disabilitare il fallback a PI
|
||||
|
||||
Per impostazione predefinita, OpenClaw esegue agenti incorporati con `agents.defaults.embeddedHarness`
|
||||
impostato su `{ runtime: "auto", fallback: "pi" }`. In modalità `auto`, gli harness plugin registrati
|
||||
possono rivendicare una coppia provider/modello. Se nessuno corrisponde, oppure se un harness plugin
|
||||
selezionato automaticamente fallisce prima di produrre output, OpenClaw torna a PI.
|
||||
Per impostazione predefinita, OpenClaw esegue gli agenti incorporati con `agents.defaults.embeddedHarness` impostato su `{ runtime: "auto", fallback: "pi" }`. In modalità `auto`, gli harness dei plugin registrati possono rivendicare una coppia provider/modello. Se nessuno corrisponde, oppure se un harness del plugin selezionato automaticamente fallisce prima di produrre output, OpenClaw ricade su PI.
|
||||
|
||||
Imposta `fallback: "none"` quando devi dimostrare che un harness plugin è l'unico
|
||||
runtime effettivamente usato. Questo disabilita il fallback automatico a PI; non blocca
|
||||
un `runtime: "pi"` esplicito o `OPENCLAW_AGENT_RUNTIME=pi`.
|
||||
Imposta `fallback: "none"` quando devi dimostrare che un harness del plugin è l'unico runtime realmente utilizzato. Questo disabilita il fallback automatico a PI; non blocca un `runtime: "pi"` esplicito o `OPENCLAW_AGENT_RUNTIME=pi`.
|
||||
|
||||
Per esecuzioni incorporate solo Codex:
|
||||
|
||||
@ -167,9 +145,7 @@ Per esecuzioni incorporate solo Codex:
|
||||
}
|
||||
```
|
||||
|
||||
Se vuoi che qualsiasi harness plugin registrato rivendichi i modelli corrispondenti ma non
|
||||
vuoi mai che OpenClaw torni silenziosamente a PI, mantieni `runtime: "auto"` e disabilita
|
||||
il fallback:
|
||||
Se vuoi che qualunque harness del plugin registrato possa rivendicare i modelli corrispondenti ma non vuoi mai che OpenClaw ricada silenziosamente su PI, mantieni `runtime: "auto"` e disabilita il fallback:
|
||||
|
||||
```json
|
||||
{
|
||||
@ -184,7 +160,7 @@ il fallback:
|
||||
}
|
||||
```
|
||||
|
||||
Gli override per agente usano la stessa struttura:
|
||||
Le override per agente usano la stessa struttura:
|
||||
|
||||
```json
|
||||
{
|
||||
@ -209,9 +185,7 @@ Gli override per agente usano la stessa struttura:
|
||||
}
|
||||
```
|
||||
|
||||
`OPENCLAW_AGENT_RUNTIME` continua a sovrascrivere il runtime configurato. Usa
|
||||
`OPENCLAW_AGENT_HARNESS_FALLBACK=none` per disabilitare il fallback a PI
|
||||
dall'ambiente.
|
||||
`OPENCLAW_AGENT_RUNTIME` continua a sovrascrivere il runtime configurato. Usa `OPENCLAW_AGENT_HARNESS_FALLBACK=none` per disabilitare il fallback a PI dall'ambiente.
|
||||
|
||||
```bash
|
||||
OPENCLAW_AGENT_RUNTIME=codex \
|
||||
@ -219,47 +193,34 @@ OPENCLAW_AGENT_HARNESS_FALLBACK=none \
|
||||
openclaw gateway run
|
||||
```
|
||||
|
||||
Con il fallback disabilitato, una sessione fallisce subito quando l'harness richiesto non è
|
||||
registrato, non supporta il provider/modello risolto o fallisce prima di
|
||||
produrre effetti collaterali del turno. Questo è intenzionale per distribuzioni solo Codex e
|
||||
per test live che devono dimostrare che il percorso del server app Codex è realmente in uso.
|
||||
Con il fallback disabilitato, una sessione fallisce subito quando l'harness richiesto non è registrato, non supporta il provider/modello risolto o fallisce prima di produrre effetti collaterali del turno. Questo è intenzionale per i deployment solo Codex e per i test live che devono dimostrare che il percorso del server app Codex è effettivamente in uso.
|
||||
|
||||
Questa impostazione controlla solo l'agent harness incorporato. Non disabilita
|
||||
l'instradamento specifico del provider per immagini, video, musica, TTS, PDF o altri modelli.
|
||||
Questa impostazione controlla solo l'harness dell'agente incorporato. Non disabilita l'instradamento specifico del provider per immagini, video, musica, TTS, PDF o altri modelli.
|
||||
|
||||
## Sessioni native e mirror della trascrizione
|
||||
|
||||
Un harness può mantenere un id di sessione nativo, id thread o token di ripresa lato daemon.
|
||||
Mantieni questa associazione esplicitamente collegata alla sessione OpenClaw e continua a
|
||||
rispecchiare nella trascrizione OpenClaw l'output di assistente/strumenti visibile all'utente.
|
||||
Un harness può mantenere un ID di sessione nativo, un ID di thread o un token di ripresa lato demone. Mantieni tale associazione esplicitamente legata alla sessione OpenClaw e continua a riflettere l'output visibile all'utente di assistente/strumenti nella trascrizione OpenClaw.
|
||||
|
||||
La trascrizione OpenClaw resta il livello di compatibilità per:
|
||||
La trascrizione OpenClaw rimane il livello di compatibilità per:
|
||||
|
||||
- cronologia della sessione visibile nel canale
|
||||
- ricerca e indicizzazione della trascrizione
|
||||
- ritorno all'harness PI integrato in un turno successivo
|
||||
- comportamento generico di `/new`, `/reset` ed eliminazione della sessione
|
||||
|
||||
Se il tuo harness memorizza un'associazione sidecar, implementa `reset(...)` in modo che OpenClaw possa
|
||||
cancellarla quando la sessione OpenClaw proprietaria viene reimpostata.
|
||||
Se il tuo harness memorizza un'associazione sidecar, implementa `reset(...)` così OpenClaw può cancellarla quando la sessione OpenClaw proprietaria viene reimpostata.
|
||||
|
||||
## Risultati di strumenti e media
|
||||
## Risultati di strumenti e contenuti multimediali
|
||||
|
||||
Il core costruisce l'elenco degli strumenti OpenClaw e lo passa al tentativo preparato.
|
||||
Quando un harness esegue una chiamata dinamica a uno strumento, restituisci il risultato dello strumento tramite
|
||||
la forma di risultato dell'harness invece di inviare tu stesso i media al canale.
|
||||
Il core costruisce l'elenco degli strumenti OpenClaw e lo passa nel tentativo preparato. Quando un harness esegue una chiamata a strumento dinamica, restituisci il risultato dello strumento tramite la forma del risultato dell'harness invece di inviare tu stesso i contenuti multimediali al canale.
|
||||
|
||||
Questo mantiene testo, immagine, video, musica, TTS, approvazione e output degli
|
||||
strumenti di messaggistica sullo stesso percorso di consegna delle esecuzioni supportate da PI.
|
||||
Questo mantiene output di testo, immagine, video, musica, TTS, approvazione e strumenti di messaggistica sullo stesso percorso di consegna delle esecuzioni supportate da PI.
|
||||
|
||||
## Limitazioni attuali
|
||||
|
||||
- Il percorso di import pubblico è generico, ma alcuni alias di tipo per tentativo/risultato
|
||||
portano ancora nomi `Pi` per compatibilità.
|
||||
- L'installazione di harness di terze parti è sperimentale. Preferisci i plugin provider
|
||||
finché non ti serve un runtime di sessione nativo.
|
||||
- Il cambio di harness è supportato tra i turni. Non cambiare harness nel
|
||||
mezzo di un turno dopo che strumenti nativi, approvazioni, testo dell'assistente o invii di messaggi sono iniziati.
|
||||
- Il percorso di import pubblico è generico, ma alcuni alias di tipo attempt/result riportano ancora nomi `Pi` per compatibilità.
|
||||
- L'installazione di harness di terze parti è sperimentale. Preferisci i plugin provider finché non ti serve un runtime di sessione nativo.
|
||||
- Il cambio di harness è supportato tra i turni. Non cambiare harness nel mezzo di un turno dopo che sono iniziati strumenti nativi, approvazioni, testo dell'assistente o invii di messaggi.
|
||||
|
||||
## Correlati
|
||||
|
||||
|
||||
@ -1,31 +1,32 @@
|
||||
---
|
||||
read_when:
|
||||
- Vuoi usare i modelli OpenAI in OpenClaw
|
||||
- Vuoi usare l'autenticazione con abbonamento Codex invece delle chiavi API
|
||||
- Vuoi l'autenticazione con abbonamento Codex invece delle chiavi API
|
||||
- Hai bisogno di un comportamento di esecuzione degli agenti GPT-5 più rigoroso
|
||||
summary: Usa OpenAI tramite chiavi API o abbonamento Codex in OpenClaw
|
||||
title: OpenAI
|
||||
x-i18n:
|
||||
generated_at: "2026-04-07T08:17:29Z"
|
||||
generated_at: "2026-04-12T00:18:54Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 6a2ce1ce5f085fe55ec50b8d20359180b9002c9730820cd5b0e011c3bf807b64
|
||||
source_hash: 7aa06fba9ac901e663685a6b26443a2f6aeb6ec3589d939522dc87cbb43497b4
|
||||
source_path: providers/openai.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# OpenAI
|
||||
|
||||
OpenAI fornisce API per sviluppatori per i modelli GPT. Codex supporta l'**accesso con ChatGPT** per l'accesso in abbonamento
|
||||
OpenAI fornisce API per sviluppatori per i modelli GPT. Codex supporta l'**accesso con ChatGPT** per l'accesso tramite abbonamento
|
||||
oppure l'accesso con **chiave API** per l'accesso basato sul consumo. Codex cloud richiede l'accesso con ChatGPT.
|
||||
OpenAI supporta esplicitamente l'uso di OAuth dell'abbonamento in strumenti/workflow esterni come OpenClaw.
|
||||
OpenAI supporta esplicitamente l'uso dell'OAuth dell'abbonamento in strumenti/workflow esterni come OpenClaw.
|
||||
|
||||
## Stile di interazione predefinito
|
||||
|
||||
OpenClaw può aggiungere una piccola sovrapposizione di prompt specifica per OpenAI sia per le esecuzioni `openai/*` sia per quelle
|
||||
`openai-codex/*`. Per impostazione predefinita, la sovrapposizione mantiene l'assistente disponibile,
|
||||
OpenClaw può aggiungere un piccolo overlay di prompt specifico per OpenAI sia per le esecuzioni `openai/*` sia per
|
||||
quelle `openai-codex/*`. Per impostazione predefinita, l'overlay mantiene l'assistente cordiale,
|
||||
collaborativo, conciso, diretto e un po' più espressivo dal punto di vista emotivo
|
||||
senza sostituire il prompt di sistema base di OpenClaw. La sovrapposizione amichevole
|
||||
consente anche l'uso occasionale di emoji quando si adattano in modo naturale, mantenendo comunque
|
||||
senza sostituire il prompt di sistema base di OpenClaw. L'overlay cordiale
|
||||
consente anche l'emoji occasionale quando si adatta in modo naturale, mantenendo comunque
|
||||
l'output complessivamente conciso.
|
||||
|
||||
Chiave di configurazione:
|
||||
@ -34,15 +35,15 @@ Chiave di configurazione:
|
||||
|
||||
Valori consentiti:
|
||||
|
||||
- `"friendly"`: predefinito; abilita la sovrapposizione specifica per OpenAI.
|
||||
- `"friendly"`: predefinito; abilita l'overlay specifico per OpenAI.
|
||||
- `"on"`: alias di `"friendly"`.
|
||||
- `"off"`: disabilita la sovrapposizione e usa solo il prompt base di OpenClaw.
|
||||
- `"off"`: disabilita l'overlay e usa solo il prompt base di OpenClaw.
|
||||
|
||||
Ambito:
|
||||
|
||||
- Si applica ai modelli `openai/*`.
|
||||
- Si applica ai modelli `openai-codex/*`.
|
||||
- Non influisce sugli altri provider.
|
||||
- Non influisce su altri provider.
|
||||
|
||||
Questo comportamento è attivo per impostazione predefinita. Mantieni `"friendly"` esplicitamente se vuoi che
|
||||
sopravviva a future modifiche locali della configurazione:
|
||||
@ -61,9 +62,9 @@ sopravviva a future modifiche locali della configurazione:
|
||||
}
|
||||
```
|
||||
|
||||
### Disabilitare la sovrapposizione di prompt OpenAI
|
||||
### Disabilitare l'overlay di prompt OpenAI
|
||||
|
||||
Se vuoi il prompt base di OpenClaw non modificato, imposta la sovrapposizione su `"off"`:
|
||||
Se vuoi il prompt base non modificato di OpenClaw, imposta l'overlay su `"off"`:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -85,19 +86,19 @@ Puoi anche impostarlo direttamente con la CLI di configurazione:
|
||||
openclaw config set plugins.entries.openai.config.personality off
|
||||
```
|
||||
|
||||
OpenClaw normalizza questa impostazione senza distinzione tra maiuscole e minuscole a runtime, quindi valori come
|
||||
`"Off"` disabilitano comunque la sovrapposizione amichevole.
|
||||
OpenClaw normalizza questa impostazione in modo non sensibile alle maiuscole/minuscole in fase di esecuzione, quindi valori come
|
||||
`"Off"` disabilitano comunque l'overlay cordiale.
|
||||
|
||||
## Opzione A: chiave API OpenAI (OpenAI Platform)
|
||||
|
||||
**Ideale per:** accesso diretto alle API e fatturazione basata sull'utilizzo.
|
||||
Ottieni la tua chiave API dalla dashboard OpenAI.
|
||||
**Ideale per:** accesso API diretto e fatturazione basata sul consumo.
|
||||
Ottieni la tua chiave API dalla dashboard di OpenAI.
|
||||
|
||||
Riepilogo del routing:
|
||||
Riepilogo dei percorsi:
|
||||
|
||||
- `openai/gpt-5.4` = route API diretta di OpenAI Platform
|
||||
- Richiede `OPENAI_API_KEY` (o configurazione equivalente del provider OpenAI)
|
||||
- In OpenClaw, l'accesso ChatGPT/Codex viene instradato tramite `openai-codex/*`, non `openai/*`
|
||||
- `openai/gpt-5.4` = percorso API diretto di OpenAI Platform
|
||||
- Richiede `OPENAI_API_KEY` (o una configurazione equivalente del provider OpenAI)
|
||||
- In OpenClaw, l'accesso ChatGPT/Codex passa tramite `openai-codex/*`, non `openai/*`
|
||||
|
||||
### Configurazione CLI
|
||||
|
||||
@ -107,7 +108,7 @@ openclaw onboard --auth-choice openai-api-key
|
||||
openclaw onboard --openai-api-key "$OPENAI_API_KEY"
|
||||
```
|
||||
|
||||
### Esempio di configurazione
|
||||
### Frammento di configurazione
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -117,27 +118,27 @@ openclaw onboard --openai-api-key "$OPENAI_API_KEY"
|
||||
```
|
||||
|
||||
La documentazione attuale dei modelli API di OpenAI elenca `gpt-5.4` e `gpt-5.4-pro` per l'uso diretto
|
||||
delle API OpenAI. OpenClaw inoltra entrambi tramite il percorso `openai/*` Responses.
|
||||
tramite API OpenAI. OpenClaw inoltra entrambi attraverso il percorso Responses `openai/*`.
|
||||
OpenClaw sopprime intenzionalmente la riga obsoleta `openai/gpt-5.3-codex-spark`,
|
||||
perché le chiamate API dirette a OpenAI la rifiutano nel traffico live.
|
||||
perché le chiamate API dirette a OpenAI la rifiutano nel traffico reale.
|
||||
|
||||
OpenClaw **non** espone `openai/gpt-5.3-codex-spark` sul percorso API diretto di OpenAI.
|
||||
`pi-ai` include ancora una riga integrata per quel modello, ma le richieste API OpenAI live
|
||||
la rifiutano attualmente. In OpenClaw Spark è trattato come solo Codex.
|
||||
OpenClaw **non** espone `openai/gpt-5.3-codex-spark` nel percorso API diretto di OpenAI.
|
||||
`pi-ai` include ancora una riga integrata per quel modello, ma le richieste API OpenAI reali
|
||||
attualmente la rifiutano. In OpenClaw, Spark è trattato solo come Codex.
|
||||
|
||||
## Generazione di immagini
|
||||
|
||||
Il plugin `openai` incluso registra anche la generazione di immagini tramite lo
|
||||
strumento condiviso `image_generate`.
|
||||
Il plugin `openai` incluso registra anche la generazione di immagini tramite lo strumento condiviso
|
||||
`image_generate`.
|
||||
|
||||
- Modello immagine predefinito: `openai/gpt-image-1`
|
||||
- Modello di immagini predefinito: `openai/gpt-image-1`
|
||||
- Generazione: fino a 4 immagini per richiesta
|
||||
- Modalità modifica: abilitata, fino a 5 immagini di riferimento
|
||||
- Supporta `size`
|
||||
- Limitazione attuale specifica di OpenAI: OpenClaw oggi non inoltra le sostituzioni `aspectRatio` o
|
||||
`resolution` alla OpenAI Images API
|
||||
- Avvertenza specifica attuale di OpenAI: oggi OpenClaw non inoltra gli override `aspectRatio` o
|
||||
`resolution` all'API OpenAI Images
|
||||
|
||||
Per usare OpenAI come provider immagine predefinito:
|
||||
Per usare OpenAI come provider di immagini predefinito:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -151,21 +152,21 @@ Per usare OpenAI come provider immagine predefinito:
|
||||
}
|
||||
```
|
||||
|
||||
Vedi [Generazione di immagini](/it/tools/image-generation) per i parametri condivisi
|
||||
dello strumento, la selezione del provider e il comportamento di failover.
|
||||
Vedi [Generazione di immagini](/it/tools/image-generation) per i parametri dello strumento condiviso,
|
||||
la selezione del provider e il comportamento di failover.
|
||||
|
||||
## Generazione video
|
||||
## Generazione di video
|
||||
|
||||
Il plugin `openai` incluso registra anche la generazione video tramite lo strumento condiviso
|
||||
Il plugin `openai` incluso registra anche la generazione di video tramite lo strumento condiviso
|
||||
`video_generate`.
|
||||
|
||||
- Modello video predefinito: `openai/sora-2`
|
||||
- Modalità: text-to-video, image-to-video e flussi di riferimento/modifica a video singolo
|
||||
- Modalità: text-to-video, image-to-video e flussi di riferimento/modifica con singolo video
|
||||
- Limiti attuali: 1 immagine o 1 input video di riferimento
|
||||
- Limitazione attuale specifica di OpenAI: OpenClaw attualmente inoltra solo le sostituzioni `size`
|
||||
per la generazione video nativa di OpenAI. Le sostituzioni opzionali non supportate
|
||||
come `aspectRatio`, `resolution`, `audio` e `watermark` vengono ignorate
|
||||
e restituite come avviso dello strumento.
|
||||
- Avvertenza specifica attuale di OpenAI: OpenClaw attualmente inoltra solo gli override `size`
|
||||
per la generazione video nativa di OpenAI. Gli override opzionali non supportati
|
||||
come `aspectRatio`, `resolution`, `audio` e `watermark` vengono ignorati
|
||||
e riportati come avviso dello strumento.
|
||||
|
||||
Per usare OpenAI come provider video predefinito:
|
||||
|
||||
@ -181,31 +182,31 @@ Per usare OpenAI come provider video predefinito:
|
||||
}
|
||||
```
|
||||
|
||||
Vedi [Generazione video](/it/tools/video-generation) per i parametri condivisi
|
||||
dello strumento, la selezione del provider e il comportamento di failover.
|
||||
Vedi [Generazione di video](/it/tools/video-generation) per i parametri dello strumento condiviso,
|
||||
la selezione del provider e il comportamento di failover.
|
||||
|
||||
## Opzione B: abbonamento OpenAI Code (Codex)
|
||||
|
||||
**Ideale per:** usare l'accesso in abbonamento ChatGPT/Codex invece di una chiave API.
|
||||
Codex cloud richiede l'accesso con ChatGPT, mentre la CLI Codex supporta l'accesso con ChatGPT o con chiave API.
|
||||
**Ideale per:** usare l'accesso tramite abbonamento ChatGPT/Codex invece di una chiave API.
|
||||
Codex cloud richiede l'accesso con ChatGPT, mentre la CLI di Codex supporta l'accesso con ChatGPT o chiave API.
|
||||
|
||||
Riepilogo del routing:
|
||||
Riepilogo dei percorsi:
|
||||
|
||||
- `openai-codex/gpt-5.4` = route OAuth ChatGPT/Codex
|
||||
- `openai-codex/gpt-5.4` = percorso OAuth ChatGPT/Codex
|
||||
- Usa l'accesso ChatGPT/Codex, non una chiave API diretta di OpenAI Platform
|
||||
- I limiti lato provider per `openai-codex/*` possono differire dall'esperienza web/app di ChatGPT
|
||||
|
||||
### Configurazione CLI (Codex OAuth)
|
||||
### Configurazione CLI (OAuth Codex)
|
||||
|
||||
```bash
|
||||
# Esegui Codex OAuth nella procedura guidata
|
||||
# Esegui l'OAuth Codex nella procedura guidata
|
||||
openclaw onboard --auth-choice openai-codex
|
||||
|
||||
# Oppure esegui OAuth direttamente
|
||||
# Oppure esegui direttamente l'OAuth
|
||||
openclaw models auth login --provider openai-codex
|
||||
```
|
||||
|
||||
### Esempio di configurazione (abbonamento Codex)
|
||||
### Frammento di configurazione (abbonamento Codex)
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -213,17 +214,17 @@ openclaw models auth login --provider openai-codex
|
||||
}
|
||||
```
|
||||
|
||||
La documentazione attuale di Codex di OpenAI elenca `gpt-5.4` come attuale modello Codex. OpenClaw
|
||||
La documentazione attuale di OpenAI per Codex elenca `gpt-5.4` come modello Codex corrente. OpenClaw
|
||||
lo mappa a `openai-codex/gpt-5.4` per l'uso con OAuth ChatGPT/Codex.
|
||||
|
||||
Questa route è intenzionalmente separata da `openai/gpt-5.4`. Se vuoi il
|
||||
Questo percorso è intenzionalmente separato da `openai/gpt-5.4`. Se vuoi il
|
||||
percorso API diretto di OpenAI Platform, usa `openai/*` con una chiave API. Se vuoi
|
||||
l'accesso ChatGPT/Codex, usa `openai-codex/*`.
|
||||
l'accesso con ChatGPT/Codex, usa `openai-codex/*`.
|
||||
|
||||
Se l'onboarding riutilizza un accesso CLI Codex esistente, quelle credenziali restano
|
||||
gestite dalla CLI Codex. Alla scadenza, OpenClaw rilegge prima l'origine Codex esterna
|
||||
Se l'onboarding riutilizza un accesso esistente della CLI di Codex, tali credenziali restano
|
||||
gestite dalla CLI di Codex. Alla scadenza, OpenClaw rilegge prima la fonte Codex esterna
|
||||
e, quando il provider può aggiornarla, riscrive la credenziale aggiornata
|
||||
nell'archiviazione Codex invece di assumerne il controllo in una copia separata solo OpenClaw.
|
||||
nell'archiviazione di Codex invece di assumerne la gestione in una copia separata solo OpenClaw.
|
||||
|
||||
Se il tuo account Codex ha diritto a Codex Spark, OpenClaw supporta anche:
|
||||
|
||||
@ -232,23 +233,23 @@ Se il tuo account Codex ha diritto a Codex Spark, OpenClaw supporta anche:
|
||||
OpenClaw tratta Codex Spark come solo Codex. Non espone un percorso diretto
|
||||
`openai/gpt-5.3-codex-spark` con chiave API.
|
||||
|
||||
OpenClaw preserva anche `openai-codex/gpt-5.3-codex-spark` quando `pi-ai`
|
||||
OpenClaw conserva anche `openai-codex/gpt-5.3-codex-spark` quando `pi-ai`
|
||||
lo rileva. Trattalo come dipendente dai diritti e sperimentale: Codex Spark è
|
||||
separato da GPT-5.4 `/fast`, e la disponibilità dipende dall'account Codex /
|
||||
ChatGPT connesso.
|
||||
|
||||
### Limite della finestra di contesto di Codex
|
||||
|
||||
OpenClaw tratta i metadati del modello Codex e il limite del contesto runtime come
|
||||
OpenClaw tratta i metadati del modello Codex e il limite di contesto a runtime come
|
||||
valori separati.
|
||||
|
||||
Per `openai-codex/gpt-5.4`:
|
||||
|
||||
- `contextWindow` nativo: `1050000`
|
||||
- limite predefinito runtime `contextTokens`: `272000`
|
||||
- limite `contextTokens` predefinito a runtime: `272000`
|
||||
|
||||
Questo mantiene veritieri i metadati del modello, preservando allo stesso tempo la finestra runtime
|
||||
predefinita più piccola che in pratica ha caratteristiche migliori di latenza e qualità.
|
||||
Questo mantiene fedeli i metadati del modello preservando al tempo stesso la finestra
|
||||
predefinita più piccola a runtime, che in pratica ha caratteristiche migliori di latenza e qualità.
|
||||
|
||||
Se vuoi un limite effettivo diverso, imposta `models.providers.<provider>.models[].contextTokens`:
|
||||
|
||||
@ -269,37 +270,37 @@ Se vuoi un limite effettivo diverso, imposta `models.providers.<provider>.models
|
||||
}
|
||||
```
|
||||
|
||||
Usa `contextWindow` solo quando dichiari o sovrascrivi metadati nativi del modello.
|
||||
Usa `contextTokens` quando vuoi limitare il budget del contesto runtime.
|
||||
Usa `contextWindow` solo quando stai dichiarando o sovrascrivendo i metadati nativi
|
||||
del modello. Usa `contextTokens` quando vuoi limitare il budget di contesto a runtime.
|
||||
|
||||
### Trasporto predefinito
|
||||
|
||||
OpenClaw usa `pi-ai` per lo streaming dei modelli. Sia per `openai/*` sia per
|
||||
OpenClaw usa `pi-ai` per lo streaming del modello. Per `openai/*` e
|
||||
`openai-codex/*`, il trasporto predefinito è `"auto"` (prima WebSocket, poi fallback
|
||||
SSE).
|
||||
|
||||
In modalità `"auto"`, OpenClaw riprova anche un errore WebSocket iniziale e riprovabile
|
||||
prima di passare a SSE. La modalità `"websocket"` forzata espone comunque gli errori di trasporto
|
||||
direttamente invece di nasconderli dietro al fallback.
|
||||
In modalità `"auto"`, OpenClaw ritenta anche un errore WebSocket iniziale e ripetibile
|
||||
prima di passare a SSE. La modalità `"websocket"` forzata continua invece a mostrare
|
||||
direttamente gli errori di trasporto invece di nasconderli dietro il fallback.
|
||||
|
||||
Dopo un errore WebSocket di connessione o nelle prime fasi del turno in modalità `"auto"`, OpenClaw contrassegna
|
||||
il percorso WebSocket di quella sessione come degradato per circa 60 secondi e invia
|
||||
i turni successivi tramite SSE durante il cooldown invece di oscillare continuamente tra
|
||||
i trasporti.
|
||||
i turni successivi tramite SSE durante il periodo di raffreddamento invece di oscillare
|
||||
continuamente tra i trasporti.
|
||||
|
||||
Per gli endpoint nativi della famiglia OpenAI (`openai/*`, `openai-codex/*` e Azure
|
||||
OpenAI Responses), OpenClaw allega anche uno stato stabile di identità di sessione e turno
|
||||
alle richieste, così retry, riconnessioni e fallback SSE restano allineati alla stessa
|
||||
identità di conversazione. Sulle route native della famiglia OpenAI questo include header stabili di identità
|
||||
di richiesta di sessione/turno più metadati di trasporto corrispondenti.
|
||||
alle richieste in modo che retry, riconnessioni e fallback SSE restino allineati alla stessa
|
||||
identità di conversazione. Nei percorsi nativi della famiglia OpenAI questo include intestazioni di identità
|
||||
stabili di richiesta di sessione/turno insieme a metadati di trasporto corrispondenti.
|
||||
|
||||
OpenClaw normalizza anche i contatori di utilizzo OpenAI tra le varianti di trasporto prima
|
||||
che raggiungano le superfici session/status. Il traffico nativo OpenAI/Codex Responses può
|
||||
OpenClaw normalizza anche i contatori di utilizzo di OpenAI tra le varianti di trasporto prima
|
||||
che raggiungano le superfici di sessione/stato. Il traffico nativo OpenAI/Codex Responses può
|
||||
riportare l'utilizzo come `input_tokens` / `output_tokens` oppure
|
||||
`prompt_tokens` / `completion_tokens`; OpenClaw li tratta come gli stessi contatori di input
|
||||
e output per `/status`, `/usage` e i log di sessione. Quando il traffico nativo
|
||||
WebSocket omette `total_tokens` (o riporta `0`), OpenClaw ripiega sul totale normalizzato input + output
|
||||
così le viste session/status restano popolate.
|
||||
WebSocket omette `total_tokens` (o riporta `0`), OpenClaw usa come fallback
|
||||
il totale normalizzato input + output così che le visualizzazioni di sessione/stato restino popolate.
|
||||
|
||||
Puoi impostare `agents.defaults.models.<provider/model>.params.transport`:
|
||||
|
||||
@ -307,13 +308,13 @@ Puoi impostare `agents.defaults.models.<provider/model>.params.transport`:
|
||||
- `"websocket"`: forza WebSocket
|
||||
- `"auto"`: prova WebSocket, poi passa a SSE
|
||||
|
||||
Per `openai/*` (Responses API), OpenClaw abilita anche per impostazione predefinita il warm-up WebSocket
|
||||
Per `openai/*` (API Responses), OpenClaw abilita anche per impostazione predefinita il warm-up WebSocket
|
||||
(`openaiWsWarmup: true`) quando viene usato il trasporto WebSocket.
|
||||
|
||||
Documentazione OpenAI correlata:
|
||||
|
||||
- [Realtime API with WebSocket](https://platform.openai.com/docs/guides/realtime-websocket)
|
||||
- [Streaming API responses (SSE)](https://platform.openai.com/docs/guides/streaming-responses)
|
||||
- [API Realtime con WebSocket](https://platform.openai.com/docs/guides/realtime-websocket)
|
||||
- [Streaming delle risposte API (SSE)](https://platform.openai.com/docs/guides/streaming-responses)
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -334,7 +335,7 @@ Documentazione OpenAI correlata:
|
||||
|
||||
### Warm-up WebSocket OpenAI
|
||||
|
||||
La documentazione OpenAI descrive il warm-up come facoltativo. OpenClaw lo abilita per impostazione predefinita per
|
||||
La documentazione di OpenAI descrive il warm-up come facoltativo. OpenClaw lo abilita per impostazione predefinita per
|
||||
`openai/*` per ridurre la latenza del primo turno quando si usa il trasporto WebSocket.
|
||||
|
||||
### Disabilitare il warm-up
|
||||
@ -402,28 +403,28 @@ per inoltrare quel campo sugli endpoint nativi OpenAI/Codex Responses.
|
||||
|
||||
I valori supportati sono `auto`, `default`, `flex` e `priority`.
|
||||
|
||||
OpenClaw inoltra `params.serviceTier` sia alle richieste Responses dirette `openai/*`
|
||||
sia alle richieste Codex Responses `openai-codex/*` quando quei modelli puntano
|
||||
OpenClaw inoltra `params.serviceTier` sia alle richieste dirette `openai/*` Responses
|
||||
sia alle richieste `openai-codex/*` Codex Responses quando tali modelli puntano
|
||||
agli endpoint nativi OpenAI/Codex.
|
||||
|
||||
Comportamento importante:
|
||||
|
||||
- `openai/*` diretto deve puntare a `api.openai.com`
|
||||
- `openai-codex/*` deve puntare a `chatgpt.com/backend-api`
|
||||
- se instradi uno dei due provider tramite un'altra base URL o proxy, OpenClaw lascia `service_tier` invariato
|
||||
- se instradi uno dei due provider tramite un altro URL di base o proxy, OpenClaw lascia `service_tier` invariato
|
||||
|
||||
### Modalità veloce OpenAI
|
||||
|
||||
OpenClaw espone un interruttore condiviso di modalità veloce sia per le sessioni `openai/*` sia per quelle
|
||||
`openai-codex/*`:
|
||||
OpenClaw espone un interruttore condiviso della modalità veloce sia per le sessioni `openai/*` sia per
|
||||
quelle `openai-codex/*`:
|
||||
|
||||
- Chat/UI: `/fast status|on|off`
|
||||
- Config: `agents.defaults.models["<provider>/<model>"].params.fastMode`
|
||||
|
||||
Quando la modalità veloce è abilitata, OpenClaw la mappa all'elaborazione prioritaria OpenAI:
|
||||
Quando la modalità veloce è abilitata, OpenClaw la mappa all'elaborazione prioritaria di OpenAI:
|
||||
|
||||
- le chiamate Responses dirette `openai/*` a `api.openai.com` inviano `service_tier = "priority"`
|
||||
- anche le chiamate Responses `openai-codex/*` a `chatgpt.com/backend-api` inviano `service_tier = "priority"`
|
||||
- le chiamate dirette `openai/*` Responses a `api.openai.com` inviano `service_tier = "priority"`
|
||||
- anche le chiamate `openai-codex/*` Responses a `chatgpt.com/backend-api` inviano `service_tier = "priority"`
|
||||
- i valori `service_tier` già presenti nel payload vengono preservati
|
||||
- la modalità veloce non riscrive `reasoning` o `text.verbosity`
|
||||
|
||||
@ -431,7 +432,7 @@ Per GPT 5.4 in particolare, la configurazione più comune è:
|
||||
|
||||
- inviare `/fast on` in una sessione che usa `openai/gpt-5.4` o `openai-codex/gpt-5.4`
|
||||
- oppure impostare `agents.defaults.models["openai/gpt-5.4"].params.fastMode = true`
|
||||
- se usi anche Codex OAuth, imposta anche `agents.defaults.models["openai-codex/gpt-5.4"].params.fastMode = true`
|
||||
- se usi anche l'OAuth Codex, imposta anche `agents.defaults.models["openai-codex/gpt-5.4"].params.fastMode = true`
|
||||
|
||||
Esempio:
|
||||
|
||||
@ -456,48 +457,74 @@ Esempio:
|
||||
}
|
||||
```
|
||||
|
||||
Le sostituzioni di sessione hanno la precedenza sulla configurazione. La cancellazione della sostituzione di sessione nell'interfaccia Sessions UI
|
||||
Le sostituzioni a livello di sessione hanno la precedenza sulla configurazione. La rimozione della sostituzione della sessione nell'interfaccia Sessions UI
|
||||
riporta la sessione al valore predefinito configurato.
|
||||
|
||||
### Route OpenAI native rispetto a route compatibili con OpenAI
|
||||
### Percorsi OpenAI nativi rispetto ai percorsi compatibili con OpenAI
|
||||
|
||||
OpenClaw tratta gli endpoint diretti OpenAI, Codex e Azure OpenAI in modo diverso
|
||||
dai proxy generici compatibili con OpenAI `/v1`:
|
||||
|
||||
- le route native `openai/*`, `openai-codex/*` e Azure OpenAI mantengono
|
||||
intatto `reasoning: { effort: "none" }` quando disabiliti esplicitamente il reasoning
|
||||
- le route native della famiglia OpenAI usano per impostazione predefinita schemi degli strumenti in modalità strict
|
||||
- gli header nascosti di attribuzione OpenClaw (`originator`, `version` e
|
||||
`User-Agent`) vengono allegati solo sugli host nativi OpenAI verificati
|
||||
(`api.openai.com`) e sugli host Codex nativi (`chatgpt.com/backend-api`)
|
||||
- le route native OpenAI/Codex mantengono il request shaping specifico di OpenAI come
|
||||
`service_tier`, `store` di Responses, payload di compatibilità del reasoning OpenAI e
|
||||
suggerimenti per la prompt cache
|
||||
- le route in stile proxy compatibili con OpenAI mantengono il comportamento compatibile più permissivo e non
|
||||
forzano schemi degli strumenti strict, request shaping solo nativo o header nascosti
|
||||
di attribuzione OpenAI/Codex
|
||||
- i percorsi nativi `openai/*`, `openai-codex/*` e Azure OpenAI mantengono
|
||||
`reasoning: { effort: "none" }` intatto quando disabiliti esplicitamente il ragionamento
|
||||
- i percorsi nativi della famiglia OpenAI impostano per default gli schemi degli strumenti in modalità rigorosa
|
||||
- le intestazioni nascoste di attribuzione di OpenClaw (`originator`, `version` e
|
||||
`User-Agent`) vengono allegate solo agli host OpenAI nativi verificati
|
||||
(`api.openai.com`) e agli host Codex nativi (`chatgpt.com/backend-api`)
|
||||
- i percorsi nativi OpenAI/Codex mantengono la formattazione delle richieste specifica di OpenAI, come
|
||||
`service_tier`, `store` di Responses, payload di compatibilità del ragionamento OpenAI e
|
||||
suggerimenti per la cache del prompt
|
||||
- i percorsi compatibili con OpenAI in stile proxy mantengono il comportamento di compatibilità più permissivo e non
|
||||
forzano schemi degli strumenti rigorosi, formattazione delle richieste solo nativa o intestazioni nascoste di attribuzione
|
||||
OpenAI/Codex
|
||||
|
||||
Azure OpenAI resta nel gruppo di routing nativo per il comportamento di trasporto e compatibilità, ma non riceve gli header nascosti di attribuzione OpenAI/Codex.
|
||||
Azure OpenAI resta nel gruppo dei percorsi nativi per il comportamento di trasporto e compatibilità,
|
||||
ma non riceve le intestazioni nascoste di attribuzione OpenAI/Codex.
|
||||
|
||||
Questo preserva l'attuale comportamento nativo di OpenAI Responses senza imporre
|
||||
vecchi shim compatibili con OpenAI ai backend `/v1` di terze parti.
|
||||
Questo preserva l'attuale comportamento nativo di OpenAI Responses senza imporre shim
|
||||
compatibili con OpenAI più vecchi ai backend `/v1` di terze parti.
|
||||
|
||||
### Modalità GPT agentica rigorosa
|
||||
|
||||
Per le esecuzioni GPT-5-family `openai/*` e `openai-codex/*`, OpenClaw può usare un
|
||||
contratto di esecuzione Pi incorporato più rigoroso:
|
||||
|
||||
```json5
|
||||
{
|
||||
agents: {
|
||||
defaults: {
|
||||
embeddedPi: {
|
||||
executionContract: "strict-agentic",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
Con `strict-agentic`, OpenClaw non tratta più un turno dell'assistente che contiene solo un piano come
|
||||
un progresso riuscito quando è disponibile un'azione concreta tramite strumento. Ritenta il
|
||||
turno con un orientamento ad agire subito, abilita automaticamente lo strumento strutturato `update_plan` per
|
||||
lavori sostanziali e mostra uno stato di blocco esplicito se il modello continua
|
||||
a pianificare senza agire.
|
||||
|
||||
La modalità è limitata alle esecuzioni GPT-5-family di OpenAI e OpenAI Codex. Gli altri provider
|
||||
e le famiglie di modelli meno recenti mantengono il comportamento Pi incorporato predefinito, a meno che tu non li abiliti
|
||||
esplicitamente con altre impostazioni di runtime.
|
||||
|
||||
### Compattazione lato server di OpenAI Responses
|
||||
|
||||
Per i modelli diretti OpenAI Responses (`openai/*` che usano `api: "openai-responses"` con
|
||||
`baseUrl` su `api.openai.com`), OpenClaw ora abilita automaticamente i suggerimenti di payload
|
||||
per la compattazione lato server di OpenAI:
|
||||
Per i modelli OpenAI Responses diretti (`openai/*` che usano `api: "openai-responses"` con
|
||||
`baseUrl` su `api.openai.com`), OpenClaw ora abilita automaticamente i suggerimenti di payload per la compattazione lato server di OpenAI:
|
||||
|
||||
- Forza `store: true` (a meno che la compatibilità del modello imposti `supportsStore: false`)
|
||||
- Inietta `context_management: [{ type: "compaction", compact_threshold: ... }]`
|
||||
- Inserisce `context_management: [{ type: "compaction", compact_threshold: ... }]`
|
||||
|
||||
Per impostazione predefinita, `compact_threshold` è `70%` di `contextWindow` del modello (oppure `80000`
|
||||
quando non disponibile).
|
||||
Per impostazione predefinita, `compact_threshold` è il `70%` di `contextWindow` del modello (oppure `80000`
|
||||
se non disponibile).
|
||||
|
||||
### Abilitare esplicitamente la compattazione lato server
|
||||
|
||||
Usa questa opzione quando vuoi forzare l'iniezione di `context_management` su modelli
|
||||
Responses compatibili (ad esempio Azure OpenAI Responses):
|
||||
Usalo quando vuoi forzare l'inserimento di `context_management` su modelli Responses compatibili (ad esempio Azure OpenAI Responses):
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -552,11 +579,11 @@ Responses compatibili (ad esempio Azure OpenAI Responses):
|
||||
}
|
||||
```
|
||||
|
||||
`responsesServerCompaction` controlla solo l'iniezione di `context_management`.
|
||||
I modelli diretti OpenAI Responses continuano a forzare `store: true` a meno che la compatibilità non imposti
|
||||
`responsesServerCompaction` controlla solo l'inserimento di `context_management`.
|
||||
I modelli OpenAI Responses diretti continuano comunque a forzare `store: true` a meno che la compatibilità non imposti
|
||||
`supportsStore: false`.
|
||||
|
||||
## Note
|
||||
|
||||
- I riferimenti ai modelli usano sempre `provider/model` (vedi [/concepts/models](/it/concepts/models)).
|
||||
- I dettagli di autenticazione + le regole di riutilizzo si trovano in [/concepts/oauth](/it/concepts/oauth).
|
||||
- I dettagli di autenticazione e le regole di riutilizzo sono in [/concepts/oauth](/it/concepts/oauth).
|
||||
|
||||
Loading…
Reference in New Issue
Block a user