parche-cli 0.6.2 → 0.6.4
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 +35 -0
- package/README.md +1 -1
- package/package.json +1 -1
- package/packs/ai.model-retirements.json +78 -4
- package/src/detectors/ai-model-retirements.js +33 -8
- package/src/inventory/js-scan.js +4 -3
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,41 @@
|
|
|
2
2
|
|
|
3
3
|
Todas las versiones de `parche-cli` (npm) y de la Action `Pepo08/parche@v0`.
|
|
4
4
|
|
|
5
|
+
## 0.6.4 — 2026-10-18
|
|
6
|
+
|
|
7
|
+
Pack de IA con los productos que OpenAI cierra y no son modelos (página de deprecaciones verificada el 18/10; cómo se usa cada uno, de la referencia oficial de la API y de los SDKs de Node y Python). Como siempre, Parche avisa con la fecha y el reemplazo oficial, y no toca el código.
|
|
8
|
+
|
|
9
|
+
### Nuevo
|
|
10
|
+
- **Prompts reutilizables (cierran el 30/11/2026):** los IDs de objetos de prompt entre comillas (`"pmpt_…"`, como en `responses.create({ prompt: { id: "pmpt_…" } })`, en cualquier lenguaje) y las llamadas a `api.openai.com/v1/prompts`. Reemplazo: pasar el contenido del prompt al código y mandarlo en `input` de la Responses API.
|
|
11
|
+
- **Plataforma de Evals (solo lectura el 31/10, cierre el 30/11/2026):** los métodos del SDK (`evals.create`, `evals.retrieve`, `evals.update`, `evals.list`, `evals.delete`, `evals.runs.*` y `evals.runs.outputItems.*` / `output_items.*`) y `/v1/evals`. El aviso dice que las evals existentes pasan a solo lectura el 31/10 (y, desde ese día, que ya lo están). Reemplazo: Promptfoo, el que recomienda OpenAI.
|
|
12
|
+
- **Agent Builder (cierra el 30/11/2026):** no tiene API propia; lo que queda en el código es la sesión de ChatKit que corre un workflow de Agent Builder (`beta.chatkit.sessions.create`, que siempre pide un `workflow`, y `/v1/chatkit/sessions`). Reemplazo: exportar el workflow como código del Agents SDK y conectar ChatKit a un servidor propio. ChatKit sigue.
|
|
13
|
+
- **Menos falsos positivos:** `.evals.…(`, `/v1/evals`, `chatkit.sessions.create` y `/v1/chatkit/sessions` solo cuentan si el archivo importa el SDK oficial de OpenAI (JS o Python) o nombra `api.openai.com`; `/v1/prompts` solo con el host de OpenAI (Portkey usa `/v1/prompts/:id/completions`). En Azure OpenAI no se dan por cerrados con la fecha de OpenAI.
|
|
14
|
+
|
|
15
|
+
### Todavía no cubre
|
|
16
|
+
- Un ID de prompt o de workflow que llega por variable de entorno o configuración, y `/v1/evals` o ChatKit por HTTP con la URL armada en otro archivo.
|
|
17
|
+
- Los SDKs de Go, Java, .NET y Ruby para Evals y ChatKit (sí se ven los IDs `pmpt_…` y las URLs con `api.openai.com`).
|
|
18
|
+
- La Videos API (cerrada el 24/9/2026; sí se avisan los modelos `sora-2`), las familias de audio y realtime sin IDs en la página y lo que OpenAI apagó antes de 2026.
|
|
19
|
+
|
|
20
|
+
## 0.6.3 — 2026-10-18
|
|
21
|
+
|
|
22
|
+
Pack de IA con el resto de la página de deprecaciones de OpenAI (verificada fila por fila el 18/10): los modelos que se apagan desde 2026. Como siempre, Parche avisa con la fecha y el reemplazo oficial, y no cambia el modelo.
|
|
23
|
+
|
|
24
|
+
### Nuevo
|
|
25
|
+
- **Lo que viene:**
|
|
26
|
+
- 1/12/2026: `gpt-image-1-mini`, `gpt-image-1.5` y `chatgpt-image-latest` (reemplazo `gpt-image-2.5-sunburst` o `gpt-image-2.5-flare`).
|
|
27
|
+
- 6/1/2027: voz con `tts-1`, `tts-1-hd` y los snapshots `gpt-4o-mini-tts-2025-03-20` y `-2025-12-15` (`gpt-realtime-2.1-mini`).
|
|
28
|
+
- 14/1/2027: los snapshots `gpt-4o-2024-08-06`, `gpt-4o-2024-11-20`, `gpt-4o-mini-2024-07-18`, `gpt-4.1-2025-04-14` y `gpt-4.1-mini-2025-04-14` (`gpt-6-luna`), y sus modelos fine-tuned (`ft:…`), que se apagan con su modelo base. Los alias `gpt-4o`, `gpt-4o-mini`, `gpt-4.1` y `gpt-4.1-mini` no figuran en la página y no se avisan; un fine-tuned sobre el alias se avisa solo cuando ese alias tiene un único snapshot (no es el caso de `gpt-4o`).
|
|
29
|
+
- 20/1/2027: las familias `gpt-realtime`, `gpt-realtime-mini`, `gpt-audio` y `gpt-audio-mini` (alias y snapshots) y `gpt-4o-mini-transcribe-2025-03-20`.
|
|
30
|
+
- 26/2/2027: transcripción con `whisper-1`, `gpt-4o-transcribe`, `gpt-4o-mini-transcribe` y `gpt-4o-transcribe-diarize` (`gpt-live-transcribe` o `gpt-transcribe`). El aviso de `whisper-1` dice además que `/v1/audio/translations` cierra ese día.
|
|
31
|
+
- 1/4/2027: `gpt-5.1`, `gpt-5.3-codex` (`gpt-6-sol`) y `gpt-5.4-nano` (`gpt-6-luna`).
|
|
32
|
+
- **Lo que ya se apagó y faltaba:** 23/7/2026 (`computer-use-preview`, los `*-search-preview-2025-03-11`, `gpt-5-chat-latest`, `gpt-5.1-chat-latest`, los `gpt-5*-codex`, `o3-deep-research`, `o4-mini-deep-research` y los snapshots `-2025-10-06` de `gpt-audio-mini` y `gpt-realtime-mini`), 10/8 (`gpt-5.2-chat-latest`, `gpt-5.3-chat-latest`), 24/9 (Sora 2: `sora-2`, `sora-2-pro` y sus snapshots, sin reemplazo), 1/10 (`gpt-5.4-cyber`), 7/5 (`gpt-4o-mini-realtime-preview`, `gpt-4o-audio-preview`, `gpt-4o-mini-audio-preview`), 26/3 (`gpt-4-turbo-preview-completions`) y el header `OpenAI-Beta: realtime=v1` de la Realtime API Beta (12/5).
|
|
33
|
+
- El inventario reconoce como modelos de OpenAI `gpt-realtime*`, `gpt-audio*`, `gpt-6*`, `sora-2*`, `computer-use-preview*` y `o4-mini-deep-research`.
|
|
34
|
+
|
|
35
|
+
### Todavía no cubre
|
|
36
|
+
- Los productos que OpenAI cierra y no son modelos: prompts reutilizables (`v1/prompts`, 30/11/2026), la plataforma de Evals (solo lectura el 31/10, cierre el 30/11/2026), Agent Builder (30/11/2026) y la Videos API (cerrada el 24/9/2026; sí se avisan los modelos `sora-2`).
|
|
37
|
+
- Las familias `gpt-4o-audio`, `gpt-4o-realtime`, `gpt-4o-mini-realtime` y `gpt-4o-mini-audio` (20/1/2027): la página no dice qué IDs siguen activos (sus alias `-preview` se apagaron el 7/5/2026).
|
|
38
|
+
- Los snapshots de un alias que la página nombra sin ellos (por ejemplo `gpt-5.1-2025-11-13`, `gpt-5.4-nano-2026-03-17`) y lo que OpenAI apagó antes de 2026.
|
|
39
|
+
|
|
5
40
|
## 0.6.2 — 2026-10-18
|
|
6
41
|
|
|
7
42
|
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).
|
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 (también modelos fine-tuned de OpenAI, `ft:…`) |
|
|
134
|
+
| `ai.model-retirements` | Anthropic, OpenAI | retiro | varias | solo detección (también modelos fine-tuned de OpenAI, `ft:…`). De OpenAI, los modelos que su página de deprecaciones apaga desde 2026: texto, código, imagen, video, voz, transcripción y realtime; y los productos que cierran: Assistants API, prompts reutilizables (`pmpt_…`, `v1/prompts`), la plataforma de Evals y ChatKit con un workflow de Agent Builder |
|
|
135
135
|
|
|
136
136
|
## Verificación
|
|
137
137
|
|
package/package.json
CHANGED
|
@@ -12,7 +12,13 @@
|
|
|
12
12
|
"sources": [
|
|
13
13
|
{ "title": "Anthropic: Model deprecations", "url": "https://platform.claude.com/docs/en/about-claude/model-deprecations" },
|
|
14
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
|
+
{ "title": "OpenAI: Supervised fine-tuning (formato de los IDs ft:)", "url": "https://developers.openai.com/api/docs/guides/supervised-fine-tuning" },
|
|
16
|
+
{ "title": "OpenAI: Models (snapshots de cada familia y de cada modelo base)", "url": "https://developers.openai.com/api/docs/models" },
|
|
17
|
+
{ "title": "OpenAI: Migrate from prompt objects (prompts reutilizables, IDs pmpt_)", "url": "https://developers.openai.com/api/docs/guides/prompting/migrate-from-prompt-object" },
|
|
18
|
+
{ "title": "OpenAI: Moving from OpenAI Evals to Promptfoo", "url": "https://developers.openai.com/cookbook/examples/evaluation/moving-from-openai-evals-to-promptfoo" },
|
|
19
|
+
{ "title": "OpenAI: API reference, Evals (métodos del SDK de Node y de Python)", "url": "https://developers.openai.com/api/reference/resources/evals" },
|
|
20
|
+
{ "title": "OpenAI: Migrate from Agent Builder", "url": "https://developers.openai.com/api/docs/guides/agent-builder/migrate-from-agent-builder" },
|
|
21
|
+
{ "title": "OpenAI: ChatKit (workflow alojado en Agent Builder; sessions.create exige un workflow)", "url": "https://developers.openai.com/api/docs/guides/chatkit" }
|
|
16
22
|
],
|
|
17
23
|
"detect": {
|
|
18
24
|
"packages": ["@anthropic-ai/sdk", "openai"],
|
|
@@ -38,12 +44,40 @@
|
|
|
38
44
|
"claude-1.1": { "date": "2024-11-06", "replacement": "claude-haiku-4-5-20251001" },
|
|
39
45
|
"claude-1.0": { "date": "2024-11-06", "replacement": "claude-haiku-4-5-20251001" },
|
|
40
46
|
|
|
47
|
+
"gpt-5.1": { "date": "2027-04-01", "replacement": "gpt-6-sol" },
|
|
48
|
+
"gpt-5.3-codex": { "date": "2027-04-01", "replacement": "gpt-6-sol" },
|
|
49
|
+
"gpt-5.4-nano": { "date": "2027-04-01", "replacement": "gpt-6-luna" },
|
|
50
|
+
"whisper-1": { "date": "2027-02-26", "replacement": "gpt-live-transcribe o gpt-transcribe", "note_es": "Si lo usás para traducir (/v1/audio/translations), ese endpoint cierra el mismo día y el reemplazo es v1/realtime/translations." },
|
|
51
|
+
"gpt-4o-transcribe": { "date": "2027-02-26", "replacement": "gpt-live-transcribe o gpt-transcribe" },
|
|
52
|
+
"gpt-4o-mini-transcribe": { "date": "2027-02-26", "replacement": "gpt-live-transcribe o gpt-transcribe" },
|
|
53
|
+
"gpt-4o-transcribe-diarize": { "date": "2027-02-26", "replacement": "gpt-live-transcribe o gpt-transcribe" },
|
|
54
|
+
"gpt-realtime": { "date": "2027-01-20", "replacement": "gpt-realtime-2.1" },
|
|
55
|
+
"gpt-realtime-2025-08-28": { "date": "2027-01-20", "replacement": "gpt-realtime-2.1" },
|
|
56
|
+
"gpt-realtime-mini": { "date": "2027-01-20", "replacement": "gpt-realtime-2.1-mini" },
|
|
57
|
+
"gpt-realtime-mini-2025-12-15": { "date": "2027-01-20", "replacement": "gpt-realtime-2.1-mini" },
|
|
58
|
+
"gpt-audio": { "date": "2027-01-20", "replacement": "gpt-audio-1.5" },
|
|
59
|
+
"gpt-audio-2025-08-28": { "date": "2027-01-20", "replacement": "gpt-audio-1.5" },
|
|
60
|
+
"gpt-audio-mini": { "date": "2027-01-20", "replacement": "gpt-audio-1.5" },
|
|
61
|
+
"gpt-audio-mini-2025-12-15": { "date": "2027-01-20", "replacement": "gpt-audio-1.5" },
|
|
62
|
+
"gpt-4o-mini-transcribe-2025-03-20": { "date": "2027-01-20", "replacement": "gpt-4o-mini-transcribe-2025-12-15" },
|
|
63
|
+
"gpt-4o-2024-08-06": { "date": "2027-01-14", "replacement": "gpt-6-luna" },
|
|
64
|
+
"gpt-4o-2024-11-20": { "date": "2027-01-14", "replacement": "gpt-6-luna" },
|
|
65
|
+
"gpt-4o-mini-2024-07-18": { "date": "2027-01-14", "replacement": "gpt-6-luna" },
|
|
66
|
+
"gpt-4.1-2025-04-14": { "date": "2027-01-14", "replacement": "gpt-6-luna" },
|
|
67
|
+
"gpt-4.1-mini-2025-04-14": { "date": "2027-01-14", "replacement": "gpt-6-luna" },
|
|
68
|
+
"tts-1": { "date": "2027-01-06", "replacement": "gpt-realtime-2.1-mini" },
|
|
69
|
+
"tts-1-hd": { "date": "2027-01-06", "replacement": "gpt-realtime-2.1-mini" },
|
|
70
|
+
"gpt-4o-mini-tts-2025-03-20": { "date": "2027-01-06", "replacement": "gpt-realtime-2.1-mini" },
|
|
71
|
+
"gpt-4o-mini-tts-2025-12-15": { "date": "2027-01-06", "replacement": "gpt-realtime-2.1-mini" },
|
|
41
72
|
"gpt-5-2025-08-07": { "date": "2026-12-11", "replacement": "gpt-5.6-sol" },
|
|
42
73
|
"gpt-5-mini-2025-08-07": { "date": "2026-12-11", "replacement": "gpt-5.6-terra" },
|
|
43
74
|
"gpt-5-nano-2025-08-07": { "date": "2026-12-11", "replacement": "gpt-5.6-luna" },
|
|
44
75
|
"gpt-5-pro-2025-10-06": { "date": "2026-12-11", "replacement": "gpt-5.6-sol (reasoning.mode: pro)" },
|
|
45
76
|
"o3-2025-04-16": { "date": "2026-12-11", "replacement": "gpt-5.6-sol" },
|
|
46
77
|
"o3-pro-2025-06-10": { "date": "2026-12-11", "replacement": "gpt-5.6-sol (reasoning.mode: pro)" },
|
|
78
|
+
"gpt-image-1-mini": { "date": "2026-12-01", "replacement": "gpt-image-2.5-sunburst o gpt-image-2.5-flare" },
|
|
79
|
+
"gpt-image-1.5": { "date": "2026-12-01", "replacement": "gpt-image-2.5-sunburst o gpt-image-2.5-flare" },
|
|
80
|
+
"chatgpt-image-latest": { "date": "2026-12-01", "replacement": "gpt-image-2.5-sunburst o gpt-image-2.5-flare" },
|
|
47
81
|
"gpt-3.5-turbo": { "date": "2026-10-23", "replacement": "gpt-5.6-terra" },
|
|
48
82
|
"gpt-3.5-turbo-0125": { "date": "2026-10-23", "replacement": "gpt-5.6-terra" },
|
|
49
83
|
"gpt-3.5-turbo-completions": { "date": "2026-10-23", "replacement": "gpt-5.6-terra" },
|
|
@@ -67,22 +101,55 @@
|
|
|
67
101
|
"o3-mini-2025-01-31": { "date": "2026-10-23", "replacement": "gpt-5.6-sol" },
|
|
68
102
|
"o4-mini": { "date": "2026-10-23", "replacement": "gpt-5.6-terra" },
|
|
69
103
|
"o4-mini-2025-04-16": { "date": "2026-10-23", "replacement": "gpt-5.6-terra" },
|
|
104
|
+
"gpt-5.4-cyber": { "date": "2026-10-01", "replacement_es": "el modelo cyber más capaz al que tengas acceso" },
|
|
70
105
|
"gpt-3.5-turbo-instruct": { "date": "2026-09-28", "replacement": "gpt-5.6-terra" },
|
|
71
106
|
"gpt-3.5-turbo-1106": { "date": "2026-09-28", "replacement": "gpt-5.6-terra" },
|
|
72
107
|
"babbage-002": { "date": "2026-09-28", "replacement": "gpt-5.6-terra" },
|
|
73
108
|
"davinci-002": { "date": "2026-09-28", "replacement": "gpt-5.6-terra" },
|
|
109
|
+
"sora-2": { "date": "2026-09-24", "note_es": "OpenAI no indica reemplazo y ese día también cerró la Videos API." },
|
|
110
|
+
"sora-2-pro": { "date": "2026-09-24", "note_es": "OpenAI no indica reemplazo y ese día también cerró la Videos API." },
|
|
111
|
+
"sora-2-2025-10-06": { "date": "2026-09-24", "note_es": "OpenAI no indica reemplazo y ese día también cerró la Videos API." },
|
|
112
|
+
"sora-2-2025-12-08": { "date": "2026-09-24", "note_es": "OpenAI no indica reemplazo y ese día también cerró la Videos API." },
|
|
113
|
+
"sora-2-pro-2025-10-06": { "date": "2026-09-24", "note_es": "OpenAI no indica reemplazo y ese día también cerró la Videos API." },
|
|
114
|
+
"gpt-5.2-chat-latest": { "date": "2026-08-10", "replacement": "gpt-5.6-sol" },
|
|
115
|
+
"gpt-5.3-chat-latest": { "date": "2026-08-10", "replacement": "gpt-5.6-sol" },
|
|
116
|
+
"computer-use-preview": { "date": "2026-07-23", "replacement": "gpt-5.6-terra" },
|
|
117
|
+
"computer-use-preview-2025-03-11": { "date": "2026-07-23", "replacement": "gpt-5.6-terra" },
|
|
118
|
+
"gpt-4o-mini-search-preview-2025-03-11": { "date": "2026-07-23", "replacement": "gpt-5.6-terra" },
|
|
119
|
+
"gpt-4o-search-preview-2025-03-11": { "date": "2026-07-23", "replacement": "gpt-5.6-terra" },
|
|
120
|
+
"gpt-5-chat-latest": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
|
|
121
|
+
"gpt-5-codex": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
|
|
122
|
+
"gpt-5.1-chat-latest": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
|
|
123
|
+
"gpt-5.1-codex": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
|
|
124
|
+
"gpt-5.1-codex-max": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
|
|
125
|
+
"gpt-5.1-codex-mini": { "date": "2026-07-23", "replacement": "gpt-5.6-terra" },
|
|
126
|
+
"gpt-5.2-codex": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
|
|
127
|
+
"gpt-audio-mini-2025-10-06": { "date": "2026-07-23", "replacement": "gpt-audio-1.5" },
|
|
128
|
+
"gpt-realtime-mini-2025-10-06": { "date": "2026-07-23", "replacement": "gpt-realtime-2.1-mini" },
|
|
129
|
+
"o3-deep-research": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
|
|
130
|
+
"o3-deep-research-2025-06-26": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
|
|
131
|
+
"o4-mini-deep-research": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
|
|
132
|
+
"o4-mini-deep-research-2025-06-26": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
|
|
74
133
|
"dall-e-3": { "date": "2026-05-12", "replacement": "gpt-image-2, gpt-image-1 o gpt-image-1-mini" },
|
|
75
134
|
"dall-e-2": { "date": "2026-05-12", "replacement": "gpt-image-2, gpt-image-1 o gpt-image-1-mini" },
|
|
76
135
|
"gpt-4o-realtime-preview": { "date": "2026-05-07", "replacement": "gpt-realtime-1.5" },
|
|
77
136
|
"gpt-4o-realtime-preview-2025-06-03": { "date": "2026-05-07", "replacement": "gpt-realtime-1.5" },
|
|
78
137
|
"gpt-4o-realtime-preview-2024-12-17": { "date": "2026-05-07", "replacement": "gpt-realtime-1.5" },
|
|
138
|
+
"gpt-4o-mini-realtime-preview": { "date": "2026-05-07", "replacement": "gpt-realtime-mini" },
|
|
139
|
+
"gpt-4o-audio-preview": { "date": "2026-05-07", "replacement": "gpt-audio-1.5" },
|
|
140
|
+
"gpt-4o-mini-audio-preview": { "date": "2026-05-07", "replacement": "gpt-audio-mini" },
|
|
79
141
|
"gpt-4-0314": { "date": "2026-03-26", "replacement": "gpt-5 o gpt-4.1" },
|
|
80
142
|
"gpt-4-0125-preview": { "date": "2026-03-26", "replacement": "gpt-5 o gpt-4.1" },
|
|
81
143
|
"gpt-4-turbo-preview": { "date": "2026-03-26", "replacement": "gpt-5 o gpt-4.1" },
|
|
144
|
+
"gpt-4-turbo-preview-completions": { "date": "2026-03-26", "replacement": "gpt-5 o gpt-4.1" },
|
|
82
145
|
"chatgpt-4o-latest": { "date": "2026-02-17", "replacement": "gpt-5.1-chat-latest" },
|
|
83
146
|
"codex-mini-latest": { "date": "2026-02-12", "replacement": "gpt-5-codex-mini" }
|
|
84
147
|
},
|
|
85
148
|
"retired_fine_tunes": {
|
|
149
|
+
"ft-gpt-4o": { "date": "2027-01-14", "replacement": "gpt-6-luna", "bases": ["gpt-4o-2024-08-06", "gpt-4o-2024-11-20"] },
|
|
150
|
+
"ft-gpt-4o-mini": { "date": "2027-01-14", "replacement": "gpt-6-luna", "bases": ["gpt-4o-mini-2024-07-18", "gpt-4o-mini"] },
|
|
151
|
+
"ft-gpt-4.1": { "date": "2027-01-14", "replacement": "gpt-6-luna", "bases": ["gpt-4.1-2025-04-14", "gpt-4.1"] },
|
|
152
|
+
"ft-gpt-4.1-mini": { "date": "2027-01-14", "replacement": "gpt-6-luna", "bases": ["gpt-4.1-mini-2025-04-14", "gpt-4.1-mini"] },
|
|
86
153
|
"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
154
|
"ft-gpt-4": { "date": "2026-10-23", "replacement": "gpt-5.6-sol", "bases": ["gpt-4", "gpt-4-0613"] },
|
|
88
155
|
"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"] },
|
|
@@ -95,9 +162,16 @@
|
|
|
95
162
|
"claude-opus-4-5-20251101": "2026-11-24"
|
|
96
163
|
},
|
|
97
164
|
"retired_endpoints": [
|
|
98
|
-
{ "pattern": ".beta.assistants", "retired": "2026-08-26", "replacement_es": "Responses API + Conversations API", "provider": "openai" },
|
|
99
|
-
{ "pattern": ".beta.threads", "retired": "2026-08-26", "replacement_es": "Responses API + Conversations API", "provider": "openai" },
|
|
100
|
-
{ "pattern": "/v1/assistants", "retired": "2026-08-26", "replacement_es": "Responses API + Conversations API", "provider": "openai" }
|
|
165
|
+
{ "pattern": ".beta.assistants", "retired": "2026-08-26", "api_es": "Assistants API", "replacement_es": "Responses API + Conversations API", "provider": "openai" },
|
|
166
|
+
{ "pattern": ".beta.threads", "retired": "2026-08-26", "api_es": "Assistants API", "replacement_es": "Responses API + Conversations API", "provider": "openai" },
|
|
167
|
+
{ "pattern": "/v1/assistants", "retired": "2026-08-26", "api_es": "Assistants API", "replacement_es": "Responses API + Conversations API", "provider": "openai" },
|
|
168
|
+
{ "pattern": "realtime=v1", "retired": "2026-05-12", "api_es": "Realtime API Beta", "replacement_es": "la Realtime API (GA)", "provider": "openai" },
|
|
169
|
+
{ "pattern": "api.openai.com/v1/prompts", "retired": "2026-11-30", "api_es": "API de prompts reutilizables", "replacement_es": "pasar el contenido del prompt a tu código y mandarlo en `input` de la Responses API (guía oficial \"Migrate from prompt objects\")", "provider": "openai" },
|
|
170
|
+
{ "regex": "[\"'`](pmpt_[A-Za-z0-9]+)[\"'`]", "retired": "2026-11-30", "api_es": "API de prompts reutilizables", "replacement_es": "pasar el contenido del prompt a tu código y mandarlo en `input` de la Responses API (guía oficial \"Migrate from prompt objects\")", "provider": "openai" },
|
|
171
|
+
{ "regex": "\\.(evals(?:\\.runs(?:\\.(?:outputItems|output_items))?)?\\.(?:create|retrieve|update|list|delete|cancel))\\s*\\(", "openai_context": true, "retired": "2026-11-30", "milestones": [{ "date": "2026-10-31", "future_es": "las evals existentes pasan a solo lectura", "past_es": "las evals existentes están en solo lectura" }], "api_es": "plataforma de Evals", "replacement_es": "Promptfoo, que recomienda OpenAI (guía oficial \"Moving from OpenAI Evals to Promptfoo\")", "provider": "openai" },
|
|
172
|
+
{ "pattern": "/v1/evals", "openai_context": true, "retired": "2026-11-30", "milestones": [{ "date": "2026-10-31", "future_es": "las evals existentes pasan a solo lectura", "past_es": "las evals existentes están en solo lectura" }], "api_es": "plataforma de Evals", "replacement_es": "Promptfoo, que recomienda OpenAI (guía oficial \"Moving from OpenAI Evals to Promptfoo\")", "provider": "openai" },
|
|
173
|
+
{ "regex": "\\.(chatkit\\.sessions\\.create)\\s*\\(", "openai_context": true, "retired": "2026-11-30", "api_es": "integración de ChatKit con Agent Builder", "replacement_es": "exportar el workflow como código del Agents SDK y conectar ChatKit a tu propio servidor (guía oficial \"Migrate from Agent Builder\")", "note_es": "ChatKit sigue disponible; el workflow alojado en Agent Builder se puede usar solo durante la transición.", "provider": "openai" },
|
|
174
|
+
{ "pattern": "/v1/chatkit/sessions", "openai_context": true, "retired": "2026-11-30", "api_es": "integración de ChatKit con Agent Builder", "replacement_es": "exportar el workflow como código del Agents SDK y conectar ChatKit a tu propio servidor (guía oficial \"Migrate from Agent Builder\")", "note_es": "ChatKit sigue disponible; el workflow alojado en Agent Builder se puede usar solo durante la transición.", "provider": "openai" }
|
|
101
175
|
]
|
|
102
176
|
},
|
|
103
177
|
"codemod": null,
|
|
@@ -12,10 +12,28 @@ const AZURE = /azure|AzureOpenAI|openai\.azure\.com/i;
|
|
|
12
12
|
// Se compara el modelo base entero, hasta el `:`, contra `bases` del pack: nunca un prefijo, porque
|
|
13
13
|
// `ft:gpt-4o-mini-2024-07-18:...` no es un fine-tuned de `gpt-4` y se apaga en otra fecha.
|
|
14
14
|
const FINE_TUNE = /["'`]ft:([\w.-]+):/g;
|
|
15
|
+
// Productos de OpenAI que cierran y no son modelos (prompts reutilizables, Evals, ChatKit con Agent Builder). Un
|
|
16
|
+
// endpoint del pack es un `pattern` (texto literal) o un `regex` (se muestra el grupo 1). Con `openai_context`, solo
|
|
17
|
+
// cuenta si el archivo importa el SDK oficial (JS o Python) o nombra el host de la API: `.evals.create(` o
|
|
18
|
+
// `/v1/evals` pueden ser de otra librería o de otra API.
|
|
19
|
+
const OPENAI_CONTEXT = /\b(?:from|import)\s+["']openai(?:\/[^"']*)?["']|\b(?:require|import)\(\s*["']openai(?:\/[^"']*)?["']\s*\)|^\s*(?:from\s+openai(?:\.\w+)*\s+import|import\s+openai)\b|api\.openai\.com/m;
|
|
15
20
|
|
|
16
|
-
// Acepta el formato nuevo ({ date, replacement }) y el viejo (solo la fecha).
|
|
21
|
+
// Acepta el formato nuevo ({ date, replacement }) y el viejo (solo la fecha). `replacement` es un ID de modelo
|
|
22
|
+
// y va entre backticks; `replacement_es` es un reemplazo que el proveedor da en prosa ("el modelo cyber más
|
|
23
|
+
// capaz al que tengas acceso"); `note_es` es una oración más, para lo que la página dice además de la fecha.
|
|
17
24
|
const entry = (v) => (typeof v === 'string' ? { date: v, replacement: null } : v);
|
|
18
25
|
const quoted = (line, id) => line.includes(`'${id}'`) || line.includes(`"${id}"`) || line.includes(`\`${id}\``);
|
|
26
|
+
const replacementText = ({ replacement, replacement_es: prose, note_es: note }) =>
|
|
27
|
+
(replacement ? ` Reemplazo recomendado: \`${replacement}\`.` : prose ? ` Reemplazo recomendado: ${prose}.` : '') + (note ? ` ${note}` : '');
|
|
28
|
+
const endpointHit = (ep, l) => {
|
|
29
|
+
if (ep.pattern) return l.includes(ep.pattern) ? ep.pattern : null;
|
|
30
|
+
const m = l.match(ep.re);
|
|
31
|
+
return m ? m[1] ?? m[0] : null;
|
|
32
|
+
};
|
|
33
|
+
// Pasos anteriores al cierre (las evals pasan a solo lectura el 31/10 y cierran el 30/11). Cerrado el producto, no se
|
|
34
|
+
// nombran.
|
|
35
|
+
const milestonesText = (ep, today) => (ep.milestones || [])
|
|
36
|
+
.map((m) => (m.date <= today ? ` Desde el ${m.date} ${m.past_es}.` : ` El ${m.date} ${m.future_es}.`)).join('');
|
|
19
37
|
|
|
20
38
|
export default function detect({ source, file, pack, today = new Date().toISOString().slice(0, 10) }) {
|
|
21
39
|
const findings = [];
|
|
@@ -24,15 +42,18 @@ export default function detect({ source, file, pack, today = new Date().toISOStr
|
|
|
24
42
|
const fineTunes = new Map();
|
|
25
43
|
for (const [name, e] of Object.entries(pack.detect.retired_fine_tunes || {})) for (const b of e.bases) fineTunes.set(b, { name, ...e });
|
|
26
44
|
const azure = AZURE.test(source);
|
|
45
|
+
const openai = OPENAI_CONTEXT.test(source);
|
|
46
|
+
const eps = endpoints.filter((ep) => openai || !ep.openai_context).map((ep) => (ep.regex ? { ...ep, re: new RegExp(ep.regex) } : ep));
|
|
27
47
|
const lines = source.split('\n');
|
|
28
48
|
lines.forEach((l, i) => {
|
|
29
49
|
const line = i + 1;
|
|
30
50
|
const inCall = MODEL_CONTEXT.test(l);
|
|
31
51
|
for (const [model, raw] of Object.entries(retired)) {
|
|
32
52
|
if (!quoted(l, model)) continue;
|
|
33
|
-
const
|
|
53
|
+
const e = entry(raw);
|
|
54
|
+
const { date } = e;
|
|
34
55
|
const past = date <= today;
|
|
35
|
-
const repl =
|
|
56
|
+
const repl = replacementText(e);
|
|
36
57
|
const when = past ? `fue retirado el ${date}` : `se retira el ${date}`;
|
|
37
58
|
const message = inCall
|
|
38
59
|
? `El modelo \`${model}\` ${when}${past ? ': las llamadas ya fallan' : ''}.${repl} Corré tus pruebas de prompts antes de cambiarlo.`
|
|
@@ -58,12 +79,16 @@ export default function detect({ source, file, pack, today = new Date().toISOStr
|
|
|
58
79
|
message: `El modelo \`${model}\` puede retirarse a partir del ${date} (fecha mínima publicada; hay 60 días de aviso). Planificá el reemplazo.` });
|
|
59
80
|
usages.push({ provider: 'ia', op: `modelo ${model}`, line });
|
|
60
81
|
}
|
|
61
|
-
for (const ep of
|
|
62
|
-
|
|
82
|
+
for (const ep of eps) {
|
|
83
|
+
const hit = endpointHit(ep, l);
|
|
84
|
+
if (!hit) continue;
|
|
85
|
+
const past = ep.retired <= today;
|
|
86
|
+
const closed = past ? `cerrada el ${ep.retired}` : `que cierra el ${ep.retired}`;
|
|
87
|
+
const steps = past ? '' : milestonesText(ep, today);
|
|
63
88
|
findings.push({ pack: PACK, file, line, status: 'detect-only', message: azure && ep.provider === 'openai'
|
|
64
|
-
? `\`${
|
|
65
|
-
: `\`${
|
|
66
|
-
usages.push({ provider: 'ia', op:
|
|
89
|
+
? `\`${hit}\` es la ${ep.api_es}. En Azure OpenAI sigue su propio calendario (el cierre del ${ep.retired} es el de la API de OpenAI): revisá el de Azure.`
|
|
90
|
+
: `\`${hit}\` pertenece a la ${ep.api_es} de OpenAI, ${closed}.${steps} Reemplazo: ${ep.replacement_es}.${ep.note_es ? ` ${ep.note_es}` : ''}` });
|
|
91
|
+
usages.push({ provider: 'ia', op: `OpenAI ${ep.api_es}`, line });
|
|
67
92
|
}
|
|
68
93
|
});
|
|
69
94
|
return { output: null, findings, usages };
|
package/src/inventory/js-scan.js
CHANGED
|
@@ -10,10 +10,11 @@ const HTTP_METHODS = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options'
|
|
|
10
10
|
const FETCH_PACKAGES = new Set(['node-fetch', 'cross-fetch', 'isomorphic-fetch', 'undici']);
|
|
11
11
|
const SKIP_KEYS = new Set(['loc', 'start', 'end', 'extra', 'range', 'comments', 'leadingComments', 'trailingComments', 'innerComments', 'tokens']);
|
|
12
12
|
|
|
13
|
-
// IDs de modelos de IA. Prefijos inequívocos; la serie o1/o3/o4 de OpenAI solo
|
|
13
|
+
// IDs de modelos de IA. Prefijos inequívocos; la serie o1/o3/o4, Sora y computer-use de OpenAI solo cuentan si
|
|
14
|
+
// el archivo usa OpenAI.
|
|
14
15
|
const MODEL_PATTERNS = [
|
|
15
|
-
[/^(gpt-(3\.5|4|4\.1|4o|4\.5|5)[\w.-]*|chatgpt-[\w.-]+|text-embedding-[\w-]+|dall-e-[23]|whisper-1|tts-1(-hd)?|gpt-image-[\w.-]+)$/, 'OpenAI'],
|
|
16
|
-
[/^o[1-9](-(mini|pro|preview
|
|
16
|
+
[/^(gpt-(3\.5|4|4\.1|4o|4\.5|5|6|realtime|audio)[\w.-]*|chatgpt-[\w.-]+|text-embedding-[\w-]+|dall-e-[23]|whisper-1|tts-1(-hd)?|gpt-image-[\w.-]+)$/, 'OpenAI'],
|
|
17
|
+
[/^(o[1-9](-(mini|pro|preview))?(-deep-research)?(-\d{4}-\d{2}-\d{2})?|sora-2[\w.-]*|computer-use-preview[\w.-]*)$/, 'OpenAI', { needs: 'openai' }],
|
|
17
18
|
[/^claude-[\w.-]+$/, 'Anthropic'],
|
|
18
19
|
[/^(gemini|gemma)-[\w.-]+$/, 'Google (Gemini)'],
|
|
19
20
|
[/^(mistral|mixtral|codestral|pixtral|ministral)-[\w.-]+$/, 'Mistral'],
|