ai.md

IA y Desarrollo con LLMs

Este documento define estándares para construir funcionalidades con Modelos de Lenguaje (LLMs), usando OpenRouter para el enrutamiento de proveedores y Langfuse para observabilidad y evaluaciones.

Alcance

NOTA IMPORTANTE: Cada proveedor debe considerar el modelo de IA más costo eficiente para cada tarea.

Enrutamiento de proveedores con OpenRouter

Ejemplo (Node.js, cliente compatible con OpenAI):

import OpenAI from 'openai';

const client = new OpenAI({
  baseURL: 'https://openrouter.ai/api/v1',
  apiKey: process.env.OPENROUTER_API_KEY,
  defaultHeaders: {
    'HTTP-Referer': 'https://tu-dominio.com',
    'X-Title': 'TuApp'
  }
});

export async function generarRespuesta(prompt: string) {
  const res = await client.chat.completions.create({
    model: 'anthropic/claude-3.5-sonnet',
    messages: [{ role: 'user', content: prompt }],
    max_tokens: 400,
    temperature: 0.2
  });
  return res.choices[0]?.message?.content ?? '';
}

Guía operativa:

Observabilidad y evaluaciones con Langfuse

Ejemplo (Node.js):

import { Langfuse } from 'langfuse';

const langfuse = new Langfuse({
  baseUrl: process.env.LANGFUSE_HOST,
  publicKey: process.env.LANGFUSE_PUBLIC_KEY!,
  secretKey: process.env.LANGFUSE_SECRET_KEY!
});

export async function generarTrazado({ userId, prompt }: { userId: string; prompt: string }) {
  const trace = langfuse.trace({ name: 'chat-completion', userId, input: { prompt }, tags: ['openrouter'] });
  const start = Date.now();
  try {
    const output = await generarRespuesta(prompt);
    trace.update({ output: { completion: output }, metadata: { model: 'anthropic/claude-3.5-sonnet' }, duration: Date.now() - start });
    trace.score({ name: 'quality', value: 4.5 });
    return output;
  } catch (err) {
    trace.update({ level: 'error', metadata: { error: String(err) } });
    throw err;
  } finally {
    await trace.flushAsync();
  }
}

Configuración

Seguridad y privacidad

TODO