# LiteLLM + PHP (asistente web, agente único) — clave en sitio legible

## Ubicación canónica (recomendada)

PHP lee la clave **en este orden** (ver `omega-litellm-lib.php`):

1. **Entorno:** `LITELLM_MASTER_KEY` o `OMEGA_LITELLM_MASTER_KEY` (pool PHP-FPM / systemd).
2. **`/home/admin/web/vps.cescac.com/public_html/.omega-data/litellm_master_key.txt`**  
   - Una línea, mismo valor que `LITELLM_MASTER_KEY` del stack Docker.  
   - Permisos: legible por el **usuario del pool PHP-FPM** (`user=` en el `.conf` del dominio). Con `www-data`: `root:www-data` + `640`. Con **Hestia** en `vps.cescac.com` suele ser **`admin`**: `admin:admin` + `600` (o equivalente).  
   - Carpeta `.omega-data` tiene **`.htaccess` → deny all** (no se publica por Apache).

3. **Fallback:** varios `.env` bajo `admin-docs/ops/omega-webui/` (rutas candidatas + opcional `OMEGA_LITELLM_ENV_FILE`).

**Checklist operativo:** `docs/AGT_API_LITELLM_CHAT_WEB_CHECKLIST.md`

Así no dependés de una sola ruta si algo vuelve a romper permisos.

## Síntoma

- `omega-asistente-web.php` o `omega-agente-unico.php` muestran: **LiteLLM no respondió** / **`LITELLM_MASTER_KEY` vacío o .env ilegible**.
- El contenedor `omega-litellm` puede estar **Up** y seguir fallando PHP.

## Causa

PHP-FPM puede correr como **`www-data`** o como usuario del sitio (**p. ej. `admin`** en Hestia). El archivo:

`/home/admin/web/admin-docs/ops/omega-webui/.env`

Si quedó como **`chmod 600` y `root:root`**, **www-data no puede leerlo** → la clave maestra queda vacía → ninguna llamada a `127.0.0.1:4000` lleva `Authorization: Bearer …`.

## Arreglo (una vez, como root)

```bash
chgrp www-data /home/admin/web/admin-docs/ops/omega-webui/.env
chmod 640 /home/admin/web/admin-docs/ops/omega-webui/.env
```

Comprobar:

```bash
sudo -u www-data test -r /home/admin/web/admin-docs/ops/omega-webui/.env && echo OK
```

## Escalado de coste (gratis → barato → caro)

- **`cescac-auto`** y la config LiteLLM ya intentan **MSI/Ollama** (casi gratis) y luego **Groq/nube** según `litellm_config.yaml`.
- **Modelos caros** (Sonnet, etc.): usalos en **chat nuevo** o cuando el dueño lo pida explícito; no hace falta que el asistente web los ponga por defecto.

## Centro / Open WebUI en iframe negro

Si el panel embebido pide **usuario/contraseña de proxy**: abrí **“Abrir chat en nueva pestaña”**, autenticá, y después **“Cargar aquí”** — el iframe no comparte siempre cookies de Basic Auth.

---

*CESCAC VPS — nota operativa.*
