CLAUDE LABEN
MODEL — Claude Opus 4.8がコーディング・エージェント・専門業務で性能向上。長時間タスクの一貫性が強みですPLATFORM — Developer Platformにcode execution・MCP connector・Files API・最大1時間のプロンプトキャッシュが追加されましたSANDBOX — Claude Managed Agentsが自前サンドボックス+プライベートMCPサーバー接続に対応(Cloudflare/Daytona/Modal/Vercel等)MODEL — Fable 5(100万トークン文脈・常時アダプティブ思考)は6/12の米輸出管理指令でアクセス停止となりましたLINEUP — 主力はOpus 4.8・Sonnet 4.6・Haiku 4.5。用途に応じて使い分けられますMCP — エンタープライズ管理型MCPコネクタ(Okta連携)でゼロタッチ利用が可能です(Team/Enterpriseベータ)MODEL — Claude Opus 4.8がコーディング・エージェント・専門業務で性能向上。長時間タスクの一貫性が強みですPLATFORM — Developer Platformにcode execution・MCP connector・Files API・最大1時間のプロンプトキャッシュが追加されましたSANDBOX — Claude Managed Agentsが自前サンドボックス+プライベートMCPサーバー接続に対応(Cloudflare/Daytona/Modal/Vercel等)MODEL — Fable 5(100万トークン文脈・常時アダプティブ思考)は6/12の米輸出管理指令でアクセス停止となりましたLINEUP — 主力はOpus 4.8・Sonnet 4.6・Haiku 4.5。用途に応じて使い分けられますMCP — エンタープライズ管理型MCPコネクタ(Okta連携)でゼロタッチ利用が可能です(Team/Enterpriseベータ)
記事一覧/API & SDK
API & SDK/2026-06-22上級

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

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

claude-api68streaming13production80resilience8monitoring4

プレミアム記事

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

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

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

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

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

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

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

Claude API のストリーミングは Server-Sent Events で届き、主なイベントは message_startcontent_block_startcontent_block_deltacontent_block_stopmessage_deltamessage_stop、それに keep-alive の pingerror です。回復を考えるうえで決定的に重要なのは、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-06-15
モデルが予告なく使えなくなる日に備える — 引退・撤回・過負荷を一つのステートマシンで扱うルーター設計
あるモデルが、技術的な障害ではなく外部都合で短時間のうちに使えなくなる。引退・撤回・一時的な過負荷という三種の「使えない」を一つの可用性ステートマシンで扱い、自動運用を止めないルーターを TypeScript と Python の動くコードで設計します。
API & SDK2026-05-26
Claude API のグレースフル・デグラデーション設計 — AI 機能が静かに動き続ける 4 階層フォールバック
Claude API を本番運用すると、モデル単位のフォールバックだけでは守りきれない時間帯が必ず出てきます。SLI 連動の 4 階層デグラデーション設計を、Python と TypeScript のコード・SLO バーンレート・実運用の判断軸とあわせて整理しました。
API & SDK2026-05-02
Claude API の本番運用で予算上限を確実に守る — 日次トークン超過を検知して自動停止するサーキットブレーカー設計
Claude API のコストを「気づいたら月10万円超過」で終わらせない、サーキットブレーカーパターンの実装ガイドです。Cloudflare Workers + KV / Durable Objects で日次・月次予算を強制し、停止・劣化・通知の3戦略を切り替えるコードを示します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →