ollama-js
Ollama 官方 JavaScript/TypeScript 客户端库,三行代码在网页中调用本地大
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
Ollama 官方 JavaScript/TypeScript 客户端库,三行代码在网页中调用本地大
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
图1:Ollama 官方品牌标识
想象这样一个场景:你是一名前端工程师,想要在浏览器里直接调用一个大语言模型的能力——但又不想把数据送到第三方服务器。两年前,这样的需求意味着你要么去找一个收费的 API,要么自己折腾复杂的模型部署。而 Ollama 的出现改变了一切。如今,有了 ollama/ollama-js,JavaScript 开发者只需要三行代码,就能在自己的应用里用上本地运行的大模型。
Ollama 最初是一个命令行工具,允许开发者在本地一键运行各种开源大模型(如 Llama 3、Phi、Mistral 等)。它的 REST API 设计得非常简洁,但这套接口原生面向 Python 开发者,对 JavaScript/TypeScript 生态并不友好。
ollama/ollama-js 正是在这个背景下诞生的——它是 Ollama 官方维护的 JavaScript/TypeScript 客户端库,旨在为前端和 Node.js 开发者提供「零学习成本」的集成体验。代码库由 Saul Boyd 主导开发,目前已被超过 4200 颗 GitHub stars 认可,成为 npm 上最流行的 Ollama 集成方案之一。
OLLAMA 的设计哲学是「一个 import,解决问题」。用过 Fetch API 的开发者会感到非常熟悉,因为底层通信就建立在 Fetch 之上:
import ollama from 'ollama'
const response = await ollama.chat({
model: 'llama3.1',
messages: [{ role: 'user', content: 'Why is the sky blue?' }],
})
console.log(response.message.content)
这就是完整的聊天调用——没有 SDK 初始化,没有复杂的配置对象。这种极简主义贯穿整个 API 设计:.chat()、.generate()、.embed()、.list()、.show()、.pull()……每个方法对应 Ollama REST API 的一个端点,参数名称也基本一一对应,学习曲线接近于零。
ollama-js 真正亮眼的设计在于「同构」(isomorphic)架构。它区分了两个入口:
import ollama from 'ollama' — 面向 Node.js 环境import ollama from 'ollama/browser' — 面向浏览器环境browser 入口会加载一个独立的 browser.ts 实现,内部不依赖 Node.js 的 fs、path 等模块,只保留 Fetch 通信能力。这意味着你可以在纯前端项目中直接使用 Ollama(配合本地运行的 Ollama 服务或 Ollama Cloud)。package.json 的 exports 字段精确配置了两个入口的类型定义文件(.d.ts),确保 TypeScript 用户在任何环境下都能获得完整的类型提示。
对于对话式应用,流式输出(streaming)是提升用户体验的关键。ollama-js 对流式的支持非常自然——只需在请求中加入 stream: true,返回值就从一个 Promise 变成一个 AsyncGenerator,可以逐 token 接收模型输出:
const response = await ollama.chat({
model: 'llama3.1',
messages: [{ role: 'user', content: 'Why is the sky blue?' }],
stream: true,
})
for await (const part of response) {
process.stdout.write(part.message.content)
}
这种方式比传统的轮询或 WebSocket 方案更简洁,代码逻辑也更接近 Python 的生成器模式。
ollama-js 并不只是一个聊天封装。它覆盖了 Ollama 的全部核心能力:
| 功能 | 方法 | 说明 |
|---|---|---|
| 对话 | .chat() | 支持多轮对话、工具调用、图片输入 |
| 生成 | .generate() | 自由文本生成,支持图片生成参数 |
| 嵌入 | .embed() | 生成向量嵌入 |
| 模型管理 | .list() / .show() / .pull() / .push() / .create() / .copy() / .delete() | 完整的模型生命周期管理 |
| 网络搜索 | .webSearch() | 需要 Ollama 账号和 API Key |
| Web 抓取 | .webFetch() | 获取网页内容 |
| 运行状态 | .ps() | 查看当前加载的模型 |
| 中断 | .abort() | 中断当前所有流式请求 |
特别值得关注的是 .chat() 中的 tools 参数——这使得 JavaScript 应用可以实现 Function Calling(函数调用)模式,让大模型主动触发本地函数,完成如查数据库、发 API 请求、读写文件等真实业务操作。
对于多模态模型(如 LLaVA),ollama-js 提供了优雅的图片输入支持。图片可以作为 Uint8Array、Buffer 或 base64 字符串传入,甚至可以直接传文件路径——encodeImage() 方法会自动检测并完成转换:
const response = await ollama.chat({
model: 'llava',
messages: [{
role: 'user',
content: '这张图片里有什么?',
images: ['/path/to/image.jpg'] // 自动 base64 编码
}]
})
这个设计让前端传入本地图片变得极为自然,无需手动处理文件读取和编码。
ollama-js 允许通过自定义 host 和 headers 指向 Ollama Cloud——一个托管了更大参数模型的云服务。通过 OLLAMA_API_KEY 环境变量配合 Authorization: Bearer header,即可无缝切换到云端模型:
const ollama = new Ollama({
host: 'https://ollama.com',
headers: { Authorization: 'Bearer ' + process.env.OLLAMA_API_KEY },
})
这种设计给了开发者灵活的选择:开发测试用本地模型,生产环境按需切换云端,无需修改业务代码。
从技术栈角度看,这个项目麻雀虽小,五脏俱全:
interfaces.ts)覆盖所有 API 参数.cjs)和 ESM(.mjs)双格式输出值得注意的是项目的依赖极度精简——生产依赖只有一个 whatwg-fetch,没有 lodash、没有 axios、没有其他运行时依赖。这使得安装包体积极小,对浏览器端应用非常友好。
ollama-js 并非银弹,有几点需要特别注意:
必须有 Ollama 服务运行:这是一个客户端库,不是服务端。它需要一个本地的 Ollama 守护进程(默认 localhost:11434),或者一个可访问的 Ollama 远程服务。
create() 暂不支持本地 Modelfile:Issue #191 记录了这个问题,通过 from 参数传入本地 Modelfile 路径会报错,这是当前版本的一个已知限制。
abort() 中断所有流:当前实现会中断客户端实例下的所有流式请求,而非单个请求。如果需要细粒度控制,建议每个流使用独立的 Ollama 客户端实例。
浏览器端的 CORS 问题:在浏览器中直接调用本地 Ollama 服务时,需要 Ollama 服务开启 CORS 支持(OLLAMA_ORIGINS="*")。
ollama-js 的存在,本质上是将大模型的部署权真正交给了开发者。随着 Llama 3、Qwen、Mistral 等开源模型的本地运行门槛不断降低,「数据不出本机」正在从一个理想变成一个工程上可落地的现实。
对于隐私敏感型企业应用、离线 AI 工具、嵌入式 AI 场景,ollama-js 提供了一条低门槛的集成路径。它不需要你懂 Docker、不需要你管理 GPU 服务器,只需要本地跑一个 Ollama,然后用熟悉的 JavaScript 把 AI 能力接进来。
随着 Ollama Cloud 的推出,这条路还从「纯本地」扩展到了「本地优先、云端扩展」的混合模式。可以说,ollama-js 代表的不仅是一个客户端库,而是一种 AI 集成的工程哲学——让 AI 能力像 npm 包一样被安装和使用。