当前位置: 首页 > article >正文

LangGraph 生产级部署全解:FastAPI + Docker

一、部署架构总览我们将基于你之前的带人工干预的双智能体系统构建一个完整的生产级部署方案包含三个核心部分FastAPI 接口层封装 Agent 为标准 HTTP 接口支持任务启动、人工干预、状态查询Redis 持久化层替代 MemorySaver实现状态持久化和服务重启恢复Docker 容器化打包整个应用为镜像实现一键部署和环境一致性标准部署架构图plaintext客户端 → FastAPI 接口 → LangGraph Agent → Redis(状态持久化)二、第一步项目结构标准化先将你的代码整理为生产级项目结构plaintextlanggraph-agent-deploy/ ├── agent/ # Agent核心逻辑 │ ├── __init__.py │ ├── multi_agent.py # 双智能体系统代码 │ └── state.py # 状态定义 ├── main.py # FastAPI入口 ├── requirements.txt # 依赖清单 ├── Dockerfile # 镜像构建文件 ├── docker-compose.yml # 服务编排 └── .env # 环境变量配置三、第二步FastAPI 接口封装3.1 核心依赖安装bash运行pip install fastapi uvicorn python-multipart langgraph-checkpoint-redis3.2 完整 FastAPI 代码# main.py import asyncio from typing import Optional from fastapi import FastAPI, HTTPException, CORS from pydantic import BaseModel from langgraph.types import Command from agent.multi_agent import build_multi_agent_system from agent.state import MultiAgentState # 初始化FastAPI app FastAPI(titleLangGraph 双智能体写作系统 API, version1.0.0) # 配置CORS允许前端跨域访问 app.add_middleware( CORS, allow_origins[*], # 生产环境改为具体域名 allow_credentialsTrue, allow_methods[*], allow_headers[*], ) # 初始化Agent系统全局单例避免重复初始化 agent build_multi_agent_system() # 请求响应模型 class StartTaskRequest(BaseModel): thread_id: str task: str topic: str class ResumeTaskRequest(BaseModel): thread_id: str human_input: str class TaskStatusResponse(BaseModel): thread_id: str status: str # running, interrupted, completed, failed current_step: Optional[str] None interrupt_info: Optional[dict] None final_article: Optional[str] None error: Optional[str] None # 核心接口 app.post(/api/task/start, response_modelTaskStatusResponse) async def start_task(request: StartTaskRequest): 启动一个新的写作任务 try: config {configurable: {thread_id: request.thread_id}} # 初始化任务状态 initial_state: MultiAgentState { task: request.task, topic: request.topic, research_notes: , draft: , final_article: , current_agent: researcher, turn_count: 0, max_turns: 5, messages: [], error: None, human_feedback: } # 异步执行Agent避免阻塞事件循环 result await asyncio.to_thread( agent.invoke, initial_state, configconfig ) # 构建响应 return await _build_status_response(request.thread_id, result) except Exception as e: raise HTTPException(status_code500, detailf任务启动失败: {str(e)}) app.post(/api/task/resume, response_modelTaskStatusResponse) async def resume_task(request: ResumeTaskRequest): 恢复被中断的任务传入人类反馈 try: config {configurable: {thread_id: request.thread_id}} # 用Command恢复执行 result await asyncio.to_thread( agent.invoke, Command(resumerequest.human_input), configconfig ) return await _build_status_response(request.thread_id, result) except Exception as e: raise HTTPException(status_code500, detailf任务恢复失败: {str(e)}) app.get(/api/task/status/{thread_id}, response_modelTaskStatusResponse) async def get_task_status(thread_id: str): 查询任务当前状态 try: config {configurable: {thread_id: thread_id}} # 获取最新状态 state await asyncio.to_thread(agent.get_state, config) result state.values return await _build_status_response(thread_id, result) except Exception as e: raise HTTPException(status_code500, detailf状态查询失败: {str(e)}) # 辅助函数 async def _build_status_response(thread_id: str, result: dict) - TaskStatusResponse: 构建统一的状态响应 # 检查是否有中断 if __interrupt__ in result: interrupt_info result[__interrupt__][0][value] return TaskStatusResponse( thread_idthread_id, statusinterrupted, current_stepinterrupt_info[type], interrupt_infointerrupt_info, errorresult.get(error) ) # 检查是否完成 if result.get(final_article): return TaskStatusResponse( thread_idthread_id, statuscompleted, final_articleresult[final_article], errorresult.get(error) ) # 检查是否出错 if result.get(error): return TaskStatusResponse( thread_idthread_id, statusfailed, errorresult[error] ) # 运行中 return TaskStatusResponse( thread_idthread_id, statusrunning, current_stepresult.get(current_agent), errorresult.get(error) ) # 启动服务 if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8000)3.3 修改 Agent 代码使用 Redis 持久化将之前的MemorySaver替换为RedisSaver实现状态持久化# agent/multi_agent.py import os from langgraph.checkpoint.redis import RedisSaver def build_multi_agent_system(): # ... 其他代码不变 ... # 从环境变量获取Redis连接地址 redis_url os.getenv(REDIS_URI, redis://localhost:6379/0) checkpointer RedisSaver.from_url(redis_url) return builder.compile(checkpointercheckpointer)四、第三步Docker 容器化4.1 编写 requirements.txt# requirements.txt fastapi0.115.0 uvicorn0.30.6 python-multipart0.0.12 langgraph0.2.39 langchain0.2.16 langchain-openai0.1.25 pydantic-settings2.5.2 python-dotenv1.0.1 langgraph-checkpoint-redis1.0.11 redis5.2.14.2 编写 Dockerfile多阶段构建优化镜像体积dockerfile# Dockerfile # 第一阶段构建阶段 FROM python:3.11-slim AS builder # 设置工作目录 WORKDIR /app # 安装系统依赖 RUN apt-get update apt-get install -y --no-install-recommends \ build-essential \ rm -rf /var/lib/apt/lists/* # 创建虚拟环境 RUN python -m venv /opt/venv ENV PATH/opt/venv/bin:$PATH # 复制依赖文件并安装 COPY requirements.txt . RUN pip install --no-cache-dir --upgrade pip \ pip install --no-cache-dir -r requirements.txt # 第二阶段运行阶段 FROM python:3.11-slim # 设置工作目录 WORKDIR /app # 复制虚拟环境 COPY --frombuilder /opt/venv /opt/venv ENV PATH/opt/venv/bin:$PATH # 创建非root用户增强安全性 RUN useradd -m appuser USER appuser # 复制应用代码 COPY --chownappuser:appuser . . # 暴露端口 EXPOSE 8000 # 启动命令 CMD [uvicorn, main:app, --host, 0.0.0.0, --port, 8000, --workers, 4]4.3 编写 docker-compose.ymlyaml# docker-compose.yml version: 3.8 volumes: redis-data: driver: local services: # Redis服务状态持久化 redis: image: redis:7-alpine container_name: langgraph-redis restart: unless-stopped ports: - 6379:6379 volumes: - redis-data:/data healthcheck: test: [CMD, redis-cli, ping] interval: 5s timeout: 1s retries: 5 # LangGraph Agent API服务 langgraph-agent: build: . container_name: langgraph-agent restart: unless-stopped ports: - 8000:8000 depends_on: redis: condition: service_healthy env_file: - .env environment: - REDIS_URIredis://redis:6379/0 - PYTHONUNBUFFERED1 # 禁用Python输出缓冲确保日志实时显示4.4 编写 .env 配置文件env# .env # 智谱API配置 ZHIPU_API_KEY你的智谱API密钥 ZHIPU_BASE_URLhttps://open.bigmodel.cn/api/paas/v4 LLM_MODELglm-4.6 LLM_BACKUP_MODELglm-4-flash LLM_TIMEOUT30 # Redis配置docker-compose中会覆盖这个值 REDIS_URIredis://localhost:6379/0五、第四步部署与运行5.1 一键启动所有服务# 构建镜像并启动服务 docker-compose up -d --build # 查看服务状态 docker-compose ps # 查看日志 docker-compose logs -f langgraph-agent5.2 测试 API 接口1. 启动任务curl -X POST http://localhost:8000/api/task/start \ -H Content-Type: application/json \ -d { thread_id: test_task_001, task: 写一篇关于LangGraph多智能体系统的技术文章, topic: LangGraph多智能体系统的原理、架构与实现 }2. 查询任务状态bashcurl http://localhost:8000/api/task/status/test_task_0013. 恢复中断任务当任务等待人工确认时bashcurl -X POST http://localhost:8000/api/task/resume \ -H Content-Type: application/json \ -d { thread_id: test_task_001, human_input: 通过 }4. 访问自动生成的 API 文档Swagger UIhttp://localhost:8000/docsReDochttp://localhost:8000/redoc六、生产环境优化最佳实践6.1 性能优化增加 Worker 进程数在 Dockerfile 的 CMD 中调整--workers参数通常设置为 CPU 核心数的 2-4 倍使用 Gunicorn Uvicorn生产环境推荐用 Gunicorn 管理 Uvicorn Worker提高并发能力dockerfileCMD [gunicorn, main:app, -w, 4, -k, uvicorn.workers.UvicornWorker, -b, 0.0.0.0:8000]添加 Nginx 反向代理处理静态资源、SSL 终止、负载均衡6.2 安全优化限制 CORS 来源将allow_origins[*]改为具体的前端域名添加 API 密钥认证给接口添加 API 密钥验证防止未授权访问使用 Docker Secrets生产环境不要用.env 文件存储敏感信息改用 Docker Secrets 或 Kubernetes Secrets定期更新基础镜像及时修复安全漏洞6.3 可观测性添加日志配置配置结构化日志方便日志收集和分析添加健康检查接口pythonapp.get(/health) async def health_check(): return {status: healthy, timestamp: datetime.now().isoformat()}集成监控系统用 Prometheus Grafana 监控服务指标6.4 高可用部署多实例部署启动多个 Agent 实例用 Nginx 或 Kubernetes 进行负载均衡Redis 集群生产环境使用 Redis 集群保证数据高可用自动扩缩容根据请求量自动调整实例数量七、常见问题排查Redis 连接失败检查 docker-compose 中的 Redis 服务是否正常启动REDIS_URI 是否正确接口超时增加 Uvicorn 的超时时间或优化 Agent 执行逻辑状态丢失确保使用了 RedisSaver并且 Redis 数据卷配置正确镜像体积过大使用多阶段构建删除不必要的依赖和文件按照这个方案部署后你的 LangGraph Agent 系统就具备了生产级的稳定性、可扩展性和可维护性可以安全地对外提供服务。

相关文章:

LangGraph 生产级部署全解:FastAPI + Docker

一、部署架构总览 我们将基于你之前的带人工干预的双智能体系统,构建一个完整的生产级部署方案,包含三个核心部分: FastAPI 接口层:封装 Agent 为标准 HTTP 接口,支持任务启动、人工干预、状态查询Redis 持久化层&am…...

免费开源桌面分区工具:如何用NoFences在5分钟内整理好你的Windows桌面

免费开源桌面分区工具:如何用NoFences在5分钟内整理好你的Windows桌面 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 你是否每天都要面对杂乱无章的Windows桌面&…...

第十章:C++ 迷你单元测试框架

第十章:C++ 迷你单元测试框架 本章从"写业务"切换到"写工具"。前 9 个案例都是给最终用户看的应用;本案例要做的是给其他程序员用的库——一个百行代码、头文件 only 的单元测试框架(类似 Catch2 的最小骨架)。你将集中练习三件被前 9 个案例覆盖不到位…...

告别枯燥理论:用Verilog在FPGA上实现一个可交互的I2C温度传感器从机

从零构建FPGA上的智能温度传感器:Verilog I2C从机实战指南 当你想在FPGA上连接一个温度传感器时,市面上常见的I2C传感器如LM75似乎是个简单选择——但你是否想过,用Verilog自己实现一个会是什么体验?本文将带你从协议层开始&#…...

