From 96350d85b8281c7b6e7d74e8230f6fb380c76e1e Mon Sep 17 00:00:00 2001 From: elijahbenizzy Date: Fri, 9 Feb 2024 12:00:37 -0800 Subject: [PATCH] Improves the examples so they're fully runnable Adds READMEs with basic instructions. --- burr/integrations/streamlit.py | 12 ++++++--- examples/counter/README.md | 25 +++++++++++++++++++ examples/counter/application.py | 2 +- examples/counter/digraph.png | Bin 0 -> 9095 bytes examples/counter/streamlit_app.py | 22 ++++++++++++---- examples/cowsay/README.md | 28 +++++++++++++++++++++ examples/cowsay/application.py | 2 +- examples/cowsay/digraph.png | Bin 0 -> 19563 bytes examples/gpt/README.md | 40 ++++++++++++++++++++++++++++++ examples/gpt/application.py | 5 +--- examples/gpt/digraph.png | Bin 0 -> 47943 bytes examples/gpt/requirements.txt | 2 ++ 12 files changed, 123 insertions(+), 15 deletions(-) create mode 100644 examples/counter/README.md create mode 100644 examples/counter/digraph.png create mode 100644 examples/cowsay/README.md create mode 100644 examples/cowsay/digraph.png create mode 100644 examples/gpt/README.md create mode 100644 examples/gpt/digraph.png create mode 100644 examples/gpt/requirements.txt diff --git a/burr/integrations/streamlit.py b/burr/integrations/streamlit.py index 7a314e3a2..8b4ab70fa 100644 --- a/burr/integrations/streamlit.py +++ b/burr/integrations/streamlit.py @@ -55,9 +55,11 @@ def prior_actions(self) -> List[str]: return out @property - def next_action(self) -> str: + def next_action(self) -> Optional[str]: if self.display_index < len(self.history) - 1: return self.history[self.display_index + 1].action + if self.app.get_next_action() is None: + return None return self.app.get_next_action().name # return the future one @property @@ -122,9 +124,11 @@ def lighten_color(color, amount=0.5): lightened_color = colorsys.hls_to_rgb(c[0], 1 - amount * (1 - c[1]), c[2]) return mc.to_hex(lightened_color) + seen = {current_node} digraph.node(current_node, fillcolor="darkgreen", style="rounded,filled", fontcolor="white") - digraph.node(next_node, fillcolor="blue", style="rounded,filled", fontcolor="white") - seen = {current_node, next_node} + if next_node is not None: + digraph.node(next_node, fillcolor="blue", style="rounded,filled", fontcolor="white") + seen.add(next_node) base_color = "lightblue" for i, node in enumerate(prior_nodes): if node not in seen: @@ -272,7 +276,7 @@ def stringify(i): # TODO -- consider a callback here instead app_state.display_index = current_node_index - with placeholder.container(height=800): + with placeholder.container(height=900): state_machine_view, step_view, data_view = st.tabs( ["Application", "Action", "State/Results"] ) diff --git a/examples/counter/README.md b/examples/counter/README.md new file mode 100644 index 000000000..495fd1b65 --- /dev/null +++ b/examples/counter/README.md @@ -0,0 +1,25 @@ +# Counter + +This is an example of a simple state machine. + +We have three files: + +- [application.py](application.py) -- This contains a mainline to run the counter as well as a function to export the counter (for later use) +- [requirements.txt](requirements.txt) -- Just the requirements. All this needs is Burr/Streamlit +- [streamlit_app.py](streamlit_app.py) -- This contains a simple Streamlit app to interact with the counter. + +To run just the application, you can run: + +```bash +python application.py +``` + +To run the streamlit app, you can run: + +```bash +streamlit run streamlit_app.py +``` + +This will open a chrome window and print out the URL. The state machine this encapsulates takes the following form: + +![State Machine](digraph.png) diff --git a/examples/counter/application.py b/examples/counter/application.py index f2ff8872f..dceba7d39 100644 --- a/examples/counter/application.py +++ b/examples/counter/application.py @@ -31,6 +31,6 @@ def application(count_up_to: int = 10, log_file: str = None): if __name__ == "__main__": app = application(log_file="counter.jsonl") state, result = app.run(until=["result"]) - app.visualize(output_file_path="counter.png", include_conditions=True, view=True) + app.visualize(output_file_path="digraph", include_conditions=True, view=True, format="png") assert state["counter"] == 10 print(state["counter"]) diff --git a/examples/counter/digraph.png b/examples/counter/digraph.png new file mode 100644 index 0000000000000000000000000000000000000000..a0d0475c2febc1aec86c6a22cedcdb6da8777da1 GIT binary patch literal 9095 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 + section[data-testid="stSidebar"] { + width: 400px !important; # Set the width to your desired value + } + + """, + unsafe_allow_html=True, + ) + st.title("Counting numbers with Burr") st.write( "This is a simple counter app. It counts to 10, then loops back to 0. You can reset it at any time. " "While we know that this is easy to do with a simple loop + streamlit, it highlights the state that Burr manages." "Use the slider to rewind/see what happened in the past, and the visualizations to understand how we navigate " "through the state machine!" ) + app_state = retrieve_state() # retrieve first so we can use for the ret of the step + columns = st.columns(2) + with columns[0]: counter_view(app_state) with st.container(height=800): md_lines = [] diff --git a/examples/cowsay/README.md b/examples/cowsay/README.md new file mode 100644 index 000000000..2fe0194eb --- /dev/null +++ b/examples/cowsay/README.md @@ -0,0 +1,28 @@ +# Cowsay + +This is an example of a simple infinite state machine. + +We have three files: + +- [application.py](application.py) -- This contains a mainline to run the cowsay app as well as a function to export the app (for later use) +- [requirements.txt](requirements.txt) -- Just the requirements. All this needs is Burr/Streamlit/cowsay +- [streamlit_app.py](streamlit_app.py) -- This contains a simple Streamlit app to interact with the cow + +To run just the application, you can run: + +```bash +python application.py +``` + +Note this is an infinte state machine, so this will run forever! Thus remember to ctrl-c eventually. +To run the streamlit app, you can run: + +```bash +streamlit run streamlit_app.py +``` + +This allows you to press a button and see the cow say something (or see it decide not to speak). + +This will open a chrome window and print out the URL. The state machine this encapsulates takes the following form: + +![State Machine](digraph.png) diff --git a/examples/cowsay/application.py b/examples/cowsay/application.py index cd85f65c5..341935eed 100644 --- a/examples/cowsay/application.py +++ b/examples/cowsay/application.py @@ -71,6 +71,6 @@ def application(in_terminal: bool = False) -> Application: if __name__ == "__main__": app = application(in_terminal=True) - app.visualize(output_file_path="cowsay.png", include_conditions=True, view=True) + app.visualize(output_file_path="digraph", include_conditions=True, view=True, format="png") while True: s, r, action = app.step() diff --git a/examples/cowsay/digraph.png b/examples/cowsay/digraph.png new file mode 100644 index 0000000000000000000000000000000000000000..348e53f90fcc8fb704d917e19258b84707974cc8 GIT binary patch literal 19563 zcmcJ%2{e{(+c$cdBC|pwiY8+yA@dXxGKI*TA`uaZLS@QOk`RStEFqMcC{l!!xlENI zV-yK}zw7_J&-?B7{l2~S{?=am`9Et_+^+k&uk$>Q<2N0`4fM5`=(*_$f?ztNtzkqE z6!QG*nG4Bu{?wJ#O-IO?kG9F(OLz zIzzb+;EvzBuX*9_`>M}%Zyp*=$5HDUva-Dh)-YnD z;h^ierD|X(-E%5oafan`a(=q#Rpu>sTIc6x`8~fSAINWI9BoM~@>il15RhQ(5L^G7 zxmJQPz?{N1!7Y-52pMnq@SC~KV&~4C+J_FQ8XB_YK6>;!xecq=aJ`(uZZkK8MslB}x%fk`k*{53XpRl)AYmDYiFE5v?b~t}5VD;ywJoCaU z*VOp+?n;Hb4OF-I?8v<5RZ3}KVxrNJb!4}zt7~tG%chSXKFspw^xceP?Ip z#@+g}yrIstlnGA8XUBJ+1Ti?FxKwhXt$;;a3vywLI1u&c;EB04uiEpc&SO`BIV751Ud!= zhAj#gSP$P39ok3V5jHV#I+9nObENTxmVp85fCm@HND0Bpw(H1!#_$_OrtAQg@2jU3$av%;{>CoPo2m?v;P0D@re~%2@}jp0Bo-&`CJpx$Crx zi^otMO?A42@Jknpg6Gdeb$6+on6TThaqYZ!z;j*E$riQKr-kM9JA!Aug=S-SA7S0N zk?Pc`Q`G_zc@ho{j9lE@0#Z`9X9OeZ=S+#=;b8+y%ZOt|C+9eVoN3Yw!tmFj{xVO0 zEjyF2=alaA-}D&y6u4IZERKp$cIb>WMAc9AJ^vm3BAfLrO=@Z?ag~gsB)y(hGbJ|%N(+EoAH1A95rPFWrd=^-cN)Gq0m$8yz$Gq1BC65FHJgD_K(ujui{DDudV!c z<-IY!3zvD3XZgIqXU00%`LViw2n+86Wy0~*t5^Jc_in&P2{917R#73pcwAF+o&G(! z;9Ivgn46p1{+jF|CeEJ7dHk5#Ab|Dz>f!(`@$lip!EY@|#6-U53^qf=_txg-mqApt z1?Rt;o^W&=njNZd>*{L!@%1f-^x)mQ+%Fp%1f-=osn#(D-n+*e!m^c_DD@iOu!Wb` z(9n?FW;m_xm-wYl=pH_-uB}b?(q1w-Ik~j!$&)7yG269lZEXV+_nmqsZ0zW`b8WHa z@6b?vD3{_zsmvoO%vM%bbir!g63^saW|UrY`_I0hmGbBauL`(0i)G=%UeUeq}CE}1__MaAaQPYyP=jEsz!m>4#S)W}Fiw?rK6yGobj zrh1A(znt@p_^#|eNNncfVkPJq7}6I%``wtFnp#h|ey&VR%FoTco~fIt_Tt40ljFyA z*Vfh^rl+fG-Qe3P@BmN$R&4A>id5`GBkWT)HrIjbdxU|LlVDkC=}jCaid1YU,? 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 hAi6dDLfCQwh?%7i)>&-lw-ET>p@aGwPt Appli if __name__ == "__main__": app = application(use_hamilton=False) - # state, result = app.run(until=["result"]) - app.visualize(output_file_path="gpt", include_conditions=False, view=True, format="png") - # assert state["counter"] == 10 - # print(state["counter"]) + app.visualize(output_file_path="digraph", include_conditions=False, view=True, format="png") diff --git a/examples/gpt/digraph.png b/examples/gpt/digraph.png new file mode 100644 index 0000000000000000000000000000000000000000..25676e1fd880e2ba10001dcf24fb8ecf79587903 GIT binary patch literal 47943 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�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 literal 0 HcmV?d00001 diff --git a/examples/gpt/requirements.txt b/examples/gpt/requirements.txt new file mode 100644 index 000000000..d75c4699a --- /dev/null +++ b/examples/gpt/requirements.txt @@ -0,0 +1,2 @@ +burr[streamlit] +openai