{ config, pkgs, lib, ... }: let # Ces dotfiles ne sont pas un flake (config par channels) : on résout donc # les sorties du flake pi.nix à la main, en épinglant le rev. # Mise à jour : remplacer le rev par le dernier de https://github.com/lukasl-dev/pi.nix pi = builtins.getFlake "github:lukasl-dev/pi.nix/1d37b58675b763ae6c9dc05d62321109066a4126"; # Passerelle LLM interne Lundi Matin (LiteLLM), même endpoint et même jeton # que la fonction zsh `lmc`. Côté serveur, LM-Code route vers glm-5.3 servi # 24h/24 depuis le 07/09/2026 (fin de la rotation jour GLM / nuit Kimi). # Consigne équipe IA Lundi Matin (07/09/2026) : viser 100-300k de contexte # par session et limiter le nombre d'agents en période de pic — le KV cache # GLM 5.3 est la ressource rare. Ne pas tester la limite à 500k. lmcModels = (pkgs.formats.json { }).generate "pi-models.json" { providers.lundimatin = { baseUrl = "https://llm-core.lundimatin.app"; api = "anthropic-messages"; # Résolu à chaque requête : le jeton ne passe pas par le store Nix. apiKey = "!cat ${config.home.homeDirectory}/.config/lmc-token"; # La passerelle renvoie des blocs thinking sans signature ; sans ça pi # les dégrade en texte au lieu de les rejouer. compat.allowEmptySignature = true; # Retirés le 07/09/2026 : glm-5.2 (redirection morte vers glm-5.3), # kimi-k3 et qwen3.8-27b (off, confirmés), deepseek-v4-flash # (3 échecs consécutifs, mêmes symptômes que 27b — réajouter s'il revient). models = [ { id = "LM-Code"; name = "LM-Code (glm-5.3 — Lundi Matin)"; # Même comportement que qwen3.8-flash-next : envoyer le paramètre # `thinking` supprime le bloc thinking côté passerelle (testé # 07/09/2026). reasoning = false laisse pi ne pas l'envoyer : le # modèle raisonne nativement et émet des blocs thinking à signature # vide, gérés par compat.allowEmptySignature du provider. reasoning = false; # Vision validée via l'endpoint anthropic /v1/messages (07/09/2026). input = [ "text" "image" ]; # 500k annoncés côté Lundi Matin (07/09/2026), non re-testés pour # ne pas charger le KV cache. contextWindow = 500000; # Annonce LM : « tous en 128k out » (07/09/2026) ; 128k testé OK. # 256k est aussi accepté par la passerelle mais non retenu. maxTokens = 128000; } { id = "qwen3.8-flash-next"; name = "Qwen 3.8 Flash Next (vision) — Lundi Matin"; # thinking.enabled supprime le bloc thinking côté vLLM (re-testé # 07/09/2026) : on laisse pi ne pas envoyer le paramètre thinking, # le modèle raisonne nativement et émet des blocs thinking à # signature vide, gérés par compat.allowEmptySignature. reasoning = false; # Vision re-validée 07/09/2026 (image base64 via /v1/messages). input = [ "text" "image" ]; # Repli serveur de LM-Code, mais 262k de contexte : pas un vrai # fallback. Recommandé par LM pour les tâches simples, de manière # proactive, afin d'alléger GLM 5.3 (07/09/2026). contextWindow = 262144; maxTokens = 128000; } { id = "glm-ocr"; name = "GLM OCR (vision) — Lundi Matin"; # Spécialisé lecture d'images / OCR : basculer dessus via /model # pour cet usage, ou via l'extension vision-proxy. reasoning = false; input = [ "text" "image" ]; # Vision et 8k out testés 07/09/2026 ; limites annoncées côté LM. contextWindow = 65536; maxTokens = 8192; } ]; }; }; in { imports = [ pi.homeModules.default ]; programs.pi.coding-agent = { enable = true; models = lmcModels; settings = { defaultProvider = "lundimatin"; defaultModel = "LM-Code"; }; }; # Le wrapper pi ne copie models.json que s'il n'existe pas déjà (garde-fou du # module lukasl-dev/pi.nix, variable modelsPrelude dans coding-agent/options.nix). # Pour que ce fichier nix reste l'unique source de vérité, on supprime le # models.json utilisateur à chaque activation : pi le recréera depuis le store # au prochain lancement. home.activation.pi-models-source-of-truth = lib.hm.dag.entryAfter [ "writeBoundary" ] '' $DRY_RUN_CMD rm -f ${config.home.homeDirectory}/.pi/agent/models.json ''; }