Agent 文件传递

发布时间:2026/10/27 0:59:09

Agent 文件传递 1. 问题目前 Agent 已经可以在工作目录中创建和处理文件但这些文件都保存在后端服务器上前端无法直接访问。因此需要增加一个中间环节把 Agent 生成的文件交给用户。这里采用对象存储的方式Agent生成文件 ↓ 工作目录 ↓ 打包 ↓ MinIO ↓ 生成下载链接 ↓ 前端下载这样 Agent 仍然只负责处理自己的工作目录文件交付由后续流程完成。2. 对象存储**对象存储Object Storage**主要用于保存图片、视频、压缩包等非结构化文件。和普通文件系统相比对象存储更适合通过程序进行文件上传和访问。可以简单理解成一个可以通过 API 操作的网盘。本项目使用MinIO。MinIO 是一个开源对象存储服务可以直接部署在自己的服务器上并提供 Python SDK。这里使用 MinIO 主要是因为项目本身可以本地部署没有必要为了文件存储再依赖第三方云存储。3. MinIO 部署项目使用 Docker 部署 MinIO。docker pull minio/minio mkdir -p /usr/local/minio-data docker run -p 9000:9000 -p 9190:9090 \ --name minio \ -d --restartalways \ -e MINIO_ROOT_USERminio \ -e MINIO_ROOT_PASSWORDminio123 \ -v /usr/local/minio-data:/data \ minio/minio server /data --console-address :9090启动后可以通过http://服务器IP:9190进入 MinIO 管理页面。如果是在本机部署则使用http://localhost:9190登录后即可看到 MinIO 的管理界面。4. Python SDK安装 MinIO 的 Python SDKpip install minio最基本的操作就是连接 MinIO、创建 Bucket、上传文件以及生成下载链接。from minio import Minio client Minio( localhost:9000, access_keyminio, secret_keyminio123, secureFalse )项目实际只需要用到其中两个操作上传文件 生成下载链接下载链接使用presigned_get_object()生成。它返回的是一个带有效期的 URL用户拿到链接后可以直接下载文件不需要知道 MinIO 的账号密码。5. 文件传递方案5.1 为什么需要打包一个 Agent 任务不一定只生成一个文件。例如工作目录/ ├── result.docx ├── data.xlsx ├── image.png └── output.pdf如果逐个上传并生成链接前端还需要处理多个文件。因此这里直接将整个工作目录打包成一个 ZIP工作目录 ↓ output.zip ↓ MinIO ↓ 一个下载链接用户只需要下载一个文件即可。5.2 为什么放到 Agent 结束之后处理文件上传不属于具体工具的功能。例如create_file工具只负责创建文件如果让它同时负责上传就会让工具本身承担文件交付的工作。因此将这部分放到FileMiddleware中在 Agent 执行完成后统一处理。6. 开始实现6.1 添加 ZIP 压缩方法在utils/doc_utils下增加zip_files.py。使用 Python 自带的shutil直接压缩目录import os import shutil def compress_dir(folder_path): 将目录压缩成 zip output_path shutil.make_archive( base_namefolder_path, formatzip, root_diros.path.dirname(folder_path), base_diros.path.basename(folder_path) ) return output_path这里没有额外引入压缩库项目目前的需求比较简单标准库就够用了。6.2 添加 MinIO 配置MinIO 的地址和认证信息放到.env中HOST_IPlocalhost MINIO_PORT9000 MINIO_ACCESS_KEYminio MINIO_SECRET_KEYminio123然后在配置文件中统一读取HOST_IP os.getenv(HOST_IP) MINIO_PORT os.getenv(MINIO_PORT) MINIO_ENDPOINT f{HOST_IP}:{MINIO_PORT} MINIO_ACCESS_KEY os.getenv(MINIO_ACCESS_KEY) MINIO_SECRET_KEY os.getenv(MINIO_SECRET_KEY)这样代码中不需要直接写 MinIO 的连接信息部署到其他环境时只需要修改环境变量。6.3 封装 MinIO 连接在conn下新建minio_conn.py。不直接在 Middleware 中操作 MinIO SDK而是简单封装一层from minio import Minio from base import configs as cfg class MinioConn: def __init__(self): self.client self.create_client() self.bucket_name stores self._init_bucket() def create_client(self): return Minio( cfg.MINIO_ENDPOINT, access_keycfg.MINIO_ACCESS_KEY, secret_keycfg.MINIO_SECRET_KEY, secureFalse ) def _init_bucket(self): if not self.client.bucket_exists(self.bucket_name): self.client.make_bucket(self.bucket_name) def upload_obj(self, object_name, file_path): self.client.fput_object( self.bucket_name, object_name, file_path ) def gen_presigned_url(self, object_name): return self.client.presigned_get_object( self.bucket_name, object_name )这里暂时只保留项目需要的两个方法upload_obj() gen_presigned_url()Bucket 在初始化时检查不存在就自动创建。7. 接入 FileMiddlewareMinIO 部分准备好之后最后需要把它接到 Agent 的执行流程中。首先在FileMiddleware初始化时创建 MinIO 连接class FileMiddleware(AgentMiddleware[CustomState]): def __init__(self): super().__init__() self.mc MinioConn()然后利用before_agent和aafter_agent两个生命周期节点完成文件处理。7.1 记录开始时间在before_agent中记录当前任务的开始时间。原因是工作目录可能本身就存在一些文件不能每次 Agent 执行结束都把整个目录当成新文件。因此需要知道Agent 开始执行之后有没有产生新的文件。7.2 Agent 执行结束后处理文件主要逻辑放在aafter_agentasync def aafter_agent(self, state, runtime): dir_path rt.get_root_thread_dir() # 判断任务期间是否产生新文件 if not await self._check_if_new_file( dir_path, state[start_work_time] ): return None # 压缩目录 local_path await asyncio.to_thread( compress_dir, dir_path ) # 上传 MinIO object_name os.path.basename(local_path) await asyncio.to_thread( self.mc.upload_obj, object_name, local_path ) # 生成下载链接 url self.mc.gen_presigned_url(object_name) return { messages: [ AIMessage(content可通过如下地址下载), AIMessage(contenturl) ] }这里压缩和上传都属于比较明显的文件 I/O 操作因此使用asyncio.to_thread()执行避免直接阻塞当前异步流程。如果任务期间没有产生文件则直接返回不进行压缩和上传。8. 测试可以直接在 Agent Chat UI 中测试例如做个 a.txt随便写点什么Agent 完成后可以看到返回结果中多了一条下载链接。整个过程实际上就是创建 a.txt ↓ Agent 执行结束 ↓ 检测到新文件 ↓ 工作目录压缩成 ZIP ↓ 上传 MinIO ↓ 生成 Presigned URL ↓ 返回给前端点击链接即可下载 Agent 生成的文件。9. 修改后的目录本次主要涉及以下几个文件.env # MinIO 配置 base/ └── configs.py # 读取 MinIO 配置 conn/ └── minio_conn.py # MinIO 连接、上传、生成下载链接 content/ └── middles/ └── file_manager_middle.py # Agent 执行结束后的文件处理 utils/ └── doc_utils/ └── zip_files.py # 工作目录压缩10. 小结这一部分实际上没有改变 Agent 原来的文件处理方式只是在原来的工作目录后面增加了一个文件交付流程Agent工作目录 ↓ 检测新文件 ↓ ZIP ↓ MinIO ↓ Presigned URL ↓ 用户Agent 继续在自己的工作目录中操作文件Middleware 负责在任务结束后把文件整理并交给用户。这样文件生成和文件传递就分开了。
延伸阅读

更多相关文章

2026/10/24 11:10:52

Cursor 入门指南:从安装到高效使用的 AI 代码编辑器

在实际写代码的过程中,工具选型往往比想象中更影响效率。Cursor 就是这样一款把 AI 能力直接嵌入编辑器流程的编程助手,它既能像普通代码编辑器一样打开项目、搜索文件、运行命令,又能在对话、补全、修改代码时调用大语言模型帮助你完成编码任…

2026/10/25 11:00:48

Qt+OpenCV+Basler工业相机跨平台视觉控制系统开发实战

简介:机器视觉系统通常由图像采集、处理与显示组成,而工业相机的稳定出图与实时算法处理是核心环节。以Basler相机为代表,借助pylon SDK完成底层取流,再通过OpenCV实现边缘检测、ROI定位等算法,最后以Qt构建跨平台GUI&…

2026/10/25 5:53:28

opencode 从客户端到命令行的完整迁移指南:安装、配置与实战

很多开发者第一次接触 opencode,是被桌面客户端吸引的。图形界面把对话区、文件树、结果预览都摆在了明面上,看起来比黑底白字的终端友好得多。可一旦把真实项目交给它,比如一次横跨多个文件的重构、一批测试用例的生成、或者一段需要反复执行…

2026/10/27 0:57:34

AI代理必备:确定性视频渲染框架HyperFrames实战解析

做AI代理久了,你迟早会遇到一个非常折磨人的问题:模型参数完全一样,Prompt完全一样,连随机种子都固定了,跑出来的结果就是有细微差别。一开始我怀疑是模型推理的随机性,把温度系数调到0还是对不上。直到有一…

2026/10/27 0:57:34

SAM2图像分割模型:零样本迁移与实战部署指南

1. SAM2模型概述:重新定义图像分割的开源利器Segment Anything Model 2(SAM2)是Meta公司继第一代SAM模型后推出的升级版开源图像分割工具。这个模型最吸引人的特点是"开箱即用"——官方不仅开放了预训练权重,还提供了完…

2026/10/27 0:57:34

具身智能多模态数据集RealOmni的技术解析与应用

1. 项目背景与行业意义在人工智能领域,具身智能(Embodied AI)正成为最具潜力的发展方向之一。与传统的"纯软件"AI不同,具身智能强调智能体在物理环境中的感知、交互和学习能力。这种能力对于服务机器人、工业自动化、智…

2026/10/27 0:57:34

AI提示流编排器的工业级可靠性设计

1. 这不是写提示词,是在构建AI时代的“电路板”:为什么提示流编排器必须从工业级可靠性出发你有没有试过这样调用大模型:把用户输入塞进一个固定模板,填完变量就发出去,等返回再硬切字段?我做过——三个月前…

2026/10/27 0:57:34

AI音乐创作提示词设计指南与实战技巧

1. AI音乐创作中的提示词设计原理音乐创作领域正在经历一场由AI技术驱动的变革。作为一名在音乐科技领域工作多年的从业者,我见证了AI音乐生成工具从简单的旋律模仿到如今能够创作完整作品的演进过程。在这个过程中,提示词(prompt&#xff09…

2026/10/27 0:52:33

别被“首飞成功”带偏:拆解飞行汽车eVTOL的工程化真相

1. "首飞成功"这四个字,含金量能差出十年几年前我第一次被这类消息"骗"到,是在一个行业群里。有人丢进来一段视频,几十秒,一架造型科幻的机器垂直升起、悬停、平稳落下,配文是"飞行汽车首飞成…

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/27 0:02:28

WorkBuddy_新建任务与工作模式19_“模式选错”的典型代价

“模式选错”的典型代价 摘要 在软件工程中,设计模式、架构模式、并发模式乃至团队协作模式的选择,往往在项目早期就决定了后续的开发效率和维护成本。本文通过多个真实场景,剖析“模式选错”带来的典型代价——包括返工成本、技术债务累积、…

2026/10/27 0:02:28

WorkBuddy_新建任务与工作模式20_新手推荐路径

新手推荐路径 摘要 在 AI 辅助开发工具快速普及的今天,新手面对最多的困惑往往不是"工具够不够强",而是"我该从哪一步开始用"。本文提出一条经过实践验证的三阶段学习路径:先从 Ask(问答式交互)起…

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

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

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