Speak-only: no chat is created and no notifications web socket is opened, while video still streams. Use it when the application drives the agent entirely through speak().
Talks (V2) and Clips (V3) agents only; rejected with a ValidationError for Expressive (V4) agents. chat() rejects with a ValidationError in this mode.
Chat and video: the agent answers questions with its own LLM, in a streamed video.
The default when mode is omitted, and the only mode a session can be in while a stream is connected and chat is available at the same time: changeMode() to any other value disconnects the stream.
The agent is unavailable: chat() throws a ValidationError.
The SDK switches to it by itself when connecting fails after its retries, so a UI can show that the agent is temporarily out of service; the server can also return it when a chat is created. Like ChatMode.TextOnly it produces no video.
Chat is switched off: no chat is created for the session, while video still streams. Unlike ChatMode.DirectPlayback it keeps the notifications web socket.
Talks (V2) and Clips (V3) agents only; rejected with a ValidationError for Expressive (V4) agents. chat() rejects with a ValidationError in this mode.
A text-only test conversation, used by the agent playground in D-ID Studio.
Produces no video, and marks each chat request with a playground header so the Agents API can treat it as a test. Chats in this mode always go over the Agents API, even for Expressive (V4) agents, which otherwise chat over the data channel. Applications normally use ChatMode.Functional or ChatMode.TextOnly instead.
Text answers only: the chat works over the Agents API, but no video is produced.
Talks (V2) and Clips (V3) agents. Expressive (V4) agents chat over the streaming session, which connect() always opens in ChatMode.Functional.
How the agent answers: with a streamed video, as text only, or not at all.
Chosen with mode and changed later with changeMode(), which reports the new value through onModeChange. Switching to anything other than ChatMode.Functional disconnects the stream, and switching into ChatMode.Functional disconnects it too when the open session cannot carry a conversation — call connect() again after either.
What the mode decides is narrower than it looks: whether a chat is created for the session, and whether connect() opens the notifications web socket — which is exactly why a session built for one mode may not serve another. The video stream is established in every mode, and every guard reads the mode the session is in at the time of the call, not the one createAgentManager was given.
The server can also answer with a different mode than the one asked for when the chat is created; the SDK then adopts it and reports a ChatModeDowngraded error through onError.