Skip to main content
Una distribuzione del gateway delle app Claude è configurata da un file YAML, convenzionalmente 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. Le chiavi sconosciute causano un errore di avvio, quindi un errore di battitura emerge come errore denominato piuttosto che come impostazione ignorata silenziosamente. Sezioni obbligatorie:
  • listen: indirizzo di binding, URL pubblico, terminazione TLS
  • oidc: il vostro provider di identità (IdP), inclusi emittente, client, mappatura delle attestazioni e chi può accedere
  • session: i bearer token che il gateway emette, con segreto e durata
  • store: 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
Sezioni facoltative:
  • admin: autenticazione dell’API Admin e conservazione dei limiti di spesa
  • enforcement: comportamento fail-open o fail-closed dei limiti di spesa
  • pricing: tariffe contrattuali e un moltiplicatore per il misuratore di spesa e per le cifre di costo che gli sviluppatori vedono
  • models e auto_include_builtin_models: elenco di modelli curato dall’amministratore e ID per upstream
  • managed: politiche di impostazioni gestite per gruppo IdP
  • telemetry: 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 IP
  • load_test_mode: test di carico del gateway senza chiamare un provider di modelli

Espansione dei segreti

Non scrivete segreti come client_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.

oidc

Il blocco oidc connette il gateway al vostro 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 vostro provider di identità; vedere Configurazione del provider di identità per ciò che registrare sul lato IdP.

Richieste IdP attraverso un proxy forward

Gli upstream di inferenza onorare HTTPS_PROXY e HTTP_PROXY su ogni versione. Le richieste del gateway stesso all’IdP, scoperta, JWKS, token e userinfo, vanno dirette a meno che non impostiate 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 chiedendovi di scegliere; use_proxy: false le mantiene dirette e silenzia l’avviso. Con use_proxy: true, il pod risolve il nome host di ogni endpoint IdP stesso e chiede al proxy di CONNECT all’indirizzo IP risolto, quindi il proxy deve accettare CONNECT all’indirizzo IP di ogni host che il documento di scoperta nomina, non solo l’emittente. Usate un URL proxy http://. ca_cert_pem e la guardia SSRF si applicano anche sul percorso proxato. Egress solo proxy cambia entrambi questi: mentre è attivo, le richieste IdP seguono il proxy a meno che non impostiate use_proxy: false, e il gateway consegna al proxy ogni nome host IdP senza risolverlo prima.

Egress solo proxy

Impostate CLAUDE_GATEWAY_PROXY_IS_EGRESS_BOUNDARY=1 nell’ambiente del gateway, accanto a HTTPS_PROXY, quando il pod raggiunge altri host solo attraverso quel proxy forward e non può risolvere i nomi DNS pubblici stesso, o quando il proxy rifiuta CONNECT a un indirizzo IP. Richiede v2.1.277 o successivo. È una variabile di ambiente piuttosto che una chiave gateway.yaml in modo che nulla nel file di configurazione possa rilassare il controllo dell’indirizzo del gateway.
Il gateway registra una riga network: all’avvio mentre l’egress solo 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 proxy è attivo. L’egress solo proxy rimane disattivato a meno che l’ambiente del gateway non soddisfi tutti e tre questi condizioni:
  • HTTPS_PROXY o HTTP_PROXY è impostato.
  • NO_PROXY e no_proxy sono vuoti. Se la vostra piattaforma inietta uno di questi nei pod, impostate entrambi a un valore vuoto sul contenitore del gateway. Elencando un collettore di telemetria in NO_PROXY mantiene l’egress solo proxy disattivato.
  • CLAUDE_GATEWAY_ALLOW_LOOPBACK non è attivato. Un collettore o IdP sul loopback proprio del pod non può essere combinato con l’egress solo proxy, perché un indirizzo loopback consegnato al proxy sarebbe il proprio dell’host proxy, quindi date a quei servizi un indirizzo che il proxy può raggiungere invece. Per lo stesso motivo il gateway rifiuta i nomi di stile localhost completamente mentre l’egress solo proxy è attivo.
Quando una di queste condizioni non è soddisfatta, il gateway registra un avviso all’avvio nominando la variabile che l’ha fermato e mantiene il comportamento predefinito. Una volta che l’egress solo proxy è attivo, consentite ogni destinazione nel proxy, incluso un collettore interno e qualsiasi host configurato per indirizzo IP. Potete ancora mantenere un IdP interno diretto con oidc.use_proxy: false.
Attivate questo solo quando l’allowlist del proxy è almeno altrettanto rigoroso del controllo del gateway stesso. Il proxy deve rifiutare gli endpoint dei metadati cloud come 169.254.169.254 e metadata.google.internal, gli indirizzi link-local e il loopback dell’host proxy stesso, e deve rifiutarli per l’indirizzo a cui un nome si risolve, non solo per nome, perché il gateway non cattura più un nome host che si risolve a uno di essi. Un proxy che si connette ovunque gli viene chiesto rimuove la guardia SSRF del gateway per queste richieste.

session

Il blocco session modella i token bearer che il gateway conia dopo l’accesso: il segreto che li firma e quanto a lungo vivono.

store

Il blocco store punta il gateway al suo database PostgreSQL, che contiene le concessioni dei dispositivi e i contatori dei limiti di velocità. Per lo sviluppo locale, puntate postgres_url a un contenitore 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. Su 5xx, 429, 401, 403, 404 o timeout il gateway esegue il failover al successivo; altri 4xx no, perché questi errori sono attribuibili alla richiesta piuttosto che all’upstream. Un 401 o 403 significa che la credenziale del gateway stesso non ha funzionato contro quell’upstream. Un 404 significa che quell’upstream non serve il modello richiesto, quindi un upstream successivo nell’elenco può ancora servirlo. Se impostate forward_user_identity: true su un upstream, un 429 che restituisce a una richiesta che portava l’email dello sviluppatore non esegue il failover. Vedere come un rifiuto di limite per utente raggiunge lo sviluppatore. Il failover su 404 richiede gateway v2.1.198 o successivo. Le versioni precedenti hanno restituito 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, Google Cloud Agent Platform e Microsoft Foundry sono costruiti 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 sono letti all’avvio; vedere API Anthropic.

Messaggi di errore dell’upstream

Il gateway restituisce la risposta di errore di un upstream o il suo proprio 502, a seconda di come gli upstream hanno risposto:
  • Un upstream ha restituito uno stato su cui il gateway non esegue il failover: quella risposta dell’upstream. Il gateway non prova ulteriori upstream.
  • Ogni upstream che il gateway ha provato ha fallito in un modo su cui esegue il failover: l’ultimo 429. Quando nessuno ha restituito un 429, il gateway preferisce, in ordine, l’ultimo 401 o 403, l’ultimo 404 e l’ultimo 501. Quando nessuno ha restituito nessuno di quelli, il proprio 502 del gateway, all upstreams failed (N attempted), dove N conta ogni voce in upstreams, incluse le voci che il gateway ha saltato perché non servono il modello richiesto.
Quando il gateway restituisce la risposta di un upstream, mantiene il codice di stato dell’upstream. Se mantiene il messaggio dell’upstream dipende dal provider. Il corpo di errore di un upstream API Anthropic raggiunge lo sviluppatore invariato. Gli upstream Amazon Bedrock, Claude Platform on AWS, Google Cloud Agent Platform e Microsoft Foundry possono nominare i vostri ID account, ARN di ruolo e ID di progetto nel loro testo di errore. Il gateway registra quel testo completo nel log operativo. Ciò che lo sviluppatore vede da questi upstream dipende dal rifiuto:
  • 400 o 413 nell’envelope di errore standard di Anthropic: il messaggio dell’upstream stesso, come prompt is too long. Claude Platform on AWS, Agent Platform e Microsoft Foundry restituiscono questo envelope per i rifiuti dell’API del modello.
  • 400 o 413 nella forma propria del provider: un token capability_rejected:. Quando il gateway non può classificare il rifiuto, upstream rejected the request su un 400 o request too large for this upstream su un 413.
  • Qualsiasi altro stato: copia generica per stato, come upstream rate limit exceeded su un 429.
Ad esempio, il gateway sostituisce 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 gateway v2.1.233 o successivo.

API Anthropic

L’upstream Anthropic minimo è una chiave API dalla Console Claude:
Le due forme di credenziale differiscono nell’header che inviano:
  • api_key: invia x-api-key. Ruotatela nella Console Claude e aggiornate la variabile env.
  • oauth_token: invia Authorization: Bearer. Usate la forma bearer quando la vostra organizzazione emette token a breve durata invece di chiavi API a lunga durata. Il bearer è letto una volta all’avvio, quindi aggiornate rimontando il segreto e riavviando.
Invece di una chiave statica o un bearer, potete usare Workload Identity Federation. Create una regola di federazione seguendo la guida Workload Identity Federation, quindi montate il JWT OIDC del vostro carico di lavoro come file, come un token dell’account di servizio proiettato di Kubernetes o un id-token della piattaforma CI. Il gateway scambia il JWT per un bearer a breve durata e lo aggiorna automaticamente. Il file del token viene riletto ad ogni scambio, quindi i token proiettati ruotati vengono ripresi senza un riavvio.
Potete puntare l’base_url di un upstream provider: anthropic a un proxy che gestite invece che all’API Anthropic. Per dire a quel proxy quale sviluppatore ha inviato ogni richiesta, impostate 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:
Il gateway aggiunge questi intestazioni a ogni richiesta che inoltra a quell’upstream. Quando il token IdP non porta email, il gateway invia solo x-claude-gateway-user-id e omette i due intestazioni email. Se il vostro IdP mette l’email in un claim diverso, impostate oidc.email_claim a quel claim. Quando il vostro 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 al successivo upstream, quindi il vostro budget per utente del proxy o il limite di velocità tiene. Le altre risposte del proxy seguono le regole di failover ordinarie. Se il token IdP di uno sviluppatore non porta email, il gateway inoltra le sue richieste senza gli intestazioni email, quindi un 429 a una di quelle richieste conta come capacità upstream e esegue il failover. Prima della v2.1.267 sul server del gateway, ogni 429 eseguiva il failover. Impostate forward_user_identity solo su un upstream il cui base_url è un proxy che gestite. Il gateway invia email degli sviluppatori a qualsiasi server che base_url nomina. Se base_url è l’API Anthropic, che è il predefinito, il gateway si rifiuta di avviarsi.

Amazon Bedrock

Per la distribuzione Bedrock lato client che il gateway sostituisce o fronteggia, vedere Claude Code su Amazon Bedrock. L’upstream lato gateway:
Un blocco auth vuoto usa la catena di credenziali predefinita dell’AWS SDK: variabili env, ~/.aws/credentials, ruolo di attività ECS, metadati dell’istanza EC2 o IRSA su EKS. In produzione, date al pod del gateway un ruolo IAM invece di incorporare chiavi statiche in un’immagine del contenitore. Le credenziali esplicite devono essere complete: il gateway non riesce 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 ha superato la convalida.

Claude Platform on AWS

Claude Platform on AWS serve l’API Anthropic di prima parte su infrastruttura AWS su aws-external-anthropic.<region>.api.aws. Utilizza ID modello di prima parte, onora gli header anthropic-beta come inviati e serve count_tokens, quindi nessuna della traduzione specifica di Bedrock si applica. 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, vedere Claude Code su Claude Platform on AWS. L’upstream lato gateway:
La piattaforma viene eseguita in un account AWS separato da Amazon Bedrock e firma le richieste SigV4 per il suo nome di servizio, aws-external-anthropic, quindi un ruolo IAM limitato a Bedrock non lo autorizza. Una chiave API in auth.api_key ha la precedenza quando le credenziali SigV4 sono anche impostate. Un blocco auth vuoto usa la catena di credenziali predefinita dell’AWS SDK, la stessa catena che l’upstream Amazon Bedrock utilizza. Poiché la piattaforma risolve ID modello di prima parte, il catalogo integrato instrada ad essa senza un blocco models:. Quando curate un elenco models:, chiave l’entry anthropicAws: con l’ID di prima parte.

Google Cloud Agent Platform

Per la configurazione equivalente lato client, vedere Claude Code su Google Cloud. L’upstream lato gateway:
Un blocco auth vuoto usa 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; usate Workload Identity o allegate un account di servizio all’istanza GCE o Cloud Run. Impostate region: global per usare l’endpoint globale di Agent Platform invece di uno regionale. Google quindi instrada ogni richiesta a una regione disponibile, quindi non tracciate la disponibilità del modello per regione. L’impostazione di una regione specifica fissa ogni richiesta ad essa.

Microsoft Foundry

