[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-106543":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":16,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":16,"compositeScore":17,"rankGlobal":10,"rankLanguage":10,"license":10,"archived":18,"fork":18,"defaultBranch":19,"hasWiki":20,"hasPages":18,"topics":21,"createdAt":10,"pushedAt":22,"updatedAt":23,"readmeContent":24,"aiSummary":10,"trendingCount":15,"starSnapshotCount":15,"syncStatus":25,"lastSyncTime":26,"discoverSource":27},106543,"lidr-it-estimator-demo","LIDR-ai\u002Flidr-it-estimator-demo","LIDR-ai","Estimator — estimación de software con un flujo de agentes","https:\u002F\u002Flidr.co\u002Fai-engineering",null,"Python",61,92,1,0,4,45.29,false,"main",true,[],"2026-10-27 15:48:43","2026-11-01 05:07:09","# Estimator — estimación de software con un flujo de agentes\n\nDe la **transcripción de una reunión con cliente** a un **presupuesto desglosado** y una\n**propuesta comercial**, con dos paradas en las que decide una persona.\n\nEl sistema lee la conversación, la descompone en módulos y tareas, busca cuántas horas\ncostaron tareas parecidas en presupuestos históricos, y monta el precio. No es un asistente\nal que preguntas: es un flujo que se ejecuta, se detiene donde tiene que detenerse, y te\nentrega un documento.\n\n---\n\n## Levantarlo\n\nNecesitas Docker y una clave de OpenAI. Cuatro comandos:\n\n```bash\ncp .env.example .env\n# abre .env y pon tu OPENAI_API_KEY — es lo único obligatorio\n\ndocker compose up --build\n\n# carga el corpus de presupuestos históricos (ver más abajo: NO es opcional)\ndocker compose exec ai-service python scripts\u002Fbuild_task_corpus.py --ingest\n\nopen http:\u002F\u002Flocalhost:3000\u002Fdemo\n```\n\nEl primer arranque tarda unos minutos: compila gemas nativas y descarga imágenes. Los\nsiguientes son rápidos.\n\n### Cuatro cosas que conviene saber antes de empezar\n\n**El corpus histórico hay que cargarlo a mano.** Es el tercer comando y no lo hace nadie por\nti. Sin él, el sistema no tiene presupuestos contra los que comparar: cada tarea sale sin\nhoras y el flujo *parece* roto sin estarlo. El script genera 60 proyectos de ejemplo\n(~1.500 tareas) y los indexa. Es **idempotente**: si vuelves a lanzarlo verás muchos `409`,\nque significan «ya estaba». Lánzalo **dentro del contenedor** (`docker compose exec`), no\ndesde tu máquina: fuera no hereda el token entre servicios y la primera petición daría 401.\n\n**Empieza en `\u002Fdemo`, no en `\u002F`.** La portada todavía no enlaza este flujo. `\u002Fdemo` es un\natajo que te deja directamente en la pantalla de arranque.\n\n**Las migraciones se aplican solas** al arrancar cada servicio. No tienes que ejecutar nada.\n(Si alguna vez necesitas evitarlo, `RUN_MIGRATIONS=false`.)\n\n**De `.env.example`, solo `OPENAI_API_KEY` viene vacía a propósito.** El resto de valores\nfuncionan tal cual para desarrollo local. Para cualquier despliegue real, genera además un\n`AI_SERVICE_TOKEN` con `openssl rand -hex 32`.\n\n---\n\n## Cómo funciona el flujo\n\nCinco pantallas. Tú intervienes en tres.\n\n### 1 · Arranque\n\nFijas dos parámetros de negocio y pegas la conversación:\n\n- **Tarifa** — lo que cobras por hora, en €\u002Fh\n- **Contingencia** — un colchón porcentual sobre el total\n- **Transcripción** — pegada a mano o subida con **«Subir .txt»**\n\nPulsas **«Arrancar el grafo →»**.\n\n> Hay transcripciones de ejemplo en `examples\u002Ftranscripts\u002F`. La más corta, `01_clear.txt`,\n> es una discovery call de una fintech que quiere el backend de una app de banca móvil.\n\n### 2 · Flujo en vivo\n\nAquí no haces nada. Cada agente ocupa una fila y va reportando lo que hace según termina;\nla pantalla se refresca sola y se recarga cuando el flujo llega a una parada humana.\n\n**Esto tarda un par de minutos.** No se ha colgado — ver la tabla de tiempos más abajo.\n\n### 3 · 🧑 Puerta humana 1 — revisión del desglose\n\nEl flujo **se detiene** y te enseña el árbol de módulos y tareas que ha propuesto. Puedes\nrenombrar, borrar y añadir lo que quieras: **esto es lo que se va a estimar**. Todavía no\nhay horas por ningún lado.\n\nAl aprobar, se lanza una búsqueda por **cada** tarea que hayas dejado, en paralelo.\n\n### 4 · 🧑 Puerta humana 2 — revisión final\n\nVuelve con las horas puestas y un informe de fiabilidad. Aquí solo tocas **las horas**: la\nestructura ya la aprobaste.\n\nLas tareas **sin precedente histórico** aparecen marcadas y vacías. Eso es deliberado: el\nsistema prefiere decirte que no lo sabe a inventarse un número. Las rellenas tú.\n\nDecides también si quieres que se redacte la propuesta comercial.\n\n### 5 · Resultado\n\nTres cifras arriba — **jornadas**, **horas** y **precio** — y el desglose por módulo, que se\ndespliega hasta el detalle de cada tarea con sus horas y su coste.\n\nLa propuesta se descarga en **PDF** o en **Markdown**, y puedes **regenerarla** las veces que\nquieras sin repetir el flujo.\n\n### Dos cosas que sorprenden\n\n**El precio no lo calcula ningún agente.** Es una multiplicación: las horas que el sistema\nfundamentó contra presupuestos reales, por la tarifa que pusiste tú, más tu contingencia. La\npropuesta comercial se limita a citar esa cifra; no la deriva, no la redondea.\n\n**Las pausas son de verdad.** El estado se guarda en Postgres, no en la sesión del navegador.\nPuedes cerrar la pestaña en una puerta humana y volver mañana.\n\n### Cuánto tarda cada tramo\n\nMedido sobre una transcripción real que produjo 11 módulos y 75 tareas:\n\n| Tramo | Tiempo |\n|---|---|\n| Clasificar la transcripción | ~4 s |\n| Proponer módulos y tareas | **~2 min** ← el más largo |\n| Calcular las horas de las 75 tareas | **~2,5 s** |\n| Recuperar las tareas dudosas | ~1 min |\n| Redactar el informe | ~15 s |\n| Redactar la propuesta | ~8 s |\n\n---\n\n## Qué hace cada agente\n\nEn las pantallas cada paso lleva nombre y cara. Esto es lo que hay detrás:\n\n| | Agente | Qué hace | Modelo |\n|---|---|---|---|\n| 🕶 | **Morpheus** | Juzga la complejidad de la transcripción y la reformula en un brief limpio | `gpt-4o-mini` |\n| 🥋 | **Neo** | Descompone el brief en módulos → tareas, todavía sin horas | `gpt-5` |\n| 🧑 | **El Operador** | *Eres tú.* Revisa y aprueba el desglose | — |\n| 🎛 | **Tank** | Calcula las horas de cada tarea, todas en paralelo | **ninguno** |\n| 🏍 | **Trinity** | Reintenta las tareas dudosas y consolida la estimación | `gpt-5` |\n| 🔮 | **El Oráculo** | Redacta el informe de fiabilidad. No toca ninguna cifra | `gpt-4o` |\n| 🧑 | **El Operador** | *Otra vez tú.* Completas las horas que faltan y validas | — |\n| 📐 | **El Arquitecto** | Redacta la propuesta comercial | `gpt-4o` |\n\n**Fíjate en Tank.** El paso que produce el número que el cliente acaba firmando es el único\nque **no usa ningún modelo de lenguaje**: es una búsqueda vectorial sobre el corpus de\npresupuestos históricos, con un consenso ponderado por lo parecidas que sean las tareas. Si\npara una tarea no encuentra nada suficientemente parecido, no devuelve horas — la marca.\n\n---\n\n## Arquitectura en dos minutos\n\nCinco contenedores:\n\n```\n        tú :3000\n           │\n           ▼\n   business-backend ───────▶ ai-service ───────▶ vector-db   (pgvector)\n       (Rails)          red    (FastAPI)    red      │\n           │          interna              interna   └────────▶ redis\n           ▼\n        postgres\n```\n\n**`business-backend` es el único servicio que publica un puerto.** El servicio de IA y las\ndos bases de datos no son accesibles desde tu máquina: solo existen dentro de la red interna\nde Docker. Esa es la propiedad de seguridad del montaje, no un detalle de configuración.\n\nHay **dos Postgres a propósito** y no se leen entre sí: `vector-db` guarda los embeddings del\nservicio de IA (pgvector es una extensión de Postgres, así que el almacén vectorial y su\nrelacional son el mismo motor); `postgres` es la base de datos de Rails.\n\n**Rails nunca habla con OpenAI.** Todas las llamadas a modelos salen del servicio de IA.\n\n---\n\n## Qué más hay\n\n| Ruta | Qué es |\n|---|---|\n| `\u002Fdemo` | Atajo a la pantalla de arranque del flujo |\n| `\u002Frag\u002Fgraph_estimation_runs` | El flujo de agentes y su histórico de ejecuciones |\n| `\u002Fagents\u002Fprofiles` | Los agentes, con su modelo y su papel. Perfiles personalizables |\n| `\u002Fagents\u002Fgraph_flow` | Diagrama del flujo, de solo lectura |\n| `\u002Frag\u002Festimation_runs` | Un asistente equivalente pero paso a paso, con cada etapa relanzable |\n| `\u002Frag\u002Findex_runs` | Añadir documentos al corpus vectorial |\n| `\u002Frag\u002Fchunking_comparisons` | Laboratorio para comparar estrategias de troceado ⚠️ gasta dinero real |\n| `\u002Festimations`, `\u002Fchat_sessions` | Estimación transaccional y estimación conversacional |\n| `\u002Fai_settings` | Cambiar los modelos en caliente, sin reiniciar |\n\n> En las pantallas del flujo de agentes la barra de navegación se reduce a **«Grafo»** y\n> **«Agentes»**. Es intencionado, para no tener el resto de la aplicación a un clic mientras\n> se proyecta.\n\n---\n\n## Para seguir leyendo\n\n| Documento | Qué cuenta |\n|---|---|\n| [`docs\u002Fdeployment-local.md`](docs\u002Fdeployment-local.md) | Despliegue en detalle, las dos capas de autenticación, modo desarrollo y problemas conocidos |\n| [`ai-service\u002FARCHITECTURE.md`](ai-service\u002FARCHITECTURE.md) | Las capas del servicio de IA y sus reglas de dependencia |\n| [`business-backend\u002FARCHITECTURE.md`](business-backend\u002FARCHITECTURE.md) | Cómo el cliente Rails refleja los contratos del servicio |\n| [`.env.example`](.env.example) | Todas las variables de entorno, comentadas |\n\n### Comandos útiles\n\n```bash\ndocker compose ps                                    # estado y salud de los 5 servicios\ndocker compose logs -f ai-service                    # ver trabajar a los agentes\ndocker compose exec business-backend bin\u002Frails console\ndocker compose exec vector-db psql -U estimator -d estimator\ndocker compose down                                  # parar, conservando los datos\ndocker compose down -v                               # parar y BORRAR los volúmenes\n```\n\nPara desarrollo, un override publica los puertos internos y activa la recarga en caliente:\n\n```bash\ndocker compose -f docker-compose.yml -f docker-compose.dev.yml up\n```\n\nCopyright (c) 2025 LIDR.co Licensed under the MIT License\n\nEnglish:\nThe content of this repository is part of the AI Engineering program by LIDR.co. If you want to learn to code AI products like a pro and get more templates and resources like these, you can find all the information on the official website: https:\u002F\u002Flidr.co\u002Fia-devs\n\nEspañol:\nEl contenido de este repositorio es parte del programa AI Engineering de LIDR.co. Si quieres aprender a programar productos con IA como un pro, y obtener más plantillas y recursos como estos, puedes encontrar toda la información en la página oficial: https:\u002F\u002Flidr.co\u002Fia-devs\n",2,"2026-11-03 04:32:15","CREATED_QUERY"]