diff --git a/app/services/compute_catalog.py b/app/services/compute_catalog.py index 92df571..3ffde34 100644 --- a/app/services/compute_catalog.py +++ b/app/services/compute_catalog.py @@ -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)), }