Skip to main content
Una implementación de la puerta de enlace de aplicaciones Claude se configura mediante un archivo YAML, convencionalmente gateway.yaml. El archivo define todo lo que hace la puerta de enlace: dónde escucha, cómo inician sesión los desarrolladores, dónde va la inferencia y qué políticas y telemetría se aplican. Esta página es la referencia para cada opción en ese archivo. Para escribir el primero, comience desde el inicio rápido, que construye una configuración mínima funcional y la ejecuta. Una vez que tenga una configuración con la que esté satisfecho, la guía de implementación cubre la containerización y el alojamiento en Kubernetes, Cloud Run o su propia plataforma. La puerta de enlace lee el archivo una vez, al iniciar, con claude gateway --config /path/to/gateway.yaml. Cada opción se valida contra un esquema al arrancar, por lo que una configuración mal formada falla al iniciar con un error a nivel de campo en lugar de en el primer uso. El ejemplo completo al final de esta página ejercita cada sección.

Estructura del archivo

Cinco secciones son requeridas. Todas las demás secciones son opcionales, y una sección omitida toma sus valores predeterminados. Las claves desconocidas fallan al arrancar, por lo que un error tipográfico aparece como un error nombrado en lugar de una configuración silenciosamente ignorada. Secciones requeridas:
  • listen: dirección de enlace, URL pública, terminación TLS
  • oidc: su proveedor de identidad (IdP), incluido emisor, cliente, mapeo de reclamaciones y quién puede iniciar sesión
  • session: los tokens portadores que emite la puerta de enlace, con secreto y duración
  • store: PostgreSQL, para concesiones de dispositivos y contadores de límite de velocidad
  • upstreams: dónde va la inferencia, ya sea Anthropic, Amazon Bedrock, Claude Platform en AWS, Agent Platform de Google Cloud o Microsoft Foundry
Secciones opcionales:
  • admin: autenticación de API de administración y retención de límites de gasto
  • enforcement: comportamiento de límite de gasto de fallo abierto o fallo cerrado
  • pricing: tasas contratadas y un multiplicador de descuento para el medidor de gasto y para las cifras de costo que ven los desarrolladores
  • models y auto_include_builtin_models: lista de modelos curada por administrador e IDs por upstream
  • managed: políticas de configuración administradas por grupo de IdP
  • telemetry: reenvío OTLP a su pila de observabilidad
  • access_control, limits, timeouts, rate_limits: permitir/denegar IP, límites de tamaño de solicitud, tiempo hasta el primer byte del upstream y límites de inicio de sesión por IP
  • load_test_mode: prueba de carga de la puerta de enlace sin llamar a un proveedor de modelos

Expansión de secretos

No escriba secretos como client_secret, jwt_secret o postgres_url directamente en gateway.yaml. Haga referencia a ellos con uno de los formularios a continuación, y la puerta de enlace resuelve el valor al arrancar desde una variable de entorno o un archivo:

Secciones requeridas

listen

El bloque listen controla dónde sirve la puerta de enlace: la dirección de enlace y puerto, el origen visible externamente y la terminación TLS opcional.

oidc

El bloque oidc conecta la puerta de enlace a su proveedor de identidad y decide quién puede iniciar sesión. Nombra el emisor y cliente OAuth, mapea las reclamaciones que llevan correo electrónico y grupos, y restringe el inicio de sesión por dominio de correo electrónico o grupo. OpenID Connect (OIDC) es el protocolo SSO que la puerta de enlace utiliza con su proveedor de identidad; consulte Configuración del proveedor de identidad para saber qué registrar en el lado de IdP.

Solicitudes de IdP a través de un proxy directo

Los upstreams de inferencia honran HTTPS_PROXY e HTTP_PROXY en cada versión. Las propias solicitudes de la puerta de enlace al IdP, descubrimiento, JWKS, token y userinfo, van directas a menos que establezca oidc.use_proxy: true, que requiere v2.1.227 o posterior. Cuando se establece una variable de proxy, use_proxy no se establece, y el emisor no está cubierto por NO_PROXY, la puerta de enlace mantiene esas solicitudes directas y registra un aviso al arrancar pidiéndole que elija; use_proxy: false las mantiene directas y silencia el aviso. Con use_proxy: true, la vaina resuelve el nombre de host de cada punto final de IdP por sí misma y pide al proxy que CONNECT a la dirección IP resuelta, por lo que el proxy debe aceptar CONNECT a la dirección IP de cada host que el documento de descubrimiento nombra, no solo el emisor. Use una URL de proxy http://. ca_cert_pem y la protección SSRF se aplican en la ruta proxificada también. Egreso solo de proxy cambia ambos: mientras está activo, las solicitudes de IdP siguen el proxy a menos que establezca use_proxy: false, y la puerta de enlace entrega al proxy cada nombre de host de IdP sin resolverlo primero.

Egreso solo de proxy

Establezca CLAUDE_GATEWAY_PROXY_IS_EGRESS_BOUNDARY=1 en el entorno de la puerta de enlace, junto a HTTPS_PROXY, cuando la vaina alcanza otros hosts solo a través de ese proxy directo y no puede resolver nombres DNS públicos por sí misma, o cuando el proxy rechaza CONNECT a una dirección IP. Requiere v2.1.277 o posterior. Es una variable de entorno en lugar de una clave gateway.yaml para que nada en el archivo de configuración pueda relajar la verificación de dirección de la puerta de enlace.
La puerta de enlace registra una línea network: al arrancar mientras el egreso solo de proxy está activo. Cada fila a continuación es una clase de solicitud saliente en una puerta de enlace con HTTPS_PROXY establecido, de forma predeterminada y mientras el egreso solo de proxy está activo. El egreso solo de proxy se mantiene desactivado a menos que el entorno de la puerta de enlace cumpla con las tres condiciones siguientes:
  • HTTPS_PROXY o HTTP_PROXY está establecido.
  • NO_PROXY y no_proxy están vacíos. Si su plataforma inyecta cualquiera en vainas, establezca ambos en un valor vacío en el contenedor de la puerta de enlace. Listar un recopilador de telemetría en NO_PROXY mantiene el egreso solo de proxy desactivado.
  • CLAUDE_GATEWAY_ALLOW_LOOPBACK no está activado. Un recopilador o IdP en el propio loopback de la vaina no se puede combinar con egreso solo de proxy, porque una dirección loopback entregada al proxy sería la del propio host del proxy, así que dé a esos servicios una dirección que el proxy pueda alcanzar en su lugar. Por la misma razón, la puerta de enlace rechaza nombres de estilo localhost directamente mientras el egreso solo de proxy está activo.
Cuando una de esas condiciones no se cumple, la puerta de enlace registra una advertencia al arrancar nombrando la variable que lo detuvo y mantiene el comportamiento predeterminado. Una vez que el egreso solo de proxy está activo, permita cada destino en el proxy, incluyendo un recopilador interno y cualquier host configurado por dirección IP. Aún puede mantener un IdP interno directo con oidc.use_proxy: false.
Active esto solo cuando la lista de permitidos del proxy sea al menos tan estricta como la verificación propia de la puerta de enlace. El proxy debe rechazar puntos finales de metadatos en la nube como 169.254.169.254 y metadata.google.internal, direcciones de enlace local, y el propio loopback del host del proxy, y debe rechazarlos por la dirección a la que se resuelve un nombre, no solo por nombre, porque la puerta de enlace ya no detecta un nombre de host que se resuelve a uno de ellos. Un proxy que se conecta a cualquier lugar que se le pida elimina la protección SSRF de la puerta de enlace para estas solicitudes.

session

El bloque session forma los tokens portadores que emite la puerta de enlace después del inicio de sesión: el secreto que los firma y cuánto tiempo viven.

store

El bloque store apunta la puerta de enlace a su base de datos PostgreSQL, que contiene concesiones de dispositivos y contadores de límite de velocidad. Para desarrollo local, apunte postgres_url a un contenedor Postgres desechable, por ejemplo docker run --rm -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres.

upstreams

upstreams es una lista ordenada. La puerta de enlace reenvía la inferencia al primer upstream que resuelve el modelo solicitado. En 5xx, 429, 401, 403, 404, o tiempo de espera, la puerta de enlace conmuta por error al siguiente upstream; otros 4xx no, porque esos errores son atribuibles a la solicitud en lugar del upstream. Un 401 o 403 significa que la credencial propia de la puerta de enlace falló contra ese upstream. Un 404 significa que ese upstream no sirve el modelo solicitado, por lo que un upstream posterior en la lista aún puede. Si establece forward_user_identity: true en un upstream, un 429 que devuelve a una solicitud que llevaba el correo electrónico del desarrollador no conmuta por error. Consulte cómo una denegación de límite por usuario llega al desarrollador. La conmutación por error en 404 requiere gateway v2.1.198 o posterior. Las versiones anteriores devolvieron el primer 404 al cliente incluso cuando un upstream posterior en la lista sirvió el modelo. Múltiples upstreams del mismo proveedor deben establecer un name: distinto. Los clientes de Bedrock, Claude Platform en AWS, Agent Platform de Google Cloud y Microsoft Foundry se construyen una vez al iniciar, y sus SDK actualizan credenciales internamente, por lo que rotar credenciales en la nube no requiere un reinicio. Las claves API estáticas de Anthropic y los portadores se leen al iniciar; consulte API de Anthropic.

Mensajes de error de upstream

La puerta de enlace devuelve la respuesta de error de un upstream, o su propio 502, dependiendo de cómo respondieron los upstreams:
  • Un upstream devolvió un estado en el que la puerta de enlace no conmuta por error: esa respuesta del upstream. La puerta de enlace no intenta más upstreams.
  • Cada upstream que la puerta de enlace intentó falló de una manera en la que conmuta por error: el último 429. Cuando ninguno devolvió un 429, la puerta de enlace prefiere, en orden, el último 401 o 403, el último 404, y el último 501. Cuando ninguno devolvió ninguno de esos, el propio 502 de la puerta de enlace, all upstreams failed (N attempted), donde N cuenta cada entrada en upstreams, incluyendo entradas que la puerta de enlace omitió porque no sirven el modelo solicitado.
Cuando la puerta de enlace devuelve la respuesta de un upstream, mantiene el código de estado del upstream. Si mantiene el mensaje del upstream depende del proveedor. El cuerpo de error de un upstream de API de Anthropic llega al desarrollador sin cambios. Los upstreams de Amazon Bedrock, Claude Platform en AWS, Agent Platform de Google Cloud y Microsoft Foundry pueden nombrar sus IDs de cuenta, ARN de rol e IDs de proyecto en su texto de error. La puerta de enlace registra ese texto completo en el registro operacional. Lo que el desarrollador ve de esos upstreams depende del rechazo:
  • 400 o 413 en el sobre de error estándar de Anthropic: el mensaje del upstream, como prompt is too long. Claude Platform en AWS, Agent Platform y Microsoft Foundry devuelven este sobre para rechazos de API de modelo.
  • 400 o 413 en la forma propia del proveedor: un token capability_rejected:. Cuando la puerta de enlace no puede clasificar el rechazo, upstream rejected the request en un 400 o request too large for this upstream en un 413.
  • Cualquier otro estado: copia genérica por estado, como upstream rate limit exceeded en un 429.
Por ejemplo, la puerta de enlace reemplaza Input is too long for requested model. de Amazon Bedrock con capability_rejected: prompt_too_long. Claude Code compacta automáticamente en ese token, como lo hace en prompt is too long. Mantener el mensaje 400 o 413 de un upstream en la nube, o reemplazarlo con un token capability_rejected:, requiere gateway v2.1.233 o posterior.

API de Anthropic

El upstream mínimo de Anthropic es una clave API de la Consola Claude:
Las dos formas de credencial difieren en el encabezado que envían:
  • api_key: envía x-api-key. Rótelo en la Consola Claude y actualice la variable env.
  • oauth_token: envía Authorization: Bearer. Use la forma de portador cuando su organización emita tokens de corta duración en lugar de claves API de larga duración. El portador se lee una vez al iniciar, así que actualice remontando el secreto e reiniciando.
En lugar de una clave estática o portador, puede usar Workload Identity Federation. Cree una regla de federación siguiendo la guía de Workload Identity Federation, luego monte el JWT de OIDC de su carga de trabajo como un archivo, como un token de cuenta de servicio proyectado de Kubernetes o un id-token de plataforma de CI. La puerta de enlace intercambia el JWT por un portador de corta duración y lo actualiza automáticamente. El archivo de token se relee en cada intercambio, por lo que los tokens proyectados rotados se recogen sin un reinicio.
Puede apuntar el base_url de un upstream provider: anthropic a un proxy que usted ejecuta en lugar de a la API de Anthropic. Para decirle a ese proxy qué desarrollador envió cada solicitud, establezca forward_user_identity: true en ese upstream. El proxy puede entonces atribuir gasto por desarrollador. Requiere una puerta de enlace ejecutando Claude Code v2.1.233 o posterior. Por ejemplo, para un proxy en upstream-gateway.internal.example.com:
La puerta de enlace añade estos encabezados a cada solicitud que reenvía a ese upstream. Cuando el token de IdP no lleva correo electrónico, la puerta de enlace envía solo x-claude-gateway-user-id y omite los dos encabezados de correo electrónico. Si su IdP pone el correo electrónico en una reclamación diferente, establezca oidc.email_claim en esa reclamación. Cuando su proxy responde 429 a una solicitud que llevaba el correo electrónico del desarrollador, la puerta de enlace devuelve esa respuesta al desarrollador tal como está en lugar de conmutar por error al siguiente upstream, por lo que el presupuesto por usuario o límite de velocidad de su proxy se mantiene. Las otras respuestas del proxy siguen las reglas de conmutación por error ordinarias. Si el token de IdP de un desarrollador no lleva correo electrónico, la puerta de enlace reenvía sus solicitudes sin los encabezados de correo electrónico, por lo que un 429 a una de esas solicitudes cuenta como capacidad de upstream y conmuta por error. Antes de v2.1.267 en el servidor de la puerta de enlace, cada 429 conmutaba por error. Establezca forward_user_identity solo en un upstream cuyo base_url sea un proxy que usted opera. La puerta de enlace envía correos electrónicos de desarrollador a cualquier servidor que ese base_url nombre. Si el base_url es la API de Anthropic, que es el predeterminado, la puerta de enlace se niega a iniciar.

Amazon Bedrock

Para la implementación de Bedrock del lado del cliente que la puerta de enlace reemplaza o enfrenta, consulte Claude Code en Amazon Bedrock. El upstream del lado de la puerta de enlace:
Un bloque auth vacío utiliza la cadena de credenciales predeterminada del SDK de AWS: variables env, ~/.aws/credentials, rol de tarea de ECS, metadatos de instancia de EC2 o IRSA en EKS. En producción, otorgue a la vaina de la puerta de enlace un rol de IAM en lugar de incrustar claves estáticas en una imagen de contenedor. Las credenciales explícitas deben ser completas: la puerta de enlace falla al arrancar cuando aws_access_key_id y aws_secret_access_key no se establecen juntos, o cuando aws_session_token se establece sin ellos. Antes de v2.1.207, un bloque auth: parcial pasó la validación.

Claude Platform en AWS

Claude Platform en AWS sirve la API de Anthropic de primera parte en infraestructura de AWS en aws-external-anthropic.<region>.api.aws. Utiliza IDs de modelo de primera parte, honra encabezados anthropic-beta tal como se envían, y sirve count_tokens, por lo que ninguna de la traducción específica de Bedrock se aplica. El proveedor anthropicAws requiere Claude Code v2.1.198 o posterior; las versiones anteriores de gateway lo rechazan al arrancar. Para la implementación del lado del cliente de la misma plataforma, consulte Claude Code en Claude Platform en AWS. El upstream del lado de la puerta de enlace:
La plataforma se ejecuta en una cuenta de AWS separada de Amazon Bedrock y firma solicitudes SigV4 para su propio nombre de servicio, aws-external-anthropic, por lo que un rol de IAM limitado a Bedrock no lo autoriza. Una clave API en auth.api_key tiene prioridad cuando también se establecen credenciales SigV4. Un bloque auth vacío utiliza la cadena de credenciales predeterminada del SDK de AWS, la misma cadena que usa el upstream Amazon Bedrock. Debido a que la plataforma resuelve IDs de modelo de primera parte, el catálogo integrado enruta a ella sin un bloque models:. Cuando cura una lista models:, clave la entrada anthropicAws: con el ID de primera parte.

