parche-cli 0.6.2 → 0.6.3

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
@@ -2,6 +2,26 @@
2
2
 
3
3
  Todas las versiones de `parche-cli` (npm) y de la Action `Pepo08/parche@v0`.
4
4
 
5
+ ## 0.6.3 — 2026-10-18
6
+
7
+ 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.
8
+
9
+ ### Nuevo
10
+ - **Lo que viene:**
11
+ - 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`).
12
+ - 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`).
13
+ - 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`).
14
+ - 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`.
15
+ - 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.
16
+ - 1/4/2027: `gpt-5.1`, `gpt-5.3-codex` (`gpt-6-sol`) y `gpt-5.4-nano` (`gpt-6-luna`).
17
+ - **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).
18
+ - El inventario reconoce como modelos de OpenAI `gpt-realtime*`, `gpt-audio*`, `gpt-6*`, `sora-2*`, `computer-use-preview*` y `o4-mini-deep-research`.
19
+
20
+ ### Todavía no cubre
21
+ - 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`).
22
+ - 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).
23
+ - 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.
24
+
5
25
  ## 0.6.2 — 2026-10-18
6
26
 
7
27
  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 |
135
135
 
136
136
  ## Verificación
137
137
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "parche-cli",
3
- "version": "0.6.2",
3
+ "version": "0.6.3",
4
4
  "description": "Dependabot para APIs: detecta cambios de APIs de terceros en tu código y abre el PR con el arreglo.",
5
5
  "keywords": [
6
6
  "api",
@@ -12,7 +12,8 @@
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" }
16
17
  ],
17
18
  "detect": {
18
19
  "packages": ["@anthropic-ai/sdk", "openai"],
@@ -38,12 +39,40 @@
38
39
  "claude-1.1": { "date": "2024-11-06", "replacement": "claude-haiku-4-5-20251001" },
39
40
  "claude-1.0": { "date": "2024-11-06", "replacement": "claude-haiku-4-5-20251001" },
40
41
 
42
+ "gpt-5.1": { "date": "2027-04-01", "replacement": "gpt-6-sol" },
43
+ "gpt-5.3-codex": { "date": "2027-04-01", "replacement": "gpt-6-sol" },
44
+ "gpt-5.4-nano": { "date": "2027-04-01", "replacement": "gpt-6-luna" },
45
+ "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." },
46
+ "gpt-4o-transcribe": { "date": "2027-02-26", "replacement": "gpt-live-transcribe o gpt-transcribe" },
47
+ "gpt-4o-mini-transcribe": { "date": "2027-02-26", "replacement": "gpt-live-transcribe o gpt-transcribe" },
48
+ "gpt-4o-transcribe-diarize": { "date": "2027-02-26", "replacement": "gpt-live-transcribe o gpt-transcribe" },
49
+ "gpt-realtime": { "date": "2027-01-20", "replacement": "gpt-realtime-2.1" },
50
+ "gpt-realtime-2025-08-28": { "date": "2027-01-20", "replacement": "gpt-realtime-2.1" },
51
+ "gpt-realtime-mini": { "date": "2027-01-20", "replacement": "gpt-realtime-2.1-mini" },
52
+ "gpt-realtime-mini-2025-12-15": { "date": "2027-01-20", "replacement": "gpt-realtime-2.1-mini" },
53
+ "gpt-audio": { "date": "2027-01-20", "replacement": "gpt-audio-1.5" },
54
+ "gpt-audio-2025-08-28": { "date": "2027-01-20", "replacement": "gpt-audio-1.5" },
55
+ "gpt-audio-mini": { "date": "2027-01-20", "replacement": "gpt-audio-1.5" },
56
+ "gpt-audio-mini-2025-12-15": { "date": "2027-01-20", "replacement": "gpt-audio-1.5" },
57
+ "gpt-4o-mini-transcribe-2025-03-20": { "date": "2027-01-20", "replacement": "gpt-4o-mini-transcribe-2025-12-15" },
58
+ "gpt-4o-2024-08-06": { "date": "2027-01-14", "replacement": "gpt-6-luna" },
59
+ "gpt-4o-2024-11-20": { "date": "2027-01-14", "replacement": "gpt-6-luna" },
60
+ "gpt-4o-mini-2024-07-18": { "date": "2027-01-14", "replacement": "gpt-6-luna" },
61
+ "gpt-4.1-2025-04-14": { "date": "2027-01-14", "replacement": "gpt-6-luna" },
62
+ "gpt-4.1-mini-2025-04-14": { "date": "2027-01-14", "replacement": "gpt-6-luna" },
63
+ "tts-1": { "date": "2027-01-06", "replacement": "gpt-realtime-2.1-mini" },
64
+ "tts-1-hd": { "date": "2027-01-06", "replacement": "gpt-realtime-2.1-mini" },
65
+ "gpt-4o-mini-tts-2025-03-20": { "date": "2027-01-06", "replacement": "gpt-realtime-2.1-mini" },
66
+ "gpt-4o-mini-tts-2025-12-15": { "date": "2027-01-06", "replacement": "gpt-realtime-2.1-mini" },
41
67
  "gpt-5-2025-08-07": { "date": "2026-12-11", "replacement": "gpt-5.6-sol" },
42
68
  "gpt-5-mini-2025-08-07": { "date": "2026-12-11", "replacement": "gpt-5.6-terra" },
43
69
  "gpt-5-nano-2025-08-07": { "date": "2026-12-11", "replacement": "gpt-5.6-luna" },
44
70
  "gpt-5-pro-2025-10-06": { "date": "2026-12-11", "replacement": "gpt-5.6-sol (reasoning.mode: pro)" },
45
71
  "o3-2025-04-16": { "date": "2026-12-11", "replacement": "gpt-5.6-sol" },
46
72
  "o3-pro-2025-06-10": { "date": "2026-12-11", "replacement": "gpt-5.6-sol (reasoning.mode: pro)" },
73
+ "gpt-image-1-mini": { "date": "2026-12-01", "replacement": "gpt-image-2.5-sunburst o gpt-image-2.5-flare" },
74
+ "gpt-image-1.5": { "date": "2026-12-01", "replacement": "gpt-image-2.5-sunburst o gpt-image-2.5-flare" },
75
+ "chatgpt-image-latest": { "date": "2026-12-01", "replacement": "gpt-image-2.5-sunburst o gpt-image-2.5-flare" },
47
76
  "gpt-3.5-turbo": { "date": "2026-10-23", "replacement": "gpt-5.6-terra" },
48
77
  "gpt-3.5-turbo-0125": { "date": "2026-10-23", "replacement": "gpt-5.6-terra" },
49
78
  "gpt-3.5-turbo-completions": { "date": "2026-10-23", "replacement": "gpt-5.6-terra" },
@@ -67,22 +96,55 @@
67
96
  "o3-mini-2025-01-31": { "date": "2026-10-23", "replacement": "gpt-5.6-sol" },
68
97
  "o4-mini": { "date": "2026-10-23", "replacement": "gpt-5.6-terra" },
69
98
  "o4-mini-2025-04-16": { "date": "2026-10-23", "replacement": "gpt-5.6-terra" },
99
+ "gpt-5.4-cyber": { "date": "2026-10-01", "replacement_es": "el modelo cyber más capaz al que tengas acceso" },
70
100
  "gpt-3.5-turbo-instruct": { "date": "2026-09-28", "replacement": "gpt-5.6-terra" },
71
101
  "gpt-3.5-turbo-1106": { "date": "2026-09-28", "replacement": "gpt-5.6-terra" },
72
102
  "babbage-002": { "date": "2026-09-28", "replacement": "gpt-5.6-terra" },
73
103
  "davinci-002": { "date": "2026-09-28", "replacement": "gpt-5.6-terra" },
104
+ "sora-2": { "date": "2026-09-24", "note_es": "OpenAI no indica reemplazo y ese día también cerró la Videos API." },
105
+ "sora-2-pro": { "date": "2026-09-24", "note_es": "OpenAI no indica reemplazo y ese día también cerró la Videos API." },
106
+ "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." },
107
+ "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." },
108
+ "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." },
109
+ "gpt-5.2-chat-latest": { "date": "2026-08-10", "replacement": "gpt-5.6-sol" },
110
+ "gpt-5.3-chat-latest": { "date": "2026-08-10", "replacement": "gpt-5.6-sol" },
111
+ "computer-use-preview": { "date": "2026-07-23", "replacement": "gpt-5.6-terra" },
112
+ "computer-use-preview-2025-03-11": { "date": "2026-07-23", "replacement": "gpt-5.6-terra" },
113
+ "gpt-4o-mini-search-preview-2025-03-11": { "date": "2026-07-23", "replacement": "gpt-5.6-terra" },
114
+ "gpt-4o-search-preview-2025-03-11": { "date": "2026-07-23", "replacement": "gpt-5.6-terra" },
115
+ "gpt-5-chat-latest": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
116
+ "gpt-5-codex": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
117
+ "gpt-5.1-chat-latest": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
118
+ "gpt-5.1-codex": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
119
+ "gpt-5.1-codex-max": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
120
+ "gpt-5.1-codex-mini": { "date": "2026-07-23", "replacement": "gpt-5.6-terra" },
121
+ "gpt-5.2-codex": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
122
+ "gpt-audio-mini-2025-10-06": { "date": "2026-07-23", "replacement": "gpt-audio-1.5" },
123
+ "gpt-realtime-mini-2025-10-06": { "date": "2026-07-23", "replacement": "gpt-realtime-2.1-mini" },
124
+ "o3-deep-research": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
125
+ "o3-deep-research-2025-06-26": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
126
+ "o4-mini-deep-research": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
127
+ "o4-mini-deep-research-2025-06-26": { "date": "2026-07-23", "replacement": "gpt-5.6-sol" },
74
128
  "dall-e-3": { "date": "2026-05-12", "replacement": "gpt-image-2, gpt-image-1 o gpt-image-1-mini" },
75
129
  "dall-e-2": { "date": "2026-05-12", "replacement": "gpt-image-2, gpt-image-1 o gpt-image-1-mini" },
76
130
  "gpt-4o-realtime-preview": { "date": "2026-05-07", "replacement": "gpt-realtime-1.5" },
77
131
  "gpt-4o-realtime-preview-2025-06-03": { "date": "2026-05-07", "replacement": "gpt-realtime-1.5" },
78
132
  "gpt-4o-realtime-preview-2024-12-17": { "date": "2026-05-07", "replacement": "gpt-realtime-1.5" },
133
+ "gpt-4o-mini-realtime-preview": { "date": "2026-05-07", "replacement": "gpt-realtime-mini" },
134
+ "gpt-4o-audio-preview": { "date": "2026-05-07", "replacement": "gpt-audio-1.5" },
135
+ "gpt-4o-mini-audio-preview": { "date": "2026-05-07", "replacement": "gpt-audio-mini" },
79
136
  "gpt-4-0314": { "date": "2026-03-26", "replacement": "gpt-5 o gpt-4.1" },
80
137
  "gpt-4-0125-preview": { "date": "2026-03-26", "replacement": "gpt-5 o gpt-4.1" },
81
138
  "gpt-4-turbo-preview": { "date": "2026-03-26", "replacement": "gpt-5 o gpt-4.1" },
139
+ "gpt-4-turbo-preview-completions": { "date": "2026-03-26", "replacement": "gpt-5 o gpt-4.1" },
82
140
  "chatgpt-4o-latest": { "date": "2026-02-17", "replacement": "gpt-5.1-chat-latest" },
83
141
  "codex-mini-latest": { "date": "2026-02-12", "replacement": "gpt-5-codex-mini" }
84
142
  },
85
143
  "retired_fine_tunes": {
144
+ "ft-gpt-4o": { "date": "2027-01-14", "replacement": "gpt-6-luna", "bases": ["gpt-4o-2024-08-06", "gpt-4o-2024-11-20"] },
145
+ "ft-gpt-4o-mini": { "date": "2027-01-14", "replacement": "gpt-6-luna", "bases": ["gpt-4o-mini-2024-07-18", "gpt-4o-mini"] },
146
+ "ft-gpt-4.1": { "date": "2027-01-14", "replacement": "gpt-6-luna", "bases": ["gpt-4.1-2025-04-14", "gpt-4.1"] },
147
+ "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
148
  "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
149
  "ft-gpt-4": { "date": "2026-10-23", "replacement": "gpt-5.6-sol", "bases": ["gpt-4", "gpt-4-0613"] },
88
150
  "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 +157,10 @@
95
157
  "claude-opus-4-5-20251101": "2026-11-24"
96
158
  },
97
159
  "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" }
160
+ { "pattern": ".beta.assistants", "retired": "2026-08-26", "api_es": "Assistants API", "replacement_es": "Responses API + Conversations API", "provider": "openai" },
161
+ { "pattern": ".beta.threads", "retired": "2026-08-26", "api_es": "Assistants API", "replacement_es": "Responses API + Conversations API", "provider": "openai" },
162
+ { "pattern": "/v1/assistants", "retired": "2026-08-26", "api_es": "Assistants API", "replacement_es": "Responses API + Conversations API", "provider": "openai" },
163
+ { "pattern": "realtime=v1", "retired": "2026-05-12", "api_es": "Realtime API Beta", "replacement_es": "la Realtime API (GA)", "provider": "openai" }
101
164
  ]
102
165
  },
103
166
  "codemod": null,
@@ -13,9 +13,13 @@ const AZURE = /azure|AzureOpenAI|openai\.azure\.com/i;
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
15
 
16
- // Acepta el formato nuevo ({ date, replacement }) y el viejo (solo la fecha).
16
+ // Acepta el formato nuevo ({ date, replacement }) y el viejo (solo la fecha). `replacement` es un ID de modelo
17
+ // y va entre backticks; `replacement_es` es un reemplazo que el proveedor da en prosa ("el modelo cyber más
18
+ // 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
19
  const entry = (v) => (typeof v === 'string' ? { date: v, replacement: null } : v);
18
20
  const quoted = (line, id) => line.includes(`'${id}'`) || line.includes(`"${id}"`) || line.includes(`\`${id}\``);
