Wayweb · Agencia IA GCP · Python · Vertex AI · Gemini 2.5 Pro Web App Live

Enterprise Agents Suite v6.0

Empresa virtual impulsada por IA con 6 departamentos y 38 agentes Gemini.
Desarrollada por Wayweb · agents.wayweb.cl · GCP us-central1

última actualización
2026-06-21
Sesión #12

Resumen general

Estado actual del proyecto y métricas clave.

6
Departamentos IA
Marketing · RRHH · Finanzas · Legal · Ops · I+D
38
Agentes activos
Gemini 2.5 Pro · Vertex AI
Cloud Run
Plataforma de despliegue
IP 8.233.18.239 · us-central1

Descripción del sistema

Enterprise Agents Suite v6.0 es una empresa virtual impulsada por IA desarrollada por Wayweb. Simula una agencia autónoma con seis departamentos funcionales — Marketing, RRHH, Finanzas, Legal, Operaciones e I+D — cada uno orquestado por Google Gemini 2.5 Pro vía Vertex AI, con Gemini 2.5 Flash para tareas de alto volumen (ej. screening de CVs).

El sistema expone una API REST construida con FastAPI + uvicorn, empaquetada en un contenedor Docker y desplegada en Google Cloud Run. El acceso público se gestiona mediante un Global Load Balancer con IP estática, certificado SSL gestionado por Google y dominio personalizado agents.wayweb.cl.

Cada departamento construye un prompt dinámico para Gemini. Los modelos vigentes en el proyecto agents-ia-499522 son gemini-2.5-pro (razonamiento) y gemini-2.5-flash (volumen); los modelos gemini-2.0-pro, gemini-1.5-pro y la familia gemini-3.x devuelven 404 (no habilitados).

Progreso por área

Entorno WSL + Python venv con uv100%
Credenciales GCP (Service Account + Vertex AI APIs)100%
Agente Marketing funcional con Gemini 2.5 Flash100%
API REST FastAPI + Cloud Run desplegado100%
IP estática + Load Balancer + SSL agents.wayweb.cl100%
Frontend / Panel web de la agencia IA100%
Marketing Ultra-Premium + RRHH 360° (4 módulos · PDF)100%
Sitio en vivo: el certificado agentes-ssl-v2 está ACTIVO y agents.wayweb.cl sirve el panel web completo (Marketing Ultra-Premium y RRHH 360°). DNS A 8.233.18.239 propagado vía v2nets.com.
🔗
Endpoints activos: GET / sirve el panel web y GET /health responde {"status":"ok"}. API de departamentos en /api/marketing (JSON) y /api/rrhh (multipart con subida de CVs en PDF).

Bitácora de cambios

Registro acumulativo de sesiones de trabajo. Más reciente primero.

Cimientos del Dashboard de "Inteligencia de la Agencia": saneamiento de seguridad, capa de telemetría real a Firestore y feedback de calidad
Se revisó el plan del dashboard (estructura.md) y se detectó que la app no persistía ningún dato y que dashboard.py devolvía métricas aleatorias simuladas. Se atacó el problema de raíz en tres fases: Fase 0 (seguridad + documentación), Fase 1 (telemetría real con tokens y costos reales a Firestore), Fase 2 (feedback 👍/👎 enlazado a cada consulta) y Fase 3 (dashboard visual real con Chart.js en /dashboard, agregando desde Firestore sin datos simulados). Revisiones 00027-mv7 (telemetría), 00028-ctl (feedback) y 00029-w2s (dashboard), todas validadas con datos reales en Firestore. El roadmap del dashboard quedó 100% completo.

Fase 0 · Seguridad y documentación

