OllamaのAPI streamingをWindowsで使う方法|NDJSON・done・PowerShell
- 公開日
- 2026-08-09
- 更新日
- 2026-08-09
- 情報確認日
- 2026-08-09
- 編集・運営
- Local AI Compass
Ollamaのnative APIは、RESTではstreamingが既定で、/api/generateや/api/chatからapplication/x-ndjsonの断片が届きます。Windowsでは最初にstream=falseで完成したJSONを確認し、次にcurl.exe -Nや行単位のparserでresponse・message.content・done・errorを分けて読むと、OpenAI互換のSSEやJSON一括parserとの混同を避けられます。
導入前に確認すること
- Windowsのバージョン、メモリ容量、GPU/VRAM、空き容量を確認する
- 最初は軽量モデル、短い質問、少ない同時作業から始める
- 公式サイトの対応OS、利用規約、モデルのライセンスを確認する
先に結論:native APIのstreamはNDJSON、最初はstream=falseで基準を作る
OllamaのREST APIでstreamingを使うと、完成した1つのJSONではなく、改行区切りのJSONが順番に届きます。公式のStreaming docsでは、/api/generateのようなendpointが既定でstreamし、Content-Typeはapplication/x-ndjsonと説明されています。
| 目的 | 使う指定・形式 | 最初に確認する値 |
|---|---|---|
| 完成したJSONを読む | stream: false / application/json | HTTP status、responseまたはmessage.content、done |
| 生成中の文字列を表示する | stream: true / application/x-ndjson | 1行1JSON、responseまたはmessage.content、done |
| 途中で壊れた原因を見る | 各chunkのerrorとHTTP status | stream開始前のstatus、開始後のerror object |
| 速度や負荷を記録する | 最後のdone chunk | total_duration、eval_count、eval_durationなど |
最初から逐次表示とJSON Schema、tool calling、長文を同時に足すと、モデル・endpoint・parserのどこで失敗したか分かりにくくなります。短い非機密の入力をstream=falseで動かし、同じmodelとpayloadをstream=trueへ変える順番が安全です。
- Ollama OpenAI互換API - /v1系のSSE・client形式との違いを見る
- Ollama Responses API - /v1/responsesのイベント形式を確認する
- Ollama回答が途中で止まるとき - done・context・メモリの症状診断へ進む
まず/api/generateと/api/chatの違いを固定する
native APIを使うときは、単発のpromptを送る/api/generateと、messages配列で会話を送る/api/chatを分けます。同じlocalhost:11434でも、返答の本文を読む場所が異なるため、片方のparserをもう片方へ流用しません。
| endpoint | requestの中心 | chunkで読む本文 | 向いている最初の確認 |
|---|---|---|---|
| /api/generate | model、prompt、stream | chunk.response | 単発promptとNDJSONの行読み |
| /api/chat | model、messages、stream | chunk.message.content | 会話履歴とassistant messageの蓄積 |
| /v1/chat/completions | OpenAI互換messages | SSEやclient固有のchoices | 既存OpenAI clientの再利用 |
| /v1/responses | OpenAI互換input | Responsesのevent・output | Responses APIのstateful境界 |
API形式を変えるときは、endpoint、request field、本文の場所、終了条件、エラーの表現を一緒に変える必要があります。「localhostだから同じJSON」と扱わず、最初のレスポンスを保存してからparserの契約を決めてください。
- Ollama Generate公式docs - prompt・response・done・usageを見る
- Ollama Chat公式docs - messages・message.content・tool_callsを見る
- OllamaのモデルID確認 - /v1/models・/api/tags・/api/showでmodelを固定する
Windowsではstream=falseの完成レスポンスから確認する
PowerShellのInvoke-RestMethodは、まず完成したJSONを読む用途に向いています。REST streamingの既定値をそのまま受け取ると、行ごとのNDJSONを1つのJSONとして扱えないことがあるため、疎通の最初はstream = $falseを明示します。
$body = @{
model = "MODEL_FROM_OLLAMA_LS"
prompt = "WindowsのローカルAIでstream=falseを確認する短い質問"
stream = $false
} | ConvertTo-Json -Depth 8
$response = Invoke-RestMethod `
-Uri "http://localhost:11434/api/generate" `
-Method Post `
-ContentType "application/json" `
-Body $body
$response | Select-Object model, response, done, done_reason, `
total_duration, prompt_eval_count, eval_count | Format-List- ollama lsで取得済みのmodel名を確認し、記事例のmodel名をそのまま信用しない。
- 短い非機密promptとstream = $falseを/api/generateへ送る。
- HTTP statusが成功でも、response、done、done_reasonを確認する。
- 同じmodelとpromptで、次の段階だけstream = $trueへ変更する。
Structured Outputsや長文の評価を始める前に、短い完成レスポンスの形を保存します。モデルの品質、速度、JSONとしての妥当性はこの疎通成功だけでは保証されないため、用途別の検証を別に行います。
- Ollama API Introduction公式docs - localhost:11434/apiのbase URLを見る
- Ollama Structured Outputs - JSON Schemaとstream=falseの検証へ進む
- Ollama API認証 - localとcloudの認証経路を分ける
curl.exe -NでNDJSONの到着単位を観察する
stream=trueへ変えた最初の観察には、Windowsにあるcurl.exeの`-N`(バッファリングを抑える指定)を使えます。これは完成済みJSONを返すInvoke-RestMethodの確認とは別の用途で、到着した1行ごとのJSON、responseの断片、最後のdoneを目視するための手順です。
$payload = @{
model = "MODEL_FROM_OLLAMA_LS"
prompt = "短い説明を3文で返してください"
stream = $true
} | ConvertTo-Json -Compress
curl.exe -N `
-X POST "http://localhost:11434/api/generate" `
-H "Content-Type: application/json" `
-d $payload- NDJSONは、SSEのevent:行やdata:接頭辞を前提にしない。まず1行を1つのJSON objectとして読む。
- 行内のresponse断片を順番に連結し、doneやdone_reasonを本文へ連結しない。
- 空行、接続切断、error property、想定外のJSONを別の状態として記録する。
- 実文書、API key、cookie、個人情報をstreamの観察入力や画面共有へ入れない。
実際の到着単位は、Ollamaのversion、model、ネットワーク、クライアントのbufferingで見え方が変わる場合があります。表示が遅いことだけで生成停止やモデル不良と断定せず、最終chunkとHTTP応答も確認します。
- Ollama Streaming公式docs - application/x-ndjsonとstream=falseを見る
- Ollama native Chat API - /api/chatのmessage chunkを確認する
- OllamaのAPIエラー - stream中のerror objectを確認する
行単位でresponse・message・thinkingを蓄積し、doneで確定する
アプリ側のparserは、ネットワークから届く任意のbyte境界をJSONの境界だと決めつけず、改行で1行を切り出してからConvertFrom-JsonやJSON.parseへ渡します。/api/generateではresponse、/api/chatではmessage.contentを蓄積し、thinkingやtool_callsは別フィールドとして扱います。
$text = ""
$thinking = ""
# $line はNDJSONから1行ずつ取り出した文字列とする
$chunk = $line | ConvertFrom-Json
if ($chunk.error) {
throw "Ollama stream error: $($chunk.error)"
}
if ($null -ne $chunk.response) {
$text += [string]$chunk.response
}
if ($null -ne $chunk.message.content) {
$text += [string]$chunk.message.content
}
if ($null -ne $chunk.message.thinking) {
$thinking += [string]$chunk.message.thinking
}
if ($chunk.done -eq $true) {
# ここでdone_reasonとusageを保存してparserを終了する
}
| フィールド | 蓄積の扱い | 注意点 |
|---|---|---|
| response | /api/generateの本文へ追加 | doneやusageと連結しない |
| message.content | /api/chatの本文へ追加 | assistant messageの履歴と区別する |
| message.thinking | 表示・保存方針を別に決める | 通常本文と混ぜず、共有範囲に注意する |
| message.tool_calls | 完全な構造を蓄積して検証 | 途中の引数だけでtoolを実行しない |
| done / done_reason | 終了状態として保存 | 接続切断を正常終了とみなさない |
公式のStreaming capability docsではPython・JavaScript SDKでstreamを反復し、partial messageを蓄積して会話履歴へ戻す例が示されています。SDKはRESTのNDJSONを自分で読む場合と層が違うため、PythonやJavaScriptでは利用時点の公式SDK例と実際のchunk型を確認します。
- Ollama Streaming capability公式docs - Python・JavaScriptのchunk蓄積を見る
- Ollama tool calling - tool_callsを蓄積して安全に実行する境界を見る
- Ollama Modelfile - modelのtemplate・parameterを確認する
途中エラーはHTTP statusだけでなく各chunkのerrorを見る
Ollama公式Errors docsでは、stream開始後にエラーが発生すると、HTTP statusを変更できずapplication/x-ndjsonのobjectとしてerrorが返る場合があると説明されています。したがって、statusが200だから最後まで成功した、接続が閉じたから正常終了した、とは判断しません。
| 症状 | 確認する場所 | 最初の切り分け |
|---|---|---|
| stream開始前の400 | HTTP statusとerror本文 | JSON、必須model、request field、endpoint |
| 404 model not found | HTTP status、model、/v1/models・/api/tags | serverの向き、tag、model ID |
| stream途中のerror | NDJSON各行のerror property | done扱いにせず、最後の正常chunkと原因を保存 |
| 429 / 502 | HTTP statusとlocal/cloud経路 | rate limit、cloud接続、認証、再試行条件 |
| 表示が止まる | 最後のchunk、done、server log、負荷 | parser、model、context、メモリを一度に変えない |
- 同じmodelと短い入力をstream=falseで再実行し、完成JSONが返るか確認する。
- stream=trueの最初のerror行または最後の正常行を、秘密情報を除いて保存する。
- endpoint・model・context・client・proxyを一度に変更せず、1項目ずつ戻す。
- cloud modelやLAN公開が関係する場合はlocal APIの成功と分けて認証・privacy・料金条件を確認する。
エラー本文にpromptやファイル名が混ざる可能性があるログは、そのまま共有しません。原因究明に必要なstatus、endpoint、modelの識別情報、done状態だけに絞り、実データとsecretを除外します。
- Ollama Errors公式docs - statusとstream中のerrorを確認する
- Ollama troubleshooting - server・model・メモリの症状診断へ進む
- Ollama API認証 - local・cloud・API keyを分ける
最後のdone chunkからusageを記録する
native APIの最終レスポンスには、done、done_reasonに加えて、total_duration、load_duration、prompt_eval_count、prompt_eval_duration、eval_count、eval_durationなどのusageが含まれる場合があります。公式Usage docsでは時間の単位はナノ秒と説明されています。
# $chunk はdone=trueの最後のobject
$usage = [ordered]@{
model = $chunk.model
done = $chunk.done
done_reason = $chunk.done_reason
total_duration_ns = $chunk.total_duration
load_duration_ns = $chunk.load_duration
prompt_eval_count = $chunk.prompt_eval_count
eval_count = $chunk.eval_count
eval_duration_ns = $chunk.eval_duration
}
$usage | ConvertTo-Json- eval_durationが0または未返却なら、tokens/secを計算しない。
- 同じmodel、prompt長、context、options、warm/cold状態を揃えずに速度順位を作らない。
- load_durationとeval_durationを分け、初回ロードの待ち時間と生成時間を混同しない。
- usageは測定時点の観測値であり、モデルの品質・正確性・privacyの保証ではない。
streamingの目的は表示開始を早めることですが、最終的な速度・品質・消費メモリはmodel、context、PC、options、同時実行で変わります。計測を記事や比較表へ転用する場合は、条件と日時、versionを別に残してください。
- Ollama Usage公式docs - usage項目とナノ秒単位を見る
- ローカルAI速度ベンチマーク - 条件を揃えた計測の考え方を見る
- Ollamaモデルidentity - model ID・digest・実行状態を記録する
よくある質問
OllamaのAPIからJSONが何行も返るのはなぜですか?
native REST APIのstreamingが有効だからです。/api/generateや/api/chatでは、改行区切りのapplication/x-ndjsonとしてpartial responseが届く場合があります。stream=falseを指定すると、完成したapplication/jsonを読む基準を作れます。
Ollamaのstreamingを止めて完成JSONだけ受け取るには?
request bodyへstream: falseを明示します。PowerShellのInvoke-RestMethodでまず完成レスポンスを確認し、responseまたはmessage.content、done、done_reasonを確認してからstream=trueへ進むとparserの切り分けがしやすくなります。
/api/generateと/api/chatのstream parserは同じですか?
同じと決めつけません。/api/generateはpromptに対するchunk.response、/api/chatはmessagesに対するchunk.message.contentが中心です。endpoint、request、本文の場所、会話履歴の扱いを分けて実装します。
Ollama streamingのdoneは何を意味しますか?
生成が完了したchunkであることを示す終了状態です。done_reasonや最終usageが返る場合もあるため、本文へ連結せず保存します。接続が切れただけ、またはerror objectが届いただけなら、正常なdoneとは扱いません。
stream途中のエラーはHTTP 500で分かりますか?
必ずしも分かりません。stream開始後はHTTP statusを変更できず、application/x-ndjsonのobjectにerrorが入る場合があります。各行のerror propertyを確認し、最後の正常chunkと一緒に記録してください。
PowerShellでOllamaのNDJSONを読めますか?
読めます。最初の観察はcurl.exe -Nで到着単位を確認し、アプリ化するときはレスポンスを改行ごとに切り出してからConvertFrom-Jsonへ渡します。byte境界をJSON境界とみなさず、response・message・done・errorを分けて処理します。
PythonやJavaScript SDKでもstreamを指定できますか?
公式SDKのstream例があります。REST APIはstreamが既定で有効ですが、公式capabilities docsではSDK側は既定で無効と説明されているため、利用時点のPython・JavaScript SDK例でstream: true、chunkの型、thinkingやtool_callsの蓄積方法を確認してください。
次に読むおすすめルート
開発・API連携したい人
LM StudioとOllamaの違いを確認し、API、長文処理、RAGまで段階的に進みます。
- ローカルAIをAPIで使う方法
- WindowsでローカルAIコーディングを始める
- VS CodeでローカルAIを使う
- LM Studioのlms CLIを使う
- LM StudioのTool Useを使う
- LM StudioのStructured Outputを使う
- LM StudioのResponses APIを使う
- LM StudioのMCPをAPIで使う
- ローカルAIでJSON出力する方法
- LM StudioとOllamaの違い
- コンテキスト長とは
- RAG・埋め込み・ベクトルDBの仕組み
- OllamaのEmbedding APIを使う
- OllamaのResponses APIを使う
- OllamaのAPI認証を確認する
- OllamaをWindowsのLANから使う前の確認
- OllamaのモデルID・能力を確認する
- OllamaのModelfileを使う
- Ollama Web Search APIを使う
- OllamaのThinkingを使う
- LM StudioのEmbedding APIを使う
- RAG評価と引用確認の基礎
- faithfulness確認
- ローカルRAGのプライバシー
- MCPとは
- ローカルLLMの安全性とプライバシー
- Gemma 4 12Bの更新メモ
- Hermes Desktopとは
- Hermes DesktopとLM Studio接続
- Hermes DesktopとOllama接続
- Hermes Desktop接続トラブル
- Hermes DesktopでOpenRouterを使う
- Hermes DesktopでDeepSeek APIを使う
- Hermes DesktopでProviderを使い分ける
- Hermes DesktopとLM Studio接続の確認ポイント
- Hermes AgentとDesktopの違い
- Ollamaとは
- Windows ARMでローカルAIを使う前の確認
- WindowsでOllamaをインストールする
- Ollamaのローカルモデルとcloudモデルの違い
- Ollamaのモデル保存場所と移動
- Ollamaのモデル一覧・削除・容量整理
- OllamaのOpenAI互換APIを使う
- Ollamaのtool callingを使う
- OllamaのStructured Outputsを使う
- OllamaのEmbedding APIを使う
- OllamaのResponses APIを使う
- OllamaのAPI認証を確認する
- OllamaのモデルID・能力を確認する
- OllamaのModelfileを使う
- LM StudioのEmbedding APIを使う
- Ollamaの解説
- 診断基準
- 比較表
あなたはどのタイプ?
- 初めてローカルAIを触る人 - まず全体像をつかみ、LM StudioとOllamaの違い、モデルサイズの考え方を順番に確認します。
- LM Studio・Ollamaの症状別トラブルを解決したい人 - 起動、モデルロード、Prompt Processing、generation、API接続、GPU確認をツール別に分けて読みます。
- GPUなし・低スペックPCの人 - 軽量モデル、メモリ別の目安、重いときの確認ポイントを先に見ます。
- PDFや資料を読ませたい人 - 先に基本を押さえ、モデル単体の確認後にAnythingLLMへ進みます。
- ローカルAIエージェントを試したい人 - Bionic、Ollama、AnythingLLM、Hermesを役割別に分け、local/cloud、tool、保存、PC負荷を順番に確認します。
- 開発・API連携したい人 - LM StudioとOllamaの違いを確認し、API、長文処理、RAGまで段階的に進みます。
関連チェック先
- Ollama API: Streaming - REST APIの既定stream、application/x-ndjson、stream:falseの仕様を確認できます。
- Ollama capability: Streaming - Python・JavaScript SDKのstream、thinking、chunk蓄積の公式例を参照できます。
- Ollama API: Generate a response - /api/generateのprompt、response、done、usage、streamの仕様を確認できます。
- Ollama API: Generate a chat message - /api/chatのmessages、message.content、thinking、tool_calls、doneの仕様を確認できます。
- Ollama API: Usage - total_duration、eval_countなどのusage項目と単位を参照できます。
- Ollama API: Errors - HTTP status、JSON error、stream中のapplication/x-ndjsonエラーを確認できます。
- Ollama API Introduction - Windowsで使うlocalhostのnative APIとcloud APIのbase URLを分けて確認できます。
- Ollama Windows - Windows版Ollamaの起動、API、保存先・ログの前提を確認できます。