feat: solution for 6a047c6ca6fe2e4ac16b35b0

This commit is contained in:
@@ -0,0 +1,74 @@
from typing import TypedDict, Optional
from langgraph.graph import StateGraph, START, END
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.types import Command, interrupt
from langchain_openai import ChatOpenAI
from pydantic import SecretStr
class GraphState(TypedDict):
human_value: Optional[str] = None
llm = ChatOpenAI(
model="openai/gpt-oss-20b",
base_url='https://platform.brojs.ru/jrnl-bh/api/inference/v1',
api_key=SecretStr("jrnl_30283ab953615cbb6846ff9940a1eedce0b76d7b2f59a2394f29e74643e6a90d"),
temperature=0.7,
)
def ask(state: GraphState) -> Command:
# Trigger an interrupt with a question and options
return interrupt(
type="question",
question="Choose your favorite color:",
options=["red", "green", "blue"],
)
# Build the graph
builder = StateGraph(GraphState)
builder.add_node("ask", ask)
# Set entry point correctly (only one argument node name)
builder.set_entry_point("ask")
# Define edges
builder.add_edge(START, "ask")
builder.add_edge("ask", END)
# Add a checkpoint
checkpoint = InMemorySaver()
graph = builder.compile(checkpointer=checkpoint)
def main():
state: GraphState = {"human_value": None}
while True:
result = graph.invoke(state)
# If the graph finished without interruption
if "messages" in result and not any(
getattr(msg, "type", "") == "__interrupt__" for msg in result["messages"]
):
print("Graph finished. Result:", state)
break
# Handle interrupt
for msg in result["messages"]:
if getattr(msg, "type", "") == "__interrupt__":
question = msg.content.get("question")
options = msg.content.get("options")
print(question)
for i, opt in enumerate(options, 1):
print(f"{i}. {opt}")
choice_idx = int(input("Select option number: ")) - 1
state["human_value"] = options[choice_idx]
# Resume the graph with updated state
# The resume is implicit by invoking again after setting the value
break
if __name__ == "__main__":
main()