Per la distribuzione Foundry lato client, vedere 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; l’Azure CLI o le credenziali di ambiente. Le chiavi API funzionano ma sono a livello di progetto e non ruotano automaticamente. L’endpoint di Foundry è derivato da resource:; impostate l’base_url facoltativo per sovrascriverlo per cloud sovrani come Azure Government.

Intestazioni statiche sulle richieste upstream

Per aggiungere intestazioni fisse alle richieste che il gateway invia a un upstream, impostate headers: su quell’upstream. Usatelo quando un proxy che gestite davanti al provider instrada o attribuisce il traffico per un intestazione. headers: richiede Claude Code v2.1.277 o successivo sul server del gateway. Un gateway precedente si rifiuta di avviarsi quando trova la chiave. Aggiornate ogni replica prima di aggiungere la chiave e rimuovete la chiave prima di eseguire il rollback a una versione precedente. Gli intestazioni vanno al server che base_url nomina, o all’endpoint proprio del provider quando base_url non è impostato. Il provider li riceve anche a meno che il vostro proxy non li rimuova. Questo esempio raggiunge un upstream provider: vertex attraverso un proxy su upstream-proxy.internal.example.com. Imposta l’intestazione x-source che il proxy legge e invia un token dalla variabile di ambiente PROXY_TOKEN come x-proxy-token:
I valori sono testo ASCII stampabile senza spazio a nessuno dei due lati. Quotate un numero, true o false in modo che YAML lo legga come testo. Per mantenere un segreto fuori dal file di configurazione, usate l’espansione del segreto per caricare il valore da una variabile di ambiente con ${VAR} o da un file con ${file:/path}. Un ${VAR} che si risolve a un valore vuoto ferma il gateway dall’avviarsi. headers: funziona su ogni provider e ogni upstream invia solo il suo. Non ogni richiesta che il gateway invia a un upstream li porta: Su un upstream Amazon Bedrock o Claude Platform on AWS che firma le richieste con AWS SigV4, questi intestazioni fanno parte della firma, quindi il vostro proxy deve passarli attraverso invariati. Se usate un nome che il gateway riserva, si rifiuta di avviarsi e l’errore di avvio nomina l’intestazione. I nomi riservati includono:
  • authorization e x-api-key
  • host, content-type e user-agent
  • Qualsiasi nome che inizia con anthropic-, x-goog-, x-amz- o x-amzn-

Più upstream

Lo stesso provider può apparire più di una volta con un name: distinto. Questo copre regioni diverse, account diversi tramite catene di credenziali diverse, throughput provisioned rispetto a on-demand e failover cross-provider. Il gateway prova gli upstream in ordine. 5xx, 429, 401, 403, 404, timeout e endpoint mancante (501) eseguono il failover; altri 4xx no. 429 è capacità per upstream, quindi l’esaurimento del throughput provisioned (PT) esegue il failover a on-demand. Se impostate forward_user_identity: true su un upstream, un 429 a una richiesta che portava l’email dello sviluppatore è un rifiuto per utente invece e non esegue il failover. Ogni richiesta inizia al primo upstream. Una richiesta raggiunge un upstream successivo solo quando ogni upstream davanti ad esso ha fallito o non serve il modello richiesto. Il gateway non mantiene alcun record di upstream falliti, quindi mentre un upstream è inattivo, ogni richiesta che lo raggiunge lo prova ancora e attende che fallisca prima di passare al successivo. Per un upstream API Anthropic, timeouts.upstream_ttfb_ms limita l’attesa su un upstream inattivo. Questa impostazione non si applica agli altri provider, dove il gateway attende fino a un’ora che un upstream inizi a rispondere. 404 è disponibilità del modello per 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 un’allocazione Bedrock di throughput provisioned per primo, trabocca a on-demand e un secondo account e ricade all’API Anthropic per ultimo:
Il failover tra provider cloud o all’API Anthropic diretto cambia quale accordo, geografia e altri termini governano la richiesta. La CLI applica lo stesso feature gating ai gateway indipendentemente da quale upstream serve una data richiesta, quindi il failover non invia un campo del corpo che un upstream rifiuterebbe.

Sezioni facoltative

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 Spend limits per come vengono impostati e applicati i cap; questa sezione copre le chiavi gateway.yaml che attivano la funzione e la sintonizzano.

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 blocco managed: con almeno una policy. Il gateway rifiuta di avviarsi con pricing impostato 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, un upstreams[].name, serve per model. Questo include il tasso fast mode più alto, quindi le richieste fast e standard vengono misurate agli stessi quattro tassi.
  • Un ID incorporato come claude-sonnet-4-6, abbinato come models[].id, copre ogni forma datata, forma regionale di Amazon Bedrock, o forma di Google Cloud’s Agent Platform che il misuratore prezza come quel modello. Qualsiasi altra stringa, come un alias o un ARN del profilo di inferenza, abbina l’ID che il client ha inviato o la 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 fallisce all’avvio, così come due righe per uno upstream che nominano lo stesso modello, incluse due ortografie 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 $0.01; il moltiplicatore si applica comunque a loro.
Per tariffe per regione, dai a ogni regione il suo upstream denominato e una riga per upstream.

Aumenta i prezzi

Con v2.1.271 o successivo sul server del gateway, puoi impostare multiplier sopra 1, fino a 10, per misurare più di quanto il provider addebita, ad esempio un tasso di chargeback interno. Questo esempio misura ogni richiesta al 120% del prezzo:
Con un blocco 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 dice. Il moltiplicatore non cambia quello che il provider upstream addebita per le richieste. Se il gateway inoltre invia le tariffe ai client firmati, 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.

Inviare le tariffe ai client firmati

Con v2.1.268 o successivo sul server del gateway, il gateway mette anche le tariffe da pricing nelle policy managed che serve, come l’impostazione gestita modelPricing. Gli sviluppatori abbinati da una policy vedono quindi le tariffe pricing per il primo upstream che serve ogni ID modello in /usage, la riga di stato e OpenTelemetry. Uno sviluppatore che non corrisponde a nessuna policy non riceve impostazioni gestite, quindi le sue cifre rimangono al prezzo di listino. I client applicano l’impostazione in Claude Code v2.1.242 o successivo.
  • Cosa aggiunge il gateway: a meno che il blocco cli di una policy non imposti già modelPricing, il gateway aggiunge il multiplier e, per ogni ID modello che un client può richiedere, la riga di override del primo upstream che serve quell’ID. Un tasso che solo un upstream di failover addebita rimane sul gateway.
  • Escludi una policy: imposta modelPricing a {} nel blocco cli di quella policy, e i suoi sviluppatori rimangono al prezzo di listino.
  • Mantieni le tariffe proprie di una policy: una policy il cui blocco cli imposta modelPricing con il suo multiplier o overrides mantiene quel modelPricing intero, e il gateway non aggiunge tariffe proprie a esso.

