news 2026/9/12 9:43:26

如何先用 Files API 获取预签名上传地址再把文件引用传给 Composio 工具

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何先用 Files API 获取预签名上传地址再把文件引用传给 Composio 工具

如何先用 Files API 获取预签名上传地址再把文件引用传给 Composio 工具

【免费下载链接】composioComposio powers 1000+ toolkits, tool search, context management, authentication, and a sandboxed workbench to help you build AI agents that turn intent into action.项目地址: https://gitcode.com/GitHub_Trending/co/composio

如果你的工具要读取一个文件(例如给GMAIL_SEND_EMAIL带附件、给 Google Drive 上传文件),直接把字节塞进 API 请求体会让请求体过大。Composio 的 Files API 解决的就是这个问题:先调用 upload-request 接口拿到一个预签名上传地址,把文件内容直接PUT到该地址,再把返回的文件引用传给工具的入参。Composio 把文件存在对象存储里,工具在自身侧解析文件引用,API 请求体中始终不经过原始字节。

前提是你已经有一个项目 API key,所有 Files 端点都通过x-api-key请求头携带它。生产 API 的 Base URL 是https://backend.composio.dev(见仓库中 openapi-v3.json 的 servers 定义)。端点说明见 Files 概述 和 Files API 参考。

如果 Agent 是在 session 沙箱里操作文件,文档建议优先使用 session file mount(沙箱把上传文件暴露给运行代码),配套upload_local_filesmart_file_extract等辅助方法;本文聚焦的是通过 Files API 手动完成上传再传引用的流程。

第一步:请求预签名上传地址

调用POST /api/v3/files/upload/request(v3.1 对应/api/v3.1/files/upload/request)。请求体有 5 个必填字段:

字段说明(文档原文用途)
toolkit_slug文件所属应用的 slug,文档示例如"gmail""slack"
tool_slug文件所属动作的 slug,文档示例如"GMAIL_SEND_EMAIL""SLACK_UPLOAD_FILE"
filename原始文件名,文档示例如"quarterly_report.pdf"
mimetype原始文件的 MIME 类型,文档示例如"application/pdf""image/png"
md5文件的 MD5 hash,文档说明其用于去重和完整性校验

文档在 OpenAPI 规范里给出了 Gmail 附件场景的示例请求值(toolkit_sluggmailtool_slugGMAIL_SEND_EMAILmd5a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6),那是文档示例值;实际调用时filenamemimetypemd5要换成你自己文件的值,md5文档只说明用途、未规定计算命令。

your_composio_key替换为你的项目 API key:

curl -X POST "https://backend.composio.dev/api/v3/files/upload/request" \ -H "x-api-key: your_composio_key" \ -H "Content-Type: application/json" \ -d '{ "toolkit_slug": "gmail", "tool_slug": "GMAIL_SEND_EMAIL", "filename": "quarterly_report.pdf", "mimetype": "application/pdf", "md5": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" }'

成功时返回200,响应体包含这些字段:

  • id:该 request file 的 ID;
  • key:对象存储中的上传位置;
  • new_presigned_url:用于上传的预签名 URL;
  • metadata.storage_backend:值为s3azure_blob_storage,决定下一步是否要加额外请求头。

注意:响应中的newPresignedUrltype两个字段已标记为[DEPRECATED],文档明确要求使用new_presigned_url。文档示例中new_presigned_url形如https://storage.composio.dev/projects/pr_1a2b3c4d5e6f/requests/slack/document_9mZn4q.docx?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=3600...,实际 URL 以接口返回为准。

该接口还会检查是否已存在相同 MD5 hash 的文件来做去重,因此重复上传同一内容时行为可能命中已有对象。可能的错误响应为400401403404410,响应体均为 Error schema。

第二步:把文件字节 PUT 到预签名地址

拿到new_presigned_url后,把文件内容直接上传到这个 URL,而不是发给 Composio API:

curl -X PUT --data-binary @quarterly_report.pdf "$NEW_PRESIGNED_URL"

$NEW_PRESIGNED_URL是上一步响应中的new_presigned_url值。这一步的副作用是把本地文件内容发送到对象存储;预签名 URL 是带时效的临时地址,超期需要重新请求。

如果响应里metadata.storage_backendazure_blob_storage,上传时要加上x-ms-blob-type: BlockBlob请求头(s3则不需要):

curl -X PUT \ -H "x-ms-blob-type: BlockBlob" \ --data-binary @quarterly_report.pdf \ "$NEW_PRESIGNED_URL"

第三步:把文件引用传给 Composio 工具

上传完成后,工具入参里传的是文件引用而不是原始字节。文档给出的文件引用形态是{ "name", "mimetype", "s3key" }描述符,两种用法:

Python SDK 在自动文件处理关闭时,把已暂存的文件描述符直接作为工具参数传入tools.execute

result = composio.tools.execute( "GOOGLEDRIVE_UPLOAD_FILE", user_id="user-1", arguments={"file_to_upload": prestaged_descriptor}, dangerously_skip_version_check=True, # required when running "latest" )

其中prestaged_descriptor即文档所说的{ "name", "mimetype", "s3key" }字典,文件由你自己的流水线(或上游步骤)预先暂存到 Composio 存储。

TypeScript SDK 提供了composio.files.upload(...),它内部完成同样的暂存过程,返回的fileData直接作为工具参数传入:

import { Composio } from '@composio/core'; import path from 'path'; const composio = new Composio({ apiKey: process.env.COMPOSIO_API_KEY, toolkitVersions: { googledrive: 'latest' }, }); // 暂存本地文件,得到 { name, mimetype, s3key } 描述符 const fileData = await composio.files.upload({ file: path.join(__dirname, 'document.pdf'), toolSlug: 'GOOGLEDRIVE_UPLOAD_FILE', toolkitSlug: 'googledrive' }); // 把描述符作为文件参数传给工具 await composio.tools.execute('GOOGLEDRIVE_UPLOAD_FILE', { userId: 'user-1', arguments: { file_to_upload: fileData }, dangerouslySkipVersionCheck: true, // required when running "latest" });

document.pdf是文档示例中的路径,换成你要上传的文件;user-1换成你的用户标识。文档同时说明:自动文件处理默认关闭,打开dangerouslyAllowAutoUploadDownloadFiles: true(TypeScript)或dangerously_allow_auto_upload_download_files=True(Python)后,可以直接把本地路径传给接受文件的工具,SDK 会自行上传并转换成工具期望的格式;但本地路径必须落在fileUploadDirs/file_upload_dirs配置的白名单目录内。

以上执行示例来自 Executing tools directly,其中工具执行要求配置 toolkit 版本("latest"需配合dangerouslySkipVersionCheck)。

验证方式与可选检查

判断流程是否走通,看两处返回:

  1. upload-request 返回200且包含new_presigned_urlkeymetadata.storage_backend,说明预签名地址已生成;
  2. 对预签名地址的PUT成功后,工具调用返回其正常执行结果(如 Google Drive 的文件详情,文档示例为result.data包含 Google Drive file details)。

另外,GET /api/v3/files/list可以列出工具生成的文件,支持toolkit_slugtool_slug两个查询参数过滤,limit最大 50,支持 cursor 分页;响应包含items(每项含toolkit_slugtool_slugfilenamemimetypemd5)和分页字段。这个端点文档描述为“列出工具生成的文件”,可用于核对工具侧产生的文件记录。

限制与边界

  • 上传是两步流程,第二步必须直接打预签名地址,API 侧永远不接收原始字节;预签名 URL 示例中带X-Amz-Expires=3600参数,说明地址有时效,过期后需重新请求。
  • newPresignedUrltype字段已废弃,代码中不要再依赖。
  • 该流程适用于“工具执行时读写文件”的场景;session 沙箱内处理文件应改用 session file mount,二者不要混在同一条链路里。

【免费下载链接】composioComposio powers 1000+ toolkits, tool search, context management, authentication, and a sandboxed workbench to help you build AI agents that turn intent into action.项目地址: https://gitcode.com/GitHub_Trending/co/composio

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 9:43:20

ProxyPin 抓包工具实战:5 步从第一次抓包到改写请求

ProxyPin 抓包工具实战:5 步从第一次抓包到改写请求 【免费下载链接】network_proxy_flutter Open source free capture HTTP(S) traffic software ProxyPin, supporting full platform systems 项目地址: https://gitcode.com/GitHub_Trending/ne/network_proxy_…

作者头像 李华
网站建设 2026/9/12 9:42:57

如何在宝塔面板部署 SiYuan:从应用商店安装到访问设置

如何在宝塔面板部署 SiYuan:从应用商店安装到访问设置 【免费下载链接】siyuan An open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间,让人与智能体在此协作…

作者头像 李华
网站建设 2026/9/12 9:39:07

10个提升网站排名的核心SEO技巧与实战方法

1. SEO优化概述:为什么网站排名至关重要在当今数字化时代,搜索引擎优化(SEO)已成为网站获取流量和用户关注的关键策略。一个经过精心优化的网站能够在搜索引擎结果页(SERP)中获得更高的排名,从而…

作者头像 李华
网站建设 2026/9/12 9:36:06

本地智能体实战:用Hermes+Qwen3替代WorkBuddy

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华