~/tools / Menjalankan LLM lokal di server Anda / Ollama OpenAI Converter
Ollama OpenAI Converter — Ubah permintaan dan respons chat antara /api/chat Ollama dan /v1/chat/completions
Ubah permintaan chat antara /api/chat bawaan Ollama dan /v1/chat/completions yang kompatibel dengan OpenAI, ke kedua arah, dan ubah respons /api/chat menjadi respons yang dikembalikan /v1/chat/completions. Konversinya mengikuti kode sumber Ollama sendiri, dan alat ini mendaftar setiap field yang diganti namanya, dibuang, atau tidak punya padanan. Tidak ada yang keluar dari browser Anda.
Dibaca sebagai permintaan yang kompatibel dengan OpenAI (/v1/chat/completions).
- Ollama tidak membaca field ini dan membuangnya: tool_choice
curl
Dikirim ke Ollama di localhost:11434. Ubah alamatnya jika Ollama berjalan di tempat lain.
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"]}}}]}'Permintaan /api/chat Ollama
{
"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"
]
}
}
}
]
}Field yang dikonversi
| Dari | Menjadi |
|---|---|
| tool_choice | tidak dibawa |
| stop | options.stop |
| max_tokens | options.num_predict |
| temperature | options.temperature |
| stream | stream(tidak diatur, jadi memakai default dari endpoint asli) |
/api/chat melakukan streaming secara default dan /v1/chat/completions tidak. Permintaan hasil konversi selalu mengatur stream, supaya berperilaku seperti aslinya.
API yang kompatibel dengan OpenAI tidak punya field untuk panjang konteks (num_ctx). Dokumentasi Ollama menyarankan membuat model dengan PARAMETER num_ctx di sebuah Modelfile dan memanggilnya dengan nama itu.
Konversi mengikuti Ollama v0.40.14. Pada versi sebelumnya, endpoint yang kompatibel dengan OpenAI mengatur temperature dan top_p ke 1.0 ketika permintaan tidak mengirimkannya, dan pemanggilan tool dari pesan assistant dengan array content kosong dilampirkan ke pesan sebelumnya.
Konversi berasal dari kode sumber Ollama (v0.40.14, openai/openai.go) dan halaman kompatibilitas OpenAI, diperiksa pada Ollama 0.40.11 pada 2026-11-06. Ollama: kompatibilitas OpenAI
Semuanya dikerjakan di browser Anda. Alat ini tidak terhubung ke mana pun.
Ollama menjawab permintaan chat di dua endpoint: /api/chat bawaannya dan /v1/chat/completions yang kompatibel dengan OpenAI. Endpoint kedua tidak menjalankan permintaan sendiri. Dalam kode sumber Ollama (openai/openai.go), setiap permintaan pertama-tama diubah menjadi permintaan /api/chat, lalu jawabannya diubah kembali. Alat ini melakukan konversi yang sama di browser Anda. Tempel body permintaan atau sebuah respons, dan alat ini mendeteksi yang mana. Dari bentuk OpenAI ke Ollama: max_tokens menjadi options.num_predict, satu string stop menjadi daftar, temperature, top_p, seed, dan penalti pindah ke options, response_format menjadi format ("json", atau skema dari json_schema.schema), reasoning_effort menjadi think (none menjadi false, minimal menjadi low, xhigh dan ultra menjadi max), argumen pemanggilan tool berubah dari string JSON menjadi objek, dan pesan tool diberi nama fungsi yang dicari dari tool_call_id-nya. Setiap bagian dari array content menjadi pesan tersendiri, dan gambar harus berupa data URL base64 dari gambar JPEG, PNG, atau WebP; URL gambar ditolak. Field yang tidak ada di kode Ollama, seperti tool_choice, n, user, logit_bias, dan max_completion_tokens, dibuang tanpa error. Dalam uji kami pada Ollama 0.40.11, permintaan dengan max_completion_tokens 3 tetap mengembalikan jawaban yang panjang, karena Ollama hanya membaca max_tokens. Ke arah sebaliknya, options yang tidak punya padanan di OpenAI, seperti num_ctx, top_k, dan min_p, didaftar dan tidak ditulis. Untuk respons: done_reason menjadi finish_reason (stop menjadi tool_calls ketika model memanggil sebuah tool), prompt_eval_count dan eval_count menjadi usage, thinking menjadi reasoning, dan durasinya dibuang. Ollama menulis id sebagai chatcmpl- diikuti angka acak; alat ini menulis chatcmpl-0. Kami memeriksa konversinya dengan mengirim kedua bentuk dari setiap permintaan ke Ollama 0.40.11 dengan field debugging _debug_render_only, yang mengembalikan prompt yang akan dilihat model, lalu membandingkan kedua prompt itu, dan dengan membandingkan respons hasil konversi dengan jawaban asli dari /v1/chat/completions.
Logika utama alat ini bersifat sumber terbuka dengan lisensi MIT. github.com/seigo5555/toolkitbox-lib/src/ollama-openai.ts
Kapan dipakai
- Memindahkan kode yang ditulis untuk OpenAI SDK ke API bawaan Ollama, atau sebaliknya, tanpa menebak nama field
- Mencari tahu mengapa sebuah field yang Anda kirim ke /v1/chat/completions tidak berpengaruh
- Melihat apa yang akan diterima klien yang mengharapkan respons OpenAI dari Ollama
Cara pakai
- Tempel body permintaan /v1/chat/completions atau /api/chat, atau respons /api/chat yang dikirim dengan stream diatur ke false.
- Biarkan arah pada otomatis, atau pilih sendiri jika alat tidak bisa menentukan bentuk mana yang Anda tempel.
- Salin JSON hasil konversi atau perintah curl, lalu baca peringatan dan tabel field yang dikonversi.
Tanya jawab
Mengapa permintaan hasil konversi selalu mengatur stream?
/api/chat melakukan streaming secara default dan /v1/chat/completions tidak. Jika permintaan asli tidak mengatur stream, permintaan hasil konversi mendapat default dari endpoint aslinya, sehingga keduanya berperilaku sama.
Bagaimana cara mengatur panjang konteks lewat API yang kompatibel dengan OpenAI?
Tidak ada field untuk itu. Dokumentasi Ollama menyarankan membuat model dengan PARAMETER num_ctx di sebuah Modelfile dan memanggil API dengan nama model itu. Alat ini mendaftar options.num_ctx sebagai tidak punya padanan.
Sebuah field ditandai tidak dibawa. Apakah Ollama menolak permintaannya?
Tidak. Ollama tidak membaca field yang tidak ada di kodenya dan membuangnya. Dalam uji kami pada Ollama 0.40.11, permintaan dengan tool_choice, n, user, logit_bias, dan max_completion_tokens diterima tanpa error, dan max_completion_tokens tidak membatasi panjang jawaban.
Apa yang berubah di Ollama v0.40.14?
Sebelum v0.40.14, endpoint yang kompatibel dengan OpenAI mengatur temperature dan top_p ke 1.0 ketika permintaan tidak mengirimkannya. Mulai v0.40.14, default milik model sendiri yang berlaku, seperti pada /api/chat. Pesan assistant dengan array content kosong dan pemanggilan tool juga ditangani secara berbeda: dalam uji kami pada 0.40.11, pemanggilan tool-nya dilampirkan ke pesan sebelumnya. Alat ini mengikuti v0.40.14.
Mengapa saya tidak bisa menempel respons OpenAI?
Ollama mengubah respons bawaan ke bentuk OpenAI, tidak pernah sebaliknya, jadi tidak ada konversi yang bisa ditiru. Tempel respons /api/chat sebagai gantinya.
Apakah data saya dikirim ke suatu tempat?
Tidak. Konversi berjalan di browser Anda. Perintah curl hanyalah teks untuk Anda jalankan.
Artikel terkait
- Memanggil model lokal dari kode Anda: structured outputs dan API yang kompatibel dengan OpenAI di OllamaBatasi keluaran model lokal dengan JSON Schema dan panggil Ollama dari klien bergaya OpenAI: apa kata dokumentasi resmi, dan apa saja yang tidak didukung.
- Memantau memori Ollama di VPS kecilLihat apa yang disimpan Ollama di memori, berapa lama bertahan di sana, dan pengaturan apa yang mengubahnya: ollama ps, keep_alive, dan batasannya, dari FAQ resmi.
- Menghubungkan Dify ke Ollama di VPS Anda sendiriJalankan Dify di VPS Anda sendiri dan pakai Ollama sebagai modelnya: instalasi, kolom plugin, masalah alamat di Docker, dan embedding, dari dokumentasi resmi.