「国家を揺るがした」Claude Fable 5にポケモンの選出画面を解析させてみた【AI軍師改】

AI・Python



昨今話題になっているAnthropic社の最新AI『Mythos 5』と『Fable 5』。

簡単に解説すると、この2つは同じ基盤モデルの兄弟で、

『Mythos 5』は米セキュリティ企業の検証において、

Appleが5年かけて開発したメモリ保護機構(MIE)を

わずか5日で突破するのに使われたヤベェやつになります。

こちらは米政府に承認された限られた組織しか使えません。



一方、一般ユーザー向けにセーフティ機構を搭載したものが『Fable 5』。

……なのですが、公開からわずか3日でセーフガードの回避手法(ジェイルブレイク)が報告され、米政府の輸出規制により世界中で出禁に…

その後、安全機構を強化して7月から復活しました、


現行AIでは 最強格の一品 となっております。





前回の反省点と改修



前回作成した画像解析に対して、改修を行うとなると…

改修項目
・ポケモンDBファイルの用意(ポケモン名:種族値:タイプ等)
・各ポケモンの技DBファイルを整備(技名:威力:タイプ等)
・AIからの応答をポケモンDBと突合しハルシネーションを防止する
・素早さ関係の事前計算「上を取れる/取られる」
etc…


改修を行うのは大変めんどくさいですね…

ならば、AIの スペックでごり押しすれば、適切な解析結果を得られるのではないか?

つまり、今回はこの『Fable 5』に、ポケモンの選出画面を解析させてみます。






Claude consoleへの登録



1、Claude Console にアクセスします。
  ※検索結果から選択しても構いません。



2、Googleアカウントがあれば「Goolgeで続行」を選択します。



3、Googleアカウントを選択します。



4、以下の画面に遷移するのでしばらく待ちます。



5、使用用途を確認させるので適当に「個人」を選択します。



6、クレジットの購入画面に遷移します。

  新規に登録を行うと無料枠が5ドル分貰えるキャンペーンをやっていたりします。
  
  無料枠をもらえるなら「今はスキップ」を選択しましょう。




7、Console画面が起動します。



Claude consoleからAPIキーを取得する


1、左のメニューから『APIキー』を選択します。

2、右上の『キーを作成』を選択します。



3、APIキーの作成画面に遷移するので「名前」を入力し『APIキーを作成』をクリックします。



4、APIキーを保存の画面に遷移します。
  
  赤枠をクリックしAPIキーをコピーします。

 ※APIキーは一度しか表示されません。コピーし忘れたら再度APIキーを作成しましょう。



AIのModleをclaudeに変更する


以下のコードを「~.py」ファイルとして保存します。

import time
import os
import io
import base64
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import anthropic

# =====================================================================
# ⚙️ 設定項目
# =====================================================================
# OBSの「設定 > 出力 > 録画 > 録画ファイルのパス」と同じフォルダを指定してください
WATCH_FOLDER = r"画像の保存先"

# ★★★ モデルの差し替えはこの1行だけ ★★★
MODEL = "claude-haiku-4-5"
# 選択肢:
#   "claude-haiku-4-5"    … Haiku 4.5(最速・最安)
#   "claude-sonnet-4-6"   … Sonnet 4.6(バランス)
#   "claude-sonnet-5"     … Sonnet 5(新型バランス)
#   "claude-opus-4-8"     … Opus 4.8(高性能)
#   "claude-fable-5"      … Fable 5(最上位・最高コスト)

# Claudeクライアントの初期化(APIキーは環境変数 ANTHROPIC_API_KEY から自動読み込み)
client = anthropic.Anthropic()

# =====================================================================
# 🧠 AIへの指示文(プロンプト)の定義
# =====================================================================
ANALYSIS_PROMPT = """
あなたはポケモンのシングルバトルにおける、超一流の軍師(データアナリスト)です。
提示された「選出画面のスクリーンショット」から【右側の敵陣】と【左側の自陣】のデータを正確に読み取り、要点のみを出力してください。

【⚠️ 画像認識・OCRの最重要指示】
1. 左右の混同厳禁:
   - 画面の【右側(ピンク背景の枠)】が「相手(敵陣)の6匹」です。
   - 画面の【左側(青背景の枠)】が「自分(自陣)の6匹」です。
2. テキスト(日本語)を最優先で読むこと:
   - アイコンのドット絵の色合いだけで判断せず、各枠内に表示されている「ポケモンの名前(日本語のテキスト)」を確実にOCR(文字認識)して特定してください。実在しないポケモンを捏造(幻覚)することは絶対に許されません。
   
3. 思考のローカライズ(選出画面外のポケモン排除):
   - 相手の戦術、初手、裏を予想する際は、直前の「■ 敵陣」であなたが実際にテキスト認識した6匹のデータのみを思考のソースにしてください。
   - 「この構築なら普通〇〇がいるはず」という一般論での補完や、リスト外のポケモンの名前、およびそれらに依存する戦術を記述することは完全に禁止します。

以上のルールを徹底し、1秒で状況を把握できるよう【要点のみ】を箇条書きで出力してください。長文解説、挨拶、前置き、コードブロック(```)はすべて厳禁です。


■ 敵陣(正確に読み取った6匹の名前とタイプ)
・

■ 自陣(正確に読み取った6匹の名前と持ち物)
・

■ 敵の戦術(一言で)
【⚠️ 超重要:必ず直前の「■ 敵陣」に記載した6匹のリストに存在するポケモン“だけ”を対象に思考・出力してください。リストにないポケモンを登場させたり、それらを前提とした戦術(天候パなど)を推測することは厳禁です】
・軸:[対面 / サイクル / 起点展開 / 天候パ / その他]
・初手予想:[★必ず上記「敵陣」から選ぶこと:ポケモン名](理由:)
・裏の予想:[★必ず上記「敵陣」から選ぶこと:ポケモン名], [ポケモン名]

■ 推奨選出(結論)
・初手:【 ポケモン名 】
・裏:【 ポケモン名 】+【 ポケモン名 】

■ 初手の立ち回り(3行以内)
・
・
・
"""

