[WIP] AWS Nova Sonic service - support multi-line system prompt

This commit is contained in:
Paul Kompfner
2025-05-06 09:48:50 -04:00
parent 2b02d08f4c
commit 467233be04
3 changed files with 7 additions and 3 deletions

View File

@@ -175,6 +175,10 @@ async def run_bot(webrtc_connection: SmallWebRTCConnection):
), ),
) )
# Specify initial system instruction.
# HACK: note that, for now, we need to inject a special bit of text into this instruction to
# allow the first assistant response to be programmatically triggered (which happens in the
# on_client_connected handler, below)
system_instruction = ( system_instruction = (
"You are a friendly assistant. The user and you will engage in a spoken dialog exchanging " "You are a friendly assistant. The user and you will engage in a spoken dialog exchanging "
"the transcripts of a natural real-time conversation. Keep your responses short, generally " "the transcripts of a natural real-time conversation. Keep your responses short, generally "

View File

@@ -87,7 +87,6 @@ async def run_bot(webrtc_connection: SmallWebRTCConnection):
# HACK: note that, for now, we need to inject a special bit of text into this instruction to # HACK: note that, for now, we need to inject a special bit of text into this instruction to
# allow the first assistant response to be programmatically triggered (which happens in the # allow the first assistant response to be programmatically triggered (which happens in the
# on_client_connected handler, below) # on_client_connected handler, below)
# TODO: looks like Nova Sonic can't handle new lines?
system_instruction = ( system_instruction = (
"You are a friendly assistant. The user and you will engage in a spoken dialog exchanging " "You are a friendly assistant. The user and you will engage in a spoken dialog exchanging "
"the transcripts of a natural real-time conversation. Keep your responses short, generally " "the transcripts of a natural real-time conversation. Keep your responses short, generally "

View File

@@ -498,7 +498,7 @@ class AWSNovaSonicLLMService(LLMService):
await self._send_client_event(audio_content_start) await self._send_client_event(audio_content_start)
async def _send_text_event(self, text: str, role: Role): async def _send_text_event(self, text: str, role: Role):
if not self._stream: if not self._stream or not text:
return return
content_name = str(uuid.uuid4()) content_name = str(uuid.uuid4())
@@ -521,13 +521,14 @@ class AWSNovaSonicLLMService(LLMService):
''' '''
await self._send_client_event(text_content_start) await self._send_client_event(text_content_start)
escaped_text = json.dumps(text) # includes quotes
text_input = f''' text_input = f'''
{{ {{
"event": {{ "event": {{
"textInput": {{ "textInput": {{
"promptName": "{self._prompt_name}", "promptName": "{self._prompt_name}",
"contentName": "{content_name}", "contentName": "{content_name}",
"content": "{text}" "content": {escaped_text}
}} }}
}} }}
}} }}