~/tools / Ejecutar un LLM local en tu servidor / Ollama OpenAI Converter
Ollama OpenAI Converter — Convierte solicitudes y respuestas de chat entre Ollama /api/chat y /v1/chat/completions
Convierte una solicitud de chat entre el /api/chat nativo de Ollama y su /v1/chat/completions compatible con OpenAI, en cualquiera de los dos sentidos, y transforma una respuesta de /api/chat en la respuesta que devuelve /v1/chat/completions. La conversión sigue el código fuente de Ollama, y la herramienta enumera cada campo que se renombra, se descarta o no tiene equivalente. Nada sale de tu navegador.
Leído como una solicitud compatible con OpenAI (/v1/chat/completions).
- Ollama no lee estos campos y los descarta: tool_choice
curl
Se envía a Ollama en localhost:11434. Cambia la dirección si Ollama se ejecuta en otro sitio.
curl http://localhost:11434/api/chat -d '{"model":"qwen2.5:7b","messages":[{"role":"system","content":"Answer in one sentence."},{"role":"user","content":"What is the weather in Toronto?"},{"role":"assistant","content":"","tool_calls":[{"id":"call_1","function":{"name":"get_weather","arguments":{"city":"Toronto"}}}]},{"role":"tool","content":"11 degrees, cloudy","tool_name":"get_weather","tool_call_id":"call_1"}],"stream":false,"options":{"stop":["END"],"num_predict":200,"temperature":0.2},"tools":[{"type":"function","function":{"name":"get_weather","description":"Weather for a city","parameters":{"type":"object","properties":{"city":{"type":"string"}},"required":["city"]}}}]}'Solicitud de Ollama /api/chat
{
"model": "qwen2.5:7b",
"messages": [
{
"role": "system",
"content": "Answer in one sentence."
},
{
"role": "user",
"content": "What is the weather in Toronto?"
},
{
"role": "assistant",
"content": "",
"tool_calls": [
{
"id": "call_1",
"function": {
"name": "get_weather",
"arguments": {
"city": "Toronto"
}
}
}
]
},
{
"role": "tool",
"content": "11 degrees, cloudy",
"tool_name": "get_weather",
"tool_call_id": "call_1"
}
],
"stream": false,
"options": {
"stop": [
"END"
],
"num_predict": 200,
"temperature": 0.2
},
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Weather for a city",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string"
}
},
"required": [
"city"
]
}
}
}
]
}Campos convertidos
| De | A |
|---|---|
| tool_choice | no trasladado |
| stop | options.stop |
| max_tokens | options.num_predict |
| temperature | options.temperature |
| stream | stream(sin definir, por lo que se usa el valor por defecto del endpoint original) |
/api/chat transmite en streaming por defecto y /v1/chat/completions no. La solicitud convertida siempre define stream, para que se comporte como la original.
La API compatible con OpenAI no tiene ningún campo para la longitud del contexto (num_ctx). La documentación de Ollama sugiere crear un modelo con PARAMETER num_ctx en un Modelfile y llamarlo por ese nombre.
La conversión sigue Ollama v0.40.14. En versiones anteriores, el endpoint compatible con OpenAI fijaba temperature y top_p en 1.0 cuando una solicitud no los enviaba, y las llamadas a herramientas de un mensaje de assistant con un array content vacío se asociaban al mensaje anterior.
Conversión a partir del código fuente de Ollama (v0.40.14, openai/openai.go) y de la página de compatibilidad con OpenAI, comprobada con Ollama 0.40.11 el 2026-11-06. Ollama: compatibilidad con OpenAI
Todo se hace en tu navegador. La herramienta no se conecta a nada.
Ollama responde a las solicitudes de chat en dos endpoints: el /api/chat nativo y el /v1/chat/completions compatible con OpenAI. El segundo no ejecuta las solicitudes por sí mismo. En el código fuente de Ollama (openai/openai.go), cada solicitud se convierte primero en una solicitud de /api/chat y la respuesta se convierte de vuelta. Esta herramienta hace la misma conversión en tu navegador. Pega el cuerpo de una solicitud o una respuesta y detecta de cuál se trata. De la forma OpenAI a Ollama: max_tokens pasa a ser options.num_predict, una única cadena stop pasa a ser una lista, temperature, top_p, seed y las penalizaciones se mueven a options, response_format pasa a ser format ("json", o el esquema de json_schema.schema), reasoning_effort pasa a ser think (none pasa a ser false, minimal pasa a ser low, xhigh y ultra pasan a ser max), los argumentos de las llamadas a herramientas cambian de una cadena JSON a un objeto, y un mensaje de herramienta recibe el nombre de la función buscado a partir de su tool_call_id. Cada parte de un array content se convierte en un mensaje propio, y las imágenes deben ser URL de datos en base64 de imágenes JPEG, PNG o WebP; las URL de imagen se rechazan. Los campos que no están en el código de Ollama, como tool_choice, n, user, logit_bias y max_completion_tokens, se descartan sin error. En nuestra prueba con Ollama 0.40.11, una solicitud con max_completion_tokens 3 devolvió igualmente una respuesta larga, porque Ollama lee solo max_tokens. En el sentido contrario, las opciones sin equivalente en OpenAI, como num_ctx, top_k y min_p, se enumeran en lugar de escribirse. En una respuesta, done_reason pasa a ser finish_reason (stop pasa a ser tool_calls cuando el modelo llamó a una herramienta), prompt_eval_count y eval_count pasan a ser usage, thinking pasa a ser reasoning, y las duraciones se descartan. Ollama escribe el id como chatcmpl- seguido de un número aleatorio; la herramienta escribe chatcmpl-0. Comprobamos la conversión enviando las dos formas de cada solicitud a Ollama 0.40.11 con el campo de depuración _debug_render_only, que devuelve el prompt que vería el modelo, y comparando ambos prompts, y comparando las respuestas convertidas con las respuestas reales de /v1/chat/completions.
La lógica principal de esta herramienta es de código abierto, con licencia MIT. github.com/seigo5555/toolkitbox-lib/src/ollama-openai.ts
Casos de uso
- Pasar código escrito para el SDK de OpenAI a la API nativa de Ollama, o al revés, sin adivinar los nombres de los campos
- Averiguar por qué un campo que envías a /v1/chat/completions no tiene efecto
- Ver qué recibirá de Ollama un cliente que espera respuestas de OpenAI
Cómo usarlo
- Pega el cuerpo de una solicitud de /v1/chat/completions o /api/chat, o una respuesta de /api/chat enviada con stream en false.
- Deja el sentido en automático, o elígelo si la herramienta no distingue qué forma has pegado.
- Copia el JSON convertido o el comando curl, y lee los avisos y la tabla de campos convertidos.
FAQ
¿Por qué la solicitud convertida siempre define stream?
/api/chat transmite en streaming por defecto y /v1/chat/completions no. Si la solicitud original no definía stream, la convertida recibe el valor por defecto del endpoint original, de modo que ambas se comporten igual.
¿Cómo establezco la longitud del contexto con la API compatible con OpenAI?
No hay ningún campo para ello. La documentación de Ollama sugiere crear un modelo con PARAMETER num_ctx en un Modelfile y llamar a la API con el nombre de ese modelo. La herramienta indica options.num_ctx como sin equivalente.
Un campo aparece marcado como no trasladado. ¿Ollama rechaza la solicitud?
No. Ollama no lee los campos que no están en su código y los descarta. En nuestra prueba con Ollama 0.40.11, una solicitud con tool_choice, n, user, logit_bias y max_completion_tokens se aceptó sin error, y max_completion_tokens no limitó la longitud de la respuesta.
¿Qué cambió en Ollama v0.40.14?
Antes de v0.40.14, el endpoint compatible con OpenAI fijaba temperature y top_p en 1.0 cuando una solicitud no los enviaba. Desde v0.40.14 se aplican los valores por defecto del propio modelo, como en /api/chat. Un mensaje de assistant con un array content vacío y llamadas a herramientas también se trataba de otra manera: en nuestra prueba con 0.40.11, sus llamadas a herramientas se asociaban al mensaje anterior. La herramienta sigue v0.40.14.
¿Por qué no puedo pegar una respuesta de OpenAI?
Ollama convierte las respuestas nativas a la forma de OpenAI, nunca al revés, así que no hay ninguna conversión que copiar. Pega en su lugar la respuesta de /api/chat.
¿Se envían mis datos a algún sitio?
No. La conversión se ejecuta en tu navegador. El comando curl es solo texto para que lo ejecutes tú.
Artículos relacionados
- Llamar a un modelo local desde tu código: salidas estructuradas y la API compatible con OpenAI en OllamaLimita la salida de un modelo local con un JSON Schema y llama a Ollama desde clientes al estilo OpenAI: qué dice la documentación oficial y qué no se admite.
- Vigilar la memoria de Ollama en un VPS pequeñoMira qué mantiene Ollama en memoria, cuánto tiempo y qué ajustes lo cambian: ollama ps, keep_alive y los límites, según las preguntas frecuentes oficiales.
- Conectar Dify con Ollama en tu propio VPSEjecuta Dify en tu propio VPS y usa Ollama como su modelo: instalación, los campos del plugin, el problema de la dirección en Docker y los embeddings, según la documentación oficial.