model-eol 0.3.0 → 0.4.1
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/README.md +61 -20
- package/bot/bot.mjs +464 -71
- package/bot/lib/common.mjs +2 -0
- package/bot/lib/eval.mjs +6 -0
- package/bot/lib/git.mjs +11 -8
- package/bot/lib/github.mjs +10 -19
- package/bot.yml.example +95 -59
- package/check.mjs +81 -8
- package/feeds/amazon.json +1 -1
- package/feeds/anthropic.json +1 -1
- package/feeds/google.json +88 -5
- package/feeds/openai.json +11 -26
- package/lib/config.mjs +130 -5
- package/lib/feeds.mjs +38 -4
- package/lib/plan.mjs +27 -8
- package/lib/reports.mjs +24 -7
- package/lib/scanner.mjs +191 -73
- package/package.json +1 -1
- package/schema/model-eol.bot-config.schema.json +61 -0
- package/schema/model-eol.inventory.schema.json +21 -0
- package/schema/model-eol.plan.schema.json +22 -0
package/README.md
CHANGED
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|

|
|
4
4
|
[](https://github.com/marketplace/actions/model-eol-check)
|
|
5
5
|

|
|
6
|
+
[](https://github.com/thossullivan/model-eol/actions/workflows/feed-refresh.yml)
|
|
6
7
|

|
|
7
8
|

|
|
8
9
|

|
|
9
10
|

|
|
10
11
|
|
|
11
12
|
**A machine-readable deprecation feed format for AI models, plus the reference
|
|
12
|
-
tooling that turns it into a Dependabot for models.**
|
|
13
|
+
tooling that turns it into a Dependabot for models.**
|
|
13
14
|
|
|
14
15
|

|
|
15
16
|
|
|
@@ -32,7 +33,7 @@ second, so the existing trackers can converge instead of each scraping alone.
|
|
|
32
33
|
replacement, `distributions` for per-channel lifecycles, and publisher `policy`
|
|
33
34
|
floors. Small enough that a provider could serve it at
|
|
34
35
|
`/.well-known/model-eol.json` in an afternoon.
|
|
35
|
-
- **`feeds/`** - <!-- feeds-status -->Amazon (4 entries), Anthropic (29 entries), Google (
|
|
36
|
+
- **`feeds/`** - <!-- feeds-status -->Amazon (4 entries), Anthropic (29 entries), Google (86 entries) and OpenAI (194 entries), generated from the providers' live deprecation pages plus the AWS Bedrock and Google Vertex AI lifecycle pages, feed data generated 2026-08-18<!-- /feeds-status -->. Every
|
|
36
37
|
dated entry carries a source URL.
|
|
37
38
|
- **`check.mjs`** - zero-dependency CLI: CI gate, PR diff gate, inventory, CycloneDX
|
|
38
39
|
ML-BOM export, retirement schedule, alerts and badges, migration plan/apply.
|
|
@@ -114,7 +115,7 @@ The same gate as a composite action - no npm install, feeds bundled, pinned to
|
|
|
114
115
|
the `v0` line:
|
|
115
116
|
|
|
116
117
|
```yaml
|
|
117
|
-
- uses: actions/checkout@
|
|
118
|
+
- uses: actions/checkout@v7
|
|
118
119
|
with:
|
|
119
120
|
fetch-depth: 0 # --changed needs history to diff against the base ref
|
|
120
121
|
- uses: thossullivan/model-eol@v0
|
|
@@ -162,6 +163,37 @@ coverage limits are counted. With no config the CLI keeps its historical
|
|
|
162
163
|
(`days: 90`, `scope: direct`, and the publisher clock). The complete contract is
|
|
163
164
|
[`schema/model-eol.bot-config.schema.json`](schema/model-eol.bot-config.schema.json).
|
|
164
165
|
|
|
166
|
+
Mixed-provider monorepos can keep those top-level values as repository defaults,
|
|
167
|
+
then apply path policies and a lifecycle channel per reference:
|
|
168
|
+
|
|
169
|
+
```json
|
|
170
|
+
{
|
|
171
|
+
"days": 90,
|
|
172
|
+
"scope": "direct",
|
|
173
|
+
"overrides": [
|
|
174
|
+
{ "paths": ["services/**"], "scope": "all" },
|
|
175
|
+
{ "paths": ["services/bedrock/**"], "days": 180, "via": "aws-bedrock" }
|
|
176
|
+
],
|
|
177
|
+
"routes": [
|
|
178
|
+
{ "paths": ["services/vertex/**"], "via": "vertex-ai" },
|
|
179
|
+
{
|
|
180
|
+
"paths": ["services/bedrock/**"],
|
|
181
|
+
"match": "chat-prod",
|
|
182
|
+
"model": "claude-3-7-sonnet-20250219",
|
|
183
|
+
"via": "aws-bedrock"
|
|
184
|
+
}
|
|
185
|
+
]
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Matching overrides apply in order: later scalar values win and ignore lists are
|
|
190
|
+
additive. The last matching route wins. Exact `match`/`model` pairs resolve a
|
|
191
|
+
repository deployment alias without making cloud or gateway references patchable.
|
|
192
|
+
Explicit CLI flags and Action inputs still take precedence. JSON inventory and
|
|
193
|
+
plan output records each reference's effective threshold, scope, requested
|
|
194
|
+
channel, and matching rule indexes, so a Bedrock service and a direct publisher
|
|
195
|
+
call in the same repository do not silently share one global clock.
|
|
196
|
+
|
|
165
197
|
## Same weights, different clocks
|
|
166
198
|
|
|
167
199
|
The same model retires on different dates per channel, and a checker that ignores
|
|
@@ -202,20 +234,24 @@ stay visible without generating false alarms.
|
|
|
202
234
|
The scanner covers code and configuration files with [`CODE_EXT`](lib/scanner.mjs)
|
|
203
235
|
as the source of truth - Python, TypeScript/JavaScript, JSON/YAML/TOML, shell,
|
|
204
236
|
Ruby, Go, Java, C#, Rust, C/C++, PHP, Swift, Kotlin, Terraform, SQL, Scala, and
|
|
205
|
-
Objective-C
|
|
206
|
-
|
|
237
|
+
Objective-C, including `.baml` sources. Publisher-compatible BAML provider/model
|
|
238
|
+
pairs are eligible plan targets; generated BAML clients and conservative
|
|
239
|
+
`DO NOT EDIT`/`@generated` sources are skipped. Model-eol's own JSON reports are
|
|
240
|
+
also skipped on reruns, while third-party CycloneDX files remain scannable unless
|
|
241
|
+
they carry explicit model-eol generator provenance. Terraform files (`.tf`,
|
|
242
|
+
`.tfvars`) are scanned while `.terraform` directories stay excluded.
|
|
207
243
|
|
|
208
244
|
## The bot
|
|
209
245
|
|
|
210
246
|
Copy `bot.yml.example` to `.github/workflows/model-eol-bot.yml` for a weekly run
|
|
211
247
|
that maintains exactly one labelled migration PR per retiring model (full feed
|
|
212
248
|
context in the body, never auto-merged) and one issue per finding that needs a
|
|
213
|
-
human. The workflow
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
without adding a project dependency:
|
|
249
|
+
human. The workflow resolves `model-eol@0` from npm once and reuses that exact
|
|
250
|
+
version across its plan, read-only evaluation, and write-token publication jobs;
|
|
251
|
+
consumer repositories do not copy `check.mjs` or the `bot/` source directory.
|
|
252
|
+
Dismissals are respected, reintroduced retired models create fresh work, and
|
|
253
|
+
bot-owned PRs/issues close when their finding disappears. Preview everything with
|
|
254
|
+
no GitHub calls and without adding a project dependency:
|
|
219
255
|
|
|
220
256
|
```sh
|
|
221
257
|
npx --yes --package=model-eol@0 model-eol-bot --dry-run --target-dir . --repo OWNER/REPO
|
|
@@ -224,21 +260,26 @@ npx --yes --package=model-eol@0 model-eol-bot --dry-run --target-dir . --repo OW
|
|
|
224
260
|
The workflow honors configured `days`, `scope`, and `via` values; without a config
|
|
225
261
|
it uses the bot defaults of 90 days and direct references. `eval.command` also
|
|
226
262
|
comes from the config unless the `MODEL_EOL_EVAL_COMMAND` repository variable is
|
|
227
|
-
set as an explicit workflow override.
|
|
228
|
-
|
|
229
|
-
|
|
263
|
+
set as an explicit workflow override. Each patchable model is applied in an
|
|
264
|
+
isolated checkout and evaluated independently with its own old/new IDs, timeout,
|
|
265
|
+
bounded report, and explicitly allowed environment. The content-bound result
|
|
266
|
+
manifest is also pinned to the evaluated Git commit, letting passing migrations
|
|
267
|
+
proceed while a failing peer remains blocked without publishing against a newer,
|
|
268
|
+
unevaluated default branch.
|
|
230
269
|
|
|
231
270
|
On its first actionable run, the bot creates the `model-eol` label. If repository
|
|
232
|
-
policy prevents label creation or assignment, it
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
271
|
+
policy prevents label creation or assignment, it fails closed rather than publish
|
|
272
|
+
work whose ownership cannot be authenticated. Existing work is trusted only when
|
|
273
|
+
the label, metadata, deterministic branch, repository, base, and Git lease agree.
|
|
274
|
+
For HTTPS remotes—including private repositories—the bot passes `GITHUB_TOKEN` to
|
|
275
|
+
temporary Git processes as a host-scoped authorization header and never places it
|
|
276
|
+
in a remote URL.
|
|
236
277
|
|
|
237
278
|
Two operational notes the hard way teaches: PRs created with `GITHUB_TOKEN` do not
|
|
238
279
|
trigger `pull_request` workflows (use a fine-grained PAT or GitHub App token when
|
|
239
280
|
checks must run, stored as the optional `MODEL_EOL_BOT_TOKEN` secret), and the
|
|
240
|
-
workflow splits privileges—provider keys live only in the read-only
|
|
241
|
-
write tokens only in the
|
|
281
|
+
workflow splits privileges—provider keys live only in the read-only evaluation
|
|
282
|
+
job, while write tokens live only in the reconciliation job.
|
|
242
283
|
|
|
243
284
|
## Keeping the feeds honest
|
|
244
285
|
|