~/tools / Локальная LLM на своём сервере / Ollama OpenAI Converter
Ollama OpenAI Converter — Преобразование запросов и ответов чата между Ollama /api/chat и /v1/chat/completions
Преобразуйте запрос чата между нативным /api/chat в Ollama и OpenAI-совместимым /v1/chat/completions в обе стороны, а ответ /api/chat превратите в ответ, который возвращает /v1/chat/completions. Преобразование следует исходному коду Ollama, а инструмент перечисляет каждое поле, которое переименовывается, отбрасывается или не имеет соответствия. Данные не покидают ваш браузер.
Распознано как: OpenAI-совместимый запрос (/v1/chat/completions).
- Ollama не читает эти поля и отбрасывает их: tool_choice
curl
Отправляет в Ollama на localhost:11434. Измените адрес, если Ollama работает в другом месте.
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"]}}}]}'Запрос 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"
]
}
}
}
]
}Преобразованные поля
| Откуда | Куда |
|---|---|
| tool_choice | не перенесено |
| stop | options.stop |
| max_tokens | options.num_predict |
| temperature | options.temperature |
| stream | stream(не задано, поэтому значение по умолчанию исходного эндпоинта) |
/api/chat по умолчанию передаёт ответ потоком, а /v1/chat/completions нет. Преобразованный запрос всегда задаёт stream, чтобы вести себя как исходный.
В OpenAI-совместимом API нет поля для длины контекста (num_ctx). Документация Ollama предлагает создать модель с PARAMETER num_ctx в Modelfile и вызывать её по этому имени.
Преобразование следует Ollama v0.40.14. В более ранних версиях OpenAI-совместимый эндпоинт задавал temperature и top_p равными 1.0, если запрос их не передавал, а вызовы инструментов сообщения ассистента с пустым массивом content присоединялись к предыдущему сообщению.
Преобразование по исходному коду Ollama (v0.40.14, openai/openai.go) и странице об OpenAI-совместимости, проверено на Ollama 0.40.11 2026-11-06. Ollama: совместимость с OpenAI
Всё выполняется в вашем браузере. Инструмент ни к чему не подключается.
Ollama отвечает на запросы чата через два эндпоинта: нативный /api/chat и OpenAI-совместимый /v1/chat/completions. Второй сам запросы не выполняет. В исходном коде Ollama (openai/openai.go) каждый запрос сначала преобразуется в запрос /api/chat, а ответ преобразуется обратно. Этот инструмент выполняет такое же преобразование в вашем браузере. Вставьте тело запроса или ответ, и инструмент определит, что это. Из формы OpenAI в Ollama: max_tokens становится options.num_predict, одиночная строка stop становится списком, temperature, top_p, seed и штрафы переходят в options, response_format становится format ("json" или схема из json_schema.schema), reasoning_effort становится think (none становится false, minimal становится low, xhigh и ultra становятся max), аргументы вызовов инструментов меняются со строки JSON на объект, а сообщение инструмента получает имя функции, найденное по его tool_call_id. Каждая часть массива content становится отдельным сообщением, а изображения должны быть data URL в base64 с изображениями JPEG, PNG или WebP; URL изображений отклоняются. Поля, которых нет в коде Ollama, такие как tool_choice, n, user, logit_bias и max_completion_tokens, отбрасываются без ошибки. В нашем тесте на Ollama 0.40.11 запрос с max_completion_tokens 3 всё равно вернул длинный ответ, потому что Ollama читает только max_tokens. В другую сторону options без соответствия в OpenAI, такие как num_ctx, top_k и min_p, перечисляются, а не записываются. В ответе done_reason становится finish_reason (stop становится tool_calls, если модель вызвала инструмент), prompt_eval_count и eval_count становятся usage, thinking становится reasoning, а длительности отбрасываются. Ollama записывает id как chatcmpl- и случайное число; инструмент записывает chatcmpl-0. Мы проверили преобразование, отправив обе формы каждого запроса в Ollama 0.40.11 с отладочным полем _debug_render_only, которое возвращает промпт, который увидела бы модель, и сравнив два промпта, а также сравнив преобразованные ответы с настоящими ответами /v1/chat/completions.
Основная логика этого инструмента открыта под лицензией MIT. github.com/seigo5555/toolkitbox-lib/src/ollama-openai.ts
Когда пригодится
- Перенести код, написанный для OpenAI SDK, на нативный API Ollama или наоборот, не угадывая имена полей
- Выяснить, почему поле, которое вы отправляете в /v1/chat/completions, ни на что не влияет
- Увидеть, что получит от Ollama клиент, ожидающий ответы OpenAI
Как пользоваться
- Вставьте тело запроса /v1/chat/completions или /api/chat либо ответ /api/chat, отправленный с stream, равным false.
- Оставьте направление автоматическим или выберите его сами, если инструмент не может определить, какую форму вы вставили.
- Скопируйте преобразованный JSON или команду curl и прочитайте предупреждения и таблицу преобразованных полей.
Вопросы
Почему преобразованный запрос всегда задаёт stream?
/api/chat по умолчанию передаёт ответ потоком, а /v1/chat/completions нет. Если исходный запрос не задавал stream, преобразованный получает значение по умолчанию исходного эндпоинта, чтобы оба вели себя одинаково.
Как задать длину контекста через OpenAI-совместимый API?
Для этого нет поля. Документация Ollama предлагает создать модель с PARAMETER num_ctx в Modelfile и вызывать API с именем этой модели. Инструмент перечисляет options.num_ctx как поле без соответствия.
Поле отмечено как не перенесённое. Отклоняет ли Ollama запрос?
Нет. Ollama не читает поля, которых нет в её коде, и отбрасывает их. В нашем тесте на Ollama 0.40.11 запрос с tool_choice, n, user, logit_bias и max_completion_tokens был принят без ошибки, а max_completion_tokens не ограничил длину ответа.
Что изменилось в Ollama v0.40.14?
До v0.40.14 OpenAI-совместимый эндпоинт задавал temperature и top_p равными 1.0, если запрос их не передавал. Начиная с v0.40.14 действуют собственные значения по умолчанию модели, как в /api/chat. Иначе обрабатывалось и сообщение ассистента с пустым массивом content и вызовами инструментов: в нашем тесте на 0.40.11 его вызовы инструментов присоединялись к предыдущему сообщению. Инструмент следует v0.40.14.
Почему нельзя вставить ответ OpenAI?
Ollama преобразует нативные ответы в форму OpenAI, но не наоборот, поэтому преобразования, которое можно было бы повторить, нет. Вставьте вместо этого ответ /api/chat.
Отправляются ли мои данные куда-либо?
Нет. Преобразование выполняется в вашем браузере. Команда curl — это просто текст, который вы запускаете сами.
Похожие статьи
- Вызов локальной модели из кода: структурированный вывод и OpenAI-совместимый API в OllamaОграничьте вывод локальной модели с помощью JSON Schema и обращайтесь к Ollama из клиентов в стиле OpenAI: что говорит официальная документация и что не поддерживается.
- Следим за памятью Ollama на небольшом VPSЧто Ollama держит в памяти, как долго и какие настройки это меняют: ollama ps, keep_alive и лимиты по официальному FAQ.
- Подключаем Dify к Ollama на собственном VPSЗапустите Dify на своём VPS и используйте Ollama как модель: установка, поля плагина, проблема адреса в Docker и эмбеддинги — по официальной документации.