Skip to content

feat(sync): add Novita AI model catalog sync - #7050

Closed
Alex-yang00 wants to merge 27 commits into
anomalyco:devfrom
Alex-yang00:feat/novita-ai-model-sync
Closed

Alex-yang00 wants to merge 27 commits into
anomalyco:devfrom
Alex-yang00:feat/novita-ai-model-sync

Conversation

@Alex-yang00

@Alex-yang00 Alex-yang00 commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Add an hourly Novita AI catalog sync backed by https://api.novita.ai/openai/v1/models
  • Sync visible model pricing, limits, modalities, capabilities, and known provider reasoning controls
  • Create provider entries only when canonical lab metadata, usable pricing, and reasoning controls are known
  • Preserve local entries absent from the authenticated inventory (deleteMissing: false), because visibility may be account- or tier-scoped
  • Preserve provider-specific metadata that the inventory does not return; lab release dates and unchanged lab descriptions are inherited
  • Wire NOVITA_API_KEY into the hourly sync workflow

Data sources

Live reasoning verification

Requests were made directly to Novita POST /openai/v1/chat/completions using the exact provider model IDs.

  • thinking.type = enabled|disabled was checked per allowlisted toggle model by observing reasoning_content.
  • DeepSeek V4 Flash routes accept reasoning_effort = low|high|max; V4 Pro accepts high|max.
  • moonshotai/kimi-k3 accepted reasoning_effort = low|high|max; each request returned reasoning tokens and reasoning_content.
  • Qwen 3.5, 3.6, 3.7, 3.8, and the Novita Qwen3 Max route accept thinking_budget; a budget of 64 produced 64 reasoning tokens on the verified routes.
  • qwen/qwen3-max returns reasoning_content when thinking is enabled, despite the canonical Alibaba route being non-reasoning.
  • qwen/qwen3-235b-a22b-fp8 returned no reasoning content or reasoning tokens with thinking both enabled and disabled, so Novita overrides the lab reasoning capability to false.
  • qwen/qwen3-235b-a22b-thinking-2507 honors thinking_budget; a budget of 64 produced 64 reasoning tokens.
  • deepseek/deepseek-r1-turbo and baidu/ernie-4.5-vl-424b-a47b returned reasoning_content with thinking.type=enabled and none with disabled.
  • zai-org/glm-5.2 accepted reasoning_effort=none|high|max; none omitted reasoning content, high|max returned it.
  • deepseek/deepseek-r1-distill-llama-70b emitted reasoning in ordinary content under both thinking settings, without a separate reasoning side channel.
  • Novita's /models labels openai/gpt-oss-20b and openai/gpt-oss-120b as image-input routes, but live image requests produced answers that the models cannot view the supplied image, so both are represented as text-only.
  • moonshotai/kimi-k2.5 accepted even temperature=99; this does not demonstrate that sampling temperature is respected, so the Novita override was dropped in favor of the lab default.
  • minimax/minimax-m2.1 returned reasoning_content with thinking.type both enabled and disabled, so it is represented as always-on reasoning with reasoning_options = [].

Stale route verification

The following retained routes were removed only after direct chat-completion requests returned exact 404 MODEL_NOT_FOUND; absence from the account-scoped model list alone was not used as deletion evidence:

  • xiaomimimo/mimo-v2-flash
  • xiaomimimo/mimo-v2-pro
  • qwen/qwen3-4b-fp8
  • qwen/qwen3-8b-fp8
  • qwen/qwen3-30b-a3b-fp8
  • qwen/qwen3-32b-fp8
  • qwen/qwen3-next-80b-a3b-thinking
  • qwen/qwen3-vl-30b-a3b-thinking
  • deepseek/deepseek-r1-distill-qwen-14b
  • deepseek/deepseek-r1-distill-qwen-32b
  • baidu/ernie-4.5-21B-a3b-thinking
  • baidu/ernie-4.5-vl-28b-a3b-thinking
  • baidu/ernie-4.5-vl-28b-a3b
  • inclusionai/ring-2.6-1t
  • zai-org/glm-4.5
  • deepseek/deepseek-prover-v2-671b
  • inclusionai/ling-2.6-1t
  • inclusionai/ling-2.6-flash
  • kwaipilot/kat-coder-pro
  • qwen/qwen2.5-vl-72b-instruct
  • sao10K/L3-8B-stheno-v3.2
  • sao10K/l3-70b-euryale-v2.1
  • sao10K/l3-8b-lunaris
  • sao10K/l31-70b-euryale-v2.2
  • qwen/qwen3-vl-8b-instruct

Safety behavior

  • baidu/ernie-4.5-21B-a3b returned 429 and deepseek/deepseek-r1-0528-qwen3-8b returned 503; neither was deleted based on transient responses.
  • The authenticated model inventory is not authoritative for deletion. Existing files missing from the response are retained.
  • Non-chat, zero-context, and unpriced rows do not create missing-model issues or skipped-model notices.
  • Empty responses are rejected.
  • Partial features arrays only add positive capability claims and cannot erase inherited capabilities.
  • Generated reasoning wire headers replace stale generated headers while curated comments are preserved when no generated header exists.

Required repository secret

The sync job requires the NOVITA_API_KEY repository secret.

Validation

  • bun test packages/core/test/novita-ai.test.ts - 31 passed
  • bun validate - passed
  • Live bun models:sync novita-ai --dry-run --no-issues - 0 created, 0 updated, 0 removed, 101 unchanged
  • Full packages/core/test/sync.test.ts - new header regression test passes; two unrelated pre-existing failures remain (Hyper reasoning inheritance and DeepInfra live modalities)

