parche-cli 0.6.1 → 0.6.2
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 +9 -0
- package/README.md +1 -1
- package/package.json +1 -1
- package/packs/ai.model-retirements.json +16 -3
- package/src/detectors/ai-model-retirements.js +18 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
Todas las versiones de `parche-cli` (npm) y de la Action `Pepo08/parche@v0`.
|
|
4
4
|
|
|
5
|
+
## 0.6.2 — 2026-10-18
|
|
6
|
+
|
|
7
|
+
Pack de IA completo para el apagado de OpenAI del **23/10/2026** (sección "2026-04-22: Legacy GPT model snapshots" de la página oficial, verificada el 18/10).
|
|
8
|
+
|
|
9
|
+
### Nuevo
|
|
10
|
+
- **Alias `-completions`:** `gpt-3.5-turbo-completions` (reemplazo `gpt-5.6-terra`), `gpt-4-completions`, `gpt-4-0613-completions` y `gpt-4-turbo-completions` (reemplazo `gpt-5.6-sol`).
|
|
11
|
+
- **Modelos fine-tuned:** se avisan los IDs reales (`ft:<modelo base>:<org>:<sufijo>:<id>`, también con `:ckpt-step-…`) de las familias que OpenAI apaga: `ft-gpt-3.5-turbo` y `ft-babbage-002`, `ft-davinci-002` y `ft-o4-mini-2025-04-16` (base de reemplazo `gpt-5.6-terra`), `ft-gpt-4` (`gpt-5.6-sol`) y `ft-gpt-4.1-nano-2025-04-14` (`gpt-5.6-luna`). Se compara el modelo base entero: `ft:gpt-4o-mini-…`, `ft:gpt-4o-…` y `ft:gpt-4.1-…` no son de `gpt-4` y no se avisan (OpenAI los apaga en otra fecha). Como siempre, Parche avisa y no cambia el modelo.
|
|
12
|
+
- El pack cita la guía de fine-tuning de OpenAI como fuente del formato de los IDs. `last_verified`: 2026-10-18 (Anthropic y el resto de OpenAI, revisados contra sus páginas ese día: sin cambios).
|
|
13
|
+
|
|
5
14
|
## 0.6.1 — 2026-10-18
|
|
6
15
|
|
|
7
16
|
Lo que encontró el frente de tracción al preparar los PRs con la 0.6.0.
|
package/README.md
CHANGED
|
@@ -131,7 +131,7 @@ Con el tag, el workflow corre los tests, controla que la versión de `package.js
|
|
|
131
131
|
|---|---|---|---|---|
|
|
132
132
|
| `arca.wsfe.condicion-iva-receptor` | ARCA | rompe | 2026-12-01 | sí, en JS (`afip.js`) y PHP (`afipsdk/afip.php` y forks): consumidor final y DNI B/C; con `DocTipo` en una variable, consumidor final al ejecutarse (PR parcial) |
|
|
133
133
|
| `mercadopago.payments-to-orders` | Mercado Pago | migración | — | sí (creación de pagos en SDK Node v2) |
|
|
134
|
-
| `ai.model-retirements` | Anthropic, OpenAI | retiro | varias | solo detección |
|
|
134
|
+
| `ai.model-retirements` | Anthropic, OpenAI | retiro | varias | solo detección (también modelos fine-tuned de OpenAI, `ft:…`) |
|
|
135
135
|
|
|
136
136
|
## Verificación
|
|
137
137
|
|
package/package.json
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "ai.model-retirements",
|
|
3
|
-
"version": "2026.10.
|
|
3
|
+
"version": "2026.10.18",
|
|
4
4
|
"provider": "Modelos de IA",
|
|
5
5
|
"title": "Modelos y endpoints de IA retirados o por retirarse",
|
|
6
6
|
"kind": "retirement",
|
|
7
7
|
"severity": "high",
|
|
8
8
|
"deadline": null,
|
|
9
|
-
"last_verified": "2026-10-
|
|
9
|
+
"last_verified": "2026-10-18",
|
|
10
10
|
"summary_es": "Tu código usa modelos o APIs de IA que ya no responden o tienen fecha de retiro.",
|
|
11
11
|
"why_es": "Los proveedores de modelos retiran IDs de modelo y endpoints con algunas semanas o meses de aviso. Después de la fecha, las llamadas fallan. Parche no reemplaza el modelo automáticamente porque cambiar de modelo cambia el comportamiento: te avisa, te dice la fecha y el reemplazo que recomienda el proveedor.",
|
|
12
12
|
"sources": [
|
|
13
13
|
{ "title": "Anthropic: Model deprecations", "url": "https://platform.claude.com/docs/en/about-claude/model-deprecations" },
|
|
14
|
-
{ "title": "OpenAI: Deprecations", "url": "https://developers.openai.com/api/docs/deprecations" }
|
|
14
|
+
{ "title": "OpenAI: Deprecations", "url": "https://developers.openai.com/api/docs/deprecations" },
|
|
15
|
+
{ "title": "OpenAI: Supervised fine-tuning (formato de los IDs ft:)", "url": "https://developers.openai.com/api/docs/guides/supervised-fine-tuning" }
|
|
15
16
|
],
|
|
16
17
|
"detect": {
|
|
17
18
|
"packages": ["@anthropic-ai/sdk", "openai"],
|
|
@@ -45,11 +46,15 @@
|
|
|
45
46
|
"o3-pro-2025-06-10": { "date": "2026-12-11", "replacement": "gpt-5.6-sol (reasoning.mode: pro)" },
|
|
46
47
|
"gpt-3.5-turbo": { "date": "2026-10-23", "replacement": "gpt-5.6-terra" },
|
|
47
48
|
"gpt-3.5-turbo-0125": { "date": "2026-10-23", "replacement": "gpt-5.6-terra" },
|
|
49
|
+
"gpt-3.5-turbo-completions": { "date": "2026-10-23", "replacement": "gpt-5.6-terra" },
|
|
48
50
|
"gpt-4": { "date": "2026-10-23", "replacement": "gpt-5.6-sol" },
|
|
49
51
|
"gpt-4-0613": { "date": "2026-10-23", "replacement": "gpt-5.6-sol" },
|
|
52
|
+
"gpt-4-completions": { "date": "2026-10-23", "replacement": "gpt-5.6-sol" },
|
|
53
|
+
"gpt-4-0613-completions": { "date": "2026-10-23", "replacement": "gpt-5.6-sol" },
|
|
50
54
|
"gpt-4-1106-preview": { "date": "2026-10-23", "replacement": "gpt-5.6-sol" },
|
|
51
55
|
"gpt-4-turbo": { "date": "2026-10-23", "replacement": "gpt-5.6-sol" },
|
|
52
56
|
"gpt-4-turbo-2024-04-09": { "date": "2026-10-23", "replacement": "gpt-5.6-sol" },
|
|
57
|
+
"gpt-4-turbo-completions": { "date": "2026-10-23", "replacement": "gpt-5.6-sol" },
|
|
53
58
|
"gpt-4.1-nano": { "date": "2026-10-23", "replacement": "gpt-5.6-luna" },
|
|
54
59
|
"gpt-4.1-nano-2025-04-14": { "date": "2026-10-23", "replacement": "gpt-5.6-luna" },
|
|
55
60
|
"gpt-4o-2024-05-13": { "date": "2026-10-23", "replacement": "gpt-5.6-sol" },
|
|
@@ -77,6 +82,14 @@
|
|
|
77
82
|
"chatgpt-4o-latest": { "date": "2026-02-17", "replacement": "gpt-5.1-chat-latest" },
|
|
78
83
|
"codex-mini-latest": { "date": "2026-02-12", "replacement": "gpt-5-codex-mini" }
|
|
79
84
|
},
|
|
85
|
+
"retired_fine_tunes": {
|
|
86
|
+
"ft-gpt-3.5-turbo": { "date": "2026-10-23", "replacement": "gpt-5.6-terra", "bases": ["gpt-3.5-turbo", "gpt-3.5-turbo-0125", "gpt-3.5-turbo-1106", "gpt-3.5-turbo-0613"] },
|
|
87
|
+
"ft-gpt-4": { "date": "2026-10-23", "replacement": "gpt-5.6-sol", "bases": ["gpt-4", "gpt-4-0613"] },
|
|
88
|
+
"ft-gpt-4.1-nano-2025-04-14": { "date": "2026-10-23", "replacement": "gpt-5.6-luna", "bases": ["gpt-4.1-nano-2025-04-14", "gpt-4.1-nano"] },
|
|
89
|
+
"ft-o4-mini-2025-04-16": { "date": "2026-10-23", "replacement": "gpt-5.6-terra", "bases": ["o4-mini-2025-04-16", "o4-mini"] },
|
|
90
|
+
"ft-babbage-002": { "date": "2026-10-23", "replacement": "gpt-5.6-terra", "bases": ["babbage-002"] },
|
|
91
|
+
"ft-davinci-002": { "date": "2026-10-23", "replacement": "gpt-5.6-terra", "bases": ["davinci-002"] }
|
|
92
|
+
},
|
|
80
93
|
"retirement_floors": {
|
|
81
94
|
"claude-haiku-4-5-20251001": "2026-10-15",
|
|
82
95
|
"claude-opus-4-5-20251101": "2026-11-24"
|
|
@@ -8,6 +8,10 @@ const PACK = 'ai.model-retirements';
|
|
|
8
8
|
|
|
9
9
|
const MODEL_CONTEXT = /\bmodel(?:Id|Name)?\b\s*[:=(]|["']model["']\s*[:=]|\b(?:DEFAULT|default)_?(?:MODEL|Model)\b|\bmodel\s*\(/i;
|
|
10
10
|
const AZURE = /azure|AzureOpenAI|openai\.azure\.com/i;
|
|
11
|
+
// Modelos fine-tuned de OpenAI: el ID real es `ft:<modelo base>:<org>:<sufijo>:<id>` (guía de fine-tuning).
|
|
12
|
+
// Se compara el modelo base entero, hasta el `:`, contra `bases` del pack: nunca un prefijo, porque
|
|
13
|
+
// `ft:gpt-4o-mini-2024-07-18:...` no es un fine-tuned de `gpt-4` y se apaga en otra fecha.
|
|
14
|
+
const FINE_TUNE = /["'`]ft:([\w.-]+):/g;
|
|
11
15
|
|
|
12
16
|
// Acepta el formato nuevo ({ date, replacement }) y el viejo (solo la fecha).
|
|
13
17
|
const entry = (v) => (typeof v === 'string' ? { date: v, replacement: null } : v);
|
|
@@ -17,6 +21,8 @@ export default function detect({ source, file, pack, today = new Date().toISOStr
|
|
|
17
21
|
const findings = [];
|
|
18
22
|
const usages = [];
|
|
19
23
|
const { retired_models: retired, retirement_floors: floors, retired_endpoints: endpoints } = pack.detect;
|
|
24
|
+
const fineTunes = new Map();
|
|
25
|
+
for (const [name, e] of Object.entries(pack.detect.retired_fine_tunes || {})) for (const b of e.bases) fineTunes.set(b, { name, ...e });
|
|
20
26
|
const azure = AZURE.test(source);
|
|
21
27
|
const lines = source.split('\n');
|
|
22
28
|
lines.forEach((l, i) => {
|
|
@@ -34,6 +40,18 @@ export default function detect({ source, file, pack, today = new Date().toISOStr
|
|
|
34
40
|
findings.push({ pack: PACK, file, line, status: 'detect-only', message });
|
|
35
41
|
usages.push({ provider: 'ia', op: `modelo ${model}`, line });
|
|
36
42
|
}
|
|
43
|
+
for (const [, base] of l.matchAll(FINE_TUNE)) {
|
|
44
|
+
const ft = fineTunes.get(base);
|
|
45
|
+
if (!ft) continue;
|
|
46
|
+
const past = ft.date <= today;
|
|
47
|
+
const when = past ? `fue retirado el ${ft.date}` : `se retira el ${ft.date}`;
|
|
48
|
+
const repl = `OpenAI recomienda como modelo base de reemplazo \`${ft.replacement}\`; el modelo fine-tuned no se migra solo.`;
|
|
49
|
+
const message = inCall
|
|
50
|
+
? `El modelo fine-tuned sobre \`${base}\` (\`${ft.name}\`) ${when}${past ? ': las llamadas ya fallan' : ''}. ${repl} Corré tus pruebas de prompts antes de cambiarlo.`
|
|
51
|
+
: `Aparece un modelo fine-tuned sobre \`${base}\` (\`${ft.name}\`, ${when}) fuera de una llamada: si es una lista o un catálogo de modelos, actualizalo. ${repl}`;
|
|
52
|
+
findings.push({ pack: PACK, file, line, status: 'detect-only', message });
|
|
53
|
+
usages.push({ provider: 'ia', op: `modelo fine-tuned ${base}`, line });
|
|
54
|
+
}
|
|
37
55
|
for (const [model, date] of Object.entries(floors)) {
|
|
38
56
|
if (!l.includes(model)) continue;
|
|
39
57
|
findings.push({ pack: PACK, file, line, status: 'detect-only',
|