426e9eeabd
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
ci / test (push) Has been cancelled
ci / lint-and-format (push) Has been cancelled
ci / build (push) Has been cancelled
ci / dev-startup (push) Has been cancelled
gitleaks / gitleaks (push) Has been cancelled
Markdown Links / Relative Markdown Links (push) Has been cancelled
Quality (Extended) / Homepage Build (PR smoke) (push) Has been cancelled
Quality (Extended) / Comment-only diff guard (push) Has been cancelled
Quality (Extended) / Format + Type Safety Ratchet (push) Has been cancelled
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Has been cancelled
Quality (Extended) / Develop Gate (lint) (push) Has been cancelled
Chat shell gestures / Chat shell gesture + parity e2e (push) Has been cancelled
Cloud Gateway Discord / Test (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Has been cancelled
Build Agent Image / build-and-push (push) Has been cancelled
Dev Smoke / bun run dev onboarding chat (push) Has been cancelled
Dev Smoke / Vite HMR dependency-level smoke (push) Has been cancelled
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Has been cancelled
Publish @elizaos/example-code / check_npm (push) Has been cancelled
Publish @elizaos/example-code / publish_npm (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / verify_version (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / publish_npm (push) Has been cancelled
Sandbox Live Smoke / Sandbox live smoke (push) Has been cancelled
Snap Build & Test / Build Snap (amd64) (push) Has been cancelled
Snap Build & Test / Build Snap (arm64) (push) Has been cancelled
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Has been cancelled
Cloud Gateway Webhook / Test (push) Has been cancelled
Cloud Tests / lint-and-types (push) Has been cancelled
Cloud Tests / unit-tests (push) Has been cancelled
Cloud Tests / integration-tests (push) Has been cancelled
Cloud Tests / e2e-tests (push) Has been cancelled
CodeQL Advanced / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Apps Worker (Product 2) / Determine environment (push) Has been cancelled
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Has been cancelled
Deploy Eliza Provisioning Worker / Determine environment (push) Has been cancelled
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Has been cancelled
Dev Smoke / Classify changed paths (push) Has been cancelled
supply-chain / sbom (push) Has been cancelled
supply-chain / vulnerability-scan (push) Has been cancelled
Build, Push & Deploy to Phala Cloud / build-and-push (push) Has been cancelled
Test Packaging / Validate Packaging Configs (push) Has been cancelled
Test Packaging / Build & Test PyPI Package (push) Has been cancelled
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Has been cancelled
Test Packaging / Pack & Test JS Tarballs (push) Has been cancelled
UI Fixture E2E / ui-fixture-e2e (push) Has been cancelled
UI Fixture E2E / fixture-e2e (push) Has been cancelled
UI Story Gate / story-gate (push) Has been cancelled
vault-ci / test (macos-latest) (push) Has been cancelled
vault-ci / test (ubuntu-latest) (push) Has been cancelled
vault-ci / test (windows-latest) (push) Has been cancelled
vault-ci / app-core wiring tests (push) Has been cancelled
verify-patches / verify patches/CHECKSUMS.sha256 (push) Has been cancelled
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Has been cancelled
Voice Benchmark Smoke / voice bench smoke summary (push) Has been cancelled
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) Has been cancelled
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) Has been cancelled
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) Has been cancelled
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) Has been cancelled
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) Has been cancelled
146 lines
4.4 KiB
JavaScript
146 lines
4.4 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
/**
|
|
* End-to-end probe runner for the Model Tester routes: against a live agent server
|
|
* it asserts the static shell renders (and carries no Vite/HMR code), the status
|
|
* endpoint lists every probe, and each probe runs — treating a known-unavailable
|
|
* backend as a skip while requiring text-small, text-large, embedding, and vad to
|
|
* pass. Configured via MODEL_TESTER_BASE_URL / MODEL_TESTER_REQUIRE_ALL.
|
|
*/
|
|
|
|
const baseUrl = process.env.MODEL_TESTER_BASE_URL ?? "http://127.0.0.1:31337";
|
|
const requireAll = process.env.MODEL_TESTER_REQUIRE_ALL === "1";
|
|
|
|
const requiredPass = new Set(["text-small", "text-large", "embedding", "vad"]);
|
|
const tests = [
|
|
"text-small",
|
|
"text-large",
|
|
"embedding",
|
|
"text-to-speech",
|
|
"transcription",
|
|
"vad",
|
|
"image-description",
|
|
"image",
|
|
];
|
|
|
|
const knownUnavailable = [
|
|
"no TTS backend available",
|
|
"Cannot transcribe audio: no voice session active",
|
|
"No handler found for delegate type: TRANSCRIPTION",
|
|
"vision describe requires an mmproj-loaded server",
|
|
"imagegen-sd-1_5-q5_0 is not installed",
|
|
"OpenAI TTS failed: 404",
|
|
"OpenAI transcription failed: 404",
|
|
"OpenAI image generation failed: 404",
|
|
"OpenAI image description failed: 404",
|
|
"credit balance is too low",
|
|
];
|
|
|
|
function fail(message) {
|
|
console.error(message);
|
|
process.exitCode = 1;
|
|
}
|
|
|
|
function skip(message) {
|
|
console.log(`[model-tester-e2e] SKIP ${message}`);
|
|
}
|
|
|
|
async function fetchJson(path, init) {
|
|
const response = await fetch(new URL(path, baseUrl), init);
|
|
const text = await response.text();
|
|
if (!response.ok) {
|
|
throw new Error(
|
|
`${path} returned ${response.status}: ${text.slice(0, 500)}`,
|
|
);
|
|
}
|
|
return JSON.parse(text);
|
|
}
|
|
|
|
async function main() {
|
|
let htmlResponse;
|
|
try {
|
|
htmlResponse = await fetch(new URL("/model-tester", baseUrl), {
|
|
signal: AbortSignal.timeout(5_000),
|
|
});
|
|
} catch (error) {
|
|
if (!requireAll) {
|
|
skip(
|
|
`model tester server is unavailable at ${baseUrl}: ${
|
|
error instanceof Error ? error.message : String(error)
|
|
}`,
|
|
);
|
|
return;
|
|
}
|
|
throw error;
|
|
}
|
|
const html = await htmlResponse.text();
|
|
if (!htmlResponse.ok) {
|
|
if (!requireAll && htmlResponse.status === 404) {
|
|
skip(`model tester route is not mounted at ${baseUrl}`);
|
|
return;
|
|
}
|
|
throw new Error(`/model-tester returned ${htmlResponse.status}`);
|
|
}
|
|
if (!html.includes("Model Tester")) {
|
|
fail("/model-tester did not render the static tester shell");
|
|
}
|
|
if (html.includes("@vite/client") || html.includes("react-refresh")) {
|
|
fail("/model-tester includes Vite/HMR code; this can reintroduce flicker");
|
|
}
|
|
|
|
const status = await fetchJson("/api/model-tester/status");
|
|
const ids = new Set((status.tests ?? []).map((test) => test.id));
|
|
for (const test of tests) {
|
|
if (!ids.has(test)) fail(`status endpoint is missing ${test}`);
|
|
}
|
|
|
|
const results = [];
|
|
for (const test of tests) {
|
|
const controller = new AbortController();
|
|
const timeout = setTimeout(() => controller.abort(), 240_000);
|
|
try {
|
|
const result = await fetchJson("/api/model-tester/run", {
|
|
method: "POST",
|
|
headers: { "content-type": "text/plain;charset=utf-8" },
|
|
body: JSON.stringify({
|
|
test,
|
|
prompt:
|
|
"Say exactly one short sentence proving the Eliza model tester works.",
|
|
}),
|
|
signal: controller.signal,
|
|
});
|
|
results.push(result);
|
|
} finally {
|
|
clearTimeout(timeout);
|
|
}
|
|
}
|
|
|
|
for (const result of results) {
|
|
const label = `${result.test}: ${result.ok ? "PASS" : "FAIL"}`;
|
|
console.log(label);
|
|
if (result.ok) continue;
|
|
|
|
const error = String(result.error ?? "");
|
|
const unavailable = knownUnavailable.some((needle) =>
|
|
error.includes(needle),
|
|
);
|
|
if (requireAll || requiredPass.has(result.test) || !unavailable) {
|
|
fail(`${result.test} failed unexpectedly:\n${error}`);
|
|
} else {
|
|
console.log(` unavailable backend: ${error.split("\n")[0]}`);
|
|
}
|
|
}
|
|
|
|
for (const result of results) {
|
|
if (result.test !== "text-small" && result.test !== "text-large") continue;
|
|
const text = result.output?.text;
|
|
if (result.ok && (typeof text !== "string" || text.trim().length === 0)) {
|
|
fail(`${result.test} returned ok=true with empty text output`);
|
|
}
|
|
}
|
|
}
|
|
|
|
main().catch((error) => {
|
|
fail(error instanceof Error ? error.stack || error.message : String(error));
|
|
});
|