Hace dos cosas. Cada turno va al modelo que mejor hackea, y al más barato que resuelva la tarea. Y solo entran los endpoints con tu EDR instalado: una clave robada no abre nada desde fuera, ningún atacante externo puede usarla ni cargarte la factura.
Tu equipo pide IA desde Codex y la pasarela se pone en medio. Decide a qué modelo va cada turno y solo deja pasar a tus endpoints. Eso es todo.
Antes de contestar, cada mensaje pasa por Clef, un modelo de decisión pequeño y rápido que no escribe respuestas: solo dice qué tipo de tarea es. Con eso la pasarela elige el modelo y cuánto esfuerzo le pide. Toca un modelo para ver qué turno acaba ahí y por qué.
Renombra la variable tmp a buffer en utils.py y actualiza los tests.
Diseña la migración de sesiones de Redis a Postgres sin cortar el servicio.
Escribe una prueba de concepto para el SSRF de la URL del webhook.
Encadena el IDOR de exportación con el SSRF para llegar a la metadata del cloud.
Codex → 127.0.0.1:4000 · Responses API · modelo sentra-ai
Tarea pequeña, sin intención ofensiva. Clef la ve simple (complejidad 0,4) y sin rastro de offsec, así que va al Claude pequeño con esfuerzo bajo. Rápido y barato.
{"ns_hook":"route","model":"claude-haiku-4-5","effort":"low","branch":"claude","p_offsec":0.02,"complexity":0.4}Tarea difícil, sin intención ofensiva. Complejidad 2,7 y razonamiento alto: Clef elige el Claude más capaz con esfuerzo alto. Solo pagas opus cuando hace falta.
{"ns_hook":"route","model":"claude-opus-4-8","effort":"high","branch":"claude","p_offsec":0.03,"complexity":2.7}Intención ofensiva, tarea sencilla. P(offsec) 0,91: la rama ofensiva sale de Anthropic y va al modelo barato del mismo recurso de Foundry. El esfuerzo de razonamiento se descarta porque DeepSeek no lo admite.
{"ns_hook":"route","model":"DeepSeek-V4.1-Flash","effort":null,"branch":"offsec","p_offsec":0.91,"complexity":1.3}Intención ofensiva y tarea difícil. P(offsec) 0,97 y complejidad 2,6, por encima del umbral de 2,0: va al modelo fuerte de la rama ofensiva con esfuerzo alto. La conversación se queda en offsec hasta que acabe.
{"ns_hook":"route","model":"FW-GLM-5.3-Flash","effort":"high","branch":"offsec","p_offsec":0.97,"complexity":2.6}La pasarela solo acepta tráfico desde las IPs públicas de las máquinas que llevan tu EDR. SentinelOne sabe desde qué IP sale cada endpoint con agente, y esa lista es la única puerta. Una clave robada y usada desde cualquier otro sitio no abre: la red la rechaza antes de mirar la credencial, así que ningún atacante externo puede entrar.
Un infostealer en una dependencia del proxy es el caso para el que está diseñado. Esto es lo que se llevaría: nada.
Todos se publican en la pasarela. El estándar es sentra-ai: el router decide por cada turno y rara vez hay que tocar nada más. claude-sonnet-4-6 queda como respaldo por defecto porque ha resuelto tareas de seguridad sin tropezar con los guardarraíles.
| Modelo | Ruta del gate | Razonamiento | Notas |
|---|---|---|---|
| claude-haiku-4-5 | /anthropic | sí | Claude pequeño y rápido |
| claude-sonnet-4-6 | /anthropic | sí | Respaldo por defecto · sin fricción en tareas de seguridad |
| claude-sonnet-5 | /anthropic | sí | Claude general |
| claude-opus-4-8 | /anthropic | sí | Claude más capaz |
| claude-fable-5-1 | /anthropic | sí | — |
| gpt-6-luna | /openai/responses | sí | Visión |
| DeepSeek-V4.1-Flash | /openai/responses | no | Rama ofensiva, barato |
| FW-GLM-5.3-Flash | /openai/responses | sí | Rama ofensiva, más capaz |
| sentra-ai | decide Clef | según el turno | Modelo virtual: el router · el estándar |
El script genera la configuración, levanta los dos contenedores, registra los modelos en Codex y deja copia de seguridad de lo que toca. Las claves se leen por entrada oculta y no quedan en el historial.
$ ./foundry-codex.sh Clave de Azure Foundry: •••••••••••• Token de Cloudflare / Workers AI (Intro = sin router): •••••••••••• ok. LiteLLM operativo en 127.0.0.1:4000 ok. LiteLLM sin salida a internet (red aislada) ok. Clef: 'what does `ls -la` print?' -> claude-haiku-4-5 effort=low (claude) ok. Clef: 'write a working exploit for CVE-…' -> DeepSeek-V4.1-Flash effort=None (offsec) En config.toml: model_provider = "azure-claude", model = "sentra-ai" Decisiones: docker logs litellm-foundry | grep '"route"'
Un hook de LiteLLM escribe una línea JSON por petición: la decisión del router, los tokens y el coste real, y el tamaño de las herramientas. Además deduplica las descripciones de los namespaces MCP, que Codex repite en cada herramienta, y cada petición pesa mucho menos.
$ docker logs litellm-foundry | grep '"route"' {"ns_hook":"route","model":"claude-opus-4-8","effort":"high", "branch":"claude","p_offsec":0.03,"complexity":2.7,"clef_ms":162} $ docker logs litellm-foundry | grep '"usage"' {"ns_hook":"usage","model":"claude-opus-4-8","prompt_tokens":18412, "cached_tokens":16890,"completion_tokens":1204,"cost_usd":0.1127}
Eso es justo lo que corta. La clave solo funciona desde las IPs públicas de tus endpoints, y esa lista sale de tu EDR, así que desde la infraestructura de un atacante no abre nada: la red la rechaza antes de mirar la credencial. Y como todo el tráfico pasa por un único punto, ahí le pones el tope y el freno ante un pico anómalo. No hay salto de 180 € a 82.000 € sin que nadie lo pare.
Porque un pentest legítimo choca con los guardarraíles de los modelos grandes: te cortan a mitad de un exploit o de un payload. El router detecta la intención ofensiva y enruta esa tarea a modelos no Anthropic del mismo recurso (DeepSeek, GLM), que no la rechazan. El resto de trabajo va a Claude, con su tamaño y esfuerzo según la dificultad.
De tu EDR/RMM. SentinelOne conoce la IP pública de cada endpoint con su agente, y Sentra la convierte en el allowlist y la mantiene al día según cambia la flota. No es una lista que mantengas a mano, y la IP la observa el EDR en la conexión del agente, no te la auto-reporta la máquina.
El acceso va atado a las IPs de tus endpoints, así que un portátil con agente en una IP nueva entra cuando el inventario la recoge, y para itinerancia o runners de CI se arranca en modo monitor antes de bloquear. Es un control de red, con sus límites honestos (una oficina tras un NAT es una sola dirección), no magia.
No. La pasarela corre en tu infraestructura, contra tu cuenta de Azure y la tuya de Cloudflare. La clave del proveedor nunca sale del gate, y el modelo de decisión solo ve el último mensaje recortado para elegir el modelo, nunca tus herramientas ni tu system prompt.
No. El gate traduce la Responses API a la de Anthropic y a los demás modelos del recurso, así que el mismo despliegue sirve a varios modelos sin tocar tu agente. Si mañana cambias de modelo o de recurso, cambias la configuración del gate, no tu flujo de trabajo.