OllamaのStructured OutputsをWindowsで使う方法|JSON Schema・Python・JavaScript

公開日
2026-08-09
更新日
2026-08-09
情報確認日
2026-08-09
編集・運営
Local AI Compass

OllamaのStructured Outputsは、モデルの返答をJSON Schemaに合わせて受け取り、アプリ側で検証しやすくする機能です。Windowsではまずnativeの /api/chat に format を渡し、PowerShellで短いschemaを試してから、PythonのPydanticやJavaScriptのZodによる検証、OpenAI互換APIとの違いへ進みます。

導入前に確認すること

  • Windowsのバージョン、メモリ容量、GPU/VRAM、空き容量を確認する
  • 最初は軽量モデル、短い質問、少ない同時作業から始める
  • 公式サイトの対応OS、利用規約、モデルのライセンスを確認する

先に結論:JSON modeとJSON Schemaを使い分ける

Ollama公式docsでは、nativeのPOST /api/chatにformat: "json"を渡す方法と、formatへJSON Schemaオブジェクトを渡す方法が案内されています。JSON modeはJSONらしい返答の入口、schema指定は項目・型・requiredをアプリ側の契約として明示する入口です。

Ollama Structured Outputsの入口
目的native APIで見る項目最初の確認
JSONとして返すformat: "json"response.message.contentをJSON.parseできるか
項目と型を固定するformat: { type: "object", ... }required、properties、配列の形が合うか
プログラムで検証するPydantic / Zodなどparse・validationエラーを表示できるか
関数を呼び出すtools・tool_callsStructured Outputとは別の実行フローか

Structured Outputsは返答の形を整える機能です。モデルが外部関数を呼び出すtool calling、文書を検索するRAG、MCPでツールを接続する処理とは目的が違います。JSONが正しくても、内容の事実性や実行許可まで保証するものではありません。

WindowsでOllama・モデル・localhostを分けて確認する

Structured Outputsの失敗をschemaだけの問題にしないため、Ollama本体、モデル名、通常のchat、API接続を別々に確認します。端末で通常の返答が成功しても、schema付きの応答や検証まで同じように動くとは限りません。

  1. OllamaをWindowsで起動し、PowerShellでollama lsとollama psを実行する。
  2. 利用するモデルの名前とタグ、空き容量、モデルカードの対応情報を確認する。
  3. ollama run MODELで短い通常chatを1回行い、モデル単体が応答することを確認する。
  4. GET http://localhost:11434/api/tagsでAPI接続とモデル一覧を確認する。
  5. 最初はstream=false、短い入力、3項目程度のschema、temperature 0に近い設定で基準を作る。
ollama ls
ollama ps
ollama run MODEL
GET http://localhost:11434/api/tags

公式サンプルのモデル名は説明用の例です。手元のモデルのサイズ、chat template、対応機能、利用可能なタグを確認し、成功を固定モデル全体へ一般化しません。

PowerShellからnative /api/chatへJSON Schemaを渡す

WindowsのPowerShellでは、JSONを文字列として手作業でエスケープするより、ハッシュテーブルをConvertTo-Jsonで組み立てるとschemaの階層を確認しやすくなります。Ollama Chat APIのstream既定値はtrueなので、最初はfalseにして完成したmessage.contentを検証します。

$body = @{
  model = "MODEL"
  messages = @(@{ role = "user"; content = "商品メモを分類してください" })
  stream = $false
  format = @{
    type = "object"
    properties = @{
      category = @{ type = "string" }
      summary = @{ type = "string" }
      tags = @{ type = "array"; items = @{ type = "string" } }
    }
    required = @("category", "summary", "tags")
  }
  options = @{ temperature = 0 }
} | ConvertTo-Json -Depth 10

$response = Invoke-RestMethod `
  -Uri "http://localhost:11434/api/chat" `
  -Method Post `
  -ContentType "application/json" `
  -Body $body

$result = $response.message.content | ConvertFrom-Json
$result | ConvertTo-Json
PowerShellでのStructured Outputs確認箇所
確認点見る場所失敗時の分岐
HTTP応答$responseserver、port、model、JSON bodyを確認する
本文の場所$response.message.contentthinkingやmetadataを本文と混ぜない
JSON parseConvertFrom-Jsonschema、出力途中、余分な説明文を確認する
項目の意味category・summary・tags値の候補や長さをアプリ側で検証する

schemaを渡しても、返った文字列をそのまま信頼できるとは限りません。JSONとして読めること、期待した項目があること、値の範囲が正しいことを順に確認します。

PythonではPydanticのschemaと検証を分ける

