feat(chatbot): mode profondeur côté serveur (rapide / approfondi) sur les 4 routes
Contrat unique `profondeur` ('rapide' | 'approfondi', défaut rapide) dans
utils/chatProfondeur.ts (libellés partagés). Les 3 routes Bifrost lisent
body.profondeur ?? body.mode, choisissent le tier (20b / 120b + replis), un
prompt système « réflexion » (Entraide, Réseaux, Taff) au même format JSON, et un
budget max_tokens adapté. Pensées lit body.profondeur (jamais body.mode, réservé à
LightRAG) : posture réflexion ajoutée au user_prompt + max_total_tokens 40000.
Modèle servi journalisé, et champ debug exposé uniquement en dev.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015vcVGz8i4WpZm2dixKUiSD
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
75d8440601
commit
80f69565aa
+43
-5
@@ -4,8 +4,9 @@
|
||||
* Auth : header x-bf-vk
|
||||
*
|
||||
* 2 tiers (Mission M3 du build Bifrost ; modèles primaires changés le 28/09, session AEP front 4) :
|
||||
* RAPIDE — défaut, pas de toggle UI mode rapide/approfondi sur le site actuellement
|
||||
* APPROFONDI — activable via body.mode === 'approfondi' (prêt pour un futur toggle front)
|
||||
* RAPIDE — défaut (mode « Question » du toggle front)
|
||||
* APPROFONDI — body.profondeur === 'approfondi' (mode « Réflexion plus profonde », B1-M3 ;
|
||||
* body.mode reste lu en compat ascendante). Contrat : utils/chatProfondeur.ts
|
||||
*
|
||||
* ⚠ 28/09 : Groq a retiré groq/llama-3.1-8b-instant (RAPIDE) et groq/llama-3.3-70b-versatile
|
||||
* (APPROFONDI) — 404 model_not_found via Bifrost. Depuis le 23/09 environ, chaque appel
|
||||
@@ -32,6 +33,8 @@
|
||||
* juste plus dans cette chaîne tant que ce n'est pas fiabilisé.
|
||||
*/
|
||||
|
||||
import { normaliserProfondeur, type ChatProfondeur } from '~/utils/chatProfondeur'
|
||||
|
||||
export const BIFROST_TIER_RAPIDE = {
|
||||
model: 'groq/openai/gpt-oss-20b',
|
||||
fallbacks: [
|
||||
@@ -57,11 +60,34 @@ export const BIFROST_TIER_APPROFONDI = {
|
||||
*/
|
||||
export const REASONING_MARGIN_TOKENS = 800
|
||||
|
||||
/** Sélectionne le tier selon le param optionnel body.mode. */
|
||||
export function pickBifrostTier(mode?: string) {
|
||||
return mode === 'approfondi' ? BIFROST_TIER_APPROFONDI : BIFROST_TIER_RAPIDE
|
||||
/** Sélectionne le tier selon la profondeur ('approfondi' → APPROFONDI, tout le reste → RAPIDE). */
|
||||
export function pickBifrostTier(profondeur?: string) {
|
||||
return profondeur === 'approfondi' ? BIFROST_TIER_APPROFONDI : BIFROST_TIER_RAPIDE
|
||||
}
|
||||
|
||||
/**
|
||||
* Profondeur demandée par le body : `profondeur`, sinon `mode` (compat ascendante des
|
||||
* routes Bifrost avant B1-M3). Valeur inconnue → 'rapide'.
|
||||
*/
|
||||
export function profondeurDuBody(body: any): ChatProfondeur {
|
||||
return normaliserProfondeur(body?.profondeur ?? body?.mode)
|
||||
}
|
||||
|
||||
/**
|
||||
* Budget max_tokens = contenu + marge de raisonnement. Le mode approfondi autorise une
|
||||
* réponse un peu plus longue (+200) et une marge plus large (+400) : le 120b raisonne plus.
|
||||
* Reste sous les limites par minute d'une clé Groq (prompt ~3-4 k + 2,2 k max).
|
||||
*/
|
||||
export function bifrostMaxTokens(contenu: number, profondeur: ChatProfondeur): number {
|
||||
return profondeur === 'approfondi'
|
||||
? contenu + 200 + REASONING_MARGIN_TOKENS + 400
|
||||
: contenu + REASONING_MARGIN_TOKENS
|
||||
}
|
||||
|
||||
/** Règle guillemets, commune à tous les prompts « réflexion » (cf. REGLE_CITATIONS de Pensées). */
|
||||
export const REGLE_GUILLEMETS =
|
||||
'Ne mets entre guillemets que ce qui figure mot pour mot dans le contexte fourni ; sinon reformule sans guillemets.'
|
||||
|
||||
export interface BifrostChatResponse {
|
||||
/** reasoning : présent avec gpt-oss, jamais lu (la réponse utile est dans content). */
|
||||
choices: { message: { content: string; reasoning?: string }; finish_reason?: string }[]
|
||||
@@ -69,6 +95,18 @@ export interface BifrostChatResponse {
|
||||
extra_fields?: { provider?: string; resolved_model_used?: string }
|
||||
}
|
||||
|
||||
/**
|
||||
* Preuve du tier réellement servi : journal serveur toujours (modèle dans le log seulement),
|
||||
* et champ `debug` dans la réponse UNIQUEMENT en dev (import.meta.dev, éliminé du build de
|
||||
* production). Aucun nom de modèle n'est exposé publiquement.
|
||||
*/
|
||||
export function bifrostDebug(res: BifrostChatResponse, route: string, profondeur: ChatProfondeur) {
|
||||
const modele = res.extra_fields?.resolved_model_used ?? null
|
||||
const fournisseur = res.extra_fields?.provider ?? null
|
||||
console.log(`[${route}] profondeur=${profondeur} fournisseur=${fournisseur} modèle=${modele}`)
|
||||
return import.meta.dev ? { debug: { profondeur, fournisseur, modele } } : {}
|
||||
}
|
||||
|
||||
/**
|
||||
* Contenu JSON de la réponse. Une troncature (finish_reason 'length') ne lève aucune erreur
|
||||
* et finit en message générique côté usager : on la signale au journal pour la voir.
|
||||
|
||||
Reference in New Issue
Block a user