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
- Sin Compatibilidad: Romper todo lo necesario
- LangChain Únicamente: Eliminar OpenAI SDK completamente
- Implementación Mínima: Lo más simple que funcione
- Reescritura Completa: No intentar migración gradual
🤔 Decisiones Pendientes
- LangGraph: Solo si workflow actual necesita estado/branching
- 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
conChatOpenAI
,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