AIコーディング 2026.04.22

claude-3-haiku-20240307エラー解決|廃止モデルIDを自動検知するPythonスクリプト

タグ:Claude / API / AI / トラブルシューティング / 生成AI

発生するエラーの確認

# エラーが出るコード(廃止済みモデルID)
import anthropic

client = anthropic.Anthropic()

try:
    message = client.messages.create(
        model="claude-3-haiku-20240307",  # ← 廃止済み
        max_tokens=1024,
        messages=[{"role": "user", "content": "Hello"}]
    )
except anthropic.NotFoundError as e:
    print(e)
    # Error: {"type":"not_found_error","message":"model: claude-3-haiku-20240307"}

エラーは404 NotFoundError で、モデルIDが存在しないと返ってきます。コードは正しいのにモデルが廃止されているだけです。

2026年の現行Haikuモデル一覧

旧ID(廃止)現行ID料金変更
claude-3-haiku-20240307claude-haiku-4-5-20251001$0.25/$1.25 → $0.80/$4.00
claude-3-sonnet-20240229claude-sonnet-4-5価格変更あり
claude-3-5-haiku-20241022claude-haiku-4-5-20251001現行に統合

⚠️ 料金も変わっているため、コスト試算の更新も必要です。

Step 1:コードベースの廃止IDを検索する

# プロジェクト全体で廃止されたモデルIDを検索
grep -rn "claude-3-haiku-20240307" . \
  --include="*.py" \
  --include="*.ts" \
  --include="*.js" \
  --include="*.env" \
  --include="*.yaml" \
  --include="*.json"

# その他の廃止IDも合わせて確認
grep -rn \
  -e "claude-3-haiku-20240307" \
  -e "claude-3-sonnet-20240229" \
  -e "claude-instant-1" \
  -e "claude-2\." \
  . --include="*.py" --include="*.ts" --include="*.env"
# 検索結果例:
# ./src/api/chat.py:15:    model="claude-3-haiku-20240307",
# ./scripts/batch.py:8:    model="claude-3-haiku-20240307",
# ./.env:3:CLAUDE_MODEL=claude-3-haiku-20240307

Step 2:修正とモデルID管理の改善

シンプルな修正(最速)

# ❌ 廃止
message = client.messages.create(
    model="claude-3-haiku-20240307",
    ...
)

# ✅ 現行
message = client.messages.create(
    model="claude-haiku-4-5-20251001",
    ...
)

推奨:環境変数で管理する

# config.py
import os

# 環境変数から読む。設定なければデフォルト値を使う
CLAUDE_HAIKU = os.environ.get("CLAUDE_HAIKU_MODEL", "claude-haiku-4-5-20251001")
CLAUDE_SONNET = os.environ.get("CLAUDE_SONNET_MODEL", "claude-sonnet-4-5")
CLAUDE_OPUS = os.environ.get("CLAUDE_OPUS_MODEL", "claude-opus-5")

# 使い方
# import config
# model=config.CLAUDE_HAIKU
# .env ファイル(.gitignoreに追加すること)
CLAUDE_HAIKU_MODEL=claude-haiku-4-5-20251001
CLAUDE_SONNET_MODEL=claude-sonnet-4-5
CLAUDE_OPUS_MODEL=claude-opus-5
# 一括置換(バックアップを取ってから実行)
# git stash または cp -r . ../backup してから:
find . -name "*.py" -exec sed -i \
  's/claude-3-haiku-20240307/claude-haiku-4-5-20251001/g' {} \;

find . -name "*.ts" -exec sed -i \
  's/claude-3-haiku-20240307/claude-haiku-4-5-20251001/g' {} \;

Step 3:フォールバック付きのAPIクライアント

# robust_client.py
import anthropic
import os
from typing import Optional

# モデルの優先順位(廃止されたら次を試す)
HAIKU_MODELS = [
    "claude-haiku-4-5-20251001",  # 最新(優先)
    "claude-3-5-haiku-20241022",   # 一世代前(フォールバック)
]

def call_with_fallback(
    prompt: str,
    models: list[str] = HAIKU_MODELS,
    max_tokens: int = 1024,
) -> Optional[str]:
    """モデルが廃止された場合に次のモデルで再試行"""
    client = anthropic.Anthropic()
    
    for model in models:
        try:
            response = client.messages.create(
                model=model,
                max_tokens=max_tokens,
                messages=[{"role": "user", "content": prompt}]
            )
            return response.content[0].text
        
        except anthropic.NotFoundError:
            print(f"⚠️ モデル {model} が廃止されています。次を試します...")
            continue
        
        except anthropic.APIError as e:
            print(f"❌ APIエラー: {e}")
            raise
    
    raise RuntimeError("利用可能なモデルがありません。モデルIDを更新してください")

# 使用例
result = call_with_fallback("Pythonのリスト内包表記を説明して")
print(result)

廃止を事前に検知するヘルスチェック

# health_check.py - アプリ起動時に実行してモデルIDを検証

import anthropic
import os
import sys

def verify_model_ids() -> bool:
    """設定されたモデルIDが有効かチェック"""
    client = anthropic.Anthropic()
    
    models_to_check = [
        os.environ.get("CLAUDE_HAIKU_MODEL", "claude-haiku-4-5-20251001"),
        os.environ.get("CLAUDE_SONNET_MODEL", "claude-sonnet-4-5"),
    ]
    
    all_ok = True
    for model_id in models_to_check:
        try:
            # 最小限のリクエストでモデルIDを確認
            client.messages.create(
                model=model_id,
                max_tokens=5,
                messages=[{"role": "user", "content": "test"}]
            )
            print(f"✅ {model_id}: OK")
        
        except anthropic.NotFoundError:
            print(f"❌ {model_id}: 廃止済み。環境変数を更新してください")
            all_ok = False
    
    return all_ok

if __name__ == "__main__":
    if not verify_model_ids():
        print("\n❌ モデルIDを更新してから再起動してください")
        print("最新のモデルID: https://docs.anthropic.com/en/docs/about-claude/models")
        sys.exit(1)
    
    print("\n✅ 全モデルID確認完了")

あわせて読みたい

参考ソース