Skip to content

feat(nebul): add Nebul provider with 16 models and hourly sync module - #6876

Closed
wynandhuizinga wants to merge 13 commits into
anomalyco:devfrom
wynandhuizinga:add-nebul-provider
Closed

wynandhuizinga wants to merge 13 commits into
anomalyco:devfrom
wynandhuizinga:add-nebul-provider

Conversation

@wynandhuizinga

@wynandhuizinga wynandhuizinga commented Sep 11, 2026

Copy link
Copy Markdown

closes #6879
Adding Nebul as provider of models for opencode.

Nebul provider

Adds Nebul's Inference API — https://api.inference.nebul.io/v1 (OpenAI-compatible) — with 16 chat models and an hourly sync module driven by their public catalog endpoint.

Sources

Claim Source
OpenAI-compatible base URL /v1, endpoints, NEBUL_API_KEY https://docs.nebul.io/docs/inference-api/getting-started/quick-start
reasoning_effort (low/medium/high/max) is the only documented reasoning control; traces returned via reasoning_content (OpenAI-style, Nemotron, Qwen3 thinking), reasoning (GLM-5.x), or inline <thinking> (some Gemma) https://docs.nebul.io/docs/inference-api/advanced-topics/reasoning
Per-model cost, cache_read, max_input_tokens, advertised reasoning_efforts (incl. Mistral-Medium-3.5's low|medium|high|max) https://api.inference.nebul.io/model/info (live, unauthenticated)
models/alibaba/qwen3-30b-a3b-instruct-2507.toml dates, license, weights https://huggingface.co/Qwen/Qwen3-30B-A3B-Instruct-2507
models/mistral/ministral-3-14b-instruct-2512.toml (open weights, Apache 2.0, 256k usage example) https://huggingface.co/mistralai/Ministral-3-14B-Instruct-2512

Reasoning controls policy

  • Effort-only where the host advertises reasoning_efforts in /model/info (DeepSeek-V4.1-Flash low|high|max, GLM-5.3-Flash low|high|max, Mistral-Medium-3.5 low|medium|high|max — the advertised set supersedes the lab's none|high) or where the docs demonstrate it (gpt-oss-120b; GLM-5.3 uses the lab's always-on set low|high|max).
  • No thinking toggles or budgets: Nebul's docs document no on/off or budget field, so toggle/budget options copied from lab or peer entries were dropped; reasoning-capable models without an advertised control use reasoning_options = [] with a leading source comment.
  • The sync module preserves hand-authored non-effort options (toggle, budget_tokens) and replaces only the effort entry, matching the DigitalOcean pattern; covered by tests.

Sync deletion safety

  • Existing TOMLs survive incomplete source data: the module prefers the authored base_model and falls back to existing cost/limit when /model/info transiently returns nulls, so hourly sync never deletes hand-authored files over temporary gaps (DeepInfra/Baseten pattern).
  • Deletions follow only intentional removals: entries dropped server-side, deprecated/denylisted IDs, and non-chat surfaces; brand-new models must resolve a base model and price fully before entering the catalog.

Review fixes included

  • models/mistral/ministral-3-14b-instruct-2512.toml: corrected open_weights to true, added license = "Apache 2.0" and the HF weights link (the same checkpoint is published on Hugging Face and marked open by NVIDIA/Infomaniak catalog entries); limit.output = 262_144 is sourced from the HF card's own usage example (max_tokens = 262144).

@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] providers/nebul/models/google/gemma-4-31B-it.toml:3 - Check: Every toggle needs a leading top-of-file wire-path comment. Why: This file declares type = "toggle" with no leading comment and no exact request field. Callers cannot tell how to turn reasoning on/off on Nebul’s OpenAI-compatible API, and hourly sync will not invent a header. Action: Add a top-of-file comment with Nebul’s exact toggle wire path (e.g. enable_thinking, thinking.type, reasoning.enabled) after verifying it, or drop toggle if this host has no on/off control.
  • [high] [violation] providers/nebul/models/Qwen/Qwen3.5-397B-A17B.toml:3 - Check: Toggle wire comment + exact path; comments must be leading. Why: Toggle is present, but the only note is a mid-file “per alibaba” summary after base_model. That is not a leading wire comment, and sync strips non-header comments on rewrite. Action: Move a real # Toggle: … (and budget wire path if kept) above the first key for this file and the other toggle models (Qwen3.8-27B-FP8, Kimi-K3, all three Nemotron entries).
  • [high] [violation] packages/core/src/sync/providers/nebul.ts:276 - Check: Sync must not destroy hand-authored non-effort reasoning controls. Why: buildReasoningOptions returns only [{ type: "effort", values }] whenever /model/info lists efforts, replacing the full authored set. That will drop toggle / budget_tokens on models such as Qwen3.8, Kimi-K3, and Qwen3.5 on the next sync that advertises efforts (DigitalOcean preserves non-effort options; Nebul does not). Action: Merge remote efforts with preserved non-effort options (and only replace the effort entry), matching the DigitalOcean/LLM Gateway pattern; add a test that toggle/budget survive when efforts are present.
  • [high] [possible mistake] providers/nebul/models/Qwen/Qwen3.5-397B-A17B.toml:8 - Check: budget_tokens only when this host exposes a real reasoning-budget field. Why: Options are copied from Alibaba’s first-party entry, but Nebul is a multi-model OpenAI-compatible relay. Lab thinking_budget is not automatically available on every gateway; inventing budget_tokens without a Nebul wire field misstates caller controls. Action: Confirm Nebul accepts a reasoning budget on this route and document the field in a leading comment; otherwise remove budget_tokens and keep only controls this host actually exposes.
  • [medium] [possible mistake] providers/nebul/models/deepseek-ai/DeepSeek-V4.1-Flash.toml:4 - Check: Relay reasoning baseline = lab + same-surface peers for this model. Why: DeepSeek’s own Flash entry and solid openai-compatible peers use toggle + effort low|high|max. Nebul authors effort only (from reasoning_efforts), so on/off may be missing if the host still forwards thinking.type / equivalent. Action: Verify whether Nebul can disable thinking on this model; if yes, add toggle plus a leading wire comment; if not, keep effort-only and note that the host has no separate off control.
  • [medium] [possible mistake] models/mistral/ministral-3-14b-instruct-2512.toml:11 - Check: New lab metadata must reflect open-weight status accurately. Why: open_weights = false while the same checkpoint is published on Hugging Face and other catalog entries (e.g. NVIDIA) mark Ministral 3 14B Instruct as open weights. A wrong lab flag is inherited by every base_model host. Action: Confirm the HF release/license and set open_weights = true (and license if known) or cite why this instruct build is closed.
  • [low] [possible mistake] .pr-review/pull-request.json:4 - Check: Data-changing PRs should cite provider pricing/docs/API mapped to claims. Why: PR body is empty while adding a provider, 16 priced models, two new lab entries, and a sync module, so costs, limits, and reasoning claims cannot be reviewed against first-party sources. Action: Add a PR body with direct Nebul /model/info or docs links (and lab sources for the new models/ files), stating what each citation supports.

