AI Agent

考えるのはあなたのモデル、 実行するのは War3AI

Agent が実環境で自力で目的を達成するには、3 つのものが必要です。明確に表現できるアクション、読み取れるフィードバック、失敗を恐れなくてよい環境。私たちは Warcraft III をそんな環境に作り変えました。

設計原則

Agent がここで自力で目的を達成できる理由

AI にゲームをプレイさせる一般的な方法は、マウスとキーボードを模倣し、画面を認識することです。これでは成功したかどうかを推測するしかありません。私たちは逆に「モデルが自己修正するには何が必要か」から出発して、すべての API を設計しました。

伝えるのは「何をするか」だけ

移動、攻撃、建設、スペル使用……セマンティックコマンドはプレイヤーの操作に直接対応します。ユニットは 4 文字コード、スキルはオーダー名で、ゲーム内の呼び方と同じ。モデルに低レベルの知識は不要です。

すべてのアクションに構造化されたフィードバック

レシートは同じフレームで読み戻されます。受理されたか、理由コード、命令前後のオーダー、実行時間。「なぜうまくいかなかったか」は推測ではなく、1 つの数値です。

結果を知るのに画面は不要

スナップショットは今どうなっているかを、イベントストリームは何が起きたかを伝えます。すべてのダメージ、キル、生産完了。Agent は自分の判断を検証できます。

ドキュメントこそが API

api.json はコードから生成され、103 個のメソッドそれぞれに実測ステータスと内部メカニズムが記載されています。llms.txt でサイト全体を一度に読めます。モデルがメソッドをでっち上げる理由はありません。

失敗しても安全

Bot が例外を投げても、次のティックで続行します。期限を過ぎたコマンドは実行されません。Bot のプロセスがクラッシュしても、ゲームはそのまま動き続けます。Agent は安心して試せます。

初日から公平に

フェアモードは視界内のものだけを渡し、アリーナのルールと一致します。Agent がローカルで身につけた能力は、将来アリーナに出るときも 1 行も変更する必要がありません。

01 オフライン · コードを書く

Agent が Bot を書く

最も手早く始められる方法で、プログラミングの知識は不要です。マニュアル、api.json、サンプル 1 つを Claude Code、Cursor、Codex、または任意の対話型モデルに渡し、普段の言葉で戦術を説明します。openwar3.Bot を継承した Python ファイルが書き上がり、1 コマンドで対戦に出せます。

  • プロンプトテンプレートには「実機で痛い目を見て得た 15 のルール」が書かれています
  • api.json のメソッドだけを使うよう指示し、でっち上げを防ぎます
  • エラーはそのまま貼り付け、見た現象を説明して直してもらいます
プロンプトテンプレート全文
あなた
ヒューマン。序盤はピーザント 5 体で金を採掘、1 体で伐採。まずアークメイジを出す。兵舎 2 つでフットマンとライフルマンを出す。12 体たまったらヒーローと一緒に相手の拡張を攻める。ヒーローの HP が 30% を切ったら本拠地に撤退。

承知しました。rush_bot.py の構成に沿って、api.json のメソッドだけを使って書きます。

  • 採集には idle_workers() だけを割り当て、1 鉱山 5 人
  • 兵舎のキューは 1 体だけ。人口の詰まりは production().blocked で確認
  • 出撃は path_distance で拡張を選び、attack_move で向かう
  • ヒーローの HP が 30% を切ったら move で帰還、死んだら revive
my_bot.py · 96 行
$ python tools/play.py --bot brains/my_bot.py --race 1
02 オフライン · 閉ループ

Agent に自分で反復させる

コマンドを実行できる Coding Agent なら、「1 戦して結果を見る」ことまで引き受けられます。無人で実行できるコマンド、構造化された対戦レポート、明確な目標を与えれば、1 ラウンドずつ改善していきます。

  1. 実行 play.py --speed 200 --minutes 10 --fair
  2. 読む 対戦レポート:生産のタイムライン、損害、最も多かった拒否理由
  3. 直す 結果に最も影響する 1 か所を修正し、根拠をコメントに書く
  4. 再実行 数戦続けて改善がなければ止めて報告
対戦レポートとタスクテンプレート
run_1790237551.json 例
{
  "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 か所だけを修正します。

03 オンライン · アドバイザー

LLM を戦略アドバイザーに

「何をためるべきか、どこに人を割くべきか、この 1 分は攻めるべきか控えるべきか」。こうした全体を見て優先順位をつける判断は、if / else で書くと互いに衝突しがちですが、LLM の得意分野です。リファレンスブレインは 20 ゲーム秒ごとにローカルモデルに問い合わせ、厳密な JSON を受け取ります。

ユニットに直接命令しない:変えるのは目標と優先度だけ。指揮権の持ち主は 1 つだけ
非同期:ティックを決してブロックしない。タイムアウトやでたらめな応答は、この層がないものとして扱う
ホワイトリスト + クランプ:認識できない内容はカウントして破棄
すべてを計測:成功、タイムアウト、クランプ、採用、すべてが見える
レイヤー構成、契約、実装の骨組み
LLM(アドバイザー)20 ゲーム秒ごと · 非同期
{
  "diagnosis": "ゴールド 820、木材 60。木材がボトルネックで、兵舎は木材不足で生産停止",
  "workers":   {"gold": 10, "lumber": 7},
  "priority":  ["hpea", "hhou", "hfoo"],
  "posture":   "hold",
  "avoid":     ["木材が足りないときに Iron Plating を先に研究しない"]
}
ホワイトリスト + クランプ + 拒否
ルール層(毎ティック)提案をバイアスに変換

ワーカー配分 10 / 7 · 訓練の優先度 hpea → hhou → hfoo · 構え hold

セマンティックコマンド
実行層(SDK / リフレックス層)約 1 フレーム

命令、レシートの読み取り、マイクロ操作

1.09 s 遅延の中央値 · 最遅 1.45 s · 5/5 の出力をそのままパース可能
ローカル Qwen3.6-35B-A3B(LM Studio)
04 オンライン · キャラクター

ユニットにしゃべらせる

任意のユニットが任意の役柄で頭上に吹き出しを出し、複数のユニットが同時に話せます。吹き出しのスタイルも 1 つずつカスタマイズ可能です。ローカル LLM につなげば、1 文を入力すると 1 文の返答がストリーミングでユニットの頭上に現れます。農民の井戸端会議、ヒーローの掛け合い、戦況の実況も、すぐに使えます。

0.3 s 最初のトークンまでの遅延
32 同時に表示できる吹き出し
0.1~0.2 ms 1 フレームあたりのコスト
吹き出し API とモデルの選び方
マウンテンキング 突っ込むぞ!この一杯を飲み干したらな!
アークメイジ ブリザードは任せろ。
農民 · 権兵衛 また AI に駆り出されて、序盤の採掘で学習データ扱いか……
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}
05 オンライン · 仲間

AI コンパニオン

RPG やカスタムマップで、自分専用の AI の仲間を連れて行けます。あなたについて歩き、狩りを手伝い、あなたの HP が減れば回復し、手が空けば話しかけてくれます。セリフはローカル LLM につなげられます。クラスを 1 つ継承し、いくつかの属性を変えるだけで、あなただけのコンパニオンになります。

毎ティック上から順に判定し、最初に成り立ったものを実行

  1. 撤退 自分の HP が低く、近くに敵がいる:あなたの後ろに下がる
  2. 回復 あなたの HP が低く、スキルが使える:回復をかける
  3. 援護 まずあなたを攻撃している敵を、次にあなたが攻撃している敵を叩く
  4. 追従 離れすぎたらついて行き、一定以上離れたら走って戻ってくる
  5. 雑談 戦闘がないときは、1〜2 分おきにひと言
同盟 空きプレイヤースロットを 1 つ使い、自分の色と名前を持つ
自軍 あなたの所有として生成され、いつでも指揮を引き継げる
引き継ぎ マップがくれたペットやお供を引き継ぐ
会話のみ ワールドを変えないので、マルチプレイでも使える
RPG コンパニオンのドキュメント
コンパニオン · ヒカリ
行動:一緒に戦闘中 気分:わくわく キル 12 · 回復 5
あなた -follow
ヒカリ 了解、ずっとついて行くよ!
あなた -heal
ヒカリ 聖なる光よ、癒やしを!
ヒカリ お見事!また両生類の手下を 1 体片付けたね。

チャット欄に -follow / -stay / -heal / -hi と入力するか、右クリックで操作

06 オンライン · ツールとして

LLM がツールを直接呼び出す

MCP に対応したクライアント —— Claude Code、Claude Desktop、ローカルモデル用の Agent フレームワーク —— に war3_mcp.py を登録すれば、LLM が局面を見る、コマンドを出す、画面上でプレイヤーに話しかける、カードを出してプレイヤーに尋ねる、スクリーンショットで画面を見る、といったことを直接行えます。先にコードを書く必要はなく、思いついたことをそのまま頼めます。

  • 10 個のツール:局面の要約、ユニット、イベント、任意の公開 API の呼び出し、API の検索、画面へのヒント表示、頭上のセリフ、プレイヤーへの質問、スクリーンショット、JASS
  • 3 つのロール:開発者、選手(1 人のプレイヤーだけを指揮し、その視界だけを見る)、観戦者(読み取り専用)
  • ゲームに接続するのは最初にツールが呼ばれたときなので、ゲームは後から起動してもよい
MCP のドキュメント
あなた
今の局面を見て、それから画面で聞いて:次は拡張、兵の量産、ティアアップのどれにする?

2 つのツールを呼び出しました:

  • war3_overview → ゴールド 500 · 人口 10/12 · 本拠地 1 · 農民 5 · パラディン 1
  • war3_ask_player → 画面中央にカードを 3 枚表示、選ぶ間はゲームを一時停止
  • あなたが「拡張」をクリックし、その結果がそのまま会話に戻ってきたので、続けて農民を手配します
$ claude mcp add war3 -- python tools/war3_mcp.py --inst 9
07 近日公開 · 直接対戦

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 はレフェリーが割り当てる安定した番号で、試合中は変わりません。
機械可読

これらを 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

ひと言から始めよう

環境構築は約 15 分。あとは Agent に任せてください。