# =====================================================================
# 🔍 フォルダ監視と解析の処理
# =====================================================================
class PokemonScreenShotHandler(FileSystemEventHandler):
    def on_created(self, event):
        # 新しいファイルが作成され、それが画像ファイル(PNG/JPG)の場合に実行
        if not event.is_directory and event.src_path.endswith(('.png', '.jpg', '.jpeg')):
            print(f"\n⚡ [検知] スクリーンショットを検出しました: {os.path.basename(event.src_path)}")
            print(f"🤖 Claude({MODEL})が選出画面を分析中...(数秒お待ちください)\n")

            # 画像の読み込み(少しファイル生成の完了を待つためにウェイトを入れる)
            time.sleep(0.5)
            try:
                # 【修正ポイント】Pillowで開いた画像をbase64に変換して渡す形式に変更
                from PIL import Image
                img = Image.open(event.src_path)

                buf = io.BytesIO()
                img.save(buf, format="PNG")
                img_base64 = base64.standard_b64encode(buf.getvalue()).decode("utf-8")

                # Claude で解析
                response = client.messages.create(
                    model=MODEL,
                    max_tokens=1500,
                    messages=[
                        {
                            "role": "user",
                            "content": [
                                {
                                    "type": "image",
                                    "source": {
                                        "type": "base64",
                                        "media_type": "image/png",
                                        "data": img_base64,
                                    },
                                },
                                {"type": "text", "text": ANALYSIS_PROMPT},
                            ],
                        }
                    ],
                )

                # レスポンスからテキストを取り出す(Geminiのresponse.textに相当)
                result_text = "".join(
                    block.text for block in response.content if block.type == "text"
                )

                # PyCharmのコンソールに出力
                print("=" * 60)
                print("📊 【バトル分析・選出提案結果】 📊")
                print("=" * 60)
                print(result_text)
                print("=" * 60)
                print("\n次のスクリーンショットを待機中...")

            except Exception as e:
                print(f"❌ エラーが発生しました: {e}")

# =====================================================================
# 🚀 ツール起動
# =====================================================================
if __name__ == "__main__":
    # 監視フォルダがない場合は自動作成
    if not os.path.exists(WATCH_FOLDER):
        os.makedirs(WATCH_FOLDER)

    event_handler = PokemonScreenShotHandler()
    observer = Observer()
    observer.schedule(event_handler, WATCH_FOLDER, recursive=False)
    observer.start()

    print("=========================================================")
    print("🎮 ポケモン選出画面 リアルタイム分析ツール 起動完了 🎮")
    print(f"監視フォルダ: {WATCH_FOLDER}")
    print(f"使用モデル: {MODEL}")
    print("対戦画面で OBSのキャプチャ撮影行うと"
          "、ここに解析が走ります。")
    print("=========================================================")

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()



監視フォルダのパスは自分のパソコン環境に合わせて変更します。

WATCH_FOLDER = r"画像の保存先"



MODELは以下の部分を変更して選択します。

MODEL = "claude-haiku-4-5"
# 選択肢:
#   "claude-haiku-4-5"    … Haiku 4.5(最速・最安)
#   "claude-sonnet-4-6"   … Sonnet 4.6(バランス)
#   "claude-sonnet-5"     … Sonnet 5(新型バランス)
#   "claude-opus-4-8"     … Opus 4.8(高性能)
#   "claude-fable-5"      … Fable 5(最上位・最高コスト)






Pythonの実行前の準備


以下のモジュールをインストールします。

pip install anthropic



併せて、Claude Console から取得したAPIキーをセットします。

※「set」コマンドだとプロンプトを閉じるとリセットされた状態になるため、
 永続的に反映させたい場合は「setx」コマンドを使用しましょう。

set ANTHROPIC_API_KEY="あなたのAPIキー"



以下のコマンドでセットされたか確認できます。

echo %ANTHROPIC_API_KEY%

<表示例>



下準備はこれで完了です。

Pythonの実行



あとは、以下の上で作成した「~.py」ファイルを実行します。

start .\<実行ファイル名>.py


<実行例>



ウインドウが起動すれば、準備完了です。



所感


予想より長くなったので、

実際の運用編は次回に…