@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] packages/core/src/sync/providers/nebul.ts:235 - Check: Sync modules must not skip source models when deleting existing local files for those IDs is unintentional (sync.md). Why: translateModel returns undefined whenever resolveBaseModel fails or pricing/context is null, and deleteMissing is left at the default (true). Unlike Baseten/Deep Infra peers, there is no existing.base_model fallback and no “update existing / skip create only” path. A temporary null cost field or an unresolved alias will drop the model from the desired set and hourly sync will delete the hand-authored TOML. Action: Preserve existing entries when pricing/context is incomplete (update only authoritative fields you have; keep cost/limit from existing). Prefer existing.base_model when present. Only return undefined for intentional catalog removals (ping/deprecated/non-chat), or set deleteMissing: false with a missingNotice if Nebul’s catalog is not authoritative for deletions.
  • [medium] [possible mistake] providers/nebul/models/mistralai/Mistral-Medium-3.5-128B.toml:6 - Check: Relay reasoning_options must match the lab/same-surface baseline unless this host documents extra levels. Why: First-party providers/mistral/models/mistral-medium-2604.toml and solid peers (NVIDIA NIM, Scaleway, Evroc) use effort none|high. This file authors low|medium|high|max, which invents graded levels and drops the lab’s none off-switch. Action: Verify Nebul’s live reasoning_effort accepts and meaningfully applies low|medium|high|max on this model. If not, align to ["none", "high"] (or the exact set Nebul documents for Medium 3.5).
  • [medium] [possible mistake] models/mistral/ministral-3-14b-instruct-2512.toml:22 - Check: New lab limit.output must be a real completion cap, not a copy of context. Why: output = 262_144 equals context. Peer provider caps for this model are much lower (e.g. NVIDIA 16_384, nano-gpt 32_768, OpenRouter 209_715, Infomaniak 25_600); the older Ministral lab sibling uses 8_192. An inflated lab default will inherit onto every base_model host. Action: Confirm the true max completion tokens from Mistral/HF docs and set limit.output (and any Nebul override) to that value.
  • [low] [possible mistake] .pr-review/pull-request.json:4 - Check: Data-changing PRs should cite first-party pricing/docs/API evidence. Why: The body only says the provider is being added; costs, context overrides (e.g. DeepSeek/GLM 1M windows), and /model/info effort lists are material factual claims without mapped sources. Action: Add PR-body citations for Nebul pricing, /model/info, and the reasoning docs URL already used in TOML comments, stating what each URL supports.

