AI Agent

你的模型負責思考, War3AI 負責做到

一個 Agent 要在真實環境中自己把事情做成,需要三樣東西:能說清楚的動作、能讀懂的回饋、不怕犯錯的環境。我們把《魔獸爭霸 III》改造成了這樣的環境。

設計原則

為什麼 Agent 能在這裡自己把事情做成

讓 AI 玩遊戲,常見的做法是模擬滑鼠鍵盤、辨識畫面,結果到底有沒有做成只能用猜的。我們反過來,從「一個模型需要什麼才能自我修正」出發,設計每一個介面。

只說「做什麼」

移動、攻擊、建造、施法……語意命令直接對應玩家的操作;單位用四字碼、技能用指令名,和遊戲裡的叫法一致。模型不需要任何底層知識。

每個動作都有結構化回饋

回執在同一幀讀回:有沒有接下、原因碼、下令前後的指令、執行耗時。「為什麼沒做成」是一個數字,不是一段猜測。

不用看畫面也知道結果

快照告訴你現在是什麼樣子,事件流告訴你發生了什麼:每一下傷害、每一次擊殺、每一次生產完成。Agent 可以驗證自己的判斷。

文件就是介面

api.json 由程式碼產生,103 個方法各自標註實測狀態與底層機制;llms.txt 一次讀完全站。模型沒有理由編造方法。

失敗是安全的

Bot 拋出例外,下一拍照常繼續;超過截止時間的命令不會再執行;Bot 行程當掉,遊戲照常運作。Agent 可以放心嘗試。

從第一天就講求公平

公平模式只提供視野內的東西,和擂台規則一致。Agent 在本機練出來的能力,將來上對戰平台一行都不用改。

01 離線 · 寫程式

Agent 寫 Bot

最快的入門方式,不需要會寫程式。把手冊、api.json 和一個範例交給 Claude Code、Cursor、Codex 或任何對話模型,再用白話描述打法。它會寫出一個繼承 openwar3.Bot 的 Python 檔案,一條命令就能上場。

  • 提示詞範本裡已寫好 15 條「實機踩坑踩出來的規矩」
  • 要求它只使用 api.json 裡的方法,杜絕編造
  • 把錯誤訊息原封不動貼回去、描述看到的現象,讓它修改
完整提示詞範本
你
人類,開局 5 個農民採金、1 個伐木;先出大魔法師;兩座兵營出步兵和火槍兵;湊到 12 個兵就帶著英雄去打對面的分礦;英雄血量低於 30% 就撤回家。

好的,我會依照 rush_bot.py 的結構來寫,只使用 api.json 裡的方法:

  • 採集只派 idle_workers(),一座礦 5 人
  • 兵營佇列只排 1 個,人口卡住就看 production().blocked
  • 出擊時用 path_distance 選分礦,再 attack_move 過去
  • 英雄血量低於 30% 時 move 回家,陣亡了就用 revive
my_bot.py · 96 行
$ python tools/play.py --bot brains/my_bot.py --race 1
02 離線 · 閉環

讓 Agent 自己迭代

能執行命令的 Coding Agent 可以把「跑一局、看結果」也接手過去。給它一條無人值守的命令、一份結構化的對局報告和一個明確的目標,它就能一輪一輪地改進。

  1. 跑 play.py --speed 200 --minutes 10 --fair
  2. 讀 對局報告:生產時間線、傷亡、被拒最多的原因
  3. 改 對結果影響最大的一處,並在註解裡寫下依據
  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 就立刻蓋農場,而不是等人口快滿了才蓋。這一輪只改這一處。

03 線上 · 參謀

LLM 當運營顧問

「該囤什麼、該往哪裡投入人力、這一分鐘該打還是該緩」—— 這類綜觀全局、排定優先順序的判斷,寫成 if / else 會互相打架,卻正好是 LLM 擅長的。參考大腦每 20 遊戲秒詢問一次本機模型,拿回一份嚴格的 JSON。

不直接對單位下令:只調整目標和優先順序,指揮權只有一個主人
非同步:永遠不阻塞任何一拍;逾時或亂回答,就當作沒有這一層
白名單 + 鉗制:不認得的內容計數後丟棄
全程計數:成功、逾時、被鉗制、被採納,全都看得見
分層、契約與實作骨架
LLM(顧問)每 20 遊戲秒 · 非同步
{
  "diagnosis": "金 820 木 60,木材是瓶頸,兵營因缺木停產",
  "workers":   {"gold": 10, "lumber": 7},
  "priority":  ["hpea", "hhou", "hfoo"],
  "posture":   "hold",
  "avoid":     ["木材不夠時別先研究鐵甲"]
}
白名單 + 鉗制 + 否決
規則層(每拍)把建議轉成偏好權重

工人配比 10 / 7 · 訓練優先順序 hpea → hhou → hfoo · 姿態 hold

語意命令
執行層(SDK / 毫秒層)約 1 幀

下令、讀回執、微操

1.09 s 中位延遲 · 最慢 1.45 s · 5/5 輸出可直接解析
本機 Qwen3.6-35B-A3B(LM Studio)
04 線上 · 角色

讓單位開口說話

任意單位、任意身分都能在頭頂彈出氣泡,多個單位可同時說話,每個氣泡的樣式都能個別自訂。接上本機 LLM,一句話輸入,一句回覆就以串流方式出現在單位頭上。農民茶話會、英雄對白、戰況解說,都是現成的。

0.3 s 首字延遲
32 同時在場的氣泡
0.1~0.2 ms 每幀開銷
氣泡 API 與模型選擇
山丘之王 衝!喝完這口就衝!
大魔法師 我來放暴風雪。
農民 · 老王 又被 AI 抓來開局挖礦當訓練資料……
POST http://127.0.0.1:8872/api/chat
{
  "inst": 16, "unit": "0x14A12614", "name": "山丘之王",
  "persona": "你扮演山丘之王,豪爽、愛喝酒,一兩句口語",
  "message": "前面有一群食人魔,我們衝不衝?",
  "stream": true
}
→ {"reply": "衝!喝完這口就衝!",
   "first_token_ms": 283, "total_ms": 342}
05 線上 · 當夥伴

AI 玩伴

在 RPG、自訂地圖裡幫自己配一個 AI 夥伴:它跟著你走、幫你打怪,你殘血時幫你補血,閒下來陪你聊兩句 —— 台詞可以接本機 LLM。繼承一個類別、改幾個屬性,就是你自己的玩伴。

每一拍依序判斷,哪一條成立就做哪一條

  1. 撤退 自己殘血、附近有敵人:退到你身後
  2. 補血 你血量低、技能冷卻好了:幫你補一口
  3. 助戰 先打正在打你的,再打你正在打的
  4. 跟隨 離你太遠就跟上,遠到一定程度就直接跑回來
  5. 閒聊 沒仗可打的時候,每隔一兩分鐘說一句
盟友 占用一個空的玩家槽位,有自己的顏色和名字
我方 建立在你名下,你隨時能接手指揮
接管 接管地圖給你的寵物、隨從
只說話 不改動世界,多人局也能用
RPG 玩伴文件
玩伴 · 小聖
正在:幫你打怪 心情:興奮 擊殺 12 · 補血 5
你 -follow
小聖 收到,一直跟著你!
你 -heal
小聖 聖光,治癒你!
小聖 漂亮!又解決一隻兩棲追隨者。

在聊天框輸入 -follow / -stay / -heal / -hi,或者對它按右鍵

06 線上 · 當工具

LLM 直接呼叫工具

支援 MCP 的用戶端 —— Claude Code、Claude Desktop、本機模型的 Agent 框架 —— 掛上 war3_mcp.py,LLM 就能直接看局面、下命令、在螢幕上跟玩家說話、跳出卡片詢問玩家、截圖看畫面。不必先寫程式碼,想到什麼就讓它做什麼。

  • 10 個工具:一頁局面、單位、事件、呼叫任意公開 API、查詢 API、螢幕提示、頭頂說話、詢問玩家、截圖、JASS
  • 三種角色:開發、選手(只指揮一個玩家、只看它的視野)、觀眾(唯讀)
  • 第一次呼叫工具時才連線遊戲,遊戲可以晚點再開
MCP 文件
你
看看現在的局面,然後在螢幕上問我:下一步是開分礦、暴兵還是升級主城?

呼叫了 2 個工具:

  • war3_overview → 金 500 · 人口 10/12 · 主城 1 · 農民 5 · 聖騎士 1
  • war3_ask_player → 螢幕中間三張卡片,選擇時遊戲暫停
  • 你點了「開分礦」,結果原封不動回到對話裡,我接著安排農民
$ claude mcp add war3 -- python tools/war3_mcp.py --inst 9
07 即將推出 · 直接對局

Agent 親自上場

對戰平台使用 WebSocket / JSON:裁判每拍傳送一份依視野過濾的觀察,Bot 回傳一組動作。任何語言、任何模型 —— 甚至不寫程式碼、直接讓 LLM 逐拍輸出 JSON —— 都能接入。單機版今天就能用:閘道的選手角色只讓你指揮一個玩家、只看得到它的視野;對戰平台要補上的,是一個大家都信任的裁判。

  • 依遊戲時間出拍,慢的一方自己吃虧,不拖累別人
  • 每個動作都先校驗單位歸屬,並記錄下來以供重播
  • 用 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、自主迭代
能上網的對話模型讓它先讀 war3ai.com/zh-tw/llms-full.txt寫 Bot
不能上網的對話模型把手冊、api.json 和一個範例貼進提示詞寫 Bot
本機模型(LM Studio / Ollama)OpenAI 相容 API;建議使用 MoE 模型並關閉思考段落參謀、配音(對延遲敏感)
雲端 API(Claude / GPT / Gemini / DeepSeek…)OpenAI 相容 API 或各家 SDK;參謀層是非同步的,幾秒延遲可以接受參謀;將來可直接對局
支援 MCP 的用戶端(Claude Code / Claude Desktop…)掛上 tools/war3_mcp.py:10 個工具直接看局面、下命令、詢問玩家、截圖邊打邊指揮、陪玩、解說
任何語言 / 瀏覽器 / 另一台電腦WebSocket / JSON 閘道:和 Python SDK 同名同參數,附 JS 用戶端和示範頁自己的工具和介面、遠端 Bot

從一句話開始

裝好環境大約 15 分鐘。剩下的交給你的 Agent。