feat(hermes): claude-code 2.1.223 -> manifest 2.1.280, model mappings (opus-5-5 / deepseek-v4.1-flash) + bridge url

This commit is contained in:
Hermes Agent
2026-10-06 21:42:11 -04:00
parent 667a76799b
commit cd78889870
3 changed files with 156 additions and 11 deletions
+6 -4
View File
@@ -18,14 +18,16 @@
port = 8050;
};
# Pont vers l'API server Hermes. Un seul listener par hôte (le profil default,
# cf. services/hermes) : un profil secondaire est servi sous /p/<profil>/.
# HERMES_BRIDGE_URL n'est pas secret (loopback local), seule la clé l'est.
# Pont vers l'API server Hermes. Un seul listener par hote : le gateway du
# profil default sert tous les profils, celui d'un profil secondaire sous
# /p/<profil>/ (cf. services/hermes). C'est CETTE route que consomme le cog,
# pas un port dedie : elle n'ecoute que si le gateway tourne (8642).
# HERMES_BRIDGE_URL n'est pas secret (loopback local), seule la cle l'est.
systemd.services.discord-bot.serviceConfig.EnvironmentFile = lib.mkAfter [
config.sops.secrets."discord_bot_hermes_bridge_env".path
];
systemd.services.discord-bot.environment = {
HERMES_BRIDGE_URL = "http://127.0.0.1:8643/v1/chat/completions";
HERMES_BRIDGE_URL = "http://127.0.0.1:8642/p/discord-bridge/v1/chat/completions";
HERMES_BRIDGE_ROLE_NAME = "hermes";
# Surface de test locale du cog (loopback, PAS ouverte au firewall) :
# POST /hermes/ask {"message": "..."} -> {"answer": "..."}.
+84
View File
@@ -0,0 +1,84 @@
{
"version": "2.1.280",
"manifestSignatureEnforcement": "flag",
"commit": "80abbfe7d7232280011ff01a21ae3338f4c6e372",
"modsCommit": "8187baaaafb3a9ada02d3d6fb4e8d68587aef6b0",
"buildDate": "2026-09-21T20:55:27Z",
"platforms": {
"darwin-arm64": {
"binary": "claude",
"checksum": "387a5c5dcdbb815085edf0baf79591f9d8894efe922bceaf3d75b1b08055229d",
"size": 217254576
},
"darwin-x64": {
"binary": "claude",
"checksum": "c1d32d87630482250633208ab77855429b24010ae3086a7ff7539b57b93168d4",
"size": 225565024
},
"linux-arm64": {
"binary": "claude",
"checksum": "92f2b4fd05d0bdcf7b9a0d4e0ecef4a1e4b368b290cd8fd07cff9a50013f45a2",
"size": 233103352
},
"linux-x64": {
"binary": "claude",
"checksum": "1e08503dbdf3c2cb0d706d32f3408277388d1c76ef108673e8fe42c1b322925b",
"size": 233709640
},
"linux-arm64-musl": {
"binary": "claude",
"checksum": "6a9f349dccd1c74ab854f1877c5ebdf074998571d0177e26c1f7f46f29e0f971",
"size": 225457992
},
"linux-x64-musl": {
"binary": "claude",
"checksum": "8d25ffbf600882d7b985706cc10ea45995060637ed009b5700b65e162bb00b96",
"size": 227467360
},
"win32-x64": {
"binary": "claude.exe",
"checksum": "0e4195524b73eb77efbdf3e2b36de5322a29f0ca575dfd2d9b4f946b1d425469",
"size": 237100192
},
"win32-arm64": {
"binary": "claude.exe",
"checksum": "f49980314f4c0418079979723ffd6c0d00d57e60b26fd95c53e53155ed913bdf",
"size": 225107104
}
},
"sdkCompat": {
"testedWrapperVersions": [
"0.3.240",
"0.3.241",
"0.3.242",
"0.3.243",
"0.3.245",
"0.3.246",
"0.3.247",
"0.3.248",
"0.3.250",
"0.3.251",
"0.3.252",
"0.3.257",
"0.3.258",
"0.3.259",
"0.3.260",
"0.3.261",
"0.3.263",
"0.3.266",
"0.3.267",
"0.3.268",
"0.3.269",
"0.3.270",
"0.3.271",
"0.3.272",
"0.3.273",
"0.3.274",
"0.3.275",
"0.3.276",
"0.3.277",
"0.3.278"
],
"harnessSchema": 1
}
}
+66 -7
View File
@@ -4,7 +4,20 @@
lib,
inputs,
...
}: {
}: let
# claude-code épinglé plus récent que nixpkgs 26.05 (2.1.223).
# L'API refuse les modèles Opus 5.5 en dessous de 2.1.280 :
# "API Error: 400 Claude Code 2.1.223 does not support this model;
# version 2.1.280 or newer is required."
# Le paquet nixpkgs prend son manifeste (version + checksums par plateforme)
# en argument : on lui passe celui publié par Anthropic pour le canal stable
# (https://downloads.claude.ai/claude-code-releases/2.1.280/manifest.json),
# copié tel quel dans ./claude-code-manifest.json. Mise à jour = recopier le
# manifeste d'une version plus récente, rien d'autre.
claudeCode = pkgs.claude-code.override {
manifest = lib.importJSON ./claude-code-manifest.json;
};
in {
# Option : le token Matrix du bot @hermes (clé hermes_matrix_env de
# secrets/hermes-matrix.yml). Les destinataires de ce fichier sops ne
# contiennent PAS les clés age de anywhere/laptop : ne l'activer que sur les
@@ -111,7 +124,7 @@
# claude-subscription-directsdk (provider sur abonnement Claude Pro/Max,
# login OAuth via `claude`, pas de clé API)
extraPackages = [
pkgs.claude-code
claudeCode
# node/npm : requis par le MCP GitHub (npx -y @modelcontextprotocol/server-github)
pkgs.nodejs_22
# binutils : donne `ld` et `objdump` sur le PATH, dont dépend le repli de
@@ -189,8 +202,10 @@
reasoning_overrides = {
"deepseek/deepseek-v4.1-flash" = "high";
"deepseek-v4.1-flash" = "high";
"nvidia/nemotron-3-ultra-550b-a55b:free" = "high";
"nemotron-3-ultra" = "high";
"nvidia/nemotron-3-ultra-550b-a55b:free" = "max";
"nemotron-3-ultra" = "max";
"claude-opus-5-5[1m]" = "max";
"claude-opus-5-5" = "max";
"claude-opus-5[1m]" = "max";
"claude-opus-5" = "max";
"claude-sonnet-5[1m]" = "high";
@@ -290,14 +305,34 @@
provider = "claude-subscription-directsdk-experimental";
model = "claude-opus-5[1m]";
};
# Nino : Opus 5.5 (route native `claude-opus-5-5`, tirets ; la forme
# `claude-opus-5.5` est rejetée par le CLI). Variante [1m] = 1M de
# contexte ; effort max via reasoning_overrides.
# Nino : DeepSeek v4.1 Flash (OpenRouter), 1er secours par defaut.
"!zOyDctBWcuFCJKJINI:matrix.marcpartensky.com" = {
provider = "claude-subscription-directsdk-experimental";
model = "claude-opus-5[1m]";
provider = "openrouter";
model = "deepseek/deepseek-v4.1-flash";
};
"!sylSYxsYVJRknngRnF:matrix.marcpartensky.com" = {
provider = "claude-subscription-directsdk-experimental";
model = "claude-sonnet-5[1m]";
};
"!JgWSzbTBCRPEOQTAZi:matrix.marcpartensky.com" = {
provider = "claude-subscription-directsdk-experimental";
model = "claude-sonnet-5[1m]";
};
"!ANuTSqPZhKzHOpvXhB:matrix.marcpartensky.com" = {
provider = "claude-subscription-directsdk-experimental";
model = "claude-sonnet-5[1m]";
};
"!myvmCEICVnXNIOxHSQ:matrix.marcpartensky.com" = {
provider = "claude-subscription-directsdk-experimental";
model = "claude-sonnet-5[1m]";
};
"!ABhBVVGeBoBEvuiFSY:matrix.marcpartensky.com" = {
provider = "claude-subscription-directsdk-experimental";
model = "claude-sonnet-5[1m]";
};
};
};
};
@@ -367,6 +402,24 @@
timeout = 60;
};
# --- MCP Pangolin : serveur auto-hébergé (pangolin.vps.marcpartensky.com) ---
# DÉSACTIVÉ TEMPORAIREMENT (29/09/2026) : sops.secrets."pangolin/api_key"
# ci-dessous n'a jamais eu de clé correspondante dans secrets/common.yml
# (nested pangolin.api_key absent), ce qui fait échouer TOUT
# nixos-rebuild switch sur tower ("the key 'pangolin' cannot be found").
# Déjà noté comme inerte (clé/URL placeholder) avant ce blocage. Réactiver
# une fois la vraie clé posée par marc (il a la clé age privée pour éditer
# secrets/common.yml en place).
# services.hermes-agent.mcpServers.pangolin = {
# command = "/nix/store/pw5hn1g2icm9ll7li8qiy1wkpdzvkcs1-pangolin-mcp/bin/pangolin-mcp";
# args = [ ];
# env = {
# PANGOLIN_BASE_URL = "https://pangolin.vps.marcpartensky.com/v1";
# PANGOLIN_API_KEY_FILE = config.sops.secrets."pangolin/api_key".path;
# };
# timeout = 60;
# };
# --- MCP Vaultwarden : temporairement désactivé (blocage sops manifest) ---
# services.hermes-agent.mcpServers.vaultwarden = {
# command = "vaultwarden-mcp";
@@ -387,7 +440,7 @@
# ~/.hermes-update-in-progress. Sans python3 dans le PATH ssh, TOUTE connexion
# Desktop en SSH echoue avec "Could not prove that the remote Hermes install
# is clear for SSH startup." (verifie le 27/09/2026)
environment.systemPackages = [pkgs.claude-code pkgs.python3];
environment.systemPackages = [claudeCode pkgs.python3];
sops.secrets."hermes_env" = {};
@@ -404,6 +457,12 @@
sopsFile = ../../secrets/discord-hermes-bridge.yml;
};
# Clé API Pangolin pour le MCP server (clé "pangolin/api_key" du fichier sops)
# À ajouter (chiffrée) dans secrets/common.yml, clé imbriquée pangolin.api_key.
# Commenté avec le bloc mcpServers.pangolin ci-dessus (29/09/2026) : la clé
# n'existe pas dans secrets/common.yml, ça faisait échouer tout switch.
# sops.secrets."pangolin/api_key" = {};
# Token Matrix du bot (@hermes) — clé "hermes_matrix_env" du fichier sops,
# valeur = contenu dotenv (MATRIX_ACCESS_TOKEN=...) fusionné dans .env.
# Déclaré uniquement là où l'option est active : les destinataires du fichier