@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [medium] [violation] providers/nebul/models/deepseek-ai/DeepSeek-V4.1-Flash.toml:3 - Check: Sync-owned TOML source/wire comments must be a leading header above the first key (AGENTS.md → Comments in TOML). Why: These files are rewritten by the Nebul hourly sync, which keeps only the leading comment block and drops everything after base_model. Effort/source notes on DeepSeek V4.1 Flash, Mistral Medium 3.5, GPT-OSS 120B, GLM-5.3, and GLM-5.3-Flash will disappear on the next sync. Action: Move those comments above base_model in deepseek-ai/DeepSeek-V4.1-Flash.toml, mistralai/Mistral-Medium-3.5-128B.toml, openai/gpt-oss-120b.toml, zai-org/GLM-5.3.toml, and zai-org/GLM-5.3-Flash.toml (same pattern as the Qwen/Nemotron leading headers).
  • [low] [possible mistake] .pr-review/pull-request.json:4 - Check: Data-changing PRs should cite direct provider pricing/docs/API evidence in the PR body. Why: The body only says the provider is being added; it does not map costs, context overrides, or effort lists to /model/info, docs, or pricing pages, so material catalog values cannot be reviewed from the PR alone. Action: Add first-party citations in the PR body for Nebul pricing, /model/info effort lists, and any context overrides (and what each URL supports).

@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] packages/core/src/sync/providers/nebul.ts - Check: Provider-authored interleaved must describe this host’s reasoning side channel and survive sync. Why: The PR body documents traces via reasoning_content (OpenAI-style / Nemotron / Qwen3), reasoning (GLM-5.x), or inline tags, but none of the Nebul model TOMLs set interleaved, and translateModel never passes existing?.interleaved into factorBaseModel (unlike deepinfra/openrouter/chutes). Clients cannot discover the side channel, and any hand-authored interleaved will be dropped on the next hourly sync. Action: For each reasoner, author the correct Nebul wire form ([interleaved] field = "reasoning_content", or interleaved = true if the channel is only a generic/reasoning field the schema cannot name), and always preserve interleaved: existing?.interleaved (or an authored default) in the synced values object.
  • [medium] [violation] packages/core/src/sync/providers/nebul.ts (buildReasoningOptions) - Check: Relay reasoning_options must match this host’s documented controls, not reintroduce lab/peer toggles. Why: After dropping undocumented toggles/budgets from the TOMLs, sync still keeps non-effort options whenever /model/info advertises efforts (preserved = existing…filter(type !== "effort") then append effort). That can rewrite files back to invalid Nebul shapes (e.g. toggle + effort) with no leading wire comment for a control Nebul does not document. Action: When reasoning_efforts is non-empty, replace reasoning_options with the advertised effort entry only; when empty, keep an explicit authored [] or other verified host-only set—do not merge lab-style toggle/budget back in.
  • [medium] [possible mistake] models/mistral/ministral-3-14b-instruct-2512.toml - Check: Lab limit.output must be a real max-completion bound, not the context window. Why: This entry sets output = 262_144 from an HF usage example MAX_TOK = 262144, while other catalog hosts for the same checkpoint use much smaller completion caps (e.g. NVIDIA 16_384, OpenRouter/Kilo 209_715). Treating the full context size as limit.output overstates completion headroom for every base_model consumer. Action: Verify Ministral 3 14B’s actual max completion tokens from first-party or consistent peer evidence and set limit.output to that value (keep context = 262_144 if that remains correct).

Wynand Huizinga added 2 commits September 11, 2026 16:03
Nebul's docs map each family to a trace channel: reasoning_content for
OpenAI-style models, the Nemotron family, Qwen3 thinking variants (plus
DeepSeek-V4.1-Flash, Kimi-K3, Mistral-Medium-3.5 and muse-glimmer-30b,
confirmed against the serving stack), message.reasoning for GLM-5.x and
inline <thinking> for Gemma. Author interleaved on all 13 reasoners
(interleaved = true where the schema has no named field) and carry
existing?.interleaved through translateModel so sync never drops it.
…efforts

Nebul's API has no toggle or budget control, so lab-style options must
not be merged back into a rewritten entry — that would claim wire fields
Nebul does not accept. When reasoning_efforts is advertised, the effort
entry is the whole set; when it is not, authored options are kept.
@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [medium] [possible mistake] providers/nebul/models/moonshotai/Kimi-K3.toml:7 - Check: Relay reasoning_options must match this host’s real controls; [] only when there is affirmative no caller control (not uncertainty), using lab + same-surface peers as baseline. Why: Nebul is a multi-model relay whose docs center on reasoning_effort, and established peers of Kimi K3 (lab, Together, DeepInfra, Tinfoil, Berget) expose graded effort (low/high/max) on that kind of surface. Authoring [] here claims no control while peers and the host’s documented control disagree unless this model ID truly rejects effort. Action: Live-check whether reasoning_effort is accepted for moonshotai/Kimi-K3 on Nebul; if yes, set reasoning_options to the working effort list (typically low/high/max); keep [] only with evidence the parameter is rejected or ignored.
  • [medium] [possible mistake] providers/nebul/models/meta-models/muse-glimmer-30b.toml:6 - Check: Same relay reasoning baseline / [] evidence bar. Why: Fireworks and Vercel peers document reasoning_effort as low/medium/high/xhigh for Muse Glimmer, and Nebul’s own docs treat reasoning_effort as the host control. Empty options contradict that baseline unless this route is proven effort-less. Action: Probe Nebul for this model; if effort works, author [{ type = "effort", values = ["low", "medium", "high", "xhigh"] }] (or the subset that actually changes behavior); retain [] only with rejection evidence.
  • [medium] [possible mistake] providers/nebul/models/Qwen/Qwen3.8-27B-FP8.toml:6 - Check: Same relay reasoning baseline for models peers control via effort. Why: Same-surface peers (DeepInfra, OpenRouter) expose effort levels for Qwen3.8 27B (low/medium/xhigh, plus toggle where supported). Nebul drops both to [] because /model/info omits reasoning_efforts; catalog silence alone is weak if the shared OpenAI-compat reasoning_effort field still works. Action: Verify whether Nebul accepts reasoning_effort (and any on/off field) for this ID; author the intersection of what works (effort-only if no toggle), or keep [] only after confirming no control.

…asoners

