~/tools / Eseguire un LLM locale sul tuo server / Ollama OpenAI Converter

Ollama OpenAI Converter — Converti richieste e risposte di chat tra Ollama /api/chat e /v1/chat/completions

Converte una richiesta di chat tra il /api/chat nativo di Ollama e il suo /v1/chat/completions compatibile con OpenAI, in entrambe le direzioni, e trasforma una risposta di /api/chat nella risposta restituita da /v1/chat/completions. La conversione segue il codice sorgente di Ollama, e lo strumento elenca ogni campo che viene rinominato, scartato o privo di equivalente. Nulla lascia il tuo browser.

Direzione

Letto come una richiesta compatibile con OpenAI (/v1/chat/completions).

  • Ollama non legge questi campi e li scarta: tool_choice

curl

Invia a Ollama su localhost:11434. Cambia l'indirizzo se Ollama gira altrove.

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

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

Campi convertiti

DaA
tool_choicenon riportato
stopoptions.stop
max_tokensoptions.num_predict
temperatureoptions.temperature
streamstream(non impostato, quindi il valore predefinito dell'endpoint originale)

/api/chat trasmette in streaming per impostazione predefinita e /v1/chat/completions no. La richiesta convertita imposta sempre stream, così si comporta come l'originale.

L'API compatibile con OpenAI non ha alcun campo per la lunghezza del contesto (num_ctx). La documentazione di Ollama suggerisce di creare un modello con PARAMETER num_ctx in un Modelfile e di chiamarlo con quel nome.

La conversione segue Ollama v0.40.14. Nelle versioni precedenti, l'endpoint compatibile con OpenAI impostava temperature e top_p a 1.0 quando una richiesta non li inviava, e le chiamate a strumenti di un messaggio assistant con un array content vuoto venivano collegate al messaggio precedente.

Conversione dal codice sorgente di Ollama (v0.40.14, openai/openai.go) e dalla pagina di compatibilità con OpenAI, verificata con Ollama 0.40.11 il 2026-11-06. Ollama: compatibilità con OpenAI

Tutto avviene nel tuo browser. Lo strumento non si connette a nulla.

Ollama risponde alle richieste di chat su due endpoint: il /api/chat nativo e il /v1/chat/completions compatibile con OpenAI. Il secondo non esegue le richieste da solo. Nel codice sorgente di Ollama (openai/openai.go), ogni richiesta viene prima convertita in una richiesta /api/chat, e la risposta viene riconvertita. Questo strumento esegue la stessa conversione nel tuo browser. Incolla il corpo di una richiesta o una risposta, e rileva di quale si tratta. Dalla forma OpenAI a Ollama: max_tokens diventa options.num_predict, una singola stringa stop diventa un elenco, temperature, top_p, seed e le penalità passano in options, response_format diventa format ("json", oppure lo schema di json_schema.schema), reasoning_effort diventa think (none diventa false, minimal diventa low, xhigh e ultra diventano max), gli argomenti delle chiamate a strumenti passano da una stringa JSON a un oggetto, e un messaggio di strumento riceve il nome della funzione ricavato dal suo tool_call_id. Ogni parte di un array content diventa un messaggio a sé, e le immagini devono essere data URL in base64 di immagini JPEG, PNG o WebP; gli URL di immagini vengono rifiutati. I campi che non sono nel codice di Ollama, come tool_choice, n, user, logit_bias e max_completion_tokens, vengono scartati senza errore. Nel nostro test su Ollama 0.40.11, una richiesta con max_completion_tokens 3 ha comunque restituito una risposta lunga, perché Ollama legge solo max_tokens. Nella direzione opposta, le opzioni senza equivalente in OpenAI, come num_ctx, top_k e min_p, vengono elencate invece di essere scritte. Per una risposta, done_reason diventa finish_reason (stop diventa tool_calls quando il modello ha chiamato uno strumento), prompt_eval_count e eval_count diventano usage, thinking diventa reasoning, e le durate vengono scartate. Ollama scrive l'id come chatcmpl- seguito da un numero casuale; lo strumento scrive chatcmpl-0. Abbiamo verificato la conversione inviando entrambe le forme di ogni richiesta a Ollama 0.40.11 con il campo di debug _debug_render_only, che restituisce il prompt che il modello vedrebbe, e confrontando i due prompt, e confrontando le risposte convertite con le risposte reali di /v1/chat/completions.

La logica principale di questo strumento è open source, con licenza MIT. github.com/seigo5555/toolkitbox-lib/src/ollama-openai.ts

Casi d'uso

  • Portare codice scritto per l'SDK di OpenAI all'API nativa di Ollama, o il contrario, senza indovinare i nomi dei campi
  • Capire perché un campo che invii a /v1/chat/completions non ha effetto
  • Vedere cosa riceverà da Ollama un client che si aspetta risposte OpenAI

Utilizzo

  1. Incolla il corpo di una richiesta /v1/chat/completions o /api/chat, o una risposta /api/chat inviata con stream impostato a false.
  2. Lascia la direzione su automatica, oppure sceglila se lo strumento non riesce a capire quale forma hai incollato.
  3. Copia il JSON convertito o il comando curl, e leggi gli avvisi e la tabella dei campi convertiti.

FAQ

Perché la richiesta convertita imposta sempre stream?

/api/chat trasmette in streaming per impostazione predefinita e /v1/chat/completions no. Se la richiesta originale non impostava stream, quella convertita riceve il valore predefinito dell'endpoint originale, in modo che le due si comportino allo stesso modo.

Come imposto la lunghezza del contesto tramite l'API compatibile con OpenAI?

Non esiste un campo per questo. La documentazione di Ollama suggerisce di creare un modello con PARAMETER num_ctx in un Modelfile e di chiamare l'API con il nome di quel modello. Lo strumento elenca options.num_ctx come privo di equivalente.

Un campo è segnato come non riportato. Ollama rifiuta la richiesta?

No. Ollama non legge i campi che non sono nel suo codice e li scarta. Nel nostro test su Ollama 0.40.11, una richiesta con tool_choice, n, user, logit_bias e max_completion_tokens è stata accettata senza errore, e max_completion_tokens non ha limitato la lunghezza della risposta.

Cosa è cambiato in Ollama v0.40.14?

Prima della v0.40.14, l'endpoint compatibile con OpenAI impostava temperature e top_p a 1.0 quando una richiesta non li inviava. Dalla v0.40.14 valgono i valori predefiniti del modello stesso, come con /api/chat. Anche un messaggio assistant con un array content vuoto e chiamate a strumenti veniva gestito in modo diverso: nel nostro test su 0.40.11, le sue chiamate a strumenti venivano collegate al messaggio precedente. Lo strumento segue la v0.40.14.

Perché non posso incollare una risposta OpenAI?

Ollama converte le risposte native nella forma OpenAI, mai il contrario, quindi non c'è alcuna conversione da copiare. Incolla invece la risposta di /api/chat.

I miei dati vengono inviati da qualche parte?

No. La conversione viene eseguita nel tuo browser. Il comando curl è solo testo che esegui tu.

Articoli correlati

Correlati