dsh-livebench-panel 0.2.9 → 0.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/lib/client.js +36 -4
  2. package/package.json +1 -1
package/lib/client.js CHANGED
@@ -107,6 +107,8 @@ window.__ModuleLoader__.load({
107
107
  const [homeBusy, setHomeBusy] = useState(false);
108
108
  const [results, setResults] = useState(null);
109
109
  const [pickedModels, setPickedModels] = useState(() => new Set());
110
+ const [sortBy, setSortBy] = useState(null);
111
+ const [sortDir, setSortDir] = useState("asc");
110
112
  const [modelOrder, setModelOrder] = useState(() => {
111
113
  try { return JSON.parse(localStorage.getItem("dlb_model_order_v1")) ?? []; } catch { return []; }
112
114
  });
@@ -323,16 +325,37 @@ window.__ModuleLoader__.load({
323
325
  return { models, tasks, cells, startTimes };
324
326
  }, [results]);
325
327
  const cellOf = (model, key) => matrix.cells.get(`${model}__@__${key}`);
328
+ // 排序:sortBy=null 时用拖拽自定义顺序;点击表头在 正序/倒序 间切换
326
329
  const sortedModels = useMemo(() => {
327
330
  if (!matrix) return [];
331
+ const base = [...matrix.models];
332
+ if (sortBy === "model") {
333
+ base.sort((a, b) => (sortDir === "asc" ? a.localeCompare(b) : b.localeCompare(a)));
334
+ return base;
335
+ }
336
+ if (sortBy === "time") {
337
+ base.sort((a, b) => {
338
+ const ta = matrix.startTimes.get(a) ?? 0;
339
+ const tb = matrix.startTimes.get(b) ?? 0;
340
+ return sortDir === "asc" ? ta - tb : tb - ta;
341
+ });
342
+ return base;
343
+ }
328
344
  const indexOf = new Map(modelOrder.map((key, index) => [key, index]));
329
- return [...matrix.models].sort((a, b) => {
345
+ return base.sort((a, b) => {
330
346
  const ia = indexOf.has(a) ? indexOf.get(a) : Number.MAX_SAFE_INTEGER;
331
347
  const ib = indexOf.has(b) ? indexOf.get(b) : Number.MAX_SAFE_INTEGER;
332
348
  if (ia !== ib) return ia - ib;
333
349
  return a.localeCompare(b);
334
350
  });
335
- }, [matrix, modelOrder]);
351
+ }, [matrix, modelOrder, sortBy, sortDir]);
352
+
353
+ // 点击表头:切换排序字段(再次点击同一列则反转方向)
354
+ const toggleSort = (field) => {
355
+ if (sortBy === field) setSortDir((d) => (d === "asc" ? "desc" : "asc"));
356
+ else { setSortBy(field); setSortDir("asc"); }
357
+ };
358
+ const sortMark = (field) => (sortBy === field ? (sortDir === "asc" ? " ↑" : " ↓") : "");
336
359
 
337
360
  const persistModelOrder = (keys) => {
338
361
  setModelOrder(keys);
@@ -343,6 +366,7 @@ window.__ModuleLoader__.load({
343
366
  const sourceModel = dragKey.current;
344
367
  dragKey.current = null;
345
368
  if (!sourceModel || sourceModel === targetModel) return;
369
+ setSortBy(null); // 拖拽即回到自定义顺序
346
370
  const keys = sortedModels.slice();
347
371
  const from = keys.indexOf(sourceModel);
348
372
  const to = keys.indexOf(targetModel);
@@ -531,13 +555,21 @@ window.__ModuleLoader__.load({
531
555
  h("th", { style: { width: "30px" } },
532
556
  h("input", { type: "checkbox", checked: pickedModels.size > 0 && pickedModels.size === sortedModels.length,
533
557
  onChange: (event) => setPickedModels(event.target.checked ? new Set(sortedModels) : new Set()) })),
534
- h("th", null, "model"),
558
+ h("th", {
559
+ style: { cursor: "pointer", userSelect: "none" },
560
+ title: "点击按模型名排序(再次点击切换正序/倒序)",
561
+ onClick: () => toggleSort("model"),
562
+ }, "model" + sortMark("model")),
535
563
  matrix.tasks.map((taskKeyCol) => {
536
564
  const [cat, task] = taskKeyCol.split("/");
537
565
  return h("th", { key: taskKeyCol, title: `${cat} / ${task}` }, task);
538
566
  }),
539
567
  h("th", null, "删除"),
540
- h("th", null, "time"),
568
+ h("th", {
569
+ style: { cursor: "pointer", userSelect: "none" },
570
+ title: "点击按时间排序(再次点击切换正序/倒序)",
571
+ onClick: () => toggleSort("time"),
572
+ }, "time" + sortMark("time")),
541
573
  )),
542
574
  h("tbody", null,
543
575
  sortedModels.map((model) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-livebench-panel",
3
- "version": "0.2.9",
3
+ "version": "0.2.10",
4
4
  "description": "DSH web plugin: a LiveBench tab in the Trajectory view (right of 对话/轨迹). Run LiveBench evaluations against every model configured in the DeepSeek Harness — pick provider/model, category, task, release and question range from dropdowns, watch progress, and read scores in place.",
5
5
  "license": "MIT",
6
6
  "type": "module",