karlexmarin Claude Opus 4.7 (1M context) commited on
Commit
2dbc41f
·
1 Parent(s): ed3d534

fix(i18n): cover modes section + form labels + tooltips that were missed

Browse files

The previous commit added data-i18n to most elements but missed:
- modes.title h2 (the '🎯 Mode' header)
- modes.tip tooltip (the 'Four ways to use the tool' explanation)
- All 4 mode tabs (Profile/Compare/Ask/Recipe buttons)
- modes.desc paragraph
- All form field labels in Profile mode (theta, T_train, T_eval, n_attn,
n_kv, d_head, n_layers, n_params, has_swa)
- All Profile form tooltips (param.theta.tip etc.)
- profile.tip and compare.tip tooltips
- Yes/No options in has_swa select

Plus added FULL help modal translations for all 4 languages (EN/ES/FR/ZH):
- help.title, help.what.title/body, help.modes.title/profile/compare/ask/recipe
- help.recipes.title, help.add_models.title/preset/hf/manual
- help.audit.title/body, help.synthesis.title/body
- help.params.title, help.verdicts.title + verdict.yes/deg/no
- help.privacy.title/body, help.source.title/body

Now switching to ES/FR/ZH actually translates everything visible.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Files changed (2) hide show
  1. index.html +22 -20
  2. js/i18n.js +196 -0
index.html CHANGED
@@ -151,19 +151,21 @@
151
 
152
  <!-- Mode toggle -->
153
  <section id="mode-section">
154
- <h2>🎯 Mode <span class="info"><span class="tooltip"><strong>Four ways to use the tool</strong>.<br>
 
155
  <strong>📇 Profile</strong>: paste a model id → all 5 recipes at once = TAF Card.<br>
156
  <strong>🆚 Compare</strong>: 2-3 models side-by-side on one recipe.<br>
157
  <strong>💬 Ask</strong>: free-form question, browser LLM picks the recipe.<br>
158
  <strong>📋 Recipe</strong>: manual selection with full form control.
159
- </span></span></h2>
 
160
  <div class="mode-tabs">
161
- <button class="mode-btn active" data-mode="profile">📇 Profile a model</button>
162
- <button class="mode-btn" data-mode="compare">🆚 Compare models</button>
163
- <button class="mode-btn" data-mode="ask">💬 Ask plain English</button>
164
- <button class="mode-btn" data-mode="recipe">📋 Pick recipe</button>
165
  </div>
166
- <p id="mode-desc" class="recipe-desc">
167
  <strong>Quickest start</strong>: paste any HuggingFace model id (e.g. <code>meta-llama/Meta-Llama-3-8B</code>),
168
  click Profile. See all 5 recipes scored in seconds.
169
  </p>
@@ -175,7 +177,7 @@
175
  💡 Quick start: pick any preset → click Generate. Or paste a model id from <a href='https://huggingface.co/models?library=transformers&sort=trending' target='_blank'>HF Hub trending</a> → 📥 Fetch → Generate.
176
  </div>
177
  <h2><span data-i18n="profile.title">📇 Profile a model</span>
178
- <span class="info"><span class="tooltip">
179
  <strong>One-click full diagnosis</strong>. Paste any HF model id (or pick preset).
180
  Tool runs all 5 recipes (long-context, KV-compression, custom-vs-API, budget,
181
  hardware) and produces a single <strong>TAF Card</strong> showing verdict per
@@ -207,42 +209,42 @@
207
 
208
  <div class="form-grid" id="profile-form">
209
  <div class="form-field">
210
- <label>θ (rope_theta) <span class="info"><span class="tooltip">RoPE base frequency from <code>config.rope_theta</code>.</span></span></label>
211
  <input type="number" id="profile-theta" value="500000" />
212
  </div>
213
  <div class="form-field">
214
- <label>T_train <span class="info"><span class="tooltip">Max training context. From <code>max_position_embeddings</code>.</span></span></label>
215
  <input type="number" id="profile-T_train" value="8192" />
216
  </div>
217
  <div class="form-field">
218
- <label>T_eval (your target) <span class="info"><span class="tooltip">Inference context length you'll actually serve. The key knob.</span></span></label>
219
  <input type="number" id="profile-T_eval" value="32000" />
220
  </div>
221
  <div class="form-field">
222
- <label>n_attention_heads</label>
223
  <input type="number" id="profile-n_attn" value="32" />
224
  </div>
225
  <div class="form-field">
226
- <label>n_kv_heads</label>
227
  <input type="number" id="profile-n_kv" value="8" />
228
  </div>
229
  <div class="form-field">
230
- <label>head_dim</label>
231
  <input type="number" id="profile-d_head" value="128" />
232
  </div>
233
  <div class="form-field">
234
- <label>n_layers</label>
235
  <input type="number" id="profile-n_layers" value="32" />
236
  </div>
237
  <div class="form-field">
238
- <label>n_params (e.g. 8e9)</label>
239
  <input type="text" id="profile-n_params" value="8e9" />
240
  </div>
241
  <div class="form-field">
242
- <label>Has SWA?</label>
243
  <select id="profile-has_swa">
