LangGraph异步化sqlite checkpoint
安装
pip install langgraph-checkpoint-sqlite
异步checkpiont初始化:
from langgraph.checkpoint.sqlite.aio import AsyncSqliteSaver
conn = aiosqlite.connect(":memory:", check_same_thread=False)
memory = AsyncSqliteSaver(conn)
如果使用异步流式应对,需要确保llm节点或者相关节点也转成异步化操作
async def llm(self, state: AgentState):llm_msgs = state['messages']if self.systemMessage:llm_msgs = self.systemMessage + state['messages']print(f'ask llm to handle request msg, msg: {llm_msgs}')try:# 关键修复:await 异步调用并直接获取结果msg = await self.model.ainvoke(llm_msgs)print(f'msg={msg}')return {'messages': [msg]} # 确保返回的是消息对象而非协程except Exception as e:print(f"Model invocation error: {e}")# 返回错误提示消息(需符合Message类型)from langchain_core.messages import AIMessagereturn {'messages': [AIMessage(content=f"Error: {str(e)}")]}async def take_action_tool(self, state: AgentState):current_tools: List[ToolCall] = state['messages'][-1].tool_callsresults = []for t in current_tools:tool_result = await self.tools[t['name']].ainvoke(t['args'])results.append(ToolMessage(tool_call_id=t['id'],content=str(tool_result),name=t['name'],))print(f'Back to model')return {'messages': results}
最后的完整代码如下:
import asyncio
from typing import Annotated, List, TypedDict
import osimport aiosqlite
from langchain_community.chat_models import ChatTongyi
from langchain_core.language_models import BaseChatModel
from langchain_core.messages import AnyMessage, HumanMessage, SystemMessage, ToolMessage, ToolCall
from dotenv import load_dotenv
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.tools import BaseTool
from langgraph.checkpoint.sqlite.aio import AsyncSqliteSaver
from langgraph.constants import END, START
from langgraph.graph import add_messages, StateGraphconn = aiosqlite.connect(":memory:", check_same_thread=False)
load_dotenv(dotenv_path='../keys.env')
ts_tool = TavilySearchResults(max_results=2)class AgentState(TypedDict):messages: Annotated[List[AnyMessage], add_messages]class Agent:def __init__(self,model: BaseChatModel,systemMessage: List[SystemMessage],tools: List[BaseTool],memory,):assert all(isinstance(t, BaseTool) for t in tools), 'tools must implement BASEcALL'graph = StateGraph(AgentState)graph.add_node('llm', self.llm)graph.add_node('take_action_tool', self.take_action_tool)graph.add_conditional_edges('llm',self.exist_action,{True: 'take_action_tool',False: END})graph.set_entry_point('llm')graph.add_edge('take_action_tool', 'llm')self.app = graph.compile(checkpointer=memory)self.tools = {t.name: t for t in tools}self.model = model.bind_tools(tools)self.systemMessage = systemMessagedef exist_action(self, state: AgentState):tool_calls = state['messages'][-1].tool_callsprint(f'tool_calls size {len(tool_calls)}')return len(tool_calls) > 0async def llm(self, state: AgentState):llm_msgs = state['messages']if self.systemMessage:llm_msgs = self.systemMessage + state['messages']print(f'ask llm to handle request msg, msg: {llm_msgs}')try:# 关键修复:await 异步调用并直接获取结果msg = await self.model.ainvoke(llm_msgs)print(f'msg={msg}')return {'messages': [msg]} # 确保返回的是消息对象而非协程except Exception as e:print(f"Model invocation error: {e}")# 返回错误提示消息(需符合Message类型)from langchain_core.messages import AIMessagereturn {'messages': [AIMessage(content=f"Error: {str(e)}")]}async def take_action_tool(self, state: AgentState):current_tools: List[ToolCall] = state['messages'][-1].tool_callsresults = []for t in current_tools:tool_result = await self.tools[t['name']].ainvoke(t['args'])results.append(ToolMessage(tool_call_id=t['id'],content=str(tool_result),name=t['name'],))print(f'Back to model')return {'messages': results}async def work():prompt = """You are a smart research assistant. Use the search engine to look up information. \You are allowed to make multiple calls (either together or in sequence). \Only look up information when you are sure of what you want. \If you need to look up some information before asking a follow up question, you are allowed to do that!"""qwen_model = ChatTongyi(model=os.getenv('model'),api_key=os.getenv('api_key'),base_url=os.getenv('base_url'),) # reduce inference costmemory = AsyncSqliteSaver(conn)agent = Agent(model=qwen_model, tools=[ts_tool], systemMessage=[SystemMessage(content=prompt)], memory=memory)messages = [HumanMessage("who is the popular football star in the world?")]configurable = {"configurable": {"thread_id": "1"}}async for event in agent.app.astream_events({"messages": messages}, configurable, version="v1"):kind = event["event"]# print(f"kind = {kind}")if kind == "on_chat_model_stream":content = event["data"]["chunk"].contentif content:# Empty content in the context of OpenAI means# that the model is asking for a tool to be invoked.# So we only print non-empty contentprint(content, end="|")if __name__ == '__main__':asyncio.run(work())
相关文章:
LangGraph异步化sqlite checkpoint
安装 pip install langgraph-checkpoint-sqlite异步checkpiont初始化: from langgraph.checkpoint.sqlite.aio import AsyncSqliteSaver conn aiosqlite.connect(":memory:", check_same_threadFalse) memory AsyncSqliteSaver(conn)如果使用异步流式…...
StarRocks 助力首汽约车精细化运营
作者:任智红,首汽约车大数据负责人 更多交流,联系我们:https://wx.focussend.com/weComLink/mobileQrCodeLink/334%201%202/ffbe5 导读: 本文整理自首汽约车大数据负责人任智红在 StarRocks 年度峰会上的演讲…...
Versatile-OCR-Program:可以从复杂的教育材料(如试卷)中提取结构化数据的开源多模态OCR工具
Versatile-OCR-Program 此 OCR 系统专门设计用于以针对机器学习 (ML) 训练优化的格式从复杂的教育材料(如试卷)中提取结构化数据。它支持多语言文本、数学公式、表格、图表和图表,非常适合创建高质量的训练数据集。 主…...
时序数据库 TDengine Cloud 私有连接实战指南:4步实现数据安全传输与成本优化
小T导读:在物联网和工业互联网场景下,企业对高并发、低延迟的数据处理需求愈发迫切。本文将带你深入了解 TDengineCloud 如何通过全托管服务与私有连接,帮助企业实现更安全、更高效、更低成本的数据采集与传输,从架构解析到实际配…...
vue项目本地调试使用https
由于测试环境远程接口,是采用https协议,为了能正常携带cookie访问接口,需要把本地项目也采用https协议访问。前提是后端的cookie设置在二级域名下,且允许固定其他子域名跨域访问(需要在后端设置) 项目框架…...
【学习笔记】文件上传漏洞--二次渲染、.htaccess、变异免杀
目录 第十二关 远程包含地址转换 第十三关 突破上传删除 条件竞争 第十四关 二次渲染 第十五关 第十六关 第十七关 .htaccess 第十八关 后门免杀 第十九关 日志包含 第十二关 远程包含地址转换 延续第十一关,加一个文件头,上传成功,…...
探秘 MQTT 协议:物联网的 “隐形桥梁”
在当今数字化时代,物联网技术正以前所未有的速度改变着我们的生活。从智能家居到工业自动化,从远程医疗到智能交通,无数设备相互连接、交换信息,构建起一个庞大而复杂的智能世界。而在这背后,有一个关键的 “隐形桥梁”…...
[ctfshow web入门] web24
前置知识 isset:判断这个变量是否声明且不为NULL,否则返回False mt_srand:设置随机数种子,如果不手动设置,那么系统会自动进行一次随机种子的设置 mt_rand:生成一个随机数,这个随机数与种子有个…...
Unity 实现伤害跳字
核心组件: Dotween TextMeshPro 过程轨迹如下图: 代码如下: using System.Collections; using System.Collections.Generic; using DG.Tweening; using TMPro; using UnityEngine; using UnityEngine.Pool;public class …...
在SQLark 中快速生成测试数据
在软件开发与数据库管理过程中,高质量的测试数据是保障系统稳定性和性能优化的关键。然而,手动构造仿真数据不仅耗时耗力,还难以覆盖多样化的测试场景。现在,可以使用 SQLark 的数据生成功能,通过 8大类47子类的数据规…...
Postman接口测试详解
一、为何使用postman postman是一款简单高效的接口测试工具,能够很方便发送接口请求,易于保存接口请求脚本,postman提供接口响应数据比对功能,可以设置预期结果作断言,还能把测试用例放在一个集合中批量执行ÿ…...
[ctfshow web入门] web30
信息收集 题目将flag system php不区分大小写地过滤了 解题 前置知识 print_r:php中用于打印数组 scandir:php中用于获取指点目录下的所以文件目录名 getcwd:获取当前目录 目录获取 这里提供两种方法 print_r(scandir(getcwd())); pri…...
ElasticSearch迁移数据
一、查询索引 1、查询所有索引 curl --user elastic:123456 -XGET "http://localhost:19200/_cat/indices?v&sindex" 2、查询索引配置 以索引名称hello为例 curl --user elastic:123456 -XGET "http://localhost:19200/hello/_settings?pretty" 3…...
ES:账号、索引、ILM
目录 笔记1:账号权限查看、查看账号、创建账号等查看所有用户查看特定用户验证权限修改用户权限删除用户 笔记2:索引状态和内容的查看等查看所有索引查看特定索引内容查看索引映射查看索引设置查看索引统计信息查看ILM策略 笔记1:账号权限查看…...
Spring MVC 逻辑视图(JSP、Thymeleaf、FreeMarker)与非逻辑视图(JSON、Excel、PDF、XML)详解及示例
Spring MVC 逻辑视图与非逻辑视图详解及示例 一、逻辑视图与非逻辑视图的定义 类型定义逻辑视图通过视图解析器(ViewResolver)将逻辑名称(如 success)映射到具体视图实现。非逻辑视图直接返回具体视图对象(如 JsonVie…...
开发体育赛事直播系统:实现聊天交友的私聊功能技术实现全方案解析
基于“东莞梦幻网络科技”体育赛事直播系统,展示前后端技术(PHP ThinkPHP Vue.js Android Java iOS OC)实现的“用户与用户之间私聊”完整方案,包括功能描述、界面效果、技术实现、数据结构、接口设计及关键代码示例。 一、私…...
UTF-8和GBK编码的区别和详细解释
各位看官,大家早安午安晚安呀~~~ 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连,小编尽全力做到更好 欢迎您分享给更多人哦 今天我们来学习:一个小的知识点—UTF-8和GBK编码的解释 1.关于bite位和进制的关系 1 个比特(bit&am…...
java导入excel更新设备经纬度度数或者度分秒
文章目录 一、背景介绍二、页面效果三、代码0.pom.xml1.ImportDevice.vue2.ImportDeviceError.vue3.system.js4.DeviceManageControl5.DeviceManageUserControl6.Repeater7.FileUtils8.ResponseModel9.EnumLongitudeLatitude10.词条 四、注意点本人其他相关文章链接 一、背景介…...
使用python访问mindie部署的vl多模态模型
说明 今天使用mindie1.0部署了qwen2_7b_vl模型,测试过程出现一些问题,这里总结下。 问题1:transformers版本太低 报错信息: [ERROR] [model_deploy_config.cpp:159] Failed to get vocab size from tokenizer wrapper with ex…...
github发布个人中英文简历网站CaoYongshengcys.github.io
在GitHub上创建个人主页(也称为GitHub Pages)是一个展示个人项目、技能和经历的好方法。以下是详细步骤: 1. 创建GitHub账号 • 如果你还没有GitHub账号,先访问GitHub官网注册一个账号。 • 选择一个专业的用户名,因…...
动态规划算法深度解析:0-1背包问题(含完整流程)
简介: 0-1背包问题是经典的组合优化问题:给定一组物品(每个物品有重量和价值),在背包容量限制下选择物品装入背包,要求总价值最大化且每个物品不可重复选取。 动态规划核心思想 通过构建二维状态表dp[i]…...
QML面试笔记--UI设计篇04交互控件
1. QML中常用交互控件 1.1. Button1.2. Slider1.3. ProgressBar1.4. TextField1.5. TextArea1.6. ComboBox1.7. CheckBox1.8. RadioButton1.9. Menu1.10. Dialog 1. QML中常用交互控件 在万物互联的智能时代,QML凭借其声明式语法和跨平台能力,…...
【数学】线性代数(Python)
参考:https://aibydoing.com/notebooks/appendix01-01-linear-algebra-with-python 目录 矩阵的定义矩阵的运算矩阵的属性矩阵的分解矩阵的本质遗留问题 矩阵的定义 通过数组的维度来区分向量(1 维数组)、矩阵(2 维数组࿰…...
ragflow开启https访问:添加证书后,使用浏览器还是有警告,如何解决?
如果在 Windows 系统中安装了 PEM 证书(使用方法一通过证书管理器 MMC 导入),但浏览器仍然提示安全警告,可能有以下几个原因及解决方法: 1. 证书未正确安装到受信任的存储位置 问题:如果证书被导入到错误的存储位置(如“个人”而非“受信任的根证书颁发机构”),浏览器…...
vue.config.js配置代理(输出代理前后的地址)
devServer: {host: 0.0.0.0,port: port,open: true,before(app) {app.use((req, res, next) > {// console.log(原始地址:, req.originalUrl) // 原始地址,如 /api/some-api/xxxxxnext()})},proxy: {[process.env.VUE_APP_BASE_API]: {target: http://192.168.50…...
【八股文】http1.0和1.1的区别
http1.0默认使用短连接,每次请求都需要建立TCP连接(三次握手),响应完成后立即关闭连接,导致资源浪费和延迟增加。 支持通过Connection:Keep-alive 手动开启长连接,但需客户端和服务端显式协商 …...
【Prompt实战】邮件分类专家
本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权&am…...
K8S核心技术点
Pod,Service和Deployment的关系 Pod:Kubernetes 中最小的部署单元,用于运行容器化应用。 Service:提供服务发现和负载均衡,为 Pod 提供稳定的网络端点,ClusterIP,NodePort,LoadBala…...
Python手写“随机森林”解决鸢尾花数据集分类问题
Python使用“随机森林”解决鸢尾花数据集分类问题 任务描述解题1. 导入必要的库2. 数据采样函数 sample3. 设置随机种子和超参数4. 定义随机森林类 random_forest5. 加载数据集并划分训练集和测试集6. 创建并训练随机森林模型7. 进行预测并计算准确率 代码 任务描述 您的任务是…...
Python 字典和集合(泛映射类型)
本章内容的大纲如下: 常见的字典方法 如何处理查找不到的键 标准库中 dict 类型的变种set 和 frozenset 类型 散列表的工作原理 散列表带来的潜在影响(什么样的数据类型可作为键、不可预知的 顺序,等等) 泛映射类型 collections.…...
CrystalDiskInfo电脑硬盘监控工具 v9.6.0中文绿色便携版
前言 CrystalDiskInfo是一个不用花钱的硬盘小帮手软件,它可以帮你看看你的电脑硬盘工作得怎么样,健不健康。这个软件能显示硬盘的温度高不高、还有多少地方没用、传输东西快不快等等好多信息。用了它,你就能很容易地知道硬盘现在是什么情况&…...
rqlite:一个基于SQLite构建的分布式数据库
今天给大家介绍一个基于 SQLite 构建的轻量级分布式关系型数据库:rqlite。 rqlite 基于 Raft 协议,结合了 SQLite 的简洁性以及高可用分布式系统的稳健性,对开发者友好,操作极其简便,其核心设计理念是以最低的复杂度实…...
网络1 网络设备
计算机网络设备 集线器: 易发生阻塞:所有端口共享一条带宽,两个端口发生传输时,其他端口若想传输数据给这两个端口,需等待这两个端口传输数据完毕。 端口数量限制:10M带宽下可用15口。15口共享10Md带宽 集线…...
mybatis 某些特殊的 ORA-00979:not a GROUP BY expression
打印的日志sql执行都是正常的 但是 就是报ORA-00979: not a GROUP BY expression 可能是 GROUP BY中不能使用动态参数 或特殊方法 使用 硬编码可以解决问题 <if test"statisticsInVo.timeTypeSql!null and statisticsInVo.timeTypeSql yyyy">TO_CHAR(CARD_T…...
基于OpenCV的图像处理程序设计实践
一.安装OpenCV3.x # 安装依赖 sudo apt update sudo apt install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev# 下载OpenCV源码 git clone https://github.com/opencv/opencv.git -b 3.4 cd opencv mkdir build &…...
DeepSeek 全套汇总资料pdf免费下载(最新更新8篇)
DeepSeek 全套汇总资料pdf目前仍然在持续更新中,今天更新了8篇,合计的汇总都在这里了,有需要的朋友可以直接去下载了。 后续更新请关注文章:DeepSeek 全套汇总资料pdf免费下载(持续更新) _ 潘子夜个人博客…...
前端面试题(六):HTTP和HTTPS的区别以及他们如何保障数据安全
HTTP(HyperText Transfer Protocol)和HTTPS(HyperText Transfer Protocol Secure)都是用于在互联网上传输数据的协议,但它们之间有一个重要的区别:安全性。 1. HTTP(超文本传输协议)…...
Buffer Pool 的核心作用与工作机制
Buffer Pool 的核心作用与工作机制 1. Buffer Pool 是什么? Buffer Pool 是 InnoDB 存储引擎的核心内存区域,用于 缓存磁盘中的数据页。 作用:通过内存缓存减少直接磁盘 I/O,加速数据库的读写操作。默认大小:通常设…...
使用uglifyjs对静态引入的js文件进行压缩
前言 因为有时候js文件没有npm包,或者需要修改,只能引入静态的js,那么这个时候就可以对js进行压缩了。我其实想通过vite、webpack等插件进行压缩的,可是他都不能定位到public目录下面的文件,所以我只能自己压缩了。编…...
Vue 3 的<Teleport>功能与用法
Vue 3 的 <Teleport> 功能与用法 1. 基本用法 <Teleport> 是 Vue 3 的一个内置组件,允许将组件的内容渲染到 DOM 中的任意位置,而不改变其逻辑结构。以下是基本用法: 定义目标 DOM 元素:<div id"teleport-…...
2025 年江苏交安安全员考试:借助本地培训资源提升能力
江苏拥有丰富的教育和培训资源,为交安安全员备考提供了有力支持。考生可关注本地专业培训机构开设的交安安全员培训课程,这些课程往往由经验丰富的讲师授课,他们熟悉本地考试特点和行业实际需求。课程内容不仅涵盖考试大纲的知识点࿰…...
Umi Max 和 Ant Design Pro 的区别
1、前言: Ant Design Pro Umi Max Umi Max 和 Ant Design Pro 其实关系很紧密,但用途不同、定位不同。 我们一起来搞清楚它们的区别、联系、使用场景👇 2、一句话总结 名称作用Umi Max是现代前端框架,用来构建中后台项目&#x…...
《 Scikit-learn与MySQL的深度协同:构建智能数据生态系统的架构哲学》
在机器学习工程实践中,数据存储与模型训练的割裂始终是制约算法效能的关键瓶颈。Scikit-learn作为经典机器学习库,其与MySQL的深度协同并非简单的数据管道连接,而是构建了一个具备自组织能力的智能数据生态系统。这种集成突破了传统ETL流程的…...
无公网实体服务器加装多个操作系统供多个用户互不打扰使用_part1
背景介绍 因笔者业务需求,入手了一个实体服务器,但为了避免出现在一个操作系统中搭建编程环境后有许多相关的进程和服务,拖慢日常的使用,也能让其他人短期使用,更好的利用服务器的性能,让服务器专注于“什…...
C#调用Lua方法1+C#调用Lua方法2,3
xLua中Lua调用C#代码 原因:C#实现的系统,因为Lua可以调用,所以完全可以换成Lua实现,因为Lua可以即时更改,即时运行,所以游戏的代码逻辑就可以随时更改。 实现和C#相同效果的系统,如何实现&#…...
浅层神经网络:从数学原理到实战应用的全面解析
浅层神经网络:从数学原理到实战应用的全面解析 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc 一、神经网络演进简史:浅层网络的奠…...
【深度学习:理论篇】--Pytorch基础入门
目录 1.Pytorch--安装 2.Pytorch--张量 3.Pytorch--定义 4.Pytorch--运算 4.1.Tensor数据类型 4.2.Tensor创建 4.3.Tensor运算 4.4.Tensor--Numpy转换 4.5.Tensor--CUDA(GPU) 5.Pytorch--自动微分 (autograd) 5.1.back…...
C++中数组的概念
文章目录 一、数组的定义二、什么是一维数组?2.1 一维数组的声明2.2 一维数组的初始化2.3 一维数组的使用 三、什么是一维数组的数组名?四、一维数组与指针的关系五、数组指针和指针数组的区别5.1 指针数组(array of pointers)5.2…...
996引擎-源码学习:Cocos2d-Lua 的 class(classname, ...)
996引擎-源码学习:Cocos2d-Lua 的 class(classname, ...) 一、核心方法调用顺序用户调用入口完整调用链二、__create 工厂方法的三种情形情形1:父类为函数(自定义工厂)情形2:父类为Cocos原生类情形3:父类为普通Lua表三、方法职责与内存管理对照表四、正确使用示例示例1…...
@linux系统SSL证书转换(Openssl转换PFX)
在Linux中,你可以使用OpenSSL工具将PFX/P12格式的证书转换为单独的CRT(证书)、KEY(私钥)文件以及提取证书链 1. 提取私钥文件(.key) openssl pkcs12 -in your_certificate.pfx -nocerts -out private.key -nodes系统会…...