ollama 的 api 接口

接入与开发

把 Ollama 本地服务的接口按用途分类列清,并给出原生调用与 OpenAI 兼容调用的常见写法与排错顺序。

本机 ollama serve 跑起来了,但除了在终端敲 ollama run,你还想用代码、curl 或现成客户端去调它,这时候最容易卡在两件事上:不知道有哪些接口、不知道请求体该长什么样。这篇按用途把接口分成几组,给一份能照着敲的调用清单,顺带说清哪些情况不该用它。

本机 ollama serve 跑起来了,但除了在终端敲 ollama run,你还想用代码、curl 或现成客户端去调它,这时候最容易卡在两件事上:不知道它到底暴露了哪些接口,以及请求体里那几个字段该写什么。把这两件事分开解决,先认路径再认 body,会顺很多。

这篇按用途把接口分成几组,给一份能照着敲的调用清单,顺带说清哪些情况下本地服务其实不该硬扛。文里不写死任何模型名、参数默认值和数字,凡是会随版本变的东西,都建议你到站内页面核对当时的实际情况。

先确认服务跑起来、端口在哪

调不通十次里有六次是服务压根没在你要的地址上监听。ollama serve 默认只绑本机回环地址,环境变量 OLLAMA_HOST 改的是监听这一层,而不是客户端要连的那一层,这两个概念混了就会一直连 localhost 连不上远程机。

  • 服务是否在跑:用进程列表或服务管理命令确认,别只看终端里上一次 run 有没有关掉;
  • 监听地址与端口:先看默认回环地址,确认没有被 OLLAMA_HOST 覆盖过;
  • 探活方式:挑一个不需要模型、只确认服务在的轻量请求,先排除网络层问题;
  • 远程访问:想从别的机器连,要显式把监听地址放开,同时想清楚谁能访问到这台机器;
  • 日志位置:不同系统上服务是常驻还是随命令拉起,日志落在哪,先找到它再排错

接口按用途分四组,先记分组再记路径

Ollama 的本地接口路径数量不多,但硬背容易混。按用途分成四组记,每组里再分「读」和「写」,回忆成本会低很多。具体路径拼写和字段名,建议到站内模型资料库里对着当时的文档核一遍,接口偶尔会增补。

分组典型用途关心什么
模型管理组列出本地已有模型、查看某个模型的详情参数返回里哪些字段能反映量化方式和上下文能力
生成组一次性返回的生成接口与逐块返回的对话接口请求体结构差别、stream 字段取值
嵌入组把文本转成向量输入是单条还是批量、返回维度怎么读
运维组拉取、删除、复制模型与命令行子命令的对应关系,别在脚本里重复实现

判断标准很简单:如果你要的是「把一段话变成结果」,看生成组;要的是「把一段话变成向量拿去检索」,看嵌入组;要的是「管理本地有哪些模型」,看管理和运维组。分错组会让请求体怎么改都不对。

三种常见调用方式与最小请求体

最小请求体的核心就几件事:用哪个模型、给什么输入、要不要流式。先用非流式把链路跑通,再改流式,能避免把读取代码的 bug 误判成服务问题。

  1. curl 先打一发带 Content-Type 发 JSON,body 里只填模型名和输入,stream 先设成关闭。看返回是不是一整段 JSON,能返回就说明服务和模型都认了。
  2. Python 再打一发用 requests 发同样的 body,把状态码和响应文本打出来。这一步只验证网络与序列化,不碰流式解析。
  3. 切到流式把 stream 打开,逐行读响应体并拼接,注意每块是独立 JSON 行而不是整体。读完再判断内容是否完整。
  4. 换 OpenAI 兼容路径如果你用的是现成的 OpenAI 客户端,base_url 要填到兼容层那一段,模型名填本地模型名。本地模型名和云端模型名不通用,别直接拿云端名字套。
# 非流式最小请求示意,把模型名和输入换成你自己的\ncurl http://127.0.0.1:11434/api/generate \\\n  -H 'Content-Type: application/json' \\\n  -d '{"model":"你的本地模型名","prompt":"说一句你好","stream":false}'

哪些情况不适用:如果你要的是多轮对话带会话状态、工具调用或结构化输出,原生生成接口能做的有限,得看兼容层或换客户端;如果只是本地脚本跑批处理,反而原生接口更省事,不必为了统一而套兼容层。

超时、并发与参数:本地服务最容易忽略的几项

本机推理吃的是显存和内存,不是网络带宽。并发上来之后,表现通常是延迟一路升高、请求排在队里,而不是直接报错,所以超时和并发要一起看。

  • 并发:同时发几个生成请求要自己压着数,超过机器承受量只是排队,不会给你明确报错;
  • 超时:连接超时和读取超时要分开设,长文本生成的读取超时要单独放大,否则会被截断;
  • 上下文:输入超出模型能力时的表现各版本不同,要么报错要么静默截断,先在小输入上验证再放大;
  • 输出长度:在请求参数里限制输出上限,比事后截字符串更省算力;
  • 采样参数:温度这类参数别全局写死,问答、摘要、抽取对它的需求不一样,分任务配

判断标准:如果单请求能通、并发上去就慢,是排队不是接口坏;如果单请求就超时,先查模型是否已经加载进内存,冷启动第一次本来就慢。

调不通时的排查顺序

按「连不上 → 连上但模型不在 → 模型在但字段不对 → 字段对但结果不对」这个顺序走,每一步只改一个变量,别跳步。跳步的结果是你以为修好了,其实只是换了个错。

  1. 分层定位先看是连接被拒、还是返回模型不存在、还是返回参数校验失败。三种错对应三个方向,不要混着改。
  2. 最小非流式复现关掉 stream,用最短输入复现一次。能通说明问题在流式读取代码,不通才继续查服务侧。
  3. curl 与代码对照同一台机器上各试一次。curl 通、代码不通就是环境和依赖问题;都不通就是服务或参数问题。
  4. 换端口换机器还失败就换端口或换一台机器再试,仍然失败时回头看服务日志,而不是继续调请求体。
下一步把接口调通只是第一步,本地模型和云端模型的成本、延迟、能力差异在不同任务上差很多,值得对着站内资料库和自己的场景比一遍再决定哪些请求留在本地。

常见问题

Ollama 的接口和 OpenAI 的接口是不是一套?

不是一套,但 Ollama 提供了 OpenAI 兼容路径,所以现成客户端大多能直连。原生路径请求体和响应字段自成一套,功能上更贴本地服务;兼容路径胜在生态通用。两者混用时,最容易出问题的就是 base_url 该不该带版本段,建议先各跑通一个最小请求再决定走哪条。

调用本地接口要不要配 API Key?

默认监听本机时通常不用。一旦把服务监听地址放开到局域网或公网,就不该再裸奔,前面要加一层鉴权或反向代理。判断标准很简单:只有你自己这台机器访问,可以省;任何其他人或另一台机器能访问,就必须补上。

本地接口响应慢,是接口写法有问题吗?

多数时候不是,是模型和硬件决定的。先看首字延迟和吐字速度分别多少,再判断是加载模型慢、还是生成慢、还是请求排队。如果同一模型在命令行里也慢,说明瓶颈在推理而不是接口调用层,优化方向应该放到模型规格、量化档位和并发控制上。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。