244
- <option value="false" selected>No</option>
245
- <option value="true">Yes</option>
246
  </select>
247
  </div>
248
  </div>
@@ -256,7 +258,7 @@
256
  💡 Try: paste 3 popular 7-8B models (Meta-Llama-3-8B, Mistral-7B-v0.1, Qwen/Qwen2.5-7B), pick recipe X-2, T_eval=16000. See which best handles long context.
257
  </div>
258
  <h2><span data-i18n="compare.title">🆚 Compare models side-by-side</span>
259
- <span class="info"><span class="tooltip">
260
  <strong>Same recipe, multiple models</strong>. Pick 2-3 candidate models and
261
  one recipe. See verdicts in a single comparison table.<br><br>
262
  <strong>Use case</strong>: "I need long-context retrieval at 16K — which is
 
151
 
152
  <!-- Mode toggle -->
153
  <section id="mode-section">
154
+ <h2><span data-i18n="modes.title">🎯 Mode</span>
155
+ <span class="info"><span class="tooltip" data-i18n="modes.tip"><strong>Four ways to use the tool</strong>.<br>
156
  <strong>📇 Profile</strong>: paste a model id → all 5 recipes at once = TAF Card.<br>
157
  <strong>🆚 Compare</strong>: 2-3 models side-by-side on one recipe.<br>
158
  <strong>💬 Ask</strong>: free-form question, browser LLM picks the recipe.<br>
159
  <strong>📋 Recipe</strong>: manual selection with full form control.
160
+ </span></span>
161
+ </h2>
162
  <div class="mode-tabs">
163
+ <button class="mode-btn active" data-mode="profile" data-i18n="modes.profile">📇 Profile a model</button>
164
+ <button class="mode-btn" data-mode="compare" data-i18n="modes.compare">🆚 Compare models</button>
165
+ <button class="mode-btn" data-mode="ask" data-i18n="modes.ask">💬 Ask plain English</button>
166
+ <button class="mode-btn" data-mode="recipe" data-i18n="modes.recipe">📋 Pick recipe</button>
167
  </div>
168
+ <p id="mode-desc" class="recipe-desc" data-i18n="modes.desc">
169
  <strong>Quickest start</strong>: paste any HuggingFace model id (e.g. <code>meta-llama/Meta-Llama-3-8B</code>),
170
  click Profile. See all 5 recipes scored in seconds.
171
  </p>
 
177
  💡 Quick start: pick any preset → click Generate. Or paste a model id from <a href='https://huggingface.co/models?library=transformers&sort=trending' target='_blank'>HF Hub trending</a> → 📥 Fetch → Generate.
178
  </div>
179
  <h2><span data-i18n="profile.title">📇 Profile a model</span>
180
+ <span class="info"><span class="tooltip" data-i18n="profile.tip">
181
  <strong>One-click full diagnosis</strong>. Paste any HF model id (or pick preset).
182
  Tool runs all 5 recipes (long-context, KV-compression, custom-vs-API, budget,
183
  hardware) and produces a single <strong>TAF Card</strong> showing verdict per
 
209
 
210
  <div class="form-grid" id="profile-form">
211
  <div class="form-field">
212
+ <label><span data-i18n="param.theta">θ (rope_theta)</span> <span class="info"><span class="tooltip" data-i18n="param.theta.tip">RoPE base frequency from <code>config.rope_theta</code>.</span></span></label>
213
  <input type="number" id="profile-theta" value="500000" />
214
  </div>
215
  <div class="form-field">
216
+ <label><span data-i18n="param.T_train">T_train</span> <span class="info"><span class="tooltip" data-i18n="param.T_train.tip">Max training context. From <code>max_position_embeddings</code>.</span></span></label>
217
  <input type="number" id="profile-T_train" value="8192" />
218
  </div>
219
  <div class="form-field">
220
+ <label><span data-i18n="param.T_eval">T_eval (your target)</span> <span class="info"><span class="tooltip" data-i18n="param.T_eval.tip">Inference context length you'll actually serve. The key knob.</span></span></label>
221
  <input type="number" id="profile-T_eval" value="32000" />
222
  </div>
223
  <div class="form-field">
224
+ <label data-i18n="param.n_attn">n_attention_heads</label>
225
  <input type="number" id="profile-n_attn" value="32" />
226
  </div>
227
  <div class="form-field">
228
+ <label data-i18n="param.n_kv">n_kv_heads</label>
229
  <input type="number" id="profile-n_kv" value="8" />
230
  </div>
231
  <div class="form-field">
232
+ <label data-i18n="param.d_head">head_dim</label>
233
  <input type="number" id="profile-d_head" value="128" />
234
  </div>
235
  <div class="form-field">
236
+ <label data-i18n="param.n_layers">n_layers</label>
237
  <input type="number" id="profile-n_layers" value="32" />
238
  </div>
239
  <div class="form-field">
240
+ <label data-i18n="param.n_params">n_params (e.g. 8e9)</label>
241
  <input type="text" id="profile-n_params" value="8e9" />
242
  </div>
243
  <div class="form-field">
