- Ollama ahora incorpora compatibilidad inicial con la Chat Completions API de OpenAI, lo que permite conectar herramientas y aplicaciones hechas para OpenAI directamente a modelos locales
- Tras la instalación, se pueden descargar modelos como
llama2 o mistral y llamarlos manteniendo el formato de solicitud de OpenAI, cambiando solo el host
- Las librerías de OpenAI para Python y JavaScript funcionan indicando
base_url/baseURL y usando un valor de api_key que es obligatorio, pero no se utiliza
- Se ofrecen ejemplos para conectar a Ollama una app de chat con streaming del Vercel AI SDK y el framework multiagente Autogen de Microsoft
- El soporte actual está en una fase de soporte inicial experimental; la Embeddings API, function calling, soporte de visión y mejoras en Logprobs quedan para evaluación futura
Llamar a Ollama con el formato de la API de OpenAI
- Ollama ofrece un endpoint compatible con la Chat Completions API de OpenAI, lo que permite usar modelos locales desde herramientas existentes basadas en OpenAI
- Para comenzar, instala Ollama y descarga un modelo como Llama 2 o Mistral
ollama pull llama2
- En cURL, se mantiene el formato de solicitud de OpenAI tal cual y solo se cambia el host a
http://localhost:11434
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "llama2",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "Hello!"
}
]
}'
- La librería de OpenAI para Python configura
base_url con el endpoint local de Ollama
api_key='ollama' es obligatorio, pero no se utiliza
from openai import OpenAI
client = OpenAI(
base_url = 'http://localhost:11434/v1',
api_key='ollama',
)
response = client.chat.completions.create(
model="llama2",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The LA Dodgers won in 2020."},
{"role": "user", "content": "Where was it played?"}
]
)
print(response.choices[0].message.content)
- La librería de OpenAI para JavaScript configura
baseURL como http://localhost:11434/v1
apiKey: 'ollama' también es obligatorio, pero no se utiliza
import OpenAI from 'openai'
const openai = new OpenAI({
baseURL: 'http://localhost:11434/v1',
apiKey: 'ollama',
})
const completion = await openai.chat.completions.create({
model: 'llama2',
messages: [{ role: 'user', content: 'Why is the sky blue?' }],
})
console.log(completion.choices[0].message.content)
Integraciones de ejemplo y planes futuros
- El Vercel AI SDK es una librería de código abierto para crear aplicaciones interactivas con streaming, y se puede adaptar el ejemplo de OpenAI para Next.js para usarlo con Ollama
npx create-next-app --example https://github.com/vercel/ai/tree/main/examples/next-openai example
cd example
- En
app/api/chat/route.ts, se cambia la configuración del cliente de OpenAI para apuntar al endpoint local de Ollama
const openai = new OpenAI({
baseURL: 'http://localhost:11434/v1',
apiKey: 'ollama',
});
- La solicitud de chat completions usa el modelo
llama2 y stream: true
const response = await openai.chat.completions.create({
model: 'llama2',
stream: true,
messages,
});
npm run dev
- Autogen es un framework de código abierto de Microsoft para aplicaciones multiagente, y el ejemplo usa Code Llama
ollama pull codellama
pip install pyautogen
from autogen import AssistantAgent, UserProxyAgent
config_list = [
{
"model": "codellama",
"base_url": "http://localhost:11434/v1",
"api_key": "ollama",
}
]
assistant = AssistantAgent("assistant", llm_config={"config_list": config_list})
user_proxy = UserProxyAgent("user_proxy", code_execution_config={"work_dir": "coding", "use_docker": False})
user_proxy.initiate_chat(assistant, message="Plot a chart of NVDA and TESLA stock price change YTD.")
- El ejemplo se ejecuta con
python example.py y hace que el asistente escriba el código para dibujar el gráfico
python example.py
- El soporte para la API de OpenAI está en una fase de soporte inicial experimental
- Entre los puntos en evaluación para futuras mejoras están la Embeddings API, function calling, soporte de visión y Logprobs
- Se pueden recibir issues en GitHub, y hay más información disponible en la documentación sobre compatibilidad con OpenAI
1 comentarios
Opiniones de Hacker News
Es sorprendente la velocidad con la que mejoró la usabilidad del hosting local de LLMs en los últimos meses. Hace apenas unas horas estaba hablando de lo fácil que es https://github.com/Mozilla-Ocho/llamafile[1], y ahora ya no sé qué debería usar
[1] Literalmente hace unas horas: https://euri.ca/blog/2024-llm-self-hosting-is-easy-now/
ollama serve, levantasollama web-uien Docker, agregas desde la UI web un modelo asistente de código de OllamaHub y subes la documentaciónSin escribir código, tienes un LLM autoalojado que responde usando la documentación como contexto. En nuestro caso, deepseek coder 33b corre lo suficientemente rápido en una Mac Studio con 64 GB de RAM y da sugerencias bastante buenas basadas en nuestra documentación interna de código
También puedes mezclar varios modelos dentro de un solo archivo de modelo, una función con la que se está experimentando últimamente. No hace falta depender necesariamente de la biblioteca de modelos de Ollama; también puedes usar modelos creados por ti. El soporte para modelos nuevos llega a través de bindings de
llama.cppllamafile, pero me faltaba una interfaz de chat con suficientes funciones, así que construí https://recurse.chat/ encima de esoTodavía necesito GPT-4 para algunas tareas, pero en el uso diario ya reemplazó una parte considerable de mi uso de ChatGPT, y me gusta especialmente que pueda importar todo el historial de chats de ChatGPT. También me da curiosidad qué quiere hacer la gente con IA local
llamacpp -m -p, y en mi MacBook uso Mixtral 8x7b + CodeLlama 70b muy bien como herramientas cotidianas. Me pregunto si las alternativas a Llama.cpp tienen alguna función decisiva, y no quiero perderme ninguna nueva tendencia interesanteSoy profesor de administración de empresas y preparé una guía para que mis estudiantes prueben Ollama y web-ui ejecutándolos en Google Cloud[1]. Con instancias spot puede correr por 18 centavos por hora
[1] https://docs.google.com/document/d/1OpZl4P3d0WKH9XtErUZib5_2...
git-bash. No es más difícil técnicamente que lo que ya indicasteConozco a varias personas que, en el fondo, se sienten incómodas con que la compatibilidad con la API de OpenAI se esté convirtiendo en un estándar de la comunidad. Quitando rarezas como
data.choices.text.responseo el anidamiento innecesariamente defensivo del esquema, no tengo muchas quejasMe da curiosidad qué dolores hay en el proceso de convertir esa API en un estándar, y si alguien ha intentado estándares alternativos que valga la pena considerar
Está bien que se consolide como estándar comunitario, pero debería existir una especificación muy sólida de qué quiere decir la comunidad con compatible con la API de OpenAI. En particular, ese estándar debería mantenerse estable aunque OpenAI haya lanzado una función nueva esta mañana
Lo que quiero es una especificación de API robusta, incluyendo condiciones de error, un conjunto de pruebas para verificar si una nueva implementación sigue la especificación, y un nombre. Por ejemplo, quisiera saber qué significa que un software sea compatible con
OpenAI-API-Spec v3. Tal como está ahora, decir simplemente “compatible con la API de OpenAI” no aporta suficiente información. No se sabe qué parte de la API ni de qué momento de la API se está tomando como referenciaSi agregamos a Ollama funciones nuevas, interesantes y distintas, pero no tienen equivalente en la API de OpenAI, no sé si la gente podrá usarlas
llama.cppcon bindings en el lenguaje que quieras es muy fácil, así que no es tan importante. Si necesitas más control, solo requiere un poco más de trabajo, y no necesariamente hacen falta estas herramientas plug-and-playEn el trabajo estamos creando una versión mejor que Copilot, y también admitimos un enfoque en el que el usuario trae su propio LLM. Últimamente estamos agregando backends compatibles con OpenAI: si nos indicas el endpoint de API compatible con OpenAI y con qué modelo tratarlo, podemos formatear el prompt, las secuencias de parada, el máximo de tokens, etc., de acuerdo con la semántica de ese modelo
Necesitaba exactamente algo así para probar en un entorno de desarrollo local. Si Ollama lo soporta, probar la gran cantidad de LLMs que debemos soportar se vuelve mucho más fácil. Viendo que varias herramientas como OpenLLM implementan la misma API, parece que todo está convergiendo hacia la compatibilidad con la API de OpenAI
Ahora mismo se siente muy bien estar construyendo una startup de IA
Al principio sufrimos con los límites de tokens, pero eso se resolvió; también se resolvió el problema de obtener salidas JSON consistentes; también los límites de velocidad y problemas de rendimiento de los grandes modelos de terceros; y también el deseo de reducir costos alojando nosotros mismos modelos open source para tareas pequeñas y de complejidad media
Con cada avance importante en los LLM, se siente como si el producto se volviera automáticamente más barato, más estable y más escalable. Claro que hay que enfocarse en construir defensas y diferenciarse en todo lo que “no es IA”
Creo que decir que es compatible con OpenAI puede prestarse un poco a malentendidos, porque hace esperar también llamadas a funciones o llamadas a herramientas
Está bien que tenga estructura de roles y contenido, pero eso de por sí era bastante simple de implementar. Cuando vas hacia agentes, necesitas ejecutar acciones reales. En el sistema de hosting de agentes que empecé, metí un motor de scripting, y por eso pensé que, después de resolver seguridad y permisos, quizá había que dejar que el agente simplemente ejecutara código. De hecho, así empecé
Por eso no estoy seguro de que las llamadas a funciones/herramientas sean estrictamente necesarias. Pero si mucha gente está estandarizando las llamadas a herramientas, quizá tenga que meterlo en mi framework aunque ya tenga ejecución de scripts arbitrarios
La llamada a funciones/selección de herramientas se maneja a nivel de aplicación y actualmente no hay un formato estándar. Incluso las implementaciones más usadas son, en la práctica, algo más cercano a prompts de sistema personalizados e ineficientes: https://github.com/langchain-ai/langchain/blob/master/libs/l...
En cualquier caso, quizá sea mejor no lanzar un soporte que no funciona
Como referencia, el script de instalación de Ollama en Linux funciona con el método “estándar” común en herramientas actuales:
curl https://ollama.ai/install.sh | shPero la última vez que lo revisé, este script pedía permisos de root mediante
sudo. Si quieres usar la herramienta, conviene descargar el script y revisarlo o modificarlo según tus necesidadeschmod +x ollama-linux-amd64) y ejecutarlo. No hicieron falta permisos de root[0] https://github.com/ollama/ollama/blob/main/docs/linux.md#man...
[1] https://ollama.ai/download/ollama-linux-amd64
ollamava en/usr/bin, lo cual no es estrictamente necesario, pero sí cómodo. No revisé qué más requiere acceso rootLa capa de compatibilidad también podría construirse dentro de una biblioteca. Por ejemplo,
llm()de LangChain puede funcionar con varios backends de LLM. Me da curiosidad cuál prefierenOtro problema es que si el mundo termina estandarizándose en bibliotecas pésimas como LangChain, el costo de mantenimiento de backends no uniformes matará a los jugadores que lleguen después y los dejará atados por mucho tiempo. Por eso, ahora una API uniforme parece la mejor opción por conveniencia
Aunque no sea perfecta, está bien tener una API estándar. Al mismo tiempo, también está bien tener una segunda API, como B2 de Backblaze, que permita aprovechar todo su potencial. No hay una forma única que encaje con todos los modelos, y si los modelos tienen capacidades distintas, creo que conviene ofrecer ambas opciones
Estoy creando un proyecto para poder intercambiar fácilmente modelos open source (HF, vía VLLM) y modelos comerciales (OpenAI, Google, Anthropic, Together) en Python: https://github.com/datadreamer-dev/DataDreamer
Si quieres usarlo directamente desde Python sin una API HTTP, es una forma un poco más sencilla
Me da curiosidad cuál es el caso de uso de Ollama. ¿Por qué no usar
llama.cppdirectamente?llama.cpp, que también trae un servidor integrado compatible con OpenAI, me pregunto exactamente qué ventaja ofrece