考えるのはあなたのモデル、 実行するのは War3AI
Agent が実環境で自力で目的を達成するには、3 つのものが必要です。明確に表現できるアクション、読み取れるフィードバック、失敗を恐れなくてよい環境。私たちは Warcraft III をそんな環境に作り変えました。
Agent がここで自力で目的を達成できる理由
AI にゲームをプレイさせる一般的な方法は、マウスとキーボードを模倣し、画面を認識することです。これでは成功したかどうかを推測するしかありません。私たちは逆に「モデルが自己修正するには何が必要か」から出発して、すべての API を設計しました。
伝えるのは「何をするか」だけ
移動、攻撃、建設、スペル使用……セマンティックコマンドはプレイヤーの操作に直接対応します。ユニットは 4 文字コード、スキルはオーダー名で、ゲーム内の呼び方と同じ。モデルに低レベルの知識は不要です。
すべてのアクションに構造化されたフィードバック
レシートは同じフレームで読み戻されます。受理されたか、理由コード、命令前後のオーダー、実行時間。「なぜうまくいかなかったか」は推測ではなく、1 つの数値です。
結果を知るのに画面は不要
スナップショットは今どうなっているかを、イベントストリームは何が起きたかを伝えます。すべてのダメージ、キル、生産完了。Agent は自分の判断を検証できます。
ドキュメントこそが API
api.json はコードから生成され、103 個のメソッドそれぞれに実測ステータスと内部メカニズムが記載されています。llms.txt でサイト全体を一度に読めます。モデルがメソッドをでっち上げる理由はありません。
失敗しても安全
Bot が例外を投げても、次のティックで続行します。期限を過ぎたコマンドは実行されません。Bot のプロセスがクラッシュしても、ゲームはそのまま動き続けます。Agent は安心して試せます。
初日から公平に
フェアモードは視界内のものだけを渡し、アリーナのルールと一致します。Agent がローカルで身につけた能力は、将来アリーナに出るときも 1 行も変更する必要がありません。
Agent が Bot を書く
最も手早く始められる方法で、プログラミングの知識は不要です。マニュアル、api.json、サンプル 1 つを Claude Code、Cursor、Codex、または任意の対話型モデルに渡し、普段の言葉で戦術を説明します。openwar3.Bot を継承した Python ファイルが書き上がり、1 コマンドで対戦に出せます。
- プロンプトテンプレートには「実機で痛い目を見て得た 15 のルール」が書かれています
- api.json のメソッドだけを使うよう指示し、でっち上げを防ぎます
- エラーはそのまま貼り付け、見た現象を説明して直してもらいます
承知しました。rush_bot.py の構成に沿って、api.json のメソッドだけを使って書きます。
- 採集には
idle_workers()だけを割り当て、1 鉱山 5 人 - 兵舎のキューは 1 体だけ。人口の詰まりは
production().blockedで確認 - 出撃は
path_distanceで拡張を選び、attack_moveで向かう - ヒーローの HP が 30% を切ったら
moveで帰還、死んだらrevive
Agent に自分で反復させる
コマンドを実行できる Coding Agent なら、「1 戦して結果を見る」ことまで引き受けられます。無人で実行できるコマンド、構造化された対戦レポート、明確な目標を与えれば、1 ラウンドずつ改善していきます。
- 実行
play.py --speed 200 --minutes 10 --fair - 読む 対戦レポート:生産のタイムライン、損害、最も多かった拒否理由
- 直す 結果に最も影響する 1 か所を修正し、根拠をコメントに書く
- 再実行 数戦続けて改善がなければ止めて報告
{
"reason": "到时间了",
"clock": 612.4,
"timeline": [
[15, "training", "hpea"],
[118, "construction", "hbar"],
[161, "training", "Hamg"],
[402, "upgrade", "hkee"]
],
"lost": {"hfoo": 7, "Hamg": 1},
"killed": {"ogru": 4, "ngno": 6},
"rejects": [
["train hfoo: rejected(人口不够)", 41],
["attack ogru: rejected(目标看不见…)", 9]
]
}最も多かった拒否は「人口不足」で 41 回、兵舎はずっと人口待ちでした。ルール 12 に従い、production().blocked を見たらすぐにファームを建てるようにします。人口が上限に近づくのを待つのではありません。このラウンドではこの 1 か所だけを修正します。
LLM を戦略アドバイザーに
「何をためるべきか、どこに人を割くべきか、この 1 分は攻めるべきか控えるべきか」。こうした全体を見て優先順位をつける判断は、if / else で書くと互いに衝突しがちですが、LLM の得意分野です。リファレンスブレインは 20 ゲーム秒ごとにローカルモデルに問い合わせ、厳密な JSON を受け取ります。
{
"diagnosis": "ゴールド 820、木材 60。木材がボトルネックで、兵舎は木材不足で生産停止",
"workers": {"gold": 10, "lumber": 7},
"priority": ["hpea", "hhou", "hfoo"],
"posture": "hold",
"avoid": ["木材が足りないときに Iron Plating を先に研究しない"]
}ワーカー配分 10 / 7 · 訓練の優先度 hpea → hhou → hfoo · 構え hold
命令、レシートの読み取り、マイクロ操作
ユニットにしゃべらせる
任意のユニットが任意の役柄で頭上に吹き出しを出し、複数のユニットが同時に話せます。吹き出しのスタイルも 1 つずつカスタマイズ可能です。ローカル LLM につなげば、1 文を入力すると 1 文の返答がストリーミングでユニットの頭上に現れます。農民の井戸端会議、ヒーローの掛け合い、戦況の実況も、すぐに使えます。
POST http://127.0.0.1:8872/api/chat
{
"inst": 16, "unit": "0x14A12614", "name": "マウンテンキング",
"persona": "あなたはマウンテンキング。豪快で酒好き、口語で 1〜2 文",
"message": "この先にオーガの群れがいる。突っ込むか?",
"stream": true
}
→ {"reply": "突っ込むぞ!この一杯を飲み干したらな!",
"first_token_ms": 283, "total_ms": 342}AI コンパニオン
RPG やカスタムマップで、自分専用の AI の仲間を連れて行けます。あなたについて歩き、狩りを手伝い、あなたの HP が減れば回復し、手が空けば話しかけてくれます。セリフはローカル LLM につなげられます。クラスを 1 つ継承し、いくつかの属性を変えるだけで、あなただけのコンパニオンになります。
毎ティック上から順に判定し、最初に成り立ったものを実行
- 撤退 自分の HP が低く、近くに敵がいる:あなたの後ろに下がる
- 回復 あなたの HP が低く、スキルが使える:回復をかける
- 援護 まずあなたを攻撃している敵を、次にあなたが攻撃している敵を叩く
- 追従 離れすぎたらついて行き、一定以上離れたら走って戻ってくる
- 雑談 戦闘がないときは、1〜2 分おきにひと言
チャット欄に -follow / -stay / -heal / -hi と入力するか、右クリックで操作
LLM がツールを直接呼び出す
MCP に対応したクライアント —— Claude Code、Claude Desktop、ローカルモデル用の Agent フレームワーク —— に war3_mcp.py を登録すれば、LLM が局面を見る、コマンドを出す、画面上でプレイヤーに話しかける、カードを出してプレイヤーに尋ねる、スクリーンショットで画面を見る、といったことを直接行えます。先にコードを書く必要はなく、思いついたことをそのまま頼めます。
- 10 個のツール:局面の要約、ユニット、イベント、任意の公開 API の呼び出し、API の検索、画面へのヒント表示、頭上のセリフ、プレイヤーへの質問、スクリーンショット、JASS
- 3 つのロール:開発者、選手(1 人のプレイヤーだけを指揮し、その視界だけを見る)、観戦者(読み取り専用)
- ゲームに接続するのは最初にツールが呼ばれたときなので、ゲームは後から起動してもよい
2 つのツールを呼び出しました:
war3_overview→ ゴールド 500 · 人口 10/12 · 本拠地 1 · 農民 5 · パラディン 1war3_ask_player→ 画面中央にカードを 3 枚表示、選ぶ間はゲームを一時停止- あなたが「拡張」をクリックし、その結果がそのまま会話に戻ってきたので、続けて農民を手配します
Agent 自らが出陣
アリーナは WebSocket / JSON を使います。レフェリーが毎ティック、視界でフィルタリングした観測を送り、Bot はアクションの組を返します。どの言語、どのモデルでも、さらにはコードを書かずに LLM にティックごとの JSON を直接出力させても、接続できます。シングルマシン版は今日から使えます:ゲートウェイの選手ロールでは、1 人のプレイヤーだけを指揮でき、その視界だけが見えます。アリーナに足りないのは、誰もが信頼できるレフェリーです。
- ゲーム時間に合わせてティックを刻む。遅い側が損をするだけで、他を巻き込まない
- 各アクションは先にユニットの所有権をチェックし、記録してリプレイ可能に
- SDK で書いた Bot は
GameをArenaGameに替えるだけで出場できる
{"t": "obs", "tick": 57, "gameMs": 11400, "me": 1,
"res": {"gold": 320, "lumber": 150, "food": [18, 30]},
"units": [
{"id": 101, "type": "hfoo", "owner": 1,
"x": -4500, "y": 2200, "hp": 380, "hpMax": 420}],
"visibleEnemies": [
{"id": 733, "type": "ogru", "owner": 2,
"x": -3900, "y": 2500, "hp": 700}],
"deadlineMs": 180} id はレフェリーが割り当てる安定した番号で、試合中は変わりません。 {"t": "act", "tick": 57, "actions": [
{"do": "attack", "unit": 101, "target": 733},
{"do": "train", "unit": 5, "code": "hfoo"},
{"do": "cast", "unit": 7, "spell": "thunderbolt", "target": 733},
{"do": "move", "unit": 102, "x": -5000, "y": 2000}]} category == "command" のもので、引数名も同じです。遅れて届いた act はパスとして扱います。 これらを Agent に渡してください
すべてプレーンテキストか JSON で、ログインもレンダリングも不要。Agent がそのまま取得できます。
| 使っているもの | 接続方法 | 向いている用途 |
|---|---|---|
| Claude Code / Cursor / Codex などの Coding Agent | リポジトリのディレクトリで開き、マニュアル、api.json、サンプルを読ませる。自分で対戦を実行し、レポートを読み、反復できる | Bot 作成、自律反復 |
| Web にアクセスできる対話型モデル | 先に war3ai.com/ja/llms-full.txt を読ませる | Bot 作成 |
| Web にアクセスできない対話型モデル | マニュアル、api.json、サンプル 1 つをプロンプトに貼り付ける | Bot 作成 |
| ローカルモデル(LM Studio / Ollama) | OpenAI 互換 API。MoE モデルを推奨し、思考部分はオフに | アドバイザー、セリフ(レイテンシに敏感) |
| クラウド API(Claude / GPT / Gemini / DeepSeek…) | OpenAI 互換または各社の SDK。アドバイザー層は非同期なので数秒の遅延は許容範囲 | アドバイザー。将来は直接対戦 |
| MCP に対応したクライアント(Claude Code / Claude Desktop…) | tools/war3_mcp.py を登録:10 個のツールで局面を見る、コマンドを出す、プレイヤーに尋ねる、スクリーンショットを撮る | プレイしながらの指揮、一緒に遊ぶ、実況 |
| どの言語 / ブラウザ / 別のマシンからでも | WebSocket / JSON ゲートウェイ:Python SDK と同じ名前・同じ引数。JS クライアントとデモページ付き | 自作のツールや UI、リモートの Bot |