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);
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