# Welcome

Start here to create, customize, test, and share interactive AI characters with Convai, covering Playground, no-code experiences, plugins and integrations, and API reference.

## **Welcome to the Official Convai Documentation**

Your platform for building, customizing, and deploying intelligent, interactive AI characters across various environments and platforms.

Whether you’re a **developer**, **designer**, or **creator**, this documentation will guide you through every step from your first login to building fully immersive experiences with Convai’s powerful tools and integrations.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FduhSyeytuVBQ9zJHawuS%2FScreenshot%202025-08-11%20151646.png?alt=media&amp;token=c9605025-d6a3-43c5-b79d-322ac78b614d" alt=""><figcaption></figcaption></figure>

***

## What You’ll Find Here

Our documentation is divided into several sections so you can easily find what you need:

### 1. Convai Playground

Learn to create, customize, and test your AI characters directly in Convai Playground.

* [**Get Started**](/api-docs/convai-playground/get-started) – Basics of navigating the dashboard, creating your first character, and testing interactions.
* [**Character Customization**](/api-docs/convai-playground/character-customization) – Deep dive into the tools for defining your character’s appearance, voice, knowledge, traits, and more.

### 2. No Code Experiences

Create interactive AI experiences without writing a single line of code.

* [**Avatar Studio Experiences**](/api-docs/no-code-experiences/avatar-studio-experiences) – Create and customize your character’s visual identity, including appearance, clothing, accessories, environment, animations, lighting, camera angles, and more, all within an easy-to-use no-code editor.
* [**Convai Sim Experiences**](/api-docs/no-code-experiences/convai-sim-experiences) – Build interactive, large-scale simulation environments where your AI characters engage in realistic scenarios, navigate spaces, and interact with objects.
* [**Convai XR Animation Capture App**](/api-docs/no-code-experiences/convai-xr-animation-capture-app) – Capture high-fidelity motion data using your XR device and apply realistic animations to your avatars for more immersive, lifelike performances.

### 3. Plugins & Integrations

Extend your characters into your applications and games.

* [Unity](/api-docs/plugins-and-integrations/convai-unity-sdk), [Unreal Engine](/api-docs/plugins-and-integrations/convai-unreal-engine-plugin), and [Web Plugins](/api-docs/plugins-and-integrations/web-plugins).
* [Modding Frameworks](/api-docs/plugins-and-integrations/modding-framework) and [Other Integration](/api-docs/plugins-and-integrations/other-integrations) options.
* [Convai Pixel Streaming Embed](/api-docs/plugins-and-integrations/convai-pixel-streaming-embed) capabilities.

### 4. API Reference

In-depth [API documentation](/api-docs/api-reference/core-api-reference) for advanced customization and integration.

***

## Before You Begin

To start building with Convai, you only need:

* A **Convai account** – [Sign up here](https://www.convai.com/) if you don’t have one.

***

## Getting Help

* If you can’t find what you’re looking for, use the search bar at the top of the documentation to quickly locate relevant topics.
* For inspiration, check out the **Sample Characters** available in your [Dashboard](/api-docs/convai-playground/get-started/dashboard-overview#main-dashboard-view).
* If you need further assistance, visit the [**Convai Developer Forum**](https://forum.convai.com/) to connect with the community and get support from the Convai team.


# Get Started

A guided overview of the first steps in Convai Playground, including navigation, character creation, testing, and essential global controls.

## Introduction

## Welcome to Convai Playground!

Your workspace for creating, customizing, and testing AI-powered characters. This page gives you a high-level overview of the core tools and workflows, helping you get productive quickly. Each section below links to a dedicated page where you can dive deeper.

## Prerequisites

* A Convai account.

## Core Concepts

* **Character** – An AI persona you create and customize with unique personality traits, language, knowledge, and behavior settings.
* **Avatar Studio** – A no-code editor where you can design your character’s visual appearance and configure its **Avatar Studio Experience**, including environment, animations, interaction settings, and more.

## Quick Start Flow

* **Dashboard Overview**\
  Learn the layout, view your recent characters and experiences, and see where to create a new character or Convai Simulation Experience.\
  Continue to: [*Dashboard Overview*](/api-docs/convai-playground/get-started/dashboard-overview)
* **Creating a New Character**\
  Start building your AI character by naming it, defining its description, choosing a language and voice, and setting its personality.\
  Continue to: [*Creating a New Character*](/api-docs/convai-playground/get-started/creating-a-new-character)
* **Testing a Character**\
  Test your character in real time using the **Chatbox** for text and voice interactions, or via **Video Call** for a more immersive experience.\
  Continue to: [*Testing a Character*](/api-docs/convai-playground/get-started/testing-a-character)
* **Global Character Controls**\
  Learn about tools available across all character pages, such as Versioning, Update, and Character Settings.\
  Continue to: [*Global Character Controls*](/api-docs/convai-playground/get-started/global-character-controls)
* **Character Versioning**\
  Save and switch between different versions of your character for safe experimentation and iteration.\
  Continue to: [*Character Versioning*](/api-docs/convai-playground/get-started/character-versioning)


# Dashboard Overview

Learn how to navigate and use the Convai Playground Dashboard to manage characters, experiences, and simulations efficiently.

## Introduction

The Convai Dashboard is your central hub for managing AI-powered characters and immersive experiences. From here, you can create characters, launch experiences, and access sample characters built by the Convai team.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FJL8uV5r5Ugk0gMyxcNMG%2FScreenshot%202026-05-08%20134911.png?alt=media&amp;token=ac041002-a794-4c63-9c7a-d42cf6283d31" alt=""><figcaption></figcaption></figure>

***

## Navigating the Dashboard

### Main Dashboard View

When you log in, you land on the **Dashboard** with a welcome header: *"Create, manage, and deploy AI characters for your spatial experiences."*

The page is organized into three sections:

* **Recent Characters** – Your most recently updated characters, shown as cards with the character name, a short description, and a scene video indicator. A **See All** link opens the full characters list.
* **Recent Experiences** – Your most recently launched experiences, each tagged with a publish status badge: **Draft**, **Public**, or **Unlisted**. A **See All** link opens the full experiences list.
* **Sample Characters** – Pre-built characters from the Convai team for quick testing and inspiration, covering use cases such as retail, healthcare, hospitality, and gaming.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FcaWEiIqnSir9Ufggcu54%2FScreenshot%202026-05-08%20135010.png?alt=media&amp;token=05505567-8ef6-49b2-b31d-0ab347627ce4" alt=""><figcaption></figcaption></figure>

***

### Creating New Content

In the **top-right corner**, you’ll find:

Two primary action buttons sit at the top of the Dashboard content area:

* **Create Character** (primary button) – Opens the character creation flow.
* **Start New Experience** (secondary button) – Opens the experience setup flow.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2F7rLVjmloObMy5X3ovZUW%2FScreenshot%202026-05-08%20135026.png?alt=media&amp;token=2f3f7a60-e2b6-41f2-88db-6b8c0c3b0cdc" alt=""><figcaption></figcaption></figure>

***

### Sidebar Navigation

The left sidebar provides access to all core sections:

| Item                 | Description                               |
| -------------------- | ----------------------------------------- |
| **Dashboard**        | Returns to the main Dashboard view        |
| **My Characters**    | Browse and manage all your characters     |
| **My Experiences**   | Access, edit, and manage your experiences |
| **Project Settings** | Configure project-level settings          |

At the bottom of the sidebar:

* **Legacy Playground** – Access the previous Convai Playground interface.
* **Beta Feedback** – Submit feedback directly to the Convai team.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fgit-blob-cd50d550eee6fdbe44a3b13fa99a1a396991c1e0%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

***

### Profile and Settings

Click your **profile avatar** in the top-right corner to open the account dropdown:

| Option        | Description                                |
| ------------- | ------------------------------------------ |
| **Account**   | Manage your account details                |
| **Pricing**   | View your current plan and billing options |
| **Theme**     | Toggle between light and dark mode         |
| **Follow Us** | Links to Convai's social channels          |
| **Logout**    | Sign out of your account                   |

Your current plan (e.g., **Professional**) is displayed at the top of the dropdown alongside your name and email.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2F67nRv13T9Vm3knWa5Ycy%2FScreenshot%202026-05-08%20135123.png?alt=media&amp;token=b395ebba-637b-48e1-bcdb-d5a9f321f12c" alt=""><figcaption></figcaption></figure>

***

### API Key Access

Click the **shield icon** to the left of your profile avatar to open the **API Key** modal.

The modal displays:

* **Your API Key** – Hidden by default. Use the eye icon to reveal it or the copy icon to copy it to your clipboard.
* **API Base URL** – `https://api.convai.com`
* **View Docs** – A direct link to the [API integration documentation](https://docs.convai.com/).

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FgHGVrw3JzFACkGn8QWbZ%2FScreenshot%202026-05-08%20135150.png?alt=media&amp;token=9b6c4cb0-b0ee-4d82-8308-622321410673" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**Keep your API key secure.** Never share it publicly or commit it to version control. Use environment variables for storage.
{% endhint %}

***

## Conclusion

The Convai Dashboard gives you fast access to everything needed to build and manage AI characters and interactive experiences. The sidebar handles navigation, the top content area handles creation, and the profile menu handles account and API settings.


# Creating a New Character

Learn how to create and customize a new AI character in Convai Playground, including description, avatar, voice, and language settings.

Create a character in the Convai Playground, then configure its description, avatar, voice, and languages before testing it.

## Step-by-Step Guide

### 1. Access the Creation Tool

* From your **Dashboard**, click **Create a new character** in the top-right corner.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2F7rLVjmloObMy5X3ovZUW%2FScreenshot%202026-05-08%20135026.png?alt=media&amp;token=2f3f7a60-e2b6-41f2-88db-6b8c0c3b0cdc" alt="Convai Playground dashboard with the Create a new character control"><figcaption></figcaption></figure>

* A new character creation interface will open.
* In the left menu, only **Character Description**, **Avatar**, and **Language and Speech** are active initially. Other sections will unlock after the character is created.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fgit-blob-a577cee5c8713f3145c17b463f63610fb9025065%2Fimage.png?alt=media" alt="New character editor with the initial configuration sections available"><figcaption></figcaption></figure>

***

### 2. Character Description

* **Character’s Name** – Enter the name for your character (you can edit this later).
* **Core Description** – Write a short background covering the character’s story, personality details, and distinctive features.
  * Alternatively, click the **Wand Icon** to **Generate Character Backstory with AI**.
* **Speaking Style** *(optional)* – Define the way your character speaks, including tone and mannerisms. Also, feel free to suggest some **Sample Dialogues** here for your AI character.
* **Visibility Settings** – Choose who can interact with your character:
  * **Public** – Available to anyone on `x.convai.com`.
  * **Unlisted** *(default)* – Only accessible via a direct link.
  * **Private** – Restricted to you and invited users.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fgit-blob-befd8fe7898605313edc4c1693e271bf807eeee6%2Fimage.png?alt=media" alt="Character Description fields in the new character editor"><figcaption></figcaption></figure>

***

### 3. Avatar Customization

* Click the **Avatar** tab in the left menu.
* Select **Configure Avatar** to customize your character’s visual appearance.
* Follow the steps in the [**Avatar Studio Documentation**](/api-docs/no-code-experiences/avatar-studio-experiences) to learn how to adjust facial features, clothing, and other design elements.
* Click **Save Changes** when done.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fgit-blob-a18ec5d7882d0d477b660a3730ead25d1aab2813%2Fimage.png?alt=media" alt="Avatar configuration section for a new character"><figcaption></figcaption></figure>

***

### 4. Voice and Language Settings

* Click the **Voice And Languages** tab.
* In **Language**, select one or more languages your character can speak.
* In **Voice**, choose from the filtered voice options for your selected languages

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fgit-blob-76535ab6aaf6f1253df20380abfa77f884cb56ac%2Fimage.png?alt=media" alt="Voice and language settings for a new character"><figcaption></figcaption></figure>

***

### 5. Finalizing Character Creation

* Once all desired settings are configured, click **Create Character** at the top right.
* If you skip customization, a **random avatar** and **voice** will be assigned automatically.
* If you don't choose any language, **English** will be selected by default.
* You can update any attribute later, so there’s no need to finalize all decisions immediately.

***

## After Creation

When the character is created, all the sections in the left menu become available for deeper customization:

* Character Description (with **Speaking Style** and **Personality Traits**)
* Avatar
* Language and Speech
* Knowledge Bank
* Core AI Settings
* Guardrails
* State of Mind
* [Agentic Actions](/api-docs/convai-playground/character-customization/agentic-actions)
* Narrative Design (*Coming Soon to the new Playground. Available on* [*Legacy Playground*](https://playground.convai.com/pipeline/dashboard))
* External API (*Coming Soon to the new Playground. Available on* [*Legacy Playground*](https://playground.convai.com/pipeline/dashboard))
* Publish
* Memory
* Mindview

Each of these features allows you to enhance and refine your character for more natural, intelligent, and engaging interactions. These are covered in separate documentation.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FtOudgL8koqwWjHxVZHg1%2Fimage.png?alt=media&amp;token=57f70e0e-06f3-4920-88cc-6c47c702fe3d" alt="Character editor navigation after the character has been created"><figcaption></figcaption></figure>

***

## Continue configuring the character

The character creation process in Convai Playground is designed for flexibility — you can launch a character in minutes or spend time refining every detail. Whether you start with default settings or fully customize the avatar, voice, and description.


# Testing a Character

Learn the different ways to test your AI character in Convai Playground, including text chat, voice input, and video call with an avatar.

## Introduction

Once you have created a character, it's important to test how it interacts. Convai provides multiple ways to test your characters — from quick text and voice interactions to fully immersive video calls with custom avatars. This ensures you can refine personality, responsiveness, and interaction style before final deployment.

***

## Testing Options

### Text and Voice Chat

To test your character via text or voice, open the character's chat interface:

* From your **Dashboard**, click on the character card you want to test.
* The chat interface opens as a full conversation view, with your messages on the right (green) and the character's responses on the left (white).
* Type a message in the **"Type a message..."** input at the bottom and press enter to send.
* Or click the **microphone button** on the right side of the input bar, speak, and send your voice input.

Each message shows a timestamp. A small **eye icon** appears below each message — click it to open **Mindview** for that specific exchange.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2F0cRi5g0XRFNaBDfmuEwv%2Fimage.png?alt=media&amp;token=10f178b0-bf51-4cdd-b93c-34846cf7ff4a" alt=""><figcaption></figcaption></figure>

***

#### Mindview for Playground Chat

**Mindview** lets you inspect how the character processed a specific message. Click the **eye icon** below any message to open it.

Mindview displays:

* **User Query** and **Response** at the top — the exact exchange being inspected.
* **Model and Character ID** — the LLM and character version used for that response.
* **Structured / Raw toggle** — switch between a readable structured view and the raw prompt output.
* **Static Prompt** — the fixed parts of the character's prompt, broken into:
  * **Core Description** – the character's base personality and instructions.
  * **Languages** – the languages the character is configured to respond in.
  * **Output Format** – the response style instruction given to the model.
* **Dynamic Prompt** — the context injected at runtime for that specific exchange, including **Context Setting** and other dynamic elements.

Mindview is useful for debugging unexpected responses, verifying that your character description and knowledge bank are being applied correctly, and understanding exactly what the model receives for any given turn. Read the detailed [Mindview Docs](https://docs.convai.com/api-docs/convai-playground/character-customization/mindview) to learn more.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FUxQiobL5hcQ27y9pCbwo%2FScreenshot%202026-05-08%20144842.png?alt=media&amp;token=e819db06-649c-40d2-9aaa-0e8b7aaa6e6e" alt=""><figcaption></figcaption></figure>

***

#### Chat Interface Controls

**Left sidebar icons (top-left of the chat):**

| Icon             | Function                                               |
| ---------------- | ------------------------------------------------------ |
| **Audio toggle** | Mute or unmute the character's voice output            |
| **Copy**         | Copy the conversation text                             |
| **Reset**        | Restart the session and clear the conversation history |

**Top-right icons:**

| Icon       | Function                              |
| ---------- | ------------------------------------- |
| **Camera** | Start a video call with the character |
| **Share**  | Share the character                   |

***

#### Quick Replies

After each character response, a **Quick replies** section appears below the message with contextually generated reply suggestions. Click any chip to send that reply instantly without typing.

Quick replies are dynamically generated based on the ongoing conversation, so they update with each new character response.

***

### **2. Video Call**

You can test your character in a **video call** for both visual and voice interaction.

**From the Dashboard:**

* Locate the character's card.
* Click the **green camera icon** on the card to start a video call instantly.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FEKmWn5Y26IEXLFNdWWyX%2Fimage.png?alt=media&amp;token=66cd9d52-9db3-4f3a-9838-cbd71ca497a9" alt=""><figcaption></figcaption></figure>

**From the Character Page:**

* Click the character’s card to open its details.
* In the top-right section, under the character’s thumbnail, click the **video call button**.

The video call gives you a real-time view of the character's visual appearance and voice together, offering a more immersive test environment.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FD5wNbopHTZUxhaSZM1p3%2Fimage.png?alt=media&amp;token=4d187145-0d5f-471b-bd14-642df3c97f75" alt=""><figcaption></figcaption></figure>

This method allows you to experience both the character’s **visual appearance** and **voice** in real-time, offering a more immersive test environment.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FbgZgTqZLO3PEA7nDEc1m%2Fimage.png?alt=media&amp;token=acf10848-8e43-490e-8fa8-8fd7c392e773" alt=""><figcaption></figcaption></figure>

***

## Conclusion

Convai's testing options make it easy to evaluate and refine your characters. Whether you prefer a fast text-based interaction with quick reply suggestions, a voice conversation, or a full video call with your custom avatar, you can ensure your AI character behaves as intended before deployment. Use Mindview on any message to inspect the underlying prompt and debug character behavior at any point in the conversation.


# Global Character Controls

Use the shared character toolbar to manage versions, save changes, clone or share a character, and review destructive settings before deletion.

Use the shared controls at the top right of each character page in the Convai Playground. The toolbar appears on Character Description, Avatar, Language and Speech, Knowledge Bank, Personality Traits, Core AI Settings, State of Mind, Agentic Actions, Narrative Design, External API, Publish, and Memory.

***

## Where to find these controls

Look at the top right of any character screen. You will see:

* **Versioning** icon
* **Update** button
* **Character Settings** menu (three dots)

These controls behave the same way on every page.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FtXYxafaVN6HRIqGq9w5f%2Fimage.png?alt=media&amp;token=25f0f04e-a826-4566-af28-7f9eea8bd786" alt="Shared character toolbar with versioning, update, and settings controls"><figcaption></figcaption></figure>

***

## Controls overview

### 1. Character Versioning

Use Versioning to save and switch between alternative definitions of your character.

* **What it does**
  * Saves a named snapshot of your character definition so you can test new ideas without losing a preferred setup.
  * Lets you switch to any saved version and continue editing from there.
* **Typical uses**
  * Keep a stable production version while experimenting with a new Core Description or personality.
  * Prepare variations for different audiences or channels.
* **Good practice**
  * Give versions clear names and short notes such as “v1.2 retail tone” or “v2.0 multi language test”.
  * Save a version before major edits or before handing the character to a teammate.

For more information, refer to the [Character Versioning](/api-docs/convai-playground/get-started/character-versioning) documentation.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FhOiHEDFmsKkk3yTqe0fQ%2Fimage.png?alt=media&amp;token=8c8d5128-4b82-46c7-b027-eabf52395ab2" alt="Character versioning panel opened from the shared toolbar"><figcaption></figcaption></figure>

### 2. Update button

Apply your unsaved changes to the character.

* **States**

  * **Green**: there are unsaved edits. Click **Update** to save.

  <figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FSnaTabS5Ttrz6B1wHS0B%2FScreenshot%202025-08-10%20142530.png?alt=media&amp;token=9969a6cb-448b-4e14-9bd6-f428ac18195c" alt="Enabled Update button indicating unsaved character changes"><figcaption></figcaption></figure>

  * **Gray**: everything is already saved.

  <figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FOUaJkBcxk22QF2NAu2Qp%2Fimage.png?alt=media&amp;token=cfb0d2fe-ce09-4717-a53c-1eb6e56bf11c" alt="Disabled Update button indicating that character changes are saved"><figcaption></figcaption></figure>
* **Important**
  * If you refresh or navigate away while the button is green, your unsaved changes will be lost.
  * Click **Update** after edits on any tab, then proceed to testing.

### 3. Character Settings Menu

Open the three dots menu to access actions that affect the entire character.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2F7F4oOLegHdqzoDguBa62%2Fimage.png?alt=media&amp;token=c848f07c-276c-4420-ac8e-4bf377536dda" alt="Character Settings menu with clone, share, and delete actions"><figcaption></figcaption></figure>

**Clone Character**

Create a duplicate so you can branch work safely.

* **What is copied**: all character configuration tabs (e.g., Description, Personality, Languages, etc.) are copied, except the Memory tab.
* **What changes**: the clone receives a new Character ID.
* **When to use**: large experiments, staging vs production split, A or B variants.

**Share Character**

Let others **test** your character.

* **What it does:** Generates a share link so recipients can interact with the character (e.g., Chatbox or video call) without being able to modify it.
* **How it works:** Open the dialog to copy a share link, respecting your current visibility setting (Public, Unlisted, or Private).

**Delete Character**

Remove the character from your characters.

{% hint style="warning" %}
Deletion is permanent and cannot be undone.
{% endhint %}

* **Checklist before deletion**
  * Confirm the character is not used in any live experience.
  * Export or copy any content you may need.
  * Consider cloning for archival instead of deleting.


# Character Versioning

Manage multiple versions of character and switch between them as required.

## Introduction

In this section, we look into Character Versioning, i.e., maintaining different states of the character. This enables the user to preserve a previous stable state before trying out more changes. You can now experiment without the fear of losing an older state of the character, and in case you want discard the current changes and return to a previous version, you now have the ability to restore the version and continue working from there. We conveniently call these saved states as **Snapshots** of the character.

We will go over the features and how to use them in this section.

{% hint style="info" %}
The idea of **Snapshot** and **Version** has been used interchangeably in the text; however, they refer to the same idea: The state / contents that define the character at a specific point in time.
{% endhint %}

***

## Overview

The character versioning option is available at the top right-hand side in the character editor section beside the **Update** button

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fl2rY9dv4kT54lCOi7hob%2Fcv-1.png?alt=media&amp;token=38fd70af-e4c3-4e2b-af1d-03e867d4f984" alt=""><figcaption></figcaption></figure>

Once you click on it, you get to see the list of all your previous saved revisions ordered by date.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FxmskYVPB5I7mmzBbJbFS%2F2.png?alt=media" alt=""><figcaption><p>Character Versioning section. There is no snapshot here yet.</p></figcaption></figure>

We will go over the steps of creating and maintaining snapshots from scratch in the next section

***

## Create a Version

Let us start with a character that we already have saved. The data that we see when we open the details related to a character denotes the **Current Snapshot** of the character. When you interact with the character, you are essentially referring to all the date in this **Current Snapshot** of the character.

1. To create a new version, first open the **Character Versioning** section and click on the **+ Add Snapshot** sign at the top.<br>

   <figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FO87OyqDP1i9rf19iL3fZ%2Fcv-3.png?alt=media&amp;token=375c0149-695d-4336-9f93-d590d85db20d" alt=""><figcaption><p>Let's create our very first snapshot.</p></figcaption></figure>
2. A pop-up appears asking you to give your snapshot a name and some description. Please note that a **Snapshot Name** is a required field to create a new version. Once you have filled the details, click on the **Submit** button.<br>

   <figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2F27CIDJfBUMezGcpfq1av%2Fcv-4.png?alt=media&amp;token=1258c8a2-d2ab-4594-b50b-9401ff18e3fd" alt=""><figcaption><p>We provide a name and a small description.</p></figcaption></figure>
3. Now, you can see the new version in the list of snapshots. Now what does this version actually represent?\
   This snapshot stores all the data related to the character at that point of time. Everything about the character ranging from character description, embodiment to knowledge bank files, narrative-design structure and other details.<br>

   <figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fa6jlIoKtz12aF63UtakB%2Fcv-5.png?alt=media&amp;token=7abd0b8e-754c-40e7-ba8d-69b2336dae15" alt=""><figcaption><p>The snapshot appears in the list</p></figcaption></figure>

***

## Restoring a Version

Assuming you have gone ahead and worked on the character further, but you are unhappy with the results and want to go back and start from the previous version. This is where you have the ability to restore an old snapshot to the current state and work with them again. Here are the steps to follow:

1. To restore a version, open the **Character Versioning** section and select the snapshot you want to restore back. You will see the **Restore Version** button below come to life.<br>

   <figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FRb8XT0vbcTa5rhQDto09%2Fcv-6.png?alt=media&amp;token=b06cf47b-110e-4fab-b87b-de1a7ee5173e" alt=""><figcaption><p>We will be restoring the data from the very first snapshot.</p></figcaption></figure>
2. Once you click on the **Restore Version** button, a pop-up appears asking you if you want to save the current changes as a new snapshot or discard them. You have the option to store your current changes as some test version and refer back later on.<br>

   <figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FvR0Zd5Wm6HPTpTGGL6bC%2Fcv-7.png?alt=media&amp;token=1bb36dd2-daa8-44b5-af6d-11d80a1bede0" alt=""><figcaption><p>Let's directly restore the data in the snapshot to the Current Snapshot</p></figcaption></figure>
3. For now, we are happy to discard the changes, so we will click on **Restore** button. This brings the data from the selected version to the **Current Snapshot** of the character.
4. To save the changes, you can always **Cancel** and go back to creating a new snapshot with your progress and the restoring it.

***

## Delete a Snapshot

You can also go ahead and delete a snapshot that you no longer require. To that you can click on the 3-dots by the corresponding snapshot in the list of Character Version and select **Delete Version**

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fum3kJwDnlCD5I5oXEcRH%2F8.png?alt=media" alt=""><figcaption><p>Click on the 3-dots beside the snapshot to see all the options.</p></figcaption></figure>

### Some important points to remember

At any given point you can interact with the **Current Snapshot** of the character. If you have any publicly available app that utilises the character, your users will only be able to interact with this current version.

{% hint style="info" %}
We are currently working on a feature to help developers have separate deployed version than the **Current Snapshot**.
{% endhint %}


# Interact in Voice Mode

Enable real-time, low-latency voice conversations with your Convai character using Voice Mode for natural, hands-free interactions.

## Introduction

**Voice Mode** allows you to have seamless, natural, and low-friction voice conversations with your character. This guide explains how to set up Voice Mode and maintain stable, real-time sessions for a smooth conversational experience.

## Step-by-Step Guide

### 1. Open Your Character

* From your **Dashboard**, open the character you want to use with Voice Mode.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FxbLohOUcwm1Kl2tDPBeL%2Fimage.png?alt=media&amp;token=73c0e4cf-426e-48b6-ba3b-597f205b8c65" alt=""><figcaption></figcaption></figure>

### 2. Configure Voice Settings

* Navigate to **Language and Speech** and select a voice for your character.
* Once configured, click **Update** to save your changes.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fr2PmYdbi0exwV9UsmtPs%2Fimage.png?alt=media&amp;token=4d05284c-cc83-4685-a795-30c10a51ed07" alt=""><figcaption></figcaption></figure>

### 3. Using Voice Mode

Click the microphone button to enter **Voice Mode** and start talking to your character hands-free in real time.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Feyf5cCZolH36kToHEesz%2Fimage.png?alt=media&amp;token=13568b38-2470-4a2d-8438-cd0c69e91bc2" alt="" width="375"><figcaption></figcaption></figure>

* When you exit Voice Mode, the **conversation transcript** will appear in the chat area for review.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FtfrAEXoKjmx0jR3dFamr%2Fimage.png?alt=media&amp;token=55a2e49e-e14f-4f63-a2c5-0978262c5824" alt="" width="375"><figcaption></figcaption></figure>

{% hint style="warning" %}
If you remain idle for more than **5 minutes**, the voice session automatically disconnects. Simply reconnect to resume your conversation.
{% endhint %}


# Character Customization

Learn how to refine your AI character’s personality, appearance, knowledge, and behavior to create consistent and engaging interactions.

## Introduction

The **Character Customization** section in Convai Playground is where you transform a basic AI character into a fully realized persona. Here, you’ll define how your character looks, speaks, thinks, remembers, and responds, ensuring a unique and immersive experience for your users. Each page in this section focuses on a specific customization area, allowing you to work step-by-step or revisit any aspect at any time.

***

## Core Customization Areas

1. **Character Description**\
   Define your character’s backstory, personality, and speaking style — the foundation of its identity.\
   Continue to: [*Character Description*](/api-docs/convai-playground/character-customization/character-description)
2. **Avatar Section**\
   Open **Avatar Studio** to design your character’s visual appearance and configure its **Avatar Studio Experience**, including environment, animations, outfits, lighting, camera angles, and more.\
   Continue to: [*Avatar Section*](/api-docs/convai-playground/character-customization/avatar-section)
3. **Language And Speech**\
   Configure the language, voice, and tone your character uses for communication.\
   Continue to: [*Language And Speech*](/api-docs/convai-playground/character-customization/language-and-speech)
4. **Knowledge Bank**\
   Provide your character with information and reference materials to answer questions and maintain context.\
   Continue to: [*Knowledge Bank*](/api-docs/convai-playground/character-customization/knowledge-bank)
5. **Personality Traits**\
   Adjust behavioral sliders to shape your character’s mannerisms, confidence, empathy, and other interaction styles.\
   Continue to: [*Personality Traits*](/api-docs/convai-playground/character-customization/knowledge-bank)
6. **Core AI Settings**\
   Fine-tune advanced AI parameters to influence decision-making, creativity, and responsiveness.\
   Continue to: [*Core AI Settings*](/api-docs/convai-playground/character-customization/core-ai-settings)
7. **Guardrails**\
   Restrict and guide a character's AI behavior, define the ethical and topical boundaries of the conversation.\
   Continue to: [*Guardrails*](/api-docs/convai-playground/character-customization/guardrails)
8. **State of Mind**\
   Define temporary or situational mindsets that influence how your character reacts in specific contexts.\
   Continue to: [*State of Mind*](/api-docs/convai-playground/character-customization/state-of-mind)
9. **Memory**\
   Review your character’s past conversations or enable Long Term Memory to allow recall across sessions.\
   Continue to: [*Memory*](/api-docs/convai-playground/character-customization/memory)
10. **Narrative Design**\
    Create structured narratives or guided interaction flows for your character to follow.\
    Continue to: [*Narrative Design*](/api-docs/convai-playground/character-customization/narrative-design)
11. **External API**\
    Connect your character to external systems or APIs to retrieve live data or perform actions.\
    Continue to: [*External API*](/api-docs/convai-playground/character-customization/external-api) · [*Limitations*](/api-docs/convai-playground/character-customization/external-api/external-api-limitations)
12. **Publish**\
    Share your character with others or embed it into your website.\
    Continue to: [*Publish*](/api-docs/convai-playground/character-customization/publish)

***

## Best Practices

* Start with core identity settings (Character Description, Language and Speech) before moving to advanced customization.
* Use **Update** frequently to save progress and avoid losing changes.
* Test your character regularly to ensure each customization change has the desired effect.

***

## Next Step

Begin with **Character Description** to establish the personality and tone of your AI character before moving on to appearance, speech, and advanced behaviors.


# Character Description

Learn how to use the Character Description page in Convai Playground to define your character’s identity, speaking style, and unique traits.

## Introduction

The **Character Description** page is where you define the personality, backstory, and communication style of your AI character. Each character in Convai Playground has its own dedicated Character Description page, ensuring a unique identity that can be refined over time.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FKH9Wr554c28l0dMfMxaW%2FScreenshot%202025-08-10%20150107.png?alt=media&amp;token=93ab48ae-b2f3-4d94-a0e4-2874bd630f2f" alt=""><figcaption></figcaption></figure>

***

## Accessing the Character Description Page

You can reach the Character Description page by clicking any **Character Card** on your **Dashboard**. This opens the character’s profile, where you can edit and manage its core attributes.

## Main Features and Sections

### 1. Character Name and ID

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fy31XbmcW1CjDg3fW63q2%2FScreenshot%202025-08-10%20150421.png?alt=media&amp;token=e759c7ba-b0dd-4ca6-9fef-8674c5ceb05b" alt=""><figcaption></figcaption></figure>

* **Character’s Name** – Editable field for your character’s display name.
* **Character’s ID** – A unique identifier for the character, essential for using it in **Convai SDKs** and API integrations.
* You can copy the ID to use in your applications.

{% hint style="success" %}
**Support Tip**: If you need help from the support team, provide this ID when reporting character-related issues.
{% endhint %}

***

### 2. Core Description / Speaking Style / Embodiment

**Core Description**

* Add details about your character’s story, personality traits, distinctive features, and any behavioral guidelines.
* Word limit: **1000 words**.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fn75dEWhLuegjDyFlF2st%2Fimage.png?alt=media&amp;token=c4004f20-5ab7-4aef-af1f-779f668ed2a8" alt=""><figcaption></figcaption></figure>

**Speaking Style**

* **Describe How the Character Speaks** – Outline the character’s tone, pace, formality, and speech patterns. Include unique expressions or phrases they commonly use.
* **Sample Dialogues** – Provide example sentences showcasing the character’s typical speech style, including signature phrases that reinforce their personality.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FTc36yuhMOFa4nAlRd748%2FScreenshot%202025-08-10%20150129.png?alt=media&amp;token=23b0ab07-cf9e-4051-82e2-0ece49b97b06" alt=""><figcaption></figcaption></figure>

**Embodiment**

* Currently in development and will be available soon.

***

## Examples

For inspiration, explore **Sample Characters** in the Dashboard. These examples show how different characters’ Core Descriptions and Speaking Styles are structured.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FMRb27L3gulM4N3R774j1%2Fimage.png?alt=media&amp;token=cb8dd01d-5a24-4208-91dd-b0889d06c8e4" alt=""><figcaption></figcaption></figure>

***

## Conclusion

The Character Description page is the foundation of your AI character’s identity. By clearly defining its personality, voice, and unique traits, you ensure consistent and engaging interactions.


# Avatar Studio

Learn how to access and customize your character’s avatar in Convai Playground using Avatar Studio.

## Introduction

The **Avatar** section, lets you design and customize both the visual appearance of your AI character and its dedicated Avatar Studio Experience. All customization is handled through **Avatar Studio**—a powerful no-code tool where you can adjust the character’s look, clothing, and animations, as well as personalize the interactive environment it appears in.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FEYGApiUethwbR0OXukvm%2Fimage.png?alt=media&amp;token=178b8284-882c-43c8-a511-dbceb835f9c9" alt=""><figcaption></figcaption></figure>

***

### Accessing Avatar Studio from Convai Playground

* Open any character in Convai Playground.
* In the left-hand menu, click the **Avatar** section.
* This will launch **Avatar Studio**, where you can customize your character’s appearance and configure its **Avatar Studio Experience**, including the environment, animations, outfits, lighting, camera angles, and more.

***

## Next Step: Customize in Avatar Studio

For a complete guide to using Avatar Studio and its features, see our dedicated documentation:

[Read the Avatar Studio Documentation](https://docs.convai.com/api-docs/no-code-experiences/avatar-studio-experiences)

***

## Conclusion

The Avatar section serves as a quick link to Avatar Studio, where you can customize both your character’s appearance and its Avatar Studio Experience. Whether you’re creating realistic personas or stylized avatars, Avatar Studio provides tools to fine-tune the environment, animations, outfits, lighting, camera angles, and more—ensuring your character’s visual presence matches its personality and role.


# Language And Speech

Learn how to configure languages, voices, custom pronunciations, and word recognition for your AI character in Convai Playground.

The **Language and Speech** section allows you to define the spoken languages, select a voice, and improve pronunciation and recognition for your AI character. With support for multiple languages and voice providers, you can ensure that your character communicates naturally and effectively with your audience.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2F7D7zDWhAub6TWtChEhUq%2Fimage.png?alt=media&amp;token=a1cd3cdf-34bb-434b-9a49-c250862f5386" alt=""><figcaption></figcaption></figure>

***

## Main Features

### 1. Set Language

* Choose the languages your character can speak and understand.
* Supports **multilingual** select between **1 and 4 languages**.
* Default language: **English**.
* Over **65+ languages** are available.
* Selecting a language will filter the available voices in the **Voice** section.
* The languages you select also determine which speech recognition provider transcribes your users. See [Speech recognition language support](/api-docs/convai-playground/character-customization/speech-recognition-language-support).

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2F6898jZC9g1XZbUfQBlpc%2Fimage.png?alt=media&amp;token=c8725647-5fa4-43b1-8957-170148a81528" alt=""><figcaption></figcaption></figure>

***

### 2. Voice Selection

* The **Voice** field provides access to over **1,200** voices in total. When you select a language, the available voices are filtered accordingly, so the number of voices varies by language.
* Supported **voice providers**:
  * Google Cloud Platform (GCP)
  * Microsoft Azure
  * OpenAI
  * ElevenLabs
* **Custom Voices** can be added through ElevenLabs.
  * See: [**ElevenLabs Voice Integration Documentation**](https://docs.convai.com/api-docs/plugins-and-integrations/other-integrations/third-party-api-integrations/elevenlabs-api-integration) for setup details.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FcCVWoAOBsb3BqDvQqFyt%2Fimage.png?alt=media&amp;token=0946dc38-78e2-4846-a1ac-5bd641dddf04" alt=""><figcaption></figcaption></figure>

***

### 3. Add Custom Pronunciation

Custom pronunciations help your character pronounce specific words correctly, especially unusual or brand-specific terms.

* To add:
  * **Spelled As** – The word as it appears in text.
  * **Pronounced As** – How it should sound, written phonetically in plain English.
* Example:
  * **Spelled As:** convai
  * **Pronounced As:** convey
* **Case-sensitive:** Uppercase and lowercase entries can have different pronunciations.

{% hint style="danger" %}
Currently **only supports English**.
{% endhint %}

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FVBV6auyuM4DCSAdg5FRR%2Fimage.png?alt=media&amp;token=207b04db-84e1-4501-91f4-0d7e22be8319" alt=""><figcaption></figcaption></figure>

***

### 4. New Word Recognition

New Word Recognition improves your character’s ability to understand unique or challenging words in speech input.

* To add:
  * **Spelled As** – The correct spelling of the word.
  * **Pronounced As** – The phonetic pronunciation using simple syllables.
* Example:
  * **Spelled As:** Ankur
  * **Pronounced As:** Ahnkur

{% hint style="danger" %}
Currently **only supports English**.
{% endhint %}

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FUaJ6fa2b2ZEMMTO50smy%2Fimage.png?alt=media&amp;token=674ac321-4f3e-4c9e-89b2-9be06ff42b7e" alt=""><figcaption></figcaption></figure>

***

## Conclusion

The Language and Speech settings provide complete control over how your character communicates, from language selection and voice choice to fine-tuning pronunciation and recognition. These tools help ensure your AI character delivers clear, accurate, and engaging interactions for users.


# Speech recognition language support

Reference for how Convai picks a speech recognition provider from your character's languages, including per-provider coverage and multi-language behavior.

Convai transcribes player speech with one of four speech recognition providers. You do not choose the provider directly: it is derived from the languages you set under **Core AI Settings**. This page lists what each provider covers, the order they are tried in, and what changes when a character has more than one language.

### How Convai picks a provider

Convai tries providers in a fixed order and stops at the first one that supports every language on the character. The order puts the lowest-latency provider first and uses coverage as the tie-breaker, so a character usually gets the fastest provider that can handle its languages.

| Languages on the character | Order tried                                      |
| -------------------------- | ------------------------------------------------ |
| Exactly one                | Soniox, Deepgram Nova-3, Deepgram Nova-2, Google |
| Two or more                | Soniox, Google                                   |

A provider that does not support one of the selected languages is skipped automatically, and the next one in that row is tried. If Soniox is unavailable, a single-language character falls through to Deepgram Nova-3, and a character with two or more languages falls through to Google, because Deepgram is not a candidate in that row at all.

Because the selected languages are the only input to this decision, the languages you pick are what determine transcription quality. A character left on the default English while its users speak another language is transcribed as English.

The language list and the **Only reply in the selected languages** setting sit together under **Core AI Settings**. That setting controls the character's replies; it does not change which provider transcribes its users, and the two are configured from the same list.

### Language coverage by provider

Counts are of distinct base languages, with regional variants counted separately in the second column.

| Provider        | Base languages | Regional variants |
| --------------- | -------------- | ----------------- |
| Google          | 75             | 136 locale codes  |
| Soniox          | 60             | base codes only   |
| Deepgram Nova-3 | 50             | 107 locale codes  |
| Deepgram Nova-2 | 33             | 70 locale codes   |

Across all four providers, 78 distinct base languages are supported, and 33 of them are supported by every provider.

### Languages Soniox does not cover

Soniox is tried first, but it cannot serve the following 19 base languages. For every one of them Google is the only provider with support, so a character in one of these languages is served by Google.

| Language  | Code  | Language  | Code |
| --------- | ----- | --------- | ---- |
| Amharic   | `am`  | Mongolian | `mn` |
| Armenian  | `hy`  | Nepali    | `ne` |
| Burmese   | `my`  | Pashto    | `ps` |
| Cantonese | `yue` | Sinhala   | `si` |
| Filipino  | `fil` | Sundanese | `su` |
| Georgian  | `ka`  | Uzbek     | `uz` |
| Icelandic | `is`  | Zulu      | `zu` |
| Javanese  | `jv`  | Punjabi   | `pa` |
| Khmer     | `km`  |           |      |
| Lao       | `lo`  |           |      |
| Maltese   | `mt`  |           |      |

### Selecting more than one language

A character can have up to four languages, as the language field itself states. Adding a second language changes behavior in two ways.

The candidate list shortens to Soniox and Google, so Deepgram is no longer used.

Soniox also changes how it treats the selection, but the rule is about distinct languages rather than how many entries you picked. Regional variants of one language collapse together: selecting both Spanish (Spain) and Spanish (Mexico) is still a single language to Soniox, so recognition stays constrained to Spanish. Recognition is only treated as hints once the selection covers two genuinely different languages.

{% hint style="warning" %}
Once two different languages are selected, speech recognition can return a language you did not select. Select only the languages your character genuinely needs.
{% endhint %}

Google supports the widest set of languages in this mode, covering all 75 of its base languages when several are selected.

### When no provider supports the selection

If no available provider supports every selected language, the character does not fall back to a provider that cannot understand its users. The session fails to start instead, because a session that connects with unusable voice input is harder to diagnose than one that does not connect.

{% hint style="info" %}
The set of languages you can select comes from your account and can include private languages. Use the Language List API to retrieve the exact list available to you.
{% endhint %}

### Related reference

{% content-ref url="/pages/WEKrAcz1SyYUo9EnGJtq" %}
[Language And Speech](/api-docs/convai-playground/character-customization/language-and-speech)
{% endcontent-ref %}

{% content-ref url="/pages/MteKvBX7fweeVkU90Ry4" %}
[Language List API](/api-docs/api-reference/core-api-reference/character-crafting-apis/language-list-api)
{% endcontent-ref %}


# Knowledge Bank

Learn how to upload, manage, and connect knowledge files to your AI character using Knowledge Bank — including RAG and In-Context retrieval and multimodal files.

{% embed url="<https://youtu.be/0Zac4X0flHg>" %}

## Introduction

The **Knowledge Bank** is where you store and manage information that your AI character can access during conversations. By uploading documents or adding text directly, you can give your character specific domain knowledge, enabling more accurate, relevant, and context-aware responses.

All files uploaded to your Knowledge Bank are linked to your Convai account and can be connected to any of your characters. This makes it an essential tool for training characters to respond with company-specific, product-specific, or topic-specific information.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FH8Quj2BAWTF18lt7oF2W%2Fimage.png?alt=media&amp;token=23b9d66f-1c88-471f-b3c7-519940f0739b" alt=""><figcaption></figcaption></figure>

***

## Retrieval modes: RAG and In-Context

The Knowledge Bank offers two ways for your character to use connected knowledge. You pick the mode at the top of the Knowledge Bank tab.

* **RAG** — The classic mode. Connected files are indexed and the character retrieves only the most relevant passages for each user message. Best for **large** text knowledge bases where only a fraction is relevant to any one question. RAG accepts **text files only** (`.txt`, `.csv`).
* **In-Context** — The whole connected knowledge base is placed directly in the character's context every turn (and cached for efficiency). Best for **compact, high-value** knowledge you want the character to always have in full — and it supports **multimodal** files (images, PDF, audio, video) in addition to text, depending on the selected LLM.

{% hint style="info" %}
In-Context KB is available only on **supported LLMs**. When you enable In-Context, the character's LLM is automatically set to a supported model. If you later switch to a model that doesn't support In-Context KB, Convai asks you to confirm — switching turns In-Context off and falls back to RAG (text-only).
{% endhint %}

***

## Supported file types

The file types you can upload and connect depend on the retrieval mode and, for In-Context, on the selected LLM.

| Mode           | Supported files                                                                                                 |
| -------------- | --------------------------------------------------------------------------------------------------------------- |
| **RAG**        | Text only — `.txt`, `.csv`                                                                                      |
| **In-Context** | Text (`.txt`, `.csv`), **images**, **PDF**, **audio**, **video** — subject to the selected model's capabilities |

Not every In-Context model supports every modality. For example, some self-hosted models accept only text and images. The Knowledge Bank tab shows a **"Supported file types for the selected model"** line so you always know what the current model accepts before you pick a file. The upload picker and drag-and-drop only accept those types.

{% hint style="warning" %}
Office documents (`.doc`, `.docx`, `.ppt`, `.pptx`, `.xls`, `.xlsx`, …) are **not** supported. The models can't read them raw and they aren't text-extracted for this feature. Convert them to `.txt`/`.csv` or PDF first.
{% endhint %}

### In-Context size limit

In-Context KB places the whole connected knowledge base in the prompt, so it has a **fixed size limit**. If your connected files exceed the limit, the Knowledge Bank tab shows an over-limit warning and blocks further uploads until you remove documents to get back under the cap. RAG has no such per-prompt limit (overall storage still depends on your plan).

***

## Knowledge Bank Sections

### 1. My Documents

* Displays all files uploaded to your account.
* Information shown:
  * **Name** – File name.
  * **Type** – The file's modality (text, image, PDF, audio, or video).
  * **Size** – File size.
  * **Status** – Whether the file is **Available** (ready to use) and whether it is **Connected** to the current character.
* Actions available:
  * **Connect** – Attach the file to the current character.
  * **Disconnect** – Detach the file from the character (it stays in your Knowledge Bank, inactive).
  * **Edit** – Modify a text file's content.
  * **Download** – Save the file locally.
  * **Delete** – Remove the file permanently.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2F3RLtS9TSInWqplCIy4Gp%2Fimage.png?alt=media&amp;token=a2caeb29-35bf-43a0-8b46-0fda545825b0" alt=""><figcaption></figcaption></figure>

### 2. Upload Knowledge

* Upload files from your computer.
* In **RAG** mode, only `.txt`/`.csv` are accepted. In **In-Context** mode, the picker accepts the file types the **selected model** supports (text, images, PDF, audio, video).
* Once uploaded, files are stored in your account's Knowledge Bank for use with any character.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FV1dQ02OaLSmNn6J1HlrJ%2Fimage.png?alt=media&amp;token=bae47828-4b0f-4b15-9243-961e9c98953e" alt=""><figcaption></figcaption></figure>

### 3. Add Knowledge

* Create a new text file by entering **plain text** directly into the editor.
* Name the file and save it in `.txt` format.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fpe5rc3ZHqO1NkdJ5DFys%2Fimage.png?alt=media&amp;token=76b1b3a1-8d68-412a-bf09-a91b7994985c" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
While a file is processing, its status reads "Learning…". Refresh occasionally until the status becomes **Available**. Raw media in In-Context mode (images, audio, video) is available immediately — no indexing wait.
{% endhint %}

***

## Using the Knowledge Bank with Your Character

### Example

We uploaded a file named **Employee Onboarding Guide.txt** with the following content:

```
This document provides step-by-step guidance for new hires.
Complete HR documentation within the first 3 days of joining.
Attend the mandatory orientation session.
Set up company email and access credentials via IT Support.
Review the Code of Conduct and Data Privacy Policy.
```

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FyqqwjrKbzUuWGTTx8iG3%2Fimage.png?alt=media&amp;token=7f71e190-7173-410b-a122-b89314e436b9" alt=""><figcaption></figcaption></figure>

### Testing Without Connecting the File

* Open the **Chatbox**.
* Ask: *"I'm a new hire. What should I do during my first week here?"*
* Result: The character responds using its general personality and AI model knowledge, not the uploaded file.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2F8WVbBCj6vzcko3bM01qE%2FScreenshot%202025-08-08%20194114.png?alt=media&amp;token=06c86da8-53a6-4efe-9f10-2955edf6e179" alt=""><figcaption></figcaption></figure>

### Testing by Connecting the File

* Go to **Knowledge Bank** → **My Documents**.
* Click **Connect** on the file.
* In the Chatbox, click **Reset Chat** (top left) to start a new session.
* Ask the same question again.

**Result:** This time, the character's response is based on the exact steps provided in the **Employee Onboarding Guide** file.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FQFygTYzCWMB8Ul3visDG%2FScreenshot%202025-08-08%20194207.png?alt=media&amp;token=e88e8e27-c41e-4213-a8fc-944f80d06012" alt=""><figcaption></figcaption></figure>

***

## Best Practices

{% hint style="info" %}
Always **reset the chat session** after connecting a new knowledge file so the latest data is used.
{% endhint %}

{% hint style="info" %}
Use **RAG** for large text knowledge bases and **In-Context** for compact, always-relevant knowledge or when you need multimodal files (images, PDF, audio, video).
{% endhint %}

{% hint style="info" %}
The **total storage size** for uploaded files depends on your Convai subscription plan. See the [**Pricing**](https://convai.com/pricing) page for limits. In-Context KB additionally has a fixed per-prompt size cap.
{% endhint %}

***

## Conclusion

The Knowledge Bank is a powerful way to give your characters precise and reliable information. Choose **RAG** to retrieve the most relevant passages from a large text corpus, or **In-Context** to give your character its full knowledge base — including images, PDFs, audio, and video — every turn. Either way, connecting domain-specific knowledge ensures your AI not only has personality but also the expertise to answer questions with accuracy and authority.


# Personality Traits

Learn how to customize your AI character’s personality using presets or manual trait adjustments.

## Introduction

The **Personality Traits** section defines how your AI character behaves, interacts, and responds during conversations. By adjusting personality parameters, you can align the character’s behavior with its intended role, making interactions more engaging and consistent.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fg8EzOl0dZeBq08oqbFcJ%2Fimage.png?alt=media&amp;token=08e08718-d6fd-4734-b9c1-05ea0efe1984" alt=""><figcaption></figcaption></figure>

***

## Preset Personality Styles

At the top of the page, you’ll find a **dropdown menu** containing predefined personality presets:

* Adventurous Thinker
* Friendly Optimist
* Harmonious Empath
* Analytical Perfectionist
* Curious Mediator
* Energetic Dreamer
* Social Adventurer
* Compassionate Idealist

Selecting a preset automatically adjusts the character’s personality traits to match the chosen style.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FtAeeCc2jLQchUHQTEE5H%2Fimage.png?alt=media&amp;token=184dbccf-f80c-441a-bb5d-bf1b16f1a605" alt=""><figcaption></figcaption></figure>

***

## Customizing Personality Traits

If you prefer full control, you can manually adjust the **vertical sliders** for each personality dimension:

1. **Openness**
   * High value: Likes exploring and trying new things.
   * Low value: Prefers stability and routine.
2. **Meticulousness**
   * High value: Pays great attention to detail.
   * Low value: More relaxed and spontaneous.
3. **Extraversion**
   * High value: Outgoing and sociable.
   * Low value: Reserved and introverted.
4. **Agreeableness**
   * High value: Cooperative and empathetic.
   * Low value: More competitive and independent.
5. **Sensitivity**
   * High value: Highly emotional and expressive.
   * Low value: Rarely emotional or reserved.

Each slider ranges from **0 to 4**, allowing precise adjustments to match your character’s personality profile.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FQVgdLvpVhpfBM2sv8KCZ%2Fimage.png?alt=media&amp;token=1a07cc2c-c79c-4a3c-ba70-c70be475ae8d" alt=""><figcaption></figcaption></figure>

***

## Visual Personality Map

Below the sliders, a **radar chart** displays a visual representation of the character’s personality. This helps you see how each trait contributes to the overall personality balance.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FyTxAyoH0BA0H0461YCK4%2Fimage.png?alt=media&amp;token=a1bcea65-8b4d-4e5c-908a-4036d091914c" alt=""><figcaption></figcaption></figure>

***

## Conclusion

The Personality Traits section gives you the flexibility to either choose from predefined styles or fine-tune individual traits to create a personality that matches your vision. By combining these settings with your character’s description and voice, you can create truly distinctive AI personas.


# Core AI Settings

Learn how to configure moderation, foundation model selection, and temperature for your AI character

The **Core AI Settings** section defines the foundational behavior of your AI character by controlling safety filters, the underlying language model, and the creativity level of its responses. These settings have a significant impact on how your character interacts with users, balancing safety, accuracy, and creativity.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FNO0tjYZYpRNeVkNILApg%2Fimage.png?alt=media&amp;token=de0e10fb-b496-4880-8d7a-a37da8aa226e" alt=""><figcaption></figcaption></figure>

***

## Main Features

### 1. Enable Moderation Filter

* This setting allows you to filter out potentially harmful content, including hate speech, profanity, or inappropriate language. You can turn the moderation filter on or off using the toggle located at the top of the page. By default, this setting is enabled.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FSk43Oe0HSYmhVRsoNG0I%2Fimage.png?alt=media&amp;token=16d5ea84-6de2-4f9a-ac2b-32abb742a68e" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
Disabling the Moderation Filter makes some foundation models unavailable.
{% endhint %}

{% hint style="warning" %}
Features like **Narrative Design** and **Multilingual support** will not work when moderation is disabled.
{% endhint %}

***

### 2. Select Foundation Model

Choose from a variety of **Large Language Models (LLMs)** from leading providers:

* OpenAI
* Anthropic
* Google
* Llama

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2F5QPv2xvJcnBhL1Rysy9W%2Fimage.png?alt=media&amp;token=d1533adc-ea0a-420f-a64d-d10d64b865c5" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Model availability depends on whether the Moderation Filter is enabled.
{% endhint %}

***

### Supported LLMs

Below is a list of Large Language Models (LLMs) available in the Convai Playground under **Core AI Settings**.\
Models marked as ✅ *Flagship* are the providers’ top-tier, most capable models — but usage of these is subject to the **Flagship Interaction Cap** based on your plan.

> **Flagship LLMs**\
> This is the limit on the number of interactions you can perform using Flagship LLMs.
>
> **Example:**\
> In the *Indie Dev* plan, you have a total monthly quota of **3000 Interactions**. However, the **Flagship LLM Interaction Cap** is **1500**.\
> If you use GPT-4.1 after 1500 interactions, your Flagship LLM quota will be exhausted.\
> You will then need to switch to a non-Flagship LLM for the remaining 1500 interactions.

***

### Realtime / Live Models

#### OpenAI

<table><thead><tr><th>Model</th><th>Model Code</th><th data-type="checkbox">Flagship</th></tr></thead><tbody><tr><td>GPT Realtime 1.5 (beta)</td><td>gpt-realtime-1.5</td><td>false</td></tr><tr><td>GPT Realtime Mini (beta)</td><td>gpt-realtime-mini</td><td>false</td></tr></tbody></table>

#### Google

<table><thead><tr><th>Model</th><th>Model Code</th><th data-type="checkbox">Flagship</th></tr></thead><tbody><tr><td>Gemini 2.5 Flash Live (beta)</td><td>gemini-2.5-flash-live</td><td>false</td></tr><tr><td>Gemma 4 31B Fast (beta)</td><td>realtime-gemma-4-31b-it</td><td>false</td></tr><tr><td>Gemma 4 26B A4B Fast (beta)</td><td>realtime-gemma-4-26b-a4b-it</td><td>false</td></tr></tbody></table>

### Standard Models

#### OpenAI

<table><thead><tr><th>Model</th><th>Model Code</th><th data-type="checkbox">Flagship</th></tr></thead><tbody><tr><td>GPT-5.4</td><td>gpt-5.4</td><td>false</td></tr><tr><td>GPT-5.x (latest)</td><td>gpt-5.x</td><td>true</td></tr><tr><td>GPT-OSS-120B (beta)</td><td>gpt-oss-120b</td><td>false</td></tr><tr><td>GPT-5.1 (beta)</td><td>gpt-5.1</td><td>false</td></tr><tr><td>GPT-4.1</td><td>gpt-4.1</td><td>false</td></tr><tr><td>GPT-5.4-nano</td><td>gpt-5.4-nano</td><td>false</td></tr><tr><td>GPT-5.x-nano (latest)</td><td>gpt-5.x-nano</td><td>true</td></tr><tr><td>GPT-5.4-mini</td><td>gpt-5.4-mini</td><td>false</td></tr><tr><td>GPT-5.x-mini (latest)</td><td>gpt-5.x-mini</td><td>true</td></tr><tr><td>GPT-4.1-mini</td><td>gpt-4.1-mini</td><td>false</td></tr><tr><td>GPT-5.3 Instant</td><td>gpt-5.3-instant</td><td>false</td></tr><tr><td>GPT-4o</td><td>gpt-4o</td><td>false</td></tr><tr><td>GPT-4.1-nano</td><td>gpt-4.1-nano</td><td>false</td></tr><tr><td>GPT-4o-mini</td><td>gpt-4o-mini</td><td>false</td></tr></tbody></table>

#### Anthropic

<table><thead><tr><th>Model</th><th>Model Code</th><th data-type="checkbox">Flagship</th></tr></thead><tbody><tr><td>Claude 4.5 Sonnet (beta)</td><td>claude-4-5-sonnet</td><td>false</td></tr><tr><td>Claude 4.5 Haiku (beta)</td><td>claude-4-5-haiku</td><td>false</td></tr><tr><td>Claude Sonnet (latest)</td><td>claude-sonnet</td><td>true</td></tr><tr><td>Claude Haiku (latest)</td><td>claude-haiku</td><td>true</td></tr></tbody></table>

#### Google

<table><thead><tr><th>Model</th><th>Model Code</th><th data-type="checkbox">Flagship</th></tr></thead><tbody><tr><td>Gemini 3.5 Flash</td><td>gemini-3.5-flash</td><td>false</td></tr><tr><td>Gemini Flash (latest)</td><td>gemini-flash</td><td>true</td></tr><tr><td>Gemini 3.1 Flash Lite</td><td>gemini-3.1-flash-lite</td><td>false</td></tr><tr><td>Gemini Flash Lite (latest)</td><td>gemini-flash-lite</td><td>true</td></tr><tr><td>Gemini 2.5 Flash</td><td>gemini-2.5-flash</td><td>false</td></tr><tr><td>Gemini 2.5 Flash Lite</td><td>gemini-2.5-flash-lite</td><td>false</td></tr></tbody></table>

Gemini 3.8 Flash offers these reasoning profiles:

| Model                     | Model code                |
| ------------------------- | ------------------------- |
| Gemini 3.8 Flash (Low)    | `gemini-3.8-flash-low`    |
| Gemini 3.8 Flash (Medium) | `gemini-3.8-flash-medium` |
| Gemini 3.8 Flash (High)   | `gemini-3.8-flash-high`   |

The Low, Medium, and High profiles select how much reasoning Gemini 3.8 Flash performs. Their provider token prices are the same; additional reasoning increases output-token usage.

All three profiles use **0.75 Convai credits per 1,000 input tokens** and **3.75 credits per 1,000 output tokens**, including reasoning. Each turn also includes the **Platform Fee** of <code class="expression">space.vars.platform\_fee\_credits</code> credits. Speech, session duration, memory, knowledge retrieval, and other enabled services add their own usage, and Convai rounds each turn's total up to the next whole credit. See [How Convai credits work](/api-docs/credits-and-billing/convai-credits/how-convai-credits-work).

<details>

<summary>Gemini 3.8 Flash latency and credit measurements</summary>

These staging measurements use 30 synthetic requests per profile across conversation, questions using supplied reference notes, and planning, with approximately 3,900 input tokens per request, on September 5, 2026. Requests run one at a time. Latency measures the language-model request to the first text response, including reasoning. It excludes connection setup, speech recognition, speech synthesis, and delivery to your device:

| Profile | First text, median | First text, 95th percentile | Mean LLM credits | Mean generation credits |
| ------- | -----------------: | --------------------------: | ---------------: | ----------------------: |
| Low     |             1.06 s |                      3.65 s |             4.03 |                   10.03 |
| Medium  |             4.26 s |                      7.49 s |             8.63 |                   14.63 |
| High    |             5.57 s |                      9.28 s |            11.03 |                   17.03 |

The LLM column quotes the language model in isolation, using measured input, visible output, and reasoning tokens. The generation column shows observed staging charges including the six-credit **Platform Fee**. Both columns exclude session duration charges and other services. These workload averages do not guarantee production costs or response times.

</details>

Google's introductory provider prices are **$0.75 per million uncached input tokens** and **$3.75 per million output tokens**, including reasoning, through December 31, 2026. Provider prices describe Google's charges and differ from Convai credits. See [Google Gemini API pricing](https://ai.google.dev/gemini-api/docs/pricing).

#### Qwen

<table><thead><tr><th>Model</th><th>Model Code</th><th data-type="checkbox">Flagship</th></tr></thead><tbody><tr><td>Qwen3.6 27B (beta)</td><td>qwen3.6-27b</td><td>false</td></tr><tr><td>Qwen3.6 35B A3B (beta)</td><td>qwen3.6-35b-a3b</td><td>false</td></tr></tbody></table>

#### Llama

<table><thead><tr><th>Model</th><th>Model Code</th><th data-type="checkbox">Flagship</th></tr></thead><tbody><tr><td>Llama 4 Maverick (beta)</td><td>llama-4-maverick</td><td>false</td></tr><tr><td>Llama 4 Scout (beta)</td><td>llama-4-scout</td><td>false</td></tr><tr><td>Llama3 70B</td><td>llama3-70b</td><td>false</td></tr></tbody></table>

#### xAI

<table><thead><tr><th>Model</th><th>Model Code</th><th data-type="checkbox">Flagship</th></tr></thead><tbody><tr><td>Grok 4.3</td><td>grok-4.3</td><td>false</td></tr></tbody></table>

***

### 3. Temperature Control

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Ff9hN5jQ31MP0zmIe8JYt%2Fimage.png?alt=media&amp;token=9d060665-3d32-48eb-87d5-eccd068e0647" alt=""><figcaption></figcaption></figure>

* **Function:** Adjusts the randomness and creativity in the AI’s responses.
* **Slider Range:** `0.0` (most deterministic) to `1.0` (most creative).

| Temperature Range    | Behavior                                   | Use Case                                       |
| -------------------- | ------------------------------------------ | ---------------------------------------------- |
| **Low (0.0–0.3)**    | Deterministic, consistent                  | Factual Q\&A, compliance-critical interactions |
| **Medium (0.4–0.7)** | Balanced accuracy and creativity           | Conversational agents, customer support        |
| **High (0.8–1.0)**   | Diverse, creative, sometimes unpredictable | Storytelling, brainstorming, roleplay          |

{% hint style="info" %}
Lower temperature sharpens the probability distribution for more predictable word choices.

Higher temperature flattens the distribution, allowing less likely words to appear more frequently.
{% endhint %}

***

### 4. Reasoning Level

Found under **Advanced Settings**, next to Temperature.

* **Function:** Controls how much internal reasoning the model does before answering.
* **Availability:** Only shown for models that support it. Models without reasoning control — such as the Gemma, Llama, Qwen and GLM families — do not display this setting.

Reasoning trades latency for answer quality. More reasoning generally produces better handling of multi-step questions and instructions, at the cost of a slower first response.

#### Available options

The exact list depends on the selected model, because each provider exposes a different scale.

| Option                | Behavior                                                                                                             |
| --------------------- | -------------------------------------------------------------------------------------------------------------------- |
| **Auto**              | No level is sent. The model applies its own adaptive default, reasoning more on hard requests and less on easy ones. |
| **Off** / **Minimal** | The lowest setting the model offers. Fastest first response.                                                         |
| **Low**               | A small amount of reasoning.                                                                                         |
| **Medium**            | Balanced. Most providers' own default.                                                                               |
| **High** and above    | Maximum reasoning. Slowest, best on complex multi-step requests.                                                     |

{% hint style="info" %}
**Auto is usually the right starting point.** Current models already adapt their own reasoning to the difficulty of each request, so Auto typically keeps easy turns fast while still allowing the model to think when a request genuinely needs it. Pin an explicit level when you need predictable latency, or when you have measured that a specific level performs better for your use case.
{% endhint %}

{% hint style="warning" %}
Higher reasoning levels increase both response latency and token consumption. If your experience is latency-sensitive — a live voice agent, for example — measure the effect before raising the level.
{% endhint %}

#### Switching models

If you change the foundation model, your reasoning level is kept when the new model also supports it. When it does not, the setting falls back to **Auto**, so the character never sends a value its model would reject.

#### Characters created before this setting existed

Characters that have never had a reasoning level set show **Model default** and keep the behavior they have always had. Editing and saving other settings will not change this. Selecting any other option opts the character in, and there is no way back to **Model default** afterwards — choose **Auto** if you want the model to decide.

***

## Conclusion

The Core AI Settings give you precise control over your character’s foundation model, safety filters, and response style. By adjusting these parameters, you can create an AI that balances safety, reliability, and creativity to suit your specific application.


# Guardrails

The Guardrails tab is a safety and control interface designed to restrict and guide a character's AI behavior. It allows creators to define the ethical and topical boundaries of the conversation.

{% hint style="danger" %}
This API is available only on the Paid Plans.
{% endhint %}

## Introduction

The **Guardrails tab** provides a robust control interface to define your character’s ethical and topical boundaries, preventing off-topic or inappropriate responses. By entering specific constraints in the Instructions field and toggling custom guardrails on, you ensure your AI character responds in a safe and professional manner, and is strictly aligned with your intended brand voice.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FKEG3pfFfGykYRAfeqgOa%2FScreenshot%202026-04-15%20at%2012.02.30%E2%80%AFPM.png?alt=media&amp;token=8949477f-54ca-4b79-ab22-e15843a5ce2a" alt=""><figcaption></figcaption></figure>

## Main Features and Sections

### 1. Custom Guardrails Toggle

This toggle acts as the master switch to activate or deactivate your character's safety oversight. When enabled, it forces the AI character to prioritize your specific behavioral rules over its general conversational logic.

### 2. Guardrails Instruction

This text field allows you to define explicit safety rules and response boundaries using up to 7,500 words. It is where you input constraints like "Do not talk about politics" to ensure the character remains professional and on-topic.

## Examples

This example shows how you can implement guardrails for your AI character in Convai Playground

{% embed url="<https://youtu.be/dfosB0XYiOo>" %}

***

## Conclusion

The Guardrails tab is an essential safety tool that empowers creators to enforce strict behavioral boundaries and content restrictions on their AI characters. By combining custom instructions with real-time testing, it ensures that interactions remain secure, on-brand, and free from undesirable topics or hallucinations.


# State Of Mind

Learn how the State of Mind feature visualizes your AI character’s emotional state in real time during conversations.

## Introduction

The **State of Mind** section provides a visual representation of your AI character’s current emotional state. This dynamic emotional map helps you understand how your character is responding internally during a conversation, allowing for fine-tuning of its personality and interaction style.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fqddr79VtWV28ApwXffHo%2Fimage.png?alt=media&amp;token=cd4b16d1-5d0d-4019-8eca-d5bb24938995" alt=""><figcaption></figcaption></figure>

***

## How It Works

* The State of Mind interface displays a **color-coded emotion wheel**.
* Each segment represents a specific emotion such as **Joy, Anger, Trust, Fear, Surprise, Sadness, Disgust,** and **Anticipation**, along with nuanced variations like **Serenity, Rage, Admiration,** and **Amazement**.
* **Active emotions** — those the character is currently experiencing — are highlighted more brightly on the graph.
* Emotions change dynamically based on the context, tone, and content of the conversation.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FKfyxRahyHKL0i4tDh2RX%2Fimage.png?alt=media&amp;token=5d2930e1-216d-4c16-908c-584e69322c5d" alt=""><figcaption></figcaption></figure>

***

## Practical Use Cases

* **Character Testing:** Observe real-time emotional responses to verify that the character reacts as intended.
* **Personality Tuning:** Adjust personality traits in the **Personality Traits** section and see how they influence emotional patterns.
* **Storytelling & Roleplay:** Ensure emotional consistency in interactive narratives.

***

## Conclusion

The State of Mind feature offers valuable insights into your AI character’s emotional behavior. By monitoring these live emotional changes, you can ensure your character responds in a way that aligns with its designed personality and intended use case.


# Agentic Actions

Configure an Actions Contract, choose a starter template, inspect parsed output, and connect each emitted action to a client-side handler.

Agentic Actions lets you define prompt instructions for structured output and test how a character emits actions in chat. Use the tab to prepare a contract, activate it for new connections, and inspect the result without treating parsed output as proof of execution.

### Before you begin

* Create the character you want to configure.
* Decide which actions or tools your client can execute.
* Register those capabilities in your client with stable names before testing execution.

{% hint style="warning" %}
An Actions Contract is prompt text, not executable client code. A `Parsed action` row confirms that Convai recognized an emitted action; it does not confirm that your client executed it.
{% endhint %}

### Prepare the Actions Contract

{% stepper %}
{% step %}

#### Open Agentic Actions

Open a character, then select **Agentic Actions** in the character editor.

**Enable Agentic Actions** is off by default for a character that has no saved legacy Character Actions. You can prepare and save a contract while the switch is off. The contract does not enter the model prompt until you enable Agentic Actions and start a new chat connection.

An existing character that already has one or more saved Character Actions and has never saved this switch is shown as **enabled (inherited)**. This preserves its existing action behavior without silently writing a new setting. Saving the switch on or off makes that explicit choice authoritative from then on.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fgit-blob-58e7764171366c85cf0a8c51ec6b1943ac596807%2Fplayground-agentic-actions-disabled-panel.png?alt=media" alt="Agentic Actions editor with Enable Agentic Actions switched off, the template selector available, and a saved Actions Contract retained"><figcaption><p>Prepare and save an Actions Contract while Agentic Actions is off. The saved text is not added to the model prompt until you enable the feature for a new connection.</p></figcaption></figure>
{% endstep %}

{% step %}

#### Preview a template

Select an example from **Action contract template**. The selected example appears in **Template preview**.

Selecting a template does not change the current contract, enable Agentic Actions, or save the character.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fgit-blob-7d4e0631262519b083a00054d483de96e4542704%2Fplayground-agentic-actions-template-menu.png?alt=media" alt="Agentic Actions template menu showing three embodied templates and three browser-agent templates"><figcaption><p>The selector contains three embodied examples and three browser-agent examples.</p></figcaption></figure>
{% endstep %}

{% step %}

#### Add and adapt the example

Select **Add template to contract** to append the preview below the existing text. The editor preserves the current contract instead of replacing it.

Replace suggested action and tool names with the exact names registered by your client. The Actions Contract accepts up to `20,000` characters. If an addition would exceed the limit, shorten the current contract before adding the template.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fgit-blob-b4d67dc73ee98f5b67d0a52b508a4d99064209c1%2Fplayground-agentic-actions-template-appended.png?alt=media" alt="A gestures template preview above an existing Actions Contract after the example was appended"><figcaption><p>Adding a template preserves the existing contract and appends the full example. It does not enable Agentic Actions or save automatically.</p></figcaption></figure>
{% endstep %}
{% endstepper %}

### Choose a starting template

The template list contains three embodied examples and three browser examples:

| Template                                   | Starting point                                                                                  |
| ------------------------------------------ | ----------------------------------------------------------------------------------------------- |
| **Embodied · Gestures and reactions**      | Conservative gestures that support a spoken response.                                           |
| **Embodied · Movement and following**      | Ordered movement with grounded destinations and character targets.                              |
| **Embodied · Object interaction**          | Pick-up, hand-off, and placement sequences grounded in client context.                          |
| **Browser agent · Navigate and inspect**   | Navigation and fresh inspection of visible page state.                                          |
| **Browser agent · Fill a form safely**     | Reversible form entry with confirmation before consequential submission.                        |
| **Browser agent · Research and summarize** | Source inspection with concise speech and link-rich display output when the client supports it. |

The browser templates do not add browser controls or tool handlers to the Playground. They are starting points for a client that registers and executes matching browser tools.

### Enable actions for new chats

Turn on **Enable Agentic Actions**, then select **Update character**. Saving reconnects the chat so the accepted setting and contract apply to the next interaction.

Turning Agentic Actions off does not delete the saved contract. Save the disabled setting to reconnect without adding the Actions Contract or configured character actions to the model prompt.

For a legacy character marked **enabled (inherited)**, leave the switch on and save only if you want to replace the inherited state with an explicit setting. Turning it off and saving intentionally disables both its saved legacy Character Actions and its Actions Contract for new connections.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fgit-blob-b919ff89e5e2d1a9e3cfe7baf9460b88930d90c9%2Fplayground-agentic-actions-enabled-saved.png?alt=media" alt="Agentic Actions enabled with the saved contract retained and a Parsed action Wave status visible in chat"><figcaption><p>The enabled switch activates saved action instructions for new connections. The parsed-action row confirms recognition and delivery, not client execution.</p></figcaption></figure>

### Inspect system-generated action instructions

Select **Show system-generated action instructions** inside **Actions Contract / Action Definitions** to inspect the exact action and structured-output instruction blocks that the current Core prompt composer would add for the saved character configuration.

The revealed blocks are read-only. They are not copied into the Actions Contract and are never saved as user-authored text. Editing the draft invalidates the displayed result; save the character and inspect again to view the effective instructions for the new configuration.

{% hint style="info" %}
This inspection reflects the current Core prompt composer. It does not claim byte-for-byte identity with historical prompts generated by the retired legacy Playground or Middleman implementation.
{% endhint %}

### Inspect parsed and raw output

Send a chat message that clearly requests one registered action. The chat displays a `Parsed action: <name>` status when Convai recognizes structured action output. A target appears after an arrow when the action includes one.

**Show full unfiltered LLM output in chat** controls diagnostic display independently from **Enable Agentic Actions**:

| Setting | Chat display                                                                                  |
| ------- | --------------------------------------------------------------------------------------------- |
| Off     | Shows the normal text stream and any parsed action status.                                    |
| On      | Also shows the provider-visible pre-parser output while keeping parsed action status visible. |

Enabling raw display does not make structured markup part of speech synthesis. Do not parse the raw text to drive actions. Use the structured action event delivered to your client.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fgit-blob-91e94568764f71757a8aeef480cc03821e7e08bf%2Fplayground-agentic-actions-chat-raw-off.png?alt=media" alt="Filtered chat showing a spoken response and Parsed action Wave without provider JSON"><figcaption><p>With raw display off, chat shows the normal response and the parsed action status without exposing provider output.</p></figcaption></figure>

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fgit-blob-3e739ae2371e064eb6f9c2f948f205c385d680a0%2Fplayground-agentic-actions-chat-raw-on.png?alt=media" alt="Unfiltered chat showing provider JSON and a separate Parsed action Wave status"><figcaption><p>With raw display on, provider-visible JSON appears for inspection and the parsed action remains separate. Neither row proves that a client executed the action.</p></figcaption></figure>

### Verify client execution

Confirm action handling in the client that owns the capability. For an embodied action, observe the animation, movement, or object operation. For a browser action, observe the registered tool result and the resulting page state.

Treat the following states separately:

1. The model emits an action.
2. Convai parses and delivers the action.
3. The client accepts and executes the action.
4. The client observes the resulting state.

The Playground chat proves the second state when it shows `Parsed action`. It cannot prove the later client-side states by itself.

### Troubleshooting

#### No parsed action appears

**Symptom:** The character responds, but chat shows no `Parsed action` row.

**Cause:** Agentic Actions is off, the setting was not saved for the new connection, the request does not call for an action, or the contract does not match a registered capability.

**Fix:** Enable Agentic Actions, select **Update character**, and send an unambiguous request that uses an exact registered action name.

**Verify:** The next applicable turn shows `Parsed action: <name>`.

#### A parsed action does not run

**Symptom:** Chat shows `Parsed action`, but the expected client behavior does not occur.

**Cause:** The client has no matching handler, the action name differs, or the handler failed after delivery.

**Fix:** Register a handler for the exact action name and inspect the client-side execution result.

**Verify:** The client performs the behavior and reports the resulting state.

#### A template cannot be added

**Symptom:** **Add template to contract** is disabled and the character-limit message appears.

**Cause:** Appending the template would exceed `20,000` characters.

**Fix:** Shorten the current contract, then add the template again.

**Verify:** The template appears below the existing contract without replacing it.

### Next steps

Register and execute embodied actions with the SDK used by your client:

{% content-ref url="/pages/8e2d39906eb40512aa9c4c6b05ffc3352eb87e51" %}
[Character actions](/api-docs/plugins-and-integrations/convai-unity-sdk/features/character-actions)
{% endcontent-ref %}

{% content-ref url="/pages/NjVHOB3MELicvSSurEPd" %}
[Character actions](/api-docs/plugins-and-integrations/convai-unreal-engine-plugin/features/character-actions)
{% endcontent-ref %}

{% content-ref url="/pages/TAz5xoB9ykfQi3tP2LRX" %}
[Actions](/api-docs/plugins-and-integrations/web-plugins/convai-web-sdk/actions)
{% endcontent-ref %}

Use the Live API reference when implementing the response protocol directly:

{% content-ref url="/pages/yjF33JsM2vqn5LNYH0vg" %}
[Response contract and parsing](/api-docs/api-reference/core-api-reference/live-apis-beta/response-contract-and-parsing)
{% endcontent-ref %}


# Memory

Learn how to use the Memory feature to review past sessions, manage conversation history, and enable long-term memory for your character.

## Introduction

The Memory section lets you review conversation history for a character and decide whether it should remember information between sessions. Use it to audit interactions, troubleshoot issues, and enable persistent preferences.

## Recent Memory

This tab lists all previous sessions with your character.\
For each session, you can view:

* **Date** – The date when the session occurred.
* **Time** – The session’s start time, shown in UTC time zone.
* **Session ID** – A unique identifier for that session.

{% hint style="info" %}
If you experience any issues in a session, support team may request the Session ID so they can investigate in detail.
{% endhint %}

**Available Actions:**

* **View conversation:** Click the downward arrow to expand and see the conversation log for that session.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fu1HH7nIVSu682O1eQnNN%2FScreenshot%202025-08-09%20193632.png?alt=media&amp;token=8f4a2d3f-b8d5-475d-9f8f-ca86c8b3711a" alt=""><figcaption></figcaption></figure>

* **Copy or download:** Use the three-dot menu on the right to copy or download the session data.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FSjwulWY4xNzQCKmUvNCm%2Fimage.png?alt=media&amp;token=82b7343c-41e5-41f7-a6c4-146e32605b73" alt=""><figcaption></figcaption></figure>

***

## Memory Settings

This tab allows you to enable or disable **Long Term Memory**.

When Long Term Memory is **enabled**, your character can remember preferences, choices, and facts from previous sessions. For example:\
If you tell your character “My favorite color is blue” in one session, and later in a different session ask “What’s my favorite color?”, the character will respond with “blue.”

When disabled, the character will not retain information between sessions.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2F2Muespq3g0XCpuQeXq87%2Fimage.png?alt=media&amp;token=77d45bd8-61ef-439a-97b0-ce967852f7d4" alt=""><figcaption></figcaption></figure>

***

## Conclusion

The Memory feature provides powerful control over how your character interacts with you over time. Use Recent Memory to inspect and share specific sessions, and adjust Memory Settings to decide whether your character should retain knowledge across conversations.


# Mindview

Learn how to use the Mindview feature to review the actual prompts to the LLM for your current or previous sessions and interactions.

{% hint style="danger" %}
This feature is available only on the Professional Plan and above.
{% endhint %}

## **Introduction**

The **Mindview** section provides visibility into the **prompt** that was sent to the model to generate your character’s response.\
It’s a powerful tool for:

* Understanding how your character processes context.
* Improving your **Character Description**, **Knowledge Bank**, and **Language Settings**.
* Troubleshooting unexpected or inconsistent responses.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FyPz3rdCpOmw1A5fHI69c%2Fimage.png?alt=media&amp;token=ec90783a-e258-4916-af08-e5d0a8a5c77a" alt=""><figcaption></figcaption></figure>

***

## **Accessing Mindview**

You can open the **Mindview** tab directly from the left navigation menu of the Convai Playground.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FBByKmIGLxYVOLeZFhsrw%2FScreenshot%202025-11-05%20140521.png?alt=media&amp;token=c3f7a326-5dd2-4a53-9563-1ef4162ba6e6" alt=""><figcaption></figcaption></figure>

When first opening it, you’ll be asked to select a **conversation or interaction** from the **Memory** tab.\
Alternatively, you can start a new conversation — Mindview will automatically display the data for the **latest message**.

To access Mindview for a **previous interaction**:

1. Navigate to the **Memory** tab.
2. Expand the desired **session**.
3. Click the **Mindview icon** next to any message to open its corresponding prompt view.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FDfDzfDesAtZWdXxzu3rY%2FMindview.png?alt=media&amp;token=c13ed141-59d7-41c6-abec-b6222405749c" alt=""><figcaption></figcaption></figure>

***

## Understanding the Mindview Interface

Once opened, you’ll see a structured view of how the model interpreted and responded to an input.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FyPz3rdCpOmw1A5fHI69c%2Fimage.png?alt=media&amp;token=ec90783a-e258-4916-af08-e5d0a8a5c77a" alt=""><figcaption></figcaption></figure>

### **Header Information**

At the top of the screen, the following details are displayed:

* **Session ID** – Identifies which session the interaction belongs to.
* **Model Name** – Shows the LLM used to generate the response.
* **User Query** – Displays the exact message or query that initiated this prompt.

### **Main Prompt Section**

This is the core of Mindview. It shows the **entire chain of messages** (System, Assistant, and User) that formed the complete prompt sent to the model.

Each section provides insight into how the model understands the character’s context and instructions before producing a response.

***

## What Influences the Main Prompt

The main prompt displayed in Mindview is dynamically constructed using multiple aspects of your character and session:

| Source                    | Description                                                                                                 |
| ------------------------- | ----------------------------------------------------------------------------------------------------------- |
| **Character Description** | Defines the character’s backstory and core context. Appears within `<back-story>` ... `</back-story>` tags. |
| **Language and Speech**   | Includes the allowed languages and relevant speech configuration.                                           |
| **Personality Traits**    | Controls the conversational tone, emotion, and formality level of the character.                            |
| **Narrative Design**      | Incorporates objectives or context from active Narrative Design sections into the user’s input.             |
| **Knowledge Bank**        | Adds relevant external knowledge to improve factual accuracy or domain-specific responses.                  |
| **Long-Term Memory**      | Injects persistent information learned across sessions, when applicable.                                    |

***

## Use Cases

* Debug and refine how your **character’s prompt** is constructed.
* Identify missing or conflicting information within the character setup.
* Validate that the right **Knowledge Bank**, **Personality Traits**, and **Narrative Design** data are being included in responses.

***

## Conclusion

The Mindview tab gives creators deep transparency into the inner workings of Convai’s character response generation.\
By analyzing prompts and understanding how context is layered, you can fine-tune your characters for **more consistent**, **accurate**, and **personality-aligned** interactions.


# Narrative Design

Build goal‑oriented conversation flows using sections, decisions, and triggers that move the story forward without rigid dialogue trees.

## Introduction

Narrative Design lets you guide a character with high‑level objectives while keeping conversations flexible. Instead of hard coding a tree of lines, you define goals and decision points, then allow the character to respond dynamically. This approach works for many domains such as games, learning and training simulations, tourism, retail assistants, and customer support kiosks. You can read more about the considerations behind Narrative Design [here.](https://convai.com/blog/convai-narrative-design)

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FG33UnzJMZjwWw3eyEah7%2Fimage.png?alt=media&amp;token=efa57c25-f9ac-47bc-bc7a-54cf1da70c5d" alt=""><figcaption></figcaption></figure>

***

## Videos

Watch this series of videos to learn how to create a Narrative Design Graph in the Convai Playground.\
The demo features a Tour Guide scenario, showing step-by-step how to design, connect, and implement your own Narrative Design flow.

{% embed url="<https://www.youtube.com/playlist?list=PLD3AIwsrrHJ0>" %}

***

## Accessing Narrative Design

Open your character in the Convai Playground and select '**Narrative Design**' from the left sidebar. You will see a graph editor where you can connect the flow using nodes.

***

## Narrative Graph

A narrative graph is made of four building blocks:

## Sections

A Section contains:

* **Objectives** – The goal the character aims to achieve in this part of the narrative.\
  \&#xNAN;*Example:* A virtual tour guide’s objective could be to welcome the user and ask if they want to begin the tour.
* **Decisions** – Choices based on user interaction that direct the character to different sections.\
  \&#xNAN;*Example:* If the user says “yes” to a tour, the next section might start the tour route; if “no,” the character might offer alternative information.

{% hint style="warning" %}
Ensure decisions are clear and unambiguous; otherwise, the intended section may not be triggered.
{% endhint %}

Each Section has a **unique ID**.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fxdr7NdK2gFoNeaeuQSYz%2Fimage.png?alt=media&amp;token=a862667f-65d4-4712-b540-33882324867d" alt=""><figcaption></figcaption></figure>

***

## Triggers

A trigger is a simple signal from your application indicating that a certain condition has been met. When fired, triggers advance the graph to the next connected section.

Each Trigger has a **unique ID**.

**Examples**

* **Location Based (Spatial):** your app detects the user entered a zone and fires the trigger associated with that Section.
* **Time Based:** a timer in your app expires and fires the trigger.
* **Event Based:** an in‑app event occurs such as “safety demo completed” and you fire the trigger.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FsZhlHBZdkCXSk87ozZgb%2Fimage.png?alt=media&amp;token=bf23ed47-cd6c-4b75-b6ab-8767cb5da904" alt=""><figcaption></figcaption></figure>

***

## Example Scenarios

To better understand how Narrative Design works in practice, here are two example characters you can explore directly in Convai Playground.\
Open each link, navigate to the **Narrative Design** tab, and review how the graph is structured with Sections and Triggers.

### Factory Tour Guide – [View Character](https://convai.com/pipeline/dashboard/character?id=8cd9fa0c-384b-11ef-a852-42010a7be00e)

A training simulation scenario set in a manufacturing facility.\
This character uses location-based triggers (e.g., entering the conveyor belt area or assembly line) to guide users through the workspace, explain safety protocols, and progress the tour.\
Ideal for **industrial training** and **onboarding simulations**.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FG33UnzJMZjwWw3eyEah7%2Fimage.png?alt=media&amp;token=efa57c25-f9ac-47bc-bc7a-54cf1da70c5d" alt=""><figcaption></figcaption></figure>

### Real Estate Home Tour Guide – [View Character](https://convai.com/pipeline/dashboard/character?id=4d31ce84-8c6a-11ef-bc7a-42010a7be011)

A real estate simulation where the character guides potential buyers through different rooms in a property.\
Similar to the factory example, it uses **location-based triggers** — for instance, when the user enters a specific room (e.g., kitchen, bathroom, bedroom), the corresponding Section in the Narrative Graph is triggered.\
This allows the character to dynamically adapt its dialogue to the user’s movement through the property.\
Useful for **virtual property tours**, **sales presentations**, and **customer onboarding**.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FH0VcZJAW28XYuiL9cikA%2Fimage.png?alt=media&amp;token=6bccaddd-c70f-460a-b494-361870bbfc6f" alt=""><figcaption></figcaption></figure>

***

## Syntax Instructions

These special characters can be added to nodes in your Narrative Design graph to control specific outcomes and behavior.

| Special Characters | Example                                      | Use                                                                                                                    |
| ------------------ | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| \<speak>           | \<speak> I'll say this exact line! \</speak> | Forces the character to respond exactly with the phrase inside the tags, without paraphrasing or adding extra context. |
| \*                 |                                              | Forces an immediate transition to the next node, bypassing further decision checks.                                    |


# External API

Learn how to integrate and configure the External API feature to enable your characters to access real-time information, create tasks, and interact with third-party platforms.

## Introduction

The **External API** feature empowers your characters to interact intelligently with real-time data sources and third-party services. Whether it’s retrieving live weather updates, tracking sports scores, or creating tickets in platforms like Jira and Trello, this feature allows seamless API-based integration. With just a few configuration steps, your characters can fetch data, trigger workflows, and execute automated actions, making them significantly more capable.

{% embed url="<https://www.youtube.com/watch?v=Ep1yUeu91FE>" %}

Before you write methods, skim [External API limitations](/api-docs/convai-playground/character-customization/external-api/external-api-limitations) — supported models, Python runtime, allowed libraries, input schema, and per-character caps. Same page is linked from the API reference.

***

## Configuration and Usage

### 1. Accessing the External API Page

Navigate to the **External API** section in your dashboard. Here you can view existing API methods, activate or deactivate them, and create new methods. To add a new API method, click **Add API Method**.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FcuDTHJE5qW2Olt7VLQYg%2FScreenshot%202025-08-09%20222338.png?alt=media&amp;token=e356bab4-a518-421d-9be2-9e06fb470405" alt=""><figcaption></figcaption></figure>

***

### 2. Creating an API Method

**Method Fields Overview**

* **Method Name** – Select an existing template or enter a unique name for your method.
* **Method Description** – Provide a concise explanation of the method’s functionality.
* **Input Description (JSON Format)** – Define required input parameters and their descriptions.
* **Implementation Code** – Write the Python implementation for your API logic.
* **Inputs** – Enter test parameters for validating your method.
* **Output** – Displays the result when you click **Test API**.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2F1B61FhWE2wDzVEelrm9w%2FScreenshot%202025-08-09%20222520.png?alt=media&amp;token=4c256d26-9373-4595-ae6a-f56822ef1d1b" alt=""><figcaption></figcaption></figure>

***

## Example 1 – Get Weather Data

**Method Name**\
`Get Weather`

**Method Description**\
`Fetches current weather data for a given city`

**Input Description**

```json
{
    "parameters": {
        "city": {
            "type": "string",
            "description": "Name of the city to get weather information for (e.g., 'London', 'New York', 'Tokyo')"
        }
    },
    "required": [
        "city"
    ]
}
```

**Implementation Code**

```python
import requests

API_KEY = "<your-api-key>"

def handle_event(data):
    city = data.get("city")
    url = f"https://api.openweathermap.org/data/2.5/weather?q={city}&appid={API_KEY}"
    response = requests.get(url)
    weather_data = response.json()
    return {"weather": weather_data["weather"][0]["description"]}
```

**Setup Notes**

1. Sign up at [OpenWeatherMap](https://openweathermap.org/) and get your API key.
2. Replace `<your-api-key>` in the code with your key.

**Test Input**

```json
{
  "city": "New York"
}
```

Click **Test API**.

**A successful Output Example:**

```json
{
  "weather": "clear sky"
}
```

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2F1B61FhWE2wDzVEelrm9w%2FScreenshot%202025-08-09%20222520.png?alt=media&amp;token=4c256d26-9373-4595-ae6a-f56822ef1d1b" alt=""><figcaption></figcaption></figure>

#### **Activate the method**

If the test passes, click **Save Changes**, return to the main API list, and enable the method by toggling **Connect** to green.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FeDo9ll7ToGd9hH5RjBWr%2FScreenshot%202025-08-09%20222055.png?alt=media&amp;token=583e69d7-4cf8-49dc-9bc6-84345d12b64d" alt=""><figcaption></figcaption></figure>

#### **Test with a character**

Once activated, test the method in a conversation with your character.\
As seen in the screenshot below, the character correctly returned the current weather for Roma and Wrangell.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2F3OibIcWvoDDlhgvS19jG%2FScreenshot%202025-08-09%20155243.png?alt=media&amp;token=69d5a27d-d63d-4288-80ac-2a6c056e1d55" alt=""><figcaption></figcaption></figure>

***

## Example 2 – Create Jira Support Ticket

**Method Name**\
`Creating Support Tickets`

**Method Description**\
`Creates a support ticket on Jira`

**Input Description**

```json
{
    "parameters": {
        "summary": {
            "type": "string",
            "description": "Short title for the Jira ticket"
        },
        "description": {
            "type": "string",
            "description": "Detailed description of the Jira issue"
        }
    },
    "required": [
        "summary",
        "description"
    ]
}
```

**Implementation Code**

```python
import requests
from requests.auth import HTTPBasicAuth
import json

# Jira configuration
JIRA_DOMAIN = "mycompany.atlassian.net"  # Replace with your Jira domain
EMAIL = "user@example.com"               # Replace with your Atlassian account email
API_TOKEN = "abc123xyz456..."            # Replace with your Jira API token
JIRA_PROJECT_KEY = "EX"                  # Replace with your Jira project key
ISSUE_TYPE = "Story"                     # Issue type: Story, Task, or Bug

API_ENDPOINT = f"https://{JIRA_DOMAIN}/rest/api/3/issue"

# Standard headers required by JIRA.
headers = {"Accept": "application/json", "Content-Type": "application/json"}

def create_jira_ticket(ticket_data):
    """
    Create a JIRA ticket using provided ticket_data dictionary.

    Expected ticket_data keys:
      - summary: (str) Brief summary of the issue.
      - description: (str) Detailed description of the issue.

    Returns:
      - JSON response if the ticket is created successfully.
      - Error message if there was an error.
    """
    # Convert plain text description to Atlassian Document Format
    description_adf = {
        "version": 1,
        "type": "doc",
        "content": [
            {
                "type": "paragraph",
                "content": [
                    {"type": "text", "text": ticket_data.get("description", "")}
                ],
            }
        ],
    }

    # Construct the payload for the JIRA issue
    payload = {
        "fields": {
            "project": {"key": JIRA_PROJECT_KEY},
            "summary": ticket_data.get("summary"),
            "description": description_adf,
            "issuetype": {"name": ISSUE_TYPE},
        }
    }

    # Convert the payload to a JSON string
    payload_json = json.dumps(payload)

    # Send a POST request to the JIRA API endpoint
    response = requests.post(
        API_ENDPOINT,
        data=payload_json,
        headers=headers,
        auth=HTTPBasicAuth(EMAIL, API_TOKEN),
    )

    # Check for a successful creation (HTTP 201 Created)
    if response.status_code == 201:
        return response.json()
    else:
        return {"error": f"Failed to create ticket: {response.status_code}"}


def handle_event(data):
    return create_jira_ticket(data)
```

**Where to Find Required Values**

* **JIRA\_DOMAIN** – Found in your Jira account URL. Example:\
  `https://mycompany.atlassian.net` → `JIRA_DOMAIN = "mycompany.atlassian.net"`
* **EMAIL** – Your Atlassian login email.
* **API\_TOKEN** – Create from [Atlassian API Tokens](https://id.atlassian.com/manage-profile/security/api-tokens).
* **JIRA\_PROJECT\_KEY** – Found in your project URL or next to the project name.
* **ISSUE\_TYPE** – Must be valid in your Jira project (Story, Task, Bug).

**Test Input**

```json
{
  "summary": "This is to test ticket creation",
  "description": "Created using External API"
}
```

Click **Test API**.

**A successful Output Example:**

```json
{
  "id": "10004",
  "key": "EX-5",
  "self": "https://mycompany.atlassian.net/rest/api/3/issue/10004"
}
```

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FFFQFn3xKRpZU1dmqvlTw%2Fimage.png?alt=media&amp;token=4eb9086a-ff07-496c-90b2-8b5857d7f26e" alt=""><figcaption></figcaption></figure>

**Activate the method**\
If the test passes, click **Save Changes**, return to the main API list, and enable the method by toggling **Connect** to green.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FIchI8ffgB2yv5oF2XkXc%2FScreenshot%202025-08-09%20164455.png?alt=media&amp;token=ac07c7b5-0d68-4170-83a4-c14bcba0c03d" alt=""><figcaption></figcaption></figure>

**Test with a character**\
Once activated, test the method in a conversation with your character.\
As seen in the screenshot below, the character successfully created a Jira ticket and returned the ticket key.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FThTEgrGnh2fHdyzAUmWe%2FScreenshot%202025-08-09%20164924.png?alt=media&amp;token=9467982f-3d96-4619-b029-6b4c38c6e76d" alt=""><figcaption></figcaption></figure>

***

## Limitations and Supported Environment

{% hint style="warning" %}
**Supported LLM Models**: GPT-4o, GPT-4o-mini, Claude-3.5, Claude 4.0
{% endhint %}

{% hint style="warning" %}
**Max Execution Time**: 5 seconds
{% endhint %}

{% hint style="warning" %}
**Python Version**: 3.11
{% endhint %}

{% hint style="warning" %}
**Libraries Available**: Standard library + requests
{% endhint %}

***

## Conclusion

By configuring the External API feature, you can transform your characters into powerful, data-driven assistants. From retrieving real-time weather information to creating Jira tickets directly from a conversation, the possibilities are vast. This integration capability enables highly interactive, automated, and intelligent workflows.


# External API limitations

Limits that apply to External API everywhere — supported models, Python runtime, libraries, input schema, and per-character caps.

These limits apply whether you configure External API in the [Playground](/api-docs/convai-playground/character-customization/external-api) or through the [API](/api-docs/api-reference/core-api-reference/character-crafting-apis/external-api).

## Supported models

External API only runs when the character's model can call tools. That depends on the path you use:

| Path                  | Supported models                                                                                                                                                                                                          |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Live API (WebRTC)** | OpenAI, Claude, and Gemini. Popular open-source models that support tools — including Grok and the DeepSeek family — work here too. Others may work if they support tool calling; check [models.dev](https://models.dev). |
| **gRPC**              | OpenAI, Claude, and Gemini family models only.                                                                                                                                                                            |

If the model doesn't support tools, the character still chats normally — it just won't call your External API functions.

## Runtime

| Rule                 | Detail                                                                           |
| -------------------- | -------------------------------------------------------------------------------- |
| Language             | Python only (`"language": "python"`)                                             |
| Runtime              | Python 3.11                                                                      |
| Standard library     | Allowed (`json`, `datetime`, `math`, `re`, `urllib`, and the rest of the stdlib) |
| Third-party packages | **`requests` only** for now                                                      |
| Source code size     | At most 400 lines                                                                |
| Entry point          | Must define `def handle_event(inputs):` (single argument; name is fixed)         |
| Return value         | JSON-serializable, usually a `dict`                                              |
| State                | No shared mutable state across calls — each run is independent                   |

Anything outside the standard library and `requests` fails at runtime.

## Input description

`input_description` is a **JSON string** (not a nested object in the API body). After parsing, it must look like:

```json
{
  "parameters": {
    "city": {
      "type": "string",
      "description": "Name of the city to look up"
    }
  },
  "required": ["city"]
}
```

| Rule                          | Detail                                            |
| ----------------------------- | ------------------------------------------------- |
| Top-level keys                | `parameters` and `required` are both required     |
| Parameter names               | `^[a-zA-Z_][a-zA-Z0-9_]*$`                        |
| Parameter fields              | Each parameter needs `type` and `description`     |
| Allowed types                 | `string`, `integer`, `boolean`, `object`, `array` |
| Extra keys under `parameters` | Not allowed                                       |

Keep descriptions concrete. The model fills arguments from that text, so vague wording produces bad calls.

## Character limits

| Rule                           | Detail                                                                                                           |
| ------------------------------ | ---------------------------------------------------------------------------------------------------------------- |
| Active functions per character | At most **128**                                                                                                  |
| Unlink vs delete               | `"status": "inactive"` only disconnects a character; delete removes the function from the account and every link |

## Related

* [External API (Playground)](/api-docs/convai-playground/character-customization/external-api) — UI setup and examples
* [External API (API reference)](/api-docs/api-reference/core-api-reference/character-crafting-apis/external-api) — create, list, link, unlink, delete


# Publish

Learn how to publish and share your Convai Experience with the public, selected users, or embed it on your own website.

## Introduction

The **Publish** page allows you to share your fully created and customized Convai Experience with the world or with a selected group of people. From here, you can configure the title, description, thumbnail, and visibility settings for your experience, as well as generate links for sharing.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FUSCY5YBYT3dhfZbByU0A%2Fimage.png?alt=media&amp;token=c447acf8-d634-4835-a1c0-9a2f9a692307" alt=""><figcaption></figcaption></figure>

***

## Publishing Options and Visibility Settings

The **Details** tab contains all the essential settings for publishing your experience:

* **Experience Link** – A direct link to your experience for easy sharing.
* **Experience Name** – The display name for your published experience.
* **Experience Description** – A short summary describing your experience.
* **Thumbnail** – By default, this uses the selected environment’s image, but you can upload a custom thumbnail.
* **Visibility Settings** – Controls who can see and interact with your experience:
  * **Public** – Your experience can be discovered and accessed by anyone on `x.convai.com`.
  * **Unlisted** – Only users with the direct link can access the experience.
  * **Private** – The experience is restricted to invited users only.
    * When set to **Private**, the **Share Privately** button becomes active. Here you can:
      * Enter the email address of the person you wish to invite.
      * Alternatively, share the experience link with the invited user to grant access.

***

## Embed Experience

The "Embed Experience" tab allows you to embed Convai Experiences directly into your own website. This feature makes it easy to integrate interactive experiences into custom platforms or applications.

{% hint style="danger" %}
Convai Pixel Streaming Embed is currently accessible only with the Professional Plan and above.
{% endhint %}

***

## Conclusion

The Publish page provides all the tools you need to control how your experience is shared, whether you want it available to the public, only to select individuals, or embedded directly into your website. By choosing the right visibility settings, you can ensure your experience reaches the right audience in the right way.


# MCP Servers

Connect your character to your tools and services through MCP servers for enhanced abilities.

{% embed url="<https://www.youtube.com/watch?v=Q4xLERLR2Eg>" %}

The [Model Context Protocol (MCP)](https://modelcontextprotocol.io) integration lets your character use tools from MCP servers during conversations. Your character can:

* Connect to any MCP-compatible server you host or subscribe to
* Discover the server's tools automatically at the start of each conversation
* Call tools mid-conversation and use the results in its replies

This lets your character look up data, search a knowledge source, or trigger an action in your systems, without a custom integration for each service.

### Prerequisites

Your MCP server must:

* Be reachable over **public HTTPS**. Local servers (stdio) and servers on private networks are not supported.
* Speak **Streamable HTTP** transport. SSE is supported as a legacy fallback.
* Authenticate with **static HTTP headers** (bearer token, API key), **OAuth**, or no auth.

### Add an MCP server

1. Open your character in the Playground and go to the **MCP and APIs** tab.
2. Click **Create Server**.
3. Fill in the server settings:

| Field         | Notes                                                                                                                                                                                                           |
| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Name          | Shown in the tool list. Short and descriptive.                                                                                                                                                                  |
| Description   | Optional, for your own reference.                                                                                                                                                                               |
| Server URL    | The full MCP endpoint, including the path, typically ending in `/mcp`.                                                                                                                                          |
| Protocol      | Streamable HTTP (recommended). Use SSE only if your server doesn't support Streamable HTTP.                                                                                                                     |
| Authorization | <p><strong>HTTP headers</strong>: name/value pairs sent with every request, e.g. <code>Authorization: Bearer \<token></code>.<br><strong>OAuth</strong>: sign in to the provider instead of entering a key.</p> |
| Timeout       | Maximum seconds to wait for a single tool call (1–300, default 30). Keep it low, since the character can't reply until the tool call finishes.                                                                  |

4. The **Available Tools** section connects to your server and lists the tools it exposes. This is also your connection test: an unreachable server or a wrong auth header shows its error here.
5. Uncheck any tools the character should not have. Only checked tools are offered to the LLM.
6. Turn on **Connected to this character** and click **Save**.

Servers are registered at the account level: the same server can be connected to multiple characters. **Disconnect** removes the server from the current character; **Delete** removes it from your account.

{% hint style="info" %}
Tools are discovered when a conversation session starts, not mid-session. After adding or editing a server, start a new session (reset the Playground chat session) before testing. All configuration changes apply from the next session.
{% endhint %}

### Connect a server with OAuth

Some MCP servers have no API key to paste: you authenticate by signing in to the provider, the same way you'd connect an app to your Notion or Linear workspace. For these, set the auth method to **OAuth** instead of entering headers.

1. In the server form's **Auth** section, select **OAuth**.
2. Click **Connect account**. A popup opens the provider's sign-in page; sign in and approve the requested access.
3. The popup closes itself and the status shows **Connected**, along with the scope the provider granted.
4. From here it's the same as any other server: review the tool list, turn on **Connected to this character**, and save.

For most servers that's the whole flow — Convai registers itself with the provider automatically.

#### Providers that require a registered app

Some providers (Google, and most enterprise identity systems) don't allow automatic registration; Connect fails with a client or registration error. For these:

1. Create an OAuth app in the provider's developer console.
2. Register `https://api.convai.com/mcp/oauth/callback` as the app's redirect/callback URL.
3. In the server form, expand **Provider requires a registered app?**, enter the app's **Client ID** (and **Client secret**, if the provider issued one), and click **Connect account**.

#### After you connect

Convai stores the provider's tokens encrypted and refreshes them automatically.

If the provider invalidates the grant (token expiry without renewal, a password change, an admin revoking the app), the status changes to **Reconnect needed** and the server's tools drop out of new sessions until you click **Reconnect**.

#### Who the character acts as

You, the character owner, connect the account once. Everyone who talks to the character acts through that one grant the same trust model as static headers.

{% hint style="warning" %}
For a **public** character, strangers can trigger tools under your connected account. Approve the narrowest scope the provider offers, and prefer connecting a dedicated account over your personal one.
{% endhint %}

#### Disconnecting

**Disconnect** revokes the grant with the provider and deletes the stored tokens; the server configuration stays, so you can reconnect later. **Delete** removes the server, its tokens, and its character connections. Switching the auth method back to headers also disconnects. Not every provider supports remote revocation. To be certain a grant is dead, also revoke it from the provider's own security settings.

### Compatible servers

Any MCP server that authenticates with static headers, with OAuth, or with no auth at all. This can be a server you build yourself with an MCP SDK ([Python](https://github.com/modelcontextprotocol/python-sdk), [TypeScript](https://github.com/modelcontextprotocol/typescript-sdk), FastMCP), or a hosted server that accepts an API key in a header, such as [Firecrawl](https://docs.firecrawl.dev/mcp), [Context7](https://context7.com), [GitHub](https://github.com/github/github-mcp-server) (personal access token), or an OAuth-based server such as [Notion](https://developers.notion.com/docs/mcp) or [Linear](https://linear.app/docs/mcp). Check the provider's docs for the endpoint URL and auth style.

#### How tool calls work in conversation

At session start, Convai connects to each attached server and fetches its tool list. If a server is down or slow, it is skipped after a short connection budget and the conversation starts without its tools; a server outage does not prevent your character from talking.

During the conversation, the LLM decides when to call a tool based on its name and description. When it does:

* **The reply waits for the tool call.** In voice, the character is silent while the tool runs. Keep tools fast, under a couple of seconds.
* If the call times out or errors, the character is told and responds accordingly.
* Several tools can be called in one turn; the calls run in parallel.

#### Writing tools that work well in voice

Descriptions are prompts, so one clear sentence about what the tool does and when to use it beats an exhaustive spec. Expose few tools rather than many (large tool sets slow the model and cause wrong picks). Return short results fast, and fail with a message ("no orders found for that email") rather than an empty result.

{% hint style="info" %}
Tool permissions are set before the conversation: the per-tool checklist is the approval surface. There are no per-call approval prompts, so only enable tools you're comfortable having called on any turn.
{% endhint %}

### Security and data

#### Credentials

Authorization header values are encrypted at rest and used only to connect to your server. OAuth tokens are encrypted at rest and refreshed automatically; to revoke access, use **Disconnect**.

#### Who can trigger tools

Tools run under the credentials you configured, no matter who is talking to the character.

{% hint style="warning" %}
If the character is **public**, anyone who converses with it can trigger tool calls under your credentials. Only attach tools that are safe to expose to strangers: read-only, rate-limited, free of sensitive data.
{% endhint %}

#### Data flow

Tool arguments (which can include things the user just said) are sent to your MCP server, and results enter the model's context. That data leaves Convai and is subject to your server's own logging and retention. Tool descriptions and results are untrusted text entering the model's prompt; a malicious server can attempt to steer your character. Connect only servers you control or trust.

### Troubleshooting

| Symptom                                           | Cause and fix                                                                                                                                                                                                          |
| ------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Load tools: 401 / unauthorized                    | The server rejected your auth header. Check the header name, the value format (many servers need the `Bearer` prefix), and that the token is active.                                                                   |
| Load tools: timeout / connection error            | The URL isn't a reachable MCP endpoint. Include the MCP path (typically `/mcp`); confirm the transport; confirm it's publicly reachable (`curl -i <url>` responds). Private/localhost URLs are rejected; use a tunnel. |
| Load tools: 0 tools                               | Connection worked but the server registers no tools. Check the server side.                                                                                                                                            |
| Tools don't appear in conversation                | The session started before you saved. Start a new session. If it persists: check the Connected switch is on and at least one tool is checked.                                                                          |
| Character says the tool failed                    | Timeout (default 30 s), a server-side error (check your server logs for the `tools/call`), or an expired credential (re-run Load tools; a 401 there confirms it).                                                      |
| "Stored credentials cannot be decrypted"          | Saved header values can no longer be read. The configuration is intact; re-enter the values and save.                                                                                                                  |
| Tool ignored or misused                           | Sharpen the tool description, reduce the number of enabled tools, add prompt guidance ("for order questions, use `lookup_order`"), and trim long results server-side.                                                  |
| Connect account: nothing happens                  | Your browser blocked the popup. Allow popups for convai.com and click Connect again.                                                                                                                                   |
| Connect fails with a registration or client error | The provider doesn't allow automatic registration. Follow Providers that require a registered app.                                                                                                                     |
| Status shows "Reconnect needed"                   | The provider invalidated the grant (expiry, password change, admin revocation). Click **Reconnect** and approve again; tools return from the next session.                                                             |


# Avatar Studio Experiences

Create intelligent 3D AI avatars directly in your browser — no downloads, no code, fully customizable.

## Introduction

Convai’s Avatar Studio is a user-friendly platform that allows anyone to create intelligent, high-quality 3D conversational avatars — right from your web browser.

{% embed url="<https://youtu.be/-08pVVY5yQo>" %}

***

## **What You Can Do**

With a simple interface, you can design and deploy fully interactive avatars that:

* Speak and respond via **voice and text**
* Perform **intelligent animations**
* Adapt to **different virtual environments**
* Are **fully customizable**
* Optionally use **vision-based input** to "see" the user and react with natural, personalized responses, enhancing realism

***

## Who It’s For

Avatar Studio is perfect for:

* **Creators** and **developers** building digital characters
* **Educators** creating engaging learning experiences
* **Brands** looking to enhance digital events
* **Game designers** needing lifelike NPCs
* Anyone interested in AI-powered **interactive storytelling**

Whether you're creating an NPC for a game or a digital host for a virtual event, Convai’s Avatar Studio helps you bring your characters to life—quickly and easily.

***

## Key Features

* **Conversational AI**\
  Avatars engage in natural, human-like voice or text conversations.
* **High-Quality Metahuman NPCs**\
  Realistic 3D Metahuman avatars with high-fidelity lip-sync, natural eye-blinking, and intelligent animations.
* **Runs Entirely on the Browser**\
  No downloads, installations, or GPU power needed — just open and start creating.
* **Intelligent Actions and Animations**\
  Avatars react with gestures such as waving, thinking, and expressing emotions based on the conversation context.
* **Proactive & Agentic AI Characters**\
  Characters can initiate conversations and act autonomously in response to their environment.
* **Vision-Based Interaction**\
  Avatars can perceive users via camera input and respond with contextually appropriate and human-like reactions.
* **High-Quality Backgrounds**\
  Choose from immersive environments to place and enhance your characters.
* **Total Customization**\
  Fully personalize the avatar’s appearance, voice, actions, environments, branding and more.


# Customizing Your Avatar

Learn how to visually and behaviorally personalize your Convai avatar using the Avatar Studio configurator.

## **Overview**

Once your character is created, you can start customizing how they look, move, and interact using the **Avatar Studio**.

{% embed url="<https://youtu.be/-08pVVY5yQo>" %}

## What You Can Customize

Here’s what you can do inside the Avatar Studio:

* **Choose a Sample Avatar,**

  Pick from a library of ready-to-use, high-fidelity avatars.
* **Customize Appearance**\
  Modify facial features, clothing, hairstyles, and other visual elements to reflect your character’s identity.
* **Upload Your Own Avatars**\
  Prefer a unique design? Upload your own 3D avatar models for full control over their look.
* **Set Up Intelligent Animations**\
  Configure gestures like waving, nodding, reacting, and thinking — all triggered contextually during conversations.
* **Select a Virtual Environment**\
  Place your avatar in immersive digital scenes that match the tone and use case of your experience.
* **Adjust Interaction Behavior**\
  Fine-tune how your avatar communicates — such as their speaking style, tone, and user engagement preferences.
* **Device & Branding Adaptation**\
  Customize how the avatar interface behaves across different devices and align it with your brand’s visual identity.

After you finish customizing, simply **save and publish** your avatar to bring it into your character’s conversations.


# Configure Avatar

Learn how to choose, customize, or upload avatars in Avatar Studio.

Once you enter the **Avatar Studio**, you can define exactly how your avatar looks and behaves. Here’s how to get started:

## **Choosing a Sample Avatar**

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXclKo7GFdgSfSG9bA5Aj9dDWyeTuZlnw6WKlECGzRIZATcN3xcahU89bB3OqaKh4ifzWuZrlnNgd7sqXXnAowO7IyqY4TpDdYETKiwYwPzFtkGEHAb1LYobYuIE1wT2FzNJJB8n?key=UBmSq8Y7gM25yDvVwPYY7g" alt=""><figcaption></figcaption></figure>

You can start by selecting a high-quality S**ample Avatar** from Convai’s library. These are designed to cover a wide range of character types and use cases.

* Browse the available avatars by scrolling through the list.
* Click on the one you want to use.
* That avatar will be instantly applied to your character.

## Creating a Custom Avatar

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfi7OoBu7uypw64P6rHgM4HqijDsUGke__z7uSK8KbjK9w7oUDXQNx1B_s883DggaFZmtPiQTVk1aNvzG9Fx-J88hMUGbVtgB3bI3xbfLXrDIw5nsB8SNSdt7gRbmky79mY6Q8Apw?key=UBmSq8Y7gM25yDvVwPYY7g" alt=""><figcaption></figcaption></figure>

If you want something more unique, you can create a custom avatar using the built-in editor.

1. Go to the **“Craft your own”** tab.
2. Click the **plus icon (+)** to start creating a new custom avatar.
3. Give your avatar a **name**.
4. Customize features such as:
   * **Facial features**
   * **Hairstyle & hair color**
   * **Skin tone & texture**
   * **Outfits & accessories**
   * **Age appearance**
5. Under the **“Brand”** section:
   * Use sliders to apply your logo on supported clothing items.
   * Make sure **“Display logo on cloth”** is enabled under Interface Settings.

This allows for highly personalized avatars that align with your branding and narrative needs.

## **Uploading Your Own Avatar**

If you'd like to upload a custom avatar model, please follow our detailed guide here:

{% content-ref url="/pages/3gF4TWlNAR7gdcrwFIfb" %}
[Uploading Avatars](/api-docs/no-code-experiences/avatar-studio-experiences/customizing-your-avatar/configure-avatar/uploading-avatars)
{% endcontent-ref %}


# Uploading Avatars

{% hint style="warning" %}
Currently, only Metahuman and Reallusion avatars are supported for upload.
{% endhint %}

{% content-ref url="/pages/7RiOQDqXiSshcIxvesJU" %}
[Metahuman Avatars](/api-docs/no-code-experiences/avatar-studio-experiences/customizing-your-avatar/configure-avatar/uploading-avatars/metahuman-avatars)
{% endcontent-ref %}

{% content-ref url="/pages/KaEFOuvtwU0O5irCjn9v" %}
[Reallusion Avatars](/api-docs/no-code-experiences/avatar-studio-experiences/customizing-your-avatar/configure-avatar/uploading-avatars/reallusion-avatars)
{% endcontent-ref %}


# Metahuman Avatars

Upload custom Metahuman characters from Unreal Engine to Avatar Studio using the Convai Asset Uploader.

## Introduction

This guide walks you through uploading **custom Metahuman avatars** to **Avatar Studio** using the **Convai Asset Uploader**. You'll generate a new project tailored for Metahumans, import your Metahuman asset, configure it, and finally upload it using Convai’s built-in tools.

## Prerequisites

Before you begin:

* Create your project using the [**Convai Asset Uploader**](/api-docs/plugins-and-integrations/asset-uploader), and answer **`Y`** when asked if you’re using a Metahuman.
* Ensure you have a downloadable Metahuman available via **Quixel Bridge**.

***

## Step-by-Step Guide

### 1. Open the Project

Navigate to the folder where your project was created. Double-click the `YourProjectName.uproject` file to open it in Unreal Engine.

***

### 2. Add a Metahuman via Quixel Bridge

* Go to **Window > Quixel Bridge**.
* In Bridge, select **Metahumans** from the left-hand menu.
* Pick a Metahuman and click:
  * **Download** (if not already downloaded)
  * Then **Add** to include it in your project.

***

### 3. Locate and Open the Character Blueprint

After importing:

* Go to `Content/Metahumans/<CharacterName>/`.
* Open the Blueprint: `BP_<CharacterName>`

  > ⏳ This may take some time to load.

***

### 4. Fix Compile Errors

If you see compile errors:

* In the bottom-right, click **Enable Missing** under any **Missing Plugins** or **Missing Project Settings** notices.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FPGbyMAYA7w4tL6ymhDby%2FScreenshot%202025-04-18%20224336.png?alt=media&amp;token=0d776a88-d1e4-4bde-9315-9c0ea0d17e22" alt=""><figcaption></figcaption></figure>

* Click **Restart Now** when prompted.
* Reopen the Blueprint and ensure it compiles successfully.

***

### 5. Prepare the Asset for Upload

1. Locate the folder:\
   `Plugins/<random code> Content/`\
   (e.g., `Plugins/AHK3LNKVC7FZA3I5JG3V Content/`)
2. Move the entire `Content/Metahumans/` folder into this directory.
   * Use **Move Here** to complete the action.
   * The final structure should mirror what’s shown in the screenshot.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FCc1iimc3DM3WggkxB6zp%2FScreenshot%202025-04-18%20231010.png?alt=media&amp;token=fb310253-405f-4a35-8062-c3ed7df33425" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
This folder determines what gets packaged and uploaded. Make sure everything is placed correctly.
{% endhint %}

***

### 6. Open the Asset Uploader Tool

* Navigate to `Content/Editor/AssetUploader`.
* Right-click on `AssetUploader` and select **Run Editor Utility Widget**.

***

### 7. Select the Character Asset

* Navigate to the `Plugins/<random code> Content/Metahumans/<CharacterName>/` directory.
* Select the `BP_<CharacterName>` Blueprint.
* Then, in the **Asset Uploader** window, click **Pick Asset**.

***

### 8. Capture a Thumbnail

* In the Asset Uploader window, click **Capture Thumbnail** to generate a preview image for your avatar.

***

### 9. Verify Functionality Before Upload

1. Drag `BP_<CharacterName>` into the Level.
2. Select the character and locate `BP_ConvaiChatbotComponent` in the **Details** panel.
3. Input a test **Character ID**.
4. Press **Play** and confirm:
   * Animations are working
   * Lip sync is functional
   * Character behaves as expected

{% hint style="info" %}
Before uploading, review the [MetaHuman hair and skin appearance guidelines](/api-docs/no-code-experiences/avatar-studio-experiences/customizing-your-avatar/configure-avatar/uploading-avatars/metahuman-avatars/metahuman-hair-and-skin-appearance-guidelines) to check the groom and materials in Avatar Studio's target rendering profile.
{% endhint %}

***

### 10. Upload the Avatar

* In the Asset Uploader, click **Create Asset**.
* This will:
  * Package the avatar for Win64
  * Upload it to Avatar Studio

Monitor the **Output Log**:

* Look for `Package completed`
* Then wait for `Uploaded Asset`

{% hint style="warning" %}
If there’s an error during packaging, check the logs and share them on the [Convai Developer Forum](https://forum.convai.com/) for support.
{% endhint %}

{% hint style="info" %}
To delete a previously uploaded asset, open AssetUploader and click **Delete**.
{% endhint %}

***

## Performance considerations and limitations

{% hint style="warning" %}
Avatar Studio has a fixed real-time CPU, GPU, and memory budget. Convai's sample avatars are optimized for this environment, but custom MetaHumans are uploaded with the assets and logic you provide. A successful upload does not guarantee smooth hosted performance.
{% endhint %}

There is no single asset limit that suits every character. Performance depends on the combined cost of the avatar, animation, background, and custom behavior. Review the complete experience:

* **Hair and grooms:** Hair and facial grooms can be expensive to render. Keep strand, curve, point, and group complexity only as high as the intended look requires. Remove unused groom components, disable simulation where it is not needed, and use shadow and material features carefully. See Epic's [groom performance guidance](https://dev.epicgames.com/documentation/unreal-engine/groom-scalability-and-performance-with-unreal-engine).
* **Geometry and accessories:** Remove hidden, duplicate, or unused geometry and components. Keep custom clothing, accessories, cloth, and deformation complexity appropriate for what the learner will actually see.
* **Textures and materials:** Use texture resolutions appropriate for the intended framing, and remove unnecessary material slots or expensive shader features. Do not rely on ray tracing- or Lumen-specific appearance; review hair and skin materials under the hosted lighting and rendering setup.
* **Blueprints and animation:** Prefer event-driven Blueprint behavior. Avoid unnecessary work on **Event Tick**, per-frame searches or allocations, and components that keep ticking when they are not in use. Limit simultaneous animation, physics, control-rig, and procedural systems to those needed for the current interaction.
* **Check the hosted experience:** After uploading, use the experience through Avatar Studio on the website. Check loading and interaction responsiveness, animation smoothness, lip-sync and audio timing, and visual consistency.

If performance is lower than expected, simplify one costly feature at a time and upload again. Start with the groom, followed by geometry, materials, textures, and custom Blueprint effects.

***

## Accessing the Avatar

1. Go to [Avatar Studio](https://convai.com/)
2. Open the **Upload Your Custom Avatar** section
3. Your Metahuman will appear, ready for use.

***

## Summary

Using the Convai Asset Uploader, uploading custom Metahuman avatars is quick and reliable. With proper setup and a few clicks, your characters are live in Avatar Studio and ready for real-time AI interaction.


# MetaHuman Hair and Skin Appearance Guidelines

Review groom, hair, and skin settings for uploaded MetaHumans under Avatar Studio's target rendering profile.

Avatar Studio uses a supplied target rendering profile with Lumen and hardware ray tracing disabled. Tune and approve the character in that profile, because values chosen under a different renderer or lighting setup may not produce the same result.

{% hint style="info" %}
The examples on this page show one character under one lighting setup. They demonstrate the effect of each control and are not recommended default values. Change one setting at a time and judge the result on your own character.
{% endhint %}

### Before editing

* Create character-specific material instances and duplicate shared groom assets before changing them. Avoid editing shared master or plugin assets directly.
* Keep a reference image from the target camera and lighting so you can compare changes consistently.
* Use these settings for renderer compatibility and appearance calibration. They do not replace the performance guidance in the parent upload guide.

### Groom rendering settings

![Groom Hair Attributes showing Use Hair Raytracing Geometry, Voxelize, Use Stable Rasterization, and Hair Shadow Density controls.](https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FoQdcQeEza4Y5gEtY6YzQ%2Fgroom-attributes.png?alt=media\&token=c4cf59a0-064f-4867-b71d-5d49f8d3af29)

* **Use Hair Raytracing Geometry:** Set this to **Off** for the supplied Convai target profile. This option is relevant only when hardware ray tracing is enabled; otherwise it provides no target-renderer benefit.
* **Voxelize:** Keep this **On** in the supplied profile because it supports groom shadows and environment occlusion. **Hair Shadow Density** controls the voxel representation and will not have its intended effect when Voxelize is off.
* **Use Stable Rasterization:** Evaluate this for each groom while the character and camera are moving. Enable it when small or scattered strands alias or flicker, then check that it does not make the hair look unnaturally thick.
* **Hair Shadow Density:** Tune the voxelized shadow and transmission response under the target lighting. Treat the value as character-specific.

### Hair material settings

![Hair material parameter panel showing melanin, roughness, variation, specular, and white-hair controls.](https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FveXZThM4BY9iN88YGBSU%2Fhair-material-controls.png?alt=media\&token=a2da66ad-6902-41b2-86a9-50eafac59cfd)

{% hint style="warning" %}
The control screenshot shows where the parameters are located. Its displayed values are not recommendations.
{% endhint %}

* **Melanin** controls pigment and perceived hair color. Higher values generally produce darker hair.
* **Roughness** controls the breadth and softness of the hair highlights.
* **Spec0, Spec1, SpecEdge, and SpecFront** control the material's highlight lobes and directionality. Adjust them after establishing the target lighting and roughness.
* **Melanin Variation Fine and Rough** add color variation. Use them conservatively unless stronger multitone clumping is intentional.
* In the supplied material version, enable the **WhiteMelaninHigh** and **WhiteMelaninLow** parameter overrides before tuning **White Amount** for white or grey hair.

#### Melanin example

{% columns %}
{% column width="50%" %}
**Lower melanin in this example**

![Example MetaHuman with lower melanin, producing very light hair.](https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fq130d2WSC44iQZ3z5Uf3%2Fhair-melanin-lower-example.png?alt=media\&token=2da352ae-c80b-4b2a-b004-b2cf31d38de4)
{% endcolumn %}

{% column width="50%" %}
**Higher melanin in this example**

![The same MetaHuman with higher melanin, producing darker brown hair.](https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FzfJHcqFBvFSjyp7aVzoQ%2Fhair-melanin-higher-example.png?alt=media\&token=389e92fb-bfb9-4a46-b0ac-85cda935945e)
{% endcolumn %}
{% endcolumns %}

The only intended comparison here is the visible change in pigment. Choose a value for the character and target lighting rather than copying the example.

#### Roughness example

{% columns %}
{% column width="50%" %}
**Lower roughness in this example**

![Example hair with lower roughness and sharper, brighter highlights.](https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FxxCHLuV5tBNNQpejMSmA%2Fhair-roughness-lower-example.png?alt=media\&token=92318ef2-0543-46b2-9a26-232b29482b4f)
{% endcolumn %}

{% column width="50%" %}
**Higher roughness in this example**

![The same hair with higher roughness and broader, softer highlights.](https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FIIHOFlvvmpNktiyudDN3%2Fhair-roughness-higher-example.png?alt=media\&token=69afc5e6-1cb9-423e-82c4-c634255cfc1e)
{% endcolumn %}
{% endcolumns %}

If highlights remain too strong after adjusting roughness, also review the specular controls, lighting, and exposure.

### Skin material settings

![Skin material parameter panel showing roughness and specular controls.](https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2FDdc7aV9AGDhT6IL4DVfH%2Fskin-material-controls.png?alt=media\&token=3e06448c-f5eb-4a7e-a66b-489e70b2414c)

{% hint style="warning" %}
Material names and available controls can differ between MetaHuman and project versions. Use the controls in the supplied project and edit roughness and specular separately.
{% endhint %}

Renderer, reflection, lighting, and exposure differences can change the perceived skin gloss. Revalidate the material in the target profile instead of copying values from another renderer.

#### Skin roughness example

{% columns %}
{% column width="50%" %}
**Lower roughness in this example**

![Example MetaHuman skin with lower roughness and a glossier appearance.](https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2F6BOMuzHAf1Jg8p89zOxq%2Fskin-roughness-lower-example.png?alt=media\&token=2ce4b9b5-7582-4887-b61c-5553f6b895c9)
{% endcolumn %}

{% column width="50%" %}
**Higher roughness in this example**

![The same MetaHuman skin with higher roughness and a less glossy appearance.](https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2F8fcqrgefwaxaU0ddQ4rD%2Fskin-roughness-higher-example.png?alt=media\&token=24c5f95e-544f-4456-b659-63cff2f9a7b0)
{% endcolumn %}
{% endcolumns %}

### Final review

Before approving the character:

* Check the groom while the character and camera are moving.
* Review hair depth, color, and highlights under the intended lighting.
* Check the face for excessive or insufficient gloss.
* Change one control at a time so its effect remains clear.
* Review the final character in Avatar Studio before publishing it.


# Reallusion Avatars

Upload custom Reallusion characters from Unreal Engine to Avatar Studio using the Convai Asset Uploader.

## Introduction

This guide explains how to prepare and upload **Reallusion-based avatars** using the **Convai Asset Uploader**. You’ll import your Reallusion character and animations, apply Convai’s animation and lipsync systems, and then upload your avatar to Avatar Studio using the built-in AssetUploader tool.

***

## Prerequisites

Make sure you have the following ready:

* A project created with the [**Convai Asset Uploader**](/api-docs/plugins-and-integrations/asset-uploader), where you answered **`N`** to “Are you using a Metahuman?”
* A custom Reallusion character exported and ready for import

***

## Step-by-Step Guide

### 1. Open the Project

Navigate to your project directory and open the `.uproject` file to launch it in Unreal Engine.

***

### 2. Import Reallusion Character & Animations

Follow this [video tutorial](https://youtu.be/UyxNliF8LKU?feature=shared) to import your Reallusion assets:

* **\[00:00 – 07:25]**: Import your character and animations
* **\[07:50 – 08:20]**: Create a new Blueprint Class for your character

***

### 3. Connect Convai Animations

Now we’ll bind the correct animation logic to your character.

We’ve already added the necessary Animation Blueprint for you:

* Go to `Content/ConvaiReallusion/`
* Locate and assign the **ConvaiReallusion Animation Blueprint** to your character’s Skeletal Mesh

{% hint style="info" %}
This blueprint ensures that your Reallusion character plays proper idle/talking animations in sync with Convai interactions.
{% endhint %}

* Refer to the [tutorial](https://youtu.be/UyxNliF8LKU?feature=shared) for this step: **\[10:12 – 12:48]**

***

### 4. Add FaceSync for Lipsync

To enable lipsync:

* Add the `FaceSync` component to your character’s Blueprint
* See how in the same [video](https://youtu.be/UyxNliF8LKU?feature=shared): **\[12:48 – 12:56]**

***

### 5. Set Correct Rotation

Reallusion characters typically face the wrong direction by default. Fix this by:

* Opening the character Blueprint
* Selecting the **SkeletalMesh** component
* Set the **Z Rotation** to `-90` in the **Details** panel

***

### 6. Prepare Files for Upload

1. Go to:\
   `Plugins/<random code> Content/`\
   (e.g., `Plugins/AHK3LNKVC7FZA3I5JG3V Content/`)
2. Drag and **Move** both of the following folders into this directory:
   * Your character’s folder (containing the Blueprint and animations)
   * `Content/ConvaiReallusion/` (contains the animation blueprint)
   * The final structure should mirror what’s shown in the screenshot.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fzf59uT7ltyho3f8eFs74%2FScreenshot%202025-04-19%20143603.png?alt=media&amp;token=b62801da-596f-4d15-beea-e7f9e2efd49c" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
This folder determines what gets packaged and uploaded. Make sure everything is placed correctly.
{% endhint %}

***

### 7. Open the AssetUploader Tool

* Navigate to `Content/Editor/AssetUploader`
* Right-click and select **Run Editor Utility Widget**

***

### 8. Select the Character Asset

* Navigate to `Plugins/<random code> Content/YourCharacterFolder/`
* Select your character’s **Blueprint Class**
* Then, in the Asset Uploader window, click **Pick Asset**

***

### 9. Capture a Thumbnail

Click **Capture Thumbnail** to create a preview image that will appear in Avatar Studio.

***

### 10. Verify Before Upload

Before uploading, do a quick functional test:

1. Drag the character into your Level
2. Select it and locate the `BP_ConvaiChatbotComponent` in the **Details** panel
3. Paste in a test **Character ID**
4. Press **Play** and verify:
   * Animation is working
   * Lipsync is functioning
   * Character is correctly positioned and oriented

***

### 11. Upload the Avatar

* In the Asset Uploader, click **Create Asset**
* This triggers:
  * Packaging the asset for **Win64**
  * Uploading to **Avatar Studio**

Monitor the **Output Log**:

* Wait for `Package completed`
* Then look for `Uploaded Asset`

{% hint style="warning" %}
If there’s an error during packaging, check the logs and share them on the [Convai Developer Forum](https://forum.convai.com/) for support.
{% endhint %}

{% hint style="info" %}
To delete a previously uploaded asset, open AssetUploader and click **Delete**.
{% endhint %}

***

## Accessing the Avatar

1. Visit [Avatar Studio](https://convai.com/)
2. Go to **Upload Your Custom Avatar**
3. Your Reallusion character will now be available for selection and use

***

## Summary

Using the Convai Asset Uploader, uploading Reallusion avatars is quick and reliable. With proper setup and a few clicks, your characters are live in Avatar Studio and ready for real-time AI interaction.


# Face Filter

Use the Face Filter feature to make your avatar resemble a specific person based on a photo.

{% hint style="danger" %}
The Face Filter feature is available only with the Scale plan and above.
{% endhint %}

## **What is Face Filter?**

Face Filter allows you to personalize your avatar’s appearance to look like a specific person using a reference photo.

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdx4TEElrRxiSaJ4qiy6PfujUgoiYgNUJWdhH58mmOoPtM30xeoz1EBMranPR-Sslf9nf-nT59LUhM8S5P_jq_aYm71bxM2o4gid8GMV7-hCgLMB8-2THA3Y-y563gShsMysuoG?key=UBmSq8Y7gM25yDvVwPYY7g" alt=""><figcaption></figcaption></figure>

## **How to Use It?**

### **1. Enable Face Filter**

Toggle on the **Face Filter** option inside the avatar customization panel.

### **2. Upload an Image**

Click **“Upload your own image”** to add a photo reference.

### 3. Apply the Image

Select the uploaded image by clicking on it. Your avatar’s face will automatically morph to resemble the person in the photo.

### **4. Manage Images**

* To delete an image, click on it and select **“Delete image”**.
* You can upload **multiple images** to try different looks.

With Face Filter, you can achieve even more lifelike, personalized characters — perfect for storytelling, training simulations, or representing real individuals in virtual settings.


# Environment

Choose from immersive 3D and Solid environments to place your avatar in the right setting.

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfVJWNa68a7hx-ZmDgrOPzz4FexxrzkTH2E4sLfycPeRCa3SYBFBJxrHfsofMOdvRcrlmC-TaFQu_amAUOYTBnZl9XPKFLSuEZoTEFDiRm0fDgo2xCLoY-7igdmIz86h1dnrcupcw?key=UBmSq8Y7gM25yDvVwPYY7g" alt=""><figcaption></figcaption></figure>

## **Bring Your Character to Life with the Right Setting**

Selecting an environment helps anchor your avatar in a scene that matches your use case — whether it’s professional, playful, or futuristic.

You can choose from a variety of **immersive 3D and Solid environments**, including:

* A sleek, **modern office**
* A **sci-fi room** with futuristic vibes
* A warm and inviting **cozy lounge**
* A minimal and practical **kiosk-style backdrop**

These environments serve as the **visual context** for your avatar’s interactions, making conversations feel more realistic and engaging for your audience.

{% hint style="success" %}
Match the environment with the personality or purpose of your character.
{% endhint %}


# Uploading Scenes

Upload your custom Unreal Engine Levels to Avatar Studio with Convai Modding Tool.

## Introduction

This guide explains how to upload **custom scenes (Levels)** from Unreal Engine 5.3 to **Avatar Studio** using the **Convai Modding Tool**. Whether you’re building rich environments or AI-driven stages, you’ll learn how to prepare, tag, and upload them in just a few steps.

***

## Prerequisites

Make sure you have:

* Created your project using the [**Convai Modding Tool**](/api-docs/plugins-and-integrations/asset-uploader)
  * Selected **`1`** when asked whether you are uploading a Scene or Avatar
* A fully prepared and tested Unreal Engine Level (with all necessary assets)

***

## Step-by-Step Guide

### 1. Open the Project

Open the project created by the Modding Tool by double-clicking the `.uproject` file.

***

### 2. Import the Scene

Import your custom Level and all required assets (meshes, environment packs, etc.) into your project.

Make sure the Level is fully playable and doesn’t contain any broken references.

***

### 3. Editor (Player) Start Point

To set the spawn location of the editor (Player) in the Level

1. Place an **Actor** in your Level
2. Move it to the desired **spawn location**
3. In the **Details** panel, set the **Tag** of the Actor to:

```
EditorSpawn
```

{% hint style="warning" %}
This tag is essential. It helps the system know where to place the editor (player) once the scene is loaded in Avatar Studio.
{% endhint %}

***

### 4. Prepare Files for Upload

1. Navigate to:\
   `Plugins/<random code> Content/`\
   (e.g., `Plugins/AHK3LNKVC7FZA3I5JG3V Content/`)
2. Drag and **Move** your Level’s folder and its dependencies into this directory.

{% hint style="info" %}
This ensures the Level and all its references are included during packaging and upload.
{% endhint %}

***

### 5. Open the AssetUploader Tool

* Go to `Content/Editor/AssetUploader`
* Right-click and choose **Run Editor Utility Widget**

***

### 6. Select the Level Asset

* In the **Content Browser**, go to the directory inside\
  `Plugins/<random code> Content/`
* Select your **Level asset**
* Return to the **Asset Uploader** window and click **Pick Asset**

***

### 7. Capture a Thumbnail

Click **Capture Thumbnail** to generate a preview image that will appear in Avatar Studio.

***

### 8. Upload the Scene

Once everything is ready, click **Create Asset** in the Asset Uploader.

The process includes:

* **Packaging** the Level for Win64
* **Uploading** the Level to Avatar Studio

Check the **Output Log**:

* Look for `Package completed`
* Then `Uploaded Asset` to confirm successful upload

{% hint style="warning" %}
If there’s an error during packaging, check the logs and share them on the [Convai Developer Forum](https://forum.convai.com/) for support.
{% endhint %}

{% hint style="info" %}
To delete a previously uploaded asset, open AssetUploader and click **Delete**.
{% endhint %}

***

## Accessing the Scene

1. Visit [Avatar Studio](https://convai.com/)
2. Open the **Upload Your Custom Scene** section
3. Your Level will appear in the list, ready for testing or integration with avatars

***

## Summary

Uploading custom Levels allows you to create rich environments for your AI avatars in Convai Sim. The Modding Tool automates most of the setup — just make sure to set your spawn point and move your assets to the correct folder.


# Lighting Adjustments

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcyfUv4zNGTwrmoAUK1wrsBcK0R0AkHrzGC4tT6lqcjQQimCX8p9vxV0o8h0TFIXEO_XNJHsU2BSvQZp94P5id_fAVX87vmIYCx_ebVFJFhbYTvCnQ6vGiYdcW00VLXtqRJivQ3?key=UBmSq8Y7gM25yDvVwPYY7g" alt=""><figcaption></figcaption></figure>

## Set the Right Mood with Lighting

Lighting plays a key role in how your avatar looks and feels within the environment. It affects not only visibility, but also the overall **tone and atmosphere** of the scene.

Here’s how you can adjust lighting for your avatar:

* **Choose a Lighting Preset**\
  Use the dropdown menu to select from several **preset lighting setups.**
* **Adjust Lighting Power**\
  Use the **power level slider** to fine-tune the light.

{% hint style="success" %}
Subtle lighting changes can make a big difference in realism — experiment to see what best fits your character and scene.
{% endhint %}


# Animation & Expression Settings

Customize your avatar’s expressiveness with facial and body animations, emotions, and intelligent actions.

## Make Your Avatar Come Alive

Convai’s Avatar Studio lets you fine-tune how expressive your avatar is — from subtle facial expressions to full-body gestures and smart actions.

## **Facial & Body Animation**

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcHe24cCMCm8bSddWh2X-kQZrJ9naojCb0sU292DyBN8hcXc3a4zkISO97CLJ3O3bfhAZfXLfVlwN9v-OvWZBYlIiBF-dFhZ8HIqFh7-2adYZtDLA8T88LEVhUZFUvOWW7aQqWIMQ?key=UBmSq8Y7gM25yDvVwPYY7g" alt=""><figcaption></figcaption></figure>

Use sliders to define the intensity of animations:

* **Facial Animation**
  * Range: **-1 to 1**
  * Lower values result in **minimal expressiveness**, while higher values make your avatar more **emotionally responsive**.
* **Body Animation**
  * Range: **Low to High**
  * A low setting keeps the avatar **more static**, while high adds **dynamic hand and body movements** for livelier interaction.

## **Initial Facial Expression**

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfMnjt0UNSvXZBBnmI9mHDxR8JVsCyHR97F9wm_zZaASq8SFaTWSwlio4FBw8B80dxo7KlAoxnso7DS_SCYjizstBZZRyyeinQA-xhrgu6a_6bpx63dUmaeHo_Ug9SLZWWePjcyOg?key=UBmSq8Y7gM25yDvVwPYY7g" alt=""><figcaption></figcaption></figure>

* **Camera Focus Toggle**\
  Enable or disable eye contact with the user by toggling **camera focus**.

You can define how your avatar appears at the start of an interaction:

* **Enable or Lock Expressions**\
  Use toggles to either:
  * Allow expressions to change during conversation
  * Lock the avatar into a specific expression
* **Select an expression** from the dropdown:
  * Joy
  * Trust
  * Fear
  * Surprise
  * Sadness
  * Disgust
  * Anger
  * Anticipation
  * And more...

## **Custom Actions**

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfGgtVHsM6OSltBs_dxEZGYBSxwn1osw6i7yygz8I8evCkj2fZ5DT6Q3_psB-Uc2Xw-FWM8rgwxUmm91brN9cl_BYW1QWqGoGyPNZVKG0kyKUs3T8t-5ImhPsf-ILT96uux5_h0?key=UBmSq8Y7gM25yDvVwPYY7g" alt=""><figcaption></figcaption></figure>

Give your avatar intelligent behaviors during interactions — like waving hello or thinking.

**How to Add a Custom Action:**

1. Click **“Add a new action”**.
2. Toggle **Eye Focus** on or off.
3. Click **“Select animation”**.
4. Choose from available animations (e.g., **Wave Animation** for greeting).
5. Name your action (e.g., **Waves Cheerfully**).
6. Click **“Preview Animation”** to test how it looks.


# Interface Configuration

Tailor the visual and functional interface of your avatar experience to match your device, context, and brand needs.

## Customize Your Avatar Experience Interface

Convai’s Avatar Studio provides a variety of settings to adapt the interface layout, interaction mode, and branding for different platforms and use cases.

## **Screen Resolution Presets**

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeopfdKBSd2R0hosYMyLvuqON68sA7ho5BsjA_RIX9OEhbCKA1-mdvsxJ8s1hoTeueR6ZZBfZTAHZJtIBVTBIhZStTxEG9N-uzNFFnFQMXmvifxcGPAtoG4176IispBJmvoZDSrfg?key=UBmSq8Y7gM25yDvVwPYY7g" alt=""><figcaption></figcaption></figure>

Choose the layout that best fits your deployment:

* **Desktop**
* **Tablet**
* **Mobile**
* **Kiosk**

This ensures optimal visual presentation across different screen types.

***

## **Chatbox Settings**

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeg4Zm2pUYTigRU6G1DCPKfAUxM-Q5wSuLhHKjp7A05-HgaXArBvGKU4GnLJ76LGI1LVyWevyNo-yRDkAO1Q-WSp5-Y-UxpbtYKPZPrW5LrZb_5OOkfG17DmIuHbdVk6svV4PZs?key=UBmSq8Y7gM25yDvVwPYY7g" alt=""><figcaption></figcaption></figure>

Enable or customize the chat interface as needed:

* **Chatbox Type**\
  Select your preferred chatbox style from available templates.
* **Disable Chat Interface**\
  Use the toggle to hide the chatbox completely if not needed.
* **Push-to-Talk Mode**\
  Enable push-to-talk using the toggle for voice-activated interactions.

***

## Character Vision Through Webcam

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcqySmwAcvYEq9FtW7ZBtnNstAC295LVYcZ6GodEs0qK98drPWsYK_m-1fsRlqPHS_gXST3yKhbizQAWUdvfZvoyPildTf31ZXB7tlpIdqaMtZaEyoAhTknMgn1x4ojzgQWKr96?key=UBmSq8Y7gM25yDvVwPYY7g" alt=""><figcaption></figcaption></figure>

Let your avatar “see” the user and respond accordingly using webcam input.

* Enable or disable **vision-based input** with a toggle.
* **Position** the webcam within your interface layout.
* Adjust the **webcam display size** using a slider for optimal placement.

***

## **Camera Settings**

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXejFNWtf1IQ6Z8TnemAZ_qCnxCZ7Cnhkv_ecR3pWzCzwQax5RZyVtAJ0wYQYDVJ1tX6kbwvzg5dttLApcJAv7F43o-SbhSRqsNJQKN8bOzP8DoFHrB9hd4qzhKT8NYkl-Xltx3G_A?key=UBmSq8Y7gM25yDvVwPYY7g" alt=""><figcaption></figcaption></figure>

Control how the avatar scene is viewed by the user.

* **Field of View (FOV):**\
  Adjust using the FOV slider (left = narrower, right = wider view)
* **Pan Camera:**
  * Up/Down with “Pan Up/Down” slider
  * Left/Right with “Pan Left/Right” slider
* **Zoom and Tilt:**\
  Adjust using their respective sliders for precise framing.

***

## **Branding Options**

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfLMc5jjxnOjUJLbwtWlkXhrFOsEhs_7L_Cga1hgolJyticXwJ381pW7JvdbsQM-lnthMAB7zSFRNMizcPUOuMJkw0rj5Cm4Yt0u-DZJLyj3fSftH5rBbmo8uE7v8vOzm0ULkgdww?key=UBmSq8Y7gM25yDvVwPYY7g" alt=""><figcaption></figcaption></figure>

Integrate your brand identity directly into the avatar experience:

* **Display Logo**\
  Toggle “Display Logo” to enable branding elements.
* **Upload Your Logo**\
  Click “Upload your brand logo” to add it to your scene.
* **Manage Logo Display**
  * Click the logo to place it in the experience
  * Adjust its **position** and **size** using provided controls
* **Logo on Clothing**\
  Enable “Display logo on cloth” to embed your logo onto the avatar’s clothing. *(Only available for specific clothing items)*

These configuration tools ensure that your avatar interface not only works smoothly across platforms but also aligns with your project’s style, interaction needs, and brand.


# Experience Settings

Control idle session handling, welcome interactions, microphone behavior, and input processing timing to fine-tune your avatar experience.

## **Final Touches Before Deployment**

These settings define how your avatar behaves during live interaction and how the experience is sustained or terminated based on user activity.

***

## **AFK Timeout**

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfHZtMlfMw-lxVl3Uor1UdKTyiHogz_kblzCYnWHd5TDX_LizTBMO_mq82Hc9icj-x_TqZ_NXAifbBV1drCTia9_6AaANrFvdBEKtyvTKNEixT1l7pcXugSKBVgxnvU1qU22Af-Xw?key=UBmSq8Y7gM25yDvVwPYY7g" alt=""><figcaption></figcaption></figure>

Set an **AFK (Away-From-Keyboard)** timeout to manage idle sessions and conserve your pixel-streaming minutes.

* Open the **dropdown menu** under AFK Timeout.
* Select a suitable timeout duration (e.g., 1 min, 5 mins, 10 mins).
* The session will automatically end based on your selection if there’s no user activity.

{% hint style="success" %}
To optimize your account's usage, set an AFK timeout to avoid unnecessary streaming consumption.
{% endhint %}

***

## **Welcome Message**

Greet users as soon as they enter the experience with customizable welcome interactions.

**Standard Welcome**

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdFwaTaZGwtD_yO0JaIAKqaZgnKRNvVmUFjzTflqOXxZl4BUzkJrw4eX7n7VqPBBPaXJgG2v1-Gux0TVXQFTajwpDJvzEevnOzYE3RkS8zm89cu0Y7i8Bu6GF-gsmHxGSuDIUru_w?key=UBmSq8Y7gM25yDvVwPYY7g" alt=""><figcaption></figcaption></figure>

* Toggle **“Welcome Message”** ON.
* Enable a **custom welcome prompt** (e.g., “Welcome the user and introduce yourself”).
* Click **“Test Welcome Message”** to preview it.

**Vision-Based Welcome**

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXday5rBZZsNcNxKV2kHJht7CwWbEAJg-vZttQzxBPtJ6SyElog1aHLWt-_2loGATkELlQ3-u2cZna2_HzJb7kG3_nPb2_7043MCMXn--Fe4y33eFQ9YitqArPMBiqro1OmL0Ga55Q?key=UBmSq8Y7gM25yDvVwPYY7g" alt=""><figcaption></figcaption></figure>

Make the greeting more dynamic by enabling vision awareness:

* Toggle **“Vision-Based Welcome Message”** ON.
* Add a **custom prompt** (e.g., “A person approaches—welcome them and make a comment about their attire or an object they’re holding”).
* Use **“Test Message”** to preview how the avatar responds based on webcam input.

***

## **User Microphone Settings**

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdZm8XIvGdblm_lX3z47mw7kvt0jCOqLsi6DH8NxdrMKvpixxYgNknAm8BQoBmp5YCnkwjQsY76DI_6HKPV3M3v0NSEPGhgnFcOnrWBWpcIc9_gvbVEj7XIHkrbXydb0vGuLoYI?key=UBmSq8Y7gM25yDvVwPYY7g" alt=""><figcaption></figcaption></figure>

Select the input style that fits your use case:

* **Hands-Free Mode (WIP)**\
  Avatar listens continuously.
* **Push-to-Talk Mode**\
  Activate microphone input only when the assigned key is pressed.
  * You can **assign a custom key** for push-to-talk functionality.

***

## Processing Frequency

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXf-ebPyNjtfXrw5cSlsX6QHDaEfgTqx4O7fZxQO9iI6MqCu6EMLjSvLcUupwAyIkXGw4ZekRUFl7IOt67ANNMdhsLB_IQgvRCtkUL-SBxSYoUEJg3voRJc_jqqFNaxWoblJk-IA?key=UBmSq8Y7gM25yDvVwPYY7g" alt=""><figcaption></figcaption></figure>

Control how often the avatar processes and reacts to input, allowing it to act more proactively.

* Open the **dropdown menu** for processing frequency.
* Choose a time interval for the avatar to periodically evaluate multimodal inputs (voice, text, vision).
* This enables **agentic behavior** — where the avatar can initiate interaction based on user presence or signals.

{% hint style="danger" %}
After making changes:

* Click **“Save Changes”**
* If you are creating an Avatar for this character for the first time, press the **"Create Character"** button **before proceeding to the publishing step.**
  {% endhint %}


# Publishing an Avatar Studio Experience

Learn how to publish and share your customized avatar experience for use across web, kiosks, apps, and more.

## **Ready to Share Your Experience with the World?**

Once your character and avatar setup is complete, you can publish your experience directly from the Convai Character Creator dashboard.

{% hint style="success" %}
**Before You Begin:**\
Make sure your avatar is **saved** and the character is **created** before navigating to the **Publish** tab.
{% endhint %}

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfFmup27XnK4RSdHlRRlxTyWMI3gxGoAvEUUjjfW0D9-Vq-MWAb-fF-rlcslLRN-v1--vJkZ0HWhVpaU619JnekK_6bhpo6Xzwu0rGSTtIZvnO--TbpinZmIx_IBE1ayrtbMd4tCQ?key=UBmSq8Y7gM25yDvVwPYY7g" alt=""><figcaption></figcaption></figure>

***

## **Publishing Steps**

### 1. Go to the **Publish** tab inside your character’s dashboard.

### **2. Finalizing Your Experience**

Fill in the necessary details to define and present your simulation:

* **Experience Name**\
  e.g., *Virtual Tour of the Fire Station*
* **Experience Description**\
  e.g., *Get a deeper look and understanding of the inner workings of a fire station with your virtual tour guide Lina!*
* **Thumbnail (Optional)**\
  Upload an image to visually represent your experience.

### 3. Choose Visibility Settings

Select how and with whom the experience should be shared:

* **Public**
  * Visible to everyone
  * Accessible on [**x.convai.com**](https://x.convai.com)
* **Private**
  * Only visible to you and invited users
* **Unlisted**
  * Not listed publicly, but can be accessed via a direct link
* **Embed on Your Site** *(Enterprise-only)*
  * Publish your experience directly to your own website

{% hint style="danger" %}
**Convai Pixel Streaming Embed** is currently accessible only with the **Enterprise plan**.\
To learn how to embed an avatar into your own platform, check out the [Embedding Documentation](/api-docs/plugins-and-integrations/convai-pixel-streaming-embed).
{% endhint %}

***

## **After Publishing**

Once published, your experience is ready to be deployed on:

* Websites
* Applications
* Kiosk systems
* Any supported digital platform

***

{% content-ref url="/pages/mCC3cioDPzGqMj6BUUat" %}
[Convai Pixel Streaming Embed](/api-docs/plugins-and-integrations/convai-pixel-streaming-embed)
{% endcontent-ref %}


# Chat Experiences

Understand what a chat experience is, what a moderated text room does and does not do, and where to start in this section.

A chat experience is a text room built from your own Convai characters. You name it, pick a room type, and write a purpose, and every character that joins is briefed with what you set. Read this page before you create one: it sets out what a room does, what it does not do, and what is kept once the conversation ends. Chat Experiences is in beta, so read **What a chat experience does not do** before you plan around it.

{% hint style="info" %}
**Before you begin:** If **My Experiences** does not show **Create a Chat Experience**, see [What you need to use Chat Experiences](/api-docs/no-code-experiences/chat-experiences/prerequisites).
{% endhint %}

### What a chat experience is

A chat experience is a saved brief, not a saved conversation. Its name, its room type, and the purpose you write are stored together with the briefing each character receives the moment it joins. That briefing is written for you from the room type and the purpose, and the create dialog is the one place it is yours to reword. Open the experience as often as you like: every session starts a new room from the same brief.

You write to the room and the characters answer in it. A character replies when it is addressed—by name, or because the brief says the turn is theirs—and otherwise stays quiet. The room notes who stayed quiet rather than filling with replies. A room holds one character or several; with one, it is a conversation between the two of you. The characters come from your own workspaces, or by character ID when someone has given you access to one.

Six room types are available: **Focus group**, **Classroom**, **Meeting simulation**, **Brainstorm**, **Friends chatting**, and **Custom**. Each type sets a different pattern for the conversation—some put you in charge and have the characters answer when they are called on, others have no leader at all—and the purpose you write tells the characters what the conversation is about.

### What a chat experience does not do

* **A session is not resumable.** Opening a chat experience always starts a new room. A conversation that has ended cannot be rejoined.
* **Characters are chosen for each session.** The room opens empty and you add the characters you want this time. The roster from your last session does not carry over.
* **The brief is fixed at creation.** The room type, the purpose, and the briefing are set once, in the create dialog, and cannot be changed afterwards. There is no control anywhere that edits them. To run the same characters against different wording, open the menu on the experience's card or row on **My Experiences** and choose **Duplicate with a new brief**.
* **The room is text.** The characters answer in writing, and the room carries no voice. A message can carry a file attachment.

### What is kept when a session ends

Finished conversations are kept and can be read again. A chat experience records the rooms opened from it, and each recorded room can be reopened as a read-only transcript from **Previous sessions** in that same menu. A session that nobody wrote in is still listed, and reads **No messages recorded** in place of a first question.

Not resumable does not mean not recorded. You can read a finished conversation in full, but you cannot rejoin it or add to it—a new message needs a new room, with characters added again.

### Where to start

Work through these pages in order the first time. Together they take you from the hub to a room with characters in it and a first reply on screen.

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Open My Experiences</strong><br>Reach the hub where chat experiences and 3D experiences are both created and reopened.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/open-my-experiences">Open My Experiences</a></td></tr><tr><td><strong>What you need to use Chat Experiences</strong><br>The account and character requirements, and what to do if the controls are missing.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/prerequisites">What you need to use Chat Experiences</a></td></tr><tr><td><strong>Create a chat experience</strong><br>Name the room, pick its type, write its purpose, and read the briefing before it is fixed.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/create-a-chat-experience">Create a chat experience</a></td></tr><tr><td><strong>Add characters to the room</strong><br>Seat characters from your workspaces or by character ID, and watch each one join and be briefed.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/add-characters-to-the-room">Add characters to the room</a></td></tr><tr><td><strong>Send your first message</strong><br>Write to the room, address a character so that it answers, and read what the thread reports.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/send-your-first-message">Send your first message</a></td></tr><tr><td><strong>Manage your chat experiences</strong><br>Find, rename, duplicate, and delete the chat experiences on your account.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/manage-your-chat-experiences">Manage your chat experiences</a></td></tr><tr><td><strong>Share files with the room</strong><br>What reaches the characters when you attach a file to a message, and what the room keeps afterwards.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room">Share files with the room</a></td></tr></tbody></table>


# Open My Experiences

Sign in to the Convai dashboard, open the My Experiences page, and choose between creating a chat experience and creating a 3D experience.

**My Experiences** is where you build both kinds of Convai experience and open them again: chat experiences, which are text rooms, and 3D experiences, which place your characters in a scene. Use this page to open **My Experiences** and pick the button that matches what you are building.

### Prerequisites

* A Convai account you can sign in to at <code class="expression">space.vars.dashboard\_url</code>.
* **My Experiences** available in the left sidebar of the dashboard. See [What you need to use Chat Experiences](/api-docs/no-code-experiences/chat-experiences/prerequisites).

### Open the My Experiences page

{% stepper %}
{% step %}

#### Sign in to the dashboard

Go to <code class="expression">space.vars.dashboard\_url</code> and sign in to your Convai account.
{% endstep %}

{% step %}

#### Select My Experiences

In the left sidebar, select **My Experiences**. On a narrow screen the same entry reads **Experiences**.

The page header reads **My Experiences** with the number of experiences on the account after it, for example **My Experiences (7)**.
{% endstep %}
{% endstepper %}

### Choose a chat experience or a 3D experience

**My Experiences** carries one button for each kind of experience, at the top right of the page:

| Button                       | What it creates                                   | What opens                                                                                                      |
| ---------------------------- | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
| **Create a 3D Experience**   | Your characters placed in a scene or a simulation | The **Start a new Experience** dialog, where you pick a scene                                                   |
| **Create a Chat Experience** | A text room built from your characters            | The **Create a chat experience** dialog, where you name the experience, pick a room type, and write the purpose |

Below the buttons, the page lists each kind in its own section: **Chat experiences** and **3D experiences**. Anything you have already made is listed there rather than created again—a chat experience card opens a new room from that experience's brief, and a 3D experience card opens that experience for editing.

{% hint style="info" %}
If **Create a Chat Experience** is not on the page, see [What you need to use Chat Experiences](/api-docs/no-code-experiences/chat-experiences/prerequisites).
{% endhint %}

### Next steps

Read what a chat experience is and what a room does and does not do before creating one.

{% content-ref url="/pages/fr2HihLferHR6m3TZw7f" %}
[Chat Experiences](/api-docs/no-code-experiences/chat-experiences)
{% endcontent-ref %}

To build a 3D experience instead, continue with the Convai Sim guide, which covers choosing a scene and placing your characters in it.

{% content-ref url="/pages/wKIgxvLa1ZFp5chDyXOA" %}
[Creating Your AI Simulation with Convai Sim](/api-docs/no-code-experiences/convai-sim-experiences/creating-your-ai-simulation-with-convai-sim)
{% endcontent-ref %}


# What you need to use Chat Experiences

What a Convai account needs before you can build a chat experience, which characters you can add to a room, and what to do if the controls are missing.

Creating and running a chat experience takes a Convai account, at least one character, and the Chat Experiences controls on **My Experiences**.

### Account requirements

| Requirement            | Detail                                                                                                                                         |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| Convai account         | Signed in at <code class="expression">space.vars.dashboard\_url</code>.                                                                        |
| Dashboard access       | **My Experiences** present in the left sidebar. Chat experiences are created and reopened from that page, and there is no other entry point.   |
| At least one character | One of your own characters, or one someone has shared with you by ID. A room needs at least one character before you can send a message to it. |

### Characters you can add to a room

A room is the text conversation that opens when you start a chat experience. You add characters from inside it, in the **Add characters to the room** dialog. It has two tabs, and each lists a different set of characters:

| Tab                    | What it lists                                                                                                                                                          |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **From my workspaces** | The characters in the workspace you are working in, most recently edited first. The grid shows the eight most recent, and **Show all** expands it to the full list.    |
| **By character ID**    | Characters you look up by ID. Enter one ID per line to look up several at once. Use this tab for a character someone has shared with you from outside your workspaces. |

A character joins with its own persona and receives the experience's brief on top of it. The brief comes from the room type and the purpose you choose when you create the experience.

### When the Create a Chat Experience button is missing

If **My Experiences** shows neither a **Create a Chat Experience** button nor a **Chat experiences** section, contact <support@convai.com>.

### Next steps

With the requirements met, open the hub where chat experiences are created.

{% content-ref url="/pages/hP4LQajPA7oXVjIgDl2R" %}
[Open My Experiences](/api-docs/no-code-experiences/chat-experiences/open-my-experiences)
{% endcontent-ref %}


# Create a chat experience

Name a chat experience, pick a room type, write its purpose, and create the room that briefs every character you add to it.

Creating a chat experience settles what the room is for: the room type and the purpose you write become the briefing every character receives when it joins. The create dialog is the one place where that wording is yours to change. Use this page to name the experience, pick its room type, write its purpose, and read the briefing before it is fixed.

### Prerequisites

* **My Experiences** open in the Convai dashboard. See [Open My Experiences](/api-docs/no-code-experiences/chat-experiences/open-my-experiences).
* A Convai account that shows **Create a Chat Experience** on **My Experiences**. See [What you need to use Chat Experiences](/api-docs/no-code-experiences/chat-experiences/prerequisites).
* A decision about what the conversation is for. The purpose is the field that carries it.

### Create the experience

{% hint style="warning" %}
**Create experience** settles the room type, the purpose, and the briefing permanently. Read the briefing box before you select it.
{% endhint %}

{% stepper %}
{% step %}

#### Open the create dialog

On **My Experiences**, select **Create a Chat Experience**.

The **Create a chat experience** dialog opens on the **Focus group** room type, with a name and a purpose already filled in for that type. Its subtitle reads "Set the scene once. One character or a whole room, every character is briefed with it when it joins."
{% endstep %}

{% step %}

#### Name the experience

Replace the text in **Experience name** with your own name for the room. The field takes up to 80 characters.

The name is how you will find the experience again on **My Experiences**. It is not part of the briefing.
{% endstep %}

{% step %}

#### Pick a room type

Open the **Room type** menu and choose one of the six types: **Focus group**, **Classroom**, **Meeting simulation**, **Brainstorm**, **Friends chatting**, or **Custom**. Each one carries a one-line description in the menu.

The room type sets the pattern the conversation runs on. Some types put you in charge and have the characters answer when they are called on; others have no leader at all. Choosing a different type replaces the prefilled name and purpose, unless you have already typed your own.

**Custom** is the one type that opens with an empty **Purpose** field. Until you write a purpose, **What each character will be told** shows an example briefing rather than yours and cannot be typed into.

For the rules each type sets and the purpose it fills in, see [Room types reference](/api-docs/no-code-experiences/chat-experiences/the-room-brief/room-types-reference).
{% endstep %}

{% step %}

#### Write the purpose

In **Purpose**, describe what this conversation is about. The five preset room types open with a purpose already written; edit it or replace it.

Under the field, a padlock line states what happens next: "Room type and purpose become the brief every character receives. They can't be changed after creation."
{% endstep %}

{% step %}

#### Read the briefing

**What each character will be told**, below **Purpose**, is already open. The box holds the briefing written from the room type and the purpose you entered.

This is the one moment the wording is yours to change: type over it and the characters receive exactly what you write. **Create experience** stays unavailable while the box is empty. See [Write your own briefing](/api-docs/no-code-experiences/chat-experiences/the-room-brief/write-your-own-briefing) for rewriting the briefing and for putting the written-for-you version back.
{% endstep %}

{% step %}

#### Create it

Select **Create experience**.

**Create experience** is unavailable until both **Experience name** and **Purpose** have text in them. While the experience is being saved the fields grey out and the footer reads "Saving…". The dialog then closes and the new room opens.
{% endstep %}
{% endstepper %}

### What opens after you create

The new chat experience opens as an empty room. Nothing has been said in it and nobody is in it yet. A new room has four parts:

| Part of the room | What it shows                                                                                                                                                              |
| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Top bar          | The experience name, a pencil that renames the experience, the room type, the room ID, a **Text only** chip, **Previous sessions**, and a three-dots menu of room controls |
| Thread           | A pinned **Room brief** card, showing the purpose and the room type's rules that the briefing was written from, and the heading **Nobody is in the room yet**              |
| Side panel       | The **In this room** section, with a card reading **Add the participants** and "Each character receives the room brief the moment they join."                              |
| Message box      | Locked, with **Add at least one participant to start** in place of the usual prompt                                                                                        |

Every control in the room is listed in [Room controls reference](/api-docs/no-code-experiences/chat-experiences/running-the-room/room-controls-reference).

### What is fixed once the experience exists

The room type, the purpose, and the briefing cannot be changed after the experience is created. There is no control anywhere in the room or on **My Experiences** that edits them; the room shows a **Fixed at creation** lock beside the brief instead. See [Why the brief cannot be changed](/api-docs/no-code-experiences/chat-experiences/the-room-brief/why-the-brief-cannot-be-changed).

Two things are still yours to change:

* **The name.** Use the pencil beside the room name, or **Rename** on the experience's menu.
* **The wording, in a new experience.** **Duplicate with a new brief** opens the create dialog prefilled from this experience, with every field editable again. See [Manage your chat experiences](/api-docs/no-code-experiences/chat-experiences/manage-your-chat-experiences).

### Next steps

The room is empty until you seat characters in it. Add them, and the message box unlocks.

{% content-ref url="/pages/s0wre2IKbFTsueOmgrdV" %}
[Add characters to the room](/api-docs/no-code-experiences/chat-experiences/add-characters-to-the-room)
{% endcontent-ref %}

To replace the written-for-you briefing with your own words before you create the experience, work through the briefing box in detail.

{% content-ref url="/pages/e1tDgmhyt4FYfUpPQ47E" %}
[Write your own briefing](/api-docs/no-code-experiences/chat-experiences/the-room-brief/write-your-own-briefing)
{% endcontent-ref %}


# Add characters to the room

Add characters to a chat experience room from the workspace you are in or by pasting a character ID, and see each one join and be briefed.

A chat experience opens as an empty room, and the characters you seat in it are the ones that answer you. You add characters for each session: opening the experience again starts a new room with nobody in it. Use this page to add characters from your workspace or by character ID, and to recognize the point at which each one has joined and been briefed.

### Prerequisites

* A chat experience you have created. See [Create a chat experience](/api-docs/no-code-experiences/chat-experiences/create-a-chat-experience).
* At least one character you can reach, either in the workspace you are working in or through a character ID someone has shared with you. See [What you need to use Chat Experiences](/api-docs/no-code-experiences/chat-experiences/prerequisites).

### Open the character picker

Select **Add characters**. In an empty room the button appears in two places: on the **Add the participants** card in the side panel, and under **Nobody is in the room yet** in the thread. Once the room has characters in it, the same button sits under the list in the side panel. A plus control in the panel header does the same thing.

**Add characters** is unavailable while the room is connecting and while the characters are answering a message. The side panel prints the reason under the button, and the button becomes available again once the turn finishes.

The **Add characters to the room** dialog opens on two tabs: **From my workspaces** and **By character ID**. Both tabs feed one selection, so switching between them keeps what you have already picked.

### Add characters from your workspaces

**From my workspaces** lists the characters in the workspace you are working in, most recently edited first.

{% stepper %}
{% step %}

#### Find the characters you want

The grid opens with the eight most recently edited characters, under a line that counts the characters in the list and says how many of them are on show. When there are more, a button below the grid expands it to the full list, carrying that count in its label, as in **Show all 24**.

To narrow the grid, type in the search field. It matches on both the character name and the character description. A search with no results shows "No characters match."
{% endstep %}

{% step %}

#### Select them

Select a character card to add it to the selection, and select it again to drop it. A check mark appears in the corner of each selected card.

The footer counts the selection and names the first four characters in it.
{% endstep %}

{% step %}

#### Confirm

Select the confirm button. Its label counts the selection, so three characters picked make it read **Add 3 to room**, and it stays unavailable until you have selected at least one.

The dialog closes and the characters begin joining.
{% endstep %}
{% endstepper %}

### Add a character by ID

**By character ID** finds a character from its ID. Use it for a character someone has shared with you from outside your own workspaces.

{% stepper %}
{% step %}

#### Paste the IDs

Under **Character ID**, paste one character ID per line. The field takes several at once, and a note under it states the condition an ID has to meet: any character whose owner has shared it with you can join, even from outside your workspaces.
{% endstep %}

{% step %}

#### Look them up

Select the look-up button. Its label counts the IDs you have entered, so three pasted IDs make it read **Look up 3**.

Each ID becomes a row under **Results**. A character that resolved shows its name, its description, and an **Add** button. An ID that did not resolve becomes a row that shows a shortened form of the ID and says which of three things happened:

* The character exists but has not been shared with you.
* No character with that ID is available to you.
* The look-up itself did not finish.
  {% endstep %}

{% step %}

#### Add and confirm

Select **Add** on each row you want. The button becomes **Added**, and the footer count of characters added by ID goes up.

Select **Done** to close the dialog.
{% endstep %}
{% endstepper %}

### Watch the characters join and be briefed

Each character appears in the side panel straight away, with **Joining the room…** under its name, and settles into a normal row once it is in. While the room is connecting, the message box is locked and reads **Waiting for characters to join…**.

The thread marks the moment the briefing lands. A divider names the characters and states that they joined and were briefed. A box titled **What each character was told on joining** holds the briefing itself, with a line per character noting that it also carries its own persona. In a one-character room the box is titled with that character's name instead. What the briefing contains, and how the room type and the purpose produce it, is covered in [The room brief](/api-docs/no-code-experiences/chat-experiences/the-room-brief).

In a room of two or more characters, a note under that box states that the respond mode is set to Auto and that the brief decides who answers.

The side panel changes with the size of the room. With one character it labels your own row **You** and describes it as talking with that character; with two or more it labels the row **Moderator** and describes it as "You ask, they answer".

### The characters belong to this session only

The characters you add are seated for this session only. Opening the experience again starts a new session, and the room it opens is empty.

The brief carries over from one session to the next. The characters and the messages do not, so add the characters you want each time you open the experience.

{% hint style="warning" %}
Reloading the page while a room is open ends that session and returns you to an empty room. Add the characters again before continuing.
{% endhint %}

### Next steps

With at least one character in the room, the message box unlocks and you can address the room.

{% content-ref url="/pages/UPk7EWWVml5R7tBPJmAD" %}
[Send your first message](/api-docs/no-code-experiences/chat-experiences/send-your-first-message)
{% endcontent-ref %}


# Send your first message

Write and send a message in a chat experience room, address a character so it answers, and read the replies as they arrive.

You are the moderator of a chat experience, and the characters answer you rather than talk among themselves. Use this page to send the first message in a room, to address a character so that it replies, and to read what the thread reports once the turn is over.

### Prerequisites

* A chat experience room with at least one character already in it. See [Add characters to the room](/api-docs/no-code-experiences/chat-experiences/add-characters-to-the-room).

### Send a message

{% stepper %}
{% step %}

#### Write the message

Select the message box at the bottom of the room and type.

The prompt in the box tells you who you are writing to. In a room with several characters it reads **Ask the group…** before the conversation starts, and **Ask the group, or @tag someone…** afterwards. In a one-character room it reads **Message** followed by that character's name.
{% endstep %}

{% step %}

#### Send it

Press `Enter`, or select the send button—the upward arrow at the bottom right of the message box. `Shift`+`Enter` starts a new line instead of sending.

Your message appears in the thread, and the message box locks until the turn finishes.
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
A message that addresses nobody in particular can produce no reply at all. Characters answer when they are addressed and stay quiet otherwise, so name a character or tag one when you want a specific answer.
{% endhint %}

### Address a character so it answers

A room runs on **Auto** unless you change it, and under Auto the brief decides who answers—a character replies when it is addressed and stays quiet otherwise. The chip under what you are typing shows the mode the next message will use, and reads **Auto · room brief decides** until you change it.

Before the first message in a room of two or more characters, the thread states the rule you are working under: "Respond mode is set to Auto: the brief decides who answers. Use @tags or the chip to override on any message." What each room type asks of its characters is set out in [How the room brief is written](/api-docs/no-code-experiences/chat-experiences/the-room-brief/how-the-room-brief-is-written).

Addressing a character means naming it. Writing "Maya, what did you think of the price?" addresses Maya; writing "What did you think of the price?" addresses nobody in the room.

Tagging is the explicit version, and the only one the room enforces. Type `@` in the message box and pick the character you want from the list that opens.

A tagged character is required to reply, and the room holds it to that rather than leaving the decision to the character. In a room of two or more characters, the chip changes to show who the message is going to, and every character you did not tag stays out of that turn.

For the rest of the tag list, and for setting the chip so that it holds from one message to the next, see [Choose who replies](/api-docs/no-code-experiences/chat-experiences/running-the-room/choose-who-replies).

### What the thread shows after you send

Every character in the room appears in the thread with its name and an animated typing indicator while the turn runs, whether or not it ends up answering. A reply replaces that character's indicator when it arrives, and the indicators still standing clear together when the turn finishes.

Under your own message, a caption reports what the turn asked for and what came back. In a room of two or more characters running on Auto, the caption reads **Auto · room brief decides**, followed by an outcome built from up to three counts:

| Count              | Meaning                                                                                                                                                                                    |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `2 of 4 responded` | How many of the characters in the room when you sent the message have replied, out of how many were in it                                                                                  |
| `1 listening`      | How many have not replied and have not been reported as not answering. While the turn runs, these are the characters still to answer; once it is over, they are the ones that stayed quiet |
| `1 did not answer` | How many the room reported as not answering                                                                                                                                                |

In a one-character room the caption names that character instead—**Sent to** followed by the name—and adds `replied` once the reply is in, or `waiting` while the turn is still running. If the character stays quiet, the caption carries no outcome at all.

While the turn is running, the message box carries the wait in place of the usual prompt: **Waiting for 2 of 4…**, where the first number is how many replies are still outstanding rather than how many have arrived. It reads **Finishing the turn…** as the turn settles, and unlocks when the turn is over.

For what the counts read in the other respond modes, see [How a turn works](/api-docs/no-code-experiences/chat-experiences/running-the-room/how-a-turn-works).

### When a character stays quiet

A character that had nothing to answer is named in a note below the replies, and the note tells you how to get its side.

Under Auto, the note names the characters and reads "stayed quiet, as the brief asks. Tag them if you want their side." When more than one character stayed quiet, the last sentence reads "Tag one of them if you want their side." instead. A room where every character stayed quiet produces this note and no replies.

A character named in that note is counted under `listening` in the caption, not under `did not answer`. The two are different outcomes: a quiet character chose to say nothing.

To get an answer from a character named in that note, send another message that tags it.

### Next steps

Once you have run a conversation, the experience is one of several on **My Experiences**, and finding it again, renaming it, or duplicating it with a new brief are separate tasks.

{% content-ref url="/pages/MAl0EbSyk5hMfoBIsxmR" %}
[Manage your chat experiences](/api-docs/no-code-experiences/chat-experiences/manage-your-chat-experiences)
{% endcontent-ref %}

To decide who answers rather than leaving it to the brief, read what each respond mode asks of the characters.

{% content-ref url="/pages/632lwoBp57zO0IFCB6op" %}
[Respond modes reference](/api-docs/no-code-experiences/chat-experiences/running-the-room/respond-modes-reference)
{% endcontent-ref %}


# Manage your chat experiences

Find, search, rename, duplicate, and delete the chat experiences on your account, and run the same characters against different wording.

Every chat experience you create stays on **My Experiences** until you delete it. Use this page to find one again, to rename it, to delete it, and to duplicate it when you want to run the same kind of conversation with a different brief.

### Find a chat experience

Chat experiences are listed in the **Chat experiences** section of **My Experiences**, above the **3D experiences** section. See [Open My Experiences](/api-docs/no-code-experiences/chat-experiences/open-my-experiences) for how to reach it. The heading carries the number of chat experiences on the account.

Selecting a card or a row opens a new room from that experience. It does not reopen the last conversation.

Three controls work on that list:

| Control                                    | What it does                                                                                                                                                                       |
| ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Search chat experiences**                | Filters the list. Every word you type has to appear in the experience name or in its purpose. A search with no results shows **No chat experiences match your search.**            |
| The two view buttons beside the search box | Switch between a grid of cards and a list of rows. The browser remembers your choice. On a narrow window the list falls back to the grid, because the row cannot hold its columns. |
| The three-dots menu on a card or row       | Opens **Previous sessions**, **Rename**, **Duplicate with a new brief**, and **Delete** for that experience.                                                                       |

**Previous sessions** opens the conversations already run from that experience, each one a transcript you can read but not add to. See [Chat Experiences](/api-docs/no-code-experiences/chat-experiences).

The grid shows a card per experience: its room type, its name, the first two lines of its purpose, and a session line reading either **No sessions yet** or the number of sessions and when the last one ran. The list shows the same experiences as rows, adding an **ID** column carrying the room ID, which you can copy from the row.

If the section reads **No chat experiences yet**, nothing has been created on the account. See [Create a chat experience](/api-docs/no-code-experiences/chat-experiences/create-a-chat-experience).

### Rename a chat experience

Renaming changes the label on the card and in the room's top bar. It does not touch the brief.

{% stepper %}
{% step %}

#### Open the rename dialog

Open the three-dots menu on the experience's card or row and select **Rename**.

The **Rename chat experience** dialog opens with the current name in the **Name** field.

An open room has its own route to the same rename. The pencil beside the room name and **Rename experience** on the top bar's three-dots menu both open a **Rename experience** dialog with an **Experience name** field.
{% endstep %}

{% step %}

#### Save the new name

Type the new name and select **Save**.

The field grays out and shows **Saving…** while the change is being stored, and the dialog closes once it has been.
{% endstep %}
{% endstepper %}

### Duplicate an experience with a new brief

**Duplicate with a new brief** is how you run the same kind of conversation against different wording. The room type, the purpose, and the briefing are fixed when an experience is created, so changing any of them means creating another experience—and duplicating starts you from the original rather than from a blank dialog. See [Why the brief cannot be changed](/api-docs/no-code-experiences/chat-experiences/the-room-brief/why-the-brief-cannot-be-changed).

To put the same characters through a different brief, duplicate the experience, change the wording, and add those characters to the new room.

{% stepper %}
{% step %}

#### Start the duplicate

Select **Duplicate with a new brief**. It appears on the three-dots menu on the experience's card or row, on the three-dots menu in an open room's top bar, and in the tooltip on the room's **Fixed at creation** label.

That label sits in the room's side panel, and on the pinned **Room brief** card while the room is still empty.
{% endstep %}

{% step %}

#### Change the wording

The **Create a chat experience** dialog opens prefilled from the original: the same room type, the same purpose, the same briefing if one was written by hand, and the original name with `(copy)` after it.

Every field is editable, because this is a new experience rather than an edit of the old one. Change the purpose, the room type, the briefing, or all three.

The **Custom** room type has one exception. While its purpose is empty and no briefing came across from the original, the briefing box shows an example of what a briefing looks like instead of taking your typing.
{% endstep %}

{% step %}

#### Create it

Select **Create experience**.

The duplicate opens as its own empty room and appears as a separate card on **My Experiences**. The original is untouched, and its previous sessions stay with it.
{% endstep %}
{% endstepper %}

### Delete a chat experience

Deleting removes the experience from **My Experiences**, along with its list of previous sessions.

{% hint style="danger" %}
Deleting a chat experience cannot be undone. The dialog says so, and there is no way to restore the experience or its previous sessions afterwards.
{% endhint %}

{% stepper %}
{% step %}

#### Open the delete dialog

Open the three-dots menu on the experience's card or row and select **Delete**.

The **Delete chat experience** dialog names the experience and asks you to confirm.
{% endstep %}

{% step %}

#### Confirm the deletion

Select **Delete** to confirm, or **Cancel** to keep the experience.

The card disappears from the list, and a confirmation message reports that the chat experience was deleted.
{% endstep %}
{% endstepper %}

### Next steps

The brief you duplicate here is fixed for a reason, and the section that explains it also covers how a briefing is written. Creating an experience from scratch starts in the same dialog a duplicate opens.

{% content-ref url="/pages/UegeFZ5XJFnX4nKGvMoP" %}
[Why the brief cannot be changed](/api-docs/no-code-experiences/chat-experiences/the-room-brief/why-the-brief-cannot-be-changed)
{% endcontent-ref %}

{% content-ref url="/pages/Th74Pt0L3LuXdoZaQU34" %}
[Create a chat experience](/api-docs/no-code-experiences/chat-experiences/create-a-chat-experience)
{% endcontent-ref %}


# The room brief

Understand what the room brief tells every character that joins a chat experience, where it appears, and which page answers which question.

A chat experience holds one brief, and every character in the room is given it the moment it joins. The brief is written from the room type and the purpose you set while creating the experience, and it is settled at that moment. These pages cover what the brief contains, how its wording is put together, and the one moment that wording is yours to write.

### What the brief is made of

A brief is a room type, a purpose, and one briefing written from the two.

The room type sets the pattern the conversation runs on. In a room of two or more characters it supplies the sentence the briefing opens with, the rules it closes with, and the short rules chips shown beside it. A room holding one character is briefed in single-character wording instead: its own opening sentence, its own closing rules, and the same three rules chips whichever type the experience was created under. Six types are available, and they differ in who leads the conversation and whether anybody leads it at all. See [How the room brief is written](/api-docs/no-code-experiences/chat-experiences/the-room-brief/how-the-room-brief-is-written) for both forms in full.

The purpose is the description of what this conversation is about. The five preset room types fill one in for you to edit, and Custom starts empty. You write it in the **Purpose** field of the [create dialog](/api-docs/no-code-experiences/chat-experiences/create-a-chat-experience), and it sits in the middle of the briefing written for you.

The briefing is the paragraph the characters actually receive. It is written for you from the room type and the purpose, and the create dialog is the one place where you can replace that wording with your own.

### What each character receives when it joins

Each character receives the briefing on top of the persona it already has. The character itself is not edited, and a character needs no extra setup before it can be briefed. See [What you need to use Chat Experiences](/api-docs/no-code-experiences/chat-experiences/prerequisites) for which characters a room accepts.

The side panel states this in the empty room: "Each character receives the room brief the moment they join." Once characters are in, the thread names the persona each one is carrying alongside the briefing.

The rules chips beside the briefing restate those rules in short form for you to read. The briefing paragraph is what the characters are told.

### Where the brief appears in the product

From the create dialog to the room and its **Previous sessions** page, the brief is visible at five points, and the wording of the briefing itself is shown at two of them:

| Where                                                                                                                                        | What it shows                                                                                                                                                                               |
| -------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| The **Create a chat experience** dialog                                                                                                      | **What each character will be told**, holding the briefing as an editable box                                                                                                               |
| The thread, in a room with nobody in it yet                                                                                                  | A pinned **Room brief** card: the room type, the purpose, and the rules chips                                                                                                               |
| The room's side panel                                                                                                                        | A **Room brief** section below the roster, with the room type and the purpose, for the whole conversation                                                                                   |
| The thread, once characters have joined                                                                                                      | **What each character was told on joining**, holding the briefing itself and a persona line per character. In a room of one the heading reads **What ⟨character name⟩ was told on joining** |
| The experience's [**Previous sessions**](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/review-a-past-session) page | The room type, the purpose, and the rules chips, beside the list of past sessions                                                                                                           |

On **My Experiences**, an experience's card and its list row carry the room type and the purpose as well, but not the briefing.

The side panel, the pinned card, and the **Previous sessions** page each carry a **Fixed at creation** label beside the brief.

### Which page answers which question

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>How the room brief is written</strong><br>How the room type and the purpose become one briefing, what a room of one receives instead, and what is trimmed when it runs long.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/the-room-brief/how-the-room-brief-is-written">How the room brief is written</a></td></tr><tr><td><strong>Room types reference</strong><br>All six room types, the rules each one sets, and the purpose it fills in for you.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/the-room-brief/room-types-reference">Room types reference</a></td></tr><tr><td><strong>Write your own briefing</strong><br>Replace the briefing written for you with your own wording, and put the written-for-you version back.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/the-room-brief/write-your-own-briefing">Write your own briefing</a></td></tr><tr><td><strong>Why the brief cannot be changed</strong><br>What is settled at creation, and how to run the same characters against different wording.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/the-room-brief/why-the-brief-cannot-be-changed">Why the brief cannot be changed</a></td></tr></tbody></table>

To set a brief for the first time, start from the create dialog. For what to do about a brief you cannot edit, see the troubleshooting page.

{% content-ref url="/pages/Th74Pt0L3LuXdoZaQU34" %}
[Create a chat experience](/api-docs/no-code-experiences/chat-experiences/create-a-chat-experience)
{% endcontent-ref %}

{% content-ref url="/pages/shUmFFbGwwR9Qw8p3eov" %}
[Briefs and transcripts](/api-docs/no-code-experiences/chat-experiences/troubleshooting/briefs-and-transcripts)
{% endcontent-ref %}


# How the room brief is written

Understand how a room type and a purpose become the one briefing every character receives, and what is trimmed when that briefing runs long.

The briefing a character receives is one paragraph, written from the room type and the purpose you set when you created the chat experience. A one-character room is briefed in different words from a room of two or more, and the two are labeled differently as well. Knowing how that paragraph is assembled tells you what the characters are working from, which wording they received, and what is shortened when the briefing grows too long.

### The three parts of a briefing

In a room of two or more characters, a briefing opens with a sentence from the room type, carries your purpose in the middle, and closes with the rules that room type sets. A one-character room is briefed in wording of its own, which the next section sets out.

Both of those are written for you. The **Create a chat experience** dialog is the one place where you can replace that wording with your own, and your own wording replaces the whole paragraph: no opening sentence, no closing rules, and no room-type wording at all. Everything on this page describes the briefing written for you. See [Create a chat experience](/api-docs/no-code-experiences/chat-experiences/create-a-chat-experience) and [Write your own briefing](/api-docs/no-code-experiences/chat-experiences/the-room-brief/write-your-own-briefing).

A **Focus group** experience left on its prefilled purpose produces these three parts:

| Part                 | Where it comes from | Wording                                                                                                                                                                                                                                      |
| -------------------- | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| The opening sentence | The room type       | "You are joining a focus group run by a moderator. You are one of several participants."                                                                                                                                                     |
| The purpose          | What you wrote      | "Taste-test debrief for the new spicy chicken sandwich. Five regular customers share honest reactions to the flavor, the price and the packaging."                                                                                           |
| The closing rules    | The room type       | "The moderator asks the questions. Answer when you are asked, and only when what you know is relevant. Discuss with other participants when the moderator invites it. Otherwise, listen. Stay in character and draw on your own background." |

The three parts arrive as one paragraph, not as three. Each room type supplies a different opening sentence and a different set of closing rules, so the same purpose produces a different briefing under a different type. See [Room types reference](/api-docs/no-code-experiences/chat-experiences/the-room-brief/room-types-reference) for what each type sets.

**Custom** differs from the five preset types in two ways. Its opening sentence, "You are joining a room with a purpose set by its creator:", ends in a colon, so your purpose reads as its continuation. It is also the only type that starts with an empty **Purpose** field.

A purpose that does not end in a period, a question mark, or an exclamation mark gets one added, so it reads as a sentence in the middle of the paragraph. That happens whichever room type you picked, and in a one-character room as well.

### What a one-character room receives

A one-character room is briefed as a conversation between two people rather than as a group:

| Part                 | Wording in a one-character room                                                                                |
| -------------------- | -------------------------------------------------------------------------------------------------------------- |
| The opening sentence | "You are joining a chat experience with a purpose set by its creator:"                                         |
| The purpose          | The purpose you wrote, as one sentence                                                                         |
| The closing rules    | "One other person is in the room. Stay in character, draw on your own background, and respond when addressed." |

The room type still decides the purpose you started from and the room type chip shown on the room, but the opening sentence and the closing rules above replace the room type's own. A room of two or more characters uses the room type's wording instead.

The **Create a chat experience** dialog previews the briefing for a room of two or more characters. Which of the two a character actually receives is settled when the room opens, from the number of characters seated at that moment.

### How the room labels the brief

The room labels the same brief differently depending on how many characters are in it. In the thread, the briefing box is titled **What ⟨name⟩ was told on joining** in a one-character room and **What each character was told on joining** in a room of two or more. The side panel changes with it: the section holding your own row is named differently, and so is the line under your name. See [Room controls reference](/api-docs/no-code-experiences/chat-experiences/running-the-room/room-controls-reference) for the side panel in full.

The labels differ, but they name the same room brief. What changes with the number of characters is the briefing wording set out above.

### The rules chips beside the briefing

The rules chips are the short form of the rules the briefing sets. They sit beside the briefing in the **Create a chat experience** dialog, in the thread, and on the experience's **Previous sessions** page. The room's side panel shows the brief without them.

In a room of two or more characters, the chips are the room type's own, and every type has its own set. Two of the six set no leader at all. See [Room types reference](/api-docs/no-code-experiences/chat-experiences/the-room-brief/room-types-reference) for the chips each type shows.

In a one-character room, the chips read **One other person**, **Stay in character**, and **Respond when addressed**, whichever room type the experience was created under.

### When the briefing runs long

A briefing is capped at 4,000 characters, and the purpose is the only part that is shortened to fit.

The opening sentence and the closing rules are kept whole. The purpose is cut at the point where the paragraph would run past the cap, ending in an ellipsis.

A briefing you write yourself obeys the same cap. The **What each character will be told** box in the **Create a chat experience** dialog stops accepting text at 4,000 characters, so the wording you can see in the box is the wording the characters receive. That same box holds the finished briefing while it is still being written for you, so you can read the whole paragraph, ellipsis and all, before you create the experience.

### Related pages

The purpose that sits in the middle of a briefing is written once, in the create dialog. That is also where the briefing can be replaced with your own wording, and after that nothing about the brief can be changed.

{% content-ref url="/pages/Th74Pt0L3LuXdoZaQU34" %}
[Create a chat experience](/api-docs/no-code-experiences/chat-experiences/create-a-chat-experience)
{% endcontent-ref %}

{% content-ref url="/pages/e1tDgmhyt4FYfUpPQ47E" %}
[Write your own briefing](/api-docs/no-code-experiences/chat-experiences/the-room-brief/write-your-own-briefing)
{% endcontent-ref %}

{% content-ref url="/pages/UegeFZ5XJFnX4nKGvMoP" %}
[Why the brief cannot be changed](/api-docs/no-code-experiences/chat-experiences/the-room-brief/why-the-brief-cannot-be-changed)
{% endcontent-ref %}


# Room types reference

Reference for the six chat experience room types: the line each one shows in the room type menu, what it tells the characters, and what it fills in for you.

A room type is one half of a chat experience's brief, and the purpose you write is the other. In a room of two or more characters it supplies the sentence the briefing opens with, the rules it closes with, and the rules chips shown under the briefing. It also fills in an experience name and, except for **Custom**, a purpose for you to edit before the experience is created. This page lists all six types: the line each one shows in the menu, the name and purpose it fills in, the sentence it opens with, and the rules chips it sets.

A room holding a single character is briefed in wording of its own, whichever type the experience was created under. That character receives a fixed opening sentence and a fixed set of closing rules, and three rules chips: **One other person**, **Stay in character** and **Respond when addressed**. The type still fills in the name and the purpose and still labels the room, but none of the wording that character is briefed with comes from it. Everything below about what the characters are told describes a room of two or more. See [How the room brief is written](/api-docs/no-code-experiences/chat-experiences/the-room-brief/how-the-room-brief-is-written) for the two forms side by side.

The type you pick is settled the moment the experience is created, along with the purpose and the briefing written from them. See [Why the brief cannot be changed](/api-docs/no-code-experiences/chat-experiences/the-room-brief/why-the-brief-cannot-be-changed). It is shown as a chip on the experience's card or row on **My Experiences**, in the room's top bar on a full-width window, and beside the brief in the room's side panel, on the pinned **Room brief** card and on the experience's **Previous sessions** page.

### The six room types

The types appear in this order in the **Room type** menu, each with a one-line description under its name.

| Room type              | Description in the menu                                             | Experience name filled in |
| ---------------------- | ------------------------------------------------------------------- | ------------------------- |
| **Focus group**        | "A moderator asks; participants answer when called on."             | `Focus group session`     |
| **Classroom**          | "A teacher leads; students answer and may ask their own questions." | `Classroom session`       |
| **Meeting simulation** | "Everyone has a role and an agenda item; the chair keeps order."    | `Meeting simulation`      |
| **Brainstorm**         | "No leader. Everyone contributes and builds on each other."         | `Brainstorm session`      |
| **Friends chatting**   | "Casual. Everyone talks freely, nobody is in charge."               | `Friends chatting`        |
| **Custom**             | "Describe the room yourself."                                       | `Custom room`             |

### The purpose each type fills in

Five of the six types fill in a worked example for you to edit or replace.

| Room type              | Purpose filled in                                                                                                                                  |
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Focus group**        | "Taste-test debrief for the new spicy chicken sandwich. Five regular customers share honest reactions to the flavor, the price and the packaging." |
| **Classroom**          | "First-week onboarding class. A teacher walks new hires through the checklist; students answer, ask what is unclear and build on each other."      |
| **Meeting simulation** | "Weekly product sync. Each attendee owns one agenda item; the chair keeps time and closes each item with a decision."                              |
| **Brainstorm**         | "Open brainstorm for the spring campaign. No idea is too small; everyone contributes and builds on what came before."                              |
| **Friends chatting**   | "A group of friends catching up after work. Casual, warm, and nobody is in charge of the conversation."                                            |
| **Custom**             | Nothing. The field opens empty; see [Custom](#custom) below.                                                                                       |

Each field guards itself. Picking another type replaces the filled-in purpose unless you have typed your own into **Purpose**, and replaces the filled-in name unless you have typed your own into **Experience name**. Typing into one field does not protect the other, and a field you typed into and then cleared is filled in again by the next type you pick.

### What each type tells the characters

A briefing opens with a sentence from the room type, carries your purpose in the middle, and closes with the rules that type sets. These are the six opening sentences.

| Room type              | Sentence the briefing opens with                                                          |
| ---------------------- | ----------------------------------------------------------------------------------------- |
| **Focus group**        | "You are joining a focus group run by a moderator. You are one of several participants."  |
| **Classroom**          | "You are joining a classroom led by a teacher. You are one of several students."          |
| **Meeting simulation** | "You are joining a meeting run by a chair. Every attendee has a role and an agenda item." |
| **Brainstorm**         | "You are joining a brainstorm. There is no leader; everyone contributes."                 |
| **Friends chatting**   | "You are joining a casual chat between friends. Nobody is in charge."                     |
| **Custom**             | "You are joining a room with a purpose set by its creator:"                               |

**Custom** is the one type whose opening sentence ends in a colon and runs straight into your purpose.

The closing rules are the same rules written as sentences, and the rules chips are their short form, for you to read rather than for the characters. These are the chips each type sets.

| Room type              | Rules chips                                                                                                                           |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| **Focus group**        | **Moderator asks the questions**, **Participants answer when called on**, **Stay quiet otherwise**, **Discuss together when invited** |
| **Classroom**          | **Teacher leads the lesson**, **Students answer when asked**, **Ask your own questions**, **Build on what others say**                |
| **Meeting simulation** | **Chair keeps order**, **Speak to your agenda item**, **Respond when addressed**, **Close each item with a decision**                 |
| **Brainstorm**         | **No leader**, **Everyone contributes**, **Build on each other**, **Keep it moving**                                                  |
| **Friends chatting**   | **Talk freely**, **Nobody is in charge**, **React to each other**, **Keep it casual**                                                 |
| **Custom**             | **Moderator leads**, **Respond when addressed**, **Listen otherwise**                                                                 |

For the longer wording a briefing closes with, and how the three parts are assembled into one paragraph, see [How the room brief is written](/api-docs/no-code-experiences/chat-experiences/the-room-brief/how-the-room-brief-is-written).

The chips sit under the wording they shorten: under the briefing in the **What each character will be told** box in the create dialog, and under the brief in the thread and on the experience's **Previous sessions** page. The room's side panel shows the room type and the purpose without them.

In a room holding a single character, the box in the thread reads **What ⟨character name⟩ was told on joining** and carries the three single-character chips instead of the type's. Beside the brief elsewhere, the chips keep describing the type the experience was created under.

### Custom

**Custom** is the one type that fills in no purpose. Its **Purpose** field opens empty, and there is nothing to brief the characters with until you write one.

The empty field shows an example in muted text: "Five regulars react to the new spicy sandwich; I ask, they answer honestly, and argue when they disagree." A line under the field states the minimum: "A single word is the minimum. The more context you give, the better the characters behave once they are in."

Until a purpose is written, **What each character will be told** shows an example briefing rather than yours and cannot be typed into. See [Write your own briefing](/api-docs/no-code-experiences/chat-experiences/the-room-brief/write-your-own-briefing).

### Related pages

{% content-ref url="/pages/11uwId7UzbQBvLDHkrCe" %}
[How the room brief is written](/api-docs/no-code-experiences/chat-experiences/the-room-brief/how-the-room-brief-is-written)
{% endcontent-ref %}

{% content-ref url="/pages/Th74Pt0L3LuXdoZaQU34" %}
[Create a chat experience](/api-docs/no-code-experiences/chat-experiences/create-a-chat-experience)
{% endcontent-ref %}


# Write your own briefing

Replace the briefing written for you in the create dialog with your own wording, and put the written-for-you version back when you want it.

The briefing every character receives is written for you, and the create dialog is the one place where you can replace that wording with your own—creating the experience settles the briefing, and **Duplicate with a new brief** opens the same dialog on a copy when you want different wording later. Use this page to rewrite the briefing in the **What each character will be told** box, to put the written-for-you version back, and to understand what your own wording replaces.

### Prerequisites

* The **Create a chat experience** dialog open, with a room type picked. See [Create a chat experience](/api-docs/no-code-experiences/chat-experiences/create-a-chat-experience).
* Text in the **Purpose** field. A purpose is required before the experience can be created.

{% hint style="info" %}
The **Custom** room type opens with an empty **Purpose** field. Until you write one, **What each character will be told** shows an example briefing rather than yours, and it cannot be typed into. Write the purpose first—the box then holds the briefing written from your words and accepts your edits. See [Room types reference](/api-docs/no-code-experiences/chat-experiences/the-room-brief/room-types-reference).
{% endhint %}

### Replace the briefing with your own words

{% stepper %}
{% step %}

#### Find the briefing box

Below **Purpose**, the **What each character will be told** box is already open. Its header line closes the box and opens it again.

The box holds the briefing written for you: the sentence the room type opens with, the purpose you entered in the middle, and the rules that room type closes with. Under the briefing sit the rules chips—the short form of those rules—and a footnote stating that the briefing goes to every character on top of its own persona, and that it is fixed once the experience is created.

What the box shows is the briefing for a room of two or more characters. A room you seat a single character in is briefed in its own words: a different opening sentence, different closing rules, and a fixed set of three rules chips beside them, whichever room type you picked. See [How the room brief is written](/api-docs/no-code-experiences/chat-experiences/the-room-brief/how-the-room-brief-is-written).
{% endstep %}

{% step %}

#### Type your own briefing

Select the text in the briefing field and replace it. The field takes up to 4,000 characters, the same cap the written-for-you briefing obeys.

A **Reset to the written-for-you version** button appears directly under the briefing field, above the rules chips, as soon as the text is your own. That button is how you can tell the briefing is no longer being written for you.
{% endstep %}

{% step %}

#### Create the experience

Select **Create experience**.

The characters receive the words in the field, on top of their own personas—your wording, whichever room type you picked and however many characters you seat. Nothing is added to them and nothing is rewritten.

Once characters have joined the room, the thread shows what you wrote under **What each character was told on joining**, or under **What ⟨character name⟩ was told on joining** in a room holding one character.
{% endstep %}
{% endstepper %}

### Put the written-for-you briefing back

Select **Reset to the written-for-you version**, directly under the briefing field.

The button is present only while the text in the field is your own, and it disappears once the briefing has been reset. After a reset, the box follows the room type and the purpose again: edit either field and the briefing in the box is rewritten to match.

### What an emptied briefing does

An empty field is not a briefing, and the dialog refuses to create the experience while it stays empty.

Clearing the field shows this line under it: "A blank briefing sends the written-for-you one instead. Write what the characters should be told, or reset to it." The box stays open while it is empty, and **Create experience** is unavailable until you write something or reset. See [Briefs and transcripts](/api-docs/no-code-experiences/chat-experiences/troubleshooting/briefs-and-transcripts) for the other things that hold **Create experience** back.

### What your wording replaces, and what it does not

Your wording replaces the entire briefing, including the purpose that would otherwise sit in the middle of it. The characters are told your words and nothing else.

The purpose you wrote is still stored on the experience. It is shown on the experience's card or row, in the room's side panel, and on the pinned **Room brief** card, and it is matched by the search box on **My Experiences**. It is no longer part of what the characters are told, unless you put it there yourself. See [The room brief](/api-docs/no-code-experiences/chat-experiences/the-room-brief) for everywhere the brief appears.

Your wording changes the briefing and nothing else in the dialog:

| Element                | Behavior after you rewrite the briefing                                                                                                                                        |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| The rules chips        | They keep describing the room type. See [Room types reference](/api-docs/no-code-experiences/chat-experiences/the-room-brief/room-types-reference).                            |
| The **Room type** menu | Picking a different type keeps your wording in the field and swaps the chips. It may also replace the filled-in name and purpose, unless you typed your own into either field. |
| The **Purpose** field  | It stays editable, but editing it no longer rewrites your briefing.                                                                                                            |

### Next steps

The briefing, the purpose, and the room type are settled the moment the experience is created. What is left is to seat the characters that receive the briefing.

{% content-ref url="/pages/s0wre2IKbFTsueOmgrdV" %}
[Add characters to the room](/api-docs/no-code-experiences/chat-experiences/add-characters-to-the-room)
{% endcontent-ref %}

{% content-ref url="/pages/UegeFZ5XJFnX4nKGvMoP" %}
[Why the brief cannot be changed](/api-docs/no-code-experiences/chat-experiences/the-room-brief/why-the-brief-cannot-be-changed)
{% endcontent-ref %}

{% content-ref url="/pages/11uwId7UzbQBvLDHkrCe" %}
[How the room brief is written](/api-docs/no-code-experiences/chat-experiences/the-room-brief/how-the-room-brief-is-written)
{% endcontent-ref %}


# Why the brief cannot be changed

Understand why a chat experience settles its room type, purpose, and briefing at creation, and why different wording means a second experience, not an edit.

A chat experience settles its brief the moment it is created. The room type, the purpose, and the briefing are written in [the create dialog](/api-docs/no-code-experiences/chat-experiences/create-a-chat-experience) and stay as they were written, for that experience and every room opened from it. Knowing what that covers explains why the room shows a lock rather than an edit control, and points you at the one way to put the same characters in front of different wording.

### What is settled at creation

Three things are settled when you select **Create experience**: the room type, the purpose, and the briefing every character receives on joining.

There is no control anywhere in the product that edits a brief. No screen offers one at any point after creation, so the wording a character is briefed with in the tenth session is the wording settled in the create dialog. The dialog says so before you commit to it, in a line under **Purpose**: "Room type and purpose become the brief every character receives. They can't be changed after creation." The briefing box repeats it: "It is fixed once the experience is created."

How much of the briefing the room type writes depends on how many characters are in the room. In a room of two or more, the room type supplies the sentence the briefing opens with and the rules it closes with, and your purpose sits between them. In a room of one character, that opening sentence and those closing rules are replaced by wording of their own, and the rules chips shown with the briefing read **One other person**, **Stay in character**, and **Respond when addressed**, whichever room type the experience was created under. The room type still decides the purpose you started from and the label the room carries. Both forms are settled at creation, and neither is yours to edit afterwards. See [How the room brief is written](/api-docs/no-code-experiences/chat-experiences/the-room-brief/how-the-room-brief-is-written).

The brief is the part of a chat experience the characters carry. Characters are picked for each session and messages belong to the session they were sent in, so the brief is what makes every room opened from an experience the same experience. The experience's **Previous sessions** page states the same split: "Each session is its own thread. The brief carries over; the characters and the messages do not."

### What the room tells you about the fixed brief

The room offers a lock in place of an edit control. Beside the brief sits a **Fixed at creation** label with a padlock.

Hovering that label opens a short panel. Its heading reads "Fixed for this experience", and its body gives the reason: "Every session and every character briefing builds on this brief. Editing it here would make the earlier sessions belong to a different experience."

The label appears in three places:

| Where                                                                         | When                                                  |
| ----------------------------------------------------------------------------- | ----------------------------------------------------- |
| The **Room brief** section in the room's side panel, above **Shared in room** | For the whole conversation                            |
| The pinned **Room brief** card in the thread                                  | While the room has nobody in it yet, on a wide window |
| The brief panel on the experience's **Previous sessions** page                | Whenever you open that page                           |

In the room, the panel that opens from the label also offers **Duplicate with a new brief**. On the **Previous sessions** page it explains the lock and offers nothing to select.

### What you can still change

Two things about an existing chat experience remain yours to change, and neither touches the brief.

**The name.** Rename the experience from the three-dots menu on its card or row on **My Experiences**. The card label and the room's title change; the room type, the purpose, and the briefing do not. See [Manage your chat experiences](/api-docs/no-code-experiences/chat-experiences/manage-your-chat-experiences).

**Who is in the room.** Characters are seated per session, so every room you open is a fresh chance to put different characters in front of the same brief. See [Add characters to the room](/api-docs/no-code-experiences/chat-experiences/add-characters-to-the-room).

### Why different wording means a second experience

**Duplicate with a new brief** is what stands in for editing. It creates a second experience starting from the first: the **Create a chat experience** dialog opens prefilled from the original, and every field in it is yours to change, because what you are creating is new rather than an edit of what already ran.

The duplicate opens as its own empty room, with no sessions of its own yet. The original is untouched. It keeps its name, its brief, and its list of previous sessions, and the two appear separately on **My Experiences**.

Where that control sits, and what each field arrives prefilled with, are on [Manage your chat experiences](/api-docs/no-code-experiences/chat-experiences/manage-your-chat-experiences).

### Related pages

The brief is what carries between sessions, and nothing else does. These pages cover duplicating an experience, replacing the briefing wording while the create dialog is still open, and what a finished session keeps.

{% content-ref url="/pages/MAl0EbSyk5hMfoBIsxmR" %}
[Manage your chat experiences](/api-docs/no-code-experiences/chat-experiences/manage-your-chat-experiences)
{% endcontent-ref %}

{% content-ref url="/pages/e1tDgmhyt4FYfUpPQ47E" %}
[Write your own briefing](/api-docs/no-code-experiences/chat-experiences/the-room-brief/write-your-own-briefing)
{% endcontent-ref %}

{% content-ref url="/pages/NEs7xFxvuvS2th74dKa5" %}
[Sessions and transcripts](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts)
{% endcontent-ref %}


# Running the room

Understand what a chat experience room is made of, what the side panel, thread, and message box each do, and where the room's controls live.

A [chat experience](/api-docs/no-code-experiences/chat-experiences) room has three working parts: a side panel down the left, the thread in the middle, and the message box at the bottom. Each answers a different question—who is in the room, what has been said, and what happens to the next message you send. These pages cover how a turn runs, how to choose who replies and in which mode, how to change the roster mid-conversation, and what every control in the room does.

### What the room is made of

The room fills the page. The side panel runs the full height down the left, and a thin top bar sits above the thread and the message box:

| Part            | What it is for                                                                                                                                                                                                                                                                            |
| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| The top bar     | Names the experience and carries the room's controls: the room type, the room ID, the **Text only** chip, [**Previous sessions**](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts), and the three-dots menu at the end of the bar, which opens the room's actions |
| The side panel  | Who is in the room, who you are in it, the room brief, and the files shared so far                                                                                                                                                                                                        |
| The thread      | The conversation, and what the room reports about each turn                                                                                                                                                                                                                               |
| The message box | Where you write, and where you set who answers                                                                                                                                                                                                                                            |

The room opens the moment you select a chat experience on **My Experiences**. It opens empty, with nobody in it and nothing said.

### The side panel

The side panel is the roster. Its header reads **In this room**, with the number of characters after it once any are seated.

An empty room replaces the roster and your own row with an **Add the participants** card. Every character in the room takes a row of its own, carrying its name, its role, and the workspace it came from.

Your own row sits under the roster once anyone is in it. In a room of two or more characters it is labeled **Moderator** and described as "You ask, they answer"; in a one-character room it is labeled **You** and described as "Talking with ⟨name⟩". Your workspace follows the description when there is one to show.

Two sections close the panel. **Room brief** holds the room type and the purpose for the whole conversation, beside a **Fixed at creation** label. [**Shared in room**](/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room) lists the files attached during the conversation, and reads "Files you attach show up here for every character." until one is.

Every control in the top bar and the panel, and what each one does, is listed in [Room controls reference](/api-docs/no-code-experiences/chat-experiences/running-the-room/room-controls-reference).

### The thread

The thread is the conversation, and it is also where the room reports what happened to each message.

It opens with the time the room was opened. While nobody is in the room, a pinned **Room brief** card holds the purpose and the room type's rules, above the heading **Nobody is in the room yet**. Characters joining produce a divider naming who joined and saying they were briefed, followed by a box holding the briefing itself—titled **What each character was told on joining** in a room of two or more, and **What ⟨name⟩ was told on joining** when a single character is in the room.

A one-character room is not briefed by its room type. The rules listed in that box always read **One other person**, **Stay in character**, and **Respond when addressed**, and the wording around your purpose is written for one character rather than taken from the type—unless you reworded the briefing yourself in the create dialog, in which case your wording stands.

After that the thread carries the conversation. Your own messages sit to the right, each with a caption under it reporting what the turn asked for and what came back. Replies sit to the left under the character's name and role. Between them the room adds short notes: who stayed quiet, who did not answer, and who left the room.

### The message box

The message box is where you write, and where you decide who answers.

The prompt in the box invites you to write to the room, or to type @ to call on someone. Below the text is a row that starts with the paperclip for attaching files and then the respond chip, which shows what the next message will ask for—the respond mode, or the names when you have tagged someone—and opens the respond menu. A one-character room shows a sentence in place of the chip, because there is nobody to route between.

The box locks whenever the room cannot take a message—before any character is in the room, while the characters are joining, while a turn is running, and after the room fails to connect—and it always says why. See [You cannot send a message](/api-docs/no-code-experiences/chat-experiences/troubleshooting/composer-is-locked).

### Which page answers which question

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>How a turn works</strong><br>Why the room answers one message at a time, what the turn caption counts, and why a character may say nothing.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/running-the-room/how-a-turn-works">How a turn works</a></td></tr><tr><td><strong>Choose who replies</strong><br>Set who answers the next message, and tag individual characters when you want only them.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/running-the-room/choose-who-replies">Choose who replies</a></td></tr><tr><td><strong>Respond modes reference</strong><br>All five respond modes, what each asks of the characters, and what the thread shows afterwards.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/running-the-room/respond-modes-reference">Respond modes reference</a></td></tr><tr><td><strong>Add or remove characters mid-conversation</strong><br>Seat a character in a running room, remove one, and work with the controls that freeze during a turn.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/running-the-room/add-or-remove-characters">Add or remove characters mid-conversation</a></td></tr><tr><td><strong>Room controls reference</strong><br>Every control in the top bar and the side panel, and what each one does.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/running-the-room/room-controls-reference">Room controls reference</a></td></tr></tbody></table>

The brief the room runs on is written before any of this, in the create dialog.

{% content-ref url="/pages/JB0vrBj0eVm7tphTX3QY" %}
[The room brief](/api-docs/no-code-experiences/chat-experiences/the-room-brief)
{% endcontent-ref %}


# How a turn works

Understand why a chat experience room answers one message at a time, what the turn caption counts, and why a character may stay quiet.

A chat experience room answers one message at a time, and it reports the result of each one under the message that prompted it. That report is where every wait, every count, and every "stayed quiet" line in the thread comes from. Knowing how a turn is measured tells you what the room is still waiting for, what it has given up on, and which characters chose to say nothing.

### One message at a time

A message and the replies it draws are one turn, and the room runs one turn at a time. A turn moves through three states, and the message box tells you which one you are in:

```mermaid
stateDiagram-v2
    [*] --> Open
    Open --> Answering: you send a message
    Answering --> Answering: a reply arrives
    Answering --> Finishing: the last reply lands
    Finishing --> Open: the caption and any quiet note are in place
```

Sending a message locks the message box. The lock holds while the characters answer and for a moment after the last reply lands, then the box unlocks and takes the next message. You cannot type into the box while it is locked, and focus comes back to it the moment the turn is over.

The reason is that a reply belongs to the message that prompted it. Every reply, every count, and every note is filed under one of your messages, and the thread reads as a record of what each message produced. A second message accepted mid-turn would have replies to the first arriving underneath it.

### What the turn caption reports

The caption under your own message is built from two halves: what the turn asked for, and what came back. A middle dot separates them, and in a room of two or more characters the second half can carry up to three counts, separated by middle dots of their own.

A room opens on the default mode, whose label reads `Auto · room brief decides`. In a room of four characters left on it, a caption can read:

`Auto · room brief decides · 2 of 4 responded · 1 listening · 1 did not answer`

The first half names the mode the turn ran under. The counts that follow are these:

| Count              | What it counts                                                                                            |
| ------------------ | --------------------------------------------------------------------------------------------------------- |
| `2 of 4 responded` | How many of the characters in the room when you sent the message have replied, out of how many were in it |
| `1 listening`      | Characters that have not replied and that the room has not reported as failing to answer                  |
| `1 did not answer` | Characters the room reports as not answering, and that have not replied                                   |

Only the counts that apply are printed. A turn everyone answered reads `Auto · room brief decides · 4 of 4 responded` and stops there. The first count is not the whole caption: the two that can follow it change what it means.

`listening` shifts meaning as the turn settles. While the room is still answering, a listening character is one still to answer. Once the turn is over, a listening character is one that chose to stay quiet, and where the room reports which characters those were, a note below the replies names them.

A caption describes the room as it stood when the message was sent, so seating or removing a character later leaves your earlier captions counting as they already did. See [Add or remove characters mid-conversation](/api-docs/no-code-experiences/chat-experiences/running-the-room/add-or-remove-characters).

Those three counts belong to Auto alone. The other respond modes report in their own words: **Everyone must respond**, and a turn that tags two or more characters, count `replied` rather than `responded`, against the number the turn asked for; **Anyone may respond** names the characters that replied instead of counting them, and adds `⟨n⟩ passed` for the ones that did not. Every caption shape is set out in [Respond modes reference](/api-docs/no-code-experiences/chat-experiences/running-the-room/respond-modes-reference).

A saved transcript reports less than a live room does: its captions carry the reply count alone. See [Review a past session](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/review-a-past-session).

### Why a character may say nothing

A character answers when it is addressed, and stays quiet otherwise. A room that receives a message addressed to nobody in particular can produce no replies at all.

When a character stays quiet, the room names it in a note under the replies, and the wording follows the mode the turn ran under. On Auto the note says the character stayed quiet as the brief asks, and invites you to tag it. On **Anyone may respond** the note says the character had nothing to add and passed. Under the three modes that require an answer from every character they address, the note is shorter and names the characters alone. [Respond modes reference](/api-docs/no-code-experiences/chat-experiences/running-the-room/respond-modes-reference) gives each wording in full, and a note kept in a saved transcript is shorter still—see [Review a past session](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/review-a-past-session).

Where a quiet character is counted follows the mode as well:

| Mode the turn ran under | Where the quiet character is counted                                                                                                                                  |
| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Auto                    | Under `listening`, never under `did not answer`. The two are different outcomes: a character that had nothing to say is not one the room reports as failing to answer |
| **Anyone may respond**  | Under `⟨n⟩ passed`. This caption carries no `listening` count and no `did not answer` count at all                                                                    |

{% hint style="info" %}
To get an answer out of a character named in a quiet note, send another message that tags it. A tagged character has to reply. See [Choose who replies](/api-docs/no-code-experiences/chat-experiences/running-the-room/choose-who-replies).
{% endhint %}

### What a one-character room reports

A room holding one character has a caption of its own, whatever the respond mode is set to. It names the character rather than the mode, because there is nobody to route between. The caption opens `Sent to ⟨name⟩`, and what follows the name reports the turn:

| What follows the name | What it means                            |
| --------------------- | ---------------------------------------- |
| `replied`             | The character has answered               |
| `waiting`             | The room is still answering this message |
| Nothing               | The turn is over and no reply came       |

A message sent while one character was seated keeps this caption afterwards, even once you have seated more.

### What the message box shows while the room is answering

The message box carries the wait in place of its usual prompt, and the wording moves on as the turn settles. While replies are still outstanding it reads `Waiting for 2 of 4…`, where the first number is how many characters are still to answer and the second how many the turn asked for. Once the last reply has arrived and the room is closing the turn, it reads `Finishing the turn…`. The box unlocks when the turn is over.

A message you have already started—typed text, or a file you have attached but not sent—hides the prompt, so the wait appears on a line under the box instead.

A turn is not the only thing that locks the box, and the box always says which reason applies. [You cannot send a message](/api-docs/no-code-experiences/chat-experiences/troubleshooting/composer-is-locked) reads each one and tells you what clears it.

### Related pages

The mode you pick decides most of what a caption reports, the message box tells you how far the turn has got, and a finished conversation keeps a shorter record of both.

{% content-ref url="/pages/CapuLwQxA4YBIFvfXGK4" %}
[Choose who replies](/api-docs/no-code-experiences/chat-experiences/running-the-room/choose-who-replies)
{% endcontent-ref %}

{% content-ref url="/pages/632lwoBp57zO0IFCB6op" %}
[Respond modes reference](/api-docs/no-code-experiences/chat-experiences/running-the-room/respond-modes-reference)
{% endcontent-ref %}

{% content-ref url="/pages/mdw0RZR6DKpPIRFMydRu" %}
[You cannot send a message](/api-docs/no-code-experiences/chat-experiences/troubleshooting/composer-is-locked)
{% endcontent-ref %}

{% content-ref url="/pages/VfI41Y7sNmNID37EoZGi" %}
[Review a past session](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/review-a-past-session)
{% endcontent-ref %}


# Choose who replies

Set who answers the next message in a chat experience room, tag individual characters, and address the whole room at once.

A chat experience room of two or more characters opens on **Auto · room brief decides**, where the [room brief](/api-docs/no-code-experiences/chat-experiences/the-room-brief) settles who answers. Two controls override it: the respond chip under the message box, which holds until you change it, and an `@` tag in the message, which applies to that message only. Use this page to set either one, to know which of them wins, and to see what a room holding a single character offers instead.

### Prerequisites

* A chat experience room with at least one character in it. See [Add characters to the room](/api-docs/no-code-experiences/chat-experiences/add-characters-to-the-room).
* The message box unlocked. The respond chip is disabled whenever the message box is. See [You cannot send a message](/api-docs/no-code-experiences/chat-experiences/troubleshooting/composer-is-locked).

### Set who answers with the respond chip

In a room of two or more characters, the respond chip sits in the row under the message box, to the right of the paperclip that attaches files. It shows who the next message will go to, and selecting it opens the respond menu.

{% stepper %}
{% step %}

#### Open the respond menu

Select the chip. The menu opens under a section label asking who should respond.

Four modes are listed: **Auto · room brief decides**, **Everyone must respond**, **Anyone may respond**, and, below a divider, **Only the characters I tag**. A fifth, **Only one character**, sits at the foot of the menu with a chip for each character in the room.
{% endstep %}

{% step %}

#### Pick a mode

Select the mode you want. Each carries a line describing what it asks of the characters, and the mode in force carries a check mark.

Selecting **Auto · room brief decides**, **Everyone must respond**, or **Anyone may respond** closes the menu and sets the chip. Selecting a character under **Only one character** sets the chip to **Only** followed by that name. Selecting **Only the characters I tag** closes the menu and types an `@` into the message box for you, which opens the tag list.
{% endstep %}
{% endstepper %}

The setting stays until you change it. It applies to every message you send from then on, not to one message.

For what each mode asks of the characters and what the thread shows afterwards, see [Respond modes reference](/api-docs/no-code-experiences/chat-experiences/running-the-room/respond-modes-reference).

### Tag a character in the message

Tagging names a character inside the message itself, and it asks that character for a reply rather than leaving the choice to it.

{% stepper %}
{% step %}

#### Type an @

Type `@` at the start of the message or after a space. The tag list opens above the box, holding the characters in the room.

Each row carries the character's name, its role, and its workspace. A character you have already tagged in this message is marked **already tagged**.
{% endstep %}

{% step %}

#### Narrow the list

Keep typing the name without its spaces—Mira Song is tagged as `@MiraSong`—and the list keeps the characters whose name starts with what you have typed. Case does not matter, and typing a space ends the tag and closes the list.

Two characters sharing a name are offered as the name and the name with `(2)` after it, and the two resolve to different characters.
{% endstep %}

{% step %}

#### Insert the tag

Press `Enter` or `Tab` to insert the character the list has highlighted, or select its row. The arrow keys move the highlight, and `Escape` closes the list without tagging.

The tag is written into the message as `@` followed by that name without its spaces, and it is highlighted in the box. Tag as many characters as you want in one message.
{% endstep %}
{% endstepper %}

{% hint style="info" %}
Naming a character in ordinary prose—"Maya, what did you think of the price?"—may draw that character out under Auto, but nothing holds it to a reply. A tag is the explicit form: it asks the character outright, and the room holds it to that rather than leaving the decision to the character.
{% endhint %}

### Address every character at once

`@everyone` is the last option in the tag list, under a divider. It is offered only in a room of two or more characters, and only while what you have typed still matches `everyone`: type `@n` and it drops out of the list, the same narrowing the character rows follow. The row reads `@everyone` with the size of the room beside it—`all four must reply` in a room of four.

Selecting it addresses every character in the room. The chip changes to **Everyone must respond**, and each character is asked to reply in turn. A character that is asked to reply can still answer nothing, and the thread names it under the replies. See [Respond modes reference](/api-docs/no-code-experiences/chat-experiences/running-the-room/respond-modes-reference).

### How a tag and the chip fit together

A tag in the message wins over the chip, for that message only.

The chip follows what you type, so it always reads what will happen to the message you are writing rather than what you last set. With no tags in the draft, the chip's own setting is what applies. [Respond modes reference](/api-docs/no-code-experiences/chat-experiences/running-the-room/respond-modes-reference) lists every label the chip can carry.

Deleting the tags from the draft returns the chip to its own setting. Sending the message clears the draft, so the next message starts from the chip again.

{% hint style="success" %}
Read the chip before you send. If it names the mode you picked or the characters you tagged, the message is addressed the way you meant it. If it still reads **Auto · room brief decides**, nothing you have set or typed has taken effect.
{% endhint %}

### A one-character room has no respond chip

A room holding one character shows a sentence where the chip would be: "One character in the room: every message goes to ⟨name⟩." There is no menu and no mode to set, because every message reaches the only character there.

Typing `@` still opens the tag list with that one character in it, and `@everyone` is not offered. Tagging asks the character for a reply outright; left untagged, it answers when your message addresses it and stays quiet otherwise, which is what the briefing written for a single-character room tells it to do. See [How the room brief is written](/api-docs/no-code-experiences/chat-experiences/the-room-brief/how-the-room-brief-is-written).

Seat a second character and the chip appears.

### Next steps

{% content-ref url="/pages/632lwoBp57zO0IFCB6op" %}
[Respond modes reference](/api-docs/no-code-experiences/chat-experiences/running-the-room/respond-modes-reference)
{% endcontent-ref %}

{% content-ref url="/pages/kvNOiSyLQKpIDjsRl0lw" %}
[How a turn works](/api-docs/no-code-experiences/chat-experiences/running-the-room/how-a-turn-works)
{% endcontent-ref %}


# Respond modes reference

Reference for the five respond modes in a chat experience room, what each one asks of the characters, and what the thread shows afterwards.

A respond mode decides who is expected to answer the next message. Five are available in a room of two or more characters, and a room opens on **Auto**, where the [room brief](/api-docs/no-code-experiences/chat-experiences/the-room-brief) decides who answers.

Two controls set the mode. The respond chip sits to the left of the message box, under what you are typing, and holds until you change it; an `@` tag written into the message applies to that one message. See [Choose who replies](/api-docs/no-code-experiences/chat-experiences/running-the-room/choose-who-replies) for setting either. A room holding one character has no chip and no mode to set: the message box carries a sentence in place of the chip, and every message goes to the character in the room.

### The five respond modes

The menu describes each mode in one line:

| Mode                          | What the menu says                                                                                    |
| ----------------------------- | ----------------------------------------------------------------------------------------------------- |
| **Auto · room brief decides** | "The default. Characters answer when the room brief says it is their turn, and stay quiet otherwise." |
| **Everyone must respond**     | "All ⟨number in the room⟩ characters reply in turn. Use for polls, comparisons and reviews."          |
| **Anyone may respond**        | "An open question. Characters answer only if they have something relevant; others pass."              |
| **Only the characters I tag** | "Type @Name in the message. Every tagged character must reply; untagged ones stay silent."            |
| **Only one character**        | "Pick who answers. Same as tagging a single name."                                                    |

**Everyone must respond** is the one description that changes. It names the number of characters in the room at the moment you open the menu, so it reads "All 3 characters…" in a room of three and "All 6 characters…" after you seat three more.

### Where each mode sits in the menu

The menu opens under a section label asking who should respond, and lists the modes in this order:

| Position | Mode                          | Where it sits                                                                      |
| -------- | ----------------------------- | ---------------------------------------------------------------------------------- |
| 1        | **Auto · room brief decides** | The mode a room opens on                                                           |
| 2        | **Everyone must respond**     |                                                                                    |
| 3        | **Anyone may respond**        |                                                                                    |
| 4        | **Only the characters I tag** | Below a divider, and marked **set by tags**                                        |
| 5        | **Only one character**        | In a panel at the foot of the menu, holding a chip for every character in the room |

The mode in force carries a check mark.

### What the chip shows

The chip always shows what will happen to the message you are writing, so a tag typed into the message changes it:

| In force                                                         | Chip label                        |
| ---------------------------------------------------------------- | --------------------------------- |
| Auto                                                             | **Auto · room brief decides**     |
| Everyone must respond, or `@everyone` in the message             | **Everyone must respond**         |
| Anyone may respond                                               | **Anyone may respond**            |
| One character tagged, or one picked under **Only one character** | **Only** followed by the name     |
| Two or more characters tagged                                    | **Tagged:** followed by the names |

A name in the chip is written the way the tag list offers it, so two characters sharing a name read as the name and the name with `(2)` after it.

**Only the characters I tag** has no chip label of its own. Until a name is tagged, the message behaves as **Auto** and the chip says so.

### What the thread shows after the turn

These are the captions a live room shows; a saved transcript captions the same turns in its own words, and [Review a past session](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/review-a-past-session) carries that wording. The caption under your message names the mode and reports the outcome, and some modes also put a short label beside each reply:

| Mode                                          | Caption                                                                                                                           | Label beside each reply |
| --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | ----------------------- |
| Auto                                          | `Auto · room brief decides` followed by `⟨k⟩ of ⟨n⟩ responded`, then `⟨j⟩ listening` and `⟨f⟩ did not answer` when either applies | `Relevant · answered`   |
| Everyone must respond                         | `Everyone must respond · ⟨k⟩ of ⟨n⟩ replied`                                                                                      | None                    |
| Anyone may respond                            | `Anyone may respond` followed by who replied, or `nobody replied yet`, and `⟨p⟩ passed` when any did                              | `Volunteered`           |
| Only the characters I tag, two or more tagged | `Tagged: ⟨names⟩ · ⟨k⟩ of ⟨n⟩ replied`                                                                                            | None                    |
| Only the characters I tag, one tagged         | `Only ⟨name⟩`, then `replied` or `waiting`                                                                                        | None                    |
| Only one character                            | `Sent to ⟨name⟩`, then `replied` or `waiting`                                                                                     | None                    |

Every placeholder counts something of its own. ⟨k⟩ is how many characters replied, and ⟨n⟩ is what the turn asked: the room as it stood when you sent the message under **Auto** and **Everyone must respond**, and the number of characters tagged on a tagged turn. ⟨j⟩, ⟨f⟩ and ⟨p⟩ are counts in their own right, not the room total: the characters still listening, the characters reported as not answering, and the characters that passed. See [How a turn works](/api-docs/no-code-experiences/chat-experiences/running-the-room/how-a-turn-works) for what each count means.

A turn addressed to a single character carries no outcome word once it is over and nothing came back. The caption is the label alone: `Only ⟨name⟩`, or `Sent to ⟨name⟩`.

Those two labels are the difference between the two ways of addressing one character. The chip reads **Only** followed by the name either way, and the caption records the route the turn took: `Only ⟨name⟩` when the name was tagged in the message, `Sent to ⟨name⟩` when it was picked under **Only one character**.

A room holding one character has a caption of its own, whatever the mode is set to. It names the character rather than the mode: `Sent to ⟨name⟩ · replied` once the character has answered, `Sent to ⟨name⟩ · waiting` while the room is still answering, and `Sent to ⟨name⟩` alone when the turn is over and no reply came.

A turn that tagged two or more characters adds a line under the replies naming everyone in the room left out of it: "Kai and Theo weren't tagged and won't reply to this one." With one character left out, the line reads "wasn't tagged".

### What a quiet character produces

In a live room, two modes let a character answer nothing, and each words the result differently:

| Mode               | Note under the replies                                                                                                                                                 |
| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Auto               | "⟨names⟩ stayed quiet, as the brief asks. Tag them if you want their side." With more than one name, the last sentence reads "Tag one of them if you want their side." |
| Anyone may respond | "⟨names⟩ had nothing to add and passed."                                                                                                                               |

**Everyone must respond**, **Only the characters I tag**, and **Only one character** each ask every character the turn addresses to reply. A character that answers nothing under one of those three is named in a shorter note: "⟨names⟩ passed".

A transcript notes a quiet character in one wording whatever the mode the turn ran under. See [Review a past session](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/review-a-past-session).

### Related pages

{% content-ref url="/pages/CapuLwQxA4YBIFvfXGK4" %}
[Choose who replies](/api-docs/no-code-experiences/chat-experiences/running-the-room/choose-who-replies)
{% endcontent-ref %}

{% content-ref url="/pages/kvNOiSyLQKpIDjsRl0lw" %}
[How a turn works](/api-docs/no-code-experiences/chat-experiences/running-the-room/how-a-turn-works)
{% endcontent-ref %}


# Add or remove characters mid-conversation

Seat a character in a chat experience room that is already running, remove one, and work with the controls that freeze during a turn.

The characters in a room can change while the conversation is running. A character seated halfway through receives the same [room brief](/api-docs/no-code-experiences/chat-experiences/the-room-brief) as the characters already seated, and a character removed stops answering from that point on. Use this page to change the roster of a live room and to recognize the moments when those controls are frozen.

### Prerequisites

* A chat experience room with the conversation already under way. See [Send your first message](/api-docs/no-code-experiences/chat-experiences/send-your-first-message).
* No turn running. The roster controls freeze while the characters are answering, and they say so.

### Add a character to a running room

Seating a character in a running room uses the picker that filled the room in the first place, reached from either of two controls in the side panel: the plus control in the **In this room** header, or **Add characters** under the list of characters. Both open the **Add characters to the room** dialog on its two tabs, **From my workspaces** and **By character ID**. See [Add characters to the room](/api-docs/no-code-experiences/chat-experiences/add-characters-to-the-room) for how to work the picker.

Each character you add takes a row in the side panel straight away, with **Joining the room…** under its name, and settles into a normal row once it is in. The thread marks the moment the briefing lands: a divider names each character that joined and says it was briefed. Each one receives the room brief on top of its own persona, exactly as the characters already seated did.

A character seated mid-conversation is counted from your next message onwards. The [turn captions](/api-docs/no-code-experiences/chat-experiences/running-the-room/how-a-turn-works) on your earlier messages describe the room as it stood when you sent them, so they do not change.

### What changes when a one-character room becomes a group

A room holding one character reports itself differently from a room of two or more, and seating a second character switches it over.

* The message box replaces the line "One character in the room: every message goes to ⟨name⟩." with the respond chip, which sets who is expected to answer. See [Choose who replies](/api-docs/no-code-experiences/chat-experiences/running-the-room/choose-who-replies).
* The section of the side panel holding your own row changes from **You** to **Moderator**, and the line under your name changes from "Talking with ⟨name⟩" to "You ask, they answer".
* Turn captions take their counted form from your next message onwards. The messages you sent while one character was seated keep the caption that names it, `Sent to ⟨name⟩`.

A room opened with one character runs on the single-character briefing, which has its own wording and its own rules rather than the ones a room type sets. Both forms are set out in [How the room brief is written](/api-docs/no-code-experiences/chat-experiences/the-room-brief/how-the-room-brief-is-written).

### Remove a character from the room

Removing takes a character out of the conversation without touching what it already said.

Open the menu on that character's row in the side panel—the dots at the right of the row—and select **Remove from room**. The row disappears at once, and the thread records a note reading "⟨name⟩ left the room" as soon as the room confirms it.

Messages the character already sent stay in the thread under its name, and the turn captions on your earlier messages still describe the room it was part of. Removing a character does not remove it from your workspace; it leaves this conversation only.

### Controls that freeze while a turn is running

The plus control, **Add characters** and **Remove from room** all freeze while the room is answering a message, and while the room is still opening. The reason is shown rather than left to guess.

| What the reason reads                   | When                                                                        |
| --------------------------------------- | --------------------------------------------------------------------------- |
| **Wait for the current turn to finish** | A turn is running. The controls come back when the turn is over             |
| **Connecting the room…**                | The room is still opening, and there is nothing to change the roster of yet |

The reason sits with each frozen control. Hovering the plus control shows it, a line under **Add characters** carries it, and a character's row menu prints it under the frozen **Remove from room** item. In a room with nobody in it, hovering the **Add characters** button—on the **Add the participants** card in the side panel, or under **Nobody is in the room yet** in the thread—shows the same reason.

A room that stays on **Connecting the room…** has not opened yet. See [The room will not connect](/api-docs/no-code-experiences/chat-experiences/troubleshooting/room-will-not-connect).

### The roster belongs to this session

A character you seat now is seated for this session only, and seating it does not add it to the chat experience. Opening the experience again starts a new room with nobody in it, whatever you seated last time. Seating that new room is covered in [Add characters to the room](/api-docs/no-code-experiences/chat-experiences/add-characters-to-the-room).

{% hint style="warning" %}
Reloading the page while a room is open ends that session, roster and all. A session that has ended cannot be rejoined, so seat the characters again and start a new one.
{% endhint %}

### Related pages

{% content-ref url="/pages/EPu642yDXlgvfLaFW9Yb" %}
[Room controls reference](/api-docs/no-code-experiences/chat-experiences/running-the-room/room-controls-reference)
{% endcontent-ref %}

{% content-ref url="/pages/kvNOiSyLQKpIDjsRl0lw" %}
[How a turn works](/api-docs/no-code-experiences/chat-experiences/running-the-room/how-a-turn-works)
{% endcontent-ref %}


# Room controls reference

Reference for the controls in a chat experience room's top bar and side panel, and what each one does to the conversation.

A chat experience room carries controls in a top bar above the conversation and in the side panel down the left. This page lists both, in the order they appear on screen. The message box under the thread holds controls of its own—the respond chip and the paperclip—covered in [Choose who replies](/api-docs/no-code-experiences/chat-experiences/running-the-room/choose-who-replies) and [Share files with the room](/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room).

### The top bar

The top bar runs above the thread and names the experience the room was opened from. It carries these, from left to right:

| Part                  | What it does                                                                                                                                                                                                                           |
| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Back arrow            | Returns to **My Experiences** and ends the conversation                                                                                                                                                                                |
| The experience name   | Names the chat experience this room was opened from                                                                                                                                                                                    |
| Pencil                | Opens **Rename experience**, where you change the name. The room type, the purpose, and the briefing are untouched                                                                                                                     |
| Room type chip        | The room type the experience was created with, for example **Focus group**                                                                                                                                                             |
| Room ID chip          | Copies the room ID. See [The room ID](#the-room-id) below                                                                                                                                                                              |
| Character avatars     | One avatar per character in the room, followed by the count: `1 character`, or `4 characters` in a room of four                                                                                                                        |
| **Text only** chip    | The room's mode. Hovering it shows **Room mode**. The characters answer in writing                                                                                                                                                     |
| **Previous sessions** | Lists the sessions already recorded for this experience, newest first, and offers **Open experience page**. See [Review a past session](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/review-a-past-session) |
| Three-dots menu       | Opens the room's actions, listed below                                                                                                                                                                                                 |

The bar drops what it has no room for as the window narrows. The room ID and the character count go first, and a people icon appears beside the back arrow to open the side panel over the thread. Narrower still, the room type chip, the avatars, and the **Text only** chip go as well, and **Previous sessions** shows as an icon alone.

### The three-dots menu

The three-dots menu sits at the right of the top bar and holds these actions:

| Item                           | What it does                                                                                                                                                                                                            |
| ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Rename experience**          | Opens the same rename dialog as the pencil                                                                                                                                                                              |
| **Duplicate with a new brief** | Opens the create dialog prefilled from this experience, with every field editable. See [Why the brief cannot be changed](/api-docs/no-code-experiences/chat-experiences/the-room-brief/why-the-brief-cannot-be-changed) |
| **Export transcript**          | Downloads the conversation in this room as a Markdown file. See [Export a transcript](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/export-a-transcript)                                      |
| **Clear conversation**         | Ends the conversation and empties the room: the thread, the characters, and the **Shared in room** list                                                                                                                 |

{% hint style="warning" %}
**Clear conversation** ends the conversation as soon as you select it. It does not ask you to confirm, and a conversation that has ended cannot be rejoined. The room stays open, emptied and waiting for characters, so the room you are looking at afterwards is a new one.
{% endhint %}

### The room ID

The room ID is the short identifier in the top bar, beginning with `rm_`. Selecting the chip copies it and confirms with **Room ID copied**.

The ID belongs to the chat experience, so every room opened from that experience shows the same one. It is also shown in the list view of **My Experiences**, where you can copy it from the row.

The ID names the room inside your own account. A chat experience and the rooms opened from it are reachable only by the account that created them, so the ID does not give anyone else a way into the room.

Belonging to the experience, the ID cannot tell one session from another. Each session has an identifier of its own, and an exported transcript is named from it. See [Export a transcript](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/export-a-transcript).

### The side panel

The side panel holds the roster, your own row, the brief, and the files shared so far. On a narrow screen it opens over the thread from the people icon beside the back arrow, and an X in its header closes it again. From top to bottom it carries these:

| Part                                       | What it does                                                                                                                                          |
| ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| **In this room**                           | Names the section. The number of characters follows it once any are seated                                                                            |
| The plus in the header                     | Opens the character picker. Present once the room has characters in it                                                                                |
| A character's row                          | Names the character, its role, and where it came from: your workspace, or "Shared with you" for a character added by ID                               |
| The dots at the right of a character's row | Hold **Remove from room**                                                                                                                             |
| **Add characters**                         | Opens the character picker. Sits under the list of characters, and on the **Add the participants** card while the room is empty                       |
| **Moderator** or **You**                   | The section holding your own row. **Moderator** in a room of two or more characters, **You** in a one-character room                                  |
| Your row                                   | Your name with **(you)** after it, described as "You ask, they answer" or "Talking with ⟨name⟩", followed by your workspace when there is one to show |
| **Room brief**                             | The room type and the purpose set when the experience was created, the same in every session                                                          |
| **Fixed at creation**                      | The lock beside the brief. Hovering it explains why the brief cannot change and offers **Duplicate with a new brief**                                 |
| **Shared in room**                         | The files attached during this conversation. Reads "Files you attach show up here for every character." until one is attached                         |

The panel shows the same room type and purpose whatever the size of the room. In a one-character room, though, the briefing that character was given is written in wording of its own rather than from the room type. See [How the room brief is written](/api-docs/no-code-experiences/chat-experiences/the-room-brief/how-the-room-brief-is-written).

The plus, **Add characters**, and **Remove from room** are all disabled while a turn is running or while the room is opening. The reason is written under **Add characters** and inside the row menu, and the plus carries it when you hover. See [Add or remove characters mid-conversation](/api-docs/no-code-experiences/chat-experiences/running-the-room/add-or-remove-characters).

An empty room replaces the roster and your own row with a single **Add the participants** card, reading "Each character receives the room brief the moment they join."

### Related pages

{% content-ref url="/pages/ZCOz9YfNatIZcAdbd6nj" %}
[Add or remove characters mid-conversation](/api-docs/no-code-experiences/chat-experiences/running-the-room/add-or-remove-characters)
{% endcontent-ref %}

{% content-ref url="/pages/CapuLwQxA4YBIFvfXGK4" %}
[Choose who replies](/api-docs/no-code-experiences/chat-experiences/running-the-room/choose-who-replies)
{% endcontent-ref %}


# Sessions and transcripts

Understand why every opening of a chat experience is a new room, what carries over from the last one, and what is kept afterwards.

A session is one conversation in a chat experience, from the characters taking their seats to the moment the conversation ends. Every opening starts a new session, and a finished one is kept as a transcript you can read but not continue.

### Why every opening is a new room

Opening a chat experience always starts a new room. There is no control that reopens a past conversation, and a conversation that has ended cannot be re-entered.

The room opens empty. It becomes a session once the characters you seat have joined, and the experience records it from there. Opening an experience and going back without adding anyone records nothing. A session nobody wrote in is still recorded and still listed, with **No messages recorded** in place of its first question.

Opening the experience is not the only thing that starts a session. **Clear conversation** ends the conversation you are in and keeps you in the same room, emptied, so seating characters there again starts another numbered session at the same address. See [Room controls reference](/api-docs/no-code-experiences/chat-experiences/running-the-room/room-controls-reference).

Sessions are numbered in the order they ran. `Session 1` is the first the experience recorded, and the newest one leads every list. A new session never renumbers the ones before it.

### What carries over to the next session

The brief carries over. The characters and the messages do not. The experience's own page says so beside **Previous sessions**: "Each session is its own thread. The brief carries over; the characters and the messages do not." Here is what a new room starts with, and what it starts without:

| What                                                                                                                                              | Carries into the next session                                                               |
| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| The room type, the purpose, and the [briefing every character receives on joining](/api-docs/no-code-experiences/chat-experiences/the-room-brief) | Yes. They are fixed when the experience is created, so every session runs on the same words |
| The experience name                                                                                                                               | Yes, until you rename it                                                                    |
| The [room ID](/api-docs/no-code-experiences/chat-experiences/running-the-room/room-controls-reference#the-room-id)                                | Yes. It belongs to the experience, so it is the same in every session                       |
| The [characters you seated](/api-docs/no-code-experiences/chat-experiences/add-characters-to-the-room)                                            | No. A new room opens with nobody in it, and you choose again                                |
| The conversation                                                                                                                                  | No. Messages belong to the session they were sent in                                        |
| The [respond mode](/api-docs/no-code-experiences/chat-experiences/running-the-room/respond-modes-reference) you set                               | No. A new room starts on **Auto · room brief decides**, whatever the last session ended on  |

Seating four characters, running a long conversation, and coming back the next day gives you an empty room and the same brief.

### What a finished session keeps

A finished session is kept as a read-only thread: your messages, the replies each one drew, and a note naming any character that stayed quiet. Each recorded session also carries when it ran, the first question you asked, and how many messages it holds, which are the details the experience's page shows on every row.

A message that carried files keeps their names. The files themselves are not kept, so a past session names what was shared without holding it. See [Share files with the room](/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room).

Reading a session again does not reopen it. Another message needs another session, with the characters seated again.

A transcript is not a copy of the live room. Some of what the room shows while a conversation is running is not part of the record, and [Review a past session](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/review-a-past-session) sets out what is left off.

### Who can open a past session

A chat experience, the rooms opened from it, and their transcripts belong to the account that created them and open only for that account. No other account reaches them.

What a session recorded can be downloaded as a Markdown file. See [Export a transcript](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/export-a-transcript).

### Where each task lives

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Review a past session</strong><br>Open an experience's history, pick a finished conversation, and read what the transcript records.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/review-a-past-session">Review a past session</a></td></tr><tr><td><strong>Export a transcript</strong><br>Download a conversation as a Markdown file, and know what that file holds.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/export-a-transcript">Export a transcript</a></td></tr></tbody></table>

A conversation that is still running belongs to the room's own pages rather than these.

{% content-ref url="/pages/kSda6H5yqLJkFsnndHYK" %}
[Running the room](/api-docs/no-code-experiences/chat-experiences/running-the-room)
{% endcontent-ref %}


# Review a past session

Open a chat experience's previous sessions, pick one of its finished conversations, and read the whole thread, including what a saved transcript leaves out.

A finished conversation stays with the chat experience that ran it and can be opened again as a read-only thread. Use this page to reach an experience's previous sessions, pick one, and read it.

### Prerequisites

* A chat experience with at least one recorded session. See [Send your first message](/api-docs/no-code-experiences/chat-experiences/send-your-first-message) for how to record one, and [Sessions and transcripts](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts) for what a session is.

### Open an experience's previous sessions

Two routes reach the same place, the experience's own page, which lists every session it recorded:

| From                                                                                     | What to select                                                                                                                                                                                                                       |
| ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [**My Experiences**](/api-docs/no-code-experiences/chat-experiences/open-my-experiences) | The three-dots menu on the experience's card or row, then **Previous sessions**. The session count opens the same page: a card reads `3 sessions · last Mar 4` or `No sessions yet`, and a row stacks `3 sessions` over `last Mar 4` |
| An open room                                                                             | **Previous sessions** in the top bar, then **Open experience page** at the foot of the menu                                                                                                                                          |

The menu behind **Previous sessions** in a room lists the same sessions, so a conversation can be opened straight from it. The row marked `· you are here` is the room you are in; selecting it closes the menu and leaves you where you are.

### What the experience's page shows

The page lists every session the experience recorded, newest first, beside the brief they all share.

The experience's name heads the page with its [room type](/api-docs/no-code-experiences/chat-experiences/the-room-brief/room-types-reference) and [room ID](/api-docs/no-code-experiences/chat-experiences/running-the-room/room-controls-reference#the-room-id) beside it, and a line under it reading the number of recorded sessions and the date the experience was created. A link back to **My Experiences** sits above the name. **Start new session** opens a new room from this experience; nothing on this page resumes an old one.

The list sits under **Previous sessions**, with the reminder "Each session is its own thread. The brief carries over; the characters and the messages do not." Each row carries these:

| What the row shows             | What it means                                                                                                                                                                                |
| ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Session 4`                    | Its place in the experience's list, counted from the first session recorded                                                                                                                  |
| The first question you asked   | The opening line of that conversation. A session that recorded nothing reads `No messages recorded` here instead                                                                             |
| `Sat Sep 6 · 16:57–17:05`      | The day the session ran, and the span from the moment it opened to its last reply. A session that drew no reply shows the opening time alone, and one that ran past midnight names both days |
| `12 messages`                  | Your messages plus the replies that carried text                                                                                                                                             |
| **Open**                       | Opens the session as a read-only thread                                                                                                                                                      |
| The three-dots menu on the row | Holds **Export transcript**. See [Export a transcript](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/export-a-transcript)                                          |

If the experience ran rooms before it began recording sessions, a line above the list gives the total it counts and how many of those came earlier. An experience with nothing recorded shows a panel in place of the list: "No sessions recorded yet. Rooms opened before this experience began recording sessions are not listed; the next one will appear here."

The brief panel beside the session list holds [**Room brief**](/api-docs/no-code-experiences/chat-experiences/the-room-brief): the room type, the purpose, the room type's rules, and the **Fixed at creation** label. The written briefing itself is not repeated here. There is no roster on this page, because characters are picked for each session and no single cast belongs to the experience.

### Read a finished session

Selecting **Open** on a row shows that session as a read-only thread.

The header names the experience, its room type, and the session itself—`Session 4 · Sat Sep 6 · 16:57–17:05 · 12 messages`. The back chevron in the header returns to the list, and **Export transcript** is the other control it carries.

Under the header the conversation reads as it did at the time. Your own messages sit to the right with a caption under each one, replies sit to the left under the character that sent them, and a note names any character that stayed quiet on a turn.

Two things the live room has are absent, because a finished session has no use for them: there is no side panel and no message box. Each reply carries the character's name alone. The role that sits beside a name in a live room, and the workspace shown under the name in the side panel, are not part of a transcript.

{% hint style="warning" %}
A session page holds the first 200 turns. A longer one opens with a note at the top of the thread: "Showing the first 200 turns of ⟨total⟩. The rest are not on this page or in the export." Its message count on the row and in the header then ends in a plus sign, such as `412+ messages`, because that count is a floor taken from the turns on the page rather than the session's own total.
{% endhint %}

If a session will not open, or nothing is listed where you expected a session, see [Briefs and transcripts](/api-docs/no-code-experiences/chat-experiences/troubleshooting/briefs-and-transcripts).

### What a transcript does not record

A transcript records what was said, not every detail the room showed while it was being said. Three differences are worth knowing before you read one.

**Auto and Anyone may respond read back the same.** A turn sent under either one carries the caption `Auto · room brief decides`. Read that caption as a description of who answered rather than as a record of the setting you chose. Every other mode is kept, so an **Everyone must respond** turn still reads `Everyone must respond` and a tagged turn still names who was tagged. A turn addressed to one character reads `Only ⟨name⟩` whichever way you addressed it, where a live room writes `Sent to ⟨name⟩` for a character picked under **Only one character**. See [Respond modes reference](/api-docs/no-code-experiences/chat-experiences/running-the-room/respond-modes-reference).

**The quiet note is shorter.** A transcript names a character that said nothing and stops there. A live room says more, and how much more depends on the mode the turn ran under:

| Where                                                                                              | What the note reads                                                                                                                                                                 |
| -------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| A live room on **Auto**                                                                            | "⟨names⟩ stayed quiet, as the brief asks. Tag them if you want their side." The last sentence reads "Tag one of them if you want their side." when more than one character is named |
| A live room on **Anyone may respond**                                                              | "⟨names⟩ had nothing to add and passed."                                                                                                                                            |
| A live room on **Everyone must respond**, **Only the characters I tag**, or **Only one character** | "⟨names⟩ passed"                                                                                                                                                                    |
| A transcript, whatever the mode                                                                    | "⟨names⟩ stayed quiet."                                                                                                                                                             |

**A caption carries one count.** In a live room a caption can carry up to three: the replies, the characters still listening, and the characters that did not answer. A transcript caption carries the reply count alone, such as `2 of 4 responded`. See [How a turn works](/api-docs/no-code-experiences/chat-experiences/running-the-room/how-a-turn-works).

### Next steps

{% content-ref url="/pages/TzbHjFzyDx3HtnGDPh0w" %}
[Export a transcript](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/export-a-transcript)
{% endcontent-ref %}

{% content-ref url="/pages/MAl0EbSyk5hMfoBIsxmR" %}
[Manage your chat experiences](/api-docs/no-code-experiences/chat-experiences/manage-your-chat-experiences)
{% endcontent-ref %}


# Export a transcript

Download a chat experience conversation as a Markdown file from a past session, from the sessions list, or from the room while it is still running.

A conversation held in a chat experience can be downloaded as a Markdown file, whether it has finished or is still running. Use this page to export one, and to know what the file holds before you open it.

### Prerequisites

* A chat experience session with messages in it. See [Sessions and transcripts](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts).

### Export a session from an experience's history

**Export transcript** sits in three places: on a session's row on the experience's page, in the header of a session you have opened, and in the room's own menu while the conversation is still running. Every one of them produces the same file. The steps below take the first.

{% stepper %}
{% step %}

#### Open the experience's history

Open the three-dots menu on the experience's card or row on **My Experiences** and select **Previous sessions**.

The experience's page opens with every session it recorded, newest first.
{% endstep %}

{% step %}

#### Choose the session to export

Find the session by its number, its first question, or the day it ran. Each row carries all three.
{% endstep %}

{% step %}

#### Export from the session's menu

Open the three-dots menu at the right of the session's row and select **Export transcript**.

The same export is available from inside the session: select **Open** on the row, then **Export transcript** at the top right of the header.
{% endstep %}

{% step %}

#### Confirm the download

The browser saves the file, and the page confirms with **Transcript downloaded**. Any other message means no file was written, and it names what to do instead. See [Briefs and transcripts](/api-docs/no-code-experiences/chat-experiences/troubleshooting/briefs-and-transcripts).
{% endstep %}
{% endstepper %}

### Export the conversation you are in

A room exports the conversation recorded for the session running in it, covering every message sent so far. Characters have to be seated and the conversation under way before there is anything to export. Open the three-dots menu in the room's top bar and select **Export transcript**.

Going back to **My Experiences** afterwards does not cost you the conversation. It is recorded as a session of that experience and can be exported again from the experience's page.

### What the Markdown file holds

{% hint style="warning" %}
A session longer than 200 [turns](/api-docs/no-code-experiences/chat-experiences/running-the-room/how-a-turn-works) exports its first 200 turns and no more, whichever of the three routes produced the file. A session that ran past the limit says so in a note at the top of its own thread, before you export it.
{% endhint %}

The file is plain Markdown, readable in any text editor. It opens with a heading reading `# Room` followed by the session's identifier, which is the only thing in the file tying it to a session: neither the session's number, nor the experience's name, nor the date it ran is written into it.

After the heading comes one section per turn: your message, followed by one line for each reply it drew. A turn that carried files adds an italic line naming them between the two:

{% code title="room-3f8c1a44-e2d7-4f5c-9d0e-2a416f0c2b7e.md" %}

```markdown
# Room 3f8c1a44-e2d7-4f5c-9d0e-2a416f0c2b7e

## Turn 1 — open

Here is last quarter's pricing. What stands out?

_Attachments: q3-pricing.pdf_

**Maya**: The renewal rate is the outlier.
**Luis**: _passed_

## Turn 2 — tagged

Maya, what did you think of the price?

**Maya**: It felt high for what you get.
```

{% endcode %}

Turns are numbered from the start of the conversation, and the word after the turn number is how the turn was addressed: `all` for a message everyone had to answer, `tagged` for one that named the characters it wanted, and `open` for one the room was free to answer or leave. That last word covers a turn sent under **Auto · room brief decides** and one sent under **Anyone may respond** alike, so the file does not say which of the two a turn ran under. See [what a transcript does not record](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/review-a-past-session#what-a-transcript-does-not-record) for the rest of what a saved conversation leaves behind.

A character that stayed quiet on an `open` turn takes a line of its own reading `_passed_`, rather than the single note the session's page shows in its place. The attachments line names the files shared on a turn, and the names are all of them it keeps: no file contents travel with the transcript.

### What the file is called

The name is `room-` followed by the session's own identifier and `.md`, so the example above downloads as `room-3f8c1a44-e2d7-4f5c-9d0e-2a416f0c2b7e.md`.

Every session has an identifier of its own. Exporting several sessions of one experience therefore produces several differently named files, and none of them overwrites another. The name does not use the room ID shown in the room's top bar, which is the same for every session of an experience.

### Next steps

{% content-ref url="/pages/VfI41Y7sNmNID37EoZGi" %}
[Review a past session](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/review-a-past-session)
{% endcontent-ref %}

{% content-ref url="/pages/shUmFFbGwwR9Qw8p3eov" %}
[Briefs and transcripts](/api-docs/no-code-experiences/chat-experiences/troubleshooting/briefs-and-transcripts)
{% endcontent-ref %}

{% content-ref url="/pages/NEs7xFxvuvS2th74dKa5" %}
[Sessions and transcripts](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts)
{% endcontent-ref %}


# Share files with the room

Understand what reaches the characters when you attach a file to a message in a chat experience room, and what the room keeps afterwards.

A message you send in a [chat experience](/api-docs/no-code-experiences/chat-experiences) room can carry files. A file is never handed to the characters as a file: what reaches them is text—either the words the file already holds, or a description written for it. These pages cover what each kind of file becomes, what the room shows you about it, and what is kept once the conversation is over.

### What the characters receive

A file goes to the characters that turn is addressed to. A character the message did not address is not given the file, and the replies that follow do not pass it on. If you want every character to have a file, address the message to everyone—tag `@everyone`, or set the respond chip to **Everyone must respond**—before you send it. See [Choose who replies](/api-docs/no-code-experiences/chat-experiences/running-the-room/choose-who-replies).

Those characters receive text, and only text. A room carries writing, so every file you attach becomes writing before it travels.

There are two ways that happens. A file that holds words is shared as its own words: a PDF, a Word file, and every plain-text format reach the characters as the text they contain. A file that holds a picture cannot be shared that way, so a description of the picture is written and the characters receive the description instead. The characters are told that the words describe a picture you attached, and that description is all they have to answer from.

A file you share belongs to the conversation you shared it in. Every new conversation starts with nothing shared.

### What each kind of file becomes

| What you attach                                     | What reaches the characters                                                         |
| --------------------------------------------------- | ----------------------------------------------------------------------------------- |
| A plain-text file—`.txt`, `.md`, `.csv`, or `.json` | The file's own text                                                                 |
| A Word file—`.docx`                                 | The text of the document                                                            |
| A PDF carrying a body of prose                      | The text of the document                                                            |
| A PDF carrying little text of its own               | Whatever text it does hold, then a description of its first pages, written in words |
| A picture—`.png`, `.jpg`, or `.jpeg`                | A description of the picture, written in words                                      |

A PDF is the one format with two outcomes, and both are correct. [Share a document](/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room/share-a-document) sets out which one you get and how the room tells you.

### When a file cannot be read

A file the room could not read is still sent. Its name goes to the characters and nothing else, and the message is not held back.

Nothing tells you in advance whether a file's contents can be shared. You find out afterwards. Every file you attach gets a chip above where you type, and the chip's second line settles once the file has been dealt with. A file whose contents were not shared says so on that line, and a file the room could not read—or a picture it could not describe—also raises a message naming the file.

The paperclip that attaches a file is greyed out only while the message box is locked. No file makes it unavailable. See [You cannot send a message](/api-docs/no-code-experiences/chat-experiences/troubleshooting/composer-is-locked) for every reason the box locks.

### What the room keeps

The room keeps file names, not file contents. Three places show a file after you send it:

* **The thread.** The message you sent carries a chip for every file that went with it.
* **The side panel.** Its **Shared in room** section lists the files sent so far in this conversation, each with its name, the same second line as the chip, and a note saying what the characters were given. [File limits reference](/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room/file-limits-reference) sets out what each note means, and [Running the room](/api-docs/no-code-experiences/chat-experiences/running-the-room) covers the panel's other sections.
* **A finished session's transcript.** It records the name of every file a turn carried, and a transcript you download lists those names under the turn they were sent with. See [Review a past session](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/review-a-past-session) and [Export a transcript](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/export-a-transcript).

**Clear conversation** in the room's three-dots menu empties the **Shared in room** list along with the thread. See [Room controls reference](/api-docs/no-code-experiences/chat-experiences/running-the-room/room-controls-reference).

Because only names are kept, every file in a past session's thread is shown as a name, whatever happened to it at the time. A transcript records that a file was shared, not what the characters were given from it.

### Which page answers which question

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Share a document</strong><br>Attach a PDF, a Word file, or a plain-text file, and read what the chip reports about it.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room/share-a-document">Share a document</a></td></tr><tr><td><strong>Share an image</strong><br>Attach a picture, and understand what the characters are told about it.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room/share-an-image">Share an image</a></td></tr><tr><td><strong>File limits reference</strong><br>The accepted file types, the size and text limits, and what happens at each one.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room/file-limits-reference">File limits reference</a></td></tr></tbody></table>

The message box, where a file is attached, is one of the room's three working parts.

{% content-ref url="/pages/kSda6H5yqLJkFsnndHYK" %}
[Running the room](/api-docs/no-code-experiences/chat-experiences/running-the-room)
{% endcontent-ref %}


# Share a document

Attach a PDF, a Word file, or a plain-text file to a message in a chat experience room, and read what the chip reports about it.

A document you attach reaches the characters your message addresses, as text. Use this page to attach a PDF, a Word file, or a plain-text file, to send it with a message, and to read what the room reports about the file once it has been read or described.

### Prerequisites

* A chat experience room with at least one character already in it. See [Add characters to the room](/api-docs/no-code-experiences/chat-experiences/add-characters-to-the-room).
* A file in one of the accepted formats. See [File limits reference](/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room/file-limits-reference).

### Attach a document and send it

{% stepper %}
{% step %}

#### Pick the file

Select the paperclip at the left of the message box, below where you type, and pick the file. You can pick several files at once.

A chip appears above where you type, carrying the file's format, its name, and a second line reading `reading…` after the size.
{% endstep %}

{% step %}

#### Wait for the chip to settle

The second line changes once the file has been read or described, and what it reads then tells you what the characters will be given.

The arrow button at the right of the message box stays unavailable while any chip still reads `reading…` or `describing…`, and comes back when every chip has settled. The message box also locks for reasons of its own, and always says which. See [You cannot send a message](/api-docs/no-code-experiences/chat-experiences/troubleshooting/composer-is-locked).
{% endstep %}

{% step %}

#### Write the message and send

Write your question and send the message as usual. The message carries the file with it, and the chip moves into the thread above your words.

A message can carry files and no words at all. Add a question if you want the characters to answer about the file: under the default **Auto · room brief decides**, a message carrying nothing but a file usually draws no reply, while a respond chip that names who answers draws a reply whether or not you wrote anything.

Who the turn addresses also settles who has the document: it goes to the characters that turn is addressed to, and a character the message did not address is not given it. In a room of two or more, tag `@everyone` or set the respond chip beside the paperclip to **Everyone must respond** before you send. In a room of one there is no chip to set, and every message already goes to that character. See [Choose who replies](/api-docs/no-code-experiences/chat-experiences/running-the-room/choose-who-replies).

Once the message is away, the chip sits with it in the thread and the file joins the **Shared in room** section of the side panel, carrying the note `described` when the characters were given a description, `name only` when the name was all they got, and no note at all when the file's own text was shared.
{% endstep %}
{% endstepper %}

To take a file off a message before you send it, select the × on its chip.

### What the chip reports for each format

The chip's second line always opens with the file's size. What follows depends on the format:

| What you attached                | What the second line reads                                                                                   |
| -------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| A text file—`.txt` or `.md`      | The size alone, for example `4 KB`                                                                           |
| A CSV file                       | The size and the number of rows, for example `12 KB · 240 rows`                                              |
| A JSON file                      | The size and the file's shape—`8 keys` for a set of fields, `12 items` for a list                            |
| A Word file                      | The size and `document`, for example `1.2 MB · document`                                                     |
| A PDF whose text was read        | The size and the page count, for example `1.2 MB · 14 pages`                                                 |
| A PDF whose pages were described | The size, the page count, and how many pages were described, for example `574 B · 1 page · 1 page described` |

`truncated` is added to the end of that line when that one file held more text than the room shares from a single file. The text is cut at the limit and the rest is not sent. See [File limits reference](/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room/file-limits-reference).

### What happens to a Word file

A `.docx` file reaches the characters as the document's text, and the chip reports `document` after the size rather than a page count. A Word file is never described the way a PDF carrying little text is: if its text cannot be read, the file goes with its name alone.

### What happens to a PDF

A PDF is read in one of two ways, and both are the room working correctly. The chip is what tells you which one you got.

A PDF carrying a body of prose is shared as that prose. The characters receive the document's own words, and the chip reports the page count.

A PDF carrying little text of its own is described instead. Its first pages are described in words, up to four of them, and the chip reports how many were described. The characters receive those descriptions, and, where the file runs past the pages that were described, a line naming the pages that were not.

A one-page PDF holding a single line is described rather than read, and its chip reads `1 page · 1 page described` after the size. To see a PDF's own text reach the characters, attach one with a real body of prose in it.

### Plain-text formats

`.txt`, `.md`, `.csv`, and `.json` files each reach the characters as their own text, unchanged up to the limit above.

A CSV file and a JSON file each add a count to the chip, so you can check that the file was read as the shape you expected before you send it. The CSV row count includes the header row. A JSON file that does not parse as a set of fields or a list shows the size alone, and its text is still shared as it stands.

### When a document cannot be read

A document the room could not read is still sent, by name alone. The characters are given the file name and nothing else.

The room tells you as soon as the file settles, in two places. The chip's second line settles to `could not read` after the size, and a message reads "Could not read ⟨name⟩; only its name will be shared". A PDF that could be neither read nor described settles to `could not describe` instead, and its message reads "Could not describe ⟨name⟩; only its name will be shared". Either outcome sends the name on its own, and the side panel notes the file as `name only`.

### Next steps

A picture follows different rules, and what the characters are told about one is worth reading before you attach it.

{% content-ref url="/pages/gMAovyBd5GfDOZfGwQG0" %}
[Share an image](/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room/share-an-image)
{% endcontent-ref %}

For the accepted formats, the size and text limits, and what happens at each one:

{% content-ref url="/pages/VPSgVKL6e7AmFxiYVtg0" %}
[File limits reference](/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room/file-limits-reference)
{% endcontent-ref %}


# Share an image

Attach a picture to a message in a chat experience room, and understand that the characters receive a written description rather than the picture.

A picture you attach to a message in a chat experience room reaches the characters as words. Use this page to attach a `.png`, `.jpg`, or `.jpeg` picture, to send it with a message, and to know exactly what the characters are told about it.

### Prerequisites

* A chat experience room with at least one character already in it. See [Add characters to the room](/api-docs/no-code-experiences/chat-experiences/add-characters-to-the-room).
* A picture in an accepted format. See [File limits reference](/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room/file-limits-reference).

### Attach a picture and send it

{% stepper %}
{% step %}

#### Pick the picture

Select the paperclip at the left of the message box, below where you type, and pick the file. You can pick several files at once.

A chip appears above where you type, carrying the format, the file name, and a second line reading `reading…` after the size.
{% endstep %}

{% step %}

#### Wait for the description

The second line changes to `describing…` while the picture is being described, and settles to `described` when it is done. The send control stays unavailable until every chip has settled.

Describing a picture takes seconds rather than the instant a text file takes. The wait is normal and the send control returns on its own.
{% endstep %}

{% step %}

#### Write the message and send

Write your question and send the message as usual. The chip moves into the thread above your words, and the file is added to the **Shared in room** section of the side panel.

Ask about the picture in the same message if you want an answer about it. Under **Auto · room brief decides**, the mode a room opens on, a picture sent with no question addresses nobody in particular, and a character that is not addressed stays quiet.
{% endstep %}
{% endstepper %}

{% hint style="success" %}
The picture reached the characters when its chip in the thread reads `described` after the size, and the file is listed under **Shared in room** in the side panel.
{% endhint %}

### Who receives the picture

Whoever the turn addresses is who gets the picture. A character the message did not address is not given the description, and the replies that follow do not pass it on. To put a picture in front of every character, tag `@everyone` or set the respond chip to **Everyone must respond** before you send. See [Choose who replies](/api-docs/no-code-experiences/chat-experiences/running-the-room/choose-who-replies).

### What the characters are told

The characters never receive the picture. They receive a description of it, written in words, and the description is what they answer from.

The description does not arrive on its own: the characters are told these words describe a picture you attached, and are asked to answer from them as though they were looking at the picture rather than saying they cannot see it. An answer therefore reads as though the character had seen the picture, and whatever the description left out is answered with the same confidence as whatever it covered.

Two things follow, and both are worth knowing before you attach:

* **A description is not the picture.** Detail the description does not mention is detail the characters do not have, and nothing in the answer marks the difference. Check an answer that turns on fine detail against the picture in front of you.
* **Ask about what you want covered.** A question naming what matters in the picture gives you a more useful answer than attaching it with no question at all.

### What the chip reports

The chip's second line always opens with the file's size. What follows tells you what the characters were given:

| What the second line reads    | What the characters received                                                |
| ----------------------------- | --------------------------------------------------------------------------- |
| `1.1 MB · describing…`        | Nothing yet. The picture is being described and the send control is waiting |
| `1.1 MB · described`          | A description of the picture, written in words                              |
| `1.1 MB · could not describe` | The file name alone                                                         |

The side panel repeats that second line and adds a short note beside it. In **Shared in room**, a described picture is marked `described`, and a picture shared by its name alone is marked `name only`.

### When a picture is shared by name alone

A picture that could not be described is still sent, by name alone. The characters are given the file name and nothing else, and the message is not held back.

The room tells you in two places at once. The chip's second line settles to `could not describe` after the size, and a message reads "Could not describe ⟨name⟩; only its name will be shared".

{% hint style="warning" %}
Check the chip before you send a picture the conversation depends on. A file name tells the characters that something was attached and nothing about what is in it, so they answer without any account of the picture at all.
{% endhint %}

### Next steps

A PDF carrying little text of its own is described the same way a picture is, and its chip reports the page count as well.

{% content-ref url="/pages/iIVzWiaEKTHUvDdgHNME" %}
[Share a document](/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room/share-a-document)
{% endcontent-ref %}

For the accepted formats, the size and text limits, and what happens at each one:

{% content-ref url="/pages/VPSgVKL6e7AmFxiYVtg0" %}
[File limits reference](/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room/file-limits-reference)
{% endcontent-ref %}

If a picture drew an answer that missed it, or no answer at all, start from what you can see on screen: [Troubleshoot Chat Experiences](/api-docs/no-code-experiences/chat-experiences/troubleshooting).


# File limits reference

Reference for the file types a chat experience room accepts, the size and text limits on an attachment, and what each chip and side-panel note means.

A chat experience room accepts a short list of file formats and limits how much of a file it shares with the characters. This page lists the formats, the limits, and what the room does when a file passes one.

### Accepted file types

| Kind       | Extensions                     | What reaches the characters                                                                           |
| ---------- | ------------------------------ | ----------------------------------------------------------------------------------------------------- |
| Documents  | `.pdf`, `.docx`                | The document's text; for a PDF whose pages carry almost no text, a description of those pages instead |
| Plain text | `.txt`, `.md`, `.csv`, `.json` | The file's own text                                                                                   |
| Pictures   | `.png`, `.jpg`, `.jpeg`        | A description of the picture, written in words                                                        |

Whatever the kind, a file goes to the characters that turn is addressed to, and a character the message did not address is not given it. See [Share files with the room](/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room) for how to address everyone.

The room states the list itself, on a line under the message box: "Accepted: PDF, DOCX, TXT, MD, CSV, JSON, PNG, JPG · up to 25 MB each".

That line appears only after you have attached at least one file, so it is not on screen to read before you choose one. A file with a `.jpeg` extension is accepted alongside `.jpg`, although the line names JPG alone.

Anything not in the table is refused when you pick it, and nothing about it is sent.

### Size and text limits

| Limit                                           | Value             |
| ----------------------------------------------- | ----------------- |
| Size of one file                                | 25 MB             |
| Text shared from one file                       | 30,000 characters |
| Text shared across one message                  | 60,000 characters |
| Pages described from a PDF carrying little text | 4                 |

The two character limits count what is shared, not what the file holds. A description written for a picture counts against them the same way a document's own text does.

### What happens at each limit

| What you did                                                    | What the room does                                                                                                                                                                                   |
| --------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Picked a file whose format is not accepted                      | The file is not attached. A message reads "⟨name⟩ is not a supported file type."                                                                                                                     |
| Picked a file over 25 MB                                        | The file is not attached. A message reads "⟨name⟩ is larger than 25 MB."                                                                                                                             |
| Attached a file holding more than 30,000 characters             | The file is attached and sent. The text is cut at the limit, the rest is not shared, and `truncated` is added to the chip                                                                            |
| Attached files that together pass 60,000 characters             | The file that passed the limit is taken off the message. A message reads "⟨name⟩ would put this message over the 60,000-character limit for shared text. Send it on its own or remove another file." |
| Attached a PDF of more than four pages that carries little text | The first four pages are described. The characters are told which pages were not described                                                                                                           |
| Attached a file the room could not read                         | The file is sent by name alone. The chip reads `could not read` after the size                                                                                                                       |

Picking several files at once checks each one on its own. A file refused for its format or its size does not stop the rest from being attached.

### What the chip's second line reports

Every file you attach carries a chip above where you type, and its second line opens with the file's size: bytes below 1 KB, whole kilobytes below 1 MB, and one decimal place above that. What follows the size depends on the file:

| Second line                             | What it means                                                                      |
| --------------------------------------- | ---------------------------------------------------------------------------------- |
| `1.2 MB · reading…`                     | The file is being read. The send control is waiting                                |
| `1.1 MB · describing…`                  | The file is being described. The send control is waiting                           |
| `4 KB`                                  | A text file, read                                                                  |
| `12 KB · 240 rows`                      | A CSV file, read. The count includes the header row                                |
| `8 KB · 8 keys`                         | A JSON file holding a set of fields, read                                          |
| `8 KB · 12 items`                       | A JSON file holding a list, read                                                   |
| `1.2 MB · document`                     | A Word file, read                                                                  |
| `1.2 MB · 14 pages`                     | A PDF, read for its own text                                                       |
| `1.2 MB · 14 pages · 4 pages described` | A PDF whose pages were described instead                                           |
| `1.1 MB · described`                    | A picture, described                                                               |
| `1.2 MB · could not read`               | A file shared by its name                                                          |
| `1.1 MB · could not describe`           | A picture shared by its name                                                       |
| `… · truncated`                         | Added to any outcome that shared text, when that text was cut at 30,000 characters |

The send control is unavailable while any chip still reads `reading…` or `describing…`, and returns when every chip has settled. A send control that stays unavailable when no chip is waiting is locked for another reason: see [You cannot send a message](/api-docs/no-code-experiences/chat-experiences/troubleshooting/composer-is-locked).

### What the side panel reports

The **Shared in room** section of the side panel lists the files you have sent in this conversation. A file waiting as a chip above the message box is not in it yet, and a file you take off the message never reaches it. Until you send the first file, one line stands in place of the list: "Files you attach show up here for every character."

Each file in the list carries at most one note:

| Note beside the file | What the characters were given |
| -------------------- | ------------------------------ |
| No note              | The file's own text            |
| `described`          | A description written in words |
| `name only`          | The file name alone            |

**Clear conversation**, in the three-dots menu in the room's top bar, empties the list. See [Room controls reference](/api-docs/no-code-experiences/chat-experiences/running-the-room/room-controls-reference).

### Related pages

{% content-ref url="/pages/iIVzWiaEKTHUvDdgHNME" %}
[Share a document](/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room/share-a-document)
{% endcontent-ref %}

{% content-ref url="/pages/gMAovyBd5GfDOZfGwQG0" %}
[Share an image](/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room/share-an-image)
{% endcontent-ref %}

{% content-ref url="/pages/4ylt9Iz0mUa3igyeB33v" %}
[Share files with the room](/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room)
{% endcontent-ref %}


# Troubleshoot Chat Experiences

Find the chat experience symptom you are seeing, from a room that will not connect to a transcript that will not download, and the page that answers it.

Chat Experiences reports what is wrong where it happens: the message box says why it is locked, the character picker says why a character will not join, and anything else is reported on the page you were working on. Start from what you can see on screen, and these pages tell you what it means and what clears it.

### Where each symptom is answered

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>The room will not connect</strong><br>Characters that never finish joining, an experience that will not open, and a character the picker will not add.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/troubleshooting/room-will-not-connect">The room will not connect</a></td></tr><tr><td><strong>You cannot send a message</strong><br>Every reason the message box is locked, in the room's own words, and what clears each one.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/troubleshooting/composer-is-locked">You cannot send a message</a></td></tr><tr><td><strong>Briefs and transcripts</strong><br>A brief that cannot be edited, an experience that will not be created, and a session that will not open or a transcript that will not download.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/troubleshooting/briefs-and-transcripts">Briefs and transcripts</a></td></tr><tr><td><strong>File limits reference</strong><br>A file the room will not attach, an attachment taken off a message for length, and text cut short before it reaches the characters.</td><td><a href="/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room/file-limits-reference">File limits reference</a></td></tr></tbody></table>

### Behavior that is not a fault

Five things that look like faults are how a chat experience works:

| What you see                                | Why                                                                                          | Where it is explained                                                                                                                                     |
| ------------------------------------------- | -------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| The room opens with nobody in it            | Characters are seated for each session, and the roster does not carry over from the last one | [Sessions and transcripts](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts#what-carries-over-to-the-next-session)                 |
| A character said nothing at all             | A character answers when it is addressed and stays quiet otherwise                           | [How a turn works](/api-docs/no-code-experiences/chat-experiences/running-the-room/how-a-turn-works)                                                      |
| There is no control that edits the brief    | The room type, the purpose, and the briefing are settled when the experience is created      | [Why the brief cannot be changed](/api-docs/no-code-experiences/chat-experiences/the-room-brief/why-the-brief-cannot-be-changed)                          |
| A finished conversation cannot be continued | Every opening of a chat experience starts a new room                                         | [Sessions and transcripts](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts#why-every-opening-is-a-new-room)                       |
| A room link does not open for a colleague   | A chat experience and the rooms opened from it open only for the account that created them   | [The room will not connect](/api-docs/no-code-experiences/chat-experiences/troubleshooting/room-will-not-connect#the-room-does-not-open-for-someone-else) |

### The Chat Experiences controls are missing

If **My Experiences** shows neither a **Create a Chat Experience** button nor a **Chat experiences** section, contact <support@convai.com>.

{% content-ref url="/pages/vRkGq5EwreaG1y8CNs2j" %}
[What you need to use Chat Experiences](/api-docs/no-code-experiences/chat-experiences/prerequisites)
{% endcontent-ref %}

### Still blocked

When what you are seeing is on none of these pages, write to <support@convai.com> with the name of the experience, the room ID from the top bar, and the wording the room showed you.

If the room is working and you are checking whether what it did was meant to happen, the section overview sets out what a chat experience does and what it does not.

{% content-ref url="/pages/fr2HihLferHR6m3TZw7f" %}
[Chat Experiences](/api-docs/no-code-experiences/chat-experiences)
{% endcontent-ref %}


# The room will not connect

Fix a chat experience room whose characters are still joining, an experience that will not open, and a character ID the picker cannot resolve.

A chat experience room opens empty and connects the moment you seat the first characters. When that does not happen, the room says so in the message box, in the character picker, or on the page that should have held the experience. Use this page to read those messages and get the room running.

### The characters are still joining

Joining takes several seconds, and the room says so while it happens.

Each character you picked takes a row in the [side panel](/api-docs/no-code-experiences/chat-experiences/running-the-room/room-controls-reference) straight away with **Joining the room…** under its name, and the message box is locked and reads **Waiting for characters to join…**. The roster controls are frozen for the same stretch, with **Connecting the room…** as the reason under **Add characters**.

All three clear on their own: the rows settle into ordinary rows, the thread adds a divider naming the characters and stating that they joined and were briefed, and the message box takes your first message.

If the room does not come up, the message box changes to **The room could not connect. Pick the characters again to retry.**, the joining rows go, and the room shows a notification with the reason. Note what it says, then follow the next section.

### The room could not connect

The message box reads **The room could not connect. Pick the characters again to retry.** when the room did not open. Nothing was seated, nothing was said, and no session was recorded.

{% stepper %}
{% step %}

#### Open the character picker again

The room is empty, so **Add characters** sits where it does in any empty room: on the **Add the participants** card in the side panel, and under **Nobody is in the room yet** in the thread. Either one opens **Add characters to the room**.
{% endstep %}

{% step %}

#### Pick the characters and confirm

Pick the same characters as before and confirm. The picker works as it did the first time, on the same two tabs. See [Add characters to the room](/api-docs/no-code-experiences/chat-experiences/add-characters-to-the-room) for either route through it.

The rows show **Joining the room…** again, and the message box returns to **Waiting for characters to join…**.
{% endstep %}

{% step %}

#### Check that the room came up

The rows settle, the thread names the characters as joined and briefed, and the message box unlocks with a writing prompt in it. A retry starts a fresh conversation, so the prompt is the one a room shows before its first message: **Ask the group…**, or **Message** followed by the character's name in a room of one. The prompt changes once you have written to the room, and [Send your first message](/api-docs/no-code-experiences/chat-experiences/send-your-first-message) covers every form of it.
{% endstep %}
{% endstepper %}

### The experience will not open

An experience that will not open says so in place of the room or the list, and each of these states carries its own way back:

| What you see                                                                                                   | What it means                                                                                              | What to do                                                                                                                                                      |
| -------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| A panel headed **This chat experience could not be loaded**, with a **Back to My Experiences** button under it | The panel names both possibilities itself: "It may have been deleted, or the server could not be reached." | Select **Back to My Experiences** and open the experience again from the list. An experience still missing from a list that has loaded cleanly has been deleted |
| "Chat experiences could not be loaded." on **My Experiences**, with **Retry** beside it                        | None of the list arrived, so nothing can be opened from it                                                 | Select **Retry**. The list fills with your experiences and the message goes                                                                                     |
| "Chat experiences could not be loaded. What is shown may not be everything." with **Retry**                    | Part of the list arrived, so an experience of yours can be absent from what is on show                     | Select **Retry** before you decide an experience is missing from the list                                                                                       |

### A character cannot be added

A character you look up under **By character ID** becomes a row under **Results**, and a row that did not resolve says which of three things happened:

| The row reads                                                   | What it means                                                                                                                  | What to do                                                                |
| --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------- |
| **No access to** followed by a shortened form of the ID         | "This character exists but hasn't been shared with you. Ask its owner to share it or make it public."                          | Ask the character's owner to share it with you, then look the ID up again |
| **No character with ID** followed by a shortened form of the ID | "No character with this ID is available to you. Check it for typos, or ask whoever shared it to share the character with you." | Check the ID against the one you were given and look it up again          |
| **Could not look up** followed by a shortened form of the ID    | "Something went wrong while looking this character up. Try again."                                                             | Select the look-up button again                                           |

Any of the three is cleared when the row comes back with the character's name, its description, and an **Add** button on it.

On **From my workspaces**, a search that matches nothing reads "No characters match." Clear the search field to bring the grid back, and expand it with the button under the grid when the character you want is outside the eight most recently edited. If the search field is already empty, the tab has no characters to offer you at all, so look the character up under **By character ID** instead.

### Still blocked

If the room fails again with the same notification, or the list still will not load after a **Retry**, contact <support@convai.com>. Name the chat experience you were opening and quote the notification word for word.

### Related pages

These pages answer the chat experience symptoms this one does not.

{% content-ref url="/pages/mdw0RZR6DKpPIRFMydRu" %}
[You cannot send a message](/api-docs/no-code-experiences/chat-experiences/troubleshooting/composer-is-locked)
{% endcontent-ref %}

{% content-ref url="/pages/shUmFFbGwwR9Qw8p3eov" %}
[Briefs and transcripts](/api-docs/no-code-experiences/chat-experiences/troubleshooting/briefs-and-transcripts)
{% endcontent-ref %}

{% content-ref url="/pages/s0wre2IKbFTsueOmgrdV" %}
[Add characters to the room](/api-docs/no-code-experiences/chat-experiences/add-characters-to-the-room)
{% endcontent-ref %}


# You cannot send a message

Work out why the message box in a chat experience room will not take a message, using the reason the room shows, and what clears each one.

The message box in a chat experience room locks whenever the room cannot take a message, and it always says why. Use this page to read the reason the room gives you, to clear it, and to tell a locked box apart from a message that went nowhere.

### What each locked message means

The message box replaces its writing prompt with the reason it is locked. If you had already typed something or attached a file, the reason also appears on a line under the box, and your text and your files stay where they are. The box carries one of five reasons:

| What the box reads                                                  | What it means                                                                                                                | What clears it                                                                                                                                                                                          |
| ------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Add at least one participant to start**                           | The room has nobody in it, so there is nobody to send to                                                                     | Add at least one character. See [Add characters to the room](/api-docs/no-code-experiences/chat-experiences/add-characters-to-the-room)                                                                 |
| **Waiting for characters to join…**                                 | No character in the room has finished joining yet                                                                            | Wait for the side panel to finish seating the characters: a row reads **Joining the room…** first, then settles into the character's name and role. Or add a character if you have removed the last one |
| **The room could not connect. Pick the characters again to retry.** | The room did not open. Any characters still listed in the side panel are not connected                                       | Pick the characters again. See [The room will not connect](/api-docs/no-code-experiences/chat-experiences/troubleshooting/room-will-not-connect)                                                        |
| **Waiting for 2 of 4…**                                             | A turn is running. The first number is how many characters have not started replying, the second how many the turn asked for | Wait for the turn to finish                                                                                                                                                                             |
| **Finishing the turn…**                                             | The turn is settling, or its last reply is still due                                                                         | Wait. The box unlocks on its own                                                                                                                                                                        |

Whichever reason you are clearing, you know it is gone when the reason leaves the box and the writing prompt takes its place: **Ask the group…** in a room of several characters, or **Message** followed by the character's name in a room of one. [Send your first message](/api-docs/no-code-experiences/chat-experiences/send-your-first-message) covers every form the prompt takes.

Three of the five reasons are about the room itself: nobody seated, characters still joining, and a room that did not open. The other two count a turn you have already sent, and [How a turn works](/api-docs/no-code-experiences/chat-experiences/running-the-room/how-a-turn-works) covers what the counts mean and why a turn asks a particular set of characters.

### The wait does not end

The room stops waiting two minutes after you send. It then reports "The room did not finish this turn in time.", unlocks the message box, and leaves whatever did arrive in the thread. The writing prompt is back, so you can send the message again straight away.

### The room reports a turn already in progress

A turn you have sent can report "The room reports a turn already in progress. If nobody answers, wait for it to finish and send again." Do exactly that. The message box stays locked while that turn is live and unlocks when it settles, and if the writing prompt comes back with nothing added to the thread, send the message again.

### Your message reads Not sent

A message the room never received stays in the thread greyed out, with **Not sent** under it, and the room reports "Could not send the message."

Nothing reached the characters and no reply is coming. The box is unlocked and the writing prompt is back in it, so write the message again and send it. The greyed message stays in the thread as a record that it did not go.

### You can type, but the send control is unavailable

The message box takes your text and carries no reason, but the send control does not respond. A file you have attached is still being read: the chip carrying it reads `reading…` after the file size, and `describing…` while a picture or a set of PDF pages is being described.

Nothing is blocked. The send control returns on its own once every chip has settled, and a picture takes seconds rather than the instant a text file takes. A send control that stays unavailable when no chip is waiting means the box is locked for a reason of its own, and the box says which.

{% content-ref url="/pages/VPSgVKL6e7AmFxiYVtg0" %}
[File limits reference](/api-docs/no-code-experiences/chat-experiences/share-files-with-the-room/file-limits-reference)
{% endcontent-ref %}

### The room says it is not connected

Sending in a room whose conversation has already ended reports "Not connected to a room.", and nothing is added to the thread.

A conversation that has ended cannot be rejoined, but a new one starts where you are: select **Add characters** in the side panel and pick the characters again. Going back to **My Experiences** and opening the experience again does the same thing. The brief carries over; the characters and the messages do not. The new conversation is ready when the rows settle and the writing prompt is back in the box.

{% hint style="warning" %}
Reloading the page while a room is open ends that conversation. Reloading to clear a locked message box costs you the conversation and leaves you in an empty room.
{% endhint %}

### The message sent but nobody answered

A character answers when it is addressed and stays quiet otherwise, so a message that addresses nobody in particular can draw no reply at all. To get an answer from a particular character, send another message that tags it with `@`.

{% content-ref url="/pages/kvNOiSyLQKpIDjsRl0lw" %}
[How a turn works](/api-docs/no-code-experiences/chat-experiences/running-the-room/how-a-turn-works)
{% endcontent-ref %}

### Still blocked

When what you are seeing is on none of these pages, the troubleshooting hub lists every chat experience symptom against the page that answers it, and carries the support route for anything left over.

{% content-ref url="/pages/ppqsZ1HOyAkBvDP0UxLE" %}
[Troubleshoot Chat Experiences](/api-docs/no-code-experiences/chat-experiences/troubleshooting)
{% endcontent-ref %}

### Related pages

{% content-ref url="/pages/CapuLwQxA4YBIFvfXGK4" %}
[Choose who replies](/api-docs/no-code-experiences/chat-experiences/running-the-room/choose-who-replies)
{% endcontent-ref %}

{% content-ref url="/pages/ZCOz9YfNatIZcAdbd6nj" %}
[Add or remove characters mid-conversation](/api-docs/no-code-experiences/chat-experiences/running-the-room/add-or-remove-characters)
{% endcontent-ref %}


# Briefs and transcripts

Answers for a brief that cannot be edited, an experience that will not be created, and a past session or transcript that will not open or download.

A chat experience settles its brief when you create it, and keeps every conversation it runs as a session you can read but not rejoin. Use this page when the brief will not do what you expect, or when a session or a transcript will not open, download, or hold what you thought it would.

### The brief cannot be edited

There is no control that edits a brief, anywhere in the product. The room type, the purpose, and the briefing every character receives are settled when the experience is created, and stay as they were written for every room opened from it.

Where an edit control would sit, the room shows a **Fixed at creation** label instead: in the room brief section of the side panel, on the pinned **Room brief** card while the room is empty, and on the experience's **Previous sessions** page. To run the same characters against different wording, use **Duplicate with a new brief**, on the three-dots menu on the experience's card or row. It opens the create dialog prefilled from the original, with the fields ready to change—apart from the one **Custom** exception in the next section.

{% content-ref url="/pages/UegeFZ5XJFnX4nKGvMoP" %}
[Why the brief cannot be changed](/api-docs/no-code-experiences/chat-experiences/the-room-brief/why-the-brief-cannot-be-changed)
{% endcontent-ref %}

### The experience will not be created

**Create experience** stays unavailable until three fields in the create dialog are settled:

| What is missing                                  | What to do                                                                                                                                                                                                                           |
| ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Experience name** is empty                     | Name the experience. The field takes up to 80 characters                                                                                                                                                                             |
| **Purpose** is empty                             | Write what the conversation is about. A **Custom** room type opens with this field empty, and the briefing box cannot be typed into until it holds something                                                                         |
| You cleared **What each character will be told** | The box stays open with this line under it: "A blank briefing sends the written-for-you one instead. Write what the characters should be told, or reset to it." Write a briefing, or select **Reset to the written-for-you version** |

**Create experience** becomes available as soon as all three hold text, and selecting it opens the new experience's room.

An experience does not always save. When it does not, the dialog stays open and reports that the chat experience could not be created. Everything you typed is still in the fields, your own briefing included. Select **Create experience** again.

### No sessions are listed

An experience lists a session only for a room that recorded one, and it records a room once the room opens—which happens when you seat the first characters in it. A room that never finished connecting is not recorded, so a session can be missing because the room never came up. See [The room will not connect](/api-docs/no-code-experiences/chat-experiences/troubleshooting/room-will-not-connect).

An experience with nothing recorded shows a panel in place of the list, headed "No sessions recorded yet." A room you opened and left without adding anyone records nothing, so it never reaches the list.

Select **Start new session** to open a room from this experience and seat characters in it. That session takes a row on the page once the room has opened, whether or not anyone wrote in it.

### A session will not open

A session that cannot be read says so on the row, or on the session's own page once you have opened it:

| Where                            | What you see                                                                                                                                   | What to do                                                                                                     |
| -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| The row on the experience's page | **Couldn't load** with a **Retry** button beside it                                                                                            | Select **Retry**. The row settles into the session's first question, with its date and message count beside it |
| The row on the experience's page | **No messages recorded** in place of the first question, and `0 messages` as the count                                                         | Nothing to open. That session ended before anyone wrote                                                        |
| The session's own page           | **Couldn't load this session**, with "The transcript could not be fetched. Try again, or go back to the sessions list." and a **Retry** button | Select **Retry**. The thread replaces the panel. If it does not, go back to the list and open another session  |
| The session's own page           | **No messages recorded**                                                                                                                       | Nothing was said in that session, so there is no thread to read                                                |

### A transcript will not download

**Export transcript** reports what stopped it:

| What you see                                         | What it means                                                                                   | What to do                                                                                  |
| ---------------------------------------------------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| "Connect to a room before exporting its transcript." | The room is not connected—either no characters have been seated in it yet, or you left the room | Seat characters and send a message, or export a finished session from the experience's page |
| "This room hasn't recorded any messages yet."        | The room is running but nothing has been said in it                                             | Send a message first                                                                        |
| **No messages recorded**                             | The session you exported from the experience's page recorded nothing                            | Nothing to export. Pick a session with a message count on its row                           |
| "Could not export the transcript"                    | The export did not finish                                                                       | Select **Export transcript** again                                                          |

An export that worked says so: the browser saves the file, and the page confirms with **Transcript downloaded**.

A session longer than 200 [turns](/api-docs/no-code-experiences/chat-experiences/running-the-room/how-a-turn-works) exports its first 200 turns and no more. A turn is one message of yours and the replies it draws, so a session holds more messages than turns, and a row whose count ends in a plus sign—`412+ messages`—is one of these. Open that session to read the note at the top of its thread saying how much of the conversation is on the page. See [Export a transcript](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/export-a-transcript) for what the downloaded file holds.

### What a transcript leaves out

A transcript records what was said, not every detail the room showed while it was being said. The one setting it cannot tell you is which of two [respond modes](/api-docs/no-code-experiences/chat-experiences/running-the-room/respond-modes-reference) a turn ran under: **Auto · room brief decides** and **Anyone may respond** are kept the same way, so a turn sent under either reads back as Auto. Every other respond mode is kept as you set it, and a finished thread differs from a live room in a few other ways worth knowing before you read one.

A transcript also opens only for the account that recorded it, so a link to one does not open for anyone else. The exported file is how you hand a conversation to someone.

{% content-ref url="/pages/VfI41Y7sNmNID37EoZGi" %}
[Review a past session](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts/review-a-past-session)
{% endcontent-ref %}

### Still blocked

If a **Retry** or a second **Export transcript** ends the same way, contact <support@convai.com>. Name the chat experience, the session you were opening or exporting, and quote what the page showed you word for word.

### Related pages

{% content-ref url="/pages/NEs7xFxvuvS2th74dKa5" %}
[Sessions and transcripts](/api-docs/no-code-experiences/chat-experiences/sessions-and-transcripts)
{% endcontent-ref %}

{% content-ref url="/pages/MAl0EbSyk5hMfoBIsxmR" %}
[Manage your chat experiences](/api-docs/no-code-experiences/chat-experiences/manage-your-chat-experiences)
{% endcontent-ref %}

{% content-ref url="/pages/e1tDgmhyt4FYfUpPQ47E" %}
[Write your own briefing](/api-docs/no-code-experiences/chat-experiences/the-room-brief/write-your-own-briefing)
{% endcontent-ref %}


# Convai Sim Experiences

Create AI-powered avatars and deploy them in interactive 3D environments—directly from your browser.

## **Introduction**

Convai Sim is a browser-based platform that allows you to instantly create and deploy AI-powered avatars in interactive 3D environments— no downloads, and no complex setup required.

Designed for creators, educators, and developers, it enables rapid prototyping and deployment of lifelike characters inside rich, responsive scenes.

***

## **What You Can Do**

With Convai Sim, you can:

* Add one or more **AI-powered avatars** into a 3D scene
* Set up **real-time interactions** using voice or text
* Deploy avatars with **smart navigation** and context-aware behaviors
* Easily position characters using **drag-and-drop scene editing**
* Instantly publish your experience for testing or deployment
* Run everything **directly in your browser.**

***

## **Who It’s For**

Convai Sim is perfect for:

* **Educators and trainers** building interactive simulations or learning environments
* **Storytellers and creators** wanting to bring characters to life in immersive scenes
* **Game developers** prototyping scenarios and NPC interactions
* **Enterprises** creating training, onboarding, or customer-facing virtual flows
* **Tourism and museum teams** looking for guided, avatar-led experiences

Whether you're designing a futuristic training program or a playful game level, Convai Sim makes it easy to bring intelligence and interactivity to 3D worlds.

***

## **Key Features**

* **Browser-Based Platform**\
  No installations — launch and edit in-browser.
* **Multi-Avatar Support**\
  Add and manage multiple intelligent characters in a single scene.
* **High-Quality Visuals**\
  Use expressive avatars for rich storytelling and realistic simulation.
* **Instant Deployment**\
  Launch scenes immediately and preview interactions with one click.
* **Intelligent Navigation**\
  Characters move contextually, ideal for tour guide or training scenarios.
* **Interactive Scene Editing**\
  Easily arrange avatars and elements using drag-and-drop tools.
* **Versatile Use Cases**\
  Perfect for education, training, tourism, gaming, and more.


# Creating Your AI Simulation with Convai Sim

Bring your Convai characters to life by placing them into 3D interactive environments using Convai Sim

Now that you’ve created a Convai character, it’s time to place them into a 3D simulation. With Convai Sim, you can bring characters to life inside immersive environments—fully interactive and embodied in high-quality avatars.

**My Experiences** holds both kinds of Convai experience: 3D experiences, which this page covers, and chat experiences, which are text rooms rather than 3D scenes. To compare the two before you start, see:

{% content-ref url="/pages/hP4LQajPA7oXVjIgDl2R" %}
[Open My Experiences](/api-docs/no-code-experiences/chat-experiences/open-my-experiences)
{% endcontent-ref %}

***

### Build the simulation

#### 1. Open My Experiences

Go to <code class="expression">space.vars.dashboard\_url</code> and sign in to your Convai account. In the left sidebar, select **My Experiences**.

#### 2. Create a 3D Experience

A 3D experience is a Convai Sim simulation: your characters placed in a scene you can walk around in. On the **My Experiences** page, click **Create a 3D Experience**. The **Start a new Experience** dialog opens.

#### 3. Choose an Environment

Select an environment that fits your use case (e.g., office, museum, sci-fi room). Then click **“Start Experience”** to enter the Convai Sim.

#### 4. Explore the Scene

Once the scene loads:

* Use **WASD keys** to move around.
* Use your **mouse** to look around the environment — just like in a first-person game.

#### 5. Add an Avatar

Click the **top-left icon** to open the avatar menu. Then:

* Click **“Add Avatar”**.
* A hologram will appear — place it at the desired location in the scene.

#### 6. Select Your Character and Avatar

You’ll be prompted to:

* Choose your previously created **Convai character**.
* Select a **Metahuman avatar** to visually represent that character.

#### 7. Deploy the Character

Click **“Deploy Character”** to spawn the avatar into the environment. The avatar will now be active and ready to interact.

#### 8. Add More Avatars (Optional)

Repeat the process to add **multiple characters** into the same scene and create more dynamic simulations.

***

### Next steps

The scene is now running with your character deployed in it. Adjust that avatar’s model, size, and placement in the scene next.

{% content-ref url="/pages/lJ3ep46Kfwn6q0IGsBdC" %}
[Avatar Customization](/api-docs/no-code-experiences/convai-sim-experiences/avatar-customization)
{% endcontent-ref %}


# Avatar Customization

Fine-tune your deployed avatar’s appearance, size, and position within your 3D simulation scene

## **Refine Your Avatar for a Perfect Fit**

Once you've placed your avatar into the scene, it's time to customize its model, pose, and placement to match your simulation's tone and context.

***

## **Customizing Your Avatar**

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeWj6TrGzuBGoDd6sbXLS42ksAR_A_pUeRQP-xjHovDLUIXcb8mWDtomJlr-7Q3Y9EtXjamjadrHG0my64T7mt-zuxSNmoNfqYJA5tBo6txK_IRuWXsx_GBiE6xsojCsLqSgccUHg?key=oE6QAXhDPkZ0WZirjFau9Q" alt=""><figcaption></figcaption></figure>

Follow these steps to adjust your avatar visually using built-in tools:

### **1. Select and Open the Character Tools**

* Click directly on your avatar in the scene.
* This will open the transform tools.

### **2. Customize Position, Rotation, and Scale**

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXe0rpEuYTNjlqHm4QsiMOMdkEan_1ZMjBwJwurojp2NeATeQySPvgSbypzUfglKIbIIRnRVreugNZ33u5f4hZrJSXsbSgq1Sy1yltbguQrA8z-RaVh5pNzVpQdnMoyeS9dXu6qQ?key=oE6QAXhDPkZ0WZirjFau9Q" alt=""><figcaption></figcaption></figure>

You can adjust your avatar’s placement and appearance using **either visual tools or precise numeric fields**:

#### **Option A – Use Transform Gizmos**

* **Move Tool:** Drag the avatar along the **XYZ axes**.
* **Rotate Tool:** Use the **blue ring** to turn the avatar’s facing direction.
* **Scale Tool:** Resize the avatar by dragging the **top cube handle**.

#### **Option B – Use the Edit & Publish Panel**

* When the avatar is selected, the **Edit & Publish panel** appears.
* Manually enter values for:
  * **Position**
  * **Rotation**
  * **Scale**

This option is ideal when you need precise alignment, consistency across avatars, or exact placement within complex scenes.

***

With both intuitive drag-and-drop controls and precision inputs, customizing your avatar's presence in the scene is flexible and efficient.

**Next up:** Let’s bring your avatar to life with tour-guide behaviors and intelligent interactions!


# Tour Guide

Turn your AI avatar into an interactive tour guide using Convai Sim’s built-in tour planning tools

## **Introduction**

In this guide, you'll learn how to bring your AI avatars to life by turning them into dynamic tour guides within immersive 3D environments.

We’ll walk you through how to:

* Set up a tour-guide simulation
* Define interaction behaviors
* Add tour points
* Manage the tour flow
* Preview and publish the experience

## Step by Step Guide

### **1. Setting Up Tour Guide Mode**

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfZz05ySedk4Lajg9JYaQUgBQ2qy2tFQ83JsZ_BqPyhU4Z7YXMv8Me9YaZAPbpkGFpWK0RmpFRLa2wetYHvDJcvNlYKupDkpRn0vDrE1oVeGSIQMabaXZYmRxzB3FsxnCGzVBHUjw?key=oE6QAXhDPkZ0WZirjFau9Q" alt=""><figcaption></figcaption></figure>

1. Select your avatar to open the **Edit & Publish** menu.
2. Locate the **Tour Planner Settings** section.
3. Set up your **Tour Prompts** – these define what the avatar says at the start and end of the tour.

**Example Prompts:**

* **Welcome Prompt:**\
  “Hi there! Ready to explore the fire station?”\
  → Greet the user, introduce yourself, and invite them to start the tour.
* **End Prompt:**\
  “That’s the end of the tour. Hope you had fun!”\
  → Ask if the user has any questions, answer them, then say goodbye.

### **2. Defining Behavior**

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcBz2c8r7PObfXZj8jF4cq06K52dgnxZTL9tJXZaE42HckGNu3ki6iEs46-1FxJt6okkfsZ7sq6SeapiYAPjIDwE_Ec-IWnML9f3NMnZ4XBY2r2FFY6o2h5uQyhw6mX2nQPJp3u?key=oE6QAXhDPkZ0WZirjFau9Q" alt=""><figcaption></figcaption></figure>

Choose how your avatar initiates the tour:

* **Wait for Player:**\
  Avatar stays still and waits until the user approaches.
* **Engage on Sight:**\
  Avatar detects the user visually and initiates conversation.
* **Max (Timed Engagement):**\
  Avatar starts interacting after a set period of user inactivity.

### **3. Adding Tour Points**

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXevR5D8O-lo8NFR7mcrsGgtBpPleeW7gPblo5wZEb66TZwT6l0tTkw4ZdIUESzOyBJpnLqiwcFdOmfwePyw9OtYrDpGeTz8jT05Mr6d_h4jqzhALdAv367eDoxTRuEasVSAyaBRGQ?key=oE6QAXhDPkZ0WZirjFau9Q" alt=""><figcaption></figcaption></figure>

1. Click **“Add Tour Point”** — a green gizmo will appear in the scene.
2. Use the **XYZ axes** or click the **flag icon** to position the tour marker.
3. Enter a **Tour Point Name** (e.g., “Fire Truck”).
4. Add an **Objective** describing what the avatar will explain or do at this point (e.g., “Describe the fire truck and its role in emergencies.”).
5. Repeat this process to build a full tour path.

### **4. Managing the Tour**

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeOlI3VqyrWMFFXq_U3i58HBkmfH_BkxbWHPuBqxMch0VKszsudh7AM_58GyMtZR_Bw8QEFGkvBp0beMSc0X9L7CWj553ExD6YqkWiDxIFJv8R4bvenIpOtAChAkptyvtZpZ60y?key=oE6QAXhDPkZ0WZirjFau9Q" alt=""><figcaption></figcaption></figure>

* To remove a tour point, click the gizmo and hit the **X icon**.
* Under **User Elements**, click **“Set User Starting Point”** to define where the player begins.
* Click **“Save Narrative Graph”** to save your tour configuration.
* Use **Preview** to test the experience.
* Click **Publish** when you're ready to share your tour.

## **Summary**

Convai Sim’s **Tour Guide Mode** transforms your AI avatar into an interactive, narrative-driven host—ideal for:

* Education & virtual field trips
* Employee onboarding
* Training simulations
* Museum or product walkthroughs

Once your tour is complete, you’re just one click away from publishing it across web, kiosks, and other platforms.


# Publishing a Convai Sim Experience

Learn how to finalize and publish your AI simulation or tour guide experience created with Convai Sim

## **Make Your Experience Live**

Once you’ve finished building your AI simulation or virtual tour, Convai Sim makes it easy to publish and share your experience across platforms.

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcnUwJN22I2npTvx16Bv4tFBPax0edZIP6ryiD3lr8QZrE3tjsD7Z9nrWmQX6OUB8tdpexRllTezHXPh9FbGg17UeWHb2RDgjuLZZWQyM8JJdlXC68gwZWqyNHwGCJLjKbNz7zHHA?key=oE6QAXhDPkZ0WZirjFau9Q" alt=""><figcaption></figcaption></figure>

## Publishing Steps

### **1. Finalizing Your Experience**

Fill in the necessary details to define and present your simulation:

* **Experience Name**\
  e.g., *Virtual Tour of the Fire Station*
* **Experience Description**\
  e.g., *Get a deeper look and understanding of the inner workings of a fire station with your virtual tour guide Lina!*
* **Thumbnail (Optional)**\
  Upload an image to visually represent your experience.

### 2. Choose Visibility Settings

Select how and with whom the experience should be shared:

* **Public**
  * Visible to everyone
  * Accessible on [**x.convai.com**](https://x.convai.com)
* **Private**
  * Only visible to you and invited users
* **Unlisted**
  * Not listed publicly, but can be accessed via a direct link
* **Embed on Your Site** *(Enterprise-only)*
  * Publish your experience directly to your own website

{% hint style="danger" %}
**Convai Pixel Streaming Embed** is currently accessible only with the **Enterprise plan**.\
To learn how to embed an avatar into your own platform, check out the [Embedding Documentation](/api-docs/plugins-and-integrations/convai-pixel-streaming-embed).
{% endhint %}

***

## **What Happens After Publishing?**

Once published, your experience becomes:

* **Accessible** to your intended audience
* **Ready for interaction** via web, kiosk, or internal use
* **Shareable** as a training tool, educational demo, or digital showcase

Whether you're running a public-facing simulation or a private module for internal teams, **Convai Sim gives you complete control** over how your AI-driven experience is distributed.


# Convai XR Animation Capture App

Capture animations in VR using your Meta Quest and animate AI avatars—no mocap suit required.

## Introduction

The **Convai XR Animation Capture** app allows you to record high-quality animations directly in virtual reality using a **Meta Quest** headset. These animations can be uploaded to your Convai account and used seamlessly across platforms like **Unity**, **Unreal Engine**, or within no-code tools like **Avatar Studio** and **Convai Sim**.

{% embed url="<https://youtu.be/S6RQBh--DsQ?t=117>" %}

***

## **What You Can Do**

With the Convai XR Animation Capture App, you can:

* Record natural **animations** in VR using your Meta Quest
* Upload animations directly to your **Convai account**
* Assign these animations to **AI avatars**, which perform them intelligently during conversation
* Use animations in:
  * **Unity**
  * **Unreal Engine**
  * **Convai Sim**
  * **Avatar Studio**
* Build **custom gesture libraries** and animation sets\
  → All without the need for mocap suits or external trackers

***

## **Who It’s For**

This app is ideal for:

* **Developers & creators** building immersive and interactive characters
* **Educators & trainers** crafting virtual learning environments
* **Game designers** enhancing NPC realism in Unity or Unreal
* **Brands & marketers** creating engaging virtual hosts with Avatar Studio
* **Storytellers & world-builders** designing no-code simulations with Convai Sim

Whether you’re building a virtual assistant, NPC, tour guide, or performer — XR Animation Capture helps you bring your AI characters to life with natural, human motion.

***

## Key Features

* **VR-Based Animation**

  Record gestures, motions, and actions naturally with your Meta Quest headset.
* **Direct Upload to Convai**

  Animations are automatically synced to your Convai account—no manual transfer needed.
* **Cross-Platform Support**

  Use animations in Unity, Unreal Engine, Convai Sim, and Avatar Studio — no extra setup required.
* **AI-Driven Animation Triggers**

  Let your avatars perform animations intelligently based on dialogue and context.
* **No Mocap Suit Needed**

  Capture high-quality animation using just your VR headset — no external trackers or suits required.
* **Works with No-Code Tools**

  Deploy intelligent, animated avatars directly in browser-based platforms like Avatar Studio and Convai Sim.


# Convai XR Animation Capture App Setup

Learn how to install and connect the Convai XR Animation Capture App on your Meta Quest headset to start recording avatar animations in VR.

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXevUy-51o41KOO9tZKgf0fzTssGIylMXvoQqt9uQfEyyPOsneUcApuwgYBSkRcgoDWNwlZ8TMEr8IDZ0OePgNguV4OoPJb6zSR5yzCfWXgSFEiiaDOo98aIp5n-Ygj0PYpMFOTs?key=fHPO8I8f-LT0qsfmTXmKpQ" alt=""><figcaption></figcaption></figure>

## **Requirements**

Before you begin, make sure you have the following:

* **Meta Quest 2 / 3 / Pro**
* A registered **Convai account** – [Sign up here](https://www.convai.com)
* A stable **internet connection**

***

## **Installation Steps**

### Step 1: Install the App on your Quest device

1. Put on your Meta Quest headset.
2. Open the **Meta Quest Store**.
3. Search for **"Convai Animation Capture"**.
4. Select the app and click **Install**.

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXd1vkI0uiQwpbX7fYTzitxWTcIst_HHQkIGmvcCJuarMzQrdLtKB4HLJkKOSTfbdyyvY9nG9chSxOf411RrEV-V-c1nc6LOEzJp5HIjIeM1Vx01j4h7ZsOiuBTmdNERrYwbNEAw8g?key=fHPO8I8f-LT0qsfmTXmKpQ" alt=""><figcaption></figcaption></figure>

***

### **Step 2: Log In to Your Convai Account**

1. Launch the **Convai Animation Capture** app on your headset.
2. When prompted, **log in** to your Convai account.

***

#### You're Ready to Animate!

After completing the steps above, your setup is complete. You can now begin recording animations directly in VR, which your AI avatars can intelligently perform in simulations, scenes, or guided experiences within Convai Sim.<br>


# Creating Animations for AI Avatars

Capture lifelike animations using your Meta Quest headset to bring your AI avatars to life—no mocap suit required.

## **Overview**

Using the **Convai XR Animation Capture** app on your Meta Quest headset, you can create custom animations for your AI characters by simply acting them out in VR. These animations help your avatars express themselves naturally during conversations—whether in Unity, Unreal, Avatar Studio, or Convai Sim.

{% hint style="warning" %}
***Haven’t set up the app yet?***\
Head over to the [Convai XR Animation Capture App Setup Guide](/api-docs/no-code-experiences/convai-xr-animation-capture-app/convai-xr-animation-capture-app-setup) before continuing.
{% endhint %}

***

## **Recording Animations in VR**

### **Step 1: Review Existing Animations (Optional)**

When you launch the app, you’ll see your **animation dashboard**. From here, you can:

* View previously recorded animations
* **Replay** them to see how they look
* **Delete** any that you no longer need

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdeV2U8qhR1oXLcsQtZ_ub9vc0PUVz9smmnFFWxFB7y1P4vnhCdbq_xUmvA6dpA5RdNC1dbM9hmF2Zg3LrhKl0W8B_45JTzkROALb_5buc1K2GCcav2gDIXHxrKWxE-Pvv3nzkz?key=fHPO8I8f-LT0qsfmTXmKpQ" alt=""><figcaption></figcaption></figure>

***

### **Step 2: Start Recording**

1. In the app, click **“Start Recording”**.
2. A five-second countdown will start.
3. Begin **performing your animation.**
   * Examples: wave, point, gesture, etc.

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdxfyAn02JjXB7I4kAQ_wfDsPve7fqi3zuip5X8AwPhd2iS8l82nQx1oMXH720iThbg0C1r496WwfCO8gCjZ4-ywbjO1lwF2LMAAjbbI-OcqoaZ2jcLDGptZdMrOl3Dp2DieiNvlw?key=fHPO8I8f-LT0qsfmTXmKpQ" alt=""><figcaption></figcaption></figure>

***

### **Step 3: Stop & Review**

1. Once you're done, click **“Stop”**.
2. You can review the recorded animation by pressing the **"Replay Animation"** button.
   * This helps you decide whether to save, redo, or discard.

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcPdnEXTN5mCYICBWGOIjdljVTJsTQZYqQC2WuokXXfv4nauC2Nf6n1h2Q_no2lO61G-ajwhqU-Tf2EFjhV5F5_otXWLVKHJqDNglDvrypYD-iV54lOc-eWbHp7lB8MsadlYnmw7g?key=fHPO8I8f-LT0qsfmTXmKpQ" alt=""><figcaption></figcaption></figure>

***

### **Step 4: Name & Save**

1. Enter a **clear and descriptive name** (e.g., *Wave Greeting*, *Points Left*).
2. Click **“Save & Upload”**.

The animation is now uploaded to your **Convai dashboard**, ready to be:

* Assigned to AI avatars
* Used across **Unity**, **Unreal**, **Avatar Studio**, or **Convai Sim**

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcDFw3AjkgglpSp66Ml08sNIPq5G7nEYLaPZ7CCMwX4Vi8wKol2_3GX23fPuOBJF7xlsIsQT9ADSZuZeogu-Hp29Atcre2q9Xz6eD_oSIlE1TZIevI4SCOqZ3mpIbVYDRY80jo4eQ?key=fHPO8I8f-LT0qsfmTXmKpQ" alt=""><figcaption></figcaption></figure>

***

### **Keep Building Your Animation Library**

Record and save multiple animations to populate your library. These can be reused across projects, allowing your avatars to **intelligently perform gestures** during conversations—making your virtual experiences more engaging and realistic.


# Adding Your Recorded Animations to AI Avatars Inside Unity

Learn how to import animations recorded in VR and apply them to your AI avatars in Unity.

## **Overview**

Bring your Convai avatars to life inside Unity by integrating animations recorded via the **Convai XR Animation Capture App**. This guide walks you through importing those animations and attaching them to AI-powered characters in your Unity project.

{% embed url="<https://youtu.be/dI3xf4gQPRE>" %}

## **How to Add Recorded Animations to AI Avatars in Unity**

### **Step 1: Set Up Unity & Convai**

Before importing animations, ensure your Unity project is correctly set up with Convai:

* Install the **Convai Unity SDK**.
* Retrieve your **API key** from the Convai Playground.
* Add the API key to your project settings.

{% hint style="success" %}
**Need help setting up the SDK?**\
Check out our [Unity SDK Documentation](https://docs.convai.com/api-docs/plugins-and-integrations/unity-plugin) or follow the [video](https://youtu.be/anb9ityi0MQ) walkthrough above.
{% endhint %}

***

### **Step 2: Import the Animation**

1. Go to the **Convai Dashboard** and navigate to the **Server Animations** tab.
2. Locate the animations you recorded in VR.
3. Click **Import** and select a location **within your Unity project's `Assets/` directory**.

{% hint style="warning" %}
The files **must be placed inside the Unity project folder** for them to be detected and used properly.
{% endhint %}

***

### **Step 3: Apply the Animation to a Character**

1. In Unity, drag your AI character model into the **scene hierarchy**.
2. Adjust the character’s position if needed.
3. Open or create an **Animator Controller**.
4. Drag the imported animation clip into the **Animator Controller**.
5. If the animation should repeat, enable **Loop Time** in the Animation settings.

***

### **Step 4: Test the Scene**

1. Run your Unity scene.
2. Start a conversation with the avatar or trigger the assigned action.
3. Watch your AI avatar perform the recorded animation in real-time!

***

#### **Done!**

You’ve now successfully connected a custom VR-recorded animation to an AI-powered avatar in Unity.\
Repeat the process to add more animations and create rich, expressive characters in your simulations or games.


# Convai Unity SDK

Add real-time AI characters to Unity training simulations, interactive experiences, and games — with speech, emotion, actions, and persistent memory.

The Convai Unity SDK connects Unity projects to Convai, bringing conversational AI into training simulations, interactive experiences, and games. Characters process speech in real time, respond with natural language, and synchronize lip movement, facial emotion, and body animation — all configurable per project. Each feature is a self-contained module: add only what your project needs, in the order that fits your workflow.

{% hint style="info" %}
**New to the SDK?** Follow [Getting started](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started) to install the package, configure your API key, and run your first AI character.
{% endhint %}

### Learn the SDK

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Overview</strong><br>What the SDK is, how it is structured, and when to use each module.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/overview">Convai Unity SDK overview</a></td></tr><tr><td><strong>Compatibility and requirements</strong><br>Unity versions, render pipelines, platform support, and network requirements.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/compatibility-and-requirements">Compatibility and requirements</a></td></tr><tr><td><strong>Core concepts</strong><br>Session lifecycle, turn-taking modes, and the SDK event system.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/core-concepts">Core concepts</a></td></tr><tr><td><strong>Embodiment</strong><br>Gaze, body animation, body language, conversation flow, and emotion modules for character behavior.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/embodiment">Embodiment</a></td></tr><tr><td><strong>AI coding assistant</strong><br>Unity MCP integration that lets AI coding agents build Convai scenes from prompts.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/ai-coding-assistant">AI coding assistant</a></td></tr></tbody></table>

### Features

Each feature is a self-contained module you opt into.

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Actions</strong><br>Characters execute structured in-scene commands dispatched by Convai.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/features/character-actions">Character actions</a></td></tr><tr><td><strong>Emotion</strong><br>Map Convai emotion signals to facial blendshapes or Animator parameters.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/embodiment/emotion">Emotion</a></td></tr><tr><td><strong>Long-term memory</strong><br>Characters remember each player across separate sessions.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/features/long-term-memory">Long-term memory</a></td></tr><tr><td><strong>Vision</strong><br>Characters see through a Unity camera, webcam, or Meta Quest passthrough.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/features/vision">Vision</a></td></tr><tr><td><strong>Dynamic context</strong><br>Inject runtime state and events into character knowledge at any time.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/features/dynamic-context">Dynamic context</a></td></tr><tr><td><strong>Narrative design</strong><br>Trigger-based story section progression tied to conversation flow.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/features/narrative-design">Narrative design</a></td></tr><tr><td><strong>Scene metadata</strong><br>Characters automatically read contextual information about scene objects.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/features/scene-metadata">Scene metadata</a></td></tr></tbody></table>

### Reference and guides

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>UI and presentation</strong><br>Transcript UI, subtitle modes, notification system, and settings panel.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/ui-and-presentation">UI and Presentation</a></td></tr><tr><td><strong>Scripting reference</strong><br>Full API reference for session events, character events, and the transcript system.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/scripting-reference">Scripting reference</a></td></tr><tr><td><strong>Platform guides</strong><br>WebGL, Android, iOS, and Meta Quest deployment guides.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/platform-guides">Platform guides</a></td></tr><tr><td><strong>Advanced topics</strong><br>Custom providers, performance, and SDK extension points.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/advanced-topics">Customize and extend the SDK</a></td></tr><tr><td><strong>Troubleshooting</strong><br>Common failure modes, diagnostic steps, and known issues.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/troubleshooting">Troubleshooting</a></td></tr></tbody></table>

### Latest release

v<code class="expression">space.vars.unity\_sdk\_version</code> introduces the embodiment family of character-behavior modules: Gaze, Body Animation, Body Language, Conversation Flow, and Emotion. The five modules share one per-character setup and read the same dialogue state, so a character looks, moves, and reacts as one behavior rather than five independent ones. This release also adds an Auth Token authentication mode that resolves a short-lived credential before each connection, so a player build ships without an account API key. The Actions Editor is rebuilt around a curated catalog of 21 built-in actions and provisions an action's executor and its character-side components in a single undoable operation. A new `Convai > Troubleshooter` window reports setup problems per module. The SDK requires Unity <code class="expression">space.vars.unity\_min\_version</code>. See [Release notes](/api-docs/plugins-and-integrations/convai-unity-sdk/overview/release-notes) for the complete changelog.

### Next steps

Install the Convai Unity SDK and connect your first AI character using the Getting started section. If you are evaluating the SDK before installing, review [Compatibility and requirements](/api-docs/plugins-and-integrations/convai-unity-sdk/compatibility-and-requirements) to confirm platform and Unity version support.

{% content-ref url="/pages/1d9fa274483952ca377014dd2a4fb49c2f3e80a1" %}
[Getting started](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started)
{% endcontent-ref %}


# Convai Unity SDK overview

Find explanations of what the Convai Unity SDK is, how its four-tier architecture is organized, and what feature modules ship with the package.

The Convai Unity SDK layers voice, structured actions, and long-term memory onto Unity characters. The embodiment modules — Gaze, Body Animation, Body Language, Conversation Flow, and Emotion — drive how a character looks, moves, and reacts while it speaks. The pages in this section explain the SDK fundamentals, system architecture, available features, and current release notes.

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>What is the Convai Unity SDK</strong><br>End-to-end voice pipeline, target audience, and what the SDK ships with.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/overview/what-is-the-convai-unity-sdk">What is the Convai Unity SDK</a></td></tr><tr><td><strong>Convai Unity SDK architecture</strong><br>Four-tier framework: Runtime, Room, Agent, and Module layers.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/overview/convai-unity-sdk-architecture">Convai Unity SDK architecture</a></td></tr><tr><td><strong>Feature map</strong><br>Find the right feature, tool, or guide for any development goal.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/overview/feature-map">Feature map</a></td></tr><tr><td><strong>Release notes</strong><br>Release notes for v<code class="expression">space.vars.unity_sdk_version</code> and previous releases.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/overview/release-notes">Release notes</a></td></tr></tbody></table>

### Next steps

If you are ready to install the SDK, go directly to Getting started.

{% content-ref url="/pages/1d9fa274483952ca377014dd2a4fb49c2f3e80a1" %}
[Getting started](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started)
{% endcontent-ref %}


# What is the Convai Unity SDK

Real-time conversational AI characters for Unity — voice pipeline, opt-in feature modules, supported platforms, and minimum requirements.

The Convai Unity SDK connects Unity characters to Convai so they can speak, listen, reason, and act in real time. A player speaks into a microphone; the SDK captures audio, streams it to Convai for speech recognition and language understanding, generates a response with text-to-speech, and plays it back on the character with synchronized lip sync, facial emotion, and optional in-scene actions. The SDK targets Unity developers building training simulations, interactive experiences, and games.

### What it includes

The SDK ships with a complete conversation pipeline and a set of opt-in feature modules.

#### Conversation pipeline

Always active once connected:

* **Real-time voice input** — microphone capture, streaming speech recognition
* **Language understanding and generation** — Convai processes and responds in character
* **Text-to-speech** — voice generated by Convai, played back through Unity audio

#### Feature modules

Opt-in, each added as a Unity component:

* **Lip sync** — real-time blend shape mouth animation; supports ARKit, MetaHuman, and CC4 Extended maps
* **Emotion** — maps Convai emotion signals to facial blend shapes or Animator parameters
* **Actions** — character executes structured in-scene commands dispatched by Convai
* **Long-term memory** — character remembers each player across separate sessions
* **Narrative design** — trigger-based story section progression tied to conversation flow
* **Vision** — character sees through a Unity camera, webcam, or Meta Quest passthrough
* **Dynamic context** — inject runtime state and events into the character's knowledge at any time

#### Utilities

Optional helpers that run entirely in Unity without Convai communication:

* **Dialogue animation** — four-layer animator stack driving body and head movement during speech
* **Gaze and attention** — eye and head gaze blended toward focus targets and conversation partners

#### Editor tooling

Project Settings API key configuration, scene setup menu, Scene Validator, and custom Inspectors for every SDK component.

### Voice → Convai → Character flow

```mermaid
graph LR
    MIC[Microphone] --> RM[ConvaiRoomManager]
    RM --> |Voice stream| CLOUD[Convai]
    CLOUD --> |Audio + metadata| CHAR[ConvaiCharacter]
    CHAR --> AUD[Audio playback]
    CHAR --> MOD[Feature modules]
```

`ConvaiRoomManager` handles the streaming connection to Convai. `ConvaiCharacter` receives the response — audio, transcript, emotion signals, and action commands — and routes each to the appropriate module or output.

### Requirements

| Requirement     | Minimum                                                        |
| --------------- | -------------------------------------------------------------- |
| Unity version   | <code class="expression">space.vars.unity\_min\_version</code> |
| Render pipeline | Built-in, URP, or HDRP                                         |
| Platform        | Windows, macOS, Linux, Android, iOS, Meta Quest, WebGL         |
| Network         | Internet connection to Convai                                  |
| API key         | Free account at [convai.com](https://www.convai.com/)          |

{% hint style="info" %}
The sample scenes use URP. If your project uses the Built-in render pipeline, the samples require minor material reassignment. The SDK itself works with all three pipelines.
{% endhint %}

The Convai Unity SDK is available on the [Unity Asset Store](https://assetstore.unity.com/packages/tools/behavior-ai/npc-ai-engine-dialog-actions-voice-and-lipsync-convai-235621).

For the full platform and Unity version support matrix, see Compatibility and requirements.

{% content-ref url="/pages/ijdGXp5AdxHr05KBoBHM" %}
[Compatibility and requirements](/api-docs/plugins-and-integrations/convai-unity-sdk/compatibility-and-requirements)
{% endcontent-ref %}

### Next steps

Install the SDK and add your first character.

{% content-ref url="/pages/1d9fa274483952ca377014dd2a4fb49c2f3e80a1" %}
[Getting started](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started)
{% endcontent-ref %}

To understand the system architecture before setting up, see the architecture page next.

{% content-ref url="/pages/E0sHZRYpXvCTPJiLrAH4" %}
[Convai Unity SDK architecture](/api-docs/plugins-and-integrations/convai-unity-sdk/overview/convai-unity-sdk-architecture)
{% endcontent-ref %}


# Convai Unity SDK architecture

Understand the Convai Unity SDK four-tier architecture — Runtime, Room, Agent, and Module — and the responsibilities of each tier.

The SDK is organized into four tiers: Runtime, Room, Agent, and Module. As a developer, you interact primarily with the Agent tier (character and player components) and the Module layer (opt-in feature modules). The Runtime and Room tiers handle connection and service bootstrapping with minimal configuration required.

### System diagram

```mermaid
graph TD
    subgraph RT["Runtime Tier"]
        CM["ConvaiManager\n(composition root, service hub)"]
        CS["ConvaiSDK\n(version metadata)"]
    end

    subgraph RM_TIER["Room Tier"]
        RM["ConvaiRoomManager\n(connection · audio · turn-taking)"]
    end

    subgraph AG["Agent Tier"]
        CC["ConvaiCharacter × N\n(session · transcripts · events)"]
        CP["ConvaiPlayer\n(identity · text input)"]
    end

    subgraph ML["Module Layer (opt-in per character)"]
        direction LR
        LS[LipSync]
        EM[Emotion]
        VI[Vision]
        NA[Narrative]
        DA[DialogueAnimation]
        FA[FacialAnimation]
        GA[Gaze]
        AT[Attention]
        CF[ConversationFlow]
        EB[Embodiment]
    end

    CM --> RM
    RM --> CC
    RM --> CP
    CC -.->|modules attach to| ML
```

The dashed line from `ConvaiCharacter` to the Module Layer means modules are optional components you add to the same GameObject as the character — not required for basic conversation.

### Runtime tier

The Runtime tier boots when your scene loads and provides services to everything below it.

`ConvaiSDK` is a static class that exposes the SDK version (`ConvaiSDK.Version`). You rarely reference it directly.

`ConvaiManager` is the composition root. It is a singleton (`ConvaiManager.ActiveManager`) marked with `[DefaultExecutionOrder(-1100)]` so it initializes before other scene objects. It owns:

* **Service accessors** — `TryGet` methods for every internal service (microphone, audio, agent registry, notification, settings panel, etc.)
* **High-level facades** — `ConvaiManager.Audio`, `ConvaiManager.Transcripts`, `ConvaiManager.Events` for the most common scripting tasks
* **Connection control** — `ConnectAsync()`, `DisconnectAsync()`, `SetConversationInputModeAsync()`
* **Agent references** — `Characters`, `Player`, `ActiveConversationCharacter`

{% hint style="info" %}
Most integration code only needs `ConvaiManager.ActiveManager` and the character's own events. The `TryGet` service accessors are for advanced use cases where you replace or extend internal services.
{% endhint %}

### Room tier

`ConvaiRoomManager` owns the live connection to Convai. One `ConvaiRoomManager` per scene, managed by `ConvaiManager`.

It is responsible for:

* **Room connection lifecycle** — connecting, disconnecting, reconnecting
* **Microphone capture** — starting and stopping audio input, mute control
* **Turn-taking mode** — hands-free (`ConversationInputMode.HandsFree`) or push-to-talk (`ConversationInputMode.PushToTalk`)
* **Dynamic context transport** — sending state updates and events to Convai at runtime
* **Audio playback coordination** — enabling remote character audio, WebGL user-gesture handling

`ConvaiRoomManager` exposes coordinators for diagnostics, audio, ownership, and connection management. These are accessible via `ConvaiManager.ActiveManager.TryGetRoomConnectionService()` for advanced scripting.

### Agent tier

The Agent tier contains the components you place on scene GameObjects.

#### ConvaiCharacter

Add `ConvaiCharacter` to each NPC or agent GameObject. One component per character. It owns:

* Character ID — the unique ID from your Convai dashboard
* Session state — `Disconnected`, `Connecting`, `Connected`, `Reconnecting`, `Disconnecting`, `Error`
* Conversation lifecycle — `StartConversationAsync()`, `StopConversationAsync()`, `ToggleSpeech()`
* Transcript and event callbacks — `OnTranscriptReceived`, `OnEmotionChanged`, `OnActionsReceived`, `OnSpeechStarted`, `OnSpeechStopped`, `OnCharacterReady`
* Action configuration — via `ConvaiActionConfigSource` component

`ConvaiCharacter` can be configured inline in the Inspector or via a reusable `ConvaiCharacterProfile` ScriptableObject asset.

#### ConvaiPlayer

Add `ConvaiPlayer` to your player GameObject. One per scene is standard. It owns:

* Player display name and name tag color for transcript attribution
* Text message sending — `SendTextMessage(string message)`
* Runtime identity override — `SetRuntimeDisplayName(string displayName)`

{% hint style="warning" %}
`ConvaiPlayer.PlayerId` is a local display identifier for transcript UI attribution. It is not the server-generated speaker ID used for Long-Term Memory tracking.
{% endhint %}

### Module layer

Modules are optional Unity components you add to the same GameObject as `ConvaiCharacter` (or `ConvaiRoomManager` for Vision). Each module is independent — add only what your project needs.

| Module            | What it does                                                                                                     |
| ----------------- | ---------------------------------------------------------------------------------------------------------------- |
| LipSync           | Real-time blend shape mouth animation driven by audio playback; supports ARKit, MetaHuman, and CC4 Extended maps |
| Emotion           | Receives Convai emotion signals, smooths them, and dispatches to blend shape or Animator parameter bindings      |
| Vision            | Publishes camera, webcam, or Meta Quest passthrough frames to Convai for multimodal awareness                    |
| Narrative         | Manages story section progression through trigger-based events tied to conversation flow                         |
| DialogueAnimation | Drives a four-layer animator stack (base idle, masked overlays, body talk, head talk) during dialogue            |
| FacialAnimation   | Plays facial animation clips at runtime, composited against lip sync and emotion outputs                         |
| Gaze              | Blends eye and head actuators toward conversation partners and attention targets                                 |
| Attention         | Resolves weighted focus targets, providing gaze direction to the Gaze module                                     |
| ConversationFlow  | Bridges the conversation event stream to per-frame dialogue state (Idle, Speaking, Reacting, etc.)               |
| Embodiment        | Foundational behavior profile and lifecycle management for physical presence and behavioral modules              |

`ConversationFlow` is provisioned automatically at runtime when a `ConvaiCharacter` initializes. All other modules — `LipSync`, `Emotion`, `Vision`, `Narrative`, `DialogueAnimation`, `FacialAnimation`, `Gaze`, `Attention`, and `Embodiment` — are opt-in.

### Configuration model

Every major component supports two configuration modes, selectable in the Inspector.

{% tabs %}
{% tab title="Inline" %}
Values are set directly on the component in the Inspector. This is the default mode and is suitable for most scenes — no additional assets required.
{% endtab %}

{% tab title="Asset" %}
Values come from a reusable `ConvaiCharacterProfile` or `ConvaiRoomManagerProfile` ScriptableObject. Use this when you want shared defaults across multiple scenes or prefab variants, or when you need to swap character behavior without modifying individual prefabs.
{% endtab %}
{% endtabs %}

### Next steps

{% content-ref url="/pages/052c621eeaba9b20d93167f3c9981bf9dc20372f" %}
[Feature map](/api-docs/plugins-and-integrations/convai-unity-sdk/overview/feature-map)
{% endcontent-ref %}

{% content-ref url="/pages/1d9fa274483952ca377014dd2a4fb49c2f3e80a1" %}
[Getting started](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started)
{% endcontent-ref %}


# Feature map

Find the right Convai Unity SDK feature, module, guide, or reference page for any development goal, indexed by use case.

Use this table when you know the outcome you want but are not sure which SDK feature, module, or guide covers it.

### Getting started

| I want to...                                                 | Feature / Tool         | Documentation                                                                                                                              |
| ------------------------------------------------------------ | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| Install the SDK into my project                              | Installation           | [Installation](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/installation)                                           |
| Configure my Convai API key                                  | API key setup          | [Configure API key](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/configure-api-key)                                 |
| Add my first conversational character to a scene             | Scene setup            | [Build a custom scene](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/build-a-custom-scene)                           |
| Run a working example without building from scratch          | Sample scenes          | [Import and run sample scenes](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/import-and-run-sample-scenes)           |
| Run a working example with several characters in one session | Multi-Character Sample | [Multi-Character Sample](/api-docs/plugins-and-integrations/convai-unity-sdk/features/multi-character-sessions/multi-character-sample)     |
| Understand what each component in the scene does             | Component reference    | [Scene components reference](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/scene-components)                         |
| Choose between push-to-talk and hands-free input             | Input mode             | [Configure conversation input mode](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/configure-conversation-input-mode) |
| Configure character audio output                             | Audio setup            | [Configure character audio](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/configure-character-audio)                 |
| Configure microphone device and platform permissions         | Audio setup            | [Configure microphone](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/configure-microphone)                           |
| Add a chat or subtitle transcript display                    | Transcript UI          | [Add chat UI](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/add-chat-ui)                                             |
| Add real-time lip sync to my character                       | Lip sync               | [Add lip sync](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/add-lip-sync)                                           |
| Verify my scene is set up correctly before shipping          | Scene Validator        | [Validate your setup](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/validate-your-setup)                             |

### Authentication

| I want to...                                            | Feature                | Documentation                                                                                                                |
| ------------------------------------------------------- | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| Compare API Key and Auth Token authentication modes     | Authentication         | [Authentication](/api-docs/plugins-and-integrations/convai-unity-sdk/authentication)                                         |
| Understand how a `ConvaiManager` resolves credentials   | Authentication concept | [How authentication works](/api-docs/plugins-and-integrations/convai-unity-sdk/authentication/how-authentication-works)      |
| Switch a project between API Key and Auth Token mode    | Auth mode setup        | [Configure auth token mode](/api-docs/plugins-and-integrations/convai-unity-sdk/authentication/configure-auth-token-mode)    |
| Connect a room session using a short-lived Auth Token   | Auth Token connect     | [Connect with Auth Token](/api-docs/plugins-and-integrations/convai-unity-sdk/authentication/connect-with-auth-token)        |
| Supply my own Auth Token minting logic                  | Custom token provider  | [Custom token provider](/api-docs/plugins-and-integrations/convai-unity-sdk/authentication/custom-token-provider)            |
| Ship a player build without exposing my account API key | Secure build           | [Ship a secure build](/api-docs/plugins-and-integrations/convai-unity-sdk/authentication/ship-a-secure-build)                |
| Call the authentication API from C#                     | Scripting reference    | [Authentication scripting reference](/api-docs/plugins-and-integrations/convai-unity-sdk/authentication/scripting-reference) |

### Features

| I want to...                                                                              | Feature                   | Documentation                                                                                                       |
| ----------------------------------------------------------------------------------------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| Let my character execute in-scene commands (trigger animations, open doors, move objects) | Actions                   | [Actions](/api-docs/plugins-and-integrations/convai-unity-sdk/features/character-actions)                           |
| Inject runtime state or events into the character's knowledge                             | Dynamic Context           | [Dynamic Context](/api-docs/plugins-and-integrations/convai-unity-sdk/features/dynamic-context)                     |
| Let the character automatically read information about scene objects                      | Scene Metadata            | [Scene Metadata](/api-docs/plugins-and-integrations/convai-unity-sdk/features/scene-metadata)                       |
| Show facial emotion on my character driven by the AI response                             | Emotion                   | [Emotion](/api-docs/plugins-and-integrations/convai-unity-sdk/embodiment/emotion)                                   |
| Make the character remember players between sessions                                      | Long-Term Memory          | [Long-Term Memory](/api-docs/plugins-and-integrations/convai-unity-sdk/features/long-term-memory)                   |
| Build branching story sections triggered by conversation                                  | Narrative Design          | [Narrative Design](/api-docs/plugins-and-integrations/convai-unity-sdk/features/narrative-design)                   |
| Give my character vision through a camera or webcam                                       | Vision                    | [Vision](/api-docs/plugins-and-integrations/convai-unity-sdk/features/vision)                                       |
| Decide which character the player is talking to                                           | Conversation Targeting    | [Conversation Targeting](/api-docs/plugins-and-integrations/convai-unity-sdk/features/conversation-targeting)       |
| Know whether the player can talk right now, and gate my UI on it                          | Conversation Availability | [Conversation Availability](/api-docs/plugins-and-integrations/convai-unity-sdk/features/conversation-availability) |

### Embodiment

| I want to...                                                                 | Module             | Documentation                                                                                           |
| ---------------------------------------------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------- |
| Make my character look at the player, at objects, or around the scene        | Gaze               | [Gaze](/api-docs/plugins-and-integrations/convai-unity-sdk/embodiment/gaze)                             |
| Time a character's behavior to the phase of the conversation                 | Conversation Flow  | [Conversation flow](/api-docs/plugins-and-integrations/convai-unity-sdk/embodiment/conversation-flow)   |
| Share one set of behavior settings across several characters                 | Presets            | [Embodiment presets](/api-docs/plugins-and-integrations/convai-unity-sdk/embodiment/embodiment-presets) |
| Decide how much of the face emotion and lip sync each control while speaking | Facial composition | [Facial composition](/api-docs/plugins-and-integrations/convai-unity-sdk/embodiment/facial-composition) |
| Drive idle, talk, locomotion, and gesture animation from code                | Body Animation     | [Body Animation](/api-docs/plugins-and-integrations/convai-unity-sdk/embodiment/body-animation)         |
| Direct conversational nonverbal behavior — posture, breathing, listening     | Body Language      | [Body Language](/api-docs/plugins-and-integrations/convai-unity-sdk/embodiment/body-language)           |

### UI and presentation

| I want to...                                                         | Component           | Documentation                                                                                                                                          |
| -------------------------------------------------------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Display a live conversation transcript in my UI                      | Transcript UI       | [Transcript UI](/api-docs/plugins-and-integrations/convai-unity-sdk/ui-and-presentation/transcript-ui)                                                 |
| Switch between chat and subtitle display modes                       | Presentation modes  | [Chat and subtitle modes](/api-docs/plugins-and-integrations/convai-unity-sdk/ui-and-presentation/transcript-ui/chat-and-subtitle-modes)               |
| Query transcript history or react to transcript changes from code    | Transcript history  | [Transcript history and queries](/api-docs/plugins-and-integrations/convai-unity-sdk/ui-and-presentation/transcript-ui/transcript-history-and-queries) |
| Show in-world notification popups                                    | Notification system | [Notification system](/api-docs/plugins-and-integrations/convai-unity-sdk/ui-and-presentation/notification-system)                                     |
| Add a runtime settings panel (mic, transcript, notifications, input) | Settings panel      | [Settings panel](/api-docs/plugins-and-integrations/convai-unity-sdk/ui-and-presentation/settings-panel)                                               |
| Read or apply runtime settings from code                             | Runtime settings    | [Runtime settings API](/api-docs/plugins-and-integrations/convai-unity-sdk/ui-and-presentation/settings-panel/runtime-settings-api)                    |
| Customize the look and layout of UI components                       | UI customization    | [Customizing UI components](/api-docs/plugins-and-integrations/convai-unity-sdk/ui-and-presentation/customizing-ui-components)                         |

### Core concepts

| I want to...                                             | Concept           | Documentation                                                                                                               |
| -------------------------------------------------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------- |
| Understand the system architecture end-to-end            | Architecture      | [Convai Unity SDK architecture](/api-docs/plugins-and-integrations/convai-unity-sdk/overview/convai-unity-sdk-architecture) |
| Understand session states, reconnection, and persistence | Session lifecycle | [Session lifecycle](/api-docs/plugins-and-integrations/convai-unity-sdk/core-concepts/session-lifecycle)                    |
| Compare hands-free, push-to-talk turn-taking             | Turn-taking modes | [Turn-taking modes](/api-docs/plugins-and-integrations/convai-unity-sdk/core-concepts/turn-taking-modes)                    |
| Subscribe to conversation events from C# or Inspector    | Event system      | [Event System](/api-docs/plugins-and-integrations/convai-unity-sdk/core-concepts/event-system)                              |

### Scripting reference

| I want to...                                                 | API                        | Documentation                                                                                                                  |
| ------------------------------------------------------------ | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| Subscribe to session connected / disconnected / error events | Session events             | [Session Events](/api-docs/plugins-and-integrations/convai-unity-sdk/scripting-reference/session-events)                       |
| Subscribe to transcript, emotion, and turn events            | Character events           | [Character Events](/api-docs/plugins-and-integrations/convai-unity-sdk/scripting-reference/character-events)                   |
| Read and clear transcript history at runtime                 | Transcript API             | [Transcript API](/api-docs/plugins-and-integrations/convai-unity-sdk/scripting-reference/transcript-api)                       |
| Use the `ConvaiSDK` and `ConvaiAudio` static facades         | Conversation facades       | [ConvaiManager API](/api-docs/plugins-and-integrations/convai-unity-sdk/scripting-reference/convaimanager-api)                 |
| Understand `IConvaiOperation<T>` and async patterns          | Async patterns             | [Async Patterns](/api-docs/plugins-and-integrations/convai-unity-sdk/scripting-reference/async-patterns)                       |
| Use the `ConvaiCharacter` and `ConvaiPlayer` API surface     | Character and player API   | [Character and Player API](/api-docs/plugins-and-integrations/convai-unity-sdk/scripting-reference/character-and-player-api)   |
| Understand `IConvaiOperation<T>` and stream result types     | Operation and stream types | [Operation & Stream Types](/api-docs/plugins-and-integrations/convai-unity-sdk/scripting-reference/operation-and-stream-types) |

### Compatibility and requirements

| I want to...                                                       | Requirement                       | Documentation                                                                                                                                                 |
| ------------------------------------------------------------------ | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Check the Unity version, render pipeline, and package requirements | Compatibility overview            | [Compatibility and requirements](/api-docs/plugins-and-integrations/convai-unity-sdk/compatibility-and-requirements)                                          |
| Confirm which Unity versions and render pipelines are supported    | Unity and render pipeline support | [Unity versions and render pipelines](/api-docs/plugins-and-integrations/convai-unity-sdk/compatibility-and-requirements/unity-versions-and-render-pipelines) |
| Confirm domains, ports, and firewall rules the SDK needs           | Network requirements              | [Network and API requirements](/api-docs/plugins-and-integrations/convai-unity-sdk/compatibility-and-requirements/network-and-api-requirements)               |

### Troubleshooting

| I want to...                                                        | Tool                  | Documentation                                                                          |
| ------------------------------------------------------------------- | --------------------- | -------------------------------------------------------------------------------------- |
| Find why a character is not working, with a fix beside each finding | Convai Troubleshooter | [Troubleshooting](/api-docs/plugins-and-integrations/convai-unity-sdk/troubleshooting) |

### Platform guides

| I want to...                                            | Platform        | Documentation                                                                                                            |
| ------------------------------------------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------ |
| Ship to a browser with WebGL                            | WebGL           | [WebGL](/api-docs/plugins-and-integrations/convai-unity-sdk/platform-guides/webgl)                                       |
| Ship to Android or iOS                                  | Mobile          | [Mobile — iOS and Android](/api-docs/plugins-and-integrations/convai-unity-sdk/platform-guides/ios-and-android)          |
| Ship to Windows, macOS, or Linux                        | Desktop         | [Windows, macOS, and Linux](/api-docs/plugins-and-integrations/convai-unity-sdk/platform-guides/windows-macos-and-linux) |
| Ship to Meta Quest with passthrough vision              | Meta Quest / XR | [Meta Quest and XR](/api-docs/plugins-and-integrations/convai-unity-sdk/platform-guides/xr-headsets)                     |
| Stream the Meta Quest passthrough camera to a character | Meta Quest / XR | [Meta Quest Vision setup](/api-docs/plugins-and-integrations/convai-unity-sdk/platform-guides/meta-quest-vision)         |

### Advanced topics

| I want to...                                                     | Topic            | Documentation                                                                                                                                   |
| ---------------------------------------------------------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| Replace the API credential provider                              | Custom providers | [Custom Credential Provider](/api-docs/plugins-and-integrations/convai-unity-sdk/advanced-topics/custom-providers/custom-credential-provider)   |
| Replace the end-user identity provider                           | Custom providers | [Custom Identity Provider](/api-docs/plugins-and-integrations/convai-unity-sdk/advanced-topics/custom-providers/custom-identity-provider)       |
| Replace the session persistence provider                         | Custom providers | [Custom Persistence Provider](/api-docs/plugins-and-integrations/convai-unity-sdk/advanced-topics/custom-providers/custom-persistence-provider) |
| Measure latency and interpret session metrics                    | Performance      | [Performance and Optimization](/api-docs/plugins-and-integrations/convai-unity-sdk/advanced-topics/performance-and-optimization)                |
| Extend the SDK with a custom module or replace internal services | Extension points | [Extending the SDK](/api-docs/plugins-and-integrations/convai-unity-sdk/advanced-topics/extending-the-sdk)                                      |

### Next steps

Start with installation if you have not set up the SDK yet.

{% content-ref url="/pages/1d9fa274483952ca377014dd2a4fb49c2f3e80a1" %}
[Getting started](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started)
{% endcontent-ref %}


# Release notes

Release notes for the Convai Unity SDK — current version highlights, previous release notes, bug fixes, and migration guidance for each release.

Track changes to the Convai Unity SDK across releases, including new features, bug fixes, and configuration changes. The current release is <code class="expression">space.vars.unity\_sdk\_version</code>.

{% updates format="full" %}
{% update date="2026-09-04" tags="v4.6.0,Current" %}

## v4.6.0

**Breaking this release:** `SetExplicitConversationTarget` renames to `SetInitialCharacter`, three Gaze profile Conversation Attention fields are removed and replaced, `headStabilityDegrees` is removed, two Gaze profile defaults changed, and the microphone open timing in multi-character scenes changed. See **Breaking changes and migration** below.

**Multi-character conversations**

* Conversation targeting moved into the SDK: no component to add, no collider, no layer, and no field to fill. `ConvaiManager.ConversationTargeting` reads the player's view by default and scores every candidate by angle with distance as a tiebreak, so it works the same on a mouse, a gamepad, and a head-mounted display. `Mode` chooses `LookAt`, `Proximity`, or `Manual`; `ConvaiManager.TalkTo(character)` points the conversation explicitly for scripted moments
* A room now opens on the character the player is looking at, instead of always the first character in scene order. An assigned **Convai Manager > Initial Character** still wins outright, and the Console names the character it opened on and why
* A character that joins or leaves a connected room is added or removed live, with no reconnect — instantiating a character prefab, or enabling a character `GameObject`, is the whole integration. A room that connected with a single character carries no roster and cannot grow live; the Console names that case and what to do instead
* `ConvaiManager.Events` gains `OnConversationAvailabilityChanged`, `OnConversationTargetChanged` (with phases `Requested`, `Confirmed`, `Failed`), and `OnRoomRosterChanged`
* `Convai.ConfigureConversationTargeting` joins the MCP and Unity Assistant tool set, and `Convai.DiagnoseConversation` reports the roster, the addressed character, and the targeting verdict. Tool contract version `7`
* A **Multi-Character Sample** ships alongside the existing Basic and LipSync samples

**Conversation availability**

* `ConvaiManager.ConversationAvailability` answers whether the player can talk right now — `Offline`, `Connecting`, `Preparing`, `Ready`, `Answering`, `Unavailable` — for `ConvaiManager.AddressedCharacter`, with `ConversationAvailabilityChanged` reporting each move and `CanAcceptPlayerInput()` as the question a UI asks. The same answer is available per character on `ConvaiCharacter.ConversationAvailability`
* The shipped chat field, push-to-talk, and hands-free input all consult this now. The chat field disables until the character can hear, and `ConvaiPlayer.TrySendTextMessage` refuses with a reason a project can show instead of dropping the message silently
* **Behaviour change:** in multi-character scenes the microphone now opens when the room confirms its first character, rather than when the transport connects — typically a fraction of a second later. Single-character rooms are unaffected

**Gaze**

* **Attend To Speaker** on the Gaze component now follows the conversational floor — the player, another character, or both — while a character is not in its own turn, so listeners in a room with more than one participant react to whoever is speaking instead of sitting in `Idle`. Four new settings in the profile's **Conversation** group tune the model: **Typical Pause Before Turning**, **How Much Reactions Vary**, **How Long Attention Fades Over**, and **Shortest Gap Between Listeners Turning**
* Listener attention is now a per-participant value that rises on a speech onset and decays continuously, fixing listeners that turned to a new speaker late, together, or to the wrong person
* The head and chest now follow a moving target continuously instead of in bursts, removing the dead band that caused parked holds and whip-like corrections. A camera cut is now treated as an ordinary look rather than a startle. **Head Speed Limit** drops from 240°/s to 150°/s, and **Turn Speed (Rigs Without Turn Animation)** drops from 140°/s to 90°/s — both are safety ceilings; profiles already authored keep their saved values

**Speech and performance**

* On a character with Lip Sync, the speaking turn now ends on lip sync's own frame data rather than waiting on the silence detector or the service's confirmation, so a character stops performing when its voice stops rather than up to two seconds later. `ConvaiCharacter.IsSpeaking`, `OnSpeechStopped`, and `OnTurnCompleted` are unaffected. The Conversation Flow profile carries a `stopWhenTheVoiceStops` switch for the previous timing, but it ships on and is not exposed in the profile's Inspector or through a public setter, so the new timing is what every character gets
* A character's mouth now settles closed at the end of a sentence instead of hanging open or snapping shut: a new **Settle Duration** (0.35 s) on the Lip Sync component drives a spring-based close, and `LipSyncPlaybackEngine.SettleToRest()` triggers it from code
* A talking hand no longer freezes mid-gesture when a response ends — the gesture now decelerates to rest as its weight fades, starting **Talk Release Lead Seconds** (0.6 s) before the response actually ends
* Lip sync no longer stalls after the first response in a session; every later response now plays with a moving mouth instead of a still one
* `ConvaiCharacter.OnTranscriptReceived` fires. It previously read a message the service does not send, so it never fired in any room and everything downstream of it sat idle — gaze referential glances, and any `IConvaiCharacterBehavior` reacting to what a character said. It now reads the room transcript feed, and its `isFinal` argument comes from the message's own lifecycle instead of being hard-coded to `false`, so consumers gating on the final utterance work. Two consequences: text arrives per sentence rather than per synthesis chunk, and a line that streams before it settles is delivered twice — once interim, once final

**Editor and inspector work**

* Multi-character controls in the **Convai Manager** inspector were renamed for clarity: *Include in Next Room* is now **Characters Joining the Room**, *Within* is **Range (Metres)**, *Seen From* is **Player Camera**, *Scene Characters* is **Characters in Scene**, and *Roster room* / *Single character* are **Several characters** / **One character only**
* The **Convai Manager** inspector's Live section now names who is being addressed, whether the player can talk to them, and one row per character in the room with its status
* The Character inspector now flags a duplicated Character ID before Play mode, instead of only when the room refuses to connect
* The **Convai Player** and **Convai Room Manager** Validation sections were redesigned with a header that reflects the worst check found, instead of a permanently amber header
* Every Convai inspector section now shares one left-edge alignment and one section-padding system

**Unity 6000.5 compatibility**

* The package compiles on Unity 6000.5 again. Unity's scene identity move to a 64-bit `EntityId`, and the deprecation of `Object.GetInstanceID()`, are now routed through compatibility seams (`ConvaiSceneId`, `ConvaiObjectId`, `ConvaiObjectFind`), so ids are unchanged on `6000.0` through `6000.3` and agree with the old ones on `6000.4` and later

**Package dependencies**

* `com.unity.ai.inference` `2.2.1` is a new dependency, for client-side voice activity detection
* `com.unity.nuget.newtonsoft-json` `3.2.2`, `com.unity.ugui` `2.0.0`, and `com.unity.inputsystem` `1.19.0` are retained
* `com.unity.ai.navigation`, `com.unity.collections`, and `com.unity.modules.xr` are no longer declared dependencies

**Breaking changes and migration**

* **`ConvaiManager.SetExplicitConversationTarget` is renamed to `ConvaiManager.SetInitialCharacter`.** The old name is still callable and marked `[Obsolete]`. The rename exists because the old name read like the verb for changing who the player is talking to, but it chooses which character speaks first, and calling it on a connected room queues an ownership reconnect rather than moving the conversation. Replace `SetExplicitConversationTarget(character)` with `SetInitialCharacter(character)` for the same behavior; use `TalkTo(character)` to switch the conversation in a running room
* **The Gaze profile's Conversation Attention fields are removed:** **Shortest/Longest Delay Before Turning**, **Stays With The Conversation For**, and **Looks To Whoever Answers Next**, along with `ConvaiGazeProfile.SpeakerAttentionReactionDelayMin/Max`, `SpeakerAttentionLingerSeconds`, and `SpeakerAttentionHandOffGlanceChance`. Their replacements are **Typical Pause Before Turning**, **How Much Reactions Vary**, **How Long Attention Fades Over**, and **Shortest Gap Between Listeners Turning**. A profile carrying the removed fields loses them silently on its next save — re-apply a personality, or leave the defaults, to pick up the new attention model's tuning
* **The Gaze profile's Ignore Small Target Movement (`headStabilityDegrees`) is removed.** Its replacements on **Head & Body** are **How Quickly The Head Follows Movement** (`HeadFollowSeconds`, default 0.2 s) and **How Quickly The Chest Follows Movement** (`TorsoFollowSeconds`, default 0.35 s). A profile carrying the removed field ignores it from the moment it loads and drops it on its next save; lower **How Quickly The Head Follows Movement** if a fast target trails the head more than wanted
* **Two Gaze profile defaults changed:** **Neck Relaxes During A Turn** (`bodyTurnHeadRelief`) from `0.4` to `1`, and **Chest Speed Limit** (`maxTorsoAngularSpeed`) from `180°/s` to `90°/s`. Existing profiles keep their saved values — only new profiles pick up the new defaults. To pick up the new defaults on an existing profile, set both values by hand
* **Behaviour change:** in multi-character scenes the microphone now opens when the room confirms its first character, rather than when the transport connects
  {% endupdate %}

{% update date="2026-08-14" tags="v4.5.0" %}

## v4.5.0

**Character embodiment**

Five behavior modules now share one component family under **Add Component > Convai > Embodiment**, and each module reads the same dialogue state.

* **Convai Gaze** (`ConvaiGazeController`) replaces the previous Gaze implementation and the Attention module. It decides what the character looks at and performs the look in one component: eye-contact styles (`Natural`, `Speaking Focus`, `Conversation Lock`, `Always Lock`), `ConvaiGazeTarget` for scene objects with priority tier and aim offset, `PlayerAttentionSensor` for "is the player looking at me", a whole-body look-sharing ladder from eyes to head to chest to feet, and an XR eye-tracking extension point through `IPlayerGazeRaySource`
* **Convai Body Animation** (`ConvaiBodyAnimationController`) replaces Dialogue Animation. It builds its own layered `PlayableGraph` in code, so there is no Animator Controller asset to author. It covers idle and talk variants, co-speech gestures, target-aimed gestures, and NavMesh-synced walking with directional starts, planted stops, and turns in place. Animation clips and `ConvaiBodyAnimationSet_Female` ship with the module
* **Convai Body Language** (`ConvaiBodyLanguageController`) is new: breathing, weight shifts, sway, posture pulses, speech-timed head beats, listening lean-in, idle fidget, and startle or amused reactions. It layers on top of the Animator without owning a clip and needs no imported content
* **Emotion** gained semantic expression recipes that resolve onto ARKit, Reallusion CC3 and CC4, and MetaHuman rigs with no per-character authoring, plus resting mood, mood drift, a micro-expression idle layer, and shader-property output. `ConvaiEmotionController.SetMood(label, intensity, transitionSeconds)` and `ClearMood(transitionSeconds)` control mood at runtime, and `DominantEmotionChanged` and `MoodChanged` report resolved expression. Four personalities ship: Composed, Warm, Energetic, and Reserved
* **Conversation flow** supplies the dialogue state the other four modules read

**Character Actions**

* The **Actions Editor** window (**Convai > Actions Editor**) adds reusable Action Sets, Scene Knowledge, Character Settings, and a Live mode with batch progress, timeline, target registry, and per-action insights. The **Try It** box previews an action in Edit mode and dispatches it in Play mode
* Four built-in executors are new: Lead Player To Target, Scan Environment, Count Target Group, and Measure Distance
* `ConvaiActionExecutionResult.Answered("…")` lets an action supply a sentence the character can speak, separate from the diagnostic `Message`. **When It Finishes** authors this per action
* `ConvaiActionFailureReason` reports a typed failure cause on `ConvaiActionExecutionResult` and `ConvaiActionStepReport`. `ConvaiActionParameterValue.Presence` distinguishes an unfilled slot from a blank one. `ConvaiActionDispatcher` exposes `IsBusy`, `PendingBatchCount`, and `CurrentActionName`
* `ConvaiActionExecutorBase`, `ConvaiTargetedActionExecutor`, and `ConvaiCharacterActionExecutor<TPeer>` are the base classes for custom behaviors. `ConvaiPlayerBody` is now public, and `ConvaiActionExecutorBase.ResolvePlayer()` is `virtual`, so first-person rigs that move a child capsule resolve to the player's real position
* Wire parsing was corrected across a large set of dropped and garbled command cases, and a scene-placed `ConvaiActionTarget` is now synced to Convai mid-session

**Authentication**

* Authentication is now a project-level choice between API Key mode and Auth Token mode. Auth Token mode resolves a fresh short-lived credential from a configured endpoint or an `IConvaiAuthTokenProvider` before each room connection, works on Native and WebGL transports, sends the credential in the `API-AUTH-TOKEN` header, and strips the saved account API key from player builds while keeping it for Editor tooling
* `ConvaiManager.ConnectWithAuthTokenAsync` is a one-shot connect for projects whose login layer already holds a Convai auth token. It also supplies `end_user_id` and `end_user_metadata.name` without a registered provider or a configured endpoint

**Session lifecycle**

Idle-warning and idle-deadline events, `ResetIdleTimer` and `ExtendIdleTimeout`, and explicit pause, resume, and reconnect controls are available at runtime. Background behavior is set through the `ContinueAudibly`, `PauseTimeline`, and `MuteButCatchUp` policies, with an observable WebGL fallback from `PauseTimeline` to `MuteButCatchUp`.

**Editor tooling**

* **Convai > Troubleshooter** reports every Convai capability per character as set up, blocked, or set up but inert, with one-click fixes and a **Fix All** action. Extend it with `IConvaiSetupHealthProvider` and `ConvaiSetupHealthRegistry.Register`
* The **Convai** menu was reduced from 17 rows to 9 — see Breaking changes and migration below
* Every Convai inspector and window moved to a shared editor design system, and the Character Rig inspector was rewritten to lead with a Ready or Needs Attention verdict and banded detection confidence
* Opening a package-shipped settings asset is read-only and offers **Create A Project Copy**, which lands the copy under `Assets/Convai/`

**Requirements and dependencies**

The minimum Unity version is `6000.0.80f1`. The package adds three dependencies: `com.unity.ai.navigation`, `com.unity.collections`, and `com.unity.modules.xr`.

**LipSync, samples, and platforms**

* The Lip Sync Sample ships Sofia, a Reallusion CC4 character, in place of Camila
* Built-in viseme maps and lip sync profiles moved from `SamplesShared/Resources/` into the LipSync module and are constructed in code. Project registries under `Resources/LipSync/ProfileRegistries/` are still discovered and still win
* `ConvaiLipSyncSpeechEnergyAdapter` never sampled, so every feature reading speech energy read a flat signal. It now joins the character tick and samples each frame
* The package ships `ConvaiSampleFirstPersonController` and `ConvaiSampleFirstPersonInputs`, a renamed copy of Unity's Starter Assets first-person controller
* Meta Quest push-to-talk release now reads the A, B, X, and Y buttons through Unity's XR input API, and a controller read failure or disconnect fails closed so microphone capture cannot stay open
* The Quest Vision Frame Source has a designed inspector with live capture readout. Vision component foldout states reset once on upgrade

**Breaking changes and migration**

* **Unity 6000.0.80f1 is the minimum editor version.** There is no supported configuration below this floor. Upgrade the editor before upgrading the package
* **Three modules were retired, each with a successor.** Attention is replaced by Convai Gaze, Dialogue Animation by Convai Body Animation, and the facial clip system by the Emotion module's micro-expression layer. Their assemblies, profile assets, and preset slots were removed with them
* **Migrating from Attention or the previous Gaze components:** replace `ConvaiAttentionController`, `ConvaiGazeCoordinator`, `ConvaiHeadLookActuator`, and `ConvaiEyeGazeActuator` with a single `ConvaiGazeController` (**Add Component > Convai > Embodiment > Gaze**). Delete your `ConvaiAttentionProfile`, `ConvaiGazeCoordinationProfile`, `ConvaiGazeEyeProfile`, and `ConvaiGazeHeadProfile` assets — those types are gone and the assets will not deserialize. Tuning values do not carry over; re-tune on a `ConvaiGazeProfile`, or assign none and start from the defaults. Replace a custom `IFocusTargetProvider` or `IGazeIntentProvider` with `IGazeTargetProvider` registered through `RegisterTargetProvider`, `ConvaiAttentionDynamicContextBridge` with `GazeDynamicContextBridge`, and `ConvaiWorldObjectFocusProvider` with `ConvaiGazeTarget`. Replace `ConvaiWorldObjectFocusProvider` before you save the affected scenes, because Unity strips the removed component silently on the next save
* **Migrating from Dialogue Animation:** replace `ConvaiDialogueAnimationController` with `ConvaiBodyAnimationController`, move clips from a `DialogueAnimationLibrary` into a `ConvaiBodyAnimationSet`, and move timing and weight tuning into a `ConvaiBodyAnimationConfig`. Delete the `DialogueAnimatorContract` asset, its four Animator layers, the ping-pong states, and the `ConvaiDialogueSlot_*` placeholder clips; an Animator Controller left in place fights the graph for the same bones. Per-clip gender filtering (`CharacterGender`) and per-clip emotion affinity tags (`DialogueEmotionAffinity`) have no field-level migration — author one set per character type instead of filtering a mixed set at runtime. `AnimationRiggingGazeBridge` is gone, and Convai Gaze needs no rigging package
* **Migrating from facial clips:** delete `ConvaiFacialClipPlayer`, `ConvaiFacialClipRuntimePlayer`, and their profile assets, and let the Emotion module's micro-expression layer produce idle facial life — it is on by default and nothing needs porting. A deliberate authored facial performance has no supported replacement in this release; drive the mesh yourself with `SkinnedMeshRenderer.SetBlendShapeWeight` on a mesh no Convai module composes. Bake your clips into your own asset before upgrading, because `ConvaiFacialAnimationProfile` assets will not deserialize once the module is gone
* **The Convai editor menu was restructured.** **Convai > Welcome**, **Convai > Account**, **Convai > Long Term Memory**, **Convai > Updates**, **Convai > Contact Us**, and **Convai > AI Coding Setup** are gone; those sections live one click further in, inside the window that **Convai > Convai Editor** opens. The nine current rows group into three bands: the Convai Editor window and its settings — **Convai > Convai Editor**, **Convai > Settings**, **Convai > Documentation**; the per-feature authoring editors — **Convai > Actions Editor**, **Convai > Body Animation Editor**, **Convai > Emotion Editor**, **Convai > Gaze Editor**, **Convai > Embodiment Editor**; and diagnostics — **Convai > Troubleshooter**. The `ConvaiConfigurationWindowEditor` methods that opened a section directly are still public
* **`UnityEventActionExecutor` was renamed to `ConvaiUnityEventActionExecutor` and carries a new GUID.** Unity does not migrate the component: it is dropped from every scene and prefab that had one, along with the events wired into it, and no upgrade step recovers them. Record what each event called before you upgrade. Afterwards, add `ConvaiUnityEventActionExecutor` (**Add Component > Convai > Actions > Raise Unity Event**) on each affected object, re-wire its event by hand, and re-point any action bound to the old component. The serialized field is still `_onExecute`
* **Three experimental action executors were removed from the public catalog:** Guided Tour, Address The Group, and Perform Gesture At Target. `LookAtTargetActionExecutor` was also removed — add `ConvaiLookAtActionExecutor` (**Add Component > Convai > Actions > Look At Target**) instead and give the character Gaze, since the replacement works through `ConvaiGazeController`. Six sample action behaviors, `ConvaiActionTestSetup`, and `ConvaiActionDebugWindow` were removed; the Actions Editor covers their work
* **Point At Target's `Hold Seconds` means only the mid-gesture pause**, not the length of the whole gesture. Two settings now reach the pointing layer: **Gesture Speed** multiplies the rise and fall, and **Release** set to `Blend` drops the pose when the hold ends. Both default to the previous behavior, so no existing scene changes; a point of about a second is Gesture Speed `1.5` with Release `Blend`
* **Fourteen editor types are now `internal`,** among them `ConvaiVisionBaseEditor`, `ConvaiCharacterEditor`, and `TurnTakingOptionsDrawer`. Subclassing a Convai editor or property drawer is no longer supported and has no replacement extension point — delete the subclass, and add project-specific controls through a separate `MonoBehaviour` of your own. `[CustomEditor]` registration is unaffected, so every Convai inspector draws as before
* **The Emotion module's slot-list facial output path was removed:** `EmotionSlotBinding`, `BlendshapeEmotionBinding`, `AnimatorParameterEmotionBinding`, `RealisticEmotionSlots`, `NeutralAlternator`, and the `SemanticExpressionsEnabled` and `NeutralAlternationEnabled` switches on `ConvaiEmotionProfile`. The runtime discarded this data whenever semantic expressions were on, which was every shipped profile, so nothing needs porting. Shader-property output is unaffected
* **The shared Emotion taxonomy and profile assets changed identity.** `ConvaiSamplesShared_EmotionTaxonomy.asset` was rebuilt and `ConvaiSamplesShared_EmotionProfile.asset` was replaced by the four named personalities. Open each affected character and re-point the taxonomy and the personality; a character with no taxonomy still runs, but every emotion dropdown comes up empty
* **Embodiment types were renamed, with asset GUIDs preserved:** `EmbodimentProfileReceiver<T>` to `ConvaiCharacterModule<T>`, `CharacterEmbodimentPreset` to `ConvaiEmbodimentPreset`, `EmbodimentPresetLibrary` to `ConvaiEmbodimentPresetLibrary`, and `ConvaiCharacterEmbodimentBinding` to `ConvaiEmbodimentPresetBinding`. Only source references need updating. `EmbodimentContext` replaced its per-seam registration members with one `CharacterServiceRegistry` — implement `IEmbodimentTickable` and call `EmbodimentContext.RegisterTickable(this)` from `OnEnable` to join the character tick. `EmbodimentContext.TryResolve` no longer creates a context on a GameObject that is not a Convai character; call `TryResolveFor` for a diagnosable failure
* **`ActionResponsePayload` and the public `UnityObjectCompatibility` class were removed.** Action commands still arrive through `ConvaiCharacter.OnActionsReceived` and `ConvaiManager.Events.OnCharacterActionReceived`. Replace `UnityObjectCompatibility.FindObjectsByType<T>(mode)` with Unity's `Object.FindObjectsByType<T>`, and `UnityObjectCompatibility.GetId(value)` with `value.GetInstanceID()` up to Unity 6000.4 or `value.GetEntityId()` on 6000.2 and newer
* **The Camila sample character was removed.** A scene or prefab referencing her prefab, materials, or textures reports a missing reference. Sofia uses the same blendshape convention, so a Convai setup transfers. Copy any customized Camila assets out of the package before upgrading
  {% endupdate %}

{% update date="2026-07-30" tags="v4.4.1" %}

## v4.4.1

**Fixes**

* Added Unity 6.0 through 6.5+ compatibility paths for object IDs and object searches. Unity 6.4 and newer use 64-bit `EntityId` and no-sort search APIs, while Unity 6.0 through 6.3 retain legacy fallbacks
* Fixed Unity 6.0 project resolution by removing unavailable pseudo-module dependencies and pinning `com.unity.collections` to `2.6.8`, avoiding the known Collections `2.6.7` and AI Assistant `xxHash3`/`Unsafe` compiler regression
* Kept the LipSync sample background light isolated on Unity 6.0 and 6.4+ by aligning both URP rendering-layer serialization formats, preventing the light from overexposing the sample character
* Push-to-talk release now keeps the microphone and speech recognition open while waiting for the final transcription result. When the configurable `PushToTalkPolicy.ReleaseTailMs` window expires, the SDK signals the authoritative stop and allows one more bounded window before closing capture
* Fixed WebGL builds crashing from a stale `NativeLib` reference in `livekit-bridge.jslib`, and restored first-turn LipSync by correcting audio-timing registration order, warming the WebGL analyser, and recovering missed `PlaybackStarted` callbacks
  {% endupdate %}

{% update date="2026-07-21" tags="v4.4.0" %}

## v4.4.0

**Canonical transcript timeline**

`ConvaiManager.Transcripts` now exposes a room-scoped `TranscriptTimeline` built from immutable `TranscriptTurn` and `TranscriptChange` models, replacing the previous snapshot-based contract. `CurrentTimeline` returns `TranscriptTimeline` instead of a timeline snapshot, `Changed` supplies `TranscriptChangeBatch`, and `Subscribe`/`SubscribeCommitted` callbacks receive `TranscriptChange` values. This is a breaking change for any code that consumed the old snapshot types — see the [Transcript API](/api-docs/plugins-and-integrations/convai-unity-sdk/scripting-reference/transcript-api) reference for the full migration path.

**Character Actions**

* `ConvaiActionConfigPatch` updates a character's actions, character targets, object targets, and current attention object during an active session, with omitted-versus-empty list semantics and generated update IDs
* `ConvaiActionDefinition.WaitForBotSpeech` (mirrored on `ConvaiActionCommand`) makes the first action of a fresh batch wait for character speech before executing, with an optional `DelayAfterBotSpeechSeconds` pause and a dispatcher-level speech gate timeout so a silent turn never stalls the batch

**AI Coding Assistant integration**

**Convai > AI Coding Setup** opens a new Editor section for configuring Unity MCP-based AI coding assistance, with support for Codex, Claude Code, Cursor, Gemini, and VS Code Copilot. A dedicated documentation section covers this integration in full.

**Dynamic Vision Context**

Rooms can opt into backend frame sampling through a new Dynamic Vision Context section on `ConvaiRoomManager` and `ConvaiRoomManagerProfile`.

**Convai SDK Settings**

The **Convai SDK** Project Settings page (**Edit > Project Settings > Convai SDK**) and the Editor window's new **Convai > Settings** section share one implementation, covering Setup Health, Credentials, Runtime Defaults, Diagnostics, Advanced, and About. Credentials adds API key obfuscation with automatic migration from plaintext, an Environment preset (Production, Beta, or Custom), and a Validate & Save action with a cached validation badge.

**LipSync**

Playback-alignment hardening anchors NeuroSync lipsync to the exact audio frame where speech starts, reducing drift on long or interrupted responses.

**Breaking changes**

* `ConvaiSettings.DefaultMicrophoneIndex` was replaced by `DefaultMicrophoneDeviceId` (string) — the integer index is not migrated; re-pick the microphone in Settings > Runtime Defaults
* `ConvaiSettings.ServerUrl` is now derived from the Environment preset — the serialized URL applies only when the environment is `Custom`
* The **Convai > Logger Settings** menu was removed — logging configuration lives in **Convai > Settings** (Diagnostics)
* `ConvaiRespondMode` unifies the respond-mode vocabulary (`ConvaiContextReactionMode` removed) — only relevant to scenes saved against unreleased beta builds
  {% endupdate %}

{% update date="2026-06-23" tags="v4.3.0" %}

## v4.3.0

* **VAD settings:** Configurable connect-time user voice activity detection (VAD) settings for room connections, with room and profile Inspector controls and server-default handling
* **Dynamic context v2:** Consolidated dynamic context flow with tracked state and events, batching, acknowledgement/result events, and the `ConvaiDynamicContextRelay` authoring surface
* **World-object context:** Synced world-object context sends tracked scene metadata and the current focus object through dynamic context
* **Narrative triggers:** Separate trigger modes for saved triggers, inline events, and scripted speech
* **Transcript UI:** World-space chat transcript prefab for spatial UI setups
* **Actions:** Action configuration validation and duplicate-binding preservation, with step diagnostics and action debug probing
* **Chat input:** Enter-to-focus behavior for chat input

**Migration notes**

* Dynamic context now uses the v2 tracked update flow — prefer `ConvaiCharacter.DynamicContext` or `ConvaiDynamicContextRelay` over the removed command-style dynamic context UI
* Narrative trigger requests now carry an explicit mode — use saved triggers, inline events, or scripted speech according to the desired backend behavior
* Custom VAD values are sent only during room connect — use the server-default option when the backend should own VAD defaults
  {% endupdate %}

{% update date="2026-05-08" tags="v4.2.0" %}

## v4.2.0

**Actions System**

Characters can execute in-scene commands through a structured runtime. New in this release:

* `ConvaiActionDispatcher` with queued dispatch — actions execute in sequence without race conditions
* `IConvaiActionExecutor` interface for custom executors
* Six built-in executors: move-to (Transform and NavMesh), pick-up, look-at, Animator trigger, and UnityEvent
* Inspector-driven configuration — no scripting required for standard action setups
* Runtime diagnostics for monitoring action queue state

**Meta Quest Passthrough Vision**

`QuestVisionFrameSource` enables the Vision module on Quest 3 and Quest 3S devices without an external camera. Characters see through the device's passthrough camera during mixed reality sessions.

**Runtime Turn-Taking Mode Switching**

Switch between hands-free and push-to-talk modes during live sessions using `ConvaiManager.SetConversationInputModeAsync()` or the runtime Settings Panel — no scene reload required.

**Dynamic Context Expansion**

* Tracker APIs let you monitor current context state from scripts
* Inspector tooling for authoring context commands without code
* `SampleDynamicContextUI` prefab demonstrates runtime injection patterns

**Scene Setup Tooling and Validation**

Menu-driven component creation (**GameObject > Convai > Setup Required Components**) and scene validation (**GameObject > Convai > Validate Scene Setup**) prevent misconfiguration before entering Play mode.

**Settings Panel Input Mode Control**

The runtime Settings Panel now exposes input mode switching — players or developers can change turn-taking mode during a session without scripting.
{% endupdate %}

{% update date="2026-04-09" tags="v4.1.0" %}

## v4.1.0

* **Dynamic Context:** `ConvaiDynamicContextCommand` component enables runtime injection of state and events into character knowledge
* **LipSync sample:** Removed camera dependency from the LipSync sample scene — works with any camera setup
* **Vision module:** Reliability improvements to frame source lifecycle and reconnection handling
* **iOS:** Fixed crash on first microphone access when `NSMicrophoneUsageDescription` was absent from build settings
* **Sample scenes:** Refined setup and scene structure across Basic and LipSync samples
* **Editor:** Startup time improvements for projects with large scene counts
  {% endupdate %}

{% update date="2026-03-12" tags="v4.0.0,Initial Release" %}

## v4.0.0

Initial public release of the Convai Unity SDK.

**Core components:** `ConvaiManager`, `ConvaiRoomManager`, `ConvaiCharacter`, `ConvaiPlayer`

**Conversation pipeline:** Speech-to-text, language understanding and generation, text-to-speech — fully streamed in real time

**Modules:** LipSync, Emotion, Vision, Narrative Design, Dynamic Context, Long-Term Memory, Scene Metadata, Dialogue Animation, Gaze and Attention

**Platform support:** Windows, macOS, Linux, Android, iOS, WebGL

**Editor tooling:** Scene setup, validation, Project Settings integration, and the Convai Welcome window
{% endupdate %}
{% endupdates %}

### Next steps

To start using the SDK, follow Getting Started.

{% content-ref url="/pages/1d9fa274483952ca377014dd2a4fb49c2f3e80a1" %}
[Getting started](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started)
{% endcontent-ref %}


# Compatibility and requirements

Find the Unity version, render pipeline, platform, and network requirements you need before installing the Convai Unity SDK.

Confirm your environment meets these requirements before installing the Convai Unity SDK. The SDK requires Unity <code class="expression">space.vars.unity\_min\_version</code>, and there is no supported configuration on an earlier Unity release. The pages below cover Unity version support, render pipeline compatibility, platform-specific constraints, and network requirements.

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Unity versions and render pipelines</strong><br>Minimum Unity version, required packages, and render pipeline support.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/compatibility-and-requirements/unity-versions-and-render-pipelines">Unity versions and render pipelines</a></td></tr><tr><td><strong>Platform support matrix</strong><br>Feature availability across Windows, macOS, Android, iOS, Meta Quest, and WebGL.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/compatibility-and-requirements/platform-support-matrix">Platform support matrix</a></td></tr><tr><td><strong>Network and API requirements</strong><br>Domains, ports, and firewall rules needed for real-time SDK operation.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/compatibility-and-requirements/network-and-api-requirements">Network and API requirements</a></td></tr></tbody></table>

### Next steps

Once you have confirmed compatibility, install the SDK.

{% content-ref url="/pages/f1aef51364acf8a4bf5802a99774c033d9ee6e68" %}
[Install the Convai Unity SDK](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/installation)
{% endcontent-ref %}


# Unity versions and render pipelines

Reference for Convai Unity SDK environment requirements, including the minimum Unity version, required package dependencies, and render pipeline support.

The Convai Unity SDK requires Unity <code class="expression">space.vars.unity\_min\_version</code>. There is no supported configuration on an earlier Unity release, and the SDK compiles on Unity `6000.5` now that Unity moved scene identity to 64-bit. All three Unity render pipelines are supported with no additional configuration, and both installation methods — Package Manager and Asset Store — resolve the required package dependencies automatically.

### Unity version requirements

| Requirement                  | Version                                                                |
| ---------------------------- | ---------------------------------------------------------------------- |
| Minimum                      | <code class="expression">space.vars.unity\_min\_version</code>         |
| Recommended for new projects | <code class="expression">space.vars.unity\_recommended\_version</code> |

{% hint style="warning" %}
The minimum is a hard floor. Convai supports no configuration below Unity <code class="expression">space.vars.unity\_min\_version</code>, including earlier LTS releases. Upgrade the project before installing the SDK.
{% endhint %}

### Required package dependencies

The SDK depends on four Unity packages. Both installation methods install these automatically — you do not need to add them manually unless you encounter a version conflict.

| Package                           | Version                                                                   |
| --------------------------------- | ------------------------------------------------------------------------- |
| `com.unity.ai.inference`          | <code class="expression">space.vars.dep\_ai\_inference\_version</code>    |
| `com.unity.nuget.newtonsoft-json` | <code class="expression">space.vars.dep\_newtonsoft\_json\_version</code> |
| `com.unity.ugui`                  | <code class="expression">space.vars.dep\_ugui\_version</code>             |
| `com.unity.inputsystem`           | <code class="expression">space.vars.dep\_inputsystem\_version</code>      |

{% hint style="warning" %}
Do not downgrade these packages after installation. The SDK targets the versions listed above and behavior on lower versions is undefined. If your project already pins an older version of any of these in `Packages/manifest.json`, remove or update the pin before installing.
{% endhint %}

NavMesh-driven locomotion needs one more package the SDK does not install. `ConvaiNavMeshLocomotion` drives a built-in Unity `NavMeshAgent`, but NavMesh authoring — `Window > AI > Navigation` and the `NavMeshSurface` component — comes from `com.unity.ai.navigation`. If your project bakes a NavMesh for character movement, install `com.unity.ai.navigation` yourself through Package Manager.

### Render pipeline support

The SDK detects the active render pipeline at runtime and adapts automatically. The Vision module's camera capture path, for example, uses built-in render hooks when no render pipeline asset is assigned and an explicit render path on URP and HDRP. All three Unity render pipelines are fully supported with no manual configuration required.

| Render Pipeline                        | Supported |
| -------------------------------------- | --------- |
| Built-in Render Pipeline               | ✅ Full    |
| Universal Render Pipeline (URP)        | ✅ Full    |
| High Definition Render Pipeline (HDRP) | ✅ Full    |

Support requires no manual configuration on any pipeline, but the Vision module's `CameraVisionFrameSource` captures differently depending on the pipeline. On the Built-in pipeline it uses command-buffer render hooks with no extra render pass. On URP and HDRP it falls back to an explicit render-compatibility path that issues one additional `Camera.Render()` call per captured frame.

The included sample scenes use URP materials. If your project uses the Built-in or HDRP pipeline, sample scene materials require reassignment. The optional depth-of-field camera scripts in `SamplesShared/Camera/` support URP and HDRP; on the Built-in pipeline they skip depth-of-field and log a warning instead. None of these scripts are required for SDK functionality.

### Next steps

With your Unity version and packages confirmed, check which platforms you are targeting.

{% content-ref url="/pages/e8f8a0a8257efa9a6ff3e80c02b6bdc1224d50fc" %}
[Platform support matrix](/api-docs/plugins-and-integrations/convai-unity-sdk/compatibility-and-requirements/platform-support-matrix)
{% endcontent-ref %}


# Platform support matrix

Reference for Convai Unity SDK platform support, including feature availability across Windows, macOS, Android, iOS, Meta Quest, and WebGL.

The Convai Unity SDK runs on all major Unity deployment targets. Feature availability varies by platform — use the matrix below to confirm support before building for a specific target.

### Feature × platform matrix

| Feature                    | Windows / macOS / Linux | Android                        | iOS                                    | Meta Quest            | WebGL                                  |
| -------------------------- | ----------------------- | ------------------------------ | -------------------------------------- | --------------------- | -------------------------------------- |
| Voice conversation         | ✅ Full                  | ✅ Full                         | ✅ Full                                 | ✅ Full                | ✅ Full                                 |
| Microphone capture         | ✅ Full                  | ✅ Full                         | ✅ Full                                 | ✅ Full                | ✅ Full — HTTPS + user gesture required |
| Remote audio playback      | ✅ Unity `AudioSource`   | ✅ Unity `AudioSource`          | ✅ Unity `AudioSource`                  | ✅ Unity `AudioSource` | ⚠️ Browser-routed                      |
| Lip sync                   | ✅ Full                  | ✅ Full                         | ✅ Full                                 | ✅ Full                | ⚠️ Known timing drift                  |
| Spatial audio              | ✅ Full                  | ✅ Full                         | ✅ Full                                 | ✅ Full                | ❌ Not supported                        |
| Actions                    | ✅ Full                  | ✅ Full                         | ✅ Full                                 | ✅ Full                | ✅ Full                                 |
| Emotion                    | ✅ Full                  | ✅ Full                         | ✅ Full                                 | ✅ Full                | ✅ Full                                 |
| Long-Term Memory           | ✅ Full                  | ✅ Full                         | ✅ Full                                 | ✅ Full                | ✅ Full                                 |
| Narrative Design           | ✅ Full                  | ✅ Full                         | ✅ Full                                 | ✅ Full                | ✅ Full                                 |
| Dynamic Context            | ✅ Full                  | ✅ Full                         | ✅ Full                                 | ✅ Full                | ✅ Full                                 |
| Vision — Camera            | ✅ Full                  | ✅ Full                         | ✅ Full                                 | ✅ Full                | ⚠️ Canvas capture                      |
| Vision — Webcam            | ✅ Full                  | ⚠️ Runtime permission required | ⚠️ `NSCameraUsageDescription` required | ❌ Not applicable      | ❌ Not supported                        |
| Vision — Quest passthrough | ❌ Not supported         | ❌ Not supported                | ❌ Not supported                        | ✅ Full                | ❌ Not supported                        |

### Platform-specific requirements

{% tabs %}
{% tab title="WebGL" %}
WebGL is fully supported with the following constraints imposed by browser security policies:

* **Microphone capture** requires HTTPS or `localhost`. HTTP deployments cannot access the microphone. Call `ConvaiManager.EnableAudioAndStartListening()` from a user gesture (button click) — do not start audio automatically on scene load.
* **Remote audio playback** is routed through the browser's audio system, not Unity's `AudioSource`. Volume and spatialization controls on `AudioSource` components have no effect on WebGL.
* **Vision — Camera** uses browser canvas capture (`CameraVisionFrameSource` is supported).
* **Vision — Webcam** (`WebcamVisionFrameSource`) is not supported on WebGL — `AsyncGPUReadback` is unavailable in the browser runtime. Use `CameraVisionFrameSource` to stream the game canvas instead.
* **Spatial audio** is not supported on WebGL.

{% hint style="warning" %}
WebGL has a known audio/lip-sync timing drift defect — audio and lip-sync data arrive correctly, but playback timing can drift in browser builds. This is a tracked defect, not a missing feature. Validate in your target browser before shipping.
{% endhint %}

{% hint style="info" %}
Always validate WebGL builds in the actual hosting environment, especially if the build is embedded in an iframe. Add `allow="microphone"` to the iframe tag if you embed the build in a page you control.
{% endhint %}

For detailed WebGL setup, browser compatibility, and deployment steps, see the WebGL platform guide.

{% content-ref url="/pages/7b2c74ff6faeac7d9557447799d0496b11e50783" %}
[WebGL](/api-docs/plugins-and-integrations/convai-unity-sdk/platform-guides/webgl)
{% endcontent-ref %}
{% endtab %}

{% tab title="Android" %}

* **Microphone:** The SDK requests `RECORD_AUDIO` permission at runtime via `ConvaiPermissionService`. Declare the permission in your `AndroidManifest.xml` and handle both grant and denial cases in your app flow.
* **Vision — Webcam:** `android.permission.CAMERA` is requested at runtime by `WebcamVisionFrameSource`. Handle permission grant and denial in your app flow.

For Android build configuration, permission handling, and microphone setup, see the iOS and Android platform guide.

{% content-ref url="/pages/32708cb5ab33fa2d1d0f91e747cc06da20220bc1" %}
[iOS and Android](/api-docs/plugins-and-integrations/convai-unity-sdk/platform-guides/ios-and-android)
{% endcontent-ref %}
{% endtab %}

{% tab title="iOS" %}

* **Microphone:** `NSMicrophoneUsageDescription` must be set in **Player Settings → Other Settings → iOS → Microphone Usage Description**. Omitting this causes a crash on first microphone access.
* **Vision — Webcam:** `NSCameraUsageDescription` must be set in **Player Settings → Other Settings → iOS → Camera Usage Description** if you use `WebcamVisionFrameSource`. On iOS, `WebcamVisionFrameSource` accesses the device camera via Unity's `WebCamTexture` API.
* Define your app's behavior when the user denies microphone or camera permission, and when the app is interrupted or backgrounded during a conversation.

For iOS build configuration, permission setup, and Info.plist requirements, see the iOS and Android platform guide.

{% content-ref url="/pages/32708cb5ab33fa2d1d0f91e747cc06da20220bc1" %}
[iOS and Android](/api-docs/plugins-and-integrations/convai-unity-sdk/platform-guides/ios-and-android)
{% endcontent-ref %}
{% endtab %}

{% tab title="Meta Quest" %}
Quest passthrough vision (`QuestVisionFrameSource`) is supported on **Quest 3 and Quest 3S only**.

**Requirements:**

* Meta XR SDK imported into your project
* `PassthroughCameraAccess` component present in the scene
* The `horizonos.permission.HEADSET_CAMERA` and `android.permission.CAMERA` permissions granted to the app

The Convai Unity SDK does not ship an `AndroidManifest.xml` and does not declare or request these permissions itself — `QuestVisionFrameSource` requires both to already be granted. Declare them in your project's manifest and confirm they are granted before relying on passthrough capture.

On other Quest hardware or non-Quest platforms, `QuestVisionFrameSource` produces no frames. Use `CameraVisionFrameSource` or `WebcamVisionFrameSource` instead.

`WebcamVisionFrameSource` is not applicable on Meta Quest because Quest does not expose a standard `WebCamTexture` device.

For Meta Quest project setup, XR SDK configuration, and passthrough Vision integration, see the XR headsets platform guide.

{% content-ref url="/pages/86442e40afdd1c7fd12eb8dc8331a0cc75827347" %}
[XR headsets](/api-docs/plugins-and-integrations/convai-unity-sdk/platform-guides/xr-headsets)
{% endcontent-ref %}
{% endtab %}
{% endtabs %}

### Next steps

With platform constraints confirmed, review the network requirements for real-time SDK operation.

{% content-ref url="/pages/451345facd5cd16f0b40e81f6f7a06784935c82b" %}
[Network and API requirements](/api-docs/plugins-and-integrations/convai-unity-sdk/compatibility-and-requirements/network-and-api-requirements)
{% endcontent-ref %}


# Network and API requirements

Explains which network hosts, ports, and firewall rules a Unity project must allow before it can connect to Convai over the internet.

The Convai Unity SDK requires outbound internet access during runtime. Speech, language understanding, and text-to-speech run through Convai over HTTPS and LiveKit WebRTC — there is no offline or LAN mode. Use this page when preparing a corporate network, validating a firewall allowlist, or confirming that a Play mode session reached the correct LiveKit room.

### Required outbound access

Runtime sessions use two Convai endpoints plus LiveKit hosts returned in the connect response. Allow outbound traffic from the machine running Unity to the hosts below.

#### Convai endpoints

| Host                                                         | Port  | Protocol | Purpose                                                   |
| ------------------------------------------------------------ | ----- | -------- | --------------------------------------------------------- |
| <code class="expression">space.vars.live\_server\_url</code> | `443` | HTTPS    | Connect API — session setup and room credentials          |
| `api.convai.com`                                             | `443` | HTTPS    | Character metadata, REST API, and WebGL emotion preflight |

#### LiveKit minimum requirements

After Convai accepts the connect request, the SDK joins a LiveKit room using the `room_url` and `token` from the response. Minimum outbound rules for LiveKit Cloud connectivity:

| Host                                         | Port  | Protocol | Purpose                               |
| -------------------------------------------- | ----- | -------- | ------------------------------------- |
| `convai-technologies-lfslae7c.livekit.cloud` | `443` | TCP      | Convai LiveKit signaling endpoint     |
| `*.livekit.cloud`                            | `443` | TCP      | LiveKit WebSocket signaling           |
| `*.turn.livekit.cloud`                       | `443` | TCP      | TURN/TLS fallback when UDP is blocked |

#### Optional direct media paths

LiveKit documents these paths for direct WebRTC media and TCP fallback. Add them when your network policy permits UDP or when the LiveKit connection test shows that the minimum TCP rules are not enough.

| Host                   | Port            | Protocol | Purpose                |
| ---------------------- | --------------- | -------- | ---------------------- |
| `*.host.livekit.cloud` | `3478`          | UDP      | TURN/UDP connectivity  |
| All LiveKit hosts      | `50000`–`60000` | UDP      | WebRTC media transport |
| All LiveKit hosts      | `7881`          | TCP      | WebRTC TCP fallback    |

No inbound ports are required on the client machine. For the full LiveKit firewall reference, see [Configuring firewalls](https://docs.livekit.io/deploy/admin/firewall/) in the LiveKit documentation.

### How realtime sessions connect

Each character session follows this sequence:

```mermaid
sequenceDiagram
    participant Unity as Unity SDK
    participant Convai as Convai
    participant LiveKit as LiveKit room

    Unity->>Convai: POST /connect with API key
    Convai-->>Unity: session_id, room_url, room_name, token
    Unity->>LiveKit: Join room at room_url with token
    LiveKit-->>Unity: Audio, video, and data streams
```

| Connect response field | Runtime use                                                                                 |
| ---------------------- | ------------------------------------------------------------------------------------------- |
| `session_id`           | Convai session ID for the live session                                                      |
| `character_session_id` | Conversation continuity across reconnects                                                   |
| `room_url`             | LiveKit WebSocket endpoint — for example `wss://convai-technologies-lfslae7c.livekit.cloud` |
| `room_name`            | LiveKit room name the client joins                                                          |
| `token`                | Temporary LiveKit room token used to join the room                                          |

The SDK reads `room_url` from the connect response and passes it to the transport layer. It does not hardcode a LiveKit hostname. The example host `convai-technologies-lfslae7c.livekit.cloud` is one Convai deployment; your logs may show a different `room_url` for the same account over time.

### Authentication

Two credential types are involved in a runtime session.

#### API key

Your project API key authenticates requests to Convai. Store it in **Edit > Project Settings > Convai SDK**.

| Request type            | Header           | Used for                                                   |
| ----------------------- | ---------------- | ---------------------------------------------------------- |
| Connect (`/connect`)    | `X-API-Key`      | Starting a realtime session                                |
| REST (`api.convai.com`) | `CONVAI-API-KEY` | Character metadata, long-term memory, and other REST calls |

The SDK sends the API key automatically. You do not paste the key into connect payloads manually.

#### LiveKit room token

Each successful connect response includes a temporary `token`. The SDK passes this token to LiveKit when joining the room. The token is short-lived and grants access only to that room. Treat it like a password — do not share it in public forums, support tickets, or version control.

### Find connection details in logs

When a session starts, the SDK logs room credentials at **Debug** level under the **Transport** category. Enable verbose transport logging before searching for these lines.

1. Open **Edit > Project Settings > Convai SDK > Diagnostics**.
2. Set **Global Log Level** to `Debug`, or expand **Category Overrides** and add an override with **Category** `Transport` and **Level** `Debug`.
3. Enter Play mode and start a character session.
4. Open the Unity Console and filter by `Transport`.

You should see one of these log forms:

```
[Debug][Transport]: Room details received: {"token":"...","room_name":"...","session_id":"...","room_url":"..."}
```

If the JSON line is hard to read, search for `Token:` — the SDK also prints a readable summary:

```
[Debug][Transport]: Token: ...; Room Name: ...; Room URL: ...; Session ID: ...; Character Session ID: ...
```

| Log field              | Meaning                                                 |
| ---------------------- | ------------------------------------------------------- |
| `token`                | LiveKit room token                                      |
| `room_name`            | LiveKit room name / room ID                             |
| `room_url`             | LiveKit URL / WebSocket endpoint                        |
| `session_id`           | Convai session ID                                       |
| `Character Session ID` | Convai character session ID for conversation continuity |

{% hint style="danger" %}
Do not share the room token publicly. It is temporary and grants access to the LiveKit room. Redact `token` values before posting logs to support channels or public issue trackers.
{% endhint %}

Debug log calls compile out of non-development builds unless `CONVAI_DEBUG_LOGGING` is defined. Debug transport lines appear in the Unity Editor and Development Builds by default. See [Debug tools reference](/api-docs/plugins-and-integrations/convai-unity-sdk/troubleshooting/debug-tools-reference) for logging configuration.

### Test the LiveKit connection

Use the [LiveKit connection test](https://livekit.com/webrtc/connection-test) when you need to confirm whether a restricted network can reach the room returned by Convai.

1. Start a Unity session and find the `Token:` log line.
2. Copy the `Room URL` value into **LiveKit URL**.
3. Copy the `Token` value into **Room Token**.
4. Select **Run test**.

| Connection test field | Value from Convai logs  |
| --------------------- | ----------------------- |
| **LiveKit URL**       | `room_url` / `Room URL` |
| **Room Token**        | `token` / `Token`       |

The test validates LiveKit signaling and WebRTC connectivity for that temporary room. It does not validate your Convai API key, `api.convai.com`, or character configuration.

### Firewall validation checklist

Work through this checklist with your network or IT team before deploying to a restricted environment.

1. Confirm outbound TCP `443` to <code class="expression">space.vars.live\_server\_url</code> and `api.convai.com`.
2. Confirm outbound TCP `443` to `convai-technologies-lfslae7c.livekit.cloud`, `*.livekit.cloud`, and `*.turn.livekit.cloud`.
3. When UDP is permitted, allow UDP `3478` to `*.host.livekit.cloud` and outbound UDP `50000`–`60000`.
4. Exclude Convai and LiveKit hostnames from TLS inspection if your proxy performs man-in-the-middle decryption on HTTPS or WSS traffic.
5. Enter Play mode, enable **Transport** logs at **Debug**, and confirm a `Room details received` or `Token:` line appears with a `wss://` `room_url`.
6. Confirm the character reaches **Connected** state and responds to voice or text input.

If steps 5 or 6 fail with `transport.ice_failed` or `transport.signal_disconnected`, see [Connection and API issues](/api-docs/plugins-and-integrations/convai-unity-sdk/troubleshooting/connection-and-api-issues).

### Troubleshooting

| Symptom                                                      | Likely cause                            | Fix                                                                                                      | Verify                                                                  |
| ------------------------------------------------------------ | --------------------------------------- | -------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| `connection.network_error` or `connection.timeout`           | Convai endpoints blocked on TCP `443`   | Allow <code class="expression">space.vars.live\_server\_url</code> and `api.convai.com`                  | Session reaches `Connected` state                                       |
| `transport.ice_failed` or `transport.peer_connection_failed` | LiveKit UDP or TURN hosts blocked       | Add the LiveKit minimum rules and optional direct media paths from this page                             | `Room details received` log appears; character responds in Play mode    |
| No `Room details received` log line                          | Transport logging below **Debug**       | Open **Diagnostics** in Project Settings; set **Transport** category override to **Debug**               | Readable `Token:` line appears in the Console                           |
| LiveKit connection test fails after connect succeeds         | UDP media or TURN fallback path blocked | Allow UDP `50000`–`60000`, UDP `3478` to `*.host.livekit.cloud`, and TCP `443` to `*.turn.livekit.cloud` | LiveKit connection test succeeds with the logged `Room URL` and `Token` |
| `connection.connect_invalid_api_key`                         | Invalid or revoked API key              | Copy a fresh key from the [Convai dashboard](https://convai.com) into Project Settings                   | Connect error no longer fires                                           |
| WebGL mic unavailable                                        | Build served over HTTP                  | Serve the build over HTTPS or from `localhost`                                                           | Microphone permission prompt appears in the browser                     |

{% hint style="warning" %}
Proxy servers that perform TLS inspection on HTTPS or WSS traffic can break LiveKit signaling. Exclude Convai and LiveKit hostnames from TLS inspection when your environment uses a corporate proxy.
{% endhint %}

### WebGL deployments

WebGL builds must be served over HTTPS or from `localhost`. HTTP deployments block microphone access due to browser security policy. WebGL uses the same Convai and LiveKit endpoints as desktop builds. See [Platform support matrix](/api-docs/plugins-and-integrations/convai-unity-sdk/compatibility-and-requirements/platform-support-matrix) and the [WebGL deployment guide](/api-docs/plugins-and-integrations/convai-unity-sdk/platform-guides/webgl) for browser-specific constraints.

### Next steps

With network requirements confirmed, install the SDK or review connection error codes.

{% content-ref url="/pages/f1aef51364acf8a4bf5802a99774c033d9ee6e68" %}
[Install the Convai Unity SDK](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/installation)
{% endcontent-ref %}

{% content-ref url="/pages/bf2d3c0310bc8496a310e6c0331136dd3cf2399d" %}
[Connection and API issues](/api-docs/plugins-and-integrations/convai-unity-sdk/troubleshooting/connection-and-api-issues)
{% endcontent-ref %}


# Getting started

Step-by-step path from installing the Convai Unity SDK to a validated, working conversational AI character in your scene.

By the end of this section, your project contains a responsive AI character that listens, processes speech through Convai, and responds in real time. Follow the pages in order — each step builds directly on the previous one.

{% hint style="info" %}
**Before you begin:** Confirm your environment meets the requirements on the [Prerequisites](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/prerequisites) page — Unity <code class="expression">space.vars.unity\_min\_version</code>, required packages, and a Convai account with an API key.
{% endhint %}

### Preparation

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Prerequisites</strong><br>Unity version, required packages, and account requirements before installing.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/prerequisites">Prerequisites</a></td></tr><tr><td><strong>Installation</strong><br>Add the Convai Unity SDK to your project via the Package Manager or Asset Store.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/installation">Install the Convai Unity SDK</a></td></tr></tbody></table>

### Scene setup

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Configure API key</strong><br>Connect your project to Convai with your account API key.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/configure-api-key">Configure the API key</a></td></tr><tr><td><strong>Import and run sample scenes</strong><br>Verify the SDK works before building your own scene.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/import-and-run-sample-scenes">Import and run sample scenes</a></td></tr><tr><td><strong>Multi-Character Sample</strong><br>Import a shared-room sample scene with several characters, interaction targeting, and a live transcript.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/features/multi-character-sessions/multi-character-sample">Multi-Character Sample</a></td></tr><tr><td><strong>Scene components reference</strong><br>Learn what ConvaiManager, ConvaiCharacter, and ConvaiPlayer do and how they depend on each other.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/scene-components">Scene components reference</a></td></tr><tr><td><strong>Build a custom scene</strong><br>Build a Convai scene from scratch using the Setup Required Components command.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/build-a-custom-scene">Build a custom scene</a></td></tr><tr><td><strong>Validate your setup</strong><br>Run the scene validator to confirm required components are present before adding features.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/validate-your-setup">Validate your setup</a></td></tr><tr><td><strong>Configure conversation input mode</strong><br>Choose between hands-free and push-to-talk input.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/configure-conversation-input-mode">Configure conversation input mode</a></td></tr><tr><td><strong>Configure character audio</strong><br>Tune NPC voice volume, spatial audio, and mute controls.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/configure-character-audio">Configure character audio</a></td></tr><tr><td><strong>Configure microphone</strong><br>Select the active microphone device and set up platform permissions for Android, iOS, and WebGL.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/configure-microphone">Configure microphone</a></td></tr><tr><td><strong>Add chat UI</strong><br>Display conversation transcripts in your scene.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/add-chat-ui">Add chat UI</a></td></tr><tr><td><strong>Add lip sync</strong><br>Drive character blendshapes in sync with voice audio.</td><td><a href="/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/add-lip-sync">Add lip sync</a></td></tr></tbody></table>

### Next steps

Once you have validated your setup, explore the Features section to add Actions, Emotion, Long-Term Memory, or Vision to your characters.

{% content-ref url="/pages/d5302389270319f4ca9bf82b6b3081d22b81bd8f" %}
[Features](/api-docs/plugins-and-integrations/convai-unity-sdk/features)
{% endcontent-ref %}

Review Core Concepts for a deeper understanding of the session lifecycle and event system before building further.

{% content-ref url="/pages/e324eb9293dfc478fb2c227def03dca5d44cc512" %}
[Core concepts](/api-docs/plugins-and-integrations/convai-unity-sdk/core-concepts)
{% endcontent-ref %}


# Prerequisites

Confirm the Unity version, package dependencies, and Convai account the Convai Unity SDK requires before you begin installation.

Before installing the Convai Unity SDK, confirm that your environment meets the requirements below. Missing any of these causes installation errors or runtime failures that are harder to diagnose after the fact.

### System requirements

| Requirement         | Minimum                                                        |
| ------------------- | -------------------------------------------------------------- |
| Unity version       | <code class="expression">space.vars.unity\_min\_version</code> |
| Scripting backend   | Mono or IL2CPP                                                 |
| Internet connection | Required at editor time and runtime                            |

{% hint style="warning" %}
Unity <code class="expression">space.vars.unity\_min\_version</code> is a hard floor — there is no supported configuration on an earlier release, including older LTS versions such as Unity 2022 or Unity 2023. If your project targets an older release, upgrade the project to Unity 6 before installing the SDK. There is no workaround.
{% endhint %}

### Required Unity packages

The SDK depends on four Unity packages. Both installation methods (Package Manager and Asset Store) install these automatically — you do not need to add them manually unless you encounter a version conflict.

| Package                           | Minimum version                                                           |
| --------------------------------- | ------------------------------------------------------------------------- |
| `com.unity.ai.inference`          | <code class="expression">space.vars.dep\_ai\_inference\_version</code>    |
| `com.unity.nuget.newtonsoft-json` | <code class="expression">space.vars.dep\_newtonsoft\_json\_version</code> |
| `com.unity.ugui`                  | <code class="expression">space.vars.dep\_ugui\_version</code>             |
| `com.unity.inputsystem`           | <code class="expression">space.vars.dep\_inputsystem\_version</code>      |

If your project already pins any of these packages to an older version in `Packages/manifest.json`, the automatic install fails silently or produces a version conflict. Remove or update the existing version pins before installing the SDK.

### Supported render pipelines

| Render Pipeline                        | Supported |
| -------------------------------------- | --------- |
| Built-in Render Pipeline               | ✓         |
| Universal Render Pipeline (URP)        | ✓         |
| High Definition Render Pipeline (HDRP) | ✓         |

For detailed platform and render pipeline compatibility, see [Compatibility & Requirements](/api-docs/plugins-and-integrations/convai-unity-sdk/compatibility-and-requirements).

### Account requirements

You need an active Convai account and an API key to connect your project to Convai during local development.

1. Create an account at [convai.com](https://convai.com) if you do not have one.
2. Retrieve your API key from the **API Keys** section of the Convai dashboard.
3. Create at least one character in the Convai dashboard and note its **Character ID** — you need it during scene setup.

Your API key is stored in `Assets/Resources/ConvaiSettings.asset`. This is the **API Key** authentication mode, intended for local development in the Unity Editor rather than for a build you distribute. See [Configure the API key](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/configure-api-key) for full setup steps.

If your project ships to testers or players, the SDK also supports **Auth Token** mode, which resolves a short-lived credential per connection instead of shipping your account API key in the build. Review the two modes and decide which one your project needs before you reach scene setup.

{% content-ref url="/pages/Qz3amgJ54KyHWFyUqBBJ" %}
[Authentication](/api-docs/plugins-and-integrations/convai-unity-sdk/authentication)
{% endcontent-ref %}

### Next steps

Once your environment meets all requirements above, install the SDK.

{% content-ref url="/pages/f1aef51364acf8a4bf5802a99774c033d9ee6e68" %}
[Install the Convai Unity SDK](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/installation)
{% endcontent-ref %}


# Install the Convai Unity SDK

Install the Convai Unity SDK into a Unity project using Package Manager or Asset Store so the SDK and its dependencies resolve correctly.

The Convai Unity SDK is available through two channels. Use **Package Manager** for new projects or when you prefer not to manage Asset Store downloads — the package resolves directly from the Convai registry with no manual download. Use **Asset Store** if your project already sources packages from your Asset Store library or if your studio manages package versions through My Assets.

Both methods require Unity <code class="expression">space.vars.unity\_min\_version</code> and install SDK version <code class="expression">space.vars.unity\_sdk\_version</code> and the same four required dependencies.

{% tabs %}
{% tab title="Package Manager" %}
{% stepper %}
{% step %}

#### Open Package Manager

In the Unity Editor menu bar, select **Window > Package Manager**.

The Package Manager window opens. Confirm you are connected to the internet before proceeding.
{% endstep %}

{% step %}

#### Add package by name

Click the **+** button in the top-left corner of the Package Manager window. Select **Add package by name** from the dropdown.

A text field appears prompting for the package name.
{% endstep %}

{% step %}

#### Enter the package name

Type or paste the following identifier into the Name field, then click **Add**:

```
com.convai.convai-sdk-for-unity
```

Unity contacts the registry, resolves the package, and begins downloading. Four dependencies install automatically:

| Package                           | Version                                                                   |
| --------------------------------- | ------------------------------------------------------------------------- |
| `com.unity.ai.inference`          | <code class="expression">space.vars.dep\_ai\_inference\_version</code>    |
| `com.unity.nuget.newtonsoft-json` | <code class="expression">space.vars.dep\_newtonsoft\_json\_version</code> |
| `com.unity.ugui`                  | <code class="expression">space.vars.dep\_ugui\_version</code>             |
| `com.unity.inputsystem`           | <code class="expression">space.vars.dep\_inputsystem\_version</code>      |

Wait for the progress bar in the bottom-right of the Unity Editor to complete before continuing.
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
**Dependency conflict:** If your project already pins any of these four packages to an older version in `Packages/manifest.json`, the install will fail or produce a version mismatch. Open `Packages/manifest.json`, remove or update the conflicting version entries, then retry.
{% endhint %}

{% hint style="success" %}
**Installation complete** when the Convai SDK for Unity entry appears in the Package Manager list with a green checkmark and version <code class="expression">space.vars.unity\_sdk\_version</code>. You will also see a new **Convai** menu item in the Unity menu bar.
{% endhint %}
{% endtab %}

{% tab title="Asset Store" %}
{% stepper %}
{% step %}

#### Add the SDK to your Asset Store account

Open the [Unity Asset Store](https://assetstore.unity.com/) in your browser. Search for **Convai SDK for Unity** and open the listing. Click **Add to My Assets**, signing in with your Unity ID if prompted.

The button changes to **Open in Unity** when the asset has been added to your account.
{% endstep %}

{% step %}

#### Open Package Manager

In the Unity Editor menu bar, select **Window > Package Manager**.
{% endstep %}

{% step %}

#### Switch to My Assets

In the Package Manager window, click the packages source dropdown in the top-left (it shows **Packages: In Project** or similar) and select **My Assets**.

Your Asset Store library loads. Locate **Convai SDK for Unity** in the list.
{% endstep %}

{% step %}

#### Download and import

Select **Convai SDK for Unity** in the list. Click **Download**, then click **Import** once the download completes.

Unity imports the package and installs four dependencies automatically:

| Package                           | Version                                                                   |
| --------------------------------- | ------------------------------------------------------------------------- |
| `com.unity.ai.inference`          | <code class="expression">space.vars.dep\_ai\_inference\_version</code>    |
| `com.unity.nuget.newtonsoft-json` | <code class="expression">space.vars.dep\_newtonsoft\_json\_version</code> |
| `com.unity.ugui`                  | <code class="expression">space.vars.dep\_ugui\_version</code>             |
| `com.unity.inputsystem`           | <code class="expression">space.vars.dep\_inputsystem\_version</code>      |

Wait for the progress bar in the bottom-right of the Unity Editor to complete before continuing.
{% endstep %}
{% endstepper %}

To update the SDK to a newer version later, return to **My Assets** in the Package Manager, select the SDK, and click **Update**.

Installation is complete when the Convai SDK for Unity entry appears in the Package Manager list with version <code class="expression">space.vars.unity\_sdk\_version</code>. You will also see a new **Convai** menu item in the Unity menu bar.
{% endtab %}
{% endtabs %}

### Next steps

With the SDK installed, connect your project to Convai by entering your API key.

{% content-ref url="/pages/nLYDmLXfx19u9jY8DiYD" %}
[Configure the API key](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/configure-api-key)
{% endcontent-ref %}


# Configure the API key

Enter and validate your Convai API key for local development in the Unity Editor so a Convai character can authenticate while you build a scene.

The Convai SDK for Unity's **API Key** authentication mode reads an API key tied to your Convai account directly from the project's saved settings. Use this page to enter that key for local development in the Unity Editor — iterating on a scene, running sample scenes, or testing on a machine only you control.

{% hint style="warning" %}
API Key mode is for local development, not for a build you distribute. A player build produced in API Key mode contains your account API key, obfuscated but not encrypted, inside the shipped `ConvaiSettings` asset. Before you build anything you plan to ship, read [Authentication](/api-docs/plugins-and-integrations/convai-unity-sdk/authentication) and switch to Auth Token mode.
{% endhint %}

{% stepper %}
{% step %}

#### Copy your API key

Log in to your [Convai dashboard](https://convai.com), navigate to **Account Settings**, and copy your API key.
{% endstep %}

{% step %}

#### Open the Credentials section

In the Unity Editor menu bar, open **Convai > Settings** (or **Edit > Project Settings > Convai SDK**), then select the **Credentials** section. Leave **Auth Mode** set to **API Key**, its default.
{% endstep %}

{% step %}

#### Paste and validate the API key

Paste your API key into the **API Key** field, then select **Validate & Save**. Convai checks the key and, if it accepts the key, the SDK saves it to the project.

The status badge next to the button reports the result: **Key valid** when Convai accepts the key, or an error message such as **Key invalid** when it does not.
{% endstep %}

{% step %}

#### Verify the key is accepted

Run **GameObject > Convai > Validate Scene Setup**. A missing API key appears as a warning in the validator dialog. If no API key warning appears, your key is configured correctly.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fgit-blob-f8d3457881d188638d6edb0ac6540e24d701b7f0%2Fimage.png?alt=media" alt="Scene validator dialog with no missing-API-key warning"><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

### How the key is used at runtime

The SDK reads the key from `ConvaiSettings` via the `ICredentialProvider` interface before initiating any connection to Convai. You do not need to pass the key manually in code — the SDK resolves it automatically on startup.

`Assets/Resources/ConvaiSettings.asset` stores the key obfuscated (XOR plus Base64), not encrypted — anyone with the SDK source can reverse it. Decide whether to commit this file to source control based on your team's security policy. If the project previously stored the key in plain text, the SDK migrates it to the obfuscated format automatically the first time the Unity Editor loads.

### Move to Auth Token mode before you ship

API Key mode has no equivalent of a server-issued, short-lived credential — the same account key that unlocks your Convai project sits in the build. For any build distributed to testers, players, or end users, switch to Auth Token mode instead, where a build processor strips the account key before the build and a server you control issues short-lived tokens at connect time.

{% content-ref url="/pages/Qz3amgJ54KyHWFyUqBBJ" %}
[Authentication](/api-docs/plugins-and-integrations/convai-unity-sdk/authentication)
{% endcontent-ref %}

{% content-ref url="/pages/31f40f584b5fb6b136f239a3d28d2ec74eb938e7" %}
[Custom credential provider](/api-docs/plugins-and-integrations/convai-unity-sdk/advanced-topics/custom-providers/custom-credential-provider)
{% endcontent-ref %}

### Next steps

With your API key in place, import a sample scene to verify the SDK is working before you build your own scene.

{% content-ref url="/pages/41c4fa4e32b4314bedf2eeac4548c536e758ce3f" %}
[Import and run sample scenes](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/import-and-run-sample-scenes)
{% endcontent-ref %}


# Import and run sample scenes

Import the bundled sample scenes and verify the SDK is installed and connected correctly before building your own scene.

The Convai SDK for Unity ships with three sample scenes. Running one is the fastest way to confirm your installation, API key, and audio setup are working before you build your own scene.

| Sample                     | Description                                                                                                                                         |
| -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Basic Sample**           | Core setup and interaction flow with `Convai_Char_Robot`, a non-humanoid character                                                                  |
| **LipSync Sample**         | High-quality character `Sofia` with real-time lip sync, plus a debug hub for inspecting emotion, dynamic context, and vision state during Play mode |
| **Multi-Character Sample** | A shared-room sample demonstrating multiple Convai characters, interaction targeting, transcript UI, and runtime roster changes                     |

The steps for locating the samples differ depending on how you installed the SDK.

{% tabs %}
{% tab title="Package Manager" %}
{% stepper %}
{% step %}

#### Open Package Manager

In the Unity Editor, open **Window > Package Manager**. In the top-left dropdown, select **In Project**, then select **Convai SDK for Unity** from the list.
{% endstep %}

{% step %}

#### Import a sample

In the detail panel on the right, click the **Samples** tab. Click **Import** next to the sample you want to run.

Unity copies the sample assets into `Assets/Samples/Convai SDK for Unity/<version>/`. A new folder appears under `Assets/Samples/` in the Project window.
{% endstep %}

{% step %}

#### Open the scene

In the Project window, navigate to the imported sample folder and open its `.unity` scene file.
{% endstep %}
{% endstepper %}
{% endtab %}

{% tab title="Asset Store" %}
{% stepper %}
{% step %}

#### Locate the samples

When installed via the Asset Store, all sample scenes are imported into your project automatically. In the Project window, navigate to:

```
Assets/Convai SDK For Unity/Samples/
```

Three folders are present: `BasicSample`, `LipSyncSample`, and `MultiCharacterSample`.
{% endstep %}

{% step %}

#### Open the scene

Open the `.unity` scene file inside the sample folder you want to run.
{% endstep %}
{% endstepper %}
{% endtab %}
{% endtabs %}

Once the scene is open:

{% stepper %}
{% step %}

#### Enter Play Mode

Press **Play**. The Unity Console logs the following lines as the SDK initializes:

* `[ConvaiRuntime] Started successfully` — SDK initialized all internal services
* `[RoomConnectionRuntimeAdapter] Room connection succeeded (mode=create).` — the room connected to Convai

Speak into your microphone. The character responds with voice and text output.

If no response appears and the Console shows warnings, check [Validate your setup](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/validate-your-setup) for a diagnostic checklist.
{% endstep %}
{% endstepper %}

In the LipSync Sample, the **Sample Debug Hub** panel is already in the scene. Click its Emotion, Context, or Vision buttons in the Game view to open a drawer showing live state while the character talks.

### Sample render pipeline notes

Sample scenes are built with the Universal Render Pipeline (URP). If your project uses a different render pipeline, materials may appear pink after import. Convert the materials to match your active render pipeline using **Edit > Rendering > Materials**, then select the appropriate conversion option for your pipeline.

### Next steps

Now that you have confirmed the SDK is working, learn what each scene component does before building your own setup.

{% content-ref url="/pages/0ovsiZNbY51a9fHPtneG" %}
[Scene components reference](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/scene-components)
{% endcontent-ref %}


# Scene components reference

Understand the role of each core Convai scene component — manager, room manager, character, and player — and how they depend on each other.

Every Convai-powered scene is built from four core components. Understanding what each one does and how they relate to each other makes building and debugging your setup straightforward.

### Component overview

The diagram below shows how the components depend on each other at runtime.

```mermaid
graph TD
    A[ConvaiManager] --> B[ConvaiRoomManager]
    A --> C[ConvaiPlayer]
    A --> D[ConvaiCharacter]
    D --> E[ConvaiAudioOutput]
    E --> F[AudioSource]
```

`ConvaiManager` is the root. It bootstraps the SDK, manages the room connection through `ConvaiRoomManager`, and owns references to all `ConvaiCharacter` and `ConvaiPlayer` instances in the scene.

### ConvaiManager

`ConvaiManager` is the SDK's entry point. It must be present in every scene that uses Convai. It initializes all internal services and injects dependencies into the other components automatically.

**Add it:** Use **GameObject > Convai > Setup Required Components** to add `ConvaiManager` and its companion components in one step. Do not add it manually via Add Component — the wizard ensures the correct setup.

**Key behavior:**

* Singleton. Only one `ConvaiManager` may exist per scene.
* Runs at execution order `-1100` — it initializes before all other components.
* Auto-discovers `ConvaiCharacter` and `ConvaiPlayer` instances in the scene on startup.
* Injects dependencies into discovered components automatically when `_autoInject` is enabled (default: on).

**Useful properties at runtime:**

| Property                      | Type                             | Description                            |
| ----------------------------- | -------------------------------- | -------------------------------------- |
| `IsBootstrapped`              | `bool`                           | SDK internal services are initialized  |
| `IsInitialized`               | `bool`                           | Bootstrap complete and event hub ready |
| `IsConnected`                 | `bool`                           | Room connection is active              |
| `Characters`                  | `IReadOnlyList<ConvaiCharacter>` | All characters owned by this manager   |
| `Player`                      | `ConvaiPlayer`                   | The player component in this scene     |
| `ActiveConversationCharacter` | `ConvaiCharacter`                | Currently active conversation target   |

### ConvaiRoomManager

`ConvaiRoomManager` manages the connection lifecycle between your scene and Convai. It handles connecting, disconnecting, and reconnecting the audio session. It lives on the same GameObject as `ConvaiManager`.

**Key behavior:**

* Auto-connects on `Start()` when `ConnectOnStart` is `true` (default: `true`).
* Reconnects automatically on transient failures, up to `_maxReconnectAttempts` (default: `3`).
* Manages the microphone — starts capturing audio `_autoMicStartDelaySeconds` (default: `0.5s`) after the connection is established.

**Inspector fields:**

| Field                       | Default     | Description                                                      |
| --------------------------- | ----------- | ---------------------------------------------------------------- |
| `ConnectOnStart`            | `true`      | Connect to Convai automatically when the scene starts            |
| `_connectionType`           | `Audio`     | `Audio` for voice-only; `Video` to also send camera frames       |
| `_pushToTalkKey`            | `KeyCode.T` | Keyboard key used for push-to-talk input mode                    |
| `_maxReconnectAttempts`     | `3`         | Attempts before giving up on reconnection                        |
| `_autoMicStartDelaySeconds` | `0.5`       | Seconds to wait after connection before opening the microphone   |
| `_roomRejoinTtlSeconds`     | `60`        | Seconds after disconnect during which the session can be resumed |

Turn-taking settings are also configured here. See [Configure conversation input mode](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/configure-conversation-input-mode).

### ConvaiCharacter

`ConvaiCharacter` represents one AI character in your scene. Each NPC or virtual instructor that talks to players needs its own `ConvaiCharacter` component. Multiple characters are fully supported: a scene with two or more registered characters connects as one shared multi-character session, and a scene with exactly one connects as a single-character session. See [Multi-character sessions](/api-docs/plugins-and-integrations/convai-unity-sdk/features/multi-character-sessions) for how the room is built and how player input is routed to one character at a time.

**The Character ID field is required.** Get this value from your character's profile on the [Convai dashboard](https://convai.com).

**Inspector fields:**

| Field                           | Default   | Description                                                     |
| ------------------------------- | --------- | --------------------------------------------------------------- |
| `_characterId`                  | *(empty)* | **Required.** Unique ID from your Convai dashboard              |
| `_characterName`                | *(empty)* | Display name shown in transcripts and logs                      |
| `_nameTagColor`                 | White     | Color used to identify this character in the transcript UI      |
| `_autoConnect`                  | `false`   | Start a conversation immediately after the scene loads          |
| `_enableRemoteAudio`            | `true`    | Play back the character's voice audio                           |
| `_enableSessionResume`          | `false`   | Resume the previous session on reconnect                        |
| `_characterReadyTimeoutSeconds` | `30`      | Seconds to wait for the character-ready signal (0 = no timeout) |

**Useful properties at runtime:**

| Property             | Type           | Description                                                   |
| -------------------- | -------------- | ------------------------------------------------------------- |
| `IsCharacterReady`   | `bool`         | Character has received the ready signal from Convai           |
| `IsSessionConnected` | `bool`         | Connected to the room (ready signal may not have arrived yet) |
| `IsInConversation`   | `bool`         | Connected and ready — true conversation state                 |
| `IsSpeaking`         | `bool`         | Character is currently outputting audio                       |
| `SessionState`       | `SessionState` | Full connection state enum                                    |

**Component dependencies:** `ConvaiAudioOutput` (handles audio playback for this character) must be on the same GameObject. `ConvaiAudioOutput` requires an `AudioSource` on the same GameObject.

### ConvaiPlayer

`ConvaiPlayer` identifies the user in the conversation. It provides the player's display name and color to the transcript UI and lets Convai attribute player speech to the correct participant.

**One `ConvaiPlayer` per scene.** Multiple player components in the same scene are not supported.

**Inspector fields:**

| Field           | Default    | Description                                                     |
| --------------- | ---------- | --------------------------------------------------------------- |
| `_playerName`   | `"Player"` | Display name shown in the transcript UI                         |
| `_playerId`     | *(empty)*  | Local ID for transcript attribution (empty = use `_playerName`) |
| `_nameTagColor` | Green      | Color used to identify the player in the transcript UI          |

{% hint style="info" %}
`PlayerId` is a local display identifier for the transcript UI only. It is not the server-generated speaker ID used for Long-Term Memory. The server-assigned speaker ID is resolved after connection and is not set manually.
{% endhint %}

**Useful methods:**

```csharp
// Override display name at runtime (for example, after a player logs in)
GetComponent<ConvaiPlayer>().SetRuntimeDisplayName("Dr. Reyes");

// Set both name and ID together
GetComponent<ConvaiPlayer>().Configure("Dr. Reyes", "user-123");
```

### Optional components

#### ConvaiAudioOutput

Handles audio playback for a single character. Add it to the same GameObject as `ConvaiCharacter`. Requires an `AudioSource` on the same GameObject.

| Field          | Default | Description                        |
| -------------- | ------- | ---------------------------------- |
| `Volume`       | `1.0`   | Playback volume (0–1)              |
| `IsMuted`      | `false` | Mute this character's audio output |
| `_use3DAudio`  | `true`  | Enable spatial (3D) audio          |
| `_minDistance` | `1`     | Spatial audio minimum distance     |
| `_maxDistance` | `50`    | Spatial audio maximum distance     |

#### ConvaiSceneConfig

An optional ScriptableObject (**Assets > Create > Convai > Scene Config**) that lets you define character IDs, prefabs, and auto-connect behavior in a reusable asset rather than inline in the Inspector. Useful for managing multiple characters across scenes. See Advanced Topics for full details.

### Embodiment infrastructure Convai adds automatically

Five additional components can appear on a character's GameObject without you adding them. Convai adds each one the first time an embodiment module — Gaze, Body Animation, Body Language, or Emotion — needs it on that character, typically the first time you enter Play Mode after adding one of those modules. Seeing them appear is expected; nothing is broken.

| Component                        | Added when                                          | What it does                                                                                                                                                    |
| -------------------------------- | --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `EmbodimentContext`              | Any embodiment module resolves its character        | Character-scoped composition root that embodiment modules use to find the character's rig and each other's shared data                                          |
| `StandardRigBinding`             | A module needs the character's bones or face meshes | Detects the rig convention (`ARKit`, `ReallusionCC3`, `ReallusionCC4Extended`, `MetaHuman`, or `Custom`) and resolves bones and blendshapes for modules to read |
| `AnimatorConductor`              | A module needs to drive `Animator` parameters       | Single writer for `Animator` parameters, so two modules can never overwrite the same parameter                                                                  |
| `EmbodimentTickScheduler`        | Any embodiment module registers a per-frame update  | Runs embodiment modules in a fixed cognition → expression → finalize order every frame                                                                          |
| `FacialBlendshapeCompositorHost` | A module needs to write facial blendshapes          | Single writer for facial blendshape output, combining LipSync, Emotion, and other sources into one result each frame                                            |

{% hint style="info" %}
None of these components appear in the **Add Component** menu. `StandardRigBinding` is the only one you can add yourself — from **Add Component > Convai > Embodiment > Character Rig** — if you want to configure rig detection before Play Mode. The other four are internal to the SDK and are never added by hand.
{% endhint %}

### Next steps

Now that you understand the components, build your own scene from scratch.

{% content-ref url="/pages/KM3jUMFCMu4M0nS1MSJH" %}
[Build a custom scene](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/build-a-custom-scene)
{% endcontent-ref %}


# Build a custom scene

Add required Convai components to a new Unity scene using the Setup Required Components command and configure your first character.

A new Unity scene needs three Convai components wired together before a character can hear a player and respond: a manager, a character, and a player. Build that hierarchy in an empty scene using the **Setup Required Components** command, then add and configure the character itself.

### Minimum required hierarchy

Every working Convai scene needs these three things:

```
[Manager GameObject]  → ConvaiManager + ConvaiRoomManager
[NPC GameObject]      → ConvaiCharacter + ConvaiAudioOutput + AudioSource
[Player GameObject]   → ConvaiPlayer
```

The setup wizard creates the first and third automatically. You add the NPC components yourself.

{% stepper %}
{% step %}

#### Add the required manager components

In the Unity Editor menu bar, select **GameObject > Convai > Setup Required Components**.

Unity creates a **ConvaiManager** GameObject with `ConvaiManager` and `ConvaiRoomManager` attached, and a **ConvaiPlayer** GameObject with `ConvaiPlayer` attached. Both appear in the Hierarchy.

`ConvaiRoomManager` always lives on the same GameObject as `ConvaiManager`. Do not move it to a separate GameObject.
{% endstep %}

{% step %}

#### Add ConvaiCharacter to your NPC

In the Hierarchy, select the NPC GameObject you want to make conversational. In the Inspector, click **Add Component** and add `ConvaiCharacter`.
{% endstep %}

{% step %}

#### Add AudioSource and ConvaiAudioOutput

On the same NPC GameObject, add `AudioSource`, then add `ConvaiAudioOutput`.

All three components — `ConvaiCharacter`, `ConvaiAudioOutput`, and `AudioSource` — should now appear on the same GameObject in the Inspector.
{% endstep %}

{% step %}

#### Set the Character ID

In the `ConvaiCharacter` component, set the **Character ID** field to the ID of your character from the [Convai dashboard](https://convai.com).

{% hint style="warning" %}
The Character ID field is required. If it is empty, the character cannot connect to Convai and the Scene Validator will report an error.
{% endhint %}
{% endstep %}

{% step %}

#### Validate the scene

In the menu bar, select **GameObject > Convai > Validate Scene Setup**.

A dialog appears listing errors, warnings, and recommended next steps.

**Errors (must fix):**

| Error                                 | Fix                                          |
| ------------------------------------- | -------------------------------------------- |
| No `ConvaiManager` found              | Run **Setup Required Components**            |
| No `ConvaiCharacter` found            | Add `ConvaiCharacter` to your NPC GameObject |
| `ConvaiCharacter` has no Character ID | Set the Character ID from your dashboard     |
| No `ConvaiPlayer` found               | Run **Setup Required Components**            |

**Warnings:**

| Warning                | Fix                                                         |
| ---------------------- | ----------------------------------------------------------- |
| API key not configured | Open **Convai > Settings > Credentials** and enter your key |

When the validator reports no errors, the scene is ready for Play Mode.
{% endstep %}

{% step %}

#### Enter Play Mode

Press **Play**. The Unity Console logs:

* `[ConvaiRuntime] Started successfully` — SDK initialized
* `[RoomConnectionRuntimeAdapter] Room connection succeeded (mode=create).` — the room connected to Convai

Speak into your microphone. The character responds within a few seconds.

If you later add a Gaze, Body Animation, Body Language, or Emotion module component to the NPC, Convai adds supporting infrastructure components to the same GameObject automatically. See [Scene components reference](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/scene-components) for what each one does.
{% endstep %}
{% endstepper %}

### Editing settings that ship with the SDK

Some optional modules point a character at a default settings asset that ships inside the Convai package. The first time you change a field on one of these assets from a character's Inspector, Convai copies the asset into your project, points the character at the copy, and applies your edit there — the packaged original is never edited in place.

The copy is created next to the character's prefab when it has one, or under `Assets/Convai/<module>` otherwise. You do not create this copy yourself; changing a field is enough, and the Inspector reports where the copy was written.

### Usage examples

#### Example 1: Safety training simulation

**Scenario:** An industrial safety trainer NPC responds to trainee questions about equipment procedures.

**Setup:**

* NPC GameObject: `SafetyTrainer` with `ConvaiCharacter`, `ConvaiAudioOutput`, `AudioSource`
* Character ID: ID of your safety trainer character from the Convai dashboard
* `ConvaiCharacter._characterName`: `"Safety Trainer"`
* `ConvaiCharacter._enableRemoteAudio`: `true`

**Expected outcome:** Trainees speak to the NPC and receive voice responses about safety procedures. The character name appears in the transcript UI.

#### Example 2: Multiple characters in one scene

**Scenario:** A medical training simulation with two characters — a supervising doctor and a nurse.

**Setup:**

* Two separate NPC GameObjects, each with `ConvaiCharacter`, `ConvaiAudioOutput`, `AudioSource`
* Each `ConvaiCharacter` has its own unique Character ID
* Only one `ConvaiManager` and one `ConvaiPlayer` in the scene

**Expected outcome:** Both characters are discovered and registered automatically. There is no component to add and no field to fill: `ConvaiManager` keeps the conversation pointed at whichever character the player is addressing, and moves it there as the player's attention shifts. See [Conversation targeting](/api-docs/plugins-and-integrations/convai-unity-sdk/features/conversation-targeting) for the rule that decides who is being addressed and the settings that tune it.

Character A and Character B do not share conversation context unless your Convai character configuration explicitly links them.

### Next steps

With the scene built, run the validator to confirm everything is wired correctly before adding features.

{% content-ref url="/pages/35a808a76b0d30cee351c5b850b110058a2eb840" %}
[Validate your setup](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/validate-your-setup)
{% endcontent-ref %}


# Validate your setup

Check a Convai character with the Troubleshooter window and confirm required components are present before entering Play Mode.

Before entering Play Mode, check your character with the Convai Troubleshooter and the scene-wide validator. The two answer different questions: the Troubleshooter reports what would stop a module from working on the selected character, while the validator confirms the basic scene wiring — `ConvaiManager`, `ConvaiCharacter`, `ConvaiPlayer`, and the Character ID field — is in place. Run both.

### Check a character with the Troubleshooter

Open **Convai > Troubleshooter**. The window arrives with your currently selected character loaded, or lists every `ConvaiCharacter` in the scene when you switch to **This Scene** mode.

For the selected character, the Troubleshooter reports findings one row per module. Each finding shows a severity and, when there is something to do about it, a fix button, a **Show Me** button that selects the object it is about, or an **Open** button that opens the relevant editor window. Use **Re-check** after making a change, or **Fix Everything That Can Be Fixed** to apply every one-click fix at once.

Not every row offers the same help. Actions rows come with fixes you can apply from the window. Rows for the embodiment modules — Gaze, Body Animation, Body Language, Emotion, and the embodiment setup itself — report what they find but carry no fix or locate button, so act on those in each module's own editor window. A row appears only when the module has something to say about the character, so a character without a module contributes no row for it.

Actions applies to every `ConvaiCharacter`, so even a freshly wired character with no other modules shows an Actions row. On a character with no actions configured yet, that row is informational: it tells you the character will talk but not act, not that something is broken.

The Troubleshooter checks module setup, not the raw scene wiring. Missing `ConvaiManager` or an empty Character ID are caught by the scene validator below.

### Run the scene validator

The Scene Validator inspects your scene for missing components, empty required fields, and common misconfigurations. Run it at any point during development, not only at the end.

In the Unity Editor menu bar, select **GameObject > Convai > Validate Scene Setup**.

A dialog appears with a list of **Errors** (must fix), **Warnings** (recommended), and **Next Steps** (suggested actions).

### Validator checks

#### Errors — must fix

These prevent the scene from connecting to Convai.

| Error                                         | Cause                                                                                                                                                                                                                  | Fix                                                              |
| --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- |
| No `ConvaiManager` found in scene             | SDK is not initialized                                                                                                                                                                                                 | Run **GameObject > Convai > Setup Required Components**          |
| No `ConvaiRoomManager` found in scene         | Room connection component missing                                                                                                                                                                                      | Run **GameObject > Convai > Setup Required Components**          |
| TextMesh Pro Essential Resources not imported | Convai's UI prefabs and fonts reference TextMesh Pro's runtime shader and default font, which Unity imports per project rather than shipping in the package. A scene containing Convai UI throws on open without them. | Select **Window > TextMeshPro > Import TMP Essential Resources** |
| No `ConvaiCharacter` found in scene           | No characters registered                                                                                                                                                                                               | Add `ConvaiCharacter` to your NPC GameObject                     |
| `ConvaiCharacter` has no Character ID         | Required field is empty                                                                                                                                                                                                | Enter the Character ID from your Convai dashboard                |
| No `ConvaiPlayer` found in scene              | Player component missing                                                                                                                                                                                               | Run **GameObject > Convai > Setup Required Components**          |

#### Warnings — recommended

These do not block connection but may affect functionality.

| Warning                                      | Cause                                                                                                                                                                           | Fix                                                                            |
| -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| API key not configured                       | `ConvaiSettings.HasApiKey` returns false                                                                                                                                        | Open **Convai > Settings > Credentials** and enter your API key                |
| Video mode active but no vision source found | The room's `ConvaiRoomManager` hierarchy has no `IVisionPublisher` component, no `IVisionFrameSource` component, or both, while the room's effective connection type is `Video` | Add a vision publisher and a frame source component, or switch to `Audio` mode |

The validator derives **API key not configured** from `ConvaiSettings.HasApiKey` alone; it does not check `ConvaiSettings.HasValidAuthConfig`, which accounts for the project's `AuthMode`. A project running in Auth Token mode is not required to have an API key, so this warning can appear even when authentication is correctly configured. If your project uses Auth Token mode, treat this warning as expected and verify your setup on the [Authentication](/api-docs/plugins-and-integrations/convai-unity-sdk/authentication) pages instead of adding an API key.

{% hint style="success" %}
When the validator shows zero errors and zero warnings, your scene is ready for Play Mode.
{% endhint %}

### Play mode startup checklist

After the validator passes, enter Play Mode and watch the Console for these log lines in order.

* [ ] `[ConvaiRuntime] Started successfully` — SDK initialized all internal services
* [ ] `[RoomConnectionRuntimeAdapter] Room connection succeeded (mode=create).` — the room connected
* [ ] If a chat transcript UI is present, it starts showing messages once the conversation starts — it logs nothing on a successful connection, so watch the UI itself rather than the Console
* [ ] Character `IsCharacterReady` becomes `true` within 30 seconds — Convai has acknowledged the character

{% hint style="info" %}
The character-ready signal may arrive 2–10 seconds after the room connects, depending on server load. If it does not arrive within `_characterReadyTimeoutSeconds` (default: 30s), the SDK logs a timeout warning.
{% endhint %}

To check `IsCharacterReady` at runtime:

```csharp
void Start()
{
    var character = FindFirstObjectByType<ConvaiCharacter>();
    character.OnCharacterReady += () => Debug.Log("Character is ready to converse.");
}
```

### Troubleshooting

| Symptom                                               | Likely cause                                                      | Fix                                                                                                                                                                                               |
| ----------------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `[ConvaiRuntime] Started successfully` not in Console | `ConvaiManager` missing or failed to bootstrap                    | Check that `ConvaiManager` is in the scene. Look for earlier errors in the Console.                                                                                                               |
| Room never connects — no character-connected log      | API key invalid or missing; network issue                         | Verify your API key in **Convai > Settings > Credentials**. Check firewall rules allow WebSocket/HTTPS to `live.convai.com`.                                                                      |
| Chat transcript UI shows no messages                  | Required UI references are not assigned on `ChatTranscriptUI`     | Check the Console for `chatContainer is not assigned - messages will not display` or `scrollRect is not assigned - auto-scroll will not work`, and assign the missing reference in the Inspector. |
| Character `IsCharacterReady` stays `false`            | Character ID is wrong or character does not exist on your account | Verify the Character ID matches exactly what is shown on your Convai dashboard.                                                                                                                   |
| Mic never opens — character hears nothing             | Push-to-talk mode is on and mic starts muted                      | In `ConvaiRoomManager`, confirm **Mode** is `HandsFree`, or press **T** if using push-to-talk.                                                                                                    |
| Character voice plays but blendshapes do not animate  | `ConvaiLipSyncComponent` not configured or profile ID mismatch    | Add `ConvaiLipSyncComponent` to the character. Verify `_lockedProfileId` matches your character's transport format. Assign target `SkinnedMeshRenderer`(s).                                       |
| Materials appear pink in sample scenes                | Render pipeline mismatch (Built-in vs URP)                        | Convert materials via **Edit > Rendering > Materials > Convert All Built-in Materials to URP**, or reassign URP shaders manually.                                                                 |

### Setup complete

Your scene now has:

* The SDK installed and connected to Convai with a valid API key
* A scene with `ConvaiManager`, `ConvaiRoomManager`, `ConvaiCharacter`, and `ConvaiPlayer`
* The scene validator and the Troubleshooter both reporting zero errors
* A character that connects, becomes ready, and responds to voice input

### Next steps

Continue the getting started path to configure input mode, audio, and UI.

{% content-ref url="/pages/2532db82ab7e792207320a0655ef32ccfd5f99e4" %}
[Configure conversation input mode](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/configure-conversation-input-mode)
{% endcontent-ref %}

Or explore the Features section to add Actions, Emotion, Long-Term Memory, or Vision to your characters.

{% content-ref url="/pages/d5302389270319f4ca9bf82b6b3081d22b81bd8f" %}
[Features](/api-docs/plugins-and-integrations/convai-unity-sdk/features)
{% endcontent-ref %}

Review Core Concepts for a deeper understanding of the session lifecycle and event system.

{% content-ref url="/pages/e324eb9293dfc478fb2c227def03dca5d44cc512" %}
[Core concepts](/api-docs/plugins-and-integrations/convai-unity-sdk/core-concepts)
{% endcontent-ref %}


# Configure conversation input mode

Choose between hands-free voice activation and push-to-talk, configure the trigger key or controller button, and switch between the two modes at runtime.

The Convai SDK for Unity supports two conversation input modes: **Hands Free** (the player speaks naturally, the SDK detects when they stop) and **Push to Talk** (the player holds a key to speak). Both modes are configured on `ConvaiRoomManager` in the Inspector.

### Where to find the settings

Select the `ConvaiManager` GameObject in the Hierarchy. In the Inspector, find `ConvaiRoomManager`. The **Turn-Taking Options** section contains all input mode settings.

<figure><img src="https://413558230-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEtUJA212Zc1S9ACc8T4l%2Fuploads%2Fgit-blob-61999a4cb219e6882cf3f3a22c14e788cf2426e4%2Fimage.png?alt=media" alt="ConvaiRoomManager Inspector with the Turn-Taking Options section expanded, showing the Mode dropdown for Hands Free and Push to Talk"><figcaption></figcaption></figure>

### Input mode comparison

|                   | Hands Free                                  | Push to Talk                                     |
| ----------------- | ------------------------------------------- | ------------------------------------------------ |
| **How it works**  | SDK detects end-of-speech automatically     | Player holds a key to speak, releases to send    |
| **Best for**      | Natural conversation, kiosk experiences, VR | Noisy environments, multiplayer, precise control |
| **Latency**       | Slightly higher (silence detection delay)   | Lower (send on key release)                      |
| **Player effort** | None                                        | Must hold a key                                  |

### Hands free mode

Hands Free is the default. Set **Mode** to `HandsFree`.

#### Turn detection

Control how the SDK decides the player has finished speaking.

| Setting         | Default      | Description                                                                              |
| --------------- | ------------ | ---------------------------------------------------------------------------------------- |
| `TurnDetection` | `UseDefault` | `UseDefault` = server default, `Disabled` = always-on stream, `Custom` = configure below |

When `TurnDetection` is set to `Custom`, the **Smart Turn Settings** appear:

| Setting           | Default | Description                                          |
| ----------------- | ------- | ---------------------------------------------------- |
| `StopSecs`        | `3.0`   | Seconds of silence before the turn ends              |
| `MaxDurationSecs` | `8.0`   | Maximum turn length before forced end                |
| `PreSpeechMs`     | `0`     | Milliseconds of audio before speech onset to include |

{% hint style="info" %}
Increasing `StopSecs` gives players more time to pause mid-sentence without triggering a turn end. Useful for training simulations where learners think before answering.
{% endhint %}

### Push to talk mode

Set **Mode** to `PushToTalk`. The default key is **T** — change it via `_pushToTalkKey` on `ConvaiRoomManager`.

On Meta Quest, push-to-talk reads the A, B, X, and Y buttons through Unity's XR input API instead of a keyboard key. If the active XR controller cannot be read, or disconnects mid-press, the SDK fails closed and stops microphone capture rather than leaving it open. Keyboard and non-XR joystick behavior is unchanged.

#### Local audio policy

Controls microphone behavior on the player's device.

| Setting                          | Default        | Description                                                                                                   |
| -------------------------------- | -------------- | ------------------------------------------------------------------------------------------------------------- |
| `StartMutedInPushToTalk`         | `true`         | Microphone starts muted; activates on key press                                                               |
| `EnableAcousticEchoCancellation` | `false`        | Enable AEC for speakerphone use (Android/iOS)                                                                 |
| `PushToTalkStartupMode`          | `PrewarmMuted` | `PrewarmMuted` = mic open but muted from start; `OpenOnFirstPress` = mic opens only when key is first pressed |

#### Push to talk policy

Controls what happens when the player presses and releases the push-to-talk key.

| Setting                                      | Default | Description                                                                                                                                                                   |
| -------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `InterruptBotOnPress`                        | `true`  | Pressing the key while the character is speaking interrupts it immediately                                                                                                    |
| `EnableServerSttToggle`                      | `true`  | Pauses Convai's speech-to-text on the server while the player is not holding the key. Reduces server processing cost; disable if you observe recognition delays on key press. |
| `RequireTurnCompletionBeforeNextPress`       | `true`  | Player must wait for the character to finish before speaking again                                                                                                            |
| `TurnCompletionTimeoutMs`                    | `5000`  | Fallback timeout (ms) to unlock push-to-talk if the completion event never arrives                                                                                            |
| `AllowSpeechStoppedFallbackAfterSpeechStart` | `false` | Allow a speech-stopped event to clear the waiting state after speech has started                                                                                              |

### Runtime mode switching

`SetConversationInputModeAsync()` switches the active input mode for the current connected session — **no reconnection required**. The switch takes effect immediately on the live session and does not mutate configured defaults or room profile assets.

```csharp
using System.Threading;
using Convai.Runtime.Components;
using Convai.Runtime.Room;
using UnityEngine;

public sealed class InputModeSwitcher : MonoBehaviour
{
    // Switch to Hands Free — call from a UI button or game event
    public async void SwitchToHandsFree()
    {
        await ConvaiManager.ActiveManager
            .SetConversationInputModeAsync(ConversationInputMode.HandsFree, CancellationToken.None)
            .AsTask();
    }

    // Switch to Push to Talk — call from a UI button or game event
    public async void SwitchToPushToTalk()
    {
        await ConvaiManager.ActiveManager
            .SetConversationInputModeAsync(ConversationInputMode.PushToTalk, CancellationToken.None)
            .AsTask();
    }
}
```

To read the current active mode or react to changes:

```csharp
using Convai.Runtime.Room;

// Read current mode
ConversationInputMode current =
    ConvaiManager.ActiveManager.ActiveConversationInputMode;

// Subscribe to changes via the room connection service
if (ConvaiManager.ActiveManager.TryGetRoomConnectionService(out IConvaiRoomConnectionService roomService))
    roomService.ConversationInputModeChanged += OnModeChanged;

void OnModeChanged(ConversationInputMode newMode)
{
    // Update UI, analytics, tutorial prompts, etc.
}
```

{% hint style="warning" %}
`SetConversationInputModeAsync()` is valid only while the room is actively **Connected**. Calls made while the room is `Disconnected`, `Connecting`, `Reconnecting`, or `Disconnecting` fail with `SessionErrorCodes.SessionInvalidState`. Check `ConvaiManager.IsConnected` before calling.
{% endhint %}

Connect-time `TurnTakingOptions` define the session's baseline policy (custom turn detection thresholds, push-to-talk startup behavior, AEC preference). Runtime switching changes only the active mode — all other options carry over from the connected session's configuration.

### Usage examples

#### Example 1: Medical training — hands free with extended silence

**Scenario:** Nursing students answer scenario questions. They often pause while thinking, so the default 3-second silence threshold causes premature turn ends.

**Setup in Inspector:**

* Mode: `HandsFree`
* TurnDetection: `Custom`
* StopSecs: `5.0`
* MaxDurationSecs: `30.0`

**Expected outcome:** Students can pause for up to 5 seconds mid-answer without the turn ending. The character waits until the student finishes.

#### Example 2: Industrial site inspection — push to talk

**Scenario:** Workers in a noisy manufacturing environment use push-to-talk to avoid accidental voice activation. They press **T** to ask questions about equipment status.

**Setup in Inspector:**

* Mode: `PushToTalk`
* `_pushToTalkKey` on ConvaiRoomManager: `KeyCode.T`
* `InterruptBotOnPress`: `true` (workers can cut off a long response to ask a follow-up)
* `EnableAcousticEchoCancellation`: `true` (machine noise present)

**Expected outcome:** Only intentional key presses send audio to Convai. Background noise does not trigger responses. Workers can interrupt long answers with a new press.

#### Example 3: Cinematic to gameplay mode switch

**Scenario:** An onboarding cinematic uses Hands Free. When gameplay starts, the game switches to Push to Talk without reloading the scene.

```csharp
public async void OnCinematicEnd()
{
    if (ConvaiManager.ActiveManager.IsConnected)
    {
        await ConvaiManager.ActiveManager
            .SetConversationInputModeAsync(ConversationInputMode.PushToTalk, CancellationToken.None)
            .AsTask();
    }
}
```

**Expected outcome:** Mode switches seamlessly mid-session. The character continues without interruption. Push-to-talk controls become active immediately.

### Next steps

With input mode configured, tune character voice volume and audio playback settings.

{% content-ref url="/pages/MGgUuRj5tRGxy8aDaXHd" %}
[Configure character audio](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/configure-character-audio)
{% endcontent-ref %}


# Configure character audio

Configure per-character and project-wide voice volume, spatial audio, and audio feedback, and control playback in script with mute and unmute calls.

The `ConvaiAudioOutput` component controls how a character's voice plays back in the scene, while `ConvaiSettings` sets the project-wide default volume and audio feedback behavior. Pair either with the `ConvaiAudio` facade on `ConvaiManager` for scripted runtime control of mute state, per-character volume, and audio events.

### Character audio output

Add `ConvaiAudioOutput` to the same GameObject as `ConvaiCharacter`. An `AudioSource` on the same GameObject is required.

**Inspector fields:**

| Field          | Default | Description                               |
| -------------- | ------- | ----------------------------------------- |
| `Volume`       | `1.0`   | Playback volume (0–1)                     |
| `IsMuted`      | `false` | Mute this character's audio output        |
| `_use3DAudio`  | `true`  | Enable Unity spatial audio                |
| `_minDistance` | `1`     | Distance at which audio is at full volume |
| `_maxDistance` | `50`    | Distance at which audio falls to zero     |

Disable `_use3DAudio` for non-positional scenarios — for example, a kiosk interface where the character always sounds "present" regardless of where the player stands.

### Project-wide audio defaults

`ConvaiSettings` exposes two project-wide defaults that apply until a script overrides them.

| Field                  | Default | Description                                                        |
| ---------------------- | ------- | ------------------------------------------------------------------ |
| `CharacterAudioVolume` | `1`     | Default master volume for character audio (`0`–`1`)                |
| `AudioFeedbackEnabled` | `true`  | Plays feedback sounds, such as the listening indicator, by default |

Configure both fields in the Convai Editor window's **Runtime Defaults** section (**Convai > Settings > Runtime Defaults**), or the equivalent **Edit > Project Settings > Convai SDK > Runtime Defaults** page — both surface the same fields.

These defaults seed `RuntimePreferences` when `ConvaiManager` builds its runtime. Read or change the effective value while a session is running through `ConvaiManager.ActiveManager.ConvaiRuntime.RuntimePreferences`:

```csharp
// Read the current project-wide defaults
float volume = ConvaiManager.ActiveManager.ConvaiRuntime.RuntimePreferences.CharacterAudioVolume;
bool audioFeedbackOn = ConvaiManager.ActiveManager.ConvaiRuntime.RuntimePreferences.AudioFeedbackEnabled;

// Override at runtime — CharacterAudioVolume clamps to the 0-1 range
ConvaiManager.ActiveManager.ConvaiRuntime.RuntimePreferences.CharacterAudioVolume = 0.5f;
ConvaiManager.ActiveManager.ConvaiRuntime.RuntimePreferences.AudioFeedbackEnabled = false;
```

{% hint style="warning" %}
`CharacterAudioVolume` does not change `ConvaiAudioOutput.Volume` on existing characters automatically. Read `RuntimePreferences.CharacterAudioVolume` in your own volume-control script and apply it to `ConvaiAudioOutput` or an audio mixer.
{% endhint %}

### Audio facade

For scripted audio control, use the `ConvaiAudio` facade accessed through `ConvaiManager.Audio`. This is the recommended API for runtime audio management.

#### Microphone control

```csharp
// Mute/unmute the local microphone
ConvaiManager.ActiveManager.Audio.SetMicMuted(true);

// Toggle and get the new state
bool isMuted = ConvaiManager.ActiveManager.Audio.ToggleMicMuted();

// Start microphone capture manually (if ConnectOnStart is false)
await ConvaiManager.ActiveManager.Audio.StartListeningAsync();
```

#### Per-character playback control

```csharp
string characterId = character.CharacterId;

// Mute a specific character
ConvaiManager.ActiveManager.Audio.MuteCharacter(characterId);

// Unmute
ConvaiManager.ActiveManager.Audio.UnmuteCharacter(characterId);

// Check mute state
bool muted = ConvaiManager.ActiveManager.Audio.IsCharacterMuted(characterId);

// Disable remote audio entirely for a character
ConvaiManager.ActiveManager.Audio.SetRemoteAudioEnabled(characterId, false);
```

#### Audio events

```csharp
void OnEnable()
{
    ConvaiManager.ActiveManager.Audio.OnMicMuteChanged += HandleMicMuteChanged;
}

void OnDisable()
{
    ConvaiManager.ActiveManager.Audio.OnMicMuteChanged -= HandleMicMuteChanged;
}

void HandleMicMuteChanged(bool isMuted)
{
    muteButton.SetIsOnWithoutNotify(isMuted);
}
```

### Usage examples

#### Example 1: Mute toggle UI button

**Scenario:** A corporate onboarding simulation includes a mic mute button in the corner of the screen.

```csharp
public class MuteButtonController : MonoBehaviour
{
    [SerializeField] private Toggle _muteToggle;

    void OnEnable()
    {
        _muteToggle.onValueChanged.AddListener(OnMuteToggled);
        ConvaiManager.ActiveManager.Audio.OnMicMuteChanged += OnMicMuteChanged;
    }

    void OnDisable()
    {
        _muteToggle.onValueChanged.RemoveListener(OnMuteToggled);
        ConvaiManager.ActiveManager.Audio.OnMicMuteChanged -= OnMicMuteChanged;
    }

    void OnMuteToggled(bool muted) =>
        ConvaiManager.ActiveManager.Audio.SetMicMuted(muted);

    void OnMicMuteChanged(bool muted) =>
        _muteToggle.SetIsOnWithoutNotify(muted);
}
```

**Expected outcome:** The toggle stays in sync with the actual microphone state. Pressing it mutes or unmutes the mic. External changes (for example, from push-to-talk logic) also update the toggle automatically.

#### Example 2: Per-character volume in a multi-instructor scene

**Scenario:** A language learning simulation has two AI instructors — a main teacher and a conversation partner. Players can independently adjust their volumes.

```csharp
public class CharacterVolumeController : MonoBehaviour
{
    [SerializeField] private ConvaiCharacter _character;
    [SerializeField] private Slider _volumeSlider;

    void Start()
    {
        var audioOutput = _character.GetComponent<ConvaiAudioOutput>();
        _volumeSlider.value = audioOutput.Volume;
        _volumeSlider.onValueChanged.AddListener(v => audioOutput.Volume = v);
    }
}
```

**Expected outcome:** Each character's volume slider controls only that character's `AudioSource` volume. The two characters can be heard at different levels independently.

### Next steps

Configure the microphone device and platform-specific audio permissions.

{% content-ref url="/pages/vzAH1RAH4ciuh2ypEwaO" %}
[Configure microphone](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/configure-microphone)
{% endcontent-ref %}


# Configure microphone

Select an active microphone device at runtime, set a project-wide default, and configure platform permissions for Android, iOS, and WebGL builds.

The Convai SDK for Unity opens the system microphone automatically when a session starts. Enumerate and select a specific device at runtime, set a project-wide default device, and satisfy the platform-specific requirements for Android, iOS, and WebGL.

### Microphone device selection

To list available microphone devices and let the player choose one:

```csharp
using System.Collections.Generic;
using System.Threading.Tasks;
using Convai.Runtime.Components;
using Convai.Shared.Abstractions;
using Convai.Shared.Types;
using UnityEngine;

private async Task SwitchToDeviceAsync(int deviceIndex)
{
    // Get the microphone device service from the SDK
    if (ConvaiManager.ActiveManager.TryGetMicrophoneDeviceService(out IMicrophoneDeviceService micService))
    {
        // List all available devices
        IReadOnlyList<ConvaiMicrophoneDevice> devices = micService.GetAvailableDevices();

        foreach (ConvaiMicrophoneDevice device in devices)
        {
            Debug.Log($"{device.Name} (ID: {device.Id}, Index: {device.Index})");
        }

        // Start listening with a specific device index
        await ConvaiManager.ActiveManager.Audio.StartListeningAsync(microphoneIndex: deviceIndex);
    }
}
```

On WebGL, `GetAvailableDevices()` returns an empty list outside the Editor. Microphone access on WebGL goes through the browser's Web Audio API and does not support Unity's native device enumeration.

### Set the project-wide default device

`ConvaiSettings.DefaultMicrophoneDeviceId` sets the microphone the SDK uses before any script calls `StartListeningAsync` with a specific device index. An empty string resolves to the system default device.

{% stepper %}
{% step %}

#### Open the Runtime Defaults section

Open **Edit > Project Settings > Convai SDK**, or select **Convai > Settings** in the Unity Editor menu bar. Select the **Runtime Defaults** section.
{% endstep %}

{% step %}

#### Pick a device

Use the **Microphone** dropdown to select a connected device by name, or leave it at **System Default** to follow the operating system's device order.
{% endstep %}

{% step %}

#### Refresh the device list if needed

Select **Refresh** to re-enumerate connected microphones if you plugged in or removed a device after opening the window.
{% endstep %}
{% endstepper %}

### Platform-specific setup

#### Android

The SDK requests microphone permission at runtime automatically when a recording starts. You must declare the permission in your `AndroidManifest.xml`:

```xml
<uses-permission android:name="android.permission.RECORD_AUDIO" />
```

If your project does not have a custom manifest, create one or enable **Override Default Manifest** in **Player Settings > Publishing Settings**.

When the SDK requests the permission, Android shows its standard permission dialog. If the player grants it, recording starts automatically. If denied, the SDK logs a warning and the microphone remains inactive.

#### iOS

Add a microphone usage description to your `Info.plist`. In Unity, set this via **Player Settings > iOS > Other Settings > Microphone Usage Description**:

```
"This app uses the microphone to support voice conversations with AI characters."
```

The SDK requests authorization automatically using Unity's `Application.RequestUserAuthorization`. The app does not need to call any permission API directly.

{% hint style="danger" %}
Submitting to the App Store without a microphone usage description will cause App Store review rejection. Set this value before building for iOS distribution.
{% endhint %}

#### WebGL

Browsers block audio playback and microphone access until the user has interacted with the page. The SDK provides two methods depending on your use case:

* **`Audio.EnableAudioPlayback()`** — unlocks browser audio output only. Use this when you want character voice to play but are not yet starting the microphone (for example, during a tutorial before the player speaks).
* **`ConvaiManager.EnableAudioAndStartListening()`** — unlocks browser audio output **and** opens the microphone. Use this when the player is ready to begin a full conversation.

```csharp
// Call from a UI button's onClick event
public void OnStartButtonClicked()
{
    // Option A: unlock audio only (no microphone yet)
    if (ConvaiManager.ActiveManager.Audio.RequiresUserGesture)
    {
        ConvaiManager.ActiveManager.Audio.EnableAudioPlayback();
    }

    // Option B: unlock audio and open microphone in one step
    // ConvaiManager.ActiveManager.EnableAudioAndStartListening();
}
```

If you skip this step on WebGL, the character's voice will not play even though Convai sends audio data. `RequiresUserGesture` returns `true` only on WebGL.

### Next steps

With audio configured, add a transcript UI to display conversation text.

{% content-ref url="/pages/3b61dcb812f9a6f38643f1fce0883e718828e8d1" %}
[Add chat UI](/api-docs/plugins-and-integrations/convai-unity-sdk/getting-started/add-chat-ui)
{% endcontent-ref %}




---

[Next Page](/api-docs/llms-full.txt/1)

