{ lib, buildNpmPackage, fetchFromGitHub, fetchurl, nodejs_22, makeBinaryWrapper, }: let version = "3.8.49"; npmTarball = fetchurl { url = "https://registry.npmjs.org/omniroute/-/omniroute-${version}.tgz"; hash = "sha256-fcGsAxOdv1ZSwt24eHJu97lyRATKBw8rYeFvGTRhxYs="; }; in buildNpmPackage (finalAttrs: { pname = "omniroute"; inherit version; src = fetchFromGitHub { owner = "diegosouzapw"; repo = "OmniRoute"; rev = "v${finalAttrs.version}"; hash = "sha256-nRLziV4NWPoa0ev57DV7jmAvLpL/1MP1EMZO2/drrTU="; }; nodejs = nodejs_22; npmDepsHash = "sha256-R0u93MLUUWC8xFgq4S0Aj/7wg4pygTKwxP/eWkWMgCw="; # Skip Next.js build (requires network for Google Fonts). # Pre-built dist/ is copied from the npm tarball in preConfigure. dontNpmBuild = true; nativeBuildInputs = [ makeBinaryWrapper ]; npmInstallFlags = [ "--ignore-scripts" ]; npmRebuildFlags = [ "--ignore-scripts" ]; env = { HOME = "$TMPDIR"; }; preConfigure = '' mkdir -p _npm_tmp tar xzf ${npmTarball} -C _npm_tmp cp -r _npm_tmp/package/dist . rm -rf _npm_tmp ''; installPhase = '' runHook preInstall mkdir -p $out/lib/node_modules/omniroute cp -r . $out/lib/node_modules/omniroute/ mkdir -p $out/bin makeWrapper "${nodejs_22}/bin/node" "$out/bin/omniroute" \ --add-flags "$out/lib/node_modules/omniroute/bin/omniroute.mjs" makeWrapper "${nodejs_22}/bin/node" "$out/bin/omniroute-reset-password" \ --add-flags "$out/lib/node_modules/omniroute/bin/reset-password.mjs" runHook postInstall ''; passthru = { category = "AI LLM Gateway"; updateScript = [ "nix-update" "--flake" ".#omniroute" ]; }; meta = { description = "Unified AI router with 160+ providers, RTK+Caveman compression, auto fallback, MCP/A2A, OpenAI-compatible APIs"; homepage = "https://github.com/diegosouzapw/OmniRoute"; changelog = "https://github.com/diegosouzapw/OmniRoute/releases/tag/v${finalAttrs.version}"; license = lib.licenses.mit; mainProgram = "omniroute"; platforms = lib.platforms.all; }; })