models

Il blocco models è un elenco di modelli curato da admin facoltativo, 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 distribuzione di Microsoft Foundry.
Ogni chiave sotto 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 fallisce all’avvio, quindi ometti le righe per i provider che non usi.

managed

Il blocco managed definisce policy di accesso basate su ruoli basate su gruppi IdP o dominio di posta elettronica. Le policy vengono valutate in ordine; la prima corrispondenza viene selezionata, quindi unita alla base catch-all match: {}. Vengono servite per utente su GET /managed/settings con caching ETag/304.
Un catch-all match: {}, convenzionalmente elencato per ultimo, viene trattato come un livello base. Ogni altra policy eredita qualsiasi chiave che non imposta dalla catch-all, quindi le voci per ruolo devono solo elencare ciò che differisce dal valore predefinito dell’organizzazione. Le regole di unione dipendono dal tipo di chiave:
  • Allow-lists: availableModels e permissions.allow. L’elenco di una policy specifica sostituisce completamente quello della base.
  • Deny-lists e hook arrays: permissions.deny, permissions.ask, disabledMcpjsonServers, deniedMcpServers, blockedMarketplaces e ogni array di tipo evento hooks. Questi prendono l’unione di base e policy, quindi un deny a livello di organizzazione o un hook di audit non può essere accidentalmente eliminato da un override per ruolo.
  • Record-typed keys: env, modelOverrides e skillOverrides. Questi si uniscono superficialmente, quindi un blocco env per ruolo sostituisce le chiavi che imposta e 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. 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.
Il gateway non mantiene una propria directory utente. Autorizza ogni richiesta dal token IdP dell’utente, leggendo l’appartenenza al gruppo dal claim groups del token e valutando le policy rispetto ad esso. Non c’è roster da enumerare e nessun account da pre-creare, e quindi nessun endpoint SCIM, perché non c’è nulla per SCIM da sincronizzare.Esegui la gestione del ciclo di vita di utenti e gruppi alla fonte della verità, che è il provisioning SCIM nativo del tuo IdP o una piattaforma dedicata di governance dell’identità. L’appartenenza e il deprovisioning governati lì fluiscono nel gateway automaticamente attraverso il token. Se vuoi il provisioning SCIM degli account Claude stessi, questa è una capacità di Claude for Enterprise.Si applicano due orologi di propagazione:
  • Contenuti della policy: modificare una policy e ridistribuire raggiunge i client connessi al loro prossimo sondaggio di impostazioni gestite, entro un’ora, a parte i cambiamenti che si applicano solo al prossimo avvio
  • Appartenenza al gruppo: cambiare l’appartenenza al gruppo di un utente cambia quale policy lo corrisponde. Questo ha effetto al prossimo rinnovo della sessione, il che significa il prossimo aggiornamento silenzioso, limitato da session.ttl_hours.

Matcher values that stop the gateway at boot

All’avvio, il gateway controlla il blocco match 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 groups vuoto
  • Una voce vuota in groups o in admin_groups
  • Un email_domain vuoto
  • Un email_domain che contiene @, spazi bianchi o una virgola. Il gateway taglia il valore e rimuove un @ iniziale prima di questo controllo. Scrivi un dominio nudo, come example.com.
Prima di v2.1.232, il gateway si avviava con questi valori. Ogni valore aveva questo effetto:
  • Un email_domain vuoto: il gateway ha saltato il controllo del dominio, quindi una policy con un email_domain vuoto e nessun elenco groups corrisponde a ogni utente autenticato
  • Un elenco groups vuoto: la policy non corrisponde a nessuno
  • Un email_domain contenente @, spazi bianchi o una virgola: la policy non corrisponde a nessuno
  • Una voce vuota in groups o in admin_groups: la voce corrisponde a un utente solo quando il claim groups dell’IdP di quell’utente conteneva anche una voce vuota. In admin_groups, quella corrispondenza ha concesso l’accesso admin. Se il tuo elenco admin_groups non ha mai contenuto una voce vuota, nessuno ha ottenuto l’accesso admin in questo modo.

What goes in cli

Ogni valore cli è un documento completo di managed-settings.json di Claude Code, lo stesso schema che distribuiresti tramite MDM o /etc/claude-code/managed-settings.json, espresso qui come YAML. La CLI applica il documento consegnato al livello gestito, sopra le impostazioni di utente e progetto, al posto delle impostazioni gestite dal server. Ignora quindi le impostazioni ristrette alle fonti 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 fallisce all’avvio con un errore che nomina ogni chiave offensiva. Le parti deliberatamente aperte dello schema accettano ancora valori arbitrari, perché i client più recenti potrebbero riconoscere voci che lo schema del gateway non riconosce. Queste chiavi aperte includono env, pluginConfigs e chiavi annidate sotto permissions. Poiché la convalida utilizza lo schema fornito con la versione installata del gateway, mettere una chiave di impostazioni di primo livello introdotta da una versione più recente di Claude Code nella configurazione gestita richiede prima l’aggiornamento del gateway. Smoke-test una nuova policy su un client prima di distribuirla. Il riferimento completo della chiave è in Claude Code settings. Le chiavi che gli operatori raggiungono per prime:
Poiché queste impostazioni arrivano sulla rete, la CLI mostra a ogni sviluppatore una finestra di dialogo di approvazione della sicurezza prima di applicare le impostazioni elencate di seguito:
  • hooks
  • Variabili env che richiedono l’approvazione dello sviluppatore, come variabili proxy e base-URL
  • impostazioni di esecuzione della shell come apiKeyHelper e statusLine
  • le impostazioni binarie della sandbox sandbox.bwrapPath, sandbox.socatPath e sandbox.ripgrep
  • Impostazioni della sandbox che intercettano il traffico, iniettano credenziali o indeboliscono l’isolamento, come sandbox.network.tlsTerminate e le impostazioni della porta proxy. Security approval dialogs le elenca tutte.
