mirror of
https://github.com/moeru-ai/airi.git
synced 2026-08-14 00:48:06 +00:00
feat(nix): add nix flake and package (#319)
* feat(nix): add nix flake and package * feat: support darwin --------- Co-authored-by: Neko <neko@ayaka.moe>
This commit is contained in:
@@ -96,3 +96,8 @@ web-ext.config.ts
|
||||
# Data
|
||||
.postgres
|
||||
twitter-session.json
|
||||
|
||||
# Symlinks created by nix build
|
||||
result*
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
(builtins.getFlake (toString ./.)).packages.${builtins.currentSystem}
|
||||
Generated
+27
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1752950548,
|
||||
"narHash": "sha256-NS6BLD0lxOrnCiEOcvQCDVPXafX1/ek1dfJHX1nUIzc=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "c87b95e25065c028d31a94f06a62927d18763fdf",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
|
||||
outputs =
|
||||
{ self, nixpkgs }:
|
||||
let
|
||||
systems = [
|
||||
"x86_64-linux"
|
||||
"aarch64-linux"
|
||||
"x86_64-darwin"
|
||||
"aarch64-darwin"
|
||||
];
|
||||
forAllSystems = nixpkgs.lib.genAttrs systems;
|
||||
pkgsForSystem =
|
||||
system:
|
||||
import nixpkgs {
|
||||
inherit system;
|
||||
config.allowUnfree = true;
|
||||
};
|
||||
in
|
||||
{
|
||||
formatter = forAllSystems (system: (pkgsForSystem system).nixfmt-tree);
|
||||
|
||||
packages = forAllSystems (system: {
|
||||
default = self.packages.${system}.airi;
|
||||
airi = (pkgsForSystem system).callPackage ./package.nix { };
|
||||
airi-debug = (pkgsForSystem system).callPackage ./package.nix { debugBuild = true; };
|
||||
});
|
||||
|
||||
overlays = {
|
||||
default = self.overlays.airi;
|
||||
airi = final: _: {
|
||||
airi = final.callPackage ./package.nix { };
|
||||
};
|
||||
};
|
||||
|
||||
devShells = forAllSystems (
|
||||
system: with (pkgsForSystem system); {
|
||||
default = mkShell {
|
||||
inputsFrom = [ self.packages.${system}.airi ];
|
||||
packages = [
|
||||
nixd
|
||||
nixfmt-tree
|
||||
pnpm
|
||||
];
|
||||
};
|
||||
}
|
||||
);
|
||||
};
|
||||
}
|
||||
+187
@@ -0,0 +1,187 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
stdenv,
|
||||
stdenvNoCC,
|
||||
rustPlatform,
|
||||
|
||||
autoPatchelfHook,
|
||||
cargo-tauri,
|
||||
cudaPackages,
|
||||
pkg-config,
|
||||
pnpm,
|
||||
wrapGAppsHook3,
|
||||
|
||||
alsa-lib,
|
||||
atk,
|
||||
cacert,
|
||||
glib,
|
||||
libayatana-appindicator,
|
||||
nodejs,
|
||||
onnxruntime,
|
||||
openssl,
|
||||
webkitgtk_4_1,
|
||||
|
||||
cudaSupport ? config.cudaSupport,
|
||||
debugBuild ? false,
|
||||
}:
|
||||
|
||||
rustPlatform.buildRustPackage (final: {
|
||||
pname = "airi";
|
||||
version = "0.7.0-alpha.1";
|
||||
|
||||
src = ./.;
|
||||
|
||||
cargoLock.lockFile = ./Cargo.lock;
|
||||
|
||||
pnpmDeps = pnpm.fetchDeps {
|
||||
inherit (final) pname version src;
|
||||
fetcherVersion = 1;
|
||||
hash = "sha256-gqsJ2TDby15bhz7AgiaRs06p0XiJY4w9Ay1HtRV28nk="; # To update, set it to ""
|
||||
};
|
||||
|
||||
# Cache of assets downloaded during vite build
|
||||
assets = stdenvNoCC.mkDerivation {
|
||||
pname = "${final.pname}-assets";
|
||||
inherit (final) version src pnpmDeps;
|
||||
|
||||
nativeBuildInputs = [
|
||||
cacert # For network request
|
||||
nodejs
|
||||
pnpm.configHook
|
||||
];
|
||||
|
||||
buildPhase = ''
|
||||
runHook preBuild
|
||||
|
||||
pnpm run build:packages
|
||||
pnpm -F @proj-airi/stage-tamagotchi run build
|
||||
|
||||
runHook postBuild
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
mkdir -p $out
|
||||
cp -r apps/stage-tamagotchi/.cache/assets $out
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
|
||||
outputHashMode = "recursive";
|
||||
# To update, set it to lib.fakeHash
|
||||
outputHash = "sha256-QDGx5sWlWwgMWvG/umkNY+Ct9i5zl+eKEJnvA2whPkY=";
|
||||
};
|
||||
|
||||
nativeBuildInputs =
|
||||
[
|
||||
cargo-tauri.hook
|
||||
nodejs
|
||||
pkg-config
|
||||
pnpm.configHook
|
||||
]
|
||||
++ lib.optionals stdenv.isLinux [
|
||||
wrapGAppsHook3
|
||||
autoPatchelfHook
|
||||
]
|
||||
++ lib.optionals cudaSupport [
|
||||
cudaPackages.cuda_nvcc # Used by cudarc and bindgen_cuda
|
||||
];
|
||||
|
||||
buildInputs = [
|
||||
glib # Used by glib-sys
|
||||
onnxruntime # Used by ort-sys
|
||||
openssl # Used by openssl-sys
|
||||
]
|
||||
++ lib.optionals stdenv.isLinux [
|
||||
alsa-lib # Used by alsa-sys
|
||||
atk # Used by atk-sys
|
||||
libayatana-appindicator # Used by libappindicator-sys
|
||||
webkitgtk_4_1
|
||||
]
|
||||
++ lib.optionals cudaSupport [
|
||||
cudaPackages.cuda_cccl # For nv/target used by bindgen_cuda
|
||||
cudaPackages.cuda_cudart # For cuda.h used by cudarc
|
||||
cudaPackages.cuda_nvrtc
|
||||
cudaPackages.libcublas
|
||||
cudaPackages.libcurand
|
||||
];
|
||||
|
||||
env = lib.optionalAttrs cudaSupport {
|
||||
# For bindgen_cuda
|
||||
CUDA_COMPUTE_CAP = builtins.replaceStrings [ "." ] [ "" ] (
|
||||
builtins.head cudaPackages.flags.cudaCapabilities
|
||||
);
|
||||
};
|
||||
|
||||
configurePhase = ''
|
||||
runHook preConfigure
|
||||
|
||||
echo Setting up asset cache
|
||||
mkdir apps/stage-tamagotchi/.cache
|
||||
cp -r $assets/assets apps/stage-tamagotchi/.cache
|
||||
|
||||
${lib.optionalString cudaSupport ''
|
||||
echo Patching cudarc build script to find CUDA
|
||||
# In configurePhase because CUDA is set up in a pre configure hook
|
||||
# cudarc searches in a few environment variables, but they can't be used because they don't
|
||||
# support the CUDAToolkit_ROOT format (semicolon-separated list of paths).
|
||||
# https://github.com/coreylowman/cudarc/blob/main/build.rs#L211
|
||||
substituteInPlace ../cargo-vendor-dir/cudarc-*/build.rs \
|
||||
--replace-fail /usr/lib/cuda "$(echo "$CUDAToolkit_ROOT" | sed 's/;/", "/g')"
|
||||
|
||||
echo Patching bindgen_cuda to find CUDA # Used by candle-kernels
|
||||
# bindgen_cuda copies the pathfinding logic from cudarc
|
||||
# https://github.com/Narsil/bindgen_cuda/blob/main/src/lib.rs#L436
|
||||
substituteInPlace ../cargo-vendor-dir/bindgen_cuda-*/src/lib.rs \
|
||||
--replace-fail /usr/lib/cuda "$(echo "$CUDAToolkit_ROOT" | sed 's/;/", "/g')"
|
||||
''}
|
||||
|
||||
runHook postConfigure
|
||||
'';
|
||||
|
||||
preBuild = ''
|
||||
pnpm run build:packages
|
||||
'';
|
||||
|
||||
buildAndTestSubdir = "apps/stage-tamagotchi";
|
||||
buildType = if debugBuild then "debug" else "release";
|
||||
cargoBuildFeatures = lib.optional cudaSupport "cuda";
|
||||
|
||||
postInstall =
|
||||
lib.optionalString stdenv.isLinux ''
|
||||
mv $out/bin/app $out/bin/airi
|
||||
''
|
||||
+ lib.optionalString stdenv.isDarwin ''
|
||||
mkdir -p "$out/bin"
|
||||
ln -sf "$out/Applications/AIRI.app/Contents/MacOS/app" "$out/bin/airi"
|
||||
'';
|
||||
|
||||
# Add missing runtime dependency
|
||||
preFixup = lib.optionalString stdenv.isLinux ''
|
||||
patchelf --add-needed libayatana-appindicator3.so.1 $out/bin/airi
|
||||
'';
|
||||
|
||||
meta = {
|
||||
description = "Self-hostable AI waifu / companion / VTuber";
|
||||
longDescription = ''
|
||||
AIRI is a container of souls of AI waifu / virtual characters to bring them into our worlds,
|
||||
wishing to achieve Neuro-sama's altitude, completely LLM and AI driven, capable of realtime
|
||||
voice chat, Minecraft playing, Factorio playing. It can be run in Browser or Desktop.
|
||||
'';
|
||||
homepage = "https://github.com/moeru-ai/airi";
|
||||
changelog = "https://github.com/moeru-ai/airi/releases/tag/v${final.version}";
|
||||
# While airi itself is licensed under MIT, it uses the nonfree Cubism SDK. Whether it's
|
||||
# redistributable remains a question, so we say it's not.
|
||||
license = lib.licenses.unfree;
|
||||
platforms = [
|
||||
"x86_64-linux"
|
||||
"aarch64-linux"
|
||||
"x86_64-darwin"
|
||||
"aarch64-darwin"
|
||||
];
|
||||
mainProgram = "airi";
|
||||
maintainers = with lib.maintainers; [ weathercold ];
|
||||
};
|
||||
})
|
||||
Reference in New Issue
Block a user