Nebul's docs state reasoning_effort is accepted for reasoning-capable
models and ignored only by non-reasoning models, so an empty option set
would falsely claim no caller control. Author effort options from
same-surface peers intersected with Nebul's documented value set:
Kimi-K3 low|high|max (Tinfoil), muse-glimmer-30b low|medium|high
(Fireworks/Vercel, xhigh undocumented on Nebul), Qwen3.8-27B low|medium
(OpenRouter, toggle absent on Nebul).
@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] providers/nebul/models/Qwen/Qwen3.5-397B-A17B.toml:5 - Check: Relay reasoning_options must not use [] from uncertainty when the host accepts caller controls. Why: This PR’s own later rationale says Nebul accepts reasoning_effort for reasoning-capable models (ignored only for non-reasoners), and patch 11 fixed Kimi-K3 / Muse Glimmer / Qwen3.8 for that reason — but Qwen3.5-397B, Gemma 4 31B IT, and all three Nemotron entries still ship reasoning_options = []. Lab/peers expose real controls (Qwen3.5: toggle/budget or effort; Gemma: toggle; Nemotron: toggle or effort with none). Empty here falsely claims no caller control on a multi-model OpenAI-compatible relay. Action: Author host-accurate effort sets for every remaining reasoner without advertised /model/info efforts (or prove per-model that Nebul ignores reasoning_effort for that ID), consistent with the three models already corrected.
  • [high] [violation] packages/core/src/sync/providers/nebul.ts:276 - Check: Sync must not invent “no control” for new reasoners. Why: buildReasoningOptions returns undefined when reasoning_efforts is empty and there is no existing file; the shared runner then stamps reasoning_options = [] for any reasoning = true base (lab metadata never carries reasoning_options). Hourly sync will therefore auto-create new Nebul reasoners as empty-control entries — the AGENTS.md anti-pattern — instead of skipping them for hand authoring (Eden AI / Tinfoil pattern) or deriving a documented effort set. Action: For new chat reasoners with no advertised efforts and no authored options, skip translation (or fail closed for manual authoring); only write [] when the host affirmatively has no control for that model.
  • [medium] [possible mistake] providers/nebul/models/Qwen/Qwen3.8-27B-FP8.toml:10 - Check: Effort values should match this host’s documented enum ∩ meaningful peer levels. Why: Comment cites Nebul’s documented reasoning_effort set and OpenRouter’s low|medium|xhigh, then authors only ["low", "medium"]. If Nebul’s public enum is low|medium|high|max, dropping high understates the control surface relative to the same docs used elsewhere in the PR. Action: Verify live/docs which levels Qwen3.8 actually honors on Nebul and include every accepted level (still excluding undocumented xhigh / lab toggle if unsupported).
  • [low] [possible mistake] models/mistral/ministral-3-14b-instruct-2512.toml:18 - Check: limit.output must be a real max generation limit, not a sample max_tokens. Why: output = 262_144 is justified only by an HF usage example setting MAX_TOK = 262144 (same as context). That is often a request ceiling, not a verified generation limit; other hosts use much smaller output caps for this model. Action: Confirm Ministral’s actual max output tokens from Mistral/HF model card limits (not the sample script) and adjust if 262k is only a prompt/context figure.

@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] providers/nebul/models/Qwen/Qwen3.5-397B-A17B.toml:11 - Check: Relay reasoning_options must follow lab + same-surface peer controls for that model, not a host-wide invented effort enum. Why: Lab/Alibaba is toggle + budget_tokens; peers such as OpenRouter are toggle-only. /model/info does not advertise efforts for this model, and the file comment admits peers have “no effort values to intersect,” yet the entry authors effort = low|medium|high|max. That invents graded efforts the model/peers do not expose and misrepresents Nebul’s control surface. Action: Drop the invented enum. Use reasoning_options = [] unless you can show Nebul-specific evidence that graded reasoning_effort is meaningful for this model (or a real host toggle/budget wire path).
  • [high] [violation] providers/nebul/models/google/gemma-4-31B-it.toml:12 - Check: Do not invent low/medium/high/max when lab/peers are toggle-only (or empty). Why: First-party Google and established peers (e.g. Crusoe, NVIDIA) use toggle only; Crusoe’s live probe even notes effort levels are inert and behave as on/off. Nebul does not advertise reasoning_efforts for Gemma, but the PR still pastes the host-wide enum. Action: Replace with reasoning_options = [] (or a documented toggle with a leading wire comment if Nebul actually exposes one). Do not publish graded efforts without model-specific host evidence.
  • [high] [violation] providers/nebul/models/nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16.toml:11 - Check: Nemotron baseline is lab/peer toggle (not L/M/H/max). Why: NVIDIA first-party entries for Nano/Super are toggle-only; Omni is toggle (+ budget on NIM). These Nebul files invent low|medium|high|max while stating peers expose toggle only and /model/info lists no efforts. Action: For all three Nemotron entries (…Nano-30B…, …Super-120B…, …Nano-Omni…), remove the invented effort set and use [] unless Nebul documents/advertises real per-model effort values or a toggle wire path.
  • [medium] [possible mistake] providers/nebul/models/Qwen/Qwen3.8-27B-FP8.toml:11 - Check: Effort values must be the intersection of peer/lab sets with this host’s real levels. Why: OpenRouter’s same-model set is low|medium|xhigh (plus toggle). Nebul drops toggle and xhigh, then adds high without /model/info advertising efforts for this ID. Action: Verify which reasoning_effort values Nebul actually accepts/effects for Qwen3.8-27B; author that set (likely low|medium and/or xhigh if supported), or [] if there is no caller control—do not invent high to fill a host-wide enum.

