Add first turn option
This commit is contained in:
@@ -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}")
|
||||
|
||||
Reference in New Issue
Block a user