把上传、模型输入和检索当成三层能力。Files API 负责创建和管理 File;Responses 的 input_file 负责把单次文件送进模型;File Search 则把文件加入 Vector Store 后做可扩展检索。三层的大小、格式、到期和计费规则不同,不能因为拿到了 file_id 就默认后续一定可用。
官方资料(2026-10-31 核对):Upload file reference · File inputs guide · Files lifecycle reference · File Search guide · Uploads API
Files API、文件输入和 File Search 有什么区别?
| 能力 | 对象 | 适合 | 关键边界 |
|---|---|---|---|
| Files API | File / file_id | 上传、列出、读取、下载、删除、到期 | 只管理文件,不会自动调用模型或建立检索库 |
| Responses file input | input_file | 让一次模型请求直接阅读文件 | 文件和请求合计限制独立于上传限制 |
| File Search | Vector Store + File | 在较大知识库中做语义和关键词检索 | 需要入库和处理状态,存储及检索规则独立 |
| Batch | JSONL File | 离线批量 API 请求 | purpose=batch,当前 JSONL 上限 200 MB |
| Uploads API | Upload + Parts | 大文件分片上传 | 最多 8 GB,但下游用途仍可能更小 |
第一步:按用途上传文件
生产站点应由自己的服务端持有 API Key 并读取本地或对象存储文件。普通模型文件输入使用 user_data;不要把 API Key 或文件上传能力直接暴露给匿名浏览器。
import fs from "fs";
import OpenAI from "openai";
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY
});
const file = await openai.files.create({
file: fs.createReadStream("./document.pdf"),
purpose: "user_data",
expires_after: {
anchor: "created_at",
seconds: 604800
}
});
console.log({
id: file.id,
filename: file.filename,
bytes: file.bytes,
expiresAt: file.expires_at
});
expires_after.seconds 当前允许 3,600 到 2,592,000 秒,即从 1 小时到 30 天。purpose=batch 默认 30 天后到期;其他用途默认持续保存到手动删除。若业务不需要长期复用,主动设置到期并在数据库记录所有者、用途和到期时间。
purpose 应该怎么选?
| purpose | 适合 | 不要混用 |
|---|---|---|
user_data | Responses 等模型文件输入 | 不是 Batch 或微调训练集标签 |
batch | Batch API 输入 JSONL | 必须满足 Batch 的 JSONL 格式与大小 |
fine-tune | 微调数据 | 当前只支持符合要求的 JSONL |
vision | 视觉微调图片 | 不是普通图片问答的通用 purpose |
evals | 评测数据集 | 不等于普通模型输入 |
assistants | Assistants API 文件 | 新 Responses 文件输入优先使用 user_data |
第二步:用 file_id 调用 Responses
得到 File 对象后,可以在 Responses 请求中加入 input_file。PDF 会同时提取文本和页面图片;Word、PowerPoint、文本和代码等非 PDF 文件通常只提取文本,内部图片和图表不会被抽取。需要保留图表视觉信息时,先转换为 PDF。
const response = await openai.responses.create({
model: "gpt-6-astra",
input: [{
role: "user",
content: [
{
type: "input_file",
file_id: file.id
},
{
type: "input_text",
text: "请总结这份文件,并列出需要核实的数字。"
}
]
}]
});
console.log(response.output_text);
Responses 还支持 Base64 file_data 和外部 file_url;Chat Completions 的文件内容部分当前只支持 PDF,并且不支持外部文件 URL。非 PDF 文档优先使用 Responses,或由应用先提取文本再发送。
四组大小限制不要混淆
| 位置 | 当前限制 | 说明 |
|---|---|---|
POST /v1/files | 单文件 512 MB | 项目总文件存储 2.5 TB;上传接口当前每个认证用户 1,000 RPM |
| Responses input_file 请求 | 每个文件小于 50 MB;请求内合计 50 MB | 即使已上传 512 MB 文件,也不代表可以直接作为单次模型输入 |
| Batch input | JSONL 最高 200 MB | 同时必须符合 Batch 行结构和目标端点规则 |
| Uploads API | 总计最多 8 GB;每 Part 最多 64 MB | 解决分片上传,不放宽下游端点限制 |
项目文件存储和 Vector Store 存储不是同一个概念。File Search 需要把 File 附加到 Vector Store 并等待处理完成;大知识库应使用 File Search,而不是把所有文档塞进一次 50 MB 的模型请求。
PDF、文档和表格会怎样解析?
- PDF:视觉模型会同时接收提取文本和页面图片,因此图表更完整,但 Token 用量也可能更高;Responses 可用
detail控制页面图像细节。 - Word、PPT、文本和代码:提取文本,非 PDF 文件里的图片或图表不会进入模型上下文。
- Excel、CSV、TSV:Responses 使用表格增强流程,当前最多解析每个 Sheet 的前 1,000 行,并添加模型生成的摘要和表头元数据。
- 大规模表格分析:复杂聚合、连接和图表更适合 Hosted Shell 或应用自己的数据处理层。
文件输入会消耗模型上下文和输入 Token。PDF 同时包含文本与页面图像时更明显;上线前应结合 API Usage 指南记录文件类型、大小、页数、模型和实际 usage。
如何列出、读取、下载和删除文件?
const page = await openai.files.list({
purpose: "user_data",
order: "desc",
limit: 100
});
const metadata = await openai.files.retrieve(file.id);
const content = await openai.files.content(file.id);
// 删除是有影响的写操作
const deleted = await openai.files.delete(file.id);
List 支持 after 游标、limit、order 和 purpose 过滤。File 对象里的 status 与 status_details 已标记为弃用,不要用它们判断 Vector Store 是否完成摄取;File Search 应查看 Vector Store File 或 File Batch 的处理状态。
官方说明删除 File 会把它从所有 Vector Store 中移除。删除前应确认它没有被正在运行的 Batch、微调、评测、Responses 流程或知识库引用;删除接口必须验证租户所有权、权限和业务状态,并记录审计事件。
大文件什么时候使用 Uploads API?
直接 Files 上传超过 512 MB 时,可以评估 Uploads API:先声明总字节、文件名、MIME 和 purpose,得到一个 1 小时后失效的 Upload;再把文件切成最多 64 MB 的 Parts,可并行上传;最后按正确顺序提交 part_ids 完成。完成时实际字节必须与创建时声明一致,成功后返回可复用的 File 对象。
POST /v1/uploads创建 Upload,并保存 upload_id。POST /v1/uploads/{upload_id}/parts上传每个 Part。- 保存所有 part_id 和原始顺序,可选计算 MD5 做完整性校验。
POST /v1/uploads/{upload_id}/complete提交有序 part_ids。- 使用返回的
upload.file.id,再次检查目标用途的大小和格式限制。
Upload 过期或不再需要时应取消;不要因为 Uploads 支持 8 GB 就假设 Responses、Batch 或 File Search 会接受同样大小。
上线前检查清单
- 上传路由只在服务端调用 OpenAI,API Key 未进入浏览器、日志或 Git。
- 验证登录、租户、文件所有者、扩展名、MIME、真实大小和业务配额。
- purpose 与目标用途一致,普通模型输入使用 user_data。
- 区分 512 MB 上传限制、50 MB 模型输入限制、200 MB Batch 限制和 8 GB Uploads 上限。
- 数据库保存 file_id、原文件名、bytes、purpose、created_at、expires_at、租户和业务引用。
- 非 PDF 文件的图表需求已评估,必要时转换 PDF。
- 大知识库使用 Vector Store/File Search,并等待摄取完成。
- List 使用游标分页;不再依赖已弃用的 File status。
- 删除前检查 Batch、微调、评测、Responses 和 Vector Store 引用。
- 文件到期、删除、失败重试、恶意文件、跨租户访问和孤儿文件清理都有测试。
需要把 file_id 加入 Vector Store、等待摄取完成并配置 Responses 工具;完整流程见 OpenAI File Search 指南。
常见问题
OpenAI Files API 是做什么的?
它把文件上传为可复用的 File 对象,并提供列出、读取元数据、下载内容和删除等生命周期接口。得到的 file_id 可以按 purpose 用于 Responses 文件输入、Batch、Fine-tuning、Evals、Vision fine-tuning 或 File Search 等后续流程。
普通文档上传应该使用什么 purpose?
如果文件要作为模型输入,官方建议使用 user_data。Batch 输入用 batch,微调用 fine-tune,视觉微调用 vision,评测数据用 evals。purpose 会影响文件用途、格式校验和默认到期行为,不能随便填写。
Files API 的 512 MB 和文件输入的 50 MB 有什么区别?
512 MB 是 POST /v1/files 单个文件的上传上限;模型请求中的 input_file 另有每个文件小于 50 MB、同一请求全部文件合计 50 MB 的限制。某些用途还有更小限制,例如 Batch JSONL 当前最高 200 MB,因此上传成功不等于一定能用于目标端点。
Responses 和 Chat Completions 都能读取 Word、Excel 和 PDF 吗?
不完全相同。Responses 支持官方列表中的 PDF、文本、代码、文档、演示文稿和表格,并可使用 file_id、Base64 或外部 URL;Chat Completions 的文件内容部分当前只支持 PDF,不支持文件 URL。非 PDF 文件通常应优先使用 Responses。
上传的文件会自动删除吗?
purpose=batch 的文件默认 30 天后到期;其他 purpose 默认持续保存到手动删除。上传时可以设置 expires_after,当前支持从创建时间起 1 小时到 30 天。应用仍应保存 file_id、expires_at 和业务所有者,并按最小保留原则清理。
删除 File 会影响 File Search 吗?
会。官方删除接口说明,删除 File 会把它从所有 Vector Store 中移除。生产环境应先确认该 file_id 是否仍被 Responses、Batch、Fine-tuning、Evals 或 File Search 引用,并把删除设计为需要授权和审计的动作。
大于 512 MB 的文件应该怎么上传?
Files 的直接上传接口单文件上限是 512 MB;Uploads API 支持把大文件分成最多 64 MB 的 Part,总计最多 8 GB。Upload 创建后 1 小时过期,完成时要按顺序提交 part_ids,且总字节必须与创建时声明一致;最终返回可供平台使用的 File 对象,但下游用途仍有自己的格式和大小限制。
要自行生成和存储文本向量,请先设计切分与索引版本,再阅读 OpenAI Embeddings API 教程。
本文核对日期为 2026-10-31。文件格式、大小、存储、上传速率、模型输入和下游用途限制可能调整,上线前请再次读取官方 Files、File inputs、File Search、Batch 与 Uploads 文档。
音频转录单文件当前最高 25 MB,不能套用 Files API 的 512 MB;格式、分片和流式结果见 OpenAI Audio API 指南。
用 File ID 作为 Responses 图像输入、直接上传参考图到 Images Edit,以及普通 Files API 生命周期是三套边界;生成、编辑与 Mask 详见 OpenAI Images API 教程。