CLAUDE LABEN
BILLING — 6/15発効の課金変更から2日目。Agent SDK・headless・GitHub Actions・他社エージェントは別枠の月次クレジット($20/$100/$200・full APIレート・繰越なし)へ移行済みで、初日の実コスト実測が運用見直しの起点になりますREGULATED — TCSとAnthropicが提携し、銀行・航空など規制業界へClaudeを導入。DXCも既存システムへの統合を進め、エンタープライズ採用が一段と広がっていますRETIRED — Sonnet 4とOpus 4が6/15にAPIから引退。旧世代を参照するスクリプトは最新世代(Opus 4.8など)へ切替済みか、ログで再確認する段階ですEXPORT — Claude Fable 5・Mythos 5は米政府の輸出管理指令による停止が継続中(6/12〜)。Anthropicは早期復旧を目指すと表明していますSAFE — 停止対象は新Mythosクラス2モデルのみで、Opus 4.8など他の全モデルは通常どおり稼働していますSUBAGENTS — Claude Codeはサブエージェントが自身のサブエージェントを生成可能(最大5階層)。多段委譲ワークフローの設計自由度が広がっていますBILLING — 6/15発効の課金変更から2日目。Agent SDK・headless・GitHub Actions・他社エージェントは別枠の月次クレジット($20/$100/$200・full APIレート・繰越なし)へ移行済みで、初日の実コスト実測が運用見直しの起点になりますREGULATED — TCSとAnthropicが提携し、銀行・航空など規制業界へClaudeを導入。DXCも既存システムへの統合を進め、エンタープライズ採用が一段と広がっていますRETIRED — Sonnet 4とOpus 4が6/15にAPIから引退。旧世代を参照するスクリプトは最新世代(Opus 4.8など)へ切替済みか、ログで再確認する段階ですEXPORT — Claude Fable 5・Mythos 5は米政府の輸出管理指令による停止が継続中(6/12〜)。Anthropicは早期復旧を目指すと表明していますSAFE — 停止対象は新Mythosクラス2モデルのみで、Opus 4.8など他の全モデルは通常どおり稼働していますSUBAGENTS — Claude Codeはサブエージェントが自身のサブエージェントを生成可能(最大5階層)。多段委譲ワークフローの設計自由度が広がっています
記事一覧/API & SDK
API & SDK/2026-06-16上級

Claudeの構造化出力を本番で信頼する — 検証ゲートと修復ループの設計

Claude APIの構造化出力が「たまに」壊れる本番環境で、tool useによる強制・スキーマ検証ゲート・一度だけの修復ループ・劣化フォールバックを組み合わせ、壊れたJSONを運用から消すための設計をコード付きで解説します。

Claude API72構造化出力tool use3JSON Schema信頼性設計

プレミアム記事

ある朝、自動投稿パイプラインのログを開くと、記事メタデータの組み立てが一件だけ止まっておりました。

原因は単純でした。Claude に返させた JSON が、tags 配列の途中で途切れていたのです。前日まで数百件を問題なく処理していた同じプロンプト、同じモデル。たった一件の途切れた出力が、後続のバリデーションを巻き込んで全体を落としていました。

構造化出力は「ほぼ」正しく返ります。問題は、この「ほぼ」が個人開発の自動運用では命取りになることです。私自身、一日に何百回も走る処理を個人で回していますが、0.5% の失敗でも毎日数件のエラーになります。手で直す前提の設計は、そこで破綻します。

ここからは、個人開発で4サイトの記事生成パイプラインを回しながら、構造化出力を信頼できるところまで持っていった設計を、コード付きで共有いたします。鍵は「壊れない前提」を捨て、「壊れたときに自動で立て直す」前提で組むことです。

構造化出力が「たまに」壊れる3つのパターン

まず、何が起きているのかを切り分けます。本番で観測した破綻は、大きく三つに分かれました。

一つ目は 途中切れmax_tokens に達して JSON が閉じる前に終わる場合です。配列やオブジェクトの途中で止まり、パースが即座に失敗します。長いタグ列や本文要約を返させると起きやすくなります。

