Skip to content

OpenAI 兼容性

Ollama 提供了与 OpenAI API 兼容的接口,让您可以轻松地将现有的 OpenAI 应用迁移到 Ollama,或者使用熟悉的 OpenAI SDK 来访问本地模型。

基础配置

API 端点

Ollama 的 OpenAI 兼容端点:

http://localhost:11434/v1

认证

Ollama 本地运行时不需要 API 密钥,但为了兼容性,您可以设置任意值:

bash
export OPENAI_API_KEY="ollama"
export OPENAI_BASE_URL="http://localhost:11434/v1"

支持的端点

Chat Completions

与 OpenAI 的 /v1/chat/completions 端点兼容。

http
POST /v1/chat/completions

请求示例:

json
{
  "model": "gemma3",
  "messages": [
    {
      "role": "system",
      "content": "你是一个有用的助手。"
    },
    {
      "role": "user",
      "content": "解释什么是机器学习"
    }
  ],
  "temperature": 0.7,
  "max_tokens": 1000,
  "stream": false
}

Completions

与 OpenAI 的 /v1/completions 端点兼容。

http
POST /v1/completions

请求示例:

json
{
  "model": "gemma3",
  "prompt": "人工智能的未来发展趋势是",
  "max_tokens": 500,
  "temperature": 0.8
}

Models

列出可用的模型。

http
GET /v1/models

客户端库使用

Python (OpenAI SDK)

安装 OpenAI Python 库:

bash
pip install openai

基本使用:

python
from openai import OpenAI

# 配置客户端
client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama"  # 任意值
)

# 聊天完成
response = client.chat.completions.create(
    model="gemma3",
    messages=[
        {"role": "system", "content": "你是一个编程助手。"},
        {"role": "user", "content": "如何用 Python 读取 CSV 文件?"}
    ],
    temperature=0.7,
    max_tokens=1000
)

print(response.choices[0].message.content)

流式响应:

python
stream = client.chat.completions.create(
    model="gemma3",
    messages=[
        {"role": "user", "content": "写一首关于春天的诗"}
    ],
    stream=True
)

for chunk in stream:
    if chunk.choices[0].delta.content is not None:
        print(chunk.choices[0].delta.content, end="")

文本完成:

python
response = client.completions.create(
    model="gemma3",
    prompt="人工智能的三个主要应用领域是:",
    max_tokens=200,
    temperature=0.5
)

print(response.choices[0].text)

JavaScript/Node.js

安装 OpenAI JavaScript 库:

bash
npm install openai

基本使用:

javascript
import OpenAI from 'openai';

const openai = new OpenAI({
  baseURL: 'http://localhost:11434/v1',
  apiKey: 'ollama' // 任意值
});

async function main() {
  const completion = await openai.chat.completions.create({
    messages: [
      { role: 'system', content: '你是一个有用的助手。' },
      { role: 'user', content: '解释什么是深度学习' }
    ],
    model: 'gemma3',
    temperature: 0.7,
    max_tokens: 1000
  });

  console.log(completion.choices[0].message.content);
}

main();

流式响应:

javascript
async function streamExample() {
  const stream = await openai.chat.completions.create({
    model: 'gemma3',
    messages: [{ role: 'user', content: '讲一个有趣的故事' }],
    stream: true,
  });

  for await (const chunk of stream) {
    process.stdout.write(chunk.choices[0]?.delta?.content || '');
  }
}

cURL 示例

聊天完成:

bash
curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ollama" \
  -d '{
    "model": "gemma3",
    "messages": [
      {
        "role": "system",
        "content": "你是一个有用的助手。"
      },
      {
        "role": "user",
        "content": "什么是量子计算?"
      }
    ],
    "temperature": 0.7
  }'

流式响应:

bash
curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ollama" \
  -d '{
    "model": "gemma3",
    "messages": [
      {
        "role": "user",
        "content": "写一个 Python 函数来计算斐波那契数列"
      }
    ],
    "stream": true
  }'

参数映射

支持的参数

OpenAI 参数Ollama 支持说明
model模型名称
messages聊天消息数组
prompt文本提示(completions 端点)
temperature温度参数 (0.0-2.0)
max_tokens最大令牌数
top_pTop-p 采样
stream流式响应
stop停止词
presence_penalty不支持
frequency_penalty不支持
logit_bias不支持
user不支持

参数转换

Ollama 会自动将 OpenAI 参数转换为内部参数:

json
{
  "temperature": 0.7,     // → temperature
  "max_tokens": 1000,     // → num_predict
  "top_p": 0.9,          // → top_p
  "stop": ["<|end|>"]    // → stop
}

模型映射

可用模型

您可以使用 Ollama 中的任何模型:

bash
# 列出可用模型
curl http://localhost:11434/v1/models

响应示例:

json
{
  "object": "list",
  "data": [
    {
      "id": "gemma3",
      "object": "model",
      "created": 1699564800,
      "owned_by": "ollama"
    },
    {
      "id": "qwen3",
      "object": "model",
      "created": 1699564800,
      "owned_by": "ollama"
    }
  ]
}

迁移指南

从 OpenAI 迁移

  1. 更新基础 URL:
python
# 原来
client = OpenAI(api_key="your-openai-key")

# 现在
client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama"
)
  1. 更新模型名称:
python
# 原来
model="gpt-3.5-turbo"

# 现在
model="gemma3"
  1. 调整参数:
python
# 某些 OpenAI 特有参数需要移除
response = client.chat.completions.create(
    model="gemma3",
    messages=messages,
    temperature=0.7,
    max_tokens=1000,
    # presence_penalty=0.1,  # 移除不支持的参数
    # frequency_penalty=0.1  # 移除不支持的参数
)

环境变量配置

创建 .env 文件:

bash
OPENAI_API_KEY=ollama
OPENAI_BASE_URL=http://localhost:11434/v1

在代码中使用:

python
import os
from openai import OpenAI

client = OpenAI(
    base_url=os.getenv("OPENAI_BASE_URL"),
    api_key=os.getenv("OPENAI_API_KEY")
)

高级用法

自定义系统提示

python
def create_assistant(system_prompt, model="gemma3"):
    def chat(user_message):
        response = client.chat.completions.create(
            model=model,
            messages=[
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": user_message}
            ]
        )
        return response.choices[0].message.content
    return chat

# 创建编程助手
code_assistant = create_assistant(
    "你是一个专业的编程助手,请提供清晰的代码示例。"
)

result = code_assistant("如何用 Python 连接数据库?")
print(result)

批量处理

python
def batch_process(prompts, model="gemma3"):
    results = []
    for prompt in prompts:
        response = client.chat.completions.create(
            model=model,
            messages=[{"role": "user", "content": prompt}],
            temperature=0.3
        )
        results.append(response.choices[0].message.content)
    return results

prompts = [
    "解释机器学习",
    "什么是深度学习",
    "人工智能的应用"
]

results = batch_process(prompts)
for i, result in enumerate(results):
    print(f"问题 {i+1}: {result}\n")

函数调用模拟

虽然 Ollama 不直接支持 OpenAI 的函数调用,但可以通过提示工程实现类似功能:

python
def simulate_function_calling(user_query, available_functions):
    system_prompt = f"""
你是一个助手,可以调用以下函数:
{available_functions}

请根据用户查询决定是否需要调用函数,如果需要,请返回 JSON 格式的函数调用。
"""
    
    response = client.chat.completions.create(
        model="gemma3",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_query}
        ]
    )
    
    return response.choices[0].message.content

functions = """
- get_weather(location): 获取指定位置的天气
- calculate(expression): 计算数学表达式
- search_web(query): 搜索网络信息
"""

result = simulate_function_calling("北京今天天气怎么样?", functions)
print(result)

性能优化

连接池

python
import httpx
from openai import OpenAI

# 使用自定义 HTTP 客户端
http_client = httpx.Client(
    limits=httpx.Limits(max_connections=10, max_keepalive_connections=5)
)

client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama",
    http_client=http_client
)

异步处理

python
import asyncio
from openai import AsyncOpenAI

async_client = AsyncOpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama"
)

async def async_chat(message):
    response = await async_client.chat.completions.create(
        model="gemma3",
        messages=[{"role": "user", "content": message}]
    )
    return response.choices[0].message.content

async def main():
    tasks = [
        async_chat("什么是 AI?"),
        async_chat("什么是 ML?"),
        async_chat("什么是 DL?")
    ]
    results = await asyncio.gather(*tasks)
    for result in results:
        print(result)

asyncio.run(main())

故障排除

常见问题

问题: 连接被拒绝

Connection refused

解决方案: 确保 Ollama 服务器正在运行:

bash
ollama serve

问题: 模型未找到

Model not found

解决方案: 确保模型已下载:

bash
ollama pull gemma3

问题: 参数不支持

Invalid parameter

解决方案: 移除 Ollama 不支持的 OpenAI 特有参数

调试技巧

启用详细日志:

python
import logging
logging.basicConfig(level=logging.DEBUG)

# 或者使用 httpx 的调试
import httpx
http_client = httpx.Client(event_hooks={'request': [print], 'response': [print]})

更多资源


通过 OpenAI 兼容接口,您可以无缝地将现有应用迁移到 Ollama,享受本地部署的优势同时保持熟悉的开发体验。

让大语言模型触手可及 - Get up and running with large language models