Plataforma de agentes de Google Cloud

Para la configuración equivalente del lado del cliente, consulte Claude Code en Google Cloud. El upstream del lado de la puerta de enlace:
Un bloque auth vacío utiliza Credenciales predeterminadas de aplicación: GOOGLE_APPLICATION_CREDENTIALS, metadatos de GCE o Workload Identity de GKE. Los archivos de clave JSON de cuenta de servicio son compatibles pero desaconsejados; use Workload Identity o adjunte una cuenta de servicio a la instancia de GCE o Cloud Run. Establezca region: global para usar el punto final global de Agent Platform en lugar de uno regional. Google luego enruta cada solicitud a una región disponible, por lo que no rastrea la disponibilidad de modelos por región. Establecer una región específica fija cada solicitud a ella.

Microsoft Foundry

Para la implementación de Foundry del lado del cliente, consulte Claude Code en Microsoft Foundry. El upstream del lado de la puerta de enlace:
use_azure_ad: true se resuelve a través de DefaultAzureCredential: Managed Identity en AKS, ACI o App Service; la CLI de Azure; o credenciales de entorno. Las claves API funcionan pero son amplias del proyecto y no se rotan automáticamente. El punto final de Foundry se deriva de resource:; establezca el base_url opcional para anularlo para nubes soberanas como Azure Government.

Encabezados estáticos en solicitudes de upstream

Para agregar encabezados fijos a las solicitudes que la puerta de enlace envía a un upstream, establezca headers: en ese upstream. Úselo cuando un proxy que ejecuta frente al proveedor enruta o atribuye tráfico por un encabezado. headers: requiere Claude Code v2.1.277 o posterior en el servidor de la puerta de enlace. Una puerta de enlace anterior se niega a iniciar cuando encuentra la clave. Actualice cada réplica antes de agregar la clave, y elimine la clave antes de revertir a una versión anterior. Los encabezados van al servidor que base_url nombra, o al punto final propio del proveedor cuando base_url no se establece. El proveedor también los recibe a menos que su proxy los elimine. Este ejemplo alcanza un upstream provider: vertex a través de un proxy en upstream-proxy.internal.example.com. Establece el encabezado x-source que el proxy lee, y envía un token de la variable de entorno PROXY_TOKEN como x-proxy-token:
Los valores son texto ASCII imprimible sin espacio en ninguno de los extremos. Entrecomille un número, true, o false para que YAML lo lea como texto. Para mantener un secreto fuera del archivo de configuración, use expansión de secretos para cargar el valor de una variable de entorno con ${VAR} o de un archivo con ${file:/path}. Un ${VAR} que se resuelve a un valor vacío detiene la puerta de enlace de iniciar. headers: funciona en cada proveedor, y cada upstream envía solo el suyo. No cada solicitud que la puerta de enlace envía a un upstream los lleva: En un upstream de Amazon Bedrock o Claude Platform en AWS que firma solicitudes con AWS SigV4, estos encabezados son parte de la firma, por lo que su proxy debe pasarlos sin cambios. Si utiliza un nombre que la puerta de enlace reserva, se niega a iniciar, y el error de inicio nombra el encabezado. Los nombres reservados incluyen:
  • authorization y x-api-key
  • host, content-type y user-agent
  • Cualquier nombre que comience con anthropic-, x-goog-, x-amz- o x-amzn-

Múltiples upstreams

El mismo proveedor puede aparecer más de una vez con un name: distinto. Esto cubre diferentes regiones, diferentes cuentas a través de diferentes cadenas de credenciales, rendimiento aprovisionado versus bajo demanda, y conmutación por error entre proveedores. La puerta de enlace intenta upstreams en orden. 5xx, 429, 401, 403, 404, tiempos de espera y punto final faltante (501) conmutan por error; otros 4xx no. 429 es capacidad por upstream, por lo que el agotamiento de rendimiento aprovisionado (PT) conmuta por error a bajo demanda. Si establece forward_user_identity: true en un upstream, un 429 a una solicitud que llevaba el correo electrónico del desarrollador es una denegación por usuario en su lugar y no conmuta por error. Cada solicitud comienza en el primer upstream. Una solicitud alcanza un upstream posterior solo cuando cada upstream anterior a él ha fallado o no sirve el modelo solicitado. La puerta de enlace no mantiene registro de upstreams fallidos, por lo que mientras un upstream está inactivo, cada solicitud que lo alcanza aún lo intenta y espera a que falle antes de pasar al siguiente. Para un upstream de API de Anthropic, timeouts.upstream_ttfb_ms limita la espera en un upstream inactivo. Esa configuración no se aplica a los otros proveedores, donde la puerta de enlace espera hasta una hora a que un upstream comience a responder. 404 es disponibilidad de modelo por upstream, por lo que un upstream que no ha habilitado un modelo no bloquea un upstream posterior que lo sirve. Un upstream que no puede resolver el modelo solicitado se omite sin un viaje de red. Este ejemplo enruta una asignación de rendimiento aprovisionado de Bedrock primero, desborda a bajo demanda y una segunda cuenta, y vuelve a la API de Anthropic al final:
La conmutación por error entre proveedores en la nube, o a la API de Anthropic directo, cambia qué acuerdo, geografía y otros términos rigen la solicitud. El CLI aplica el mismo control de características a puertas de enlace independientemente de cuál upstream sirva una solicitud dada, por lo que la conmutación por error no envía un campo de cuerpo que un upstream rechazaría.

Secciones opcionales

admin

Opcional. Habilita /v1/organizations/spend_limits, que refleja la API pública de administración de Anthropic, y la aplicación de gastos por desarrollador en /v1/messages. Consulte Límites de gastos para saber cómo se establecen y aplican los límites; esta sección cubre las claves de gateway.yaml que activan la función y la ajustan.

enforcement

El bloque enforcement controla cómo se comportan las comprobaciones de límites de gastos cuando el almacén no está disponible.

pricing

El bloque pricing le dice al medidor de gastos qué cobrar en lugar del precio de lista en USD, para que los límites y /effective reflejen sus tasas contratadas. Los montos permanecen en USD y siguen siendo una estimación, no una factura. Dos requisitos previos:
  • Claude Code v2.1.227 o posterior en el servidor de gateway. Las versiones anteriores rechazan la clave desconocida al iniciar.
  • Un bloque admin: o, en v2.1.268 o posterior, un bloque managed: con al menos una política. El gateway se niega a iniciar con pricing establecido y ninguno de los dos bloques, porque nada lo leería.
Cómo el medidor coincide con una fila de anulación:
  • Una fila reemplaza el precio de lista para solicitudes que upstream, un upstreams[].name, sirve para model. Esto incluye la tasa más alta de modo rápido, por lo que las solicitudes de modo rápido y estándar se miden con las mismas cuatro tasas.
  • Un ID integrado como claude-sonnet-4-6, coincidido como models[].id, cubre cada forma fechada, forma regional de Amazon Bedrock, o forma de Google Cloud’s Agent Platform que el medidor precifica como ese modelo. Cualquier otra cadena, como un alias o un ARN de perfil de inferencia, coincide con el ID que el cliente envió o la cadena enviada al upstream, sin distinción de mayúsculas y minúsculas.
  • Donde las filas se superponen, el medidor elige la fila más específica en lugar de la primera fila: una fila cuyo model es la cadena de modelo exacta enviada al upstream, luego una fila que coincide con el ID exacto que el cliente envió, luego una fila que nombra el modelo integrado.
  • Un nombre de upstream desconocido falla al iniciar, al igual que dos filas para un upstream que nombran el mismo modelo, incluidas dos ortografías de un modelo integrado. El gateway advierte al iniciar sobre una fila que ningún modelo solicitable puede usar.
  • Las solicitudes de búsqueda web permanecen al precio de lista de $0.01; el multiplicador aún se aplica a ellas.
