OpenAI 兼容接口

3,185 字 · 预计阅读 9 分钟

在终端里聊天只是开胃菜。真要用起来,得在你自己的程序里调模型:后端接口里调,脚本里批量调,以后还要换成你自己训练的模型。

好在几乎所有本地推理工具都提供同一种接口:OpenAI 兼容接口(毕竟是开山始祖)

按这个约定写一次代码,后端从 Ollama 换成 LM Studio、vLLM,甚至换成云端 API,都可以只改配置,不改代码。

同一份调用代码通过兼容接口连接不同后端,切换时修改地址、密钥和模型配置

这一节用 Python、Node.js、Java、C# 四种语言,不装任何包,手写一遍调用:先普通调用,再流式输出,最后演示怎么切换后端。

看清楚底层到底在发什么,以后用 SDK 心里有底。


一、OpenAI 兼容协议


1. 其实就是一个 POST 请求

拆开看,它就是一个 HTTP 接口:

  • 地址:{base_url}/chat/completions
  • 方法:POST
  • 请求头:Content-Type: application/json,再加上 Authorization: Bearer 你的密钥
  • 请求体:一段 JSON,最少三个字段:model、messages、stream

先用 curl 直接调一次 Ollama。模型沿用「跑通 Ollama」那一节下载的 qwen3.5:0.8b;如果那一节是从魔搭拉的、又没做 ollama cp 起短名,先补上,否则下面会报 model 'qwen3.5:0.8b' not found:

bash
ollama cp modelscope.cn/unsloth/Qwen3.5-0.8B-GGUF:Q4_K_M qwen3.5:0.8b

你在那一节如果换过更大的尺寸,把下文出现的模型名换成 ollama ls 里实际的名字也一样。

bash
curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ollama" \
  -d '{
    "model": "qwen3.5:0.8b",
    "messages": [{"role": "user", "content": "用一句话介绍你自己"}],
    "stream": false
  }'

Windows 的 PowerShell 处理这种单引号里套 JSON 的写法容易出错,可以在 Git Bash 或 WSL 里跑,或者直接跳到第三部分写代码。

返回的 JSON 结构大致如下,只保留了关键字段,token 数因模型和问题而异:

json
{
  "model": "qwen3.5:0.8b",
  "choices": [
    {
      "index": 0,
      "message": { "role": "assistant", "content": "……模型的回答……" },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 15, "completion_tokens": 42, "total_tokens": 57 }
}

回答在 choices[0].message.content 里,这次用了多少 token 在 usage 里。

messages 是个数组,role 有三种:system 是给模型的设定,user 是用户说的话,assistant 是模型之前的回答。

模型本身不记得上一轮聊了什么,多轮对话要每次把历史按顺序带上。

每轮请求都要把历史对话和新问题一起放进 messages,模型才能接着聊


2. 各家的 base_url

后端 base_url api_key model 填什么
Ollama http://localhost:11434/v1 必须填,但不校验,随便写 ollama ls 里的名字,如 qwen3.5:0.8b
LM Studio http://localhost:1234/v1 默认不校验 LM Studio 里显示的模型标识
vLLM http://localhost:8000/v1 启动时设了 --api-key 才校验 启动时加载的模型名
llama.cpp server http://127.0.0.1:9931/v1 启动时设了 --api-key 才校验 通常就是加载的那一个模型
DeepSeek 官方 API https://api.deepseek.com 在 DeepSeek 开放平台申请 如 deepseek-flash
阿里云百炼(北京) https://dashscope.aliyuncs.com/compatible-mode/v1 在百炼控制台申请 如 qwen-plus

表里的端口和模型名都查自各家官方文档(截至 2026-11-01),它们会随版本变化。


二、准备环境

什么包都不装,只要电脑上有你那门语言的运行环境:

Python 3.9 或更高版本,只用标准库里的 urllib 和 json。新建一个 chat.py。

Windows 上把后面命令里的 python3 换成 python。

三个配置都从环境变量读,没设就用默认值,指向本机的 Ollama:

环境变量 默认值 作用
LLM_BASE_URL http://localhost:11434/v1 接口地址
LLM_API_KEY ollama 密钥
LLM_MODEL qwen3.5:0.8b 模型名

三、写代码:普通调用

整个程序就一个文件,分 5 段,四种语言的编号一一对应:

段 干什么
① 配置 从环境变量读地址、密钥、模型名
② 拼请求 组一段 JSON,POST 到 /chat/completions
③ 普通调用 一次读完整个响应,取出回答和用量
④ 流式调用 一行一行读,边收边打印,第四部分细讲
⑤ 出错处理 连不上、模型名写错时,给出能看懂的提示

本文是会员内容

全文 3,185 字,已试读约 29%。开通专业版可阅读全文,并解锁全部官方课程与后续更新。

开通专业版

支持 7 天无理由退款 · 早鸟价 99 元/年(售完恢复365/年)

课程中涉及的第三方项目,其著作权与商标归各自权利人所有;引用处的署名与许可见《开源与来源说明》。