@Alex-yang00
Alex-yang00 marked this pull request as ready for review September 18, 2026 05:37
@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] packages/core/src/sync/providers/novita-ai.ts:143 - Check: Capability flags must not treat a present-but-incomplete features list as authoritative false. Why: features?.has("reasoning"|"function-calling"|"structured-outputs") returns false for an empty or partial features array, and false ?? resolved never falls back, so existing reasoners/tool models can be rewritten to reasoning = false / tool_call = false and lose reasoning_options on the next hourly sync. The unit test only covers features === undefined. Action: Treat capability inheritance as “API claims only when the feature key is present in a non-empty features set” (or require explicit true/false fields); never map absence inside a partial list to false over resolved/authored values.
  • [high] [violation] packages/core/src/sync/providers/novita-ai.ts:1548 - Check: missingModelID must mark only skips that need manual catalog work, not every untranslated remote ID. Why: missingModelID always returns model.id, so non-LLM rows (now parseable with context_size: 0), unpriced IDs, and unverified reasoners all enter the missing-model issue flow and can never be intentional silent skips. That will spam [missing-model] novita-ai: … issues and retain any local file that collides with those IDs. Action: Return an ID only for skips that need lab metadata / verified reasoning controls; intentionally ignore image/embedding/other non-chat catalog junk (and document the filter in sync.md).
  • [high] [possible mistake] providers/novita-ai/models/qwen/qwen3-max.toml:1 - Check: Provider reasoning / reasoning_options must match this host and the lab baseline, not invent always-on reasoning. Why: Lab models/alibaba/qwen3-max.toml and first-party Alibaba mark reasoning = false, but this PR flips the Novita entry to reasoning = true with reasoning_options = [] (same pattern on qwen3-next-80b-a3b-instruct). On a multi-lab relay, [] means “no caller control,” not “uncertain,” and contradicts the lab non-reasoner baseline unless Novita truly forces hidden CoT. Action: Verify on Novita chat/completions whether these IDs actually emit reasoning tokens/content; if not, keep reasoning = false and drop reasoning_options; if yes and controllable, author the real wire control (with leading comment), not [].
  • [medium] [possible mistake] providers/novita-ai/models/deepseek/deepseek-v4.1-flash.toml:1 - Check: Relay reasoning options must start from the lab/same-surface peer set for that model. Why: New V4.1 Flash is authored as toggle-only, while DeepSeek/OpenRouter peers for V4.1 Flash expose graded reasoning_effort (low/high/max or equivalent) in addition to on/off. The header only documents toggle. Action: Live-check whether Novita accepts effective reasoning_effort (or equivalent) for deepseek/deepseek-v4.1-flash and other V4 Flash IDs; if yes, add the real effort values; if no, keep toggle-only and note that effort is not exposed on this host.
  • [medium] [violation] providers/novita-ai/models/deepseek/deepseek-v3.2.toml:1 - Check: Every toggle needs a leading top-of-file wire-path comment. Why: Sync rewrites many toggle reasoners (deepseek-v3.2, kimi-k2.5, qwen3.5-*, glm-4.7-flash, …) with [[reasoning_options]] type = "toggle" but only emits the thinking.type header for VERIFIED_THINKING_TOGGLE IDs. AGENTS.md requires the exact wire path above the first key for every toggle. Action: Emit/preserve a leading # Toggle: … comment for every Novita model that keeps or gains a toggle (reuse the verified thinking.type path where that is the control).

@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] providers/novita-ai/models/deepseek/deepseek-v3.2.toml:1 - Check: Every toggle reasoning control needs a leading top-of-file wire-path comment. Why: The PR rewrites many existing Novita reasoners to [[reasoning_options]] type = "toggle" (and keeps toggle+effort on DeepSeek V4) without any leading # Toggle: … comment. Sync only emits VERIFIED_TOGGLE_HEADER for the hard-coded VERIFIED_THINKING_TOGGLE IDs, so preserved/authored toggles stay comment-less on every future run. Action: Backfill a leading wire comment on every Novita file that has toggle, and make translateModel attach that header whenever the translated model’s reasoning_options include toggle (same pattern as OpenRouter/ai&), not only for the verified-ID allowlist.
  • [high] [possible mistake] providers/novita-ai/models/deepseek/deepseek-v4-pro.toml:7 - Check: Reasoning effort must match this host’s real controls / lab + same-surface peers, not an invented GPT-style ladder. Why: Final Novita V4 Pro keeps effort = ["low","medium","high","xhigh"] and V4 Flash keeps ["minimal","low","medium","high","xhigh"], while first-party DeepSeek is high/max (Flash also low), and the PR’s own notes say unknown effort must not be published. These files are rewritten here and will be frozen by sync via preserved reasoning_options. Action: Verify Novita’s actual reasoning_effort (or equivalent) for these routes; if unverified, drop effort to lab/peer-safe values or toggle-only after live proof—do not keep the L/M/H/xhigh ladder by default.
  • [medium] [violation] providers/novita-ai/provider.toml:4 - Check: Provider-level reasoning docs must match the wire syntax the catalog claims. Why: provider.toml still documents top-level enable_thinking for a small GLM/DeepSeek set, while new/updated model headers and VERIFIED_TOGGLE_HEADER claim thinking.type = enabled|disabled. Consumers reading the provider file will use the wrong control. Action: Update the provider.toml reasoning comment block so it documents the verified thinking.type path (and any remaining enable_thinking models, if still accurate), consistent with the model headers.
  • [medium] [possible mistake] packages/core/src/sync/providers/novita-ai.ts (deleteMissing: true) - Check: Authoritative deletion only when the source catalog is complete for the automation account. Why: The PR enables deleteMissing: true and deletes dozens of local models, while the original PR summary still describes an account-scoped inventory that should retain missing locals. A partial/key-scoped list plus deletion permanently drops still-served models (the 50% guard only stops large shrinks). Action: Confirm with a first-party Novita reference that /openai/v1/models is a full public catalog for NOVITA_API_KEY; if it can be account- or tier-scoped, set deleteMissing: false (or only delete with a stronger completeness signal).

@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] providers/novita-ai/models/minimax/minimax-m2.1.toml - Check: Provider overrides must not contradict lab/base_model capability facts without host-specific evidence. Why: The factored entry keeps reasoning = false while base_model = "minimax/MiniMax-M2.1" (lab + first-party MiniMax + OpenRouter peers are reasoning = true, usually with reasoning_options = []). That publishes a false non-reasoner and leaves a dangling [interleaved] side channel on a model marked non-reasoning. Action: Drop the reasoning = false override (inherit lab true), author reasoning_options for this host (peer-style [] unless Novita exposes a real control), and keep/remove interleaved consistently with that choice.
  • [medium] [violation] packages/core/src/sync/providers/novita-ai.ts (authoritativeHeaders / translateModel header) - Check: authoritativeHeaders must not erase curated leading comments when the translator has nothing to write. Why: With authoritativeHeaders: true, the runner sets header = translatedHeader ?? "". Header is only emitted when the translated model has a toggle; every other model (effort-only, [], non-reasoners, source notes) gets undefined → empty header, so hourly sync wipes existing leading comments. Action: Either stop setting authoritativeHeaders, or always return a deliberate header (including undefined meaning “leave existing”), or only replace headers when translated.header is non-empty.
  • [medium] [possible mistake] providers/novita-ai/models/meta-llama/llama-3.3-70b-instruct.toml - Check: Synced limits should match the host’s real context/output, not a truncated inventory value. Why: Context/output collapse from 131_072 / 120_000 to 12_288 / 12_288 while the lab default is ~128k; that is a large capability regression if the API field is wrong or incomplete. Action: Confirm against Novita’s model-detail/docs for this ID; if 12k is wrong, restore the real limits (or omit so lab defaults apply) and cite the source in the PR body.

