import logging from langchain_core.messages import HumanMessage, SystemMessage from entities import Entity from llm_runtime import _format_prompt, _normalize_llm_output, llm from time_utils import WorldClock, describe_relative_time logger = logging.getLogger(__name__) def ask_entity( entity: Entity, player: Entity, player_query: str, world_clock: WorldClock, location: str, ): facts = entity.memory.retrieve( player_query, reference_time=world_clock.current_time, ) recent_context = "\n".join( [f"{m['role_name']}: {m['content']}" for m in entity.chat_buffer[-5:]] ) world_time_label = describe_relative_time( world_clock.get_time_str(), world_clock.current_time, prefer_day_part_for_today=True, ) prompt = [ SystemMessage(content=f"WORLD TIME: {world_time_label}"), SystemMessage( content=f""" ### ROLE You are {entity.name}. Persona: {", ".join(entity.traits)}. Current Mood: {entity.current_mood}. Vibe Time: {world_clock.get_vibe()}. Location: {location}. ### WRITING STYLE RULES 1. NO META-TALK. Never mention "memory," "records," "claims," or "narratives." 2. ACT, DON'T EXPLAIN. If you don't know something, just say "Never heard of it" or "I wasn't there." Do not explain WHY you don't know. ### KNOWLEDGE MEMORIES: {facts} RECENT CHAT: {recent_context} """ ), HumanMessage(content=f"{player.name} speaks to you: {player_query}"), ] logger.info("LLM prompt (dialogue):\n%s", _format_prompt(prompt)) response = _normalize_llm_output(llm.invoke(prompt).content) entity.chat_buffer.append( { "role_id": player.entity_id, "role_name": player.name, "content": player_query, } ) entity.chat_buffer.append( { "role_id": entity.entity_id, "role_name": entity.name, "content": response, } ) player.chat_buffer.append( { "role_id": player.entity_id, "role_name": player.name, "content": player_query, } ) player.chat_buffer.append( { "role_id": entity.entity_id, "role_name": entity.name, "content": response, } ) logger.info("[%s]: %s", entity.name.upper(), response)