【GD32】从零构建GD32开发环境(Keil 5)—— 固件库配置与工程创建实战

1. 为什么需要配置固件库? 刚接触GD32单片机的朋友可能会有疑问:为什么不能直接在Keil里写代码?这就好比装修房子,固件库就像是提前准备好的建材包,里面已经包含了墙面涂料、地板材料、门窗框架等标准件。如果每次开发…...

3大照片管理痛点,1个工具彻底解决:ExifToolGUI完全指南

3大照片管理痛点,1个工具彻底解决:ExifToolGUI完全指南 【免费下载链接】ExifToolGui A GUI for ExifTool 项目地址: https://gitcode.com/gh_mirrors/ex/ExifToolGui 你是否曾面对数百张旅行照片,需要统一修改拍摄时间却无从下手&…...

避坑指南:ESP32-C3蓝牙通信中ESP_GATTS_READ_EVT事件的正确理解与数据更新时机

ESP32-C3蓝牙GATT通信中的数据更新陷阱与实战解决方案 当你在ESP32-C3上实现蓝牙GATT通信时,是否遇到过这样的困惑:明明在ESP_GATTS_READ_EVT事件中更新了特征值,但客户端读取到的却总是旧数据?这个看似简单的现象背后&#xff0c…...

AI智能体安全防护:ClawGuard主动防御系统架构与实战部署