@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] packages/core/src/sync/providers/novita-ai.ts / providers/novita-ai/models/deepseek/deepseek-v4-*.toml - Check: Relay reasoning_options must follow lab + same-surface peer controls for the model, not an incomplete set from partial testing. Why: Final sync forces toggle-only for deepseek-v4-flash / deepseek-v4-pro (VERIFIED_TOGGLE_ONLY) and creates deepseek-v4.1-flash, deepseek-v4-flash-0731, and deepseek-v4-flash-vision-exp with only { type = "toggle" }. First-party DeepSeek and established relays expose toggle plus effort (e.g. lab low|high|max / high|max; OpenRouter high|xhigh or low|high|max). Comment text that effort “was not verified” is uncertainty, not affirmative proof that Novita has no effort wire field—publishing toggle-only encodes “no effort control” and will keep re-stripping real effort on future syncs. Action: Live-test Novita reasoning_effort (or the real effort path) for each DeepSeek V4 ID; author the verified effort list with the toggle, or document host-proof that effort is ignored and keep toggle-only only after that proof. Update VERIFIED_TOGGLE_ONLY / create lists so automation cannot regress peer-complete controls.
  • [high] [possible mistake] packages/core/src/sync/providers/novita-ai.ts (deleteMissing: true) - Check: Deletion is safe only when the remote inventory is the full public catalog, not account-scoped. Why: The PR enables authoritative deletes (plus a 50% shrink guard) and removes a large set of existing Novita TOMLs. The PR body still describes account-scoped inventory retention, while authenticated /v1/models endpoints are commonly visibility-scoped (OpenAI/Merge Gateway keep deleteMissing: false for that reason). A key that sees a subset will permanently drop still-served models once under the fraction guard. Action: Confirm with Novita docs or multi-account inventory that this endpoint is the complete public catalog for every automation key; if not, set deleteMissing: false (or only delete IDs proven retired) and restore any still-served removals.
  • [medium] [possible mistake] providers/novita-ai/models/qwen/qwen3-max.toml - Check: Provider reasoning / reasoning_options overrides must match this host’s real behavior relative to lab metadata and peers. Why: Lab models/alibaba/qwen3-max.toml and OpenRouter’s qwen3-max entry are non-reasoning; this PR sets reasoning = true, interleaved, and toggle controls. That is a large capability flip on a flagship ID if Novita only accepts thinking.type without actually producing reasoning. Action: Keep the override only with clear host evidence (sample request/response showing reasoning tokens/reasoning_content on and off). Otherwise drop reasoning / reasoning_options / interleaved and leave the model non-reasoning like the lab and peers.
  • [medium] [possible mistake] providers/novita-ai/models/qwen/qwen3.5-plus.toml (and other new Qwen 3.5/3.6/3.7/3.8 Novita reasoners) - Check: Relay options should be the intersection of lab controls this host actually exposes. Why: Alibaba first-party Qwen 3.5+ reasoners commonly use toggle + budget_tokens (thinking_budget). These Novita files publish toggle-only. That is valid only if Novita does not forward a reasoning budget; if it does, toggle-only understates caller control the same way incomplete DeepSeek effort does. Action: Verify whether Novita accepts thinking_budget / equivalent on these routes; add budget_tokens when present, or note in the leading header that budget is unsupported on this host so future syncs do not look like unfinished ports.

@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] packages/core/src/sync/providers/novita-ai.ts - Check: reasoning_options precedence must match the verified DeepSeek V4 control sets the PR claims to publish. Why: Final order still evaluates VERIFIED_THINKING_TOGGLE before the Flash effort branch. deepseek/deepseek-v4-flash-0731 remains in that toggle set, so hourly sync will rewrite the new toggle + effort file back to toggle-only. deepseek/deepseek-v4-flash-vision-exp is also in VERIFIED_THINKING_TOGGLE while VERIFIED_TOGGLE_ONLY and the TOML disagree (toggle-only vs effort). Action: Make each ID appear in exactly one control path. Remove Flash-0731 (and any other effort-verified Flash IDs) from VERIFIED_THINKING_TOGGLE, and either keep vision-exp as verified toggle-only (strip effort from its TOML) or move it onto the same effort list and drop it from both toggle-only sets. Add a unit test that re-translating each of these IDs yields the committed option set.
  • [high] [violation] providers/novita-ai/models/deepseek/deepseek-v4-flash-0731.toml - Check: TOML must not duplicate reasoning_options or wire comments. Why: Patch 15 inserts the Effort header and [[reasoning_options]] type = "effort" block twice. Consumers see a malformed control surface, and the next sync cannot “heal” this cleanly while the precedence bug above remains. Action: Keep a single # Effort: reasoning_effort = low|high|max comment and a single effort option block with values = ["low", "high", "max"].
  • [high] [violation] providers/novita-ai/models/qwen/qwen3.6-27b.toml (and sibling qwen3.6-35b-a3b, qwen3.6-plus, qwen3.8-27b, qwen3.8-flash, qwen3.8-max) - Check: Catalog files must match verified host controls for every ID in VERIFIED_BUDGET_TOGGLE. Why: Sync now emits toggle + budget_tokens for these Qwen IDs (and lab/Alibaba peers use that shape), but only qwen3-max.toml and qwen3.5-plus.toml were updated. The other six new entries remain toggle-only without a Budget wire comment, so the committed catalog understates controls the PR says were live-tested. Action: Add [[reasoning_options]] type = "budget_tokens" plus a leading # Budget: thinking_budget (integer reasoning tokens) comment to every VERIFIED_BUDGET_TOGGLE Novita file, or remove those IDs from the budget set if budget was not actually verified on those routes.
  • [medium] [possible mistake] providers/novita-ai/models/qwen/qwen3-max.toml - Check: Provider reasoning overrides must not contradict lab/first-party facts without host-specific evidence. Why: models/alibaba/qwen3-max.toml and providers/alibaba/models/qwen3-max.toml both set reasoning = false, while this PR publishes Novita reasoning = true with toggle + budget. That is only valid if Novita’s route truly enables thinking for this ID. Action: Confirm live Novita chat/completions behavior for qwen/qwen3-max (thinking on/off and thinking_budget), cite that evidence in the PR body, or drop the reasoning override and keep it non-reasoning like the lab entry.

