| import gradio as gr |
| import asyncio |
| from langgraph.graph import StateGraph, END |
|
|
|
|
| |
| class SheamiState(dict): |
| messages: list[str] |
| units_processed: int |
| units_total: int |
| process_desc: str |
|
|
|
|
| async def fn_step(state: SheamiState): |
| |
| await asyncio.sleep(0.5) |
| state["units_processed"] += 1 |
| state["process_desc"] = ( |
| f"Processing step {state['units_processed']} of {state['units_total']}" |
| ) |
| state["messages"].append(state["process_desc"]) |
| return state |
|
|
|
|
| def has_more(state: SheamiState) -> str: |
| return "continue" if state["units_processed"] < state["units_total"] else "done" |
|
|
|
|
| builder = StateGraph(SheamiState) |
| builder.add_node("step", fn_step) |
| builder.add_conditional_edges("step", has_more, {"continue": "step", "done": END}) |
| builder.set_entry_point("step") |
| app = builder.compile() |
|
|
|
|
| |
| async def run_flow(user_input: str, progress=gr.Progress()): |
| state = { |
| "messages": [], |
| "units_processed": 0, |
| "units_total": 5, |
| "process_desc": "Starting...", |
| } |
| async for s in app.astream(state, stream_mode="values"): |
| |
| print(s) |
| if s["units_total"] > 0: |
| progress((s["units_processed"], s["units_total"])) |
| yield s["messages"][0] if len(s["messages"]) > 0 else "nothing to show" |
|
|
|
|
| with gr.Blocks() as demo: |
| chatbot = gr.Textbox() |
| msg = gr.Textbox(label="Message") |
| run_btn = gr.Button("Run") |
|
|
| run_btn.click( |
| run_flow, |
| inputs=[msg], |
| outputs=[chatbot], |
| ) |
|
|
| demo.launch() |
|
|