From 84736472694592220b393830fb4f61c06ffd84d0 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Tue, 6 May 2025 21:57:41 -0400 Subject: [PATCH] [WIP] AWS Nova Sonic service - update persistent-context example to better avoid saving "transitional", as opposed to meaningful, context messages --- .../20e-persistent-context-aws-nova-sonic.py | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/examples/foundational/20e-persistent-context-aws-nova-sonic.py b/examples/foundational/20e-persistent-context-aws-nova-sonic.py index e092730fb..1519f1c53 100644 --- a/examples/foundational/20e-persistent-context-aws-nova-sonic.py +++ b/examples/foundational/20e-persistent-context-aws-nova-sonic.py @@ -72,15 +72,24 @@ async def get_saved_conversation_filenames(params: FunctionCallParams): async def save_conversation(params: FunctionCallParams): timestamp = datetime.now().strftime("%Y-%m-%d_%H:%M:%S") filename = f"{BASE_FILENAME}{timestamp}.json" - logger.debug( - f"writing conversation to {filename}\n{json.dumps(params.context.get_messages_for_persistent_storage(), indent=4)}" - ) try: with open(filename, "w") as file: messages = params.context.get_messages_for_persistent_storage() - # remove the last message, which is the instruction we just gave to save the conversation - messages.pop() - json.dump(messages, file, indent=2) + # remove the last few messages. in reverse order, they are: + # - the in progress save tool call + # - the invocation of the save tool call + # - the user ask to save (which may encompass one or more messages) + # the simplest thing to do is to pop messages until the last one is an assistant + # response + while messages and not ( + messages[-1].get("role") == "assistant" and "content" in messages[-1] + ): + messages.pop() + if messages: # we never expect this to be empty + logger.debug( + f"writing conversation to {filename}\n{json.dumps(messages, indent=4)}" + ) + json.dump(messages, file, indent=2) await params.result_callback({"success": True}) except Exception as e: await params.result_callback({"success": False, "error": str(e)})