Para tasas por región, asigne a cada región su propio upstream nombrado y una fila por upstream.

Marcar precios hacia arriba

Con v2.1.271 o posterior en el servidor de gateway, puede establecer multiplier por encima de 1, hasta 10, para medir más de lo que cobra el proveedor, por ejemplo una tasa de reembolso interno. Este ejemplo mide cada solicitud al 120% del precio:
Con un bloque admin:, el marcado también se aplica a los límites de gastos. El medidor cuenta el 120% del precio, por lo que los desarrolladores alcanzan sus límites más rápido. El gateway registra una advertencia al iniciar que dice así. El multiplicador no cambia lo que cobra el proveedor upstream por las solicitudes. Si el gateway también envía las tasas a clientes conectados, los desarrolladores necesitan Claude Code v2.1.271 o posterior para ver el marcado. Los clientes anteriores ignoran un multiplier superior a 1 y muestran costos sin él. Un servidor de gateway anterior a v2.1.271 se niega a iniciar si establece un multiplier superior a 1.

Enviar las tasas a clientes conectados

Con v2.1.268 o posterior en el servidor de gateway, el gateway también coloca las tasas de pricing en las políticas managed que sirve, como la configuración administrada modelPricing. Los desarrolladores coincididos por una política ven las tasas de pricing para el primer upstream que sirve cada ID de modelo en /usage, la línea de estado y OpenTelemetry. Un desarrollador que no coincide con ninguna política no recibe configuraciones administradas, por lo que sus cifras permanecen al precio de lista. Los clientes aplican la configuración en Claude Code v2.1.242 o posterior.
  • Lo que agrega el gateway: a menos que el bloque cli de una política ya establezca modelPricing, el gateway agrega el multiplier y, para cada ID de modelo que un cliente pueda solicitar, la fila de anulación del primer upstream que sirve ese ID. Una tasa que solo un upstream de conmutación por error cobra permanece en el gateway.
  • Optar una política: establezca modelPricing en {} en el bloque cli de esa política, y sus desarrolladores permanecen al precio de lista.
  • Mantener las tasas propias de una política: una política cuyo bloque cli establece modelPricing con su propio multiplier u overrides mantiene ese modelPricing completo, y el gateway no agrega tasas propias a él.

models

El bloque models es una lista de modelos opcional curada por administrador, servida en /v1/models y utilizada para traducir IDs de modelo por upstream. Es obligatorio para regiones de Amazon Bedrock que no sean EE.UU., ARN de rendimiento aprovisionado de Amazon Bedrock y nombres de implementación de Microsoft Foundry.
Cada clave bajo upstream_model debe coincidir con el name de un upstream configurado, que por defecto es el nombre del proveedor. Una clave que no coincida con ningún upstream falla al iniciar, por lo que omita las líneas para proveedores que no utiliza.

managed

El bloque managed define políticas de acceso basadas en roles con clave en grupos de IdP o dominio de correo electrónico. Las políticas se evalúan en orden; se selecciona la primera coincidencia, luego se fusiona en la base de captura general match: {}. Se sirven por usuario en GET /managed/settings con almacenamiento en caché de ETag/304.
Una captura general match: {}, convencionalmente enumerada al final, se trata como una capa base. Cada otra política hereda cualquier clave que no establezca de la captura general, por lo que las entradas por rol solo necesitan enumerar lo que difiere del valor predeterminado de la organización. Las reglas de fusión dependen del tipo de clave:
  • Listas de permitidos: availableModels y permissions.allow. La lista de una política específica reemplaza completamente la de la base.
  • Listas de denegados y arrays de hooks: permissions.deny, permissions.ask, disabledMcpjsonServers, deniedMcpServers, blockedMarketplaces y cada array de tipo de evento hooks. Estos toman la unión de base y política, por lo que un hook de denegación o auditoría en toda la organización no puede ser eliminado accidentalmente por una anulación por rol.
  • Claves de tipo registro: env, modelOverrides y skillOverrides. Estas se fusionan superficialmente, por lo que un bloque env por rol anula las claves que establece y hereda el resto de la base.
availableModels también se aplica en el lado del servidor en /v1/messages, por lo que un modelo denegado devuelve 400 independientemente de lo que envíe el cliente. El gateway valida el valor model en sí antes de retransmitir una solicitud, por lo que un valor mal formado nunca llega a un upstream. Rechaza la solicitud con un 400 en dos casos:
  • Cuando el valor falta o está vacío, el gateway rechaza la solicitud con el mensaje model is required. Esa comprobación requiere un gateway que ejecute Claude Code v2.1.228 o posterior.
  • Cuando el valor está presente pero no es una cadena, el gateway rechaza la solicitud con el mensaje model must be a string. Requiere un gateway que ejecute Claude Code v2.1.221 o posterior.
Un usuario autenticado que no coincida con ninguna política obtiene los valores predeterminados del gateway, lo que significa cada modelo en el catálogo y sin configuraciones administradas. Agregue una captura general match: {} al final si desea una política predeterminada garantizada.
El gateway no mantiene su propio directorio de usuarios. Autoriza cada solicitud desde el token de IdP del usuario, leyendo la pertenencia al grupo de la reclamación groups del token y evaluando políticas contra ella. No hay un registro para enumerar y no hay cuentas para crear previamente, y por lo tanto no hay punto final SCIM, porque no hay nada para que SCIM sincronice.Ejecute la gestión del ciclo de vida del usuario y el grupo en la fuente de verdad, que es el aprovisionamiento SCIM nativo de su IdP o una plataforma dedicada de gobernanza de identidades. La pertenencia y desaprovisionamiento gobernados allí fluyen hacia el gateway automáticamente a través del token. Si desea el aprovisionamiento SCIM de las propias cuentas de Claude, esa es una capacidad de Claude for Enterprise.Se aplican dos relojes de propagación:
  • Contenidos de política: editar una política y reimplementar llega a clientes conectados en su próxima encuesta de configuraciones administradas, dentro de una hora, aparte de los cambios que se aplican solo en el próximo lanzamiento
  • Pertenencia al grupo: cambiar la pertenencia al grupo de un usuario cambia qué política los coincide. Esto entra en vigor en el próximo acuñamiento de sesión, lo que significa el próximo refresco silencioso, limitado por session.ttl_hours.

Valores de coincidencia que detienen el gateway al iniciar

Al iniciar, el gateway comprueba el bloque match de cada política y la lista admin_groups. Cualquiera de estos valores detiene el gateway con un error que nombra el campo:
  • Una lista groups vacía
  • Una entrada vacía en groups o en admin_groups
  • Un email_domain vacío
  • Un email_domain que contiene @, espacios en blanco o una coma. El gateway recorta el valor y elimina una @ inicial antes de esta comprobación. Escriba un dominio desnudo, como example.com.
Antes de v2.1.232, el gateway se iniciaba con estos valores. Cada valor tenía este efecto:
  • Un email_domain vacío: el gateway omitía la comprobación de dominio, por lo que una política con un email_domain vacío y sin lista groups coincidía con cada usuario autenticado
  • Una lista groups vacía: la política no coincidía con nadie
  • Un email_domain que contiene @, espacios en blanco o una coma: la política no coincidía con nadie
  • Una entrada vacía en groups o en admin_groups: la entrada coincidía con un usuario solo cuando la reclamación groups del IdP de ese usuario también contenía una entrada vacía. En admin_groups, esa coincidencia otorgaba acceso administrativo. Si su lista admin_groups nunca contenía una entrada vacía, nadie obtenía acceso administrativo de esta manera.

Qué va en cli

Cada valor cli es un documento completo de managed-settings.json de Claude Code, el mismo esquema que implementaría a través de MDM o /etc/claude-code/managed-settings.json, expresado aquí como YAML. El CLI aplica el documento entregado en el nivel administrado, por encima de la configuración de usuario y proyecto, en lugar de la configuración administrada por servidor. Por lo tanto, ignora la configuración restringida a fuentes de política a nivel de SO, como policyHelper y wslInheritsWindowsSettings. El gateway valida cada documento contra el esquema de configuración del CLI al iniciar, por lo que una clave de nivel superior no reconocida falla al iniciar con un error que nombra cada clave ofensiva. Las partes deliberadamente abiertas del esquema aún aceptan valores arbitrarios, porque clientes más nuevos pueden reconocer entradas que el esquema del gateway no. Estas claves abiertas incluyen env, pluginConfigs y claves anidadas bajo permissions. Debido a que la validación utiliza el esquema incluido con la versión instalada del gateway, poner una clave de configuración de nivel superior introducida por una versión más nueva de Claude Code en la configuración administrada requiere actualizar primero el gateway. Pruebe una nueva política en un cliente antes de implementarla. La referencia de clave completa está en Configuración de Claude Code. Las claves que los operadores buscan primero:
Debido a que estas configuraciones llegan a través de la red, el CLI muestra a cada desarrollador un diálogo de aprobación de seguridad antes de aplicar la configuración enumerada a continuación:
  • hooks
  • Variables env que requieren la aprobación del desarrollador, como variables de proxy y URL base
  • configuraciones de ejecución de shell como apiKeyHelper y statusLine
  • la configuración de binario de sandbox sandbox.bwrapPath, sandbox.socatPath y sandbox.ripgrep
  • Configuraciones de Sandbox que interceptan tráfico, inyectan credenciales o debilitan el aislamiento, como sandbox.network.tlsTerminate y la configuración del puerto proxy. Diálogos de aprobación de seguridad los enumera todos.
Memoria de aprobación cubre cuánto tiempo dura una aprobación y cuándo aparece el diálogo nuevamente. Claude Code aplica algunas variables env entregadas sin mostrar al desarrollador el diálogo de aprobación, como configuraciones de selección de modelos y límites numéricos. Otras variables entregadas pueden requerir la aprobación del desarrollador antes de que surtan efecto; un valor de proxy, URL base u OTEL_EXPORTER_OTLP_ENDPOINT no vacío siempre lo hace. Cuando una variable entregada necesita aprobación, el diálogo la nombra. Variables de entorno y el diálogo de aprobación tiene los detalles, incluidos cuatro conmutadores de privacidad cuyo valor entregado decide si necesitan aprobación. Antes de v2.1.218, Claude Code aplicaba menos variables sin preguntar al desarrollador, por lo que más variables entregadas activaban el diálogo. La configuración de telemetría del gateway inserta OTEL_EXPORTER_OTLP_ENDPOINT, por lo que establecer telemetry.forward_to activa el diálogo en cada cliente interactivo. El diálogo protege la máquina del desarrollador de un gateway comprometido u hostil, no la organización del desarrollador. Una ejecución no interactiva con la bandera -p no puede mostrar el diálogo. Aplica la configuración insertada para esa ejecución solo y no la registra como aprobada, por lo que la próxima sesión interactiva del desarrollador aún muestra el diálogo. Antes de v2.1.207, una ejecución no interactiva guardaba la configuración como aprobada y ninguna sesión interactiva posterior mostraba el diálogo para ellas. Si un desarrollador rechaza, Claude Code sale de esa sesión en lugar de aplicar la política. Cuando inserta un nuevo hook, o cualquier variable env que active el diálogo, en una política amplia, Claude Code por lo tanto muestra el diálogo a cada desarrollador coincidente. Muestra el diálogo en una sesión en ejecución en la próxima encuesta cada hora, y de lo contrario en el próximo inicio del desarrollador. La clave cli se llamaba settings en versiones anteriores. Esa ortografía aún se acepta como un alias, pero las nuevas implementaciones deben usar cli.

Servidores MCP en una política

Para proporcionar servidores MCP a los clientes de Claude Code que coincida una política, establezca managedMcpServers en el bloque cli de esa política. Necesita Claude Code v2.1.259 o posterior en el servidor de gateway y en clientes. El gateway comprueba cada entrada al iniciar con las mismas reglas que Claude Code aplica en el cliente, y si una entrada falla una comprobación, el gateway se niega a iniciar y nombra la entrada. Si escribe una referencia ${VAR} en gateway.yaml, el gateway la resuelve desde su entorno al iniciar a través de expansión de secretos antes de ejecutar las comprobaciones de entrada, por lo que cada cliente coincidente recibe el valor literal y puede leerlo. La orientación de encabezado para servidores proporcionados se aplica al valor expandido. El gateway rechaza la ortografía .mcp.json mcpServers en un bloque cli, y su error de inicio nombra managedMcpServers como la clave a usar. Antes de v2.1.259, el gateway rechazaba cualquier definición de servidor MCP en un bloque cli.

Superposición de Claude Desktop

Si su organización también implementa Claude Desktop, el mismo gateway sirve a ambos clientes. Apunte bootstrapUrl, en la configuración administrada de Claude Desktop, a <listen.public_url>/user/bootstrap. Claude Desktop deriva el emisor de OAuth de esa URL, ejecuta el mismo inicio de sesión de código de dispositivo contra este gateway y obtiene su configuración de la respuesta.
Requiere Claude Code v2.1.203 o posterior en el servidor de gateway, y una opción explícita: /user/bootstrap devuelve 404 a menos que la política que coincida con el usuario lleve una clave desktop. Un desktop: {} vacío opta una política, y una clave desktop en la capa base match: {} opta en cada política que la hereda. El registro de auditoría registra cada solicitud como desktop_bootstrap.serve o desktop_bootstrap.denied.
El gateway deriva gran parte de la respuesta del bloque cli de la política coincidente y de la configuración del gateway de nivel superior:
  • La lista de modelos, de availableModels
  • Herramientas deshabilitadas, de entradas permissions.deny de nombre de herramienta desnudo. Si establece disabledBuiltinTools en el bloque desktop de la política, el gateway sirve la unión de su valor y la lista derivada, por lo que puede deshabilitar más herramientas de esta manera pero no puede volver a habilitar una que deshabilitó a través de permissions.deny
  • La lista de permitidos de salida, de sandbox.network.allowedDomains. Si establece coworkEgressAllowedHosts en el bloque desktop de la política, el gateway usa ese valor en lugar de la lista derivada
  • Un punto final OTLP que apunta al gateway mismo, y los atributos de identidad del usuario conectado. El gateway retransmite las exportaciones que recibe en ese punto final a sus destinos forward_to. Incluye el punto final y los atributos cuando establece tanto telemetry.forward_to como listen.public_url. Claude Desktop exporta cada señal con una codificación: http/protobuf, o http/json cuando establece OTEL_EXPORTER_OTLP_PROTOCOL o uno de sus variantes por señal en http/json en el env de la política. Antes de Claude Code v2.1.261 en el servidor de gateway, la respuesta establecía http/json independientemente, por lo que un recopilador que acepta solo protobuf rechazaba las exportaciones de Claude Desktop
