在终端里聊天只是开胃菜。真要用起来,得在你自己的程序里调模型:后端接口里调,脚本里批量调,以后还要换成你自己训练的模型。
好在几乎所有本地推理工具都提供同一种接口: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:
ollama cp modelscope.cn/unsloth/Qwen3.5-0.8B-GGUF:Q4_K_M qwen3.5:0.8b你在那一节如果换过更大的尺寸,把下文出现的模型名换成 ollama ls 里实际的名字也一样。
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 数因模型和问题而异:
{
"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 是模型之前的回答。
模型本身不记得上一轮聊了什么,多轮对话要每次把历史按顺序带上。

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 |
| ③ 普通调用 | 一次读完整个响应,取出回答和用量 |
| ④ 流式调用 | 一行一行读,边收边打印,第四部分细讲 |
| ⑤ 出错处理 | 连不上、模型名写错时,给出能看懂的提示 |