feat(sync): add ai& sync module with auto-merge allowlist and motif family - #7040
islomjon-aiand wants to merge 10 commits into
Conversation
Action items
|
5ceebc2 to
ec88eae
Compare
Action items
|
ec88eae to
fc9e830
Compare
Action items
|
fc9e830 to
d9e921d
Compare
|
All three addressed with one rule: on base-factored files, lab-owned fields (name, description, family, release_date, last_updated, knowledge, open_weights) are never asserted from the feed — they come from the curated file, so authored overrides survive and new files inherit the lab entry (a test covers a new create whose feed disagrees with the lab). Feed reasoning_options now accept the full catalog shape: toggle/budget_tokens parse via the shared schema and pass through, while effort values stay leniently parsed so unknown vocabulary filters per value instead of aborting the run. |
|
No actionable findings. |
fenilmodi00
left a comment
There was a problem hiding this comment.
Rebased this onto current dev for you: fenilmodi00/models.dev@dev...fenilmodi00:models.dev:pr-7040-rebased
Cherry-pick those commits onto your branch and the merge conflicts are gone. The rebase keeps all 11 [interleaved] blocks from #6839 (your adapter preserves them via existing?.interleaved), reruns the sync against the live feed, and refreshes the kimi-k3 and gpt-oss-120b headers with a 2026-09-14 live probe. bun validate and the aiand test suite pass on it.
|
Thanks for the rebase, Fenil — adopted your branch and rebased once more onto current dev (one trivial conflict: |
d9e921d to
ee5249e
Compare
Action items
|
|
Both addressed: a curated |
Action items
|
|
All three addressed. The PR body now describes the rebased change set honestly — dev's #6839 already landed cache_read, the enforced levels, and the interleaved blocks, so the sync is a no-op on 8 of 11 files (that's the parity proof); the diff's real content is the motif lab file + factoring, the two Kimi |
Action items
|
|
Clean pass this time. Overrides now come from the authored TOML, not the base-resolved merge — that was the root cause behind the last few rounds. Lab fields on factored files only appear as deltas the file already had on its base_model, so a full-inline file factored for the first time inherits the lab entry (regression test added). All 11 headers cite the 2026-09-14 probe matrix, and the PR body has an evidence table mapping each claim to its source. |
|
No actionable findings. |
|
@fenilmodi00 branch is final — rebased on current dev, review bot clean, validate green, merge state clean. Ready when you are. |
|
Looks good to me. @rekram1-node — this is ready for a final review when you get a chance; you merged my earlier ai& PRs (#6839, #5806). |
…amily Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Rerun of the ai& sync after cherry-picking onto current dev. Interleaved reasoning_content blocks from anomalyco#6839 are preserved by the adapter (existing?.interleaved); motif-3 factors onto the new lab entry.
Live reasoning_effort probes on 2026-09-14 (negative controls included) confirm the authored effort sets are unchanged on the gateway.
The rebased regen kept dev's stale inline lab fields (open_weights = false, release_date 2026-08-12) as overrides against the new lab file. Lab facts now inherit from models/motif-technologies/motif-3.toml; the [interleaved] block from anomalyco#6839 is preserved. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…notice The feed owns deprecation and absence means active, so a curated deprecated no longer survives a feed that omits status (alpha/beta still do). A clean sync no longer emits a zero-count skip notice into the report. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… skips to missing-model issues Parse the feed's interleaved (authored fallback, gateway default of message.reasoning_content for reasoners) so a new reasoner is never created without its side channel; return skipped ids from missingModelID so the runner preserves local entries and opens deduped issues. qwen3.8 header records the 2026-09-14 probe including the announced high→xhigh substitution. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…s to the 2026-09-14 probes Lab-owned fields on factored files come only from deltas the authored file already carried on its base_model (context.authored, never the base-resolved merge), so a full-inline file factored for the first time inherits the lab entry instead of re-emitting stale values as overrides — the Motif regression in general form. Host fields stay feed-authoritative. All 11 headers now cite the 2026-09-14 probe matrix (11 models x 7 effort values). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
e92feb1 to
f454a50
Compare
Action items
|
…d created files with a reasoning-wire header preserveDescriptions is off so a full-inline → factored transition cannot recreate a lab-identical description override (runner-level test covers the Motif shape end to end). translateModel now returns a leading header for creates naming the reasoning wire path, so a toggle control is never written without it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Action items
|
…g [] be written A reasoner whose feed yields no schema-valid reasoning_options and has no authored set to keep now throws MissingReasoningOptionsError: the runner preserves the local file, reports the reason, and routes the id to the missing-model issue flow. An explicit [] from the feed remains the feed's own assertion. Runner-level test covers the untouched-file path. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Action items
|
…reasoning wire path
reasoning_effort ("none" = off) is the only control this host exposes, so
toggle and budget_tokens are parsed for tolerance but dropped from feed and
authored options alike; an emptied set falls through to the existing
fail-for-review path. The create header states the single wire path instead
of describing controls the host does not have.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
No actionable findings. |
Adds a sync module for ai& (
providers/aiand), whoseGET /v1/api.jsonpublishes this repo's shape directly — theaiandprovider entry is read and translation is near-identity. Registered in the sync registry and thedirectgroup, with anaiand:syncscript and an "ai& Notes" section insync.md.What this change set contains
The catalog side of this PR is smaller than it was: dev's #6839 (2026-09-11) already brought the ai& TOMLs to the live feed —
cache_readpricing, the gateway-enforced reasoning levels, refreshed headers, and the[interleaved]side-channel blocks — so after rebasing onto it,bun models:sync aiandagainst the live feed is a no-op for 8 of 11 files, which is the parity proof the adapter needs. What the diff does change:models/motif-technologies/motif-3.tomland the provider file factored onto it. Motif 3 is open-weights (155 safetensors shards, ungated, MIT — https://huggingface.co/Motif-Technologies/Motif-3), correcting the previous inlineopen_weights = false; tool calling and temperature are cited from the model card and a 2026-09-14 live probe (realtool_callsresponse; temperature reaches the sampler). Release date 2026-08-07 is the HF repo creation date.kimi-k2.7-code/kimi-k3:temperature = true— a host-specific delta from the feed (ai& forwards temperature and the engines honor it; lab files say false for Moonshot's own API).kimi-k3andgpt-oss-120bre-probed 2026-09-14 (effort sets unchanged);qwen3.8-27bdocuments thathighnow returns 200 via ai&'s announced substitution toxhigh(X-Reasoning-Effort), so it stays unlisted.Every published reasoning level on all 11 models was verified by live probe on 2026-09-14 (each returns 200; each unpublished value returns 400 or the announced substitution above).
Evidence
cache_read, limits, capability flags, modalitiesGET https://api.aiand.com/v1/api.json(aiandentry), accessed 2026-09-14 — the adapter's own input;bun models:sync aiand --dry-runis a no-op against itapi.aiand.comon 2026-09-14, 11 models × 7 values; each TOML's leading comment records its rowhigh→ 200 via substitution toxhighX-Reasoning-Effort: xhighon the response; documented inqwen3.8-27b.tomllicense:mit--tool-call-parser motif, evals at temperature 1.0) + live probe 2026-09-14 (realtool_callsresponse; temperature 0.2 vs 1.7 changes output)structured_output = falseresponse_format: json_schemaignored, prose replytemperature = trueon this hostAdapter authority policy
Host facts come from the feed: prices (including
cache_read), limits, capability flags, modalities, gateway-enforcedreasoning_options,deprecatedstatus, and the reasoning side channel (interleaved, with a gateway default ofmessage.reasoning_contentfor reasoners until the feed publishes it). Lab-owned fields —name,description,family,release_date,last_updated,knowledge,open_weights— are never asserted from the gateway on a factored file: they appear only as deltas the authored TOML already carried on top of itsbase_model(read fromcontext.authored(), never the base-resolved merge), so a full-inline file being factored for the first time, or a new file, inherits the lab entry outright. On a standalone file curated values win for those fields.New feed ids resolve their
base_modelby normalized match againstmodels/(full id, then unique filename — ai&'s lab prefixes differ from the directory names, e.g.deepseek-ai/vsmodels/deepseek/); an unresolvable new id is returned frommissingModelID, so the runner preserves any existing local entry and opens a deduped missing-model issue. An empty feed fails the run instead of authorizing deletion of the local catalog.familypasses throughModelFamily.safeParseand is omitted when unknown.reasoning_optionsfollow the feed's assertion exactly: an omitted list asserts nothing (authored options stay), an explicit[]asserts "no caller controls", a non-empty list whose effort values the schema doesn't know yet keeps the authored options; when a reasoner ends up with no schema-valid set and nothing authored, the model fails withMissingReasoningOptionsError(local file preserved, missing-model issue opened) rather than ever writing an invented[].toggle/budget_tokensare parsed (so a feed publishing one never aborts the run) but never written, from feed or authored file — ai& has a single reasoning wire path (reasoning_effort, "none" = off) and no separate toggle or token-budget field; created files get a leading header stating exactly that; omitted entirely on non-reasoners.preserveDescriptionsis off so the runner never re-injects a pre-factor description. A curatedalpha/betasurvives an omitted feed status; a curateddeprecateddoes not (the feed owns deprecation).Asks
aiandtoREVIEWED_REASONING_PROVIDERS— all 11 ai& models are reasoning models, so without it every hourly sync PR waits on a maintainer. The adapter's empty-options guard above is the safety argument: a feed vocabulary change can't strip caller controls and auto-merge that way.motiftoModelFamilyValues— needed by the new lab file; the adapter degrades gracefully (omits family) if you'd rather trim this.Validation
bun models:sync aiand --dry-run→ write → second dry run is a no-op (11 unchanged) →bun validatepasses →bun test(27 tests inpackages/core/test/aiand.test.tsplus the allowlist assertion inauto-merge.test.ts; the pre-existing failures ondevare untouched).