Files
dotfiles/programs/pi.nix
T
Pierre MartinandClaude Opus 5 6c0f4c8882 fix(ai): plafonne qwen3.8-flash-next en 32k out
Le models.json déclarait 64k puis 128k en maxTokens pour
qwen3.8-flash-next, alors que la passerelle LiteLLM plafonne à
32 768 (max_output_tokens sur /v1/model/info, vérifié 28/09/2026).
Risque d'erreur 400 en fin de réponse longue.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-30 08:16:58 +01:00

116 lines
4.8 KiB
Nix

{
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).
# 32 768 : plafond réel de la passerelle (max_output_tokens sur
# /v1/model/info, vérifié 28/09/2026). Les valeurs antérieures
# étaient fausses et risquaient une erreur 400 en fin de réponse.
contextWindow = 262144;
maxTokens = 32768;
}
{
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
'';
}