> ## Documentation Index
> Fetch the complete documentation index at: https://docs.geekhub.mx/llms.txt
> Use this file to discover all available pages before exploring further.

# Guardrails

> Políticas reusables que owner/admin asigna a usuarios o API keys. Presupuesto, modelos permitidos, ZDR, PII, patrones de contenido.

Un guardrail es una política reusable que un owner o admin asigna a un **usuario** o a una **API key**. Define presupuesto, modelos y providers permitidos, ZDR por grupo, detección de prompt injection y PII, y patrones de contenido custom.

Se administran desde [`/dashboard/guardrails`](https://app.geekhub.mx/dashboard/guardrails) o desde la API REST.

## Componentes

* **Presupuesto** — límite USD por periodo (diario/semanal/mensual). Cuando se alcanza, el guardrail bloquea hasta el siguiente reset.
* **Modelos permitidos** — lista blanca por `model id`. Vacío = todos.
* **Providers permitidos** — lista blanca por provider id (`openai`, `anthropic`, ...).
* **ZDR por grupo** — toggle independiente por grupo. Mismo concepto que el setting del org pero aplicado por guardrail.
* **Prompt injection detection** — regex de patrones comunes (`ignore previous instructions`, `reveal system prompt`).
* **PII detection** — `off` / `redact` / `block`. Detecta email, teléfono, RFC, CURP, tarjetas, IPv4.
* **Custom patterns** — array de `{ name, pattern, action }`. Regex case-insensitive, action `redact` o `block`.

## Combinación de varios guardrails

Cuando aplican varios al mismo request:

| Dimensión             | Regla                     | Ejemplo                                                           |
| --------------------- | ------------------------- | ----------------------------------------------------------------- |
| Modelos permitidos    | **INTERSECCIÓN**          | A=\[gpt5,sonnet], B=\[sonnet,opus] → \[sonnet]                    |
| Providers permitidos  | **INTERSECCIÓN**          | A=\[openai,anthropic], B=\[anthropic,google] → \[anthropic]       |
| ZDR (por grupo)       | **UNIÓN**                 | Si A exige ZDR para openai, todas las requests a openai lo exigen |
| Presupuesto           | **INDEPENDIENTE**         | Cualquier guardrail con budget al límite bloquea                  |
| Custom patterns + PII | UNIÓN; `block` > `redact` | A=redact email, B=block email → block                             |
| Prompt injection      | **OR**                    | Si cualquiera lo activa, on                                       |

## Forma del bloqueo

```json theme={null}
HTTP/1.1 403 Forbidden

{
  "error": {
    "type": "guardrail_blocked",
    "message": "El modelo \"openai/gpt-5\" no está en la lista de modelos permitidos por tus guardrails."
  }
}
```

<Note>
  El mensaje describe el motivo de alto nivel; no expone la configuración interna ni los nombres de guardrails individuales (evita doxing de política a usuarios sin permiso admin).
</Note>

## API REST

```bash theme={null}
GET    /api/guardrails           # lista del org
POST   /api/guardrails           # crear
GET    /api/guardrails/:id       # detalle
PUT    /api/guardrails/:id       # update
DELETE /api/guardrails/:id       # borrar (cascade a bindings)
```

### Ejemplo de creación

```bash theme={null}
curl -X POST https://app.geekhub.mx/api/guardrails \
  -H "Content-Type: application/json" \
  --cookie "ghub_session=..." \
  -d '{
    "name": "Equipo soporte",
    "budgetUsd": 50,
    "budgetPeriod": "monthly",
    "allowedProviders": ["openai","anthropic"],
    "zdrAnthropic": true,
    "piiDetection": "redact",
    "promptInjectionDetection": true,
    "customPatterns": [
      { "name": "no_inversion", "pattern": "(palabra-clave|otra)", "action": "block" }
    ]
  }'
```
