426e9eeabd
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Waiting to run
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Waiting to run
Build Agent Image / build-and-push (push) Waiting to run
Chat shell gestures / Chat shell gesture + parity e2e (push) Waiting to run
ci / test (push) Waiting to run
ci / lint-and-format (push) Waiting to run
ci / build (push) Waiting to run
ci / dev-startup (push) Waiting to run
Cloud Gateway Discord / Test (push) Waiting to run
Cloud Gateway Webhook / Test (push) Waiting to run
Cloud Tests / lint-and-types (push) Waiting to run
Cloud Tests / unit-tests (push) Waiting to run
Cloud Tests / integration-tests (push) Waiting to run
Cloud Tests / e2e-tests (push) Blocked by required conditions
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
Deploy Apps Worker (Product 2) / Determine environment (push) Waiting to run
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Blocked by required conditions
Deploy Eliza Provisioning Worker / Determine environment (push) Waiting to run
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Blocked by required conditions
Dev Smoke / Classify changed paths (push) Waiting to run
Dev Smoke / bun run dev onboarding chat (push) Blocked by required conditions
Dev Smoke / Vite HMR dependency-level smoke (push) Blocked by required conditions
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Waiting to run
gitleaks / gitleaks (push) Waiting to run
Markdown Links / Relative Markdown Links (push) Waiting to run
Publish @elizaos/example-code / check_npm (push) Waiting to run
Publish @elizaos/example-code / publish_npm (push) Blocked by required conditions
Publish @elizaos/plugin-elizacloud / verify_version (push) Waiting to run
Publish @elizaos/plugin-elizacloud / publish_npm (push) Blocked by required conditions
Quality (Extended) / Homepage Build (PR smoke) (push) Waiting to run
Quality (Extended) / Comment-only diff guard (push) Waiting to run
Quality (Extended) / Format + Type Safety Ratchet (push) Waiting to run
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Waiting to run
Quality (Extended) / Develop Gate (lint) (push) Waiting to run
Sandbox Live Smoke / Sandbox live smoke (push) Waiting to run
Snap Build & Test / Build Snap (amd64) (push) Waiting to run
Snap Build & Test / Build Snap (arm64) (push) Waiting to run
supply-chain / sbom (push) Waiting to run
supply-chain / vulnerability-scan (push) Waiting to run
Build, Push & Deploy to Phala Cloud / build-and-push (push) Waiting to run
Test Packaging / Validate Packaging Configs (push) Waiting to run
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Waiting to run
Test Packaging / Pack & Test JS Tarballs (push) Waiting to run
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Waiting to run
UI Fixture E2E / ui-fixture-e2e (push) Waiting to run
UI Fixture E2E / fixture-e2e (push) Waiting to run
UI Story Gate / story-gate (push) Waiting to run
vault-ci / test (macos-latest) (push) Waiting to run
vault-ci / test (ubuntu-latest) (push) Waiting to run
vault-ci / test (windows-latest) (push) Waiting to run
vault-ci / app-core wiring tests (push) Waiting to run
verify-patches / verify patches/CHECKSUMS.sha256 (push) Waiting to run
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Waiting to run
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Waiting to run
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Waiting to run
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Waiting to run
Voice Benchmark Smoke / voice bench smoke summary (push) Blocked by required conditions
Windows CI / windows ([bun run --cwd packages/app-core test bun run --cwd packages/elizaos test bun run --cwd packages/cloud/shared test], app-and-cli) (push) Waiting to run
Windows CI / windows ([bun run --cwd packages/scenario-runner test bun run --cwd packages/vault test bun run --cwd packages/security test bun run --cwd plugins/plugin-coding-tools test], framework-packages) (push) Waiting to run
Windows CI / windows ([bun run --cwd plugins/plugin-elizacloud test bun run --cwd plugins/plugin-discord test bun run --cwd plugins/plugin-anthropic test bun run --cwd plugins/plugin-openai test bun run --cwd plugins/plugin-app-control test bun run --cwd plugins/pl… (push) Waiting to run
Windows CI / windows ([node packages/scripts/run-turbo.mjs run build --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/agent --concurrency=4 node packages/scripts/run-bash-linux-only.mjs scripts/verify-riscv64-buildpaths.sh node packages/scripts/run… (push) Waiting to run
Windows CI / windows ([node packages/scripts/run-turbo.mjs run typecheck --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/cloud-shared --concurrency=4 bun run --cwd packages/core test bun run --cwd packages/shared test], core-runtime, 75) (push) Waiting to run
Test Packaging / Build & Test PyPI Package (push) Waiting to run
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
145 lines
5.6 KiB
JavaScript
145 lines
5.6 KiB
JavaScript
/**
|
||
* Shared memory-benchmark metric schema.
|
||
*
|
||
* This is the single source of truth for the per-(tier × modality) record the
|
||
* desktop/server harness emits (issue #8809) AND the schema the mobile Resource
|
||
* Workbench (#8800) consumes. Both surfaces read the same field names so a
|
||
* desktop report and an on-device report line up column-for-column. Do NOT
|
||
* rename a field here without updating both consumers — the whole point of a
|
||
* shared schema is that the two reports are diffable.
|
||
*
|
||
* The field set mirrors the per-model metric list specced in
|
||
* `plugins/plugin-local-inference/docs/memory-and-e2e-latency-review.md` §5
|
||
* ("load ms, first-token/first-audio/first-result ms, throughput (tok/s or
|
||
* RTF), peak RSS delta, ... eviction count") and the on-device iOS grind
|
||
* (`plugin-capacitor-bridge/src/ios/model-grind.ts`), so the desktop harness,
|
||
* the iOS grind, and the #8800 workbench all speak the same metric language.
|
||
*
|
||
* Pure ESM, built-ins only — importable from `.mjs` harness scripts and from
|
||
* `.ts` via the same path.
|
||
*/
|
||
|
||
/** Schema version. Bump on any breaking field change so consumers can detect drift. */
|
||
export const METRIC_SCHEMA_VERSION = "1.0.0";
|
||
|
||
/**
|
||
* The modalities a single Eliza-1 bundle can serve. One row per (tier ×
|
||
* modality) in the report. Order is the co-residency load order used by the
|
||
* scripted sequence (text first — it is the pinned target — then the
|
||
* auxiliaries).
|
||
*/
|
||
export const MODALITIES = /** @type {const} */ ([
|
||
"text",
|
||
"embedding",
|
||
"transcription",
|
||
"tts",
|
||
"vad",
|
||
"vision",
|
||
]);
|
||
|
||
/**
|
||
* The throughput unit per modality. Token-generating modalities report
|
||
* tokens/sec; streaming-audio modalities report a real-time factor (RTF =
|
||
* processing_time / audio_duration; < 1 is faster than real time). Modalities
|
||
* with neither leave `throughput` null.
|
||
*/
|
||
export const THROUGHPUT_UNIT = /** @type {const} */ ({
|
||
text: "tok/s",
|
||
embedding: "tok/s",
|
||
transcription: "rtf",
|
||
tts: "rtf",
|
||
vad: "rtf",
|
||
vision: "tok/s",
|
||
});
|
||
|
||
/**
|
||
* The canonical metric record. Every harness (desktop #8809, mobile #8800,
|
||
* iOS grind) emits rows of this exact shape.
|
||
*
|
||
* @typedef {Object} ModalityMetric
|
||
* @property {string} tier Eliza-1 tier id (e.g. "eliza-1-2b").
|
||
* @property {string} modality One of MODALITIES.
|
||
* @property {boolean} measured true when a real load+run produced the numbers; false when skipped.
|
||
* @property {string=} skipReason Present iff measured === false — why this row was not measured.
|
||
* @property {number|null} loadMs Wall-clock ms to bring the model online (load only).
|
||
* @property {number|null} firstResultMs Ms from request to first token/audio/result (TTAP component).
|
||
* @property {number|null} throughput tok/s or RTF per THROUGHPUT_UNIT[modality]; null when N/A.
|
||
* @property {string|null} throughputUnit "tok/s" | "rtf" | null.
|
||
* @property {number|null} rssBeforeMb Resident RSS (MB) sampled immediately before the load.
|
||
* @property {number|null} rssAfterMb Resident RSS (MB) sampled immediately after the load+run.
|
||
* @property {number|null} rssDeltaMb rssAfterMb - rssBeforeMb (the resident footprint this model added).
|
||
* @property {number|null} peakRssMb Peak RSS (MB) observed across the load+run window.
|
||
* @property {number|null} estimatedMb The model's declared estimatedMb (what the arbiter budgets against), when known.
|
||
*/
|
||
|
||
/**
|
||
* The co-residency record. One per harness run. Captures the eviction telemetry
|
||
* emitted by the MemoryArbiter while the scripted sequence
|
||
* (load text → load vision → load voice → force pressure) executes.
|
||
*
|
||
* @typedef {Object} CoResidencyMetric
|
||
* @property {boolean} measured true when real backends drove the sequence; false when it ran as the wiring self-check.
|
||
* @property {string} mode "real" | "self-check".
|
||
* @property {string[]} sequence Ordered list of capability::modelKey loads attempted.
|
||
* @property {number} loadCount arbiter "model_load" events observed.
|
||
* @property {number} evictionCount arbiter "eviction" events observed (fit + pressure + swap).
|
||
* @property {number} pressureEvents arbiter "memory_pressure" events observed.
|
||
* @property {number} budgetMb the usable-RAM budget the arbiter fit-path was driven against.
|
||
* @property {Array<{capability:string,modelKey:string,reason:string,estimatedMb:number}>} evictions
|
||
*/
|
||
|
||
/** The top-level report envelope. */
|
||
export const METRIC_SCHEMA = Object.freeze({
|
||
version: METRIC_SCHEMA_VERSION,
|
||
/** Field names a consumer (#8800) can rely on per modality row. */
|
||
modalityFields: Object.freeze([
|
||
"tier",
|
||
"modality",
|
||
"measured",
|
||
"skipReason",
|
||
"loadMs",
|
||
"firstResultMs",
|
||
"throughput",
|
||
"throughputUnit",
|
||
"rssBeforeMb",
|
||
"rssAfterMb",
|
||
"rssDeltaMb",
|
||
"peakRssMb",
|
||
"estimatedMb",
|
||
]),
|
||
/** Field names a consumer can rely on for the co-residency block. */
|
||
coResidencyFields: Object.freeze([
|
||
"measured",
|
||
"mode",
|
||
"sequence",
|
||
"loadCount",
|
||
"evictionCount",
|
||
"pressureEvents",
|
||
"budgetMb",
|
||
"evictions",
|
||
]),
|
||
modalities: MODALITIES,
|
||
throughputUnit: THROUGHPUT_UNIT,
|
||
/** Consumers: this issue (#8809 desktop/server) and #8800 (mobile workbench). */
|
||
sharedWith: Object.freeze(["#8809", "#8800"]),
|
||
});
|
||
|
||
/** Build an empty (skipped) modality row with the canonical fields populated. */
|
||
export function skippedModalityRow(tier, modality, skipReason) {
|
||
return {
|
||
tier,
|
||
modality,
|
||
measured: false,
|
||
skipReason,
|
||
loadMs: null,
|
||
firstResultMs: null,
|
||
throughput: null,
|
||
throughputUnit: THROUGHPUT_UNIT[modality] ?? null,
|
||
rssBeforeMb: null,
|
||
rssAfterMb: null,
|
||
rssDeltaMb: null,
|
||
peakRssMb: null,
|
||
estimatedMb: null,
|
||
};
|
||
}
|