244
+ <label data-i18n="param.has_swa">Has SWA?</label>
245
  <select id="profile-has_swa">
246
+ <option value="false" selected data-i18n="common.no">No</option>
247
+ <option value="true" data-i18n="common.yes">Yes</option>
248
  </select>
249
  </div>
250
  </div>
 
258
  💡 Try: paste 3 popular 7-8B models (Meta-Llama-3-8B, Mistral-7B-v0.1, Qwen/Qwen2.5-7B), pick recipe X-2, T_eval=16000. See which best handles long context.
259
  </div>
260
  <h2><span data-i18n="compare.title">🆚 Compare models side-by-side</span>
261
+ <span class="info"><span class="tooltip" data-i18n="compare.tip">
262
  <strong>Same recipe, multiple models</strong>. Pick 2-3 candidate models and
263
  one recipe. See verdicts in a single comparison table.<br><br>
264
  <strong>Use case</strong>: "I need long-context retrieval at 16K — which is
js/i18n.js CHANGED
@@ -73,6 +73,55 @@ export const TRANSLATIONS = {
73
  "profile.hf_placeholder": "e.g. meta-llama/Meta-Llama-3-8B or Qwen/Qwen2.5-7B",
74
  "compare.hf_placeholder": "HF model id (e.g. meta-llama/Meta-Llama-3-8B)",
75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  "footer.text": "© 2026 Carles Marin · Apache-2.0 · independent research · the tool that closes the loop of the paper.",
77
  },
78
 
@@ -139,6 +188,55 @@ export const TRANSLATIONS = {
139
  "profile.hf_placeholder": "ej. meta-llama/Meta-Llama-3-8B o Qwen/Qwen2.5-7B",
140
  "compare.hf_placeholder": "ID modelo HF (ej. meta-llama/Meta-Llama-3-8B)",
141
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
142
  "footer.text": "© 2026 Carles Marin · Apache-2.0 · investigación independiente · la herramienta que cierra el círculo del paper.",
143
  },
144
 
@@ -205,6 +303,55 @@ export const TRANSLATIONS = {
205
  "profile.hf_placeholder": "ex. meta-llama/Meta-Llama-3-8B ou Qwen/Qwen2.5-7B",
206
  "compare.hf_placeholder": "ID modèle HF (ex. meta-llama/Meta-Llama-3-8B)",
207
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
208
  "footer.text": "© 2026 Carles Marin · Apache-2.0 · recherche indépendante · l'outil qui ferme la boucle du paper.",
209
  },
210
 
@@ -271,6 +418,55 @@ export const TRANSLATIONS = {
271
  "profile.hf_placeholder": "例如: meta-llama/Meta-Llama-3-8B 或 Qwen/Qwen2.5-7B",
272
  "compare.hf_placeholder": "HF 模型 id (例如: meta-llama/Meta-Llama-3-8B)",
273
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
274
  "footer.text": "© 2026 Carles Marin · Apache-2.0 · 独立研究 · 闭合论文回路的工具。",
275
  },
276
  };
 
73
  "profile.hf_placeholder": "e.g. meta-llama/Meta-Llama-3-8B or Qwen/Qwen2.5-7B",
74
  "compare.hf_placeholder": "HF model id (e.g. meta-llama/Meta-Llama-3-8B)",
75
 
