import os import gradio as gr import gradio.utils from utils import create_agent, agent_observes, interview_agent, run_conversation, get_summary, save_agent, load_agent webui = None AGENTS = {} def create_agent_proxy(name, age, traits, status, daily_summaries=None): kwargs = locals() if "daily_summaries" in kwargs: summaries = kwargs["daily_summaries"].split("\n") kwargs["daily_summaries"] = [ ( summary ) for summary in summaries ] agent = create_agent(**kwargs) AGENTS[agent.name] = agent return ( f"Agent created: {agent.name}", update_agents_list() ) def edit_agent( name, age, traits, status, daily_summaries=None ): if daily_summaries is not None: summaries = daily_summaries.split("\n") daily_summaries = [ ( summary ) for summary in summaries ] AGENTS[name].age = age AGENTS[name].traits = traits AGENTS[name].status = status AGENTS[name].daily_summaries = daily_summaries return f"Agent updated: {name}" def agent_observes_proxy( agents, observations ): if not isinstance( agents, list ): agents = [ agents ] messages = [] for agent in agents: agent = AGENTS[agent] observations = observations.split("\n") results = agent_observes( agent, observations ) messages.append(f"[{agent.name}] Observation noted. Importance score: {[ result[0] for result in results ]}") return "\n".join(messages) def interview_agent_proxy( agents, message ): if not isinstance( agents, list ): agents = [ agents ] messages = [] for agent in agents: agent = AGENTS[agent] messages.append(interview_agent( agent, message )[-1]) return "\n".join(messages) def get_summary_proxy( agents ): if not isinstance( agents, list ): agents = [ agents ] messages = [] for agent in agents: agent = AGENTS[agent] messages.append(get_summary( agent, force_refresh = True )) return "\n".join(messages) def run_conversation_proxy( agents, message ): agents = [ AGENTS[agent] for agent in agents ] messages = run_conversation( agents, message, limit=len(agents)*3 ) return "\n".join(messages) def agent_view_memories( agents, last_k = 50 ): if not isinstance( agents, list ): agents = [ agents ] messages = [] for agent in agents: agent = AGENTS[agent] memories = agent.memory.memory_retriever.memory_stream[-last_k:] messages.append("\n".join([ document.page_content for document in memories])) return "\n".join(messages) def get_agents_list(): return [ k for k in AGENTS ] def get_saved_agents_list(): if not os.path.exists("./agents/"): return [] return [ ".".join(d.split(".")[:-1]) for d in os.listdir("./agents/") if d.split(".")[-1] == "pth" ] def update_agents_list(): agents = get_agents_list() return gr.Dropdown.update(choices=agents, value=[agents[0] if len(agents) > 0 else ""]) def update_saved_agents_list(): agents = get_agents_list() + get_saved_agents_list() return gr.Dropdown.update(choices=agents, value=[agents[0] if len(agents) > 0 else ""]) def save_agent_proxy( agents ): if not isinstance( agents, list ): agents = [ agents ] for name in agents: agent = AGENTS[name] save_agent( agent ) def load_agent_proxy( agents ): if not isinstance( agents, list ): agents = [ agents ] for agent in agents: AGENTS[agent] = load_agent( agent ) return update_agents_list() def setup_webui(share=False): if not share: def noop(function, return_value=None): def wrapped(*args, **kwargs): return return_value return wrapped gradio.utils.version_check = noop(gradio.utils.version_check) gradio.utils.initiated_analytics = noop(gradio.utils.initiated_analytics) gradio.utils.launch_analytics = noop(gradio.utils.launch_analytics) gradio.utils.integration_analytics = noop(gradio.utils.integration_analytics) gradio.utils.error_analytics = noop(gradio.utils.error_analytics) gradio.utils.log_feature_analytics = noop(gradio.utils.log_feature_analytics) #gradio.utils.get_local_ip_address = noop(gradio.utils.get_local_ip_address, 'localhost') AGENT_SETTINGS = {} OBSERVE_SETTINGS = {} SAVELOAD_SETTINGS = {} ACTIONS = {} agents_list = get_agents_list() saved_agents_list = get_saved_agents_list() with gr.Blocks() as ui: with gr.Tab("Create Agent"): with gr.Row(): with gr.Column(): AGENT_SETTINGS["name"] = gr.Textbox(lines=1, label="Name", value="Adam") AGENT_SETTINGS["age"] = gr.Number(label="Age") AGENT_SETTINGS["traits"] = gr.Textbox(lines=1, label="Traits", value="N/A") AGENT_SETTINGS["status"] = gr.Textbox(lines=1, label="Status", value="N/A") AGENT_SETTINGS["daily_summaries"] = gr.Textbox(lines=4, label="Summary", value="") ACTIONS["add_agent"] = gr.Button(value="Add Agent") ACTIONS["edit_agent"] = gr.Button(value="Edit Agent") with gr.Column(): console_output = gr.Textbox(lines=8, label="Console Output") ACTIONS["edit_agent"].click(edit_agent, inputs=list(AGENT_SETTINGS.values()), outputs=console_output ) with gr.Tab("Save/Load"): with gr.Row(): with gr.Column(): SAVELOAD_SETTINGS["agent"] = gr.Dropdown(choices=saved_agents_list, label="Agent", type="value", value=saved_agents_list if len(saved_agents_list) > 0 else [""], multiselect=True) with gr.Row(): ACTIONS["save"] = gr.Button(value="Save") ACTIONS["load"] = gr.Button(value="Load") ACTIONS["refresh_agents_list"] = gr.Button(value="Refresh Agents List") ACTIONS["save"].click(save_agent_proxy, inputs=SAVELOAD_SETTINGS["agent"], ) with gr.Tab("Agent Actions"): with gr.Row(): with gr.Column(): OBSERVE_SETTINGS["agent"] = gr.Dropdown(choices=agents_list, label="Agent", type="value", value=agents_list[0] if len(agents_list) > 0 else [""], multiselect=True) OBSERVE_SETTINGS["input"] = gr.Textbox(lines=4, label="Input", value="") with gr.Row(): ACTIONS["act"] = gr.Button(value="Act") ACTIONS["view"] = gr.Button(value="View") ACTIONS["summarize"] = gr.Button(value="Summarize") ACTIONS["interview"] = gr.Button(value="Interview") ACTIONS["converse"] = gr.Button(value="Converse") with gr.Column(): console_output = gr.Textbox(lines=8, label="Console Output") ACTIONS["act"].click(agent_observes_proxy, inputs=list(OBSERVE_SETTINGS.values()), outputs=console_output ) ACTIONS["view"].click(agent_view_memories, inputs=OBSERVE_SETTINGS["agent"], outputs=console_output ) ACTIONS["summarize"].click(get_summary_proxy, inputs=OBSERVE_SETTINGS["agent"], outputs=console_output ) ACTIONS["interview"].click(interview_agent_proxy, inputs=list(OBSERVE_SETTINGS.values()), outputs=console_output ) ACTIONS["converse"].click(run_conversation_proxy, inputs=list(OBSERVE_SETTINGS.values()), outputs=console_output ) ACTIONS["add_agent"].click(create_agent_proxy, inputs=list(AGENT_SETTINGS.values()), outputs=[ console_output, OBSERVE_SETTINGS["agent"], ] ) ACTIONS["load"].click(load_agent_proxy, inputs=SAVELOAD_SETTINGS["agent"], outputs=OBSERVE_SETTINGS["agent"] ) ACTIONS["refresh_agents_list"].click(update_agents_list, inputs=None, outputs=OBSERVE_SETTINGS["agent"] ) ui.queue(concurrency_count=2) return ui if __name__ == "__main__": share=False webui = setup_webui(share=share) if webui: webui.launch(share=share, prevent_thread_lock=True, show_error=True) webui.block_thread() else: tommie = create_agent( name="Tommie", age=25, traits="anxious, likes design, talkative", # You can add more persistent traits here status="looking for a job", # When connected to a virtual world, we can have the characters update their status ) eve = create_agent( name="Eve", age=34, traits="curious, helpful", # You can add more persistent traits here status="N/A", # When connected to a virtual world, we can have the characters update their status daily_summaries = [ ("{name} started her new job as a career counselor last week and received her first assignment, a client named Tommie.") ], ) # We can add memories directly to the memory object agent_observes(tommie, [ "{name} remembers his dog, Bruno, from when he was a kid", "{name} feels tired from driving so far", "{name} sees the new home", "The new neighbors have a cat", "The road is noisy at night", "{name} is hungry", "{name} tries to get some rest.", ]) # Now that Tommie has 'memories', their self-summary is more descriptive, though still rudimentary. # We will see how this summary updates after more observations to create a more rich description. # Interview agent print(interview_agent(tommie, "What do you like to do?")[-1]) print(interview_agent(tommie, "What are you looking forward to doing today?")[-1]) print(interview_agent(tommie, "What are you most worried about today?")[-1]) # Let's have Tommie start going through a day in the life. agent_observes(tommie, [ "{name} wakes up to the sound of a noisy construction site outside his window.", "{name} gets out of bed and heads to the kitchen to make himself some coffee.", "{name} realizes he forgot to buy coffee filters and starts rummaging through his moving boxes to find some.", "{name} finally finds the filters and makes himself a cup of coffee.", "The coffee tastes bitter, and {name} regrets not buying a better brand.", "{name} checks his email and sees that he has no job offers yet.", "{name} spends some time updating his resume and cover letter.", "{name} heads out to explore the city and look for job openings.", "{name} sees a sign for a job fair and decides to attend.", "The line to get in is long, and {name} has to wait for an hour.", "{name} meets several potential employers at the job fair but doesn't receive any offers.", "{name} leaves the job fair feeling disappointed.", "{name} stops by a local diner to grab some lunch.", "The service is slow, and {name} has to wait for 30 minutes to get his food.", "{name} overhears a conversation at the next table about a job opening.", "{name} asks the diners about the job opening and gets some information about the company.", "{name} decides to apply for the job and sends his resume and cover letter.", "{name} continues his search for job openings and drops off his resume at several local businesses.", "{name} takes a break from his job search to go for a walk in a nearby park.", "A dog approaches and licks {name}'s feet, and he pets it for a few minutes.", "{name} sees a group of people playing frisbee and decides to join in.", "{name} has fun playing frisbee but gets hit in the face with the frisbee and hurts his nose.", "{name} goes back to his apartment to rest for a bit.", "A raccoon tore open the trash bag outside his apartment, and the garbage is all over the floor.", "{name} starts to feel frustrated with his job search.", "{name} calls his best friend to vent about his struggles.", "{name}'s friend offers some words of encouragement and tells him to keep trying.", "{name} feels slightly better after talking to his friend.", ]) # Let's send Tommie on their way. We'll check in on their summary every few observations to watch it evolve # Interview agent print(interview_agent(tommie, "Tell me about how your day has been going")[-1]) print(interview_agent(tommie, "How do you feel about coffee?")[-1]) print(interview_agent(tommie, "Tell me about your childhood dog!")[-1]) agent_observes(eve, [ "{name} overhears her colleague say something about a new client being hard to work with", "{name} wakes up and hear's the alarm", "{name} eats a boal of porridge", "{name} helps a coworker on a task", "{name} plays tennis with her friend Xu before going to work", "{name} overhears her colleague say something about Tommie being hard to work with", ]) print(interview_agent(eve, "How are you feeling about today?")[-1]) print(interview_agent(eve, "What do you know about Tommie?")[-1]) print(interview_agent(eve, "Tommie is looking to find a job. What are are some things you'd like to ask him?")[-1]) print(interview_agent(eve, "You'll have to ask him. He may be a bit anxious, so I'd appreciate it if you keep the conversation going and ask as many questions as possible.")[-1]) run_conversation([tommie, eve], "Tommie said: Hi, Eve. Thanks for agreeing to meet with me today. I have a bunch of questions and am not sure where to start. Maybe you could first share about your experience?") print(get_summary(tommie, force_refresh=True)) print(get_summary(eve, force_refresh=True)) print(interview_agent(tommie, "How was your conversation with Eve?")[-1]) print(interview_agent(eve, "How was your conversation with Tommie?")[-1]) print(interview_agent(eve, "What do you wish you would have said to Tommie?")[-1])