diff --git a/_INDEX.md b/_INDEX.md index a816ac9..3e6b579 100644 --- a/_INDEX.md +++ b/_INDEX.md @@ -71,3 +71,4 @@ | [Ports Registry NAS (source de verite etat des services)](common/ports-registry.md) | 2026-07-04 | infra, ports, registry, nas | | [Skill sobriete-code (7 regles Ponytail, hermes-tt + hermes-nyora)](common/sobriete-code-ponytail.md) | 2026-07-05 | dev, skill, code, tokens, couts, hermes-tt, hermes-nyora | | [Permissions credentials/cles - piege 777 et regle transverse (skill nas-ops)](common/permissions-credentials-cles-chmod.md) | 2026-07-05 | infra, securite, credentials, permissions, chmod | +| [Bifrost VK stale-cache + fallback OpenRouter vers OpenCode Go](common/bifrost-vk-stale-cache-et-fallback-opencode.md) | 2026-07-06 | infra, bifrost, hermes, opencode, openrouter, cout | diff --git a/common/bifrost-vk-stale-cache-et-fallback-opencode.md b/common/bifrost-vk-stale-cache-et-fallback-opencode.md new file mode 100644 index 0000000..39303c7 --- /dev/null +++ b/common/bifrost-vk-stale-cache-et-fallback-opencode.md @@ -0,0 +1,77 @@ +# Bifrost : VK stale-cache + migration fallback OpenRouter -> OpenCode Go + +**Instance auteur** : Claude (via mcp-nas) +**Date** : 2026-07-06 +**Tags** : infra, bifrost, hermes, opencode, openrouter, cout +**Statut** : valide + +## Probleme observe + +1. Pipeline nyora-veille (n8n workflow "VEILLE | Ingest Opportunites", node "Enrichir via Bifrost") + en echec repete (401 virtual_key_not_found) le 06/07 a 07:34 et 13:29-13:30 UTC, alors que le + x-bf-vk hardcode dans le node correspond exactement a la valeur Nabil-Key en base + (bfk-e5832bfebd22e9d8252a426d0734ed5f2d923204c8033d6d). Aucun cout facture (echec avant tout + routage provider). +2. hermes-nyora (mimo-v2.5, pilote 01-08/07) a bascule 2x le 05/07 (~21:38 et 21:48 UTC) sur son + fallback natif `fallback_providers: openrouter` (bypass Bifrost, cle OPENROUTER_API_KEY en + .env) suite a des reponses vides du pilote sur OpenCode. Cout reel facture sur OpenRouter, + hors quota epuise. +3. Bifrost logs.db (depuis 06/06) : 1370 appels reussis, 17,43$, VK non identifiee, modele + deepseek/deepseek-v4-flash sur OpenRouter -> trace de sessions Claude Cowork/Claude Code + routees via Bifrost et interceptees par une regle de routing. + +## Cause racine + +- Point 1 : cache Bifrost desynchronise (VK valide en base mais rejetee en memoire) -> **un simple + restart du container bifrost recharge correctement le VK store**. Meme famille de piege que + celui deja connu pour les cles provider (config.json au boot) : Bifrost ne recharge pas + systematiquement son etat interne sans redemarrage explicite. +- Point 2 : `fallback_providers` des 3 instances Hermes pointait vers `openrouter` (paye a l'usage) + au lieu de `opencode-go` (deja couvert par le forfait Go). Design d'origine (voir + migration-provider-opencode-go.md, 14/06) : a l'epoque volontaire comme filet de secours large, + mais genere une facturation reelle des qu'un modele opencode echoue (meme hors quota). +- Point 3 : regle de routing Bifrost `Haiku -> Gemini 2.5 Flash` (id + f5f03c54-049a-4f53-8590-7392730f42e0) avait un NOM ne correspondant pas a sa cible reelle en + base (deepseek/deepseek-v4-flash payant sur openrouter au lieu de gemini-2.5-flash gratuit sur + Google AI Studio). Les 4 autres regles Opus/Sonnet/Catch-all pointent, elles, vers des modeles + `:free` OpenRouter et sont correctes. + +## Solution appliquee (06/07/2026) + +1. `routing_targets` (config.db Bifrost) : rule f5f03c54... -> provider=google, + model=gemini-2.5-flash (etait openrouter/deepseek-v4-flash). Backup pris avant edit + (config.db.bak-). Restart container bifrost pour charger. +2. Les 3 `data/config.yaml` Hermes (hermes-tt, hermes-nyora, hermes-perso) : + `fallback_providers: openrouter/deepseek-v4-flash` -> `opencode-go/deepseek-v4-flash`, + `key_env: OPENCODE_GO_API_KEY` (nom reel de la var injectee par le compose top-level, pas + OPENCODE_API_KEY comme indique dans l'ancien runbook de migration). Backup des 3 fichiers pris + avant edit. Restart des 3 containers hermes-agent-* (perso a eu besoin d'un start manuel apres + le restart, le call restart API ayant timeout cote client -> verifier l'etat plutot que + de re-tenter en boucle). +3. Aucun changement necessaire sur le node n8n "Enrichir via Bifrost" : le restart bifrost a + suffi a corriger le probleme de VK stale. + +## Verification + +``` +curl -s --unix-socket /var/run/docker.sock http://localhost/containers//json | jq .State +# bifrost, hermes-agent-tt/nyora/perso : running + healthy apres restart + +curl -X POST http://bifrost:8080/v1/chat/completions -H 'x-bf-vk: ' \ + -d '{"model":"deepseek-v4-flash","max_tokens":30,"messages":[{"role":"user","content":"dis OK"}]}' +# HTTP 200, routing_info.provider=opencode -> confirme +``` + +## A surveiller + +- Si un 401 virtual_key_not_found reapparait sans changement de config -> suspecter a nouveau le + cache VK, restart bifrost avant toute autre investigation. +- Fiabilite mimo-v2.5 (reponses vides) non resolue en soi ; le fallback pointant desormais vers + opencode-go, tout echec futur du pilote restera gratuit (dans le forfait) au lieu d'etre facture. +- Auditer les 4 autres regles Opus/Sonnet/Catch-all : noms vs cibles reelles a revalider + periodiquement (meme type de desync que la regle Haiku). + +## References + +- migration-provider-opencode-go.md (14/06/2026) +- llm-audit-register.md (24/06/2026), item "N8n Ingest Opportunites"