5. langgraph中的react agent使用 (从零构建一个react agent)
1. 定义 Agent 状态
首先,我们需要定义 Agent 的状态,这包括 Agent 所持有的消息。
from typing import (Annotated,Sequence,TypedDict,
)
from langchain_core.messages import BaseMessage
from langgraph.graph.message import add_messagesclass AgentState(TypedDict):messages: Annotated[Sequence[BaseMessage], add_messages]
2. 初始化模型和工具
接下来,我们初始化一个 ChatOpenAI 模型,并定义一个工具 get_weather。
from langchain_openai import ChatOpenAI
from langchain_core.tools import toolmodel = ChatOpenAI(temperature=0,model="glm-4-plus",openai_api_key="your_api_key",openai_api_base="https://open.bigmodel.cn/api/paas/v4/"
)@tool
def get_weather(location: str):"""Call to get the weather from a specific location."""# This is a placeholder for the actual implementation# Don't let the LLM know this though 😊if any([city in location.lower() for city in ["sf", "san francisco"]]):return "It's sunny in San Francisco, but you better look out if you're a Gemini 😈."else:return f"I am not sure what the weather is in {location}"tools = [get_weather]model = model.bind_tools(tools)
3. 定义工具节点和模型调用节点
我们需要定义工具节点和模型调用节点,以便在 Agent 工作流中使用。
import json
from langchain_core.messages import ToolMessage, SystemMessage
from langchain_core.runnables import RunnableConfigtools_by_name = {tool.name: tool for tool in tools}def tool_node(state: AgentState):outputs = []for tool_call in state["messages"][-1].tool_calls:tool_result = tools_by_name[tool_call["name"]].invoke(tool_call["args"])outputs.append(ToolMessage(content=json.dumps(tool_result),name=tool_call["name"],tool_call_id=tool_call["id"],))return {"messages": outputs}def call_model(state: AgentState,config: RunnableConfig,
):system_prompt = SystemMessage("You are a helpful AI assistant, please respond to the users query to the best of your ability!")response = model.invoke([system_prompt] + state["messages"], config)return {"messages": [response]}def should_continue(state: AgentState):messages = state["messages"]last_message = messages[-1]# If there is no function call, then we finishif not last_message.tool_calls:return "end"# Otherwise if there is, we continueelse:return "continue"
4. 构建工作流
使用 StateGraph 构建工作流,定义节点和边。
from langgraph.graph import StateGraph, ENDworkflow = StateGraph(AgentState)workflow.add_node("agent", call_model)
workflow.add_node("tools", tool_node)workflow.set_entry_point("agent")workflow.add_conditional_edges("agent",should_continue,{"continue": "tools","end": END,},
)workflow.add_edge("tools", "agent")graph = workflow.compile()from IPython.display import Image, displaytry:display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:pass

