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"};당신의 세계 속에서
게임 속에 살아가는 캐릭터.
당신의 세계에 하나 데려오면 플레이어를 기억하고, 자기만의 목소리로 대답하며, 캐릭터를 유지합니다 — 퀘스트를 거듭해도 변함없이.
직접 구축 vs 도입
하나의 API, 아니면 직접 엮어야 할 스택.
어느 팀이든 똑같은 DIY 구축을 견적 냅니다. 두뇌는 GPT, 음성은 ElevenLabs, 메모리는 mem0 — 게다가 이 모두를 하나의 캐릭터처럼 느껴지게 묶는 접착 코드까지. 계산해 보면 이렇습니다.
첫 음성까지
GPT → ElevenLabs 왕복은 ~1.2–2 s
세 개의 공급사가 아닌
GPT + ElevenLabs + mem0 + 접착 코드를 대체
운영할 벡터 스토어
메모리는 관리형 — 그냥 작동합니다
GPT + ElevenLabs + mem0
DIY 스택- ✕첫 음성까지 시간 — ~1.2–2 s
- ✕실시간 인지 — 현실적인 방법 없음
- ✕메모리 — 벡터 스토어 + 검색을 직접 운영
- ✕연결할 공급사 — 3 + 직접 작성한 접착 코드
- ✕캐릭터 유지 — 여러 API에 걸쳐 프롬프트로 봉합
- ✕음성 동의 — 직접 책임
Mirari
하나의 API- 첫 음성까지 시간 — < 300 ms
- 실시간 인지 — 네이티브 — 게임을 봅니다
- 메모리 — 관리형 — 그냥 작동
- 연결할 공급사 — 1
- 캐릭터 유지 — 하나의 모델, 언제나
- 음성 동의 — Voice ID Registry 기본 내장
Mirari 첫 음성은 자사 스택에서 측정했으며, DIY 수치는 스트리밍 GPT급 → ElevenLabs → mem0 왕복을 대표하는 값입니다. 전체 방법론은 요청 시 제공합니다.
세 번의 호출로 작동시키기.
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에서 제공됩니다.