76
+ // Form parameters
77
+ "param.theta": "θ (rope_theta)",
78
+ "param.theta.tip": "<strong>RoPE base frequency</strong> from <code>config.rope_theta</code>. Higher = more long-range capacity.",
79
+ "param.T_train": "T_train",
80
+ "param.T_train.tip": "<strong>Max training context</strong>. From <code>max_position_embeddings</code>. Beyond this is extrapolation.",
81
+ "param.T_eval": "T_eval (your target)",
82
+ "param.T_eval.tip": "<strong>Your target inference context</strong>. The whole question is: will the model behave well at THIS length?",
83
+ "param.n_attn": "num_attention_heads",
84
+ "param.n_kv": "num_key_value_heads",
85
+ "param.d_head": "head_dim",
86
+ "param.n_layers": "num_hidden_layers",
87
+ "param.n_params": "n_params (e.g. 8e9)",
88
+ "param.has_swa": "Has SWA?",
89
+ "common.yes": "Yes",
90
+ "common.no": "No",
91
+
92
+ // Mode tooltips
93
+ "modes.tip": "<strong>Four ways to use the tool</strong>.<br><strong>📇 Profile</strong>: paste a model id → all 5 recipes at once = TAF Card.<br><strong>🆚 Compare</strong>: 2-3 models side-by-side on one recipe.<br><strong>💬 Ask</strong>: free-form question, browser LLM picks the recipe.<br><strong>📋 Recipe</strong>: manual selection with full form control.",
94
+ "profile.tip": "<strong>One-click full diagnosis</strong>. Paste any HF model id (or pick preset). Tool runs all 5 recipes (long-context, KV-compression, custom-vs-API, budget, hardware) and produces a single <strong>TAF Card</strong> with verdict per dimension + key numbers + architecture classification.<br><br><strong>Use case</strong>: \"I'm evaluating Qwen2.5-32B for production — what's its full viability profile?\" → paste id → Profile → done.",
95
+ "compare.tip": "<strong>Same recipe, multiple models</strong>. Pick 2-3 candidate models and one recipe. See verdicts in a single comparison table.<br><br><strong>Use case</strong>: \"I need long-context retrieval at 16K — which is best: Llama-3-8B, Mistral-7B, or Qwen-7B?\" → pick 3 + X-2 + 16K → see winner.",
96
+
97
+ // Help modal
98
+ "help.title": "📘 TAF Agent — User Manual",
99
+ "help.what.title": "What does it do?",
100
+ "help.what.body": "Predicts <strong>practical viability</strong> of any transformer LLM <em>before you spend GPU/$</em>. Answers questions like \"will this model work at L=32K?\" or \"should I train custom or use API?\" using deterministic Python formulas (TAF — Thermodynamic Attention Framework).",
101
+ "help.modes.title": "How to use — 4 modes",
102
+ "help.modes.profile": "<strong>📇 Profile</strong>: paste model id → all recipes at once = TAF Card. <strong>Best starting point</strong>.",
103
+ "help.modes.compare": "<strong>🆚 Compare</strong>: 2-3 models side-by-side on same recipe. Best when choosing between candidates.",
104
+ "help.modes.ask": "<strong>💬 Ask plain English</strong>: free-form question, in-browser LLM picks the recipe. Best for casual exploration.",
105
+ "help.modes.recipe": "<strong>📋 Recipe + form</strong>: manual selection, full parameter control. Best when you want exact control.",
106
+ "help.recipes.title": "The 5 recipes available",
107
+ "help.add_models.title": "Adding new models (3 ways)",
108
+ "help.add_models.preset": "<strong>Preset list</strong>: 11 popular models curated. Just select from dropdown.",
109
+ "help.add_models.hf": "<strong>HF Hub fetch</strong>: paste any model id (e.g. <code>Qwen/Qwen2.5-32B-Instruct</code>), click 📥 Fetch. Browser downloads <code>config.json</code> directly from HuggingFace, fills the form. Works for any public model.",
110
+ "help.add_models.manual": "<strong>Manual</strong>: fill the form fields directly with values from the model card.",
111
+ "help.audit.title": "The audit chain",
112
+ "help.audit.body": "Every result shows the full <strong>Computation Chain</strong> — each formula step with its inputs, output, and interpretation. Click any step to expand. Cite section numbers (§26.1, §19.1, etc.) refer to the underlying paper for derivation.",
113
+ "help.synthesis.title": "The plain-English answer",
114
+ "help.synthesis.body": "After the deterministic chain runs, an in-browser LLM (Qwen2.5-0.5B, ~350MB cached after first load) synthesizes a plain-English summary. The numbers above are <em>always correct</em> (deterministic Python); the synthesis is LLM-generated — verify against the chain if in doubt.",
115
+ "help.params.title": "Common parameters explained",
116
+ "help.verdicts.title": "What to look for in verdicts",
117
+ "help.verdict.yes": "<strong style=\"color:#3fb950;\">YES / GO</strong> — proceed with confidence; numbers support the choice.",
118
+ "help.verdict.deg": "<strong style=\"color:#d29922;\">DEGRADED / TINY-MODEL</strong> — works but with caveats; read the action.",
119
+ "help.verdict.no": "<strong style=\"color:#f85149;\">NO / MEMORY-LIMITED</strong> — don't proceed as-is; mitigation provided.",
120
+ "help.privacy.title": "Privacy",
121
+ "help.privacy.body": "Everything runs in your browser. No telemetry, no analytics, no data sent anywhere. Even the LLM model runs locally via WebGPU/WebAssembly. Your model_ids and questions never leave this page.",
122
+ "help.source.title": "Source & paper",
123
+ "help.source.body": "Source code: <a href=\"https://github.com/karlesmarin/tafagent\" target=\"_blank\">github.com/karlesmarin/tafagent</a><br>Paper: <em>Marin 2026 — Transformer Thermodynamics</em> (arXiv forthcoming)",
124
+
125
  "footer.text": "© 2026 Carles Marin · Apache-2.0 · independent research · the tool that closes the loop of the paper.",
126
  },
127
 
 
188
  "profile.hf_placeholder": "ej. meta-llama/Meta-Llama-3-8B o Qwen/Qwen2.5-7B",
189
  "compare.hf_placeholder": "ID modelo HF (ej. meta-llama/Meta-Llama-3-8B)",
190
 
