Merge pull request 'Dixie' (#1) from dixie into master
Reviewed-on: #1
This commit was merged in pull request #1.
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
clang-tools
|
clang-tools
|
||||||
elinks
|
elinks
|
||||||
freeglut
|
freeglut
|
||||||
|
gh
|
||||||
glfw
|
glfw
|
||||||
glm
|
glm
|
||||||
inkscape
|
inkscape
|
||||||
@@ -25,6 +26,7 @@
|
|||||||
libGL
|
libGL
|
||||||
libGL.dev
|
libGL.dev
|
||||||
mesa
|
mesa
|
||||||
|
nodejs
|
||||||
nyxt
|
nyxt
|
||||||
opencode
|
opencode
|
||||||
qmk
|
qmk
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ let system = pkgs.stdenv.hostPlatform.system; in
|
|||||||
bitwarden-cli
|
bitwarden-cli
|
||||||
bitwarden-desktop
|
bitwarden-desktop
|
||||||
bluez
|
bluez
|
||||||
|
cliamp
|
||||||
cmus
|
cmus
|
||||||
deja-dup
|
deja-dup
|
||||||
direnv
|
direnv
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ let
|
|||||||
cfg = {
|
cfg = {
|
||||||
"$schema" = "https://opencode.ai/config.json";
|
"$schema" = "https://opencode.ai/config.json";
|
||||||
enabled_providers = [ "llama.cpp" "zai-coding-plan" ];
|
enabled_providers = [ "llama.cpp" "zai-coding-plan" ];
|
||||||
model = "llama.cpp/laguna-s-2.1";
|
model = "llama.cpp/ornith-1.5-35b-a3b";
|
||||||
small_model = "llama.cpp/ornith-1.5-9b-uncensored";
|
small_model = "llama.cpp/ornith-1.5-9b-uncensored";
|
||||||
provider = {
|
provider = {
|
||||||
"zai-coding-plan" = {
|
"zai-coding-plan" = {
|
||||||
@@ -52,7 +52,6 @@ let
|
|||||||
chunkTimeout = 7200000;
|
chunkTimeout = 7200000;
|
||||||
};
|
};
|
||||||
models = {
|
models = {
|
||||||
"laguna-s-2.1" = text "Laguna S 2.1";
|
|
||||||
"qwen3.6-35b-a3b-abliterated" = text "Qwen3.6 35B A3B";
|
"qwen3.6-35b-a3b-abliterated" = text "Qwen3.6 35B A3B";
|
||||||
"gemma4-26b-a4b-abliterated" = text "Gemma 4 26B A4B";
|
"gemma4-26b-a4b-abliterated" = text "Gemma 4 26B A4B";
|
||||||
"ornith-1.0-35b" = text "Ornith 1.0 35B";
|
"ornith-1.0-35b" = text "Ornith 1.0 35B";
|
||||||
|
|||||||
@@ -67,6 +67,7 @@
|
|||||||
lib = nixpkgs.lib;
|
lib = nixpkgs.lib;
|
||||||
in {
|
in {
|
||||||
nixosConfigurations = lib.genAttrs [
|
nixosConfigurations = lib.genAttrs [
|
||||||
|
"dixie"
|
||||||
"imladris"
|
"imladris"
|
||||||
"ono-sendai"
|
"ono-sendai"
|
||||||
"orion"
|
"orion"
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDXu7ME91tLfU+Q3fNFe8VyIouVvoktoYy8xVNpObxuv kyle@titan.local
|
||||||
|
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGea83yMIdCi0QUUPgmhRgIrii7lS1dYxZ6LSxSsDOph kyle@europa
|
||||||
|
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHukZAxnlMSoTlRtRF14mLbC0x+rb1zlxnSLVLg+6Xbh kyle@vade
|
||||||
|
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILw318jrtFJw1Cn3WnOk17Gkr8bo7NOACQwMQ7S4hvoL kyle@straylight
|
||||||
@@ -0,0 +1,186 @@
|
|||||||
|
{ inputs, pkgs, lib, config, ... }:
|
||||||
|
let
|
||||||
|
# Unstable instantiated with unfree allowed: CUDA is unfree, and legacyPackages does not
|
||||||
|
# inherit the host's nixpkgs.config (straylight's Vulkan build never hit this).
|
||||||
|
pkgsUnstable = import inputs.nixpkgs-unstable {
|
||||||
|
system = pkgs.stdenv.hostPlatform.system;
|
||||||
|
config = { allowUnfree = true; cudaSupport = true; };
|
||||||
|
};
|
||||||
|
# llama.cpp with the CUDA backend, from unstable to match straylight's build (same model
|
||||||
|
# files, same router semantics). Built once on straylight and shipped with dixie-push
|
||||||
|
# --closure, or pulled from the cache when Dixie's link allows.
|
||||||
|
llama-cpp = pkgsUnstable.llama-cpp.override { cudaSupport = true; };
|
||||||
|
modelsDir = "/var/lib/llama-server/models";
|
||||||
|
|
||||||
|
# Dixie is the fleet's helper tier: everything that is latency-sensitive, small, and was
|
||||||
|
# starving on straylight's CPU (2026-09-21). One RTX 3060 (12 GB) today; card 2 joins
|
||||||
|
# when its fans are replaced.
|
||||||
|
#
|
||||||
|
# Router: the three models that must never be swapped out — approval guardian / Honcho
|
||||||
|
# deriver (9B), Honcho dialectic (4B, non-thinking), Honcho embeddings — resident together:
|
||||||
|
# 5.6 + 2.5 + 0.7 GB weights, ~3 GB left for KV. Vision does NOT go here: 5 GB + 1.2 GB
|
||||||
|
# mmproj does not fit beside them, so it gets its own on-demand process below.
|
||||||
|
llamaModelsIni = pkgs.writeText "llama-models.ini" ''
|
||||||
|
version = 1
|
||||||
|
[*]
|
||||||
|
jinja = true
|
||||||
|
flash-attn = on
|
||||||
|
cache-type-k = q8_0
|
||||||
|
cache-type-v = q8_0
|
||||||
|
n-gpu-layers = 999
|
||||||
|
; three resident models share 12 GB: keep contexts modest
|
||||||
|
ctx-size = 16384
|
||||||
|
parallel = 2
|
||||||
|
cache-ram = 512
|
||||||
|
|
||||||
|
; Ornith 1.5 9B, refusal-ablated. Hermes auxiliary model (approval guardian, title,
|
||||||
|
; web_extract) for all agents and Honcho's deriver/summary/dream model.
|
||||||
|
[ornith-1.5-9b-uncensored]
|
||||||
|
model = ${modelsDir}/ornith-1.5-9b-uncensored/Ornith-1.5-9B-uncensored.Q4_K_M.gguf
|
||||||
|
; Runaway guard carried over from straylight: helper tasks need short answers.
|
||||||
|
reasoning-budget = 2048
|
||||||
|
n-predict = 4096
|
||||||
|
|
||||||
|
; Honcho dialectic: non-thinking instruct model so answers are short and fast.
|
||||||
|
[honcho-dialectic]
|
||||||
|
model = ${modelsDir}/qwen3-4b-instruct-2507/Qwen3-4B-Instruct-2507-Q4_K_M.gguf
|
||||||
|
n-predict = 1024
|
||||||
|
|
||||||
|
; Honcho embeddings (1024-dim; EMBEDDING_VECTOR_DIMENSIONS=1024 on rift).
|
||||||
|
[honcho-embed]
|
||||||
|
model = ${modelsDir}/qwen3-embedding-0.6b/Qwen3-Embedding-0.6B-Q8_0.gguf
|
||||||
|
embedding = true
|
||||||
|
pooling = cls
|
||||||
|
ubatch-size = 8192
|
||||||
|
ctx-size = 8192
|
||||||
|
parallel = 4
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Vision (auxiliary.vision for all agents): its own server on :11433, loaded on first
|
||||||
|
# request and dropped again after an idle hour so the router's three keep their VRAM.
|
||||||
|
visionModelsIni = pkgs.writeText "llama-vision.ini" ''
|
||||||
|
version = 1
|
||||||
|
[*]
|
||||||
|
jinja = true
|
||||||
|
flash-attn = on
|
||||||
|
n-gpu-layers = 999
|
||||||
|
ctx-size = 16384
|
||||||
|
parallel = 1
|
||||||
|
sleep-idle-seconds = 3600
|
||||||
|
|
||||||
|
[qwen3-vl-8b-abliterated]
|
||||||
|
model = ${modelsDir}/qwen3-vl-8b-abliterated/Qwen3-VL-8B-Instruct-abliterated-v2.0.Q4_K_M.gguf
|
||||||
|
mmproj = ${modelsDir}/qwen3-vl-8b-abliterated/Qwen3-VL-8B-Instruct-abliterated-v2.0.mmproj-f16.gguf
|
||||||
|
'';
|
||||||
|
|
||||||
|
llamaService = { description, port, preset, modelsMax }: {
|
||||||
|
inherit description;
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
after = [ "network-online.target" "var-lib-llama\\x2dserver-models.mount" ];
|
||||||
|
wants = [ "network-online.target" ];
|
||||||
|
environment.HOME = "/var/lib/llama-server";
|
||||||
|
serviceConfig = {
|
||||||
|
ExecStart = ''
|
||||||
|
${llama-cpp}/bin/llama-server \
|
||||||
|
--host 0.0.0.0 \
|
||||||
|
--port ${toString port} \
|
||||||
|
--models-preset ${preset} \
|
||||||
|
--models-max ${toString modelsMax} \
|
||||||
|
--timeout 7200
|
||||||
|
'';
|
||||||
|
User = "llama-server";
|
||||||
|
Group = "llama-server";
|
||||||
|
StateDirectory = "llama-server";
|
||||||
|
WorkingDirectory = "/var/lib/llama-server";
|
||||||
|
SupplementaryGroups = [ "video" ];
|
||||||
|
Restart = "on-failure";
|
||||||
|
RestartSec = "10s";
|
||||||
|
TimeoutStartSec = "600";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./hardware-configuration.nix
|
||||||
|
./disk-config.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
config = {
|
||||||
|
# Headless. The base configuration.nix has no desktop; nothing GUI is added here.
|
||||||
|
boot.loader.systemd-boot.enable = true;
|
||||||
|
boot.loader.efi.canTouchEfiVariables = true;
|
||||||
|
# 6.12 LTS: mt7921u (the AX9L USB Wi-Fi) is in-tree from 5.18; avoids the 6.17/6.18
|
||||||
|
# mt7921 monitor-mode regression for good measure.
|
||||||
|
boot.kernelPackages = pkgs.linuxPackages_6_12;
|
||||||
|
|
||||||
|
# NVIDIA, compute only: no X, no modesetting needed for CUDA.
|
||||||
|
hardware.graphics.enable = true;
|
||||||
|
services.xserver.videoDrivers = [ "nvidia" ];
|
||||||
|
hardware.nvidia = {
|
||||||
|
open = false;
|
||||||
|
modesetting.enable = false;
|
||||||
|
nvidiaPersistenced = true;
|
||||||
|
package = config.boot.kernelPackages.nvidiaPackages.production;
|
||||||
|
};
|
||||||
|
hardware.enableRedistributableFirmware = true;
|
||||||
|
|
||||||
|
# Power cap for the 3060(s): thermal hour on 2026-09-21 held 75 °C at 140 W, case closed.
|
||||||
|
systemd.services.nvidia-power-cap = {
|
||||||
|
description = "Cap GPU power (thermals in the Aurora chassis)";
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
after = [ "nvidia-persistenced.service" ];
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
RemainAfterExit = true;
|
||||||
|
ExecStart = "${config.hardware.nvidia.package.bin}/bin/nvidia-smi -pl 140";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Headless and Wi-Fi only: there is no console to add a key from after install, so the
|
||||||
|
# keys go in with the system. Same set the live ISO used (~/src/dixie-iso).
|
||||||
|
users.users.kyle.openssh.authorizedKeys.keyFiles = [ ./authorized_keys.pub ];
|
||||||
|
users.users.root.openssh.authorizedKeys.keyFiles = [ ./authorized_keys.pub ];
|
||||||
|
|
||||||
|
users.users.llama-server = { isSystemUser = true; group = "llama-server"; home = "/var/lib/llama-server"; };
|
||||||
|
users.groups.llama-server = { };
|
||||||
|
|
||||||
|
# Model weights live on the USB cache stick (ext4, label dixie-cache), populated from
|
||||||
|
# straylight with dixie-push. Both servers wait for the mount.
|
||||||
|
fileSystems."/mnt/cache" = {
|
||||||
|
device = "/dev/disk/by-label/dixie-cache";
|
||||||
|
fsType = "ext4";
|
||||||
|
options = [ "noatime" "nofail" "x-systemd.device-timeout=30s" ];
|
||||||
|
};
|
||||||
|
fileSystems."/var/lib/llama-server/models" = {
|
||||||
|
device = "/mnt/cache/models";
|
||||||
|
fsType = "none";
|
||||||
|
options = [ "bind" "nofail" "x-systemd.requires=/mnt/cache" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.llama-server = llamaService {
|
||||||
|
description = "llama.cpp router: helper tier (9B guardian/deriver, dialectic, embeddings)";
|
||||||
|
port = 11434; preset = llamaModelsIni; modelsMax = 3;
|
||||||
|
};
|
||||||
|
systemd.services.llama-vision = llamaService {
|
||||||
|
description = "llama.cpp vision server (qwen3-vl-8b, on demand)";
|
||||||
|
port = 11433; preset = visionModelsIni; modelsMax = 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Wi-Fi only host. NetworkManager comes from the base config; the AX9L (mt7921u) becomes
|
||||||
|
# the primary once plugged in and the internal CNVi radio stays as fallback. Connection
|
||||||
|
# profiles are copied from the live-USB session at install time (see the install notes),
|
||||||
|
# not stored in this repo.
|
||||||
|
networking.networkmanager.wifi.backend = "wpa_supplicant";
|
||||||
|
|
||||||
|
# Reachable only over the tailnet: 11434 (router) and 11433 (vision) on tailscale0, and
|
||||||
|
# SSH from the LAN (base config opens 22) for bring-up.
|
||||||
|
networking.firewall.interfaces.tailscale0.allowedTCPPorts = [ 11433 11434 ];
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
llama-cpp
|
||||||
|
pciutils usbutils lm_sensors dmidecode nvme-cli smartmontools ethtool iw wpa_supplicant
|
||||||
|
htop tmux git jq curl rsync nvtopPackages.nvidia
|
||||||
|
];
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
## (dixie) disko config
|
||||||
|
## Alienware Aurora R11: Samsung PM9A1 1 TB NVMe is the system disk. The 6 TB SATA HDD and the
|
||||||
|
## USB cache stick are left alone here (the stick is mounted by label in default.nix).
|
||||||
|
## Unencrypted on purpose: headless box that must come back from a power cut with nobody
|
||||||
|
## at the console to unlock it.
|
||||||
|
|
||||||
|
{ lib, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
disko.devices.disk.main = {
|
||||||
|
type = "disk";
|
||||||
|
device = "/dev/disk/by-id/nvme-eui.36355630521205220025384500000001";
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
ESP = {
|
||||||
|
size = "1G";
|
||||||
|
type = "EF00";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "vfat";
|
||||||
|
mountpoint = "/boot";
|
||||||
|
mountOptions = [ "umask=0077" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
root = {
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "ext4";
|
||||||
|
mountpoint = "/";
|
||||||
|
mountOptions = [ "noatime" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||||
|
# and may be overwritten by future invocations. Please make changes
|
||||||
|
# to /etc/nixos/configuration.nix instead.
|
||||||
|
{ config, lib, pkgs, modulesPath, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[ (modulesPath + "/installer/scan/not-detected.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ];
|
||||||
|
boot.initrd.kernelModules = [ ];
|
||||||
|
boot.kernelModules = [ "kvm-intel" ];
|
||||||
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||||
|
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||||
|
}
|
||||||
@@ -25,6 +25,12 @@ let
|
|||||||
parallel = 2
|
parallel = 2
|
||||||
; Unload a model's weights and KV cache after six idle hours; the next request reloads it.
|
; Unload a model's weights and KV cache after six idle hours; the next request reloads it.
|
||||||
sleep-idle-seconds = 21600
|
sleep-idle-seconds = 21600
|
||||||
|
; Host-RAM prompt cache. This limit is PER RESIDENT MODEL, not global: each model's
|
||||||
|
; child llama-server gets its own. The llama.cpp default is 8192 MiB, so with
|
||||||
|
; --models-max 3 the worst case was 3 x 8 = 24 GiB. Helper, VL and comparison models
|
||||||
|
; rarely reuse long prefixes, so they get 2 GiB; the model that does gets more in its
|
||||||
|
; own section. Worst case is now 16 + 2 + 2 = 20 GiB.
|
||||||
|
cache-ram = 2048
|
||||||
|
|
||||||
; Qwen3.6-35B-A3B, refusal-ablated (HauhauCS "Aggressive"). Benchmark candidate A.
|
; Qwen3.6-35B-A3B, refusal-ablated (HauhauCS "Aggressive"). Benchmark candidate A.
|
||||||
[qwen3.6-35b-a3b-abliterated]
|
[qwen3.6-35b-a3b-abliterated]
|
||||||
@@ -42,14 +48,17 @@ let
|
|||||||
; DFlash GGUF is on disk (laguna-s-2.1-DFlash-BF16.gguf). nixpkgs llama.cpp 0.4.0
|
; DFlash GGUF is on disk (laguna-s-2.1-DFlash-BF16.gguf). nixpkgs llama.cpp 0.4.0
|
||||||
; rejects it at load ("expected 76, got 69" tensors); Poolside's file needs their
|
; rejects it at load ("expected 76, got 69" tensors); Poolside's file needs their
|
||||||
; laguna-branch loader. Leave unwired so Laguna still starts.
|
; laguna-branch loader. Leave unwired so Laguna still starts.
|
||||||
[laguna-s-2.1]
|
; DISABLED 2026-09-19: resident beside Ornith 35B it left ~15 GB free, and a third
|
||||||
model = ${llamaModelsDir}/laguna-s-2.1-UD-Q4_K_S/Laguna-S-2.1-UD-Q4_K_S-00001-of-00003.gguf
|
; model load then hit the 104 GiB TTM cap and OOM-killed the desktop session.
|
||||||
|
; Weights stay on disk; uncomment to re-enable.
|
||||||
|
; [laguna-s-2.1]
|
||||||
|
; model = ${llamaModelsDir}/laguna-s-2.1-UD-Q4_K_S/Laguna-S-2.1-UD-Q4_K_S-00001-of-00003.gguf
|
||||||
; Two slots sharing one unified 131072-token KV pool: a second request (subagent,
|
; Two slots sharing one unified 131072-token KV pool: a second request (subagent,
|
||||||
; another client) runs alongside instead of queueing, and either one may still use
|
; another client) runs alongside instead of queueing, and either one may still use
|
||||||
; the full 131072 as long as their combined context fits.
|
; the full 131072 as long as their combined context fits.
|
||||||
parallel = 2
|
; parallel = 2
|
||||||
kv-unified = true
|
; kv-unified = true
|
||||||
ctx-size = 131072
|
; ctx-size = 131072
|
||||||
|
|
||||||
; Previous default model (a Qwen 3.5 derivative), kept for comparison runs. It was
|
; Previous default model (a Qwen 3.5 derivative), kept for comparison runs. It was
|
||||||
; fetched by the old -hf flag into the HF cache; dedup hides the cache's own entry.
|
; fetched by the old -hf flag into the HF cache; dedup hides the cache's own entry.
|
||||||
@@ -62,6 +71,13 @@ let
|
|||||||
[ornith-1.5-9b-uncensored]
|
[ornith-1.5-9b-uncensored]
|
||||||
hf-repo = mradermacher/Ornith-1.5-9B-uncensored-GGUF:Q4_K_M
|
hf-repo = mradermacher/Ornith-1.5-9B-uncensored-GGUF:Q4_K_M
|
||||||
dedup-cache-models = true
|
dedup-cache-models = true
|
||||||
|
; Runaway guard (2026-09-21): as Hermes' auxiliary model (approval, title, web
|
||||||
|
; extract) it got requests with no max_tokens, never converged, and one generation
|
||||||
|
; ran to 46k tokens (~70 min at 11 t/s) after the client's 60 s timeout, starving the
|
||||||
|
; 35B. Helper tasks need short answers: cap thinking and total output server-side.
|
||||||
|
; A client that sends its own smaller max_tokens still wins.
|
||||||
|
reasoning-budget = 2048
|
||||||
|
n-predict = 4096
|
||||||
|
|
||||||
; Qwen3-VL-8B Instruct, refusal-ablated (prithivMLmods v2 / mradermacher).
|
; Qwen3-VL-8B Instruct, refusal-ablated (prithivMLmods v2 / mradermacher).
|
||||||
; Dedicated VLM in the same size class as Ornith 1.5 9B. Explicit mmproj-url
|
; Dedicated VLM in the same size class as Ornith 1.5 9B. Explicit mmproj-url
|
||||||
@@ -82,6 +98,23 @@ let
|
|||||||
top-k = 20
|
top-k = 20
|
||||||
reasoning-budget = 8192
|
reasoning-budget = 8192
|
||||||
dedup-cache-models = true
|
dedup-cache-models = true
|
||||||
|
; Prompt-cache thrash (measured 2026-09-20, 30 h of logs): opencode, Hermes and its
|
||||||
|
; delegation subagents shared 2 slots and an 8 GiB host cache whose entries are
|
||||||
|
; 1-2 GiB each. 235 evictions; 138 prompt re-evaluations over 20k tokens costing
|
||||||
|
; ~196 minutes; one 102,922-token prompt re-processed from scratch (~3.4 min).
|
||||||
|
;
|
||||||
|
; Four slots over ONE unified 262144-token KV pool: same GPU memory as before, but
|
||||||
|
; four conversations keep their prefix live instead of two, and any one of them may
|
||||||
|
; still use the whole pool when the others are idle. Cost: when all four decode at
|
||||||
|
; once, each gets a smaller share of ~30 t/s.
|
||||||
|
parallel = 4
|
||||||
|
kv-unified = true
|
||||||
|
; 16 GiB holds about ten evicted conversations instead of five.
|
||||||
|
; IF LAGUNA IS RE-ENABLED this must drop to 4096 (Laguna 8192, helpers 0) and
|
||||||
|
; --models-max to 2: Laguna ~73 GiB + this model ~26 + a 9B helper ~9 + desktop and
|
||||||
|
; services ~20 + the honcho CPU lanes ~9 is ~137 GiB on a 125 GiB machine before
|
||||||
|
; any cache at all. That is the 2026-09-19 OOM.
|
||||||
|
cache-ram = 16384
|
||||||
|
|
||||||
; Qwen 3.8 27B dense, refusal-ablated. Preferred uncensored coding agent.
|
; Qwen 3.8 27B dense, refusal-ablated. Preferred uncensored coding agent.
|
||||||
; orcarouter/Qwen3.8-27B-Uncensored-GGUF is gated; huihui Q4_K_L keeps
|
; orcarouter/Qwen3.8-27B-Uncensored-GGUF is gated; huihui Q4_K_L keeps
|
||||||
@@ -224,7 +257,7 @@ in
|
|||||||
--host 0.0.0.0 \
|
--host 0.0.0.0 \
|
||||||
--port 11434 \
|
--port 11434 \
|
||||||
--models-preset ${llamaModelsIni} \
|
--models-preset ${llamaModelsIni} \
|
||||||
--models-max 2 \
|
--models-max 3 \
|
||||||
--timeout 7200
|
--timeout 7200
|
||||||
'';
|
'';
|
||||||
User = "llama-server";
|
User = "llama-server";
|
||||||
@@ -326,12 +359,14 @@ in
|
|||||||
# Pinned to the upstream flake (v0.9.0); nixpkgs-unstable only has 0.7.1.
|
# Pinned to the upstream flake (v0.9.0); nixpkgs-unstable only has 0.7.1.
|
||||||
environment.systemPackages = [
|
environment.systemPackages = [
|
||||||
inputs.herdr.packages.x86_64-linux.default
|
inputs.herdr.packages.x86_64-linux.default
|
||||||
gh
|
|
||||||
llamaModelsCmd
|
llamaModelsCmd
|
||||||
llamaUnloadCmd
|
llamaUnloadCmd
|
||||||
nodejs
|
|
||||||
whisperTranscribe
|
whisperTranscribe
|
||||||
whisperCpp
|
whisperCpp
|
||||||
|
# tirith: pre-exec command security scanner used by Hermes (resolved from
|
||||||
|
# PATH before its self-downloaded ~/.hermes/bin/tirith). From unstable:
|
||||||
|
# 26.05 only has 0.3.3, Hermes ships 0.4.x.
|
||||||
|
pkgsUnstable.tirith
|
||||||
];
|
];
|
||||||
|
|
||||||
services.open-webui = {
|
services.open-webui = {
|
||||||
@@ -396,6 +431,42 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Hermes Desktop (`hermes desktop`) builds and launches an unpackaged
|
||||||
|
# Electron binary from ~/.hermes/hermes-agent/apps/desktop. It runs through
|
||||||
|
# nix-ld, so the Electron/Chromium runtime libraries have to be listed here.
|
||||||
|
programs.nix-ld.libraries = with pkgs; [
|
||||||
|
glib
|
||||||
|
nspr
|
||||||
|
nss
|
||||||
|
dbus
|
||||||
|
at-spi2-atk
|
||||||
|
at-spi2-core
|
||||||
|
cups
|
||||||
|
cairo
|
||||||
|
gtk3
|
||||||
|
pango
|
||||||
|
gdk-pixbuf
|
||||||
|
libx11
|
||||||
|
libxcomposite
|
||||||
|
libxdamage
|
||||||
|
libxext
|
||||||
|
libxfixes
|
||||||
|
libxrandr
|
||||||
|
libxcb
|
||||||
|
libxkbcommon
|
||||||
|
libgbm
|
||||||
|
libdrm
|
||||||
|
libglvnd
|
||||||
|
mesa
|
||||||
|
vulkan-loader
|
||||||
|
expat
|
||||||
|
systemd # libudev
|
||||||
|
alsa-lib
|
||||||
|
libpulseaudio
|
||||||
|
libnotify
|
||||||
|
libsecret
|
||||||
|
];
|
||||||
|
|
||||||
# Headless Chromium exposing a CDP endpoint for Hermes browser tools.
|
# Headless Chromium exposing a CDP endpoint for Hermes browser tools.
|
||||||
# Loopback only; browser.cdp_url in ~/.hermes/config.yaml points at it.
|
# Loopback only; browser.cdp_url in ~/.hermes/config.yaml points at it.
|
||||||
# Ungoogled-chromium (already in desktop-packages-light.nix), no ad-block
|
# Ungoogled-chromium (already in desktop-packages-light.nix), no ad-block
|
||||||
|
|||||||
Reference in New Issue
Block a user