add limit to the number of notes an actor can have, add action to summarize notes
This commit is contained in:
parent
949cd5687a
commit
fc07ccd9df
|
@ -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.models.planning import CalendarEvent
|
||||||
from adventure.utils.planning import get_recent_notes
|
from adventure.utils.planning import get_recent_notes
|
||||||
|
|
||||||
|
actor_config = DEFAULT_CONFIG.world.actor
|
||||||
|
|
||||||
|
|
||||||
def take_note(fact: str):
|
def take_note(fact: str):
|
||||||
"""
|
"""
|
||||||
|
@ -14,9 +18,15 @@ def take_note(fact: str):
|
||||||
|
|
||||||
with action_context() as (_, action_actor):
|
with action_context() as (_, action_actor):
|
||||||
if fact in action_actor.planner.notes:
|
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)
|
action_actor.planner.notes.append(fact)
|
||||||
|
|
||||||
return "You make a note of that fact."
|
return "You make a note of that fact."
|
||||||
|
|
||||||
|
|
||||||
|
@ -73,6 +83,42 @@ def replace_note(old: str, new: str) -> str:
|
||||||
return "Note replaced."
|
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):
|
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
|
Schedule an event to happen at a specific turn. Events are important occurrences that can affect the world in
|
||||||
|
|
|
@ -43,6 +43,8 @@ class ServerConfig:
|
||||||
@dataclass
|
@dataclass
|
||||||
class WorldActorConfig:
|
class WorldActorConfig:
|
||||||
conversation_limit: int
|
conversation_limit: int
|
||||||
|
event_limit: int
|
||||||
|
note_limit: int
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
@ -88,6 +90,8 @@ DEFAULT_CONFIG = Config(
|
||||||
world=WorldConfig(
|
world=WorldConfig(
|
||||||
actor=WorldActorConfig(
|
actor=WorldActorConfig(
|
||||||
conversation_limit=2,
|
conversation_limit=2,
|
||||||
|
event_limit=5,
|
||||||
|
note_limit=10,
|
||||||
),
|
),
|
||||||
size=WorldSizeConfig(
|
size=WorldSizeConfig(
|
||||||
actor_items=IntRange(min=0, max=2),
|
actor_items=IntRange(min=0, max=2),
|
||||||
|
|
|
@ -27,6 +27,7 @@ from adventure.actions.planning import (
|
||||||
read_notes,
|
read_notes,
|
||||||
replace_note,
|
replace_note,
|
||||||
schedule_event,
|
schedule_event,
|
||||||
|
summarize_notes,
|
||||||
take_note,
|
take_note,
|
||||||
)
|
)
|
||||||
from adventure.context import (
|
from adventure.context import (
|
||||||
|
@ -248,12 +249,13 @@ def simulate_world(
|
||||||
# build a toolbox for the planners
|
# build a toolbox for the planners
|
||||||
planner_toolbox = Toolbox(
|
planner_toolbox = Toolbox(
|
||||||
[
|
[
|
||||||
take_note,
|
check_calendar,
|
||||||
|
erase_notes,
|
||||||
read_notes,
|
read_notes,
|
||||||
replace_note,
|
replace_note,
|
||||||
erase_notes,
|
|
||||||
schedule_event,
|
schedule_event,
|
||||||
check_calendar,
|
summarize_notes,
|
||||||
|
take_note,
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue