Proveedor de inferencia
Envía las llamadas al modelo desde tu servidor autoalojado de Claude Managed Agents a Amazon Bedrock, Claude Models on Google Cloud (Google managed), Microsoft Foundry o un gateway de modelos que ejecutes tú, en lugar de a la Claude API.
De forma predeterminada, tu servidor envía las llamadas al modelo a la Claude API. Esta página muestra cómo enviarlas a un proveedor de nube o a un gateway de modelos que ejecutes tú. Para cambiar el proveedor:
- Coloca el ejemplo de la sección de tu proveedor en esta página en el archivo de configuración del servidor.
- Proporciona al servidor la credencial del proveedor, como muestra esa misma sección.
- Reinicia el servidor, como muestra Dónde van los ajustes. En Docker Compose, si el paso 2 cambió
.envodocker-compose.yml, ejecutadocker compose up -den su lugar, porque un reinicio no los vuelve a leer. - Comprueba el proveedor.
La configuración inference.provider admite estos valores:
inference.provider | Las llamadas al modelo van a | El servidor se autentica con |
|---|---|---|
anthropic (predeterminado) | La Claude API | ANTHROPIC_API_KEY |
bedrock | Amazon Bedrock | Tu credencial de AWS |
vertex | Claude Models on Google Cloud (Google managed) | Google Application Default Credentials |
foundry | Microsoft Foundry | Una clave de API de Foundry, o Microsoft Entra ID |
gateway | Un gateway de modelos que ejecutas tú | Una clave o token que acepte tu gateway |
Con cualquier valor excepto anthropic, el servidor no necesita una clave de API de Claude. Ignora ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN y ANTHROPIC_BASE_URL. La única excepción es un gateway de modelos cuya clave le indicas al servidor que lea de una de esas variables.
Los agentes nombran los modelos por sus ID de la Claude API, como claude-opus-5-5. El servidor traduce el ID, por lo que una definición de agente funciona sin cambios con cualquier proveedor que sirva ese modelo.
Algunas herramientas y configuraciones de agentes dependen del proveedor. Consulta Diferencias que dependen de tu proveedor de inferencia.
Dar al servidor una credencial de nube
La forma en que la credencial de un proveedor de nube llega al servidor depende de tu instalación:
- Docker Compose: Pasa cada variable y archivo al servidor.
- Kubernetes: El chart del servidor no pasa variables de AWS, Google Cloud ni Azure, así que usa la identidad de carga de trabajo de tu nube. Crea una cuenta de servicio con la anotación de identidad de carga de trabajo de tu nube y establece
server.serviceAccountNameen su nombre. Elvalues.yamldel chart nombra la anotación. En Azure Kubernetes Service, establece tambiénserver.azureWorkloadIdentity: true.
Amazon Bedrock
inference:
provider: bedrock
region: us-east-1
#model_id_prefix: global.anthropic.
#model_id_overrides:
# claude-opus-5-5: us.anthropic.claude-opus-5-5El servidor firma sus llamadas con lo que encuentre en el host la cadena de credenciales predeterminada del SDK de AWS. Puede ser un rol de tarea o una identidad de pod. En una estación de trabajo, puede ser AWS_PROFILE o AWS_ACCESS_KEY_ID.
Habilita en la cuenta los modelos que uses. La identidad de AWS con la que firma el servidor necesita estos permisos:
bedrock:InvokeModelybedrock:InvokeModelWithResponseStreamsobre los modelos y perfiles de inferencia que uses.bedrock:ListFoundationModelsybedrock:ListInferenceProfilessobre el recurso*. El servidor lee las listas de modelos de Amazon Bedrock, para que los agentes puedan usar un modelo más reciente que la versión de tu servidor. Para omitir esto, estableceinference.list_models: false.
De forma predeterminada, el servidor antepone us.anthropic. a cada ID de modelo, lo que nombra un perfil de inferencia entre regiones. Para usar otra familia de perfiles, quita el comentario de model_id_prefix.
Claude Models on Google Cloud (Google managed)
inference:
provider: vertex
region: us-east5
project_id: my-project
#model_id_overrides:
# claude-haiku-4-5: claude-haiku-4-5@20251001region es obligatorio. Es una ubicación de Google Cloud’s Agent Platform que ofrece los modelos que usas, o global. project_id es el proyecto en el que se realizan y se facturan las llamadas.
El servidor usa Google Application Default Credentials: el archivo que indica GOOGLE_APPLICATION_CREDENTIALS, o la cuenta de servicio que adjunta Compute Engine, Cloud Run o GKE. Esa identidad necesita el rol roles/aiplatform.user en el proyecto. El proyecto necesita tener habilitadas la API aiplatform.googleapis.com y los modelos de Claude que uses.
Microsoft Foundry
inference:
provider: foundry
foundry:
resource: my-resource
#model_id_overrides:
# claude-opus-5-5: team-a-opusresource es el nombre de tu recurso de Foundry, la primera parte de su nombre de host: <resource>.services.ai.azure.com.
La credencial proviene del entorno del servidor:
- Una clave de API de Foundry: Establece
ANTHROPIC_FOUNDRY_API_KEY. En el stack de Compose, pasa la variable al servidor. En Kubernetes, colócala en el Secretcma-server-upstream. ConearlierNames: trueen tu archivo de valores del servidor, el Secret tiene otro nombre. Encuéntralo en Kubernetes: los nombres de tus objetos. - Microsoft Entra ID: Deja
ANTHROPIC_FOUNDRY_API_KEYsin establecer. El servidor obtiene entonces un token para una entidad de servicio, una identidad de carga de trabajo en Azure Kubernetes Service o una identidad administrada. La identidad necesita un rol de Azure en el recurso de Foundry que permita llamadas a sus implementaciones de modelos. Para una entidad de servicio, estableceAZURE_TENANT_ID,AZURE_CLIENT_IDyAZURE_CLIENT_SECRET.
Una solicitud a Foundry nombra una implementación, y el servidor envía el ID del modelo como nombre de la implementación. Si una implementación tiene otro nombre, asígnalo con model_id_overrides.
Asignar un ID de modelo diferente
Tu cuenta de nube puede tener un modelo con un ID distinto del que envía el servidor. En ese caso, quita el comentario de las líneas model_id_overrides en el ejemplo de ese proveedor y asigna el ID de la Claude API al ID de tu cuenta. Ambos ID deben nombrar el mismo modelo, porque el servidor construye cada solicitud para el modelo que nombra el agente.
Gateway de modelos
Primero comprueba qué solicitudes acepta tu gateway:
- Las mismas solicitudes que la Claude API, con una credencial de larga duración: Mantén el proveedor predeterminado. Establece
ANTHROPIC_BASE_URLen la dirección del gateway y estableceANTHROPIC_API_KEYoANTHROPIC_AUTH_TOKENen la credencial que espera el gateway. - Las mismas solicitudes que la Claude API, pero con tokens de corta duración, una credencial en otro encabezado o sus propios ID de modelo: Establece
inference.provider: gatewayconformat: anthropic-messages. - El formato InvokeModel de Amazon Bedrock: Establece
inference.provider: gatewayconformat: bedrock-invoke. - El formato
rawPredictde Claude Models on Google Cloud (Google managed): Estableceinference.provider: gatewayconformat: vertex-raw-predict.
Este ejemplo establece inference.provider: gateway con format: bedrock-invoke, para un gateway que acepta una clave de larga duración. Coloca la clave en una variable de entorno y nombra la variable, nunca el valor:
inference:
provider: gateway
gateway:
url: "https://llm-gateway.example.com/v1/model/{model}/invoke"
format: bedrock-invoke
# Quote every model_map value.
model_map:
claude-opus-5-5: "us.anthropic.claude-opus-5-5"
claude-sonnet-5: "us.anthropic.claude-sonnet-5"
credentials:
supplier: env
env: { var: LLM_GATEWAY_KEY }
send_as: { header: x-api-key }urles la ruta de modelos del gateway.{model}marca dónde va el ID del modelo. La URL debe serhttps://y terminar en/invoke.model_mapasigna cada ID de modelo que un agente puede nombrar al ID que espera el gateway. El servidor rechaza un modelo que no tiene entrada.send_asnombra el encabezado que lleva la clave. Sin él, el servidor envíaAuthorization: Bearer <key>.- En el stack de Compose, pasa la variable al servidor.
- En Kubernetes, el chart del servidor no puede pasar una variable propia. Sí pasa
ANTHROPIC_AUTH_TOKEN, que lee del Secretcma-server-upstream, así que usa ese nombre:- Establece
env: { var: ANTHROPIC_AUTH_TOKEN }. - Coloca la clave del gateway en el Secret
cma-server-upstream, con el nombreANTHROPIC_AUTH_TOKEN. ConearlierNames: trueen tu archivo de valores del servidor, el Secret tiene otro nombre. Encuéntralo en Kubernetes: los nombres de tus objetos.
- Establece
Para format: anthropic-messages, reemplaza el bloque gateway por este:
inference:
gateway:
url: "https://llm-gateway.example.com/v1/messages"
format: anthropic-messages
# Quote every model_map value.
model_map:
claude-opus-5-5: "corp-claude-opus"
claude-sonnet-5: "corp-claude-sonnet"Aquí, url es la URL completa de la ruta de Messages del gateway, sin {model}.
Para format: vertex-raw-predict, reemplaza el bloque gateway por este:
inference:
gateway:
url: "https://llm-gateway.example.com/v1/projects/my-project/locations/global/publishers/anthropic/models/{model}:rawPredict"
format: vertex-raw-predict
# Quote every model_map value.
model_map:
claude-opus-5-5: "claude-opus-5-5"
claude-sonnet-5: "claude-sonnet-5"Aquí, url es la ruta rawPredict del gateway, y debe terminar en /{model}:rawPredict. Un valor de model_map no puede contener dos puntos. El bloque credentials se mantiene igual. El servidor envía la credencial propia de tu gateway y no obtiene ninguna credencial de Google.
La referencia de configuración enumera las demás configuraciones del gateway, como streaming, y la configuración inference.headers.
Tokens de corta duración
Si tu gateway acepta tokens de corta duración, reemplaza el bloque credentials por este:
inference:
credentials:
supplier: oauth_exchange
assertion:
url: "https://app.example.com/assertion"
auth: { type: mtls, cert_file: /etc/callback/client.pem, key_file: /etc/callback/client.key }
exchange:
token_url: "https://login.example.com/oauth2/token"
grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer"El servidor obtiene entonces cada token en dos pasos. Primero, llama a un callback HTTP que construyes tú. El callback devuelve una aserción, una declaración firmada que suele ser un “JSON Web Token” (token web JSON), o JWT. Luego, el servidor intercambia la aserción en tu endpoint de tokens OAuth por el token de acceso que envía al gateway.
authes cómo se autentica el servidor ante el callback. El ejemplo usa un certificado de cliente. Para usar un token bearer que el servidor lee de un archivo, estableceauth: { type: bearer_file, token_file: /etc/callback/token }.exchangenombra tu endpoint de tokens OAuth. El servidor envía a ese endpoint sologrant_typey la aserción, sin ID ni secreto de cliente.- Si tu endpoint de tokens necesita más que eso, omite
exchange. Haz que tu callback obtenga el token de acceso en sí y lo devuelva en el campoassertion, que el servidor envía entonces al gateway. - En Kubernetes, coloca los archivos de certificado en un Secret, nómbralo en
server.extensionFiles.secretNamedel chart y apuntacert_fileykey_filea/run/cma-server/extension-files/.
El servidor envía al callback una solicitud POST con este cuerpo:
{
"version": 1,
"purpose": "inference",
"session": {
"id": "sesn_011CZkZAtmR3yMPDzynEDxu7",
"agent_id": "agent_011CYm1BLqPXpQRk5khsSXrs",
"environment_id": "env_01595EKxaaTTGwwY3kyXdtbs"
},
"principal": {
"issuer": "https://login.example.com/oauth2/default",
"subject": "00u1a2b3c4d5e6f7g8h9"
},
"request_id": "req_011CSHoEeqs5C35K2UUqR7Fy"
}principal es el llamador que creó la sesión. Para un llamador con inicio de sesión único, issuer es el issuer_url de ese llamador y subject es el sujeto del llamador. Para la clave de API del servidor, principal es {"issuer": "cma", "subject": "server"}. Haz que el callback ignore los campos que no conozca.
El callback responde con el estado 200 y este cuerpo:
{ "assertion": "<signed JWT>", "reuse": "session" }reuse indica qué sesiones pueden usar el token. Con session, el valor predeterminado, solo puede la sesión de la solicitud, lo cual es adecuado para un token que nombra a un usuario. Con deployment, las sesiones comparten el token, así que devuelve deployment solo para un token que nombra a tu organización y a ninguna persona.
Si el callback o el endpoint de tokens fallan, el turno termina con un evento session.error de tipo model_request_failed_error, y la sesión sigue siendo utilizable. El motivo está en el registro del servidor, en una línea que contiene credential supplier failed.
Si la respuesta del endpoint de tokens no tiene expires_in y el token no tiene un claim exp, el servidor envía el token pero no lo almacena. Entonces pide otro token en cada llamada al modelo.
Para las demás configuraciones, como renew_before y ca_file, consulta las tablas de la referencia de configuración de configuraciones del gateway de modelos y configuraciones de tokens de corta duración.
Tokens de Microsoft Entra ID
Si tu gateway verifica los tokens de Microsoft Entra ID con su propio registro de aplicación, reemplaza el bloque credentials por este:
inference:
credentials:
supplier: azure
azure: { scope: "api://11111111-2222-3333-4444-555555555555/.default" }scope es el URI de ID de aplicación o el ID de aplicación del registro de aplicación del gateway, seguido de /.default. Nombra solo el registro propio del gateway. Un token para otro recurso permitiría a quien ejecute el gateway actuar como el servidor en ese recurso.
El token se emite a la identidad de Azure propia del servidor, configurada como para Microsoft Entra ID en Microsoft Foundry. Si el registro requiere un rol de aplicación, asigna ese rol a la identidad antes de iniciar el servidor. Una asignación posterior solo surte efecto cuando el servidor obtiene otro token.
El token nombra a esa identidad y a ninguna persona, así que un gateway que deba saber qué persona llama necesita oauth_exchange. Ejecuta un turno a través de tu gateway, con la identidad que usarán tus servidores, antes de depender de este proveedor de credenciales.
Comprobar el proveedor
Después de cambiar la configuración y reiniciar el servidor, busca esta línea en el registro del servidor. Indica que el servidor encontró una credencial para el proveedor:
level=INFO msg="upstream credential resolved" provider=bedrockLa línea no demuestra que tu cuenta tenga un modelo habilitado. Un modelo faltante aparece como un session.error en el primer turno que lo usa.
Un gateway que nombres en ANTHROPIC_BASE_URL podría rechazar el campo o el encabezado de fallback del lado del servidor. Si todos los turnos fallan por ese motivo, establece inference.model_fallback: false en el archivo de configuración.
¿Te resultó útil esta página?