Agent 接收用户上传文件

发布时间:2026/10/26 20:44:07

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/10/23 5:21:40

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

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

2026/10/25 21:07:22

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

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

2026/10/24 14:21:50

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

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

2026/10/26 20:36:00

为Codex装上可视化仪表盘:让AI编码过程不再黑盒

说实话,用Codex跑任务的那段时间,我做的最多的一件事就是盯着终端窗口发呆。看着日志一行行刷过去,我经常忍不住问自己:它现在到底在干什么?分析到第几步了?改了哪几个文件?测试到底过没过&…

2026/10/26 20:36:00

HBA-Transformer混合架构在工业故障预测中的应用

1. 项目概述:HBA-Transformer混合架构的创新实践去年在做一个工业设备故障预测项目时,我遇到了传统Transformer模型在小样本场景下表现不稳定的问题。经过大量文献调研和实验验证,最终将蜜獾算法(HBA)的优化特性与Transformer结合&#xff0c…

2026/10/26 20:36:00

让AI活着:生产环境稳定性工程实践指南

“AI活着”这句话,我琢磨了好几个月。去年我把一个RAG对话系统从Demo推到生产环境,上线头两天一切正常,第三天晚上一次流量抖动,服务容器反复重启,模型接口连续超时,用户问了一句话:“你还在吗&…

2026/10/26 20:36:00

vLLM推理引擎架构与优化实践

1. vLLM推理引擎架构全景透视vLLM作为当前大模型推理领域的热门开源引擎,其核心价值在于通过创新的内存管理和调度机制,显著提升GPU利用率并降低推理延迟。我在实际部署Llama2-70B和Qwen等百亿参数模型时,单A100节点上的吞吐量相比传统方案提…

2026/10/26 20:36:00

3D透明材质特效字体设计与实现全攻略

1. 透明材质特效字体的视觉魅力在数字设计领域,3D透明材质特效字体正成为视觉表达的新宠。这种设计风格通过材质透明度和光线折射的巧妙组合,创造出晶莹剔透的视觉效果,让文字仿佛由玻璃、水晶或冰块构成。不同于传统的立体字设计&#xff0c…

2026/10/26 20:30:58

数据流分析:从控制流图到编译器优化实战

你写下一行赋值,之后再没读过那个变量,编译器却一声不吭地把它删了;你写了一个 if 分支,两边算出来的其实是同一个常量,它直接把分支拍平成一条直线;你在循环里留了个累加器,只在调试打印时用过…

2026/10/26 0:20:20

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/26 1:53:47

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/26 0:20:17

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/26 0:00:48

Nested Learning:解决AI灾难性遗忘的分层记忆架构

1. 为什么AI需要"记忆"能力?在传统深度学习模型中,我们常遇到一个根本性问题:模型在处理新任务时,往往会完全遗忘之前学到的知识。这种现象被业界称为"灾难性遗忘"(Catastrophic Forgetting)。想象一下&#…

2026/10/26 0:00:48

企业级大模型应用:OCR预处理、Dify编排与DeepSeek落地实战

1. 这不是“用大模型”,而是重构工作流的起点“大模型的应用和工具”——这八个字现在被贴在无数技术分享、招聘JD、内部立项书的标题栏里,但绝大多数人点进去后看到的,是零散的API调用示例、几个开源UI截图、或者一句“接入LLM就能降本增效”…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