~/tools / Lokalny LLM na własnym serwerze / Ollama OpenAI Converter

Ollama OpenAI Converter — Konwertuj żądania i odpowiedzi czatu między Ollama /api/chat a /v1/chat/completions

Przekonwertuj żądanie czatu między natywnym /api/chat Ollamy a zgodnym z OpenAI /v1/chat/completions, w obu kierunkach, oraz zamień odpowiedź z /api/chat na odpowiedź, którą zwraca /v1/chat/completions. Konwersja wzorowana jest na kodzie źródłowym Ollamy, a narzędzie wymienia każde pole, które zostaje przemianowane, pominięte lub nie ma odpowiednika. Nic nie opuszcza Twojej przeglądarki.

Kierunek

Odczytano jako: żądanie zgodne z OpenAI (/v1/chat/completions).

  • Ollama nie czyta tych pól i je pomija: tool_choice

curl

Wysyła do Ollamy na localhost:11434. Zmień adres, jeśli Ollama działa gdzie indziej.

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"]}}}]}'

Żądanie Ollamy /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"
          ]
        }
      }
    }
  ]
}

Przekonwertowane pola

ZDo
tool_choicenieprzeniesione
stopoptions.stop
max_tokensoptions.num_predict
temperatureoptions.temperature
streamstream(nie ustawiono, więc wartość domyślna oryginalnego punktu końcowego)

/api/chat domyślnie strumieniuje, a /v1/chat/completions nie. Przekonwertowane żądanie zawsze ustawia stream, aby zachowywało się jak oryginał.

API zgodne z OpenAI nie ma pola na długość kontekstu (num_ctx). Dokumentacja Ollamy sugeruje utworzenie modelu z PARAMETER num_ctx w pliku Modelfile i wywoływanie go pod tą nazwą.

Konwersja podąża za Ollamą v0.40.14. We wcześniejszych wersjach punkt końcowy zgodny z OpenAI ustawiał temperature i top_p na 1.0, gdy żądanie ich nie zawierało, a wywołania narzędzi komunikatu asystenta z pustą tablicą content były dołączane do poprzedniego komunikatu.

Konwersja na podstawie kodu źródłowego Ollamy (v0.40.14, openai/openai.go) i strony o zgodności z OpenAI, sprawdzona na Ollamie 0.40.11 dnia 2026-11-06. Ollama: zgodność z OpenAI

Wszystko dzieje się w Twojej przeglądarce. Narzędzie z niczym się nie łączy.

Ollama odpowiada na żądania czatu przez dwa punkty końcowe: natywny /api/chat oraz zgodny z OpenAI /v1/chat/completions. Ten drugi sam nie wykonuje żądań. W kodzie źródłowym Ollamy (openai/openai.go) każde żądanie jest najpierw zamieniane na żądanie /api/chat, a odpowiedź jest zamieniana z powrotem. To narzędzie wykonuje tę samą konwersję w Twojej przeglądarce. Wklej treść żądania lub odpowiedź, a narzędzie rozpozna, z czym ma do czynienia. Z postaci OpenAI do Ollamy: max_tokens staje się options.num_predict, pojedynczy ciąg stop staje się listą, temperature, top_p, seed i kary trafiają do options, response_format staje się format ("json" albo schemat z json_schema.schema), reasoning_effort staje się think (none staje się false, minimal staje się low, xhigh i ultra stają się max), argumenty wywołań narzędzi zmieniają się z ciągu JSON w obiekt, a komunikat narzędzia dostaje nazwę funkcji znalezioną po jego tool_call_id. Każda część tablicy content staje się osobnym komunikatem, a obrazy muszą być adresami data URL w base64 obrazów JPEG, PNG lub WebP; adresy URL obrazów są odrzucane. Pola, których nie ma w kodzie Ollamy, takie jak tool_choice, n, user, logit_bias i max_completion_tokens, są pomijane bez błędu. W naszym teście na Ollamie 0.40.11 żądanie z max_completion_tokens 3 nadal zwróciło długą odpowiedź, ponieważ Ollama czyta tylko max_tokens. W drugim kierunku options bez odpowiednika w OpenAI, takie jak num_ctx, top_k i min_p, są wymieniane zamiast zapisywane. W odpowiedzi done_reason staje się finish_reason (stop staje się tool_calls, gdy model wywołał narzędzie), prompt_eval_count i eval_count stają się usage, thinking staje się reasoning, a czasy trwania są pomijane. Ollama zapisuje id jako chatcmpl- i losową liczbę; narzędzie zapisuje chatcmpl-0. Konwersję sprawdziliśmy, wysyłając obie postaci każdego żądania do Ollamy 0.40.11 z polem diagnostycznym _debug_render_only, które zwraca prompt, jaki zobaczyłby model, i porównując oba prompty, a także porównując przekonwertowane odpowiedzi z prawdziwymi odpowiedziami /v1/chat/completions.

