Sign inSign up

ingleo44/comercialai-logistics

By ingleo44

•Updated 7 days ago

Image
0

5.7K

ingleo44/comercialai-logistics repository overview

⁠🚀 ComercialAI SaaS Backend - Multi-Provider AI System

Sistema backend avanzado para gestión inteligente de inventario con soporte para múltiples proveedores de AI: Qwen, OpenAI y DeepSeek. Análisis inteligente, recomendaciones automáticas y optimización de costos.

⁠🌟 Características Principales

⁠🤖 Multi-Provider AI Architecture
  • Qwen AI (Alibaba Cloud) - Balance perfecto de costo-calidad
  • OpenAI (GPT-4o) - Máxima precisión para análisis críticos
  • DeepSeek - Ultra económico para desarrollo y testing
  • Anthropic Claude - Requerido para el Asistente de Compras (tool calling)
  • Switching automático entre proveedores según configuración
⁠🛒 Asistente de Compras con IA
  • Chat en lenguaje natural para el área de compras, dentro de la web
  • Consulta datos reales del tenant (inventario, OCs, despachos, ventas) mediante tool calling
  • Cifras exactas: el modelo obtiene los números con herramientas, no los estima
  • Auditoría de cada consulta con herramientas usadas y tokens consumidos
⁠📊 Análisis Inteligente de Inventario
  • Análisis de demanda basado en históricos de venta
  • Predicción de stock-out con alertas tempranas
  • Recomendaciones automáticas de órdenes de compra
  • Gestión avanzada de lead times (90 días fabricante)
  • Análisis por categorías y segmentación de productos
⁠⚡ Rendimiento Optimizado
  • Procesamiento concurrente con límites configurables
  • Circuit breaker para prevenir timeouts
  • Caché incremental para resultados en tiempo real
  • Análisis paginado para datasets grandes
  • Optimización automática de batch sizes
⁠🔄 Integración Flexible
  • Multi-formato: CSV, Excel (.xlsx, .xls)
  • Mapeo automático de estructuras complejas
  • API REST completa con documentación
  • Exportación avanzada en múltiples formatos
  • Sistema de sesiones para análisis largos

⁠🚀 Instalación y Configuración

⁠1. Clonar y Setup Inicial
git clone <repository-url>
cd comercialai-saas
npm install
⁠2. Configuración Multi-Provider
# Copiar archivo de configuración
cp .env.example .env

# Editar .env con tus API keys
nano .env
⁠3. Configuración de Proveedores

En tu archivo .env, configura los proveedores que desees usar:

# ========================================
# SELECCIÓN DE PROVEEDOR (Escoge UNO)
# ========================================
AI_PROVIDER=QWEN                    # QWEN | OPENAI | DEEPSEEK

# ========================================
# QWEN AI (Alibaba Cloud) - Recomendado para Producción
# ========================================
DASHSCOPE_API_KEY=sk-your-qwen-key
MODEL_NAME=qwen-flash               # qwen-flash | qwen-plus | qwen-max

# ========================================  
# OPENAI - Máxima Calidad
# ========================================
OPENAI_API_KEY=sk-your-openai-key
OPENAI_MODEL=gpt-4o-mini            # gpt-4o-mini | gpt-4 | gpt-4-turbo

# ========================================
# DEEPSEEK - Ultra Económico
# ========================================
DEEPSEEK_API_KEY=sk-your-deepseek-key
DEEPSEEK_MODEL=deepseek-chat        # deepseek-chat | deepseek-coder

# ========================================
# ANTHROPIC CLAUDE - Asistente de Compras
# ========================================
# Requerido para /api/v2/ai/purchase-assistant/chat, sin importar AI_PROVIDER
ANTHROPIC_API_KEY=sk-ant-your-key
ANTHROPIC_MODEL=claude-sonnet-5     # Usar un modelo vigente; los retirados responden 404
⁠4. Verificar Configuración
# Probar todos los proveedores configurados
npm run test:ai

# Probar un proveedor específico
npm run test:ai:openai
npm run test:ai:qwen  
npm run test:ai:deepseek

# Iniciar servidor
npm start

⁠💰 Comparación de Proveedores

ProveedorCosto por AnálisisVelocidadCalidadCaso de Uso Ideal
🔥 DeepSeek$0.01-0.05Muy RápidaExcelenteDesarrollo, Testing, Alto Volumen
🧠 Qwen AI$0.05-0.15RápidaAlta ConsistenciaProducción, Uso Regular
🤖 OpenAI$0.50-2.00ModeradaMáxima PrecisiónAnálisis Críticos, Decisiones Importantes

⁠🔧 Scripts Disponibles

⁠Desarrollo y Testing
npm start              # Iniciar servidor
npm run dev           # Modo desarrollo con recarga automática
npm run test:ai       # Probar todos los proveedores AI

# Tests del Asistente de Compras (sin BD ni red: cliente de Claude simulado)
node --test test/purchase-assistant-chat.test.js
⁠Testing por Proveedor
npm run test:ai:openai    # Probar solo OpenAI
npm run test:ai:qwen      # Probar solo Qwen
npm run test:ai:deepseek  # Probar solo DeepSeek
⁠Cambio de Proveedor
# Usar el script de switching automático
./scripts/switch-ai-provider.sh OPENAI   # Cambiar a OpenAI
./scripts/switch-ai-provider.sh QWEN     # Cambiar a Qwen  
./scripts/switch-ai-provider.sh DEEPSEEK # Cambiar a DeepSeek
⁠Validación de API
npm run ai:validate         # Validar proveedor actual
npm run ai:validate:all     # Probar todos los proveedores

⁠🔌 API Endpoints

⁠Análisis de Inventario
# Análisis paginado (recomendado para datasets grandes)
POST /api/inventory/analyze-paginated
GET  /api/inventory/results/:sessionId
GET  /api/inventory/status/:sessionId
DELETE /api/inventory/stop/:sessionId    # 🛑 NUEVO: Detener análisis en progreso

# Exportación de resultados
POST /api/inventory/export
GET  /api/inventory/exports
GET  /api/inventory/export/:filename
⁠Sistema y Monitoreo
GET /api/inventory/status           # Estado del sistema
GET /api/inventory/ai/validate      # Validar proveedor actual
GET /api/inventory/ai/validate?testAll=true  # Probar todos
⁠Asistente de Compras
POST /api/v2/ai/purchase-assistant/chat      # Chat con tool calling (roles: owner, admin, manager, analyst)
GET  /api/v2/ai/purchase-assistant/history   # Historial de consultas del usuario
POST /api/ai/purchase-assistant/analyze      # ⚠️ Deprecado: usar /chat
⁠Ejemplo de Uso de API
// Análisis de inventario con archivo CSV
const formData = new FormData();
formData.append('inventory', csvFile);

const response = await fetch('/api/inventory/analyze-paginated', {
  method: 'POST',
  body: formData
});

const { sessionId } = await response.json();

// Polling para obtener resultados
const pollResults = async () => {
  const results = await fetch(`/api/inventory/results/${sessionId}`);
  const data = await results.json();
  
  if (data.processing.completed) {
    console.log('Análisis completado:', data.results);
  } else {
    setTimeout(pollResults, 2000); // Continuar polling
  }
};

pollResults();

// 🛑 Detener análisis si es necesario
const stopAnalysis = async () => {
  const response = await fetch(`/api/inventory/stop/${sessionId}`, {
    method: 'DELETE'
  });
  
  const result = await response.json();
  console.log('Análisis detenido:', result.data.final_stats);
  
  if (result.data.results_available) {
    // Obtener resultados parciales
    const partialResults = await fetch(`/api/inventory/results/${sessionId}`);
    console.log('Resultados parciales:', await partialResults.json());
  }
};

⁠🛒 Asistente de Compras (Tool Calling)

El asistente responde preguntas del área de compras consultando los datos del tenant bajo demanda. En lugar de recibir datos precargados en el prompt, Claude decide qué herramientas llamar; el backend las ejecuta contra la BD del tenant y le devuelve los resultados hasta que el modelo tiene la respuesta (máximo 8 iteraciones por pregunta).

⁠Flujo
Web (historial del chat) → POST /api/v2/ai/purchase-assistant/chat
  → PurchaseAssistantService.chat()
      ↔ Claude (messages.create con tools)
      ↔ executeTool() → servicios de dominio / inventory_data (tenantDB)
  → { analysis, toolsUsed, metadata.usage }  +  registro en audit_log (control DB)
⁠Herramientas disponibles (solo lectura)
ÁreaHerramientas
Inventariobuscar_producto, detalle_sku, stock_bajo, top_ventas
Órdenes de comprabuscar_ordenes_compra, ordenes_compra_por_sku, detalle_orden_compra, proveedores, estados_orden, resumen_ordenes_compra
Despachosdespachos_por_orden, despachos_por_sku
Ventasventas_sku_por_mes

