Views
No views yet
.data), tous au même rang → un seul base sert tous les rôles.Métaphore : le souffleur de théâtre. Le caller (souffleur-chat) décide et route ; les exécuteurs (souffleur-pdf,-xlsx-docx,-sandbox) produisent l'artefact. Le hot-swap = le même acteur (base) change de souffleur selon la scène.
souffleur-<role>-<version>.data).
La source de vérité des versions courantes = manifest.json (à la racine). Un client fetch ce
petit fichier en no-store, compare les version à son cache, et ne re-télécharge que le .data
changé. Détails d'intégration : voir HANDOFF-versioning-souffleurs.md dans le repo de lab.
Version actuelle : chat 0.2.0 (le caller redonne du code + route write_file(pdf)), exécuteurs 0.1.0.| Fichier | Rôle | Taille |
|---|---|---|
onnx/model_q4.onnx | graphe base r128 (slots LoRA int8, DequantizeLinear inline) | ~0.36 MB |
onnx/model_q4.onnx_data | poids base q4 (externes, partagés par tous les souffleurs) | ~795 MB |
config.json, generation_config.json, tokenizer*.json | tokenizer + config (chat_template inclus) | ~4.7 MB |
adapters/souffleur-chat.data | caller — routage + tool-calls | 86 MB |
adapters/souffleur-pdf.data | exécuteur PDF (jsPDF) | 86 MB |
adapters/souffleur-xlsx-docx.data | exécuteur tableur / doc | 86 MB |
adapters/souffleur-sandbox.data | exécuteur sandbox JS | 86 MB |
.data de 86 MB de plus. Rien d'autre ne bouge.souffleur-chat entraîné en
r64 puis padé r128 (lignes de rang nulles) pour partager le même base..data en int8 symétrique par canal (quant + DequantizeLinear, compute
FP32 restauré à l'exécution) → ÷4 vs fp32 : 340 MB → 86 MB, sans perte de
qualité mesurée (voir plus bas).model_q4.onnx_data) et un
placeholder adapter.data remappé vers le souffleur voulu. Hot-swap = même graphe,
autre .data.1import { pipeline } from '@huggingface/transformers'; // 4.2.0
2
3async function load(souffleur) {
4 return pipeline('text-generation', 'onnx/base', {
5 device: 'webgpu', dtype: 'q4', model_file_name: 'model',
6 session_options: { externalData: [
7 { path: 'model_q4.onnx_data', data: 'onnx/model_q4.onnx_data' },
8 { path: 'adapter.data', data: `adapters/${souffleur}.data` },
9 ] },
10 });
11}
12// caller -> décide ; puis hot-swap vers l'exécuteur choisi
13let pipe = await load('souffleur-chat'); // routage
14pipe = await load('souffleur-pdf'); // exécution (swap ~3.8 s, base en cache)souffleur-chat sur « Crée une facture PDF … 450 EUR HT »
→ émet write_file(kind="pdf", task="Créer une facture professionnelle … Total TTC : 450 EUR … paiement à 30 jours.") (tool-call pythonic complet, ~17 tok/s).souffleur-pdf en ~3.8 s (base en cache, on ne recharge que le .data).souffleur-pdf sur l'intent → code jsPDF valide (new jsPDF(), en-tête setFillColor/rect, N° FAC-2024-089, doc.output('blob')), ~13 tok/s.<|tool_call_start|>[name(args)]<|tool_call_end|> (parsé AST).
Le prompt système du caller = coeur sp-chat + List of tools: [JSON] + (si fichiers)
Files available: [{id,name,type}]. Deux règles apprises et critiques :file_id à l'identique, ne jamais l'inventer.compute pour tout calcul (jamais de calcul mental).vision_config), model_type: lfm2.
La vision se rebranche par hot-swap d'encodeur (hors de ce repo).in_proj,k_proj,out_proj,q_proj,v_proj,w1,w2,w3 ; scaling = 1.0 (alpha=r).adapter_config.json + chat_template) sont
dans le dossier souffleurs/<nom>/v0.1/ du repo de lab — utile pour re-quantifier ou
ré-entraîner. Ce repo-ci est le format de service (le plus léger).