Skip to content

Gemini Omni Flash 有状态与流式视频生成:两个开关,把 AI 视频从「盲盒」变成「流水线」

先描述一个我觉得每个调过视频生成 API 的人都经历过的姿势。

你发出请求,然后开始盯着终端。

一分钟。两分钟。光标不动,日志不吐,进度条不存在。你不敢 Ctrl+C,因为一中断,刚才那次调用就彻底蒸发了——钱可能扣了,也可能没扣,你甚至没法确认。

等它终于返回,你拿到的是一个巨大的 base64 字符串,得自己 decode、自己落盘、自己想办法记住"这条视频当时用的什么提示词",以便五分钟后想改个光线时能接得上。

这不叫开发,这叫守着一台不知道什么时候出片的洗衣机

2026 年 9 月 17 日,谷歌在 Gemini Enterprise Agent Platform 的更新日志里悄悄加了一条:

Gemini Omni Flash supports stateful (store: true) and server-sent event (SSE) streaming (stream: true) video generation in the Interactions API in Preview.

翻译成人话:你可以让服务端替你存着视频,也可以让服务端一边生成一边告诉你进度了。

两个布尔值。但它们是 AI 视频从"玩具"走向"能进生产环境"的其中两块砖。

什么是有状态与流式视频生成

先把这两个词拆开,别被术语吓到。

有状态(store: true)

以前调视频生成 API,是无状态的:我发一句提示词,你返回一段视频,然后我们俩就两清了,谁也不记得谁。

你想改?可以,把整段提示词连同上下文重新描述一遍,重开一轮。模型和服务器都不记得上一条视频长什么样。

开了 store: true 之后,这次生成变成了一个留在服务器上的"交互"(interaction)

  • 生成的视频会被临时存在服务端,你不用急着把 8MB 的 base64 搬回本地
  • 这次交互的状态被记住了,下一次请求可以直接接着它往下改
  • 交互保留时长上限默认 55 天(付费使用,也允许配置成更短)

这意味着"改视频"从"重开一局"变成了"接着上一句往下说"。

一句话记住它:store: true 把一次性买卖,变成了一段可以续杯的关系。

流式(stream: true)

视频生成是个慢活儿,几十秒到几分钟都正常。传统调用是同步阻塞:请求发出去,连接一直挂着,直到最终结果一次性返回。

开了 stream: true,接口改用 SSE(Server-Sent Events,服务端推送事件):连接建立后,服务端会像弹幕一样持续往回推状态更新——排队中、生成中、进度到哪了、最后把结果推过来。

你可以:

  • 实时拿到进度更新和最终输出
  • 也可以用 unary(一次性)或 streaming(流式)的 GET 请求,去回取已经完成的异步交互

也就是说,就算你的进程崩了、网络断了,只要记得那个 interaction id,回来还能把结果捞回来。

以前断线 = 白干。现在断线 = 换个窗口接着取。这个差别,在批量任务里值很多钱。

它到底解决了什么(特点一览)

  • 不用再干等stream: true 提供 SSE 进度推送,长任务终于有了"进度条"这种文明产物
  • 结果不用自己搬store: true 让视频和交互状态存在服务端,本地只留一个 id
  • 断线可恢复:异步交互支持用 GET 请求回取,进程重启不丢结果
  • 改视频不用重述:通过 previous_interaction_id 接力,在前一条视频基础上继续改
  • 批量任务友好:几十上百条视频的后台队列,终于不用每条都挂一个长连接死等
  • 和 Omni 1.1 Flash 的能力叠加:这条链路背后是 2026 年 8 月 27 日发布的 Gemini Omni 1.1 Flash,自带 10 秒上下文延展(累计最长 40 秒)、360p 草稿模式、1080p/4K 放大
  • 水印照旧:所有生成的视频都带不可见的 SynthID 水印,在 Gemini App、Chrome、Search 里可被检测验证

场景:钱和时间的账,具体怎么算

光说特性没意思。我们按官方公开定价算几笔账,你就知道这两个开关什么时候真有用。

Gemini Omni Flash 的定价是 $0.10 / 秒视频,720p、24fps。一条 10 秒的片段,就是 1 美元。而 Omni 1.1 Flash 新增的 360p 草稿模式,官方口径是速度最快提升约 60%、成本约为标准 720p 的三分之一。

场景一:电商批量出片(草稿模式 + 有状态)

假设你要给 200 个 SKU 各出一条 10 秒的展示短片。

傻办法是每条直接生成 720p:200 × $1 = 200 美元,其中大概一半是你看完觉得"不行"的废片。

聪明的做法分两步:

  1. 全部先跑 360p 草稿,单价约 $0.33,200 条 ≈ 66 美元
  2. 人工筛掉一半,剩下 100 条再跑 720p 成片,100 × $1 = 100 美元

合计约 166 美元,比直接全量生成省了约 17%,但更关键的是——你筛出来的那 100 条,是基于看过的画面筛的,不是凭提示词猜的。

这里 store: true 的作用是:草稿阶段的交互留在服务端,你筛完之后,直接拿 interaction id 接力,让它在同一条基础上出高清版,不用重新描述一遍产品细节。

场景二:批量后台队列(流式 + 异步回取)

短视频团队一天要出 300 条素材,全都塞进后台队列跑。

没有 stream: true 时,你的 worker 进程得为每一条任务挂一个几十秒的长连接,300 条意味着要么排队排很久,要么开一堆并发把连接数打满。

有了 SSE 之后,worker 可以订阅进度事件,把"排队中 / 生成中 / 完成"写进任务表,前端直接显示进度;就算 worker 崩了,用 interaction id 发个 GET 就能把结果捞回来重入队。

这就是从"跑脚本"到"跑服务"的区别。

场景三:对话式改片(有状态接力)

谷歌官方演示过一类玩法:用户拿手机自拍一张,Omni Flash 把它变成一段带特效的短视频——比如从屏幕里拉出 3D 气球文字,或者把水从屏幕里倒进玻璃杯。

真实创作里更常见的用法是这样一条链:

生成一条 6 秒的咖啡杯特写
  → "改成清晨的光"
  → "加上从杯口升起的热气"
  → "镜头缓慢左移"
  → "把这条延长到 20 秒"

每一步都建立在上一步之上,模型会尽量保留你没提到的部分:杯子还在原位,只是光和运动变了。

没有 store: true,你得每轮把整段视频重新传一遍;有了它,你只需要说"改哪里"。

我个人的立场:如果你想认真用 AI 做视频,previous_interaction_id 这条链路比"提示词写得多漂亮"重要得多。前者是工作流,后者是玄学。

快速上手:四段代码跑通

注意:以下为 Preview 期的示意写法,字段名以官方文档「Generate videos from text」为准,接口在正式 GA 前可能调整。

0. 准备

bash
pip install google-genai
export GEMINI_API_KEY="你的 API Key"   # 在 Google AI Studio 申请

1. 最基础的文生视频(无状态)

python
import base64, os
from google import genai

client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])

interaction = client.interactions.create(
    model="gemini-omni-1.1-flash",
    input="一颗弹珠沿着多米诺骨牌轨道快速滚动,镜头连续平滑跟拍。",
    response_format={"type": "video", "aspect_ratio": "16:9"},
)

with open("marble.mp4", "wb") as f:
    f.write(base64.b64decode(interaction.output_video.data))

2. 打开有状态:把结果留在服务端

python
interaction = client.interactions.create(
    model="gemini-omni-1.1-flash",
    input="一颗弹珠沿着多米诺骨牌轨道快速滚动,镜头连续平滑跟拍。",
    response_format={"type": "video", "aspect_ratio": "16:9"},
    store=True,        # ← 关键开关
)

print(interaction.id)   # 把这个 id 存进你的数据库,它就是这条视频的句柄

3. 打开流式:让进度实时回来

python
stream = client.interactions.create(
    model="gemini-omni-1.1-flash",
    input="一颗弹珠沿着多米诺骨牌轨道快速滚动,镜头连续平滑跟拍。",
    response_format={"type": "video", "aspect_ratio": "16:9"},
    store=True,
    stream=True,       # ← 关键开关,走 SSE
)

for event in stream:
    # 事件类型与进度字段以官方文档为准,这里只看有没有货
    print(event.type, getattr(event, "progress", ""))

4. 断线重连 / 异步回取 + 接力改片

python
# 进程重启后,用 id 把结果捞回来
done = client.interactions.get(id=interaction.id)

# 在原片基础上继续改,不用重新描述整个场景
next_turn = client.interactions.create(
    model="gemini-omni-1.1-flash",
    previous_interaction_id=interaction.id,   # ← 接上一轮
    input="把光线改成清晨,镜头稍微推近一点。",
    store=True,
    stream=True,
)

几个容易踩的坑

先说清楚,免得你兴冲冲跑起来再骂街:

  • 这是 Preview,不是 GA。谷歌自己标了 Preview,意味着格式、限流、定价都可能变。生产环境请做好降级方案
  • 单次生成上限仍是 10 秒。想拿 40 秒得靠 1.1 Flash 的场景延展一段段续,而且每段都要重新付费
  • 4K 是放大,不是原生生成。它的价值在交付环节,别指望放大能凭空变出细节
  • 交互有保存期限。默认最长 55 天,超期之后那条视频就不能再接力改了——需要长期留存的素材,老老实实下载到本地
  • 地区限制仍在。欧洲经济区、瑞士、英国的用户在编辑自己上传的视频时有额外限制(编辑模型自己生成的视频不受影响)
  • 真人姓名和肖像会被拦。涉及真实人物的请求会被安全策略挡回来,这是防深度伪造的硬限制,别费劲绕
  • 所有输出都带 SynthID 水印。发布时建议在文案里标注"AI 生成",合规要求,同时也是个卖点
  • 中文 prompt 能跑,但英语更稳。中文能出片,抽卡率高一些,要有心理准备

写在最后

回头看这两个开关,其实挺朴素的:一个解决**"结果放哪",一个解决"现在到哪了"**。

没有任何一项是模型变强了。画质没变,时长没变,价格也没变。

但做过生产系统的人都知道,能力能不能落地,往往卡在这些一点都不性感的管道活儿上。你没法给一个没有进度条、断线就丢结果、每次修改都要重述一遍上下文的接口设计产品——用户会骂人,运维会辞职。

2024 年大家比"能不能动",2025 年比"像不像真的",2026 年比"能不能控"。而"能不能控"这事儿,一半在模型,一半在接口。

给新手最实在的建议:先别急着写代码。打开 Google Flow 或 Gemini 应用,生成一条视频,然后试着用一句话让它改。当你发现它真的只改了你说的那部分、其他都保留着的时候——那个感觉,就是这套 API 想给你的东西。

然后你再回来加那两个 true

进阶

更多开源技术干货和学习资料,关注公众号「遇码」,领取专属福利。

Gemini中文文档