Configurazione del gateway delle app Claude
Riferimento per ogni opzione di gateway.yaml: listener e TLS, OIDC, sessione, archivio Postgres, upstream Amazon Bedrock, Claude Platform su AWS, Agent Platform di Google Cloud e Microsoft Foundry, routing dei modelli, criteri gestiti e telemetria.
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 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
Sezioni facoltative:
admin: 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 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:
| Modulo | Si risolve in | Usare per |
|---|---|---|
${VAR} |
La variabile di ambiente VAR. L'avvio fallisce se non definita. |
Variabili di ambiente del contenitore, AWS Secrets Manager tramite iniezione env |
${file:/path} |
Contenuti del file al percorso assoluto specificato, ritagliati. Il riferimento deve essere l'intero valore del campo: a differenza di ${VAR}, non viene espanso all'interno di una stringa più lunga, quindi per una password del database impostare store.password piuttosto che incorporarla in postgres_url. |
Montaggi di volumi Kubernetes Secret, Vault Agent, SOPS |
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.
| Campo | Obbligatorio | Descrizione |
|---|---|---|
host |
No | Indirizzo di binding. Predefinito 0.0.0.0. |
port |
No | Porta di binding. Predefinito 8080. |
public_url |
A meno che host non sia loopback |
L'origine https:// visibile esternamente, utilizzata per costruire il redirect_uri dell'IdP e i metadati di scoperta. Obbligatorio ogni volta che host non è un indirizzo loopback, sia che TLS termini a un proxy come un ALB, Ingress o Cloud Run o al gateway stesso tramite tls, perché il gateway non deriva mai la sua stessa origine dagli header X-Forwarded-*; sono falsificabili dal client. L'avvio fallisce senza di esso. trusted_proxies di seguito governa solo la risoluzione dell'IP del client. Obbligatorio anche per abilitare la telemetria, perché il gateway costruisce l'endpoint OTLP che spinge ai client da questo URL. |
tls.cert / tls.key |
No | Percorsi PEM se il gateway termina TLS stesso |
trusted_proxies |
No | CIDR o IP dei load balancer davanti al gateway. Quando impostato, il gateway si fida di X-Forwarded-For solo da questi peer e registra l'IP client reale per il rate limiting per IP e l'audit. Equivalente a nginx set_real_ip_from. Le voci X-Forwarded-For scritte come ipv4:port o [ipv6]:port, come fanno alcuni load balancer, vengono lette con la porta eliminata. Un indirizzo IPv6 con una porta aggiunta e senza parentesi può essere letto come un indirizzo diverso o non letto affatto, quindi disattiva l'opzione della porta su qualsiasi proxy che scrive 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.
| Campo | Obbligatorio | Descrizione |
|---|---|---|
issuer |
Sì | Base di scoperta OIDC. Deve servire la scoperta su /.well-known/openid-configuration. Usa HTTPS in produzione; il gateway accetta un emittente http://. Un emittente loopback come http://localhost:8081 è rifiutato dalla guardia SSRF a meno che CLAUDE_GATEWAY_ALLOW_LOOPBACK=1 non sia impostato nell'ambiente del gateway. |
client_id / client_secret |
Sì | Dalla tua registrazione del client OAuth |
allowed_email_domains |
No | Rifiuta gli id_token il cui claim email non è in uno di questi domini, senza distinzione tra maiuscole e minuscole. Difesa in profondità contro la configurazione errata dell'IdP multi-tenant. Indipendentemente da questa impostazione, un id_token il cui claim email_verified è esplicitamente false è sempre rifiutato. |
allowed_groups |
No | Limita l'accesso ai membri di questi gruppi IdP, abbinati rispetto a groups_claim. Un utente in un dominio email consentito ma in nessuno di questi gruppi è rifiutato. Richiede che l'IdP emetta il claim dei gruppi. L'abbinamento è un confronto di stringhe esatto e case-sensitive rispetto ai valori in quel claim, e il gateway non espande i gruppi annidati: per ammettere i membri di un sottogruppo, elenca il sottogruppo qui o configura l'IdP per emettere l'appartenenza appiattita. |
groups_claim |
No | Quale claim dell'id_token porta l'appartenenza al gruppo. Predefinito groups. Microsoft Entra emette i ruoli dell'app sotto roles. Accetta una chiave flat o un JSON Pointer RFC 6901 come /resource_access/gateway/roles per i claim annidati. |
google_groups |
No | Cerca i gruppi dell'utente che ha effettuato l'accesso tramite la Directory API del Google Workspace Admin SDK, perché l'id_token di Google non porta alcun claim di gruppi. Imposta service_account_json_path su un file di chiave dell'account di servizio con delega a livello di dominio sullo scope https://www.googleapis.com/auth/admin.directory.group.readonly e admin_email su un amministratore di Workspace che l'account di servizio impersona; la Directory API richiede un soggetto amministratore reale. Gli indirizzi email dei gruppi di ogni utente diventano il suo claim di gruppi, quindi allowed_groups e managed.policies.match.groups corrispondono agli indirizzi email dei gruppi. |
email_claim |
No | Quale claim dell'id_token porta l'email dell'utente. Predefinito email. Alcuni IdP, come ADFS ed Entra B2C, emettono invece upn o preferred_username. Accetta una chiave flat, un JSON Pointer o un elenco di chiavi di fallback dove viene utilizzata la prima chiave presente. |
scopes |
No | Override completo degli scope OIDC che il gateway richiede. Predefinito [openid, profile, email, offline_access]. Impostalo quando il tuo IdP rifiuta gli scope che non riconosce o richiede uno scope personalizzato per emettere gruppi o email. Deve includere openid. Eliminare offline_access disabilita i token di aggiornamento, quindi gli sviluppatori rieseguono l'accesso nel browser ogni session.ttl_hours. Consulta Configurazione del provider di identità per ricette di scope per IdP come il flusso dei token di aggiornamento di Google. |
scope_on_refresh |
No | Invia anche scope, con lo stesso elenco della richiesta di accesso, quando il gateway scambia un token di aggiornamento. Predefinito false: la richiesta di aggiornamento omette scope. La maggior parte degli IdP restituisce un id_token ad ogni aggiornamento e non ne ha bisogno. Imposta true quando il tuo IdP restituisce un id_token all'aggiornamento solo se gli viene richiesto di nuovo openid, cosa che Okta documenta per il suo grant di aggiornamento. Senza un id_token, ogni aggiornamento dipende dal fatto che l'endpoint userinfo dell'IdP accetti il token di accesso aggiornato. Se limiti l'accesso o abbini le policy in base ai gruppi e l'id_token dell'IdP al momento dell'aggiornamento li omette, imposta anche userinfo_fallback: true in modo che il gateway li recuperi dall'endpoint userinfo. Un IdP che ha concesso meno scope di quelli richiesti può rifiutare l'aggiornamento con invalid_scope, anche per le sessioni esistenti se aggiungi voci a scopes mentre questa opzione è attiva. Rimuovi la chiave se gli aggiornamenti iniziano a fallire su token_endpoint dopo averla impostata. Richiede Claude Code v2.1.260 o successivo sul server del gateway. |
extra_auth_params |
No | Parametri di query extra aggiunti alla richiesta di autorizzazione dell'IdP, testualmente. Questo è il meccanismo di override per il comportamento specifico dell'IdP, come access_type: offline per i token di aggiornamento di Google, domain_hint per alcuni tenant Entra o acr_values per i flussi step-up. Non può sovrascrivere i parametri del protocollo gestiti dal gateway: state, nonce, redirect_uri, PKCE, scope, response_type, response_mode e client_id. |
userinfo_fallback |
No | Quando l'id_token omette email o gruppi, recuperali da /userinfo. Necessario per i token di accesso leggeri di Keycloak, il server org di Okta e i token minimi di ADFS. L'id_token rimane autorevole; userinfo riempie solo i vuoti. Predefinito false. |
use_pkce |
No | Invia una sfida PKCE (S256) sulla richiesta di autorizzazione. Predefinito true. Imposta false solo se il tuo IdP rifiuta PKCE per questo client confidenziale. |
clock_skew_seconds |
No | Tollera la deriva dell'orologio quando si convalidano i claim temporali dell'id_token. Predefinito 0, che è rigoroso. Aumentalo se vedi errori "token scaduto / non ancora valido" subito dopo l'accesso a causa della deriva dell'orologio tra host e IdP. |
token_endpoint_auth_method |
No | Override del metodo di autenticazione dell'endpoint del token. Accetta client_secret_basic o client_secret_post. Negoziato automaticamente per impostazione predefinita. |
id_token_signed_response_alg |
No | Algoritmo di firma dell'id_token previsto. Predefinito RS256. Impostalo per gli IdP che firmano con ES256, PS256 o EdDSA. |
additional_authorized_parties |
No | Valori azp extra da accettare oltre a client_id, per i flussi di broker e scambio di token di Keycloak |
discovery_url |
No | Recupera il documento di scoperta da questo URL invece di derivarlo da issuer, per gli IdP dietro un proxy che riscrive l'host dell'emittente. Il percorso deve contenere /.well-known/. |
use_proxy |
No | Invia le richieste IdP del gateway stesso attraverso il forward proxy in HTTPS_PROXY o HTTP_PROXY, rispettando NO_PROXY. false mantiene quelle richieste dirette. Richiede v2.1.227 o successivo; consulta Richieste IdP attraverso un forward proxy di seguito. |
form_action_origins |
No | Origini aggiuntive per la direttiva Content-Security-Policy: form-action della pagina /device. Il gateway consente già 'self' e l'origine dell'authorization_endpoint scoperta, ma Chrome applica form-action all'intera catena di reindirizzamento. Se il tuo IdP reindirizza attraverso un secondo host, come Azure AD federato ad ADFS, Okta hub-spoke o un intercettore SSO aziendale, elenca ogni origine attraverso cui la richiesta di autorizzazione può essere reindirizzata. |
ca_cert_pem |
No | Il certificato CA codificato in PEM stesso, non un percorso a un file. Sostituisce l'archivio di attendibilità del sistema solo per le richieste IdP. Per caricare un file montato, scrivi ${file:/etc/gateway/idp-ca.pem}. Usalo per Keycloak o Dex dietro una PKI aziendale. |
Richieste IdP attraverso un forward proxy
Gli upstream di inferenza rispettano HTTPS_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
Imposta CLAUDE_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.
export HTTPS_PROXY=http://proxy.corp.example.com:3128
export NO_PROXY=
export no_proxy=
export CLAUDE_GATEWAY_PROXY_IS_EGRESS_BOUNDARY=1
Il gateway registra una riga 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.
| Richiesta in uscita | Predefinito | Egress solo tramite proxy attivo |
|---|---|---|
Upstream provider: anthropic, scambio di token Workload Identity Federation, esportazioni telemetry.forward_to |
Risolto e controllato localmente, quindi CONNECT verso l'indirizzo IP controllato attraverso il proxy. Un collettore di telemetria elencato in NO_PROXY viene invece raggiunto direttamente |
Nome host consegnato al proxy |
| Scoperta IdP, JWKS, token e userinfo | Diretto a meno che oidc.use_proxy: true, quindi CONNECT verso l'indirizzo IP controllato |
Nome host consegnato al proxy, a meno che oidc.use_proxy: false non mantenga diretto un IdP interno |
| Upstream Amazon Bedrock, Claude Platform on AWS, Agent Platform di Google Cloud e Microsoft Foundry; ricerche di gruppi Google | Nome host consegnato al proxy | Invariato |
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.
Quando una di queste condizioni non è soddisfatta, il gateway registra un avviso all'avvio indicando la variabile che l'ha impedito e mantiene il comportamento predefinito.
Una volta attivo l'egress solo tramite proxy, consenti nel proxy ogni destinazione, incluso un collettore interno e qualsiasi host configurato per indirizzo IP. Puoi comunque mantenere diretto un IdP interno con oidc.use_proxy: false.
Attiva questa opzione solo quando l'allowlist del proxy è rigorosa almeno quanto il 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 del proxy stesso, e deve rifiutarli in base all'indirizzo in cui un nome si risolve, non solo in base al nome, perché il gateway non intercetta più un nome host che si risolve in uno di essi. Un proxy che si connette ovunque gli venga chiesto rimuove la guardia SSRF del gateway per queste richieste.
`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.
| Campo | Obbligatorio | Descrizione |
|---|---|---|
jwt_secret |
Sì | Almeno 32 byte di entropia, ad esempio da openssl rand -base64 32. Firma i token bearer HS256 del gateway. Accetta una singola stringa o un array per la rotazione: l'indice 0 firma e tutte le voci verificano. Per ruotare, anteponi un nuovo segreto, attendi ttl_hours, quindi elimina quello vecchio. |
ttl_hours |
No | Durata del token bearer del gateway. Predefinito 1. La CLI aggiorna silenziosamente prima della scadenza quando l'IdP emette token di aggiornamento. Una durata più breve revoca l'accesso più velocemente; una più lunga richiede meno round-trip verso l'IdP. Se il tuo IdP non può emettere token di aggiornamento perché offline_access non è disponibile, non c'è aggiornamento silenzioso, quindi aumentalo a 8 o 12 per evitare di rimandare gli sviluppatori all'accesso nel browser ogni ora. |
`store`
Il blocco store punta il gateway al suo database PostgreSQL, che contiene le concessioni dei dispositivi e i contatori dei rate limit.
| Campo | Obbligatorio | Descrizione |
|---|---|---|
postgres_url |
Sì | URL postgres:// o postgresql://. Obbligatorio: il punto d'incontro della concessione del dispositivo, dove il callback del browser scrive e la CLI in polling legge, richiede uno stato condiviso tra repliche. Il gateway esegue le proprie migrazioni dello schema all'avvio e all'aggiornamento, quindi il ruolo ha bisogno dei diritti per creare e modificare tabelle sullo schema di destinazione. Consulta Aggiornamenti e Postgres. |
username |
No | Sovrascrive l'utente in postgres_url |
password |
No | Credenziale del database. Impostala qui anziché in postgres_url in modo che la credenziale rimanga fuori dall'URL. Accetta qualsiasi carattere e ha la precedenza sulle credenziali dell'URL. |
max_connections |
No | Dimensione del pool di connessioni Postgres per replica. Predefinito 5, che è conservativo e adatto ai database condivisi. Con i limiti di spesa abilitati, il percorso critico esegue alcune operazioni per richiesta di inferenza, quindi aumentalo per un database dedicato sotto carico e mantieni repliche × questo valore al di sotto del max_connections del database. |
connect_timeout_seconds |
No | Secondi che il gateway attende quando apre una connessione Postgres. Un numero intero da 1 a 60, predefinito 5. Aumentalo se i tentativi di connessione vanno in timeout quando si avvia una nuova istanza del gateway. Richiede Claude Code v2.1.274 o successivo sul server del gateway. Le versioni precedenti si rifiutano di avviarsi quando la chiave è impostata. |
readiness_grace_seconds |
No | Per quanti secondi /readyz continua a segnalare lo stato di pronto dopo che Postgres smette di rispondere. Un numero intero da 0 a 3600, predefinito 0. Consulta Comportamento in caso di interruzione per come scegliere un valore. Richiede Claude Code v2.1.282 o successivo sul server del gateway. Le versioni precedenti si rifiutano di avviarsi quando la chiave è impostata. |
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.
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 la credenziale usata dal gateway verso quell'upstream non ha funzionato. 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 proprio 502, 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, nell'ordine, l'ultimo401o403, l'ultimo404e l'ultimo501. Quando nessuno ha restituito nessuno di questi, il502del gateway stesso,all upstreams failed (N attempted), dove N conta ogni voce inupstreams, 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 mantenga anche 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, Agent Platform di Google Cloud e Microsoft Foundry possono indicare i tuoi ID account, ARN di ruolo e ID 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:
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.
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 il gateway v2.1.233 o successivo.
API Anthropic
L'upstream Anthropic minimo è una chiave API dalla Claude Console:
upstreams:
- provider: anthropic
auth:
api_key: ${ANTHROPIC_API_KEY}
# OR an OAuth bearer (e.g. a Workload-Identity-Federation-exchanged token):
# oauth_token: ${file:/var/run/secrets/anthropic-oauth-token}
# base_url: https://api.anthropic.com # default; override for a forward proxy
Le due forme di credenziale differiscono nell'header che inviano:
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.
Invece di una chiave statica o di un bearer, puoi usare Workload Identity Federation. Crea una regola di federazione seguendo la guida a Workload Identity Federation, quindi monta come file il JWT OIDC del tuo workload, ad esempio un token dell'account di servizio proiettato di Kubernetes o l'id-token di una piattaforma CI. Il gateway scambia il JWT con un bearer a breve durata e lo aggiorna automaticamente. Il file del token viene riletto a ogni scambio, quindi i token proiettati ruotati vengono acquisiti senza un riavvio.
upstreams:
- provider: anthropic
auth:
federation_rule_id: ${ANTHROPIC_FEDERATION_RULE_ID}
organization_id: ${ANTHROPIC_ORGANIZATION_ID}
identity_token_file: /var/run/secrets/anthropic/id-token
# workspace_id: wrkspc_... # required if the rule covers >1 workspace
# service_account_id: svac_... # optional expected-target check
Header di identità per utente per un proxy che gestisci
Puoi puntare il base_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:
upstreams:
- provider: anthropic
base_url: https://upstream-gateway.internal.example.com
auth:
api_key: ${PROXY_KEY}
forward_user_identity: true # default false
Il gateway aggiunge questi header a ogni richiesta che inoltra a quell'upstream.
| Header | Valore |
|---|---|
x-litellm-end-user-id |
L'email dello sviluppatore, quando l'IdP l'ha fornita. |
x-claude-gateway-user-id |
Il soggetto IdP dello sviluppatore, dal claim sub del token. |
x-claude-gateway-user-email |
L'email dello sviluppatore, quando l'IdP l'ha fornita. |
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.
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.
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:
upstreams:
- provider: bedrock
region: us-east-1
auth: {} # preferred: AWS default credential chain
# OR explicit credentials:
# auth:
# aws_access_key_id: ${AWS_AKID}
# aws_secret_access_key: ${AWS_SK}
# aws_session_token: ${AWS_ST}
# OR a Bedrock API bearer token:
# auth:
# aws_bearer_token: ${AWS_BEARER_TOKEN}
# Override the bedrock-runtime endpoint for FIPS or VPC-endpoint deployments:
# base_url: https://bedrock-runtime-fips.us-east-1.amazonaws.com
Un blocco 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.
| Configurazione | Come |
|---|---|
| Permessi IAM | Concedi al principal del gateway bedrock:InvokeModel e bedrock:InvokeModelWithResponseStream sia sugli ARN dei profili di inferenza sia sugli ARN dei modelli di fondazione sottostanti. Per il catalogo integrato nelle regioni US: arn:aws:bedrock:<region>:<account>:inference-profile/us.anthropic.* e arn:aws:bedrock:*::foundation-model/anthropic.*. Concedi anche bedrock:CountTokens sugli ARN dei modelli di fondazione. Il gateway lo usa, senza costi, per contare i token di input di una richiesta abbandonata dal client, in modo che i limiti di spesa rimangano accurati. Senza di esso il gateway usa come fallback una richiesta Bedrock da un token per quel conteggio. |
| Accesso al modello | Amazon Bedrock abilita l'accesso ai modelli per impostazione predefinita nelle regioni commerciali. L'unico vincolo rimanente a livello di account è il modulo una tantum di Anthropic sul caso d'uso: se nessuno nel tuo account AWS l'ha inviato, apri la console di Amazon Bedrock, seleziona un modello Anthropic dal catalogo dei modelli e completa il modulo. Consulta Inviare i dettagli del caso d'uso per il modulo di AWS Organizations e i permessi di cui ha bisogno chi lo invia. |
| EKS (IRSA) | Crea un ruolo IAM con la policy sopra e una trust policy per il provider OIDC del tuo cluster limitata all'account di servizio del gateway. Annota l'account di servizio con eks.amazonaws.com/role-arn: arn:aws:iam::<acct>:role/claude-gateway. auth: {} lo rileva. |
| ECS / EC2 | Associa il ruolo IAM alla definizione dell'attività o al profilo dell'istanza. auth: {} lo rileva. |
| Altrove | Passa le credenziali tramite le variabili d'ambiente AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY e AWS_SESSION_TOKEN, oppure impostale esplicitamente in auth: con l'espansione ${VAR} |
| Regione | region: è la regione dell'endpoint API. I profili di inferenza cross-region instradano all'interno dell'area geografica (US, EU, APAC) indipendentemente da quale scegli. Per le regioni non US o gli ARN di throughput provisioned, aggiungi un blocco models: con gli ID per upstream corretti. |
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 blocco guardrail a quell'upstream. Richiede Claude Code v2.1.281 o successivo sul server del gateway.
upstreams:
- provider: bedrock
region: us-east-1
auth: {}
guardrail:
id: gr-abc123 # guardrail ID or full ARN
version: "1" # a published version number, or DRAFT
# keep the quotes: a bare 1 fails at boot
Il gateway non supporta i tag di input dei guardrail. Non aggiunge tag di contenuto guard ai prompt, quindi un filtro del guardrail che Amazon Bedrock applica solo all'input con tag non viene eseguito sul traffico che passa per il gateway. Per sapere quali filtri dipendono dai tag di input, consulta input tags nella documentazione di Amazon Bedrock.
Concedi anche 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.
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.
Bedrock in un altro account AWS
Imposta assume_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.
upstreams:
- name: bedrock-isolated
provider: bedrock
region: us-east-1
auth: {} # the gateway's own role: it only calls STS
assume_role:
role_arn: arn:aws:iam::222222222222:role/claude-gateway-bedrock
# external_id: ${BEDROCK_ROLE_EXTERNAL_ID} # when the role's trust policy requires one
Il blocco assume_role accetta tre chiavi:
| Chiave | Significato |
|---|---|
role_arn |
Il ruolo IAM che il gateway assume, come ARN arn:aws:iam:: o arn:aws-us-gov:iam::. Assegnagli i permessi Bedrock di cui questo upstream ha bisogno, bedrock:CountTokens incluso, più bedrock:ApplyGuardrail quando l'upstream imposta guardrail. |
external_id |
Facoltativo. Inviato come external ID in ogni chiamata sts:AssumeRole. Impostalo quando la trust policy del ruolo lo richiede, e mettilo tra virgolette se è composto solo da cifre. |
session_name |
Facoltativo. email o sub assegna a ogni sviluppatore la propria sessione: consulta Attribuzione dei costi AWS per sviluppatore. Se non impostato, ogni richiesta usa un'unica sessione denominata claude-apps-gateway. |
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.
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": { "AWS": "arn:aws:iam::111111111111:role/claude-gateway" },
"Action": "sts:AssumeRole",
"Condition": { "StringEquals": { "sts:ExternalId": "your-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_rolesi applica solo aprovider: bedrocke richiede credenziali di origine SigV4: il gateway si rifiuta di avviarsi quando è impostato insieme aaws_bearer_token.- Ogni sviluppatore ammesso dal gateway può usare questo upstream;
managedstabilisce quali sviluppatori possono usare quali modelli. Per evitare che un modello servito tramite il ruolo venga servito anche da un altro account, assegnagli un id personalizzato la cui mappaupstream_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. I nomi dei modelli integrati vengono comunque provati su ogni upstream in ordine, questo incluso, e una richiesta che lo raggiunge viene firmata con lo stesso ruolo, quindi elenca questo upstream per ultimo a meno che anche il suo account non debba servirli.
Questo esempio assegna a un modello un id personalizzato che solo l'upstream isolato serve:
models:
- id: claude-opus-restricted # a custom id, not a built-in model name
upstream_model:
bedrock-isolated: us.anthropic.claude-opus-4-8 # the only upstream that serves it
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. Aggiungi session_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.
upstreams:
- provider: bedrock
region: us-east-1
auth: {} # the gateway's own role: it only calls STS
assume_role:
role_arn: arn:aws:iam::123456789012:role/claude-gateway-bedrock-user
session_name: email # or sub
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.
Per un'attribuzione rigorosa per sviluppatore, imposta assume_role con session_name su ogni upstream Bedrock che elenchi. Un upstream senza di esso firma le richieste che serve con le proprie credenziali.
Claude Platform on AWS
Claude Platform on AWS serve l'API Anthropic di prima parte su infrastruttura AWS all'indirizzo aws-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:
upstreams:
- provider: anthropicAws
region: us-east-1
workspace_id: wrkspc_...
auth:
api_key: ${ANTHROPIC_AWS_API_KEY} # sent as x-api-key
# OR SigV4 via the AWS default credential chain:
# auth: {}
# OR explicit SigV4 credentials:
# auth:
# aws_access_key_id: ${AWS_ACCESS_KEY_ID}
# aws_secret_access_key: ${AWS_SECRET_ACCESS_KEY}
# Override the derived endpoint:
# base_url: https://aws-external-anthropic.us-east-1.api.aws
La piattaforma viene eseguita in un account AWS separato da Amazon Bedrock e firma le richieste SigV4 per il proprio nome di servizio, 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.
| Campo | Obbligatorio | Descrizione |
|---|---|---|
region |
Sì | Regione AWS, lettere minuscole, cifre e trattini. Il gateway ne deriva l'endpoint come https://aws-external-anthropic.<region>.api.aws. |
workspace_id |
Sì | Inviato come header in ogni richiesta; la piattaforma lo richiede |
auth.api_key |
No | Chiave API per la piattaforma, inviata come x-api-key. Non è un token bearer: le due modalità di autenticazione sono una chiave API o SigV4. |
auth.aws_access_key_id / auth.aws_secret_access_key |
No | Credenziali SigV4 esplicite. Impostarne una senza l'altra causa un errore all'avvio. auth.aws_session_token è accettato insieme a esse. |
base_url |
No | Override dell'endpoint derivato |
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:
upstreams:
- provider: vertex
region: us-east5
project_id: example-prod
auth: {} # preferred: Application Default Credentials
# OR a service account key file:
# auth: { service_account_json: /secrets/sa.json }
# Override the aiplatform endpoint for Private Service Connect:
# base_url: https://us-east5-aiplatform.p.googleapis.com
Un blocco 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.
| Configurazione | Come |
|---|---|
| Permessi IAM | Concedi all'account di servizio del gateway roles/aiplatform.user sul progetto, o un ruolo personalizzato con aiplatform.endpoints.predict. Abilita l'API di Agent Platform di Google Cloud (aiplatform.googleapis.com). |
| Accesso al modello | In Model Garden, abilita i modelli Claude per il tuo progetto. Vengono pubblicati in regioni specifiche; controlla la scheda del modello per le regioni supportate. |
| GKE (Workload Identity) | Associa un account di servizio GCP all'account di servizio Kubernetes del gateway e annota il KSA con iam.gke.io/gcp-service-account: claude-gateway@<proj>.iam.gserviceaccount.com. auth: {} lo rileva. |
| Cloud Run / GCE | Imposta come account di servizio del servizio uno con roles/aiplatform.user. auth: {} lo rileva. |
| Altrove | auth: { service_account_json: /secrets/sa.json }, il percorso di un file di chiave JSON montato come segreto. Il campo accetta un percorso di file, non il contenuto della chiave, quindi non è coinvolta alcuna espansione ${file:…}. |
Microsoft Foundry
Per la distribuzione di Microsoft Foundry lato client, consulta Claude Code su Microsoft Foundry. L'upstream lato gateway:
upstreams:
- provider: foundry
resource: example-foundry # https://example-foundry.services.ai.azure.com
auth: { use_azure_ad: true } # preferred: DefaultAzureCredential / Managed Identity
# OR an API key:
# auth:
# api_key: ${FOUNDRY_API_KEY}
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.
| Configurazione | Come |
|---|---|
| RBAC | Concedi all'identità del gateway Azure AI User o Cognitive Services User sulla risorsa Microsoft Foundry |
| Deployment | Microsoft Foundry usa nomi di deployment scelti dall'amministratore, non ID modello canonici. Aggiungi un blocco models: che mappa ogni ID canonico al nome del tuo deployment. |
| AKS (workload identity) | Federa una User-Assigned Managed Identity con l'emittente OIDC del cluster e associala all'account di servizio del gateway. use_azure_ad: true la rileva tramite WorkloadIdentityCredential. |
| ACI / App Service | Abilita l'identità gestita assegnata dal sistema o dall'utente sulla risorsa. use_azure_ad: true la rileva. |
| Altrove | auth: { api_key: "${FOUNDRY_API_KEY}" }. Metti tra virgolette ${…} dentro { }. |
Header statici sulle richieste upstream
Per aggiungere header fissi alle richieste che il gateway invia a un upstream, imposta headers: 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:
upstreams:
- provider: vertex
region: us-east5
project_id: example-prod
base_url: https://upstream-proxy.internal.example.com
auth: {}
headers:
x-source: claude-apps-gateway
x-proxy-token: ${PROXY_TOKEN}
I valori sono testo ASCII stampabile senza spazi all'inizio o alla fine. Metti tra virgolette un numero, 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:
| Richiesta che il gateway invia a questo upstream | Include headers: |
|---|---|
/v1/messages, in streaming o meno, e /v1/messages/count_tokens |
Sì |
| Una richiesta che ha eseguito il failover da un altro upstream | Sì, solo gli headers: di questo upstream |
La chiamata CountTokens di Amazon Bedrock per una richiesta abbandonata dal client |
No |
| Lo scambio di token Workload Identity Federation | No |
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 un name: 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.
Ogni richiesta inizia dal primo upstream. Una richiesta raggiunge un upstream successivo solo quando ogni upstream che lo precede ha fallito o non serve il modello richiesto.
Il gateway non tiene traccia degli upstream falliti, quindi mentre un upstream non è disponibile, ogni richiesta che lo raggiunge lo prova comunque e attende che fallisca prima di passare al successivo.
Per un upstream API Anthropic, timeouts.upstream_ttfb_ms limita l'attesa su un upstream non disponibile. Questa impostazione non si applica agli altri provider, dove il gateway attende fino a un'ora che un upstream inizi a rispondere.
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:
upstreams:
# Primary: provisioned throughput in your home region.
- name: bedrock-pt
provider: bedrock
region: us-east-1
auth: {}
# Overflow: on-demand cross-region.
- name: bedrock-od
provider: bedrock
region: us-west-2
auth: {}
# Different account: a separate Bedrock allotment via static keys.
- name: bedrock-acct2
provider: bedrock
region: us-east-1
auth:
aws_access_key_id: ${ACCT2_AKID}
aws_secret_access_key: ${ACCT2_SK}
# Last resort: direct Anthropic API.
- name: anthropic-fallback
provider: anthropic
auth:
api_key: ${ANTHROPIC_API_KEY}
# Per-upstream model IDs are keyed on the upstream's `name:`.
models:
- id: claude-opus-4-8
label: Claude Opus 4.8
upstream_model:
bedrock-pt: arn:aws:bedrock:us-east-1:111111111111:provisioned-model/abcdef
bedrock-od: us.anthropic.claude-opus-4-8
bedrock-acct2: us.anthropic.claude-opus-4-8
anthropic-fallback: claude-opus-4-8
| Leva | Come |
|---|---|
| Regioni diverse | Un upstream Amazon Bedrock per regione, ciascuno con la propria region:. Con auto_include_builtin_models: true i profili di inferenza cross-region instradano automaticamente; per i deployment vincolati a una regione usa un blocco models:. |
| Account diversi | Un upstream Amazon Bedrock per account. La catena predefinita (auth: {}) usa l'identità del pod; per un secondo account, aggiungi assume_role per raggiungerlo con credenziali a breve durata, oppure imposta credenziali esplicite o un token bearer in auth:. |
| Throughput provisioned | Mappa il modello all'ARN di throughput provisioned in models: per il nome di quell'upstream. Gli altri upstream mantengono l'ID on-demand, quindi la capacità PT viene esaurita prima del failover. |
| Endpoint VPC / FIPS | Imposta base_url: sull'upstream all'URL del tuo endpoint VPC o FIPS |
| Instradamento limitato al modello | Solo un id di modello personalizzato, cioè non un modello Claude integrato, salta gli upstream assenti dalla sua mappa upstream_model:. Il gateway prova i modelli integrati su ogni upstream in ordine e usa l'ID predefinito del provider dove la mappa non ha una voce, quindi per i modelli integrati la mappa cambia quale ID riceve un upstream anziché se venga provato; un upstream che rifiuta l'ID segue le stesse regole di failover di qualsiasi altro errore dell'upstream. |
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 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 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.
admin:
# Named static API keys for the admin endpoints, sent as x-api-key.
# The id appears in the audit log as admin-key:<id> so each key is
# attributable. Array for rotation: add the new key, roll clients,
# remove the old.
write_keys:
- { id: terraform, key: "${GATEWAY_ADMIN_WRITE_KEY_TF}" }
- { id: ci, key: "${GATEWAY_ADMIN_WRITE_KEY_CI}" }
read_keys:
- { id: reporting, key: "${GATEWAY_ADMIN_READ_KEY}" }
# IdP groups granted full admin via the normal gateway JWT (no API key).
admin_groups: [platform-finops]
blocked_message: request an increase at https://go.example.com/claude-limits
| Campo | Obbligatorio | Descrizione |
|---|---|---|
write_keys |
No | Array di {id, key}. Un x-api-key che corrisponde a uno di questi può elencare, impostare ed eliminare i limiti di spesa. I valori delle chiavi devono essere almeno 32 caratteri; gli id devono essere univoci tra read_keys e write_keys. |
read_keys |
No | Array di {id, key}. Sola lettura: ogni endpoint GET, incluso l'elenco dei cap, il recupero di uno per ID e la lettura di /effective e /audit. |
admin_groups |
No | Nomi dei gruppi IdP. Un JWT del gateway il cui claim groups include uno di questi ha accesso da amministratore completo, in lettura e scrittura, e viene registrato nell'audit come oidc:<sub>. Usa questo per gli amministratori umani; usa le chiavi API per le macchine. Una voce vuota in questo elenco arresta il gateway all'avvio. Vedi Valori dei matcher che arrestano il gateway all'avvio. |
blocked_message |
No | Aggiunto alla lettera al 429 billing_error che uno sviluppatore bloccato vede. Scrivi l'intera istruzione, come un URL o un canale Slack. Se non impostato, il gateway invia solo il messaggio predefinito. Vedi Come funziona l'applicazione. |
audit_retention_days |
No | Predefinito 365. Le righe admin_audit più vecchie vengono eliminate. |
spend_retention_months |
No | Predefinito 13. Le righe del contatore spend più vecchie di questo vengono eliminate. Il valore predefinito mantiene un anno completo più il mese parziale corrente per i rapporti anno su anno. |
identity_retention_days |
No | Predefinito 90. TTL dall'ultimo accesso per le righe principal_emails, che contengono l'email, il nome visualizzato e i gruppi di ogni sviluppatore (PII). Deliberatamente più breve della conservazione della spesa, in modo che un'identità rimossa scada mentre i suoi contatori di spesa anonimi rimangono. |
group_limit_mode |
No | min (predefinito) o max. Quando uno sviluppatore è in diversi gruppi con cap, min applica il più restrittivo e max il meno restrittivo. Utilizzato sia dall'applicazione che da /effective. |
`enforcement`
Il blocco enforcement controlla il comportamento dei controlli dei limiti di spesa quando l'archivio non è disponibile.
| Campo | Obbligatorio | Descrizione |
|---|---|---|
fail_closed_on_error |
No | Predefinito false. L'applicazione della spesa fallisce aperta in caso di interruzione di Postgres, quindi l'inferenza rimane attiva. Imposta true per fallire chiuso: gli sviluppatori oltre il cap vengono bloccati, ma lo è anche chiunque altro se l'archivio non è raggiungibile. Richiede un blocco admin:: l'applicazione della spesa viene eseguita solo quando admin è configurato, e il gateway rifiuta di avviarsi se imposti questo a true senza di esso. |
`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.
pricing:
multiplier: 0.85
overrides:
- upstream: bedrock-eu
model: claude-sonnet-4-6
input: 3.30
output: 16.50
cache_read: 0.33
cache_write: 4.125
| Campo | Obbligatorio | Descrizione |
|---|---|---|
multiplier |
No | Predefinito 1. Il misuratore moltiplica ogni importo misurato per questo, sia che sia a prezzo di listino che sovrascritto, quindi 0.85 addebita l'85% del prezzo. Deve essere maggiore di 0 e al massimo 10, e un valore superiore a 1 è un markup. |
overrides |
No | Righe di {upstream, model, input, output, cache_read, cache_write} in USD per milione di token. Tutte e quattro le tariffe sono obbligatorie. Ognuna deve essere maggiore di 0 e al massimo 10000. |
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.
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 una tariffa di chargeback interna. Questo esempio misura ogni richiesta al 120% del prezzo:
pricing:
multiplier: 1.2
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 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 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, nella riga di stato e in 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
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. - 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.
auto_include_builtin_models: true # false: expose only the list below
models:
- id: claude-opus-4-8
label: Claude Opus 4.8
# description: optional text shown in clients that surface it
upstream_model:
anthropic: claude-opus-4-8
bedrock: us.anthropic.claude-opus-4-8 # or an inference-profile ARN
foundry: your-opus-deployment-name
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 fa fallire l'avvio, quindi ometti le righe per i provider che non usi.
`managed`
Il blocco managed definisce policy di accesso basate sui ruoli, associate a gruppi IdP o al dominio email. Le policy vengono valutate in ordine; viene selezionata la prima corrispondenza, su cui viene poi eseguito il merge con la base catch-all match: {}. Vengono servite per utente su GET /managed/settings con caching ETag/304.
managed:
policies:
# Specific groups first.
- match: { groups: [eng-contractors] }
cli:
availableModels: [claude-sonnet-4-6]
permissions: { deny: ["WebFetch", "WebSearch"] }
# Default catch-all last: matches everyone who authenticated.
- match: {}
cli:
availableModels: [claude-opus-4-8, claude-sonnet-4-6, claude-haiku-4-5]
Un catch-all 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:
permissions.deny,permissions.ask,disabledMcpjsonServers,deniedMcpServers,blockedMarketplacese ogni array di tipo eventohooks. 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. - 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.
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.
| Matcher | Comportamento |
|---|---|
match: {} |
Corrisponde a ogni utente autenticato. Inizia con uno di questi e aggiungi in seguito policy con ambito di gruppo sopra di esso. |
match: { groups: [a, b] } |
Corrisponde se il claim groups del JWT contiene uno dei gruppi elencati. Sensibile alle maiuscole: i gruppi devono corrispondere esattamente alle maiuscole e minuscole dell'IdP. |
match: { email_domain: example.com } |
Corrisponde alla parte dopo l'ultimo @ nel claim email del JWT, senza distinzione tra maiuscole e minuscole. Accetta un dominio per policy. |
match: { groups: [a], email_domain: example.com } |
Entrambe le condizioni devono corrispondere |
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 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 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.
Valori dei matcher che arrestano il gateway all'avvio
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
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.
Prima di v2.1.232, il gateway si avviava con questi valori. Ogni valore aveva questo effetto:
- 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.
Cosa va in `cli`
Ogni valore 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 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 limitate 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 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:
managed:
policies:
- match: {}
cli:
# Model access (also enforced server-side at /v1/messages)
availableModels: [claude-opus-4-8, claude-sonnet-4-6, claude-haiku-4-5]
# Permission policy
permissions:
deny:
- "WebFetch"
- "Read(./.env)"
- "Read(./secrets/**)"
disableBypassPermissionsMode: disable # blocks --dangerously-skip-permissions
allowManagedPermissionRulesOnly: true # ignore user/project permission rules
# Environment pushed into the CLI process. DISABLE_UPDATES blocks
# background and manual updates; DISABLE_AUTOUPDATER stops only
# background updates.
env:
DISABLE_UPDATES: "1" # pin versions via your own distribution
# Org-wide hooks. Hook commands run on developer machines, not the
# gateway, so the path must exist on every client OS in the policy.
hooks:
PostToolUse:
- matcher: "Edit|Write"
hooks:
- { type: command, command: /usr/local/bin/audit-edit.sh }
| Chiave | Applicato da | Effetto |
|---|---|---|
availableModels |
Gateway + CLI | Allowlist dei modelli. Controllata anche su /v1/messages, quindi un client modificato non può aggirarla. |
permissions.allow / .deny |
CLI | Regole per strumenti e comandi. Vedi Permessi. |
permissions.disableBypassPermissionsMode |
CLI | Imposta su disable per bloccare bypassPermissions, la modalità che salta le richieste di permesso, e il flag --dangerously-skip-permissions |
allowManagedPermissionRulesOnly |
CLI | Quando true, le impostazioni gestite diventano l'unica fonte di impostazioni per le regole di permesso. La voce allowManagedPermissionRulesOnly elenca ogni fonte che Claude Code ignora in quel caso. |
env |
CLI | Variabili d'ambiente sottoposte a merge nel processo CLI. Da usare per telemetria, aggiornamento automatico e override dei nomi dei modelli. |
hooks |
CLI | Hook a livello di organizzazione |
managedMcpServers |
CLI | Server MCP remoti forniti a ogni sviluppatore corrispondente insieme ai server che aggiungono loro stessi, solo http e sse. Vedi Server MCP in una policy. Richiede Claude Code v2.1.259 o successivo sul server del gateway e sui client. I client precedenti ignorano la chiave. |
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.
Memoria delle approvazioni spiega 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 non vuoto di proxy, base URL o OTEL_EXPORTER_OTLP_ENDPOINT la richiede sempre. Quando una variabile consegnata ha bisogno di approvazione, la finestra di dialogo la nomina.
Variabili d'ambiente e la finestra di dialogo di approvazione contiene 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 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 o una sessione dell'Agent SDK, non può mostrare la finestra di dialogo. Applica le impostazioni inviate solo per quell'esecuzione e non le registra come approvate, quindi la prossima sessione interattiva dello sviluppatore mostra comunque la finestra di dialogo. 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 esse.
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 era denominata settings nelle versioni precedenti. Questa grafia è ancora accettata come alias, ma i nuovi deploy dovrebbero usare cli.
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:
managed:
policies:
- match: {}
cli:
env:
CLAUDE_CODE_AUTO_COMPACT_WINDOW: "200000"
Claude Code applica questa variabile senza mostrare allo sviluppatore la finestra di dialogo di approvazione. La variabile si applica a ogni modello, inclusi gli ID modello che terminano con [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.
Server MCP in una policy
Per fornire server MCP ai client Claude Code a cui corrisponde una policy, 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 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. Punta bootstrapUrl, 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.
Il gateway deriva gran parte della risposta dal blocco cli della policy corrispondente e dalla configurazione di primo livello del gateway:
-
L'elenco dei modelli, da
availableModels. Contesto esteso in Claude Desktop tratta l'opzione di contesto 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 di uscita, da
sandbox.network.allowedDomains. Se imposticoworkEgressAllowedHostsnel bloccodesktopdella 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 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
Per impostare 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 *).
Aggiungi il blocco facoltativo desktop 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. 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.
managed:
policies:
- match: { groups: [eng-contractors] }
cli:
availableModels: [claude-sonnet-4-6]
desktop:
isLocalDevMcpEnabled: false
disableAutoUpdates: true
banner: { text: "Contractor build: internal use only" }
Ogni chiave è facoltativa; Claude Desktop applica il proprio 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 anziché 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 scarterebbe silenziosamente, come un valore vuoto o una sotto-chiave scritta in modo errato all'interno di una voce annidata. Prima di v2.1.260, il gateway scartava silenziosamente un campo scritto in modo errato all'interno di un oggetto annidato di una voce
managedMcpServersoorgPluginSettingsinvece di fallire all'avvio. - 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.
Se usi un valore o una forma di voce deprecati, 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 incluso nella sua versione installata, come fa con il blocco cli. Per consegnare un'impostazione introdotta da una versione più recente di Claude Desktop, aggiorna prima il gateway. Ad esempio, userPluginMarketplacesEnabled e userPluginUploadsEnabled hanno bisogno di Claude Code v2.1.260 o successivo sul server del gateway e di Claude Desktop 1.37937.0 o successivo 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.
Se imposti 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.
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
Per ogni altra chiave, se la imposti nella policy per ruolo, il gateway usa il valore della policy per ruolo. Il gateway sostituisce per intero un array o un oggetto annidato come banner, 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.
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
Per cambiare ciò che offre il selettore, usa uno di questi metodi:
- 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.
Questo esempio offre l'opzione manualmente per un alias personalizzato instradato verso un profilo di inferenza dell'applicazione, e avvia i nuovi utenti su di essa:
models:
- id: corp-sonnet
upstream_model:
bedrock: arn:aws:bedrock:us-east-2:123456789012:application-inference-profile/sonnet-5-prod
- id: corp-sonnet[1m]
upstream_model:
bedrock: arn:aws:bedrock:us-east-2:123456789012:application-inference-profile/sonnet-5-prod
managed:
policies:
- match: {}
desktop:
modelPrefer1mContext: true
Rimuovi l'opzione 1M
Per rimuovere l'opzione dal selettore, imposta CLAUDE_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 un managed-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 con accesso effettuato 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.
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.
telemetry:
forward_to:
- url: https://otel-collector.internal.example.com
headers:
Authorization: ${OTLP_TOKEN}
# Per-signal opt-in. Default: metrics only.
metrics: true
logs: false
traces: false
- url: https://api.datadoghq.com/api/v2/otlp
headers:
DD-API-KEY: ${DD_API_KEY}
Ogni destinazione abilita metrics, logs e traces in modo indipendente, e il valore predefinito è solo le metriche. I segnali differiscono per sensibilità:
- Metriche: contatori aggregati come conteggi di token, conteggi di richieste e latenza
- Log e tracce: possono contenere comandi Bash completi, input degli 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 quei dati richiedono.
Ogni URL 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
Per un collettore interno al 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 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
Quando aggiungi le tue etichette, il gateway invia anche 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.
Senza una destinazione 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.
Aggiungi le tue etichette
Per applicare etichette fisse come service.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:
telemetry:
forward_to:
- url: https://otel-collector.internal.example.com
resource_attributes:
service.namespace: claude
deployment.environment.name: prod
Il gateway rifiuta di avviarsi quando un'etichetta viola 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 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
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 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.
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.
L'endpoint che nomini cambia solo la destinazione delle esportazioni. Scegli comunque quali segnali esportare 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 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 lo sviluppatore esce, o accede a un gateway diverso, le esportazioni al collettore si interrompono e Claude Code scarta ogni batch rimanente anziché inviarlo.
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, tranne 400, 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.
| Blocco | Chiave | Predefinito | Descrizione |
|---|---|---|---|
access_control |
allow_cidrs / deny_cidrs |
vuoto | Consenso/negazione degli IP in entrata per indirizzo client, dopo la risoluzione di trusted_proxies. deny_cidrs viene controllato per primo; un client a cui corrisponde viene rifiutato anche se corrisponde anche allow_cidrs. Se allow_cidrs non è vuoto, il gateway nega per impostazione predefinita. /healthz e /readyz sono esenti da allow_cidrs. Quando un proxy attendibile invia una voce X-Forwarded-For che non è un indirizzo IP, il client reale è sconosciuto e il gateway registra una sola volta un avviso che indica cosa controllare. Dove uno dei due elenchi si applica alla richiesta, la rifiuta con 403 e motivo di audit xff_unparseable. Dove nessuno dei due si applica, serve la richiesta e usa l'indirizzo del proxy stesso come IP del client per i rate limit per IP e per l'audit. |
limits |
max_request_bytes |
32 MiB | Dimensione massima del corpo della richiesta in entrata; le richieste troppo grandi ottengono 413 prima che il corpo venga bufferizzato. Aumentalo per richieste con file o immagini di grandi dimensioni. |
limits |
max_request_header_bytes |
non impostato | Quando impostato, le intestazioni troppo grandi restituiscono 431 |
limits |
max_url_length |
non impostato | Quando impostato, un URL troppo lungo restituisce 414 |
timeouts |
upstream_ttfb_ms |
120000 | Attesa massima per le intestazioni di risposta dell'upstream (tempo al primo byte). Il corpo della risposta viene poi trasmesso in streaming senza limite di tempo complessivo. Si applica al percorso upstream diretto di Anthropic; con ogni altro provider il gateway attende fino a un'ora che la risposta inizi. |
rate_limits |
device_authorization.max / .window_seconds |
30 / 600 | Rate limit per IP sull'endpoint non autenticato di autorizzazione del dispositivo. Aumentalo per una grande organizzazione dietro un IP di uscita condiviso o NAT. Distribuzioni su larga scala mostra come dimensionarlo. Questi limiti si applicano solo al flusso di accesso con concessione del dispositivo, non all'inferenza su /v1/messages. Vedi Resistenza al brute force dei codici utente. |
rate_limits |
device_verify.max / .window_seconds |
10 / 600 | Rate limit per IP sugli invii di user_code su /device. È ciò che impedisce a qualcuno di indovinare il codice di un altro sviluppatore. Distribuzioni su larga scala mostra di quanto aumentarlo. |
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.
Entrambi i segnali usano l'indirizzo del client così come il gateway lo risolve. Se un load balancer, un port-forward o un tunnel inoltra il traffico e non è elencato in 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.
Dietro un front end di questo tipo, imposta prima listen.trusted_proxies in modo che il gateway veda gli indirizzi reali dei client, e 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:
load_test_mode:
enabled: true
reply_tokens: 750 # roughly how many tokens of text each canned reply carries
reply_seconds: 9.5 # how long a streamed reply takes
| Campo | Obbligatorio | Descrizione |
|---|---|---|
enabled |
Sì | true attiva la modalità. false mantiene i tuoi valori nel file con la modalità disattivata. Il gateway rifiuta di avviarsi se il blocco è presente senza di esso. |
reply_tokens |
No | Predefinito 750. Circa quanti token di testo contiene ogni risposta preconfezionata, un numero intero da 1 a 100000. |
reply_seconds |
No | Predefinito 9.5. Quanto dura una risposta in streaming, da 0 a 600. 0 invia l'intera risposta in una volta. La risposta a una richiesta non in streaming torna sempre in una volta. |
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à o il percorso di rete del provider.
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.
Non attivarla mai su un gateway usato dagli sviluppatori. Ogni richiesta ottiene la risposta preconfezionata 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. Copialo, elimina ciò che non ti serve e inserisci i tuoi valori. La configurazione nella Guida rapida è una versione minima di questa.
# Run with:
# claude gateway --config gateway.yaml
#
# Operational log verbosity is controlled by the CLAUDE_GATEWAY_LOG_LEVEL
# environment variable (debug | info | warn | error; default info). debug
# also logs the claim names in each id_token, for groups_claim diagnosis.
# It does not affect audit events, which are always emitted.
listen:
host: 0.0.0.0
port: 8080
public_url: https://claude-gateway.internal.example.com
# Omit the tls block when running behind a TLS-terminating ingress.
# tls:
# cert: /certs/gateway.crt
# key: /certs/gateway.key
# trusted_proxies:
# - 10.0.0.0/8
oidc:
issuer: https://example.okta.com
client_id: 0oa1example2
client_secret: ${OIDC_CLIENT_SECRET}
allowed_email_domains:
- example.com
# Required when the issuer is the Okta org server, whose id_tokens
# can omit email and groups; the gateway fills them from /userinfo.
userinfo_fallback: true
# allowed_groups: [claude-code-users]
# Okta emits groups only when the `groups` scope is requested and the
# app's groups claim filter allows them. The contractors policy below
# matches on groups, so the scope is requested here.
scopes: [openid, profile, email, offline_access, groups]
# extra_auth_params: { access_type: offline, prompt: consent } # Google
# groups_claim: groups # Entra app roles: use `roles`
# email_claim: email
session:
jwt_secret: ${GATEWAY_JWT_SECRET} # openssl rand -base64 32
# ttl_hours: 1
store:
postgres_url: ${GATEWAY_POSTGRES_URL}
# max_connections: 5
# connect_timeout_seconds: 5
# readiness_grace_seconds: 300 # keep passing the readiness check through a database failover
# Enables /v1/organizations/spend_limits (mirrors the Anthropic Admin API)
# and per-developer spend enforcement on /v1/messages. Omit to disable.
# Caps themselves are set via the admin API, not here.
# admin:
# write_keys:
# - { id: terraform, key: "${GATEWAY_ADMIN_WRITE_KEY_TF}" }
# read_keys:
# - { id: reporting, key: "${GATEWAY_ADMIN_READ_KEY}" }
# admin_groups: [platform-finops]
# blocked_message: request an increase at https://go.example.com/claude-limits
# # audit_retention_days: 365
# # spend_retention_months: 13
# # identity_retention_days: 90
# # group_limit_mode: min
# enforcement:
# fail_closed_on_error: false
# Load test this deployment without calling a model provider. Never on a
# gateway that developers use: every request gets a canned reply.
# load_test_mode:
# enabled: true
# # reply_tokens: 750
# # reply_seconds: 9.5
# Meter at contracted rates instead of USD list price. Requires admin: or a
# managed: policy. With managed:, the same rates also go to signed-in clients.
# Rates below are placeholders, not real contract prices.
# pricing:
# multiplier: 0.85
# overrides:
# - { upstream: anthropic, model: claude-sonnet-4-6, input: 3.30, output: 16.50, cache_read: 0.33, cache_write: 4.125 }
upstreams:
- provider: anthropic
auth:
api_key: ${ANTHROPIC_API_KEY}
# - provider: bedrock
# region: us-east-1
# auth: {}
# - provider: anthropicAws
# region: us-east-1
# workspace_id: wrkspc_...
# auth:
# api_key: ${ANTHROPIC_AWS_API_KEY}
# - provider: vertex
# region: us-east5
# project_id: example-prod
# auth: {}
# - provider: foundry
# resource: example-foundry
# auth: { use_azure_ad: true }
auto_include_builtin_models: true
models:
- id: claude-opus-4-8
label: Claude Opus 4.8
upstream_model:
anthropic: claude-opus-4-8
# bedrock: us.anthropic.claude-opus-4-8
# anthropicAws: claude-opus-4-8
# vertex: claude-opus-4-8
# foundry: <your-opus-deployment-name>
- id: claude-sonnet-4-6
label: Claude Sonnet 4.6
upstream_model:
anthropic: claude-sonnet-4-6
- id: claude-haiku-4-5
label: Claude Haiku 4.5
upstream_model:
anthropic: claude-haiku-4-5
managed:
policies:
- match: { groups: [contractors] }
cli:
availableModels: [claude-haiku-4-5]
# Constrain the Default picker option to availableModels instead of
# the tier default, so contractors don't get a 400 on the default.
enforceAvailableModels: true
# allow auto-approves these tools; it does not block the rest.
# Add deny rules to restrict tools.
permissions: { allow: [Read, Grep] }
- match: {}
cli:
availableModels: [claude-opus-4-8, claude-sonnet-4-6, claude-haiku-4-5]
permissions:
allow: [Read, Grep, Bash, Edit]
deny: ["WebFetch"]
env: { HTTP_PROXY: http://proxy.example.com:8080 }
telemetry:
forward_to:
- url: https://otel.internal.example.com:4318
headers:
Authorization: Bearer ${OTEL_TOKEN}
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 file managed-settings.json di ogni sistema operativo. Le due chiavi di accesso instradano il /login di ogni sviluppatore al tuo gateway:
{
"forceLoginMethod": "gateway",
"forceLoginGatewayUrl": "https://claude-gateway.internal.example.com",
"parentSettingsBehavior": "merge"
}
parentSettingsBehavior: "merge" mantiene funzionante la consegna dell'allowlist di egress da parte 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.
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 solo da una fonte gestita sulla macchina: managed-settings.json, il plist macOS o il registro HKLM di Windows, oppure un policy helper. Impostarli nel ~/.claude/settings.json personale di uno sviluppatore o nel payload del gateway non configura l'accesso tramite gateway.
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