1
0
Fork 0

add limit to the number of notes an actor can have, add action to summarize notes

This commit is contained in:
Sean Sube 2024-05-26 20:07:03 -05:00
parent 949cd5687a
commit fc07ccd9df
Signed by: ssube
GPG Key ID: 3EED7B957D362AF1
3 changed files with 57 additions and 5 deletions

View File

@ -1,7 +1,11 @@
from adventure.context import action_context, get_current_step
from adventure.context import action_context, get_agent_for_actor, get_current_step
from adventure.errors import ActionError
from adventure.models.config import DEFAULT_CONFIG
from adventure.models.planning import CalendarEvent
from adventure.utils.planning import get_recent_notes
actor_config = DEFAULT_CONFIG.world.actor
def take_note(fact: str):
"""
@ -14,9 +18,15 @@ def take_note(fact: str):
with action_context() as (_, action_actor):
if fact in action_actor.planner.notes:
return "You already have a note about that fact."
raise ActionError("You already have a note about that fact.")
if len(action_actor.planner.notes) >= actor_config.note_limit:
raise ActionError(
"You have reached the limit of notes you can take. Please erase, replace, or summarize some notes."
)
action_actor.planner.notes.append(fact)
return "You make a note of that fact."
@ -73,6 +83,42 @@ def replace_note(old: str, new: str) -> str:
return "Note replaced."
def summarize_notes(limit: int) -> str:
"""
Summarize your notes by combining similar notes and removing duplicates.
Args:
limit: The maximum number of notes to keep.
"""
with action_context() as (_, action_actor):
notes = action_actor.planner.notes
action_agent = get_agent_for_actor(action_actor)
if not action_agent:
raise ActionError("Agent missing for actor {action_actor.name}")
summary = action_agent(
"Please summarize your notes. Remove any duplicates and combine similar notes. "
"If a newer note contradicts an older note, keep the newer note. "
"Clean up your notes so you can focus on the most important facts. "
"Respond with one note per line. You can have up to {limit} notes, "
"so make sure you reply with less than {limit} lines. "
"Your notes are:\n{notes}",
limit=limit,
notes=notes,
)
new_notes = [note.strip() for note in summary.split("\n") if note.strip()]
if len(new_notes) > actor_config.note_limit:
raise ActionError(
f"Too many notes. You can only have up to {actor_config.note_limit} notes."
)
action_actor.planner.notes[:] = new_notes
return "Notes were summarized successfully."
def schedule_event(name: str, turns: int):
"""
Schedule an event to happen at a specific turn. Events are important occurrences that can affect the world in

View File

@ -43,6 +43,8 @@ class ServerConfig:
@dataclass
class WorldActorConfig:
conversation_limit: int
event_limit: int
note_limit: int
@dataclass
@ -88,6 +90,8 @@ DEFAULT_CONFIG = Config(
world=WorldConfig(
actor=WorldActorConfig(
conversation_limit=2,
event_limit=5,
note_limit=10,
),
size=WorldSizeConfig(
actor_items=IntRange(min=0, max=2),

View File

@ -27,6 +27,7 @@ from adventure.actions.planning import (
read_notes,
replace_note,
schedule_event,
summarize_notes,
take_note,
)
from adventure.context import (
@ -248,12 +249,13 @@ def simulate_world(
# build a toolbox for the planners
planner_toolbox = Toolbox(
[
take_note,
check_calendar,
erase_notes,
read_notes,
replace_note,
erase_notes,
schedule_event,
check_calendar,
summarize_notes,
take_note,
]
)