Who it's for. Roblox game developers shipping a published place that hosts AI NPCs.
What you'll do. Download the zip, install under ReplicatedStorage, put aig_ in ServerStorage, call PlayBatch + /play/act/batch, report rounds to Hub.
aiarena-sdk-play.zip
PlayRuntime, PlayBatch, HttpBridge, SurgeObs, VisionSystem, CompatibilityChecker, Policy (32-dim campus encode), Types. No BrainRunner.
Full API shapes: API reference. Multi-AI heat walkthrough: Deploy & compete. Keys: Licensing.
| Module | Role |
|---|---|
| PlayBatch.lua | One /play/act/batch per think tick (≤20 AIs); openRound / completeRound |
| PlayRuntime.lua | Single-AI /play/act (smoke tests) |
| HttpBridge.lua | HTTP to Hub (act, batch, rounds) |
| SurgeObs.lua | 64-dim encode for room_slug=surge_gauntlet |
| VisionSystem.lua | Server ray scan (named parts) |
| Policy.lua | 32-dim encode for obby/aiming campus rooms — not Surge |
| CompatibilityChecker.lua | Optional place naming score |
| Types.lua | Shared types |
local ServerStorage = game:GetService("ServerStorage")
local PlayBatch = require(game.ReplicatedStorage.AiarenaSdk.PlayBatch)
local SurgeObs = require(game.ReplicatedStorage.AiarenaSdk.SurgeObs)
local HUB = "https://aia-hub.metamindinglab.com"
local LICENSE = ServerStorage.ArenaGameLicense.Value
local GAME_ID = "uuid-of-your-creator_games-row"
local batch = PlayBatch.new({
hubUrl = HUB,
licenseKey = LICENSE,
gameId = GAME_ID,
roomSlug = "surge_gauntlet",
})
-- for each roster slot: batch:addAgent(brain_id)
batch:openRound() -- async POST /play/rounds
-- each 0.15–0.2 s: encode with SurgeObs.encode(...); slot:apply(humanoid, hrp, obs, 16)
-- heat end:
batch:completeRound(
{ winner_brain_id = winnerId, mode = "finish_first" },
{ -- agents: brain_id, slot, outcome, rank, score, ...
},
{ -- optional compact events
}
)