From ac148bd401e30ae5043b4d96d7906a5fbf583ac5 Mon Sep 17 00:00:00 2001 From: Jo Booth Date: Mon, 4 Mar 2024 18:14:16 -0500 Subject: [PATCH 1/3] Add corgi adventure example --- examples/corgi_adventure/README.md | 8 ++ examples/corgi_adventure/application.py | 142 ++++++++++++++++++++++ examples/corgi_adventure/requirements.txt | 2 + 3 files changed, 152 insertions(+) create mode 100644 examples/corgi_adventure/README.md create mode 100644 examples/corgi_adventure/application.py create mode 100644 examples/corgi_adventure/requirements.txt diff --git a/examples/corgi_adventure/README.md b/examples/corgi_adventure/README.md new file mode 100644 index 00000000..069093c0 --- /dev/null +++ b/examples/corgi_adventure/README.md @@ -0,0 +1,8 @@ +A simple text-based game in the style of 80s adventure games, in which you play +a hungry corgi. + +How to run: + +``` +OPENAI_API_KEY= python application.py +``` diff --git a/examples/corgi_adventure/application.py b/examples/corgi_adventure/application.py new file mode 100644 index 00000000..86a50b7c --- /dev/null +++ b/examples/corgi_adventure/application.py @@ -0,0 +1,142 @@ +from typing import List, Optional, Tuple + +import burr.core +from burr.core import Application, State, default, when +from burr.core.action import action +from burr.lifecycle import LifecycleAdapter +from openai import Client +import json + + +RESTRICTIONS = """You're a small corgi with short legs. You can't jump high, + you can't run fast, you can't perform feats of athleticism in general + to achieve any of your goals. You can't open doors, you can't use tools, + you can't communicate with humans, you can't use your paws to manipulate + objects, you can't use your mouth to manipulate objects, you can't use + your mouth to communicate with humans""" + + +challenges = [ + "There is a dish of dog food on the floor. You want to eat it", + "There is a dish of dog food on a table. You want to eat it", + "There is a dish of dog food in a locked car. You want to eat it", +] + + +@action(reads=[], writes=["current_challenge"]) +def start(state: State) -> Tuple[dict, State]: + result = {"current_challenge": challenges[0]} + return result, state.update(**result) + + +@action(reads=["current_challenge"], writes=["attempts"]) +def prompt_for_challenge(state: State) -> Tuple[dict, State]: + response = input(f'{state["current_challenge"]}. What do you do?\n $ ') + result = {"attempt": response} + return result, state.append(attempts=result["attempt"]) + + +@action( + reads=["attempts", "current_challenge"], + writes=["challenge_solved", "what_happened"], +) +def evaluate_attempt(state: State) -> Tuple[dict, State]: + + result = Client().chat.completions.create( + model="gpt-4", + messages=[ + { + "role": "system", + "content": f"""You are evaluating responses for + whether they constitute solutions to the provided challenge in a text + based game, whose protagonist is a dog subject to the following limitations: + {RESTRICTIONS}. You respond ONLY with a json object containing two fields: "solved", which is a + boolean indicating whether the challenge was solved by the attempt, and "what_happened", + which is a string containing a brief narrative, written in the second person and addressed + to the player, of what happened during the protagonist's attempt""", + }, + { + "role": "user", + "content": f"The current challenge is: {state['current_challenge']} " + f"and the player's attempt is: {state['attempts'][-1]}", + }, + ], + ) + content = result.choices[0].message.content + try: + json_result = json.loads(content) + except json.JSONDecodeError as e: + print("bad json: ", content) + json_result = {"solved": False, "what_happened": "Not sure, really. I'm a dog. I can't read json. I can't read at all."} + + result = {"challenge_solved": json_result["solved"], "txt_result": content} + + return result, state.update( + challenge_solved=result["challenge_solved"], + what_happened=json_result["what_happened"], + ) + + +@action( + reads=["challenge_solved", "current_challenge", "what_happened"], + writes=["current_challenge", "did_win"], +) +def maybe_progress(state: State) -> Tuple[dict, State]: + print("What happened:", state["what_happened"]) + if state["challenge_solved"]: + if state["current_challenge"] == challenges[-1]: + result = {"did_win": True} + else: + result = { + "current_challenge": challenges[ + challenges.index(state["current_challenge"]) + 1 + ] + } + else: + result = {"current_challenge": state["current_challenge"]} + return result, state.update(**result) + + +@action(reads=["challenges"], writes=[]) +def win(state: State) -> Tuple[dict, State]: + # get summary of actions taken from openai + print("you won") + return {}, state + + +def application( + app_id: Optional[str] = None, + storage_dir: Optional[str] = "~/.burr", + hooks: Optional[List[LifecycleAdapter]] = None, +) -> Application: + return ( + burr.core.ApplicationBuilder() + .with_state(did_win=False) + .with_actions( + start=start, + prompt_for_challenge=prompt_for_challenge, + evaluate_attempt=evaluate_attempt, + maybe_progress=maybe_progress, + win=win, + ) + .with_transitions( + ("start", "prompt_for_challenge", default), + ("prompt_for_challenge", "evaluate_attempt", default), + ("evaluate_attempt", "maybe_progress", default), + ("maybe_progress", "win", when(did_win=True)), + ("maybe_progress", "prompt_for_challenge", default), + ) + .with_entrypoint("start") + .with_tracker( + "Dog Adventure", params={"app_id": app_id, "storage_dir": storage_dir} + ) + .build() + ) + + +if __name__ == "__main__": + app = application() + app.visualize( + output_file_path="digraph", include_conditions=True, view=False, format="png" + ) + action, state, result = app.run(halt_after=["win"]) diff --git a/examples/corgi_adventure/requirements.txt b/examples/corgi_adventure/requirements.txt new file mode 100644 index 00000000..de72653a --- /dev/null +++ b/examples/corgi_adventure/requirements.txt @@ -0,0 +1,2 @@ +burr +openai From d27ddfbaa91822f1d0866a5980e1537afda947dd Mon Sep 17 00:00:00 2001 From: Jo Booth Date: Tue, 5 Mar 2024 00:43:14 -0500 Subject: [PATCH 2/3] cr feedback --- docs/examples/simple.rst | 1 + examples/corgi_adventure/README.md | 2 ++ examples/corgi_adventure/application.py | 2 +- examples/corgi_adventure/digraph.png | Bin 0 -> 21410 bytes 4 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 examples/corgi_adventure/digraph.png diff --git a/docs/examples/simple.rst b/docs/examples/simple.rst index 72740074..d8c40355 100644 --- a/docs/examples/simple.rst +++ b/docs/examples/simple.rst @@ -4,3 +4,4 @@ Simple examples - `cowsay `_ - `counter `_ +- `corgi adventure `_ diff --git a/examples/corgi_adventure/README.md b/examples/corgi_adventure/README.md index 069093c0..21ed72cc 100644 --- a/examples/corgi_adventure/README.md +++ b/examples/corgi_adventure/README.md @@ -6,3 +6,5 @@ How to run: ``` OPENAI_API_KEY= python application.py ``` + +![State Machine](digraph.png) diff --git a/examples/corgi_adventure/application.py b/examples/corgi_adventure/application.py index 86a50b7c..9bbad56e 100644 --- a/examples/corgi_adventure/application.py +++ b/examples/corgi_adventure/application.py @@ -128,7 +128,7 @@ def application( ) .with_entrypoint("start") .with_tracker( - "Dog Adventure", params={"app_id": app_id, "storage_dir": storage_dir} + "demo:corgi_adventure", params={"app_id": app_id, "storage_dir": storage_dir} ) .build() ) diff --git a/examples/corgi_adventure/digraph.png b/examples/corgi_adventure/digraph.png new file mode 100644 index 0000000000000000000000000000000000000000..441081d928061eefb2deb64b7771f3cb264a47e8 GIT binary patch literal 21410 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%0D_uedC$VNl(H_RCE9aIi5%?1aKJ{JQ+@b4 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 qvjzVJjOy;PM!lQcqE0*VJ?L?f&9zj Date: Tue, 5 Mar 2024 00:54:45 -0500 Subject: [PATCH 3/3] run precommit --- examples/corgi_adventure/application.py | 26 +++++++++++-------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/examples/corgi_adventure/application.py b/examples/corgi_adventure/application.py index 9bbad56e..0230474c 100644 --- a/examples/corgi_adventure/application.py +++ b/examples/corgi_adventure/application.py @@ -1,12 +1,12 @@ +import json from typing import List, Optional, Tuple +from openai import Client + import burr.core from burr.core import Application, State, default, when from burr.core.action import action from burr.lifecycle import LifecycleAdapter -from openai import Client -import json - RESTRICTIONS = """You're a small corgi with short legs. You can't jump high, you can't run fast, you can't perform feats of athleticism in general @@ -41,7 +41,6 @@ def prompt_for_challenge(state: State) -> Tuple[dict, State]: writes=["challenge_solved", "what_happened"], ) def evaluate_attempt(state: State) -> Tuple[dict, State]: - result = Client().chat.completions.create( model="gpt-4", messages=[ @@ -65,9 +64,12 @@ def evaluate_attempt(state: State) -> Tuple[dict, State]: content = result.choices[0].message.content try: json_result = json.loads(content) - except json.JSONDecodeError as e: + except json.JSONDecodeError: print("bad json: ", content) - json_result = {"solved": False, "what_happened": "Not sure, really. I'm a dog. I can't read json. I can't read at all."} + json_result = { + "solved": False, + "what_happened": "Not sure, really. I'm a dog. I can't read json. I can't read at all.", + } result = {"challenge_solved": json_result["solved"], "txt_result": content} @@ -88,9 +90,7 @@ def maybe_progress(state: State) -> Tuple[dict, State]: result = {"did_win": True} else: result = { - "current_challenge": challenges[ - challenges.index(state["current_challenge"]) + 1 - ] + "current_challenge": challenges[challenges.index(state["current_challenge"]) + 1] } else: result = {"current_challenge": state["current_challenge"]} @@ -127,16 +127,12 @@ def application( ("maybe_progress", "prompt_for_challenge", default), ) .with_entrypoint("start") - .with_tracker( - "demo:corgi_adventure", params={"app_id": app_id, "storage_dir": storage_dir} - ) + .with_tracker("demo:corgi_adventure", params={"app_id": app_id, "storage_dir": storage_dir}) .build() ) if __name__ == "__main__": app = application() - app.visualize( - output_file_path="digraph", include_conditions=True, view=False, format="png" - ) + app.visualize(output_file_path="digraph", include_conditions=True, view=False, format="png") action, state, result = app.run(halt_after=["win"])