Bonsai-Chat-WebGPU / src /bench /report.test.ts
Valeriy Selitskiy
Release v1.2.0 live model telemetry
c3633b1
Raw
History Blame Contribute Delete
26.7 kB
import { describe, expect, it } from 'vitest';
import type {
BackendReport,
EngineCapabilities,
GenerateParams,
LoadModelResult,
ManifestModelV2,
ModelManifestV2,
} from '../engine';
import {
BENCHMARK_WORKLOADS,
DEFAULT_BENCHMARK_WORKLOAD_ID,
TOKEN_ID_CHECKPOINTS,
benchmarkReportFilename,
buildBenchmarkReport,
classifyCacheState,
serializeBenchmarkReport,
type BenchmarkObservation,
type TeacherForcedReferenceScoreEvidence,
} from './report';
const JSPI_WASM_SHA256 = 'd'.repeat(64);
const COMPAT_WASM_SHA256 = 'c'.repeat(64);
const COMPAT_WORKER_SHA256 = 'b'.repeat(64);
const model = {
id: '8b',
displayName: 'Bonsai 8B',
architecture: 'qwen3next',
source: {
repo: 'prism-ml/Bonsai-8B-gguf',
revision: '0123456789abcdef0123456789abcdef01234567',
file: 'Bonsai-8B-Q1_0.gguf',
bytes: 1_000,
sha256: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
},
files: [{
path: '8b/Bonsai-8B-Q1_0.gguf',
bytes: 1_000,
sha256: 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb',
}],
downloadBytes: 1_000,
} as ManifestModelV2;
const manifest = {
repository: {
id: 'WaveCut/Bonsai-web-GGUF',
revision: '112ea7a1a6229bde132b176b9a72477a7ecfde64',
},
} as unknown as ModelManifestV2;
const capabilities = {
crossOriginIsolated: true,
sharedArrayBuffer: true,
hardwareConcurrency: 12,
storage: { usageBytes: 1_000, quotaBytes: 10_000, persisted: true },
webgpu: {
available: true,
name: 'Apple M4 Max',
vendor: 'Apple',
architecture: 'metal-3',
device: null,
description: 'Apple M4 Max',
limits: { maxStorageBufferBindingSize: 1_073_741_824 },
features: ['shader-f16'],
},
browser: {
userAgent: 'Mozilla/5.0 Chrome/150.0.0.0 Safari/537.36',
platform: 'MacIntel',
language: 'en-GB',
},
runtime: {
implementation: 'bonsai-wllama',
wllamaRevision: '912c18b75d4358c1405a64646b8dbe43a205943b',
llamaCppRevision: '00fa7cb284cbf133fc426733bd64238a3588a33e',
patchSetSha256: 'f'.repeat(64),
moduleSha256: 'e'.repeat(64),
wasmFlavor: 'jspi',
wasmSha256: JSPI_WASM_SHA256,
compatWorkerSha256: null,
tokenEmbeddingOnWebGPU: true,
tensorPlacementOverrides: false,
},
} satisfies EngineCapabilities;
const backendReport = {
backends: ['WebGPU'],
nGraphSplits: 1,
opsOnCpu: 0,
layersGpu: { offloaded: 49, total: 49 },
flashAttention: false,
cacheTypeK: 'f16',
cacheTypeV: 'f16',
webgpuKvBufferBytes: 56 * 1024 ** 2,
webgpuTrace: [],
} satisfies BackendReport;
const loadResult = {
modelId: '8b',
backend: 'webgpu',
gate: {
allowed: true,
requestedBackend: 'auto',
selectedBackend: 'webgpu',
reasons: [],
warnings: [],
requiredBytes: 1_000,
availableStorageBytes: 9_000,
},
shardUrls: ['https://models.test/bonsai-8b.gguf'],
context: {
size: 4_096,
trainingSize: 32_768,
layerCount: 49,
vocabularySize: 151_936,
batchSize: 2_048,
microBatchSize: 512,
},
tuning: {
scope: 'release-defaults',
requested: {
nBatch: null,
nUbatch: null,
flashMode: 'off',
cacheTypeK: 'f16',
cacheTypeV: 'f16',
wasmFlavor: 'auto',
},
observed: {
nBatch: 2_048,
nUbatch: 512,
flashAttention: false,
cacheTypeK: 'f16',
cacheTypeV: 'f16',
kvBufferBytes: 56 * 1024 ** 2,
wasmFlavor: 'jspi',
wasmSha256: JSPI_WASM_SHA256,
compatWorkerSha256: null,
},
applied: true,
},
chatTemplate: {
bytes: 1_024,
hasThinkMarker: true,
hasToolCallMarker: true,
hasToolResponseMarker: true,
},
backendReport,
} satisfies LoadModelResult;
const fieldCoreGenerationRequest: GenerateParams = {
messages: BENCHMARK_WORKLOADS[DEFAULT_BENCHMARK_WORKLOAD_ID].messages.map((message) => ({
...message,
})),
maxTokens: 64,
temperature: 0,
topP: 1,
topK: 1,
seed: 42,
toolChoice: 'none',
cachePrompt: false,
returnTokenIds: true,
};
function sampledTokenTrace(tokenIds: readonly number[]) {
return tokenIds.map((id) => ({
selected: { id, logprob: -0.1 },
topCandidates: [
{ id, logprob: -0.1 },
{ id: id + 10_001, logprob: -1 },
{ id: id + 10_002, logprob: -2 },
{ id: id + 10_003, logprob: -3 },
{ id: id + 10_004, logprob: -4 },
],
}));
}
function teacherForcedReferenceScore(
referenceTokenIds: readonly number[],
): TeacherForcedReferenceScoreEvidence {
const entries = referenceTokenIds.map((id, index) => ({
index,
selectedReference: { id, logprob: -0.1 },
naturalTop1: { id, logprob: -0.1 },
topCandidates: [
{ id, logprob: -0.1 },
{ id: id + 10_001, logprob: -1 },
{ id: id + 10_002, logprob: -2 },
{ id: id + 10_003, logprob: -3 },
{ id: id + 10_004, logprob: -4 },
],
referenceRankInTopCandidatesZeroBased: 0,
top1Top2Margin: 0.9,
}));
return {
fixture: {
schemaVersion: 1,
kind: 'bonsai-state-drift-reference',
workload: {
id: 'state-drift-1k-v1',
messages: BENCHMARK_WORKLOADS['state-drift-1k-v1'].messages.map((message) => ({
role: 'user',
content: message.content ?? '',
})),
},
provenance: {
sourceEvidence: 'results/space-model/fixture.json',
engineRevision: capabilities.runtime.llamaCppRevision,
nativeBinary: { bytes: 1, sha256: '1'.repeat(64) },
model: { file: model.source.file, bytes: model.source.bytes, sha256: model.source.sha256 },
renderedPromptSha256: '2'.repeat(64),
execution: { backend: 'cpu', contextSize: 4_096, batchSize: 2_048, microBatchSize: 512 },
},
tokenEncoding: 'uint32-le',
promptTokenIds: Array.from({ length: 38 }, (_, index) => index + 1),
promptTokenIdsSha256: '3'.repeat(64),
referenceTokenIds: [...referenceTokenIds],
referenceTokenIdsSha256: '4'.repeat(64),
checkpointPrefixes: TOKEN_ID_CHECKPOINTS.map((tokens) => ({
tokens,
sha256: '5'.repeat(64),
})),
},
score: {
method: {
promptMode: 'raw-token-id-prefix',
maxTokensPerStep: 1,
temperature: 0,
topK: 1,
reportedTopLogprobs: 5,
logitBias: 1_000,
cachePromptFirst: false,
cachePromptSubsequent: true,
},
entries,
summary: { tokenCount: 1_024, meanNll: 0.1, perplexity: Math.exp(0.1) },
},
};
}
function observation(overrides: Partial<BenchmarkObservation> = {}): BenchmarkObservation {
return {
startedAt: '2026-07-15T10:00:00.000Z',
completedAt: '2026-07-15T10:00:10.123Z',
manifest,
model,
capabilities,
requestedBackend: 'auto',
contextSize: 4_096,
workloadId: DEFAULT_BENCHMARK_WORKLOAD_ID,
generationRequest: {
...fieldCoreGenerationRequest,
messages: fieldCoreGenerationRequest.messages.map((message) => ({ ...message })),
},
coldLoadMs: 1_234.56,
warmLoadMs: 234.54,
coldCachedBytes: 250,
storagePersistent: true,
loadResult,
generationResult: {
text: 'fixture',
reasoningText: '',
tokenIds: [101, 102, 103, 104, 105, 106, 107, 108],
tokenTrace: sampledTokenTrace([101, 102, 103, 104, 105, 106, 107, 108]),
finishReason: 'stop',
toolCalls: [],
usage: { promptTokens: 20, completionTokens: 8, totalTokens: 28 },
timings: { promptTokensPerSecond: 123.456, predictedTokensPerSecond: 45.678 },
},
generationElapsedMs: 900.04,
timeToFirstTokenMs: 123.45,
streamedTokenEvents: 5,
backendReport,
...overrides,
};
}
function longContextObservation(): BenchmarkObservation {
const longContextBackendReport = {
...backendReport,
layersGpu: { offloaded: 65, total: 65 },
flashAttention: true,
cacheTypeK: 'q4_0',
cacheTypeV: 'q4_0',
webgpuKvBufferBytes: 155_713_536,
} satisfies BackendReport;
const longContextLoadResult = {
...loadResult,
modelId: '27b',
gate: {
...loadResult.gate,
requestedBackend: 'webgpu',
selectedBackend: 'webgpu',
},
context: { ...loadResult.context, size: 8_448, layerCount: 65 },
tuning: {
scope: 'benchmark',
requested: {
nBatch: 32,
nUbatch: 16,
flashMode: 'auto',
cacheTypeK: 'q4_0',
cacheTypeV: 'q4_0',
wasmFlavor: 'auto',
},
observed: {
nBatch: 32,
nUbatch: 16,
flashAttention: true,
cacheTypeK: 'q4_0',
cacheTypeV: 'q4_0',
kvBufferBytes: 155_713_536,
wasmFlavor: 'jspi',
wasmSha256: JSPI_WASM_SHA256,
compatWorkerSha256: null,
},
applied: true,
},
backendReport: longContextBackendReport,
} satisfies LoadModelResult;
return observation({
model: {
...model,
id: '27b',
displayName: 'Bonsai 27B',
architecture: 'qwen35',
} as ManifestModelV2,
requestedBackend: 'webgpu',
contextSize: 8_448,
workloadId: 'context-prefill-8k-v1',
generationRequest: {
messages: BENCHMARK_WORKLOADS['context-prefill-8k-v1'].messages.map((message) => ({ ...message })),
maxTokens: 8,
temperature: 0,
topP: 1,
topK: 1,
seed: 42,
toolChoice: 'none',
cachePrompt: false,
returnTokenIds: true,
},
loadResult: longContextLoadResult,
backendReport: longContextBackendReport,
streamedTokenEvents: 8,
generationResult: {
text: 'fixture',
reasoningText: '',
tokenIds: [201, 202, 203, 204, 205, 206, 207, 208],
tokenTrace: sampledTokenTrace([201, 202, 203, 204, 205, 206, 207, 208]),
finishReason: 'length',
toolCalls: [],
usage: { promptTokens: 8_314, completionTokens: 8, totalTokens: 8_322 },
timings: { promptTokensPerSecond: 20, predictedTokensPerSecond: 30 },
},
});
}
describe('benchmark report', () => {
it('classifies the shard cache observed at the first load boundary', () => {
expect(classifyCacheState(null, 1_000)).toBe('unknown');
expect(classifyCacheState(0, 1_000)).toBe('empty');
expect(classifyCacheState(1, 1_000)).toBe('partial');
expect(classifyCacheState(1_000, 1_000)).toBe('cached');
});
it('builds a shareable report with pinned runtime evidence and fixed-safe policy', () => {
const report = buildBenchmarkReport(observation());
expect(report.schemaVersion).toBe(3);
expect(report.model).toMatchObject({
source: model.source,
shards: model.files,
});
expect(report.load).toMatchObject({
tuning: {
scope: 'release-defaults',
requested: {
nBatch: null,
nUbatch: null,
flashMode: 'off',
cacheTypeK: 'f16',
cacheTypeV: 'f16',
wasmFlavor: 'auto',
},
observed: {
nBatch: 2_048,
nUbatch: 512,
flashAttention: false,
cacheTypeK: 'f16',
cacheTypeV: 'f16',
kvBufferBytes: 56 * 1024 ** 2,
wasmFlavor: 'jspi',
wasmSha256: JSPI_WASM_SHA256,
compatWorkerSha256: null,
},
applied: true,
},
cold: { durationMs: 1_234.6, cacheState: 'partial' },
warm: { durationMs: 234.5 },
});
expect(report.generation).toMatchObject({
workload: {
id: 'field-core-v1',
messages: BENCHMARK_WORKLOADS['field-core-v1'].messages,
},
sampling: {
maxTokens: 64,
temperature: 0,
topP: 1,
topK: 1,
minP: null,
seed: 42,
toolChoice: 'none',
cachePrompt: false,
},
tokenTrace: {
returnTokenIds: true,
logprobs: true,
topLogprobs: 5,
topAlternatives: 4,
encoding: 'uint32-le',
tokenIds: [101, 102, 103, 104, 105, 106, 107, 108],
entries: sampledTokenTrace([101, 102, 103, 104, 105, 106, 107, 108]),
checkpointPrefixes: [],
},
rawText: 'fixture',
rawReasoningText: '',
promptTokensPerSecond: 123.46,
decodeTokensPerSecond: 45.68,
engineCompletionTokens: 8,
streamedTokenEvents: 5,
completionTokens: 8,
tokenCountSource: 'token-id-trace',
});
expect(report.execution).toMatchObject({
selectedBackend: 'webgpu',
device: 'Apple M4 Max',
graphSplits: 1,
opsOnCpu: 0,
});
expect(report.runtime.manifestRevision).toBe('112ea7a1a6229bde132b176b9a72477a7ecfde64');
expect(report.runtime).toMatchObject({
patchSetSha256: 'f'.repeat(64),
moduleSha256: 'e'.repeat(64),
wasmFlavor: 'jspi',
wasmSha256: JSPI_WASM_SHA256,
compatWorkerSha256: null,
});
expect(report.environment).toEqual({
browser: {
userAgent: 'Mozilla/5.0 Chrome/150.0.0.0 Safari/537.36',
platform: 'MacIntel',
language: 'en-GB',
},
webgpu: {
available: true,
name: 'Apple M4 Max',
vendor: 'Apple',
architecture: 'metal-3',
device: null,
description: 'Apple M4 Max',
limits: { maxStorageBufferBindingSize: 1_073_741_824 },
features: ['shader-f16'],
},
});
expect(report.releasePolicy).toEqual({
flashAttention: {
enabled: false,
operatorConfigurable: false,
status: 'fixed-off-unvalidated-for-release',
},
kvCache: {
key: 'f16',
value: 'f16',
operatorConfigurable: false,
status: 'fixed-release-default-alternatives-unvalidated',
},
});
});
it('records requested and observed experimental tuning without relabelling it as release policy', () => {
const experimentalLoadResult: LoadModelResult = {
...loadResult,
context: {
...loadResult.context,
batchSize: 512,
microBatchSize: 128,
},
tuning: {
scope: 'benchmark',
requested: {
nBatch: 512,
nUbatch: 128,
flashMode: 'auto',
cacheTypeK: 'q8_0',
cacheTypeV: 'q8_0',
wasmFlavor: 'compat',
},
observed: {
nBatch: 512,
nUbatch: 128,
flashAttention: true,
cacheTypeK: 'q8_0',
cacheTypeV: 'q8_0',
kvBufferBytes: 28 * 1024 ** 2,
wasmFlavor: 'compat',
wasmSha256: COMPAT_WASM_SHA256,
compatWorkerSha256: COMPAT_WORKER_SHA256,
},
applied: true,
},
};
const report = buildBenchmarkReport(observation({ loadResult: experimentalLoadResult }));
expect(report.load.tuning).toEqual({
scope: 'benchmark',
requested: {
nBatch: 512,
nUbatch: 128,
flashMode: 'auto',
cacheTypeK: 'q8_0',
cacheTypeV: 'q8_0',
wasmFlavor: 'compat',
},
observed: {
nBatch: 512,
nUbatch: 128,
flashAttention: true,
cacheTypeK: 'q8_0',
cacheTypeV: 'q8_0',
kvBufferBytes: 28 * 1024 ** 2,
wasmFlavor: 'compat',
wasmSha256: COMPAT_WASM_SHA256,
compatWorkerSha256: COMPAT_WORKER_SHA256,
},
applied: true,
});
expect(report.runtime).toMatchObject({
wasmFlavor: 'compat',
wasmSha256: COMPAT_WASM_SHA256,
compatWorkerSha256: COMPAT_WORKER_SHA256,
});
});
it('exports reasoning-only output separately from visible content', () => {
const input = observation();
input.generationResult.text = '';
input.generationResult.reasoningText = 'reasoning-only fixture';
const report = buildBenchmarkReport(input);
expect(report.generation.rawText).toBe('');
expect(report.generation.rawReasoningText).toBe('reasoning-only fixture');
});
it('uses the exact token-id trace when final engine usage is present but incomplete', () => {
const report = buildBenchmarkReport(observation({
streamedTokenEvents: 64,
generationResult: {
text: 'fixture',
reasoningText: '',
tokenIds: Array.from({ length: 64 }, (_, index) => index + 1),
tokenTrace: sampledTokenTrace(Array.from({ length: 64 }, (_, index) => index + 1)),
finishReason: 'length',
toolCalls: [],
usage: { promptTokens: 5, completionTokens: 0, totalTokens: 5 },
timings: { promptTokensPerSecond: 20, predictedTokensPerSecond: 30 },
},
}));
expect(report.generation).toMatchObject({
engineCompletionTokens: 0,
streamedTokenEvents: 64,
completionTokens: 64,
engineTotalTokens: 5,
totalTokens: 69,
tokenCountSource: 'token-id-trace',
});
expect(report.generation.tokenTrace.checkpointPrefixes).toEqual([
{ tokens: 64, sha256: '0c8f462927e331f28e3f1a6d342957cd27118febc309bd3b2f646e2dfbaeec32' },
]);
});
it('uses the trace without emitting non-finite JSON metrics', () => {
const report = buildBenchmarkReport(observation({
generationElapsedMs: Number.NaN,
timeToFirstTokenMs: Number.POSITIVE_INFINITY,
generationResult: {
text: 'fixture',
reasoningText: '',
tokenIds: [1, 2, 3, 4, 5],
tokenTrace: sampledTokenTrace([1, 2, 3, 4, 5]),
finishReason: 'length',
toolCalls: [],
usage: null,
timings: null,
},
}));
expect(report.generation).toMatchObject({
elapsedMs: null,
timeToFirstTokenMs: null,
decodeTokensPerSecond: null,
completionTokens: 5,
tokenCountSource: 'token-id-trace',
});
expect(serializeBenchmarkReport(report)).not.toContain('NaN');
expect(serializeBenchmarkReport(report)).toMatch(/\n$/);
});
it('records all locked state-drift checkpoints from the exact token-id prefixes', () => {
const tokenIds = Array.from({ length: 1_024 }, (_, index) => index + 1);
const report = buildBenchmarkReport(observation({
workloadId: 'state-drift-1k-v1',
generationRequest: {
messages: BENCHMARK_WORKLOADS['state-drift-1k-v1'].messages.map((message) => ({ ...message })),
maxTokens: 1_024,
temperature: 0,
topP: 1,
topK: 1,
seed: 42,
toolChoice: 'none',
cachePrompt: false,
returnTokenIds: true,
},
streamedTokenEvents: 1_024,
generationResult: {
text: '1, 2, 3, …',
reasoningText: '',
tokenIds,
tokenTrace: sampledTokenTrace(tokenIds),
finishReason: 'length',
toolCalls: [],
usage: { promptTokens: 20, completionTokens: 1_024, totalTokens: 1_044 },
timings: { promptTokensPerSecond: 20, predictedTokensPerSecond: 30 },
},
teacherForcedReferenceScore: teacherForcedReferenceScore(tokenIds),
}));
expect(report.generation.workload).toEqual({
id: 'state-drift-1k-v1',
messages: BENCHMARK_WORKLOADS['state-drift-1k-v1'].messages,
});
expect(report.generation.rawText).toBe('1, 2, 3, …');
expect(report.generation.rawReasoningText).toBe('');
expect(report.generation.tokenTrace.tokenIds).toEqual(tokenIds);
expect(report.generation.tokenTrace.entries).toHaveLength(1_024);
expect(report.generation.teacherForcedReferenceScore).toMatchObject({
fixture: { kind: 'bonsai-state-drift-reference' },
score: { summary: { tokenCount: 1_024, meanNll: 0.1 } },
});
expect(report.generation.tokenTrace.checkpointPrefixes).toEqual([
{ tokens: 64, sha256: '0c8f462927e331f28e3f1a6d342957cd27118febc309bd3b2f646e2dfbaeec32' },
{ tokens: 128, sha256: '24f9ac547baae524ba0ea5220692d48f7526cdb1df5e99edcbb1f32239a8d5f5' },
{ tokens: 256, sha256: '80fa0f6d1caca9aad2b012051399b33bcd1976b145f3f3eea0f7ba10637761b0' },
{ tokens: 512, sha256: '8ab9b2cf36ec9e9d68711df73334731d2fee0552f5d95d76538b1d2cdcefd564' },
{ tokens: 768, sha256: '23905fc64dc47867f49672959cddf676ca257967f5786eefaf8583ddf7ddf3e9' },
{ tokens: 1_024, sha256: '6b8b6bd30ff821daf5db90cc071525f5696e366efd1aeb30d0bf60f785a3c26d' },
]);
});
it('exports null teacher-forced scoring for non-state-drift workloads', () => {
expect(buildBenchmarkReport(observation()).generation.teacherForcedReferenceScore).toBeNull();
});
it('rejects incomplete state-drift traces instead of exporting partial evidence', () => {
expect(() => buildBenchmarkReport(observation({
workloadId: 'state-drift-1k-v1',
generationRequest: {
messages: BENCHMARK_WORKLOADS['state-drift-1k-v1'].messages.map((message) => ({ ...message })),
maxTokens: 1_024,
temperature: 0,
topP: 1,
topK: 1,
seed: 42,
toolChoice: 'none',
cachePrompt: false,
returnTokenIds: true,
},
generationResult: {
text: 'partial fixture',
reasoningText: '',
tokenIds: Array.from({ length: 1_023 }, (_, index) => index + 1),
tokenTrace: sampledTokenTrace(Array.from({ length: 1_023 }, (_, index) => index + 1)),
finishReason: 'length',
toolCalls: [],
usage: { promptTokens: 20, completionTokens: 1_023, totalTokens: 1_043 },
timings: null,
},
}))).toThrow('requires exactly 1,024 sampled token ids');
});
it('rejects state-drift traces that stop before exhausting the locked budget', () => {
const input = observation({
workloadId: 'state-drift-1k-v1',
generationRequest: {
messages: BENCHMARK_WORKLOADS['state-drift-1k-v1'].messages.map((message) => ({ ...message })),
maxTokens: 1_024,
temperature: 0,
topP: 1,
topK: 1,
seed: 42,
toolChoice: 'none',
cachePrompt: false,
returnTokenIds: true,
},
generationResult: {
text: 'early stop',
reasoningText: '',
tokenIds: Array.from({ length: 1_024 }, (_, index) => index + 1),
tokenTrace: sampledTokenTrace(Array.from({ length: 1_024 }, (_, index) => index + 1)),
finishReason: 'stop',
toolCalls: [],
usage: { promptTokens: 20, completionTokens: 1_024, totalTokens: 1_044 },
timings: null,
},
});
expect(() => buildBenchmarkReport(input)).toThrow('requires finishReason=length');
});
it('exports long-context evidence only after processing more than 8K prompt tokens', () => {
const report = buildBenchmarkReport(longContextObservation());
expect(BENCHMARK_WORKLOADS['context-prefill-8k-v1'].messages).toEqual([{
role: 'user',
content: `Continue the pattern.${' x'.repeat(8_300)}`,
}]);
expect(report).toMatchObject({
model: { id: '27b', contextSize: 8_448 },
generation: {
workload: { id: 'context-prefill-8k-v1' },
sampling: { maxTokens: 8 },
promptTokens: 8_314,
completionTokens: 8,
},
load: {
tuning: {
scope: 'benchmark',
requested: { flashMode: 'auto', cacheTypeK: 'q4_0', cacheTypeV: 'q4_0' },
observed: { flashAttention: true, cacheTypeK: 'q4_0', cacheTypeV: 'q4_0' },
applied: true,
},
},
execution: { requestedBackend: 'webgpu', selectedBackend: 'webgpu' },
});
expect(report.generation.tokenTrace.tokenIds).toHaveLength(8);
});
it('rejects long-context evidence at or below 8,192 engine-counted prompt tokens', () => {
const input = longContextObservation();
input.generationResult.usage = { promptTokens: 8_192, completionTokens: 8, totalTokens: 8_200 };
expect(() => buildBenchmarkReport(input)).toThrow(
'requires more than 8,192 engine-counted prompt tokens',
);
});
it('rejects a long-context trace that stops before exhausting the 8-token budget', () => {
const input = longContextObservation();
input.generationResult.finishReason = 'stop';
expect(() => buildBenchmarkReport(input)).toThrow('requires finishReason=length');
});
it('rejects long-context evidence with the wrong context or runtime tuning', () => {
const wrongContext = longContextObservation();
wrongContext.contextSize = 8_447;
wrongContext.loadResult = {
...wrongContext.loadResult,
context: { ...wrongContext.loadResult.context, size: 8_447 },
};
expect(() => buildBenchmarkReport(wrongContext)).toThrow(
'requires Bonsai 27B at context 8,448',
);
const wrongTuning = longContextObservation();
wrongTuning.loadResult = {
...wrongTuning.loadResult,
tuning: {
...wrongTuning.loadResult.tuning,
requested: {
...wrongTuning.loadResult.tuning.requested,
cacheTypeK: 'q8_0',
cacheTypeV: 'q8_0',
},
observed: {
...wrongTuning.loadResult.tuning.observed,
cacheTypeK: 'q8_0',
cacheTypeV: 'q8_0',
},
},
};
expect(() => buildBenchmarkReport(wrongTuning)).toThrow(
'requires Bonsai 27B at context 8,448',
);
});
it('rejects missing and malformed token-id traces', () => {
const missingTrace = observation();
missingTrace.generationResult.tokenIds = null;
expect(() => buildBenchmarkReport(missingTrace)).toThrow('without a token-id trace');
const malformedTrace = observation();
malformedTrace.generationResult.tokenIds = [1, 2.5];
expect(() => buildBenchmarkReport(malformedTrace)).toThrow('token id 1 is invalid');
});
it('rejects missing, mismatched, and unsorted sampled-token logprob traces', () => {
const missingTrace = observation();
missingTrace.generationResult.tokenTrace = null;
expect(() => buildBenchmarkReport(missingTrace)).toThrow('without a sampled-token logprob trace');
const mismatchedTrace = observation();
mismatchedTrace.generationResult.tokenTrace?.pop();
expect(() => buildBenchmarkReport(mismatchedTrace)).toThrow(
'sampled-token trace length 7 does not match token-id length 8',
);
const unsortedTrace = observation();
const candidates = unsortedTrace.generationResult.tokenTrace?.[0]?.topCandidates;
if (!candidates) throw new Error('Unsorted trace fixture requires top candidates.');
[candidates[0], candidates[1]] = [candidates[1]!, candidates[0]!];
expect(() => buildBenchmarkReport(unsortedTrace)).toThrow('candidates are not sorted');
});
it('uses the model, selected backend, and UTC completion time in the export name', () => {
const report = buildBenchmarkReport(observation());
expect(benchmarkReportFilename(report)).toBe(
'bonsai-bench-8b-webgpu-2026-07-15T10-00-10-123Z.json',
);
});
});