Servicio: open-ai
Información General
- Propósito: Microservicio de integración con OpenAI. Gestiona threads de conversación, asistentes IA, vector stores y el asistente especializado de WhatsApp de BimTrazER.
- Tecnología: Node.js / Express 4 (ESM modules)
- Puerto:
8093(configurable víaSERVICE_PORT) - Módulo:
open-ai
Propósito de Negocio
Proporciona una capa de abstracción sobre la API de OpenAI Assistants para:
- Mantener conversaciones persistentes con contexto de proyecto (threads)
- Ejecutar el asistente IA entrenado con datos de BimTrazER
- Gestionar vector stores con documentación de proyectos
- Procesar mensajes de WhatsApp con IA (asistente de WhatsApp)
- Ejecutar runs del asistente y retornar respuestas al cliente
Estructura del Proyecto
open-ai/src/
├── index.js ← Entry point (crea servidor HTTP)
├── app.js ← Express app con CORS y rutas
├── config/
│ ├── variables.js ← SERVICE_PORT
│ ├── openAi.js ← Inicialización del cliente OpenAI
│ ├── cors.js ← Configuración de CORS
│ ├── origins.js ← Lista de orígenes permitidos
│ └── whatsappAssistant.js ← Prompt/instrucciones del asistente WhatsApp (~22KB)
└── handlers/
├── addMessageToThread.js ← PUT: agregar mensaje a thread
├── createAssistant.js ← POST: crear asistente
├── createRun.js ← POST: iniciar run
├── createRunAndPoll.js ← POST: iniciar run y esperar resultado
├── createThread.js ← POST: crear thread
├── createVectorStore.js ← POST: crear vector store
├── createWhatsappAssistant.js ← POST: crear asistente WhatsApp
└── getAssistantResponse.js ← GET: obtener respuesta del asistente
Endpoints Expuestos
| Método | Path | Descripción |
|---|---|---|
POST |
/threads |
Crear nuevo thread de conversación |
POST |
/runs |
Iniciar run del asistente en un thread |
POST |
/create-assistant |
Crear asistente de OpenAI |
POST |
/create-run-and-poll |
Iniciar run y esperar respuesta completa |
POST |
/create-vector-store |
Crear vector store para documentos |
POST |
/create-whatsapp-assistant |
Crear asistente especializado de WhatsApp |
PUT |
/add-message-to-thread |
Agregar mensaje a thread existente |
GET |
/assistant-response/:threadId |
Obtener respuesta del asistente en un thread |
Asistente de WhatsApp
El archivo config/whatsappAssistant.js (~22KB) contiene las instrucciones del sistema del asistente de WhatsApp de BimTrazER. Incluye:
- Rol y personalidad del asistente
- Instrucciones sobre cómo interpretar mensajes de WhatsApp
- Lista de funciones disponibles (tool use / function calling)
- Reglas para certificar bloques, consultar avance, etc.
- Flujos conversacionales para el personal de obra
Este prompt le dice al asistente cómo usar los endpoints /for-assistants/* del servicio whatsapp-bot como herramientas (tools de OpenAI).
Flujo de Conversación con OpenAI Assistants
[Frontend / whatsapp-bot]
│
├── POST /threads → Crea thread (retorna threadId)
│
├── PUT /add-message-to-thread → Agrega mensaje del usuario
│
├── POST /runs → Inicia ejecución del asistente
│ └── OpenAI procesa el mensaje
│ ├── Si necesita datos → llama a function (tool use)
│ │ └── [api-bimtrazer o whatsapp-bot] ejecuta la función
│ └── Genera respuesta
│
└── GET /assistant-response/:threadId → Obtiene respuesta generada
Alternativa (blocking): POST /create-run-and-poll — Ejecuta y espera hasta que el run complete.
Variables de Entorno
| Variable | Descripción |
|---|---|
SERVICE_PORT |
Puerto del servicio (default: 8093) |
OPENAI_API_KEY |
Clave de API de OpenAI (sensible) |
OPENAI_ASSISTANT_ID |
ID del asistente preconfigurado en OpenAI |
Dependencias (package.json)
| Librería | Propósito |
|---|---|
openai v4.62.1 |
SDK oficial de OpenAI |
express v4 |
Framework HTTP |
cors |
CORS middleware |
dotenv |
Variables de entorno |
multer |
Upload de archivos (posible para vector stores) |
Rol en el Sistema
[api-bimtrazer] [whatsapp-bot]
│ │
└─────────┬───────────────┘
│ HTTP requests
▼
[open-ai :8093]
│
▼ HTTPS
[OpenAI API]
│
├── Threads API → Conversaciones persistentes
├── Runs API → Ejecución del asistente
├── Assistants API → Gestión de asistentes
└── Vector Stores → Base de conocimiento
Alertas Técnicas
OPENAI_API_KEYdebe estar en variables de entorno — nunca hardcodeada- Sin autenticación en los endpoints — cualquier servicio que conozca el puerto puede usarlos
- El asistente usa function calling (tool use) de OpenAI — las funciones apuntan a endpoints del ecosistema BimTrazER. Si cambia un endpoint, el prompt debe actualizarse manualmente
- Sin manejo de rate limiting de OpenAI — bajo carga alta puede llegar a los límites de la API
multercomo dependencia pero no está claro si se usa actualmenteeslintcomo dependencia de producción (debería ser devDependency)