recovery: recuperation commit local orphelin (master jamais pousse) - runbook-n8n-llm-bifrost.md
This commit is contained in:
parent
5671331680
commit
099e6baa30
|
|
@ -0,0 +1,94 @@
|
||||||
|
# RUNBOOK — Appels LLM depuis nœuds Code n8n : passer par Bifrost obligatoirement
|
||||||
|
|
||||||
|
**Date** : 2026-06-17
|
||||||
|
**Découvert lors** : Migration OpenCode Go veille IA — workflow VEILLE | Monitoring sources IA
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Problème
|
||||||
|
|
||||||
|
Les nœuds **Code** n8n (JavaScript) ne peuvent **pas** appeler `opencode.ai` directement.
|
||||||
|
Le container n8n est sur le réseau Docker `n8n` et n'a pas de connectivité sortante vers `opencode.ai`.
|
||||||
|
|
||||||
|
**Symptôme trompeur** : l'appel HTTPS semble réussir (pas de timeout, pas de `NET_ERR`), mais `choices[0].message.content` est vide ou `null`. Résultat : `JSON.parse("")` → `Unexpected end of JSON input`. Le workflow passe en `success` car le catch absorbe l'erreur silencieusement.
|
||||||
|
|
||||||
|
**Ce qui NE fonctionne PAS** depuis un nœud Code n8n :
|
||||||
|
- `https://opencode.ai/zen/go/v1/chat/completions` → contenu vide silencieux
|
||||||
|
- Tout endpoint LLM externe (openrouter, etc.) potentiellement concerné
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Solution
|
||||||
|
|
||||||
|
**Toujours passer par Bifrost** (réseau Docker interne, accessible depuis n8n) :
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const http = require('http');
|
||||||
|
|
||||||
|
const BIFROST_VK = 'bfk-e5832bfebd22e9d8252a426d0734ed5f2d923204c8033d6d'; // Nabil-Key
|
||||||
|
|
||||||
|
const body = JSON.stringify({
|
||||||
|
model: 'deepseek-v4-flash', // sans préfixe OpenRouter
|
||||||
|
max_tokens: 400,
|
||||||
|
stream: false,
|
||||||
|
temperature: 0.1,
|
||||||
|
messages: [{ role: 'user', content: '...' }]
|
||||||
|
});
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
hostname: 'bifrost', // nom du container Docker
|
||||||
|
port: 8080,
|
||||||
|
path: '/v1/chat/completions',
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'x-bf-vk': BIFROST_VK, // header Bifrost (PAS Authorization Bearer)
|
||||||
|
'Content-Length': Buffer.byteLength(body)
|
||||||
|
},
|
||||||
|
timeout: 60000
|
||||||
|
};
|
||||||
|
|
||||||
|
const req = http.request(options, (res) => { ... });
|
||||||
|
```
|
||||||
|
|
||||||
|
**Points critiques** :
|
||||||
|
- Utiliser `http` (pas `https`) car Bifrost est en HTTP interne
|
||||||
|
- Header : `x-bf-vk` (pas `Authorization: Bearer`) → 401 sinon
|
||||||
|
- Modèle : `deepseek-v4-flash` sans préfixe `deepseek/` (format OpenCode, pas OpenRouter)
|
||||||
|
- `stream: false` obligatoire
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Modèles disponibles via Bifrost
|
||||||
|
|
||||||
|
| Modèle | Notes |
|
||||||
|
|--------|-------|
|
||||||
|
| `deepseek-v4-flash` | ✅ Confirmé fonctionnel, rapide, JSON fiable |
|
||||||
|
| `deepseek-v4-pro` | ✅ Plus puissant |
|
||||||
|
| `glm-5.1` | ⚠️ Fait du chain-of-thought avant le JSON → tronque avec max_tokens bas |
|
||||||
|
| `kimi-k2.6` | ❌ Provider Moonshot AI down (521) au 17/06/2026 |
|
||||||
|
| `qwen3.7-plus` | ✅ Disponible |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## VKs Bifrost (SQLite `/volume1/docker/bifrost/data/config.db`)
|
||||||
|
|
||||||
|
| Nom | VK |
|
||||||
|
|-----|----|
|
||||||
|
| Nabil-Key | `bfk-e5832bfebd22e9d8252a426d0734ed5f2d923204c8033d6d` |
|
||||||
|
| Yesmine-Key | `bfk-1eb77f96379622db7264ae6692980e4cb81cde9e7435f66a` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Rappel : nœuds HTTP Request n8n natifs
|
||||||
|
|
||||||
|
Les nœuds **HTTP Request** (non-Code) utilisent les credentials n8n et peuvent avoir une connectivité différente. Le workflow VEILLE | Enrichissement articles utilise un nœud HTTP Request natif vers `http://bifrost:8080/v1/chat/completions` avec une credential `httpHeaderAuth` → fonctionne.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ce qui NE fonctionne PAS
|
||||||
|
|
||||||
|
- `opencode.ai` direct depuis nœud Code n8n → contenu vide silencieux
|
||||||
|
- `kimi-k2.6` via Bifrost → provider Moonshot AI en panne (code 521)
|
||||||
|
- `glm-5.1` pour JSON avec max_tokens < 800 → chain-of-thought tronque avant le JSON
|
||||||
|
- Préfixe `deepseek/deepseek-v4-flash` (format OpenRouter) sur OpenCode Go → 400 ou réponse sans choices
|
||||||
Loading…
Reference in New Issue