部署方式
完整 Docker 方案(seakee/cpa-manager + 独立上游 CPA)
CPA 版本
v7.1.30
CPA-Manager 版本
latest(镜像 seakee/cpa-manager@sha256:7741cefca94b…,2026-05-29 构建;内置管理中心前端 v1.5.3)
问题描述
「请求监控 → 模型价格设置」弹窗里的 「选择模型」下拉框为空(只有占位符一项),导致无法选择模型、无法配置价格。
但后端数据完全正常:
GET /v0/management/usage/summary 正确返回 facets.models: ["gemini-3.1-flash-lite-preview","gpt-5.4","gpt-5.5","gpt-image-2"];
- 同一页面的「全部模型」筛选下拉能正确列出这 4 个模型;
GET /v0/management/model-prices 返回 {"prices":{}}(正常,未设置过);
- 用
PUT /v0/management/model-prices 直接写价格可以成功,写入后这些模型反而出现在下拉里。
定位(前端取数源问题):价格弹窗的下拉选项是
options = [占位符, ...unique([...ht.map(e=>e.model), ...Object.keys(savedPrices)])],
即只来自 ht(价格弹窗加载的“模型用量明细”)和“已存价格”。ht 来自 GET /v0/management/usage/models,而该接口在分页化(#138)后返回结构为:
{ "page": 1, "page_size": 500, "total_items": 8,
"usage": { "facets": {}, "apis": { "POST /v1/chat/completions": { "models": { "gpt-5.5": { "details": [...] } } } } } }
模型名被嵌在 usage.apis["…"].models.{name} 的 key 里,顶层既没有扁平的模型数组(items/data/models),usage.facets 也是空 {}。前端按 e.items ?? e.data ?? e 解析得到空数组 → ht 为空 → 下拉为空。
对比:/v0/management/usage/summary 的 facets.models 是有值的(监控页“全部模型”筛选用的就是它,正常)。所以建议把价格弹窗的模型来源改为 summary.facets.models,或让 /v0/management/usage/models 返回里带上 facets.models / 扁平模型列表。
复现步骤
- 完整 Docker 方案部署,Usage Service 正常采集(统计页有数据);
- 打开「请求监控」页,已能看到总调用、账号汇总、实时表、「全部模型」筛选有模型;
- 点击「模型价格设置」;
- 展开「选择模型」下拉 → 只有占位符,无任何模型可选 → 无法保存价格。
关键配置
# Usage Service /usage-service/info
configured: true
mode: embedded
service: cpa-manager
# collector
collectorMode: auto
upstream: http://cliproxyapi:8317
cpaUsage.usageStatisticsEnabled: true
/status 返回内容
{
"collector": {
"collector": "running",
"upstream": "http://cliproxyapi:8317",
"mode": "auto",
"transport": "subscribe",
"queue": "usage",
"totalInserted": 257,
"totalSkipped": 0,
"deadLetters": 0
},
"dbPath": "/data/usage.sqlite",
"events": 259,
"service": "cpa-manager"
}
日志
# 无报错;GET /v0/management/usage/models 返回 200,但响应不含扁平模型数组、usage.facets 为空 {}
截图
(弹窗「选择模型」下拉仅有占位符;同页「全部模型」筛选能列出 4 个模型。)
检查清单
部署方式
完整 Docker 方案(seakee/cpa-manager + 独立上游 CPA)
CPA 版本
v7.1.30
CPA-Manager 版本
latest(镜像
seakee/cpa-manager@sha256:7741cefca94b…,2026-05-29 构建;内置管理中心前端 v1.5.3)问题描述
「请求监控 → 模型价格设置」弹窗里的 「选择模型」下拉框为空(只有占位符一项),导致无法选择模型、无法配置价格。
但后端数据完全正常:
GET /v0/management/usage/summary正确返回facets.models: ["gemini-3.1-flash-lite-preview","gpt-5.4","gpt-5.5","gpt-image-2"];GET /v0/management/model-prices返回{"prices":{}}(正常,未设置过);PUT /v0/management/model-prices直接写价格可以成功,写入后这些模型反而出现在下拉里。定位(前端取数源问题):价格弹窗的下拉选项是
options = [占位符, ...unique([...ht.map(e=>e.model), ...Object.keys(savedPrices)])],即只来自
ht(价格弹窗加载的“模型用量明细”)和“已存价格”。ht来自GET /v0/management/usage/models,而该接口在分页化(#138)后返回结构为:{ "page": 1, "page_size": 500, "total_items": 8, "usage": { "facets": {}, "apis": { "POST /v1/chat/completions": { "models": { "gpt-5.5": { "details": [...] } } } } } }模型名被嵌在
usage.apis["…"].models.{name}的 key 里,顶层既没有扁平的模型数组(items/data/models),usage.facets也是空{}。前端按e.items ?? e.data ?? e解析得到空数组 →ht为空 → 下拉为空。对比:
/v0/management/usage/summary的facets.models是有值的(监控页“全部模型”筛选用的就是它,正常)。所以建议把价格弹窗的模型来源改为summary.facets.models,或让/v0/management/usage/models返回里带上facets.models/ 扁平模型列表。复现步骤
关键配置
/status 返回内容
{ "collector": { "collector": "running", "upstream": "http://cliproxyapi:8317", "mode": "auto", "transport": "subscribe", "queue": "usage", "totalInserted": 257, "totalSkipped": 0, "deadLetters": 0 }, "dbPath": "/data/usage.sqlite", "events": 259, "service": "cpa-manager" }日志
# 无报错;GET /v0/management/usage/models 返回 200,但响应不含扁平模型数组、usage.facets 为空 {}截图
(弹窗「选择模型」下拉仅有占位符;同页「全部模型」筛选能列出 4 个模型。)
检查清单