Módulo 8: Proyecto Integrador — Production-Ready AI System
8. Resumen y Cierre de la Guía
Descripción
Llegaste al final. Tú completaste 8 módulos y 3 fases de prácticas de producción para AI apps. Este cierre no es un resumen de conceptos — es una reflexión sobre lo que tú construiste, por qué importa, y qué puedes hacer con todo esto a partir de ahora. Tómate un momento para mirar hacia atrás y reconocer cuánto avanzaste. Cada módulo que trabajaste te dejó una habilidad concreta que puedes usar mañana en un proyecto real — y en esta cápsula vas a consolidar esa visión completa de lo que significa llevar un sistema AI a producción.
El viaje: de "funciona en mi laptop" a "funciona en producción"
Semana 1 (antes de la guía):
Tu app AI:
- Funciona cuando tú la ejecutas
- Falla misteriosamente si la API da error
- No sabes cuánto cuesta por request
- No puedes testear sin llamar a OpenAI
- Los prompts están hardcoded en el código
- Si hay un bug a las 3am, no sabes cómo diagnosticarlo
Semana N (después de la guía):
Tu app AI:
- Tests que pasan sin llamar a OpenAI (MockProvider)
- Si la API falla: retry → circuit breaker → fallback → static default
- Cada request loguea: costo, latencia, request_id
- Los prompts están en archivos YAML versionados
- El domain no sabe qué LLM lo llama (clean architecture)
- Si hay un bug a las 3am: el runbook dice exactamente qué hacer
Lo que construiste, módulo por módulo
Phase 1: Testing (M1-M3)
# Antes:
def test_analyze():
result = analyze("This is great!") # ← Llama a OpenAI real, cuesta dinero
assert result["sentiment"] == "positive" # ← A veces falla por no-determinismo
# Después:
def test_analyze_with_mock(mock_settings):
provider = MockProvider('{"sentiment": "positive", "score": 0.9, "confidence": 0.8}')
result = analyze_sentiment("This is great!", provider)
assert result["sentiment"] == "positive" # ← Determinístico, gratuito, rápido
Lo que quedó: test suite completa — unit tests con mocks, integration tests con assertions semánticas, property-based tests para edge cases, y un conftest.py que gestiona las fixtures globales.
Phase 2: Safety & Quality (M4-M6)
# M4: Un guardrail que bloquea antes de gastar dinero en el LLM
check = guardrails.check_input(user_text)
if not check.passed:
raise HTTPException(400, check.reason) # ← No llama al LLM, costo $0
# M5: Logging que permite debuggear desde los logs
log.info("llm_call_completed",
cost_usd=0.0023,
input_tokens=450,
output_tokens=120,
duration_ms=1840,
request_id=get_request_id() # ← Conecta todos los logs de un request
)
# M6: Domain que no sabe que existe OpenAI
def analyze_sentiment(text: str, provider: LLMProvider) -> dict:
template = load_prompt("sentiment") # ← Prompt en archivo, no hardcoded
messages = template.render(text=text)
raw = provider.complete(messages) # ← Provider inyectado, no instanciado aquí
return parse_sentiment_output(raw)
Lo que quedó: pipeline de guardrails para input/output, logging estructurado con tracing y cost tracking, y una clean architecture en 4 capas donde el domain no depende de ningún proveedor concreto.
Phase 3: Production (M7-M8)
# M7: La reliability layer completa — un único cambio en dependencies.py
def build_llm_provider() -> LLMProvider:
base = OpenAIProvider(client, model="gpt-4o", ...)
with_retry = RetryProvider(base, max_attempts=4)
with_cb = CircuitBreakerProvider(with_retry, failure_threshold=5)
rate_limited = RateLimitedProvider(with_cb, rpm=480)
return FallbackProvider([rate_limited, backup_provider],
static_fallback='{"sentiment": "unknown", ...}')
# El domain nunca cambió. ↑ Esta es la única diferencia.
# M8: El sistema completo con checklist, baselines, y runbook
python scripts/run_checklist.py → Todos los items en verde
python scripts/pre_launch_validation.py → "ALL VALIDATIONS PASSED"
python scripts/benchmark.py → p50: 1.8s, cost: $0.002, errors: 0%
cat docs/RUNBOOK.md → 6 incidentes documentados con comandos
Lo que quedó: un sistema production-ready con todos los componentes integrados, documentado, verificable, y con los scripts para mantenerlo.
Las 5 skills que ahora tienes
Skill 1: Testear sin el LLM
ANTES: "No puedo testear porque siempre llama a OpenAI"
AHORA: MockProvider implementa el mismo Protocol
→ Tests rápidos, gratuitos, determinísticos
→ Los tests del domain pasan sin internet
Skill 2: Hacer el sistema visible
ANTES: "Algo falló pero no sé dónde"
AHORA: Cada request tiene request_id
→ Un log entry tiene: request_id, cost_usd, duration_ms, model, tokens
→ jq 'select(.request_id == "abc123")' logs/app.json → historial completo
Skill 3: Proteger el sistema de entradas maliciosas
ANTES: User input va directo al LLM → vulnerable a injection
AHORA: GuardrailsPipeline.check_input() antes de cada llamada
→ Injection detectada = 400, sin costo LLM
→ PII redactada en output automáticamente
Skill 4: Sobrevivir failures del LLM
ANTES: OpenAI devuelve 429 → tu app falla con 500
AHORA: 429 → RetryProvider espera y reintenta
Outage 30 min → CircuitBreaker abre, FallbackProvider sirve desde secondary
Todos fallan → static_fallback, usuario recibe respuesta genérica pero no error 500
Skill 5: Integrar componentes
ANTES: "Tengo partes funcionando solo, no sé cómo conectarlas"
AHORA: DI permite composición: FallbackProvider(RateLimited(CircuitBreaker(Retry(OpenAI))))
El domain no cambia cuando añades reliability
Un archivo (dependencies.py) controla toda la composición
El production checklist como herramienta permanente
El production checklist que viste en la cápsula 01 no es para esta guía — es para todos tus proyectos AI futuros:
# Antes de CADA deploy a producción, ejecutar:
python scripts/run_checklist.py
# Antes del PRIMER deploy:
python scripts/pre_launch_validation.py
python scripts/benchmark.py
# Si hay un incidente:
cat docs/RUNBOOK.md # → Buscar el incidente, seguir los pasos
Cuando hagas un nuevo proyecto AI, toma esta estructura, copia los scripts, adapta los prompts y el domain — el resto (testing, guardrails, logging, reliability) ya está construido y funciona.
Lo que viene después: el AI Engineering Path
Esta guía es una de varias en el AI Engineering Path. Las prácticas que aprendiste aquí son prerequisitos para las siguientes:
| Guía | Lo que usa de esta guía |
|---|---|
| Monitoring & Observability | El structured logging del M5 como base |
| Building AI Agents | La clean architecture del M6 + reliability del M7 |
| RAG Systems | Los guardrails del M4 + testing patterns del M2-M3 |
| CI/CD for AI Systems | El pre-launch validation script del M8 |
Tres cosas que puedes hacer esta semana
1. Aplicar una práctica a tu proyecto actual
Si tienes un proyecto AI existente, elige la práctica con el mayor impacto inmediato:
- Sin tests → Añadir MockProvider y escribir tests del domain
- Sin logging estructurado → Añadir structlog con request_id
- Sin retry → Añadir RetryProvider con tenacity
No tienes que implementar todo a la vez. Una práctica real es más valiosa que ocho prácticas en un proyecto de ejercicio.
2. Presentar el Production AI System en tu portfolio
El sistema que construiste en esta guía demuestra:
- Que sabes testear AI sin llamadas reales
- Que conoces los riesgos de seguridad (guardrails)
- Que entiendes operaciones (logging, runbook)
- Que puedes hacer sistemas resilientes (reliability)
Un portfolio entry basado en esto destaca frente a proyectos que "solo hacen el LLM call".
3. Ejecutar el checklist en un proyecto existente
Toma scripts/run_checklist.py, adapta los paths a tu proyecto, y ejecútalo. Ver qué items fallan te dará una lista de mejoras concretas y priorizadas.
Tu checklist de crecimiento como AI Engineer
Has cubierto las prácticas fundamentales de producción. Pero la ingeniería de AI evoluciona rápido. Aquí tienes un mapa de qué profundizar según dónde quieras crecer:
SI QUIERES PROFUNDIZAR EN... ENTONCES ESTUDIA...
─────────────────────────────────────────────────────────────────
Testing más sofisticado → Property-based testing con Hypothesis
Mutation testing, Fuzzing de inputs
Evaluaciones de LLM (RAGAS, DeepEval)
Observabilidad en producción → OpenTelemetry (traces distribuidos)
Grafana + Prometheus para métricas
Log aggregation (ELK, Loki, Datadog)
Seguridad avanzada → OWASP LLM Top 10 (en profundidad)
Red teaming de prompts
Guardrails con clasificadores ML
Arquitectura para escalar → Microservicios vs monolito
Message queues (RabbitMQ, SQS)
Caching de LLM responses (Redis)
Reliability a gran escala → Chaos engineering (Chaos Monkey)
Multi-region deployments
Canary deployments y feature flags
CI/CD para AI → GitHub Actions para ML pipelines
Automated prompt regression testing
Blue/green deployments
No intentes cubrir todo a la vez. Elige una dirección basada en tu trabajo actual y profundiza ahí durante 2-4 semanas antes de pasar a otra.
Tus habilidades concretas después de esta guía
Cada módulo te dejó una habilidad que puedes aplicar mañana. Aquí está el inventario completo de lo que tú ahora sabes hacer — no en teoría, sino con código que funciona:
HABILIDAD DÓNDE LA APRENDISTE QUÉ PUEDES HACER CON ELLA
────────────────────────── ────────────────────── ────────────────────────────────
Crear MockProviders M1-M2 Testear cualquier AI app sin
gastar dinero ni depender de APIs
Escribir assertions semánticas M2-M3 Tests que verifican comportamiento
del LLM, no strings exactos
Diseñar guardrails de input M4 Bloquear prompt injection y
contenido prohibido antes del LLM
Redactar PII en outputs M4 Cumplir regulaciones de privacidad
sin cambiar la lógica de negocio
Configurar structured logging M5 Diagnosticar problemas en producción
con queries JSON (jq, grep)
Implementar request tracing M5 Conectar todos los logs de un request
con un solo request_id
Separar domain de infra M6 Cambiar de proveedor (OpenAI →
Anthropic) sin tocar el negocio
Componer reliability layers M7 Retry → CB → Rate Limit → Fallback
en un solo archivo (dependencies.py)
Crear production checklists M8 Verificar que tu sistema está listo
antes de cada deploy
Establecer performance baselines M8 Medir latencia, costo, y error rate
con un script reproducible
Escribir runbooks operacionales M8 Resolver incidentes a las 3am
siguiendo pasos documentados
Estas no son habilidades aisladas — se refuerzan mutuamente. El structured logging hace que el runbook funcione. Los MockProviders hacen que los tests sean rápidos. La clean architecture hace que la reliability layer sea posible sin tocar el domain.
Cómo estas habilidades se traducen a tu carrera
Si estás buscando trabajo o quieres avanzar en tu rol actual, estas prácticas te posicionan en un nivel que pocas personas en AI engineering tienen:
EN UNA ENTREVISTA TÉCNICA:
"¿Cómo testeas tu AI app?"
→ "MockProvider que implementa el mismo Protocol. Tests determinísticos,
sin API key, sin costo. Coverage > 70% en domain y processing."
"¿Qué pasa si OpenAI se cae?"
→ "Retry con exponential backoff para errores transitorios. Si persisten,
circuit breaker abre y el fallback sirve desde modelo secundario o
respuesta estática. El usuario nunca ve un 500."
"¿Cómo diagnosticas un problema en producción?"
→ "Structured logging con request_id. Un jq query me da el timeline
completo de cualquier request. El runbook tiene los comandos para
cada tipo de incidente."
EN UN CODE REVIEW:
- Tu código tiene separación clara de capas
- Los tests no dependen de servicios externos
- La configuración está en pydantic-settings, no hardcoded
- Los prompts están versionados en YAML
Lo que te diferencia ahora
Después de completar esta guía, tienes algo que la mayoría de developers AI no tienen: una comprensión integrada de qué hace falta para llevar un sistema AI a producción. No solo sabes hacer LLM calls — sabes construir el sistema que los rodea.
DEVELOPER AI TÍPICO: TÚ DESPUÉS DE ESTA GUÍA:
──────────────────────────── ──────────────────────────────────
"Hago requests a OpenAI" → "Tengo una reliability layer que
sobrevive outages con retry,
circuit breaker, y fallback"
"Pongo print() cuando → "Tengo structured logging con
algo falla" request_id, cost tracking,
y queries con jq"
"Los tests... son complicados → "Mis tests corren sin internet,
con AI" sin API key, y sin dinero
(MockProvider)"
"El prompt está en el código" → "Los prompts están en YAML
versionados, con loader y
soporte para A/B testing"
"Si se cae, reinicio" → "Si se cae a las 3am, el runbook
dice exactamente qué hacer"
Esto no es teoría — es exactamente el gap entre un AI developer junior y uno que puede liderar un proyecto en producción.
Ejercicios
Ejercicio 1: Auto-evaluación de prácticas
Para cada una de las 8 áreas de la guía, evalúa tu nivel actual de 1 a 5 (1 = lo conozco en teoría, 5 = lo puedo implementar con confianza en un proyecto real). Sé honesto — el objetivo no es tener todo en 5, sino saber dónde enfocar tu próximo aprendizaje.
| Área | Nivel (1-5) | Siguiente paso si < 4 |
|---|---|---|
| Unit testing con mocks | ___ | Rehacer M2 ejercicios sin mirar la guía |
| Integration testing | ___ | Escribir tests E2E para un proyecto personal |
| Guardrails (input/output) | ___ | Implementar PII redaction en un proyecto real |
| Structured logging | ___ | Configurar structlog en un proyecto existente |
| Clean architecture + DI | ___ | Refactorizar un script a capas domain/infra |
| Reliability (retry, CB, fallback) | ___ | Implementar circuit breaker desde cero |
| Production checklist | ___ | Ejecutar el checklist en un proyecto existente |
| Runbook + baselines | ___ | Crear un RUNBOOK.md para tu proyecto actual |
Ver solución
No hay una "respuesta correcta" aquí, pero sí una guía de interpretación:
Si tienes 3+ áreas en nivel 1-2: Repite los módulos correspondientes, pero esta vez implementa en tu propio proyecto en vez del ejemplo de la guía. La repetición con contexto diferente es lo que consolida el aprendizaje.
Si tienes todo en 3: Buen punto de partida. Tu siguiente paso es implementar cada práctica en un proyecto real (no de ejercicio). La diferencia entre 3 y 4 es haberlo hecho en un contexto con restricciones reales.
Si tienes la mayoría en 4-5: Estás listo para temas avanzados: OpenTelemetry, chaos engineering, evaluaciones automatizadas de LLM quality, o CI/CD pipelines para AI.
Patrón para subir de nivel:
- Elige tu área más débil
- Implementa esa práctica en un proyecto real
- Encuentra un caso edge que la guía no cubrió
- Resuélvelo — eso es lo que sube tu nivel de 3 a 5
Ejercicio 2: Aplicar una práctica a un proyecto existente
Elige un proyecto AI que tengas (o crea uno pequeño — puede ser un chatbot con OpenAI de 50 líneas). Aplica exactamente una práctica de esta guía, la que consideres más impactante para ese proyecto.
Documenta:
- Qué práctica elegiste y por qué
- Cuánto tiempo te tomó implementarla
- Qué dificultad encontraste que no cubrió la guía
- El antes/después en una oración
Ver solución
Ejemplo real de aplicar "structured logging con structlog":
Práctica elegida: Structured logging (M5)
Por qué: Tenía un chatbot en producción que fallaba intermitentemente y no podía diagnosticar por qué — solo tenía print() statements.
Tiempo de implementación: 45 minutos
- 10 min: instalar structlog y configurar JSONRenderer
- 15 min: reemplazar print() con log.info()/log.error() con contexto
- 10 min: añadir request_id con contextvars
- 10 min: añadir cost_usd y duration_ms a cada LLM call
Dificultad no cubierta: Mi app usaba Flask en vez de FastAPI, así que el middleware de request tracing fue diferente. Tuve que usar before_request y after_request de Flask en vez del middleware de Starlette.
Antes/después:
- Antes: "El chatbot falla a veces y no sé por qué"
- Después:
jq 'select(.level == "error")' logs/app.json→ encontré que el 3% de los requests fallaba por timeout de OpenAI, y agregué retry en 20 minutos
La práctica con mayor impacto inmediato suele ser diferente para cada proyecto:
- Si no tienes tests → MockProvider + unit tests
- Si no puedes diagnosticar → structured logging
- Si tu app falla con errores de OpenAI → retry + fallback
- Si recibes input de usuarios → guardrails
La regla: implementa la que resuelve tu dolor actual, no la que suena más interesante.
Ejercicio 3: Mapa de prácticas por módulo
Crea una tabla que mapee cada uno de los 8 módulos con: (a) el concepto principal, (b) el archivo o componente clave que implementaste, y (c) el comando que verifica que funciona. Esto te sirve como referencia rápida cuando quieras aplicar una práctica en otro proyecto.
Ver solución
| Módulo | Concepto principal | Archivo clave | Comando de verificación |
|--------|--------------------|---------------|------------------------|
| M1 | Fundamentos de testing | `tests/conftest.py` | `pytest tests/unit/ -v` |
| M2 | Unit tests con mocks | `tests/unit/test_sentiment_service.py` | `pytest tests/unit/ -v --tb=short` |
| M3 | Integration testing | `tests/integration/test_api_e2e.py` | `APP_URL=http://localhost:8000 pytest tests/integration/ -v` |
| M4 | Guardrails pipeline | `src/guardrails/pipeline.py` | `pytest tests/unit/test_guardrails.py -v` |
| M5 | Structured logging | `src/logging_config.py`, `src/middleware.py` | `tail -5 logs/app.json \| jq .` |
| M6 | Clean architecture + DI | `src/domain/sentiment_service.py`, `src/app/dependencies.py` | `pytest tests/unit/test_sentiment_service.py -v` |
| M7 | Reliability layer | `src/infrastructure/retry_provider.py`, `circuit_breaker.py` | `pytest tests/unit/test_reliability_integration.py -v` |
| M8 | Production readiness | `scripts/run_checklist.py`, `docs/RUNBOOK.md` | `python scripts/run_checklist.py` |
Este mapa es tu "cheat sheet" personal. Cuando empieces un proyecto nuevo y quieras añadir, por ejemplo, structured logging, vienes a esta tabla, ves que el archivo clave es logging_config.py + middleware.py, y sabes exactamente qué copiar y adaptar. La columna de verificación te permite confirmar que funciona en menos de 30 segundos.
Ejercicio 4: Carta a tu yo del futuro
Escribe un documento corto (máximo 1 página) dirigido a ti mismo dentro de 6 meses, cuando estés empezando un nuevo proyecto AI. Incluye:
- Las 3 prácticas que más impacto tuvieron en tu aprendizaje
- Los 2 errores que más te costó resolver
- El orden recomendado para implementar las prácticas en un proyecto nuevo
- Un link o referencia a este proyecto como template
Ver solución
# Notas para mi yo futuro — Production Best Practices
## Las 3 prácticas con más impacto
1. **MockProvider + unit tests (M2)**: Poder testear sin API key ni costo cambió mi
velocidad de desarrollo. Cada vez que hago un cambio, corro los tests en 2 segundos.
2. **Structured logging con request_id (M5)**: Antes de esto, debuggear era imposible.
Ahora un `jq 'select(.request_id == "X")'` me da todo el contexto del error.
3. **DI con Protocol (M6)**: Separar el domain de la infraestructura hizo que añadir
retry, circuit breaker, y fallback fuera trivial — 0 cambios en la lógica de negocio.
## Los 2 errores que más me costaron
1. **CircuitBreaker no era singleton**: Se creaba uno nuevo en cada request y nunca
acumulaba suficientes failures para abrirse. La solución: moverlo a module-level.
2. **Tests que dependían del orden de ejecución**: Un test pasaba solo si se ejecutaba
después de otro que dejaba estado. La solución: fixtures con scope adecuado y teardown.
## Orden recomendado para un proyecto nuevo
1. Estructura de directorios (domain / infrastructure / app)
2. MockProvider + primeros unit tests
3. Structured logging (structlog + request_id)
4. Guardrails (input validation antes del LLM)
5. Reliability (retry → circuit breaker → fallback)
6. Production scripts (checklist, benchmark)
7. Documentación (README, ARCHITECTURE, RUNBOOK)
## Template
Usar `production-ai-system/` como base. Copiar la estructura, adaptar
el domain y los prompts, mantener todo lo demás.
El valor de este ejercicio no está en lo que escribes hoy — está en lo que lees dentro de 6 meses. Los detalles que hoy te parecen obvios se olvidan rápido. Las decisiones que tomaste y los errores que cometiste son exactamente lo que tu yo futuro necesita recordar para no repetirlos.
Troubleshooting
Problema: "Terminé la guía pero no sé por dónde empezar a aplicarla"
Síntomas:
- Sientes que entendiste todo pero no sabes cómo empezar en tu propio proyecto
- La cantidad de prácticas te parece abrumadora
Solución: No intentes aplicar todo a la vez. Usa esta priorización:
PRIORIDAD 1 (esta semana): La práctica que resuelve tu dolor actual
- ¿Tu app falla y no sabes por qué? → Structured logging
- ¿No tienes tests? → MockProvider + unit tests
- ¿El LLM falla y tu app muere? → RetryProvider
PRIORIDAD 2 (próximas 2 semanas): La segunda práctica más impactante
- Ya tienes logs → añadir guardrails
- Ya tienes tests → añadir clean architecture
- Ya tienes retry → añadir circuit breaker + fallback
PRIORIDAD 3 (próximo mes): El resto
- Production checklist, baselines, runbook
Problema: "Mi proyecto es muy diferente al ejemplo de la guía"
Síntomas:
- Tu app no es análisis de sentimiento
- Usas otro framework (Flask, Django) o proveedor (Anthropic, Gemini)
- La estructura de tu proyecto no se parece al ejemplo
Solución: Las prácticas son portables — el ejemplo de sentimiento es solo el vehículo:
PRÁCTICA CÓMO SE ADAPTA
────────────────────── ─────────────────────────────────
MockProvider Cualquier app que llama a un LLM:
crear un mock que implementa la misma
interface (Protocol)
Structured logging Funciona igual en Flask, Django, o scripts.
Solo cambia el middleware de request tracing.
Guardrails Cualquier app que recibe input de usuarios
y lo pasa a un LLM. Los patterns de
injection son los mismos.
Clean architecture + DI Aplica a cualquier proyecto Python:
separar domain de infraestructura.
Reliability layer Funciona con cualquier API (Anthropic,
Gemini, APIs propias). Solo cambia
el provider que está en el centro.
Problema: "Implementé una práctica pero rompí tests existentes"
Síntomas:
- Añadiste structured logging y ahora los tests fallan porque esperan
print()output - Añadiste DI y los tests no pasan el provider correctamente
- Añadiste guardrails y ahora tests con ciertos inputs son rechazados
Solución: Al refactorizar, sigue este orden para no romper nada:
1. Escribir los tests del NUEVO comportamiento primero
2. Implementar el cambio
3. Verificar que los tests nuevos pasan
4. Actualizar los tests viejos que fallan
(no los elimines — entiende POR QUÉ fallan primero)
# Ejemplo: al añadir DI, un test viejo falla porque llamaba
# directamente a la función sin pasar un provider:
# Test viejo (falla después de DI):
result = analyze("test") # ← No pasa provider
# Test actualizado:
provider = MockProvider('{"sentiment": "positive", ...}')
result = analyze("test", provider) # ← Pasa el mock
La regla: si un refactor rompe más de 3 tests, probablemente estás haciendo un cambio demasiado grande. Divide el refactor en pasos más pequeños.
El mensaje final
Construir una app AI que funciona en tu laptop es el primer paso. Llevarla a producción con usuarios reales es un problema diferente — de ingeniería, no de AI.
El campo de AI Engineering existe porque la diferencia entre un modelo que funciona y un sistema que sirve a usuarios reales es todo lo que has aprendido en estos 8 módulos: testing que da confianza, guardrails que protegen, logging que permite entender, arquitectura que se puede mantener, reliability que sobrevive.
No es teoría — es exactamente lo que equipos en producción hacen. La diferencia entre un AI engineer junior y uno senior no es saber usar más modelos. Es saber construir sistemas que los rodean: sistemas que son seguros, observables, mantenibles, y resilientes.
Ahora sabes cómo hacerlo.
Recursos adicionales
- Google SRE Book — La biblia de operaciones de sistemas en producción
- Release It! (Michael Nygard) — El libro de reliability patterns
- OWASP LLM Top 10 — Seguridad en aplicaciones LLM
- FastAPI Documentation — La base del framework
- pydantic-settings — Config management
- tenacity Documentation — Retry patterns
- structlog Documentation — Structured logging