Skip to content

原文(日本語に翻訳)

処理に失敗したSDK画像コンテンツブロックでセッションがクラッシュする問題を修正しました。現在はテキストプレースホルダーに代替されます。

原文(英語)

Fixed SDK image content blocks that fail to process crashing the session — now degrade to a text placeholder

概要

Anthropic SDKを使用してClaude Codeにメッセージを送信する際、画像コンテンツブロックの処理が失敗した場合にセッション全体がクラッシュしてしまう問題がありました。画像の読み込みエラー、フォーマットの非対応、サイズ超過などのケースで発生していました。今回の修正で、処理できない画像はテキストプレースホルダー(「[画像: 処理できませんでした]」など)に置き換えられ、セッションは継続して動作するようになります。

基本的な使い方

python
# Anthropic SDK での画像コンテンツブロック使用例
import anthropic

client = anthropic.Anthropic()

# 画像が処理できない場合(修正前: クラッシュ、修正後: プレースホルダーに代替)
response = client.messages.create(
    model="claude-opus-4-5",
    max_tokens=1024,
    messages=[{
        "role": "user",
        "content": [
            {
                "type": "image",
                "source": {
                    "type": "base64",
                    "media_type": "image/jpeg",
                    "data": "...(壊れたデータ)..."
                }
            },
            {
                "type": "text",
                "text": "この画像について説明してください"
            }
        ]
    }]
)

# 修正前: セッションがクラッシュする
# 修正後: テキストプレースホルダーに代替されてセッションが継続

実践例

画像処理失敗のシナリオと代替動作

python
# シナリオ1: 壊れた画像データ
content_blocks = [
    {
        "type": "image",
        "source": {
            "type": "base64",
            "media_type": "image/png",
            "data": "broken_data_here"  # 壊れたBase64データ
        }
    }
]

# 修正後の動作:
# → 画像は "[画像: 処理に失敗しました]" というテキストに置換
# → セッションは継続して動作
# → エラーログにデバッグ情報が記録される
python
# シナリオ2: サポートされていないフォーマット
content_blocks = [
    {
        "type": "image",
        "source": {
            "type": "url",
            "url": "https://example.com/image.tiff"  # TIFFは非サポート
        }
    }
]

# 修正後:
# → "[画像URL: https://example.com/image.tiff (処理できません)]" に置換
python
# シナリオ3: URLアクセスエラー
content_blocks = [
    {
        "type": "image",
        "source": {
            "type": "url",
            "url": "https://private-server.internal/secret.png"  # アクセス不可
        }
    }
]

# 修正後:
# → "[画像: アクセスできませんでした]" に置換してセッション継続

グレースフルデグラデーションの実装例

python
# SDK を使ったアプリでの堅牢な実装例
import anthropic

def process_with_images(images: list, question: str):
    client = anthropic.Anthropic()
    
    content = []
    for img in images:
        content.append({
            "type": "image",
            "source": {
                "type": "base64",
                "media_type": img["media_type"],
                "data": img["data"]
            }
        })
    content.append({"type": "text", "text": question})
    
    # 修正後: 画像処理が失敗してもクラッシュしない
    # 失敗した画像はプレースホルダーになるが応答は返ってくる
    response = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=2048,
        messages=[{"role": "user", "content": content}]
    )
    
    return response.content[0].text

エラーのデバッグ

python
# 修正前のエラー(クラッシュ):
# RuntimeError: Failed to process image content block
# Session terminated unexpectedly

# 修正後のログ(セッションは継続):
# WARNING: Failed to process image content block at index 0
#   Reason: Invalid base64 encoding
#   Fallback: Replaced with text placeholder
# → セッションは "questions about image [処理失敗]" として継続

# デバッグログを有効にする場合
import logging
logging.basicConfig(level=logging.DEBUG)

注意点

  • テキストプレースホルダーに代替された画像は、Claudeが分析することはできません
  • エラーが頻発する場合は、画像データの検証や前処理を実装することを推奨します
  • 対応している画像フォーマット: JPEG、PNG、GIF、WebP
  • 画像サイズの上限: 1辺あたり最大8000ピクセル、最大5MB(Base64エンコード前)
  • この修正はSDK経由での利用に関するものです。Claude Code UIでの画像入力は別途処理されます

関連情報