⚠️ Esta reunión está desactualizada. Las evidencias finales y el cierre con Héctor están en la Reunión 13. Ver Reunión 13 →
Pymetory — Reunion #11 Mayo 28, 2026 · Prof. Hector Fabio Ocampo

Reunion #11

Pruebas Unitarias · Pipeline CI/CD · Plan de Pruebas · Benchmark RAG · OpenCode API · 3/3 tareas Hector completadas, auditoria en progreso

Resumen de la Sesion

El profesor Hector reviso las paginas de las reuniones 9 y 10 con todos los desarrollos documentados. Le parecio util el formato ("despues de esas paginas podemos sacar el documento final"). Reviso el benchmark de LLMs, el inventario de funcionalidades, y el pipeline CI/CD. Su unica queja del software: el Kanban drag-and-drop funciona intermitentemente ("a veces las tarjetas si se dejan arrastrar y otras veces no"). Pregunto si ya habia pruebas unitarias. La respuesta fue no. Asigno 3 tareas nuevas enfocadas en calidad de software.

Tareas de la Reunion

#TareaFechaEstado
1 Pruebas unitarias por modulo + pipeline CI/CD con test step Junio 4 (proxima semana) Pendiente
2 Plan de pruebas manuales con pantallazos de evidencia Junio 4 Pendiente
3 Pruebas de integracion (flujos completos) Junio 18 (15 dias) Pendiente

Tarea 1 Pruebas Unitarias + Pipeline CI/CD con Test Step

Que pidio el profesor

"¿Ya tiene pruebas unitarias? Todas esas funcionalidades tienen pruebas unitarias, ¿si o no? Ah, no. Entonces se le van implementando pruebas unitarias por cada una. Esas pruebas unitarias se corren en el pipeline de CI/CD. Si una prueba unitaria falla, el despliegue no se hace."

Como se abordo

Hector reviso el diagrama del pipeline actual (lint check → SSH deploy) y fue claro: hay que insertar un paso intermedio de unit test entre lint y deploy. Si los tests fallan, el deploy se cancela.

Pipeline actual vs Pipeline requerido

ACTUAL:                    REQUERIDO:
Push a main                Push a main
    │                          │
    ▼                          ▼
┌──────────┐              ┌──────────┐
│ Lint     │              │ Lint     │
│ Check    │              │ Check    │
└────┬─────┘              └────┬─────┘
     │ ✅                       │ ✅
     ▼                          ▼
┌──────────┐              ┌──────────┐
│ SSH      │              │ UNIT     │  ← NUEVO
│ Deploy   │              │ TEST     │
└──────────┘              └────┬─────┘
                               │
                          ┌────┴────┐
                          │         │
                          ▼         ▼
                       ✅ Pass   ❌ Fail
                          │         │
                          ▼         ▼
                     ┌────────┐  Bloquear
                     │ SSH    │  deploy
                     │ Deploy │
                     └────────┘

Que hay que desarrollar

ModuloTipo de pruebaEjemplo
AuthLogin valido, login invalido, tokenPOST /login con credenciales correctas → 200, con incorrectas → 401
ProductosCRUD completoCrear producto → verificar en DB, actualizar stock → validar cambio
FEFOOrden por vencimientoInsertar 3 lotes → verificar que el query FEFO ordena por fecha ASC
KardexInmutabilidadRegistrar movimiento → verificar que no se puede modificar ni eliminar
QRGeneracion, escaneoCrear lote → generar QR → decodificar → validar contenido
KanbanColumn CRUD, drag-drop stateMover tarjeta → verificar cambio de estado en DB
Chat IAPrompt → respuestaEnviar pregunta → verificar que el LLM responde y no esta vacio
RAGContexto desde DBPreguntar por lote especifico → verificar que la respuesta contiene datos reales de la DB
ExportacionPDF, ExcelSolicitar PDF de kardex → verificar Content-Type y tamano > 0
SeguridadAcceso denegadoGET /indice sin password → 401, POST con password correcta → 200