Métricas derivadas en inventario:

  • venta_promedio_mensual = promedio de ventas_mes_1..6
  • dias_cobertura = inventario_en_sitio / (venta_promedio_mensual / 30)
⁠Agregar una herramienta
  1. Crear o editar un archivo en src/domains/ai/tools/ con un objeto { name, description, input_schema, handler(input, { tenantDB, user }) }.
  2. Registrarlo en purchaseTools (src/domains/ai/tools/index.js).
  3. Reutilizar servicios de dominio existentes, limitar filas con capList/clampLimit y devolver JSON compacto.
  4. Agregar la etiqueta legible en TOOL_LABELS del componente PurchaseAssistantChat.tsx (frontend).

El formato de las herramientas es compatible con MCP, por lo que el mismo registro puede exponerse más adelante como servidor MCP sin reescribir los handlers.

⁠Consideraciones
  • Memoria: el asistente solo recuerda la conversación actual (últimos 20 mensajes que envía la web); no persiste aclaraciones entre sesiones.
  • Tokens: cada iteración reenvía system prompt, definiciones de herramientas e historial. El consumo real se registra por consulta en metadata.usage y en audit_log.
  • Respuesta en texto plano: la web no renderiza markdown; el prompt pide viñetas en lugar de tablas.

⁠🐳 Despliegue con Docker

⁠Build y Run
# Construir imagen
docker build -t comercialai-saas .

# Ejecutar con docker-compose
docker-compose up -d

# Verificar estado
docker-compose logs -f
⁠Variables de Entorno para Docker
# En docker-compose.yml o al ejecutar
docker run -e AI_PROVIDER=QWEN \
           -e DASHSCOPE_API_KEY=sk-your-key \
           -e OPENAI_API_KEY=sk-your-openai-key \
           -e DEEPSEEK_API_KEY=sk-your-deepseek-key \
           -e ANTHROPIC_API_KEY=sk-ant-your-key \
           -e ANTHROPIC_MODEL=claude-sonnet-5 \
           -p 3000:3000 comercialai-saas

⁠📁 Estructura del Proyecto

comercialai-saas/
├── src/
│   ├── algorithms/
│   │   ├── InventoryCalculationEngine.js      # Motor V1 (Pipeline + Días Objetivo)
│   │   └── InventoryCalculationEngineV2.js    # Motor V2 (Min-Max + Safety Stock) 🆕
│   ├── domains/
│   │   └── ai/
│   │       ├── services/                      # PurchaseAssistantService (loop de tool calling) y controller
│   │       ├── tools/                         # Herramientas del Asistente de Compras
│   │       └── providers/AIProviderFactory.js # Clientes de IA por proveedor
│   ├── controllers/
│   │   └── InventoryController.js             # Controlador principal
│   ├── services/
│   │   ├── UnifiedInventoryAnalysisService.js # Servicio unificado (sin IA)
│   │   ├── ExcelProcessorService.js           # Procesamiento Excel
│   │   └── ExportService.js                   # Exportación de datos
│   ├── routes/
│   │   └── inventory.js                       # Rutas API
│   ├── utils/
│   │   └── middleware.js                      # Middleware personalizado
│   └── index.js                               # Servidor principal
├── scripts/
│   ├── test-ai-providers.js                   # Testing de proveedores
│   └── switch-ai-provider.sh                  # Cambio de proveedor
├── test/
│   └── purchase-assistant-chat.test.js        # Tests del Asistente de Compras (node:test)
├── .env.example                               # Plantilla de configuración
├── docker-compose.yml                         # Configuración Docker
├── Dockerfile                                 # Imagen Docker
├── CLEANUP_SUMMARY.md                         # Resumen de limpieza de código
├── DEPLOYMENT.md                              # Guía de despliegue
├── INVENTORY_MODELS_COMPARISON.md             # Comparación V1 vs V2 🆕
└── README.md                                  # Esta documentación

⁠📊 Modelos de Cálculo de Inventario

⁠🔄 Selección de Modelo

El sistema soporta dos modelos de cálculo de inventario que coexisten sin conflictos:

ModeloDescripciónEstadoUso Recomendado
V1Pipeline + Días Objetivo✅ Producción (Default)Simple, probado, rápido
V2Min-Max + Safety Stock🆕 Nuevo (Estadístico)Preciso, incluye compras en fabricación
⁠🎯 Diferencias Clave
⁠Modelo V1 (Actual):
  • ✅ Basado en días objetivo de cobertura
  • ✅ Simple y rápido
  • ❌ NO incluye inventario_en_compras (fabricación)
  • ❌ Stock de seguridad fijo (%)
  • ❌ Sin Reorder Point (ROP) explícito
⁠Modelo V2 (Nuevo):
  • ✅ Basado en teoría estadística (distribución normal)
  • ✅ Incluye inventario_en_compras en pipeline
  • ✅ Safety Stock = Z × σ × √(Lead Time) - ajustado a variabilidad
  • ✅ Reorder Point (ROP) explícito
  • ✅ Inventario Máximo calculado
  • ✅ Proyección de agotamiento
  • ✅ Nivel de servicio por Pareto (A=99%, B=95%, C=90%)
⁠🔧 Configuración

Para cambiar entre modelos, edita tu archivo .env:

# Usar modelo V1 (Default - Pipeline + Días Objetivo)
USE_INVENTORY_MODEL_V2=false

# Usar modelo V2 (Nuevo - Min-Max + Safety Stock)
USE_INVENTORY_MODEL_V2=true
⁠📖 Documentación Detallada

Lee INVENTORY_MODELS_COMPARISON.md para:

  • Comparación técnica detallada
  • Ejemplos numéricos lado a lado
  • Guías de migración (completa, A/B testing, comparación)
  • Referencias teóricas
  • Métricas de evaluación

⁠🛠️ Configuración Avanzada

⁠Performance Tuning
# En .env - Ajustes de rendimiento
MAX_AI_CONCURRENCY=2              # Llamadas concurrentes (reducir si hay timeouts)
OPTIMIZED_THRESHOLD=100           # Usar modo optimizado para datasets >100 items
AI_TIMEOUT_BASE_MS=180000         # Timeout base: 3 minutos
AI_TIMEOUT_PER_ITEM_MS=8000       # Timeout adicional por item: 8 segundos
CIRCUIT_BREAKER_MAX_FAILURES=3    # Max fallos antes de backoff
⁠Business Logic Settings
# Configuraciones de negocio
LEAD_TIME_DAYS=90                 # Lead time de fabricantes
TARGET_COVERAGE_DAYS=40           # Cobertura objetivo de stock
MIN_STOCK_ALERT_DAYS=30           # Umbral de alerta de stock mínimo

⁠🚨 Troubleshooting

⁠Problemas Comunes

🔥 Timeouts en API de AI

# Reducir concurrencia en .env
MAX_AI_CONCURRENCY=1
AI_TIMEOUT_BASE_MS=300000

🔑 Error de API Keys

# Verificar configuración
npm run test:ai

# Validar un proveedor específico
npm run test:ai:qwen

💾 Memoria insuficiente para datasets grandes

# Usar procesamiento paginado
POST /api/inventory/analyze-paginated
# En lugar de /api/inventory/analyze
⁠Logs y Monitoreo
# Logs en tiempo real
docker-compose logs -f

# Estado del sistema
curl http://localhost:3000/api/inventory/status

# Validar todos los proveedores
curl "http://localhost:3000/api/inventory/ai/validate?testAll=true"

⁠🔒 Seguridad

  • ✅ Helmet.js para headers de seguridad
  • ✅ CORS configurado para dominios autorizados
  • ✅ Validación de archivos con filtros de tipo
  • ✅ Límites de tamaño de archivo (10MB)
  • ✅ Rate limiting en API calls
  • ✅ Variables de entorno para secrets

⁠📄 Variables de Entorno Completas

Consulta .env.example para ver todas las variables disponibles con documentación detallada.

⁠🤝 Contribución

  1. Fork el proyecto
  2. Crea tu feature branch (git checkout -b feature/AmazingFeature)
  3. Commit tus cambios (git commit -m 'Add some AmazingFeature')
  4. Push al branch (git push origin feature/AmazingFeature)
  5. Abre un Pull Request

⁠📞 Soporte

Para soporte técnico o consultas:

⁠📜 Licencia

MIT License - Ver LICENSE para más detalles.


🎯 Sistema listo para producción con arquitectura multi-proveedor AI escalable y optimizada para costos.

Tag summary

Content type

Image

Digest

sha256:e20717029…

Size

74.6 MB

Last updated

7 days ago

docker pull ingleo44/comercialai-logistics