21
+ const replacementText = ({ replacement, replacement_es: prose, note_es: note }) =>
22
+ (replacement ? ` Reemplazo recomendado: \`${replacement}\`.` : prose ? ` Reemplazo recomendado: ${prose}.` : '') + (note ? ` ${note}` : '');
19
23
 
20
24
  export default function detect({ source, file, pack, today = new Date().toISOString().slice(0, 10) }) {
21
25
  const findings = [];
@@ -30,9 +34,10 @@ export default function detect({ source, file, pack, today = new Date().toISOStr
30
34
  const inCall = MODEL_CONTEXT.test(l);
31
35
  for (const [model, raw] of Object.entries(retired)) {
32
36
  if (!quoted(l, model)) continue;
33
- const { date, replacement } = entry(raw);
37
+ const e = entry(raw);
38
+ const { date } = e;
34
39
  const past = date <= today;
35
- const repl = replacement ? ` Reemplazo recomendado: \`${replacement}\`.` : '';
40
+ const repl = replacementText(e);
36
41
  const when = past ? `fue retirado el ${date}` : `se retira el ${date}`;
37
42
  const message = inCall
38
43
  ? `El modelo \`${model}\` ${when}${past ? ': las llamadas ya fallan' : ''}.${repl} Corré tus pruebas de prompts antes de cambiarlo.`
@@ -60,10 +65,11 @@ export default function detect({ source, file, pack, today = new Date().toISOStr
60
65
  }
61
66
  for (const ep of endpoints) {
62
67
  if (!l.includes(ep.pattern)) continue;
68
+ const closed = ep.retired <= today ? `cerrada el ${ep.retired}` : `que cierra el ${ep.retired}`;
63
69
  findings.push({ pack: PACK, file, line, status: 'detect-only', message: azure && ep.provider === 'openai'
64
- ? `\`${ep.pattern}\` es la Assistants API. En Azure OpenAI sigue su propio calendario (el cierre del ${ep.retired} es el de la API de OpenAI): revisá el de Azure.`
65
- : `\`${ep.pattern}\` pertenece a la Assistants API de OpenAI, cerrada el ${ep.retired}. Reemplazo: ${ep.replacement_es}.` });
66
- usages.push({ provider: 'ia', op: 'OpenAI Assistants API', line });
70
+ ? `\`${ep.pattern}\` 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.`
71
+ : `\`${ep.pattern}\` pertenece a la ${ep.api_es} de OpenAI, ${closed}. Reemplazo: ${ep.replacement_es}.` });
72
+ usages.push({ provider: 'ia', op: `OpenAI ${ep.api_es}`, line });
67
73
  }
68
74
  });
69
75
  return { output: null, findings, usages };
@@ -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 cuenta si el archivo usa OpenAI.
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|deep-research))?(-\d{4}-\d{2}-\d{2})?$/, 'OpenAI', { needs: 'openai' }],
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'],