Add first turn option

This commit is contained in:
Xin Wang
2026-02-12 15:23:32 +08:00
parent 56ca95c200
commit edcbc2cec7
9 changed files with 97 additions and 24 deletions

View File

@@ -267,6 +267,7 @@ class DuplexPipeline:
self._runtime_tts: Dict[str, Any] = {}
self._runtime_output: Dict[str, Any] = {}
self._runtime_system_prompt: Optional[str] = None
self._runtime_first_turn_mode: str = "bot_first"
self._runtime_greeting: Optional[str] = None
self._runtime_generated_opener_enabled: Optional[bool] = None
self._runtime_barge_in_enabled: Optional[bool] = None
@@ -303,6 +304,9 @@ class DuplexPipeline:
self._runtime_system_prompt = str(metadata.get("systemPrompt") or "")
if self._runtime_system_prompt:
self.conversation.system_prompt = self._runtime_system_prompt
if "firstTurnMode" in metadata:
raw_mode = str(metadata.get("firstTurnMode") or "").strip().lower()
self._runtime_first_turn_mode = "user_first" if raw_mode == "user_first" else "bot_first"
if "greeting" in metadata:
greeting_payload = metadata.get("greeting")
if isinstance(greeting_payload, dict):
@@ -393,6 +397,9 @@ class DuplexPipeline:
def _generated_opener_enabled(self) -> bool:
return self._runtime_generated_opener_enabled is True
def _bot_starts_first(self) -> bool:
return self._runtime_first_turn_mode != "user_first"
def _barge_in_enabled(self) -> bool:
if self._runtime_barge_in_enabled is not None:
return self._runtime_barge_in_enabled
@@ -540,23 +547,24 @@ class DuplexPipeline:
# Resolve greeting once per session start.
# Always emit text opener event so text-only sessions can display it.
greeting_to_speak = self.conversation.greeting
if self._generated_opener_enabled():
generated_greeting = await self._generate_runtime_greeting()
if generated_greeting:
greeting_to_speak = generated_greeting
self.conversation.greeting = generated_greeting
if greeting_to_speak:
await self._send_event(
ev(
"assistant.response.final",
text=greeting_to_speak,
trackId=self.session_id,
),
priority=20,
)
if tts_output_enabled:
await self._speak(greeting_to_speak)
if self._bot_starts_first():
greeting_to_speak = self.conversation.greeting
if self._generated_opener_enabled():
generated_greeting = await self._generate_runtime_greeting()
if generated_greeting:
greeting_to_speak = generated_greeting
self.conversation.greeting = generated_greeting
if greeting_to_speak:
await self._send_event(
ev(
"assistant.response.final",
text=greeting_to_speak,
trackId=self.session_id,
),
priority=20,
)
if tts_output_enabled:
await self._speak(greeting_to_speak)
except Exception as e:
logger.error(f"Failed to start pipeline: {e}")