# Protege tus endpoints de IA

> Inspecciona las peticiones a tus API de chat en busca de inyección de prompts y exfiltración, y limita su tamaño y su ritmo por IP o por sesión.

`ai_agents.endpoints` protege hasta 20 endpoints de IA propios, como `/api/chat`. En cada petición a la ruta de un endpoint, el borde lee el cuerpo (y lo reenvía intacto), pasa 27 detectores deterministas en inglés y español, revisa los parámetros de gasto y aplica límites por IP y por sesión. Para servidores MCP, usa [MCP Shield](https://developers.openwaf.dev/es/mcp-shield/).

## Qué se detecta

- **Inyección**: anulación de instrucciones, extracción del prompt de sistema, personajes de *jailbreak* («DAN», «developer mode»), avisos falsos de sistema o de cumplimiento, tokens de plantilla de chat (`<|im_start|>`), tramos de caracteres de ancho cero, comentarios HTML con órdenes, base64 que decodifica a órdenes y patrones de exfiltración (`curl … | sh`, `env | grep KEY`).
- **Límites de coste** (*denial of wallet*): más de 65 536 tokens de salida (`max_tokens` y equivalentes), más de 8 respuestas (`n`, `best_of`…), más de 1000 mensajes o más de 128 herramientas.

Cada detección se registra como `{id, label, snippet}`, con un fragmento de como mucho 160 bytes de la petición, que el panel y la CLI enseñan como texto plano.

## Campos de un endpoint

| Campo | Reglas |
|---|---|
| `path_prefix` | Empieza por `/`, como mucho 256 bytes, único. |
| `methods` | Cualquiera de `POST`, `PUT`, `PATCH`, `GET`. |
| `max_body_bytes` | 1–1 048 576. Un cuerpo mayor es una violación de límite. |
| `rpm_per_ip` | Peticiones por minuto y por IP; `0` = sin límite; como mucho 100 000. |
| `rpm_per_session` | Peticiones por minuto y por sesión; `0` = sin límite; como mucho 100 000. |
| `session_header` / `session_cookie` | De dónde sale el valor de la sesión. |
| `injection_action` | `log` o `block`. |
| `limit_action` | `log` o `block`, para los límites de ritmo, tamaño y coste. |

## Respuestas en modo aplicar

| Violación | Respuesta |
|---|---|
| Por encima de `rpm_per_ip` o `rpm_per_session` | `429` `{"error":"rate limit exceeded"}` con `Retry-After` |
| Cuerpo mayor que `max_body_bytes` | `413` `{"error":"request body too large"}` |
| Inyección detectada | `403` `{"error":"request rejected"}` |
| Límite de coste superado | `400` `{"error":"request exceeds cost limits"}` |

En modo `log`, o con la acción `log`, la petición sigue y se registra un evento `injection` o `cost_limit`.

## Añadir un endpoint

**Panel**

**Control de rastreadores IA → Endpoints de IA**.
**CLI**

```sh
openwaf-cloud ctl zones set example.com ai_agents.endpoints:='[{"path_prefix":"/api/chat","methods":["POST"],
  "max_body_bytes":32768,"rpm_per_ip":30,"rpm_per_session":0,"session_header":"","session_cookie":"",
  "injection_action":"block","limit_action":"log"}]' --reason "Proteger la API de chat"
```
**API**

`PATCH …/edge` con `{"ai_agents": {"endpoints": [...]}}`; la lista se sustituye entera.
**MCP**

`ai_agents_settings` con `"patch": {"endpoints": [...]}`.


El informe **Endpoints de IA** (`--view endpoints`) enseña las inyecciones, los límites, los bloqueos y las detecciones de cada endpoint.
