导读:本期聚焦于杨建军创作的《如何通过Gemini API上传多模态文件并调用推理接口?》,敬请观看详情。如果你正在构建一个需要同时理解图片、音频、视频或PDF的应用,直接通过base64内联小文件可以应付简单场景,但文件一超过几MB就会遇到请求体过大、超时甚至被网关拒绝的问题。Gemini API为此提供了独立的文件上传通道,先把文件传到云端,再在多模态推理请求中通过fileData引用。这个机制不仅能处理更大的文件,还能反复使用同一份文件,减少重复传输。本文将拆解文件上传、状态查询、推理调用三个关键环节,给出Python和curl的完整示例,并说明不同媒体类型在提示词中如何组织、文件何时过期、以及常见错误码的排查思路。

Gemini API 针对图片、音频、视频、PDF 等非文本输入,提供了两种传递方式:一种是直接在请求体里放入 base64 编码的 inline_data,另一种是先通过 Files 服务上传到云端,再在推理时用 fileData 引用。对大文件或多轮复用的场景来说,后者明显更稳定,它能绕开 HTTP 请求体上限,也能减少每次请求的传输开销。本文聚焦文件上传与推理接口的配合方式,梳理从上传、状态确认到多模态提示词组织的完整链路,并给出可运行的 Python 与 curl 示例。

如何通过Gemini API上传多模态文件并调用推理接口?

一、文件上传通道与前置限制

文件接口的核心资源是 files。Python SDK 将上传封装为 genai.upload_file,REST 客户端则向 /v1beta/files 发送 multipart 请求。上传成功后不要急着调用推理,因为文件可能还处于 PROCESSING 状态,需要轮询或短暂等待,直到状态变为 ACTIVE。免费账号通常有单文件 20MB 的限制,付费方案可以放宽到 2GB;文件在云端默认保留 48 小时,之后会被自动清理,因此生产环境需要设计重传或持久化元数据机制。

支持的文件类型覆盖主流多媒体格式:图片包括 PNG、JPEG、WEBP、HEIC、HEIF;视频常见 MP4、MOV、AVI、MPEG、WEBM;音频支持 WAV、MP3、AAC、FLAC;文档则主要是 PDF。纯文本文件也可以上传,但如果只是小段文本,放进提示词里通常更直接。上传时要显式提供 MIME 类型,错误类型会导致后续推理阶段无法正确解码。显示名称 display_name 是可选的,但建议填写,便于在文件列表里定位。

import google.generativeai as genai

genai.configure(api_key="YOUR_API_KEY")

# 上传本地视频,display_name 便于在控制台或文件列表中识别
video_file = genai.upload_file(
    path="sample_video.mp4",
    display_name="会议录制示例"
)

print(f"已上传:{video_file.name}")
print(f"当前状态:{video_file.state.name}")

上面代码执行后,返回对象的 name 形如 files/abc123def456。这个 URI 是推理接口引用文件的关键凭证。大多数视频和音频文件在几秒内完成处理,但分辨率较高或时长较长的内容可能更久,建议用 get_file 查询状态,而不是盲目 sleep。状态枚举包括 STATE_UNSPECIFIED、PROCESSING、ACTIVE、FAILED,只有 ACTIVE 才表示模型可以读取。

二、在推理接口中引用 fileData

完成上传后,generateContent 请求不再直接携带二进制数据,而是用 file_data 指向云端 URI。Python SDK 支持更简洁的写法:直接把上传文件对象放进 contents 列表,SDK 内部会转换成对应的 fileData 结构。REST 调用则需要在 parts 数组里写清楚 mime_type 和 file_uri。这里的关键点是 file_uri 必须来自 files/ 前缀,不能用普通 HTTP 链接或云存储地址;模型只会从 Gemini 的文件服务中读取。

提示词组织上,多模态请求通常由文本 part 和文件 part 混合组成。模型会按照 parts 的顺序理解上下文,因此建议把指令性文本放在文件之前或之后保持一致,例如先用一行说明任务,再放文件引用。对于图片,可以直接要求模型描述对象、识别文字或判断差异;对于视频和音频,任务更适合总结、分段、提取关键时间点信息。单个请求里可以同时放多个文件,只要它们属于不同的 part,并且总 token 数不超过模型上下文窗口。

model = genai.GenerativeModel("gemini-1.5-pro")

response = model.generate_content([
    "请根据视频内容,提取会议中的行动项和负责人。",
    video_file
])

print(response.text)

如果使用 REST,可以发送如下 JSON。注意 file_uri 需要替换成实际上传后返回的 files/xxx。请求头保持 Content-Type: application/json,文件数据不要和 inline_data 同时使用,否则容易触发 400 错误。不同模型对 fileData 的支持范围略有差异,建议优先选择 gemini-1.5-pro 或支持多模态的系列,使用前查看模型能力说明。

curl -X POST \
  "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro:generateContent?key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [{
      "parts": [
        {"text": "请总结这段音频的要点并列出时间戳"},
        {"file_data": {"mime_type": "audio/mp3", "file_uri": "files/abc123def456"}}
      ]
    }]
  }'

三、查询、删除与错误排查

文件上传后,本地不再需要维护文件内容,但需要维护 name 和 mime_type。为了及时清理无用文件,可以调用 delete_file 主动删除,虽然平台会在 48 小时后回收,但主动删除有助于避免配额占用和潜在的泄漏风险。文件列表接口 files.list 可以查看当前项目下所有文件及其状态,适合排查文件是否存在一类问题。

# 查询单个文件状态
file_info = genai.get_file(video_file.name)
print(file_info.state.name)  # ACTIVE / PROCESSING / FAILED

# 列出所有文件
for f in genai.list_files():
    print(f.name, f.state.name, f.display_name)

# 删除不再使用的文件
genai.delete_file(video_file.name)
print("文件已删除")

常见错误码中,404 表示 file_uri 无效或文件已经被清理,此时可以重新上传并更新 name。400 往往与 MIME 类型不匹配、parts 结构不合法、或文件仍处于 PROCESSING 状态有关。429 则是配额或速率限制,可以降低并发、增加重试间隔。FAILED 状态可能由于文件本身损坏、编码不支持或上传中断造成,应该检查源文件完整性并重新上传。

另一个容易被忽略的问题是超时。大视频或长音频的推理时间可能显著长于文本请求,Python SDK 默认超时时间不一定够用。可以在初始化客户端时调整请求超时参数,或采用异步任务思路,先提交请求再轮询结果。若业务允许,也可以提前用 ffmpeg 类工具抽帧或裁剪音频,减少模型需要处理的时长,从而降低失败概率和 token 消耗。

四、多文件组合与混合媒体推理

Gemini API 的 parts 设计支持在一个提示词里同时放入文本、图片、音频、视频和 PDF。例如你可以上传一份 PDF 说明书和一张产品图片,然后询问模型该图片是否符合文档中的规格。对于需要跨媒体比对的场景,不必把不同文件拼成一张图或转成统一格式,直接按 part 顺序传入即可。模型内部会分别编码不同模态,再在注意力层进行融合。

实际代码里,多文件上传可以使用循环处理,并为每个文件保存返回对象。推理时把所有文件对象或 fileData 一起放进 generateContent。需要注意各文件的总输入 token 会累加,大视频尤其明显,可能快速逼近上下文窗口。建议先用文件 API 确认每个文件大小和时长,估计 token 占用,必要时用分段策略:视频按时间切分,音频按章节切分,图片按需缩放后再上传。

pdf_file = genai.upload_file(path="manual.pdf", display_name="产品手册")
image_file = genai.upload_file(path="product.png", display_name="产品图")

response = model.generate_content([
    "参照产品手册,检查图片中的连接方式是否合规,并指出风险点。",
    pdf_file,
    image_file
])

print(response.text)

从工程角度看,每次运行都重新上传文件并不经济。更合理的方案是在文件首次上传后,把 name、mime_type、上传时间、哈希值写入业务数据库,后续请求直接复用。只要文件还在 48 小时有效期内,推理接口可以反复引用。定时任务可以根据上传时间判断哪些文件即将过期,必要时自动重传并更新数据库中的 name,这样上层推理逻辑无需感知文件生命周期。

最后要区分上传文件和给模型传文件两个动作。前者是向 Gemini 文件服务写入数据,后者是在 generateContent 中声明引用。两者拆开后,文件上传可以独立于推理进行,也可以在前端直传后把 file_uri 回传给后端。只要保证最终推理请求里的 file_uri 正确且文件处于 ACTIVE 状态,多模态推理就能跑通。对于需要私有化部署或数据合规要求较高的场景,则需要评估文件在云端保留 48 小时是否符合政策,必要时选择内联 base64 小文件方案作为补充。

Gemini API多模态文件推理接口修改时间:2026-09-23 17:06:30

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/0923/60979.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。