@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [high] [possible mistake] providers/novita-ai/models/qwen/qwen3-max.toml:1 - Check: Host reasoning must match this API’s real controls and not invent a reasoner when lab/peers do not. Why: Lab models/alibaba/qwen3-max.toml and first-party providers/alibaba/models/qwen3-max.toml both set reasoning = false; OpenRouter also factors it as non-reasoning. This PR forces reasoning = true plus toggle + budget_tokens and keeps that in VERIFIED_BUDGET_TOGGLE. That can mislabel a non-thinking Max route (or confuse it with a thinking variant). Action: Confirm live Novita chat/completions for qwen/qwen3-max actually returns reasoning tokens under thinking.type / thinking_budget. If not, drop the reasoning override and remove it from VERIFIED_BUDGET_TOGGLE. If yes, keep the override and cite the host-specific evidence in the PR body.
  • [high] [possible mistake] providers/novita-ai/models/deepseek/deepseek-v4-flash-vision-exp.toml:1 - Check: Relay DeepSeek V4 controls should follow lab/same-surface peers unless this host is proven narrower. Why: First-party providers/deepseek/models/deepseek-v4-flash-vision-exp.toml uses toggle + effort low|high|max. Novita V4 Flash / V4.1 Flash siblings in this PR use the same effort set, but vision-exp is hard-coded toggle-only via VERIFIED_TOGGLE_ONLY and the tests lock that in. Action: Re-test reasoning_effort on Novita for this ID. If effort works, publish toggle + ["low","high","max"] (and the Effort wire comment). If effort is ignored, keep toggle-only and document that host-specific finding next to the model/sync allowlist.
  • [medium] [violation] packages/core/src/sync/providers/novita-ai.ts - Check: Leading wire comments must document every published control (toggle, and effort/budget when present). Why: translateModel only emits the toggle header (plus a budget line for Qwen). DeepSeek V4 effort routes still get effort in reasoning_options, but the generated header never includes # Effort: reasoning_effort = …. Hand-edited files currently carry those comments, but creates/re-syncs will not. Action: Build the header from the actual option set (toggle + effort values and/or budget), matching the TOML comments already present on the V4 Flash/Pro files.
  • [low] [possible mistake] packages/core/src/sync/providers/novita-ai.ts - Check: Provider flags should match the deletion policy they claim. Why: Final config sets deleteMissing: false (correct for account-scoped inventory) but still sets maxMissingFraction: 0.5. The runner only evaluates that guard when deletions are enabled, so the shrink guard never runs. Action: Remove the unused maxMissingFraction (and any tests that only exist for it), or re-enable deletions only if the endpoint is proven complete for this key.