Approval memory copre quanto dura un’approvazione e quando la finestra di dialogo appare di nuovo. Claude Code applica alcune variabili env consegnate senza mostrare allo sviluppatore la finestra di dialogo di approvazione, come le impostazioni di selezione del modello e i limiti numerici. Altre variabili consegnate possono richiedere l’approvazione dello sviluppatore prima di avere effetto; un valore proxy, base-URL o OTEL_EXPORTER_OTLP_ENDPOINT non vuoto lo fa sempre. Quando una variabile consegnata ha bisogno di approvazione, la finestra di dialogo la nomina. Environment variables and the approval dialog ha i dettagli, inclusi quattro interruttori di privacy il cui valore consegnato decide se hanno bisogno di approvazione. Prima di v2.1.218, Claude Code applicava meno variabili senza chiedere allo sviluppatore, quindi più variabili consegnate attivavano la finestra di dialogo. La configurazione telemetry del gateway spinge 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 con il flag -p non può mostrare la finestra di dialogo. Applica le impostazioni spinte per quella sola esecuzione e non le registra come approvate, quindi la prossima sessione interattiva dello sviluppatore mostra comunque la finestra di dialogo per loro. Prima di v2.1.207, un’esecuzione non interattiva salvava le impostazioni come approvate e nessuna sessione interattiva successiva mostrava la finestra di dialogo per loro. Se uno sviluppatore rifiuta, Claude Code esce da quella sessione piuttosto che applicare la policy. Quando spingi un nuovo hook, o qualsiasi variabile env che attiva la finestra di dialogo, a una policy ampia, Claude Code mostra quindi la finestra di dialogo a ogni sviluppatore corrispondente. Mostra la finestra di dialogo in una sessione in esecuzione al prossimo sondaggio orario, e altrimenti all’avvio successivo dello sviluppatore. La chiave cli era denominata settings nelle versioni precedenti. Questo spelling è ancora accettato come alias, ma le nuove distribuzioni dovrebbero usare cli.

MCP servers in a policy

Per fornire server MCP ai client Claude Code che una policy corrisponde, imposta managedMcpServers 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 fallisce 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 attraverso secret expansion prima di eseguire i controlli della voce, quindi ogni client corrispondente riceve il valore letterale e può leggerlo. La header guidance for provided servers si applica al valore espanso. Il gateway rifiuta lo spelling .mcp.json mcpServers in un blocco cli, e il suo errore di avvio nomina managedMcpServers come la chiave da usare. Prima di v2.1.259, il gateway rifiutava qualsiasi definizione di server MCP in un blocco cli.

Claude Desktop overlay

Se la tua organizzazione distribuisce anche Claude Desktop, lo stesso gateway serve entrambi i client. Punta bootstrapUrl, nella managed configuration 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 rispetto a 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 porti una chiave desktop. Un desktop: {} vuoto opta una policy, e una chiave desktop sul livello base match: {} opta in ogni policy che la eredita. Il registro di audit registra ogni richiesta come desktop_bootstrap.serve o desktop_bootstrap.denied.
Il gateway deriva gran parte della risposta dal blocco cli della policy corrispondente e dalla configurazione del gateway di primo livello:
  • L’elenco dei modelli, da availableModels
  • Strumenti disabilitati, da voci permissions.deny con nome di strumento nudo. Se imposti disabledBuiltinTools nel blocco desktop della 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 tramite permissions.deny
  • L’allowlist di uscita, da sandbox.network.allowedDomains. Se imposti coworkEgressAllowedHosts nel blocco desktop della policy, il gateway usa quel valore invece dell’elenco derivato
  • Un endpoint OTLP che punta al gateway stesso, e gli attributi di identità dell’utente firmato. Il gateway inoltra le esportazioni che riceve a quell’endpoint alle tue destinazioni forward_to. Include l’endpoint e gli attributi quando imposti sia telemetry.forward_to che listen.public_url. Claude Desktop esporta ogni segnale con una codifica: http/protobuf, o http/json quando imposti OTEL_EXPORTER_OTLP_PROTOCOL o uno dei suoi varianti per segnale a http/json nel env della policy. Prima di Claude Code v2.1.261 sul server del gateway, la risposta impostava http/json indipendentemente, quindi un collettore che accetta solo protobuf rifiutava le esportazioni di Claude Desktop
Per impostare disabledBuiltinTools, coworkEgressAllowedHosts o l’impostazione managedMcpServers di Claude Desktop stesso 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 di array piuttosto che un oggetto. Il gateway omette le chiavi senza equivalente di Claude Desktop, come hooks e regole di autorizzazione con ambito come Bash(npm *), dalla risposta di bootstrap. Aggiungi il blocco desktop facoltativo insieme a cli per impostare le impostazioni di Claude Desktop direttamente. Scrivi le impostazioni dal managed configuration reference di Claude Desktop come nomi di chiave piatti. Lascia fuori le chiavi che Claude Desktop legge solo da MDM o file locali, come bootstrapUrl; il gateway le rifiuta all’avvio. 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 anche chatTabEnabled e chatAdvancedFileAnalysisEnabled all’avvio.
Ogni chiave è facoltativa; Claude Desktop applica il suo valore predefinito per qualsiasi chiave che ometti. Il gateway convalida ogni blocco desktop all’avvio rispetto allo schema di configurazione che Claude Desktop stesso usa, quindi un errore emerge all’avvio del gateway come un errore che nomina la chiave piuttosto che raggiungere ogni desktop connesso. Il gateway fallisce all’avvio quando un blocco contiene:
  • Una chiave sconosciuta
  • Una chiave riconosciuta il cui valore Claude Desktop rifiuterebbe o lascerebbe cadere silenziosamente, come un valore vuoto o un nome di sub-chiave errato all’interno di una voce annidata. Prima di v2.1.260, il gateway lasciava cadere silenziosamente un campo errato all’interno di un oggetto annidato di una voce managedMcpServers o orgPluginSettings invece di fallire all’avvio.
  • Una chiave che il gateway calcola da solo: la connessione di inferenza, l’elenco dei modelli e l’inoltro OTLP. Configura quelli attraverso upstreams, models e la sezione telemetry forward_to.
  • Un alias legacy di una chiave attuale. Nell’errore di avvio, il gateway nomina la chiave canonica da scrivere.
