dsh-llm-verifier 0.1.13 → 0.1.16
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/LICENSE +22 -22
- package/README.md +328 -301
- package/cordis.patch.yml +4 -4
- package/lib/caller-BWwSVNZf.js.map +1 -0
- package/lib/client.js +176 -14
- package/lib/client.js.map +1 -0
- package/lib/core.js.map +1 -0
- package/lib/index.js +400 -51
- package/lib/index.js.map +1 -0
- package/lib/types/auto.d.ts.map +1 -0
- package/lib/types/auto.js +8 -2
- package/lib/types/auto.js.map +1 -0
- package/lib/types/cache.d.ts.map +1 -0
- package/lib/types/cache.js.map +1 -0
- package/lib/types/caller.d.ts.map +1 -0
- package/lib/types/caller.js.map +1 -0
- package/lib/types/client-i18n.d.ts +27 -0
- package/lib/types/client-i18n.d.ts.map +1 -0
- package/lib/types/client-i18n.js +18 -0
- package/lib/types/client-i18n.js.map +1 -0
- package/lib/types/client.d.ts +15 -2
- package/lib/types/client.d.ts.map +1 -0
- package/lib/types/client.js +137 -10
- package/lib/types/client.js.map +1 -0
- package/lib/types/config.d.ts +4 -0
- package/lib/types/config.d.ts.map +1 -0
- package/lib/types/config.js +5 -3
- package/lib/types/config.js.map +1 -0
- package/lib/types/core.d.ts.map +1 -0
- package/lib/types/core.js.map +1 -0
- package/lib/types/engine.d.ts.map +1 -0
- package/lib/types/engine.js.map +1 -0
- package/lib/types/images.d.ts.map +1 -0
- package/lib/types/images.js.map +1 -0
- package/lib/types/index.d.ts +2 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +162 -9
- package/lib/types/index.js.map +1 -0
- package/lib/types/plan-gate.d.ts +27 -0
- package/lib/types/plan-gate.d.ts.map +1 -0
- package/lib/types/plan-gate.js +60 -0
- package/lib/types/plan-gate.js.map +1 -0
- package/lib/types/router.d.ts +28 -32
- package/lib/types/router.d.ts.map +1 -0
- package/lib/types/router.js +41 -9
- package/lib/types/router.js.map +1 -0
- package/lib/types/session.d.ts +11 -0
- package/lib/types/session.d.ts.map +1 -0
- package/lib/types/session.js +41 -11
- package/lib/types/session.js.map +1 -0
- package/lib/types/statistics.d.ts.map +1 -0
- package/lib/types/statistics.js.map +1 -0
- package/lib/types/team-gate.d.ts +20 -0
- package/lib/types/team-gate.d.ts.map +1 -0
- package/lib/types/team-gate.js +59 -0
- package/lib/types/team-gate.js.map +1 -0
- package/lib/types/top-logprobs.d.ts.map +1 -0
- package/lib/types/top-logprobs.js.map +1 -0
- package/lib/types/topic-storage.d.ts.map +1 -0
- package/lib/types/topic-storage.js.map +1 -0
- package/package.json +114 -112
- package/src/auto.test.ts +95 -86
- package/src/auto.ts +140 -133
- package/src/cache.ts +115 -115
- package/src/caller.test.ts +34 -34
- package/src/caller.ts +151 -151
- package/src/client-i18n.ts +18 -0
- package/src/client.tsx +383 -213
- package/src/config.ts +189 -183
- package/src/core.test.ts +71 -71
- package/src/core.ts +205 -205
- package/src/engine.test.ts +136 -136
- package/src/engine.ts +140 -140
- package/src/images.ts +33 -33
- package/src/index.ts +394 -247
- package/src/parity.test.ts +85 -85
- package/src/plan-gate.test.ts +56 -0
- package/src/plan-gate.ts +66 -0
- package/src/router.test.ts +107 -89
- package/src/router.ts +361 -309
- package/src/session.test.ts +71 -36
- package/src/session.ts +132 -103
- package/src/statistics.test.ts +80 -80
- package/src/statistics.ts +328 -328
- package/src/team-gate.test.ts +92 -0
- package/src/team-gate.ts +80 -0
- package/src/top-logprobs.test.ts +84 -84
- package/src/top-logprobs.ts +153 -153
- package/src/topic-storage.test.ts +31 -31
- package/src/topic-storage.ts +42 -42
package/cordis.patch.yml
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Installs the verifier's model-facing tools into a DSH profile.
|
|
2
|
-
- insert:
|
|
3
|
-
- id: llm-verifier
|
|
4
|
-
name: 'dsh-llm-verifier'
|
|
1
|
+
# Installs the verifier's model-facing tools into a DSH profile.
|
|
2
|
+
- insert:
|
|
3
|
+
- id: llm-verifier
|
|
4
|
+
name: 'dsh-llm-verifier'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caller-BWwSVNZf.js","names":[],"sources":["../src/top-logprobs.ts","../src/caller.ts"],"sourcesContent":["import type { Context } from '@deepseek-ai/cordis'\nimport { credentialRef } from '@deepseek-ai/dsh-credentials'\nimport { mkdir, readFile, rename, unlink, writeFile } from 'node:fs/promises'\nimport { dirname, isAbsolute, join, resolve } from 'node:path'\nimport type { CompletionLogprobs, TokenAlternative } from './core.ts'\nimport type { UsageStats, VerifierImage } from './caller.ts'\n\nexport interface TopLogprobRoute {\n baseURL: string\n apiKey?: string\n headers?: Record<string, string>\n deepSeekThinking: boolean\n}\nexport interface TopLogprobCompletion extends CompletionLogprobs { usage: UsageStats; scoringMode: 'top-logprobs' }\nexport class TopLogprobsUnsupportedError extends Error { constructor(message: string) { super(message); this.name = 'TopLogprobsUnsupportedError' } }\n\nfunction object(value: unknown): Record<string, unknown> | undefined { return typeof value === 'object' && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : undefined }\nfunction text(value: unknown): string | undefined { return typeof value === 'string' && value.trim() ? value.trim() : undefined }\nfunction endpoint(baseURL: string): string { return baseURL.replace(/\\/+$/, '') + '/chat/completions' }\nfunction dataUrl(image: VerifierImage): string { return 'data:' + image.mediaType + ';base64,' + Buffer.from(image.data.buffer, image.data.byteOffset, image.data.byteLength).toString('base64') }\n\nasync function credential(ctx: Context, name: string | undefined): Promise<string | undefined> {\n if (!name) return undefined\n const provider = ctx.get('credentials')\n return (await provider?.resolve(credentialRef(name)))?.value\n}\n\nexport async function resolveTopLogprobRoute(ctx: Context, provider: string): Promise<TopLogprobRoute | undefined> {\n const settings = ctx.get('settings')\n if (provider === 'deepseek-official') {\n const value = settings ? object(settings.get('llm-deepseek' as never)) ?? {} : {}\n const apiKeyEnv = text(value.apiKeyEnv) ?? 'DEEPSEEK_API_KEY'\n const apiKey = await credential(ctx, apiKeyEnv)\n if (!apiKey) return undefined\n return { baseURL: text(value.baseURL) ?? 'https://api.deepseek.com', apiKey, deepSeekThinking: true }\n }\n if (!settings) return undefined\n const root = object(settings.get('llm-pi-ai' as never))\n const profiles = object(root?.providers)\n const profile = object(profiles?.[provider])\n // Only explicitly OpenAI-compatible profiles are safe to serialize directly.\n // Other DSH adapters keep their private protocol and use the explicit-tag fallback.\n if (!profile || profile.api !== 'openai-completions') return undefined\n const baseURL = text(profile.baseURL)\n if (!baseURL || !/^https:\\/\\//i.test(baseURL)) return undefined\n const apiKey = await credential(ctx, text(profile.apiKeyEnv))\n const rawHeaders = object(profile.headers)\n const headers = rawHeaders === undefined ? undefined : Object.fromEntries(Object.entries(rawHeaders).filter((entry): entry is [string, string] => typeof entry[1] === 'string'))\n return { baseURL, ...(apiKey ? { apiKey } : {}), ...(headers ? { headers } : {}), deepSeekThinking: false }\n}\n\nexport async function callTopLogprobs(route: TopLogprobRoute, model: string, prompt: string, maxTokens: number, reasoningEffort: string | undefined, signal?: AbortSignal, images?: readonly VerifierImage[]): Promise<TopLogprobCompletion> {\n const content: string | Record<string, unknown>[] = images?.length ? [{ type: 'text', text: prompt }, ...images.map(image => ({ type: 'image_url', image_url: { url: dataUrl(image) } }))] : prompt\n const thinking = route.deepSeekThinking && reasoningEffort ? reasoningEffort === 'off' ? { thinking: { type: 'disabled' } } : { thinking: { type: 'enabled' }, reasoning_effort: reasoningEffort } : {}\n const response = await fetch(endpoint(route.baseURL), {\n method: 'POST', redirect: 'error', signal,\n headers: { 'content-type': 'application/json', ...(route.apiKey ? { authorization: 'Bearer ' + route.apiKey } : {}), ...route.headers },\n body: JSON.stringify({ model, messages: [{ role: 'user', content }], max_tokens: maxTokens, temperature: 1, logprobs: true, top_logprobs: 20, ...thinking }),\n })\n const raw = await response.text()\n if (!response.ok) {\n const excerpt = raw.slice(0, 1000)\n if ([400, 404, 405, 415, 422].includes(response.status) && /logprob|top_logprobs|unsupported|unknown (?:field|parameter)|unrecognized (?:field|parameter)|not support/i.test(excerpt)) throw new TopLogprobsUnsupportedError('provider rejected top_logprobs: HTTP ' + response.status + ' ' + excerpt)\n throw new Error('llm-verifier: top_logprobs request failed with HTTP ' + response.status + ': ' + excerpt)\n }\n let body: Record<string, unknown>\n try { body = object(JSON.parse(raw)) ?? {} } catch { throw new Error('llm-verifier: top_logprobs endpoint returned invalid JSON') }\n const choices = Array.isArray(body.choices) ? body.choices : []\n const choice = object(choices[0])\n const message = object(choice?.message)\n const answer = typeof message?.content === 'string' ? message.content : ''\n const logprobs = object(choice?.logprobs)\n const rows = Array.isArray(logprobs?.content) ? logprobs.content : []\n if (!rows.length) throw new TopLogprobsUnsupportedError('provider returned no token logprobs')\n const tokens: string[] = []\n const positions: TokenAlternative[][] = []\n for (const rawRow of rows) {\n const row = object(rawRow) ?? {}\n const token = typeof row.token === 'string' ? row.token : ''\n tokens.push(token)\n const top = Array.isArray(row.top_logprobs) ? row.top_logprobs : []\n const alternatives = top.flatMap(value => { const item = object(value); return item && typeof item.token === 'string' && typeof item.logprob === 'number' ? [{ token: item.token, logprob: item.logprob }] : [] })\n if (!alternatives.length && typeof row.logprob === 'number') alternatives.push({ token, logprob: row.logprob })\n positions.push(alternatives)\n }\n const rawUsage = object(body.usage) ?? {}\n const promptDetails = object(rawUsage.prompt_tokens_details) ?? {}\n const completionDetails = object(rawUsage.completion_tokens_details) ?? {}\n const cached = Number(rawUsage.prompt_cache_hit_tokens ?? promptDetails.cached_tokens ?? 0) || 0\n const input = Number(rawUsage.prompt_tokens ?? 0) || 0\n return { text: answer, tokens, positions, scoringMode: 'top-logprobs', usage: { calls: 1, attempts: 1, retries: 0, inputTokens: Math.max(0, input - cached), cachedInputTokens: cached, outputTokens: Number(rawUsage.completion_tokens ?? 0) || 0, reasoningTokens: Number(completionDetails.reasoning_tokens ?? 0) || 0 } }\n}\n\n/** Marks older than this are dropped on hydration so a provider that later gains logprobs support is re-probed. */\nexport const CAPABILITY_TTL_MS = 24 * 60 * 60 * 1000\n\ninterface CapabilityDocument { version: 1; entries: Record<string, number> }\n\n/** Resolves the capability memory file beside the score cache inside the topic verifier directory. */\nexport function resolveCapabilityFile(cacheDir: string, cwd = process.cwd()): string {\n const root = isAbsolute(cacheDir) ? cacheDir : resolve(cwd, cacheDir)\n return join(root, 'capabilities-v1.json')\n}\n\nexport class TopLogprobCapabilityCache {\n private readonly unsupported = new Map<string, number>()\n private loaded = false\n private hydrating: Promise<void> | undefined\n private writing: Promise<void> = Promise.resolve()\n\n constructor(private readonly file?: string, private readonly now: () => number = Date.now) {}\n\n isUnsupported(provider: string, model: string): boolean { return this.unsupported.has(provider + '\\0' + model) }\n\n /** Hydrates persisted marks once; in-process marks always win over file contents. */\n async ensureLoaded(): Promise<void> {\n if (this.loaded || this.file === undefined) return\n this.hydrating ??= (async () => {\n try {\n const document = JSON.parse(await readFile(this.file!, 'utf8')) as CapabilityDocument\n const entries = document !== null && typeof document === 'object' && document.version === 1 && typeof document.entries === 'object' && document.entries !== null ? document.entries : {}\n const now = this.now()\n for (const [key, markedAt] of Object.entries(entries)) {\n if (typeof markedAt !== 'number' || !Number.isFinite(markedAt) || markedAt < 0 || now - markedAt > CAPABILITY_TTL_MS) continue\n // Max-merge: never let an older persisted stamp clobber a fresher in-process probe.\n const existing = this.unsupported.get(key)\n if (existing === undefined || existing < markedAt) this.unsupported.set(key, markedAt)\n }\n } catch { /* a missing or unreadable file simply starts empty */ }\n this.loaded = true\n })()\n await this.hydrating\n }\n\n markUnsupported(provider: string, model: string): void {\n this.unsupported.set(provider + '\\0' + model, this.now())\n if (this.file === undefined) return\n // Serialize behind hydration so an early mark never clobbers not-yet-loaded entries.\n this.writing = this.writing\n .then(() => this.ensureLoaded())\n .then(async () => {\n const snapshot: CapabilityDocument = { version: 1, entries: Object.fromEntries(this.unsupported) }\n await mkdir(dirname(this.file!), { recursive: true })\n const temporary = this.file! + '.tmp-' + process.pid\n await writeFile(temporary, JSON.stringify(snapshot), 'utf8')\n try { await rename(temporary, this.file!) } catch (error) { await unlink(temporary).catch(() => {}); throw error }\n })\n .catch(() => { /* capability memory is best-effort; the next mark rewrites the file */ })\n }\n\n /** Resolves once the trailing persistence attempt settles; exposed for tests. */\n flush(): Promise<void> { return this.writing }\n}\n","import { BlockAssembler, ReasoningEffortId, createUserMessage, type ContentBlock, type FinishReason, type LlmRuntime } from '@deepseek-ai/dsh-llm'\nimport * as LlmModule from '@deepseek-ai/dsh-llm'\n\nfunction deepFreeze<T>(value: T): T {\n const mod = LlmModule as unknown as Record<string, unknown>\n if (typeof mod.deepFreeze === 'function') {\n return (mod.deepFreeze as Function)(value)\n }\n if (value && typeof value === 'object' && !Object.isFrozen(value)) {\n Object.freeze(value)\n for (const key of Object.keys(value)) {\n deepFreeze((value as Record<string, unknown>)[key])\n }\n }\n return value\n}\nimport type { AttachmentStore } from '@deepseek-ai/dsh-attachment'\nimport type { CompletionLogprobs } from './core.ts'\nimport { TopLogprobCapabilityCache, TopLogprobsUnsupportedError, callTopLogprobs, resolveTopLogprobRoute } from './top-logprobs.ts'\nimport type { Context } from '@deepseek-ai/cordis'\n\nexport interface VerifierClientConfig {\n ctx: Context\n llm: LlmRuntime\n attachments: AttachmentStore\n topLogprobCapabilities: TopLogprobCapabilityCache\n provider: string\n model: string\n reasoningEffort?: string\n maxTokens: number\n timeoutMs: number\n maxRetries: number\n retryBaseDelayMs: number\n limiter?: RequestLimiter\n}\n\nexport interface VerifierImage {\n data: Uint8Array\n mediaType: 'image/png' | 'image/jpeg' | 'image/webp' | 'image/gif'\n}\n\nexport interface UsageStats {\n calls: number\n attempts: number\n retries: number\n inputTokens: number\n cachedInputTokens: number\n outputTokens: number\n reasoningTokens: number\n}\n\nexport type ScoringMode = 'top-logprobs' | 'explicit-tag'\nexport interface VerifierCompletion extends CompletionLogprobs { usage: UsageStats; scoringMode: ScoringMode }\n\nfunction failureMessage(finish: FinishReason): string | undefined {\n if (finish.kind === 'error' || finish.kind === 'aborted') return finish.failure.message\n if (finish.kind === 'max-tokens') return 'verifier response reached max tokens before completing its answer'\n return undefined\n}\n\nasync function delay(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) throw signal.reason\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(resolve, ms)\n const abort = () => { clearTimeout(timer); reject(signal?.reason) }\n signal?.addEventListener('abort', abort, { once: true })\n })\n}\n\nfunction usage(attempts: number, value = {} as { inputTokens?: number; outputTokens?: number; cacheReadTokens?: number; cacheWriteTokens?: number; reasoningTokens?: number }): UsageStats {\n return { calls: 1, attempts, retries: attempts - 1, inputTokens: value.inputTokens ?? 0, cachedInputTokens: (value.cacheReadTokens ?? 0) + (value.cacheWriteTokens ?? 0), outputTokens: value.outputTokens ?? 0, reasoningTokens: value.reasoningTokens ?? 0 }\n}\n\nasync function callExplicitTag(config: VerifierClientConfig, prompt: string, signal?: AbortSignal, images?: readonly VerifierImage[]): Promise<VerifierCompletion> {\n let attempt = 0\n while (true) {\n attempt += 1\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(new Error('llm-verifier: request timed out')), config.timeoutMs)\n const abort = () => controller.abort(signal?.reason)\n signal?.addEventListener('abort', abort, { once: true })\n try {\n const content: ContentBlock[] = [{ type: 'text', text: prompt }]\n for (const image of images ?? []) {\n const ref = await config.attachments.saveImage({ data: image.data, mediaType: image.mediaType })\n content.push({ type: 'image', attachment: ref })\n }\n const messages = [createUserMessage({ content, source: { kind: 'plugin', plugin: 'dsh-llm-verifier' } })]\n const assembler = new BlockAssembler()\n const options = deepFreeze({\n provider: config.provider,\n model: config.model,\n ...(config.reasoningEffort ? { reasoningEffort: ReasoningEffortId(config.reasoningEffort) } : {}),\n messages,\n maxTokens: config.maxTokens,\n temperature: 1,\n signal: controller.signal,\n })\n for await (const chunk of config.llm.stream(options)) assembler.push(chunk)\n const failed = failureMessage(assembler.finish)\n if (failed !== undefined) throw new Error('llm-verifier: model call failed: ' + failed)\n const text = assembler.blocks().filter((block): block is Extract<ContentBlock, { type: 'text' }> => block.type === 'text').map(block => block.text).join('')\n if (!text.trim()) throw new Error('llm-verifier: selected DSH model produced no text')\n // DSH adapters expose provider-neutral text/usage but not top-logprob candidates.\n // extractScore() therefore uses the model's explicit final A–T tags.\n return { text, tokens: [], positions: [], scoringMode: 'explicit-tag', usage: usage(attempt, assembler.usage) }\n } catch (error) {\n if (signal?.aborted) throw signal.reason\n if (attempt > config.maxRetries || !(error instanceof Error) || !/rate|quota|timeout|timed out|temporar|network|fetch|socket|5\\d\\d/i.test(error.message)) throw error\n await delay(Math.min(30000, config.retryBaseDelayMs * 2 ** (attempt - 1) * (0.8 + Math.random() * 0.4)), signal)\n } finally {\n clearTimeout(timeout)\n signal?.removeEventListener('abort', abort)\n }\n }\n}\n\nexport class RequestLimiter {\n private active = 0\n private readonly queue: Array<() => void> = []\n constructor(readonly limit: number) { if (!Number.isSafeInteger(limit) || limit < 1) throw new Error('llm-verifier: request concurrency limit must be a positive integer') }\n async run<T>(operation: () => Promise<T>, signal?: AbortSignal): Promise<T> {\n if (this.active >= this.limit) await new Promise<void>((resolve, reject) => {\n const enter = () => { signal?.removeEventListener('abort', abort); resolve() }\n const abort = () => { const index = this.queue.indexOf(enter); if (index >= 0) this.queue.splice(index, 1); reject(signal?.reason) }\n this.queue.push(enter); signal?.addEventListener('abort', abort, { once: true })\n })\n if (signal?.aborted) throw signal.reason\n this.active += 1\n try { return await operation() } finally { this.active -= 1; this.queue.shift()?.() }\n }\n}\n\n/** Best-effort pre-call channel prediction for cache identity only; callAutomatic() stays the runtime source of truth. */\nexport async function predictScoringChannel(config: VerifierClientConfig): Promise<ScoringMode> {\n await config.topLogprobCapabilities.ensureLoaded()\n return config.topLogprobCapabilities.isUnsupported(config.provider, config.model) ? 'explicit-tag' : 'top-logprobs'\n}\n\nasync function callAutomatic(config: VerifierClientConfig, prompt: string, signal?: AbortSignal, images?: readonly VerifierImage[]): Promise<VerifierCompletion> {\n await config.topLogprobCapabilities.ensureLoaded()\n if (!config.topLogprobCapabilities.isUnsupported(config.provider, config.model)) {\n const route = await resolveTopLogprobRoute(config.ctx, config.provider)\n if (route !== undefined) {\n try { return await callTopLogprobs(route, config.model, prompt, config.maxTokens, config.reasoningEffort, signal, images) }\n catch (error) {\n if (!(error instanceof TopLogprobsUnsupportedError)) throw error\n config.topLogprobCapabilities.markUnsupported(config.provider, config.model)\n }\n } else config.topLogprobCapabilities.markUnsupported(config.provider, config.model)\n }\n return callExplicitTag(config, prompt, signal, images)\n}\n\nexport async function callVerifier(config: VerifierClientConfig, prompt: string, signal?: AbortSignal, images?: readonly VerifierImage[]): Promise<VerifierCompletion> {\n const invoke = () => callAutomatic(config, prompt, signal, images)\n return config.limiter === undefined ? invoke() : config.limiter.run(invoke, signal)\n}\n\n/** Plain-text verifier call for conservative JSON routing; probability labels are intentionally bypassed. */\nexport async function callVerifierText(config: VerifierClientConfig, prompt: string, signal?: AbortSignal): Promise<VerifierCompletion> {\n const invoke = () => callExplicitTag(config, prompt, signal)\n return config.limiter === undefined ? invoke() : config.limiter.run(invoke, signal)\n}\nexport function addUsage(target: UsageStats, source: UsageStats): void { for (const key of ['calls', 'attempts', 'retries', 'inputTokens', 'cachedInputTokens', 'outputTokens', 'reasoningTokens'] as const) target[key] += source[key] }\nexport function emptyUsage(): UsageStats { return { calls: 0, attempts: 0, retries: 0, inputTokens: 0, cachedInputTokens: 0, outputTokens: 0, reasoningTokens: 0 } }\n"],"mappings":"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"}
|
package/lib/client.js
CHANGED
|
@@ -131,7 +131,16 @@ window.__ModuleLoader__.load({
|
|
|
131
131
|
"models.calls": "{calls} 请求",
|
|
132
132
|
"models.tokens": "{tokens} Token",
|
|
133
133
|
"models.empty": "暂无模型调用",
|
|
134
|
-
"slot.statistics": "工具统计"
|
|
134
|
+
"slot.statistics": "工具统计",
|
|
135
|
+
"slot.globalDashboard": "Verifier 看板",
|
|
136
|
+
"global.panelTitle": "LLM Verifier 全局监控中心",
|
|
137
|
+
"global.panelIntro": "跨会话全局统计、裁判模型效能大盘与任务验收总览。",
|
|
138
|
+
"guide.verifier.title": "Verifier 统计",
|
|
139
|
+
"guide.verifier.desc": "大模型复核工具调用、耗时与成本统计",
|
|
140
|
+
"field.autoVerifyTeamTasks.title": "自动验收 Team 任务",
|
|
141
|
+
"field.autoVerifyTeamTasks.help": "当 Agent Teams 中的任务状态变更或进入完成状态时,自动路由进度追踪与任务验收。",
|
|
142
|
+
"field.autoVerifyPlanMode.title": "计划模式自动预审",
|
|
143
|
+
"field.autoVerifyPlanMode.help": "在 Agent 调用 exit_plan_mode 提交计划交付人类评审前,自动对计划完整度与风险进行独立预审。"
|
|
135
144
|
};
|
|
136
145
|
const en = {
|
|
137
146
|
"settings.title": "LLM Verifier",
|
|
@@ -256,7 +265,16 @@ window.__ModuleLoader__.load({
|
|
|
256
265
|
"models.calls": "{calls} Requests",
|
|
257
266
|
"models.tokens": "{tokens} Tokens",
|
|
258
267
|
"models.empty": "No model calls",
|
|
259
|
-
"slot.statistics": "Statistics"
|
|
268
|
+
"slot.statistics": "Statistics",
|
|
269
|
+
"slot.globalDashboard": "Verifier Dashboard",
|
|
270
|
+
"global.panelTitle": "LLM Verifier Global Dashboard",
|
|
271
|
+
"global.panelIntro": "Cross-session statistics, judge model metrics, and task acceptance overview.",
|
|
272
|
+
"guide.verifier.title": "Verifier Stats",
|
|
273
|
+
"guide.verifier.desc": "LLM verifier tool calls, duration and cost statistics",
|
|
274
|
+
"field.autoVerifyTeamTasks.title": "Verify Team Tasks",
|
|
275
|
+
"field.autoVerifyTeamTasks.help": "Automatically route progress and verify tasks when Agent Teams task status changes or completes.",
|
|
276
|
+
"field.autoVerifyPlanMode.title": "Plan Mode Pre-verification",
|
|
277
|
+
"field.autoVerifyPlanMode.help": "Automatically pre-verify plan feasibility and risks before exit_plan_mode presents it for user review."
|
|
260
278
|
};
|
|
261
279
|
const dictionaries = {
|
|
262
280
|
zh,
|
|
@@ -460,6 +478,8 @@ window.__ModuleLoader__.load({
|
|
|
460
478
|
autoRouteMaxInputChars: Number(v.autoRouteMaxInputChars ?? 6e4),
|
|
461
479
|
autoMaxModelCallsPerTask: Number(v.autoMaxModelCallsPerTask ?? 48),
|
|
462
480
|
autoMaxModelCallsPerSession: Number(v.autoMaxModelCallsPerSession ?? 160),
|
|
481
|
+
autoVerifyTeamTasks: v.autoVerifyTeamTasks !== false,
|
|
482
|
+
autoVerifyPlanMode: v.autoVerifyPlanMode !== false,
|
|
463
483
|
provider: String(v.provider ?? ""),
|
|
464
484
|
model: String(v.model ?? ""),
|
|
465
485
|
...typeof v.reasoningEffort === "string" ? { reasoningEffort: v.reasoningEffort } : {},
|
|
@@ -690,6 +710,36 @@ window.__ModuleLoader__.load({
|
|
|
690
710
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { style: toggleThumbStyle(draft.autoRouteSemantic) })
|
|
691
711
|
})]
|
|
692
712
|
}),
|
|
713
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
714
|
+
style: row,
|
|
715
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Label, {
|
|
716
|
+
title: t["field.autoVerifyTeamTasks.title"],
|
|
717
|
+
help: t["field.autoVerifyTeamTasks.help"]
|
|
718
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
719
|
+
type: "button",
|
|
720
|
+
role: "switch",
|
|
721
|
+
"aria-checked": draft.autoVerifyTeamTasks,
|
|
722
|
+
"aria-label": t["field.autoVerifyTeamTasks.title"],
|
|
723
|
+
onClick: () => patch("autoVerifyTeamTasks", !draft.autoVerifyTeamTasks),
|
|
724
|
+
style: toggleStyle(draft.autoVerifyTeamTasks),
|
|
725
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { style: toggleThumbStyle(draft.autoVerifyTeamTasks) })
|
|
726
|
+
})]
|
|
727
|
+
}),
|
|
728
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
729
|
+
style: row,
|
|
730
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Label, {
|
|
731
|
+
title: t["field.autoVerifyPlanMode.title"],
|
|
732
|
+
help: t["field.autoVerifyPlanMode.help"]
|
|
733
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
734
|
+
type: "button",
|
|
735
|
+
role: "switch",
|
|
736
|
+
"aria-checked": draft.autoVerifyPlanMode,
|
|
737
|
+
"aria-label": t["field.autoVerifyPlanMode.title"],
|
|
738
|
+
onClick: () => patch("autoVerifyPlanMode", !draft.autoVerifyPlanMode),
|
|
739
|
+
style: toggleStyle(draft.autoVerifyPlanMode),
|
|
740
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { style: toggleThumbStyle(draft.autoVerifyPlanMode) })
|
|
741
|
+
})]
|
|
742
|
+
}),
|
|
693
743
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
694
744
|
style: row,
|
|
695
745
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Label, {
|
|
@@ -1169,12 +1219,12 @@ window.__ModuleLoader__.load({
|
|
|
1169
1219
|
})]
|
|
1170
1220
|
});
|
|
1171
1221
|
}
|
|
1172
|
-
function StatisticsPage({ sessionId, rpc }) {
|
|
1222
|
+
function StatisticsPage({ sessionId, rpc, isGlobal }) {
|
|
1173
1223
|
const lang = useLanguage();
|
|
1174
1224
|
const t = dictionaries[lang];
|
|
1175
1225
|
const labels = toolLabels[lang];
|
|
1176
1226
|
const [days, setDays] = (0, react.useState)(30);
|
|
1177
|
-
const [sessionOnly, setSessionOnly] = (0, react.useState)(
|
|
1227
|
+
const [sessionOnly, setSessionOnly] = (0, react.useState)(!isGlobal && Boolean(sessionId));
|
|
1178
1228
|
const [data, setData] = (0, react.useState)(null);
|
|
1179
1229
|
const [loading, setLoading] = (0, react.useState)(true);
|
|
1180
1230
|
const [error, setError] = (0, react.useState)(null);
|
|
@@ -1183,17 +1233,46 @@ window.__ModuleLoader__.load({
|
|
|
1183
1233
|
const controller = new AbortController();
|
|
1184
1234
|
setLoading(true);
|
|
1185
1235
|
setError(null);
|
|
1186
|
-
|
|
1236
|
+
const effectiveSessionId = sessionOnly && sessionId ? String(sessionId) : void 0;
|
|
1237
|
+
const queryPayload = {
|
|
1187
1238
|
fromMs: startOfRange(days),
|
|
1188
1239
|
toMs: endOfToday(),
|
|
1189
1240
|
timezoneOffsetMinutes: (/* @__PURE__ */ new Date()).getTimezoneOffset(),
|
|
1190
1241
|
recentLimit: 50,
|
|
1191
|
-
...
|
|
1192
|
-
}
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1242
|
+
...effectiveSessionId ? { sessionId: effectiveSessionId } : {}
|
|
1243
|
+
};
|
|
1244
|
+
const fetchOverview = async () => {
|
|
1245
|
+
if (rpc && typeof rpc.call === "function") try {
|
|
1246
|
+
const result = await rpc.call("/api", "llm-verifier/statistics", queryPayload, controller.signal);
|
|
1247
|
+
if (result && result.ok) return result.value;
|
|
1248
|
+
if (result && result.ok === false) throw new Error(result.error?.message ?? t["stats.requestFailed"]);
|
|
1249
|
+
} catch (rpcError) {
|
|
1250
|
+
if (controller.signal.aborted) throw rpcError;
|
|
1251
|
+
console.warn("[llm-verifier] rpc.call failed, trying fetch fallback:", rpcError);
|
|
1252
|
+
}
|
|
1253
|
+
try {
|
|
1254
|
+
const response = await fetch("/api/llm-verifier/statistics", {
|
|
1255
|
+
method: "POST",
|
|
1256
|
+
headers: { "content-type": "application/json" },
|
|
1257
|
+
body: JSON.stringify(queryPayload),
|
|
1258
|
+
signal: controller.signal
|
|
1259
|
+
});
|
|
1260
|
+
if (!response.ok) throw new Error(`HTTP ${response.status}: ${response.statusText || t["stats.requestFailed"]}`);
|
|
1261
|
+
const data = await response.json();
|
|
1262
|
+
if (data && data.ok === true) return data.value;
|
|
1263
|
+
if (data && data.type === "server-response" && data.result?.ok === true) return data.result.value;
|
|
1264
|
+
throw new Error(data?.error?.message ?? data?.result?.error?.message ?? t["stats.requestFailed"]);
|
|
1265
|
+
} catch (fetchError) {
|
|
1266
|
+
if (controller.signal.aborted) throw fetchError;
|
|
1267
|
+
if (rpc && typeof rpc.call === "function") {
|
|
1268
|
+
const legacy = await rpc.call("/llm-verifier", "statistics", queryPayload, controller.signal);
|
|
1269
|
+
if (legacy && legacy.ok) return legacy.value;
|
|
1270
|
+
}
|
|
1271
|
+
throw fetchError;
|
|
1272
|
+
}
|
|
1273
|
+
};
|
|
1274
|
+
fetchOverview().then((overview) => {
|
|
1275
|
+
setData(overview);
|
|
1197
1276
|
}).catch((cause) => {
|
|
1198
1277
|
if (!controller.signal.aborted) setError(message(cause));
|
|
1199
1278
|
}).finally(() => {
|
|
@@ -1257,14 +1336,14 @@ window.__ModuleLoader__.load({
|
|
|
1257
1336
|
margin: 0,
|
|
1258
1337
|
fontSize: 23
|
|
1259
1338
|
},
|
|
1260
|
-
children: t["stats.pageTitle"]
|
|
1339
|
+
children: isGlobal ? t["global.panelTitle"] : t["stats.pageTitle"]
|
|
1261
1340
|
})]
|
|
1262
1341
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
1263
1342
|
style: {
|
|
1264
1343
|
margin: "7px 0 0 44px",
|
|
1265
1344
|
...muted
|
|
1266
1345
|
},
|
|
1267
|
-
children: tFormat(t["stats.updatedAt"], { time: data ? dateTime(data.generatedAt, lang) : "--" })
|
|
1346
|
+
children: isGlobal ? t["global.panelIntro"] : tFormat(t["stats.updatedAt"], { time: data ? dateTime(data.generatedAt, lang) : "--" })
|
|
1268
1347
|
})] }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
1269
1348
|
style: {
|
|
1270
1349
|
display: "flex",
|
|
@@ -1298,7 +1377,7 @@ window.__ModuleLoader__.load({
|
|
|
1298
1377
|
children: tFormat(t["stats.daysUnit"], { days: value })
|
|
1299
1378
|
}, value))
|
|
1300
1379
|
}),
|
|
1301
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
1380
|
+
Boolean(sessionId) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
1302
1381
|
onClick: () => setSessionOnly((value) => !value),
|
|
1303
1382
|
style: {
|
|
1304
1383
|
border: "1px solid var(--dsw-alias-border-l2, rgba(255,255,255,.15))",
|
|
@@ -1756,6 +1835,49 @@ window.__ModuleLoader__.load({
|
|
|
1756
1835
|
})
|
|
1757
1836
|
});
|
|
1758
1837
|
}
|
|
1838
|
+
function VerifierSidebarIcon({ size, active }) {
|
|
1839
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
1840
|
+
style: {
|
|
1841
|
+
display: "inline-flex",
|
|
1842
|
+
alignItems: "center",
|
|
1843
|
+
justifyContent: "center",
|
|
1844
|
+
width: size,
|
|
1845
|
+
height: size,
|
|
1846
|
+
color: active ? "var(--dsw-alias-brand-primary, #4f8cff)" : "currentColor"
|
|
1847
|
+
},
|
|
1848
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconDataOutline16, { size: Math.min(18, size) })
|
|
1849
|
+
});
|
|
1850
|
+
}
|
|
1851
|
+
function GlobalVerifierDashboard({ rpc }) {
|
|
1852
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StatisticsPage, {
|
|
1853
|
+
rpc,
|
|
1854
|
+
isGlobal: true
|
|
1855
|
+
});
|
|
1856
|
+
}
|
|
1857
|
+
function RightSidebarVerifierPanel({ rpc, sessionId }) {
|
|
1858
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
1859
|
+
style: {
|
|
1860
|
+
height: "100%",
|
|
1861
|
+
overflow: "hidden",
|
|
1862
|
+
display: "flex",
|
|
1863
|
+
flexDirection: "column"
|
|
1864
|
+
},
|
|
1865
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StatisticsPage, {
|
|
1866
|
+
rpc,
|
|
1867
|
+
sessionId
|
|
1868
|
+
})
|
|
1869
|
+
});
|
|
1870
|
+
}
|
|
1871
|
+
function RightSidebarVerifierTitle() {
|
|
1872
|
+
const t = dictionaries[useLanguage()];
|
|
1873
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
1874
|
+
style: {
|
|
1875
|
+
fontSize: 13,
|
|
1876
|
+
fontWeight: 500
|
|
1877
|
+
},
|
|
1878
|
+
children: t["slot.statistics"]
|
|
1879
|
+
});
|
|
1880
|
+
}
|
|
1759
1881
|
const inject = [
|
|
1760
1882
|
"slots",
|
|
1761
1883
|
"connection",
|
|
@@ -1780,10 +1902,50 @@ window.__ModuleLoader__.load({
|
|
|
1780
1902
|
label: detectLanguage() === "zh" ? zh["slot.statistics"] : en["slot.statistics"],
|
|
1781
1903
|
inject: () => ({ rpc: connection.rpc })
|
|
1782
1904
|
}, StatisticsPage));
|
|
1905
|
+
const VERIFIER_TAB_KIND = "llm-verifier";
|
|
1906
|
+
const VERIFIER_TAB_ID = "dsh-llm-verifier";
|
|
1907
|
+
const registerRightSidebar = (tabs) => {
|
|
1908
|
+
if (!tabs || typeof tabs.register !== "function") return;
|
|
1909
|
+
try {
|
|
1910
|
+
tabs.register({
|
|
1911
|
+
id: VERIFIER_TAB_ID,
|
|
1912
|
+
kind: VERIFIER_TAB_KIND,
|
|
1913
|
+
priority: "extension",
|
|
1914
|
+
title: () => detectLanguage() === "zh" ? zh["slot.statistics"] : en["slot.statistics"],
|
|
1915
|
+
guide: [{
|
|
1916
|
+
order: 45,
|
|
1917
|
+
title: () => detectLanguage() === "zh" ? zh["guide.verifier.title"] : en["guide.verifier.title"],
|
|
1918
|
+
description: () => detectLanguage() === "zh" ? zh["guide.verifier.desc"] : en["guide.verifier.desc"],
|
|
1919
|
+
icon: VerifierSidebarIcon
|
|
1920
|
+
}]
|
|
1921
|
+
});
|
|
1922
|
+
} catch {}
|
|
1923
|
+
};
|
|
1924
|
+
const existingTabs = typeof ctx.get === "function" ? ctx.get("sidebarRightTabs") : void 0;
|
|
1925
|
+
if (existingTabs) registerRightSidebar(existingTabs);
|
|
1926
|
+
if (typeof ctx.inject === "function") try {
|
|
1927
|
+
ctx.inject(["sidebarRightTabs"], (subCtx) => {
|
|
1928
|
+
const subTabs = typeof subCtx?.get === "function" ? subCtx.get("sidebarRightTabs") : subCtx?.sidebarRightTabs;
|
|
1929
|
+
if (subTabs) registerRightSidebar(subTabs);
|
|
1930
|
+
});
|
|
1931
|
+
} catch {}
|
|
1932
|
+
ctx.slots.inject("sidebar.right.pane.tab", () => ctx.slots.register({
|
|
1933
|
+
name: "sidebar.right.pane.tab",
|
|
1934
|
+
key: VERIFIER_TAB_ID,
|
|
1935
|
+
inject: () => ({ rpc: connection.rpc })
|
|
1936
|
+
}, RightSidebarVerifierPanel));
|
|
1937
|
+
ctx.slots.inject("sidebar.right.pane.tab.title", () => ctx.slots.register({
|
|
1938
|
+
name: "sidebar.right.pane.tab.title",
|
|
1939
|
+
key: VERIFIER_TAB_ID
|
|
1940
|
+
}, RightSidebarVerifierTitle));
|
|
1783
1941
|
}
|
|
1784
1942
|
//#endregion
|
|
1943
|
+
exports.GlobalVerifierDashboard = GlobalVerifierDashboard;
|
|
1944
|
+
exports.RightSidebarVerifierPanel = RightSidebarVerifierPanel;
|
|
1945
|
+
exports.RightSidebarVerifierTitle = RightSidebarVerifierTitle;
|
|
1785
1946
|
exports.StatisticsPage = StatisticsPage;
|
|
1786
1947
|
exports.VerifierSettings = VerifierSettings;
|
|
1948
|
+
exports.VerifierSidebarIcon = VerifierSidebarIcon;
|
|
1787
1949
|
exports.apply = apply;
|
|
1788
1950
|
exports.compact = compact;
|
|
1789
1951
|
exports.dateTime = dateTime;
|