二つ目は 形式の逸脱。JSON としては有効でも、こちらが期待する型と違う場合です。level"beginner-intermediate" のような想定外の値が入る、数値であるべき場所に文字列が来る。パースは通るのに、後続のロジックが静かに壊れます。これが一番たちが悪い種類です。

三つ目は 混入。JSON の前後に「以下が生成した結果です」といった説明文が付く場合です。モデルに「JSON だけ返して」と指示しても、温度設定やプロンプトの組み方によっては前置きが混ざります。

この三つは、対処法がそれぞれ違います。一つの防御で全部を塞ごうとすると、どこかに穴が残ります。層で守るのが正解です。

第一防衛線 — tool useで出力形式を強制する

混入を消す最も確実な方法は、自由記述で JSON を書かせるのをやめることです。Claude の tool use を使い、ツールの入力スキーマとして構造を定義し、tool_choice でそのツールの呼び出しを強制します。

こうするとモデルは「ツールへの引数」として構造化データを組み立てるため、前置きや後置きの説明文が原理的に入りません。

import Anthropic from "@anthropic-ai/sdk";
 
const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
 
const articleMetaTool = {
  name: "emit_article_meta",
  description: "記事のメタデータを構造化して返す",
  input_schema: {
    type: "object",
    properties: {
      title: { type: "string", maxLength: 60 },
      level: { type: "string", enum: ["beginner", "intermediate", "advanced"] },
      tags: { type: "array", items: { type: "string" }, minItems: 2, maxItems: 5 },
      premium: { type: "boolean" },
    },
    required: ["title", "level", "tags", "premium"],
  },
} as const;
 
async function generateMeta(source: string) {
  const res = await client.messages.create({
    model: "claude-opus-4-8",
    max_tokens: 1024,
    tools: [articleMetaTool],
    tool_choice: { type: "tool", name: "emit_article_meta" },
    messages: [{ role: "user", content: `次の記事からメタデータを抽出してください。\n\n${source}` }],
  });
 
  const block = res.content.find((b) => b.type === "tool_use");
  if (!block || block.type !== "tool_use") {
    throw new Error("tool_use block not returned");
  }
  return block.input; // ここはまだ「型が保証されていない」点に注意
}

ここで強調したいのは、最後のコメントです。input_schemaenumminItems を書いても、API はそれを保証してくれません。スキーマはモデルへのヒントであって、バリデータではないのです。公式ドキュメントはツール入力スキーマの書式を説明しますが、「返り値がスキーマに必ず合致するわけではない」という運用上の含意までは強調していません。私はここで一度痛い目を見ました。

tool use は混入を消し、途中切れを大幅に減らします。けれども形式の逸脱は依然として通り抜けます。だから次の層が要ります。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
tool useで出力形式を強制しても壊れる3つのパターンと、その見分け方
スキーマ検証ゲートと「差分だけ返す」修復ループの実装コード(TypeScript)
修復しても駄目なときの劣化フォールバック設計と、失敗率を運用で潰す手順
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

API & SDK2026-05-28
Claude API のストリーミングで tool_use の引数が JSON パースに失敗する原因と対処
Claude API のストリーミングで tool_use を受け取ると、なぜか JSON.parse が SyntaxError を返す。input_json_delta の正しい組み立て手順と、再接続時の取りこぼし対策をまとめます。
API & SDK2026-03-19
Claude API 高度なツール使用:Tool Search・Programmatic Tool Calling・Tool Use Examples で大規模エージェントを構築する
Claude API の高度なツール使用機能(Tool Search・Programmatic Tool Calling・Tool Use Examples)を徹底解説。トークン85%削減、レイテンシ37%改善を実現する本番レベルの実装パターンを完全動作コードで解説します。
API & SDK2026-06-16
予約実行が始まる前に、使うモデルが本当に応答するか1回だけ確かめる
設定したモデルが、夜間ジョブが動き出す前に消えていることがあります。引退・撤回・地域制限の3つを起動時の1回のプローブで見分け、適格なモデルへ実行設定を自動で書き換える設計を TypeScript の動くコードでまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →