This commit is contained in:
2025-09-05 19:00:24 +02:00
parent 793213a834
commit 630c6317a1
5 changed files with 331 additions and 44 deletions

View File

@@ -71,6 +71,33 @@ class CharacterAgent:
return response
async def chat_with(self, messages: List[LLMMessage]) -> LLMMessage:
"""Generate reaction based on memory and character"""
# Retrieve relevant memories
relevant_memories = await self.memory_stream.retrieve_related_memories(situation, k=8)
memory_context = "\n".join([f"- {m.description}" for m in relevant_memories])
context = {
'character': self._get_character_prompt(),
'character_name': self.character.name,
'memory_context': memory_context,
'situation': situation}
prompt = PromptManager.get_prompt('react_to_situation', context)
response = await self.llm.chat([{"role": "user", "content": prompt}])
# create new memories from interaction
interaction_context = {
'situation': f'I reacted to: \n{situation}',
'response': f'My response was: \n{response}',
}
prompt, schema = PromptManager.get_prompt_with_schema('extract_interaction_memories', interaction_context)
memories_response = await self.llm.client.get_structured_response([{"role": "user", "content": prompt}], schema)
for new_memory in memories_response['memories']:
await self.perceive(new_memory)
return response
async def plan_day(self) -> List[str]:
"""Generate high-level daily plan"""
# Retrieve relevant memories about goals, habits, schedule
@@ -255,5 +282,7 @@ Summary:"""
memory.importance_score = await instance._score_memory_importance(memory)
await instance._analyze_trait_impact(memory)
instance.character.template_file = template['yaml_file']
logger.info(f"Character {instance.character.name} created successfully")
return instance

View File

@@ -2,7 +2,7 @@ from dataclasses import dataclass, field
from typing import Dict, List, Optional, Literal, TypedDict
from datetime import datetime
from uuid import uuid4
import random
from pathlib import Path
class CharacterTemplate(TypedDict):
@@ -10,7 +10,7 @@ class CharacterTemplate(TypedDict):
observations: List[str]
reflections: List[str]
plans: List[str]
yaml_file: str
yaml_file: Path
@dataclass
@@ -72,6 +72,7 @@ class Character:
traits: List[CharacterTrait] = field(default_factory=list)
relationships: Dict[str, str] = field(default_factory=dict)
goals: List[str] = field(default_factory=list)
template_file: Optional[Path] = None
_id: str = field(default_factory=lambda: str(uuid4())[:8])
def get_trait(self, trait_name, trait_description) -> CharacterTrait:

View File

@@ -41,7 +41,6 @@ class MemoryStream:
# Track for reflection trigger
self.recent_importance_sum += memory.importance_score
print(f"Recent Importance Sum: {self.recent_importance_sum}")
# Trigger reflection if threshold exceeded
if self.recent_importance_sum >= self.importance_threshold:

View File

@@ -0,0 +1,15 @@
{{character}}
Relevant memories from your past:
{{memory_context}}
Respond as {{character_name}} describing what you did and how you reacted. Write in first person past tense as if this
just happened to you.
Examples of the response style:
- "I looked up from my book and smiled nervously..."
- "I felt my heart race and took a deep breath before I said..."
- "I hesitated for a moment, then decided to..."
Stay completely in character and be specific about your actions, thoughts, and words.