Para establecer disabledBuiltinTools, coworkEgressAllowedHosts o la configuración managedMcpServers propia de Claude Desktop en el bloque desktop de una política, necesita Claude Code v2.1.232 o posterior en el servidor de gateway. El managedMcpServers de Claude Desktop toma un valor de array en lugar de un objeto. El gateway omite claves sin equivalente de Claude Desktop, como hooks y reglas de permisos con alcance como Bash(npm *), de la respuesta de bootstrap. Agregue el bloque desktop opcional junto a cli para establecer la configuración de Claude Desktop directamente. Escriba la configuración de la referencia de configuración administrada de Claude Desktop como nombres de clave planos. Deje fuera las claves que Claude Desktop lee solo de MDM o archivos locales, como bootstrapUrl; el gateway las rechaza al iniciar. Antes de v2.1.232, el gateway aceptaba una lista fija de 11 claves de puerta de características, como chatTabEnabled y disableAutoUpdates, y rechazaba todas las demás claves al iniciar. Antes de v2.1.227, el gateway también rechazaba chatTabEnabled y chatAdvancedFileAnalysisEnabled al iniciar.
Cada clave es opcional; Claude Desktop aplica su propio valor predeterminado para cualquier clave que omita. El gateway valida cada bloque desktop al iniciar contra el esquema de configuración que el propio Claude Desktop usa, por lo que un error aparece al inicio del gateway como un error que nombra la clave en lugar de llegar a cada desktop conectado. El gateway falla al iniciar cuando un bloque contiene:
  • Una clave desconocida
  • Una clave reconocida cuyo valor Claude Desktop rechazaría o dejaría caer silenciosamente, como un valor vacío o una subclave mal escrita dentro de una entrada anidada. Antes de v2.1.260, el gateway dejaba caer silenciosamente un campo mal escrito dentro de un objeto anidado de una entrada managedMcpServers u orgPluginSettings en lugar de fallar al iniciar.
  • Una clave que el gateway calcula a sí mismo: la conexión de inferencia, la lista de modelos y el relé OTLP. Configure esos a través de upstreams, models y la sección telemetry de forward_to.
  • Un alias heredado de una clave actual. En el error de inicio, el gateway nombra la clave canónica a escribir.
Si utiliza un valor o forma de entrada obsoleta, como una entrada managedMcpServers sin transport, el gateway se inicia y registra una advertencia que nombra el reemplazo. El gateway valida un bloque desktop contra el esquema incluido con su versión instalada, como lo hace con el bloque cli. Para entregar una configuración introducida por una versión más nueva de Claude Desktop, actualice primero el gateway. Por ejemplo, userPluginMarketplacesEnabled y userPluginUploadsEnabled necesitan Claude Code v2.1.260 o posterior en el servidor de gateway y Claude Desktop 1.37937.0 o posterior en las máquinas de los miembros. Si establece orgPluginSettings en el bloque desktop de una política, el gateway lo sirve en la forma de array que Claude Desktop 1.15200.0 y posterior lee. Los desktops más antiguos ignoran el array y no aplican ninguna política de herramientas de plugins, por lo que actualice a los miembros a 1.15200.0 o posterior antes de confiar en ello. El gateway rellena las claves que el bloque desktop de una política no establece desde el bloque desktop de la captura general match: {}, de la misma manera que rellena el bloque cli de una política desde la base. Si establece disabledBuiltinTools o builtinToolPolicy en la base y una política de rol, el gateway mantiene la restricción de la base:
  • disabledBuiltinTools: el gateway usa la unión de la lista de la base y la lista de la política
  • builtinToolPolicy: si establece una herramienta en un valor distinto de allow en la base, el gateway mantiene ese valor incluso si establece allow para la misma herramienta en una política de rol
Para todas las demás claves, si las establece en la política de rol, el gateway usa el valor de la política de rol. El gateway reemplaza un array o un objeto anidado como banner completo, por lo que si establece banner.text en una política de rol, el gateway descarta el banner.backgroundColor de la base. Si no implementa Claude Desktop, deje desktop completamente fuera de sus políticas; el gateway luego devuelve 404 desde /user/bootstrap para cada usuario.

Precedencia con otras fuentes administradas

Si un dispositivo también tiene una política entregada por MDM o un managed-settings.json local, la configuración entregada por gateway ocupa el primer lugar. Precedencia dentro del nivel administrado en la página de configuraciones administradas dice cuándo se aplican las fuentes locales, y tiene las claves que Claude Code lee de cada fuente de administrador independientemente de qué fuente seleccionó, como las claves de bloqueo de sandbox, forceRemoteSettingsRefresh y el env por variable. Un policyHelper configurado en un perfil MDM o el archivo de configuraciones administradas se ejecuta solo cuando el gateway no entrega configuraciones; la entrada dice qué reemplaza su salida. Los hosts de incrustación como Claude Desktop pueden suministrar política a través de la opción SDK managedSettings. Configuraciones principales de hosts de incrustación dice cuándo Claude Code la aplica, y Restringir configuraciones principales enumera qué configuraciones de dirección de permitidos aún se aplican sin los bloqueos allowManaged*Only. Las políticas de gateway se aplican a cada invocación de Claude Code en la máquina, incluidas ejecuciones no interactivas claude -p y sesiones generadas por el SDK de Agent. Si el gateway es inaccesible al iniciar, las sesiones conectadas salen con un error en lugar de ejecutarse sin su política.

telemetry

El CLI envía métricas, registros y, cuando está habilitado, trazas al gateway, que las retransmite textualmente a cada destino configurado. Las exportaciones utilizan OpenTelemetry Protocol (OTLP) sobre HTTP. Para omitir el relé y hacer que las sesiones exporten directamente a su recopilador, nombre el recopilador en una política. Consulte Monitoreo de uso para las métricas y eventos que emite el CLI. El CLI marca cada exportación con la identidad del usuario autenticado, leída del JWT emitido por el gateway: los atributos user.id, user.email y user.groups. La atribución de costo y uso por desarrollador funciona sin configuración en el lado del desarrollador. Claude Desktop y las sesiones de Cowork conectadas a través del gateway marcan su telemetría con user.email y user.groups junto a enduser.id, por lo que puede cubrir el uso de terminal, Desktop y Cowork con una consulta en user.email o user.groups. user.groups es la lista de grupos de IdP separada por comas. La telemetría de Desktop y Cowork también lleva enduser.sub, la reclamación sub que su proveedor de identidades emite para el usuario, que permanece igual cuando cambia el correo electrónico de un usuario. Las sesiones de terminal marcan el mismo valor bajo user.id, por lo que una consulta que coincida con enduser.sub contra user.id de terminal cubre el uso de terminal, Desktop y Cowork de un usuario junto. En las exportaciones de Desktop y Cowork, user.id es un identificador anónimo, no el sujeto. Como todos los datos de OpenTelemetry de Claude Code, estos atributos van solo a destinos que su organización configura, nunca a Anthropic. Si la lista de grupos de un usuario es más larga que 255 caracteres una vez codificada en porcentaje, o un nombre de grupo contiene una coma o un signo igual, el gateway deja user.groups fuera de la telemetría de Desktop y Cowork de ese usuario en lugar de truncarla. Las sesiones de terminal de ese usuario aún llevan la lista completa. El gateway deja enduser.sub cuando el sujeto es más largo que 255 caracteres una vez codificado en porcentaje, o contiene un espacio, un carácter fuera de ASCII imprimible, o uno de , ; = \ " %. La telemetría de Desktop y Cowork de ese usuario mantiene sus otros atributos. Necesita Claude Code v2.1.265 o posterior en el servidor de gateway para user.email y user.groups en la telemetría de Desktop y Cowork, y Claude Desktop 1.24012 o posterior en la máquina de cada desarrollador para user.groups. Necesita Claude Code v2.1.274 o posterior en el servidor de gateway para enduser.sub.
Cada destino opta en metrics, logs y traces independientemente, y el valor predeterminado es solo métricas. Las señales difieren en sensibilidad:
  • Métricas: contadores agregados como conteos de tokens, conteos de solicitudes y latencia
  • Registros y trazas: pueden llevar comandos Bash completos, entradas de herramientas y rutas de archivos, cubriendo cualquier cosa que Claude Code haga en la máquina de un desarrollador
Habilite registros y trazas solo en destinos con los controles de acceso y la política de retención que esos datos justifican.
Cada URL forward_to debe usar https://, con una excepción para un recopilador en la interfaz de loopback del gateway:
  • http://localhost:<port> pasa la validación de configuración, pero la guardia SSRF bloquea cada exportación con ECONNREFUSED_SSRF a menos que establezca CLAUDE_GATEWAY_ALLOW_LOOPBACK=1 en el entorno del gateway
  • http://127.0.0.1:<port> o http://[::1]:<port> falla al iniciar a menos que esa variable esté establecida
