Ollama接口调用与流式输出示例

本文演示如何调用 ollama 的 `/api/generate`,对照单个 JSON 与 `application/x-ndjson` 两种返回,并检查错误响应。

完成后,你将掌握如何向自己的机器发送生成请求、区分普通与流式返回,以及检查错误响应。开始前,需要一个正在运行的 ollama 服务、终端里的 curl,以及至少一个本地可用模型。以下使用原生基址 http://localhost:11434/api;Ollama API 概览还列出 OpenAI 兼容基址 http://localhost:11434/v1,并说明 API 未严格版本化、但预期保持稳定和向后兼容,示例模型采用 llama3.2,请先确认本地确有该模型。

准备条件:确认 ollama 服务

文中的 localhost 代表实际运行服务的主机。如果从另一台电脑直接调用,需要按实际部署换成该主机的可达地址,不要把本地示例地址当成远程服务器地址。

Linux 环境中如果服务尚未运行,可以执行:

ollama serve

该命令启动本地服务;Ollama Linux 文档将其列为手动安装后的启动方式。

如果服务已经运行,可以跳过这一步。示例假定本地已有 llama3.2;如果模型列表中没有它,请换成实际可用的模型名称,其余请求字段保持不变。

操作步骤

  1. 发送普通响应请求。
curl http://localhost:11434/api/generate -d '{
  "model": "llama3.2",
  "prompt": "Why is the sky blue?",
  "stream": false
}'

按 Ollama API 文档,POST /api/generate 默认采用流式返回,而 stream:false 会改为单个响应对象;模型名采用 model:tag,省略 tag 时默认为 latest,options 可逐请求传递 temperature 等模型参数,keep_alive 控制请求结束后模型的内存保留时间且默认值为 5m,最终流式对象还包含统计信息。

  1. 发送流式请求。
curl http://localhost:11434/api/generate -d '{
  "model": "llama3.2",
  "prompt": "Why is the sky blue?"
}'

与上一条相比,这里只删除了 stream 字段;运行后继续执行下一节的内容类型和结束对象检查。

  1. 准备错误检查请求。
curl http://localhost:11434/api/generate -d '{
  "prompt": "Why is the sky blue?"
}'

这条请求故意省略 model,专门用于后面的参数错误检查,不要把它当作正常生成请求。

怎么确认成功

先在 HTTP 客户端中分别运行前两条完整请求。按照 Ollama 流式输出文档,设置 stream:false 后应取得 application/json 格式的单个响应对象;默认流式请求则返回 application/x-ndjson,每个换行分隔的对象都是一项响应。

普通响应可以作为一个完整 JSON 对象解析;流式响应则应逐行解析,不要把整段终端输出交给同一个 JSON 解析器。具体生成文字会随输入和模型变化,因此不要把某一句固定文本当成成功标准。

流式请求也不要收到第一项就立即结束读取。Ollama 用量文档说明,使用量字段位于 done 为 true 的最后一个 chunk;客户端应继续读取到这个结束对象,再关闭连接或完成本轮任务。

常见出错点

运行参数错误检查请求后,先看 HTTP 状态,再看正文结构。Ollama 错误文档说明,错误以 application/json 返回,消息位于 error 属性;如果错误发生在流已经开始后,正文会改为带 error 的 NDJSON 对象,已经发送的 HTTP 状态不会改变。

状态码 文档含义 处理重点
200 成功 继续检查正文类型;流式请求还要读取到结束对象
400 缺少参数或 JSON 无效 补齐 model,并检查引号、花括号和逗号
404 模型不存在 将示例名称换成本地实际存在的 model:tag
429 请求过多 根据 error 和当前错误文档判断是否重试,不套用未记录的固定次数
500 内部服务错误 根据错误消息和当前官方文档继续定位
502 网关错误 保留错误正文,并按当前错误文档检查对应服务状态

错误对象的结构如下,其中 YOUR_VALUE 代表服务端返回的具体错误消息:

{"error":"YOUR_VALUE"}

客户端应从 error 属性读取错误消息;使用流式返回时,还要在处理每一行内容前先检查该属性,不能只依赖 HTTP 状态码。

本文步骤根据正文所链接的官方文档整理,未在本站自有机器上运行;请按当前版本核对后再执行。

资料来源