~/tools / Chạy LLM cục bộ trên máy chủ của bạn / Ollama OpenAI Converter
Ollama OpenAI Converter — Chuyển yêu cầu và phản hồi chat giữa /api/chat của Ollama và /v1/chat/completions
Chuyển một yêu cầu chat giữa /api/chat gốc của Ollama và /v1/chat/completions tương thích OpenAI, theo cả hai chiều, và biến phản hồi của /api/chat thành phản hồi mà /v1/chat/completions trả về. Việc chuyển đổi theo đúng mã nguồn của Ollama, và công cụ liệt kê mọi trường bị đổi tên, bị bỏ hoặc không có tương ứng. Không có gì rời khỏi trình duyệt của bạn.
Đã đọc là một yêu cầu tương thích OpenAI (/v1/chat/completions).
- Ollama không đọc các trường này và bỏ chúng đi: tool_choice
curl
Gửi đến Ollama tại localhost:11434. Hãy đổi địa chỉ nếu Ollama chạy ở nơi khác.
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"]}}}]}'Yêu cầu /api/chat của 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"
]
}
}
}
]
}Các trường đã chuyển đổi
| Từ | Thành |
|---|---|
| tool_choice | không được chuyển sang |
| stop | options.stop |
| max_tokens | options.num_predict |
| temperature | options.temperature |
| stream | stream(không đặt, nên dùng giá trị mặc định của endpoint gốc) |
/api/chat truyền luồng theo mặc định còn /v1/chat/completions thì không. Yêu cầu đã chuyển đổi luôn đặt stream, để nó hoạt động giống yêu cầu gốc.
API tương thích OpenAI không có trường cho độ dài ngữ cảnh (num_ctx). Tài liệu của Ollama gợi ý tạo một mô hình với PARAMETER num_ctx trong một Modelfile và gọi nó bằng tên đó.
Việc chuyển đổi theo Ollama v0.40.14. Ở các phiên bản trước, endpoint tương thích OpenAI đặt temperature và top_p bằng 1.0 khi một yêu cầu không gửi chúng, và các lệnh gọi công cụ của một thông điệp assistant có mảng content rỗng bị gắn vào thông điệp trước đó.
Việc chuyển đổi theo mã nguồn của Ollama (v0.40.14, openai/openai.go) và trang tương thích OpenAI, được kiểm tra với Ollama 0.40.11 vào 2026-11-06. Ollama: tương thích OpenAI
Mọi thứ được thực hiện trong trình duyệt của bạn. Công cụ không kết nối tới đâu cả.
Ollama trả lời các yêu cầu chat trên hai endpoint: /api/chat gốc và /v1/chat/completions tương thích OpenAI. Endpoint thứ hai không tự chạy yêu cầu. Trong mã nguồn của Ollama (openai/openai.go), mỗi yêu cầu trước hết được chuyển thành một yêu cầu /api/chat, rồi câu trả lời được chuyển ngược lại. Công cụ này thực hiện đúng phép chuyển đổi đó ngay trong trình duyệt của bạn. Hãy dán thân yêu cầu hoặc một phản hồi, và công cụ sẽ nhận ra đó là loại nào. Từ dạng OpenAI sang Ollama: max_tokens trở thành options.num_predict, một chuỗi stop đơn lẻ trở thành danh sách, temperature, top_p, seed và các hình phạt chuyển vào options, response_format trở thành format ("json", hoặc schema lấy từ json_schema.schema), reasoning_effort trở thành think (none thành false, minimal thành low, xhigh và ultra thành max), các đối số của lệnh gọi công cụ đổi từ chuỗi JSON thành đối tượng, và một thông điệp tool được gắn tên hàm tra cứu từ tool_call_id của nó. Mỗi phần của mảng content trở thành một thông điệp riêng, và hình ảnh phải là data URL base64 của ảnh JPEG, PNG hoặc WebP; URL của ảnh bị từ chối. Các trường không có trong mã của Ollama, như tool_choice, n, user, logit_bias và max_completion_tokens, bị bỏ mà không báo lỗi. Trong thử nghiệm của chúng tôi trên Ollama 0.40.11, một yêu cầu với max_completion_tokens bằng 3 vẫn trả về câu trả lời dài, vì Ollama chỉ đọc max_tokens. Theo chiều ngược lại, các options không có tương ứng bên OpenAI, như num_ctx, top_k và min_p, được liệt kê thay vì được ghi ra. Với phản hồi: done_reason trở thành finish_reason (stop thành tool_calls khi mô hình đã gọi một công cụ), prompt_eval_count và eval_count trở thành usage, thinking trở thành reasoning, và các thời lượng bị bỏ. Ollama ghi id là chatcmpl- theo sau bởi một số ngẫu nhiên; công cụ ghi chatcmpl-0. Chúng tôi đã kiểm tra phép chuyển đổi bằng cách gửi cả hai dạng của mỗi yêu cầu đến Ollama 0.40.11 cùng trường gỡ lỗi _debug_render_only, trường này trả về prompt mà mô hình sẽ thấy, rồi so sánh hai prompt đó, và bằng cách so sánh các phản hồi đã chuyển đổi với câu trả lời thật của /v1/chat/completions.
Phần xử lý chính của công cụ này là mã nguồn mở theo giấy phép MIT. github.com/seigo5555/toolkitbox-lib/src/ollama-openai.ts
Trường hợp dùng
- Chuyển mã viết cho OpenAI SDK sang API gốc của Ollama, hoặc ngược lại, mà không phải đoán tên trường
- Tìm hiểu vì sao một trường bạn gửi tới /v1/chat/completions không có tác dụng
- Xem một client mong đợi phản hồi kiểu OpenAI sẽ nhận được gì từ Ollama
Cách dùng
- Dán thân yêu cầu /v1/chat/completions hoặc /api/chat, hoặc một phản hồi /api/chat được gửi với stream đặt là false.
- Để chiều ở chế độ tự động, hoặc tự chọn nếu công cụ không nhận ra bạn đã dán dạng nào.
- Sao chép JSON đã chuyển đổi hoặc lệnh curl, rồi đọc các cảnh báo và bảng các trường đã chuyển đổi.
Hỏi đáp
Vì sao yêu cầu đã chuyển đổi luôn đặt stream?
/api/chat truyền luồng theo mặc định còn /v1/chat/completions thì không. Nếu yêu cầu gốc không đặt stream, yêu cầu đã chuyển đổi sẽ nhận giá trị mặc định của endpoint gốc, để cả hai hoạt động giống nhau.
Làm sao đặt độ dài ngữ cảnh qua API tương thích OpenAI?
Không có trường nào cho việc đó. Tài liệu của Ollama gợi ý tạo một mô hình với PARAMETER num_ctx trong một Modelfile và gọi API bằng tên mô hình đó. Công cụ liệt kê options.num_ctx là không có tương ứng.
Một trường được đánh dấu là không được chuyển sang. Ollama có từ chối yêu cầu không?
Không. Ollama không đọc các trường không có trong mã của nó và bỏ chúng đi. Trong thử nghiệm của chúng tôi trên Ollama 0.40.11, một yêu cầu có tool_choice, n, user, logit_bias và max_completion_tokens được chấp nhận mà không có lỗi, và max_completion_tokens không giới hạn độ dài của câu trả lời.
Ollama v0.40.14 đã thay đổi điều gì?
Trước v0.40.14, endpoint tương thích OpenAI đặt temperature và top_p bằng 1.0 khi một yêu cầu không gửi chúng. Từ v0.40.14, các giá trị mặc định của chính mô hình được áp dụng, như với /api/chat. Một thông điệp assistant có mảng content rỗng và có lệnh gọi công cụ cũng được xử lý khác đi: trong thử nghiệm của chúng tôi trên 0.40.11, các lệnh gọi công cụ của nó bị gắn vào thông điệp trước đó. Công cụ này theo v0.40.14.
Vì sao tôi không thể dán một phản hồi của OpenAI?
Ollama chuyển các phản hồi gốc sang dạng OpenAI, không bao giờ làm ngược lại, nên không có phép chuyển đổi nào để sao chép. Hãy dán phản hồi của /api/chat.
Dữ liệu của tôi có được gửi đi đâu không?
Không. Việc chuyển đổi chạy trong trình duyệt của bạn. Lệnh curl chỉ là văn bản để bạn tự chạy.
Bài viết liên quan
- Gọi mô hình cục bộ từ mã của bạn: structured outputs và API tương thích OpenAI trong OllamaRàng buộc đầu ra của mô hình cục bộ bằng JSON Schema và gọi Ollama từ các client kiểu OpenAI: tài liệu chính thức nói gì và điều gì không được hỗ trợ.
- Theo dõi bộ nhớ của Ollama trên VPS nhỏXem Ollama giữ gì trong bộ nhớ, giữ bao lâu và thiết lập nào thay đổi điều đó: ollama ps, keep_alive và các giới hạn, theo FAQ chính thức.
- Kết nối Dify với Ollama trên VPS của riêng bạnChạy Dify trên VPS của riêng bạn và dùng Ollama làm mô hình: cài đặt, các trường của plugin, vấn đề địa chỉ trong Docker và embedding, theo tài liệu chính thức.