~/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не перенесено
stopoptions.stop
max_tokensoptions.num_predict
temperatureoptions.temperature
streamstream(не задано, поэтому значение по умолчанию исходного эндпоинта)

/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

Как пользоваться

  1. Вставьте тело запроса /v1/chat/completions или /api/chat либо ответ /api/chat, отправленный с stream, равным false.
  2. Оставьте направление автоматическим или выберите его сами, если инструмент не может определить, какую форму вы вставили.
  3. Скопируйте преобразованный 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 — это просто текст, который вы запускаете сами.

Похожие статьи

Похожие