阿里云百炼的通义千问系列模型支持 Anthropic API 兼容接口。通过修改以下参数,即可将原有的 Anthropic 应用迁移至阿里云百炼。https://help.aliyun.com/zh/model-studio/anthropic-
api-messages

加入条件分支(Conditional Edge)
根据 LLM 返回内容决定走 “A 工具” 还是 “B 工具”

条件分支
Claude 先判断用户问的是“数学题”还是“其他问题

  • 数学题 → 走 calc_node(用 Python 算答案)

  • 其他 → 走 chat_node(直接让 Claude 回答)

# cond_demo.py
import os, getpass, re
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langchain_anthropic import ChatAnthropic

if not (key := os.getenv("ANTHROPIC_API_KEY")):
    # os.environ["ANTHROPIC_API_KEY"] = getpass.getpass("ANTHROPIC_API_KEY: ")
    os.environ["ANTHROPIC_API_KEY"] = 'sk-3ad75cfac6b****9ab00f8d3d473b2a'
    os.environ['ANTHROPIC_BASE_URL'] = 'https://dashscope.aliyuncs.com/apps/anthropic'

# ---------------- 1. 状态结构 ----------------
class State(TypedDict):
    query: str
    answer: str
    route: str          # 分支标记:math | chat

# ---------------- 2. 节点 ----------------
llm = ChatAnthropic(model="qwen-plus", temperature=0)
# res = llm.invoke([{"role": "system", "content": "你只需回答一个单词:若问题是纯数学题(含四则运算、方程、几何)回答 math,否则回答 chat。"},
#                            {"role": "user",   "content": "3加3等于多少"}])
def router_node(state: State) -> State:
    """让 Claude 给 query 分类,返回路由标记"""
    sys_prompt = "你只需回答一个单词:若问题是纯数学题(含四则运算、方程、几何)回答 math,否则回答 chat。"
    response = llm.invoke([{"role": "system", "content": sys_prompt},
                           {"role": "user",   "content": state["query"]}])
    return {"route": response.content.strip().lower()}

def calc_node(state: State) -> State:
    """提取算式并计算"""
    expr = re.search(r"[\d\s\+\-\*\/\(\)\.]+", state["query"])
    if expr:
        try:
            ans = eval(expr.group())
            return {"answer": f"计算结果:{ans}"}
        except Exception as e:
            return {"answer": f"计算出错:{e}"}
    return {"answer": "未识别到算式"}

def chat_node(state: State) -> State:
    """普通对话"""
    response = llm.invoke(state["query"])
    return {"answer": response.content}

# ---------------- 3. 条件分支函数 ----------------
def route_rule(state: State) -> str:
    return state["route"]

# ---------------- 4. 建图 ----------------
builder = StateGraph(State)
builder.add_node("router", router_node)
builder.add_node("calc",  calc_node)
builder.add_node("chat",  chat_node)

builder.add_edge(START, "router")
# 关键:条件边
builder.add_conditional_edges(
    "router",
    route_rule,
    {"math": "calc", "chat": "chat"}   # 映射表
)
builder.add_edge("calc", END)
builder.add_edge("chat", END)

graph = builder.compile()

# ---------------- 5. 测试 ----------------
if __name__ == "__main__":
    q = "123 * 456 + 78 等于多少?"
    print("问题:", q)
    result = graph.invoke({"query": q, "route": ""})
    print("答案:", result["answer"])

    # 再试一个开放问题
    q2 = "LangGraph 是什么?"
    print("\n问题:", q2)
    result2 = graph.invoke({"query": q2, "route": ""})
    print("答案:", result2["answer"])

    # 导出流程图
    with open("cond_graph.png", "wb") as f:
        f.write(graph.get_graph().draw_mermaid_png())
    print("\n条件分支流程图已保存为 cond_graph.png")

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