Adobe Firefly 路由与兜底调度

本文描述 Adobe Firefly 后端(adobe,mode=direct「Adobe Firefly 直连」)如何作为一个 特殊的 Firefly 成员挂入后端分组,并按 priority 参与同池调度,从而天然成为普通图像请求的 兜底层。标记为 adobeSourced 的 API 后端也属于 Adobe 语义候选。所有行为均可在下列源文件核对:

  • 调度选择:apps/web/src/features/image-backend-pool/service.tsselectPoolMemberfireflyOnly 判定、adobe 候选构造、候选合并/按 priority 排序均在此函数内)。
  • firefly 模型前缀识别:同文件 isAdobeFireflyModelIdfirefly- 前缀)。
  • force_firefly 透传:apps/web/src/features/image-generation/operations.ts (force_firefly / firefly-* 强制关闭 preferWebFirst)。

源码引用一律用函数名锚点(不写绝对行号),避免重构后行号漂移失真。

注意:本文中的具体数值取自下方「当前生产配置(示例,以 admin 实际为准)」。这些字段 全部在 admin 控制台「Adobe 后端」tab 与「分组」配置中可改,文档随配置而变。

1. adobe 作为分组成员如何参与调度

selectPoolMember 把一个分组(或其子组 child groups 展开后的多个分组)的三类成员一起 拉取为候选:

  • api:通用 OpenAI 兼容中转后端;其中 adobeSourced=true 的 API 后端可承接 Firefly 路由;
  • account:ChatGPT web / codex 账号后端;
  • adobe:Adobe Firefly 直连后端(本特殊成员)。

成员先通过分组、启用状态、冷却/错误状态、接口类型、并发容量和模型能力等条件过滤,再进入 同一个候选池。非空的 API「支持的模型 ID」必须与请求模型大小写无关地精确匹配;空列表保持 历史兼容的不限模型语义。

候选按以下顺序选取:

  1. previous_response_id 粘性绑定;
  2. session hash 粘性绑定;
  3. 显式指定的 preferred 成员;
  4. 常规负载均衡:先按 priority 升序(数字越小越先选),同优先级再按健康度分桶 (错误率/时延 EWMA、连败惩罚),最后按 lastAcquiredAtlastUsedAtcreatedAt 轮换。

排在前面的候选先尝试获取并发租约(concurrency 限额);若该候选已满额/被排除/暂时不可用, 继续尝试下一个。这就是「兜底」的机制本质:把 adobe 的 priority 设为一个大数,它在排序 中自然落到该组其它成员之后,只有当前面成员都限流/耗尽/不可切换时才会轮到它。

2. 当前生产配置(示例,以 admin 实际为准)

Adobe 后端「Adobe Firefly 直连」字段:

字段说明
modedirect本仓库直连 Firefly(非外部 adobe2api 网关)
所属分组混合分组(默认组,用户可选)经子组纳入 web/codex 成员
priority100大数 = 该组兜底层(见下)
concurrency10并发租约上限
always_active无视临时冷却始终入选(status=error 仍踢出)
supports_videotrue参与视频(图生视频)派发
enabled_modelsfirefly-gpt-image-2、firefly-gpt-image-1.5、firefly-nano-banana、firefly-nano-banana2、firefly-nano-banana-pro非空时仅调度和公开列出这些图像模型族;留空保持不限模型,兼容旧配置
默认 ratio1x1size 缺省/auto 时回退比例
默认 resolution2ksize 缺省/auto 时回退分辨率
gpt_image_qualityhighquality=auto/未选时的 detailLevel 取值依据
billing_multiplier1本后端计费倍率(与分组倍率相乘)

已配模型族倍率(系统设置 IMAGE_MODEL_MULTIPLIERS / VIDEO_MODEL_MULTIPLIERS,其余族默认 1):

  • 图像:{ gpt-image-2: 1, nano-banana-pro: 1.5 }
  • 视频:{ sora2: 1, sora2-pro: 2, veo31: 1.5 }