🔐 SA key fuera del build: el Dockerfile hacía COPY . . y .dockerignore no excluía los .json, por lo que la clave privada de la Service Account (roles/agents-ia-49.json) se horneaba en la imagen. Se agregó roles/*.json, *.pem, *.key a .dockerignore y se reforzó .gitignore (el patrón previo service-account*.json no cubría el nombre real). En Cloud Run la autenticación es por ADC del runtime, no se necesita el archivo.

📄 estructura.md corregido: reflejaba archivos inexistentes (static/dashboard.html, static/costos.html, test_suite.sh) y tenía la sección del dashboard con markdown roto. Reescrito con el estado real + plan por fases.

Fase 1 · Telemetría real

Nuevo módulo telemetria.py: acumulador por consulta con contextvars (correcto en endpoints sync y async), pricing por modelo y escritura best-effort a Firestore (si falla, nunca rompe la respuesta).

El shim GenerativeModel y el OCR ahora capturan tokens reales (usage_metadata) y latencia de cada llamada. Los 6 endpoints /api/* se envuelven y escriben 1 evento por consulta: depto, modo, tokens in/out, costo USD, latencia, nº de llamadas, OCR y modelos. Se creó la base Firestore Native en us-central1 (no existía).

Fase 2 · Feedback de calidad 👍/👎

Cada consulta ahora genera un consulta_id (ID del documento de telemetría) que el endpoint devuelve al frontend. La response card muestra botones 👍/👎 que llaman a /api/feedback; el voto se guarda en la colección telemetria_feedback y se fusiona en el evento original (campo feedback). De paso se captura la longitud de la respuesta (chars_respuesta), otra métrica del panel de Calidad. Validado en producción: voto up enlazado correctamente por consulta_id.

Fase 3 · Dashboard visual con datos reales

dashboard.py reescrito por completo: elimina los random y agrega desde Firestore los tres paneles. Se enriqueció el evento de telemetría con un desglose por modelo (por_modelo) para separar costos de gemini-2.5-pro vs gemini-2.5-flash en FinOps.

Nueva página static/dashboard.html (Chart.js vía CDN) servida en /dashboard, con enlace desde la topbar de la app. Paneles:

  • Operacional: consultas totales, latencia promedio, tasa de error, consultas por departamento, actividad diaria.
  • FinOps: costo total, costo por consulta, tokens in/out, desglose de costo por modelo y por departamento.
  • Calidad: satisfacción 👍/👎, longitud promedio de respuesta, consultas con OCR, feedback por departamento.

Validado en producción: el endpoint devuelve agregaciones reales y el desglose por modelo se puebla con cada consulta nueva.

Archivos modificados / creados en esta sesión

ArchivoTipoDescripción del cambio
telemetria.pyNUEVOCapa de telemetría: contextvar, context manager consulta(), pricing, escritura a Firestore y registrar_feedback().
enterprise_agents_suite.pyMODIFICADOInstrumentación del shim y el OCR (tokens/latencia); 6 endpoints envueltos con telemetría y devolviendo consulta_id; modelo PeticionFeedback y endpoint /api/feedback.
static/index.htmlMODIFICADOBarra de feedback 👍/👎 en la response card, función sendFeedback(), captura de consulta_id y estilos.
.dockerignore · .gitignoreMODIFICADOExclusión de la clave de la Service Account del build y del control de versiones.
estructura.mdMODIFICADOCorregido a la realidad del repo + plan del dashboard por fases.

Infraestructura GCP y despliegues

ÍtemDetalle
FirestoreBase (default) Native creada en us-central1 (free tier). Colecciones: telemetria_consultas, telemetria_feedback.
IAMLa SA del runtime (agents-ia-sa@…) ya tenía roles/owner → escribe sin permisos extra.
00027-mv7Fase 1 · Telemetría real (validada: evento con tokens reales)
00028-ctlFase 2 · Feedback 👍/👎 (validada: voto enlazado por consulta_id)
00029-w2sFase 3 · Dashboard real con Chart.js en /dashboard · ACTIVO

Resumen del historial de sesiones

SesiónFechaHito principal
#102026-06-16Prompts RRHH alineados · CHRO universal · fix opcionales Compliance
#112026-06-21Cierre de los 6 pendientes · SDK google-genai · OCR · Finanzas/Legal/Operaciones/I+D estructurados (24 agentes)
#122026-06-21Dashboard completo (Fases 0-3) · seguridad SA key · telemetría real a Firestore · feedback 👍/👎 · dashboard visual con Chart.js
Se trabajaron los 6 pendientes de la Sesión #10: migración de SDK, OCR, fixes de UX/health y la extensión completa de Finanzas, Legal, Operaciones e I+D al nivel de Marketing/RRHH
Sesión de cierre del backlog. Se resolvieron los 6 pendientes registrados al final de la Sesión #10. El de mayor envergadura fue el #2: los 4 departamentos que aún usaban input simple por query-params y un prompt genérico leído desde CSV (Finanzas, Legal, Operaciones, I+D) fueron llevados al mismo nivel que Marketing y RRHH — formularios estructurados con selects y prompts especializados por agente (24 agentes nuevos, 6 por departamento, cada uno con su orquestador C-level: CFO, CLO, COO, CTO). Además se migró el SDK a google-genai (#3), se agregó OCR para CVs escaneados vía Gemini multimodal (#5), se implementaron los campos condicionales de Compliance (#1), se corrigió el conteo de /health (#6) y se cerró el #4 (gemini-3.x) como no viable. Revisiones 00023-xtt00026-rpm en Cloud Run. Los 4 endpoints nuevos validados en producción (HTTP 200, documentos de 14k–19k caracteres).

Pendiente #2 · 4 departamentos estructurados

Backend: 4 modelos Pydantic nuevos (PeticionFinanzas/Legal/Operaciones/ID), 4 diccionarios de prompts (PROMPTS_FINANZAS/LEGAL/OPERACIONES/ID) con 6 agentes cada uno, y las funciones run_finanzas/legal/operaciones/id reescritas como mega-prompt (1 llamada gemini-2.5-pro por consulta). Endpoints migrados de query-params a JSON body.

Frontend: los 4 DEPTS pasaron a jsonBody:true con formularios estructurados (selects de tipo de análisis, período, moneda, jurisdicción, área, objetivo, dominio, etc.) reutilizando el mismo renderer de Marketing.

Equipos C-level (24 agentes nuevos)

DeptoOrquestador · agentes
💰 FinanzasCFO · Analista, Modelador, Riesgos, Fiscal, Redactor
⚖️ LegalCLO · Investigador, Contratos, Redactor, Compliance, Litigios
⚙️ OperacionesCOO · Procesos, Lean, SOPs, QA, Onboarding
🔬 I+DCTO · Web, Científico, Código, RAG, Prototipador

Pendientes restantes resueltos

#PendienteResolución
1Campos condicionales en ComplianceHECHO mecanismo showFor genérico (antigüedad/causal solo en Desvinculación) · rev 00023-xtt
3Migración SDK vertexaigoogle-genaiHECHO shim de compatibilidad sin tocar call-sites · rev 00024-tw4
5OCR para PDFs escaneadosHECHO fallback a Gemini multimodal cuando pypdf no extrae texto · rev 00025-bc8
6Conteo de agentes en /healthHECHO ahora reporta 38 agentes
4Habilitar gemini-3.xCERRADO no viable: política de la organización bloquea API keys (exige ADC) y el modelo no está en el Model Garden del proyecto. Screening sigue en gemini-2.5-flash
2Extender 4 departamentosHECHO formularios estructurados + 24 prompts por agente · rev 00026-rpm

Archivos modificados en esta sesión

ArchivoTipoDescripción del cambio
enterprise_agents_suite.py MODIFICADO Migración a google-genai (shim GenerativeModel); OCR _ocr_pdf_con_gemini; 4 modelos Pydantic + 4 dicts de prompts (24 agentes); run_finanzas/legal/operaciones/id reescritas como mega-prompt; endpoints a JSON body; /health a 38 agentes; CLI actualizado.
static/index.html MODIFICADO Campos condicionales showFor en Compliance; los 4 DEPTS (Finanzas/Legal/Operaciones/I+D) convertidos a formularios estructurados con selects y jsonBody.
requirements.txt MODIFICADO +google-genai, +pypdf, +python-multipart, +aiofiles; se retira la dependencia directa de vertexai.

Despliegues en Cloud Run (revisiones de la sesión)

RevisiónHito
00023-xtt#1 · Campos condicionales en Compliance (showFor)
00024-tw4#3 · Migración del SDK a google-genai (validado en los 3 tipos de endpoint)
00025-bc8#5 · OCR de CVs escaneados vía Gemini multimodal
00026-rpm#2 · Finanzas/Legal/Operaciones/I+D estructurados (24 agentes) · ACTIVO

Resumen del historial de sesiones

SesiónFechaHito principal
#92026-06-16Panel web (fix 404) · modelos a gemini-2.5-pro · Marketing Ultra-Premium · RRHH 8 agentes · 4 módulos · CVs PDF
#102026-06-16Prompts RRHH alineados · Estratega +entrevista/onboarding · CHRO universal (4 módulos) · fix opcionales Compliance
#112026-06-21Cierre de los 6 pendientes · SDK google-genai · OCR · campos condicionales · Finanzas/Legal/Operaciones/I+D estructurados (24 agentes)
Alineación de los prompts de RRHH con el borrador, CHRO universal para los 4 módulos y fix de campos opcionales en Compliance
Sesión de refinamiento del departamento de RRHH. Se comparó el borrador roles/prompt-rrhh.html contra los prompts ya implementados: 5 cumplían ampliamente (integrados con mejoras menores) y 2 estaban desasociados (Estratega y CHRO), resueltos según decisión del usuario. El Estratega de Adquisición se expandió para entregar sourcing + pauta de entrevista STAR + plan de onboarding (manteniendo el sourcing). El CHRO se volvió universal: ahora los 4 módulos (Reclutamiento, Compliance, Evaluación y Capacitación) terminan en el mismo "Reporte Ejecutivo de Capital Humano" según {tipo_requerimiento}, todo en la misma llamada (sin costo extra). Finalmente se corrigió un bloqueo de UX: en Compliance, los campos Años de antigüedad y Contexto de la situación pasaron a ser opcionales, para poder pedir el Protocolo Ley Karin sin llenar datos de desvinculación. Revisiones 00021-t9x y 00022-6r9 en Cloud Run.

¿Qué se hizo?

5 merges menores de prompts: analista_talento (+3 KPIs a 90 días), redactor_ofertas (anti-clichés, urgencia, LinkedIn/Laborum, manteniendo la lógica OCULTAR/MOSTRAR salario), desarrollo_organizacional (+guion de feedback listo para leer, técnica Sándwich), capacitacion_cultura (+encuestas de pulso).

Estratega expandido: estratega_adquisicion ahora entrega 3 bloques — Plan de Sourcing (canales chilenos), Pauta de Entrevista (5 preguntas STAR para red flags) y Plan de Onboarding (Día 1 / Semana 1 / Mes 1).

CHRO universal: chro_aprobador pasó de envolver solo Reclutamiento a ensamblar el "Reporte Ejecutivo de Capital Humano" para cualquier módulo según {tipo_requerimiento}. Se conectó dentro de la misma llamada en run_rrhh_compliance/evaluacion/capacitacion.

Fix UX Compliance: anos_antiguedad y contexto_extra marcados como optional: true en el frontend; el Protocolo Ley Karin ya no exige datos de desvinculación.

Alineación borrador vs. código

AgenteEstado
analista_talentoMERGE +KPIs 90 días
redactor_ofertasMERGE +anti-clichés/urgencia
estratega_adquisicionEXPANDIDO +entrevista+onboarding
screening_cvOK ya alineado
compliance_despidoOK ya alineado
desarrollo_organizacionalMERGE +guion feedback
capacitacion_culturaMERGE +encuestas pulso
chro_aprobadorUNIVERSAL 4 módulos

Archivos modificados en esta sesión

ArchivoTipoDescripción del cambio
enterprise_agents_suite.py MODIFICADO 5 prompts mejorados; estratega_adquisicion con sourcing+entrevista STAR+onboarding; chro_aprobador universal con {tipo_requerimiento}; ensamblaje CHRO conectado en run_rrhh_compliance/evaluacion/capacitacion (misma llamada).
static/index.html MODIFICADO Campos anos_antiguedad y contexto_extra del módulo Compliance marcados como opcionales; textos de sidebar RRHH ajustados (entrevista STAR · CHRO 4 módulos).

Despliegues en Cloud Run (revisiones de la sesión)

RevisiónHito
00021-t9x5 merges de prompts + Estratega expandido + CHRO universal en los 4 módulos
00022-6r9Fix UX: campos opcionales en Compliance (Protocolo Ley Karin sin datos de despido) · ACTIVO

Resumen del historial de sesiones

SesiónFechaHito principal
#12026-06-15Fix WSL default distro: docker-desktop → Ubuntu con wsl --set-default Ubuntu
#22026-06-15Diagnóstico OneDrive/WSL, identificación del repo GitHub, análisis de estructura del proyecto
#32026-06-15Service Account GCP agents-ia-sa, descarga de JSON, configuración de .env
#42026-06-15Clone del repo a C:\dev\ia-agents, copia de enterprise_agents_suite.py y CSVs de roles
#52026-06-15Fix CRLF, pip resolution-too-deep → uv, instalación de venv, fastapi+uvicorn a requirements.txt
#62026-06-15Fix base_dir, path Linux en .env, habilitación de APIs Vertex AI en GCP
#72026-06-15Test de modelos Gemini · Agente Marketing exitoso
#82026-06-15Dockerfile · Cloud Build · Cloud Run · IP estática · Load Balancer · SSL · DNS agents.wayweb.cl
#92026-06-16Panel web (fix 404) · modelos a gemini-2.5-pro · Marketing Ultra-Premium · RRHH 8 agentes · 4 módulos · CVs PDF
#102026-06-16Prompts RRHH alineados · Estratega +entrevista/onboarding · CHRO universal (4 módulos) · fix opcionales Compliance
Panel web funcional, corrección de modelos Gemini (404), Marketing Ultra-Premium y expansión de RRHH a 8 agentes con 4 módulos y subida de CVs en PDF
Sesión intensiva de producto. Se resolvió el 404 "Not Found" de la raíz del sitio (la API no servía el frontend): se agregó el endpoint GET / que entrega static/index.html y se montó StaticFiles en /static. Se corrigió un error de modelo de raíz: el parche sugería gemini-2.0-pro (y su fallback gemini-1.5-pro), pero ambos devuelven 404 en el proyecto agents-ia-499522; se unificaron los 6 departamentos a gemini-2.5-pro. Se construyó el Panel Marketing Ultra-Premium (formulario estructurado de 7 campos con selects, envío JSON) y se reescribieron los prompts por agente con inyección de tema_central y tier_entregable. Finalmente se expandió RRHH de un creador de ofertas a un departamento corporativo de 8 agentes con un selector "Tipo de Requerimiento" de 4 módulos (Reclutamiento, Compliance/Despidos, Evaluación y Capacitación) y subida de CVs en PDF (parseo con pypdf, screening en llamada separada con gemini-2.5-flash). Despliegues: revisiones 0001100020-9g7 en Cloud Run.

¿Qué se hizo?

Fix 404 raíz: la API FastAPI no exponía GET / ni servía estáticos. Se agregó el endpoint raíz con FileResponse(static/index.html), se montó StaticFiles en /static y se añadió aiofiles a requirements.txt.

Corrección de modelos: gemini-2.0-pro y gemini-1.5-pro verificados con 404. Unificación a gemini-2.5-pro (MODELO_PRINCIPAL) en los 6 departamentos; MODELO_SEO y MODELO_SECUNDARIO = gemini-2.5-flash; MODELO_IMAGEN = gemini-2.5-flash-image. Forzado location="us-central1".

Marketing Ultra-Premium: formulario de 7 campos (empresa, rubro, tema central, objetivo, tono, tier de entregable, contexto) con selects y envío como cuerpo JSON. Prompts por agente con .format(tema_central=..., tier_entregable=...).

RRHH 360° + PDF: pypdf + python-multipart, extracción de CVs en memoria, run_screening_cvs() como llamada independiente con gemini-2.5-flash y el resto del equipo en gemini-2.5-pro.

RRHH 4 módulos: selector "Tipo de Requerimiento" que cambia campos y agentes: Reclutamiento, Compliance/Despidos (Ley Karin, Ley 40h, Art. 160/161), Evaluación (360°/OKR/Prueba) y Capacitación (SENCE). Nuevos tipos de campo number y checkbox y renderer dinámico en el frontend.

Errores corregidos

ErrorCausaSolución
{"detail":"Not Found"} en la raíz La API no tenía GET / ni servía static/index.html Endpoint raíz con FileResponse + StaticFiles en /static + aiofiles
404 Publisher Model gemini-2.0-pro El modelo no existe / no está habilitado en agents-ia-499522 Unificado a gemini-2.5-pro (validado OK con prueba real)
404 gemini-1.5-pro (Finanzas, Legal, Ops, I+D) Modelo retirado, los 4 departamentos lo usaban hardcodeado Reemplazado por MODELO_PRINCIPAL en las 4 funciones
404 gemini-3.5-flash (screening) Los modelos gemini-3.x no están allowlisted en el proyecto MODELO_SECUNDARIO = gemini-2.5-flash (confirmado funcional)
deploy_suite.sh sobreescribía el Dockerfile Heredoc generaba un Dockerfile con requisitos.txt (typo) Eliminado el heredoc; usa el Dockerfile correcto del repo

Arquitectura RRHH 360° — 8 agentes en 4 módulos

Módulo (Tipo de Requerimiento)AgentesModelo · Llamadas
1 · Reclutamiento y Selección
+ subida de CVs en PDF
Analista de Talento · Estratega Adq./Onboarding · Redactor de Ofertas (privacidad salario + beneficios) · Agente de Screening · CHRO Aprobador gemini-2.5-pro + Screening en gemini-2.5-flash · 2 llamadas
2 · Auditoría Legal o Despido Consultor de Compliance Laboral (riesgo DT, Ley Karin, Ley 40h, finiquitos) gemini-2.5-pro · 1 llamada
3 · Evaluación y Desarrollo Consultor de Desarrollo Organizacional (pauta 360°/OKR/Prueba + plan de acción) gemini-2.5-pro · 1 llamada
4 · Cultura y Capacitación Especialista en Capacitación y Cultura (malla SENCE + team building) gemini-2.5-pro · 1 llamada

Archivos modificados / creados en esta sesión

ArchivoTipoDescripción del cambio
enterprise_agents_suite.py MODIFICADO Endpoint GET / + StaticFiles; modelos unificados a gemini-2.5-pro / 2.5-flash; modelos PROMPTS_AGENTES de Marketing con inyección de tema_central/tier_entregable; modelo PeticionRRHH ampliado; extraer_texto_pdf() con pypdf; PROMPTS_RRHH (8 agentes); router run_rrhh() + 4 funciones de módulo; endpoint /api/rrhh multipart con tipo_requerimiento; CLI actualizado.
static/index.html CREADO / MODIFICADO Panel web de la agencia (sidebar de departamentos + roles). Marketing Ultra-Premium (JSON); RRHH con selector de "Tipo de Requerimiento" de 4 módulos, renderer dinámico, tipos number/checkbox, subida de CVs en PDF (FormData) y sidebar de 8 agentes (badge "38 Agentes").
requirements.txt MODIFICADO Agregados aiofiles (StaticFiles), python-multipart (formularios con archivos) y pypdf (parseo de CVs).
deploy_suite.sh MODIFICADO Eliminado el heredoc que regeneraba un Dockerfile roto con requisitos.txt; ahora usa el Dockerfile del repo.

Despliegues en Cloud Run (revisiones de la sesión)

RevisiónHito
00012Fix 404 raíz: GET / sirve el panel web
00015Marketing Ultra-Premium con tema_central + modelos corregidos a gemini-2.5-pro
00016RRHH Reclutamiento 360° con subida de CVs en PDF (pypdf)
00018RRHH 2 llamadas (screening separado) + agente Compliance Laboral
00019MODELO_SECUNDARIO corregido a gemini-2.5-flash (3.x daba 404)
00020-9g7RRHH 8 agentes · 4 módulos (Reclutamiento/Compliance/Evaluación/Capacitación) · ACTIVO

Resumen del historial de sesiones

SesiónFechaHito principal
#12026-06-15Fix WSL default distro: docker-desktop → Ubuntu con wsl --set-default Ubuntu
#22026-06-15Diagnóstico OneDrive/WSL, identificación del repo GitHub, análisis de estructura del proyecto
#32026-06-15Service Account GCP agents-ia-sa, descarga de JSON, configuración de .env
#42026-06-15Clone del repo a C:\dev\ia-agents, copia de enterprise_agents_suite.py y CSVs de roles
#52026-06-15Fix CRLF, pip resolution-too-deep → uv, instalación de venv, fastapi+uvicorn a requirements.txt
#62026-06-15Fix base_dir (1 nivel arriba), path Linux en .env, habilitación de APIs Vertex AI en GCP
#72026-06-15Test de modelos Gemini · Agente Marketing exitoso
#82026-06-15Dockerfile · Cloud Build · Cloud Run · IP estática · Load Balancer · SSL · DNS agents.wayweb.cl
#92026-06-16Panel web (fix 404) · modelos a gemini-2.5-pro · Marketing Ultra-Premium · RRHH 8 agentes · 4 módulos · subida de CVs PDF
Despliegue completo en GCP: Cloud Run + Load Balancer global con IP estática, certificado SSL y dominio agents.wayweb.cl
Sesión de infraestructura end-to-end. Se creó el Dockerfile con Python 3.11-slim, se construyó la imagen en Cloud Build (habilitando las APIs de Cloud Storage requeridas) y se desplegó en Cloud Run como servicio público (agentes-suite · revisión 00001-7q2 · us-central1). Se provisionó una IP estática (8.233.18.239), se creó un Network Endpoint Group serverless apuntando a Cloud Run, un backend service (agentes-backend), un URL map y un proxy HTTPS. Se creó inicialmente el certificado agentes-ssl para el dominio incorrecto (agents-wayweb.cl); corregido con agentes-ssl-v2 para agents.wayweb.cl. Se agregó el registro DNS tipo A en el panel de v2nets.com apuntando al IP estático. SSL en PROVISIONING.

¿Qué se hizo?

Dockerfile: imagen Python 3.11-slim, copia de requirements.txt, instalación de dependencias con pip, copia del código fuente, EXPOSE 8080, CMD con python enterprise_agents_suite.py --server --port 8080.

Cloud Build + GCR: gcloud builds submit desde C:\dev\ia-agents en PowerShell. Requirió habilitar storage.googleapis.com y storage-api.googleapis.com (primer intento fallido con PERMISSION_DENIED). Imagen publicada en GCR como gcr.io/agents-ia-499522/agentes-suite.

Cloud Run: gcloud run deploy agentes-suite con --allow-unauthenticated. URL del servicio: https://agentes-suite-230896657071.us-central1.run.app.

Load Balancer global: IP estática agentes-ip → NEG serverless agentes-neg → backend service agentes-backend → URL map agentes-urlmap → target HTTPS proxy agentes-https-proxy → forwarding rule agentes-https-rule (puerto 443).

SSL y DNS: certificado Google-managed agentes-ssl-v2 para agents.wayweb.cl (el primero agentes-ssl apuntaba a agents-wayweb.cl por error tipográfico). Registro DNS A añadido en v2nets.com: agents.wayweb.cl → 8.233.18.239 (TTL 14400).

Errores corregidos

ErrorCausaSolución
Cloud Build PERMISSION_DENIED APIs de Cloud Storage no habilitadas en el proyecto gcloud services enable storage.googleapis.com storage-api.googleapis.com
SSL cert para dominio incorrecto Se escribió agents-wayweb.cl en lugar de agents.wayweb.cl Nuevo certificado agentes-ssl-v2 con dominio correcto; HTTPS proxy actualizado
deploy_suite.sh bug Script referenciaba requisitos.txt en vez de requirements.txt Workaround: comandos gcloud directos desde PowerShell sin usar el script

Archivos creados / modificados en esta sesión

ArchivoTipoDescripción del cambio
Dockerfile CREADO Imagen Python 3.11-slim. Instala requirements.txt, copia código fuente, expone puerto 8080, ejecuta enterprise_agents_suite.py --server.
archivos/bitacora.html CREADO Este archivo. Registro completo de las 8 sesiones de trabajo del proyecto, orden más reciente primero, diseño basado en bt.html (Inter + JetBrains Mono, paleta índigo).

Infraestructura GCP al cierre de sesión #8

ComponenteDetalleEstado
Cloud Run serviceagentes-suite · us-central1 · revisión 00001-7q2ACTIVO
Container Imagegcr.io/agents-ia-499522/agentes-suitePUBLICADO
IP Estáticaagentes-ip8.233.18.239RESERVADA
Serverless NEGagentes-neg → Cloud Run agentes-suiteCREADO
Backend Serviceagentes-backendCREADO
URL Map + HTTPS Proxyagentes-urlmap / agentes-https-proxyCREADO
SSL Certificateagentes-ssl-v2 · agents.wayweb.clPROVISIONING
DNS Recordagents.wayweb.cl A 8.233.18.239 · TTL 14400 · v2nets.comCREADO

Resumen del historial de sesiones

SesiónFechaHito principal
#12026-06-15Fix WSL default distro: docker-desktop → Ubuntu con wsl --set-default Ubuntu
#22026-06-15Diagnóstico OneDrive/WSL, identificación del repo GitHub, análisis de estructura del proyecto
#32026-06-15Service Account GCP agents-ia-sa, descarga de JSON, configuración de .env
#42026-06-15Clone del repo a C:\dev\ia-agents, copia de enterprise_agents_suite.py y CSVs de roles
#52026-06-15Fix CRLF, pip resolution-too-deep → uv, instalación de venv, fastapi+uvicorn a requirements.txt
#62026-06-15Fix base_dir (1 nivel arriba), path Linux en .env, habilitación de APIs Vertex AI en GCP
#72026-06-15Test de todos los modelos Gemini; solo gemini-2.5-flash funciona · Agente Marketing exitoso
#82026-06-15Dockerfile · Cloud Build · Cloud Run · IP estática · Load Balancer · SSL · DNS agents.wayweb.cl
Identificación del modelo Gemini compatible y primera ejecución exitosa del agente de Marketing
Sesión de validación del modelo de IA. Se probaron programáticamente todos los candidatos de Gemini disponibles en el proyecto agents-ia-499522: gemini-1.5-pro, gemini-2.0-flash-001, gemini-1.5-flash, gemini-2.0-flash y gemini-1.0-pro — todos devolvieron error 404 (modelo no disponible en la región). El único modelo funcional resultó ser gemini-2.5-flash. Se actualizaron los seis departamentos del suite para usarlo. El agente de Marketing ejecutó con éxito su primer prompt, generando un plan SEO y concepto visual con el equipo de 6 roles leídos desde mkt.csv.

¿Qué se hizo?

Test sistemático de modelos: se escribió un script de prueba iterando sobre todos los modelos candidatos de Gemini. Resultado: únicamente gemini-2.5-flash devuelve respuesta en us-central1 para el proyecto agents-ia-499522.

Actualización de los 6 departamentos: todas las instancias de GenerativeModel("...") en enterprise_agents_suite.py actualizadas a gemini-2.5-flash: Marketing, RRHH, Finanzas, Legal, Operaciones e I+D.

Primera ejecución del agente Marketing: comando python enterprise_agents_suite.py --local --tipo marketing --tema "agencia IA Wayweb" ejecutado exitosamente desde el venv. El agente leyó 6 roles desde roles/mkt.csv, envió el prompt a Gemini y retornó el plan SEO completo con prompt de imagen en inglés (estilo "Nano Banana").

Modelos probados y resultado

ModeloResultado
gemini-1.5-pro404 Not Found
gemini-2.0-flash-001404 Not Found
gemini-1.5-flash404 Not Found
gemini-2.0-flash404 Not Found
gemini-1.0-pro404 Not Found
gemini-2.5-flashOK · Respuesta completa

Archivos modificados en esta sesión

ArchivoTipoDescripción del cambio
enterprise_agents_suite.py MODIFICADO Los 6 departamentos (Marketing, RRHH, Finanzas, Legal, Operaciones, I+D) actualizados: GenerativeModel("gemini-2.5-flash"). Único modelo funcional en el proyecto agents-ia-499522 / us-central1.
Corrección del bug de base_dir, path Linux en .env y habilitación de las APIs de Vertex AI en GCP
Sesión de correcciones previas a la primera ejecución real del agente. Se identificó y corrigió un bug crítico en enterprise_agents_suite.py: la función leer_roles_csv() calculaba base_dir con dos niveles de os.path.dirname() anidados, haciendo que buscara los CSVs en la carpeta padre del proyecto en lugar de la raíz del repositorio. Se corrigió el path de credenciales en .env de notación Windows a Linux (/mnt/c/...). Se habilitaron las APIs de Vertex AI y AI Platform en la consola de GCP (estaban deshabilitadas).

¿Qué se hizo?

Fix base_dir (1 nivel arriba): la línea original tenía os.path.dirname(os.path.dirname(os.path.abspath(__file__))) — dos niveles arriba del script, apuntando a C:\dev en lugar de C:\dev\ia-agents. Corregido a os.path.dirname(os.path.abspath(__file__)).

Fix path en .env: GOOGLE_APPLICATION_CREDENTIALS tenía valor C:/dev/ia-agents/roles/agents-ia-49.json (notación Windows). En WSL ese path no es accesible; corregido a /mnt/c/dev/ia-agents/roles/agents-ia-49.json.

Habilitación de APIs GCP: desde la consola de GCP se activaron Vertex AI API y AI Platform API en el proyecto agents-ia-499522. Sin estas APIs, cualquier llamada a vertexai.init() retornaba error de servicio.

Errores corregidos

ErrorCausaSolución
CSV de roles no encontrado base_dir con 2 niveles de os.path.dirname() apuntaba a C:\dev Reducido a 1 nivel: os.path.dirname(os.path.abspath(__file__))
Credenciales GCP no cargadas en WSL .env usaba path Windows (C:/dev/...) no visible desde WSL Cambiado a path Linux: /mnt/c/dev/ia-agents/roles/agents-ia-49.json
Vertex AI error de servicio APIs Vertex AI / AI Platform no habilitadas en el proyecto GCP Habilitación desde consola GCP → APIs y Servicios → Vertex AI API + AI Platform API

Archivos modificados en esta sesión

ArchivoTipoDescripción del cambio
enterprise_agents_suite.py MODIFICADO Línea 15: base_dir = os.path.dirname(os.path.abspath(__file__)). Eliminado el doble dirname() que causaba el path incorrecto hacia los CSVs de roles.
.env MODIFICADO GOOGLE_APPLICATION_CREDENTIALS corregido de C:/dev/ia-agents/roles/agents-ia-49.json a /mnt/c/dev/ia-agents/roles/agents-ia-49.json (path WSL/Linux).
Resolución de problemas de dependencias Python: CRLF en scripts, pip resolution-too-deep e instalación con uv
Sesión de ingeniería de entorno enfocada en superar los bloqueos de instalación de dependencias. Se corrigieron los finales de línea CRLF en setup.sh y start.sh que impedían su ejecución en WSL. Se diagnosticó el error pip resolution-too-deep causado por la incompatibilidad entre Python 3.14 y google-cloud-aiplatform. Se instaló el gestor de paquetes uv y se creó el venv usando la ruta absoluta de uv con la variable de entorno VIRTUAL_ENV para apuntar al directorio correcto. Se agregaron fastapi y uvicorn al requirements.txt (estaban ausentes causando ImportError al arrancar el servidor).

¿Qué se hizo?

Fix CRLF en scripts bash: sed -i 's/\r//' setup.sh start.sh en WSL. Los archivos habían sido editados en Windows y tenían saltos de línea CRLF que bash de Linux no puede interpretar (\r: command not found).

Diagnóstico pip resolution-too-deep: Python 3.14 (activo en el sistema) genera un árbol de dependencias demasiado profundo con google-cloud-aiplatform. Solución: instalar y usar uv como gestor de paquetes.

Instalación de uv: curl -LsSf https://astral.sh/uv/install.sh | sh. Binario disponible en /home/mfran/.local/bin/uv.

Creación del venv con ruta absoluta: rm -rf venv && /home/mfran/.local/bin/uv venv venv. Instalación de dependencias: VIRTUAL_ENV=/mnt/c/dev/ia-agents/venv /home/mfran/.local/bin/uv pip install -r requirements.txt. La variable VIRTUAL_ENV fue necesaria porque uv instalaba en una ubicación incorrecta sin ella.

Adición de fastapi + uvicorn: se detectó que el servidor fallaba con ModuleNotFoundError: No module named 'fastapi'. Ambas dependencias no estaban en requirements.txt. Se agregaron y se reinstalaron con uv.

Errores corregidos

ErrorCausaSolución
\r: command not found en bash Scripts con finales de línea CRLF (editados en Windows) sed -i 's/\r//' setup.sh start.sh
pip resolution-too-deep Python 3.14 + google-cloud-aiplatform incompatibles con el resolver de pip Reemplazado pip por uv como gestor de paquetes
uv instalando en path incorrecto Sin VIRTUAL_ENV, uv usaba el venv del sistema en lugar del local VIRTUAL_ENV=/mnt/c/dev/ia-agents/venv prefijado a cada comando uv
$PATH expandido por PowerShell En export PATH=...:$PATH, PS expandía $PATH a rutas Windows Uso de ruta absoluta /home/mfran/.local/bin/uv directamente
ModuleNotFoundError: fastapi fastapi y uvicorn no estaban en requirements.txt Agregados fastapi>=0.110.0 y uvicorn>=0.29.0

Archivos modificados en esta sesión

ArchivoTipoDescripción del cambio
requirements.txt MODIFICADO Adición de fastapi>=0.110.0 y uvicorn>=0.29.0. Sin estas líneas el servidor web fallaba con ImportError al importar fastapi/uvicorn.
setup.sh / start.sh MODIFICADO Corrección de finales de línea: CRLF → LF con sed -i 's/\r//'. Requerido para ejecución en bash de WSL/Linux.
Clone del repositorio a C:\dev\ia-agents y configuración del entorno local fuera de OneDrive
Sesión de preparación del entorno de desarrollo local. Se descubrió que el archivo enterprise_agents_suite.py en GitHub solo tenía 2 bytes (estaba vacío), lo que obligó a copiar el archivo real de 14 KB desde la versión en OneDrive. Se clonó el repositorio a C:\dev\ia-agents (ruta local, fuera de OneDrive) para evitar el problema de incompatibilidad entre OneDrive Files On-Demand y WSL. Se copiaron los archivos CSV de roles y el JSON de credenciales. Se creó el archivo .env con las variables de entorno necesarias.

¿Qué se hizo?

Clone del repositorio a ruta local: git clone a C:\dev\ia-agents para evitar el problema OneDrive/WSL. OneDrive almacena archivos en la nube (Files On-Demand); WSL no puede acceder a estos archivos a través de /mnt/c porque no están físicamente en el disco.

Copia de enterprise_agents_suite.py: el archivo en GitHub tenía 2 bytes (estaba vacío). La copia real de 14 KB con los 6 departamentos, 36 agentes y la API FastAPI fue copiada desde la versión local de OneDrive al nuevo clone.

Copia de roles CSV: los archivos roles/mkt.csv, roles/rrhh.csv, roles/analista.csv, roles/finzas.csv, roles/legañ.csv y roles/i+d.csv copiados al clone local.

Copia de credenciales: roles/agents-ia-49.json (Service Account key) copiado al repositorio local.

Creación de .env: archivo con GOOGLE_APPLICATION_CREDENTIALS, GCP_PROJECT_ID=agents-ia-499522 y GCP_REGION=us-central1.

Diagnóstico OneDrive/WSL

SíntomaCausa raíz
Archivos no encontrados desde WSL en /mnt/c/Users/.../OneDrive/... OneDrive Files On-Demand: archivos existen como marcadores en el sistema de archivos Windows pero no tienen contenido físico hasta que se descargan. WSL no puede forzar la descarga on-demand.
enterprise_agents_suite.py = 2 bytes en GitHub El archivo fue commiteado cuando OneDrive no lo había sincronizado (subió el marcador vacío).

Archivos creados en esta sesión

ArchivoTipoDescripción
C:\dev\ia-agents\enterprise_agents_suite.py COPIADO Archivo principal de 14 KB con los 6 departamentos, 36 agentes, modos --local y --server. Copiado desde OneDrive al clone local.
C:\dev\ia-agents\.env CREADO GOOGLE_APPLICATION_CREDENTIALS, GCP_PROJECT_ID=agents-ia-499522, GCP_REGION=us-central1.
C:\dev\ia-agents\roles\*.csv COPIADOS 6 archivos CSV de roles (mkt, rrhh, analista, finzas, legañ, i+d) copiados desde OneDrive al clone local.
C:\dev\ia-agents\roles\agents-ia-49.json COPIADO Service Account key para agents-ia-sa@agents-ia-499522.iam.gserviceaccount.com.
Creación del Service Account en GCP y configuración de credenciales de Vertex AI
Sesión dedicada a la configuración de identidad y permisos en GCP. Se creó el Service Account agents-ia-sa en el proyecto agents-ia-499522 con los roles necesarios para acceder a Vertex AI y Gemini. Se generó y descargó la clave JSON (agents-ia-49.json). Se examinó el archivo de credenciales en el IDE para verificar su estructura. El archivo .env fue configurado con la ruta al JSON y los valores de proyecto y región de GCP.

¿Qué se hizo?

Creación del Service Account: desde la consola de GCP → IAM y Administración → Cuentas de servicio → Crear cuenta de servicio. Nombre: agents-ia-sa. Proyecto: agents-ia-499522. Roles asignados: Vertex AI User, AI Platform Admin.

Generación de clave JSON: desde la consola, pestaña "Claves" del Service Account → Agregar clave → JSON. Archivo descargado como agents-ia-49.json (nombre real del archivo generado por GCP).

Configuración del .env: GOOGLE_APPLICATION_CREDENTIALS apuntando al JSON, GCP_PROJECT_ID=agents-ia-499522 y GCP_REGION=us-central1.

Configuración GCP

ElementoValor
Proyecto GCPagents-ia-499522
Service Accountagents-ia-sa@agents-ia-499522.iam.gserviceaccount.com
Archivo de credencialesroles/agents-ia-49.json
Regiónus-central1
Roles IAMVertex AI User · AI Platform Admin

Archivos creados en esta sesión

ArchivoTipoDescripción
roles/agents-ia-49.json CREADO Service Account key en formato JSON generada en la consola de GCP. Usada por google-auth para autenticar las llamadas a Vertex AI / Gemini.
.env CREADO Variables de entorno: GOOGLE_APPLICATION_CREDENTIALS, GCP_PROJECT_ID, GCP_REGION.
Diagnóstico de incompatibilidad OneDrive/WSL y análisis de la estructura del proyecto desde el repositorio GitHub
Sesión de diagnóstico del entorno de desarrollo. Después de corregir el distro WSL predeterminado (sesión anterior), se intentó ejecutar los scripts desde la ruta de OneDrive en WSL (/mnt/c/Users/mfran/OneDrive/Desktop/.../agents-ia) pero los archivos no eran visibles porque OneDrive los almacenaba como cloud-only (Files On-Demand). Se identificó el repositorio de GitHub del proyecto a través del README. Se analizaron las rutas y estructura del proyecto para planificar la instalación en una ruta local fuera de OneDrive.

¿Qué se diagnosticó?

OneDrive Files On-Demand: cuando OneDrive está configurado en modo "Files On-Demand", los archivos no descargados aparecen como marcadores de sistema de archivos en Windows pero no tienen contenido real. WSL mapea /mnt/c al sistema de archivos de Windows — los archivos cloud-only aparecen como vacíos o con 0 bytes en WSL, haciéndolos inutilizables para bash/Python.

Solución identificada: clonar el repositorio directamente a una ruta local fuera de OneDrive (ej. C:\dev\ia-agents) donde los archivos estén físicamente en el disco y accesibles desde WSL.

Repositorio GitHub identificado: URL del repo leída desde el README del proyecto. Contenía el código fuente del suite, scripts de setup y los archivos de roles CSV.

Errores diagnosticados

ErrorCausaPlan de solución
bash: ia-agents-main/venv/start.sh: No such file or directory Intentando ejecutar desde OneDrive; WSL no ve los archivos cloud-only Clonar a C:\dev\ia-agents (ruta local física)
Directorio de trabajo incorrecto Comandos ejecutados fuera del directorio del proyecto Navegar a la raíz del repo antes de ejecutar cualquier script
Corrección del distro WSL predeterminado: docker-desktop no tiene bash
Primera sesión del proyecto. Al intentar ejecutar bash start.sh en la terminal, WSL arrojó el error execvpe(/bin/bash) failed: No such file or directory. Se diagnosticó que el distro WSL predeterminado era docker-desktop — una distribución mínima usada por Docker Desktop que no incluye bash ni las herramientas de usuario estándar. Se corrigió estableciendo Ubuntu como distro predeterminada con el comando wsl --set-default Ubuntu. Tras el cambio, WSL ejecuta bash correctamente.

¿Qué se hizo?

Diagnóstico del error: el error execvpe(/bin/bash) failed: No such file or directory ocurre cuando el distro WSL activo no tiene /bin/bash. docker-desktop es un distro de sistema mínimo sin shell de usuario.

Solución aplicada: wsl --set-default Ubuntu en PowerShell. Este comando cambia el distro predeterminado de docker-desktop a la distribución Ubuntu instalada en el sistema, que sí incluye bash, Python y todas las herramientas de desarrollo estándar.

Verificación: wsl -l -v confirmó que Ubuntu quedó marcado como * (predeterminado). Las ejecuciones posteriores de bash funcionaron correctamente.

Información del sistema

ElementoValor
OSWindows 11 Pro 10.0.26200
WSL distro (antes)docker-desktop (predeterminado · sin bash)
WSL distro (después)Ubuntu (predeterminado)
Comando aplicadowsl --set-default Ubuntu
Shell de trabajoPowerShell (gcloud) + WSL bash (Python/venv)

Contexto del proyecto al inicio

ElementoValor inicial
Nombre del proyectoEnterprise Agents Suite v6.0
DescripciónEmpresa virtual / agencia automática con 6 departamentos IA y 36 agentes Gemini
Proyecto GCPagents-ia-499522
Modelo IAGoogle Gemini 2.5 Flash vía Vertex AI
BackendPython · FastAPI · uvicorn
Despliegue objetivoGCP Cloud Run · agents.wayweb.cl
Departamentos planificadosMarketing · RRHH · Finanzas · Legal · Operaciones · I+D

Pendientes

Backlog de la Sesión #10 — cerrado por completo en la Sesión #11 (2026-06-21). Se mantiene como registro histórico.

#PendienteDetalleEstado
1 Campos condicionales en Compliance Mostrar/ocultar y exigir campos según la Acción requerida. Resuelto con el mecanismo genérico showFor (antigüedad + causal solo aparecen en Desvinculación). ✓ Hecho · 00023-xtt
2 Extender Finanzas, Legal, Operaciones e I+D Llevados al nivel de Marketing y RRHH: formularios estructurados con selects + prompts por agente (24 agentes nuevos, equipos CFO/CLO/COO/CTO). Endpoints migrados a JSON body. ✓ Hecho · 00026-rpm
3 Migración del SDK vertexaigoogle-genai Migrado a google-genai con un shim de compatibilidad (GenerativeModel) que evita tocar los call-sites. Validado en los 3 tipos de endpoint. ✓ Hecho · 00024-tw4
4 Habilitar modelos gemini-3.x No viable: la política de seguridad de la organización no permite API keys (exige ADC) y el modelo no figura en el Model Garden del proyecto. El screening permanece en gemini-2.5-flash. ⊘ Cerrado · no viable
5 OCR para PDFs escaneados Resuelto con fallback al modo multimodal de Gemini cuando pypdf no extrae texto. Validado con un CV escaneado (imagen). ✓ Hecho · 00025-bc8
6 Sincronizar conteo de agentes en /health El endpoint /health ahora reporta 38 agentes. ✓ Hecho
Los 6 pendientes de la Sesión #10 quedaron resueltos en la Sesión #11: 5 implementados (revisiones 0002300026) y el #4 cerrado como no viable por política de la organización.

Roadmap · Dashboard de "Inteligencia de la Agencia"

Iniciado en la Sesión #12. Plan por fases para construir el dashboard sobre datos reales.

FaseObjetivoEstado
0 Saneamiento · sacar la SA key del build de Docker + corregir estructura.md. ✓ Hecho
1 Telemetría real · registrar cada consulta en Firestore con tokens reales, costo y latencia (telemetria.py). ✓ Hecho · 00027-mv7
2 Feedback de calidad · botones 👍/👎 → /api/feedback → Firestore, enlazado a cada consulta. ✓ Hecho · 00028-ctl
3 Dashboard visual · dashboard.py reescrito para agregar desde Firestore (sin random) y static/dashboard.html con gráficos (Chart.js): paneles Operacional, FinOps y Calidad. Ruta /dashboard + enlace en la topbar. ✓ Hecho · 00029-w2s
Dashboard completo. Las 4 fases están implementadas y verificadas en producción (rev 00029-w2s). El dashboard vive en /dashboard y consume /api/dashboard/metrics, que agrega datos 100% reales desde Firestore (telemetria_consultas y telemetria_feedback): consultas por departamento, latencia, costos y tokens por modelo, satisfacción 👍/👎 y uso de OCR. Ya no quedan pendientes del roadmap.