はじめに
2026年9月24日付で、Claude API とその周辺プロダクト(Compliance API、Claude for Microsoft 365)に複数のアップデートが入りました。中でも注目すべきは以下の3点です。
- 出力開始前の拒否応答(refusal)の一部カテゴリで課金が再開された(コスト試算への影響あり)
- Compliance API の Activity Feed がファイル名・ドキュメント名を返さなくなる破壊的変更(過去データにも遡及適用)
- **キャッシュ診断(Cache diagnostics)が正式提供(GA)**となり、リクエスト仕様が変わった
いずれも「知らないうちに請求額が変わる」「知らないうちに監査ログが壊れる」「知らないうちにキャッシュ診断が動かなくなる」という、静かに実害が出るタイプの変更です。Compliance/監査基盤や、コスト監視、プロンプトキャッシュを使っているチームは特に確認してください。
変更の全体像
変更内容
1. 出力開始前の拒否応答、一部カテゴリで課金再開(severity: high)
📌 影響を受ける人: Claude API のコストを厳密に見積もっている開発者・FinOps担当者
これまで、出力が始まる前に返される拒否応答(refusal)は基本的に無料でした。今回、stop_details.category が以下の3種類の場合に限り、通常のリクエストと同じ料金体系(実行モデルの料金)で課金されるようになりました。
biofrontier_llmreasoning_extraction
これらは誤検知(false positive)が少ないと計測で確認されているカテゴリです。それ以外のカテゴリで出力前に拒否された場合は、引き続き無料です。また、ストリーミング途中で発生する拒否は、これまでも課金対象だったため変更はありません。フォールバッククレジットの扱いにも変更はなく、全プラットフォーム共通の適用です。
| 拒否のタイミング | カテゴリ | 課金 |
|---|---|---|
| 出力開始前 | bio / frontier_llm / reasoning_extraction | ✅ 課金される(新規) |
| 出力開始前 | 上記以外 | ❌ 引き続き無料 |
| ストリーミング途中 | 全カテゴリ | ✅ 従来通り課金 |
2. Compliance API の Activity Feed が破壊的変更(severity: critical)
⚠️ Breaking Change
Compliance API の Activity Feed で、file・project document・artifact の各アクティビティに含まれるfilenameとtitleフィールドが、常に空または省略されるようになりました。この変更は過去に記録済みのアクティビティにも遡及適用されます。
監査・コンプライアンス連携システムがファイル名やドキュメントタイトルを表示・検索条件に使っている場合、突然データが欠落する形になります。名前が必要な場合は、アクティビティに含まれる ID を使い、read:compliance_user_data スコープを持つ Compliance Access Key で別途取得する必要があります。
対応が必要な人: Compliance API の Activity Feed から filename / title を読み取って表示・レポート・アラートに使っている実装は、すべて改修が必要です。
3. キャッシュ診断のフィンガープリント保存条件が変更(severity: high、9月9日付)
キャッシュ診断(cache diagnostics)で、リクエストのフィンガープリントが保存されるのは diagnostics オブジェクトを含むリクエストのみになりました。cache-diagnosis-2026-04-07 ベータヘッダーだけを送るリクエストも引き続き受け付けられますが、フィンガープリントは保存されません。
その結果、後続ターンで previous_message_id にそのリクエストを指定すると previous_message_not_found エラーが返ります。
4. キャッシュ診断が正式提供(GA)に(severity: medium)
キャッシュ診断がベータを終了し、cache-diagnosis-2026-04-07 ベータヘッダーが不要になりました(送っても動作します)。利用するには diagnostics オブジェクトをリクエストに含めます。
POST /v1/messages のレスポンスには、diagnostics フィールドが常に含まれるようになりました。リクエストに diagnostics を指定しない場合の値は null です。
💡 Tips
レスポンスの型定義で「diagnosticsフィールドが存在しない」前提のパース処理をしていると、null値の扱いで想定外の挙動になる可能性があります。オプショナルチェイニングや null チェックを見直しましょう。
5. Claude for Microsoft 365 向け Compliance API ローカルセッションエンドポイントが GA(severity: medium)
Excel・PowerPoint・Word・Outlook 上の Claude for Microsoft 365 セッション(product_surface が office_agents で始まるもの)を対象にした Compliance API のローカルセッションエンドポイントがベータを終了しました。
影響と対応
| # | 変更 | severity | 対応要否 | やること |
|---|---|---|---|---|
| 1 | 拒否応答の課金再開 | high | ✅ | コスト監視ダッシュボードに stop_details.category 別の集計を追加し、拒否率とコストへの影響を確認 |
| 2 | Activity Feed の filename/title 欠落 | critical | ✅ | filename/title 依存のコードを ID ベースの取得に置き換え |
| 3 | フィンガープリント保存条件変更 | high | ✅ | 全ターンで diagnostics オブジェクトを送信、初回は previous_message_id: null を指定 |
| 4 | キャッシュ診断 GA | medium | 任意 | ベータヘッダーは削除可能。レスポンスの diagnostics: null 処理を確認 |
| 5 | レスポンスに diagnostics 常時付与 | low | 任意 | フィールド有無で分岐しているコードがあれば確認 |
| 6 | M365 Compliance エンドポイント GA | medium | 不要 | 特別な対応不要(ベータ終了の告知のみ) |
コード例
Before(旧: ヘッダーのみでキャッシュ診断を利用)
curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-beta: cache-diagnosis-2026-04-07" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-5",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Hello"}]
}'
この形式では diagnostics オブジェクトが無いため、フィンガープリントが保存されず、次ターンで previous_message_id を指定すると previous_message_not_found になります。
After(新: diagnostics オブジェクトを明示的に指定)
curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-5",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Hello"}],
"diagnostics": {},
"previous_message_id": null
}'
2ターン目以降は、前ターンで得た message_id を previous_message_id に指定し、diagnostics オブジェクトを毎回含めます。ベータヘッダーはもう不要です。
Compliance API: filename/title に依存しない実装への置き換え
- const activity = await complianceClient.getActivity(activityId);
- console.log(activity.filename); // 常に空/undefined になる
+ const activity = await complianceClient.getActivity(activityId);
+ // read:compliance_user_data スコープの Access Key で ID から名前解決
+ const fileDetail = await complianceClient.getUserDataById(
+ activity.id,
+ { scope: "read:compliance_user_data" }
+ );
+ console.log(fileDetail.filename);
まとめ
-
拒否応答の課金再開(high):
bio/frontier_llm/reasoning_extractionカテゴリの出力前拒否は通常料金で課金される。コスト試算を見直す -
Compliance API Activity Feed の破壊的変更(critical):
filename/titleが過去分も含めて空になる。ID + Compliance Access Key での名前解決に改修が必須 -
キャッシュ診断のフィンガープリント保存条件変更(high): 全ターンで
diagnosticsオブジェクトを送らないとprevious_message_not_foundになる -
キャッシュ診断の GA 化(medium): ベータヘッダーが不要に。レスポンスの
diagnostics: null処理を確認 - M365 向け Compliance エンドポイントの GA 化(medium): 対応不要、告知のみ
Compliance/監査系の実装とコスト監視をしているチームは、特に変更 #1〜#3 を優先して確認することをおすすめします。