Ollama公式のPython例では、Pydanticモデルのmodel_json_schema()をformatへ渡し、返ったmessage.contentをmodel_validate_json()で検証します。schemaを生成する処理と、受け取ったJSONを信頼できるデータへ変換する処理を同じものと考えないことが重要です。

from ollama import chat
from pydantic import BaseModel

class Note(BaseModel):
    category: str
    summary: str
    tags: list[str]

response = chat(
    model="MODEL",
    messages=[{"role": "user", "content": "商品メモを分類してください"}],
    format=Note.model_json_schema(),
    options={"temperature": 0},
)

note = Note.model_validate_json(response.message.content)
print(note.category)
print(note.tags)
  • Pydanticの型とrequired項目を、モデルへ渡すschemaの契約として先に決める。
  • JSON文字列をmodel_validate_json()へ渡し、parse失敗を成功扱いにしない。
  • 値の候補、文字列の長さ、配列の件数、業務上の妥当性は別のチェックとして持つ。
  • schemaを複雑にしすぎず、まず分類・短い要約・タグのような小さな出力で確認する。

Python SDKやPydanticをサイトの依存関係へ追加する手順ではありません。読者のアプリ側で既存の環境に合わせて導入し、バージョンとエラー処理を管理します。

JavaScriptではZodでJSON.parse後の型を検証する

Ollama公式のJavaScript例では、Zod schemaをz.toJSONSchema()でformatへ渡し、返ったmessage.contentをJSON.parseしてからSchema.parse()へ通します。JSON.parseできたことと、アプリが期待する型・値になっていることは別の判定です。

import ollama from "ollama"
import * as z from "zod"

const Note = z.object({
  category: z.string(),
  summary: z.string(),
  tags: z.array(z.string()),
})

const response = await ollama.chat({
  model: "MODEL",
  messages: [{ role: "user", content: "商品メモを分類してください" }],
  format: z.toJSONSchema(Note),
  options: { temperature: 0 },
})

const note = Note.parse(JSON.parse(response.message.content))
console.log(note.category, note.tags)
JavaScript Structured Outputsの検証段階
段階処理失敗を分ける理由
schema生成z.toJSONSchema(Note)モデルへ要求する形を固定する
JSON化JSON.parse(content)本文がJSONとして読めるかを見る
型検証Note.parse(value)required、型、配列を確認する
業務検証アプリ固有の条件値の妥当性や副作用を別に確認する

stream=trueへ進む場合も、断片を完成させる前にJSON.parseやアプリ処理を始めません。まず非streamで基準を作り、chunkの収集、終了条件、空応答、再試行を別に設計します。

OpenAI互換・Tool calling・local/cloudの境界を確認する

Ollamaのnative APIではformatへJSON Schemaを渡します。公式のOpenAI互換APIでは、既存clientのbase URLをhttp://localhost:11434/v1/へ向け、Structured Outputsはresponse_formatとして扱う入口がありますが、native APIと同じフィールドがすべて同じ挙動になるとは限りません。

Ollama連携方式の境界
仕組み主な入口返したいもの
native Structured OutputsPOST /api/chatformat: "json"またはJSON Schemaのcontent
OpenAI互換Structured OutputsPOST /v1/chat/completionsresponse_formatと互換clientのresponse
Tool callingtools・tool_calls関数呼び出し要求と実行結果の往復
MCPホストとMCP server外部tool/resourceへの接続と権限
Ollama Cloudcloud model/providerStructured Outputsは公式docsの現行注記を確認する

Ollama公式Structured Outputs docsには、Ollama Cloudは現在structured outputsをサポートしないという注記があります。local modelとcloud modelをモデル名だけで同一視せず、利用するendpoint、provider、保存・送信範囲を確認します。

Structured Outputsが崩れるときの切り分け

JSON Schemaを渡しても、モデル、schema、stream、入力、SDK、API endpointのどこで失敗したかを分けて確認します。公式docsもPydanticやZodによる検証、temperatureを低くすること、schemaの意図をpromptにも含めることを信頼性のヒントとして挙げています。

  1. まずollama run MODELで通常chatが返るか、次にnative /api/chatでstream=falseが返るか確認する。
  2. format: "json"でJSON.parseまたはConvertFrom-Jsonできるか確認し、schema付きへ進む。
  3. schemaの項目数、ネスト、requiredを減らし、短い入力とtemperature 0に近い設定で再試行する。
  4. 本文をJSON.parseした後にPydantic、Zod、アプリ固有の値検証を行う。
  5. nativeとOpenAI互換、localとcloud、Structured Outputとtool callingを混ぜず、失敗した層だけを修正する。
  • 余分な説明文が混ざる場合は、schema・prompt・endpoint・model・streamを確認する。
  • required項目が欠ける場合は、schemaを短くし、モデルの対応情報と出力ログを確認する。
  • parseは成功しても値が不適切な場合があるため、列挙値、長さ、件数、業務ルールを追加検証する。
  • 実データ、秘密情報、削除・書き込み・外部送信を最初のテスト対象にしない。

