diff --git a/.gitignore b/.gitignore index 0103980..dd3d36d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ adventure/custom_actions.py worlds/ __pycache__/ +.env diff --git a/adventure/actions.py b/adventure/actions.py index 792b942..1a45806 100644 --- a/adventure/actions.py +++ b/adventure/actions.py @@ -84,7 +84,7 @@ def action_ask(character: str, question: str) -> str: # sanity checks if character == action_actor.name: - return "You cannot ask yourself a question. You have wasted your turn. Stop talking to yourself." + return "You cannot ask yourself a question. Stop talking to yourself. Try another action." question_actor, question_agent = get_actor_agent_for_name(character) if not question_actor: @@ -120,7 +120,7 @@ def action_tell(character: str, message: str) -> str: # sanity checks if character == action_actor.name: - return "You cannot tell yourself a message. You have wasted your turn. Stop talking to yourself." + return "You cannot tell yourself a message. Stop talking to yourself. Try another action." question_actor, question_agent = get_actor_agent_for_name(character) if not question_actor: diff --git a/adventure/generate.py b/adventure/generate.py index 6b1cbd4..cecfb73 100644 --- a/adventure/generate.py +++ b/adventure/generate.py @@ -80,7 +80,8 @@ def generate_actor( logger.info(f"Generating actor: {name}") description = agent( "Generate a detailed description of the {name} character. What do they look like? What are they wearing? " - "What are they doing? Describe their appearance from the perspective of an outside observer.", + "What are they doing? Describe their appearance from the perspective of an outside observer." + "Do not include the room or any other characters in the description, because they will move around.", name=name, ) backstory = agent( @@ -101,8 +102,10 @@ def generate_actor( ) -def generate_world(agent: Agent, name: str, theme: str) -> World: - room_count = randint(3, 5) +def generate_world( + agent: Agent, name: str, theme: str, rooms: int | None = None, max_rooms: int = 5 +) -> World: + room_count = rooms or randint(3, max_rooms) logger.info(f"Generating a {theme} with {room_count} rooms") existing_actors: List[str] = [] diff --git a/adventure/main.py b/adventure/main.py index f855296..b3da68f 100644 --- a/adventure/main.py +++ b/adventure/main.py @@ -1,9 +1,10 @@ from importlib import import_module from json import load -from os import path +from os import environ, path +from dotenv import load_dotenv from packit.agent import Agent, agent_easy_connect -from packit.loops import loop_tool +from packit.loops import loop_retry from packit.results import multi_function_or_str_result from packit.toolbox import Toolbox from packit.utils import logger_with_colors @@ -32,6 +33,8 @@ from adventure.state import create_agents, save_world, save_world_state logger = logger_with_colors(__name__) +load_dotenv(environ.get("ADVENTURE_ENV", ".env"), override=True) + # simulation def world_result_parser(value, agent, **kwargs): @@ -97,7 +100,7 @@ def simulate_world(world: World, steps: int = 10, callback=None, extra_actions=[ room_directions = list(room.portals.keys()) logger.info("starting actor %s turn", actor.name) - result = loop_tool( + result = loop_retry( agent, ( "You are currently in {room_name}. {room_description}. " @@ -121,7 +124,7 @@ def simulate_world(world: World, steps: int = 10, callback=None, extra_actions=[ toolbox=action_tools, ) - logger.info(f"{actor.name} step result: {result}") + logger.debug(f"{actor.name} step result: {result}") agent.memory.append(result) if callback: @@ -146,6 +149,12 @@ def parse_args(): parser.add_argument( "--player", type=str, help="The name of the character to play as" ) + parser.add_argument( + "--rooms", type=int, default=5, help="The number of rooms to generate" + ) + parser.add_argument( + "--max-rooms", type=int, help="The maximum number of rooms to generate" + ) parser.add_argument( "--state", type=str, @@ -201,7 +210,9 @@ def main(): {}, llm, ) - world = generate_world(agent, args.world, args.theme) + world = generate_world( + agent, args.world, args.theme, rooms=args.rooms, max_rooms=args.max_rooms + ) save_world(world, world_file) create_agents(world, memory=memory, players=players)