◉CLAUDE LABEN
●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/API & SDK
⬡ API & SDK/2026-06-22上級

Claude API のストリーミングは「全部届く」前提が崩れる — 部分失敗を回復に変える運用メモ

Claude API のストリーミングは、同時接続が増えた途端に途中で切れ・重複し・半端なツール引数を吐きます。部分失敗を異常ではなく前提として扱い、静かに回復させるための実装と監視を、運用で削れた具体例とともにまとめました。

claude-api83streaming16production87resilience8monitoring6

✦ プレミアム記事

個人開発で Claude API をチャット機能に組み込んだとき、最初のうちは何の問題もありませんでした。崩れ始めたのは、同時に使う人がほんの十数人を超えたあたりからです。応答が途中で止まる、同じ文が二度出る、ツール呼び出しがなぜか半分の引数で走る — どれも SDK のサンプルには出てこない挙動で、ローカルでは一切再現しませんでした。私はしばらく「自分のコードのどこかにバグがある」と思い込んで探し続け、最終的に行き着いたのは、もっと身も蓋もない結論でした。ストリーミングは、本番で部分的に失敗するのが普通なのです。

この記事は、その前提を受け入れたうえで実装をどう組み直したか、という運用メモです。完璧に落ちない実装を目指すのではなく、落ちたときに利用者が気づかないうちに立て直す。その視点で、状態管理・重複排除・ツール引数の安全弁・バックオフの分離・監視という五つの層を、実際に手元のサービスで削った跡とともに書いていきます。

一括応答との違いは「半分成功する」こと

通常のリクエスト・レスポンスなら、失敗は分かりやすい形で来ます。タイムアウトすれば何も返らず、エラーが出れば全体がエラーです。再送すればよく、状態は「成功」か「失敗」の二択で済みます。

ストリーミングが厄介なのは、その中間が日常的に発生する点です。サーバーとクライアントが数十秒つながり続ける前提なので、次のどれもが「正常動作の範囲で起こりうる」こととして降ってきます。中間プロキシが無通信を嫌ってコネクションを切る。デプロイのたびにロードバランサが既存接続を落とす。ブラウザのタブが裏に回ってバッファの読み出しが遅れる。HTTP/2 の再試行でサーバーが同じイベントをもう一度流す。

これらはバグではなく環境です。だから「起きないようにする」方向で詰めても、運用環境の組み合わせは無限にあって追いつきません。発想を「壊れない実装」から「壊れた地点を覚えていて、そこから続ける実装」に切り替える。これだけで、コードの形が根本から変わります。具体的には、ストリームのどのブロックのどこまで受け取ったかを常に手元に持っておく、という設計になります。

どのイベントの途中で切れたかを覚えておく

Claude API のストリーミングは Server-Sent Events で届き、主なイベントは message_start、content_block_start、content_block_delta、content_block_stop、message_delta、message_stop、それに keep-alive の ping と error です。回復を考えるうえで決定的に重要なのは、content_block_delta がブロック単位のインデックスを持っていることです。途中で切れても、いまどのブロックの何文字目まで来ているかさえ握っていれば、続きを組み立て直せます。

そこで、生のストリームをそのまま回さず、現在の部分応答を保持する状態オブジェクトでくるみます。下のコードは、ブロックごとのテキストとツール引数の断片を貯めながら、再接続のヒントになる情報を一緒に持たせる最小構成です。

from dataclasses import dataclass, field
from typing import Optional
 
@dataclass
class StreamState:
    """ストリーミング中の部分応答を保持する。再接続時はここを見て続きを再構築する。"""
    message_id: Optional[str] = None
    model: Optional[str] = None
    blocks: list[dict] = field(default_factory=list)
    current_index: int = -1
    stop_reason: Optional[str] = None
 
    def apply_delta(self, index: int, delta: dict) -> None:
        # 受信したブロック数まで器を広げてから差分を足す
        while len(self.blocks) <= index:
            self.blocks.append({"type": "text", "text": "", "partial_json": ""})
        block = self.blocks[index]
        kind = delta.get("type")
        if kind == "text_delta":
            block["text"] += delta.get("text", "")
        elif kind == "input_json_delta":
            block["partial_json"] += delta.get("partial_json", "")
 
    def assistant_text(self) -> str:
        return "".join(b["text"] for b in self.blocks if b.get("type") == "text")

このオブジェクトを一つ挟むだけで、後続の回復処理がすべて「いまの状態を見て判断する」という素直な形に揃います。状態が散らばっていないことが、ストリーミングを安定させる土台になります。

✦

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

この記事の続きを読む

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

この記事で得られること
✦切断・重複・途中エラーを区別し、種別ごとに回復方針を分ける状態付きリーダーの実装
✦途中で切れた tool_use 引数を実行境界で止める安全弁と、二重連結を防ぐ重複判定キーの選び方
✦成功率・再接続回数・初トークン遅延・重複率の4指標で、ユーザーより先に劣化へ気づく監視設計
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⬡ API & SDK2026-05-02
Claude API の本番運用で予算上限を確実に守る — 日次トークン超過を検知して自動停止するサーキットブレーカー設計
Claude API のコストを「気づいたら月10万円超過」で終わらせない、サーキットブレーカーパターンの実装ガイドです。Cloudflare Workers + KV / Durable Objects で日次・月次予算を強制し、停止・劣化・通知の3戦略を切り替えるコードを示します。
⬡ API & SDK2026-04-23
Claude API の高可用性設計 — Sonnet / Haiku / Opus マルチモデルフォールバックを本番で成立させる
Claude API を単一モデル前提で組むと、障害やレート制限の瞬間にサービス全体が止まります。Sonnet・Haiku・Opus を段階的にフォールバックする本番実装を、コード・Circuit Breaker・ストリーミング対応まで含めて整理しました。
⬡ API & SDK2026-05-26
Claude API の構造化レスポンスを本番で安定させる — tool_use と JSON Schema、多層検証の実装メモ
Claude API の応答を JSON で受け取る実装は数行で書けますが、本番運用では「形は正しいが意味が壊れている」レスポンスにどう備えるかが分かれ目になります。tool_use・JSON Schema・ドメイン検証を組み合わせた多層パイプラインを、壁紙アプリの分類処理での実体験を交えて整理しました。