parche-cli 0.6.3 → 0.6.5

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,34 @@
2
2
 
3
3
  Todas las versiones de `parche-cli` (npm) y de la Action `Pepo08/parche@v0`.
4
4
 
5
+ ## 0.6.5 — 2026-10-19
6
+
7
+ Pack de IA con la Videos API de OpenAI, que cerró el 24/9/2026 junto con los modelos Sora 2 (página de deprecaciones verificada el 19/10; los métodos salen de la referencia oficial de la API y del SDK de Python). Hasta ahora solo se avisaban los modelos `sora-2*`; ahora también las llamadas que quedaron en el código sin un ID de modelo cerca (consultar el estado, bajar el video, listar, borrar). Como siempre, Parche avisa y no toca el código.
8
+
9
+ ### Nuevo
10
+ - **Videos API (cerrada el 24/9/2026, sin reemplazo):** los métodos del SDK de Node (`videos.create`, `retrieve`, `list`, `delete`, `remix`, `edit`, `extend`, `downloadContent`, `createCharacter`, `getCharacter`), los del SDK de Python (los mismos en snake_case, más `create_and_poll` y `poll`, también detrás de `with_raw_response` y `with_streaming_response`) y `/v1/videos` por HTTP. OpenAI no indica reemplazo (su referencia dice que no hay una API que la reemplace uno a uno), y el aviso lo dice así, sin inventar uno.
11
+ - **Menos falsos positivos:** como Evals y ChatKit, solo cuenta si el archivo importa el SDK oficial de OpenAI o nombra `api.openai.com`, porque api.video tiene `client.videos.create(` y otros proveedores usan `/v1/videos`. Además no se avisan los receptores de YouTube (`youtube.videos.list(`, `google.youtube('v3').videos.list(`), que conviven con el SDK de OpenAI en los resumidores de videos. En Azure OpenAI no se da por cerrada con la fecha de OpenAI.
12
+
13
+ ### Todavía no cubre
14
+ - Un archivo que importa el SDK de OpenAI y llama a otro cliente con `videos` (api.video, o YouTube con un nombre como `yt`): se avisa igual.
15
+ - Un cliente de OpenAI que llega de otro archivo (`import { openai } from './lib/openai'`) sin importar el SDK ni nombrar el host.
16
+ - Los SDKs de Go, Java, .NET y Ruby.
17
+
18
+ ## 0.6.4 — 2026-10-18
19
+
20
+ 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.
21
+
22
+ ### Nuevo
23
+ - **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.
24
+ - **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.
25
+ - **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.
26
+ - **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.
27
+
28
+ ### Todavía no cubre
29
+ - 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.
30
+ - 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`).
31
+ - 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.
32
+
5
33
  ## 0.6.3 — 2026-10-18
6
34
 
7
35
  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.
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:…`). De OpenAI, los modelos que su página de deprecaciones apaga desde 2026: texto, código, imagen, video, voz, transcripción y realtime |
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, ChatKit con un workflow de Agent Builder y la Videos API (cerrada el 24/9/2026) |
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.3",
3
+ "version": "0.6.5",
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",
@@ -1,19 +1,26 @@
1
1
  {
2
2
  "id": "ai.model-retirements",
3
- "version": "2026.10.18",
3
+ "version": "2026.10.19",
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-18",
9
+ "last_verified": "2026-10-19",
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
14
  { "title": "OpenAI: Deprecations", "url": "https://developers.openai.com/api/docs/deprecations" },
15
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
+ { "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" },
22
+ { "title": "OpenAI: API reference, Videos (métodos del SDK de Node y de Python; sin reemplazo uno a uno)", "url": "https://developers.openai.com/api/reference/resources/videos" },
23
+ { "title": "OpenAI: SDK de Python, recurso videos (create_and_poll y poll)", "url": "https://github.com/openai/openai-python/blob/main/src/openai/resources/videos.py" }
17
24
  ],
18
25
  "detect": {
19
26
  "packages": ["@anthropic-ai/sdk", "openai"],
@@ -160,7 +167,15 @@
160
167
  { "pattern": ".beta.assistants", "retired": "2026-08-26", "api_es": "Assistants API", "replacement_es": "Responses API + Conversations API", "provider": "openai" },
161
168
  { "pattern": ".beta.threads", "retired": "2026-08-26", "api_es": "Assistants API", "replacement_es": "Responses API + Conversations API", "provider": "openai" },
162
169
  { "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" }
170
+ { "pattern": "realtime=v1", "retired": "2026-05-12", "api_es": "Realtime API Beta", "replacement_es": "la Realtime API (GA)", "provider": "openai" },
171
+ { "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" },
172
+ { "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" },
173
+ { "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" },
174
+ { "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" },
175
+ { "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" },
176
+ { "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" },
177
+ { "regex": "(?<![Yy]ou[Tt]ube\\w*|[Yy]ou[Tt]ube\\([^)]*\\))\\.(videos\\.(?:with_(?:raw|streaming)_response\\.)?(?:create|createCharacter|create_character|create_and_poll|delete|downloadContent|download_content|edit|extend|getCharacter|get_character|list|poll|remix|retrieve))\\s*\\(", "openai_context": true, "retired": "2026-09-24", "api_es": "Videos API", "replacement_es": "OpenAI no indica ninguno (según su referencia, no hay una API que la reemplace uno a uno)", "note_es": "Ese mismo día cerraron los modelos `sora-2` y `sora-2-pro`: no alcanza con cambiar de modelo.", "provider": "openai" },
178
+ { "pattern": "/v1/videos", "openai_context": true, "retired": "2026-09-24", "api_es": "Videos API", "replacement_es": "OpenAI no indica ninguno (según su referencia, no hay una API que la reemplace uno a uno)", "note_es": "Ese mismo día cerraron los modelos `sora-2` y `sora-2-pro`: no alcanza con cambiar de modelo.", "provider": "openai" }
164
179
  ]
165
180
  },
166
181
  "codemod": null,
@@ -12,6 +12,12 @@ 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, Videos API).
16
+ // Un 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(`,
18
+ // `.videos.list(` o `/v1/evals` pueden ser de otra librería o de otra API. El regex de la Videos API además descarta
19
+ // los receptores de YouTube (`youtube.videos.list(`), que conviven con el SDK de OpenAI en los resumidores de videos.
20
+ 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
21
 
16
22
  // Acepta el formato nuevo ({ date, replacement }) y el viejo (solo la fecha). `replacement` es un ID de modelo
17
23
  // y va entre backticks; `replacement_es` es un reemplazo que el proveedor da en prosa ("el modelo cyber más
@@ -20,6 +26,15 @@ const entry = (v) => (typeof v === 'string' ? { date: v, replacement: null } : v
20
26
  const quoted = (line, id) => line.includes(`'${id}'`) || line.includes(`"${id}"`) || line.includes(`\`${id}\``);
21
27
  const replacementText = ({ replacement, replacement_es: prose, note_es: note }) =>
22
28
  (replacement ? ` Reemplazo recomendado: \`${replacement}\`.` : prose ? ` Reemplazo recomendado: ${prose}.` : '') + (note ? ` ${note}` : '');
29
+ const endpointHit = (ep, l) => {
30
+ if (ep.pattern) return l.includes(ep.pattern) ? ep.pattern : null;
31
+ const m = l.match(ep.re);
32
+ return m ? m[1] ?? m[0] : null;
33
+ };
34
+ // Pasos anteriores al cierre (las evals pasan a solo lectura el 31/10 y cierran el 30/11). Cerrado el producto, no se
35
+ // nombran.
36
+ const milestonesText = (ep, today) => (ep.milestones || [])
37
+ .map((m) => (m.date <= today ? ` Desde el ${m.date} ${m.past_es}.` : ` El ${m.date} ${m.future_es}.`)).join('');
23
38
 
24
39
  export default function detect({ source, file, pack, today = new Date().toISOString().slice(0, 10) }) {
25
40
  const findings = [];
@@ -28,6 +43,8 @@ export default function detect({ source, file, pack, today = new Date().toISOStr
28
43
  const fineTunes = new Map();
29
44
  for (const [name, e] of Object.entries(pack.detect.retired_fine_tunes || {})) for (const b of e.bases) fineTunes.set(b, { name, ...e });
30
45
  const azure = AZURE.test(source);
46
+ const openai = OPENAI_CONTEXT.test(source);
47
+ const eps = endpoints.filter((ep) => openai || !ep.openai_context).map((ep) => (ep.regex ? { ...ep, re: new RegExp(ep.regex) } : ep));
31
48
  const lines = source.split('\n');
32
49
  lines.forEach((l, i) => {
33
50
  const line = i + 1;
@@ -63,12 +80,15 @@ export default function detect({ source, file, pack, today = new Date().toISOStr
63
80
  message: `El modelo \`${model}\` puede retirarse a partir del ${date} (fecha mínima publicada; hay 60 días de aviso). Planificá el reemplazo.` });
64
81
  usages.push({ provider: 'ia', op: `modelo ${model}`, line });
65
82
  }
66
- for (const ep of endpoints) {
67
- if (!l.includes(ep.pattern)) continue;
68
- const closed = ep.retired <= today ? `cerrada el ${ep.retired}` : `que cierra el ${ep.retired}`;
83
+ for (const ep of eps) {
84
+ const hit = endpointHit(ep, l);
85
+ if (!hit) continue;
86
+ const past = ep.retired <= today;
87
+ const closed = past ? `cerrada el ${ep.retired}` : `que cierra el ${ep.retired}`;
88
+ const steps = past ? '' : milestonesText(ep, today);
69
89
  findings.push({ pack: PACK, file, line, status: 'detect-only', message: azure && ep.provider === 'openai'
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}.` });
90
+ ? `\`${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.`
91
+ : `\`${hit}\` pertenece a la ${ep.api_es} de OpenAI, ${closed}.${steps} Reemplazo: ${ep.replacement_es}.${ep.note_es ? ` ${ep.note_es}` : ''}` });
72
92
  usages.push({ provider: 'ia', op: `OpenAI ${ep.api_es}`, line });
73
93
  }
74
94
  });