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と説明されています。

Ollama native API streamingの確認順
目的使う指定・形式最初に確認する値
完成したJSONを読むstream: false / application/jsonHTTP status、responseまたはmessage.content、done
生成中の文字列を表示するstream: true / application/x-ndjson1行1JSON、responseまたはmessage.content、done
途中で壊れた原因を見る各chunkのerrorとHTTP statusstream開始前のstatus、開始後のerror object
速度や負荷を記録する最後のdone chunktotal_duration、eval_count、eval_durationなど

最初から逐次表示とJSON Schema、tool calling、長文を同時に足すと、モデル・endpoint・parserのどこで失敗したか分かりにくくなります。短い非機密の入力をstream=falseで動かし、同じmodelとpayloadをstream=trueへ変える順番が安全です。

まず/api/generateと/api/chatの違いを固定する

native APIを使うときは、単発のpromptを送る/api/generateと、messages配列で会話を送る/api/chatを分けます。同じlocalhost:11434でも、返答の本文を読む場所が異なるため、片方のparserをもう片方へ流用しません。

Ollama nativeとOpenAI互換APIのstream形式を分ける表
endpointrequestの中心chunkで読む本文向いている最初の確認
/api/generatemodel、prompt、streamchunk.response単発promptとNDJSONの行読み
/api/chatmodel、messages、streamchunk.message.content会話履歴とassistant messageの蓄積
/v1/chat/completionsOpenAI互換messagesSSEやclient固有のchoices既存OpenAI clientの再利用
/v1/responsesOpenAI互換inputResponsesのevent・outputResponses APIのstateful境界

API形式を変えるときは、endpoint、request field、本文の場所、終了条件、エラーの表現を一緒に変える必要があります。「localhostだから同じJSON」と扱わず、最初のレスポンスを保存してからparserの契約を決めてください。

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
  1. ollama lsで取得済みのmodel名を確認し、記事例のmodel名をそのまま信用しない。
  2. 短い非機密promptとstream = $falseを/api/generateへ送る。
  3. HTTP statusが成功でも、response、done、done_reasonを確認する。
  4. 同じmodelとpromptで、次の段階だけstream = $trueへ変更する。

Structured Outputsや長文の評価を始める前に、短い完成レスポンスの形を保存します。モデルの品質、速度、JSONとしての妥当性はこの疎通成功だけでは保証されないため、用途別の検証を別に行います。

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応答も確認します。

行単位で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を終了する
}
Ollama streaming chunkの蓄積ルール
フィールド蓄積の扱い注意点
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型を確認します。

途中エラーはHTTP statusだけでなく各chunkのerrorを見る

Ollama公式Errors docsでは、stream開始後にエラーが発生すると、HTTP statusを変更できずapplication/x-ndjsonのobjectとしてerrorが返る場合があると説明されています。したがって、statusが200だから最後まで成功した、接続が閉じたから正常終了した、とは判断しません。

Ollama streamingエラーの層別診断
症状確認する場所最初の切り分け
stream開始前の400HTTP statusとerror本文JSON、必須model、request field、endpoint
404 model not foundHTTP status、model、/v1/models・/api/tagsserverの向き、tag、model ID
stream途中のerrorNDJSON各行のerror propertydone扱いにせず、最後の正常chunkと原因を保存
429 / 502HTTP statusとlocal/cloud経路rate limit、cloud接続、認証、再試行条件
表示が止まる最後のchunk、done、server log、負荷parser、model、context、メモリを一度に変えない
  1. 同じmodelと短い入力をstream=falseで再実行し、完成JSONが返るか確認する。
  2. stream=trueの最初のerror行または最後の正常行を、秘密情報を除いて保存する。
  3. endpoint・model・context・client・proxyを一度に変更せず、1項目ずつ戻す。
  4. cloud modelやLAN公開が関係する場合はlocal APIの成功と分けて認証・privacy・料金条件を確認する。

エラー本文にpromptやファイル名が混ざる可能性があるログは、そのまま共有しません。原因究明に必要なstatus、endpoint、modelの識別情報、done状態だけに絞り、実データとsecretを除外します。

最後の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の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まで段階的に進みます。

  1. ローカルAIをAPIで使う方法
  2. WindowsでローカルAIコーディングを始める
  3. VS CodeでローカルAIを使う
  4. LM Studioのlms CLIを使う
  5. LM StudioのTool Useを使う
  6. LM StudioのStructured Outputを使う
  7. LM StudioのResponses APIを使う
  8. LM StudioのMCPをAPIで使う
  9. ローカルAIでJSON出力する方法
  10. LM StudioとOllamaの違い
  11. コンテキスト長とは
  12. RAG・埋め込み・ベクトルDBの仕組み
  13. OllamaのEmbedding APIを使う
  14. OllamaのResponses APIを使う
  15. OllamaのAPI認証を確認する
  16. OllamaをWindowsのLANから使う前の確認
  17. OllamaのモデルID・能力を確認する
  18. OllamaのModelfileを使う
  19. Ollama Web Search APIを使う
  20. OllamaのThinkingを使う
  21. LM StudioのEmbedding APIを使う
  22. RAG評価と引用確認の基礎
  23. faithfulness確認
  24. ローカルRAGのプライバシー
  25. MCPとは
  26. ローカルLLMの安全性とプライバシー
  27. Gemma 4 12Bの更新メモ
  28. Hermes Desktopとは
  29. Hermes DesktopとLM Studio接続
  30. Hermes DesktopとOllama接続
  31. Hermes Desktop接続トラブル
  32. Hermes DesktopでOpenRouterを使う
  33. Hermes DesktopでDeepSeek APIを使う
  34. Hermes DesktopでProviderを使い分ける
  35. Hermes DesktopとLM Studio接続の確認ポイント
  36. Hermes AgentとDesktopの違い
  37. Ollamaとは
  38. Windows ARMでローカルAIを使う前の確認
  39. WindowsでOllamaをインストールする
  40. Ollamaのローカルモデルとcloudモデルの違い
  41. Ollamaのモデル保存場所と移動
  42. Ollamaのモデル一覧・削除・容量整理
  43. OllamaのOpenAI互換APIを使う
  44. Ollamaのtool callingを使う
  45. OllamaのStructured Outputsを使う
  46. OllamaのEmbedding APIを使う
  47. OllamaのResponses APIを使う
  48. OllamaのAPI認証を確認する
  49. OllamaのモデルID・能力を確認する
  50. OllamaのModelfileを使う
  51. LM StudioのEmbedding APIを使う
  52. Ollamaの解説
  53. 診断基準
  54. 比較表

あなたはどのタイプ?

関連チェック先

  • 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、保存先・ログの前提を確認できます。

関連ツール

比較表を見る / 最初に検討しやすいツールを確認する