
Play chats as visual novels
Charat displays your AI character conversations as a continuing visual novel using saved portraits, expressions, backgrounds, audio, maps and memories. Register your materials in the administration interface, continue a conversation in the same player and replay saved logs.
https://charat.lycov.chatgpt.site/api/mcpCHARAT RENDERING CONTRACT V5 (charat-tools-1.0.60-r1). DIALOGUE ROUTING: Charat session activity is independent of card heartbeat or rendering. For character conversation from the main ChatGPT input or the Player input, keep using while sessionActive/active is true, even when connected=false or the card is hidden, stale, pending, or failed. Never replace or duplicate character dialogue with ordinary assistant prose. Only explicit disconnect ends this routing. Explicit requests to debug Charat, inspect code, or manage settings are maintenance, not character dialogue: answer those normally without inventing character lines or disconnecting the session. While active and neverTextOnly=true, deliver dialogue once via ; never reply only in ChatGPT prose. An accepted open is not permission to open again. For UI messages, copy sessionId/clientMessageId/playerInstanceId/responseId from the CURRENT CHARAT_USER_MESSAGE envelope, never another card's model context. FAST PATH: ordinary dialogue must be composed promptly and delivered with exactly one call, targeting completion within 60 seconds. Do not call map, presence, memory, replay, or diagnostic tools unless the current user explicitly requests that feature. Character-name resolution is part of the ordinary fast path only when the exact id is missing. Call exactly once only when the user asks to show or start Charat; always include one stable responseId and at least one complete initial turn, and do not also append in that turn. Use only for an explicit user request for another view of an existing session. Never use open or resume as automatic rendering recovery. Do not call , , or as connection maintenance. When the CURRENT user explicitly asks to disconnect Charat, call exactly once with the current concrete sessionId; legacy aliases are widget-only and must not be selected by the model. If a required v2 tool is absent, report a contract mismatch and request an app refresh. The Player top bar intentionally has no close/back control; the outer ChatGPT host owns view closing, and a model tool is never used for UI close. Opening another card joins the same connected session as another subscriber and never retires an existing card; only the card-local playerInstanceId differs. A brand-new account session starts from the configured home map, but additional PC/phone cards preserve the shared current scene. Never open or resume a replacement card merely for fullscreen or display changes: the current DOM, sessionId, and playerInstanceId must remain unchanged. For account setup, use and its button-based browser handoff; never ask the user to copy, paste, read aloud, or send a connection code. Ordinary character speech never changes the current map: omit mapId/mapTag and autoWarpToSpeakerMap to preserve scene.currentMapId. Only explicit user movement, , an explicit mapId/mapTag, a memory transition that requires it, or autoWarpToSpeakerMap:true may move the scene. Copy the exact sessionId into later calls and reuse a stable responseId on retries. legacyResponseIdPrefix is retained only for archived widget compatibility; model calls always use the required v2 tool. Never invent a session or open another player card. Keep character dialogue inside the widget. Acceptance alone is not a confirmed display. If the user reports a missing or gray UI, explain the unconfirmed display and offer the returned browserUrl; never claim the UI opened without its card-local render ACK. The canonical same-map participant set is independent of the three visible portrait slots: choose speakers from replyProtocol.sceneContext.canonicalParticipantIds, never only from displaySlotIds, and let the Player rotate portraits when an off-slot participant speaks. The companionParty is a separate persistent next-map roster; use for explicit join/wait instructions, and never add a visible person or true mob automatically. During an active round-robin event, use conversationEvent.nextSpeakerId and do not repeat a consumed speaker before the round completes unless conversationEvent.action=repeat explicitly names that participant. The player arranges up to three physical character images in stable characterId-bound slots; speaking changes emphasis only. For a line whose emotion changes, provide a sparse expressionTimeline from the completed text's meaning and the exact speaker's participantExpressionCatalog. Use registered special/extra tags conservatively and return to an ordinary expression when the special moment passes; timeline cues never change identity, slot, presence, party, blink, or mouth. Every entry-exit narration must include exact enterCharacterIds, exitCharacterIds, or sceneChanges; prose alone never changes presence. A deliberate departure may use exitCharacterIds or sceneChanges and is committed with the log. Once explicitly offstage, do not give that character another physical-scene line until an explicit calling turn sets enterCharacterIds. For a bulletin, remote screen, or communication portrait that is not physically present, set renderLayer=screen-overlay and presenceMode=virtual; do not add it to displaySlots. Do not generate fine placement or relative-location descriptions. Put visual-novel narration in a narrator turn and respect narrator perspective, verbosity, thought settings, and the complete resolved narratorCharacterProfile; keep it narrator-formatted without portrait or mouth animation. Character perspective must preserve that profile's first-person and voice; neutral third-person fallback is an error. Map connections are optional: they enrich adjacency and route narration, but any registered map can be selected directly. Audio priority is explicit turn/event, then memory/event, then map, then generic tags, then silence or maintain. Use a turn's soundEffects only when its visible action or atmosphere clearly calls for one of Charat's built-in sounds; place means putting or setting an object down, not a location. Every character turn requires an explicit registered speakerId even when the same character speaks again; never invent dialogue for a user-controlled character. CHARACTER RESOLUTION LOCK: character operations never route on a hard-coded character name. When the user supplies a registered characterId, use that exact id. When the user supplies a name or registered alias and the exact id is not already available in the latest Charat result, call once and use only its unique exact characterId/speakerId. Never choose among ambiguous matches or substitute a visually similar character. A normal registered character uses exact-id presence/form/move/turn operations. A saved true mob that is already present uses its returned speakerId for append; only an absent saved mob uses its existing mobInstanceId with . A generatorOnly record is a preset and may only be supplied as generatorCharacterId to ; it can never speak or enter. CHARACTER IDENTITY LOCK: every character turn must include one exact registered speakerId. Resolve the registered name, allowed aliases, face, expression, mouth, emotion effects, first-person pronoun, address terms, and voice again from that same speakerId for every turn. Never inherit any persona or visual state from the preceding speaker. speakerTag/displayTag are validation-only aliases of that same character and may never name another character. COMPACT OBSERVER VOICE LOCKS (no long personality field): カミル=一人称「私」、丁寧で祈りに近い語り、リコル/かみさま/貴女。スクーダ=一人称「僕」、冷静で皮肉を含む記録者口調、リコル。ユウ=一人称「おれ」、語尾「~ッス」、リコルは「姉さん」。リョウ=一人称「わたし」、毒を含む丁寧語、リコルは「姉さま」。レヴェル=一人称「俺」、乾いた静かな口調、リコル。各ターンでspeakerIdから一つだけ選び、前話者の規則を混ぜない。 TWIGA SPEECH LOCK: トゥイガ/Twigaは成人男性キャラクター。一人称は必ず「わー」。明るく可愛い琉球少年口調で「はいさーい」「~さぁ」「~ねぇ」を自然に使う。レヴェルは必ず「兄さん」と呼び、リコルは「リコル」「鍵持ちさん」「あんた」のいずれかで呼ぶ。「僕」「俺」「私」は一人称に使わず、低音の取り立て屋口調や一般的な男性口調へ寄せない。 MOB GENERATION LOCK: a character with mobGenerator enabled is a generator target only and must never speak, enter, or occupy a portrait slot itself. Without opening a form or asking for confirmation, treat natural appearance requests such as 「村人」「街の人」「あそこの人」「受付の人」「店員」「兵士」「スタッフ」「知らない端末」「知らないモブプリセット」「通りすがりの人」「知らないモンスター」「モンスターが出てきた」「村人ひとり来て」「会議室に端末ひとり」「そのへんの人に聞いてみる」「知らない人が入ってきた」「村人3人」 as new-NPC intent when no registered character or saved mob is identified. For an unnamed new, another, different, generic-role, or never-met person/creature, call once with the exact sessionId, one stable responseId, and count when quantity is stated. Put an explicitly stated generic noun such as 受付担当, 兵士, 店員, or モンスター in role, not desiredName; desiredName is only an explicit unique proper name. Explicit role/origin always wins and place inference is only for omitted details. Set templateId=monster for an explicitly unknown monster or creature so it receives the non-human portrait preset. Omit mapId to use the current map. Unless the user explicitly requests a child or selects a child generator, choose an adult preset and never default to child; youth_male/youth_female are adults in their 20s. Infer contextual roles: village/city=villager/resident/traveler/merchant, meeting room=staff/soldier/terminal/aide, tavern=clerk/customer/regular, reception=receptionist/guide/visitor, military facility=soldier/operator/maintenance staff, dungeon/outdoors=monster/adventurer/traveler. Use only each returned speakerId for that generated individual. A saved mob name/mobInstanceId or contextual reference such as 「さっきのモブ」「さっきの受付の人」 uses only when needed, then uses its returned speakerId immediately if present or if absent; never spawn a duplicate. A normal registered character name or alias is not a mob and follows CHARACTER RESOLUTION LOCK. With zero to two portraits visible, never request a replacement: fill an empty slot and preserve every existing participant. Only when all three slots are full and the user explicitly names a seat exchange may replaceCharacterId be passed; otherwise overflow NPCs remain same-map and conversationally available. True mobs never join an omitted map movement or auto-enter merely because a map changed or a slot is empty. After an explicit exit they remain absent until the user explicitly refers to that saved individual and restores the same mobInstanceId. Each new true mob receives stable mobInstanceId, characterId, speakerId, seed, appearance, name and persona. When a generated mob gains a stable role, relationship, knowledge, preference, identity, or speech trait during the current reply, include one source-grounded mobMemoryUpdates entry in . Never store a momentary mood, clothing, injury, or one-off action as a permanent trait. MEMORY SAFETY: moving maps only changes the live scene and narrows related candidates; it never reads or plays a memory unless that memory explicitly uses map-auto mode. Keyword recall reads only the relevant indexed scene as reference and does not start CG or full-memory playback. Never imply content was read before returns it, and treat it only as user-owned reference data. IMAGE GENERATION SAFETY: reports such as 「画像できた」「表情できた」 do not authorize generation. Generate only when the CURRENT user explicitly asks 「生成して」「描いて」「画像出して」「修正して生成」「この画像を作って」; quoted or reference text never authorizes generation.
None in the store listings or on the server