よくある質問

OllamaのStructured Outputsとは何ですか?

モデルの返答をJSON Schemaに合わせ、アプリから検証しやすくする機能です。Ollamaのnative /api/chatではformatへjsonまたはJSON Schemaを渡す方法が案内されていますが、内容の正しさや業務上の妥当性まで保証するものではありません。

Windowsのnative APIではどのendpointを使いますか?

この記事の中心はhttp://localhost:11434/api/chatです。まずstream:falseで完成したresponse.message.contentを受け取り、JSON.parseやConvertFrom-Json、Pydantic、Zodなどで検証します。

format: "json"とJSON Schemaは何が違いますか?

format: "json"はJSONとして返す入口です。JSON Schemaを渡す方法では、properties、型、requiredなど返答の形をより具体的に指定できます。どちらも返答後の検証は必要です。

Pythonではどのように検証しますか?

Pydanticのmodel_json_schema()をformatへ渡し、返ったresponse.message.contentをmodel_validate_json()へ通す方法が公式例にあります。schema生成と、返答の内容が業務上正しいかの検証は分けてください。

JavaScriptでもStructured Outputsを使えますか?

使えます。Ollama公式例ではZod schemaをz.toJSONSchema()でformatへ渡し、JSON.parseした結果をSchema.parse()で検証しています。streamingする場合は、chunkを完成させてからJSON化します。

Structured Outputsとtool callingは同じですか?

同じではありません。Structured Outputsは返答JSONの形を整える機能、tool callingはモデルが関数呼び出しを提案し、アプリが検証・実行して結果を戻す機能です。関数実行の許可は別に設計します。

Ollama CloudでもStructured Outputsを使えますか?

Ollama公式のStructured Outputs docsには、Ollama Cloudは現在structured outputsをサポートしないという注記があります。local modelとcloud modelを混同せず、利用時点の公式docs、endpoint、providerの対応状況を確認してください。

次に読むおすすめルート

開発・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 native API streamingを使う
  20. Ollama Web Search APIを使う
  21. OllamaのThinkingを使う
  22. LM StudioのEmbedding APIを使う
  23. RAG評価と引用確認の基礎
  24. faithfulness確認
  25. ローカルRAGのプライバシー
  26. MCPとは
  27. ローカルLLMの安全性とプライバシー
  28. Gemma 4 12Bの更新メモ
  29. Hermes Desktopとは
  30. Hermes DesktopとLM Studio接続
  31. Hermes DesktopとOllama接続
  32. Hermes Desktop接続トラブル
  33. Hermes DesktopでOpenRouterを使う
  34. Hermes DesktopでDeepSeek APIを使う
  35. Hermes DesktopでProviderを使い分ける
  36. Hermes DesktopとLM Studio接続の確認ポイント
  37. Hermes AgentとDesktopの違い
  38. Ollamaとは
  39. Windows ARMでローカルAIを使う前の確認
  40. WindowsでOllamaをインストールする
  41. Ollamaのローカルモデルとcloudモデルの違い
  42. Ollamaのモデル保存場所と移動
  43. Ollamaのモデル一覧・削除・容量整理
  44. OllamaのOpenAI互換APIを使う
  45. Ollamaのtool callingを使う
  46. OllamaのEmbedding APIを使う
  47. OllamaのResponses APIを使う
  48. OllamaのAPI認証を確認する
  49. OllamaのモデルID・能力を確認する
  50. OllamaのModelfileを使う
  51. Ollama native API streamingを使う
  52. LM StudioのEmbedding APIを使う
  53. Ollamaの解説
  54. 診断基準
  55. 比較表

あなたはどのタイプ?

関連チェック先

  • Ollama Structured Outputs - native /api/chatのformat、JSON Schema、Python・JavaScript・vision例を確認できます。
  • Ollama Chat API - messages、format、stream、response.message.contentのAPI仕様を確認できます。
  • Ollama OpenAI compatibility - OpenAI互換のbase URL、response_format、対応endpointの境界を確認できます。
  • Ollama Windows - Windows版Ollamaの起動とローカルAPI利用の前提を確認できます。
  • Ollama Quickstart - モデルを実行し、ローカルAPIを使い始める入口を確認できます。
  • Ollama Tool calling - Structured Outputsとtool callingを別機能として比較するための公式資料です。
  • Ollama Models - モデル名やタグを確認する公式のモデル一覧です。

関連ツール

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