mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-09-18 21:02:50 +03:00
* fix(build): colocateLlmlinguaOptionals skip-check treated a Next-traced stub as fully copied Debugging the omniroute-beta Docker rebuild: `npm run build` (and the Dockerfile's own post-build verification) failed with `Cannot find module '.../node_modules/@atjsh/llmlingua-2/dist/index.js'`. Root cause, reproduced directly (both against a live Docker builder image and in a unit test): Next.js's own standalone trace creates a stub directory for `@atjsh/llmlingua-2` containing only `package.json` — it references the package (a dynamically-imported optional dependency) but can't fully bundle it. colocateLlmlinguaOptionals's skip checks (both the closure-level early return and the per-package loop) only tested `existsSync(dest)`, so that stub was indistinguishable from "already fully co-located" — the function skipped copying the real `dist/` output entirely, silently shipping a package with a manifest but no code. Fix: check for the package's declared `main` entry file when it has one (the real-world case for every actual SLM optional). Packages with no `main` field fall back to comparing the destination's top-level entries against the source's — correct both for genuinely multi-file packages and for a metadata-only source (package.json is then its complete, faithfully- copied contents), which the existing idempotency test exercises. Covered by tests/unit/colocate-optionals.test.ts's new stub-reproduction case (fails against the pre-fix code, passes after — confirmed directly) plus the 6 pre-existing cases, all still green. (cherry picked from commit 359aba59c7b362a5efaa4f0cd4d482d48ee2df66) * fix(build): register onnxruntime-node's native bin/ as a standalone asset (#9687) Docker/standalone builds of the LLMLingua SLM compression tier failed at runtime with "Error: libonnxruntime.so.1: cannot open shared object file: No such file or directory" (open-sse/services/compression/engines/llmlingua's worker, via @huggingface/transformers -> onnxruntime-node). onnxruntime-node's dist/binding.js is a normal JS file Next.js's standalone trace bundles correctly, but binding.js dlopen()s a platform-specific native library shipped under bin/napi-v3/<platform>/<arch>/libonnxruntime.so.1 — a dynamic native load static file tracing can't see (same blind-spot class as the separate colocateLlmlinguaOptionals stub bug, just for a .so instead of a JS import, via NATIVE_ASSET_ENTRIES instead). That directory was simply never registered, unlike better-sqlite3's native binary, which already goes through the exact same mechanism correctly. Fix: add an entry for onnxruntime-node/bin, mirroring the existing better-sqlite3 entry. Confirmed against a real Docker build of the Dockerfile's own post-build verification step: this was the very next failure once the separate llmlingua-2 stub bug was fixed and the build progressed far enough to reach it. Covered by tests/unit/assemble-standalone-onnxruntime-native-asset.test.ts (fails against the pre-fix code on both assertions, passes after). (cherry picked from commit 8c98a59f26a27e844678e673b31c1c21aaf72b0e) --------- Co-authored-by: Markus Hartung <mail@hartmark.se>
66 lines
2.8 KiB
TypeScript
66 lines
2.8 KiB
TypeScript
/**
|
|
* Regression test — onnxruntime-node's native libonnxruntime.so.1 was never
|
|
* registered in NATIVE_ASSET_ENTRIES, so the standalone bundle shipped
|
|
* dist/binding.js (traced by Next.js as a normal JS require) without its
|
|
* sibling native bin/ directory (loaded via a dynamic dlopen() Next's static
|
|
* file trace can't see — the same blind-spot class as the LLMLingua closure,
|
|
* for a .so instead of a JS import). The bundle then failed at runtime with
|
|
* "Error: libonnxruntime.so.1: cannot open shared object file: No such file
|
|
* or directory" the first time transformers/llmlingua tried to run ONNX
|
|
* inference — reproduced live via the Dockerfile's post-build verification
|
|
* step once the separate llmlingua-2 stub bug (#9653-adjacent fix) was
|
|
* resolved and the build progressed far enough to reach this package.
|
|
*/
|
|
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { mkdtempSync, mkdirSync, writeFileSync, existsSync, rmSync } from "node:fs";
|
|
import { join } from "node:path";
|
|
import { tmpdir } from "node:os";
|
|
|
|
import {
|
|
NATIVE_ASSET_ENTRIES,
|
|
syncStandaloneNativeAssets,
|
|
} from "../../scripts/build/assembleStandalone.mjs";
|
|
|
|
test("NATIVE_ASSET_ENTRIES registers onnxruntime-node's native bin/ directory", () => {
|
|
const entry = NATIVE_ASSET_ENTRIES.find(
|
|
(e) => e.src.join("/") === "node_modules/onnxruntime-node/bin"
|
|
);
|
|
assert.ok(entry, "onnxruntime-node/bin must be a registered native asset entry");
|
|
assert.deepEqual(entry.dest, ["node_modules", "onnxruntime-node", "bin"]);
|
|
});
|
|
|
|
test("syncStandaloneNativeAssets copies onnxruntime-node's libonnxruntime.so.1 into the standalone bundle", async () => {
|
|
const root = mkdtempSync(join(tmpdir(), "omniroute-assemble-onnx-"));
|
|
try {
|
|
// Mirror the real package's shape: dist/binding.js (traced fine by Next)
|
|
// plus the platform-specific native .so under bin/napi-v3/<platform>/<arch>/.
|
|
const pkgDir = join(root, "node_modules", "onnxruntime-node");
|
|
mkdirSync(join(pkgDir, "dist"), { recursive: true });
|
|
writeFileSync(join(pkgDir, "dist", "binding.js"), "// native binding loader\n");
|
|
const soDir = join(pkgDir, "bin", "napi-v3", "linux", "x64");
|
|
mkdirSync(soDir, { recursive: true });
|
|
writeFileSync(join(soDir, "libonnxruntime.so.1"), "fake-shared-library-bytes");
|
|
|
|
const outDir = join(root, ".build", "next", "standalone");
|
|
mkdirSync(outDir, { recursive: true });
|
|
|
|
const changed = await syncStandaloneNativeAssets(root, undefined, { log: () => {} }, outDir);
|
|
assert.equal(changed, true);
|
|
|
|
const destSo = join(
|
|
outDir,
|
|
"node_modules",
|
|
"onnxruntime-node",
|
|
"bin",
|
|
"napi-v3",
|
|
"linux",
|
|
"x64",
|
|
"libonnxruntime.so.1"
|
|
);
|
|
assert.ok(existsSync(destSo), "libonnxruntime.so.1 must be copied into the standalone bundle");
|
|
} finally {
|
|
rmSync(root, { recursive: true, force: true });
|
|
}
|
|
});
|