LiteLLM 计费与价格系统全链路文档
本系列文档完整描述 LiteLLM 代理服务中价格数据的流动路径,从 JSON 价格文件的下载、PostgreSQL 的读写、UI 展示与编辑,到最终路由层的计费计算,涵盖所有关键节点、代码位置与已知陷阱。
文档目录
整体架构一览
flowchart TD
subgraph 初始化阶段
A[import litellm] --> B{LITELLM_LOCAL_MODEL_COST_MAP?}
B -- true --> C[读 backup JSON\nlitellm/model_prices_and_context_window_backup.json]
B -- false --> S{S3 四变量齐全?}
S -- 是 --> D1[boto3 SigV4 从 S3 读取\ns3://S3_BUCKET_NAME/MODEL_COST_MAP_S3_KEY]
S -- 否 --> D2[GET GitHub 远程 JSON\n超时5s, 失败 fallback 到 backup]
C --> E[litellm.model_cost dict\n进程级全局对象]
D1 --> E
D2 --> E
end
subgraph 启动阶段
F[proxy_startup_event] --> G[add_deployment\nproxy_server.py:5714]
G --> H[读 DB LiteLLM_ProxyModelTable]
H --> I[decrypt litellm_params]
I --> J[Router._create_deployment\nrouter.py:6173]
J --> K[litellm.register_model UUID entry\nrouter.py:6204]
K --> E
end
subgraph 30s 轮询
L[APScheduler\n每30秒] --> M[add_deployment]
M --> N[upsert_deployment\nrouter.py:6744]
N -- litellm_params 有变化 --> J
N -- 无变化 --> O[skip]
end
subgraph UI 保存
P[PATCH /model/id/update] --> Q[update_db_model\n加密写 DB]
Q --> R[clear_cache\n立即重载]
R --> J
end
subgraph 请求计费
S[LLM 请求完成] --> T[calculate_request_cost\nlitellm_logging.py:1381]
T --> U{use_custom_pricing_for_model?}
U -- True\nlitellm_params 有价格字段 --> V[用 UUID 查\nlitellm.model_cost UUID]
U -- False\n无价格字段 --> W[用 model name 5步 fallback\n查 litellm.model_cost]
V --> X[generic_cost_per_token\nllm_cost_calc/utils.py:580]
W --> X
X --> Y[calculate_cache_writing_cost\n5m vs 1hr 分拆计算]
end
E -.被查询.-> V
E -.被查询.-> W
两条计费路径速查
|
UUID 路径(custom_pricing=True) |
JSON 路径(custom_pricing=False) |
| 触发条件 |
litellm_params 中有任意 _CUSTOM_PRICING_KEYS 字段非 None |
litellm_params 中无任何价格字段 |
| 价格来源 |
litellm.model_cost[UUID],由 _create_deployment() 写入 |
litellm.model_cost[model_name],由 JSON 文件初始化 |
| 何时更新 |
UI 保存后立即(clear_cache),或 30s 轮询检测到参数变化 |
重启或热重载 /reload/model_cost_map |
| cache 字段 |
来自 DB litellm_params,字段缺失时静默为 0 |
来自 JSON 文件对应 key |
| 典型陷阱 |
cache_creation_input_token_cost_above_1hr 缺失 → 1hr cache 免费 |
JSON key 必须与 provider/model 格式匹配 |