Adobe 没有公布一次 Firefly API 调用的美元价。它公布了另外两个数字,而做预算真正要用的正是这两个:一次 API 动作消耗几个 Operation,以及你的组织每分钟能发多少请求。
两个数字都白纸黑字写在官方文档里,只是分在两页,搜索引擎很少把它们配到一起。想把它们放进同一份预算表,只能自己动手拼。
Adobe 公布了什么,没公布什么
费率卡开门第一句就划定了自己的范围:「This page covers usage charges for enterprise features on the Operations credit system.」接着把计费拆成两条路:一条是「Direct headless API calls use the applicable Firefly Services operation rates」,另一条走工作流,按完成后的产出计,因为「workflow rates apply to production workflow execution and reflect the completed workflow output rather than each underlying Firefly Services operation.」
两条路可以吃同一个池子:「Both usage paths may draw from the customer’s pooled Operations entitlement.」
费率卡通篇只给计数,既没有写最低承诺量,也没有写试用额度,更没有写任何币种。要拿它做预算,就得再确认两件事:你所在的组织走的是哪条路径,以及合同里一个 Operation 的实际单价是多少。后者只能从 Adobe 那边拿到。
这整套东西所属的平台是 Firefly Services,它「includes Firefly APIs, Lightroom APIs, Photoshop APIs, and Content Tagging APIs」。请求怎么写见我们的接入指南,本文讲挂在请求上的那块表。
凭证与开始计量的令牌
在请求通过验证之前不计费,Adobe 这句话说得很死:「Every request made to Firefly APIs must include an encrypted access token.」
前置条件与取令牌
文档明说这不是自助开通:「This tutorial assumes you have worked with your Adobe Representative and have the following:」一个 Developer Console 账号,以及「a project with Firefly API OAuth Server-to-Server credentials set up」。
# scope 字符串与令牌端点均照官方文档。
export FIREFLY_SERVICES_CLIENT_ID=<your_Client_ID>
export FIREFLY_SERVICES_CLIENT_SECRET=<your_Client_Secret>
curl --location 'https://ims-na1.adobelogin.com/ims/token/v3' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode "client_id=$FIREFLY_SERVICES_CLIENT_ID" \
--data-urlencode "client_secret=$FIREFLY_SERVICES_CLIENT_SECRET" \
--data-urlencode 'scope=openid,AdobeID,session,additional_info,read_organizations,firefly_api,ff_apis'
官方给的响应示例是 {"access_token":"yourExampleTokenAsdf123","token_type":"bearer","expires_in":86399},并补了一句「each access token is valid for 24 hours」。常驻的 worker 应该定期刷新,而不是开机缓存一次用到底。
发一次异步生成请求
图像端点是 POST https://firefly-api.adobe.io/v3/images/generate-async。决定你 Operation 数量的字段是变体数,因为一次 HTTP 调用可以扇出成多个可计费产出。
# 请求两个变体,成功时就是两个可计费 Operation。
curl -X POST 'https://firefly-api.adobe.io/v3/images/generate-async' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H "x-api-key: ${FIREFLY_SERVICES_CLIENT_ID}" \
-H "Authorization: Bearer ${FIREFLY_SERVICES_ACCESS_TOKEN}" \
-d '{
"prompt": "a red kite over wet sand at low tide, wide shot",
"numVariations": 2,
"size": { "width": 2688, "height": 1536 }
}'
一次调用怎么变成一个 Operation
费率卡里 Firefly 那张表很短,也很直白。每一行把动作和它计量的工作量配在一起。
| API 动作 | Operation 定义 |
|---|---|
| Generate Image | 1 Operation = 1 image |
| Fill Image | 1 Operation = 1 image |
| Expand Image | 1 Operation = 1 image |
| Auto Crop | 1 Operation per API call |
| Generate Similar Images | 1 Operation = 1 image |
| Generate Object Composite | 1 Operation = 1 image |
| Generate Video, 540p | 0.4 Operations = 1 second 视频 |
| Generate Video, 720p | 1 Operation = 1 second 视频 |
| Generate Video, 1080p | 2 Operations = 1 second 视频 |
表下那行脚注才是决定预算的句子:「Firefly APIs include parameters that allow for multiple images to be generated with each API call.」计费跟的是产出,不是请求:一次调用要两个变体,就是两个 Operation。
Auto Crop 是这张表里唯一的例外:它按 API 调用计,而不是按产出计。同一张表里同时存在两种计量方式,所以批量裁剪的成本不能套用「一张图一个 Operation」的直觉。

