Back to blog
    Ollama 的 OpenAI 相容 API:將微調模型直接嵌入任何 OpenAI 整合
    ollamaopenai-apilocal-modelintegrationfine-tuningsegment:vibecoder

    Ollama 的 OpenAI 相容 API:將微調模型直接嵌入任何 OpenAI 整合

    Ollama 提供 OpenAI 相容的 REST API。任何為 OpenAI SDK 編寫的代碼——Langchain、LlamaIndex、您自己的應用——只需更改一個 URL 即可使用您的微調本地模型。以下是您需要了解的。

    EErtas Team·

    Ollama 在 http://localhost:11434/v1 提供 OpenAI 相容的 REST API。這意味著每個與 OpenAI 整合的庫、框架和應用程式都可以通過單行更改指向您的本地微調模型。

    無需新的 SDK。無需 API 包裝代碼。只需更改 baseURL 和模型名稱。

    「OpenAI 相容」實際上意味著什麼

    Ollama 實現了 OpenAI Chat Completions API 格式:

    • POST /v1/chat/completions — 主要端點
    • 請求正文格式與 OpenAI 相同(model、messages、temperature、max_tokens、stream 等)
    • 回應格式相同(choices、message.content、usage 等)

    並非所有 OpenAI 功能都已實現。支援的功能:

    • Chat Completions(最重要的)
    • 通過 stream: true 的流式傳輸
    • 通過 POST /v1/embeddings 的嵌入(選定模型)
    • 通過 GET /v1/models 的模型列表

    不支援的功能:

    • 通過 API 進行微調(您可以在 Ertas 中進行)
    • 圖像生成
    • 語音/音頻 API
    • Assistants API(有狀態的線程/運行界面)
    • OpenAI 特定功能,如帶有嚴格架構的審核或 JSON 模式

    對於推理(絕大多數使用案例),相容性是完整的。

    一行遷移

    JavaScript / Node.js:

    // 之前(OpenAI 雲端)
    import OpenAI from 'openai';
    const client = new OpenAI({
      apiKey: process.env.OPENAI_API_KEY
    });
    
    // 之後(Ollama 本地模型)——一行更改
    import OpenAI from 'openai';
    const client = new OpenAI({
      baseURL: 'http://localhost:11434/v1',
      apiKey: 'ollama' // 必填欄位但 Ollama 不驗證
    });
    
    // 您的生成代碼保持不變
    const response = await client.chat.completions.create({
      model: 'your-fine-tuned-model', // 這改為您的 Ollama 模型名稱
      messages: [
        { role: 'user', content: 'Your prompt here' }
      ]
    });
    
    console.log(response.choices[0].message.content);

    Python:

    # 之前
    from openai import OpenAI
    client = OpenAI(api_key="sk-...")
    
    # 之後——一行更改
    from openai import OpenAI
    client = OpenAI(
        base_url="http://localhost:11434/v1",
        api_key="ollama"  # 不驗證
    )
    
    # 相同的生成代碼
    response = client.chat.completions.create(
        model="your-fine-tuned-model",
        messages=[{"role": "user", "content": "Your prompt"}]
    )
    print(response.choices[0].message.content)

    Curl:

    # 之前
    curl https://api.openai.com/v1/chat/completions \
      -H "Authorization: Bearer $OPENAI_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"model": "gpt-4o", "messages": [{"role": "user", "content": "Hello"}]}'
    
    # 之後——更改 URL 和模型
    curl http://localhost:11434/v1/chat/completions \
      -H "Authorization: Bearer ollama" \
      -H "Content-Type: application/json" \
      -d '{"model": "your-fine-tuned-model", "messages": [{"role": "user", "content": "Hello"}]}'

    立即可用的框架和庫

    因為 Ollama 與 OpenAI 相容,所有這些都可以在 baseURL 之外不進行任何代碼更改的情況下使用:

    框架 / 庫配置
    LangChain (JS/Python)ChatOpenAI({ baseUrl: "http://localhost:11434/v1" })
    LlamaIndexOpenAI(api_base="http://localhost:11434/v1")
    Vercel AI SDKcreateOpenAI({ baseURL: "http://localhost:11434/v1" })
    OpenAI Agents SDK設置 OPENAI_BASE_URL 環境變數
    Instructor傳入帶 Ollama baseURL 的 OpenAI 客戶端
    DSPylm = dspy.LM("ollama/your-model")
    Semantic Kernel帶自定義端點的 OpenAI 連接器
    Flowise帶基本路徑覆蓋的 OpenAI 節點
    n8nbaseURL 覆蓋的 OpenAI 節點

    大多數支援「帶自定義 base URL 的 OpenAI」的工具都能使用。大多數具有硬編碼 OpenAI URL 的工具不能使用。

    遠端 Ollama 伺服器

    當您的 Ollama 在 VPS(而非 localhost)上運行時,您需要暴露它:

    在 VPS 上:

    # 設置 OLLAMA_HOST 時,Ollama 默認監聽 0.0.0.0
    OLLAMA_HOST=0.0.0.0:11434 ollama serve

    安全說明: 永遠不要將 Ollama 的端口直接暴露到網路。在前面放置 Nginx,帶有基本身份驗證或 API 金鑰驗證:

    server {
        listen 443 ssl;
        server_name ollama.yourdomain.com;
    
        location /v1/ {
            # 簡單的 API 金鑰檢查
            if ($http_authorization != "Bearer your-secret-key") {
                return 401 '{"error": "Unauthorized"}';
            }
            proxy_pass http://localhost:11434/v1/;
        }
    }

    然後在您的代碼中:

    const client = new OpenAI({
      baseURL: 'https://ollama.yourdomain.com/v1',
      apiKey: 'your-secret-key'
    });

    這為您提供了一個完全安全、可遠端訪問的微調模型 API,與 OpenAI 相容。一次部署 Ollama 伺服器,從任何客戶端使用它。

    流式回應

    流式傳輸與 OpenAI 的工作方式完全相同:

    const stream = await client.chat.completions.create({
      model: 'your-fine-tuned-model',
      messages: [{ role: 'user', content: 'Generate a long document...' }],
      stream: true
    });
    
    for await (const chunk of stream) {
      process.stdout.write(chunk.choices[0]?.delta?.content ?? '');
    }

    對於 UI 應用程式(使用 Vercel AI SDK 的 Next.js,帶流式傳輸的 React):

    // Vercel AI SDK + Ollama
    import { createOpenAI } from '@ai-sdk/openai';
    import { streamText } from 'ai';
    
    const ollama = createOpenAI({
      baseURL: 'http://localhost:11434/v1',
      apiKey: 'ollama',
    });
    
    // 在您的 API 路由中
    const result = streamText({
      model: ollama('your-fine-tuned-model'),
      messages: [...],
    });
    
    return result.toDataStreamResponse();

    流式格式與 OpenAI 的相同,因此您現有的流式 UI 組件可以無更改地使用。


    Ship AI that runs on your users' devices.

    Ertas early bird pricing starts at $14.50/mo — locked in for life. Plans for builders and agencies.

    延伸閱讀

    Ship AI that runs on your users' devices.

    Early bird pricing starts at $14.50/mo — locked in for life. Plans for builders and agencies.

    Keep reading