Se usi un valore o una forma di voce deprecata, come una voce managedMcpServers senza transport, il gateway si avvia e registra un avviso che nomina la sostituzione. Il gateway convalida un blocco desktop rispetto allo schema fornito con la sua versione installata, come fa con il blocco cli. Per consegnare un’impostazione introdotta da una versione più recente di Claude Desktop, aggiorna il gateway prima. Ad esempio, userPluginMarketplacesEnabled e userPluginUploadsEnabled hanno bisogno di Claude Code v2.1.260 o successivo sul server del gateway e Claude Desktop 1.37937.0 o successivo sulle macchine dei membri. Se imposti orgPluginSettings nel blocco desktop di una policy, il gateway lo serve nella forma di array che Claude Desktop 1.15200.0 e successivo legge. I desktop più vecchi ignorano l’array e non applicano alcuna policy di strumento plugin, quindi aggiorna i membri a 1.15200.0 o successivo prima di fare affidamento su di esso. Il gateway riempie le chiavi che il blocco desktop di una policy non imposta dal blocco desktop della catch-all match: {}, nello stesso modo in cui riempie 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 policy
  • builtinToolPolicy: se imposti uno strumento a un valore diverso da allow nella base, il gateway mantiene quel valore anche se imposti allow per lo stesso strumento in una policy per ruolo
Per ogni altra chiave, se la imposti nella policy per ruolo, il gateway usa il valore della policy per ruolo. Il gateway sostituisce un array o un oggetto annidato come banner interamente, quindi se imposti banner.text in una policy per ruolo, il gateway elimina il banner.backgroundColor della base. Se non distribuisci Claude Desktop, lascia desktop completamente fuori dalle tue policy; il gateway restituisce quindi 404 da /user/bootstrap per ogni utente.

Precedence with other managed sources

Se un dispositivo ha anche una policy consegnata da MDM o un managed-settings.json locale, le impostazioni consegnate dal gateway hanno la priorità. Precedence within the managed tier sulla pagina delle impostazioni gestite dice quando si applicano le fonti locali, e ha le chiavi che Claude Code legge da ogni fonte admin indipendentemente da quale fonte ha selezionato, come le chiavi di blocco della sandbox, forceRemoteSettingsRefresh e il 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 dice cosa sostituisce il suo output. Gli host di incorporamento come Claude Desktop possono fornire policy attraverso l’opzione SDK managedSettings. Parent settings from embedding hosts dice quando Claude Code lo applica, e Restrict parent settings elenca quali impostazioni di direzione di autorizzazione si applicano ancora 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 generate dall’Agent SDK. Se il gateway non è raggiungibile all’avvio, le sessioni firmate escono con un errore piuttosto che eseguire senza la loro policy.

telemetry

La CLI invia metriche, log e, quando abilitato, tracce al gateway, che le inoltra verbatim a ogni destinazione configurata. Le esportazioni utilizzano OpenTelemetry Protocol (OTLP) su HTTP. Per saltare l’inoltro e avere sessioni esportate direttamente al tuo collettore, nomina il collettore in una policy. Vedi Monitoring usage per le metriche e gli eventi che la CLI emette. La CLI timbra 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 costo e utilizzo per sviluppatore funziona quindi senza configurazione lato sviluppatore. Claude Desktop e le sessioni Cowork firmate attraverso il gateway timbrano la loro telemetria con user.email e user.groups insieme a enduser.id, quindi puoi coprire l’utilizzo di terminale, Desktop e Cowork con una query su user.email o user.groups. user.groups è l’elenco di gruppi IdP separato da virgole. Desktop e Cowork telemetry portano 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 di terminale timbrano lo stesso valore sotto user.id, quindi una query che corrisponde a enduser.sub rispetto al terminale user.id copre l’utilizzo di terminale, Desktop e Cowork di un utente insieme. Sulle esportazioni Desktop e Cowork, user.id è un identificatore anonimo, non il soggetto. Come tutti i dati OpenTelemetry da Claude Code, questi attributi vanno solo alle destinazioni che la tua organizzazione configura, mai ad Anthropic. Se l’elenco di gruppi di un utente è più lungo di 255 caratteri una volta codificato in percentuale, o un nome di gruppo contiene una virgola o un segno di uguale, il gateway lascia user.groups fuori dalla telemetria Desktop e Cowork di quell’utente piuttosto che troncarla. Le sessioni di terminale di quell’utente portano comunque l’elenco completo. Il gateway lascia enduser.sub fuori quando il soggetto è più lungo di 255 caratteri una volta codificato in percentuale, o contiene uno spazio, un carattere al di fuori dell’ASCII stampabile, o uno di , ; = \ " %. 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 sulla telemetria Desktop e Cowork, e Claude Desktop 1.24012 o successivo su ogni macchina dello sviluppatore per user.groups. Hai bisogno di Claude Code v2.1.274 o successivo sul server del gateway per enduser.sub.
Ogni destinazione opta in metrics, logs e traces indipendentemente, e il valore predefinito è solo metriche. I segnali differiscono in sensibilità:
  • Metrics: contatori aggregati come conteggi di token, conteggi di richieste e latenza
  • Logs and traces: possono portare comandi bash completi, input di strumenti e percorsi di file, coprendo tutto ciò che Claude Code fa sulla macchina di uno sviluppatore
Abilita log e tracce solo su destinazioni con i controlli di accesso e la policy di conservazione che i dati garantiscono.
Ogni URL forward_to deve usare https://, con un’eccezione per un collettore sull’interfaccia loopback del gateway stesso:
  • http://localhost:<port> passa la convalida della configurazione, ma la SSRF guard blocca ogni esportazione con ECONNREFUSED_SSRF a meno che non imposti CLAUDE_GATEWAY_ALLOW_LOOPBACK=1 nell’ambiente del gateway
  • http://127.0.0.1:<port> o http://[::1]:<port> fallisce all’avvio a meno che quella variabile non sia impostata
Per un collettore in-cluster, esponilo su HTTPS al suo indirizzo interno, o eseguilo come sidecar con la variabile impostata. Quando HTTPS_PROXY è impostato, il gateway invia le esportazioni attraverso quel proxy. Per raggiungere un collettore interno direttamente, aggiungilo a NO_PROXY per nome host o per un dominio con un punto iniziale come .internal.example.com, 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 un punto iniziale corrisponde solo a quel nome esatto, non ai nomi sotto di esso. Gli intervalli CIDR non corrispondono. Con proxy-only egress attivato, consenti il collettore nel proxy invece, poiché qualsiasi voce NO_PROXY mantiene l’uscita solo proxy disattivata. 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 spingendo sei variabili di ambiente attraverso /managed/settings:
  • CLAUDE_CODE_ENABLE_TELEMETRY=1
  • OTEL_METRICS_EXPORTER, OTEL_LOGS_EXPORTER e OTEL_TRACES_EXPORTER, ognuno impostato a otlp se almeno una destinazione forward_to abilita quel segnale e a none altrimenti
  • OTEL_EXPORTER_OTLP_ENDPOINT=<public_url>
  • OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
Quando aggiungi le tue etichette personalizzate](#add-your-own-labels), il gateway spinge anche OTEL_RESOURCE_ATTRIBUTES. Prima di Claude Code v2.1.265 sul server del gateway, il gateway spingeva tutti e tre i selettori di esportazione come otlp, incluso per i segnali che nessuna destinazione ha optato. L’endpoint spinto è costruito dall’URL pubblico, quindi metriche e log non hanno bisogno di configurazione OTEL da sviluppatori o policy. Gli sviluppatori firmati attraverso /login non possono reindirizzare le esportazioni con la loro configurazione OTEL:
  • Variabili impostate localmente: Claude Code applica le variabili spinte al livello gestito, quindi ognuna sostituisce il valore che uno sviluppatore imposta per essa localmente.
  • Endpoint configurati localmente: con l’esportazione OTLP/HTTP abilitata, la CLI ignora qualsiasi endpoint configurato localmente, indipendentemente dal fatto che il gateway abbia spinto le variabili di telemetria. Le sue esportazioni vanno al gateway a meno che una policy non nomini il tuo collettore come endpoint.
Senza una destinazione forward_to per un segnale, il gateway lo accetta e lo scarta. Se gli sviluppatori già esportano telemetria di Claude Code a uno dei tuoi collettori, aggiungilo come destinazione forward_to, con log o tracce abilitate se esportano quelli, in modo che continui a ricevere i loro dati dopo che si firmano. Per saltare l’inoltro invece, nomina il collettore in una policy. Traces richiedono anche CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1 su ogni client. Impostalo nel blocco env di una policy gestita, poiché il gateway non lo spinge. Gli sviluppatori lo approvano nella stessa security approval dialog che l’endpoint spinto già attiva. Impostalo a 1 solo nelle policy i cui gruppi vuoi tracciati. Una policy che non lo imposta eredita il valore dalla tua policy catch-all match: {} se quella policy ne imposta uno, per le merge rules. 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. Sia la codifica protobuf che JSON OTLP vengono inoltrate, e qualsiasi backend compatibile con OpenTelemetry funziona come destinazione.

Add your own labels

Per mettere etichette fisse come service.namespace o deployment.environment.name sulla telemetria delle sessioni firmate attraverso 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:
Il gateway rifiuta di avviarsi quando un’etichetta infrange una di queste regole, e l’errore di avvio nomina l’etichetta:
  • I nomi usano solo lettere, cifre, ., _ e -
  • I nomi non sono riservati. Confrontati in qualsiasi maiuscola, i nomi riservati sono tutto ciò che inizia con user., enduser. o identity., più service.name, service.version, claude.deployment_mode, host.arch, os.type, os.version e wsl.version
  • I valori sono ASCII stampabile non vuoto senza spazio e nessuno di , ; = \ " %
  • I valori sono al massimo 255 caratteri come il gateway li conta dopo la codifica percentuale, quindi /, : e @ contano ciascuno come tre
  • I valori sono testo, quindi cita un numero, true o false
Hai bisogno di Claude Code v2.1.281 o successivo sul server del gateway per impostare 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 di terminale firmate attraverso /login ricevono le etichette come OTEL_RESOURCE_ATTRIBUTES, spinte con le altre telemetry variables. Se imposti OTEL_RESOURCE_ATTRIBUTES nel blocco env di una policy, le sessioni di terminale che 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 metrico, quindi puoi filtrare le metriche per essa in un backend che non indicizza gli attributi di risorsa. Per disattivare quella copia, vedi Metrics cardinality control.

Export directly to your collector

Per avere sessioni firmate attraverso /login inviare telemetria direttamente al tuo collettore invece che attraverso l’inoltro, imposta OTEL_EXPORTER_OTLP_ENDPOINT all’URL base https:// del collettore nel blocco env di una managed policy. Claude Code aggiunge /v1/metrics, /v1/logs o /v1/traces all’URL che imposti, come https://otel-collector.example.com:4318, ed esporta ogni segnale lì su OTLP/HTTP. Richiede Claude Code v2.1.265 o successivo su ogni macchina dello 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 cambi questo endpoint in una policy, Claude Code chiede a ogni sviluppatore di approvarlo nella security approval dialog prima di applicarlo in una sessione interattiva. Claude Code controlla l’endpoint prima di esportare un segnale direttamente, e mantiene quel segnale sull’inoltro quando un controllo fallisce. I controlli includono:
  • L’endpoint viene dal gateway stesso. Se imposti la stessa variabile in un profilo MDM o in un managed-settings.json locale, le esportazioni rimangono sull’inoltro.
  • L’URL usa https://, o http:// a un indirizzo loopback
  • L’URL si risolve in un percorso che termina in /v1/<signal>, senza query o frammento. Claude Code costruisce quel percorso da solo dalla variabile generica. Usa una variabile per segnale come OTEL_EXPORTER_OTLP_METRICS_ENDPOINT come scritto, quindi includi il percorso completo lì.
  • 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 otelHeadersHelper in nessuna fonte di impostazioni. Con un helper configurato, ogni segnale rimane sull’inoltro.
L’endpoint che nomini cambia solo dove vanno le esportazioni. Scegli comunque quali segnali esportare affatto con i selettori 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 spinga già:
  • Se il gateway già spinge le variabili di telemetria, coprono l’abilitazione, i selettori e il protocollo, e il tuo endpoint esplicito sostituisce il valore <public_url> spinto. Imposta un selettore OTEL_*_EXPORTER a otlp tu stesso solo per un segnale che nessuna destinazione forward_to abilita.
  • Se non lo fa, imposta anche CLAUDE_CODE_ENABLE_TELEMETRY=1, i selettori OTEL_*_EXPORTER e OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf.
Quando lo sviluppatore si firma, o si firma a un gateway diverso, le esportazioni al collettore si fermano e Claude Code elimina ogni batch rimanente piuttosto che inviarlo.

When a destination fails

Il gateway non bufferizza, ritenta o archivia telemetria, quindi elimina un’esportazione che non raggiunge una destinazione piuttosto che consegnarla in ritardo. Ogni destinazione ha successo o fallisce da sola, e il client che esporta riceve una risposta di successo comunque, quindi una consegna fallita appare solo nel log del gateway. Dopo cinque consegne consecutive fallite a una destinazione, il gateway pausa l’inoltro a essa in tratti di 30 secondi, registrando ogni pausa, fino a quando una consegna ha successo. Qualsiasi risposta di errore, timeout o errore di connessione conta come una consegna fallita, tranne 400, 413, 415, 422 e 431, che significano che il collettore ha rifiutato il payload di quell’esportazione come malformato o troppo grande. Un payload rifiutato non avanza né ripristina il conteggio dei fallimenti: il gateway continua a inoltrare alla destinazione e registra un avviso che la nomina e lo stato, al primo rifiuto della destinazione e ogni centesimo dopo.

HTTP tuning

Quattro blocchi facoltativi di primo livello, access_control, limits, timeouts e rate_limits, sintonizzano la superficie HTTP. I valori predefiniti si adattano alla maggior parte delle distribuzioni. Se lasci entrambi gli elenchi access_control vuoti, 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ò spingere impostazioni gestite che eseguono comandi sulle macchine degli sviluppatori. Mentre allow_cidrs è vuoto, il gateway avverte in due posti, senza cambiare come risponde a nessuna richiesta:
  • 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/128 e fc00::/7, più qualsiasi altro intervallo interno da cui i tuoi sviluppatori si connettono. Se leghi il gateway a un indirizzo loopback e non imposti né trusted_proxies né public_url, come nello sviluppo locale, l’avviso non appare.
  • A runtime: la prima volta che una richiesta arriva da un indirizzo al di fuori di quegli intervalli privati, il gateway registra un avviso e emette un evento di audit access.public_client che porta l’IP client. Entrambi si attivano una volta per processo. Gli indirizzi link-local, 169.254.0.0/16 e fe80::/10, non contano come pubblici. Il gateway risponde a /healthz e /readyz prima che questo controllo venga eseguito, quindi i probe di salute da intervalli pubblici non lo attivano.
Entrambi i segnali usano l’indirizzo client come il gateway lo risolve. Se un load balancer, port-forward o tunnel inoltra il traffico e non è elencato in listen.trusted_proxies, il gateway vede l’indirizzo del relay, che di solito è privato, quindi né l’avviso a runtime né un elenco di autorizzazione privato lo cattura. Dietro un tale front end, imposta listen.trusted_proxies per primo in modo che il gateway veda gli indirizzi client reali, e mantieni il gateway e tutto davanti ad esso irraggiungibile da internet pubblico indipendentemente.

load_test_mode

Il blocco load_test_mode ti consente di testare il carico di un gateway senza chiamare un provider di modelli. Mentre è attivo, il gateway costruisce e firma ogni richiesta del provider come al solito, la scarta invece di inviarla, e trasmette una risposta in scatola attraverso il suo percorso di risposta normale. La risposta è testo di riempimento che inizia con una frase che dice che è in scatola. Richiede Claude Code v2.1.282 o successivo sul server del gateway. Una versione 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 trasmessi in circa 10 secondi:
Un test di carico in questa modalità copre il gateway, il tuo Postgres e tutto davanti al gateway. Non copre i limiti, la velocità o il percorso di rete del provider. Nessuna richiesta di modello viene inviata al provider, quindi la CPU di una replica per richiesta è una stima e legge inferiore alla produzione, che crittografa anche il suo traffico al provider. Conferma un conteggio di replica con un piccolo pilota rispetto al provider reale. Prima di v2.1.283, la stima legge molto più bassa. Mentre la modalità è attiva, una richiesta può portare un header x-load-test-user che contiene un numero intero di fino a sette cifre. Il gateway conta ogni numero come uno sviluppatore separato, con l’email e i gruppi dello sviluppatore il cui token è venuto con la richiesta. Dai alla distribuzione del test di carico il suo database vuoto, perché il gateway rifiuta di avviarsi con la modalità attiva rispetto a un database in cui uno sviluppatore ha già speso qualcosa.
Non attivare mai questo per un gateway che gli sviluppatori usano. Ogni richiesta ottiene la risposta in scatola e nessun modello viene chiamato. Il gateway registra un avviso load_test_mode is on all’avvio e contrassegna ogni evento di audit inference con load_test: true mentre la modalità è attiva.

Esempio completo

Questo config di riferimento completo esercita ogni sezione principale; i blocchi di sintonizzazione HTTP mantengono i loro valori predefiniti. Copiatelo, eliminate ciò che non vi serve e riempite i vostri valori. La configurazione nella Guida rapida è una versione minima di questa.
gateway.yaml

Impostazioni gestite lato client

Tutto quanto sopra configura il server gateway. Puntate le macchine degli sviluppatori al gateway separatamente, su ogni dispositivo, attraverso le impostazioni gestite di Claude Code. Il gateway non può inviare le chiavi di accesso stesso, perché sono loro che indicano al client dove si trova il gateway. Per la CLI, impostate queste chiavi nel file managed-settings.json per ogni sistema operativo. Le due chiavi di accesso instradano il /login di ogni sviluppatore al vostro gateway:
parentSettingsBehavior: "merge" mantiene il funzionamento della consegna della lista di egress di Claude Desktop alle sue sessioni Claude Code incorporate; Deliver policy to Claude Desktop sessions spiega il meccanismo e dove deve trovarsi l’opt-in. Distribuite il file managed-settings.json a ogni dispositivo, tipicamente tramite la vostra piattaforma MDM. Il percorso del file differisce per piattaforma. Consultate 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 piuttosto che unirsi ad esso, ad eccezione delle chiavi di eccezione e dei controlli tra fonti sopra. Tutte e tre le chiavi in questo frammento seguono la regola della fonte con priorità più alta, quindi i fleet che distribuiscono la policy tramite Group Policy o profili di configurazione devono inserire tutte e tre in quel meccanismo invece. Per Claude Desktop, impostate la chiave bootstrapUrl nella propria 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. Consultate Claude Desktop overlay per la metà lato server. Claude Code rispetta forceLoginGatewayUrl, gatewayInternalNetworks, e il valore "gateway" di forceLoginMethod solo da una fonte gestita sulla macchina: managed-settings.json, il plist macOS o il registro HKLM di Windows, o un policy helper. Uno sviluppatore che li imposta nel proprio ~/.claude/settings.json non ha alcun effetto, e nemmeno impostarli nel payload del gateway.