はじめに
OllamaはローカルLLMの実行環境として手軽だが、GUIやCLIだけでなく HTTP API も提供している。この記事では、PowerShell 5.1の Invoke-RestMethod だけを使い、追加ツールなしでOllamaのAPIを触ってみた結果をまとめる。ネイティブの /api 系と、OpenAI互換の /v1 系の両方を確認する。
環境
- Windows 11(ビルド 10.0.26200)
- PowerShell 5.1
- Ollama 0.40.4(公式アプリ。サーバーは既定の
http://127.0.0.1:11434) - モデル:
qwen2.5:0.5b(検証用の小型モデル)
やったこと
1. バージョンと疎通確認
(Invoke-RestMethod http://127.0.0.1:11434/api/version).version
実行結果:
0.40.4
2. モデル一覧を取得する(/api/tags)
(Invoke-RestMethod http://127.0.0.1:11434/api/tags).models |
Select-Object name, size
実行結果(抜粋):
name size
---- ----
qwen2.5:0.5b 397821319
(ほか3モデル)
size はバイト単位。/api/ps ではなく /api/tags が「ディスク上にあるモデル一覧」である点に注意。
3. テキスト生成(/api/generate)
stream を false にすると、生成が終わってからJSONが一括で返る。
$body = @{
model = "qwen2.5:0.5b"
prompt = "Reply with exactly: connection-ok"
stream = $false
options = @{ num_predict = 24 }
} | ConvertTo-Json -Depth 5
$r = Invoke-RestMethod -Uri http://127.0.0.1:11434/api/generate `
-Method Post -Body $body -ContentType "application/json; charset=utf-8" -TimeoutSec 120
$r.response
実行結果:
connection-ok
応答には生成結果のほか、eval_count(生成トークン数)や total_duration(ナノ秒)などの統計も含まれる。実測では初回リクエストの total_duration が約30秒だった。これは小型モデルでもモデルのロード時間が含まれるためで、2回目以降は大幅に短くなる。
4. OpenAI互換エンドポイント(/v1)
OpenAI APIのクライアントでおなじみの形式も提供されている。
# モデル一覧
(Invoke-RestMethod http://127.0.0.1:11434/v1/models).data.id
# チャット補完
$body = @{
model = "qwen2.5:0.5b"
messages = @(@{ role = "user"; content = "What is 1+1? Answer with just the number." })
max_tokens = 16
} | ConvertTo-Json -Depth 5
$r = Invoke-RestMethod -Uri http://127.0.0.1:11434/v1/chat/completions `
-Method Post -Body $body -ContentType "application/json; charset=utf-8" -TimeoutSec 120
$r.choices[0].message.content
$r.usage.completion_tokens
実行結果:
1+1=2
6
/v1 系は max_tokens、messages[].role などOpenAI互換のフィールド名でやり取りできる。Ollama用のクライアントを書くときに、既存のOpenAIクライアントを流用したい場合はこちらが便利だ。
ハマった点
-
JSONボディの日本語や記号は
charset=utf-8を明示する。-ContentType "application/json; charset=utf-8"を付けておくと、環境依存の文字化けトラブルを避けやすい。 -
ConvertTo-Jsonの-Depthに注意。messagesのようなネストした配列を含むボディは、既定の深さ(2)だと正しく変換されない。-Depth 5を付けておくと安全。 -
初回リクエストは遅い。モデルのロードが発生するため、
Invoke-RestMethod側のタイムアウトを短くしすぎないこと。実測では検証用の0.5Bモデルでも初回に約30秒かかった。 -
streamの既定値はtrue。/api/generateはストリーミングが既定なので、一括取得したいときはstream = $falseを明示する。
まとめ
- Ollamaは追加ライブラリなしで、PowerShellからHTTP APIを直接叩ける。
-
/api系(ネイティブ)と/v1系(OpenAI互換)の両方が利用可能。 - ポイントは「
charset=utf-8」「ConvertTo-Json -Depth」「初回ロード時間」の3つ。
次にAPIで遊ぶなら、stream = $true のストリーミング表示や、/api/chat での会話履歴の扱いに進むとおもしろい。
関連する本
この記事で扱ったAPIの続き(ストリーミング、VRAM、定時実行、運用)を一冊にまとめました。第1章・第2章は無料で読めます。