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 美元,其中大概一半是你看完觉得"不行"的废片。
聪明的做法分两步:
- 全部先跑 360p 草稿,单价约 $0.33,200 条 ≈ 66 美元
- 人工筛掉一半,剩下 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. 准备
pip install google-genai
export GEMINI_API_KEY="你的 API Key" # 在 Google AI Studio 申请1. 最基础的文生视频(无状态)
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. 打开有状态:把结果留在服务端
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. 打开流式:让进度实时回来
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. 断线重连 / 异步回取 + 接力改片
# 进程重启后,用 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 中文文档