Langgraph_通过playwright mcp执行自动化

python 复制代码
from langchain_core.messages import HumanMessage
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langchain_mcp_adapters.tools import load_mcp_tools
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from langchain_openai import ChatOpenAI
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.prebuilt import ToolNode
import asyncio
import os
from dotenv import load_dotenv
'''
    执行脚本时需要确定api_key是否有效
'''
load_dotenv("../.env")
api_key = os.getenv("API_KEY")


# 定义状态
class MyState(TypedDict):
    messages: Annotated[list, add_messages]

# 定义 agent 结点
def agent(state: MyState) -> MyState:
    return {"messages": [model.invoke(state["messages"])]}

# LLM 是否调用工具
def is_call_tools(state: MyState) -> bool:
    last_message = state["messages"][-1]
    if last_message.tool_calls:
        return True
    return False

# 定义 mcp server 参数
mcp_server_param = [
    StdioServerParameters(
        command="npx",
        args=["@playwright/mcp@latest"],
        env=None
    )
]

# 声明模型
model = ChatOpenAI(
    model_name="Qwen3-Coder-Plus",  # deepseek-chat
    openai_api_key=api_key, # 填写 api-key
    openai_api_base="https://apis.iflow.cn/v1" # 填写 base-url,https://api.deepseek.com
)

async def main():
    try:
        async with stdio_client(mcp_server_param[0]) as (read, write):
            async with ClientSession(read, write) as session:
                # 绑定工具
                await session.initialize()
                tools = await load_mcp_tools(session)
                print("tools:", [tool.name for tool in tools])
                global model
                model = model.bind_tools(tools)

                # 定义图结构
                workflow = StateGraph(MyState)
                workflow.add_node("agent", agent)
                workflow.add_node("tools", ToolNode(tools=tools))
                workflow.add_edge(START, "agent")
                workflow.add_conditional_edges("agent", is_call_tools, {
                    True: "tools",
                    False: END
                })
                workflow.add_edge("tools", "agent")

                # 构建图
                graph = workflow.compile()
                # 调用图
                baidu_state = await graph.ainvoke({"messages": [HumanMessage("打开百度首页,然后搜索ai agent")]})
                print("Baidu result:", baidu_state['messages'][-1].content)

    except Exception as e:
        print(f"Error occurred: {e}")
        # Handle the exception gracefully


if __name__ == '__main__':
    asyncio.run(main())

说明: 执行脚本时若打开浏览器即关闭,出现 Error occurred: unhandled errors in a TaskGroup (1 sub-exception),则执行pip install playwright即可解决

复制代码
相关推荐
华玥作者5 小时前
[特殊字符] VitePress 对接 Algolia AI 问答(DocSearch + AI Search)完整实战(下)
前端·人工智能·ai
AAD555888995 小时前
YOLO11-EfficientRepBiPAN载重汽车轮胎热成像检测与分类_3
人工智能·分类·数据挖掘
王建文go5 小时前
RAG(宠物健康AI)
人工智能·宠物·rag
ALINX技术博客6 小时前
【202601芯动态】全球 FPGA 异构热潮,ALINX 高性能异构新品预告
人工智能·fpga开发·gpu算力·fpga
易营宝6 小时前
多语言网站建设避坑指南:既要“数据同步”,又能“按市场个性化”,别踩这 5 个坑
大数据·人工智能
春日见6 小时前
vscode代码无法跳转
大数据·人工智能·深度学习·elasticsearch·搜索引擎
Drgfd7 小时前
真智能 vs 伪智能:天选 WE H7 Lite 用 AI 人脸识别 + 呼吸灯带,重新定义智能化充电桩
人工智能·智能充电桩·家用充电桩·充电桩推荐
萤丰信息7 小时前
AI 筑基・生态共荣:智慧园区的价值重构与未来新途
大数据·运维·人工智能·科技·智慧城市·智慧园区
盖雅工场7 小时前
排班+成本双管控,餐饮零售精细化运营破局
人工智能·零售餐饮·ai智能排班
神策数据7 小时前
打造 AI Growth Team: 以 Data + AI 重塑品牌零售增长范式
人工智能·零售