sygal-cli 0.5.6 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -9,6 +9,23 @@ partagent toujours le même numéro de version, publiés ensemble, même si un
9
9
  seul a réellement changé de contenu — même principe que l'app desktop.
10
10
  Détails du process : `CLI_RELEASE_GUIDE.md` à la racine du repo.
11
11
 
12
+ ## 0.5.7
13
+
14
+ - Fix critique : 3 des 5 providers OCR étaient morts (modèles retirés côté fournisseur) —
15
+ `gpt-4o` (OpenAI, provider par défaut) retiré de l'API le 16/02/2026, `gemini-2.0-flash`
16
+ coupé le 01/06/2026, `nemotron-nano-12b-v2-vl` (NVIDIA) retiré le 26/08/2026. Remplacés
17
+ par `gpt-5.6-terra`, `gemini-3.7-flash` et `nemotron-ocr-v2` (OCR dédié, reconstruction
18
+ de la mise en page depuis les coordonnées). `packages/core`, partagé avec l'app desktop.
19
+
20
+ ## 0.5.6
21
+
22
+ - Fix critique : le sidecar `@sygal/sidecar-darwin-arm64` était compilé depuis un Python
23
+ installé via Homebrew, dont la bottle cible `MACOSX_DEPLOYMENT_TARGET=26` — le binaire
24
+ plantait au démarrage (`dlopen ... Symbol not found`) sur toute machine tournant sous
25
+ macOS antérieur à la version 26, malgré la compatibilité macOS 12+ annoncée. Rebuild
26
+ effectué depuis un Python installé via python.org (cible de déploiement basse), sans
27
+ changement de code source.
28
+
12
29
  ## 0.5.5
13
30
 
14
31
  - Fix : exporter un document dont le nom contient des caractères illégaux sur Windows/macOS