191
+ // Parámetros del formulario
192
+ "param.theta": "θ (rope_theta)",
193
+ "param.theta.tip": "<strong>Frecuencia base RoPE</strong> de <code>config.rope_theta</code>. Mayor = más capacidad de largo alcance.",
194
+ "param.T_train": "T_train",
195
+ "param.T_train.tip": "<strong>Contexto máximo de entrenamiento</strong>. De <code>max_position_embeddings</code>. Más allá es extrapolación.",
196
+ "param.T_eval": "T_eval (tu objetivo)",
197
+ "param.T_eval.tip": "<strong>Tu contexto de inferencia objetivo</strong>. La pregunta clave: ¿se comportará bien el modelo a ESTA longitud?",
198
+ "param.n_attn": "num_attention_heads",
199
+ "param.n_kv": "num_key_value_heads",
200
+ "param.d_head": "head_dim",
201
+ "param.n_layers": "num_hidden_layers",
202
+ "param.n_params": "n_params (ej. 8e9)",
203
+ "param.has_swa": "¿Tiene SWA?",
204
+ "common.yes": "Sí",
205
+ "common.no": "No",
206
+
207
+ // Tooltips de modos
208
+ "modes.tip": "<strong>Cuatro formas de usar la herramienta</strong>.<br><strong>📇 Perfil</strong>: pega un id → las 5 recetas a la vez = TAF Card.<br><strong>🆚 Comparar</strong>: 2-3 modelos lado a lado en una receta.<br><strong>💬 Pregunta</strong>: pregunta libre, el LLM del navegador elige la receta.<br><strong>📋 Receta</strong>: selección manual con control total del formulario.",
209
+ "profile.tip": "<strong>Diagnóstico completo en un click</strong>. Pega cualquier id de modelo HF (o elige preset). La herramienta ejecuta las 5 recetas (contexto largo, compresión KV, custom vs API, presupuesto, hardware) y produce una única <strong>TAF Card</strong> con veredicto por dimensión + números clave + clasificación arquitectónica.<br><br><strong>Caso de uso</strong>: \"Estoy evaluando Qwen2.5-32B para producción — ¿cuál es su perfil completo de viabilidad?\" → pega id → Perfilar → listo.",
210
+ "compare.tip": "<strong>Misma receta, múltiples modelos</strong>. Elige 2-3 modelos candidatos y una receta. Ve los veredictos en una única tabla comparativa.<br><br><strong>Caso de uso</strong>: \"Necesito recuperación de contexto largo a 16K — ¿cuál es mejor: Llama-3-8B, Mistral-7B o Qwen-7B?\" → elige 3 + X-2 + 16K → ve el ganador.",
211
+
212
+ // Modal de ayuda
213
+ "help.title": "📘 TAF Agent — Manual de Usuario",
214
+ "help.what.title": "¿Qué hace?",
215
+ "help.what.body": "Predice la <strong>viabilidad práctica</strong> de cualquier LLM transformer <em>antes de gastar GPU/€</em>. Responde preguntas como \"¿funcionará este modelo a L=32K?\" o \"¿debería entrenar custom o usar API?\" usando fórmulas Python deterministas (TAF — Thermodynamic Attention Framework).",
216
+ "help.modes.title": "Cómo usar — 4 modos",
217
+ "help.modes.profile": "<strong>📇 Perfilar</strong>: pega id de modelo → todas las recetas a la vez = TAF Card. <strong>Mejor punto de inicio</strong>.",
218
+ "help.modes.compare": "<strong>🆚 Comparar</strong>: 2-3 modelos lado a lado en la misma receta. Mejor al elegir entre candidatos.",
219
+ "help.modes.ask": "<strong>💬 Pregunta libre</strong>: pregunta en lenguaje natural, el LLM del navegador elige la receta. Mejor para exploración casual.",
220
+ "help.modes.recipe": "<strong>📋 Receta + formulario</strong>: selección manual, control total de parámetros. Mejor cuando quieres control exacto.",
221
+ "help.recipes.title": "Las 5 recetas disponibles",
222
+ "help.add_models.title": "Añadir nuevos modelos (3 maneras)",
223
+ "help.add_models.preset": "<strong>Lista de presets</strong>: 11 modelos populares curados. Selecciona del dropdown.",
224
+ "help.add_models.hf": "<strong>HF Hub fetch</strong>: pega cualquier id (ej. <code>Qwen/Qwen2.5-32B-Instruct</code>), click 📥 Cargar. El navegador descarga <code>config.json</code> directamente de HuggingFace, llena el formulario. Funciona con cualquier modelo público.",
225
+ "help.add_models.manual": "<strong>Manual</strong>: rellena los campos directamente con valores de la model card.",
226
+ "help.audit.title": "La cadena auditable",
227
+ "help.audit.body": "Cada resultado muestra la <strong>Cadena de Cálculo</strong> completa — cada paso de fórmula con sus entradas, salida e interpretación. Click en cualquier paso para expandir. Las referencias de sección (§26.1, §19.1, etc.) apuntan al paper para la derivación.",
228
+ "help.synthesis.title": "La respuesta en lenguaje natural",
229
+ "help.synthesis.body": "Tras ejecutar la cadena determinista, un LLM en el navegador (Qwen2.5-0.5B, ~350MB cacheado tras primera carga) sintetiza un resumen en lenguaje natural. Los números arriba son <em>siempre correctos</em> (Python determinista); la síntesis la genera el LLM — verifica contra la cadena si dudas.",
230
+ "help.params.title": "Parámetros comunes explicados",
231
+ "help.verdicts.title": "Qué mirar en los veredictos",
232
+ "help.verdict.yes": "<strong style=\"color:#3fb950;\">SÍ / GO</strong> — procede con confianza; los números apoyan la elección.",
233
+ "help.verdict.deg": "<strong style=\"color:#d29922;\">DEGRADADO / TINY-MODEL</strong> — funciona con caveats; lee la acción.",
234
+ "help.verdict.no": "<strong style=\"color:#f85149;\">NO / MEMORY-LIMITED</strong> — no procedas tal cual; se da mitigación.",
235
+ "help.privacy.title": "Privacidad",
236
+ "help.privacy.body": "Todo corre en tu navegador. Sin telemetría, sin analytics, sin datos enviados a ningún sitio. Incluso el modelo LLM corre localmente vía WebGPU/WebAssembly. Tus model_ids y preguntas nunca abandonan esta página.",
237
+ "help.source.title": "Código fuente y paper",
238
+ "help.source.body": "Código: <a href=\"https://github.com/karlesmarin/tafagent\" target=\"_blank\">github.com/karlesmarin/tafagent</a><br>Paper: <em>Marin 2026 — Transformer Thermodynamics</em> (arXiv próximamente)",
239
+
240
  "footer.text": "© 2026 Carles Marin · Apache-2.0 · investigación independiente · la herramienta que cierra el círculo del paper.",
