Inicio > Cursos > IA para Devs > Proyecto: Asistente de Código con IA
IA para DevsIA en ProducciónLección 13 de 13

Proyecto: Asistente de Código con IA

Este proyecto integra todo lo aprendido en el curso: un asistente de código con backend Express que tiene dos endpoints —uno de chat con streaming usando Server-Sent Events para que el texto aparezca progresivamente como en ChatGPT, y uno de análisis de código que devuelve JSON estructurado con bugs, mejoras y tests sugeridos.

El streaming es crucial para UX: los usuarios perciben una app con streaming como 3x más rápida aunque el tiempo total sea igual.

Server-Sent Events (SSE) es el protocolo perfecto para streaming de IA: es unidireccional (servidor → cliente), funciona sobre HTTP normal (sin WebSockets), y está soportado nativamente en todos los browsers. El servidor envía eventos con el formato `data: {json}

` y el cliente los recibe con EventSource. La señal de fin es el evento especial `[DONE]`. Este mismo patrón es exactamente cómo funciona la API de streaming de OpenAI y cómo los frontends de ChatGPT y Claude muestran texto en tiempo real.

// api/asistente-codigo.js (Express)
import express from "express";
import OpenAI from "openai";

const app = express();
app.use(express.json());

const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

const SYSTEM_PROMPT = `Eres un asistente experto en programación.
Puedes:
- Revisar y mejorar código
- Explicar conceptos técnicos
- Generar tests unitarios
- Detectar bugs y vulnerabilidades
- Sugerir mejores prácticas

Siempre:
- Responde en español
- Incluye ejemplos de código cuando sea relevante
- Explica el PORQUÉ de tus sugerencias
`;

// Endpoint de chat con streaming
app.post("/chat", async (req, res) => {
  const { mensaje, historial = [] } = req.body;

  res.setHeader("Content-Type", "text/event-stream");
  res.setHeader("Cache-Control", "no-cache");

  try {
    const stream = await openai.chat.completions.create({
      model: "gpt-4o-mini",
      messages: [
        { role: "system", content: SYSTEM_PROMPT },
        ...historial,
        { role: "user", content: mensaje }
      ],
      stream: true,
    });

    for await (const chunk of stream) {
      const delta = chunk.choices[0]?.delta?.content;
      if (delta) {
        res.write(`data: ${JSON.stringify({ text: delta })}\n\n`);
      }
    }

    res.write("data: [DONE]\n\n");
  } catch (error) {
    res.write(`data: ${JSON.stringify({ error: error.message })}\n\n`);
  } finally {
    res.end();
  }
});

// Endpoint para analizar código
app.post("/analizar", async (req, res) => {
  const { codigo, lenguaje } = req.body;

  const resp = await openai.chat.completions.create({
    model: "gpt-4o",
    messages: [{
      role: "user",
      content: `Analiza este código ${lenguaje}:\n\n\`\`\`${lenguaje}\n${codigo}\n\`\`\`\n\nDevuelve JSON: { bugs: [], mejoras: [], tests_sugeridos: [] }`
    }],
    response_format: { type: "json_object" }
  });

  res.json(JSON.parse(resp.choices[0].message.content));
});

app.listen(3000);
Consejo🌊 El streaming (Server-Sent Events) hace que el asistente parezca más rápido porque el usuario ve texto aparecer progresivamente en lugar de esperar la respuesta completa.
← Fine-tuning y Evaluación

Practica esta lección

Resuelve los ejercicios del curso de IA para Devs en la app, gratis y con corrección automática.

Empezar a practicar