package/dist/index.js CHANGED
@@ -105,7 +105,15 @@ async function toPngBuffer(input) {
105
105
 
106
106
  // ../core/src/ocr-models.ts
107
107
  var OCR_MODELS = {
108
- openai: "gpt-4o",
108
+ // Bascule 02/09/2026 : gpt-4o retiré de l'API OpenAI le 16/02/2026 (recherche
109
+ // en direct — mort depuis 7 mois, provider par défaut de Sygal). Remplacé par
110
+ // gpt-5.6-terra (famille GPT-5.6, GA depuis 07/2026 : sol/terra/luna) — terra
111
+ // choisi pour l'équilibre coût/qualité sur de la lecture de document/écran,
112
+ // pas le tier flagship (sol, plus cher) ni économique (luna). Modèle
113
+ // "raisonneur" : voir openai-provider.ts pour les paramètres API affectés
114
+ // (max_tokens, temperature). Qualité réelle non validée sur cas réels
115
+ // (contrainte budget API de Cyrill) — à confirmer dès que possible.
116
+ openai: "gpt-5.6-terra",
109
117
  mistral: "mistral-ocr-latest",
110
118
  claude: "claude-sonnet-4-6",
111
119
  // Bascule 02/09/2026 : nemotron-nano-12b-v2-vl (et toute la lignée nemotron
@@ -117,7 +125,12 @@ var OCR_MODELS = {
117
125
  // de description d'image ni de traduction : NVIDIA_FALLBACK_MODEL
118
126
  // (llama-3.2-90b-vision-instruct) prend le relais pour ces deux cas.
119
127
  nvidia: "nvidia/nemotron-ocr-v2",
120
- gemini: "gemini-2.0-flash"
128
+ // Bascule 02/09/2026 : gemini-2.0-flash coupé par Google le 01/06/2026
129
+ // (recherche en direct — mort depuis 3 mois). Remplacé par gemini-3.7-flash
130
+ // (GA depuis 08/2026) — un seul choix clair côté Google à cette date, pas
131
+ // d'arbitrage de tier comme pour OpenAI. Qualité réelle non validée sur cas
132
+ // réels (contrainte budget API de Cyrill) — à confirmer dès que possible.
133
+ gemini: "gemini-3.7-flash"
121
134
  };
122
135
  var MISTRAL_TRANSLATE_MODEL = "mistral-large-latest";
123
136
  var NVIDIA_FALLBACK_MODEL = "meta/llama-3.2-90b-vision-instruct";
@@ -202,8 +215,8 @@ var SidecarManager = class {
202
215
  originImages: response.origin_images
203
216
  };
204
217
  }
205
- async convertUrl(url) {
206
- const response = await this.request({ id: (0, import_node_crypto.randomUUID)(), cmd: "convert_url", url });
218
+ async convertUrl(url, lang) {
219
+ const response = await this.request({ id: (0, import_node_crypto.randomUUID)(), cmd: "convert_url", url, lang });
207
220
  return {
208
221
  markdown: response.markdown ?? "",
209
222
  meta: response.meta ?? {},
@@ -348,11 +361,11 @@ var SidecarPool = class {
348
361
  this.inFlight.set(worker, Math.max(0, (this.inFlight.get(worker) ?? 1) - 1));
349
362
  }
350
363
  }
351
- async convertUrl(url) {
364
+ async convertUrl(url, lang) {
352
365
  const worker = this.pickWorker();
353
366
  this.inFlight.set(worker, (this.inFlight.get(worker) ?? 0) + 1);
354
367
  try {
355
- return await worker.convertUrl(url);
368
+ return await worker.convertUrl(url, lang);
356
369
  } finally {
357
370
  this.inFlight.set(worker, Math.max(0, (this.inFlight.get(worker) ?? 1) - 1));
358
371
  }
@@ -443,7 +456,7 @@ function httpStatusToOcrError(status, providerId) {
443
456
  function toDataUrl(img, mime) {
444
457
  return `data:${mime};base64,${img.toString("base64")}`;
445
458
  }
446
- async function callOpenAiCompatibleChatText(endpoint, model, apiKey, signal, prompt, text, providerId, maxTokens = 8192, frequencyPenalty) {
459
+ async function callOpenAiCompatibleChatText(endpoint, model, apiKey, signal, prompt, text, providerId, maxTokens = 8192, frequencyPenalty, reasoningModel = false) {
447
460
  const response = await fetch(endpoint, {
448
461
  method: "POST",
449
462
  signal,
@@ -453,9 +466,10 @@ async function callOpenAiCompatibleChatText(endpoint, model, apiKey, signal, pro
453
466
  },
454
467
  body: JSON.stringify({
455
468
  model,
456
- max_tokens: maxTokens,
457
- // Traduction = tâche déterministe : toute créativité est un bug ici.
458
- temperature: 0,
469
+ [reasoningModel ? "max_completion_tokens" : "max_tokens"]: maxTokens,
470
+ // Traduction = tâche déterministe : toute créativité est un bug ici
471
+ // (paramètre rejeté par les modèles raisonneurs, voir reasoningModel).
472
+ ...reasoningModel ? {} : { temperature: 0 },
459
473
  ...frequencyPenalty !== void 0 ? { frequency_penalty: frequencyPenalty } : {},
460
474
  // Consigne et document dans deux messages distincts : concaténés, un
461
475
  // document court était traité comme une simple amorce et le modèle
@@ -855,7 +869,8 @@ var openAiProvider = {
855
869
  },
856
870
  body: JSON.stringify({
857
871
  model: OPENAI_OCR_MODEL,
858
- max_tokens: 8192,
872
+ // gpt-5.6 (modèle raisonneur) rejette `max_tokens` — voir en-tête de fichier.
873
+ max_completion_tokens: 8192,
859
874
  messages: [
860
875
  {
861
876
  role: "user",
@@ -883,7 +898,11 @@ var openAiProvider = {
883
898
  signal,
884
899
  prompt,
885
900
  text,
886
- "openai"
901
+ "openai",
902
+ 8192,
903
+ void 0,
904
+ true
905
+ // gpt-5.6 : max_completion_tokens + pas de temperature, voir en-tête de fichier
887
906
  );
888
907
  }
889
908
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sygal-cli",
3
- "version": "0.5.6",
3
+ "version": "0.6.0",
4
4
  "description": "Sygal CLI - convert files and web pages to Markdown/JSON (local MarkItDown pipeline, OCR for images)",
5
5
  "author": "Cyrill Semah",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -37,9 +37,9 @@
37
37
  "@sygal/core": "0.1.0"
38
38
  },
39
39
  "optionalDependencies": {
40
- "@sygal/sidecar-darwin-arm64": "0.5.6",
41
- "@sygal/sidecar-win32-x64": "0.5.6",
42
- "@sygal/sidecar-linux-x64": "0.5.6"
40
+ "@sygal/sidecar-linux-x64": "0.6.0",
41
+ "@sygal/sidecar-win32-x64": "0.6.0",
42
+ "@sygal/sidecar-darwin-arm64": "0.6.0"
43
43
  },
44
44
  "scripts": {
45
45
  "build": "esbuild src/index.ts --bundle --platform=node --target=node20 --format=cjs --outfile=dist/index.js --external:sharp --external:gpt-tokenizer --external:commander --external:picocolors",