尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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 负责在任务结束后把文件整理并交给用户。这样文件生成和文件传递就分开了。
RELATED

相关推荐

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

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

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

📅 2026/10/4 16:27:08
Qt+OpenCV+Basler工业相机跨平台视觉控制系统开发实战

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

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

📅 2026/9/6 23:55:46
opencode 从客户端到命令行的完整迁移指南:安装、配置与实战

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

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

📅 2026/10/2 22:42:07
MORE NEWS

更多资讯

📰

FastCGI协议与PHP分片传输技术详解

1. FastCGI协议与PHP的交互机制解析FastCGI作为CGI协议的增强版本,从根本上解决了传统CGI进程频繁创建销毁的性能瓶颈。在PHP场景中,当Nginx等Web服务器接收到PHP请求时,通过FastCGI协议与php-fpm进程管理器通信,这个通信过程采用…

📰

Word/PDF解析到结构化XML:三层管线与语义标签映射

做内容中台和知识库的朋友大概都碰过这个活:手上一批 Word 交底文档、技术白皮书 PDF、还有一些扫描件,要求统一转成结构化 XML,喂给下游的检索、排版、归档系统。需求方一般只给一句话——“转成 XML”,但真正落地的时候你会发现…

📰

大语言模型的失效边界与推理坍缩现象解析

我无法根据当前输入生成符合要求的博文。原因如下:项目标题"The Tragic Alley of the LLM" 是一个隐喻性、文学化表达,字面意为“大语言模型的悲剧小巷”,但未提供任何实质性的技术指向、应用场景、问题现象或领域背景;…

📰

BQ40Z50中文手册:BMS保护、PF永久失效与阻抗跟踪调试

简介:面向电池管理系统开发与调试人员的BQ40z50中文数据手册,聚焦德州仪器电量计芯片在电动车、混合动力及储能电池系统中的充放电管理与安全保护。PDF共1个文件,包体约8.94MB,保留原手册章节结构,便于按目录检索。内容…

📰

多租户酒店订房系统架构设计与高并发优化实践

1. 项目概述:多店入驻酒店订房系统核心价值这套酒店订房系统源码最突出的特点在于"多店入驻"的架构设计,这直接解决了传统单体酒店管理系统无法规模化运营的痛点。我曾在2018年参与过一个地方连锁酒店的数字化改造项目,当时他们使用…

📰

Mermaid语法入门:技术文档可视化的高效解决方案

1. 为什么你需要掌握Mermaid语法?作为一名长期与Markdown打交道的技术写作者,我深刻体会到纯文本描述复杂逻辑时的无力感。三年前的一次项目文档编写经历让我彻底转向Mermaid——当时需要向团队解释一个微服务架构的调用流程,用文字描述花了三…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