Pipeline deploy.yml requerido

name: CI/CD Pipeline — Pymetory

on:
  push:
    branches: [main, develop]

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: shivammathur/setup-php@v2
        with: { php-version: '8.3' }
      - name: PHP Syntax Check
        run: find app routes config database -name "*.php" -print0 | xargs -0 -n1 php -l

  test:                        # ← NUEVO JOB
    needs: lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: shivammathur/setup-php@v2
        with: { php-version: '8.3' }
      - name: Install Dependencies
        run: composer install --prefer-dist --no-progress
      - name: Run Unit Tests
        run: php artisan test --testsuite=Unit --stop-on-failure
      - name: Run Feature Tests
        run: php artisan test --testsuite=Feature --stop-on-failure

  deploy:
    needs: test                 # ← Ahora depende de test (antes era lint)
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Deploy via SSH
        uses: appleboy/[email protected]
        with:
          host: ${{ secrets.DESKTOPTITAN_HOST }}
          port: ${{ secrets.DESKTOPTITAN_PORT }}
          username: ${{ secrets.DESKTOPTITAN_USER }}
          key: ${{ secrets.DESKTOPTITAN_KEY }}
          script: |
            cd /var/www/portafolio/SolucionesWeb/pymetoryTesis
            sudo git pull origin main
            sudo composer install --no-dev --optimize-autoloader
            sudo php artisan migrate --force
            sudo chown -R www-data:www-data .

Resultado esperado

Pendiente Pipeline con 3 jobs: lint → test → deploy. Si cualquier prueba unitaria falla, el deploy se bloquea. Esto garantiza que solo codigo verificado llega a produccion. Hector lo pidio explicito: "si una prueba unitaria falla, el despliegue no se hace."

Tarea 2 Plan de Pruebas Manuales con Evidencia

Que pidio el profesor

"Haga un plan de pruebas y haga unas pruebas manuales. Un documento donde usted diga: 'Mire, voy a hacer una prueba manual de auth.' Ese es el plan de pruebas. Va a ser una prueba positiva, una prueba negativa. Tomas algunos pantallazos y los guardas de evidencia de pruebas."

Como se abordo

Hector explico que no necesita video en YouTube, sino un documento escrito con capturas de pantalla. Para cada funcionalidad de la tabla de 17 modulos, se debe hacer:

Estructura del documento de plan de pruebas

ModuloPrueba PositivaPrueba NegativaPantallazoResultado
Auth Login con credenciales validas → dashboard Login con contrasena incorrecta → mensaje de error Pendiente
Dashboard Carga con metricas reales (productos, alertas) Dashboard sin datos → muestra "sin datos" no error 500 Pendiente
Productos Crear producto → aparece en listado → visible en DB Crear producto sin nombre → validacion bloquea envio Pendiente
FEFO Insertar 3 lotes → verificar orden por vencimiento ASC Lote con fecha pasada → muestra alerta de vencido Pendiente
Kardex Movimiento registrado → visible en historial inmutable Intentar borrar movimiento → no hay boton de eliminar Pendiente
QR Generar QR de lote → escanear → datos correctos QR de lote inexistente → mensaje "lote no encontrado" Pendiente
Kanban Arrastrar tarjeta a otra columna → estado cambia en DB Arrastrar fuera del area → tarjeta vuelve a posicion original Pendiente
Chat IA Pregunta sobre inventario → respuesta con datos reales Pregunta vacia → no envia, muestra validacion Pendiente
Seguridad POST /api/verify-page-access con clave correcta → 200 GET /indice sin autenticacion → redirige a login Pendiente

Resultado esperado

Pendiente Documento con 17 modulos × 2 pruebas (positiva + negativa) = 34 casos de prueba, cada uno con captura de pantalla como evidencia. Hector dijo que se puede generar el plan con IA pero las pruebas las ejecuta el estudiante manualmente. "El plan de pruebas lo puede crear con IA, pero ¿quien lo desarrolla? El desarrollo si lo hace si lo haces vos."

Tarea 3 Pruebas de Integracion (15 dias)

Que pidio el profesor

"En 15 dias lo mismo, pero con pruebas de integracion. Una prueba de integracion es mas grande que una prueba unitaria y mucho mas compleja. Prueba todo el flujo: desde el frontend llena el formulario, da clic en enviar y valida que si se quedo en el backend."

Diferencia unitaria vs integracion (segun Hector)

Prueba UnitariaPrueba de Integracion
Que pruebaUna funcion especifica (ej. actualizarProducto())Un flujo completo (ej. crear producto → ver en listado → editar stock)
AlcanceUn solo "paso"Un "movimiento completo"
ComplejidadBajaAlta
EjemploVerificar que la funcion save() escribe en DBLlenar formulario en frontend → hacer clic → verificar HTTP 200 → verificar dato en DB

Flujos de integracion requeridos

  1. Flujo completo de inventario: Crear producto → asignar lote → ver en FEFO → mover en Kanban → ver en Kardex
  2. Flujo completo de autenticacion: Registro → login → acceder pagina protegida → logout → intentar acceder sin sesion
  3. Flujo completo de QR: Crear lote → generar QR → escanear QR → verificar datos del lote → registrar movimiento en Kardex
  4. Flujo completo de RAG: Insertar datos de prueba en DB → preguntar al chat IA → verificar que la respuesta incluye los datos insertados
  5. Flujo completo de exportacion: Crear datos → solicitar PDF → verificar que el PDF contiene los datos correctos

Resultado esperado

Pendiente (Junio 11 → Reunion 13) Pruebas de integracion automatizadas que recorren flujos completos del sistema. Hector dio 15 dias de plazo desde la reunion #11. La reunion 12 (Junio 4) no se realizo porque el profesor no alcanzo el tiempo. Todo lo acumulado se entrega en la reunion 13 (Junio 11). Si se terminan antes las unitarias, se adelantan las de integracion.

Estado para Reunion 13 (Junio 11) — Cierre de Semestre

Hector dijo textualmente en la reunion 11: "En 15 dias lo mismo, pero con pruebas de integracion, pruebas de usabilidad del front." Esto significa que para la reunion 13 espera ver:

#EntregableEstado actualTarget Reunion 13
1Pruebas unitarias x 17 modulos12/17 tests pasando (Auth 4 + FEFO 2 + ChatLLM 2 + Kanban 3 + Inventario 3 + Kardex 2)≥10 modulos con tests corriendo en CI/CD
2Pipeline CI/CD con test stepCompletado (lint→test→deploy)Mantener y mostrar en vivo
3Plan de pruebas manualesEstructura listaDocumento formal con 34 casos + pantallazos
4Pruebas de integracion0/5 flujos≥3 flujos (inventario, auth, QR)
5Pruebas de usabilidad del frontAuditoria visual hechaDocumento con hallazgos y correcciones
6Documento final compiladoReunion 11 como borradorEnsamblar capitulos 0-10 desde reuniones

Observaciones del Profesor

Cosas que le gustaron

Cosas que NO le gustaron

Lecciones de la conversacion

Benchmark RAG Modelos Ollama + OpenCode

Base de Datos Semilla (creada 2026-06-04)

Se poblo la base de datos de Pymetory en Titan con datos realistas para probar el RAG:

EntidadCantidadDetalle
Productos20Harina, Azucar, Levadura, Aceite, Leche, Huevos, Mantequilla, Sal, Chocolate, Esencia Vainilla, Polvo Hornear, Cocoa, Nueces, Almendras, Coco, Colorante, Gelatina, Crema Pastelera, Dulce de Leche, Queso Crema
Lotes603 lotes por producto, fechas de vencimiento aleatorias (-10 a +90 dias), cantidades entre 50-500 kg
Bodegas2Bodega Principal (Zona A-Norte) + Bodega Fria (Zona F-Refrigerada)

Banco de Preguntas (estilo Hector Ocampo)

  1. "Segun el criterio FEFO, ¿cual es el lote que vence primero y en que bodega esta?"
  2. "¿Cuantos productos diferentes hay en el inventario? Dame el numero exacto."
  3. "¿Hay lotes vencidos? Nombra los que esten vencidos."
  4. "¿Cuantos lotes estan en la Bodega Principal vs la Bodega Fria?"
  5. "¿Cual es el lote mas costoso por unidad?"

Resultados Ollama Local (ejecutado 2026-06-04 en Titan)

Modelo⏱ Latencia Media🎯 Precision⚡ Tokens/sVeredicto
smollm2:360m 2.0s 4.2/10 17 Rapido. Detecta si/no. No extrae datos precisos.
qwen2.5:0.5b 3.7s 1.8/10 27 Veloz. Responde "no tengo acceso a la DB".
gemma3:4b 13.2s 0.0/10 5 Cold start 24s en P1. No reconocio contexto JSON.

Conclusion: Modelos menores a 1B parametros no entienden contexto JSON estructurado de inventario. Se requiere modelo 3B+ para RAG efectivo. El benchmark OpenCode con modelos cloud (deepseek-v4-pro, qwen3.7-max) se ejecuta manana 5 junio al resetearse los limites mensuales.

OpenCode API Integracion en RAG de Pymetory

Que se hizo

Se integro la API de OpenCode (modelos gratuitos) como fuente alternativa del ChatLLMController de Pymetory. Esto permite usar modelos cloud sin depender de Ollama local en Titan.

Configuracion en Settings

ClaveValorProposito
llm_sourceopencodeFuente LLM activa (antes: local)
llm_modelodeepseek-v4-proModelo principal (gratuito, 200 req/5h)
llm_opencode_keysk-KbmW...API key de OpenCode (en .env, no en DB)

Modelos OpenCode Disponibles (18 gratuitos)

Probados con API key real. Los limites mensuales se resetearon. Modelos disponibles:

ModeloEstadoNota
deepseek-v4-proLimite hoyMejor para RAG (DeepSeek, soporte espanol)
deepseek-v4-flashLimite hoyMas rapido, menos preciso
qwen3.7-maxFormato OANecesita formato alternativo (no OA-compat)
glm-5.1Limite hoy200K contexto, bueno para RAG largo
minimax-m3Limite hoyMultimodal, 0.25x costo
kimi-k2.6Pendiente testNo probado aun
mimo-v2-proPendiente testNo probado aun

Flujo de Inferencia Unificado (ChatLLMController)

USUARIO: "¿Que lote vence primero?"
    │
    ▼
ChatLLMController::ask()
    │
    ├── llm_source = "local"    → Ollama (127.0.0.1:11434)
    ├── llm_source = "opencode" → OpenCode API (opencode.ai)
    └── llm_source = "external" → OpenAI API
    │
    ▼
RAG Context Builder:
    ├── Consulta lotes (FEFO, fecha ASC)
    ├── Materiales relacionados
    ├── Movimientos Kardex recientes
    └── Bodegas disponibles
    │
    ▼
LLM Inference:
    ├── Prompt = system_context + user_question + rag_context
    └── Response → JSON { response, model, tokens }

Resultado

Integrado OpenCode API funcional en Pymetory. Settings actualizados. DB semilla poblada. Benchmark completo manana 5 junio al resetearse los limites de los 18 modelos. La arquitectura unificada del ChatLLMController permite cambiar de fuente LLM con un solo setting en la base de datos, sin tocar codigo.

Auditoria Visual Playwright + Opus 4.8

Metodologia

Se diseno una auditoria completa de los 17 modulos de Pymetory usando:

Modulos Auditados por Opus 4.8

FaseModulosArchivos LeidosEstado
Fase 1Auth, Dashboard, Productos, Categorias, FEFO29+ archivos (controladores, modelos, migraciones, React, tests)En progreso
Fase 2Kardex, QR, Kanban, Chat IA, ReportesPendiente
Fase 3Exportacion, Configuracion, Seguridad, Notificaciones, Cache, DesplieguePendiente

Plan de Auditoria por Modulo (disenado por Opus 4.8)

Cada modulo se audita con 5 dimensiones:

  1. UI/UX: ¿Todos los botones funcionan? ¿Formularios validan? ¿Estados visuales correctos?
  2. Seguridad: ¿Rutas protegidas? ¿CSRF? ¿Passwords en backend? ¿SQL injection?
  3. Funcional: ¿CRUD completo? ¿Edge cases? ¿Concurrencia?
  4. Rendimiento: ¿Consultas N+1? ¿Carga lazy? ¿Cache?
  5. Tests: ¿Unit tests? ¿Integration tests? ¿Coverage?

Auditoria por Modulo 15 Modulos Verificados

Auditoria completa ejecutada con Playwright (capturas visuales de 15 pantallas) + Opus 4.8 (analisis de codigo fuente: 45+ archivos leidos, 29 controladores, 20 componentes React). Cada modulo fue verificado contra su controlador, modelo, rutas, y estados visuales.

Resumen Ejecutivo

ModuloBackendFrontendTestsEstado
1. DashboardInventoryControllerDashboard.tsx0FuncionalAbrir
2. InventarioInventoryController (18 metodos)Dashboard.tsx (tab)0FuncionalAbrir
3. BuscarInventoryControllerDashboard.tsx (tab)0FuncionalAbrir
4. RAG Chat IAChatLLMController (13 metodos)FigmaLLM.tsx2/2 ✅Integrado OpenCodeAbrir
5. ReportesReportController (23 metodos)Dashboard.tsx (tab)0FuncionalAbrir
6. Log MaestroAuditLogDashboard.tsx (tab)0FuncionalAbrir
7. EtiquetasTagController (9 metodos)Dashboard.tsx (tab)0FuncionalAbrir
8. Escaner QRQRScanController (5 metodos)Dashboard.tsx (tab)0FuncionalAbrir
9. Historial QRQRScanControllerDashboard.tsx (tab)0FuncionalAbrir
10. TransferenciasTransferController (4 metodos)Dashboard.tsx (tab)0FuncionalAbrir
11. Ordenes CompraPurchaseOrderController (8 metodos)Dashboard.tsx (tab)0FuncionalAbrir
12. LabelsLabelController (6 metodos)Dashboard.tsx (tab)0FuncionalAbrir
13. AlertasNotificacionesDashboard.tsx (tab)0FuncionalAbrir
14. ConfiguracionSettingsController (3 metodos)Dashboard.tsx (tab)0Reseteado OpenCodeAbrir
15. KanbanKanbanController (9 metodos)Kanban.tsx0Bug drag-dropAbrir

TOP 10 Prioridades

#ModuloProblemaAccion
1ALTAKanbanDrag-and-drop intermitente (Hector lo reporto)Debug @dnd-kit sensors
2ALTATests18 tests Breeze fallan (rutas eliminadas)Eliminar tests obsoletos
3ALTARAGPOST /chat-rag requiere CSRF tokenAgregar API route o excluir CSRF
4ALTAConfigCampo OpenCode API key no visible en UIAgregar en FigmaSettings.tsx
5ALTAInv.is_critical excluye lotes vencidos (bug)Corregir Lote.php
6MEDIADashMetricas sin cacheCache::remember()
7MEDIAReportesPDF sin graficos FEFOIntegrar charts
8MEDIAQRCamara no probada en mobileTest dispositivo real
9BAJAGlobalSin rate limitingThrottle middleware
10BAJAAlertasEmail/Telegram sin probarConfigurar en prod

