diff --git a/app.py b/app.py index 81521e1..44d7048 100644 --- a/app.py +++ b/app.py @@ -135,34 +135,29 @@ def leaderboard(): keys.add(("", item)) rows = [r for r in rows if (r["provider"], r["model"]) in keys] - # 按排行榜生成柱状图 CSV(解码速度 TOP,默认全部模型,可指定) - chart_rows = rows[: int(request.args.get("chart_top", 20) or 20)] - csv_lines = ["模型, 解码速度(tok/s), 预填充速度(tok/s), 首字延迟(ms)"] + chart_rows = rows[: int(request.args.get("chart_top", 30) or 30)] + chart_csv = _speed_csv(chart_rows) + return jsonify({"ok": True, "rows": rows, "chart_csv": chart_csv}) + + +def _speed_csv(chart_rows): + """模型 运行速度 CSV:预填充 / 解码 / 首字 三列(前端据此配置柱/折线/双轴/颜色)""" + csv_lines = ["模型, 预填充速度(tok/s), 解码速度(tok/s), 首字延迟(ms)"] for r in chart_rows: label = "%s %s" % (r["provider"], r["model"]) csv_lines.append("%s, %s, %s, %s" % ( - label.replace(",", " "), _fmt(r["avg_decode_speed"]), - _fmt(r["avg_prefill_speed"]), _fmt(r["avg_ttft_ms"]))) - chart_csv = "\n".join(csv_lines) - bar_payload = { - "data": chart_csv, "chartType": "bar", - "title": "模型解码速度对比(%d 个模型)" % len(chart_rows), - "theme": "default", "showLegend": True, "showGrid": True, "showLabel": True, - "seriesTypes": ["bar", "bar", "line"], - "seriesAxis": [0, 0, 1], - "seriesStyles": ["solid", "hollow", "dashed"], - "width": 1100, "height": 560, "pixelRatio": 2, - } - return jsonify({"ok": True, "rows": rows, "chart_csv": chart_csv, - "bar_payload": bar_payload}) + label.replace(",", " "), _fmt(r["avg_prefill_speed"]), + _fmt(r["avg_decode_speed"]), _fmt(r["avg_ttft_ms"]))) + return "\n".join(csv_lines) # ───────────────────────── 模型对比(硬件 + 可去留对比项) ───────────────────────── @app.route("/api/compare") def compare(): - """返回指定模型(默认全部)的聚合对比行 + 图表数据。 - models: 逗号分隔 provider|model;chart_metric: 解码/预填充/首字;chart_type: bar/line + """返回指定模型(默认全部)的聚合对比行 + 运行速度 CSV。 + models: 逗号分隔 provider|model(保持传入顺序=对比车添加顺序); + 不传时默认全部(按解码速度排序,前端默认取前5)。 """ sel = request.args.get("models", "").strip() keys = [] @@ -176,35 +171,15 @@ def compare(): keys.append((p.strip(), m.strip())) else: keys.append(("", item)) + rows = db.compare_models(keys) # 保持传入顺序(对比车顺序) else: lb = db.leaderboard(limit=500) keys = [(r["provider"], r["model"]) for r in lb] - rows = db.compare_models(keys) - # 有硬件优先展示 - rows.sort(key=lambda r: (r.get("avg_decode_speed") or 0), reverse=True) + rows = db.compare_models(keys) + rows.sort(key=lambda r: (r.get("avg_decode_speed") or 0), reverse=True) - # 图表数据(按所选指标) - metric = request.args.get("chart_metric", "avg_decode_speed") - ctype = request.args.get("chart_type", "bar") - metric_name = {"avg_decode_speed": "解码速度", "avg_prefill_speed": "预填充速度", - "avg_ttft_ms": "首字延迟", "best_decode": "最佳解码"}.get(metric, "解码速度") - unit = "tok/s" if metric in ("avg_decode_speed", "avg_prefill_speed", "best_decode") else "ms" - chart_rows = rows[: int(request.args.get("chart_top", 50) or 50)] - csv_lines = ["模型, %s(%s)" % (metric_name, unit)] - for r in chart_rows: - label = "%s %s" % (r["provider"], r["model"]) - csv_lines.append("%s, %s" % (label.replace(",", " "), _fmt(r.get(metric)))) - chart_csv = "\n".join(csv_lines) - chart_payload = { - "data": chart_csv, "chartType": "bar" if ctype != "line" else "line", - "title": "模型%s对比(%d 个模型)" % (metric_name, len(chart_rows)), - "theme": "default", "showLegend": False, "showGrid": True, "showLabel": True, - "smoothLine": True, - "seriesTypes": ["bar"] if ctype != "line" else ["line"], - "width": 1100, "height": 520, "pixelRatio": 2, - } - return jsonify({"ok": True, "rows": rows, "chart_csv": chart_csv, - "chart_payload": chart_payload, "metric": metric}) + chart_csv = _speed_csv(rows[: int(request.args.get("chart_top", 60) or 60)]) + return jsonify({"ok": True, "rows": rows, "chart_csv": chart_csv}) @app.route("/api/model") diff --git a/static/capabilities.html b/static/capabilities.html index 6d6633e..01f2c8c 100644 --- a/static/capabilities.html +++ b/static/capabilities.html @@ -15,7 +15,6 @@ ⚖️ 模型对比
- ⚙️ 后台管理