CreaRack-SL

Resolver env vars vacías en settings de IA con helper `_env_str`

Contexto

En sesión 115 (2026-06-09), PROD sufrió dos crashes encadenados en Auto-Plan (“Magic Import”):

  1. GEMMA4_GENAI_JPEG_QUALITY vacío → int("") → ValueError → 400 en toda importación
  2. Tras arreglar 1, salió GEMMA4_GENAI_MODEL vacío → ValueError: model is required en driver google-genai → 400 nuevamente

Causa raíz: Dokploy declara env vars en el compose como ${VAR:-} (sin valor). Cuando una var SIN valor está declarada así, llega al contenedor como cadena vacía "", no como ausente. El 2º argumento de os.getenv(name, default) solo protege contra ausencia, no contra valor vacío:

os.getenv("GEMMA4_GENAI_JPEG_QUALITY")  # → "" (vacío pisa el default)
os.getenv("GEMMA4_GENAI_JPEG_QUALITY", "95")  # → "" (aún así, porque "está declarada")

Esto rompía drivers de IA que esperaban un modelo nombre (Google GenAI) o un entero válido (JPEG quality, dimensión).

Decisión

Introducir un helper _env_str(name: str, default: str) -> str en config/settings/base.py:

def _env_str(name: str, default: str) -> str:
    return os.getenv(name) or default

Aplicación: TODAS las settings string de IA que tengan un default legítimo deben usar _env_str en lugar de os.getenv(name, default):

  • Providers: AUTOPLAN_PROVIDER, EDGE_AI_PROVIDER
  • Modelos Gemma 4: GEMMA4_GENAI_MODEL
  • Modelos Edge AI (CNS/Tutor/MIB): EDGE_AI_GOOGLE_GENAI_MODEL
  • Modelos Anthropic: ANTHROPIC_HAIKU_MODEL, ANTHROPIC_SONNET_MODEL
  • Ollama: OLLAMA_BASE_URL, OLLAMA_MODEL
  • Dimensión/Calidad Gemma 4: GEMMA4_GENAI_MAX_IMAGE_DIMENSION, GEMMA4_GENAI_JPEG_QUALITY

Exclusión: Las API keys (que tienen default None) se dejan con os.getenv crudo — el código ya trata "" como “no key autenticada”.

Impacto

  • ✅ Trata env vacío == env ausente → ambos caen al default
  • ✅ No cambia ningún valor default (Regla 8)
  • ✅ Blinda la resolución contra footguns de Dokploy
  • ✅ Tests de regresión: tests/test_autoplan_settings.py ampliado con 5 aserciones nuevas (env vacío + valores explícitos)

Véase también

  • [[entity—blueprints—service—autoplan]]
  • [[entity—blueprints—endpoint—magic-import]]
  • [[incident—20260609—autoplan-prod-crashes]]
  • [[concept—core—environment-config]]