Para un recopilador en el clúster, expóngalo sobre HTTPS en su propia dirección interna, o ejecútelo como un sidecar con la variable establecida. Cuando HTTPS_PROXY está establecido, el gateway envía exportaciones a través de ese proxy. Para llegar a un recopilador interno directamente, agréguelo a NO_PROXY por nombre de host o por un dominio con un punto inicial como .internal.example.com, que requiere Claude Code v2.1.277 o posterior en el servidor de gateway. Asegúrese de que el gateway pueda llegar al recopilador sin el proxy. Una entrada sin un punto inicial coincide solo con ese nombre exacto, no con nombres bajo él. Los rangos CIDR no coinciden. Con salida solo proxy activada, permita el recopilador en el proxy en su lugar, ya que cualquier entrada NO_PROXY mantiene la salida solo proxy desactivada. La telemetría está desactivada en el CLI de forma predeterminada. Cuando establece tanto telemetry.forward_to como listen.public_url, el gateway la activa para clientes conectados insertando seis variables de entorno a través de /managed/settings:
  • CLAUDE_CODE_ENABLE_TELEMETRY=1
  • OTEL_METRICS_EXPORTER, OTEL_LOGS_EXPORTER y OTEL_TRACES_EXPORTER, cada uno establecido en otlp si al menos un destino forward_to habilita esa señal y en none de lo contrario
  • OTEL_EXPORTER_OTLP_ENDPOINT=<public_url>
  • OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
Cuando agrega sus propias etiquetas, el gateway también inserta OTEL_RESOURCE_ATTRIBUTES. Antes de Claude Code v2.1.265 en el servidor de gateway, el gateway insertaba los tres selectores de exportador como otlp, incluido para señales que ningún destino optó. El punto final insertado se construye a partir de la URL pública, por lo que las métricas y registros no necesitan configuración OTEL de desarrolladores o políticas. Los desarrolladores conectados a través de /login no pueden redirigir exportaciones con su propia configuración OTEL:
  • Variables establecidas localmente: Claude Code aplica las variables insertadas en el nivel administrado, por lo que cada una anula el valor que un desarrollador establece localmente.
  • Puntos finales configurados localmente: con la exportación OTLP/HTTP habilitada, el CLI ignora cualquier punto final configurado localmente, independientemente de si el gateway insertó las variables de telemetría. Sus exportaciones van al gateway a menos que una política nombre su recopilador como punto final.
Sin un destino forward_to para una señal, el gateway la acepta y la descarta. Si los desarrolladores ya exportan telemetría de Claude Code a uno de sus recopiladores, agréguelo como destino forward_to, con registros o trazas habilitadas si exportan esos, para que continúe recibiendo sus datos después de que se conecten. Para omitir el relé en su lugar, nombre el recopilador en una política. Trazas también requieren CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1 en cada cliente. Establézcalo en el bloque env de una política administrada, ya que el gateway no lo inserta. Los desarrolladores lo aprueban en el mismo diálogo de aprobación de seguridad que el punto final insertado ya activa. Establézcalo en 1 solo en las políticas cuyos grupos desea rastrear. Una política que no lo establece hereda el valor de su política de captura general match: {} si esa política establece uno, según las reglas de fusión. Para evitar que los clientes de un grupo envíen trazas incluso cuando un desarrollador establece la variable localmente, establézcala en 0 en la política de ese grupo. Tanto las codificaciones OTLP de protobuf como JSON se retransmiten, y cualquier backend compatible con OpenTelemetry funciona como destino.

Agregar sus propias etiquetas

Para poner etiquetas fijas como service.namespace o deployment.environment.name en la telemetría de sesiones conectadas a través del gateway, establezca telemetry.resource_attributes. Cada etiqueta es un atributo de recurso de OpenTelemetry, y cada destino recibe las mismas etiquetas. Las sesiones obtienen las etiquetas solo cuando también establece telemetry.forward_to y listen.public_url. Este ejemplo agrega dos etiquetas:
El gateway se niega a iniciar cuando una etiqueta rompe una de estas reglas, y el error de inicio nombra la etiqueta:
  • Los nombres usan solo letras, dígitos, ., _ y -
  • Los nombres no están reservados. Comparados en cualquier caso de letra, los nombres reservados son todo lo que comienza con user., enduser. o identity., más service.name, service.version, claude.deployment_mode, host.arch, os.type, os.version y wsl.version
  • Los valores son ASCII imprimible no vacío sin espacio y ninguno de , ; = \ " %
  • Los valores tienen como máximo 255 caracteres tal como los cuenta el gateway después de la codificación en porcentaje, por lo que /, : y @ cada uno cuentan como tres
  • Los valores son texto, por lo que cite un número, true o false
Necesita Claude Code v2.1.281 o posterior en el servidor de gateway para establecer telemetry.resource_attributes. Un gateway anterior se niega a iniciar cuando encuentra la clave. Actualice cada réplica antes de agregar la clave y elimine la clave antes de revertir a una versión anterior. Las sesiones de terminal conectadas a través de /login reciben las etiquetas como OTEL_RESOURCE_ATTRIBUTES, insertadas con las otras variables de telemetría. Si establece OTEL_RESOURCE_ATTRIBUTES en el bloque env de una política, las sesiones de terminal que esa política coincide obtienen ese valor en lugar de las etiquetas. Claude Desktop recibe las etiquetas del gateway junto a user.email y los otros atributos de identidad. Claude Code también copia cada etiqueta en cada punto de datos de métrica, por lo que puede filtrar métricas por ella en un backend que no indexa atributos de recurso. Para desactivar esa copia, consulte Control de cardinalidad de métricas.

Exportar directamente a su recopilador

Para hacer que las sesiones conectadas a través de /login envíen telemetría directamente a su recopilador en lugar de a través del relé, establezca OTEL_EXPORTER_OTLP_ENDPOINT en la URL base https:// del recopilador en el bloque env de una política administrada. Claude Code añade /v1/metrics, /v1/logs o /v1/traces a la URL que establece, como https://otel-collector.example.com:4318, y exporta cada señal allí sobre OTLP/HTTP. Requiere Claude Code v2.1.265 o posterior en la máquina de cada desarrollador. Los clientes anteriores exportan a través del relé. Para autenticarse en el recopilador, establezca OTEL_EXPORTER_OTLP_HEADERS en el mismo bloque env. Las sesiones nunca envían el token de sesión de gateway del desarrollador a un recopilador nombrado de esta manera. Cuando agrega o cambia este punto final en una política, Claude Code pide a cada desarrollador que lo apruebe en el diálogo de aprobación de seguridad antes de aplicarlo en una sesión interactiva. Claude Code comprueba el punto final antes de exportar una señal directamente, y mantiene esa señal en el relé cuando una comprobación falla. Las comprobaciones incluyen:
  • El punto final proviene del gateway mismo. Si establece la misma variable en un perfil MDM o un managed-settings.json local, las exportaciones permanecen en el relé.
  • La URL usa https://, o http:// a una dirección de loopback
  • La URL se resuelve en una ruta que termina en /v1/<signal>, sin consulta o fragmento. Claude Code construye esa ruta a sí mismo desde la variable genérica. Utiliza una variable por señal como OTEL_EXPORTER_OTLP_METRICS_ENDPOINT tal como está escrita, por lo que incluya la ruta completa allí.
  • La URL no es el host del gateway. Un punto final dirigido al gateway mantiene la ruta de relé y su token de sesión.
  • Ni usted ni el desarrollador han configurado otelHeadersHelper en ninguna fuente de configuración. Con un ayudante configurado, cada señal permanece en el relé.
El punto final que nombra cambia solo dónde van las exportaciones. Aún elige qué señales exportan en absoluto con los selectores OTEL_*_EXPORTER. El punto final solo no activa la exportación, por lo que también establezca las variables que lo hacen, a menos que el gateway ya las inserte:
  • Si el gateway ya inserta las variables de telemetría, cubren habilitación, selectores y protocolo, y su punto final explícito anula el valor <public_url> insertado. Establezca un selector OTEL_*_EXPORTER en otlp usted mismo solo para una señal que ningún destino forward_to habilita.
  • Si no, también establezca CLAUDE_CODE_ENABLE_TELEMETRY=1, los selectores OTEL_*_EXPORTER y OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf.
Cuando el desarrollador se desconecta, o se conecta a un gateway diferente, las exportaciones al recopilador se detienen y Claude Code descarta cada lote restante en lugar de enviarlo.

