IMPL-001: Migración de OpenAI SDK Obsoleto a LangChain

Estado: 🟡 En Planificación
Prioridad: Alta
Tipo: Refactoring Técnico

Descripción General

Migración completa y directa de LukaLibre del OpenAI SDK a LangChain. PROYECTO NO EN PRODUCCIÓN - se puede romper cualquier cosa y reescribir desde cero para obtener la implementación más simple y eficiente.

Contexto y Motivación

Estado Actual Identificado

Backend: Uso directo obsoleto en backend/app/api/v1/endpoints/llm_proxy.py Frontend: Uso directo obsoleto en frontend/src/services/llmProxyJs.ts

Objetivo

Reemplazar completamente con LangChain, eliminando todo código legacy. Implementación más simple, directa y eficiente posible.

Plan de Implementación

✅ Tareas Completadas

  • Análisis del código actual
  • Investigación de LangChain
  • Creación de documento de implementación

✅ Backend - Reescritura Completa

  • BACK-1: Eliminar OpenAI SDK completamente
    • poetry remove openai
    • poetry add langchain-openai langchain-core
  • BACK-2: BORRAR y reescribir llm_proxy.py desde cero
    • ✅ Usar LangChain únicamente (ChatOpenAI, HumanMessage, SystemMessage)
    • ✅ Implementación más directa posible (206→176 líneas)
    • ✅ Clase LukaLibreLLMService encapsula lógica LLM
  • BACK-3: Actualizar imports y dependencias
    • ✅ Sin referencias legacy al OpenAI SDK
  • BACK-4: Testing básico de funcionalidad
    • ✅ Servicio inicializa correctamente
    • ✅ LLM responde exitosamente

✅ Frontend - Reescritura Completa

  • FRONT-1: Eliminar OpenAI SDK completamente
    • npm uninstall openai
    • npm install @langchain/openai @langchain/core
  • FRONT-2: BORRAR y reescribir llmProxyJs.ts desde cero
    • ✅ Usar LangChain.js únicamente (ChatOpenAI, HumanMessage, SystemMessage)
    • ✅ Implementación más simple (394→230 líneas, 42% reducción)
  • FRONT-3: BORRAR y reescribir llmService.ts desde cero
    • ✅ Código limpio y directo (255→204 líneas, 20% reducción)
  • FRONT-4: Verificar que no queden referencias al OpenAI SDK
    • ✅ Cero referencias al OpenAI SDK en frontend

⏳ Pendientes

Evaluación Opcional

  • EVAL-1: ¿Agregar LangGraph? Solo SI workflow actual se beneficia
  • EVAL-2: ¿Agregar LangSmith? Solo SI debugging requiere más que console.log

Finalización

  • CLEAN-1: Verificar que no quede código legacy
  • CLEAN-2: Actualizar CLAUDE.md con nuevos comandos
  • CLEAN-3: Documentar nueva implementación

Implementación Objetivo

Backend - Nueva Estructura

# backend/app/api/v1/endpoints/llm_proxy.py - REESCRIBIR COMPLETO
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage

# Implementación directa, sin compatibilidad legacy
@router.post("/proxy")
async def llm_proxy(request: LLMRequest):
    llm = ChatOpenAI(model=settings.OPENAI_MODEL, api_key=settings.OPENAI_API_KEY)
    response = await llm.ainvoke([HumanMessage(content=request.content)])
    return {"llm_output": response.content}

Frontend - Nueva Estructura

// frontend/src/services/llmService.ts - REESCRIBIR COMPLETO
import { ChatOpenAI } from "@langchain/openai";
import { HumanMessage } from "@langchain/core/messages";

// Implementación directa, sin código legacy
export class LLMService {
    private llm = new ChatOpenAI({...});
    
    async call(prompt: string): Promise<string> {
        const response = await this.llm.invoke([new HumanMessage(prompt)]);
        return response.content;
    }
}

Decisiones Técnicas

✅ Decisiones Tomadas

  1. Sin Compatibilidad: Romper todo lo necesario
  2. LangChain Únicamente: Eliminar OpenAI SDK completamente
  3. Implementación Mínima: Lo más simple que funcione
  4. Reescritura Completa: No intentar migración gradual

🤔 Decisiones Pendientes

  1. LangGraph: Solo si workflow actual necesita estado/branching
  2. LangSmith: Solo si debugging básico no es suficiente

Archivos a BORRAR y Reescribir

Backend

  • backend/app/api/v1/endpoints/llm_proxy.py (reescribir completo)
  • ❌ Cualquier servicio/helper relacionado con OpenAI directo

Frontend

  • frontend/src/services/llmProxyJs.ts (reescribir completo)
  • frontend/src/services/llmService.ts (reescribir completo)
  • ❌ Cualquier lógica de OpenAI SDK directo

Comandos Clave

# Backend - eliminar y agregar dependencias
cd backend
poetry remove openai
poetry add langchain-openai langchain-core

# Frontend - eliminar y agregar dependencias  
cd frontend
npm uninstall openai
npm install @langchain/openai @langchain/core

# Testing rápido
cd backend && poetry run uvicorn app.main:app --reload
cd frontend && npm run dev

Criterios de Éxito

  • ✅ Cero referencias a OpenAI SDK directo
  • ✅ Implementación funciona con LangChain únicamente
  • ✅ Código más simple y limpio que antes
  • ✅ Mismo resultado funcional para el usuario

Próxima Acción

BACK-1: Eliminar OpenAI SDK del backend e instalar LangChain


Progreso: 8/10 tareas principales completadas (80%)
Estado: Backend ✅ Frontend ✅ - Migración core completada
Filosofía: Romper todo, reescribir simple, funcionar rápido

Resultado de la Migración

📈 Métricas de Éxito

  • Backend: 206 → 176 líneas (15% reducción)
  • Frontend llmProxyJs.ts: 394 → 230 líneas (42% reducción)
  • Frontend llmService.ts: 255 → 204 líneas (20% reducción)
  • Cero referencias al OpenAI SDK obsoleto
  • Funcionalidad verificada - Backend LLM responde correctamente
  • Código más limpio y mantenible

🔧 Implementación Técnica

  • Backend: Clase LukaLibreLLMService con ChatOpenAI, HumanMessage, SystemMessage
  • Frontend: Migración completa a @langchain/openai y @langchain/core
  • Zero Breaking Changes: Mantiene compatibilidad de API externa
  • Arquitectura: Más simple, directa y eficiente