gateway.yaml. Il file definisce tutto ciò che il gateway fa: dove ascolta, come gli sviluppatori accedono, dove va l’inferenza e quali criteri e telemetria si applicano. Questa pagina è il riferimento per ogni opzione in quel file.
Per scrivere il vostro primo file, iniziate dalla guida rapida, che crea una configurazione minima funzionante e la esegue. Una volta che avete una configurazione con cui siete soddisfatti, la guida alla distribuzione copre la containerizzazione e l’hosting su Kubernetes, Cloud Run o la vostra piattaforma.
Il gateway legge il file una volta, all’avvio, con claude gateway --config /path/to/gateway.yaml. Ogni opzione è convalidata rispetto a uno schema all’avvio, quindi una configurazione malformata non riesce all’inizio con un errore a livello di campo piuttosto che al primo utilizzo.
L’esempio completo alla fine di questa pagina esercita ogni sezione.
Struttura dei file
Cinque sezioni sono obbligatorie. Ogni altra sezione è facoltativa, e una sezione omessa assume i suoi valori predefiniti. Sezioni obbligatorie:listen: indirizzo di binding, URL pubblico, terminazione TLSoidc: il vostro provider di identità (IdP), inclusi emittente, client, mappatura delle attestazioni e chi può accederesession: i bearer token che il gateway emette, con segreto e duratastore: PostgreSQL, per le concessioni dei dispositivi e i contatori dei limiti di velocitàupstreams: dove va l’inferenza, sia che si tratti di Anthropic, Amazon Bedrock, Claude Platform su AWS, Agent Platform di Google Cloud, o Microsoft Foundry
login_notice: un avviso che gli sviluppatori vedono quando accedonoadmin: autenticazione dell’API Admin e conservazione dei limiti di spesaenforcement: comportamento fail-open o fail-closed dei limiti di spesapricing: tariffe contrattuali e un moltiplicatore per il misuratore di spesa e per le cifre di costo che gli sviluppatori vedonomodelseauto_include_builtin_models: elenco di modelli curato dall’amministratore e ID per upstreammanaged: politiche di impostazioni gestite per gruppo IdPtelemetry: inoltro OTLP al vostro stack di osservabilitàaccess_control,limits,timeouts,rate_limits: IP allow/deny, limiti di dimensione delle richieste, tempo di primo byte upstream e limiti di accesso per IPload_test_mode: test di carico del gateway senza chiamare un provider di modelli
Espansione dei segreti
Non scrivete segreti comeclient_secret, jwt_secret o postgres_url direttamente in gateway.yaml. Fate riferimento ad essi con uno dei moduli sottostanti e il gateway risolve il valore all’avvio da una variabile di ambiente o da un file:
Sezioni obbligatorie
listen
Il blocco listen controlla dove il gateway serve: l’indirizzo di binding e la porta, l’origine visibile esternamente e la terminazione TLS facoltativa.
Elenca un frontend in
trusted_proxies solo se l’ultima voce X-Forwarded-For che inoltra è una voce che nessuno sviluppatore ha scritto. Non elencare alcun indirizzo o intervallo da cui si connettono gli sviluppatori. Un frontend che aggiunge l’indirizzo di ogni connessione che riceve è idoneo. Uno che inoltra l’intestazione così come la inviano gli sviluppatori non lo è.
Le voci X-Forwarded-For scritte come ipv4:port o [ipv6]:port, come fanno alcuni load balancer, vengono lette scartando la porta. Un indirizzo IPv6 con una porta aggiunta e senza parentesi quadre può essere letto come un indirizzo diverso o non essere letto affatto. Disattiva l’opzione della porta su qualsiasi proxy che scriva in quella forma.
oidc
Il blocco oidc connette il gateway al tuo provider di identità e decide chi può accedere. Nomina l’emittente e il client OAuth, mappa i claim che portano email e gruppi e limita l’accesso per dominio email o gruppo.
OpenID Connect (OIDC) è il protocollo SSO che il gateway utilizza con il tuo provider di identità; consulta Configurazione del provider di identità per ciò che registrare sul lato IdP.
Autenticazione del client con certificato
Se il tuo provider di identità autentica i client OAuth con un certificato invece che con un client secret, come fa Microsoft Entra con le credenziali basate su certificato, impostatoken_endpoint_auth_method: private_key_jwt. Richiede Claude Code v2.1.284 o successivo sul server del gateway.
Con questa configurazione il gateway non invia alcun segreto. Si autentica presso l’endpoint del token dell’IdP con un JWT a breve durata firmato con la chiave privata del certificato quando uno sviluppatore accede e ogni volta che il gateway aggiorna la sua sessione. Il JWT è firmato con RS256 e identifica il certificato tramite gli header di thumbprint x5t e x5t#S256 anziché tramite un kid. Il tuo IdP deve essere in grado di trovare il certificato registrato tramite thumbprint.
1
Crea la chiave e il certificato
Crea una chiave privata RSA non cifrata di almeno 2048 bit, in formato PEM PKCS#8 o PKCS#1, e un certificato per essa. Il gateway si rifiuta di avviarsi con qualsiasi chiave che non soddisfi queste condizioni. Questo comando Scrive
openssl crea una chiave di questo tipo con un certificato autofirmato valido per un anno:idp-client.key e idp-client.crt nella directory corrente. Copia o monta entrambi i file dove il gateway può leggerli. L’esempio del passaggio 3 usa /etc/gateway/.2
Carica il certificato sull'IdP
Carica il certificato, non la chiave privata, nella registrazione dell’app del gateway presso l’IdP.
3
Aggiungi la chiave e il certificato a gateway.yaml
Fornisci al gateway la chiave privata e il certificato in un blocco Entrambi i valori sono il contenuto PEM, non percorsi di file, quindi carica i file montati con
client_assertion. Ometti client_secret, perché il gateway si rifiuta di avviarsi quando è impostato insieme a private_key_jwt. Questo blocco oidc autentica il gateway presso un tenant Microsoft Entra con un certificato:${file:/path} come fa l’esempio. Il gateway si rifiuta di avviarsi a meno che certificate_pem non sia un singolo certificato PEM, senza il resto della sua catena, la cui chiave pubblica corrisponde a private_key_pem.4
Riavvia il gateway e controlla il log di avvio
Riavvia il gateway e trova questa riga nel log di avvio:Confronta il thumbprint SHA-1 con quello che l’IdP mostra per il certificato che hai caricato. Se il certificato è scaduto o non è ancora valido, il gateway si avvia comunque ma registra un avviso che gli accessi e gli aggiornamenti falliranno finché non lo sostituisci. Per confermare che l’IdP accetta il certificato, fai accedere uno sviluppatore tramite il gateway.
Ruotare il certificato del client
Il gateway legge la chiave e il certificato una sola volta all’avvio, quindi un file modificato ha effetto solo dopo un riavvio. Esegui la rotazione in questo ordine in modo che nessuna richiesta di token presenti un certificato che l’IdP non ha:- Carica il nuovo certificato sull’IdP accanto a quello vecchio.
- Sostituisci i file della chiave e del certificato che
gateway.yamlcarica, quindi riavvia il gateway. Se esegui più repliche, un riavvio progressivo funziona, perché l’IdP ha entrambi i certificati finché non rimuovi quello vecchio. - Dopo che ogni replica si è riavviata, rimuovi il vecchio certificato dall’IdP.
Richieste IdP attraverso un forward proxy
Gli upstream di inferenza rispettanoHTTPS_PROXY e HTTP_PROXY in ogni versione. Le richieste del gateway stesso all’IdP (scoperta, JWKS, token e userinfo) vanno dirette a meno che non imposti oidc.use_proxy: true, che richiede v2.1.227 o successivo. Quando una variabile proxy è impostata, use_proxy non è impostato e l’emittente non è coperto da NO_PROXY, il gateway mantiene quelle richieste dirette e registra un avviso all’avvio chiedendoti di scegliere; use_proxy: false le mantiene dirette e silenzia l’avviso.
Con use_proxy: true, il pod risolve da sé il nome host di ogni endpoint IdP e chiede al proxy di eseguire CONNECT verso l’indirizzo IP risolto, quindi il proxy deve accettare CONNECT verso l’indirizzo IP di ogni host indicato dal documento di scoperta, non solo dell’emittente. Usa un URL proxy http://. ca_cert_pem e la guardia SSRF si applicano anche sul percorso tramite proxy.
L’egress solo tramite proxy cambia entrambi questi aspetti: mentre è attivo, le richieste IdP passano per il proxy a meno che tu non imposti use_proxy: false, e il gateway consegna al proxy ogni nome host IdP senza risolverlo prima.
Egress solo tramite proxy
ImpostaCLAUDE_GATEWAY_PROXY_IS_EGRESS_BOUNDARY=1 nell’ambiente del gateway, accanto a HTTPS_PROXY, quando il pod raggiunge altri host solo attraverso quel forward proxy e non può risolvere da sé i nomi DNS pubblici, o quando il proxy rifiuta CONNECT verso un indirizzo IP. Richiede v2.1.277 o successivo. È una variabile d’ambiente anziché una chiave di gateway.yaml in modo che nulla nel file di configurazione possa allentare il controllo degli indirizzi del gateway.
network: all’avvio mentre l’egress solo tramite proxy è attivo.
Ogni riga di seguito è una classe di richiesta in uscita su un gateway con HTTPS_PROXY impostato, per impostazione predefinita e mentre l’egress solo tramite proxy è attivo.
L’egress solo tramite proxy rimane disattivato a meno che l’ambiente del gateway non soddisfi tutte e tre queste condizioni:
HTTPS_PROXYoHTTP_PROXYè impostato.NO_PROXYeno_proxysono vuoti. Se la tua piattaforma inietta una delle due nei pod, imposta entrambe a un valore vuoto sul container del gateway. Elencare un collettore di telemetria inNO_PROXYmantiene disattivato l’egress solo tramite proxy.CLAUDE_GATEWAY_ALLOW_LOOPBACKnon è attivato. Un collettore o un IdP sul loopback del pod stesso non può essere combinato con l’egress solo tramite proxy, perché un indirizzo loopback consegnato al proxy sarebbe quello dell’host del proxy, quindi assegna invece a quei servizi un indirizzo che il proxy può raggiungere. Per lo stesso motivo il gateway rifiuta del tutto i nomi di tipolocalhostmentre l’egress solo tramite proxy è attivo.
oidc.use_proxy: false.
session
Il blocco session definisce i token bearer che il gateway emette dopo l’accesso: il segreto che li firma e per quanto tempo restano validi.
store
Il blocco store punta il gateway al suo database PostgreSQL, che contiene le concessioni dei dispositivi e i contatori dei rate limit.
Per lo sviluppo locale, punta
postgres_url a un container Postgres usa e getta, ad esempio docker run --rm -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres.
upstreams
upstreams è un elenco ordinato. Il gateway inoltra l’inferenza al primo upstream che risolve il modello richiesto, saltando qualsiasi upstream il cui elenco groups esclude lo sviluppatore.
Su 5xx, 429, 401, 403, 404 o timeout il gateway esegue il failover all’upstream successivo; sugli altri 4xx no, perché questi errori sono attribuibili alla richiesta anziché all’upstream. Un 401 o 403 significa che l’upstream ha rifiutato la credenziale usata dal gateway o gli ha negato l’accesso, ad esempio al modello richiesto. Un 404 significa che quell’upstream non serve il modello richiesto, quindi un upstream successivo nell’elenco può ancora servirlo.
Se imposti forward_user_identity: true su un upstream, un 429 che questo restituisce a una richiesta che portava l’email dello sviluppatore non esegue il failover. Consulta come un rifiuto per limite per utente raggiunge lo sviluppatore.
Il failover su 404 richiede il gateway v2.1.198 o successivo. Le versioni precedenti restituivano il primo 404 al client anche quando un upstream successivo nell’elenco serviva il modello.
Più upstream dello stesso provider devono impostare un name: distinto.
I client Amazon Bedrock, Claude Platform on AWS, Agent Platform di Google Cloud e Microsoft Foundry vengono creati una volta all’avvio e i loro SDK aggiornano le credenziali internamente, quindi la rotazione delle credenziali cloud non richiede un riavvio. Le chiavi API Anthropic statiche e i bearer vengono letti all’avvio; consulta API Anthropic.
Messaggi di errore dell’upstream
Il gateway restituisce la risposta di errore di un upstream o il proprio502, a seconda di come hanno risposto gli upstream:
- Un upstream ha restituito uno stato su cui il gateway non esegue il failover: la risposta di quell’upstream. Il gateway non prova altri upstream.
- Ogni upstream provato dal gateway ha fallito in un modo su cui esegue il failover: l’ultimo
429. Quando nessuno ha restituito un429, il gateway preferisce, in ordine, l’ultimo401o403, l’ultimo404e l’ultimo501. Quando nessuno ha restituito nessuno di questi, il502del gateway stesso,all upstreams failed (N attempted). N conta le tue vociupstreams, incluse quelle saltate, meno quelle il cui elencogroupsesclude lo sviluppatore.
400o413nell’envelope di errore standard di Anthropic: il messaggio dell’upstream stesso, comeprompt is too long. Claude Platform on AWS, Agent Platform e Microsoft Foundry restituiscono questo envelope per i rifiuti dell’API del modello.400o413nel formato proprio del provider: un tokencapability_rejected:. Quando il gateway non riesce a classificare il rifiuto,upstream rejected the requestsu un400orequest too large for this upstreamsu un413.- Qualsiasi altro stato: un testo generico per stato, come
upstream rate limit exceededsu un429.
Input is too long for requested model. di Amazon Bedrock con capability_rejected: prompt_too_long. Claude Code compatta automaticamente su quel token, come fa su prompt is too long.
Mantenere il messaggio 400 o 413 di un upstream cloud, o sostituirlo con un token capability_rejected:, richiede il gateway v2.1.233 o successivo.
API Anthropic
L’upstream Anthropic minimo è una chiave API dalla Claude Console:api_key: inviax-api-key. Ruotala nella Claude Console e aggiorna la variabile d’ambiente.oauth_token: inviaAuthorization: Bearer. Usa la forma bearer quando la tua organizzazione emette token a breve durata invece di chiavi API a lunga durata. Il bearer viene letto una volta all’avvio, quindi aggiornalo rimontando il segreto e riavviando.
Header di identità per utente per un proxy che gestisci
Puoi puntare ilbase_url di un upstream provider: anthropic a un proxy che gestisci invece che all’API Anthropic. Per indicare a quel proxy quale sviluppatore ha inviato ogni richiesta, imposta forward_user_identity: true su quell’upstream. Il proxy può quindi attribuire la spesa per sviluppatore. Richiede un gateway che esegue Claude Code v2.1.233 o successivo.
Ad esempio, per un proxy su upstream-gateway.internal.example.com:
Quando il token IdP non contiene un’email, il gateway invia solo
x-claude-gateway-user-id e omette i due header email. Se il tuo IdP inserisce l’email in un claim diverso, imposta oidc.email_claim su quel claim.
Il tuo proxy non riceve gli header x-claude-code-* che Claude Code invia, come x-claude-code-session-id. Il gateway non li passa a nessun upstream, quindi raggruppa le richieste per sviluppatore con gli header della tabella sopra.
Quando il tuo proxy risponde 429 a una richiesta che portava l’email dello sviluppatore, il gateway restituisce quella risposta allo sviluppatore così com’è invece di eseguire il failover all’upstream successivo, in modo che il budget per utente o il rate limit del tuo proxy vengano rispettati. Le altre risposte del proxy seguono le normali regole di failover. Se il token IdP di uno sviluppatore non contiene un’email, il gateway inoltra le sue richieste senza gli header email, quindi un 429 a una di quelle richieste conta come capacità dell’upstream ed esegue il failover. Prima della v2.1.267 sul server del gateway, ogni 429 eseguiva il failover.
Imposta forward_user_identity solo su un upstream il cui base_url è un proxy che gestisci. Il gateway invia le email degli sviluppatori a qualunque server indicato da quel base_url. Se il base_url è l’API Anthropic, che è il valore predefinito, il gateway si rifiuta di avviarsi.
Se imposti
forward_user_identity su un upstream Amazon Bedrock, il gateway termina all’avvio con Unrecognized key(s) in object: 'forward_user_identity'. Se il tuo proxy si trova davanti a Bedrock, elencalo invece come upstream provider: anthropic. Il gateway invia a quell’upstream il formato Anthropic Messages, quindi il tuo proxy deve tradurre le richieste per Bedrock. Per identificare invece ogni sviluppatore presso AWS, consulta Attribuzione dei costi AWS per sviluppatore.Amazon Bedrock
Per la distribuzione di Amazon Bedrock lato client che il gateway sostituisce o a cui fa da front-end, consulta Claude Code su Amazon Bedrock. L’upstream lato gateway:auth vuoto usa la catena di credenziali predefinita dell’AWS SDK: variabili d’ambiente, ~/.aws/credentials, ruolo di attività ECS, metadati dell’istanza EC2 o IRSA su EKS. In produzione, assegna al pod del gateway un ruolo IAM invece di incorporare chiavi statiche in un’immagine del container.
Le credenziali esplicite devono essere complete: il gateway fallisce all’avvio quando aws_access_key_id e aws_secret_access_key non sono impostati insieme, o quando aws_session_token è impostato senza di loro. Prima della v2.1.207, un blocco auth: parziale superava la convalida.
Applicare un guardrail di Amazon Bedrock
Per applicare un guardrail di Amazon Bedrock a ogni richiesta di inferenza che il gateway invia tramite un upstream Bedrock, aggiungi un bloccoguardrail a quell’upstream. Richiede Claude Code v2.1.281 o successivo sul server del gateway.
bedrock:ApplyGuardrail sul guardrail al principal che firma le richieste di questo upstream: il principal AWS del gateway oppure, con assume_role, il ruolo indicato in role_arn.
Imposta guardrail su ogni upstream bedrock o su nessuno. Il gateway si rifiuta di avviarsi con una configurazione mista, perché altrimenti il failover potrebbe inviare una richiesta a un upstream Bedrock privo di guardrail.
Il guardrail copre solo gli upstream Bedrock. Se elenchi un altro provider in upstreams, il gateway invia le richieste a quel provider senza il guardrail, oppure si rifiuta di avviarsi se quel provider è mantle.
Quando una richiesta /v1/messages il cui corpo contiene un campo amazon-bedrock-*, come amazon-bedrock-guardrailConfig, raggiunge un upstream Bedrock con guardrail impostato, il gateway risponde 400 invece di inoltrarla.
Aggiungi i tag di input del guardrail
Per fare in modo che il gateway aggiunga i tag di input di cui ha bisogno il filtro prompt attacks di un guardrail di Amazon Bedrock, impostainput_tagging nel blocco guardrail e riavvia il gateway. Imposta lo stesso valore su ogni upstream bedrock, altrimenti il gateway si rifiuta di avviarsi. Richiede Claude Code v2.1.316 o successivo sul server del gateway. Un gateway su una versione priva della chiave termina all’avvio con Unrecognized key(s) in object: 'input_tagging'.
input_tagging accetta uno di questi valori:
Con
last_message, se i messaggi user successivi all’ultima risposta di Claude non contengono testo a cui applicare i tag, il gateway applica invece i tag ai messaggi di sistema a metà conversazione successivi a quella risposta. Una chiamata a uno strumento conta come risposta.
Le indicazioni di Amazon Bedrock per il filtro prompt attacks consistono nell’applicare i tag all’input dell’utente in modo da escludere il prompt di sistema. Se imposti all_messages_and_system, un filtro che segnala il prompt di sistema di Claude Code stesso può bloccare le richieste.
L’esempio seguente applica i tag al testo in ogni messaggio user:
user possono contenere anche testo aggiunto da Claude Code, come i promemoria di sistema, quindi verifica sul gateway di test che le richieste ordinarie non vengano bloccate.
Nei test di Anthropic, una sessione con tag ha mantenuto le letture dalla prompt cache da un prompt all’altro, e i tag non hanno aggiunto token di input.
Cosa non coprono i tag di input
Nessun valore diinput_tagging ferma uno sviluppatore che inserisce deliberatamente del testo dove non va alcun tag. Non fare affidamento sul guardrail per valutare queste parti di una richiesta:
- Contenuto a cui il gateway non applica tag: i messaggi che il tuo valore di
input_taggingesclude, le definizioni degli strumenti, gli input delle chiamate agli strumenti, le immagini e i PDF, tra gli altri. A meno che tu non impostiall_messages_and_system, anche il prompt di sistema è privo di tag. - Risultati degli strumenti: contengono ciò che restituiscono gli strumenti di Claude, come i contenuti dei file e le pagine web. Nei test di Anthropic, un filtro di parole non li ha valutati, con o senza tag.
Registrare quale filtro del guardrail è scattato
Per scoprire quale filtro del guardrail di Amazon Bedrock ha bloccato la richiesta di uno sviluppatore, impostaguardrail_trace: true sull’upstream Bedrock, riavvia il gateway e chiedi allo sviluppatore di inviare di nuovo la richiesta. Poi trova l’evento guardrail.trace della richiesta nel log di audit. Richiede Claude Code v2.1.314 o successiva sul server del gateway. Un gateway precedente si rifiuta di avviarsi quando trova guardrail_trace.
guardrail.trace, senza il testo corrispondente, quando un filtro è scattato o l’azione del guardrail è INTERVENED. Trova gli eventi dello sviluppatore tramite email o sub. Una singola richiesta in streaming può produrre più eventi, e uno di essi può avere un elenco filters vuoto, quindi leggi ogni evento che ha lo stesso request_id:
L’evento omette il testo corrispondente a un filtro, incluso il campo
match della trace di Bedrock. Gli sviluppatori non ricevono i dati di trace di Bedrock, perché il gateway li rimuove da ogni risposta, in streaming o no.
Se un client invia un campo amazon-bedrock-* nel corpo di una richiesta /v1/messages, il gateway risponde 400 su un upstream che imposta guardrail_trace.
Bedrock in un altro account AWS
Impostaassume_role su un upstream Bedrock e il gateway userà la propria identità AWS solo per chiamare sts:AssumeRole su un ruolo che indichi, che può trovarsi in un account AWS diverso da quello del gateway. Ogni richiesta Bedrock da quell’upstream viene firmata con le credenziali di un’ora restituite da STS, quindi nessuna chiave di accesso a lunga durata attraversa gli account.
Richiede un gateway che esegue Claude Code v2.1.281 o successivo. Un gateway precedente si rifiuta di avviarsi quando trova la chiave.
assume_role accetta tre chiavi:
La trust policy del ruolo indica il principal del gateway stesso, come il suo ruolo IRSA o il ruolo di attività ECS. Quel principal ha bisogno di
sts:AssumeRole sul ruolo e di nessun permesso Bedrock proprio. Elimina la Condition se non imposti external_id.
- Se STS rifiuta o non è raggiungibile, il gateway non invia la richiesta con le credenziali proprie dell’upstream. Registra l’errore STS con ciò che occorre verificare, quindi prova l’upstream successivo che hai elencato. Messaggi di errore dell’upstream descrive ciò che riceve il client quando nessun upstream ha successo. Un upstream successivo senza
assume_roleservirebbe la richiesta con le proprie credenziali, quindi elencane uno solo se è ciò che desideri. - Il gateway chiama l’endpoint STS regionale
sts.<region>.amazonaws.com, che la sua rete deve poter raggiungere. Per l’endpoint FIPS, impostaAWS_USE_FIPS_ENDPOINT=truenell’ambiente del gateway anzichéuse_fips_endpointin un file di configurazione AWS. assume_rolerichiede credenziali di origine SigV4: il gateway si rifiuta di avviarsi quando è impostato accanto aaws_bearer_token.- Senza un elenco
groups, ogni sviluppatore ammesso dal gateway può usare questo upstream. Per limitare i modelli che uno sviluppatore può usare, impostaavailableModelsin una policymanaged. - Per evitare che un modello servito tramite il ruolo venga servito anche da un altro account, assegnagli un id personalizzato la cui mappa
upstream_modelcontenga solo il nome di questo upstream. Per un id di questo tipo il gateway salta ogni altro upstream, quindi né la richiesta né il conteggio dei token per una richiesta interrotta possono eseguire il failover su un altro account. - Una richiesta per un nome di modello integrato può comunque raggiungere questo upstream, e il gateway la firma con lo stesso ruolo. Elenca questo upstream per ultimo a meno che il suo account non debba servire anche quei modelli.
Attribuzione dei costi AWS per sviluppatore
Per impostazione predefinita il gateway firma ogni richiesta Bedrock con un’unica credenziale, quindi AWS vede le richieste di tutti gli sviluppatori sotto un unico principal IAM. Aggiungisession_name: email ad assume_role e il gateway chiamerà sts:AssumeRole una volta per sviluppatore ogni ora, con il nome della sessione impostato sull’email di quello sviluppatore, e firmerà le sue richieste con le credenziali restituite, in modo che le richieste di ogni sviluppatore raggiungano AWS sotto la propria sessione di ruolo assunto. Il ruolo può trovarsi nell’account stesso del gateway.
Richiede un gateway che esegue Claude Code v2.1.281 o successivo. Attribuzione dei costi su AWS descrive il ruolo IAM e dove la fatturazione AWS mostra le sessioni.
Per l’attribuzione per sviluppatore, imposta
assume_role con session_name su ogni upstream bedrock e mantle tranne quelli che usano aws_bearer_token. Questi non possono accettare assume_role, quindi le loro richieste restano sotto un unico principal.session_name seleziona quale claim verificato diventa il RoleSessionName di AWS: email o sub. Il gateway scrive qualsiasi carattere diverso da lettere ASCII, cifre e _+,.@- come =XX esadecimale per ogni byte UTF-8, e abbrevia un risultato più lungo di 64 caratteri in un prefisso più un hash, in modo che il nome della sessione di ogni sviluppatore rimanga valido e univoco. Una richiesta da uno sviluppatore il cui token non contiene il claim non viene inviata tramite questo upstream, e il log operativo indica di passare a sub o di impostare oidc.email_claim.
Uno sviluppatore attivo costa una chiamata STS all’ora per replica del gateway, e le prime richieste simultanee condividono un’unica chiamata.
Il gateway effettua anche una chiamata propria su questo ruolo: il conteggio dei token per una richiesta abbandonata dal client, in modo che i limiti di spesa rimangano accurati. Quel conteggio e la relativa richiesta di fallback da un token sono firmati dalla sessione condivisa claude-apps-gateway, quindi AWS attribuisce il fallback a claude-apps-gateway anziché allo sviluppatore.
Endpoint Mantle di Amazon Bedrock
Il providermantle invia l’inferenza all’endpoint Mantle di Amazon Bedrock. Richiede Claude Code v2.1.283 o successivo sul server del gateway. Le versioni precedenti del gateway lo rifiutano all’avvio, quindi aggiorna ogni replica prima di aggiungerlo.
L’esempio seguente mette Mantle per primo, con dietro un upstream Amazon Bedrock per servire ogni modello che il campo models esclude:
mantle.
Concedi all’identità AWS dell’upstream le azioni IAM proprie di Mantle per l’inferenza e il conteggio dei token, elencate in Usare l’endpoint Mantle.
Per un ID modello Mantle che il gateway non conosce, aggiungi una voce al blocco
models: di primo livello la cui upstream_model mappa il nome di questo upstream a quell’ID. Poi inserisci l’id di quella voce anche nel campo models di questo upstream.
Le impostazioni guardrail e assume_role di un upstream bedrock non si estendono alle richieste servite da Mantle:
guardrail: il gateway non applica alcun guardrail Bedrock alle richieste che invia a Mantle, quindi si rifiuta di avviarsi quando è elencato un upstreammantlementre un qualsiasi upstreambedrockimpostaguardrail.assume_role: impostalo sull’upstreammantlestesso. Senza di esso, le richieste servite da Mantle vengono inviate con le credenzialiauthproprie dell’upstreammantle.
Claude Platform on AWS
Claude Platform on AWS serve l’API Anthropic di prima parte su infrastruttura AWS all’indirizzoaws-external-anthropic.<region>.api.aws. Utilizza ID modello di prima parte, rispetta gli header anthropic-beta così come inviati e serve count_tokens, quindi non si applica nessuna delle traduzioni specifiche di Bedrock. Il provider anthropicAws richiede Claude Code v2.1.198 o successivo; le versioni precedenti del gateway lo rifiutano all’avvio.
Per la distribuzione lato client della stessa piattaforma, consulta Claude Code su Claude Platform on AWS. L’upstream lato gateway:
aws-external-anthropic, quindi un ruolo IAM limitato a Bedrock non la autorizza. Una chiave API in auth.api_key ha la precedenza quando sono impostate anche le credenziali SigV4. Un blocco auth vuoto usa la catena di credenziali predefinita dell’AWS SDK, la stessa catena usata dall’upstream Amazon Bedrock.
Poiché la piattaforma risolve ID modello di prima parte, il catalogo integrato la instrada senza un blocco
models:. Quando curi un elenco models:, usa come chiave della voce anthropicAws: con l’ID di prima parte.
Google Cloud Agent Platform
Per la configurazione equivalente lato client, consulta Claude Code su Google Cloud. L’upstream lato gateway:auth vuoto usa le Application Default Credentials: GOOGLE_APPLICATION_CREDENTIALS, metadati GCE o GKE Workload Identity. I file di chiave JSON dell’account di servizio sono supportati ma sconsigliati; usa Workload Identity o associa un account di servizio all’istanza GCE o Cloud Run.
Imposta region: global per usare l’endpoint globale di Agent Platform di Google Cloud invece di uno regionale. Google instrada quindi ogni richiesta a una regione disponibile, così non devi tenere traccia della disponibilità dei modelli per regione. Impostare una regione specifica vincola ogni richiesta a quella regione.
Microsoft Foundry
Per la distribuzione di Microsoft Foundry lato client, consulta Claude Code su Microsoft Foundry. L’upstream lato gateway:use_azure_ad: true si risolve tramite DefaultAzureCredential: Managed Identity su AKS, ACI o App Service; la Azure CLI; o le credenziali d’ambiente. Le chiavi API funzionano ma valgono per l’intero progetto e non ruotano automaticamente. L’endpoint di Microsoft Foundry è derivato da resource:; imposta il base_url facoltativo per sovrascriverlo per cloud sovrani come Azure Government.
Header statici sulle richieste upstream
Per aggiungere header fissi alle richieste che il gateway invia a un upstream, impostaheaders: su quell’upstream. Usalo quando un proxy che gestisci davanti al provider instrada o attribuisce il traffico in base a un header.
headers: richiede Claude Code v2.1.277 o successivo sul server del gateway. Un gateway precedente si rifiuta di avviarsi quando trova la chiave. Aggiorna ogni replica prima di aggiungere la chiave e rimuovi la chiave prima di eseguire il rollback a una versione precedente.
Gli header vanno al server indicato da base_url, o all’endpoint proprio del provider quando base_url non è impostato. Anche il provider li riceve, a meno che il tuo proxy non li rimuova.
Questo esempio raggiunge un upstream provider: vertex attraverso un proxy su upstream-proxy.internal.example.com. Imposta l’header x-source letto dal proxy e invia un token dalla variabile d’ambiente PROXY_TOKEN come x-proxy-token:
true o false in modo che YAML lo legga come testo.
Per tenere un segreto fuori dal file di configurazione, usa l’espansione dei segreti per caricare il valore da una variabile d’ambiente con ${VAR} o da un file con ${file:/path}. Un ${VAR} che si risolve in un valore vuoto impedisce l’avvio del gateway.
headers: funziona su ogni provider e ogni upstream invia solo i propri.
Non tutte le richieste che il gateway invia a un upstream li includono:
Su un upstream Amazon Bedrock o Claude Platform on AWS che firma le richieste con AWS SigV4, questi header fanno parte della firma, quindi il tuo proxy deve inoltrarli invariati.
Se usi un nome riservato dal gateway, questo si rifiuta di avviarsi e l’errore di avvio indica l’header. I nomi riservati includono:
authorizationex-api-keyhost,content-typeeuser-agent- Qualsiasi nome che inizia con
anthropic-,x-goog-,x-amz-ox-amzn-
Più upstream
Lo stesso provider può comparire più di una volta con unname: distinto. Questo copre regioni diverse, account diversi tramite catene di credenziali diverse, throughput provisioned rispetto a on-demand e fallback tra provider.
Il gateway prova gli upstream in ordine. 5xx, 429, 401, 403, 404, timeout ed endpoint mancante (501) eseguono il failover; gli altri 4xx no.
429 indica la capacità del singolo upstream, quindi l’esaurimento del throughput provisioned (PT) esegue il failover su on-demand. Se imposti forward_user_identity: true su un upstream, un 429 a una richiesta che portava l’email dello sviluppatore è invece un rifiuto per utente e non esegue il failover.
Una richiesta supera un upstream solo in questi casi:
- L’upstream ha restituito un errore
- L’upstream non serve il modello richiesto
- L’upstream ha un elenco
groupsche esclude lo sviluppatore
- Upstream
provider: anthropic:timeouts.upstream_ttfb_ms, 120 secondi per impostazione predefinita - Altri provider: fino a un’ora. Per abbreviare questa attesa per le richieste in streaming, imposta
timeouts.upstream_ttfb_mssul gateway v2.1.295 o successivo. Le richieste al modello non in streaming attendono comunque fino a un’ora
404 indica la disponibilità del modello sul singolo upstream, quindi un upstream che non ha abilitato un modello non blocca un upstream successivo che lo serve. Un upstream che non può risolvere il modello richiesto viene saltato senza un round-trip di rete.
Questo esempio instrada prima un’allocazione di throughput provisioned di Amazon Bedrock, passa in overflow a on-demand e a un secondo account e usa l’API Anthropic come ultimo fallback:
Il failover tra provider cloud, o verso l’API Anthropic diretta, cambia quale accordo, area geografica e altri termini regolano la richiesta.
La CLI applica lo stesso feature gating ai gateway indipendentemente da quale upstream serve una data richiesta, quindi per impostazione predefinita il failover non invia un campo del corpo che un upstream rifiuterebbe. Se imposti il TTL della cache di un’ora in una policy, questo viene inviato a ogni upstream dell’elenco, quindi impostalo solo se tutti lo accettano.
Invia ogni team al proprio upstream
Per inviare le richieste di ogni team al proprio account AWS o progetto Google Cloud, elenca un upstream per team e assegna a ciascuno un elencogroups. Solo gli sviluppatori in un gruppo IdP elencato raggiungono quell’upstream, al primo tentativo e in failover. Ogni provider accetta groups. Richiede Claude Code v2.1.314 o successivo sul server del gateway.
Questo esempio assegna un account AWS ciascuno ai gruppi payments-eng e search-eng, e aggiunge un upstream senza elenco groups che ogni sviluppatore può usare:
Quando l’upstream di un team nega il modello richiesto con un
403, il gateway prova il successivo upstream nella riga di quel team che serve il modello. Per mantenere il team su un solo upstream, assegna a ogni upstream un elenco groups e assicurati che nessun altro upstream elenchi un gruppo a cui appartengono gli sviluppatori del team. Quel team non ha quindi failover, e le richieste degli sviluppatori che non appartengono a nessun gruppo elencato falliscono con un 400.
Per far arrivare ogni sviluppatore all’upstream previsto, scrivi voci che corrispondano esattamente e metti per ultimi gli upstream aperti:
- Voci: scrivi ogni gruppo esattamente come lo invia il tuo IdP nel claim dei gruppi, che legge anche
match.groups. Il gateway si rifiuta di avviarsi quando trova un elenco vuoto o una voce vuota. Non verifica una voce rispetto al tuo IdP, quindi una voce che non corrisponde a nessuno non genera alcun avviso. - Ordine: metti per ultimo un upstream che non ha un elenco
groups. Serve tutti, quindi se elencato prima prende le richieste di un team prima dell’upstream di quel team.
Cosa succede quando uno sviluppatore non appartiene a nessun gruppo elencato
Se ogni upstream ha un elencogroups, uno sviluppatore che non appartiene a nessuno di quei gruppi vede questo errore, e il gateway non contatta alcun provider:
groups.
Il gateway rilegge i gruppi di uno sviluppatore a ogni aggiornamento del token. Se il tuo IdP omette i gruppi in un aggiornamento, lo sviluppatore non ne ha più nessuno:
oidc.allowed_groupsè impostato: il gateway rifiuta l’aggiornamento e la sessione termina- Altrimenti, un upstream non ha un elenco
groups: le richieste dello sviluppatore passano a quell’upstream - Altrimenti, ogni upstream ha un elenco
groups: le richieste dello sviluppatore falliscono con quell’errore
oidc.google_groups non è impostato, imposta oidc.userinfo_fallback su true per ricavare i gruppi da lì.
Sezioni facoltative
login_notice
Per mostrare agli sviluppatori un avviso quando accedono, imposta la chiave di primo livello login_notice sul testo dell’avviso, fino a 500 caratteri. Questo esempio indica a chi è destinato il gateway e dove chiedere l’accesso:
Notice from <gateway hostname> nella pagina di verifica del gateway nel browser e nella schermata di accesso interattiva nel terminale. Le interruzioni di riga nel testo diventano spazi. L’avviso compare prima dell’accesso, quindi chiunque possa raggiungere il gateway può leggerlo.
Richiede Claude Code v2.1.319 o successiva sul server del gateway e anche sul computer dello sviluppatore per la schermata del terminale. Un gateway precedente si rifiuta di avviarsi quando trova la chiave. Aggiorna ogni replica prima di aggiungere la chiave e rimuovi la chiave prima di tornare a una versione precedente.
admin
Facoltativo. Abilita /v1/organizations/spend_limits, che rispecchia l’API Admin pubblica di Anthropic, e l’applicazione di limiti di spesa per sviluppatore su /v1/messages. Vedi Limiti di spesa per come vengono impostati e applicati i cap; questa sezione copre le chiavi gateway.yaml che attivano la funzione e la regolano.
Ordine dei budget condivisi
Un budget condiviso è un unico limite mensile su cui spende un intero gruppo. Per impostarne uno, aggiungipooled_budget alla richiesta che imposta il limite mensile del gruppo, come in "pooled_budget": {"amount": "500000"} per $5.000. La richiesta accetta anche lo scope del gruppo, "period": "monthly" e amount, che resta il limite personale di ogni membro.
Per uno sviluppatore che fa parte di più gruppi di questo tipo, ogni richiesta viene conteggiata sul primo budget la cui spesa è inferiore al limite e viene rifiutata quando tutti i budget sono esauriti. pooled_conflict_rule imposta l’ordine in cui il gateway prova i budget:
default_order: prima il limite più alto e, a parità di limite, in ordine crescente di nome del gruppopriority_list: i budget dei gruppi inpooled_priority_order, nell’ordine dell’elenco, poi i budget degli altri gruppi per nome del gruppo
pooled_conflict_rule: priority_list, il gateway ignora l’elenco e registra un avviso all’avvio.
Un server del gateway precedente alla v2.1.319 si rifiuta di avviarsi quando trova pooled_conflict_rule o pooled_priority_order. Aggiorna ogni replica prima di aggiungere una delle due chiavi e rimuovile entrambe prima di tornare a una versione precedente.
enforcement
Il blocco enforcement controlla il comportamento dei controlli dei limiti di spesa quando l’archivio non è disponibile.
pricing
Il blocco pricing dice al misuratore di spesa cosa addebitare invece del prezzo di listino USD, in modo che i cap e /effective riflettano le tue tariffe contrattuali. Gli importi rimangono in USD e rimangono una stima, non una fattura. Due prerequisiti:
- Claude Code v2.1.227 o successivo sul server del gateway. Le versioni precedenti rifiutano la chiave sconosciuta all’avvio.
- Un blocco
admin:o, in v2.1.268 o successivo, un bloccomanaged:con almeno una policy. Il gateway rifiuta di avviarsi conpricingimpostato e nessuno dei due blocchi, perché nulla lo leggerebbe.
Come il misuratore abbina una riga di override:
- Una riga sostituisce il prezzo di listino per le richieste che
upstream, unupstreams[].name, serve permodel. Questo include la tariffa più alta della modalità veloce, quindi le richieste veloci e standard vengono misurate alle stesse quattro tariffe. - Un ID incorporato come
claude-sonnet-4-6, abbinato comemodels[].id, copre ogni forma datata, forma regionale di Amazon Bedrock o forma di Agent Platform di Google Cloud che il misuratore prezza come quel modello. Qualsiasi altra stringa, come un alias o un ARN del profilo di inferenza, corrisponde all’ID che il client ha inviato o alla stringa inviata upstream, senza distinzione tra maiuscole e minuscole. - Dove le righe si sovrappongono, il misuratore sceglie la riga più specifica piuttosto che la prima riga: una riga il cui
modelè la stringa di modello esatta inviata upstream, quindi una riga che corrisponde all’ID esatto che il client ha inviato, quindi una riga che nomina il modello incorporato. - Un nome upstream sconosciuto fa fallire l’avvio, così come due righe per uno stesso upstream che nominano lo stesso modello, incluse due grafie di un modello incorporato. Il gateway avverte all’avvio di una riga che nessun modello richiedibile può utilizzare.
- Le richieste di ricerca web rimangono al prezzo di listino di $0.01; il moltiplicatore si applica comunque a loro.
Aumenta i prezzi
Con v2.1.271 o successivo sul server del gateway, puoi impostaremultiplier sopra 1, fino a 10, per misurare più di quanto il provider addebita, ad esempio una tariffa di chargeback interna. Questo esempio misura ogni richiesta al 120% del prezzo:
admin:, il markup si applica anche ai limiti di spesa. Il misuratore conta il 120% del prezzo, quindi gli sviluppatori raggiungono i loro cap più velocemente. Il gateway registra un avviso all’avvio che lo segnala.
Il moltiplicatore non cambia quello che il provider upstream addebita per le richieste.
Se il gateway inoltre invia le tariffe ai client che hanno effettuato l’accesso, gli sviluppatori hanno bisogno di Claude Code v2.1.271 o successivo per vedere il markup. I client precedenti ignorano un multiplier superiore a 1 e mostrano i costi senza di esso.
Un server gateway precedente a v2.1.271 rifiuta di avviarsi se imposti un multiplier superiore a 1.
Invia le tariffe ai client che hanno effettuato l’accesso
Con la v2.1.268 o versioni successive sul server del gateway, il gateway inserisce anche le tariffe dipricing nelle policy managed che serve, come impostazione gestita modelPricing.
Gli sviluppatori a cui corrisponde una policy vedono quindi le tariffe di pricing in /usage, nella riga di stato e in OpenTelemetry. Uno sviluppatore a cui non corrisponde alcuna policy non riceve impostazioni gestite, quindi i suoi valori restano al prezzo di listino. I client applicano l’impostazione in Claude Code v2.1.242 o versioni successive.
- Cosa aggiunge il gateway: a meno che il blocco
clidi una policy non imposti giàmodelPricing, il gateway aggiunge ilmultipliere, per ogni ID modello che un client può richiedere, la riga di override del primo upstream che serve quell’ID. Una tariffa che solo un upstream di failover addebita rimane sul gateway. - Upstream con un elenco
groups: quando uno di questi è il primo upstream che serve un ID di modello, il gateway non aggiunge alcuna riga per quell’ID. Gli sviluppatori vedono quindi la tariffa di Claude Code per quell’ID, ovvero la tariffa standard del modello quando Claude Code riconosce l’ID, moltiplicata per ilmultiplier. - Escludi una policy: imposta
modelPricinga{}nel bloccoclidi quella policy, e i suoi sviluppatori rimangono al prezzo di listino. - Mantieni le tariffe proprie di una policy: una policy il cui blocco
cliimpostamodelPricingcon il suomultiplierooverridesmantiene quelmodelPricingintero, e il gateway non vi aggiunge tariffe proprie.
models
Il blocco models è un elenco di modelli facoltativo curato dall’amministratore, servito su /v1/models e utilizzato per tradurre gli ID modello per upstream. È obbligatorio per le regioni non statunitensi di Amazon Bedrock, gli ARN di throughput con provisioning di Amazon Bedrock e i nomi di deploy di Microsoft Foundry.
upstream_model deve corrispondere al name di un upstream configurato, che per impostazione predefinita è il nome del provider. Una chiave che non corrisponde a nessun upstream fa fallire l’avvio, quindi ometti le righe per i provider che non usi.
Per consentire agli sviluppatori di usare l’alias fable con auto_include_builtin_models: false, aggiungi una voce claude-fable-5 a models. È l’ID in cui l’alias fable si risolve per gli sviluppatori che hanno effettuato l’accesso al gateway. Senza di essa, i loro messaggi falliscono con un errore che inizia con API Error: 400 model claude-fable-5 is not in the operator's model allowlist.
managed
Il blocco managed definisce policy di accesso basate sui ruoli, indicizzate per gruppi dell’IdP o dominio email. Le policy vengono valutate in ordine; per impostazione predefinita viene selezionata la prima corrispondenza, su cui poi viene fatto il merge con la base catch-all match: {}. Un utente che corrisponde a due policy di ruolo riceve solo la prima, quindi le regole di negazione della seconda policy non si applicano a meno che tu non applichi ogni policy corrispondente. Le policy vengono servite per utente su GET /managed/settings con caching ETag/304.
match: {}, convenzionalmente elencato per ultimo, viene trattato come un livello base. Ogni altra policy eredita dal catch-all qualsiasi chiave che non imposta, quindi le voci per ruolo devono solo elencare ciò che differisce dal valore predefinito dell’organizzazione. Le regole di merge dipendono dal tipo di chiave:
- Allowlist:
availableModelsepermissions.allow. L’elenco di una policy specifica sostituisce completamente quello della base. - Elenchi di negazione e array di hook: questi prendono l’unione di base e policy:
permissions.denyepermissions.askdisabledMcpjsonServersedeniedMcpServersblockedMarketplacesedeniedModels- Gli array per tipo di evento di
hooks
- Chiavi di tipo record:
env,modelOverrideseskillOverrides. Per queste si esegue un merge superficiale, quindi un bloccoenvper ruolo sovrascrive le chiavi che imposta ed eredita il resto dalla base.
availableModels viene anche applicato lato server su /v1/messages, quindi un modello negato restituisce 400 indipendentemente da quello che il client invia. Un elenco vuoto nega ogni modello. Il controllo copre anche il modello su cui si avvia una sessione prima che lo sviluppatore ne scelga uno, quindi avvia le sessioni su un modello consentito dalla policy.
Il gateway convalida il valore model stesso prima di inoltrare una richiesta, quindi un valore malformato non raggiunge mai un upstream. Rifiuta la richiesta con un 400 in due casi:
- Quando il valore è mancante o vuoto, il gateway rifiuta la richiesta con il messaggio
model is required. Questo controllo richiede un gateway che esegue Claude Code v2.1.228 o successivo. - Quando il valore è presente ma non è una stringa, il gateway rifiuta la richiesta con il messaggio
model must be a string. Richiede un gateway che esegue Claude Code v2.1.221 o successivo.
Un utente autenticato che non corrisponde a nessuna policy ottiene i valori predefiniti del gateway, il che significa ogni modello nel catalogo e nessuna impostazione gestita. Aggiungi un catch-all
match: {} per ultimo se vuoi una policy predefinita garantita.
Inserisci le regole di negazione a livello di organizzazione nella policy match: {}, perché le regole di una policy di gruppo si applicano solo finché il token dell’utente contiene quel gruppo.
Il gateway non mantiene una propria directory utente. Autorizza ogni richiesta dal token IdP dell’utente, leggendo l’appartenenza ai gruppi dal claim
groups del token e valutando le policy rispetto ad esso. Non c’è un elenco da enumerare e nessun account da pre-creare, e quindi nessun endpoint SCIM, perché non c’è nulla in cui SCIM possa sincronizzare.Esegui la gestione del ciclo di vita di utenti e gruppi alla fonte di verità, che è il provisioning SCIM nativo del tuo IdP o una piattaforma dedicata di governance delle identità. L’appartenenza e il deprovisioning gestiti lì fluiscono nel gateway automaticamente attraverso il token. Se vuoi il provisioning SCIM degli account Claude stessi, questa è una funzionalità di Claude for Enterprise.Si applicano due tempi di propagazione:- Contenuti della policy: modificare una policy e rifare il deploy raggiunge i client Claude Code connessi al loro prossimo polling delle impostazioni gestite, entro un’ora, a parte le modifiche che si applicano solo al prossimo avvio
- Appartenenza ai gruppi: cambiare l’appartenenza ai gruppi di un utente cambia quale policy gli corrisponde. Questo ha effetto alla prossima riemissione della sessione, cioè al prossimo aggiornamento silenzioso, limitato da
session.ttl_hours.
Applicare ogni policy corrispondente
Un utente che corrisponde a più policy di ruolo riceve solo la prima, a meno che tu non impostipolicy_mode: layered accanto a policies. Con layered, si applica ogni policy che corrisponde all’utente, fino alla prima policy match: {}.
policy_mode richiede Claude Code v2.1.316 o successiva sul server del gateway. Un gateway con una versione che non la supporta si rifiuta di avviarsi quando trova la chiave. Aggiorna ogni replica prima di aggiungere la chiave e rimuovi la chiave prima di tornare a una versione precedente. Questo esempio ha un gruppo che perde WebFetch e uno che ottiene Opus:
no-web sia a opus-users con la modalità predefinita, first_match, e con layered.
Il gateway esegue il merge di ogni policy corrispondente su quelle elencate sotto di essa, con le stesse regole di merge del livello di base:
- Allowlist, valori singoli e blocchi come
sandbox: ciascuno proviene per intero dalla prima policy corrispondente in elenco che lo imposta, quindi gli elenchiavailableModelsdi due gruppi non si sommano. - Elenchi di negazione e array di hook: questi si sommano su tutte le policy corrispondenti, quindi un utente in due gruppi riceve le regole di negazione di entrambi i gruppi.
env,modelOverrideseskillOverrides: le voci vengono unite per nome, e la prima policy corrispondente in elenco che imposta un nome ne fornisce il valore.- Chiavi di
desktop: queste vengono unite secondo le regole per il bloccodesktopdi base.
layered, il gateway si rifiuta di avviarsi con alcune impostazioni, tra cui queste:
- Un pattern
!: una negazione!in una regolaReadoEditnell’elencopermissions.denyopermissions.askdi qualsiasi policy, inclusa quellamatch: {} - Un limite sugli hook al di fuori del catch-all:
disableAllHooks,allowedHttpHookUrlsohttpHookAllowedEnvVarsin qualsiasi policy diversa damatch: {}
Avvia le sessioni su un modello consentito dalla policy
SeavailableModels esclude il modello predefinito di Claude Code, le sessioni ricevono risposte 400 finché lo sviluppatore non sceglie un modello elencato, ad esempio con /model. Nelle sessioni del gateway il modello predefinito è il modello Opus a cui si risolve l’alias opus, e availableModels da solo non lo cambia.
Per risolvere, imposta enforceAvailableModels: true nello stesso blocco cli, poi verifica quale tipo di voce contiene l’elenco:
- Un alias come
sonnet, o un ID incorporato comeclaude-sonnet-4-6: le sessioni si avviano su uno di quei modelli, e l’opzione Default in/modelsi risolve in esso - Nessun alias né ID incorporato nell’elenco: le sessioni possono continuare ad avviarsi sul modello predefinito incorporato, quindi imposta anche
modelsu uno degli ID elencati nel bloccoclidi quella policy
models e avvia le sessioni su quell’ID:
Valori dei matcher che arrestano il gateway all’avvio
All’avvio, il gateway controlla il bloccomatch di ogni policy e l’elenco admin_groups. Uno qualsiasi di questi valori arresta il gateway con un errore che nomina il campo:
- Un elenco
groupsvuoto - Una voce vuota in
groupso inadmin_groups - Un
email_domainvuoto - Un
email_domainche contiene@, spazi bianchi o una virgola. Il gateway rimuove gli spazi dal valore e toglie un@iniziale prima di questo controllo. Scrivi un solo dominio semplice, comeexample.com.
- Un
email_domainvuoto: il gateway saltava il controllo del dominio, quindi una policy con unemail_domainvuoto e nessun elencogroupscorrispondeva a ogni utente autenticato - Un elenco
groupsvuoto: la policy non corrispondeva a nessuno - Un
email_domaincontenente@, spazi bianchi o una virgola: la policy non corrispondeva a nessuno - Una voce vuota in
groupso inadmin_groups: la voce corrispondeva a un utente solo quando anche il claimgroupsdell’IdP di quell’utente conteneva una voce vuota. Inadmin_groups, quella corrispondenza concedeva l’accesso da amministratore. Se il tuo elencoadmin_groupsnon ha mai contenuto una voce vuota, nessuno ha ottenuto l’accesso da amministratore in questo modo.
Scegliere cli o code
Le impostazioni di Claude Code di una policy, come una regola che nega la lettura dei file .env, vanno in un blocco sotto la chiave cli o code. code è la chiave consigliata e cli è la chiave legacy. Entrambe le chiavi accettano lo stesso contenuto. La chiave decide dove vengono applicate le impostazioni:
cli: il terminale, le estensioni VS Code e JetBrains e l’Agent SDK. Concli, la scheda Code di Claude Desktop riceve le impostazioni derivate, quindi una regola con ambito comeRead(./.env)non blocca un utente lì.code: gli stessi ambiti, e può essere coperta anche la scheda Code di Claude Desktop.
cli funziona come prima, e un gateway che trova cli in una policy con una chiave desktop avvisa all’avvio e si avvia comunque. Passa a code in modo che le impostazioni possano coprire anche la scheda Code.
Prima di passare, leggi Applicare le impostazioni code nella scheda Code. La policy ha bisogno di una chiave desktop e le macchine degli utenti devono essere configurate prima che le impostazioni si applichino lì, e la ricerca web si disattiva in Claude Desktop.
Questa policy mette la regola di negazione sotto code, con una chiave desktop vuota:
serve_to_desktop nella stessa modifica che rinomina i blocchi. Dove un’istruzione nomina il blocco cli, usa il tuo blocco code.
serve_to_desktop: true è un modo legacy per offrire le impostazioni cli di una policy alla scheda Code. Non ha effetto quando Claude Desktop si connette tramite bootstrapUrl. Finché le tue policy usano cli, un avviso all’avvio che nomina questa chiave significa che quelle impostazioni non raggiungono la scheda Code:
- Per coprire la scheda Code: passa a
code, una volta che le macchine degli utenti soddisfano le condizioni in Applicare le impostazionicodenella scheda Code - Per restare su
cli: impostaserve_to_desktop: falseaccanto acliin una policy per silenziare l’avviso
Cosa va in cli
Ogni valore code o cli è un documento managed-settings.json completo di Claude Code, lo stesso schema che distribuiresti tramite MDM o /etc/claude-code/managed-settings.json, espresso qui in YAML. La CLI applica il documento ricevuto al livello gestito, sopra le impostazioni utente e di progetto, al posto delle impostazioni gestite dal server. Di conseguenza ignora le impostazioni limitate alle sorgenti di policy a livello di sistema operativo, come policyHelper e wslInheritsWindowsSettings.
Il gateway convalida ogni documento rispetto allo schema delle impostazioni della CLI all’avvio, quindi una chiave di primo livello non riconosciuta fa fallire l’avvio con un errore che nomina ogni chiave problematica. Le parti deliberatamente aperte dello schema accettano comunque valori arbitrari, perché i client più recenti potrebbero riconoscere voci che lo schema del gateway non riconosce. Queste chiavi aperte includono env, pluginConfigs e le chiavi annidate sotto permissions.
Poiché la convalida utilizza lo schema incluso nella versione installata del gateway, inserire nella configurazione gestita una chiave di impostazioni di primo livello introdotta da una versione più recente di Claude Code richiede prima l’aggiornamento del gateway. Esegui uno smoke test di una nuova policy su un client prima di distribuirla.
Il riferimento completo delle chiavi è in Impostazioni di Claude Code. Le chiavi che gli operatori usano per prime:
Poiché queste impostazioni arrivano dalla rete, la CLI mostra a ogni sviluppatore una finestra di dialogo di approvazione di sicurezza prima di applicare le impostazioni elencate di seguito:
hooks- variabili
envche richiedono l’approvazione dello sviluppatore, come le variabili di proxy e di base URL - impostazioni di esecuzione della shell come
apiKeyHelperestatusLine - le impostazioni dei binari della sandbox
sandbox.bwrapPath,sandbox.socatPathesandbox.ripgrep - Impostazioni della sandbox che intercettano il traffico, iniettano credenziali o indeboliscono l’isolamento, come
sandbox.network.tlsTerminatee le impostazioni della porta del proxy. Finestre di dialogo di approvazione di sicurezza le elenca tutte.
env ricevute senza mostrare allo sviluppatore la finestra di dialogo di approvazione, come le impostazioni di selezione del modello e i limiti numerici. Altre variabili ricevute possono richiedere l’approvazione dello sviluppatore; un valore non vuoto di proxy, URL di base o OTEL_EXPORTER_OTLP_ENDPOINT la richiede sempre. Quando una variabile ricevuta richiede l’approvazione, la finestra di dialogo la nomina. Variabili d’ambiente e finestra di dialogo di approvazione riporta i dettagli, inclusi quattro interruttori per la privacy il cui valore ricevuto decide se richiedono l’approvazione.
La configurazione di telemetria del gateway invia OTEL_EXPORTER_OTLP_ENDPOINT, quindi impostare telemetry.forward_to attiva la finestra di dialogo su ogni client interattivo. La finestra di dialogo protegge la macchina dello sviluppatore da un gateway compromesso o ostile, non l’organizzazione dallo sviluppatore.
Un’esecuzione non interattiva, come claude -p, una sessione dell’Agent SDK o una sessione nella scheda Code di Claude Desktop, non può mostrare la finestra. Applica le impostazioni inviate solo per quell’esecuzione e non le registra come approvate, quindi la successiva sessione interattiva dello sviluppatore mostra comunque la finestra.
Se uno sviluppatore rifiuta, Claude Code esce da quella sessione anziché applicare la policy. Quando invii un nuovo hook, o qualsiasi variabile env che attiva la finestra di dialogo, a una policy ampia, ogni sviluppatore corrispondente vede quindi la finestra di dialogo nelle proprie sessioni interattive. Una sessione interattiva in esecuzione la mostra al prossimo polling orario, altrimenti appare al successivo avvio interattivo dello sviluppatore.
La chiave cli si chiamava settings nelle release precedenti, e il gateway accetta ancora quella grafia come alias. Per i nuovi deploy, usa code.
Testa una policy prima del deploy
Per testare una modifica a una policy, avvia il gateway su un database Postgres usa e getta. Il gateway si connette a Postgres e applica le migrazioni del suo schema prima di controllare il contenuto dei blocchicli, code e desktop. Quando non riesce a raggiungere il database, l’avvio si ferma su could not connect to Postgres e non segnala nulla sul loro contenuto.
Finestra di contesto nelle sessioni da terminale
Le sessioni da terminale con accesso effettuato tramite/login usano la finestra di contesto da 1M per Opus 4.7 e successivi, Sonnet 5 e successivi, e i modelli Fable. L’ID del modello non ha bisogno del suffisso [1m], e le sessioni si compattano a circa 967K token. Prima di Claude Code v2.1.287 sulla macchina dello sviluppatore, Claude Code trattava i modelli Opus e Fable come dotati di una finestra da 200K a meno che l’ID del modello non terminasse con [1m].
Per far sì che le sessioni da terminale si compattino invece al limite dei 200K, imposta la finestra di compattazione automatica nell’env della policy:
[1m].
Per disattivare invece il contesto 1M, imposta CLAUDE_CODE_DISABLE_1M_CONTEXT: "1" nello stesso blocco env. Claude Code tratta quindi ogni modello come dotato di una finestra da 200K. Nelle sessioni interattive, ogni sviluppatore approva questa variabile nella finestra di dialogo di approvazione prima che abbia effetto.
Claude Code non legge l’
upstream_model di un alias per dimensionarne la finestra di contesto. Per assegnare la finestra del relativo modello a un alias in models che Claude Code non riconosce, consulta Correggere la finestra per un ID di modello del gateway o personalizzato.Cache del prompt di un’ora
Per richiedere il TTL della cache del prompt di un’ora invece dei cinque minuti predefiniti, aggiungi queste chiavi al bloccocode, cli o settings esistente di una policy e riavvia il gateway. Le chiavi richiedono Claude Code v2.1.242 o successiva sul server del gateway e sui client.
promptCacheTtl copre la conversazione principale. subagentPromptCacheTtl è facoltativa e copre subagent, workflow e richieste in background. Questo esempio le aggiunge entrambe a una policy match: {} con chiave cli:
promptCacheTtl, accedi al gateway come un utente a cui corrisponde la policy e controlla quale TTL hanno usato le tue scritture nella cache. Passa --model per ripetere il controllo per ogni modello servito dal gateway.
Le scritture nella cache di un’ora costano di più delle scritture di cinque minuti. Perché i limiti di spesa conteggino questa tariffa più alta, ti serve la v2.1.286 o successiva sul server del gateway.
Server MCP in una policy
Per fornire server MCP ai client Claude Code a cui corrisponde una policy, impostamanagedMcpServers nel blocco cli di quella policy. Hai bisogno di Claude Code v2.1.259 o successivo sul server del gateway e sui client.
Il gateway controlla ogni voce all’avvio con le stesse regole che Claude Code applica sul client, e se una voce non supera un controllo, il gateway rifiuta di avviarsi e nomina la voce.
Se scrivi un riferimento ${VAR} in gateway.yaml, il gateway lo risolve dal suo ambiente all’avvio tramite l’espansione dei segreti prima di eseguire i controlli sulle voci, quindi ogni client corrispondente riceve il valore letterale e può leggerlo. Le indicazioni sulle intestazioni per i server forniti si applicano al valore espanso.
Il gateway rifiuta la grafia mcpServers di .mcp.json in un blocco cli, e il suo errore di avvio indica managedMcpServers come chiave da usare. Prima di v2.1.259, il gateway rifiutava qualsiasi definizione di server MCP in un blocco cli.
Overlay di Claude Desktop
Se la tua organizzazione distribuisce anche Claude Desktop, lo stesso gateway serve entrambi i client. PuntabootstrapUrl, nella configurazione gestita di Claude Desktop, a <listen.public_url>/user/bootstrap. Claude Desktop deriva l’emittente OAuth da quell’URL, esegue lo stesso accesso con codice dispositivo su questo gateway e recupera la sua configurazione dalla risposta.
Richiede Claude Code v2.1.203 o successivo sul server del gateway e un opt-in esplicito:
/user/bootstrap restituisce 404 a meno che la policy che corrisponde all’utente non contenga una chiave desktop. Un desktop: {} vuoto abilita una policy, e una chiave desktop sul livello base match: {} abilita ogni policy che la eredita. Il log di audit registra ogni richiesta come desktop_bootstrap.serve o desktop_bootstrap.denied.desktop completamente fuori dalle tue policy; il gateway restituisce quindi 404 da /user/bootstrap per ogni utente.
Impostazioni che il gateway deriva per Claude Desktop
Il gateway ricava gran parte della risposta di bootstrap dal bloccocli o code della policy corrispondente e dalla configurazione di primo livello del gateway:
-
L’elenco dei modelli, da
availableModels. L’elenco esclude i modelli che la policy blocca condeniedModelsoavailableModelsMatch: exact. Questo filtro richiede Claude Code v2.1.299 o successiva sul server del gateway. Contesto esteso in Claude Desktop tratta l’opzione di contesto da 1M di ciascun modello -
Gli strumenti disabilitati, dalle voci
permissions.denycon il solo nome dello strumento. Se impostidisabledBuiltinToolsnel bloccodesktopdella policy, il gateway serve l’unione del tuo valore e dell’elenco derivato, quindi puoi disabilitare più strumenti in questo modo ma non puoi riabilitarne uno che hai disabilitato tramitepermissions.deny -
L’allowlist in uscita, da
sandbox.network.allowedDomains. Se imposticoworkEgressAllowedHostsnel bloccodesktopdella policy, il gateway usa quel valore al posto dell’elenco derivato. Se l’allowlist servita dal gateway include*e il gateway non serve ancheallowedWorkspaceFoldersdi Claude Desktop, Claude Desktop non attiva la sandbox di Bash nella scheda Code -
Un endpoint OTLP che punta al gateway stesso, e gli attributi di identità dell’utente che ha effettuato l’accesso. Il gateway inoltra le esportazioni che riceve su quell’endpoint alle tue destinazioni
forward_to. Include l’endpoint e gli attributi quando imposti siatelemetry.forward_tochelisten.public_url. Claude Desktop esporta ogni segnale con un’unica codifica:http/protobuf, oppurehttp/jsonquando impostiOTEL_EXPORTER_OTLP_PROTOCOLo una delle sue varianti per segnale ahttp/jsonnell’envdella policy. Prima di Claude Code v2.1.261 sul server del gateway, la risposta impostava comunquehttp/json, quindi un collettore che accetta solo protobuf rifiutava le esportazioni di Claude Desktop
disabledBuiltinTools, coworkEgressAllowedHosts o l’impostazione managedMcpServers propria di Claude Desktop nel blocco desktop di una policy, hai bisogno di Claude Code v2.1.232 o successivo sul server del gateway. L’impostazione managedMcpServers di Claude Desktop accetta un valore array anziché un oggetto.
Il gateway omette dalla risposta di bootstrap le chiavi senza equivalente in Claude Desktop, come hooks e le regole di permesso con ambito come Bash(npm *).
Applicare le impostazioni code nella scheda Code
Le impostazioni di Claude Code che una policy contiene sotto la chiave code si applicano nella scheda Code di Claude Desktop quando valgono tutte queste condizioni:
- La policy ha anche una chiave
desktop, e undesktop: {}vuoto conta - Claude Desktop è alla versione 2.9939.2 o successiva
- Le impostazioni gestite di Claude Code sulla macchina nominano questo gateway
- Quella macchina raggiunge il gateway tramite HTTPS su una rete privata
cli in code. Quando le prime due condizioni valgono e una delle ultime due non è soddisfatta, un utente a cui corrisponde la policy ottiene uno di questi risultati:
- Tramite HTTPS, se Claude Desktop include Claude Code v2.1.296 o successiva: la scheda Code non si avvia, e la risposta al prompt dell’utente spiega il motivo
- Tramite HTTPS, se Claude Desktop include una versione precedente: la scheda Code si avvia senza le tue impostazioni
code, e nulla nella sessione lo segnala - Tramite HTTP semplice: la scheda Code si avvia senza le tue impostazioni
code, qualunque sia la versione inclusa in Claude Desktop
/managed/settings con un proprio 404, anche la scheda Code si avvia senza le tue impostazioni code, incluso su una macchina che soddisfa tutte e quattro le condizioni.
In una policy che ha una chiave desktop, un blocco code che contiene impostazioni disattiva lo strumento WebSearch in Cowork, Chat e nella scheda Code. Per i server MCP, consulta Dove si applica managedMcpServers.
Imposta direttamente le impostazioni di Claude Desktop
Aggiungi il blocco facoltativodesktop insieme a cli per impostare direttamente le impostazioni di Claude Desktop. Scrivi le impostazioni del riferimento della configurazione gestita di Claude Desktop come nomi di chiave piatti. Escludi le chiavi che Claude Desktop legge solo da MDM o da file locali, come bootstrapUrl; il gateway le rifiuta all’avvio.
Questo esempio imposta tre chiavi di Claude Desktop per il gruppo eng-contractors insieme alle sue impostazioni cli:
Cosa rifiuta il gateway all’avvio
Il gateway fallisce all’avvio quando un bloccodesktop contiene:
- Una chiave riconosciuta il cui valore Claude Desktop rifiuterebbe o scarterebbe silenziosamente, come un valore vuoto.
- Una chiave che il gateway calcola da solo: la connessione di inferenza, l’elenco dei modelli e l’inoltro OTLP. Configurali tramite
upstreams,modelse ilforward_todella sezionetelemetry. - Un alias legacy di una chiave attuale. Nell’errore di avvio, il gateway nomina la chiave canonica da scrivere.
- Da v2.1.300, qualsiasi chiave il cui nome inizia con
selfHosted, come le chiavi per un host di sessioni self-hosted. Rimuovi queste chiavi prima di aggiornare il gateway a v2.1.300 o successiva.
managedMcpServers senza transport, il gateway si avvia e registra un avviso che nomina la sostituzione.
Prima di v2.1.232, il gateway accettava un elenco fisso di 11 chiavi di feature gate, come chatTabEnabled e disableAutoUpdates, e rifiutava ogni altra chiave all’avvio. Prima di v2.1.227, il gateway rifiutava all’avvio anche chatTabEnabled e chatAdvancedFileAnalysisEnabled.
Chiavi che il gateway non conosce
Su un gateway che esegue Claude Code v2.1.295 o successiva, la maggior parte delle chiavi di una versione più recente di Claude Desktop non richiede un aggiornamento del gateway. Su v2.1.321 o successiva, non lo richiede nemmeno la maggior parte delle nuove sottochiavi all’interno di una chiave nota. Alcune chiavi e valori falliscono comunque all’avvio, come questi:- Una nuova scelta nell’elenco fisso di valori di una chiave nota.
- Un probabile errore di battitura di una chiave che puoi impostare in un blocco
desktop, comedisable_auto_updatesperdisableAutoUpdates. L’errore suggerisce un nome.
Chiavi che richiedono una versione più recente del gateway o di Claude Desktop
userPluginMarketplacesEnabled e userPluginUploadsEnabled richiedono Claude Code v2.1.260 o successiva sul server del gateway e Claude Desktop 1.37937.0 o successiva sulle macchine dei membri.
blockReadsOutsideWorkingDirectories, disableBypassPermissionsMode, configRecheckIntervalMinutes e sshClientPath hanno bisogno di Claude Code v2.1.281 o successivo sul server del gateway. Lo stesso vale per il valore required di microsoftAuthBroker e per il campo continuousAccessEvaluation di una voce managedMcpServers di Microsoft 365. Le versioni di Claude Desktop precedenti al valore required lo leggono come disabled, quindi imposta required solo dopo che il Claude Desktop di ogni membro lo supporta. Il riferimento della configurazione gestita di Claude Desktop elenca la versione che per prima legge ciascuna chiave.
sshTransport richiede Claude Code v2.1.293 o successiva sul server del gateway.orgPluginSettings nel blocco desktop di una policy, il gateway lo serve nella forma di array che Claude Desktop 1.15200.0 e successivi leggono. I desktop più vecchi ignorano l’array e non applicano alcuna policy sugli strumenti dei plugin, quindi aggiorna i membri a 1.15200.0 o successivo prima di farvi affidamento.
Come una policy per ruolo eredita il blocco desktop della base
Il gateway completa le chiavi che il blocco desktop di una policy non imposta con quelle del blocco desktop del catch-all match: {}, nello stesso modo in cui completa il blocco cli di una policy dalla base. Se imposti disabledBuiltinTools o builtinToolPolicy sia nella base che in una policy per ruolo, il gateway mantiene la restrizione della base:
disabledBuiltinTools: il gateway usa l’unione dell’elenco della base e dell’elenco della policybuiltinToolPolicy: se imposti uno strumento a un valore diverso daallownella base, il gateway mantiene quel valore anche se impostiallowper lo stesso strumento in una policy per ruolo
banner, quindi se imposti banner.text in una policy per ruolo, il gateway elimina il banner.backgroundColor della base.
Quando una modifica della policy raggiunge Claude Desktop
Dopo aver rifatto il deploy del gateway con una policy modificata, Claude Desktop applica la maggior parte delle impostazioni solo al suo prossimo avvio:- Chiuso: Claude Desktop recupera la risposta di bootstrap all’avvio, quindi la modifica si applica dal prossimo avvio
- Aperto: Claude Desktop verifica la presenza di una risposta modificata ogni 10 minuti per impostazione predefinita e applica alcune impostazioni senza riavvio. Per le altre, come
skillCreationEnabled, l’utente vede una scheda Relaunch Claude Desktop nella barra laterale e mantiene la configurazione precedente finché non riavvia l’app. Dopo 24 ore per impostazione predefinita, Claude Desktop mostra una finestra di dialogo di riavvio e si riavvia da solo dopo 2 minuti di inattività
relaunchEnforcementHours nel blocco desktop della policy. Hai bisogno di Claude Code v2.1.260 o successivo sul server del gateway e di Claude Desktop 1.40609.0 o successivo sulle macchine dei membri. Con 0, la finestra di dialogo appare non appena Claude Desktop rileva la modifica.
Contesto esteso in Claude Desktop
Se servi Claude Desktop dal gateway, il suo selettore di modelli offre un’opzione di contesto 1M per ogni modello elencato che può essere eseguito con una finestra di contesto da 1M. Tra questi ci sono Claude Opus 4.6 e successivi, Claude Sonnet 4.6 e successivi, e i modelli Fable. L’opzione è la variante[1m] del modello, descritta in Contesto esteso. Hai bisogno di Claude Code v2.1.284 o successivo sul server del gateway.
Una voce models non ottiene l’opzione 1M quando:
- Un upstream che può servire la voce la mappa a un modello senza supporto 1M, incluso un upstream che il gateway raggiunge solo in caso di failover
- Né il suo
idné alcuno dei suoi valoriupstream_modelnomina un modello Claude, come un alias personalizzato instradato verso l’ARN di un profilo di inferenza dell’applicazione
- Avvia gli utenti sull’opzione 1M: imposta
modelPrefer1mContext: truenel bloccodesktopdella policy. Gli utenti che non hanno ancora scelto un modello iniziano con l’opzione 1M quando il primo modello elencato ne ha una. Gli utenti che hanno già scelto un modello mantengono la loro scelta. - Offri l’opzione manualmente: fallo se il server del gateway esegue una versione precedente a v2.1.284, o se una voce non nomina alcun modello Claude. Elenca il modello due volte in
models, una volta con il suo ID semplice e una volta con[1m]aggiunto, entrambe con la stessa mappaupstream_model. Claude Desktop mostra la coppia come un unico modello con un’opzione 1M. Il gateway serve una voce[1m]senza controllarla, quindi aggiungine una solo per un modello che i tuoi upstream servono a 1M.
Rimuovi l’opzione 1M
Per rimuovere l’opzione dal selettore, impostaCLAUDE_CODE_DISABLE_1M_CONTEXT: "1" nel blocco env sotto la chiave cli della policy. Se hai anche elencato una voce il cui id termina con [1m], il gateway la serve comunque, quindi elimina anche quella voce.
La variabile raggiunge anche le sessioni da terminale degli sviluppatori a cui la policy corrisponde. Per ciò che cambia lì, vedi Contesto esteso.
Precedenza rispetto ad altre fonti gestite
Se un dispositivo ha anche una policy consegnata tramite MDM o unmanaged-settings.json locale, le impostazioni consegnate dal gateway hanno la precedenza. Precedenza all’interno del livello gestito nella pagina delle impostazioni gestite indica quando si applicano le fonti locali, e riporta le chiavi che Claude Code legge da ogni fonte di amministrazione indipendentemente dalla fonte selezionata, come le chiavi di blocco della sandbox, forceRemoteSettingsRefresh e il merge di env per variabile. Un policyHelper configurato in un profilo MDM o nel file delle impostazioni gestite viene eseguito solo quando il gateway non consegna impostazioni; la voce indica cosa sostituisce il suo output.
Gli host di incorporamento come Claude Desktop possono fornire policy tramite l’opzione SDK managedSettings. Impostazioni padre dagli host di incorporamento indica quando Claude Code le applica, e Limitare le impostazioni padre elenca quali impostazioni in direzione di autorizzazione si applicano comunque senza i blocchi allowManaged*Only.
Le policy del gateway si applicano a ogni invocazione di Claude Code sulla macchina, incluse le esecuzioni non interattive claude -p e le sessioni avviate dall’Agent SDK. Se il gateway non è raggiungibile all’avvio, le sessioni con accesso effettuato escono con un errore anziché essere eseguite senza la loro policy.
telemetry
La CLI invia metriche, log e, quando abilitate, tracce al gateway, che le inoltra alla lettera a ogni destinazione configurata. Le esportazioni utilizzano OpenTelemetry Protocol (OTLP) su HTTP. Per saltare l’inoltro e far esportare le sessioni direttamente al tuo collettore, nomina il collettore in una policy. Vedi Monitoraggio dell’utilizzo per le metriche e gli eventi che la CLI emette.
Nelle sessioni che hanno effettuato l’accesso tramite /login, la CLI contrassegna ogni esportazione con l’identità dell’utente autenticato, letta dal JWT emesso dal gateway: gli attributi user.id, user.email e user.groups. L’attribuzione di costi e utilizzo per sviluppatore funziona quindi senza alcuna configurazione lato sviluppatore. Gli eventi che Claude Code registra prima che lo sviluppatore effettui l’accesso non portano questa identità. Per sapere quale attributo segue una modifica ai gruppi di uno sviluppatore, consulta Modifiche ai gruppi durante una sessione aperta.
Le sessioni di Claude Desktop e Cowork con accesso effettuato tramite il gateway contrassegnano la loro telemetria con user.email e user.groups insieme a enduser.id, quindi puoi coprire l’utilizzo da terminale, Desktop e Cowork con un’unica query su user.email o user.groups. user.groups è l’elenco dei gruppi IdP separati da virgole.
La telemetria di Desktop e Cowork contiene anche enduser.sub, il claim sub che il tuo provider di identità emette per l’utente, che rimane lo stesso quando l’email di un utente cambia. Le sessioni da terminale riportano lo stesso valore sotto user.id, quindi una query che confronta enduser.sub con user.id del terminale copre insieme l’utilizzo da terminale, Desktop e Cowork di un utente. Nelle esportazioni di Desktop e Cowork, user.id è un identificatore anonimo, non il soggetto.
Come tutti i dati OpenTelemetry di Claude Code, questi attributi vanno solo alle destinazioni che la tua organizzazione configura, mai ad Anthropic.
Se l’elenco dei gruppi di un utente supera i 255 caratteri una volta codificato in percentuale, o un nome di gruppo contiene una virgola o un segno di uguale, il gateway omette user.groups dalla telemetria Desktop e Cowork di quell’utente anziché troncarlo. Le sessioni da terminale di quell’utente riportano comunque l’elenco completo.
Il gateway omette enduser.sub quando il soggetto supera i 255 caratteri una volta codificato in percentuale, o contiene uno spazio, un carattere al di fuori dell’ASCII stampabile, o uno tra , ; = \ " %. La telemetria Desktop e Cowork di quell’utente mantiene i suoi altri attributi.
Hai bisogno di Claude Code v2.1.265 o successivo sul server del gateway per user.email e user.groups nella telemetria di Desktop e Cowork, e di Claude Desktop 1.24012 o successivo sulla macchina di ogni sviluppatore per user.groups.
Hai bisogno di Claude Code v2.1.274 o successivo sul server del gateway per enduser.sub.
forward_to deve usare https://, con un’eccezione per un collettore sull’interfaccia loopback del gateway stesso:
http://localhost:<port>supera la convalida della configurazione, ma la protezione SSRF blocca ogni esportazione conECONNREFUSED_SSRFa meno che non impostiCLAUDE_GATEWAY_ALLOW_LOOPBACK=1nell’ambiente del gatewayhttp://127.0.0.1:<port>ohttp://[::1]:<port>fa fallire l’avvio a meno che quella variabile non sia impostata
HTTPS_PROXY è impostato, il gateway invia le esportazioni attraverso quel proxy.
Per raggiungere direttamente un collettore interno, aggiungilo a NO_PROXY per nome host o per un dominio con un punto iniziale come .internal.example.com, il che richiede Claude Code v2.1.277 o successivo sul server del gateway. Assicurati che il gateway possa raggiungere il collettore senza il proxy. Una voce senza punto iniziale corrisponde solo a quel nome esatto, non ai nomi sotto di esso. Gli intervalli CIDR non corrispondono.
Con l’uscita solo tramite proxy attivata, consenti invece il collettore nel proxy, poiché qualsiasi voce NO_PROXY mantiene disattivata l’uscita solo tramite proxy.
La telemetria è disattivata nella CLI per impostazione predefinita. Quando imposti sia telemetry.forward_to che listen.public_url, il gateway la attiva per i client connessi inviando sei variabili d’ambiente tramite /managed/settings:
CLAUDE_CODE_ENABLE_TELEMETRY=1OTEL_METRICS_EXPORTER,OTEL_LOGS_EXPORTEReOTEL_TRACES_EXPORTER, ognuna impostata aotlpse almeno una destinazioneforward_toabilita quel segnale e anonealtrimentiOTEL_EXPORTER_OTLP_ENDPOINT=<public_url>OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_RESOURCE_ATTRIBUTES.
Prima di Claude Code v2.1.265 sul server del gateway, il gateway inviava tutti e tre i selettori di esportazione come otlp, anche per i segnali che nessuna destinazione aveva abilitato.
L’endpoint inviato è costruito dall’URL pubblico, quindi metriche e log non hanno bisogno di configurazione OTEL da parte di sviluppatori o policy.
Gli sviluppatori che hanno effettuato l’accesso tramite /login non possono reindirizzare le esportazioni con la propria configurazione OTEL:
- Variabili impostate localmente: Claude Code applica le variabili inviate al livello gestito, quindi ognuna sovrascrive il valore che uno sviluppatore imposta localmente per essa.
- Endpoint configurati localmente: con l’esportazione OTLP/HTTP abilitata, la CLI ignora qualsiasi endpoint configurato localmente, indipendentemente dal fatto che il gateway abbia inviato le variabili di telemetria. Le sue esportazioni vanno al gateway a meno che una policy non nomini il tuo collettore come endpoint.
forward_to per un segnale, il gateway lo accetta e lo scarta. Se gli sviluppatori esportano già la telemetria di Claude Code a uno dei tuoi collettori, aggiungilo come destinazione forward_to, con log o tracce abilitati se esportano anche quelli, in modo che continui a ricevere i loro dati dopo che hanno effettuato l’accesso. Per saltare invece l’inoltro, nomina il collettore in una policy.
Le tracce richiedono anche CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1 su ogni client. Impostala nel blocco env di una policy gestita, poiché il gateway non la invia. Gli sviluppatori la approvano nella stessa finestra di dialogo di approvazione di sicurezza che l’endpoint inviato già attiva.
Impostala a 1 solo nelle policy i cui gruppi vuoi tracciare. Una policy che non la imposta eredita il valore dalla tua policy catch-all match: {} se quella policy ne imposta uno, secondo le regole di merge. Per impedire ai client di un gruppo di inviare tracce anche quando uno sviluppatore imposta la variabile localmente, impostala a 0 nella policy di quel gruppo.
Vengono inoltrate sia la codifica OTLP protobuf che quella JSON, e qualsiasi backend compatibile con OpenTelemetry funziona come destinazione.
Inviare metriche cumulative
Se il tuo collector accetta solo metriche cumulative, impostaOTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE su cumulative. Claude Code invia metriche delta per impostazione predefinita, e il gateway le inoltra senza convertirle. Imposta la variabile dove ogni tipo di sessione la legge:
- Sessioni del terminale: nel blocco
envsotto la chiavecliocodedi una policy - Sessioni Cowork che vengono eseguite sulla macchina dell’utente: nel blocco
envdelle impostazioni gestite lato client su quella macchina - Sessioni della scheda Code con una policy
code: nel bloccoenvdella policy, una volta soddisfatte le condizioni per l’applicazione delle impostazionicode - Sessioni della scheda Code con una policy
cli: nel bloccoenvdelle impostazioni gestite lato client sulla macchina che esegue la sessione. Tramite SSH, è l’host remoto.
parentSettingsBehavior: "merge" nella fonte con priorità più alta su quella macchina. Senza di essa, le sessioni Cowork e le sessioni della scheda Code con una policy cli vengono eseguite senza l’allowlist in uscita e le altre policy che Claude Desktop passa loro come impostazioni padre.
Aggiungi le tue etichette
Per applicare etichette fisse comeservice.namespace o deployment.environment.name alla telemetria delle sessioni con accesso effettuato tramite il gateway, imposta telemetry.resource_attributes. Ogni etichetta è un attributo di risorsa OpenTelemetry, e ogni destinazione riceve le stesse etichette.
Le sessioni ottengono le etichette solo quando imposti anche telemetry.forward_to e listen.public_url. Questo esempio aggiunge due etichette:
- I nomi usano solo lettere, cifre,
.,_e- - I nomi non sono riservati. Confrontati senza distinzione tra maiuscole e minuscole, i nomi riservati sono tutti quelli che iniziano con
user.,enduser.oidentity., piùservice.name,service.version,claude.deployment_mode,host.arch,os.type,os.versionewsl.version - I valori sono ASCII stampabile non vuoto, senza spazi e senza nessuno tra
, ; = \ " % - I valori sono lunghi al massimo 255 caratteri secondo il conteggio del gateway dopo la codifica in percentuale, quindi
/,:e@contano ciascuno come tre - I valori sono testo, quindi metti tra virgolette un numero,
trueofalse
telemetry.resource_attributes. Un gateway precedente rifiuta di avviarsi quando trova la chiave. Aggiorna ogni replica prima di aggiungere la chiave, e rimuovi la chiave prima di eseguire il rollback a una versione precedente.
Le sessioni da terminale con accesso effettuato tramite /login ricevono le etichette come OTEL_RESOURCE_ATTRIBUTES, inviata insieme alle altre variabili di telemetria. Se imposti OTEL_RESOURCE_ATTRIBUTES nel blocco env di una policy, le sessioni da terminale a cui quella policy corrisponde ottengono quel valore invece delle etichette. Claude Desktop riceve le etichette dal gateway insieme a user.email e agli altri attributi di identità.
Claude Code copia anche ogni etichetta su ogni punto dati delle metriche, quindi puoi filtrare le metriche in base a essa in un backend che non indicizza gli attributi di risorsa. Per disattivare quella copia, vedi Controllo della cardinalità delle metriche.
Modifiche ai gruppi durante una sessione aperta
Le sessioni del terminale inserisconouser.groups nella risorsa OTLP e di nuovo su ogni data point delle metriche e su ogni evento. Se i gruppi di uno sviluppatore cambiano mentre una sessione è aperta, i data point e gli eventi relativi all’utilizzo successivo al prossimo refresh silenzioso riportano i nuovi gruppi. La risorsa mantiene i vecchi gruppi finché lo sviluppatore non riavvia Claude Code, quindi raggruppa in base all’attributo sul data point o sull’evento.
Se attivi resource_to_telemetry_conversion nell’exporter Prometheus remote write dell’OpenTelemetry Collector, l’exporter sostituisce lo user.groups di ogni data point con quello della risorsa, quindi ogni data point mostra i vecchi gruppi. Per mantenere il valore del data point, elimina user.groups dalla risorsa prima di quell’exporter.
Questo processor resource dell’OpenTelemetry Collector elimina l’attributo nelle pipeline che lo elencano:
resource/drop-user-groups ai processors della pipeline delle metriche, ogni serie riporta l’etichetta user_groups dal proprio data point.
Esporta direttamente al tuo collettore
Per far sì che le sessioni con accesso effettuato tramite/login inviino la telemetria direttamente al tuo collettore anziché attraverso l’inoltro, imposta OTEL_EXPORTER_OTLP_ENDPOINT sull’URL base https:// del collettore nel blocco env di una policy gestita. Claude Code aggiunge /v1/metrics, /v1/logs o /v1/traces all’URL che imposti, come https://otel-collector.example.com:4318, ed esporta lì ogni segnale su OTLP/HTTP. Richiede Claude Code v2.1.265 o successivo sulla macchina di ogni sviluppatore. I client precedenti esportano attraverso l’inoltro.
Per autenticarti al collettore, imposta OTEL_EXPORTER_OTLP_HEADERS nello stesso blocco env. Le sessioni non inviano mai il token di sessione del gateway dello sviluppatore a un collettore nominato in questo modo.
Quando aggiungi o modifichi questo endpoint in una policy, Claude Code chiede a ogni sviluppatore di approvarlo nella finestra di dialogo di approvazione di sicurezza prima di applicarlo in una sessione interattiva.
Claude Code controlla l’endpoint prima di esportare direttamente un segnale, e mantiene quel segnale sull’inoltro quando un controllo fallisce. I controlli includono:
- L’endpoint proviene dal gateway stesso. Se imposti la stessa variabile in un profilo MDM o in un
managed-settings.jsonlocale, le esportazioni rimangono sull’inoltro. - L’URL usa
https://, oppurehttp://verso un indirizzo loopback - L’URL si risolve in un percorso che termina con
/v1/<signal>, senza query né frammento. Claude Code costruisce da solo quel percorso a partire dalla variabile generica. Usa una variabile per segnale comeOTEL_EXPORTER_OTLP_METRICS_ENDPOINTcosì come è scritta, quindi lì includi il percorso completo. - L’URL non è l’host del gateway stesso. Un endpoint indirizzato al gateway mantiene il percorso di inoltro e il suo token di sessione.
- Né tu né lo sviluppatore avete configurato
otelHeadersHelperin alcuna fonte di impostazioni. Con un helper configurato, ogni segnale rimane sull’inoltro.
OTEL_*_EXPORTER.
L’endpoint da solo non attiva l’esportazione, quindi imposta anche le variabili che lo fanno, a meno che il gateway non le invii già:
- Se il gateway invia già le variabili di telemetria, queste coprono l’abilitazione, i selettori e il protocollo, e il tuo endpoint esplicito sovrascrive il valore
<public_url>inviato. Imposta tu stesso un selettoreOTEL_*_EXPORTERaotlpsolo per un segnale che nessuna destinazioneforward_toabilita. - Se non lo fa, imposta anche
CLAUDE_CODE_ENABLE_TELEMETRY=1, i selettoriOTEL_*_EXPORTEReOTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf.
Quando una destinazione fallisce
Il gateway non bufferizza, non riprova e non archivia la telemetria, quindi scarta un’esportazione che non raggiunge una destinazione anziché consegnarla in ritardo. Ogni destinazione riesce o fallisce per conto proprio, e il client che esporta riceve comunque una risposta di successo, quindi una consegna fallita appare solo nel log del gateway. Dopo cinque consegne consecutive fallite a una destinazione, il gateway sospende l’inoltro verso di essa per intervalli di 30 secondi, registrando ogni pausa, finché una consegna non riesce. Qualsiasi risposta di errore, timeout o errore di connessione conta come consegna fallita, tranne400, 413, 415, 422 e 431, che indicano che il collettore ha rifiutato il payload di quell’esportazione perché malformato o troppo grande.
Un payload rifiutato non fa avanzare né azzera il conteggio dei fallimenti: il gateway continua a inoltrare alla destinazione e registra un avviso che la nomina insieme allo stato, al primo rifiuto della destinazione e poi ogni cento.
Ottimizzazione HTTP
Quattro blocchi facoltativi di primo livello,access_control, limits, timeouts e rate_limits, regolano la superficie HTTP. I valori predefiniti sono adatti alla maggior parte dei deploy.
Se lasci vuoti entrambi gli elenchi
access_control, che è il valore predefinito, il gateway serve qualsiasi indirizzo client, quindi solo la tua rete limita chi può raggiungerlo. Questo è importante perché un gateway può inviare impostazioni gestite che eseguono comandi sulle macchine degli sviluppatori.
Mentre allow_cidrs è vuoto, il gateway avverte in due punti, senza cambiare il modo in cui risponde alle richieste:
- All’avvio: un avviso nel log operativo consiglia di consentire solo gli intervalli privati
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,100.64.0.0/10,127.0.0.0/8,::1/128efc00::/7, più qualsiasi altro intervallo interno da cui si connettono i tuoi sviluppatori. Se associ il gateway a un indirizzo loopback e non imposti nétrusted_proxiesnépublic_url, come nello sviluppo locale, l’avviso non appare. - In fase di esecuzione: la prima volta che una richiesta arriva da un indirizzo al di fuori di quegli intervalli privati, il gateway registra un avviso ed emette un evento di audit
access.public_clientcontenente l’IP del client. Entrambi si attivano una volta per processo. Gli indirizzi link-local,169.254.0.0/16efe80::/10, non contano come pubblici. Il gateway risponde a/healthze/readyzprima che questo controllo venga eseguito, quindi i probe di salute da intervalli pubblici non lo attivano.
listen.trusted_proxies, il gateway vede l’indirizzo dell’intermediario, che di solito è privato, quindi né l’avviso in fase di esecuzione né un’allowlist privata intercettano il traffico inoltrato attraverso di esso.
Se l’inoltro appartiene a listen.trusted_proxies, elencalo lì. In ogni caso, mantieni il gateway e tutto ciò che si trova davanti a esso irraggiungibili dalla rete Internet pubblica.
load_test_mode
Il blocco load_test_mode ti consente di eseguire un test di carico su un gateway senza chiamare un provider di modelli. Mentre è attivo, il gateway costruisce e firma ogni richiesta al provider come di consueto, la scarta invece di inviarla e trasmette in streaming una risposta preconfezionata attraverso il suo normale percorso di risposta. La risposta è testo di riempimento che inizia con una frase che dichiara che è preconfezionata.
Richiede Claude Code v2.1.282 o successivo sul server del gateway. Un gateway precedente rifiuta di avviarsi quando trova la chiave. Aggiorna ogni replica prima di aggiungere il blocco, e rimuovi il blocco prima di eseguire il rollback.
L’esempio seguente attiva la modalità con i valori predefiniti, una risposta di circa 750 token di testo trasmessa in streaming in circa 10 secondi:
Un test di carico in questa modalità copre il gateway, il tuo Postgres e tutto ciò che si trova davanti al gateway. Non copre i limiti, la velocità e il percorso di rete del provider, né l’attesa dovuta al limite di richieste upstream simultanee di ciascuna replica. Una replica registra comunque l’avviso
client requests are open quando ci sono più richieste aperte di quel limite, il punto in cui le richieste in produzione iniziano ad attendere.
Nessuna richiesta di modello viene inviata al provider, quindi la CPU per richiesta di una replica è una stima e risulta inferiore a quella di produzione, dove la replica cifra anche il traffico verso il provider. Conferma il numero di repliche con un piccolo pilota sul provider reale. Prima di v2.1.283, la stima risulta molto più bassa.
Mentre la modalità è attiva, una richiesta può contenere un’intestazione x-load-test-user con un numero intero di al massimo sette cifre. Il gateway conta ogni numero come uno sviluppatore separato, con l’email e i gruppi dello sviluppatore il cui token accompagnava la richiesta.
Assegna al deploy del test di carico un database vuoto dedicato, perché il gateway rifiuta di avviarsi con la modalità attiva su un database in cui uno sviluppatore abbia già speso qualcosa.
Esempio completo
Questo config di riferimento completo esercita ogni sezione principale; i blocchi di sintonizzazione HTTP mantengono i loro valori predefiniti. Copialo, elimina ciò che non ti serve e inserisci i tuoi valori. La configurazione nella Guida rapida è una versione minima di questa.gateway.yaml
Impostazioni gestite lato client
Tutto quanto sopra configura il server gateway. Punta le macchine degli sviluppatori al gateway separatamente, su ogni dispositivo, attraverso le impostazioni gestite di Claude Code. Il gateway non può inviare da solo le chiavi di accesso, perché sono proprio loro a indicare al client dove si trova il gateway. Per la CLI, imposta queste chiavi nel filemanaged-settings.json di ogni sistema operativo. Le due chiavi di accesso instradano il /login di ogni sviluppatore al tuo gateway:
parentSettingsBehavior: "merge" mantiene funzionante la consegna dell’allowlist di egress da parte di Claude Desktop alle sue sessioni Claude Code incorporate; Fornire la policy alle sessioni di Claude Desktop spiega il meccanismo e dove deve trovarsi l’opt-in.
Per impedire agli sviluppatori di aggirare il gateway con una variabile di un provider cloud o con un proprio ANTHROPIC_BASE_URL, aggiungi "allowedProviders": ["gateway"] allo stesso file. Claude Code rifiuta quindi ogni sessione sulla macchina che non sia configurata per un Cloud gateway, e ammette un gateway solo quando è quello indicato da forceLoginGatewayUrl oppure uno il cui URL è impostato come ANTHROPIC_BASE_URL nel blocco env del file. claude gateway si rifiuta di essere eseguito su una macchina che imposta l’elenco, quindi non inserire la chiave sull’host del gateway. Consulta la voce allowedProviders nel riferimento delle impostazioni. Richiede Claude Code v2.1.285 o successivo.
Distribuisci il file managed-settings.json a ogni dispositivo, tipicamente tramite la tua piattaforma MDM. Il percorso del file differisce per piattaforma. Consulta dove ogni meccanismo memorizza la policy.
Per impostazione predefinita, una policy del registro su Windows o un plist di preferenze gestite su macOS sostituisce il file managed-settings.json anziché farne il merge, ad eccezione delle chiavi di eccezione e dei controlli tra fonti descritti sopra. Tutte e tre le chiavi in questo frammento seguono la regola della fonte con priorità più alta, quindi le flotte che distribuiscono la policy tramite Group Policy o profili di configurazione devono inserirle tutte e tre in quel meccanismo.
Per Claude Desktop, imposta la chiave bootstrapUrl nella configurazione gestita di Claude Desktop su <listen.public_url>/user/bootstrap. Il flusso di accesso e la policy per gruppo corrispondono quindi a quelli della CLI una volta che una policy si attiva lato server con una chiave desktop; senza l’opt-in, /user/bootstrap restituisce 404. Consulta Claude Desktop overlay per la metà lato server.
Claude Code rispetta forceLoginGatewayUrl, gatewayInternalNetworks e il valore "gateway" di forceLoginMethod da una fonte gestita sulla macchina: managed-settings.json, il plist macOS o il registro HKLM di Windows, oppure un policy helper. Impostarli nel payload del gateway non configura l’accesso tramite gateway. Per il ~/.claude/settings.json personale di uno sviluppatore, consulta Impostare l’URL del gateway nelle impostazioni utente.
Lascia forceLoginMethod e forceLoginOrgUUID fuori dal payload. Claude Code legge comunque entrambe le chiavi dal payload per il controllo delle credenziali all’avvio, quindi uno sviluppatore che mantiene sulla macchina una credenziale emessa da Anthropic incorre nell’uscita all’avvio descritta in La policy dell’amministratore richiede un accesso tramite Cloud gateway anche dopo aver effettuato l’accesso.
Correlati
- Panoramica del gateway delle app Claude: guida rapida e connessione dello sviluppatore
- Guida alla distribuzione: configurazione IdP, immagine del contenitore, Kubernetes e Cloud Run e operazioni
- Limiti di spesa: cap per sviluppatore e API Admin