dsh-claude-style 0.18.3 → 0.18.5-dev.43
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/docs/CHANGELOG.md +60 -0
- package/lib/assets/58a9d6c6b70a.js.br +0 -0
- package/lib/assets/c0b011dfc154.js.br +0 -0
- package/lib/assets/manifest.json +8 -8
- package/lib/client.js +13 -13
- package/lib/host/routes.js +2 -7
- package/lib/host/usage-fold.js +18 -3
- package/lib/host/usage.js +32 -4
- package/lib/model-descriptions.json +74 -82
- package/package.json +1 -1
- package/lib/assets/486564e86d44.js.br +0 -0
- package/lib/assets/bd927cdd11c0.js.br +0 -0
package/lib/host/routes.js
CHANGED
|
@@ -186,7 +186,6 @@ var FONT_FILES = {
|
|
|
186
186
|
"NotoSerifVariable.woff2": "font/woff2"
|
|
187
187
|
};
|
|
188
188
|
var ASSETS_PATH = `${ROUTE_PREFIX}/assets/`;
|
|
189
|
-
var USAGE_TTL_MS = 30 * 1e3;
|
|
190
189
|
var DELETE_BODY_MAX = 4096;
|
|
191
190
|
function sessionDirectoryName(id) {
|
|
192
191
|
if (id === ".") return "~002E";
|
|
@@ -407,12 +406,8 @@ function registerRoutes(ctx, scope) {
|
|
|
407
406
|
handler: (req, res) => {
|
|
408
407
|
if (methodRefused(req, res, ["GET", "HEAD"])) return;
|
|
409
408
|
if (fenceRefused(ctx, req, res)) return;
|
|
410
|
-
|
|
411
|
-
const
|
|
412
|
-
if (stale) {
|
|
413
|
-
void usage.refresh();
|
|
414
|
-
snapshot = usage.snapshot();
|
|
415
|
-
}
|
|
409
|
+
void usage.refresh();
|
|
410
|
+
const snapshot = usage.snapshot();
|
|
416
411
|
sendJson(res, 200, {
|
|
417
412
|
ok: true,
|
|
418
413
|
value: snapshot.value,
|
package/lib/host/usage-fold.js
CHANGED
|
@@ -102,8 +102,15 @@ function foldSession(events) {
|
|
|
102
102
|
return { days, hours };
|
|
103
103
|
}
|
|
104
104
|
function newestLog(dir) {
|
|
105
|
+
let entries;
|
|
106
|
+
try {
|
|
107
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
108
|
+
} catch (error) {
|
|
109
|
+
if (error.code === "ENOENT") return null;
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
105
112
|
let best = null;
|
|
106
|
-
for (const entry of
|
|
113
|
+
for (const entry of entries) {
|
|
107
114
|
if (!entry.isFile()) continue;
|
|
108
115
|
const match = SESSION_LOG.exec(entry.name);
|
|
109
116
|
if (match === null) continue;
|
|
@@ -115,7 +122,8 @@ function newestLog(dir) {
|
|
|
115
122
|
}
|
|
116
123
|
if (best === null) return null;
|
|
117
124
|
const path = join(dir, best.name);
|
|
118
|
-
const stat = statSync(path);
|
|
125
|
+
const stat = statSync(path, { throwIfNoEntry: false });
|
|
126
|
+
if (stat === void 0) return null;
|
|
119
127
|
return { path, size: stat.size, mtimeMs: stat.mtimeMs };
|
|
120
128
|
}
|
|
121
129
|
function listSessionLogs(root) {
|
|
@@ -123,7 +131,14 @@ function listSessionLogs(root) {
|
|
|
123
131
|
if (!existsSync(root)) return out;
|
|
124
132
|
for (const project of readdirSync(root, { withFileTypes: true })) {
|
|
125
133
|
if (!project.isDirectory()) continue;
|
|
126
|
-
|
|
134
|
+
let sessions;
|
|
135
|
+
try {
|
|
136
|
+
sessions = readdirSync(join(root, project.name), { withFileTypes: true });
|
|
137
|
+
} catch (error) {
|
|
138
|
+
if (error.code === "ENOENT") continue;
|
|
139
|
+
throw error;
|
|
140
|
+
}
|
|
141
|
+
for (const session of sessions) {
|
|
127
142
|
if (!session.isDirectory()) continue;
|
|
128
143
|
const log = newestLog(join(root, project.name, session.name));
|
|
129
144
|
if (log === null) continue;
|
package/lib/host/usage.js
CHANGED
|
@@ -60,6 +60,14 @@ import { readLedger } from "./usage-ledger.js";
|
|
|
60
60
|
import { mergeLedgerFold, summarize } from "./usage-summary.js";
|
|
61
61
|
var LEDGER_SOURCE = "cost-meter";
|
|
62
62
|
var LOCAL_SOURCE = "local";
|
|
63
|
+
var USAGE_TTL_MS = 30 * 1e3;
|
|
64
|
+
var SLOW_PASS_FACTOR = 2;
|
|
65
|
+
function recheckDelay(durationMs) {
|
|
66
|
+
return Math.max(USAGE_TTL_MS, durationMs * SLOW_PASS_FACTOR);
|
|
67
|
+
}
|
|
68
|
+
function messageOf(error) {
|
|
69
|
+
return String(error?.message ?? error);
|
|
70
|
+
}
|
|
63
71
|
function hoursOf(days) {
|
|
64
72
|
const hours = new Array(24).fill(0);
|
|
65
73
|
for (const buckets of days.values()) {
|
|
@@ -81,12 +89,14 @@ function createUsage(ctx) {
|
|
|
81
89
|
const home = () => harnessPath(ctx);
|
|
82
90
|
let state = null;
|
|
83
91
|
let pending = null;
|
|
92
|
+
let nextAt = 0;
|
|
84
93
|
let disposed = false;
|
|
85
94
|
async function computeLocal(logs, ledgerDays) {
|
|
86
95
|
const record = readRecord(ctx);
|
|
87
96
|
const sessions = /* @__PURE__ */ new Map();
|
|
88
97
|
let read = 0;
|
|
89
98
|
let failed = 0;
|
|
99
|
+
let firstFailure = null;
|
|
90
100
|
for (const log of logs) {
|
|
91
101
|
const stored = record.sessions.get(log.id);
|
|
92
102
|
const fingerprint = stored?.fingerprint;
|
|
@@ -94,7 +104,15 @@ function createUsage(ctx) {
|
|
|
94
104
|
sessions.set(log.id, stored);
|
|
95
105
|
continue;
|
|
96
106
|
}
|
|
97
|
-
|
|
107
|
+
let events;
|
|
108
|
+
try {
|
|
109
|
+
events = await readEvents(ctx, PACKAGE_NAME, log.id, "the usage roll-up");
|
|
110
|
+
} catch (error) {
|
|
111
|
+
failed += 1;
|
|
112
|
+
firstFailure = firstFailure ?? `${log.id}: ${messageOf(error)}`;
|
|
113
|
+
if (stored !== void 0) sessions.set(log.id, stored);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
98
116
|
if (events === null) {
|
|
99
117
|
failed += 1;
|
|
100
118
|
if (stored !== void 0) sessions.set(log.id, stored);
|
|
@@ -103,6 +121,9 @@ function createUsage(ctx) {
|
|
|
103
121
|
sessions.set(log.id, { fingerprint: { size: log.size, mtimeMs: log.mtimeMs }, days: foldSession(events).days });
|
|
104
122
|
read += 1;
|
|
105
123
|
}
|
|
124
|
+
if (firstFailure !== null) {
|
|
125
|
+
ctx.logger?.warn?.(`${PACKAGE_NAME}: ${failed} session log(s) left out of the usage roll-up; the rest are recorded (first: ${firstFailure})`);
|
|
126
|
+
}
|
|
106
127
|
for (const [id, stored] of record.sessions) {
|
|
107
128
|
if (!sessions.has(id) && stored.days.size > 0) sessions.set(id, { days: stored.days });
|
|
108
129
|
}
|
|
@@ -137,19 +158,26 @@ function createUsage(ctx) {
|
|
|
137
158
|
function refresh() {
|
|
138
159
|
if (disposed) return Promise.resolve(null);
|
|
139
160
|
if (pending !== null) return pending;
|
|
161
|
+
if (state !== null && Date.now() < nextAt) return Promise.resolve(state.value);
|
|
140
162
|
state = state === null ? { value: null, computing: true } : { ...state, computing: true };
|
|
163
|
+
const startedAt = Date.now();
|
|
164
|
+
const finish = () => {
|
|
165
|
+
pending = null;
|
|
166
|
+
const finishedAt = Date.now();
|
|
167
|
+
nextAt = finishedAt + recheckDelay(finishedAt - startedAt);
|
|
168
|
+
};
|
|
141
169
|
pending = compute((partial) => {
|
|
142
170
|
if (!disposed) state = { value: partial, computing: true };
|
|
143
171
|
}).then(
|
|
144
172
|
(value) => {
|
|
145
|
-
|
|
173
|
+
finish();
|
|
146
174
|
if (disposed) return value;
|
|
147
175
|
state = { value, computing: false };
|
|
148
176
|
return value;
|
|
149
177
|
},
|
|
150
178
|
(error) => {
|
|
151
|
-
|
|
152
|
-
if (!disposed) state = { value: state?.value ?? null, computing: false, error:
|
|
179
|
+
finish();
|
|
180
|
+
if (!disposed) state = { value: state?.value ?? null, computing: false, error: messageOf(error) };
|
|
153
181
|
return null;
|
|
154
182
|
}
|
|
155
183
|
);
|
|
@@ -198,7 +198,7 @@
|
|
|
198
198
|
"match": "claude.*mythos",
|
|
199
199
|
"note": "Mythos is Fable's unrestricted sibling — Anthropic's own words: Fable is the same underlying model with cybersecurity and biology safeguards added. Access to Mythos is limited to vetted organizations, so its copy leads with the audience rather than the capability.",
|
|
200
200
|
"text": {
|
|
201
|
-
"zh": "
|
|
201
|
+
"zh": "面向网络安全与生物学研究,仅向经过审核的机构开放。",
|
|
202
202
|
"en": "Built for cybersecurity and biology research, with access limited to vetted organizations."
|
|
203
203
|
}
|
|
204
204
|
},
|
|
@@ -207,14 +207,14 @@
|
|
|
207
207
|
"note": "Family copy stays version-agnostic, so it carries no superlatives: 'strongest' is only true of the current generation and would mislabel an older Opus. Superlatives belong in a rule anchored to the version. It also carries no tier prefix of ours — '旗舰档:' is our positioning, not the model's own line.",
|
|
208
208
|
"text": {
|
|
209
209
|
"zh": "面向复杂编程与 AI 智能体的混合推理模型。",
|
|
210
|
-
"en": "A hybrid reasoning model built for
|
|
210
|
+
"en": "A hybrid reasoning model built for complex coding and AI agents."
|
|
211
211
|
}
|
|
212
212
|
},
|
|
213
213
|
{
|
|
214
214
|
"match": "claude.*sonnet",
|
|
215
215
|
"text": {
|
|
216
|
-
"zh": "
|
|
217
|
-
"en": "
|
|
216
|
+
"zh": "面向实时智能体与高吞吐场景的混合推理模型。",
|
|
217
|
+
"en": "A hybrid reasoning model for real-time agents and high-volume work."
|
|
218
218
|
}
|
|
219
219
|
},
|
|
220
220
|
{
|
|
@@ -227,8 +227,8 @@
|
|
|
227
227
|
{
|
|
228
228
|
"match": "claude",
|
|
229
229
|
"text": {
|
|
230
|
-
"zh": "
|
|
231
|
-
"en": "
|
|
230
|
+
"zh": "擅长编程、写作与复杂分析。",
|
|
231
|
+
"en": "Strong at coding, writing and complex analysis."
|
|
232
232
|
}
|
|
233
233
|
},
|
|
234
234
|
{
|
|
@@ -240,10 +240,10 @@
|
|
|
240
240
|
},
|
|
241
241
|
{
|
|
242
242
|
"match": "gpt[._-]?5[._-]?4(?!\\d)",
|
|
243
|
-
"note": "Anchored to the 5.4 generation:
|
|
243
|
+
"note": "Anchored to the 5.4 generation: native computer use is that model's claim, so a later GPT-5 reads the rule below.",
|
|
244
244
|
"text": {
|
|
245
|
-
"zh": "
|
|
246
|
-
"en": "For coding and professional work, with
|
|
245
|
+
"zh": "面向编程与专业工作,原生支持计算机操作。",
|
|
246
|
+
"en": "For coding and professional work, with native computer use."
|
|
247
247
|
}
|
|
248
248
|
},
|
|
249
249
|
{
|
|
@@ -256,22 +256,22 @@
|
|
|
256
256
|
{
|
|
257
257
|
"match": "(^|[/-])o[1-9](-|$)",
|
|
258
258
|
"text": {
|
|
259
|
-
"zh": "
|
|
260
|
-
"en": "Trained to think
|
|
259
|
+
"zh": "作答前先深入思考,擅长多步推理。",
|
|
260
|
+
"en": "Trained to think before answering, strong at multi-step reasoning."
|
|
261
261
|
}
|
|
262
262
|
},
|
|
263
263
|
{
|
|
264
264
|
"match": "gpt-oss|oss-\\d",
|
|
265
265
|
"text": {
|
|
266
|
-
"zh": "OpenAI
|
|
267
|
-
"en": "
|
|
266
|
+
"zh": "OpenAI 的开放权重推理模型,Apache 2.0 许可,分 120B 与 20B 两种规模,可自托管。",
|
|
267
|
+
"en": "OpenAI's open-weight reasoning models under Apache 2.0, in 120B and 20B sizes, self-hostable."
|
|
268
268
|
}
|
|
269
269
|
},
|
|
270
270
|
{
|
|
271
271
|
"match": "gpt",
|
|
272
272
|
"text": {
|
|
273
|
-
"zh": "
|
|
274
|
-
"en": "Text and image input
|
|
273
|
+
"zh": "支持文本与图像输入,覆盖多种语言。",
|
|
274
|
+
"en": "Text and image input across many languages."
|
|
275
275
|
}
|
|
276
276
|
},
|
|
277
277
|
{
|
|
@@ -312,34 +312,34 @@
|
|
|
312
312
|
}
|
|
313
313
|
},
|
|
314
314
|
{
|
|
315
|
-
"match": "glm
|
|
316
|
-
"note": "
|
|
315
|
+
"match": "glm.*flashx",
|
|
316
|
+
"note": "The Flash X tier of every generation, above the Flash rules because its id contains `flash`.",
|
|
317
317
|
"text": {
|
|
318
|
-
"zh": "
|
|
319
|
-
"en": "
|
|
318
|
+
"zh": "Flash 档的高吞吐版本,适合高频任务。",
|
|
319
|
+
"en": "The high-throughput variant of the Flash tier, for high-frequency work."
|
|
320
320
|
}
|
|
321
321
|
},
|
|
322
322
|
{
|
|
323
323
|
"match": "glm[._-]?5[._-]?3.*flash",
|
|
324
|
-
"note": "Anchored to the 5.3 generation's Flash tier
|
|
324
|
+
"note": "Anchored to the 5.3 generation's Flash tier: 'first' and the parameter count are its own, so a later GLM Flash reads the generic Flash rule below.",
|
|
325
325
|
"text": {
|
|
326
|
-
"zh": "
|
|
327
|
-
"en": "
|
|
326
|
+
"zh": "该系列首个原生多模态模型,320B 总参数,MIT 许可开放权重。",
|
|
327
|
+
"en": "The series' first natively multimodal model: 320B parameters, open weights under MIT."
|
|
328
328
|
}
|
|
329
329
|
},
|
|
330
330
|
{
|
|
331
331
|
"match": "glm[._-]?5[._-]?3(?!\\d)",
|
|
332
332
|
"note": "Anchored to the 5.3 generation: the superlative is true of it alone, and the line's own rule below carries none.",
|
|
333
333
|
"text": {
|
|
334
|
-
"zh": "
|
|
335
|
-
"en": "
|
|
334
|
+
"zh": "最强的开放权重编程模型之一,擅长长时间自主任务。",
|
|
335
|
+
"en": "One of the most capable open-weight coding models, built for long-horizon autonomy."
|
|
336
336
|
}
|
|
337
337
|
},
|
|
338
338
|
{
|
|
339
339
|
"match": "glm.*flash",
|
|
340
340
|
"text": {
|
|
341
|
-
"zh": "
|
|
342
|
-
"en": "Fast, low-cost multimodal inference
|
|
341
|
+
"zh": "更快更省的多模态推理,兼顾日常编程。",
|
|
342
|
+
"en": "Fast, low-cost multimodal inference that handles everyday coding."
|
|
343
343
|
}
|
|
344
344
|
},
|
|
345
345
|
{
|
|
@@ -361,16 +361,16 @@
|
|
|
361
361
|
"match": "kimi.*(cod(e|ing)|k2[._-]?7).*highspeed",
|
|
362
362
|
"note": "The coding line's high-speed tier, above the coding rule because its own id contains `coding`.",
|
|
363
363
|
"text": {
|
|
364
|
-
"zh": "
|
|
365
|
-
"en": "
|
|
364
|
+
"zh": "长程编程智能体模型的高速版本,开放权重。",
|
|
365
|
+
"en": "The high-speed tier of the open-weight agentic coding model, for long-horizon work."
|
|
366
366
|
}
|
|
367
367
|
},
|
|
368
368
|
{
|
|
369
369
|
"match": "kimi.*(cod(e|ing)|k2[._-]?7)",
|
|
370
370
|
"note": "The coding line whatever the suffix spells: `kimi-for-coding` and `kimi-k2.7-code` both read it, and the high-speed tier above is claimed first.",
|
|
371
371
|
"text": {
|
|
372
|
-
"zh": "
|
|
373
|
-
"en": "An open-weight agentic coding model for long-horizon work,
|
|
372
|
+
"zh": "面向长程编程的开放权重智能体模型,1T 总参数。",
|
|
373
|
+
"en": "An open-weight agentic coding model for long-horizon work, with 1T parameters."
|
|
374
374
|
}
|
|
375
375
|
},
|
|
376
376
|
{
|
|
@@ -382,10 +382,10 @@
|
|
|
382
382
|
},
|
|
383
383
|
{
|
|
384
384
|
"match": "qwen[._-]?3[._-]?8.*max",
|
|
385
|
-
"note": "Anchored to the 3.8 generation: the parameter count
|
|
385
|
+
"note": "Anchored to the 3.8 generation: the parameter count is that model's, so a later Qwen Max falls to the line rule below.",
|
|
386
386
|
"text": {
|
|
387
|
-
"zh": "
|
|
388
|
-
"en": "A 2.4T-parameter MoE for coding and office work, with
|
|
387
|
+
"zh": "面向编程与办公的 2.4 万亿参数 MoE,支持思考模式与内置工具。",
|
|
388
|
+
"en": "A 2.4T-parameter MoE for coding and office work, with thinking mode and built-in tools."
|
|
389
389
|
}
|
|
390
390
|
},
|
|
391
391
|
{
|
|
@@ -398,8 +398,8 @@
|
|
|
398
398
|
{
|
|
399
399
|
"match": "qwen.*(flash|turbo)",
|
|
400
400
|
"text": {
|
|
401
|
-
"zh": "
|
|
402
|
-
"en": "Fast and cheap, with full tool calling
|
|
401
|
+
"zh": "响应快、成本低,工具调用支持完整。",
|
|
402
|
+
"en": "Fast and cheap, with full tool calling."
|
|
403
403
|
}
|
|
404
404
|
},
|
|
405
405
|
{
|
|
@@ -413,8 +413,8 @@
|
|
|
413
413
|
"match": "qwen.*a\\d+b",
|
|
414
414
|
"note": "MoE ids spell out total and active parameters (`2.4t-a95b`, `235b-a22b`); the active count must win over the size rule below, which would otherwise read the trailing `95b` as a small dense model.",
|
|
415
415
|
"text": {
|
|
416
|
-
"zh": "
|
|
417
|
-
"en": "
|
|
416
|
+
"zh": "MoE 架构,单位成本低于同规模稠密模型。",
|
|
417
|
+
"en": "A mixture-of-experts model that costs less to serve than a dense model of its size."
|
|
418
418
|
}
|
|
419
419
|
},
|
|
420
420
|
{
|
|
@@ -434,18 +434,18 @@
|
|
|
434
434
|
},
|
|
435
435
|
{
|
|
436
436
|
"match": "step[._-]?5(?!\\d)",
|
|
437
|
-
"note": "Anchored to the 5 line: the input modes
|
|
437
|
+
"note": "Anchored to the 5 line: the input modes are its own, and the trailing-digit guard keeps a size suffix (`95b`) from reading it.",
|
|
438
438
|
"text": {
|
|
439
|
-
"zh": "
|
|
440
|
-
"en": "For
|
|
439
|
+
"zh": "面向编程与专业知识工作,原生支持文本、图像与视频输入。",
|
|
440
|
+
"en": "For coding and professional knowledge work, with native text, image and video input."
|
|
441
441
|
}
|
|
442
442
|
},
|
|
443
443
|
{
|
|
444
444
|
"match": "step[._-]?3[._-]?7.*flash",
|
|
445
|
-
"note": "Anchored to 3.7: the parameter
|
|
445
|
+
"note": "Anchored to 3.7: the parameter count is that tier's, so another Step Flash falls to the line rule below.",
|
|
446
446
|
"text": {
|
|
447
|
-
"zh": "
|
|
448
|
-
"en": "
|
|
447
|
+
"zh": "面向智能体与代码任务的 198B 稀疏 MoE,支持图像与视频理解。",
|
|
448
|
+
"en": "A 198B sparse MoE for agentic and coding tasks, with image and video understanding."
|
|
449
449
|
}
|
|
450
450
|
},
|
|
451
451
|
{
|
|
@@ -459,15 +459,15 @@
|
|
|
459
459
|
"match": "minimax.*m3|(^|[^a-z0-9])m3($|-)",
|
|
460
460
|
"note": "The M3 line's own claims; the catalog's `minimax-m3-1m` is the same line at a longer context.",
|
|
461
461
|
"text": {
|
|
462
|
-
"zh": "
|
|
463
|
-
"en": "
|
|
462
|
+
"zh": "兼具前沿编程能力与原生多模态的开放权重模型。",
|
|
463
|
+
"en": "An open-weight model combining frontier coding with native multimodality."
|
|
464
464
|
}
|
|
465
465
|
},
|
|
466
466
|
{
|
|
467
467
|
"match": "minimax|(^|[^a-z0-9])m2[-.]?\\d",
|
|
468
468
|
"text": {
|
|
469
|
-
"zh": "
|
|
470
|
-
"en": "Agentic reasoning, tool use, coding and multimodal input
|
|
469
|
+
"zh": "主打智能体推理、工具调用、编程与多模态输入。",
|
|
470
|
+
"en": "Agentic reasoning, tool use, coding and multimodal input."
|
|
471
471
|
}
|
|
472
472
|
},
|
|
473
473
|
{
|
|
@@ -478,14 +478,6 @@
|
|
|
478
478
|
"en": "Small and fast by design, natively multimodal, powering Meta AI."
|
|
479
479
|
}
|
|
480
480
|
},
|
|
481
|
-
{
|
|
482
|
-
"match": "celeris[._-]?1(-|$)",
|
|
483
|
-
"note": "Anchored to Celeris-1: the numbers are that model's, so a future Celeris reads the line rule below.",
|
|
484
|
-
"text": {
|
|
485
|
-
"zh": "生成速度 1,664 tokens/s,超过 Mercury 2 的 5 倍,MMLU-Pro 75.9%。",
|
|
486
|
-
"en": "Generates 1,664 tokens/s, over 5x Mercury 2, at 75.9% MMLU-Pro."
|
|
487
|
-
}
|
|
488
|
-
},
|
|
489
481
|
{
|
|
490
482
|
"match": "celeris",
|
|
491
483
|
"note": "Diffusion LLM, so the copy leads with latency rather than the usual capability framing.",
|
|
@@ -497,29 +489,29 @@
|
|
|
497
489
|
{
|
|
498
490
|
"match": "mercury-?\\d|inception",
|
|
499
491
|
"text": {
|
|
500
|
-
"zh": "
|
|
501
|
-
"en": "
|
|
492
|
+
"zh": "扩散架构,面向代码生成,以极快的生成速度见长。",
|
|
493
|
+
"en": "Diffusion-based and built for code, with very fast generation."
|
|
502
494
|
}
|
|
503
495
|
},
|
|
504
496
|
{
|
|
505
497
|
"match": "apodex",
|
|
506
498
|
"text": {
|
|
507
|
-
"zh": "
|
|
508
|
-
"en": "For complex professional work, finance and science
|
|
499
|
+
"zh": "面向复杂专业工作、金融与科研。",
|
|
500
|
+
"en": "For complex professional work, finance and science."
|
|
509
501
|
}
|
|
510
502
|
},
|
|
511
503
|
{
|
|
512
504
|
"match": "motif",
|
|
513
505
|
"text": {
|
|
514
|
-
"zh": "MIT
|
|
515
|
-
"en": "MIT-licensed
|
|
506
|
+
"zh": "MIT 许可的开放权重 MoE 模型。",
|
|
507
|
+
"en": "An MIT-licensed open-weight MoE model."
|
|
516
508
|
}
|
|
517
509
|
},
|
|
518
510
|
{
|
|
519
511
|
"match": "grok[._-]?4(?!\\d)",
|
|
520
512
|
"note": "Anchored to the Grok 4 line, so every 4.x build reads the same sentence and another line falls to the rule below.",
|
|
521
513
|
"text": {
|
|
522
|
-
"zh": "
|
|
514
|
+
"zh": "全球最智能的模型之一,原生支持工具调用与实时搜索。",
|
|
523
515
|
"en": "One of the most intelligent models in the world, with native tool use and real-time search."
|
|
524
516
|
}
|
|
525
517
|
},
|
|
@@ -534,15 +526,15 @@
|
|
|
534
526
|
"match": "doubao.*2[._-]?1(?!\\d)|seed[._-]?2[._-]?1(?!\\d)",
|
|
535
527
|
"note": "Anchored to Seed 2.1: the tiers it names are that generation's, so another Seed reads the vendor rule below.",
|
|
536
528
|
"text": {
|
|
537
|
-
"zh": "分 Pro 与 Turbo
|
|
538
|
-
"en": "
|
|
529
|
+
"zh": "分 Pro 与 Turbo 两档的生产力智能体模型,擅长通用任务与代码。",
|
|
530
|
+
"en": "A productivity agent model in Pro and Turbo tiers, strong at general agentic and coding tasks."
|
|
539
531
|
}
|
|
540
532
|
},
|
|
541
533
|
{
|
|
542
534
|
"match": "doubao|seed-?\\d|volc",
|
|
543
535
|
"text": {
|
|
544
|
-
"zh": "
|
|
545
|
-
"en": "
|
|
536
|
+
"zh": "覆盖对话、编程与多模态,经大规模线上业务验证。",
|
|
537
|
+
"en": "Chat, coding and multimodal work, proven across large-scale production use."
|
|
546
538
|
}
|
|
547
539
|
},
|
|
548
540
|
{
|
|
@@ -571,16 +563,16 @@
|
|
|
571
563
|
{
|
|
572
564
|
"match": "codestral",
|
|
573
565
|
"text": {
|
|
574
|
-
"zh": "
|
|
575
|
-
"en": "Built for completion, FIM and generation
|
|
566
|
+
"zh": "面向代码补全、FIM 与生成。",
|
|
567
|
+
"en": "Built for code completion, FIM and generation."
|
|
576
568
|
}
|
|
577
569
|
},
|
|
578
570
|
{
|
|
579
571
|
"match": "mistral.*large[._-]?3(?!\\d)",
|
|
580
|
-
"note": "Anchored to Large 3: the licence and the parameter
|
|
572
|
+
"note": "Anchored to Large 3: the licence and the parameter count are that model's, so another Mistral reads the line rule below.",
|
|
581
573
|
"text": {
|
|
582
|
-
"zh": "Apache 2.0
|
|
583
|
-
"en": "Apache
|
|
574
|
+
"zh": "Apache 2.0 许可的开放权重多模态 MoE,675B 总参数。",
|
|
575
|
+
"en": "An Apache 2.0 open-weight multimodal MoE with 675B parameters."
|
|
584
576
|
}
|
|
585
577
|
},
|
|
586
578
|
{
|
|
@@ -600,37 +592,37 @@
|
|
|
600
592
|
{
|
|
601
593
|
"match": "north",
|
|
602
594
|
"text": {
|
|
603
|
-
"zh": "
|
|
595
|
+
"zh": "把大模型、搜索与自动化整合进同一个企业级安全工作空间。",
|
|
604
596
|
"en": "LLMs, search and automation combined into one secure enterprise workspace."
|
|
605
597
|
}
|
|
606
598
|
},
|
|
607
599
|
{
|
|
608
600
|
"match": "command-?[ar]|cohere",
|
|
609
601
|
"text": {
|
|
610
|
-
"zh": "面向工具调用、RAG
|
|
611
|
-
"en": "For tool use, RAG and multilingual work
|
|
602
|
+
"zh": "面向工具调用、RAG 与多语言任务。",
|
|
603
|
+
"en": "For tool use, RAG and multilingual work."
|
|
612
604
|
}
|
|
613
605
|
},
|
|
614
606
|
{
|
|
615
607
|
"match": "phi-?\\d",
|
|
616
608
|
"text": {
|
|
617
|
-
"zh": "
|
|
618
|
-
"en": "
|
|
609
|
+
"zh": "面向边缘与本地部署的小模型,擅长推理、数学与代码。",
|
|
610
|
+
"en": "Small models for edge and local use, strong at reasoning, math and code."
|
|
619
611
|
}
|
|
620
612
|
},
|
|
621
613
|
{
|
|
622
614
|
"match": "(^|[^a-z0-9])nova(-|$)",
|
|
623
615
|
"note": "Every mention of the line reads the same boundary as the lockup rule: unanchored, this rule gives `sensenova-6.8-flash-lite` Amazon Nova's description.",
|
|
624
616
|
"text": {
|
|
625
|
-
"zh": "
|
|
626
|
-
"en": "
|
|
617
|
+
"zh": "亚马逊的多模态模型,支持文本、图像与视频输入。",
|
|
618
|
+
"en": "Amazon's multimodal models, taking text, image and video input."
|
|
627
619
|
}
|
|
628
620
|
},
|
|
629
621
|
{
|
|
630
622
|
"match": "sonar|perplexity",
|
|
631
623
|
"text": {
|
|
632
|
-
"zh": "
|
|
633
|
-
"en": "Search APIs answering with fresh web data and citations, from
|
|
624
|
+
"zh": "结合实时网络信息作答并附上引用来源,覆盖轻量问答到多步深度研究。",
|
|
625
|
+
"en": "Search APIs answering with fresh web data and citations, from quick answers to multi-step deep research."
|
|
634
626
|
}
|
|
635
627
|
}
|
|
636
628
|
],
|
|
@@ -653,8 +645,8 @@
|
|
|
653
645
|
"match": "a\\d+b",
|
|
654
646
|
"note": "MoE active-parameter suffix (`a95b`, `a23b`); tried before the dense rule so the active count is not mistaken for a total.",
|
|
655
647
|
"text": {
|
|
656
|
-
"zh": "
|
|
657
|
-
"en": "
|
|
648
|
+
"zh": "MoE 架构,单位成本低于同规模稠密模型。",
|
|
649
|
+
"en": "A mixture-of-experts model that costs less to serve than a dense model of its size."
|
|
658
650
|
}
|
|
659
651
|
},
|
|
660
652
|
{
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-claude-style",
|
|
3
3
|
"description": "Claude Code Desktop theme for DeepSeek Harness (dsh) web GUI — visual & interaction overhaul",
|
|
4
|
-
"version": "0.18.
|
|
4
|
+
"version": "0.18.5-dev.43",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/host/index.js",
|
|
7
7
|
"icon": "lib/claude-mark.svg",
|
|
Binary file
|
|
Binary file
|