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()
|
||||||
Reference in New Issue
Block a user