clientConfiguration fields (per-session agent config)
The server sends clientConfiguration once per connect. The SDK keeps it and exposes it read-only as session.clientConfig. These are the fields the SDK reads:
| Field | Example | What the SDK does with it |
|---|---|---|
isTapToTalk |
false |
Push-to-talk vs open-mic. A fixed, per-agent choice, not a live toggle. Read as capabilities.tapToTalk. startTapToTalk() and endTapToTalk() throw capability_disabled when it is false (see the tapToTalkStart/tapToTalkEnd row in the events catalog for why mixing modes is unsafe). |
interruptionsEnabled |
true |
Read as capabilities.interruptions. false means the user can't talk over the avatar. |
isWebSearchEnabled |
false |
Read as capabilities.webSearch. Web-search tools produce tool/tool_response deltas only when it is true. When false, the agent can still say it will "look that up", but no tool segment fires. |
isScreenShareEnabled |
false |
Read as capabilities.screenShare. startScreenShare() and sendScreenShot() throw capability_disabled when it is false. It becomes true when the agent's screenShare setting is on. |
isCameraAnalysisEnabled |
false |
Read as capabilities.cameraAnalysis. |
The payload also carries languageCode, showTranscription, audioMode, phoneMode, pauseConversationEnabled, shouldAggregateCurrentTurn, initialHtml, youtubeUrl, visualPhotos, visualVideos, agentPersonaName, userName, configuration and nluFeatures. The SDK passes them through on session.clientConfig and does not act on them.
Structured experiences (force_experience + unisphere-tool)
Scope: the structured-experience behavior below is what you get on the HTTP
/assistant/conversepath (headless/text integrations). The live avatar socket does not produce flashcards or summarization. See Two delivery paths.
force_experience on converse (e.g. "flashcards") is a hint, not a guarantee. The agent decides which structured widget(s) to emit based on the prompt and its intellect (the agent's configuration: prompts, tools and capabilities). Each comes back as unisphere-tool segments. The first carries metadata:{ widgetName, runtimeName }, then the content streams as a YAML-ish block (e.g. title: / questions:). For example:
force_experience:"flashcards"+ a teachable prompt ("Teach me about video codecs") → bothflashcards-toolandfollowups-toolruntimes in one turn (widgetName:"unisphere.widget.genie").- The same
force_experience+ a vague prompt ("show me something interesting") → onlyfollowups-tool. - So: render whatever
runtimeNamearrives; don't assumeforce_experiencemaps 1:1 to a widget.capabilities.generate_followup_questions:"on"independently yields thefollowups-tool.
Related docs
| Doc | Covers |
|---|---|
| Wire Protocol · Events Catalog | The join/clientConfiguration events these fields ride on |
| Wire Protocol | Back to the index |