Ollama APIは、手元で動くLLMを「HTTPで叩ける部品」に変えるためのREST APIだ。 Ollamaで ollama run を覚えると、多くの人が次にぶつかるのが「ターミナルで対話できるのは分かった。で、これを自分のアプリやスクリプトからどう呼ぶのか?」という壁である。答えがOllama APIだ。Ollamaはモデルを起動すると同時に、既定ポート 11434 にREST APIサーバを立ち上げており、そこに向けてリクエストを投げれば、生成・対話・埋め込み・モデル管理までをプログラムから操作できる。
さらにOllama APIは、Ollama独自の /api/* エンドポイントと、OpenAI互換の /v1/* エンドポイントを同時に公開する。つまり「新しく覚えるネイティブAPI」と「既存のOpenAI向けコードをそのまま流用する道」の両方が用意されている。この記事では、Ollama APIのエンドポイント全体像、/api/generate と /api/chat の使い方、OpenAI互換APIでの移行、Python/JavaScriptからの呼び出し、そしてストリーミング・構造化出力・keep_alive・外部公開の注意点までを、公式APIドキュメントで裏取りしながら手を動かせる形で解説する。
Ollama本体のインストールから基本操作・モデル選びは Ollama入門2026|Mac/Windows/Linuxでローカル大規模言語モデルを動かす完全ガイド をご覧ください。本記事はそのOllamaを「APIとしてアプリに組み込む」実装編です。
この記事のポイント(30秒でわかるOllama API)
・何ができる? ローカルLLMを http://localhost:11434 のREST APIで操作。生成・対話・埋め込み・モデル管理をHTTPで叩ける
・2系統のAPI ネイティブ /api/generate・/api/chat と、OpenAI互換 /v1/chat/completions の両方を同時公開
・何を解決する? 「ターミナルで動くだけ」を「アプリに組み込める部品」に変える。既存のOpenAI向けコードは宛先差し替えだけで移行
・要点4つ ①ストリーミングは既定ON ②formatで構造化出力(JSON Schema)③keep_aliveでメモリ常駐を制御 ④OLLAMA_HOST=0.0.0.0公開は認証なしに注意
・クライアント 公式Python(ollama-python)・JS(ollama-js)に加え、OpenAI SDKもそのまま利用可
まず、Ollama APIが公開するエンドポイントの全体像を1枚で掴んでおこう。役割ごとに4グループに分かれていると理解すると、どれを叩けばいいか迷わなくなる。
Ollama APIとは——ローカルLLMをHTTPで叩く3つの疑問
新しいAPIに触れるとき、当サイトの読者が知りたいのは同じ3つだ。「結局それは何ができて、何を解決し、何を代替するのか」。
① 何ができるのか。 Ollama APIは、ローカルで動くLLMに対して、テキスト生成(/api/generate)、マルチターンの対話(/api/chat)、テキストの埋め込みベクトル取得(/api/embed)、そしてモデルの一覧・詳細・取得・削除といった管理操作を、すべてHTTPリクエストで行えるようにする。ターミナルでの対話が「人間の操作」なら、APIは「プログラムからの操作」の入口だ。
② 何を解決するのか。 「Ollamaで動いたモデルを、自分のWebアプリ・バッチ処理・エージェント・IDE拡張から使いたい」という統合の問題を解決する。REST APIという標準的な形になっているため、言語を問わず、curl でもPythonでもJavaScriptでも、HTTPが投げられる環境ならどこからでも呼べる。
③ 何を代替するのか。 OpenAIやAnthropicのクラウドAPIエンドポイントを、開発・検証・機密データ用途で置き換える。特にOllama APIはOpenAI互換の /v1 を備えるため、アプリ側のコードは変えずに、宛先(base_url)だけをクラウドからローカルに向けるという代替が可能だ。本番の最高精度はクラウドに任せ、日常のコード補助や社内チャットはローカルのOllama APIに——という使い分けの土台になる。この「土台と外装」の関係や他ランタイムとの比較は Ollamaとllama.cppの違い2026|ローカルLLMはどちらで動かすべきか徹底比較 でも扱っている。
Ollama APIのエンドポイント全体像(/api/* と /v1/*)
Ollama APIのエンドポイントは、役割で4グループに分けて覚えるのが最短だ。すべて http://localhost:11434 を基点とする。
| グループ | エンドポイント | メソッド | 役割 |
|---|---|---|---|
| 生成・対話 | /api/generate |
POST | 単発のテキスト補完(プロンプト→生成) |
| 生成・対話 | /api/chat |
POST | 対話(messages配列・ツール呼び出し対応) |
| OpenAI互換 | /v1/chat/completions |
POST | OpenAI SDKをそのまま流用できる対話 |
| OpenAI互換 | /v1/embeddings・/v1/models |
POST/GET | 埋め込み・モデル一覧(OpenAI形式) |
| 埋め込み | /api/embed(新)・/api/embeddings(旧) |
POST | テキストのベクトル化(RAG等に利用) |
| モデル管理 | /api/tags・/api/ps・/api/show |
GET/POST | ローカルモデル一覧・起動中・詳細 |
| モデル管理 | /api/pull・/api/create・/api/delete |
POST/DELETE | モデルの取得・作成・削除 |
大づかみの指針はこうだ。アプリに新規で組み込むなら、対話は /api/chat、単発生成は /api/generate。既存のOpenAI向けコードを移すなら /v1/chat/completions。RAGでベクトル検索を作るなら /api/embed。運用監視やモデル切替のUIを作るなら /api/tags・/api/ps。この対応さえ頭に入れば、あとは各エンドポイントのリクエスト本文を組むだけだ。
/api/generate と /api/chat——生成と対話の基本
最も使うのがこの2つだ。/api/generate は1回のプロンプトに対する補完、/api/chat は会話履歴(messages)を渡すマルチターン対話に使う。まずは curl で最小の呼び出しを確認する。
# /api/generate — 単発のテキスト補完(stream:false で一括受信)
curl http://localhost:11434/api/generate -d '{
"model": "llama3.3",
"prompt": "ローカルLLMの利点を3つ、箇条書きで",
"stream": false
}'
# /api/chat — 会話履歴を渡す対話。system と user を積める
curl http://localhost:11434/api/chat -d '{
"model": "llama3.3",
"messages": [
{ "role": "system", "content": "あなたは簡潔に答える日本語アシスタントです" },
{ "role": "user", "content": "Ollama APIの使いどころは?" }
],
"stream": false
}'
リクエスト本文の主なフィールドは次の通り。options に生成パラメータをまとめて渡すのがOllama流だ。
| フィールド | 役割 |
|---|---|
model |
使うモデル名(必須。例 llama3.3・qwen3) |
prompt / messages |
入力。generateは文字列、chatは役割付き配列 |
stream |
ストリーミング可否(既定 true) |
format |
"json" またはJSON Schemaで構造化出力を強制 |
options |
temperature・num_ctx(文脈長)・num_predict(最大生成トークン)等 |
keep_alive |
応答後にモデルをメモリ保持する時間 |
tools |
/api/chat で関数(ツール)呼び出しを定義 |
images |
Base64画像(マルチモーダルモデル向け) |
なかでも /api/chat の tools は、ローカルLLMをエージェント化する鍵になる。ここに関数の名前・説明・引数スキーマを定義して渡すと、モデルは「この関数をこの引数で呼びたい」という意図を構造化して返す。天気取得・DB検索・社内API呼び出しといった外部アクションを、モデルの判断でトリガーできるわけだ。実際の関数実行はアプリ側が担うため、モデルは「何を呼ぶか」を決め、コードが「実際に呼ぶ」という分業になる。ツール対応モデル(例: Llama 3.x系やQwen系の対応版)を使えば、クラウドAPIに送らずローカル完結でツール呼び出しエージェントを組める。ローカルLLMでのエージェント構築例は Ollama 0.24でOpenAI Codex CLIがローカルLLMで動く:API課金もレート制限もない開発体験 も参考になる。
たとえば「温度を下げて堅実に、文脈長を8192に、JSONで返す」なら、options と format を組み合わせる。構造化出力(後述)はこの format にJSON Schemaを渡すことで実現する。
# options(生成パラメータ)と format(構造化)を併用
curl http://localhost:11434/api/chat -d '{
"model": "llama3.3",
"messages": [{ "role": "user", "content": "東京の天気を項目化して" }],
"options": { "temperature": 0.2, "num_ctx": 8192 },
"format": {
"type": "object",
"properties": { "city": {"type":"string"}, "summary": {"type":"string"} },
"required": ["city", "summary"]
},
"stream": false
}'
OpenAI互換API(/v1)で既存コードをローカルに向ける
Ollama APIが開発者に強く支持される理由が、OpenAI互換エンドポイントだ。サーバが動いていれば /v1/chat/completions が開いており、OpenAI向けに書かれたコードの宛先を差し替えるだけで動く。
# OpenAI互換 /v1/chat/completions(api_key はダミーでよい)
curl http://localhost:11434/v1/chat/completions -d '{
"model": "llama3.3",
"messages": [{ "role": "user", "content": "OpenAI互換APIの利点は?" }]
}' -H "Authorization: Bearer ollama"
この互換性が効くのは、LangChain・LlamaIndex・各種エージェントフレームワーク・VS Code拡張(Continue等)が、軒並みOpenAI形式のエンドポイント設定を持つからだ。それらの base_url をOllamaに向けるだけで、ツールチェーン全体がローカルLLMで動く。リクエストとレスポンスの流れは次の通りで、ネイティブAPIもOpenAI互換APIも、内部では同じ推論エンジンに到達する。
curl / SDK / フレームワーク"] -->|"POST /api/chat"| S["Ollama サーバ
:11434"] A -->|"POST /v1/chat/completions"| S S -->|ロード&推論| E["推論エンジン
(GPU / CPU)"] E -->|"stream=true: トークンを逐次"| S S -->|"NDJSON / SSE で返却"| A
図の通り、どちらのAPIを叩いても宛先は同じ 11434 のサーバで、レスポンスはストリーミング(既定ON)ならトークンを逐次返す。OpenAI互換は移行のしやすさ、ネイティブは format や keep_alive など細かな制御のしやすさが強みで、新規はネイティブ、移行はOpenAI互換と使い分けるのが実務的だ。
Python / JavaScript から Ollama APIを使う
curl で挙動を確認したら、実装では公式クライアントを使うのが速い。Pythonには ollama-python、JavaScriptには ollama-js がある。
# pip install ollama
import ollama
# 対話(stream=True でトークンを逐次受信)
stream = ollama.chat(
model="llama3.3",
messages=[{"role": "user", "content": "ローカルLLMの用途を長めに"}],
stream=True,
)
for chunk in stream:
print(chunk["message"]["content"], end="", flush=True)
OpenAI SDKをそのまま使う場合は、base_url と api_key を差し替えるだけでいい。アプリのロジックは一切変えず、宛先だけをローカルに向けるという移行の典型形だ。
from openai import OpenAI
# base_url をローカルの Ollama に。api_key は形式的なダミー
client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")
resp = client.chat.completions.create(
model="llama3.3",
messages=[{"role": "user", "content": "OpenAI SDKからローカルLLMを叩く"}],
)
print(resp.choices[0].message.content)
JavaScript(Node.js)なら ollama-js が同様のインターフェースを提供する。フロントエンドのプロトタイプやElectronアプリからも、同じ 11434 を叩ける。
// npm install ollama
import ollama from "ollama";
const res = await ollama.chat({
model: "llama3.3",
messages: [{ role: "user", content: "JSからローカルLLMを叩く" }],
});
console.log(res.message.content);
RAGを作るなら、埋め込みエンドポイント /api/embed でテキストをベクトル化し、ベクトルDBに入れて検索する。この埋め込みとベクトル検索の設計は RAG完全ガイド2026 と合わせて設計すると、ローカル完結のRAGを組みやすい。
実運用の要点——ストリーミング・構造化出力・keep_alive・公開設定
最後に、Ollama APIを実運用に載せるときに効く4つの勘所を押さえる。ここを外すと「動くけど遅い・不安定・危険」になりやすい。
① ストリーミングは既定ON。 /api/generate・/api/chat は既定で stream: true となり、トークンをJSON行で逐次返す。チャットUIでは体感待ち時間が大きく減るので活かすべきだが、レスポンスを1つのJSONで受けたいバッチ処理では "stream": false を明示する。忘れるとNDJSONのパースでつまずく典型ポイントだ。
② 構造化出力は format にJSON Schema。 抽出・分類・フォーム化のように「決まった形で返してほしい」用途では、format に "json" かJSON Schemaを渡す。スキーマを渡せば、そのキー・型に沿った出力を強制でき、後段のパースが安定する。プロンプトで「JSONで返して」とお願いするより確実だ。
③ keep_alive でメモリ常駐を設計する。 モデルの初回ロードは重い。keep_alive を長め(例 "30m" や "-1")にすると常駐して2回目以降のレイテンシが最小になり、0 にすると即解放してVRAMを空ける。複数モデルを切り替えるサーバでは、この値の設計が体感速度を左右する。/api/ps で現在メモリに載っているモデルを確認しながら調整するとよい。
④ 外部公開は認証欠如に注意。 既定ではOllamaは 127.0.0.1 のみで待ち受ける。別マシンから叩くには OLLAMA_HOST=0.0.0.0 で全開放するが、Ollama APIには認証機構がない。0.0.0.0 で開くとネットワーク上の誰でもモデルを使え、プロンプト注入やリソース枯渇のリスクがある。外部公開するなら、リバースプロキシでの認証・IP制限・VPN内限定など、前段でのアクセス制御を必ず入れる。ローカルLLM全体の選択肢や公開時の勘所は ローカルLLMを動かす方法|2026年最新オープンウェイト・ランタイム・VRAM要件まで総まとめ も参照してほしい。
この4点を押さえれば、Ollama APIは「ターミナルの実験」から「アプリのバックエンド」へと安全に昇格する。まずは curl http://localhost:11434/api/chat の一投から始め、stream と format と keep_alive を用途に合わせて回していけばいい。モデルの中身や量子化の理屈は LLMとは?仕組み・主要モデル比較・ローカル実行・量子化を一気にまとめる2026年版 で深掘りしている。
参照ソース
・Ollama API ドキュメント(GitHub docs/api.md)
・OpenAI 互換API(GitHub docs/openai.md)
・ollama/ollama — GitHub 公式リポジトリ(MIT)
・ollama-python — 公式Pythonクライアント
・ollama-js — 公式JavaScriptクライアント