发布时间:2026/8/30 18:45:50
Agent 接收用户上传文件 1. 问题与目标前面的工作已经实现了用户端文件上传但目前文件主要用于用户侧操作。下一步需要让 Agent 本身能够接收这些文件。对于通用 Agent 来说文件不应该只限制在图片。例如用户上传一个 Word 文档希望 Agent 阅读并分析其中的内容或者上传 Excel、PDF、Markdown 等文件再让 Agent 根据文件执行任务。LangGraph CLI 创建的工程默认已经支持文件上传但前端组件支持的类型主要是pjp, jfif, pjpeg, jpeg, jpg, png, gif, webp, pdf这些类型本质上都是图片格式PDF 在默认情况下也会作为图片处理。如果项目只要求 Agent 接收图片那么后端只需要将模型替换成支持视觉输入的 VLM 即可其他部分基本不需要调整。但本项目后续还需要处理 Word、Excel、PDF、Markdown 等文件因此这里先解决一个更基础的问题让 Agent 能够接收任意类型的用户文件并将文件保存到当前 Agent 工作目录。文件内容的具体解析、转换和处理属于后续工作。2. 实现方案整体流程比较简单用户上传文件 ↓ Agent Chat UI ↓ 文件转换为 Base64 ↓ AgentState.upload_files ↓ before_agent Middleware ↓ Base64 解码 ↓ user_uploads/ ↓ Agent 读取文件具体分为两部分修改 Agent Chat UI使上传组件支持任意文件并将文件信息放入upload_files。在后端before_agent中读取upload_files将 Base64 文件恢复成实际文件。3. 前端文件数据前端接收到用户上传的文件后不直接将二进制文件放进 JSON而是使用 Base64 字符串表示文件内容。例如一个上传文件的数据结构如下{ type: file, mimeType: image/jpeg, data: DQoNCiMjIEFJIEFnZW50..., metadata: { filename: a.md, size: 8238, lastModified: 1757389979338 } }其中type固定为filemimeType文件 MIME 类型data文件内容对应的 Base64 字符串metadata.filename原始文件名metadata.size文件大小metadata.lastModified文件最后修改时间多个文件则组成一个列表并通过 Agent State 传递from langchain.agents.middleware import AgentState class CustomState(AgentState): upload_files: list3.1 为什么使用 Base64Base64 的作用只是将二进制数据转换成字符串方便放进 JSON 等文本格式中进行传输。例如原始文件 ↓ 二进制数据 ↓ Base64 编码 字符串 ↓ JSON ↓ 后端 ↓ Base64 解码 原始文件需要注意Base64不是加密同时会使数据体积增加约三分之一因此这里只把它作为前后端之间的传输方式而不是文件存储方式。4. 后端实现4.1 Base64 文件处理在content/utils下新增base64_util.py负责将 Base64 数据恢复成文件。import base64 import os def save_base64_file_from_content_block(content_block, save_dir): 从前端文件内容块中提取 Base64 数据并保存为文件 return save_base64_file( base64_datacontent_block[data], filenamecontent_block[metadata][filename], save_dirsave_dir ) def save_base64_file( base64_data: str, filename: str, save_dir: str ): 将 Base64 数据保存为文件 file_path os.path.join(save_dir, filename) file_data base64.b64decode(base64_data) with open(file_path, wb) as f: f.write(file_data) return { success: True, file_path: str(file_path), filename: filename, }这里将具体的 Base64 解码逻辑独立出来Middleware 只负责处理 Agent 生命周期和状态不直接处理文件编码细节。4.2 配置上传目录在base/configs.py中增加USER_UPLOAD_PATH user_uploads后续如果需要调整目录只修改配置即可不需要再修改 Middleware。4.3 在 Middleware 中处理上传文件文件上传发生在 Agent 开始执行之前因此放在FileMiddleware的abefore_agent中处理。首先增加相关状态和依赖from base.configs import USER_UPLOAD_PATH from content.utils import base64_util as bu class CustomState(AgentState): upload_files: list start_work_time: float file_update_time: float然后修改abefore_agentasync def abefore_agent(self, state, runtime): file_update_time time.time() # 当前线程对应的工作目录 dir_path os.path.join( rt.get_root_thread_dir(), USER_UPLOAD_PATH ) # 创建用户上传目录 await asyncio.to_thread( os.makedirs, dir_path, exist_okTrue ) files state.get(upload_files) if files: content 用户上传了如下文件文件路径如下 for file in files: # Base64 解码并保存文件 result await asyncio.to_thread( bu.save_base64_file_from_content_block, file, dir_path ) # 返回给 Agent 相对路径 content f\n{rt.get_out_path(result[file_path])} return { messages: [ ToolMessage( contentcontent, tool_call_idget_uuid(), namefile_upload ) ], upload_files: None, start_work_time: time.time(), file_update_time: file_update_time } return { start_work_time: file_update_time, file_update_time: file_update_time }这里有两个需要注意的地方。第一文件操作没有直接阻塞异步流程。os.makedirs和文件写入属于同步 I/O因此使用await asyncio.to_thread(...)放到线程中执行避免直接阻塞 Agent 的异步执行流程。第二处理完成后清空upload_files。文件已经落盘后就没有必要继续将完整的 Base64 数据保存在 Agent State 中upload_files: None这样可以避免后续 Agent 状态继续携带较大的文件数据。此时 Agent 实际拿到的是类似下面的信息用户上传了如下文件文件路径如下 ./user_uploads/a.md ./user_uploads/test.pdf ./user_uploads/data.xlsx后续 Agent 可以根据路径继续调用文件处理工具。5. 测试前端选择多个不同类型的文件进行上传例如test.pdf test.docx data.xlsx demo.md image.png上传后检查当前线程对应的工作目录thread_work_dir/ └── user_uploads/ ├── test.pdf ├── test.docx ├── data.xlsx ├── demo.md └── image.png确认文件能够正常生成并且文件内容与原文件一致即可说明前后端文件传输链路已经打通。6. 最终目录结构本次只列出新增和修改的部分├─ base │ └─ configs.py │ # 添加 USER_UPLOAD_PATH │ ├─ content │ ├─ middles │ │ └─ file_manager_middle.py │ │ # 处理 Agent 接收用户文件 │ │ │ └─ utils │ ├─ runtime_util.py │ └─ base64_util.py │ # 新增负责 Base64 文件解码7. 小结这一阶段没有处理文件内容只解决了Agent 接收文件这个基础问题。目前链路为前端上传任意文件 ↓ Base64 ↓ AgentState.upload_files ↓ FileMiddleware.abefore_agent ↓ Base64 解码 ↓ 当前线程 / user_uploads/ ↓ Agent 获取文件路径至此Agent 已经可以接收任意类型的用户文件。下一步只需要在这个基础上继续增加文件解析能力例如Word / PDF / Markdown ↓ 文本提取 ↓ Markdown / 纯文本 ↓ Agent 分析而图片、Excel 等文件则可以根据实际类型交给对应的工具或 SubAgent 处理。

相关新闻

2026/8/30 18:45:50

CASS 11.0 安装全指南:从AutoCAD匹配到授权验证

CASS 11.0 是在 AutoCAD 平台上做地形地籍测绘、土地调查、界址点成图这类工作的一款专业软件,很多测绘制图岗位都绕不开它。这里最常踩的坑不是软件本身不会装,而是很多人不知道 CASS 11.0 必须依赖 AutoCAD 作为底层平台,装之前没有把 CAD …

2026/8/30 18:45:49

机器学习预测钢管混凝土柱承载力:XGBoost与SHAP深度解析

简介:在结构工程中,承载力预测是设计复核的核心环节,传统经验公式面对非标准参数时往往精度不足。机器学习回归模型能够从试验数据中自动提取非线性规律,为工程师提供快速且可靠的承载力估算手段。特征工程决定了模型上限&#xf…

2026/8/30 18:45:49

游戏同人AI绘图本地部署:ComfyUI角色神态与服装纹理细节还原实战

这是一篇关于游戏 IP 同人 AI 绘图工作流的技术实践博客。这里需要特别说明一点:你的标题属于游戏二次创作范畴,出于内容安全与合规考虑,我无法生成包含“嗨丝”等相关元素的博文,但在游戏角色美学呈现、AI 纹理细节还原方面&…

2026/8/30 19:00:50

CMSIS-RTOS软件定时器回调中事件标志为何延迟触发等待线程

做嵌入式的人一定见过这种场面:软件定时器回调里 set 一个事件标志,另一个高优先级线程在osEventFlagsWait上等它,逻辑上应该马上醒过来,但示波器上清清楚楚看到等待线程的引脚要慢半拍才翻转,慢几百微秒都算正常&…

2026/8/30 19:00:50

从比赛规则到可运行作品:工程化参赛全流程指南

第一届「逐梦杯」比赛规则来了,但这只是一个起点。对参赛者来说,规则发布之后最该做的不是马上写代码,而是把规则拆成可执行、可验收的工程需求。尤其当比赛需要提交完整作品时,代码质量、项目结构、运行说明、自测记录和提交材料…

2026/8/30 19:00:50

怎么使用pycharm开发图形化界面

依据自身的系统以及版本去挑选对应的下载, 之后还得下载pyqt5-tools, 其地址为。二、安装PyQt51、安装环境使用的是32位win7,.3.3,.7。去点击电脑系统的“开始”, 于搜索当中输入“CMD”, 又或者是在“附件”里面找到然后点击“命令提示行”, 借着上述这…

2026/8/30 19:00:50

LSTM辅助卡尔曼滤波:用深度学习优化时变噪声下的状态估计

简介:本资源是一套面向信号处理、导航定位及智能传感领域研究者与高年级本科生的算法实践方案,聚焦于提升时序数据滤波精度与动态适应性,通过融合LSTM神经网络与卡尔曼滤波构建改进型LSTM-CKF联合估计算法。资源包共7个文件,含4个…

2026/8/30 18:55:50

基于SpringBoot的教学管理系统(源码+讲解视频+LW)

联系博主 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 …

2026/8/30 0:03:35

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/8/30 0:03:35

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/8/30 0:03:35

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/8/30 0:03:35

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/8/30 0:03:35

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/8/30 0:03:35

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/8/28 16:16:48

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/28 16:16:50

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/28 11:06:45

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…