◉CLAUDE LABEN
●2.1.296 — サブエージェントごとに autoCompactWindow を指定でき、ワークフロー用のモデルも環境変数で固定できます●HAIKU 5.5 — 2.1.293(10/07)から claude-haiku-5-5 が Anthropic API の既定の Haiku モデルになりました●SONNET 4.5 — Claude API での提供終了は 11/30、残り47日。移行先は Sonnet 5.5●Q&A — Mod が「エラーなしで何も描かれない」ときに見る3か所が共有されています●AGENTS.MD — Codex と Claude Code を同じフォルダで使うとき、AGENTS.md と CLAUDE.md の入口をどう分けるかの整理が出ています●NEW — 「cd して git add して commit」の承認が毎回出るのは、設定の抜けではなく仕様でした●2.1.296 — サブエージェントごとに autoCompactWindow を指定でき、ワークフロー用のモデルも環境変数で固定できます●HAIKU 5.5 — 2.1.293(10/07)から claude-haiku-5-5 が Anthropic API の既定の Haiku モデルになりました●SONNET 4.5 — Claude API での提供終了は 11/30、残り47日。移行先は Sonnet 5.5●Q&A — Mod が「エラーなしで何も描かれない」ときに見る3か所が共有されています●AGENTS.MD — Codex と Claude Code を同じフォルダで使うとき、AGENTS.md と CLAUDE.md の入口をどう分けるかの整理が出ています●NEW — 「cd して git add して commit」の承認が毎回出るのは、設定の抜けではなく仕様でした
記事一覧/API & SDK
⬡ API & SDK/2026-07-11上級

本番で観測した引数分布からツールスキーマを締め直す

Claudeのツール呼び出しが渡してくる引数を本番で丸ごと記録し、その分布からJSON Schemaにenumやpatternを足して締め直す運用手法を整理しました。緩いスキーマが生む意味のドリフトの実例、段階的に締める手順、締め直し前後の実測値、状況別の推奨まで計測コード付きで紹介します。

Claude API127tool use5JSON Schema運用設計28可観測性5

✦ プレミアム記事

ある朝、通知系の小さなツールが「成功」を返しているのに、実際には何も送られていない事象に出会いました。

原因は引数でした。私のコードは status に "done" が来る前提で分岐していたのに、Claude はその日だけ "完了" という日本語の値を渡していたのです。スキーマ上は status: string としか書いておらず、モデルから見れば "完了" は完全に妥当な文字列。バリデーションも素通り。ログには tool executed とだけ残り、静かに分岐が外れていました。

個人開発で複数のアプリをまわしながら、通知やAdMobの集計といった小さな処理をClaudeのツール呼び出しに委ねていると、この種の「型は正しいが意味が違う」ズレが、忘れた頃に効いてきます。実行時バリデーションで弾くのは対症療法にすぎません。渡ってくる引数そのものを本番で観測し、スキーマを後から締め直す。この記事は、私自身がその運用にたどり着くまでの記録です。

緩いスキーマは「意味のドリフト」を生む

string や number としか書かれていない引数は、モデルにとって解釈の自由度が高すぎます。

Claude は文脈に応じて "done" と書く日も "完了" と書く日もあり、priority に "high" を入れる日も 3 を入れる日もあります。どれも JSON としては妥当。だからこそ、受け手のコードが暗黙に期待している「閉じた集合」との差分が、型検査をすり抜けて本番に届きます。

実行時バリデーションだけで守ろうとすると、常に後手に回ります。弾いた後にリトライさせ、また別の表記で返ってくる。バリデーション例外のログは増えるのに、根本の「モデルに許した表現の広さ」は縮まりません。

締めるべきは入口です。スキーマに enum を書けば、モデルはその集合の中からしか選べなくなります。制約はプロンプトの指示より強く効きます。

まず、引数を丸ごと記録する

締め直すには、まず実際に何が渡ってきているかを知る必要があります。ツール呼び出しの入力ブロックを、そのまま台帳に落とす薄いラッパを挟みます。

import Anthropic from "@anthropic-ai/sdk";
import { appendFile } from "node:fs/promises";
 
const client = new Anthropic();
 
type ToolCallRecord = {
  ts: string;
  model: string;
  tool: string;
  input: Record<string, unknown>;
};
 
async function logToolCalls(model: string, message: Anthropic.Message) {
  const rows: ToolCallRecord[] = [];
  for (const block of message.content) {
    if (block.type === "tool_use") {
      rows.push({
        ts: new Date().toISOString(),
        model,
        tool: block.name,
        input: block.input as Record<string, unknown>,
      });
    }
  }
  if (rows.length === 0) return;
  // 1行1レコードのJSONL。集計しやすく、追記で壊れにくい
  const jsonl = rows.map((r) => JSON.stringify(r)).join("\n") + "\n";
  await appendFile("tool_calls.jsonl", jsonl);
}
 
const res = await client.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  tools: myTools,
  messages,
});
await logToolCalls("claude-sonnet-5", res);

ポイントは、値を加工せず生のまま残すことです。正規化してから記録すると、まさに観測したい「表記の揺れ」が消えてしまいます。個人情報を含む引数だけは、記録前にフィールド単位でマスクしておきます。

✦

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

この記事の続きを読む

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

この記事で得られること
✦tool_use入力ブロックを丸ごと記録する薄いラッパの実装(モデル名・タイムスタンプ付き)
✦引数の値分布からenum・pattern・数値範囲を自動抽出する解析コード
✦警告のみ→ソフト制約→ハード制約と段階的に締めるロールアウト手順と、締めすぎで空ツール呼び出しを招く境界の見極め方
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⬡ API & SDK2026-08-30
モデルIDを一括置換する前に、手元の CLI が抱えるカタログを引きます
新しい世代が出ると、前の世代のモデルIDが急に古く見えます。インストール済みの実行ファイルに埋め込まれたカタログを引き、一致・日付不一致・書式破損の三段に仕分けてから直す手順を、実測値とスクリプトつきでまとめました。
⬡ API & SDK2026-10-13
Haiku 5.5 は単価が下がるのに、4.5 換算で約 7.7 万トークンを超えると請求が跳ねます
Haiku 4.5 から 5.5 へ移すと、価格表だけ見れば約 1/10 です。ただし同じ文章が約 30% 多いトークンになり、入力が 10 万を超えた時点で単価が 5 倍になります。境目を 4.5 換算で計算し、実際に動かした出力と、移行時に直す 400 の項目を並べました。
⬡ API & SDK2026-10-08
Sonnet 4.5 の退役前に、コードに残った「400 になる引数」を一本のスクリプトで拾いました
claude-sonnet-4-5 は 11 月 30 日に退役します。モデル ID を書き換えるだけでは、budget_tokens・prefill・tool_choice などで 400 が返ります。公式の移行ガイドの該当箇所を正規表現にしたスキャナと、実行結果、直し方の順番をまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます