LangGraph 智能体状态管理与决策

LangGraph 智能体状态管理与决策

LangGraph 智能体状态管理与决策


请添加图片描述

🌌你好!这里是 晓雨的笔记本在所有感兴趣的领域扩展知识,感谢你的陪伴与支持~👋 欢迎添加文末好友,不定期掉落福利资讯


写在最前面

版权声明:本文为原创,遵循 CC 4.0 BY-SA 协议。转载请注明出处。

本次演示围绕 Bright Data Web MCP 与 LangGraph 的集成实操 展开,完整展示了从获取大模型 API Key、创建大模型会话,到获取 Bright Data API Key、通过 MultiServerMCPClient 连接 Web MCP 服务器,并在 Bright Data 后台进一步启用浏览器自动化工具、扩展智能体可调用能力的全流程;同时结合 LangGraph 的 StateGraph,搭建了包含大模型节点、工具调用节点和路由规则节点的循环式 AI 研究智能体。演示过程中,通过“打开网页并持续滚动,直到提取 30 条语录的作者、内容与标签”这一实际任务,直观呈现了智能体基于实时网页数据进行搜索、抓取、交互和推理的完整效果。实测结果表明,LangGraph 提供了清晰可控的智能体状态管理与决策机制,而 Bright Data Web MCP 则补足了真实网页访问与动态页面交互能力,使 AI Agent 无需将复杂抓取逻辑硬编码进提示词或业务代码中,也能更稳定地完成生产级研究任务。

赠送25美金的注册链接

LangGraph 智能体状态管理与决策

 from __future__ import annotations import argparse import asyncio import json import os import sys from typing import Any, Literal from urllib.parse import urlencode from dotenv import load_dotenv from langchain_core.messages import HumanMessage, SystemMessage, ToolMessage from langchain_openai import ChatOpenAI from langchain_mcp_adapters.client import MultiServerMCPClient from langgraph.graph import END, START, MessagesState, StateGraph # webmcp-langgraph-demo.py file SYSTEM_PROMPT ="""You are a web research assistant. Task: - Research the user's topic using Google search results and a few sources. - Return 6–10 simple bullet points. - Add a short "Sources:" list with only the URLs you used. How to use tools: - First call the search tool to get Google results. - Select 3–5 reputable results and scrape them. - If scraping fails, try a different result. Constraints: - Use at most 5 sources. - Prefer official docs or primary sources. - Keep it quick: no deep crawling. """ def make_llm_call_node(llm_with_tools): async def llm_call(state: MessagesState): messages = [SystemMessage(content=SYSTEM_PROMPT)] + state["messages"] ai_message = await llm_with_tools.ainvoke(messages) return {"messages": [ai_message]} return llm_call def make_tool_node(tools_by_name: dict): async def tool_node(state: MessagesState): last_ai_msg = state["messages"][-1] tool_results = [] for tool_call in last_ai_msg.tool_calls: tool = tools_by_name.get(tool_call["name"]) if not tool: tool_results.append( ToolMessage( content=f"Tool not found: {tool_call['name']}", tool_call_id=tool_call["id"], ) ) continue # MCP tools are typically async observation = ( await tool.ainvoke(tool_call["args"]) if hasattr(tool, "ainvoke") else tool.invoke(tool_call["args"]) ) tool_results.append( ToolMessage( content=str(observation), tool_call_id=tool_call["id"], ) ) return {"messages": tool_results} return tool_node def should_continue(state: MessagesState) -> Literal["tool_node", END]: last_message = state["messages"][-1] if getattr(last_message, "tool_calls", None): return "tool_node" return END async def main(): # Load environment variables from .env load_dotenv() # Read Bright Data token bd_token = os.getenv("BRIGHTDATA_TOKEN") if not bd_token: raise ValueError("Missing BRIGHTDATA_TOKEN") # Connect to Bright Data Web MCP server client = MultiServerMCPClient({ "bright_data": { "url": f"https://mcp.brightdata.com/mcp?token={bd_token}", "transport": "streamable_http", } }) #&groups=advanced_scraping,browser # Fetch all available MCP tools (search, scrape, etc.) tools = await client.get_tools() tools_by_name = {tool.name: tool for tool in tools} print(f"Available tools: {list(tools_by_name.keys())}") # Debug: print available tool names # Initialize the LLM and allow it to call MCP tools openai_api_key = os.getenv("OPENAI_API_KEY") llm = ChatOpenAI(model="gpt-4o-all", temperature=0, api_key=openai_api_key, base_url="https://poloapi.top/v1",) llm_with_tools = llm.bind_tools(tools) # Build the LangGraph agent graph = StateGraph(MessagesState) graph.add_node("llm_call", make_llm_call_node(llm_with_tools)) graph.add_node("tool_node", make_tool_node(tools_by_name)) # Graph flow: # START → LLM → (tools?) → LLM → END graph.add_edge(START, "llm_call") graph.add_conditional_edges("llm_call", should_continue, ["tool_node", END]) graph.add_edge("tool_node", "llm_call") agent = graph.compile() # Example research query topic = "使用工具访问https://quotes.toscrape.com/scroll,想办法拿到30条quotes提取 quote、author、tags" # You can change this topic as needed # Run the agent result = await agent.ainvoke( { "messages": [ HumanMessage(content=f"Research this topic:\n{topic}") ] }, # Prevent infinite loops config={"recursion_limit": 50} ) # Print the final response print(result["messages"][-1].content) if __name__ == "__main__": asyncio.run(main())

hello,这里是 晓雨的笔记本 。如果你喜欢我的文章,欢迎三连给我鼓励和支持:👍点赞 📁 关注 💬评论,我会给大家带来更多有用有趣的文章。
原文链接 👉 ,⚡️更新更及时。

欢迎大家点开下面名片,添加好友交流。

Read more

AI 前端到底是什么?为什么说AI前端是未来趋势?

AI 前端到底是什么?为什么说AI前端是未来趋势?

⭐ 一、AI 前端和普通前端有什么区别? 下面是一张非常直观的对比: 内容普通前端AI 前端功能核心UI 展示 + 用户交互UI 展示 + 用户交互 + 智能内容生成与后端交互调用普通 REST API调用 大模型 API / AI 服务输出形式页面固定页面可动态生成 / 布局可变化原型制作Figma → 人工写页面Figma → AI 自动生成代码前端逻辑手写逻辑部分逻辑由 AI 执行(智能体 UI)用户体验按钮 + 表单对话式 UI / 多模态交互技术要求JS / Vue / ReactJS + AI SDK + Prompt + 多模态理解能力 一句话: 👉 普通前端 = 静态 UI 👉 AI 前端 = 会思考的 UI ⭐ 二、AI 前端需要学习哪些技术? AI 前端不是新语言,而是 前端

By Ne0inhk
零代码接入:DMXAPI+Next-Web搭建私人AI助手

零代码接入:DMXAPI+Next-Web搭建私人AI助手

欢迎来到小灰灰的博客空间!Weclome you! 博客主页:IT·小灰灰 爱发电:小灰灰的爱发电 热爱领域:前端(HTML)、后端(PHP)、人工智能、云服务 目录 核心方案:为什么是 DMXAPI + Next-Web? 1. 后端引擎:DMXAPI——一个Key,连接全世界 2. 前端应用:Next-Web——最美的“外壳” 实战搭建:三步拥有私人AI助手 第一步:注册DMXAPI,获取“万能钥匙” 第二步:一键部署Next-Web(Vercel无服务器部署) 第三步:绑定自定义域名与配置模型 进阶玩法:让助手更“私人” 结语 在2026年的今天,大模型已经不再是极客手中的技术玩具,而是逐渐演变为像电力一样的基础设施。然而,对于大多数普通用户乃至创业者来说,

By Ne0inhk

Jetbrains系列工具 Idea Websotrm中使用Claude Code 可白嫖

市面上很多AI工具都是基于vsCode 习惯Idea的用户使用起来会特别别扭 本文将展示idea中如何使用ClaudeCode 1. 注册api (二选一) 1. 智普AI国内转发 GLM-4.6 地址: 直达链接 价格: 首年200+ 2. 硅基流动 地址: 直达链接 白嫖模型: Qwen/Qwen3-8B 配置: {"env":{"ANTHROPIC_AUTH_TOKEN":"sk-xxx","ANTHROPIC_BASE_URL":"https://api.siliconflow.cn","ANTHROPIC_DEFAULT_HAIKU_MODEL"

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 jaspr 为鸿蒙端开启极速渲染的现代 Web 开发新范式(Dart Web 框架首选)

Flutter for OpenHarmony: Flutter 三方库 jaspr 为鸿蒙端开启极速渲染的现代 Web 开发新范式(Dart Web 框架首选)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 开发时,我们偶尔需要跳出原生的 HAP 容器,寻找更轻量、更适合在移动端 Web 加载的方案。虽然 Flutter Web 极其强大,但其生成的 Canvas/Wasm 产物体积巨大,在鸿蒙系统加载较慢。是否存在一种方案,既能使用 Dart 的声明式开发体验,又能产出纯正、轻量的 HTML/CSS/JS 节点? jaspr 就是这个问题的终极答案。它是一个模仿 Flutter 语法、但专注于渲染原生 Web DOM 的现代框架。通过 Jaspr,鸿蒙开发者可以利用熟悉的 Widget、Component 和生命周期,

By Ne0inhk