90 lines
2.3 KiB
Python
90 lines
2.3 KiB
Python
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)
|