@wynandhuizinga

Copy link
Copy Markdown
Author

Action items

  • [high] [violation] providers/nebul/models/Qwen/Qwen3.5-397B-A17B.toml:11 - Check: Relay reasoning_options must follow lab + same-surface peer controls for that model, not a host-wide invented effort enum. Why: Lab/Alibaba is toggle + budget_tokens; peers such as OpenRouter are toggle-only. /model/info does not advertise efforts for this model, and the file comment admits peers have “no effort values to intersect,” yet the entry authors effort = low|medium|high|max. That invents graded efforts the model/peers do not expose and misrepresents Nebul’s control surface. Action: Drop the invented enum. Use reasoning_options = [] unless you can show Nebul-specific evidence that graded reasoning_effort is meaningful for this model (or a real host toggle/budget wire path).
  • [high] [violation] providers/nebul/models/google/gemma-4-31B-it.toml:12 - Check: Do not invent low/medium/high/max when lab/peers are toggle-only (or empty). Why: First-party Google and established peers (e.g. Crusoe, NVIDIA) use toggle only; Crusoe’s live probe even notes effort levels are inert and behave as on/off. Nebul does not advertise reasoning_efforts for Gemma, but the PR still pastes the host-wide enum. Action: Replace with reasoning_options = [] (or a documented toggle with a leading wire comment if Nebul actually exposes one). Do not publish graded efforts without model-specific host evidence.
  • [high] [violation] providers/nebul/models/nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16.toml:11 - Check: Nemotron baseline is lab/peer toggle (not L/M/H/max). Why: NVIDIA first-party entries for Nano/Super are toggle-only; Omni is toggle (+ budget on NIM). These Nebul files invent low|medium|high|max while stating peers expose toggle only and /model/info lists no efforts. Action: For all three Nemotron entries (…Nano-30B…, …Super-120B…, …Nano-Omni…), remove the invented effort set and use [] unless Nebul documents/advertises real per-model effort values or a toggle wire path.
  • [medium] [possible mistake] providers/nebul/models/Qwen/Qwen3.8-27B-FP8.toml:11 - Check: Effort values must be the intersection of peer/lab sets with this host’s real levels. Why: OpenRouter’s same-model set is low|medium|xhigh (plus toggle). Nebul drops toggle and xhigh, then adds high without /model/info advertising efforts for this ID. Action: Verify which reasoning_effort values Nebul actually accepts/effects for Qwen3.8-27B; author that set (likely low|medium and/or xhigh if supported), or [] if there is no caller control—do not invent high to fill a host-wide enum.

