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のエンドポイントを4グループで示すブランド図:生成・対話/api、OpenAI互換/v1、埋め込み、モデル管理
Ollama APIは「生成・対話」「OpenAI互換」「埋め込み」「モデル管理」の4グループに整理できる。すべて既定ポート11434で同時に開く。図はローカル生成(HTML/CSS)。

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/completionsRAGでベクトル検索を作るなら /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.3qwen3
prompt / messages 入力。generateは文字列、chatは役割付き配列
stream ストリーミング可否(既定 true
format "json" またはJSON Schemaで構造化出力を強制
options temperaturenum_ctx(文脈長)・num_predict(最大生成トークン)等
keep_alive 応答後にモデルをメモリ保持する時間
tools /api/chat で関数(ツール)呼び出しを定義
images Base64画像(マルチモーダルモデル向け)

なかでも /api/chattools は、ローカルLLMをエージェント化する鍵になる。ここに関数の名前・説明・引数スキーマを定義して渡すと、モデルは「この関数をこの引数で呼びたい」という意図を構造化して返す。天気取得・DB検索・社内API呼び出しといった外部アクションを、モデルの判断でトリガーできるわけだ。実際の関数実行はアプリ側が担うため、モデルは「何を呼ぶか」を決め、コードが「実際に呼ぶ」という分業になる。ツール対応モデル(例: Llama 3.x系やQwen系の対応版)を使えば、クラウドAPIに送らずローカル完結でツール呼び出しエージェントを組める。ローカルLLMでのエージェント構築例は Ollama 0.24でOpenAI Codex CLIがローカルLLMで動く:API課金もレート制限もない開発体験 も参考になる。

たとえば「温度を下げて堅実に、文脈長を8192に、JSONで返す」なら、optionsformat を組み合わせる。構造化出力(後述)はこの 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も、内部では同じ推論エンジンに到達する。

graph LR A["あなたのアプリ
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互換は移行のしやすさ、ネイティブは formatkeep_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_urlapi_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 の一投から始め、streamformatkeep_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クライアント