FORERUNNER // CHARACTER ENGINE · API PREVIEW
生きたキャラクターと世界を、あなたのゲームに。
記憶し、語り、キャラクターを保ち続けるAIキャラクターと、彼らが生きる世界のための、一つのAPI。Mirariを動かすのと同じスタックを、あなたのゲーム・アプリ・エージェントに開放します。
プレイヤーが見るものを、見ている。
知覚ストリームを開き、プレイヤーのビューポートをキャラクターへ流し込む。リアルタイムでゲームを見つめ、目の前に実際にあるものに対して語り、反応し、行動する——スクリプトではなく、目撃者として。
// stream the player's view → the character sees the gamevar eyes = fr.Characters.Perceive("char_8f2", fps: 4); // push the camera's render target each framevoid Update() => eyes.Send(playerCamera.Capture()); eyes.OnReaction += r => { // r.Sees "a dragon landing on the keep wall" // r.Says "Get down — to the wall, now!" npc.Perform(r); // r.Act "point", r.Emotion "alarm"};あなたの世界の中で
ゲームの中に生きるキャラクター。
あなたの世界に一人組み込めば、プレイヤーを覚え、自らの声で返し、キャラクターを保ち続ける——クエストを越えて、いつまでも。
自作か、採用か
ひとつのAPIか、継ぎ接ぎのスタックか。
どのチームも見積もる自作構成は同じです。思考にGPT、音声にElevenLabs、記憶にmem0 — そして、それらをひとりのAIキャラクターに見せるための糊。その計算をどうぞ。
最初の音声まで
GPT → ElevenLabs の往復は約1.2〜2秒
3社ではなく
GPT + ElevenLabs + mem0 + 糊を置き換える
運用するベクトルストア
記憶はフルマネージド — そのまま動く
GPT + ElevenLabs + mem0
自作スタック- ✕最初の音声までの時間 — 約1.2〜2秒
- ✕リアルタイム知覚 — 現実的な手段なし
- ✕記憶 — ベクトルストアと検索を自前で運用
- ✕接続するベンダー数 — 3社 + 自前の糊コード
- ✕キャラクターを保つ — API をまたいでプロンプトで継ぎ接ぎ
- ✕音声の同意 — あなた任せ
Mirari
ひとつのAPI- 最初の音声までの時間 — < 300 ms
- リアルタイム知覚 — ネイティブ — ゲームが見える
- 記憶 — フルマネージド — そのまま動く
- 接続するベンダー数 — 1
- キャラクターを保つ — ひとつのモデル、常に
- 音声の同意 — Voice ID Registry を標準搭載
Mirari の最初の音声は当社スタックでの実測値です。自作の数値は、ストリーミングのGPTクラス → ElevenLabs → mem0 の往復を代表する値です。詳細な計測方法はご請求ください。
3回の呼び出しで動き出す。
REST APIの説明用プレビューです。一般提供までに仕様は変わる可能性があります——キーの発行とともに、最新の仕様をお渡しします。
認証する
APIキーを差し込み、ベースURLを指すだけ。すべての呼び出しは、ベアラートークン一つで届きます。
// Unity — add the Forerunner UPM package, then:using Forerunner; var fr = new ForerunnerClient("fk_live_8f2a…");bool ok = await fr.HealthAsync();Debug.Log(ok); // Trueキャラクターを作成する
名前、ペルソナ、声を与えるだけ。永続的な記憶を備え、話す準備が整った状態で返ってきます。
var rin = await fr.Characters.CreateAsync(new CharacterSpec { Name = "Rin", Persona = "Sharp-tongued, loyal, bilingual scout.", Voice = "mirari:rin", Memory = MemoryMode.Persistent,});Debug.Log(rin.Id); // "char_8f2"メッセージを送る
キャラクターのまま、テキストと音声で返答をストリーミング——その間、記憶は自ら更新されます。これがループのすべてです。
// stream a reply, in character, with audioawait foreach (var ev in fr.Characters.Chat("char_8f2", new ChatRequest { Session = "player_42", Say = "I'm back.",})) { if (ev.Text != null) subtitle.Append(ev.Text); if (ev.Audio != null) audioSource.Stream(ev.Audio); // ~280ms first byte}記憶と状態を更新する
たった今起きたこと——裏切り、贈り物、死——を書き込み、ゲームの状態やプレイヤーの事実にパッチを当てる。キャラクターは次のセッションで、促されずともそれを思い出します。
// write what just happened — recalled next session, unpromptedawait fr.Characters.RememberAsync("char_8f2", new MemoryEvent { Event = "Player spared the bandit chief.", Weight = 0.8f, Tags = new[] { "mercy", "quest:bandits" },}); // patch game state + player factsawait fr.Characters.PatchStateAsync("char_8f2", new { trust = +2, location = "Riverwood", knows = new { player_name = "Dovah" },});生きた世界
言葉にするだけ。ナレーターが生かし続ける。
アンサンブルをキャスティングし、世界をふつうの言葉で描くだけ。すべてを統べるAI — ナレーター — があなたの言葉から関係性のグラフを組み立て、出来事の進行に合わせてすべての絆を編み直します。配線する関係図も、書き起こす分岐もありません。
// Describe the world in plain English — the narrator does the wiring.const world = await fr.worlds.create({ cast: ["Rin", "Tsuki", "Mochi", "Vex", "Kit", "Sable"], premise: `Rin trusts Kit, but both are rivals with Vex. Tsuki mentors Mochi, who owes Sable a life debt.`,}); // From here an overseeing AI runs the world: it reads each event and// reshapes every bond, mood, and stake on its own — no graph wiring,// no branch scripts.world.on("event", world.narrate);ナレーターがグラフ全体をリアルタイムで動かす — あなたは世界がどんなものかを語るだけ。
アーリーアクセスを手に入れる。
スタジオやつくり手の方々を、段階的にオンボーディングしています。あなたが何を作っているのか教えてください。キーをお渡しします。
クレジットカード不要。順次ご招待。完全なドキュメントはapi.forerunner.aiで公開予定。


