1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| import os from typing import Literal, TypedDict
from dotenv import load_dotenv from langchain.chat_models import init_chat_model from langchain.messages import HumanMessage, SystemMessage from langgraph.graph import END, START, StateGraph from pydantic import BaseModel, Field from rich import print as rprint
load_dotenv() model = init_chat_model( "openai:ark-code-latest", temperature=0, api_key=os.environ["OPENAI_API_KEY"], base_url=os.environ["OPENAI_BASE_URL"], )
class Route(BaseModel): step: Literal["poem", "story", "joke"] = Field(description="下一执行步骤")
router_llm = model.with_structured_output(Route)
class OverAllState(TypedDict): input: str decision: str output: str
def model_call_router(state: OverAllState) -> OverAllState: decision = router_llm.invoke( [ SystemMessage( content="根据请求路由到 story、joke 或 poem。" ), HumanMessage(content=state["input"]), ] ) return {"decision": decision.step}
def write_story(state: OverAllState) -> OverAllState: return {"output": model.invoke([HumanMessage(content=state["input"])]).content}
def write_joke(state: OverAllState) -> OverAllState: return {"output": model.invoke([HumanMessage(content=state["input"])]).content}
def write_poem(state: OverAllState) -> OverAllState: return {"output": model.invoke([HumanMessage(content=state["input"])]).content}
def route_decision(state: OverAllState) -> Literal["write_story", "write_joke", "write_poem"]: mapping = {"story": "write_story", "joke": "write_joke", "poem": "write_poem"} return mapping[state["decision"]]
builder = StateGraph(state_schema=OverAllState) builder.add_node("model_call_router", model_call_router) builder.add_node("write_story", write_story) builder.add_node("write_joke", write_joke) builder.add_node("write_poem", write_poem) builder.add_edge(START, "model_call_router") builder.add_conditional_edges( "model_call_router", route_decision, { "write_story": "write_story", "write_joke": "write_joke", "write_poem": "write_poem", }, ) builder.add_edge("write_story", END) builder.add_edge("write_joke", END) builder.add_edge("write_poem", END) graph = builder.compile() rprint(graph.invoke({"input": "写一个关于猫的诗"})["output"])
|