在「混合分组」里 adobe priority=100 是大数,而组内 web/codex 账号与 api 成员通常优先级更小 (数字更小先选),因此普通图像请求会优先打到 web/codex/api;只有当它们限流、耗尽配额或 返回可切换错误(见 service.ts 的 isImageBackendSwitchableError)时,调度才轮到 adobe 兜底出图。

3. 三种进入 adobe 的方式

selectPoolMemberfireflyOnly = forceFirefly || isAdobeFireflyModelId(requestedModel) 决定候选集是否收敛到「Adobe 语义后端」。据此有三种进入路径:

① 普通请求兜底(fireflyOnly = false)

  • 判定条件:请求模型是 gpt-image-* 等平台已识别图像模型,且未带 force_firefly
  • 候选集:api + account + adobe 一起按 priority 排序。
  • 结果:adobe 只是候选之一。是否真的轮到它,取决于 adobe 是否在用户所在分组、以及它的 priority 是否高于(数字大于)其它成员。当前配置下(priority=100)它是兜底层。

对于不带 firefly- 前缀的已知 Nano Banana 图像族(nano-banananano-banana2nano-banana-pro,可带尺寸/比例后缀),候选为 pool-apipool-adobe,两者按 priority 共同竞争;普通 Web/Codex 账号仍不参与。其他不带前缀的自定义模型(如 grok-*)仍只保留普通 API 后端。

视频的 veo31veo31-refveo31-fastkling-o3kling3 同样接受裸模型 ID, 但视频管线只选择 Adobe direct 后端;sora2sora2-pro 仍要求 firefly- 前缀。

② 模型名以 firefly- 开头(fireflyOnly = true)

  • 判定条件:requestedModelfirefly- 开头(如 firefly-nano-banana-pro-2k-16x9, 或只写族名 firefly-gpt-image-2)。
  • 候选集:普通 API 与 account 被过滤;adobeadobeSourced=true 的 API 后端共同 按上述优先级竞争。后者若配置了非空「支持的模型 ID」,也必须精确声明这个 firefly-* 模型。
  • 结果:显式选 Firefly 族出图,绕过 web/codex 与普通 API。

force_firefly: true(fireflyOnly = true)

  • 判定条件:请求带站内扩展标志 force_firefly(或 forceFirefly)为真。
  • 透传链:route/handlers → operations.ts(同时强制 preferWebFirst=false,见约 1123-1129 行)→ getEffectiveConfigresolveImageBackendPoolConfigselectPoolMemberforceFirefly 参数)。
  • 候选集:与 ② 相同,普通 API/account 被排除,保留 adobeadobeSourced API。
  • 结果:对任意模型(含普通 gpt-image)强制改用 adobe 出图;模型族解析见兼容转换文档。

4. 如果 adobe 不在用户所在分组会怎样

adobe 候选来自当前分组(含子组展开)。若用户被分到一个不含 adobe 成员的分组:

  • 方式 ②(firefly-* 模型)与方式 ③(force_firefly):候选收敛到 Adobe 语义后端;若该组既无 adobe 也无可用的 adobeSourced API,候选为空,selectPoolMember 返回 null,上层抛 ImageBackendPoolUnavailableError(「当前生图后端分组没有可用账号或 API」)。即对这两类 请求表现为「无可用后端」。
  • 方式 ①(普通请求):不受影响——候选仍有该组的 api/account 成员,照常出图,只是没有 adobe 兜底。

因此把 adobe 加入哪些分组、设何 priority,直接决定了「谁能用 firefly/强制 adobe」以及 「普通请求是否有 adobe 兜底」。这些都在 admin「Adobe 后端」tab 与分组配置里调整。

相关文档

  • 兼容转换(站内标准请求如何被改写成 Adobe 接受的格式):Adobe 兼容转换

On this page