1 — on the five remaining [] reasoners:
Fixed in d3bdd80 — all five now author effort sets. None of them has same-surface peer effort evidence to intersect (OpenRouter controls gemma-4-31b-it and nemotron-3-nano with a toggle, NVIDIA's first-party entry likewise, and qwen3.5-397b is toggle-only there too), so the tightest available evidence is Nebul's own docs, which state reasoning_effort is accepted on both endpoints and note the effort-to-budget mapping is model-specific guidance rather than a per-model contract. Each file now carries the documented host-wide enum low|medium|high|max with a leading comment saying exactly that. Since the docs also state non-reasoning models silently ignore reasoning_effort, the worst case on serving stacks that don't map a value is a no-op parameter.
2 — on sync auto-stamping [] for new reasoners:
Fixed in d3bdd80. translateModel now fails closed instead of emitting an empty options entry: when the resolved lab metadata says the model reasons (reasoning = true via the shared modelMetadata() accessor, the same pattern hyper/edenai use), the host advertises no reasoning_efforts, and no options are authored, it throws MissingReasoningOptionsError. The runner keeps the existing file, warns, and lists the model in the skipped notice (sync/index.ts:271-276, 459-462) — so new reasoners surface for hand-authoring, and existing files can never be overwritten with [] or deleted by the hourly job. A dry-run against the live catalog is clean (16 unchanged, no throws), and a test covers both the new-model and existing-file paths.
3 — on Qwen3.8-27B omitting high:
Fixed in d3bdd80 — now low|medium|high. high is in Nebul's documented value set and isn't contradicted by the peer evidence (OpenRouter advertises low|medium|xhigh); xhigh stays out because Nebul's docs never list it, and max stays out because no peer advertises it. The file comment spells this out.
4 — on Ministral's limit.output:
Keeping 262_144; d3bdd80 strengthens the citation. Mistral publishes no separate generation cap for this model — the first-party figures that exist are the card's 256k (= 262,144) context window, the vLLM section's default --max-model-len = 262144, and the card's own examples requesting max_tokens = 262144. The smaller figures on peer hosts (16_384 on NVIDIA, 25_600 on Infomaniak) are deployment/VRAM choices, not model limits. This also matches the catalog's convention for Mistral's current generation — mistral-large-2512, mistral-medium-2604 and devstral-2512 all set output = 262_144. Happy to switch if Mistral publishes an explicit max-output figure.

@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] providers/nebul/models/moonshotai/Kimi-K3.toml:1 - Check: Relay reasoning_options must match this host’s control surface consistently (AGENTS.md / audit skill: baseline = host + lab/peers; [] only for affirmative no control). Why: After the final “advertised reasoning_efforts is source of truth” policy, Qwen3.5/3.8, Gemma 4 31B, all three Nemotron entries, and GLM-5.3 correctly use reasoning_options = [] when /model/info lists no efforts. Kimi-K3 still authors low|high|max from Tinfoil despite the same empty advertisement, so the catalog claims caller effort control on one unadvertised reasoner and none on the others. Action: Align with the host policy: set reasoning_options = [] (and the same leading catalog comment as the other empty reasoners), or drop the advertised-only rule and author peer/lab-derived efforts for every unadvertised reasoner the same way—do not mix both.
  • [high] [violation] providers/nebul/models/meta-models/muse-glimmer-30b.toml:1 - Check: Same host-wide reasoning-options consistency. Why: muse-glimmer still authors low|medium|high from Fireworks/Vercel while other models with empty reasoning_efforts are marked no-control. That misstates Nebul’s surface and will be preserved forever by sync when efforts stay empty. Action: Same fix as Kimi—either empty options with the catalog rationale, or apply peer-derived efforts uniformly to all unadvertised reasoners.
  • [medium] [possible mistake] providers/nebul/models/zai-org/GLM-5.3.toml:1 - Check: Effort set vs lab sibling and host advertisement. Why: Lab/zhipuai peers use always-on low|high|max for both GLM-5.3 and GLM-5.3-Flash; Nebul keeps Flash at low|high|max but empties full GLM-5.3. That split is only valid if /model/info really returns efforts for Flash and an empty list for full GLM. Action: Re-check live reasoning_efforts for both IDs and either restore low|high|max on GLM-5.3 if Flash’s set is the real host surface, or leave [] only with a comment that cites the differing catalog rows for the two IDs.
  • [low] [possible mistake] models/mistral/ministral-3-14b-instruct-2512.toml:1 - Check: Lab limit.output must be a real generation cap, not a context-sized max_tokens example. Why: output = 262_144 equals full context and is justified mainly by an HF usage example / peer flagships; providers that already host this model (e.g. Infomaniak) use a much smaller output bound. Overstated lab output will inherit to every base_model host. Action: Confirm Mistral’s actual max generation limit for Ministral 3 14B; if unknown, prefer a conservative documented cap (or omit a speculative full-context output) rather than copying context into limit.output.

@wynandhuizinga

Copy link
Copy Markdown
Author

superseeded by #6961

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Adding Nebul as provider for opencode

1 participant