Cuando un destino falla

El gateway no almacena en búfer, reintenta ni almacena telemetría, por lo que descarta una exportación que no llega a un destino en lugar de entregarla tarde. Cada destino tiene éxito o falla por su cuenta, y el cliente exportador recibe una respuesta de éxito de cualquier manera, por lo que una entrega fallida aparece solo en el registro del gateway. Después de cinco entregas consecutivas fallidas a un destino, el gateway pausa el reenvío a él en tramos de 30 segundos, registrando cada pausa, hasta que una entrega tiene éxito. Cualquier respuesta de error, tiempo de espera o error de conexión cuenta como una entrega fallida, excepto 400, 413, 415, 422 y 431, que significan que el recopilador rechazó la carga útil de esa exportación como mal formada o demasiado grande. Una carga útil rechazada ni avanza ni reinicia el contador de fallos: el gateway continúa reenviando al destino y registra una advertencia que lo nombra y el estado, en el primer rechazo del destino y cada centésimo después.

Ajuste HTTP

Cuatro bloques opcionales de nivel superior, access_control, limits, timeouts y rate_limits, ajustan la superficie HTTP. Los valores predeterminados se adaptan a la mayoría de implementaciones. Si deja ambas listas access_control vacías, que es el valor predeterminado, el gateway sirve cualquier dirección de cliente, por lo que solo su red restringe quién puede alcanzarlo. Eso importa porque un gateway puede insertar configuraciones administradas que ejecutan comandos en máquinas de desarrolladores. Mientras allow_cidrs esté vacío, el gateway advierte en dos lugares, sin cambiar cómo responde a ninguna solicitud:
  • Al iniciar: una advertencia en el registro operacional recomienda permitir solo los rangos privados 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10, 127.0.0.0/8, ::1/128 y fc00::/7, más cualquier otro rango interno desde el que se conectan sus desarrolladores. Si vincula el gateway a una dirección de loopback y no establece ni trusted_proxies ni public_url, como en desarrollo local, la advertencia no aparece.
  • En tiempo de ejecución: la primera vez que llega una solicitud desde una dirección fuera de esos rangos privados, el gateway registra una advertencia y emite un evento de auditoría access.public_client que lleva la dirección IP del cliente. Ambos se disparan una vez por proceso. Las direcciones de enlace local, 169.254.0.0/16 y fe80::/10, no cuentan como públicas. El gateway responde /healthz y /readyz antes de que se ejecute esta comprobación, por lo que los sondeos de salud desde rangos públicos no la activan.
Ambas señales utilizan la dirección del cliente tal como la resuelve el gateway. Si un equilibrador de carga, reenvío de puerto o túnel retransmite tráfico y no está enumerado en listen.trusted_proxies, el gateway ve la dirección del relé, que generalmente es privada, por lo que ni la advertencia en tiempo de ejecución ni una lista de permitidos privada lo detecta. Detrás de tal front end, establezca primero listen.trusted_proxies para que el gateway vea direcciones de cliente reales, y mantenga el gateway y todo lo que está frente a él inaccesible desde la internet pública independientemente.

load_test_mode

El bloque load_test_mode le permite hacer pruebas de carga en un gateway sin llamar a un proveedor de modelos. Mientras está activado, el gateway construye y firma cada solicitud de proveedor como de costumbre, la descarta en lugar de enviarla, y transmite una respuesta enlatada a través de su ruta de respuesta normal. La respuesta es texto de relleno que comienza con una oración que dice que es enlatada. Requiere Claude Code v2.1.282 o posterior en el servidor de gateway. Las versiones anteriores se niegan a iniciar cuando encuentran la clave. Actualice cada réplica antes de agregar el bloque y elimine el bloque antes de revertir. El ejemplo a continuación activa el modo con los valores predeterminados, una respuesta de aproximadamente 750 tokens de texto transmitida durante aproximadamente 10 segundos:
Una prueba de carga en este modo cubre el gateway, su Postgres y todo lo que está frente al gateway. No cubre los límites, velocidad o ruta de red del proveedor. Ninguna solicitud de modelo se envía al proveedor, por lo que la CPU de una réplica por solicitud es una estimación y se lee más baja que la producción, que también cifra su tráfico al proveedor. Confirme un recuento de réplica con un pequeño piloto contra el proveedor real. Antes de v2.1.283, la estimación se lee mucho más baja. Mientras el modo está activado, una solicitud puede llevar un encabezado x-load-test-user que contenga un número entero de hasta siete dígitos. El gateway cuenta cada número como un desarrollador separado, con el correo electrónico y grupos del desarrollador cuyo token vino con la solicitud. Asigne a la implementación de prueba de carga su propia base de datos vacía, porque el gateway se niega a iniciar con el modo activado contra una base de datos en la que algún desarrollador ya ha gastado algo.
Nunca active esto para un gateway que los desarrolladores usan. Cada solicitud obtiene la respuesta enlatada y ningún modelo se llama. El gateway registra una advertencia load_test_mode is on al iniciar y marca cada evento de auditoría inference con load_test: true mientras el modo está activado.

Ejemplo completo

Esta configuración de referencia completa ejercita cada sección central; los bloques de ajuste HTTP mantienen sus valores predeterminados. Cópiela, elimine lo que no necesite y complete sus valores. La configuración en el Inicio rápido es una versión mínima de esta.
gateway.yaml

Configuración administrada del lado del cliente

Todo lo anterior configura el servidor de puerta de enlace. Apuntar máquinas de desarrollador a la puerta de enlace se configura por separado, en cada dispositivo, a través de la configuración administrada de Claude Code. La puerta de enlace no puede empujar las claves de inicio de sesión por sí misma, porque son lo que le dice al cliente dónde está la puerta de enlace. Para el CLI, establezca estas claves en el managed-settings.json por SO. Las dos claves de inicio de sesión enrutan el /login de cada desarrollador a su puerta de enlace:
parentSettingsBehavior: "merge" mantiene el funcionamiento de la entrega de Claude Desktop de la lista de permitidos de salida a sus sesiones de Claude Code integradas; Entregar política a sesiones de Claude Desktop explica el mecanismo y dónde debe estar la aceptación. Implemente el archivo managed-settings.json en cada dispositivo, típicamente a través de su plataforma MDM. La ruta del archivo difiere por plataforma. Consulte dónde almacena cada mecanismo la política. De forma predeterminada, una política de registro en Windows o una plist de preferencias administradas en macOS reemplaza el archivo managed-settings.json en lugar de fusionarse con él, aparte de las claves de excepción y verificaciones entre fuentes anteriores. Las tres claves en este fragmento siguen la regla de fuente de prioridad más alta, por lo que las flotas que entregan política a través de Política de grupo o perfiles de configuración deben poner las tres en ese mecanismo en su lugar. Para Claude Desktop, establezca la clave bootstrapUrl en la propia configuración administrada de Claude Desktop en <listen.public_url>/user/bootstrap. El flujo de inicio de sesión y la política por grupo coinciden entonces con los del CLI una vez que una política se acepta del lado del servidor con una clave desktop; sin la aceptación, /user/bootstrap devuelve 404. Consulte Superposición de Claude Desktop para la mitad del lado del servidor. Claude Code honra forceLoginGatewayUrl, gatewayInternalNetworks, y el valor "gateway" de forceLoginMethod solo desde una fuente administrada en la máquina: managed-settings.json, la plist de macOS o el registro HKLM de Windows, o un asistente de política. Establecerlos en el ~/.claude/settings.json propio de un desarrollador no configura el inicio de sesión de la puerta de enlace, y tampoco lo hace establecerlos en la carga útil de la puerta de enlace. Deje forceLoginMethod y forceLoginOrgUUID fuera de la carga útil. Claude Code aún lee ambas claves de la carga útil para su verificación de credenciales de inicio, por lo que un desarrollador que mantenga una credencial emitida por Anthropic en la máquina obtiene la salida de inicio descrita en La política del administrador requiere un inicio de sesión de puerta de enlace en la nube incluso después de que inicie sesión.