API リファレンス
LLM AI Server with llama.cpp が端末内で公開する HTTP API の仕様と使用例です。Ollama 互換エンドポイント(/api/*)と OpenAI 互換エンドポイント(/v1/*)、および llama.cpp WebUI 互換エンドポイント(/props, /slots ほか)を、現行の OllamaApiServer 実装をもとに整理しています。
関連文書: 操作マニュアル | 技術仕様 | プライバシーポリシー
目次
1. 基本情報
- ベース URL:
http://localhost:<port>(既定ポート11434)。Wi-Fi 接続中は同じポートで LAN URL(http://<端末 IP>:<port>)も利用できます。 - 同居構成: API と WebUI は同一ポートで提供されます。API パス以外への GET は WebUI 配信に回されます。
- 認証: API キー認証はありません(
Authorizationヘッダーは無視されます)。同一端末またはローカルネットワーク内での利用を想定しています。 - CORS: すべての応答に
Access-Control-Allow-Origin: *を付与し、OPTIONSプリフライトに204を返します。 - Content-Type: リクエストボディは JSON(
application/json)。非ストリーミング応答は JSON、ストリーミング応答は/api/*が NDJSON(application/x-ndjson)、/v1/*が SSE(text/event-stream)です。 - モデル指定:
modelには設定(プロファイル)名を指定します。プロファイル一覧は/api/tagsまたは/v1/modelsで取得できます。
2. 互換性サマリ
主要なチャット / 生成クライアントが利用する範囲では Ollama・OpenAI の両仕様と互換です。一方で、本アプリは「端末内 1 モデル・1 推論」を前提とした実装のため、一部の管理系エンドポイントや統計フィールドは提供しません。
| 区分 | 内容 |
|---|---|
| Ollama 互換(実装済み) | POST /api/generate、POST /api/chat、GET/POST /api/tags。応答形は {model, created_at, response|message, done} 系で互換。ツール利用時は done_reason・tool_calls・reasoning_content を追加。 |
| OpenAI 互換(実装済み) | POST /v1/chat/completions(streaming は SSE、終端 data: [DONE])、GET /v1/models。object・choices[].message/delta・finish_reason を返却。 |
| llama.cpp WebUI 互換 | GET /props、GET /slots、GET /health(/v1/health)、GET /models、Bundled WebUI 配信。 |
| 拡張(独自) | マルチモーダル入力(image_url / input_audio)、共有 MCP / Function Definitions 設定、reasoning_content、パフォーマンス指標を本文末尾に付記するオプション。 |
| 未実装(注意点) | OpenAI 応答に id / created / usage は含まれません。Ollama 応答に total_duration / eval_count / prompt_eval_count / context などの統計は含まれません。埋め込み(/api/embed, /v1/embeddings)、モデル管理(/api/show, /api/pull, /api/ps, /api/version)、/v1/completions(旧 completions)は提供しません。 |
トークン使用量などの統計が必要な場合は、出力設定の「パフォーマンス指標を表示」を有効にすると、生成完了後にトークン数・処理時間・速度が本文末尾(OpenAI は最終 delta、Ollama は追加 chunk)に付記されます。
3. 共通仕様
3-1. 同時実行と待機キュー
- 推論 slot は 1 つだけ(single-generation)。生成中の追加リクエストは最大
10件まで待機キューに入り、最大60秒待機します。 - キュー超過・待機タイムアウト時は
503を返します。 - モデル再初期化(リセット)要求中は、新規リクエストを拒否し、待機中リクエストも打ち切ります(
503)。
3-2. エラー応答
/api/* 系はプレーンな JSON / テキストでエラーを返し、/v1/* 系は OpenAI 形式のエラーオブジェクトを返します。
// /v1/* のエラー形式
{
"error": {
"message": "No messages provided",
"type": "invalid_request_error",
"code": 400
}
}
| ステータス | 意味 |
|---|---|
400 | JSON 不正、必須項目欠落、非対応の content[].type、未対応モダリティ など |
404 | 未定義の経路 |
405 | 非対応の HTTP メソッド |
500 | 設定ロード失敗、生成失敗 など |
503 | ビジー(キュー満杯 / 待機タイムアウト / リセット進行中) |
4. POST/api/generate
単一プロンプトからの生成(Ollama generate 互換)。既定で streaming(NDJSON)。
リクエスト
| フィールド | 型 | 説明 |
|---|---|---|
model | string | プロファイル名。未指定時は "default"。 |
prompt | string | ユーザープロンプト。 |
system | string? | 任意。システムプロンプト(設定側より優先)。 |
stream | bool | 既定 true。false で一括応答。 |
tools | array? | 任意。指定すると内部ツール実行ループに切り替わります(12 章)。 |
非ストリーミング応答
curl http://localhost:11434/api/generate -d '{
"model": "my-profile",
"prompt": "日本の首都は?",
"stream": false
}'
{
"model": "my-profile",
"created_at": "2026-06-14T03:10:00Z",
"response": "日本の首都は東京です。",
"done": true
}
ストリーミング応答(NDJSON)
1 行 1 JSON。各 chunk は "done": false で response に部分文字列。最後に "done": true の chunk を送出します。
{"model":"my-profile","created_at":"...","response":"日本","done":false}
{"model":"my-profile","created_at":"...","response":"の首都は","done":false}
{"model":"my-profile","created_at":"...","response":"","done":true}
5. POST/api/chat
messages 配列による会話生成(Ollama chat 互換)。既定で streaming(NDJSON)。
リクエスト
| フィールド | 型 | 説明 |
|---|---|---|
model | string | プロファイル名。未指定時は "default"。 |
messages | array | 必須。{role, content} の配列。role は system / user / assistant / tool。content は文字列、またはマルチモーダル用の配列(11 章)。 |
stream | bool | 既定 true。 |
tools | array? | 任意(12 章)。 |
非ストリーミング応答
curl http://localhost:11434/api/chat -d '{
"model": "my-profile",
"stream": false,
"messages": [
{"role": "system", "content": "あなたは簡潔に答えるアシスタントです。"},
{"role": "user", "content": "富士山の標高は?"}
]
}'
{
"model": "my-profile",
"created_at": "2026-06-14T03:10:00Z",
"message": { "role": "assistant", "content": "3,776 m です。" },
"done": true
}
ストリーミング応答(NDJSON)
{"model":"my-profile","created_at":"...","message":{"role":"assistant","content":"3,776"},"done":false}
{"model":"my-profile","created_at":"...","message":{"role":"assistant","content":" m です。"},"done":false}
{"model":"my-profile","created_at":"...","message":{"role":"assistant","content":""},"done":true}
6. GETPOST/api/tags
利用可能なモデル(プロファイル)一覧。Ollama tags 互換。
curl http://localhost:11434/api/tags
{
"models": [
{
"name": "my-profile",
"model": "my-profile",
"modified_at": "2026-06-14T03:10:00Z",
"size": 0,
"details": {
"format": "gguf",
"family": "llama",
"parameter_size": "unknown",
"quantization_level": "unknown"
}
}
]
}
size や parameter_size 等は端末側で確定できないため固定値(0 / "unknown")です。より詳しい状態・モダリティが必要な場合は /v1/models を使ってください。
7. POST/v1/chat/completions
OpenAI Chat Completions 互換。既定で streaming(SSE)。OpenAI 公式 SDK の base_url をこのサーバーに向けるだけで利用できます。
リクエスト
| フィールド | 型 | 説明 |
|---|---|---|
model | string | プロファイル名。空 / 未指定時は現在ロード中のモデル、なければ既定プロファイルに解決されます。 |
messages | array | 必須。OpenAI 形式。content は文字列または {type, ...} パーツ配列(11 章)。 |
stream | bool | 既定 true。 |
tools / tool_choice / parallel_tool_calls | array / any / bool | 任意(12 章)。 |
| サンプリング各種 | number 等 | temperature, top_p, top_k, min_p, presence_penalty, frequency_penalty ほか(10 章)。リクエスト単位で設定を上書きします。 |
非ストリーミング応答
curl http://localhost:11434/v1/chat/completions -d '{
"model": "my-profile",
"stream": false,
"messages": [
{"role": "user", "content": "Say hello in Japanese."}
]
}'
{
"object": "chat.completion",
"model": "my-profile",
"choices": [
{
"index": 0,
"message": { "role": "assistant", "content": "こんにちは!" },
"finish_reason": "stop"
}
]
}
注意: 本アプリの応答には id / created / usage は含まれません。これらを必須とする一部クライアントでは欠落として扱われます。
ストリーミング応答(SSE)
先頭に delta.role="assistant" の chunk、続いて delta.content を持つ chunk 群、最後に finish_reason:"stop" の chunk と data: [DONE] を送出します。
data: {"object":"chat.completion.chunk","model":"my-profile","choices":[{"index":0,"delta":{"role":"assistant"},"finish_reason":null}]}
data: {"object":"chat.completion.chunk","model":"my-profile","choices":[{"index":0,"delta":{"content":"こん"},"finish_reason":null}]}
data: {"object":"chat.completion.chunk","model":"my-profile","choices":[{"index":0,"delta":{"content":"にちは!"},"finish_reason":null}]}
data: {"object":"chat.completion.chunk","model":"my-profile","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: [DONE]
8. GET/v1/models・/models
OpenAI 互換のモデル一覧に加え、llama.cpp WebUI 向けの models 配列(状態・モダリティ)も同時に返します。
curl http://localhost:11434/v1/models
{
"object": "list",
"data": [
{
"id": "my-profile",
"name": "my-profile",
"object": "model",
"owned_by": "llamacpp",
"created": 1781000000,
"in_cache": true,
"path": "/data/.../my-model.gguf",
"status": { "value": "loaded" },
"tags": []
}
],
"models": [
{
"name": "my-profile",
"model": "my-profile",
"modified_at": "2026-06-14T03:10:00Z",
"size": 4100000000,
"capabilities": ["multimodal"],
"modalities": { "vision": true, "audio": false },
"details": { "format": "gguf", "family": "llama", "parameter_size": "unknown", "quantization_level": "unknown" }
}
]
}
data[] が OpenAI 互換、models[] が llama.cpp WebUI 互換です。modalities はロード済みモデルなら実際の対応状況、未ロードならファイルからの推定値を返します。
9. GET/props・/slots・/health
主に同梱 WebUI(llama.cpp 風)の初期化に使われるエンドポイントです。?model=<プロファイル名> で対象を指定できます。
/props:default_generation_settings(n_ctxや各サンプリング値)、chat_template、modalities、model_path、build_info、webui_settings(systemMessage、Think 表示、共有 MCP / Function Definitions 設定)などを返します。total_slotsは1。/slots: slot 配列(要素 1 個)。n_ctx、params(サンプリング値)、is_processingなどを返します。/health,/v1/health:{"status":"ok","role":...,"webui":true}。
curl "http://localhost:11434/props?model=my-profile"
10. サンプリングパラメータ
/v1/chat/completions ではリクエスト本文に次のキーを含めると、そのリクエストのあいだ設定値を上書きします(指定しなかった項目はプロファイルの値を使用)。
| キー | 型 | 対応する設定 |
|---|---|---|
temperature | number | 温度 |
top_k | int | Top-k |
top_p | number | Top-p |
min_p | number | Min-p |
typ_p | number | Typical-p |
dynatemp_range / dynatemp_exponent | number | Dynamic temperature |
xtc_probability / xtc_threshold | number | XTC サンプラー |
repeat_last_n | int | Penalty 対象トークン数 |
repeat_penalty | number | Repeat penalty |
presence_penalty / frequency_penalty | number | Presence / Frequency penalty |
dry_multiplier / dry_base / dry_allowed_length / dry_penalty_last_n | number / int | DRY サンプラー |
mirostat / mirostat_tau / mirostat_eta | int / number | Mirostat |
n_predict: 0 を指定すると pre-encode のみを行い、空応答で早期復帰します(プロンプト評価のウォームアップ用)。
11. マルチモーダル入力
/api/chat と /v1/chat/completions では、content をパーツ配列にすることで画像・音声を渡せます。ロード中のモデルが vision / audio に対応している必要があり、非対応の場合は 400 を返します。
| type | 説明 |
|---|---|
text / input_text | テキスト(text フィールド)。 |
image_url | image_url.url に HTTP/HTTPS の画像 URL、または data:image/...;base64, 形式の data URL。リモート取得は 10MB 上限。 |
input_audio | input_audio.data(base64)と input_audio.format("wav" または "mp3")。 |
curl http://localhost:11434/v1/chat/completions -d '{
"model": "my-vision-profile",
"stream": false,
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "この画像を説明して"},
{"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,/9j/4AAQ..."}}
]
}
]
}'
// 音声入力(wav / mp3)
{
"role": "user",
"content": [
{"type": "text", "text": "この音声を文字起こしして"},
{"type": "input_audio", "input_audio": {"data": "UklGR...", "format": "wav"}}
]
}
12. ツール / Function Calling
リクエストに tools を渡すか、アプリの「MCP 設定」で共有 MCP / Function Definitions を有効にすると、内部ツール実行ループに切り替わります。/api/generate・/api/chat・/v1/chat/completions のいずれでも利用できます。
toolsは OpenAI 互換の配列です。配列以外を渡すと400になります。tool_choiceとparallel_tool_callsを受け取ります。- 共有 MCP / Function Definitions を有効化している場合、メイン画面のプロンプトや各 API でも共通のツール設定が適用されます。
- 応答にはモデルが直接返した
tool_callsに加え、本文中の tool-call マーカーやreasoning_contentからの抽出結果も含まれることがあります。
// OpenAI 互換のツール定義例(非ストリーミング応答の一部)
{
"object": "chat.completion",
"model": "my-profile",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "",
"tool_calls": [
{
"id": "call_1",
"type": "function",
"function": { "name": "get_weather", "arguments": "{\"city\":\"Tokyo\"}" }
}
]
},
"finish_reason": "tool_calls"
}
]
}
13. クライアント例
OpenAI Python SDK
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="not-needed", # 認証は不要(任意の文字列で可)
)
resp = client.chat.completions.create(
model="my-profile",
messages=[{"role": "user", "content": "こんにちは"}],
stream=False,
)
print(resp.choices[0].message.content)
OpenAI 互換ストリーミング(Python)
stream = client.chat.completions.create(
model="my-profile",
messages=[{"role": "user", "content": "俳句を1つ"}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta
if delta.content:
print(delta.content, end="", flush=True)
Ollama 互換(curl / NDJSON)
curl -N http://localhost:11434/api/chat -d '{
"model": "my-profile",
"messages": [{"role": "user", "content": "自己紹介して"}]
}'
JavaScript(fetch / SSE)
const res = await fetch("http://localhost:11434/v1/chat/completions", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
model: "my-profile",
messages: [{ role: "user", content: "Hello" }],
stream: true,
}),
});
const reader = res.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { value, done } = await reader.read();
if (done) break;
for (const line of decoder.decode(value).split("\n")) {
if (!line.startsWith("data: ")) continue;
const data = line.slice(6);
if (data === "[DONE]") break;
const json = JSON.parse(data);
process.stdout.write(json.choices[0].delta.content ?? "");
}
}
本ページは現行の Android 実装(OllamaApiServer)に基づきます。応答例は説明のため整形しています。実際のフィールド構成・既定値はアプリのバージョンにより変わることがあります。