Este documento describe cómo configurar Dexter para usar una API local de inferencia en lugar de la API de OpenAI.
Se han modificado los siguientes archivos para soportar APIs locales compatibles con OpenAI:
src/dexter/model.py- Soporte paraOPENAI_BASE_URLen Pythondexter-ts/src/model/llm.ts- Soporte paraOPENAI_BASE_URLen TypeScriptsrc/dexter/utils/env.py- Validación de API key opcional para APIs localesdexter-ts/src/utils/env.ts- Validación de API key opcional para APIs localesenv.example- Documentación de la nueva variable de entorno
Para usar una API local, configura las siguientes variables de entorno en tu archivo .env:
# URL base de la API local (debe incluir /v1 al final)
OPENAI_BASE_URL=http://localhost:1234/v1
# API key (opcional para APIs locales sin autenticación)
# Puede ser cualquier valor o incluso omitirse
OPENAI_API_KEY=local-key-123-
Asegúrate de que tu servidor local esté corriendo en
http://localhost:1234 -
Crea o edita tu archivo
.env:OPENAI_BASE_URL=http://localhost:1234/v1 OPENAI_API_KEY=local-key-123
-
Ejecuta Dexter normalmente:
uv run dexter-agent
La API local debe ser compatible con el formato de OpenAI. El endpoint esperado es:
POST http://localhost:1234/v1/chat/completions
Con el siguiente formato de request (ejemplo del usuario):
{
"model": "qwen3-vl-30b-a3b-thinking",
"messages": [
{
"role": "system",
"content": "Always answer in rhymes. Today is Thursday"
},
{
"role": "user",
"content": "What day is it today?"
}
],
"temperature": 0.7,
"max_tokens": -1,
"stream": false
}- La URL base debe incluir
/v1al final (por ejemplo:http://localhost:1234/v1) - LangChain añadirá automáticamente
/chat/completionsal hacer las peticiones - Si tu API local no requiere autenticación, puedes usar cualquier valor para
OPENAI_API_KEYo incluso omitirlo - El modelo que especifiques debe coincidir con el nombre del modelo en tu servidor local (ej:
qwen3-vl-30b-a3b-thinking)
Puedes cambiar el modelo usando el comando /model en el CLI de Dexter. El modelo que especifiques debe estar disponible en tu servidor local.
Esta implementación es compatible con:
- Servidores que implementan la API compatible con OpenAI (como LM Studio, Ollama con servidor OpenAI-compatible, etc.)
- APIs que soportan el formato estándar de mensajes de OpenAI
- Streaming y no-streaming
- Structured output (function calling)
LM Studio es una aplicación popular para ejecutar modelos localmente. Dexter está optimizado para trabajar con LM Studio, pero hay algunas consideraciones importantes:
Problema: LM Studio solo acepta tool_choice como string ("none", "auto", "required"), no como objeto. LangChain a veces envía tool_choice como objeto cuando usa with_structured_output.
Solución: El código ahora detecta automáticamente cuando se usa una API local y maneja este error:
- Intenta usar
json_modecomo método alternativo para structured output - Si falla, hace un fallback a llamadas regulares y parsea la respuesta manualmente
- Los errores de tool_choice se manejan automáticamente con reintentos
Problema: Si LANGSMITH_TRACING=true pero no tienes una API key válida, verás errores 403.
Solución:
- El código ahora desactiva automáticamente LangSmith si está habilitado pero no hay API key válida
- Para deshabilitar manualmente, configura en tu
.env:O simplemente no incluyas las variables de LangSmithLANGSMITH_TRACING=false
# API Local
OPENAI_BASE_URL=http://localhost:1234/v1
OPENAI_API_KEY=lm-studio # Cualquier valor funciona
# Deshabilitar LangSmith (opcional, se desactiva automáticamente si no hay API key)
LANGSMITH_TRACING=falseLM Studio funciona mejor con modelos que soportan function calling:
- Llama 3.1 (8B, 70B)
- Qwen2.5
- Mistral
- Otros modelos que soporten OpenAI-compatible function calling
Nota: Algunos modelos pueden no soportar structured output perfectamente. En ese caso, el código hará fallback automático a respuestas regulares.
Si encuentras problemas:
- Verifica que tu servidor local esté corriendo: Asegúrate de que LM Studio (o tu servidor) esté ejecutándose y escuchando en el puerto correcto
- Verifica la URL base: Debe incluir
/v1al final (por ejemplo:http://localhost:1234/v1) - Prueba con curl: Verifica que la API funciona manualmente:
curl http://localhost:1234/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{"model": "tu-modelo", "messages": [{"role": "user", "content": "test"}]}'
- Revisa los logs: Revisa los logs de LM Studio para ver si las peticiones están llegando
- Deshabilita LangSmith: Si ves errores 403 de LangSmith, configura
LANGSMITH_TRACING=false - Verifica el modelo: Asegúrate de que el nombre del modelo coincida exactamente con el que está cargado en LM Studio