Główna logika tego narzędzia jest otwartoźródłowa, na licencji MIT. github.com/seigo5555/toolkitbox-lib/src/ollama-openai.ts

Zastosowania

  • Przenieść kod napisany dla OpenAI SDK na natywne API Ollamy lub w drugą stronę, bez zgadywania nazw pól
  • Dowiedzieć się, dlaczego pole wysyłane do /v1/chat/completions nie ma żadnego skutku
  • Zobaczyć, co otrzyma od Ollamy klient oczekujący odpowiedzi OpenAI

Jak używać

  1. Wklej treść żądania /v1/chat/completions lub /api/chat albo odpowiedź /api/chat wysłaną z stream ustawionym na false.
  2. Zostaw kierunek na automatyczny albo wybierz go sam, jeśli narzędzie nie potrafi rozpoznać, jaką postać wkleiłeś.
  3. Skopiuj przekonwertowany JSON lub polecenie curl i przeczytaj ostrzeżenia oraz tabelę przekonwertowanych pól.

FAQ

Dlaczego przekonwertowane żądanie zawsze ustawia stream?

/api/chat domyślnie strumieniuje, a /v1/chat/completions nie. Jeśli oryginalne żądanie nie ustawiało stream, przekonwertowane dostaje wartość domyślną oryginalnego punktu końcowego, aby oba zachowywały się tak samo.

Jak ustawić długość kontekstu przez API zgodne z OpenAI?

Nie ma na to pola. Dokumentacja Ollamy sugeruje utworzenie modelu z PARAMETER num_ctx w pliku Modelfile i wywoływanie API z nazwą tego modelu. Narzędzie wymienia options.num_ctx jako pole bez odpowiednika.

Pole jest oznaczone jako nieprzeniesione. Czy Ollama odrzuca żądanie?

Nie. Ollama nie czyta pól, których nie ma w jej kodzie, i je pomija. W naszym teście na Ollamie 0.40.11 żądanie z tool_choice, n, user, logit_bias i max_completion_tokens zostało przyjęte bez błędu, a max_completion_tokens nie ograniczyło długości odpowiedzi.

Co zmieniło się w Ollamie v0.40.14?

Przed v0.40.14 punkt końcowy zgodny z OpenAI ustawiał temperature i top_p na 1.0, gdy żądanie ich nie zawierało. Od v0.40.14 obowiązują własne wartości domyślne modelu, tak jak w /api/chat. Inaczej traktowany był też komunikat asystenta z pustą tablicą content i wywołaniami narzędzi: w naszym teście na 0.40.11 jego wywołania narzędzi były dołączane do poprzedniego komunikatu. Narzędzie podąża za v0.40.14.

Dlaczego nie mogę wkleić odpowiedzi OpenAI?

Ollama zamienia natywne odpowiedzi na postać OpenAI, nigdy odwrotnie, więc nie ma konwersji do skopiowania. Wklej zamiast tego odpowiedź z /api/chat.

Czy moje dane są gdzieś wysyłane?

Nie. Konwersja działa w Twojej przeglądarce. Polecenie curl to tylko tekst, który uruchamiasz sam.

Powiązane artykuły

Powiązane