Referencia: configuración¶
Para la tabla exhaustiva con todas las variables (backend + frontend + compose + bootstrap), ver Variables de entorno (entrega).
Esta página documenta todas las variables de entorno y settings del backend de Camarero IA. Es una referencia exhaustiva derivada de las fuentes:
backend/app/core/config.py— claseSettings(pydantic-settings).backend/.env.example— plantilla del backend..env.example— plantilla de la raíz (backend + frontend).
Cómo se cargan los valores
La configuración se resuelve con pydantic-settings. Las variables se leen,
por orden, de los ficheros .env y .env.local (ver class Config en
backend/app/core/config.py). El cotejo de nombres es case-insensitive
(case_sensitive = False) y las variables desconocidas se ignoran
(extra = "ignore"). El prefijo de entorno está vacío (env_prefix = ""),
por lo que el nombre de la variable de entorno coincide con el del campo en
mayúsculas (p. ej. el campo database_url se lee de DATABASE_URL).
Aplicación¶
| Variable | Campo (Settings) |
Uso | Por defecto |
|---|---|---|---|
APP_NAME |
app_name |
Nombre de la aplicación. | Camarero IA |
DEBUG |
debug |
Modo depuración. | false |
Etiquetas de entorno admitidas en DEBUG
DEBUG acepta booleanos estrictos y etiquetas de entorno gracias al
validador normalize_debug: release/prod/production → False;
dev/development → True.
Base de datos¶
| Variable | Campo | Uso | Por defecto |
|---|---|---|---|
DATABASE_URL |
database_url |
URL de conexión a PostgreSQL (driver asyncpg). |
postgresql+asyncpg://camarero_user:camarero_password@localhost:5432/camarero_db |
Driver async obligatorio
El valor por defecto usa postgresql+asyncpg://. El backend trabaja con
SQLAlchemy async, por lo que la URL debe usar el driver asyncpg. La
plantilla de la raíz (.env.example) muestra un postgresql:// sin driver;
úsalo solo como referencia y mantén +asyncpg para el backend.
Seguridad y JWT¶
| Variable | Campo | Uso | Por defecto |
|---|---|---|---|
SECRET_KEY |
secret_key |
Clave de firma. Obligatoria (mín. 32 caracteres). | "" (inválido) |
ALGORITHM |
algorithm |
Algoritmo de firma JWT. | HS256 |
ACCESS_TOKEN_EXPIRE_MINUTES |
access_token_expire_minutes |
Expiración del access token, en minutos. | 10080 (7 días) |
SECRET_KEY se valida en arranque
El validador validate_secret_key rechaza una clave vacía o de menos de 32
caracteres en todos los entornos. Si no se cumple, la aplicación falla al
instanciar Settings. Genera una con:
Impuestos¶
| Variable | Campo | Uso | Por defecto |
|---|---|---|---|
DEFAULT_TAX_RATE |
default_tax_rate |
Tasa de IVA por defecto (porcentaje entero). | 10 |
CORS¶
| Variable | Campo | Uso | Por defecto |
|---|---|---|---|
CORS_ORIGINS |
cors_origins |
Lista de orígenes permitidos. | ["http://localhost:3000", "http://localhost:5173"] |
Formato de CORS_ORIGINS
Es una lista. En .env se expresa como JSON, tal y como muestra el comentario
de backend/.env.example:
OAuth2 (Google y Apple)¶
Configuración de inicio de sesión por OAuth, separada por audiencia: cliente
(customer) y administrador (admin).
| Variable | Campo | Uso | Por defecto |
|---|---|---|---|
GOOGLE_CUSTOMER_CLIENT_ID |
google_customer_client_id |
Client ID de Google (cliente). | "" |
GOOGLE_CUSTOMER_CLIENT_SECRET |
google_customer_client_secret |
Client secret de Google (cliente). | "" |
CUSTOMER_REDIRECT_URI |
customer_redirect_uri |
Redirect URI tras login de cliente. | http://localhost:3000/auth/callback |
GOOGLE_ADMIN_CLIENT_ID |
google_admin_client_id |
Client ID de Google (admin). | "" |
GOOGLE_ADMIN_CLIENT_SECRET |
google_admin_client_secret |
Client secret de Google (admin). | "" |
ADMIN_REDIRECT_URI |
admin_redirect_uri |
Redirect URI tras login de admin. | http://localhost:3000/admin/auth/callback |
APPLE_CUSTOMER_CLIENT_ID |
apple_customer_client_id |
Client ID de Apple (cliente). | "" |
APPLE_CUSTOMER_CLIENT_SECRET |
apple_customer_client_secret |
Client secret de Apple (cliente). | "" |
APPLE_ADMIN_CLIENT_ID |
apple_admin_client_id |
Client ID de Apple (admin). | "" |
APPLE_ADMIN_CLIENT_SECRET |
apple_admin_client_secret |
Client secret de Apple (admin). | "" |
OAUTH_REDIRECT_URI_ALLOWLIST |
oauth_redirect_uri_allowlist |
Allowlist de redirect URIs (separadas por coma). | "" |
APPLE_JWKS_TIMEOUT_SECONDS |
apple_jwks_timeout_seconds |
Timeout de descarga del JWKS de Apple (segundos). | 5 |
Allowlist de redirect_uri (SEC03)
OAUTH_REDIRECT_URI_ALLOWLIST endurece la validación de redirect_uri
(RFC 6749 §10.6 / RFC 7636). Cuando está vacía, el sistema usa como allowlist
el conjunto {customer_redirect_uri, admin_redirect_uri} (propiedad
oauth_redirect_uri_allowlist_set), de modo que los despliegues que ya fijan
un redirect por audiencia siguen funcionando sin nuevas variables.
Timeout del JWKS de Apple (SEC-OAUTH01)
APPLE_JWKS_TIMEOUT_SECONDS acota tanto el timeout de socket de
PyJWKClient como un techo de asyncio.wait_for, para que la petición nunca
se cuelgue. El fallo es fail-closed (responde 500, no 401, porque el token
aún no se había verificado).
IA (LLM vía NVIDIA NIM)¶
| Variable | Campo | Uso | Por defecto |
|---|---|---|---|
NVIDIA_API_KEY |
nvidia_api_key |
API key de NVIDIA NIM. | "" |
NVIDIA_MODEL |
nvidia_model |
Modelo de chat. | stepfun-ai/step-3.5-flash |
NVIDIA_BASE_URL |
nvidia_base_url |
Base URL del proveedor. | https://integrate.api.nvidia.com/v1 |
AI_STREAM_TIMEOUT_SECONDS |
ai_stream_timeout_seconds |
Máximo de segundos a esperar el primer frame del proveedor (streaming). | 60 |
MAX_AI_TOKENS_PER_SESSION |
max_ai_tokens_per_session |
Límite total de tokens IA (prompt + completion) por sesión de mesa. 0 desactiva el tope. |
200000 |
Resiliencia del streaming (ERR02)
AI_STREAM_TIMEOUT_SECONDS se eligió por debajo del read timeout de httpx
hacia NVIDIA (120 s), de forma que el timeout del use case dispare primero y
el cliente reciba un frame de error estructurado en lugar de una caída abrupta
de conexión. Se subió a 60 s para modelos de razonamiento lentos tras el proxy
de NVIDIA.
Control de coste de IA (AI01)
MAX_AI_TOKENS_PER_SESSION es un tope duro de tokens por sesión de mesa.
0 desactiva el límite.
Alias heredados (compatibilidad)¶
| Variable | Campo | Uso | Por defecto |
|---|---|---|---|
STEPFUN_API_KEY |
stepfun_api_key |
Alias heredado de la API key. | "" |
STEPFUN_MODEL |
stepfun_model |
Alias heredado del modelo. | stepfun-ai/step-3.5-flash |
Precedencia de la API key
La propiedad ai_api_key resuelve la clave efectiva: nvidia_api_key tiene
prioridad y, si está vacía, se usa stepfun_api_key.
Embeddings y chat híbrido¶
El modelo de embeddings alimenta el clasificador de intenciones y el recomendador basado en contenido. Se carga de forma perezosa en el propio proceso.
| Variable | Campo | Uso | Por defecto |
|---|---|---|---|
EMBEDDINGS_ENABLED |
embeddings_enabled |
Activa el modelo de embeddings en proceso. | true |
EMBEDDINGS_MODEL_NAME |
embeddings_model_name |
Modelo de embeddings. | sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 |
EMBEDDINGS_CACHE_DIR |
embeddings_cache_dir |
Directorio de caché del modelo (se exporta como HF_HOME antes de la primera carga). |
"" |
Tests y CI
En CI/tests se fija EMBEDDINGS_ENABLED=false para que las suites nunca
descarguen el modelo (~390 MB).
Clasificador de intenciones¶
| Variable | Campo | Uso | Por defecto |
|---|---|---|---|
INTENT_MIN_CONFIDENCE |
intent_min_confidence |
Umbral de similitud coseno por debajo del cual el mensaje va a la rama LLM de fallback. | 0.65 |
Note
El min_confidence por árbol en el JSON sobrescribe este valor para el nodo
classify.
Resolutor semántico de productos¶
Umbrales de coseno para la extracción de pedidos en el chat.
| Variable | Campo | Uso | Por defecto |
|---|---|---|---|
RESOLVER_ACCEPT_THRESHOLD |
resolver_accept_threshold |
El top-1 debe superarlo para ser candidato. | 0.50 |
RESOLVER_AMBIGUOUS_FLOOR |
resolver_ambiguous_floor |
Candidatos por encima compiten en la desambiguación. | 0.45 |
RESOLVER_MARGIN |
resolver_margin |
Si top1 - top2 está por debajo → ambiguo (se muestran opciones) en vez de adivinar. |
0.06 |
Intérprete del árbol de decisiones¶
| Variable | Campo | Uso | Por defecto |
|---|---|---|---|
INTERPRETER_MAX_STEPS |
interpreter_max_steps |
Tope de nodos recorridos por mensaje (anti-bucle). | 50 |
INTERPRETER_ACTION_TIMEOUT_SECONDS |
interpreter_action_timeout_seconds |
Timeout por acción. | 5 |
POS (TPV)¶
| Variable | Campo | Uso | Por defecto |
|---|---|---|---|
POS_ADAPTER_TYPE |
pos_adapter_type |
Selector de adaptador de TPV. | local |
Note
local cablea el LocalPOSAdapter interno (sin TPV externo). Un futuro valor
hiopos seleccionará HioposPOSAdapter.
Rate limiting¶
| Variable | Campo | Uso | Por defecto |
|---|---|---|---|
REDIS_URL |
redis_url |
URL de Redis para el limiter. | "" |
VALKEY_URL |
valkey_url |
URL de Valkey (alternativa a Redis). | "" |
Selección del backend del limiter (RATE01)
Si hay una URL configurada, se usa el limiter respaldado por Redis; en caso
contrario, degrada a un limiter respaldado por una tabla de Postgres. La
propiedad rate_limiter_redis_url resuelve la URL efectiva: redis_url tiene
prioridad y, si está vacía, se usa valkey_url.
Variables del frontend¶
Definidas en la plantilla de la raíz (.env.example); las consume el frontend,
no la clase Settings del backend.
| Variable | Uso | Por defecto |
|---|---|---|
NEXT_PUBLIC_API_URL |
URL base de la API que usa el frontend. | http://localhost:8000/api/v1 |
NEXT_PUBLIC_APP_URL |
URL pública de la app. | http://localhost:3000 |
Bootstrap (uso puntual)¶
Presente en backend/.env.example para la creación inicial de un superadmin. No
es un campo de Settings.
| Variable | Uso |
|---|---|
ADMIN_SUPER_EMAIL |
Email del superadmin a crear una sola vez (eliminar tras el primer arranque). |