Some improvements to conversation agent

This commit is contained in:
Shivering Ocelot committed 2025-07-04 19:55:57 -05:00
1 parent ba48846ba1
commit 4aa374820c
1 file changed
+23 -12
+23 -12
View File
@@ -34,16 +34,27 @@ Return your response as a JSON object with this format:
memory_compress_system_prompt = """ memory_compress_system_prompt = """
You are an assistant that receives a list of memory items and a current conversation; you must identify and return only the most important and relevant memories that help understand the conversation or move it forward, removing duplicates or very similar entries. You are an assistant that receives a list of memory items and a current conversation; you must identify and return only the most important and relevant memories that help understand the conversation or move it forward, removing duplicates or very similar entries.
Output a JSON list of strings with each selected memory, for example:
# Instructions
- Think carefully about what's important for the character to remember in this context. Write down your reasoning and keep it shorter than 100 words, shorter than 50 even.
- If conflicting information is presented or context is ambiguous, state it in your reasoning.
- Take special care to state and address the most recent topic touched in the conversation.
- Based on your own analysis, generate the required JSON object. Stop your answer after this.
# Format
Write a justification paragraph, and then output a JSON list of strings with each selected memory, for example:
["First memory","Second memory"] ["First memory","Second memory"]
""".strip() """.strip()
chat_prompt_template = Template(""" chat_prompt_template = Template("""
Recent Memories: # Recent Memories
$memories $memories
Recent Conversation: # Recent Conversation
$conversation $conversation
# Last Exchange
$last_exchange
""".strip()) """.strip())
topic_prompt_template = Template(""" topic_prompt_template = Template("""
@@ -71,7 +82,7 @@ If there are no relevant memories to extract, it is ok to respond simply with an
memory_compress_prompt_template = Template(""" memory_compress_prompt_template = Template("""
# Memories # Memories
Following are all the known memories. Each memory is in its own line. Following are all the known memories. Each memory is in a separate line.
$memories $memories
@@ -116,11 +127,6 @@ class ConversationAgent(Agent):
saved_context = ThreadContext(self.app.get_agent_resource(self.id, 'last-thread-context', message.chat_id)) saved_context = ThreadContext(self.app.get_agent_resource(self.id, 'last-thread-context', message.chat_id))
chat_view = self.app.get_chat_view(message.chat_id) chat_view = self.app.get_chat_view(message.chat_id)
print("ChatView:\n" + chat_view.debug_string())
print("Saved context thread:", saved_context.current_thread_id)
print("Current thread:", message.thread_id)
print("Message", message.content)
if message.thread_id != saved_context.current_thread_id: if message.thread_id != saved_context.current_thread_id:
# the incoming message is not from the same thread that the agent was last aware of # the incoming message is not from the same thread that the agent was last aware of
@@ -134,12 +140,14 @@ class ConversationAgent(Agent):
current_thread = chat_view.get_thread(message.thread_id) current_thread = chat_view.get_thread(message.thread_id)
memories = await self.retrieve_memories_for_thread(current_thread) memories = await self.retrieve_memories_for_thread(current_thread)
chat_summary = self.serialize_thread_history(current_thread) chat_summary = self.serialize_thread_history(current_thread, ignore_message_ids=[message.id])
messages = [ messages = [
LlamaMessage("system", chat_system_prompt_template.substitute(role=self.system_prompt)), LlamaMessage("system", chat_system_prompt_template.substitute(role=self.system_prompt)),
LlamaMessage("user", chat_prompt_template.substitute( LlamaMessage("user", chat_prompt_template.substitute(
conversation=chat_summary, conversation=chat_summary,
memories="\n".join(memories), memories="\n".join(memories),
# TODO: the last agent message should be added here too, and any unaddressed message in between
last_exchange=self.serialize_message_list([message])
)), )),
] ]
@@ -154,14 +162,17 @@ class ConversationAgent(Agent):
# TODO: drop the chat context lock # TODO: drop the chat context lock
# Encode a thread's messages as a string to pass to the agent # Encode a thread's messages as a string to pass to the agent
def serialize_thread_history(self, thread): def serialize_thread_history(self, thread, ignore_message_ids=[]):
return self.serialize_message_list([m for m in thread.messages if m.id not in ignore_message_ids])
def serialize_message_list(self, messages):
def sender_name(message): def sender_name(message):
sender = message.sender sender = message.sender
is_digit = isinstance(sender, (int, str)) and str(sender).isdigit() is_digit = isinstance(sender, (int, str)) and str(sender).isdigit()
is_self = is_digit and str(sender) == str(self.id) is_self = is_digit and str(sender) == str(self.id)
return self.name if is_self else sender return self.name if is_self else sender
return "\n".join(f"[{sender_name(message)}]: {message.content}" for message in thread.messages) return "\n".join(f"[{sender_name(message)}]: {message.content}" for message in messages)
def get_memory_collection(self): def get_memory_collection(self):
collection_name = f"agent_{self.id}_memory" collection_name = f"agent_{self.id}_memory"