from langgraph.graph import StateGraph,START,  END
from typing_extensions import TypedDict

class State(TypedDict):
    x: int
    query:str
    answer:str

#函数节点本质上就是一个通用的python函数
def add(state):
    print("*"*80)
    print("before add:"+str(state))
    state["y"] = state["x"]+1
    print("after add:" + str(state))

#工具节点的作用是封装外部工具或API
def get_weather(city: str) -> str:
    """Get weather for a given city."""
    return f"{city}今天气温36.5摄氏度，西南风三级!"

#大模型节点调用大模型生成结果，如果需要使用工具，可以调用时加以说明
from langgraph.prebuilt import create_react_agent
from langchain_ollama import ChatOllama

llm = ChatOllama(model="qwen2.5:7b", temperature=0.6)

def configLLM(state):
    agent = create_react_agent(
        model=llm,
        #这里说明可以使用的工具
        tools=[get_weather],
        prompt="You are a helpful assistant"
    )
    #调用大模型
    result = agent.invoke(
        {"messages": [{"role": "user", "content": state["query"]}]}
    )
    state["answer"] = result["messages"][-1].content
    return state

def buildGraph():
    graphBuilder = StateGraph(State)

    #在图里添加一个节点
    graphBuilder.add_node("add", add)

    graphBuilder.add_edge(START,"add")
    graphBuilder.add_edge("add", END)

    graph = graphBuilder.compile()
    return graph

def buildGraph2():
    graphBuilder = StateGraph(State)

    # 在图里添加一个节点
    graphBuilder.add_node("configLLM", configLLM)

    graphBuilder.add_edge(START, "configLLM")
    graphBuilder.add_edge("configLLM", END)

    graph = graphBuilder.compile()
    return graph

def testGraph1():
    graph = buildGraph()

    from courseCode import showGraph
    showGraph.showGraphInCode(graph, "node1.jpg")

    # 实例化状态
    state: State = {'x': 2}
    result = graph.invoke(state)
    print(state)

def testGraph2():
    graph = buildGraph2()
    from courseCode import showGraph
    showGraph.showGraphInCode(graph, "node2.jpg")

    # 实例化状态
    state: State = {'query': '北京的天气怎么样？'}
    result = graph.invoke(state)
    print(result)

if __name__ == "__main__":
    #testGraph1()
    testGraph2()