dsh-livebench-panel 0.1.1 → 0.1.2
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.
- package/lib/client.js +2 -2
- package/lib/index.js +68 -2
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -78,7 +78,7 @@ window.__ModuleLoader__.load({
|
|
|
78
78
|
function LiveBenchView() {
|
|
79
79
|
const [config, setConfig] = useState(null);
|
|
80
80
|
const [configError, setConfigError] = useState(null);
|
|
81
|
-
const [sel, setSel] = useState({ provider: "", model: "", category: "", task: "", release: "2024-11-25", begin: "", end: "", maxTokens: "
|
|
81
|
+
const [sel, setSel] = useState({ provider: "", model: "", reasoning: "default", category: "", task: "", release: "2024-11-25", begin: "", end: "", maxTokens: "32000" });
|
|
82
82
|
const [busy, setBusy] = useState(false);
|
|
83
83
|
const [running, setRunning] = useState(false);
|
|
84
84
|
const [log, setLog] = useState("");
|
|
@@ -273,7 +273,7 @@ window.__ModuleLoader__.load({
|
|
|
273
273
|
),
|
|
274
274
|
),
|
|
275
275
|
h("div", { className: c("field") },
|
|
276
|
-
h("label", { className: c("label") }, "max-tokens"),
|
|
276
|
+
h("label", { className: c("label") }, "max-tokens(默认 32000)"),
|
|
277
277
|
h("input", { className: c("input"), type: "number", min: 256, max: 32768, value: sel.maxTokens, onChange: setField("maxTokens") }),
|
|
278
278
|
),
|
|
279
279
|
),
|
package/lib/index.js
CHANGED
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
import { spawn } from "node:child_process";
|
|
28
28
|
import { readdirSync, readFileSync, existsSync, statSync, writeFileSync } from "node:fs";
|
|
29
29
|
import { createRequire } from "node:module";
|
|
30
|
+
import { delimiter, dirname, join } from "node:path";
|
|
30
31
|
import { homedir } from "node:os";
|
|
31
|
-
import { join } from "node:path";
|
|
32
32
|
import { fileURLToPath } from "node:url";
|
|
33
33
|
|
|
34
34
|
/** Stable Cordis plugin name. */
|
|
@@ -115,9 +115,70 @@ function readProviders(profileDir) {
|
|
|
115
115
|
keyEnv: typeof dsCfg.apiKeyEnv === "string" && dsCfg.apiKeyEnv.length > 0 ? dsCfg.apiKeyEnv : "DEEPSEEK_API_KEY",
|
|
116
116
|
models: dsModels,
|
|
117
117
|
});
|
|
118
|
+
|
|
119
|
+
// Providers without an explicit baseURL may still be OpenAI-compatible with
|
|
120
|
+
// a well-known endpoint: resolve it from the pi-ai provider registry
|
|
121
|
+
// (@earendil-works/pi-ai, the same source the harness serves from).
|
|
122
|
+
const piAiData = resolvePiAiDataDir(profileDir);
|
|
123
|
+
if (piAiData !== null) {
|
|
124
|
+
for (const provider of providers) {
|
|
125
|
+
if (provider.baseURL === null) {
|
|
126
|
+
const base = builtinBaseUrl(piAiData, provider.id);
|
|
127
|
+
if (base !== null) {
|
|
128
|
+
provider.baseURL = base;
|
|
129
|
+
provider.api = provider.api ?? "openai-completions";
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
118
134
|
return providers;
|
|
119
135
|
}
|
|
120
136
|
|
|
137
|
+
/**
|
|
138
|
+
* Locate the pi-ai provider data directory (providers/data/*.json).
|
|
139
|
+
* @returns {string|null} directory path, or null when pi-ai cannot be found.
|
|
140
|
+
*/
|
|
141
|
+
function resolvePiAiDataDir(profileDir) {
|
|
142
|
+
const candidates = [];
|
|
143
|
+
// 1) resolvable from the profile's own dependency tree
|
|
144
|
+
try {
|
|
145
|
+
const requireFromProfile = createRequire(join(profileDir, "package.json"));
|
|
146
|
+
candidates.push(join(dirname(requireFromProfile.resolve("@earendil-works/pi-ai/package.json")), "dist", "providers", "data"));
|
|
147
|
+
} catch { /* not in the profile tree */ }
|
|
148
|
+
// 2) the dsh installation the web process booted from (process.argv[1] = .../dsh/lib/bin.js)
|
|
149
|
+
const bin = process.argv[1];
|
|
150
|
+
if (typeof bin === "string" && bin.includes("@deepseek-ai")) {
|
|
151
|
+
const dshRoot = dirname(dirname(bin));
|
|
152
|
+
candidates.push(join(dshRoot, "node_modules", "@earendil-works", "pi-ai", "dist", "providers", "data"));
|
|
153
|
+
}
|
|
154
|
+
// 3) the default global npm layout on Windows
|
|
155
|
+
const appdata = process.env.APPDATA;
|
|
156
|
+
if (appdata) {
|
|
157
|
+
candidates.push(join(appdata, "npm", "node_modules", "@deepseek-ai", "dsh", "node_modules", "@earendil-works", "pi-ai", "dist", "providers", "data"));
|
|
158
|
+
}
|
|
159
|
+
for (const candidate of candidates) {
|
|
160
|
+
if (existsSync(candidate)) return candidate;
|
|
161
|
+
}
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** Read one provider's built-in OpenAI-compatible baseUrl from pi-ai data. */
|
|
166
|
+
function builtinBaseUrl(piAiDataDir, providerId) {
|
|
167
|
+
if (!/^[a-z0-9-]+$/.test(providerId)) return null;
|
|
168
|
+
const file = join(piAiDataDir, `${providerId}.json`);
|
|
169
|
+
if (!existsSync(file)) return null;
|
|
170
|
+
try {
|
|
171
|
+
const data = JSON.parse(readFileSync(file, "utf8"));
|
|
172
|
+
const openai = data?.["openai-completions"];
|
|
173
|
+
if (openai && typeof openai === "object") {
|
|
174
|
+
for (const entry of Object.values(openai)) {
|
|
175
|
+
if (entry && typeof entry.baseUrl === "string" && entry.baseUrl.length > 0) return entry.baseUrl;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
} catch { /* unreadable data file — treat as unknown */ }
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
|
|
121
182
|
/** Reasoning efforts offered by the built-in DeepSeek route. */
|
|
122
183
|
const DEEPSEEK_EFFORTS = ["off", "low", "high", "max"];
|
|
123
184
|
/** Fallback catalog when settings.yaml has no llm-deepseek.models section. */
|
|
@@ -390,7 +451,7 @@ function apply(ctx) {
|
|
|
390
451
|
"--model-display-name", displayName,
|
|
391
452
|
"--bench-name", benchParts.join("/"),
|
|
392
453
|
"--livebench-release-option", release,
|
|
393
|
-
"--max-tokens", String(asInt(body.maxTokens, 256, 32768,
|
|
454
|
+
"--max-tokens", String(asInt(body.maxTokens, 256, 32768, 32000)),
|
|
394
455
|
"--parallel-requests", String(asInt(body.parallel, 1, 8, 2)),
|
|
395
456
|
"--mode", "single",
|
|
396
457
|
];
|
|
@@ -406,6 +467,10 @@ function apply(ctx) {
|
|
|
406
467
|
...process.env,
|
|
407
468
|
HF_HOME: join(layout.root, ".hf_cache"),
|
|
408
469
|
HF_HUB_DISABLE_SYMLINKS_WARNING: "1",
|
|
470
|
+
// run_livebench.py shells out to bare `python`; without the venv on
|
|
471
|
+
// PATH that resolves to the system interpreter and dies on the first
|
|
472
|
+
// livebench import (shortuuid etc.).
|
|
473
|
+
PATH: `${join(layout.root, ".venv", "Scripts")}${delimiter}${process.env.PATH ?? ""}`,
|
|
409
474
|
};
|
|
410
475
|
// Only OpenAI-compatible providers can be routed with --api-base; for
|
|
411
476
|
// those, hand the key over via env (never the command line).
|
|
@@ -486,6 +551,7 @@ function apply(ctx) {
|
|
|
486
551
|
id,
|
|
487
552
|
name: pname,
|
|
488
553
|
routable: api === "openai-completions" && typeof baseURL === "string" && baseURL.length > 0,
|
|
554
|
+
baseURL: baseURL ?? null,
|
|
489
555
|
models,
|
|
490
556
|
})),
|
|
491
557
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-livebench-panel",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
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",
|