Claudeの挙動がおかしいと感じたら障害を疑え!ステータス確認から対処法まで


「さっきまで普通に動いてたのに、なんかClaudeの返答が変…」「APIのレスポンスが異常に遅い、それとも自分のコードのバグ?」

こういった経験、Claude APIを使って開発していると必ず一度は遭遇します。自分のコードを何時間もデバッグした挙句、実はAnthropicのサーバー側の問題だった、というのはよくある「あるある」な落とし穴です。本記事では、Claudeの挙動がおかしいと感じたときの確認手順と、障害時の実践的な対処法を紹介します。


まず疑うべき:Anthropicの公式ステータスページ

コードを触る前に、まず公式のステータスページを確認することを強くおすすめします。

🔗 Anthropic Status Page 👉 https://status.anthropic.comstatus.claude.com にリダイレクトされます)

このページでは以下の情報がリアルタイムで確認できます。

  • API Availability:APIエンドポイントが正常に応答しているか
  • Claude.ai Web:Webインターフェースの状態
  • 過去のインシデント履歴:直近の障害レポートと復旧状況

ページが全てグリーンなのに挙動がおかしい場合は、初めて自分のコードやネットワーク環境を疑うフェーズに入りましょう。

URLについて: ブラウザでは status.anthropic.com でも status.claude.com でも同じページに到達します。ただし status.anthropic.com302status.claude.com へリダイレクトされるため、後述のステータスAPIをプログラムから取得する場合は status.claude.com を直接指定してください(HTTPクライアントによってはリダイレクトを追わずJSONの取得に失敗します)。


よくある「おかしい」症状と原因の切り分け

症状① レスポンスが異常に遅い・タイムアウトする

import anthropic
import time

client = anthropic.Anthropic()

start = time.time()
try:
    message = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=1024,
        messages=[{"role": "user", "content": "Hello"}],
        timeout=30.0  # タイムアウトを明示的に設定
    )
    elapsed = time.time() - start
    print(f"Response time: {elapsed:.2f}s")
except anthropic.APITimeoutError:
    print("Timeout! APIの応答が遅延している可能性があります")

原因の可能性:

  • Anthropic側の高負荷・障害
  • ネットワークの問題
  • max_tokensの設定が大きすぎる

症状② エラーレスポンスが増えている

HTTPステータスコード別の原因を把握しておくと素早く切り分けできます。

ステータスコードエラー種別(公式)SDK例外クラス疑うべき原因
429rate_limit_errorRateLimitErrorリクエスト頻度が高すぎる
500api_errorInternalServerErrorAnthropic側の障害
529overloaded_errorOverloadedErrorAPIの一時的な過負荷
401authentication_errorAuthenticationErrorAPIキーの問題

529は全ユーザー横断でトラフィックが集中した際に返されることがあり、Python SDKでは InternalServerError とは別の OverloadedError として投げられます(Errors)。

import anthropic

client = anthropic.Anthropic()

try:
    message = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=1024,
        messages=[{"role": "user", "content": "Hello"}],
    )
except anthropic.OverloadedError as e:
    # 529: APIが一時的に過負荷
    print(f"API過負荷: {e.status_code} - しばらく待ってからリトライしてください")
except anthropic.InternalServerError as e:
    # 500: Anthropicサーバー側の問題
    print(f"サーバーエラー: {e.status_code} - ステータスページを確認してください")
except anthropic.RateLimitError as e:
    print(f"レート制限: リトライロジックを実装しましょう")
except anthropic.APIStatusError as e:
    print(f"APIエラー: {e.status_code} - {e.message}")

症状③ 返答の品質が明らかに低下している

モデルの挙動が突然おかしくなった場合、以下を確認してください。

  • モデル名の指定ミスclaude-opus-4-5など、正確なモデル名を使っているか
  • プロンプトの変更:自分または同僚がシステムプロンプトを変更していないか
  • Anthropicのモデルアップデート:稀にモデルのマイナーアップデートが入ることがあります

障害時の実践的な対処法

リトライロジックを実装する

本番環境では、指数バックオフ付きのリトライロジックは必須です。Python SDKは429や500番台(529を含む)をデフォルトで自動リトライします(max_retries=2 がデフォルト)。アプリケーション側でもリトライを実装する場合は、二重にリトライが走らないよう Anthropic(max_retries=0) でSDKの自動リトライを無効化してください(Python SDK - Retries)。

import anthropic
import time
import random

def call_claude_with_retry(prompt: str, max_retries: int = 3) -> str:
    # アプリ側でリトライするため、SDKの自動リトライは無効化
    client = anthropic.Anthropic(max_retries=0)
    
    for attempt in range(max_retries):
        try:
            message = client.messages.create(
                model="claude-opus-4-5",
                max_tokens=1024,
                messages=[{"role": "user", "content": prompt}],
            )
            return message.content[0].text
            
        except anthropic.RateLimitError as e:
            if attempt == max_retries - 1:
                raise
            # Retry-Afterヘッダーがあればそれに従う
            retry_after = float(e.response.headers.get("retry-after", 60))
            wait_time = retry_after + random.uniform(0, 1)
            print(f"Rate limited. Retrying in {wait_time:.1f}s...")
            time.sleep(wait_time)
            
        except (anthropic.InternalServerError, anthropic.OverloadedError, anthropic.APITimeoutError):
            if attempt == max_retries - 1:
                raise
            
            # 指数バックオフ + ジッター
            wait_time = (2 ** attempt) + random.uniform(0, 1)
            print(f"Attempt {attempt + 1} failed. Retrying in {wait_time:.1f}s...")
            time.sleep(wait_time)
    
    raise RuntimeError("Max retries exceeded")

モニタリングに組み込む

定期的なヘルスチェックをCIや監視ツールに組み込むことで、障害をいち早く検知できます。エンドポイントは https://status.claude.com/api/v2/status.json を使います(status.anthropic.com はリダイレクトされるため、コードからは直接叩かない方が確実です)。

import httpx

def check_anthropic_status() -> bool:
    """Anthropicのステータスページから状態を確認する"""
    try:
        response = httpx.get(
            "https://status.claude.com/api/v2/status.json",
            timeout=10.0
        )
        data = response.json()
        indicator = data["status"]["indicator"]
        description = data["status"]["description"]
        
        print(f"Anthropic Status: {indicator} - {description}")
        return indicator == "none"  # "none" = 問題なし
        
    except Exception as e:
        print(f"ステータス確認に失敗: {e}")
        return False

情報収集に役立つチャンネル

障害時は公式チャンネルを素早く確認することが重要です。

エンジニア同士でX(Twitter)で共有し合うのも、障害の早期検知に非常に有効です。「自分だけ?」と思ったらまず検索してみましょう。


まとめ

Claudeの挙動がおかしいと感じたときのチェックリストをまとめます。

  1. まずstatus.anthropic.comをブラウザで確認する(コードを触る前に!)
  2. HTTPステータスコードを確認し、5xx系なら障害を疑う
  3. X(Twitter)で他のユーザーの報告を検索する
  4. 本番環境にはリトライロジックを実装しておく
  5. モニタリングには https://status.claude.com/api/v2/status.json を使う

「コードのバグ探しに何時間も費やした後に障害だったと気づく」という体験は、一度やれば忘れられません。障害の可能性を最初に排除する習慣をつけるだけで、デバッグ効率は大きく改善されます。