---
url: /omni/omni_flash_stateful_streaming.md
description: >-
  2026年9月17日谷歌在 Interactions API 上线 Gemini Omni Flash 有状态（store:true）与 SSE
  流式（stream:true）视频生成，服务端暂存视频与交互状态、实时推送进度、支持异步回取。本文讲清它解决了什么问题、怎么用、值多少钱。
---

# 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`。

## 进阶

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