5. 运行工作流
最后,我们定义一个辅助函数来格式化输出,并运行工作流。
# Helper function for formatting the stream nicely
def print_stream(stream):for s in stream:message = s["messages"][-1]if isinstance(message, tuple):print(message)else:message.pretty_print()inputs = {"messages": [("user", "what is the weather in sf")]}
print_stream(graph.stream(inputs, stream_mode="values"))
输出结果如下:
================================[1m Human Message [0m=================================
what is the weather in sf
================================[1m Ai Message [0m==================================
Tool Calls:get_weather (call_9208187575599553774)Call ID: call_9208187575599553774Args:location: San Francisco
================================[1m Tool Message [0m=================================
Name: get_weather"It's sunny in San Francisco, but you better look out if you're a Gemini 😈."
================================[1m Ai Message [0m==================================It's sunny in San Francisco, but you better look out if you're a Gemini 😈.
参考链接:https://langchain-ai.github.io/langgraph/how-tos/react-agent-from-scratch/
相关文章:
5. langgraph中的react agent使用 (从零构建一个react agent)
1. 定义 Agent 状态 首先,我们需要定义 Agent 的状态,这包括 Agent 所持有的消息。 from typing import (Annotated,Sequence,TypedDict, ) from langchain_core.messages import BaseMessage from langgraph.graph.message import add_messagesclass …...
uniapp vue3的下拉刷新和上拉加载
开启页面的下拉刷新,注意这个不是可滚动视图的下拉刷新. 一般页面建议使用页面外的,不要使用scroll-view里面的下拉刷新. pages: "pages": [ {"path": "pages/index/index","style": {"navigationBarTitleText": "首…...
STM32设计井下瓦斯检测联网WIFI加Zigbee多路节点协调器传输
目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 本系统基于STM32微控制器和Zigbee无线通信技术,设计了…...
Vue 3 中的原生事件监听与组件事件处理详解
Vue 3 中的原生事件监听与组件事件处理完全指南 在 Vue 3 中,事件监听和事件处理是组件交互中的关键部分。Vue 提供了一套简单而强大的事件处理机制,可以方便地监听 DOM 原生事件和组件自定义事件。本篇文章将详细介绍 Vue 3 中事件的使用,包…...
Flink Source 详解
Flink Source 详解 原文 flip-27 FLIP-27 介绍了新版本Source 接口定义及架构 相比于SourceFunction,新版本的Source更具灵活性,原因是将“splits数据获取”与真“正数据获取”逻辑进行了分离 重要部件 Source 作为工厂类,会创建以下两…...
2024年了,TCP分析工具有哪些?
TCP分析工具广泛应用于网络调试、性能分析和协议学习。以下是一些常用的TCP分析工具,它们各有特点,适用于不同的场景: Wireshark - 这是一个非常强大的网络协议分析器,支持图形界面,可以捕获和分析TCP流量,…...
SRP 实现 Cook-Torrance BRDF
写的很乱! BRDF(Bidirectional Reflectance Distribution Function)全称双向反射分布函数。辐射量单位非常多,这里为方便直观理解,会用非常不严谨的光照强度来解释说明。 BRDF光照模型,上反射率公式&#…...
MySQL慢日志
慢查询日志顾名思义就是查询慢的sql语句可以记录到一个日志文件里,至于有多慢才会被记录,默认是10秒,但也可以通过系统配置来更改,慢日志在做系统优化时是一个非常好用的工具 #是否开启慢日志 show variables like slow_query_log…...
Flutter网络通信-封装Dio
前言 dio 是一个强大的 Dart HTTP 请求库,支持全局配置、Restful API、FormData、拦截器、 请求取消、Cookie 管理、文件上传/下载、超时以及自定义适配器等。 Dio的pub地址为:dio | Dart package 封装要求 能够使用get、post、put、patch、delete、…...
matlab 读取csv
需要跳过第一行表头等信息 1、读取整个文件 csvread(FILENAME)%文件路径 文件名2、指定起始位置 csvread(FILENAME, R, C)%从文件的第R行和第C列开始读取数据 逗号分开3、指定数据范围 csvread(FILENAME, R, C, [R1 C1 R2 C2])%读取从(R1, C1)到(R2, C2)范围内的数据注意&am…...
网络层9——虚拟专用网VPN和网络地址转换NAT
目录 一、为什么有虚拟专用网? 二、如何理解“虚拟专用网”? 三、IP隧道技术实现虚拟专用网 四、网络地址变换 一、为什么有虚拟专用网? 第一,IPv4只有32位,最多有40亿个全球唯一的IP地址数量不够,无法…...
开源科学工程技术软件介绍 – EDA工具KLayout
link 今天向各位知友介绍的 KLayout是一款由德国团队开发的开源EDA工具。 KLayout是使用C开发的,用户界面基于Qt。它支持Windows、MacOS和Linux操作系统。安装程序可以从下面的网址下载: https://www.klayout.de/build.html KLayout图形用户界面&…...
【网络安全】Cookie SameSite属性
未经许可,不得转载。 文章目录 背景CSRF 攻击SameSite 属性StrictLaxNone背景 为了有效防止 CSRF 攻击并保护用户隐私,Chrome 从 51 版本开始引入了 SameSite 属性,专门用于限制第三方 Cookie 的使用,进而减少安全风险。 CSRF 攻击 跨站请求伪造(CSRF)攻击是指恶意网站…...
Linux 命令 | 每日一学,文本处理三剑客之awk命令实践
[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 0x00 前言简述 描述:前面作者已经介绍了文本处理三剑客中的 grep 与 sed 文本处理工具,今天将介绍其最后一个且非常强大的 awk 文本处理输出工具,它可以非常方便…...
RabbitMQ的工作队列在Spring Boot中实现(详解常⽤的⼯作模式)
上文着重介绍RabbitMQ 七种工作模式介绍RabbitMQ 七种工作模式介绍_rabbitmq 工作模式-CSDN博客 本篇讲解如何在Spring环境下进⾏RabbitMQ的开发.(只演⽰部分常⽤的⼯作模式) 目录 引⼊依赖 一.工作队列模式 二.Publish/Subscribe(发布订阅模式) …...
【web前端笔记】vue3 + vite的前端项目中,使用import.meta.glob()方法实现全局注册组件的通用代码
目录 1.1、如何读取所有文件 1.2、通用代码 1.3、在main.js引入 这篇文章介绍一下,在vue3和vite搭建的项目中,如何将【src/components】目录下所有的【*.vue】文件,当做一个组件全局注册到Vue对象里面。 1.1、如何读取所有文件 在vue3和vite搭建的项目里面,它给我们提…...
保险行业建立知识管理系统:提高效率和安全性的策略
在保险行业,知识管理系统(KMS)的建立对于提高工作效率和保障数据安全性至关重要。保险公司需要在复杂的生态系统中航行,这个生态系统由不断发展的法规、错综复杂的保单和投保人不断变化的需求所定义。以下是一些关键策略ÿ…...
小程序如何完成订阅
小程序如何完成订阅 参考相关文档实践问题处理授权弹窗不再触发引导用户重新授权 参考相关文档 微信小程序实现订阅消息推送的实现步骤 发送订阅消息 小程序订阅消息(用户通过弹窗订阅)开发指南 实践 我们需要先选这一个模板,具体流程参考…...
JS学习日记(jQuery库)
前言 今天先更新jQuery库的介绍,它是一个用来帮助快速开发的工具 介绍 jQuery是一个快速,小型且功能丰富的JavaScript库,jQuery设计宗旨是“write less,do more”,即倡导写更少的代码,做更多的事…...
Uni-APP+Vue3+鸿蒙 开发菜鸟流程
参考文档 文档中心 运行和发行 | uni-app官网 AppGallery Connect DCloud开发者中心 环境要求 Vue3jdk 17 Java Downloads | Oracle 中国 【鸿蒙开发工具内置jdk17,本地不使用17会报jdk版本不一致问题】 开发工具 HBuilderDevEco Studio【目前只下载这一个就…...
动态加载数据库微信支付配置
在Java后端应用中,动态加载存储在数据库中的微信支付配置,是实现多商户、多环境支付或配置热更新的核心需求。这避免了将API密钥、商户号等敏感信息硬编码在配置文件或代码中,提升了系统的灵活性与安全性。核心实现思路是:构建一个…...
基于Refine框架的企业级后台管理系统实战开发指南
1. 项目概述与核心价值最近在梳理企业内部后台管理系统的技术栈时,我又一次把目光投向了refine这个框架。如果你也和我一样,长期被各种业务后台的重复性开发工作所困扰——比如没完没了的增删改查(CRUD)界面、复杂的权限控制、数据…...
深度解析开源AI工具库:OpenAI API封装库的设计与实战应用
1. 项目概述:一个开源AI工具库的深度解构最近在GitHub上看到一个名为“anasfik/openai”的项目,这个标题乍一看有点意思。它不像官方SDK那样直接叫“openai”,而是带上了个人或组织的命名空间前缀“anasfik/”。这通常意味着这是一个第三方封…...
SoC早期流片策略:风险控制与工程实践深度解析
1. 早期流片的风险与回报:一次深度权衡在系统级芯片开发这个行当里干了十几年,验证始终是悬在每个项目团队头顶的达摩克利斯之剑。面对动辄数亿门级、集成数十个异构核心的复杂SoC,想要在流片前达到“万无一失”的验证覆盖率,所需…...
探索One-Language/One:统一编程范式如何重塑全栈开发体验
1. 项目概述:从“One”到“One-Language/One”的深度解构最近在GitHub上看到一个挺有意思的项目,叫“One-Language/One”。光看这个名字,可能很多人会有点懵,这到底是个啥?是又一个编程语言?还是一个框架&a…...
高速PCB设计实战:五种端接方案如何选型与优化
1. 高速PCB设计中的信号完整性问题 在高速PCB设计中,信号完整性(SI)问题就像城市交通拥堵一样常见。想象一下,当信号以GHz级别的频率在电路板上传输时,就像高峰期的高速公路上飞驰的跑车,任何一个小小的阻抗…...
光伏并网系统谐波抑制控制策略【附程序】
✨ 长期致力于锁相环、谐波电流检测、二阶广义积分器、LMS滤波器研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基于双二阶广义积分器-锁频环的自适应…...
OpenClaw Dashboard:AI智能体集群的实时可视化指挥中心设计与部署
1. 项目概述:OpenClaw Dashboard,一个为AI智能体集群打造的实时指挥中心如果你正在运行一个OpenClaw智能体集群,或者对构建多智能体系统感兴趣,那么你很可能面临一个共同的痛点:如何清晰地掌控全局?当几十甚…...
给 Agent 用的搜索:Cloudflare AI Search 是什么,怎么工作的
原文:AI Search: the search primitive for your agents 发布时间:2026 年 4 月 16 日 作者:Gabriel Massadas、Miguel Cardoso、Anni Wang 每个 Agent 都需要搜索,但自己搭很麻烦 编码 Agent 要检索数百万个文件,客服…...
GDScript Mod Loader:为Godot游戏打造专业模组生态的完整指南
1. 项目概述:为你的Godot游戏注入社区活力如果你是一名使用Godot引擎的独立游戏开发者,或者是一位热衷于为喜爱的游戏创造新内容的玩家,那么“模组”这个概念你一定不陌生。模组,或者说Mod,是游戏社区生命力的重要源泉…...
