Un destino es una API de proveedor a la que pueden llamar tus agentes: uno del catálogo (OpenRouter, OpenAI, Anthropic y otros) o un destino propio que añades tú. Cada destino tiene como mucho una clave de proveedor para toda la organización; la usan todos los agentes que pueden llamar a ese destino. Cada cambio necesita un admin de toda la organización.
Cómo se guardan las claves
- Una clave es de solo escritura. OpenWAF la guarda cifrada en su almacén de credenciales y nunca la devuelve, la escribe en un registro ni la guarda en su base de datos; la API y el panel solo enseñan su huella (
sha256:y 12 caracteres hexadecimales), quién la puso y cuándo. - Se pone desde el panel o la API, nunca por MCP: pasaría por la conversación del asistente. Por MCP sí se puede quitar.
- Una clave tiene de 1 a 8192 caracteres, sin espacios ni caracteres de control.
- La pasarela guarda una clave en caché hasta cinco minutos, así que una clave reemplazada o quitada se puede seguir usando ese tiempo.
Poner o reemplazar una clave
Al guardar una clave se reemplaza la actual para todos los agentes a la vez.
En Egress IA → Credenciales, elige Poner clave (o Reemplazar clave) en la fila del proveedor, pega la clave y guarda.
read -rs KEY && printf '{"secret":"%s"}' "$KEY" | curl -sS -X PUT \
"https://dash.openwaf.dev/v1/orgs/$ORG/egress/targets/openai/credential" \
-H "Authorization: Bearer $OPENWAF_TOKEN" -H "Content-Type: application/json" --data-binary @- && unset KEYQuitar una clave
Los agentes que llamen al destino reciben 502 credential_resolution_failed hasta que se ponga una clave nueva.
En Egress IA → Credenciales, quita la clave desde la fila del proveedor y confirma.
curl -sS -X DELETE "https://dash.openwaf.dev/v1/orgs/$ORG/egress/targets/openai/credential" \
-H "Authorization: Bearer $OPENWAF_TOKEN" -H "X-Change-Reason: ya no usamos este proveedor"egress_remove_credential con target y reason, y después otra vez con confirm=true.
Añadir un destino propio
Cualquier API HTTPS a la que tus agentes llamen con una clave, como un servidor de modelos propio o un proveedor que no está en el catálogo.
| Campo | Regla |
|---|---|
id | De 2 a 32 minúsculas, dígitos o guiones, empezando por una letra, y que no sea un id del catálogo. Aparece en la URL de la pasarela |
name | Nombre que se muestra, hasta 100 caracteres |
base_url | https:// en el puerto por defecto 443, con un nombre DNS público: sin dirección IP, credenciales, query ni fragmento, y sin nombres .local, .internal, .localhost, .lan, .home.arpa, .onion ni de DNS inverso |
auth_header | Cabecera que lleva la clave. Por defecto Authorization |
auth_prefix | Texto que va delante de la clave, hasta 32 caracteres. Por defecto Bearer con Authorization y vacío con cualquier otra cabecera |
La pasarela comprueba además en cada petición que el nombre solo resuelve a direcciones públicas (403 ssrf_blocked).
En Egress IA → Credenciales, elige Añadir destino propio, rellena Identificador, Nombre, URL base, Cabecera de autenticación y Prefijo, y guarda. Después ponle su clave.
curl -sS -X POST "https://dash.openwaf.dev/v1/orgs/$ORG/egress/targets" \
-H "Authorization: Bearer $OPENWAF_TOKEN" -H "Content-Type: application/json" \
-d '{"id": "mi-llm", "name": "LLM propio", "base_url": "https://llm.example.com/v1"}'egress_add_target con id, name, base_url, opcionalmente auth_header y auth_prefix, y reason; después otra vez con confirm=true. Su clave se pone en el panel o en la API.
Borrar un destino propio
Al borrar un destino propio también se borra su clave, y no se puede deshacer. Se rechaza con 409 target_in_use mientras algún agente lo permita: quítalo antes de esos agentes. Los destinos del catálogo no se pueden borrar (422 invalid); quita su clave.
En el panel, bórralo desde su fila en Egress IA → Credenciales; en la API envía DELETE …/egress/targets/{id}; por MCP llama a egress_remove_target.
Auditoría
Cada cambio deja una entrada en la auditoría de la organización: egress.credential.set (con la huella), egress.credential.delete, egress.target.create y egress.target.delete.