241
  },
242
 
 
303
  "profile.hf_placeholder": "ex. meta-llama/Meta-Llama-3-8B ou Qwen/Qwen2.5-7B",
304
  "compare.hf_placeholder": "ID modèle HF (ex. meta-llama/Meta-Llama-3-8B)",
305
 
306
+ // Paramètres du formulaire
307
+ "param.theta": "θ (rope_theta)",
308
+ "param.theta.tip": "<strong>Fréquence de base RoPE</strong> de <code>config.rope_theta</code>. Plus haut = plus de capacité longue portée.",
309
+ "param.T_train": "T_train",
310
+ "param.T_train.tip": "<strong>Contexte max d'entraînement</strong>. De <code>max_position_embeddings</code>. Au-delà c'est de l'extrapolation.",
311
+ "param.T_eval": "T_eval (votre cible)",
312
+ "param.T_eval.tip": "<strong>Votre contexte d'inférence cible</strong>. La question clé : le modèle se comportera-t-il bien à CETTE longueur ?",
313
+ "param.n_attn": "num_attention_heads",
314
+ "param.n_kv": "num_key_value_heads",
315
+ "param.d_head": "head_dim",
316
+ "param.n_layers": "num_hidden_layers",
317
+ "param.n_params": "n_params (ex. 8e9)",
318
+ "param.has_swa": "A SWA ?",
319
+ "common.yes": "Oui",
320
+ "common.no": "Non",
321
+
322
+ // Tooltips des modes
323
+ "modes.tip": "<strong>Quatre façons d'utiliser l'outil</strong>.<br><strong>📇 Profil</strong>: collez un id → les 5 recettes à la fois = TAF Card.<br><strong>🆚 Comparer</strong>: 2-3 modèles côte à côte sur une recette.<br><strong>💬 Question</strong>: question libre, le LLM du navigateur choisit la recette.<br><strong>📋 Recette</strong>: sélection manuelle avec contrôle total du formulaire.",
324
+ "profile.tip": "<strong>Diagnostic complet en un clic</strong>. Collez n'importe quel id de modèle HF (ou choisissez préréglage). L'outil exécute les 5 recettes (contexte long, compression KV, custom vs API, budget, hardware) et produit une <strong>TAF Card</strong> unique avec verdict par dimension + nombres clés + classification architecturale.<br><br><strong>Cas d'usage</strong>: « J'évalue Qwen2.5-32B pour la production — quel est son profil complet de viabilité ? » → collez id → Profiler → fait.",
325
+ "compare.tip": "<strong>Même recette, plusieurs modèles</strong>. Choisissez 2-3 modèles candidats et une recette. Voyez les verdicts dans un seul tableau comparatif.<br><br><strong>Cas d'usage</strong>: « J'ai besoin de récupération longue contexte à 16K — quel est le meilleur : Llama-3-8B, Mistral-7B ou Qwen-7B ? » → choisissez 3 + X-2 + 16K → voyez le gagnant.",
326
+
327
+ // Modal d'aide
328
+ "help.title": "📘 TAF Agent — Manuel d'utilisation",
329
+ "help.what.title": "Que fait-il ?",
330
+ "help.what.body": "Prédit la <strong>viabilité pratique</strong> de tout LLM transformer <em>avant de dépenser du GPU/€</em>. Répond à des questions comme « ce modèle fonctionnera-t-il à L=32K ? » ou « dois-je entraîner sur mesure ou utiliser une API ? » via des formules Python déterministes (TAF — Thermodynamic Attention Framework).",
331
+ "help.modes.title": "Comment l'utiliser — 4 modes",
332
+ "help.modes.profile": "<strong>📇 Profiler</strong>: collez id de modèle → toutes les recettes à la fois = TAF Card. <strong>Meilleur point de départ</strong>.",
333
+ "help.modes.compare": "<strong>🆚 Comparer</strong>: 2-3 modèles côte à côte sur la même recette. Mieux pour choisir entre candidats.",
334
+ "help.modes.ask": "<strong>💬 Question libre</strong>: question en langage naturel, le LLM du navigateur choisit la recette. Mieux pour exploration casuelle.",
335
+ "help.modes.recipe": "<strong>📋 Recette + formulaire</strong>: sélection manuelle, contrôle total des paramètres. Mieux quand vous voulez un contrôle exact.",
336
+ "help.recipes.title": "Les 5 recettes disponibles",
337
+ "help.add_models.title": "Ajouter de nouveaux modèles (3 façons)",
338
+ "help.add_models.preset": "<strong>Liste de préréglages</strong>: 11 modèles populaires curés. Sélectionnez dans le dropdown.",
339
+ "help.add_models.hf": "<strong>HF Hub fetch</strong>: collez n'importe quel id (ex. <code>Qwen/Qwen2.5-32B-Instruct</code>), cliquez 📥 Charger. Le navigateur télécharge <code>config.json</code> directement de HuggingFace, remplit le formulaire. Fonctionne avec tout modèle public.",
340
+ "help.add_models.manual": "<strong>Manuel</strong>: remplissez les champs directement avec les valeurs de la model card.",
341
+ "help.audit.title": "La chaîne auditable",
342
+ "help.audit.body": "Chaque résultat montre la <strong>Chaîne de Calcul</strong> complète — chaque étape de formule avec ses entrées, sortie et interprétation. Cliquez sur n'importe quelle étape pour développer. Les références de section (§26.1, §19.1, etc.) renvoient au paper pour la dérivation.",
343
+ "help.synthesis.title": "La réponse en langage naturel",
344
+ "help.synthesis.body": "Après exécution de la chaîne déterministe, un LLM dans le navigateur (Qwen2.5-0.5B, ~350MB cachés après premier chargement) synthétise un résumé en langage naturel. Les nombres ci-dessus sont <em>toujours corrects</em> (Python déterministe) ; la synthèse est générée par LLM — vérifiez contre la chaîne en cas de doute.",
345
+ "help.params.title": "Paramètres communs expliqués",
346
+ "help.verdicts.title": "Quoi regarder dans les verdicts",
347
+ "help.verdict.yes": "<strong style=\"color:#3fb950;\">OUI / GO</strong> — procédez avec confiance ; les nombres soutiennent le choix.",
348
+ "help.verdict.deg": "<strong style=\"color:#d29922;\">DÉGRADÉ / TINY-MODEL</strong> — fonctionne avec caveats ; lisez l'action.",
349
+ "help.verdict.no": "<strong style=\"color:#f85149;\">NON / MEMORY-LIMITED</strong> — ne procédez pas tel quel ; mitigation fournie.",
350
+ "help.privacy.title": "Confidentialité",
351
+ "help.privacy.body": "Tout s'exécute dans votre navigateur. Pas de télémétrie, pas d'analytique, pas de données envoyées ailleurs. Même le modèle LLM s'exécute localement via WebGPU/WebAssembly. Vos model_ids et questions ne quittent jamais cette page.",
352
+ "help.source.title": "Code source et paper",
353
+ "help.source.body": "Code : <a href=\"https://github.com/karlesmarin/tafagent\" target=\"_blank\">github.com/karlesmarin/tafagent</a><br>Paper : <em>Marin 2026 — Transformer Thermodynamics</em> (arXiv à venir)",
354
+
355
  "footer.text": "© 2026 Carles Marin · Apache-2.0 · recherche indépendante · l'outil qui ferme la boucle du paper.",