@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] providers/novita-ai/models/qwen/qwen3.5-27b.toml:1 - Check: Reasoning options must follow lab + same-surface peers (AGENTS.md / audit skill). Why: These Novita Qwen 3.5/3.7 routes are factored onto Alibaba lab models whose first-party entries use toggle + budget_tokens, and this PR already publishes that pair for qwen3.5-plus / qwen3.6* / qwen3.8* / qwen3-max after live thinking_budget checks. The same PR only authors toggle (plus a wire header) for qwen3.5-27b, qwen3.5-35b-a3b, qwen3.5-122b-a10b, qwen3.5-397b-a17b, and qwen3.7-max, and the sync allowlist never maps them to budget. That understates caller controls relative to lab/peers on the same host. Action: Either add verified budget_tokens (+ budget wire comment) for those IDs in the TOMLs and VERIFIED_BUDGET_TOGGLE, or document live proof that Novita rejects/ignores thinking_budget on each ID and keep toggle-only deliberately.
  • [high] [possible mistake] packages/core/src/sync/providers/novita-ai.ts (final deleteMissing: false) / deleted providers/novita-ai/models/** - Check: Deletions must be authoritative for the served catalog (sync.md). Why: The PR body and final Novita notes say the authenticated inventory can be account/tier-scoped and must not drive removals, and the sync module ends with deleteMissing: false. The same PR still deletes dozens of existing Novita model files (Baidu, DeepSeek, Qwen, Llama, Sao10K, Xiaomi, ZAI, etc.). If those IDs are only invisible to the automation key, the catalog permanently loses still-served models. Action: Restore any IDs still offered publicly (or still intended in the catalog), and cite a non-account-scoped source for each intentional removal; do not ship bulk deletes from a scoped key response.
  • [medium] [violation] providers/novita-ai/models/qwen/qwen3.5-27b.toml (and peer Qwen 3.5/3.7 + several GLM/DeepSeek toggle files) - Check: Toggle reasoners on this host should expose the verified reasoning side channel. Why: Headers claim live checks where disabling thinking.type removes reasoning_content, and many new/updated routes correctly set [interleaved] field = "reasoning_content". Several toggle-only updates omit interleaved entirely (e.g. qwen3.5-27b, qwen3.5-35b-a3b, qwen3.5-122b-a10b, qwen3.5-397b-a17b, qwen3.7-max, zai-org/glm-4.7-flash, deepseek/deepseek-v3.1), so clients cannot discover the side channel the verification depends on. Action: Add interleaved = { field = "reasoning_content" } wherever the toggle was verified to emit reasoning_content, and make the sync path set that for those IDs on create/update.
  • [medium] [violation] providers/novita-ai/models/deepseek/deepseek-v3.2-exp.toml:1 - Check: Non-lab hosts must use base_model when the lab model is nameable (AGENTS.md). Why: Novita did not create DeepSeek V3.2 Exp; the file remains a full inline lab definition while sibling DeepSeek routes were factored. There is no models/deepseek/deepseek-v3.2-exp.toml on the base revision. Action: Add a complete models/deepseek/deepseek-v3.2-exp.toml lab entry and reduce the Novita file to override-only (cost, reasoning_options, interleaved, real deltas). Apply the same pattern to any other still-inline third-party Novita DeepSeek routes (e.g. deepseek-v3.1-terminus) that are nameable lab models.
  • [low] [possible mistake] providers/novita-ai/models/minimax/minimax-m2.1.toml:1 - Check: Provider overrides must not invent inconsistent reasoning metadata. Why: The final file drops the prior reasoning = false override, keeps [interleaved], and sets reasoning_options = [] while base_model = "minimax/MiniMax-M2.1" inherits reasoning = true. That is coherent only if Novita always-on reasons with no caller control; it is wrong if the route is non-reasoning or toggleable. Action: Confirm Novita’s live behavior for minimax/minimax-m2.1 and either keep an explicit non-reasoning override, always-on [], or a verified toggle—not a mix of interleaved + ambiguous inheritance.

@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] providers/novita-ai/models/zai-org/glm-4.5.toml:1 - Check: Non-lab hosts must use base_model when the lab model is nameable; provider files stay override-only. Why: Lab metadata already exists at models/zhipuai/glm-4.5.toml, and peers (OpenRouter, Vercel, Kilo) point at zhipuai/glm-4.5. This restore is a full inline third-party definition. Action: Set base_model = "zhipuai/glm-4.5" and keep only Novita deltas (cost, reasoning_options, interleaved, real overrides).
  • [high] [violation] providers/novita-ai/models/zai-org/glm-4.5.toml:12 - Check: Every toggle needs a leading top-of-file wire-path comment. Why: The file authors [[reasoning_options]] type = "toggle" with no # Toggle: … header, so consumers cannot tell the request field. Action: Add a leading header such as # Toggle: thinking.type = enabled|disabled (matching the verified Novita control used elsewhere).
  • [high] [violation] providers/novita-ai/models/xiaomimimo/mimo-v2-flash.toml:1 - Check: Non-lab hosts must use base_model when lab metadata exists. Why: models/xiaomi/mimo-v2-flash.toml already exists; this is a full inline Novita copy. Action: Use base_model = "xiaomi/mimo-v2-flash" and keep only provider-specific fields.
  • [high] [possible mistake] providers/novita-ai/models/xiaomimimo/mimo-v2-flash.toml:8 - Check: On relays, [] means affirmative no caller control, not uncertainty; baseline is lab/peer controls. Why: First-party Xiaomi publishes a thinking toggle for this model; restoring reasoning_options = [] without evidence that Novita has no control risks under-reporting. Action: Verify Novita’s wire controls; if toggle works, publish toggle (+ header); only keep [] with affirmative no-control evidence.
  • [high] [violation] providers/novita-ai/models/deepseek/deepseek-r1-distill-qwen-32b.toml:1 - Check: Non-lab hosts must use base_model when lab metadata exists; do not restate contradictory lab facts. Why: models/deepseek/deepseek-r1-distill-qwen-32b.toml has reasoning = true, but this restore is full-inline with reasoning = false. Action: Point base_model at the lab entry; only override true Novita deltas (and correct reasoning if Novita actually serves it as non-reasoning).
  • [high] [violation] providers/novita-ai/models/qwen/qwen3-30b-a3b-fp8.toml:1 - Check: Non-lab hosts must use base_model when the underlying lab model is nameable. Why: Lab metadata exists as alibaba/qwen3-30b-a3b (OpenRouter already factors it). Full inline FP8 restore skips inheritance. Action: Use base_model = "alibaba/qwen3-30b-a3b" (or add a dedicated FP8 lab entry if FP8 is a distinct identity) and keep only Novita overrides.
  • [high] [possible mistake] providers/novita-ai/models/qwen/qwen3-30b-a3b-fp8.toml:7 - Check: Relay reasoning_options should follow lab/same-surface peers, not invent bare []. Why: Lab marks reasoning; OpenRouter exposes a toggle for qwen3-30b-a3b. Restoring reasoning = true + [] without host evidence is the uncertainty anti-pattern. Action: Match verified Novita controls (toggle/budget/effort) or document affirmative no-control before keeping [].
  • [high] [violation] providers/novita-ai/models/qwen/qwen3-32b-fp8.toml:1 - Check: Same base_model requirement for nameable lab models. Why: models/alibaba/qwen3-32b.toml exists; OpenRouter uses base_model = "alibaba/qwen3-32b". Action: Factor through that lab entry and keep only Novita-specific fields.
  • [high] [possible mistake] providers/novita-ai/models/qwen/qwen3-32b-fp8.toml:7 - Check: Peer baseline for Qwen3 32B reasoning controls. Why: OpenRouter publishes a toggle; this restore uses [] with no Novita verification note. Action: Align with verified Novita controls or provide affirmative no-control evidence.
  • [high] [violation] providers/novita-ai/models/qwen/qwen3-next-80b-a3b-thinking.toml:1 - Check: Non-lab hosts must use base_model when lab metadata exists. Why: models/alibaba/qwen3-next-80b-a3b-thinking.toml exists and OpenRouter already factors it; this is a full inline definition. Action: Set base_model = "alibaba/qwen3-next-80b-a3b-thinking" and keep only Novita deltas (cost, real limit/modality overrides, verified reasoning_options).
  • [medium] [possible mistake] providers/novita-ai/models/deepseek/deepseek-r1-distill-qwen-14b.toml:6 - Check: Reasoning capability must match the model identity / lab facts. Why: Restored as reasoning = false under a DeepSeek-R1-distill family/name with no lab entry and no verification that Novita strips reasoning. Action: Confirm Novita behavior; if it reasons, set reasoning = true with correct reasoning_options (and add lab metadata + base_model if nameable).
  • [medium] [possible mistake] providers/novita-ai/models/qwen/qwen3-vl-30b-a3b-thinking.toml:1 - Check: Display name and reasoning flag for thinking-labeled models. Why: name is the raw path qwen/qwen3-vl-30b-a3b-thinking and reasoning = false on a “thinking” ID, which is internally inconsistent. Action: Use a human display name and set reasoning/options from verified Novita behavior (plus base_model if lab metadata can be named).
  • [medium] [violation] providers/novita-ai/models/minimax/minimax-m2.1.toml:1 - Check: reasoning_options is only valid when the resolved model is a reasoner; empty options mean always-on reasoning with no caller control. Why: After removing reasoning = false, this inherits reasoning = true from minimax/MiniMax-M2.1 while the leading comment claims no control—but the file still carries reasoning_options = [] plus interleaved. That can be correct only if Novita always emits reasoning. Action: Confirm the live behavior once more; if reasoning is not always on, restore an explicit local reasoning override and drop or fix reasoning_options/interleaved accordingly.
  • [low] [possible mistake] providers/novita-ai/models/deepseek/deepseek-v3-turbo.toml:1 - Check: Model display names should not include stray control characters. Why: Restored name is DeepSeek V3 (Turbo) with a trailing tab. Action: Strip the trailing whitespace/tab from name (same issue on sao10K/l3-70b-euryale-v2.1.toml / l3-8b-lunaris.toml if still present).

@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] providers/novita-ai/models/qwen/qwen3-4b-fp8.toml:6 - Check: Relay reasoning = true must use verified host controls; [] means affirmative no control, not uncertainty (AGENTS.md Reasoning options). Why: Restored Novita Qwen3 FP8 routes reintroduce reasoning_options = [] with no live Novita verification, while sibling Qwen3 routes in this PR use toggle (+ budget where tested). That publishes false “always-on / no control” capability. Action: Either verify each route and author the real Novita wire controls (with leading comments), or omit/skip these entries until verified; do not keep [] from restoration alone. Same for qwen3-8b-fp8.toml and any other restored reasoners still on [] without host evidence.
  • [high] [violation] providers/novita-ai/models/qwen/qwen3-30b-a3b-fp8.toml:1 - Check: Do not invent relay reasoning controls from peers when this host was not verified. Why: Comment admits the route is no longer returned by Novita, then authors toggle + interleaved from a “same-surface Qwen3 baseline.” For a multi-model relay that is not an evidence-backed host control. Action: Drop invented toggle/interleaved (or the whole stale entry if the ID is gone), or re-verify on Novita chat/completions and document the wire path. Apply the same fix to qwen3-32b-fp8.toml and xiaomimimo/mimo-v2-flash.toml (first-party baseline copied without Novita proof).
  • [high] [violation] providers/novita-ai/models/deepseek/deepseek-v3-0324.toml:1 - Check: Non-lab hosts must use base_model when the lab model is nameable; add complete models/ metadata if missing. Why: models/deepseek/deepseek-v3-0324.toml already exists, but the restored provider file is a full inline definition (name/description/capabilities/limits/modalities) instead of override-only base_model + provider deltas. That breaks the lab/provider split and will fight the new sync factoring path. Action: Factor through base_model = "deepseek/deepseek-v3-0324" and keep only real Novita overrides (cost, limit deltas, etc.). Audit other restored full-inline files the same way whenever a lab id exists or can be added.
  • [medium] [violation] packages/core/src/sync/providers/novita-ai.ts (sourceID / skippedNotice / missingModelID) - Check: Skipped remote IDs and missing-model tracking must match intentional catalog scope. Why: sourceID always returns every remote id, so skippedNotice lists non-chat, zero-context, and unpriced rows that missingModelID correctly ignores. Hourly sync notices/PR bodies will be noisy and mislabel image/embedding rows as “needing lab metadata.” Action: Align sourceID (or skippedNotice) with the same chat/priced filters as missingModelID, or only push IDs that are real catalog candidates into skippedRemote.
  • [medium] [possible mistake] packages/core/src/sync/providers/novita-ai.ts (translate header without authoritativeHeaders) - Check: Toggle/effort/budget wire comments must stay accurate on re-sync. Why: Headers are emitted for toggle models, but without authoritativeHeaders the runner keeps any existing leading comment block. Files that later gained effort/budget (or corrected wire text) can keep stale toggle-only headers forever. Action: Enable authoritativeHeaders for Novita (like Friendli/CF AI Gateway) or otherwise ensure verified control headers replace outdated ones on update.

@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] packages/core/src/sync/providers/novita-ai.ts - Check: Non-chat catalog rows must not become provider model TOMLs. Why: catalogCandidateID() is only wired to sourceID / missingModelID. translateModel still runs buildNovitaModel on every parsed row, so image/embedding/other non-chat entries that resolve a lab base and price can still create or overwrite providers/novita-ai/models/** entries. sourceID is only consulted when translation returns undefined. Action: Gate translateModel (or buildNovitaModel) with the same chat/completions + usable-context + priced candidate check before writing any model.
  • [high] [violation] providers/novita-ai/models/deepseek/deepseek-ocr.toml:1, providers/novita-ai/models/deepseek/deepseek-v3-turbo.toml:1, providers/novita-ai/models/meta-llama/llama-3-70b-instruct.toml:1, providers/novita-ai/models/meta-llama/llama-3-8b-instruct.toml:1, providers/novita-ai/models/meta-llama/llama-3.2-3b-instruct.toml:1, providers/novita-ai/models/qwen/qwen2.5-7b-instruct.toml:1, providers/novita-ai/models/baidu/ernie-4.5-300b-a47b-paddle.toml:1 - Check: Non-lab hosts must use base_model (and add complete models/<lab>/… metadata when missing). Why: Patch 18/19 restored these as full inline third-party definitions for nameable lab models, while peers such as deepseek-ocr-2 and llama-3.3-70b-instruct were correctly factored. That breaks the override-only / lab-metadata rule. Action: For each restored nameable lab model, add or reuse models/<lab>/<id>.toml and rewrite the Novita file as base_model + provider deltas only (cost, real limit/modality overrides, host reasoning controls).
  • [medium] [possible mistake] providers/novita-ai/models/moonshotai/kimi-k3.toml:3 - Check: Effort values and wire comments must match this host’s verified control surface. Why: The file keeps lab-like effort = ["low","high","max"] and the new header claims reasoning_effort = low|high|max, but the PR body only documents toggle verification for allowlisted models and does not show a live Novita effort check for Kimi K3. First-party Moonshot documents output_config.effort, not necessarily reasoning_effort. Action: Either verify on Novita that reasoning_effort (or the real field) accepts low|high|max and keep the matching wire comment, or drop the unverified effort ladder/comment and keep only the tested toggle.
  • [medium] [possible mistake] providers/novita-ai/models/zai-org/glm-4.5.toml:1 - Check: Every toggle needs an accurate leading wire-path comment for this host. Why: Restored glm-4.5 documents # Toggle: enable_thinking = true|false, while other Novita GLM routes in this PR (glm-4.5-air, glm-4.5v, glm-4.6, glm-5, …) document thinking.type = enabled|disabled. Mixed wire syntax on one host is likely wrong for at least one family member. Action: Live-check zai-org/glm-4.5 on Novita and align the header (and allowlist, if needed) to the field that actually toggles reasoning_content.
  • [medium] [violation] packages/core/src/sync/providers/novita-ai.ts (VERIFIED_* sets) - Check: reasoning = true provider models must keep host-accurate reasoning_options under sync, not only when a prior file already had them. Why: Several toggle routes ship verified headers/options in TOML (deepseek-v3.2, kimi-k2.5, kimi-k2.6, glm-4.6, glm-4.7, glm-5, …) but are absent from VERIFIED_THINKING_TOGGLE / budget / DeepSeek effort maps. Translation falls through to existing?.reasoning_options, so a clean create or a lost local file cannot reconstruct the tested controls and may fail or emit incomplete reasoners. Action: Add every live-tested Novita reasoner ID to the appropriate verified map (or a single curated table) so creates and updates re-apply the same options/headers without depending on pre-existing TOML.

@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] providers/novita-ai/models/deepseek/deepseek-prover-v2-671b.toml:1 - Check: Non-lab hosts must use base_model; add complete models/<lab>/… when missing. Why: Novita is a multi-model relay of DeepSeek’s Prover V2, but this restored entry is a full inline definition with no base_model and no models/deepseek/deepseek-prover-v2-671b.toml. Action: Add complete lab metadata under models/deepseek/ and rewrite the provider file as override-only (cost / real deltas only).
  • [high] [violation] providers/novita-ai/models/deepseek/deepseek-r1-distill-llama-70b.toml:1 - Check: Third-party hosts of lab models must factor through base_model. Why: This is a DeepSeek R1 distill served by Novita, still fully inlined (name/description/family/capabilities/limit/modalities) with only local reasoning_options = []. Action: Add models/deepseek/deepseek-r1-distill-llama-70b.toml (complete lab file) and point base_model at it; keep only Novita cost/limits/reasoning deltas.
  • [high] [violation] providers/novita-ai/models/deepseek/deepseek-r1-0528-qwen3-8b.toml:1 - Check: base_model required when the lab model is nameable. Why: Same third-party R1-distill pattern: full inline reasoner, no lab pointer. Action: Add lab metadata (or map to an existing distill entry if identical) and convert to an override-only provider TOML.
  • [high] [violation] providers/novita-ai/models/inclusionai/ling-2.6-1t.toml:1 - Check: Non-lab host + nameable lab model ⇒ base_model + lab entry. Why: Restored full inline InclusionAI Ling routes (ling-2.6-1t, and likewise ling-2.6-flash) while only ling-3.0-flash-fin has models/inclusionai/ coverage. Action: Author complete models/inclusionai/ling-2.6-*.toml entries and factor both Novita files through base_model.
  • [high] [violation] providers/novita-ai/models/baidu/ernie-4.5-21B-a3b.toml:1 - Check: Baidu ERNIE routes on Novita must not ship as standalone lab facts. Why: ernie-4.5-21B-a3b and ernie-4.5-vl-424b-a47b remain full inline definitions; only ernie-4.5-300b-a47b-paddle gained lab metadata + base_model. OpenRouter’s canonical map does not special-case baidu/, so these stay unfactored. Action: Add complete models/baidu/… lab files for the remaining ERNIE IDs and convert the provider TOMLs to override-only.
  • [high] [violation] providers/novita-ai/models/kwaipilot/kat-coder-pro.toml:1 - Check: Third-party / gateway host of a lab model must use base_model. Why: Restored full inline Kat Coder Pro with no lab metadata and no base_model. Action: Add models/ lab metadata for the underlying model and factor the Novita entry.
  • [high] [violation] providers/novita-ai/models/qwen/qwen2.5-vl-72b-instruct.toml:1 - Check: Qwen lab models hosted on Novita must inherit via base_model. Why: Restored as a full inline Alibaba/Qwen VL definition despite other Qwen routes being factored to alibaba/…. Action: Add models/alibaba/qwen2.5-vl-72b-instruct.toml (if missing) and rewrite the provider file as overrides only.
  • [high] [violation] providers/novita-ai/models/sao10K/l3-70b-euryale-v2.1.toml:1 - Check: Non-lab hosts must not publish full lab-style definitions for third-party fine-tunes when a shared identity is nameable; otherwise document unique-to-host exception. Why: Multiple sao10K Llama fine-tunes were restored as full standalone catalogs with no base_model and no lab entries. Action: Either factor through appropriate lab/base identity where one exists, or explicitly treat each as unique-to-host (and stop implying generic “open Llama” lab facts without that justification).
  • [medium] [violation] providers/novita-ai/models/deepseek/deepseek-r1-turbo.toml:1 - Check: reasoning = true on a relay requires host-accurate reasoning_options, not an unverified []. Why: R1 Turbo is inlined as always-on [] without a leading wire comment and without the PR’s live-verification list covering this ID; empty options mean “no caller control,” not “untested.” Action: Factor via base_model to R1 (or a turbo-specific lab entry), verify Novita’s actual control surface, and set toggle/[] only with evidence plus a leading wire comment if toggle applies.
  • [medium] [possible mistake] providers/novita-ai/models/zai-org/glm-5.2.toml:4 - Check: Relay reasoning controls must match lab/same-surface peers unless this host was verified different. Why: File keeps effort values including none while first-party providers/zai/models/glm-5.2.toml is high/max only; the PR touches this route (name/description/interleaved) but does not show Novita-specific verification for none. Action: Confirm Novita’s GLM-5.2 effort wire values; align to lab high/max or document live proof if none is real on this host.
  • [medium] [violation] providers/novita-ai/models/baidu/ernie-4.5-vl-424b-a47b.toml:9 - Check: Reasoners need verified reasoning_options (and toggle wire comments when applicable). Why: reasoning = true with reasoning_options = [] on a restored Baidu VL route that is not in the sync allowlists or PR live-verification notes. Action: Verify whether Novita exposes a thinking control for this ID; set accurate options (or remove the route if it is not served), and add lab base_model factoring.
  • [low] [possible mistake] providers/novita-ai/models/qwen/qwen3-max.toml:1 - Check: Material pricing/capability overrides should cite what supports them. Why: This route flips lab reasoning = false to provider reasoning = true with toggle + budget_tokens and multi-tier costs; the PR body asserts live checks, but the TOML leading comment no longer states the budget proof clearly beside the cost tiers. Action: Keep a leading comment that maps toggle/budget/tier prices to the Novita docs or live checks used.

@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] providers/novita-ai/models/qwen/qwen3.5-27b.toml:4 - Check: After base_model, provider files must be override-only (no lab-identical restatements). Why: description = "Qwen vision-language model for visual reasoning, documents, and agent tasks" matches models/alibaba/qwen3.5-27b.toml exactly; the same generic description is restated on other factored Qwen3.5 routes (qwen3.5-122b-a10b, qwen3.5-35b-a3b, and peers). That breaks the override-only rule and will keep churning on every sync. Action: Drop lab-identical description (and any other unchanged inherited fields such as matching dates/names) from these base_model files; keep only real Novita deltas (cost, reasoning_options, interleaved, true limit/modality/name overrides).
  • [high] [violation] providers/novita-ai/models/openai/gpt-oss-120b.toml:1 - Check: Non-lab hosts must use base_model with only real overrides; modalities/attachment must not invent host capabilities. Why: Lab models/openai/gpt-oss-120b.toml is attachment = false and text-only, but the Novita entry forces attachment = true and input = ["text", "image"] while also restating name/description/release_date/last_updated. Same pattern on gpt-oss-20b.toml. Action: Confirm Novita’s catalog/API actually accepts image input for these IDs; if not, drop the attachment/image overrides. Remove any fields that still match the lab after merge.
  • [medium] [violation] providers/novita-ai/models/qwen/qwen-2.5-72b-instruct.toml:1 - Check: If the provider did not create the model and the lab model is nameable, add complete models/<lab>/… metadata and point base_model at it. Why: This PR’s factoring pass converts most third-party Novita routes to base_model, but several nameable lab models remain full inline definitions (e.g. qwen/qwen-2.5-72b-instruct, baichuan/baichuan-m2-32b, moonshotai/kimi-k2-0905, moonshotai/kimi-k2-instruct) with no models/ entry and no base_model. Action: For each remaining nameable lab model still shipped inline, add a complete lab TOML under models/ and reduce the Novita file to override-only base_model + host deltas (or delete the route if it is intentionally out of catalog).
  • [medium] [possible mistake] providers/novita-ai/models/moonshotai/kimi-k2.5.toml:6 - Check: Provider overrides of lab capabilities need a real host delta. Why: Lab models/moonshotai/kimi-k2.5.toml sets temperature = false, but the Novita file keeps temperature = true after factoring. That changes client behavior versus the canonical model without PR evidence that Novita honors temperature on this route. Action: Verify temperature on Novita for moonshotai/kimi-k2.5; if it matches the lab, drop the override so false is inherited.
  • [low] [possible mistake] providers/novita-ai/models/zai-org/glm-5.1.toml:5 - Check: Date overrides should reflect this host or a documented correction, not catalog noise. Why: Novita keeps release_date/last_updated = "2026-03-27" while lab models/zhipuai/glm-5.1.toml uses 2026-04-07. Similar date skew appears on other factored GLM/Qwen rows (e.g. Qwen3.5 lab 2026-02-23 vs Novita 2026-02-26). Action: Confirm each kept date is intentionally different on Novita; otherwise omit the dates and inherit the lab values.

@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] providers/novita-ai/models/deepseek/deepseek-r1-0528-qwen3-8b.toml:1 - Check: Relay reasoning_options must not be [] from uncertainty (AGENTS.md → Reasoning options; audit skill anti-pattern). Why: The leading comment states Novita returned SERVICE_NOT_AVAILABLE and the control surface could not be retested, yet the file still publishes reasoning_options = []. Empty means “no caller control,” not “could not verify.” That misleads consumers for a reasoning model. Action: Retest the live route and author the verified control surface, or remove this provider entry until it can be verified (do not keep [] as a stand-in for an untested host).
  • [medium] [possible mistake] providers/novita-ai/models/qwen/qwen3-omni-30b-a3b-thinking.toml:1 - Check: Host reasoning / reasoning_options must match what this API can actually do. Why: The comment says thinking.type=enabled returns 400 and thinking_budget=64 yields no reasoning tokens, while the entry still inherits lab reasoning = true with reasoning_options = []. That combination claims a reasoner with no controls even though the tested controls failed. Action: Confirm whether the route still emits reasoning without those fields. If it never reasons on Novita, set reasoning = false (and drop options); if it always reasons with no control, keep [] and state that affirmatively; if a working control exists, author it.
  • [medium] [possible mistake] providers/novita-ai/models/minimaxai/minimax-m1-80k.toml:1 - Check: [] requires affirmative “no caller control,” not incomplete verification. Why: The comment says thinking.type produces no reasoning_content and “no separate caller control verified,” which reads as uncertainty rather than confirmed always-on / no-control behavior. Action: Verify whether the model still reasons (e.g. in content) with no wire control. If yes, keep [] with that affirmative evidence; if a real control exists, author it; if the host does not reason, override reasoning = false.
  • [low] [possible mistake] packages/core/src/sync/providers/novita-ai.ts - Check: Verified host reasoning controls should be reconstructible by sync, not only preserved from disk. Why: Live verification for zai-org/glm-5.2 documents reasoning_effort = none|high|max, but that ID is not in VERIFIED_EFFORT_TOGGLE / related allowlists, so a recreate path cannot re-author those options and only keeps them if an existing file already has them. Action: Add glm-5.2 to the verified control map with effort values ["none", "high", "max"] (no toggle), matching the file comment and live test.

@github-actions

Copy link
Copy Markdown
Contributor

No actionable findings.

@github-actions github-actions Bot added the reviewer: ready Automated review found no actionable items label Sep 20, 2026
@Alex-yang00

Copy link
Copy Markdown
Contributor Author

@rekram1-node Could you help take a look?

Resolve conflicts with anomalyco#8029's corrected Novita output limits:
- MiniMax M2.5 / M2.5 Highspeed and Kimi K2 0905 now match the lab
  limit (131_072 / 98_304), so the provider override is dropped.
- Kimi K2 Thinking keeps a 98_304 output override (lab is 262_144).
- Keep both NOVITA_API_KEY and MISTRAL_API_KEY in the sync workflow.

Pin those verified limits in the Novita sync so the hourly sync does
not restore the overstated /models values, and update the Vercel
output-limit test now that the DeepSeek V3.1 Terminus lab entry
supplies the 32_768 limit.

Co-Authored-By: Claude <noreply@anthropic.com>
@github-actions github-actions Bot removed the reviewer: ready Automated review found no actionable items label Oct 9, 2026
@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

No actionable findings.

@github-actions github-actions Bot added the reviewer: ready Automated review found no actionable items label Oct 9, 2026
@opencode-agent

Copy link
Copy Markdown
Contributor

Closing as superseded by #9250 (hourly Novita AI catalog sync) and #9243 (Novita AI catalog refresh and audit), both merged. Thanks for the work here!

@opencode-agent opencode-agent Bot closed this Oct 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

reviewer: ready Automated review found no actionable items

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant