Prueba Técnica: Full-Stack AI Engineer

Evidencias: Ver capturas y explicaciones en evidence.html.

1. Contexto del Desafío

  1. En VIVETORI buscamos ingenieros que dominen tanto el desarrollo tradicional como las nuevas fronteras de la Inteligencia Artificial.
  2. Tu objetivo es construir un "AI-Powered Support Co-Pilot": un sistema capaz de recibir tickets de soporte, procesarlos mediante agentes de IA para categorizarlos y analizar su sentimiento, y visualizarlos en tiempo real en un dashboard.

2. Requerimientos Técnicos

2.1. Base de Datos (Supabase)

Ver paso a paso para 2.1 Base de Datos (Supabase)

  1. Configura una tabla tickets en Supabase con los siguientes campos:
    1. id (UUID, Primary Key)
    2. created_at (Timestamp)
    3. description (Text - El contenido del ticket)
    4. category (Text/Enum - Ej: Técnico, Facturación, Comercial)
    5. sentiment (Text - Ej: Positivo, Neutral, Negativo)
    6. processed (Boolean - Default: false)
  2. Entregable: Un archivo setup.sql con el esquema de la tabla y cualquier política RLS necesaria.

2.2. Microservicio de IA (Python + FastAPI)

Ver paso a paso para 2.2 Microservicio de IA

  1. Crea una API en Python utilizando FastAPI y LangChain.
  2. Implementa un endpoint POST /process-ticket que:
    1. Reciba el texto de un ticket.
    2. Utilice un modelo de lenguaje (LLM via LangChain/Hugging Face) para extraer la categoría y el sentimiento en formato JSON estructurado.
    3. Actualice la fila correspondiente en Supabase marcándola como processed: true.
  3. Despliegue: Debes desplegar este servicio en una plataforma gratuita como Render.com, Vercel o Railway.app.
  4. Entregable: La URL pública de la API y el código fuente.

2.3. Automatización Low-Code (n8n)

Ver paso a paso para 2.3 Automatizacion Low-Code (n8n)

  1. Crea un flujo en n8n que:
    1. Se active mediante un Webhook o un trigger de "Nueva Fila" en Supabase.
    2. Consuma tu Microservicio de Python para procesar el ticket.
    3. Si el sentimiento detectado es "Negativo", el flujo debe disparar una notificación simulada (envío de un email).
    4. (Plus) puedes agregar elementos adicionales a tu flujo que agreguen valor al proyecto.
  2. Entregable: El archivo .json del flujo exportado.

2.4. Dashboard Frontend (React + TypeScript)

Ver paso a paso para 2.4 Dashboard Frontend

  1. Desarrolla una interfaz simple con React 18, TypeScript y Vite.
  2. Requerimientos visuales:
    1. Usar Tailwind CSS para el diseño.
    2. Mostrar la lista de tickets consumiendo directamente de Supabase.
    3. Implementar Realtime (usando los canales de Supabase) para que los tickets aparezcan y se actualicen sin refrescar la página.
  3. Entregable: La URL de la web desplegada (Vercel/Netlify).

3. Formato de Entrega

  1. Debes enviar un repositorio de GitHub organizado de la siguiente manera:
    1. /supabase: Archivo setup.sql.
    2. /python-api: Código de la API de FastAPI, requirements.txt y Dockerfile (si aplica).
    3. /n8n-workflow: Archivo .json del flujo.
    4. /frontend: Código fuente del dashboard.
  2. En el README del repositorio debe incluirse obligatoriamente:
    1. URL del Dashboard activo.
    2. URL de la API de Python activa.
    3. Breve explicación de la estrategia de Prompt Engineering utilizada para la clasificación.

4. Criterios de Evaluación

  1. Funcionalidad End-to-End: ¿El sistema realmente procesa un ticket desde que entra hasta que se visualiza?
  2. Calidad del Microservicio: Manejo de errores en Python, uso de tipos y eficiencia del prompt.
  3. Dominio de Ecosistema: Integración correcta entre Supabase, n8n y el frontend.
  4. DevOps Básico: Capacidad de desplegar servicios funcionales en la nube.

5. Información del README

URLs activas

Formato de Entrega (justificación)

Estrategia de Prompt Engineering (clasificación)

La implementación actual combina dos enfoques para minimizar ambigüedad y errores: (1) un modelo de sentimiento entrenado para devolver etiquetas estándar (positivo/negativo/neutral) y (2) un modelo zero-shot para categoría que compara el texto contra un conjunto acotado de labels predefinidos. Este diseño reduce el espacio de salida y facilita la consistencia entre tickets. Además, el microservicio mantiene un prompt estricto para escenarios donde se use un LLM generativo: solicita SOLO JSON válido con category y sentiment, impone formato y restringe valores permitidos. Esa restricción funciona como contrato de salida, permite parseo seguro y evita texto extra o narrativo. En conjunto, la estrategia prioriza respuestas estructuradas, trazables y fáciles de integrar con Supabase y el dashboard.

Glosario