Block 成本计量
AutoGPT Platform 是计量收费 SaaS——每个 Block 执行都扣 credit。今天讲 Block 怎么定价:六种成本类型、静态/动态、按参数定价。
👶 小白:一个块不应该是固定价吗?为什么价格还能随参数变?
👨🏫 老师:因为同一个"调 LLM 块",你选 GPT-4 和选便宜小模型,平台付给上游的钱差好几倍,成本必须跟着变。cost_filter 就是"当参数满足某条件时用这个价"的匹配规则——像打车"选豪华车型单价更高"。所以定价能精确到"用哪个模型、跑多少量",而不是一刀切,既不亏本也不乱收。
credit 钱包
平台内部货币叫 credit(积分),1 credit = 1 美分。用户有余额,每次 Block 执行按价格表扣费,用 Stripe 充值(Day 16)。
BlockCost 六种类型
BlockCostType(blocks/_base.py:99)——一个 Block 可以按六种方式之一计价:
| 类型 | 怎么算 | 例 |
|---|---|---|
RUN | 每次运行固定扣 N 分 | 普通块 |
BYTE | 按输入字节数 | 处理大文件 |
SECOND | 按运行秒数(N分/M秒) | E2B 代码执行 |
ITEMS | 按返回条目数 | Apollo 搜索 |
COST_USD | 按供应商实际美元花费折算 | Jina 网页搜索 |
TOKENS | 按 LLM token 数查表 | LLM 块 |
静态 vs 动态成本
六种类型分两组(_base.py:113):
- 静态成本(
RUN/BYTE):执行前就能算准(跑一次就是固定价、字节数已知)。 - 动态成本(
SECOND/ITEMS/COST_USD/TOKENS):执行后才知道(不跑完不知道用了几秒、几个 token)。is_dynamic=True。
cost_filter:按参数定价
BlockCost 有个 cost_filter——让"同一个 Block、不同输入参数"能有不同价格。看真实例子(block_cost_config.py:580):
SearchTheWebBlock: [
BlockCost(cost_amount=150, cost_type=BlockCostType.COST_USD,
cost_filter={"credentials": {"id": jina_credentials.id, ...}}),
]
# Ideogram:V2 收 12 分、V3 收 14 分(block_cost_config.py:607)——靠 cost_filter 按 model 区分
cost_filter={"model":"V2"} → 12 分、cost_filter={"model":"V3"} → 14 分。执行时输入是
{"model":"V3", "prompt":"一只猫"} → 引擎逐条子集匹配:{"model":"V3"} ⊆ 输入 ✓ → 命中第二条 → 本次扣 14 分。若输入是 V2 则扣 12 分。一个块、一份代码,靠 cost_filter 就区分了不同档位的价。cost_filter 是"子集匹配"条件——只有当 Block 的输入包含这些键值时,这条价格才生效。于是同一个"生成图片"块,用 V2 模型收 12 分、V3 收 14 分——靠 cost_filter 匹配 model 字段来区分。匹配逻辑在 executor/utils.py:286 的 _is_cost_filter_match(递归子集匹配)。成本总表 BLOCK_COSTS
BLOCK_COSTS(block_cost_config.py:535)是总表:dict[Block类, list[BlockCost]]。相关的还有 MODEL_COST(每模型每次扁平价)、TOKEN_COST(每模型每百万 token 费率)、LLM_COST(按 provider 批量生成)。
compute_token_credits,:319):post-flight 用真实 token 数 × 费率;pre-flight 或未登记模型则回落到扁平 MODEL_COST。费率注释说明是在供应商实际价基础上加 1.5x margin(1 credit ≈ $0.01)——平台的毛利来源。⚠️ 一个坑:没登记在 BLOCK_COSTS 里的 Block = 免费(从钱包视角,if not block_costs: return 0)。加新块别忘了配成本。向上取整防漏费
block_usage_cost()(executor/utils.py:123)算成本时,SECOND/ITEMS 用 math.ceil(units/divisor)*amount——向上取整(utils.py:174)。
成本估算校准
动态成本 pre-flight 要给个"估算值",从哪来?block_cost_analytics.py(compute_block_cost_estimates,:66)——跑 SQL 聚合过去最多 90 天的真实扣费记录,算出每个 Block 的 mean/p50/p95,生成 block_preflight_estimates.json。
今日小结 + 动手
🧠 今天你应该能回答
- credit 是什么?为什么要计量收费?
- BlockCost 六种类型?为什么要这么多?
- 静态 vs 动态成本的区别?动态为什么要预扣+对账?
- cost_filter 怎么实现"按参数定价"?
- 为什么向上取整?成本估算怎么校准?
✋ 动手
P=autogpt_platform/backend/backend
sed -n '99,158p' $P/blocks/_base.py # BlockCostType + BlockCost
sed -n '535,620p' $P/data/block_cost_config.py | head -40 # BLOCK_COSTS
sed -n '123,210p' $P/executor/utils.py | head -50 # block_usage_cost + 向上取整