feat(compute): compute_catalog 透传模型富字段(模态/作者/供应商/区间价/窗口/输出/免费试用)给 OPC 端

This commit is contained in:
Pine
2026-08-25 17:03:31 +08:00
parent a976ce194e
commit b8131aec35
+39
View File
@@ -5,9 +5,24 @@
"""
from __future__ import annotations
import json
from . import compute_client
def _parse_list(v):
"""JSON 数组字符串 → list;已 list 原样。"""
if isinstance(v, list):
return v
if isinstance(v, str):
try:
a = json.loads(v)
return a if isinstance(a, list) else []
except Exception: # noqa: BLE001
return []
return []
def _map(row: dict) -> dict:
"""Model 行 → 桌面端模型形状。"""
name = row.get("name") or row.get("model_name") or ""
@@ -28,6 +43,30 @@ def _map(row: dict) -> dict:
"video_support": bool(row.get("video_support", False)),
"tags": (row.get("tags") or "").split(",") if row.get("tags") else [],
"vendor_id": row.get("vendor_id", 0),
# 富字段(models.json 语义)
"icon": row.get("icon", ""),
"icon_file": row.get("icon_file", ""),
"modality": row.get("modality", ""),
"input_forms": _parse_list(row.get("input_forms")),
"output_forms": _parse_list(row.get("output_forms")),
"function_icons": _parse_list(row.get("function_icons")),
"url": row.get("url", ""),
"author": row.get("author", ""),
"author_icon": row.get("author_icon", ""),
"supplier": row.get("supplier", ""),
"supplier_icon": row.get("supplier_icon", ""),
"price_is_range": bool(row.get("price_is_range", False)),
"input_price_min": row.get("input_price_min", 0) or 0,
"input_price_max": row.get("input_price_max", 0) or 0,
"output_price_min": row.get("output_price_min", 0) or 0,
"output_price_max": row.get("output_price_max", 0) or 0,
"context_window": row.get("context_window", 0) or 0,
"context_window_unit": row.get("context_window_unit", "M"),
"context_window_display": row.get("context_window_display", ""),
"max_output": row.get("max_output", 0) or 0,
"max_output_unit": row.get("max_output_unit", "K"),
"max_output_display": row.get("max_output_display", ""),
"free_trial": bool(row.get("free_trial", False)),
}