1. 项目概述:为AI智能体构建一道主动防御的“防火墙”在AI智能体(AI Agent)技术快速普及的今天,我们正面临一个全新的安全挑战。想象一下,你精心调教的AI助手,能够自主浏览网页、调用API、执行命令&#xf…...

Windows平台iOS模拟器开发革命:ipasim如何让iOS应用在Windows上“原生“运行

Windows平台iOS模拟器开发革命:ipasim如何让iOS应用在Windows上"原生"运行 【免费下载链接】ipasim iOS emulator for Windows 项目地址: https://gitcode.com/gh_mirrors/ip/ipasim 嘿,开发者朋友们!你是否曾经梦想过在Win…...

如何在Windows上免费获得流畅的B站观影体验:BiliBili-UWP第三方客户端终极指南

如何在Windows上免费获得流畅的B站观影体验:BiliBili-UWP第三方客户端终极指南 【免费下载链接】BiliBili-UWP BiliBili的UWP客户端,当然,是第三方的了 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBili-UWP 还在为网页版B站卡顿…...

Windows 10下保姆级教程:Quartus Prime 18.0 + ModelSim SE 安装与破解全流程(含USB-Blaster驱动)

Windows 10下Quartus Prime 18.0与ModelSim SE完整安装指南 第一次接触FPGA开发的朋友们,面对Quartus Prime和ModelSim的安装过程可能会感到无从下手。这份指南将带你一步步完成从软件下载到最终验证的全过程,确保你的开发环境搭建顺利。不同于网络上零散…...

告别转矩脉动:用Matlab/Simulink手把手搭建三电平SVPWM异步电机DTC仿真模型

三电平SVPWM异步电机DTC仿真:从零搭建到性能优化的Matlab实战指南 在电机控制领域,直接转矩控制(DTC)因其结构简单、动态响应快等优势,已成为交流调速系统的重要技术路线。然而传统两电平DTC系统存在的转矩脉动大、电流谐波高等问题&#xff…...

一文看懂推荐系统:召回05:从One-Hot到Embedding,工业界如何为海量ID类特征降维

1. 从One-Hot到Embedding:工业界的降维革命 第一次接触推荐系统时,我被一个简单的问题难住了:小红书有几亿用户和笔记,每个用户和笔记都有唯一ID,这些ID该怎么处理?直接存成数字显然不行,因为数…...

收藏!普通人零基础转行AI,3-5个月实现高薪就业的进阶指南

本文指出AI行业对非计算机专业人才的需求激增,半路转行者因具备行业经验而更具竞争力。文章澄清了转行AI的常见误区,强调“技术懂业务”是关键,并提供了普通人转行AI的3步走策略:选择AI算法、自然语言或应用工程师等低门槛岗位&am…...

VSCode安装clang-format插件及使用

VSCode安装clang-format插件及使用1.clang-format插件安装2.安装真正的格式化工具clang-format3.生成.clang-format配置文件并修改4.修改配置文件4.1全局配置文件修改4.2工作空间配置文件修改5.格式化代码1.clang-format插件安装 插件安装方式分为直接安装和离线安装两种。 直…...

收藏!AI黄金三年,小白也能入局的5大高薪岗位解析

文章分析了AI应用与智能体时代的就业趋势,指出AI正重塑各岗位能力结构并创造新职业。未来三年,企业对AI应用工程师、AIAgent设计师、AI自动化运营、AI产品经理及RAG应用构建等岗位需求激增,这些岗位门槛相对较低但薪资可观。文章强调&#xf…...

【51单片机一个按键切合初始流水灯按一下对半闪烁按一下显示时间】2023-10-16

缘由51单片机按键切换流水灯和时钟_嵌入式-CSDN问答 我想搞一个按键切换在初始状态流水灯按一下到双闪灯再按一下到时钟,可是之中如果用延时函数会导致CPU不能运行很多事情造成卡顿,利用中断的话定时检测的时间又不一样,我试着编译了代码但发…...

从 SU22 到 SU24,权限检查指示符和默认值的装载与落地治理

在 SAP 权限项目里,最容易被低估的一类数据,不是用户主记录,也不是 PFCG 角色本身,而是藏在 SU22 和 SU24 背后的权限检查指示符与授权默认值。很多团队在 DEV 系统里把角色调到绿灯,以为传到 QAS 和 PRD 以后就万事大吉,结果一到回归测试,业务顾问打开 VA01、ME21N、FD…...

从零部署OpenClaw:打造私有AI助手全流程指南

1. 项目概述:从零部署你的专属AI助手 如果你对AI Agent(智能体)感兴趣,想拥有一个能24小时在线、不仅能聊天还能帮你执行任务、操控浏览器、生成图片的私人助手,但又觉得技术门槛太高、无从下手,那么你来对…...

QFN封装芯片手工焊接实战:从焊盘处理到拖焊技巧

1. QFN封装芯片手工焊接前的准备工作 QFN(Quad Flat No-lead)封装芯片因其体积小、散热好、电气性能优异等特点,在现代电子设备中越来越常见。但0.5mm甚至更小的引脚间距,让很多工程师和DIY爱好者在手工焊接时望而却步。其实只要掌…...

别再死记硬背了!用这3个真实网络场景,彻底搞懂华为ACL的配置逻辑

华为ACL实战指南:3个典型场景解锁访问控制精髓 每次看到新手工程师面对ACL配置时一脸茫然的样子,我就想起自己当年在机房通宵排错的经历。访问控制列表(ACL)作为网络安全的"门禁系统",其重要性不言而喻&…...

深入解析BaiduNetdiskPlugin-macOS:逆向工程破解百度网盘速度限制的技术实践

深入解析BaiduNetdiskPlugin-macOS:逆向工程破解百度网盘速度限制的技术实践 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 在macOS平台上…...

私有云时代来临:AI NAS如何重塑你的数字生活?

超越传统存储,打造你的私人云端 在信息爆炸的时代,随着个人存储需求的激增和变化,以及个体对数据隐私和安全性的日益重视,外加AI的技术加持,一种大家也许并不熟知的存储解决方案——NAS迎来了发展机遇。 NAS是Network …...

ESXi 8.0 最低存储要求:8GB 起步,这样装最稳

在部署 VMware ESXi 8.0 虚拟化环境时,存储规划是基础且关键的一步,很多新手常混淆系统引导盘与虚拟机数据盘的要求。核心结论清晰:ESXi 8.0 最低需 8GB SD 卡 / USB 作为引导介质,同时必须搭配独立的数据存储;生产环境…...

macOS百度网盘SVIP破解完整指南:3步实现无限速下载

macOS百度网盘SVIP破解完整指南:3步实现无限速下载 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘的龟速下载而烦恼吗&…...

龙标管官方,凰标护民间:中国文化双轨时代到来@凤凰标志

龙标掌正统 凰标护民间 中国文艺进入「双轨」新时代官方有规制,民间有温度; 一龙定正统,一凰润众生。失衡百年:单轨秩序的盲区 长久以来,中国文艺创作领域存在一处结构性失衡:官方正统民间原创有规制、有标…...

Adobe-GenP 3.0:三步解锁Adobe全家桶的终极指南

Adobe-GenP 3.0:三步解锁Adobe全家桶的终极指南 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 还在为昂贵的Adobe Creative Cloud订阅费而烦恼吗&#…...

KeyboardChatterBlocker:拯救老旧机械键盘的免费开源防连击工具

KeyboardChatterBlocker:拯救老旧机械键盘的免费开源防连击工具 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 你是否遇到过…...

手把手教你用Intel System Debugger和DCI OOB盒子抓取开机日志(附CSME解码文件获取指南)

硬件调试实战:Intel System Debugger与DCI OOB盒子的替代方案指南 当主板开机卡死在LOGO界面或出现花屏时,传统调试工具链的突然失效往往让工程师陷入困境。我曾亲眼见过一位同事因为误改GDK7开发板的BIOS设置,导致价值上万的DCI-USB3调试线缆…...

革新Mac软件管理体验:Applite智能图形化工具深度解析

革新Mac软件管理体验:Applite智能图形化工具深度解析 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite 还在为繁琐的命令行安装而烦恼?是否曾因复杂的Hom…...