限流与重试循环
限流按组织执行,不按密钥也不按项目:「4 requests per minute (RPM)」与「9,000 requests per day (RPD)」。括号里那句对已经申请过提额的人尤其重要——就算每分钟提到了 4 次以上,每天的天花板照样生效。提额只动了每分钟那一半,每天那一半没有动。
429 长什么样
超出任一上限返回「HTTP 429 Too Many Requests」。Adobe 给的处置清单先是减少请求,然后是「implement retry logic via a retry-after HTTP header or an exponential backoff strategy」,最后才是找客户经理提额。同一页把限流的理由归成三条:防止滥用、避免宕机、控制成本。
import time
import requests
TOKEN = "yourExampleTokenAsdf123"
API_KEY = "your-client-id"
ENDPOINT = "https://firefly-api.adobe.io/v3/images/generate-async"
def post_with_backoff(payload, attempts=5):
"""优先遵守官方文档里的 retry-after,其次退避重试。"""
fallback = 1.0
for _ in range(attempts):
response = requests.post(
ENDPOINT,
headers={
"Content-Type": "application/json",
"Accept": "application/json",
"x-api-key": API_KEY,
"Authorization": f"Bearer {TOKEN}",
},
json=payload,
timeout=60,
)
if response.status_code == 429:
time.sleep(float(response.headers.get("retry-after", fallback)))
fallback = min(fallback * 2, 60)
continue
response.raise_for_status()
return response.json()
raise RuntimeError("rate limit persisted after retries")
轮询异步任务并核算用量
创建调用会回一个 jobId、一个 statusUrl 和一个 cancelUrl;Adobe 说后两个可以用来查状态或取消,终态是 succeeded 与 failed。
把产出折算成 Operations
既然 Operation 是按产出定义的,报价就该按回来的东西算,而不是按发出去的东西算。下面这段读一份任务日志,套用官方给的系数。
"""按 Adobe 费率卡的系数把任务日志折算成 Operations。"""
from decimal import Decimal
# Generate、Fill、Expand、Generate Similar、Object Composite 都是
# 每张图 1 个 Operation。这里传产出总张数,不是 HTTP 调用次数。
OPERATIONS_PER_IMAGE = Decimal("1")
# Generate Video,Video Model 1。
OPERATIONS_PER_VIDEO_SECOND = {
"540p": Decimal("0.4"),
"720p": Decimal("1"),
"1080p": Decimal("2"),
}
def operations(images=0, video_seconds=0, video_resolution="720p"):
total = Decimal(images) * OPERATIONS_PER_IMAGE
total += Decimal(video_seconds) * OPERATIONS_PER_VIDEO_SECOND[video_resolution]
return total
def generative_credits(op_units):
# 费率卡:1 API Operation = 100 Generative Credits。
return op_units * 100
batch = operations(images=120, video_seconds=30, video_resolution="1080p")
print(batch) # 180 operations
print(generative_credits(batch)) # 18000 generative credits
这两个数字旁边得放两句提醒。换算是单位换算,不是定价:算出来的是积分,而一个积分值多少美元 Adobe 没有公布。另外费率卡里 Generate Image 那一行不区分模型代数,所以它本身回答不了「Firefly Image 5 是不是比 Firefly Image 4 贵」。
生成积分与 Operations 的区别
费率卡结尾是两行换算表:「1 API Operation」等于「100 Generative Credits」,后面还有一句「fractional conversions apply; credits are converted proportionally and not rounded up to a whole operation.」正因为允许小数,540p 视频的一秒才值 0.4 个 Operation 而不是一个。
把这两个单位当成两个不同问题的答案会更好用:Operations 回答平台做了什么,生成积分回答订阅被消耗了多少。混着用来报价,算出来的数字一定会偏。
两个单位属于不同的入口:网页端按生成积分计量,我们的档位拆解把它对应到具体方案;API 按 Operations 计量。Adobe 把它们写在两页上,从来没有画等号,所以订阅里的积分余额不等于 API 额度。
API 文档里也没有任何试用额度;这块另见Adobe Firefly 是否免费,端点到底在生成什么见 Image 5 上手。
常见问题
Firefly API 生成一张图要多少钱? 官方没有公布任何每 Operation 的美元价,只给了 Operation 计数与积分换算。
我每分钟能发多少请求? 每组织 4 requests per minute、9,000 requests per day;更高上限要找客户经理。
一次 API 调用等于一个 Operation 吗? 不一定。计费跟产出走,费率卡也注明这套 API 支持一次调用产出多张图。
生成积分和 Operation 是同一个东西吗? 是不同入口上的不同单位。官方给的桥是 1 API Operation = 100 Generative Credits,且允许按比例取小数。
模型代数会影响价格吗? 费率卡里没有这一项,它的 Generate Image 行不区分 Image 4 与 Image 5。
把官方公布的两个数字做进预算,按产出而不是按调用记账,并把货币单位当成一个尚未公布的东西。