Ollama Generate 端点
POST /api/generate 是 Ollama 最基础的推理端点:给一段提示词,返回续写结果。它没有对话概念,不维护多轮历史——需要对话请用 13.9 Ollama Chat 端点。
版本基线 v0.40.12,官方
docs.ollama.com/api/generate。
一、最小调用
curl http://localhost:11434/api/generate -d '{
"model": "gemma4",
"prompt": "Why is the sky blue?"
}'
返回:
{
"model": "gemma4",
"created_at": "2025-10-17T23:14:07.414671Z",
"response": "Hello! How can I help you today?",
"done": true,
"done_reason": "stop",
"total_duration": 174560334,
"load_duration": 101397084,
"prompt_eval_count": 11,
"prompt_eval_duration": 13074791,
"eval_count": 18,
"eval_duration": 52479709
}
注意这是默认关闭流式后的形态。默认 stream: true,会返回 NDJSON 流。
二、请求字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
model |
string | 是 | 模型名 |
prompt |
string | 要续写的文本 | |
suffix |
string | Fill-in-the-middle 模型用,出现在 prompt 之后、生成之前 | |
images |
string[] | base64 编码图片,需模型支持图像输入 | |
format |
string | object | "json" 或 JSON schema |
|
system |
string | 系统提示词 | |
stream |
boolean | 默认 true |
|
think |
boolean | string | 思考控制,取值见 /api/show |
|
raw |
boolean | true 时不套用任何提示词模板,直接喂给模型 |
|
keep_alive |
string | number | 模型驻留时长,0 表示用完即卸载 |
|
options |
object | 运行时参数(temperature、num_ctx 等) |
|
logprobs |
boolean | 是否返回输出 token 的对数概率 | |
top_logprobs |
integer | 每个位置返回多少个最可能的 token |
suffix 的用途
这是给 FIM(fill-in-the-middle)模型补中间内容用的。假设代码是 def foo(): <缺口> return x,把前文放 prompt、后文放 suffix,模型补中间。不搞代码补全的话用不到。
think 的取值规则
true:请求思考输出false:不要思考输出null:用模型默认- 字符串:模型自定义的档位名,必须与
/api/show返回的完全一致 - 不支持数字
三、响应字段
| 字段 | 说明 |
|---|---|
model |
模型名 |
created_at |
ISO 8601 时间戳 |
response |
生成的文本(流式时是增量片段) |
thinking |
思考输出(模型支持时才有) |
done |
是否结束 |
done_reason |
停止原因,常见 stop / length |
total_duration |
总耗时(纳秒) |
load_duration |
模型加载耗时(纳秒) |
prompt_eval_count |
输入 token 数 |
prompt_eval_cached_count |
命中缓存的输入 token 数 |
prompt_eval_duration |
评估未缓存输入的耗时(纳秒) |
eval_count |
输出 token 数 |
eval_duration |
生成 token 耗时(纳秒) |
logprobs |
开启时的对数概率信息 |
指标的详细用法见 13.4 Ollama API 用量。
四、三个实用场景
结构化输出
curl http://localhost:11434/api/generate -d '{
"model": "gemma4",
"prompt": "列出三种常见排序算法的名称和时间复杂度",
"format": {
"type": "object",
"properties": {
"algorithms": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {"type": "string"},
"complexity": {"type": "string"}
},
"required": ["name", "complexity"]
}
}
},
"required": ["algorithms"]
},
"stream": false
}'
format 传 schema 后,response 里就是符合该结构的 JSON 字符串。
控制上下文长度
curl http://localhost:11434/api/generate -d '{
"model": "gemma4",
"prompt": "长文本分析……",
"options": { "num_ctx": 16384 }
}'
用完立刻释放显存
curl http://localhost:11434/api/generate -d '{
"model": "gemma4",
"prompt": "hi",
"keep_alive": 0
}'
五、和 /api/chat 怎么选
| 维度 | /api/generate |
/api/chat |
|---|---|---|
| 输入 | 单个 prompt 字符串 |
messages 数组 |
| 多轮对话 | 不支持(要自己拼历史) | 原生支持 |
| 适合 | 单次生成、补全、结构化抽取 | 对话、代理、工具调用 |
| 工具调用 | 无 | 支持 tools |
简单判断:需要记住上下文的,一律用 chat。用 generate 自己拼历史容易出模板错误。
常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
| 返回一堆行而非一个 JSON | 默认流式 | 加 "stream": false |
response 是空的 |
prompt 为空,或 raw: true 下模型无法续写 |
检查输入 |
format 输出不合法 JSON |
模型能力不足 | 换更强模型,或降级到 "json" |
| 输出被截断 | 达到 token 上限 | 调大 options.num_predict |
| 显存爆了 | num_ctx 太大 |
调小 |
动手试
## ① 非流式,看完整结构
curl -s http://localhost:11434/api/generate -d '{"model":"gemma4","prompt":"hi","stream":false}' | python -m json.tool
## ② 流式,看 NDJSON 形态
curl http://localhost:11434/api/generate -d '{"model":"gemma4","prompt":"数到5"}'
两次对比,就明白 stream 到底改了什么。