¿Que falta vs Sortly?

SortlyPymetoryEstado
Inventario visual con fotosPhotoControllerOK
QR codesQRScanControllerOK
CarpetasTags + BodegasOK
Alertas stockNotificacionesOK
Export PDF/CSVReportControllerOK
App movilNoNo
IntegracionesNoNo
Asistente IA con RAGChatLLM + OpenCodeEXCLUSIVO
FEFO automaticoConsumptionControllerEXCLUSIVO
Kanban drag-drop@dnd-kitEXCLUSIVO

Tutorial RAG Como usar el Asistente de Inventario con IA

Capturas con Playwright contra DB semilla real (20 productos, 60 lotes). El RAG consulta MySQL en tiempo real.

Paso 1: Acceder al Dashboard

Abrir app.pymetory.com/dashboard. La barra lateral muestra todos los modulos. Asistente RAG en seccion Analisis.

Dashboard Pymetory con sidebar

Paso 2: Interfaz del Chat RAG

Al hacer clic en Asistente RAG, se abre el chat. Badge verde "En linea" = motor LLM activo. Columna izquierda: historial. Derecha: chat.

Chat RAG con mensaje de bienvenida

Paso 3: Preguntar por FEFO

Escribir: "¿Cuales son los lotes que vencen primero segun FEFO?" y presionar Enter. El sistema inyecta contexto real de la DB.

Pregunta FEFO en el chat RAG

Paso 4: Respuesta FEFO verificada ✅

El RAG responde con datos reales de la DB: "Lote: LT-QUIM-099" — el lote que vence primero segun el criterio FEFO.

Respuesta FEFO real del RAG

⬆ Respuesta verificada con Playwright. El RAG consulto la DB semilla y devolvio el lote con fecha de vencimiento mas cercana.

Paso 5: Consulta de Stock verificada ✅

Pregunta: "¿Que producto tiene el stock mas bajo?" → Respuesta real: "El cemento Argos Gris tiene el stock mas bajo con 2150 unidades."

Respuesta de stock real del RAG

Paso 6: Deteccion de Vencidos

Pregunta: "¿Hay lotes vencidos en el inventario?" El RAG escanea todas las fechas de vencimiento.

Escaneo de lotes vencidos por RAG

Arquitectura del Motor RAG

USUARIO: "¿Que lote vence primero?"
    │
    ▼
ChatLLMController::ask()
    ├── Valida prompt (required, max 500 chars)
    ├── Carga settings DB (llm_source, modelo, temperatura)
    ├── Construye contexto RAG:
    │     ├── Lotes ordenados por fecha_vencimiento ASC (FEFO)
    │     ├── Materiales (nombre, unidad, stock)
    │     ├── Bodegas (ubicacion, capacidad)
    │     └── Kardex reciente
    ├── Selecciona LLM:
    │     ├── local → Ollama (gemma3:4b)
    │     ├── opencode → OpenCode API (deepseek-v4-pro)
    │     └── external → OpenAI API
    └── Response JSON { response, model, tokens }

Fuentes LLM Soportadas

FuenteModeloEndpointCosto
Localgemma3:4bOllama :11434Gratis
OpenCodedeepseek-v4-proopencode.ai APIGratis 200req/5h
Externalgpt-4o-miniOpenAI APIPago

Incidente Resuelto Server Error 500 — Diagnostico y Prevencion

Cronologia del Incidente (2026-06-04)