356
  },
357
 
 
418
  "profile.hf_placeholder": "例如: meta-llama/Meta-Llama-3-8B 或 Qwen/Qwen2.5-7B",
419
  "compare.hf_placeholder": "HF 模型 id (例如: meta-llama/Meta-Llama-3-8B)",
420
 
421
+ // 表单参数
422
+ "param.theta": "θ (rope_theta)",
423
+ "param.theta.tip": "<strong>RoPE 基础频率</strong> 来自 <code>config.rope_theta</code>。越高 = 长程能力越强。",
424
+ "param.T_train": "T_train",
425
+ "param.T_train.tip": "<strong>训练最大上下文</strong>。来自 <code>max_position_embeddings</code>。超出此范围属于外推。",
426
+ "param.T_eval": "T_eval (您的目标)",
427
+ "param.T_eval.tip": "<strong>您的目标推理上下文</strong>。关键问题: 模型在 <em>这个</em> 长度下表现是否良好?",
428
+ "param.n_attn": "num_attention_heads",
429
+ "param.n_kv": "num_key_value_heads",
430
+ "param.d_head": "head_dim",
431
+ "param.n_layers": "num_hidden_layers",
432
+ "param.n_params": "n_params (例如 8e9)",
433
+ "param.has_swa": "有 SWA 吗?",
434
+ "common.yes": "是",
435
+ "common.no": "否",
436
+
437
+ // 模式提示
438
+ "modes.tip": "<strong>四种使用方式</strong>。<br><strong>📇 画像</strong>: 粘贴模型 id → 一次运行所有 5 个配方 = TAF 卡。<br><strong>🆚 比较</strong>: 2-3 个模型在一个配方上并排比较。<br><strong>💬 提问</strong>: 自由形式问题,浏览器 LLM 选择配方。<br><strong>📋 配方</strong>: 手动选择,完全控制表单。",
439
+ "profile.tip": "<strong>一键完整诊断</strong>。粘贴任意 HF 模型 id (或选择预设)。工具运行所有 5 个配方 (长上下文、KV 压缩、自定义 vs API、预算、硬件),生成单个 <strong>TAF 卡</strong>,显示每个维度的判定 + 关键数字 + 架构分类。<br><br><strong>用例</strong>: \"我正在为生产评估 Qwen2.5-32B — 它的完整可行性概况是什么?\" → 粘贴 id → 画像 → 完成。",
440
+ "compare.tip": "<strong>同一配方,多个模型</strong>。选择 2-3 个候选模型和一个配方。在单个比较表中查看判定。<br><br><strong>用例</strong>: \"我需要在 16K 进行长上下文检索 — 哪个最好: Llama-3-8B、Mistral-7B 或 Qwen-7B?\" → 选择 3 个 + X-2 + 16K → 看赢家。",
441
+
442
+ // 帮助模态框
443
+ "help.title": "📘 TAF Agent — 用户手册",
444
+ "help.what.title": "它做什么?",
445
+ "help.what.body": "在<em>花费 GPU/$ 之前</em>,预测任意 transformer LLM 的<strong>实际可行性</strong>。回答诸如 \"这个模型能在 L=32K 工作吗?\" 或 \"我应该自定义训练还是使用 API?\" 等问题,使用确定性 Python 公式 (TAF — Thermodynamic Attention Framework)。",
446
+ "help.modes.title": "如何使用 — 4 种模式",
447
+ "help.modes.profile": "<strong>📇 画像</strong>: 粘贴模型 id → 同时运行所有配方 = TAF 卡。<strong>最佳起点</strong>。",
448
+ "help.modes.compare": "<strong>🆚 比较</strong>: 2-3 个模型在同一配方上并排。最适合在候选者之间选择。",
449
+ "help.modes.ask": "<strong>💬 自由提问</strong>: 自然语言问题,浏览器 LLM 选择配方。最适合随意探索。",
450
+ "help.modes.recipe": "<strong>📋 配方 + 表单</strong>: 手动选择,完全控制参数。最适合需要精确控制时。",
451
+ "help.recipes.title": "可用的 5 个配方",
452
+ "help.add_models.title": "添加新模型 (3 种方式)",
453
+ "help.add_models.preset": "<strong>预设列表</strong>: 11 个流行模型已策划。从下拉菜单选择。",
454
+ "help.add_models.hf": "<strong>HF Hub 获取</strong>: 粘贴任意 id (例如 <code>Qwen/Qwen2.5-32B-Instruct</code>),点击 📥 获取。浏览器直接从 HuggingFace 下载 <code>config.json</code>,填充表单。适用于任何公共模型。",
455
+ "help.add_models.manual": "<strong>手动</strong>: 用模型卡的值直接填充表单字段。",
456
+ "help.audit.title": "可审计链",
457
+ "help.audit.body": "每个结果都显示完整的<strong>计算链</strong> — 每个公式步骤及其输入、输出和解释。点击任意步骤展开。引用的章节号 (§26.1、§19.1 等) 指向论文中的推导。",
458
+ "help.synthesis.title": "自然语言回答",
459
+ "help.synthesis.body": "在确定性链运行后,浏览器中的 LLM (Qwen2.5-0.5B,首次加载后约 350MB 缓存) 综合自然语言摘要。上面的数字<em>始终正确</em> (确定性 Python);综合由 LLM 生成 — 如有疑问,请对照链验证。",
460
+ "help.params.title": "常见参数解释",
461
+ "help.verdicts.title": "判定中要看什么",
462
+ "help.verdict.yes": "<strong style=\"color:#3fb950;\">是 / GO</strong> — 自信地继续;数字支持选择。",
463
+ "help.verdict.deg": "<strong style=\"color:#d29922;\">降级 / TINY-MODEL</strong> — 有警告地工作;阅读操作。",
464
+ "help.verdict.no": "<strong style=\"color:#f85149;\">否 / MEMORY-LIMITED</strong> — 不要按原样进行;提供缓解措施。",
465
+ "help.privacy.title": "隐私",
466
+ "help.privacy.body": "一切都在您的浏览器中运行。无遥测,无分析,无数据发送到任何地方。即使是 LLM 模型也通过 WebGPU/WebAssembly 在本地运行。您的 model_ids 和问题永不离开此页面。",
467
+ "help.source.title": "源代码和论文",
468
+ "help.source.body": "源代码: <a href=\"https://github.com/karlesmarin/tafagent\" target=\"_blank\">github.com/karlesmarin/tafagent</a><br>论文: <em>Marin 2026 — Transformer Thermodynamics</em> (arXiv 即将)",
469
+
470
  "footer.text": "© 2026 Carles Marin · Apache-2.0 · 独立研究 · 闭合论文回路的工具。",
471
  },
472
  };