Backend API para Sapient Lab, proyecto del Microsoft Innovation Challenge 2026 en el reto: Lab Notebook AI Assistant.
Challenge oficial (Innovation Challenge 2026):
Los investigadores quieren ayuda para razonar sobre experimentos sin reemplazar el juicio cientifico. Desarrolle un asistente de cuaderno de laboratorio basado en agentes que interprete protocolos experimentales, sugiera variaciones para los siguientes pasos y analice resultados a partir de texto, archivos CSV o imagenes, explicando claramente por que se hacen las recomendaciones. El sistema debe aplicar limites de seguridad estrictos (especialmente en dominios biologicos o clinicos), aplicar filtrado de contenido y evitar comportamientos de asesoramiento no permitidos. Los equipos deben centrarse en la explicabilidad, el diseno seguro de agentes y una orquestacion solida de datos y modelos.
Este backend implementa una arquitectura de agentes para responder exactamente a ese reto:
- Interpretar protocolos experimentales.
- Sugerir variaciones para los siguientes pasos.
- Analizar resultados desde texto, CSV o imagenes.
- Explicar de forma transparente por que se propone cada recomendacion.
Ademas, el sistema aplica controles de seguridad para reducir riesgos en contextos biologicos y clinicos, con foco en:
- Explicabilidad
- Diseno seguro de agentes
- Orquestacion robusta de datos y modelos
- Chat de investigacion con contexto de notebook.
- Interpretacion y analisis de protocolos/resultados experimentales.
- Analisis multimodal de imagenes y documentos.
- Extraccion de contenido apto para insertar en notebook (sin envoltura conversacional).
- Integraciones de plataforma (proyectos, notas, invitaciones, recursos, metricas).
- Gestion de contexto de proyecto y documentos para enriquecer prompts.
- Integraciones Microsoft y almacenamiento en Azure Blob.
- Integracion OpenML para consultar datasets, tareas, runs y evaluaciones de benchmark.
| Categoria | Stack |
|---|---|
| Runtime | Node.js + TypeScript |
| Framework | NestJS |
| Persistencia | MySQL (mysql2) |
| Validacion | class-validator, class-transformer |
| HTTP Cliente | axios |
| API Docs | @nestjs/swagger, swagger-ui-express |
| IA y agentes | Azure Foundry/OpenAI |
| Recurso de benchmark | OpenML API |
| Voz y vision | Azure Speech, Azure Vision |
| Documentos | Azure Document Intelligence |
| Archivos | Azure Blob Storage |
Estructura principal en src:
- src/ai: orquestacion de proveedores y endpoints de IA.
- src/ai/project-context.controller.ts: contexto por proyecto y gestion de documentos asociados.
- src/platform: autenticacion basica, proyectos, notas de experimento y endpoints de soporte al frontend.
- src/reports: generacion y descarga de reportes.
- src/safety: analisis de seguridad.
- src/storage: carga y acceso a blobs.
- src/microsoft: estado de integraciones y webhook de Teams.
- src/database: conexion MySQL, bootstrap de esquema y seed.
- src/openml: integracion con OpenML para datasets, tasks, flows, runs y evaluations.
- src/experiment-notes: gestion dedicada de notas de experimento.
OpenML se usa como capa de soporte para razonamiento comparativo y validacion de hipotesis:
- El investigador formula una consulta en lenguaje natural en el notebook.
- El backend transforma esa consulta en criterios de busqueda (dataset/task/evaluation).
- Se consultan endpoints OpenML y se recupera metadata relevante.
- El agente sintetiza hallazgos y los presenta como recomendacion explicada.
- El modulo de seguridad valida que la recomendacion no cruce limites de asesoramiento no permitido.
Esto aporta trazabilidad porque cada recomendacion puede vincularse a evidencia externa de benchmark.
El backend esta orientado a que la IA asista, no sustituya, el criterio humano:
- Recomendaciones con justificacion explicita.
- Control de riesgo en contenido sensible (bio/clinico).
- Filtrado de salidas para evitar asesoramiento no permitido.
- Separacion entre orquestacion de agentes, capa de datos y capa HTTP.
- Validacion estricta de payloads (
ValidationPipeconwhitelistyforbidNonWhitelisted).
- Node.js 18+ recomendado.
- MySQL 8+ (local o administrado).
- Credenciales de al menos un proveedor de IA.
cd back_end
npm installCrear variables de entorno:
copy .env.example .envEjecutar en desarrollo:
npm run start:devCompilar y ejecutar en modo produccion:
npm run build
npm run start:prodReferencia base: .env.example.
Variables clave:
PORT: puerto HTTP (por defecto 3000).REQUEST_BODY_LIMIT: limite de payload (por defecto15mb).CORS_ORIGINS: origenes permitidos separados por coma.
Nota de CORS:
- El backend agrega por defecto
https://zealous-cliff-0c0b6d90f.4.azurestaticapps.netyhttp://localhost:5173. CORS_ORIGINSse fusiona con estos origenes base.
Base de datos:
MYSQL_HOSTMYSQL_PORTMYSQL_USERMYSQL_PASSWORDMYSQL_DATABASEMYSQL_SSL(truepara entornos administrados con TLS)
Proveedor IA por defecto:
LLM_PROVIDER(valor esperado:azure)
Credenciales IA/integraciones (segun stack habilitado):
- Azure Foundry / OpenAI
- Azure Vision
- Azure Speech
- Azure Document Intelligence
- Azure Storage Blob
Nota de compatibilidad:
- En .env.example aun existen variables legacy de Mistral/DeepSeek, pero el proveedor activo del backend es Azure.
- Base URL local:
http://localhost:3000/api - Swagger (no production):
http://localhost:3000/api/docs
El prefijo global api se aplica en src/main.ts.
GET /api/healthGET /api/ai/providers/status
POST /api/ai/conversationPOST /api/ai/notebook/chatPOST /api/ai/notebook/extract-insertablePOST /api/ai/protocol/interpretPOST /api/ai/results/analyzePOST /api/ai/images/analyzePOST /api/ai/analyze-image(compatibilidad)POST /api/ai/document/analyzePOST /api/ai/speechPOST /api/ai/speech-to-text
PUT /api/project-context/:projectIdGET /api/project-context/:projectIdPOST /api/project-context/:projectId/documentsGET /api/project-context/:projectId/documentsDELETE /api/project-context/:projectId/documents/:documentIdGET /api/project-context/:projectId/context-promptGET /api/project-context/:projectId/context-prompt-debug
POST /api/ai/copilot/chatPOST /api/ai/copilot/completionsPOST /api/ai/copilot/explain
Nota: varias rutas de plataforma viven en el controlador raiz (sin prefijo platform), definidas en src/platform/platform.controller.ts.
POST /api/auth/registerPOST /api/auth/loginGET /api/projectsPOST /api/projectsPOST /api/projects/:id/joinGET /api/frontend/homeGET /api/frontend/themesPOST /api/frontend/metrics/counter-clicks/incrementPOST /api/experiments/:experimentId/notesGET /api/experiments/:experimentId/notesPUT /api/experiments/:experimentId/notes/:noteIdDELETE /api/experiments/:experimentId/notes/:noteIdPOST /api/experiments/:experimentId/notes/:noteId/ai-suggestions
POST /api/reports/generatePOST /api/reports/download-pdfPOST /api/safety/analyzePOST /api/storage/uploadGET /api/integrations/microsoft/statusPOST /api/integrations/microsoft/teams/test
GET /api/openml/datasetsGET /api/openml/datasets/qualities/listGET /api/openml/datasets/tagGET /api/openml/datasets/:idGET /api/openml/datasets/:id/featuresGET /api/openml/datasets/:id/qualitiesGET /api/openml/tasksGET /api/openml/tasks/typesGET /api/openml/tasks/types/:idGET /api/openml/tasks/:idGET /api/openml/flowsGET /api/openml/flows/existsGET /api/openml/flows/:idGET /api/openml/runsGET /api/openml/runs/:idGET /api/openml/runs/:id/traceGET /api/openml/evaluationsGET /api/openml/evaluations/measuresGET /api/openml/setups/:idGET /api/openml/studiesGET /api/openml/studies/:id
- Crear o recuperar contexto del experimento (notas/proyecto).
- Enviar mensaje a
POST /api/ai/notebook/chatcon contexto estructurado. - Mostrar respuesta explicada al investigador.
- Si se quiere persistir en notebook, pasar la respuesta por
POST /api/ai/notebook/extract-insertable. - Guardar contenido limpio en notas del experimento.
Flujo complementario para contexto documental:
- Registrar contexto de proyecto con
PUT /api/project-context/:projectId. - Subir documentos con
POST /api/project-context/:projectId/documents. - Consumir endpoints de IA que aprovechan este contexto para respuestas mas precisas.
- El frontend consume siempre rutas bajo
/api/*, coherente con el prefijo global en src/main.ts. - El notebook usa
POST /api/ai/notebook/chatyPOST /api/ai/notebook/extract-insertablecomo flujo principal. - La biblioteca documental en frontend depende de
project-contextpara carga/listado/eliminacion de documentos.
El modulo de base de datos inicializa automaticamente esquema y contenido base al arrancar la aplicacion. La logica de bootstrap y seed vive en src/database/database.service.ts.
Scripts SQL de referencia en Document/sql/mysql.
erDiagram
USERS ||--o{ PROJECTS : "crea/participa"
USERS ||--o{ PROJECT_MEMBERS : "pertenece"
PROJECTS ||--o{ PROJECT_MEMBERS : "incluye"
PROJECTS ||--o{ PROJECT_DOCUMENTS : "adjunta"
PROJECTS ||--o{ PROJECT_INVITATIONS : "invita"
PROJECTS ||--o{ EXPERIMENTS : "contiene"
EXPERIMENTS ||--o{ EXPERIMENT_STEPS : "define pasos"
EXPERIMENTS ||--o{ EXPERIMENT_NOTES : "registra notas"
EXPERIMENTS ||--o{ EXPERIMENT_ARTIFACTS : "guarda evidencias"
EXPERIMENTS ||--o{ AI_INTERACTIONS : "genera interacciones IA"
AI_INTERACTIONS ||--o{ SAFETY_REVIEWS : "es revisada por seguridad"
PAGES ||--o{ SECTIONS : "estructura UI"
SECTIONS ||--o{ LINKS : "publica enlaces"
SECTIONS ||--o{ SECTION_ASSETS : "usa recursos"
ASSETS ||--o{ SECTION_ASSETS : "asignado a seccion"
THEMES ||--o{ THEME_TOKENS : "define tokens"
PAGES ||--o{ UI_METRICS : "mide eventos"
UI_METRICS ||--o{ UI_METRIC_EVENTS : "historial"
- Colaboracion de proyecto:
users,projects,project_members,project_invitations,project_documents,project_logs.- Permite ownership, membresia, invitaciones y documentacion por proyecto.
- Cuaderno experimental:
experiments,experiment_steps,experiment_notes,experiment_artifacts.- Modela el ciclo del experimento: objetivo, pasos, notas y evidencia (CSV, imagen, documento, reporte).
- IA responsable y trazabilidad:
ai_interactions,safety_reviews.- Guarda trazas de prompts/respuestas, latencia, flags de seguridad y decisiones (
allow,warn,block).
- Configuracion UI/landing y metricas:
pages,sections,assets,section_assets,links,themes,theme_tokens,ui_metrics,ui_metric_events.- Soporta contenido administrable del frontend y observabilidad basica de uso.
- Document/sql/mysql/001_create_database.sql: crea DB
innovation_challenge. - Document/sql/mysql/002_tables_core.sql: tablas core de UI, temas, links y metricas.
- Document/sql/mysql/003_constraints_and_indexes.sql: FKs e indices.
- Document/sql/mysql/005_add_notebook_core.sql: tablas de notebook, artefactos e IA/safety.
Adicionalmente, el bootstrap en src/database/database.service.ts garantiza creacion idempotente de tablas base (users, projects, entre otras) al iniciar el servicio.
npm run start: ejecuta el build compilado.npm run start:dev: desarrollo con recarga (ts-node-dev).npm run build: compilacion TypeScript adist.npm run start:prod: ejecucion de salida compilada.
back_end/
src/
ai/
experiment-notes/
platform/
reports/
safety/
storage/
microsoft/
database/
Document/sql/mysql/
documents/
consumibles/
.env.example
package.json