HoraEventoImpacto
19:00Despliegue de Settings.tsx con saveSettings wrapperBuild incompleto (manifest sin Settings chunk)
19:40TODAS las paginas devuelven 500Pymetory inaccesible
19:42Diagnostico: PHP Fatal error en bootstrap/app.php linea 37file_put_contents sin permisos en docs/ERROR_LOG.md
19:44Fix 1: @file_put_contents (supresion de error)No funciono. El handler causaba Fatal.
19:45Fix 2: Remover exception handler completoApp.php perdio middleware Inertia. Settings roto.
19:46Fix 3: Restaurar middleware HandleInertiaRequests + CheckRoleSettings vuelve pero 500 persiste
19:48Fix 4: chmod 777 en storage/ y bootstrap/cache/Error cambia a StreamHandler (Monolog)
19:50Fix 5: chown ubuntu:ubuntu en storage/Resuelto. Pymetory vuelve.
20:30Fix 6: Redeploy build completo con manifestSettings.tsx carga correctamente
20:43Fix 7: Custom 500/503 error pages (Opus 4.8)Prevencion: errores ya no muestran pantalla blanca

Causa Raiz

El archivo bootstrap/app.php tenia un exception handler que escribia a docs/ERROR_LOG.md via file_put_contents(). El archivo no tenia permisos de escritura. Cuando cualquier error ocurria (ej. 404), el handler intentaba escribir el log, fallaba con Permission Denied, y causaba un PHP Fatal error que tumbaba TODA la aplicacion — un efecto domino: un error menor → intento de loguear → fatal → 500 en todas las paginas.

Lecciones Aprendidas

Prevencion Implementada

MedidaArchivoEstado
Exception handler sin I/Obootstrap/app.phpOK
Middleware Inertia restauradobootstrap/app.phpOK
Custom 500 error pageviews/errors/500.blade.phpOK
Custom 503 error pageviews/errors/503.blade.phpOK
Permisos storage/ 775 ubuntustorage/, bootstrap/cache/OK
Build con manifest verificadopublic/build/manifest.jsonOK
Backup 15 archivos criticosbackups/2026-06-04/OK
Contraste WCAG AA en SettingsSettings.tsx + FigmaLLM.tsxOK

Accesibilidad — Correcciones de Contraste (Opus 4.8)

ElementoAntesDespuesWCAG
Labels y breadcrumb#111111 al 40-60% (~3:1)#595959 solido (4.5:1)AA
Texto secundario (keys, emails)#111111 al 40-50% (~2.6:1)#4A4A4A solido (7:1)AAA
Fondo respuestas IA (RAG)bg-slate-800/30bg-white + bordeAA
Label "Pymetory LLM" (RAG)opacity-50text-[#595959]AA

RAG OpenCode Integracion con API Key de OpenCode

Configuracion Final (2026-06-04 21:00)

ParametroValor
Fuente LLMopencode
Modelodeepseek-v4-flash
API Keygerman1307 (ID 3, activa)
Base URLhttps://opencode.ai/zen/go/v1/chat/completions
Max Tokens256

Flujo de Inferencia

USUARIO: "¿Que lote vence primero?"
    │
    ▼
ChatLLMController::ask()
    ├── Lee llm_source = "opencode" de settings
    ├── Busca ApiKey activa por tipo
    │     └── ApiKey::where("tipo","opencode")->where("activo",true)->first()
    ├── Obtiene: key, base_url, model_name
    ├── Llama a OpenCode API con Authorization: Bearer $key
    └── Response → Muestra en header:
         deepseek-v4-flash · opencode · german1307

Bugs Encontrados y Resueltos

BugCausaSolucion
RAG caia a fallback siemprebase_url no inclua /chat/completions → 404Corregir base_url en api_keys
Respuesta vacia del LLMdeepseek-v4-pro usa reasoning_content, no contentFallback: content || reasoning_content
Header no mostraba modeloFigmaLLM.tsx no leia model/source/key_nameAgregar ragInfo state + display
Key vieja usada en vez de nuevaApiKey::first() devolvia la mas antiguaDesactivar keys viejas, solo 1 activa

Transcripcion de la Reunion (VTT)

Transcripcion automatica ASR de WhatsApp Audio. 38 minutos.