Skip to content

feat: add Neosantara provider - #6165

Open
ErRickow wants to merge 29 commits into
anomalyco:devfrom
neosantara-xyz:feat/neosantara-provider
Open

feat: add Neosantara provider#6165
ErRickow wants to merge 29 commits into
anomalyco:devfrom
neosantara-xyz:feat/neosantara-provider

Conversation

@ErRickow

@ErRickow ErRickow commented Sep 3, 2026

Copy link
Copy Markdown

Neosantara is an OpenAI-compatible LLM gateway (a multi-model relay) from Indonesia. This PR adds the provider, logo, model TOMLs, and a sync module.

Data source

The sync consumes a single public endpoint — GET https://api.neosantara.xyz/v1/catalog — which returns the catalog in the models.dev / LLM Gateway response shape (family, architecture, providers[] with reasoning_efforts, and USD‑per‑token pricing). No API key is required.

The gateway performs the host‑specific work upstream (USD pricing incl. IDR conversion and promotional discounts, capability flags, and the mapped reasoning surface), so the models.dev sync is a thin, override‑only translation of that shape.

Scope / filters

A model is synced when it:

  • is not deprecated,
  • resolves to an existing canonical models/ entry (verified locally before falling back to id), and
  • serves ≥ 100k context and advertises function calling, or is an image‑generation model.

Anything the public filter accepts but we can't map yet (no canonical models/ entry) is reported via skippedNotice instead of dropped silently. 49 models currently sync (48 token‑priced + 1 image).

Reasoning options (per-model)

Neosantara normalizes reasoning onto a single OpenAI-compatible reasoning_effort field, where off is expressed as reasoning_effort = "none". Per AGENTS.md:

catalog reasoning_efforts reasoning_options
[] [] — always-on, no caller control (e.g. minimax-m2.7 Dahl relay)
["none"] [{ type = "toggle" }] (binary on/off, with leading wire comment)
graded levels (with or without none) [{ type = "effort", values = … }]only effort, no toggle hybrid, no wire comment

Levels are intersected with the host ladder none·minimal·low·medium·high·xhigh·max.

Host surface vs the lab surface

Because Neosantara proxies each upstream provider, a model's effort surface equals its lab surface on models.dev, except:

  • DeepSeek V4 collapses low/medium into high; the wire accepts high/max only, so the lab's low is dropped → deepseek-v4-* = none/high/max.
  • Anthropic is served through the OpenAI-compatible reasoning_effort field (not Anthropic's native thinking/budget_tokens), so off is expressed as reasoning_effort = "none". Claude entries therefore author only effort with ["none", ...graded] (e.g. claude-opus-4-6 = none/low/medium/high/max), with no toggle hybrid.
  • Dedicated -reasoning variants (e.g. grok-4.1-fast-reasoning) are always-on [].
  • MiniMax M2.7 upstream Dahl proxy forwards no reasoning parameter, documented as always-on [] matching lab and peers.
  • Muse Glimmer 30B carries model card citations and peer consensus effort ladder.

Modalities and attachments

Host deployments match what Neosantara actually serves:

  • Models serving text + image without PDF/video understanding author [modalities] input = ["text", "image"] to prevent over-claiming lab base-model PDF/video capabilities while keeping attachment = true.
  • When a model deployment lacks vision, attachment = false is authored alongside text-only input modalities.

Pricing

USD per million tokens, converted from the endpoint's per‑token USD strings.

  • IDR is converted at live market exchange rates.
  • Per-model catalog discounts are applied upstream by the gateway so published prices reflect effective billed rates (e.g. Gemini 3.6/3.7 Flash, MiniMax M2.7, Kimi K2.6 are served at discounted rates below lab list price, documented at https://docs.neosantara.xyz/en/about/billing-pricing).
  • Free models keep input = 0 / output = 0.

Notes

  • interleaved.field = "reasoning_content" on reasoning models (the gateway streams reasoning there).
  • max_output is intentionally not published — the gateway's runtime cap is not the model's true output limit.
  • Re‑running the sync is idempotent (0 created, 0 updated, 0 removed, 49 unchanged), and bun validate passes.

Neosantara is an OpenAI-compatible LLM gateway. Both catalog endpoints used
by the sync are public and need no API key:

- https://api.neosantara.xyz/v1/models
- https://api.neosantara.xyz/v1/public/pricing

The sync module registers with the existing provider-sync workflow, so the
catalog is refreshed by the usual periodic automation.

Scope of the generated catalog:

- text models with at least 100k context that advertise function calling
- image generation models that have a canonical models/ entry
- deprecated models are excluded

Pricing is published in USD per million tokens, applying the customer-facing
discount and converting IDR list prices with the exchange rate the pricing
endpoint reports. Per-image pricing is left unpublished because models.dev
has no field for it.

Reasoning options are reviewed per model: each effort list is the lab/peer
set intersected with what the public request schema accepts, and models that
expose no caller control author an empty set.

Provider files stay override-only via base_model, so limits, modalities and
benchmarks are inherited from the canonical lab entries.
Single-colour vector mark with a square viewBox and no fixed dimensions, so
it inherits the surrounding text colour when inlined.
The embedded raster carried ~13% transparent padding on every side and was
inset a further 25 units inside a 500x500 viewBox, so the mark covered only
about 66% of the canvas and rendered smaller than neighbouring logos.

Crop to the opaque bounds, centre the mark on a square canvas that it fills
edge to edge, and drop the root width/height (the site strips them when it
inlines the file). Also reduces the file from 102 KB to 59 KB.
@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Action items

  • [critical] [violation] providers/neosantara/logo.svg:1 - Check: New-provider logo must be SVG using currentColor, with no fixed size or hardcoded colors. Why: The final logo is a base64 PNG embedded via <image xlink:href="data:image/png;…"> inside a bare SVG shell. That cannot inherit theme color and hardcodes pixel colors, so it fails the compliant-logo blocker (the earlier vector/currentColor mark was replaced). Action: Restore a true vector logo.svg (paths/shapes with currentColor, square viewBox, no width/height, no embedded raster).
  • [high] [violation] packages/core/src/sync/providers/neosantara.ts:362 - Check: budget_tokens only for real reasoning-budget APIs; not Claude 4.7+ adaptive effort. Why: claude-fable-5, claude-sonnet-5, claude-opus-7, and claude-opus-8 are authored as toggle + budget_tokens, but first-party Anthropic entries for those models are effort (and for Sonnet 5, toggle + effort)—not extended-thinking budgets. Wire comments claim /v1/messages thinking.budget_tokens on an OpenAI-compatible /v1 host, which invents a budget surface AGENTS.md explicitly disallows for Claude 4.7+. Action: Replace those four control sets with the lab/peer effort (and toggle only if this host really forwards a separate on/off), drop budget_tokens, and keep leading wire comments accurate for the OpenAI-compatible request path.
  • [high] [violation] packages/core/src/sync/providers/neosantara.ts:367 - Check: On multi-model relays, reasoning_options = [] means no caller control—not uncertainty—and must not ignore lab/peer controls the host can express. Why: The PR states this host accepts reasoning_effort of none|minimal|low|medium|high|xhigh, and the same sync already authors effort for gpt-5.6-* and claude-opus-5. Yet many reasoners whose lab/peer baselines expose controls are written as [], including gpt-5.4, gpt-5.4-nano, gpt-5.5, gpt-5-nano, gemini-3.6-flash, gemini-3.7-flash, deepseek-v4-flash, deepseek-v4-pro, claude-opus-4-6, claude-sonnet-4-6, kimi-k2.5, kimi-k2.6, and kimi-k3. That contradicts the host schema claim and sibling entries on this provider. Action: For each of those IDs, set reasoning_options to the lab/same-surface peer set intersected with what Neosantara actually forwards (typically GPT effort lists; Gemini L/M/H; DeepSeek toggle+effort mapped onto this host’s fields; Claude 4.6 effort±budget only if budget is real here; Kimi toggle±effort). Keep [] only with model-specific proof that this route has no control.
  • [medium] [possible mistake] packages/core/src/sync/providers/neosantara.ts:350 - Check: DeepSeek V4 effort baseline is lab/peer high/max (plus toggle), not invented L/M/H. Why: deepseek-v4-pro-0813 is authored as effort ["low", "high"] while first-party DeepSeek V4 Pro is toggle + ["high", "max"] (low maps to high). Dropping max for the host enum is fine; inventing low and omitting toggle without a host-specific wire path is not the documented baseline. Action: Align with lab/peers on this surface (e.g. toggle + high if both exist here, or effort values actually honored after dropping unsupported max), and document the exact request fields in a leading comment when toggle is used.
  • [medium] [possible mistake] providers/neosantara/models/laguna-s-2.1.toml:3 - Check: Relay effort lists must come from lab/same-surface peers, not a default L/M/H. Why: First-party Poolside laguna-s-2.1 is toggle-only (enable_thinking), but Neosantara authors ["low", "medium", "high"] for both Laguna models. Action: Verify this host really accepts graded reasoning_effort for Laguna; if not, use toggle (with wire comment) or [] only if there is no control—do not keep L/M/H without host evidence.

This host is OpenAI-compatible and normalizes reasoning onto a single
caller-facing field, reasoning_effort, accepting
none|minimal|low|medium|high|xhigh. Upstream-native shapes are handled behind
that field and never appear in a caller's request, so documenting a thinking
budget or a vendor toggle described the wrong surface.

Every reasoning model now authors an effort list taken from its lab entry and
same-surface peers, intersected with the values this host accepts, so `max` is
dropped and `minimal` appears only where the lab or peers list it. Two models
whose lab and peers document no graded level keep a toggle, since on or off is
the caller's only choice there.

Drops all budget_tokens controls and the empty control sets, and removes the
wire comments that pointed at a native surface callers never reach.
The per-model table meant every new reasoning model needed a code change. The
values it held were already in the repository, so read them at sync time
instead: the underlying lab entry wins, otherwise the set its same-surface
peers agree on, intersected with the values this host accepts.

Preferring the lab over a relay also corrects two entries the table had copied
from the wrong source. deepseek-v4-flash now follows DeepSeek's own low|high
rather than a relay's full enum, and laguna-xs-2.1 is a toggle like Poolside's
own entry instead of inheriting its sibling's graded levels.

New models now inherit controls with no change here.
@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Action items

  • [critical] [violation] providers/neosantara/logo.svg:1 - Check: New-provider logo.svg must use currentColor, with no fixed size or hardcoded colors. Why: The final mark is a base64 PNG inside <image>, so fills cannot follow theme/currentColor and colors are baked into the raster. That fails the new-provider logo blocker. Action: Restore a true vector SVG (paths/shapes) using currentColor only, square viewBox, and no root width/height or embedded bitmaps.
  • [high] [violation] packages/core/src/sync/providers/neosantara.ts:2824 - Check: Relay reasoning_options must copy lab + same-surface peer controls for this host, not invent shapes; empty means always-on / no control. Why: neosantaraReasoningControls (1) ignores lab toggles and [], (2) tallies only peers that already have effort, (3) defaults unknowns to { type: "toggle" }, and (4) resolves first-party files only at providers/<lab>/models/<id>.toml, missing nested lab paths such as providers/poolside/models/poolside/…. That systematically invents or drops controls. Action: Match Eden AI’s approach: honor lab [] as always-on; map lab/peer toggle onto this host’s reasoning_effort surface (typically none in effort, not a bare toggle); include toggle-only peers in the baseline; fix first-party path lookup for nested lab IDs; do not default missing baselines to toggle.
  • [high] [violation] providers/neosantara/models/kimi-k2.5.toml:5 - Check: Effort lists must follow the lab/peer baseline, not a full gateway enum. Why: Moonshot’s first-party entry is toggle-only; OpenRouter and other same-surface peers are also toggle (or empty). This file authors none|minimal|low|medium|high|xhigh, which invents graded levels the lab does not expose. The same pattern is in kimi-k2.6.toml. Action: Author toggle (or effort including none if that is the only host wire for off), not the full enum; regenerate via the fixed sync mapping.
  • [high] [violation] providers/neosantara/models/kimi-k2-thinking.toml:5 - Check: [] means the model reasons with no caller control. Why: Lab and most peers use reasoning_options = [] (always-on thinking). This entry authors effort = ["high"] from a minority peer, which falsely advertises a control. Action: Set reasoning_options = [] (and teach the sync to preserve lab always-on).
  • [high] [violation] providers/neosantara/models/laguna-s-2.1.toml:5 - Check: Baseline = Poolside lab + same-surface peers for that model. Why: Lab and OpenRouter/Vercel are toggle-only. This file authors low|medium|high because first-party nested path lookup fails and peer tally only counts effort peers (Pioneer/OpenCode). Action: Author toggle (or host-equivalent off control), not L/M/H; fix path/tally so sync stops rewriting this.
  • [high] [violation] providers/neosantara/models/glm-4.6v-flash.toml:1 - Check: toggle is only for a separate on/off field; off via effort=none must be effort-only (no toggle). Why: Header says # Toggle: reasoning_effort = none turns reasoning off while the option is { type = "toggle" }. That pairs “off = none” with toggle, which AGENTS.md forbids. Same broken header/shape on ling-3.0-flash-fin.toml and laguna-xs-2.1.toml. Action: If the only wire is reasoning_effort, use effort values that include none (when off is supported) or document a real separate field; do not use type = "toggle" for reasoning_effort = none.
  • [medium] [violation] providers/neosantara/models/deepseek-v4-pro.toml:5 - Check: DeepSeek V4 baseline is toggle + high/max (host drops max). Why: Lab is toggle + high|max. This host accepts none on reasoning_effort, so off should appear as none (Eden AI style), not a lone ["high"] that cannot disable thinking. Same for deepseek-v4-pro-0813.toml. Action: Author ["none", "high"] (or toggle + high only if a separate on/off field exists on this host); drop invented L/M/H.
  • [medium] [possible mistake] providers/neosantara/models/gpt-5.4-mini.toml:4 - Check: Provider reasoning should reflect whether this host actually serves the reasoner. Why: Lab/OpenAI mark GPT-5.4 mini as reasoning = true with effort controls; this file forces reasoning = false with no options. Same pattern on claude-4.5-opus, claude-4.5-sonnet, gpt-oss-20b, gpt-oss-120b, and several Gemini/GLM rows. Action: Confirm against Neosantara capabilities/docs; if the gateway still runs them as reasoners, keep reasoning = true and author host reasoning_options; only keep false with evidence the host disables reasoning.

…g options

The first pass at deriving controls had four flaws. It looked for a lab entry
at one fixed path, so nested layouts such as providers/poolside/models/poolside
were missed; it ignored lab entries that declare no control, so an always-on
reasoner borrowed a minority peer's levels; it tallied only peers that already
had an effort list, letting one relay outvote thirty toggles; and it fell back
to a bare toggle, which claims an on/off field this host does not expose.

Controls are now projected onto this host's single field the way Eden AI does
it: an empty lab set stays empty, a lab toggle becomes reasoning_effort = none
and joins the effort list, and the lab always outranks a relay.

kimi-k2-thinking is always-on again, kimi-k2.5 and k2.6 no longer claim graded
levels their lab does not document, deepseek-v4-pro gains the none it needs to
turn thinking off, and the Laguna pair follows Poolside instead of a sibling.
@ErRickow

ErRickow commented Sep 3, 2026

Copy link
Copy Markdown
Author

Thanks — the reasoning items were right, and fixing them exposed real bugs in how I was deriving controls. Addressed in b361068, dd7b6de and 28e3443.

Root cause. This host is OpenAI-compatible and normalizes reasoning onto a single caller-facing field, reasoning_effort. Upstream-native shapes never appear in a caller's request, so documenting a thinking budget or a bare toggle described a surface nobody can reach. Controls are now read from the canonical tree at sync time — the model's own lab entry wins, otherwise the shape its peers agree on — and projected onto that one field the way edenai.ts does it.

budget_tokens on the four Claude models — dropped. No first-party Anthropic entry uses a budget, and the /v1/messages wire comments are gone.

reasoning_options = [] used as uncertainty — gone. Every reasoning model now carries a derived control, and [] survives only where the lab itself declares no control: kimi-k2-thinking, minimax-m2.7.

The four derivation bugs you named — all real, all fixed. Lab lookup now matches by filename anywhere under providers/<lab>/, so nested layouts like providers/poolside/models/poolside/… resolve; a lab's empty set is honoured as always-on; the peer tally counts toggle and empty shapes instead of only effort ones; and nothing falls back to a bare toggle.

Concretely: kimi-k2-thinking[]; kimi-k2.5 and kimi-k2.6["none"] instead of the full enum; deepseek-v4-pro and -0813["none", "high"]; laguna-s-2.1 and laguna-xs-2.1["none"] following Poolside rather than a sibling; glm-4.6v-flash and ling-3.0-flash-fin["none"] with the contradictory toggle header removed. Across all 49 models there are now zero budget_tokens, zero bare toggles, and no value outside what the request schema accepts.

One item I'd push back on: reasoning = false on gpt-5.4-mini and friends. That override is host-level, not an oversight. The public catalog does not advertise reasoning for them:

gpt-5.4-mini:      ["text_generation","function_calling","json_mode"]
gpt-oss-20b:       ["text_generation","json_mode","function_calling"]
gpt-oss-120b:      ["text_generation","json_mode","function_calling"]
claude-4.5-opus:   ["text_generation","function_calling","json_mode","vision"]
claude-4.5-sonnet: ["text_generation","function_calling","json_mode","vision"]

The lab marks the underlying models as reasoners, but this host does not serve them that way, which is what a provider override is for. Happy to revisit if you'd rather the provider file stay silent and inherit.

The logo is still on me and I'll follow up with a vector mark.

@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Action items

  • [critical] [violation] providers/neosantara/logo.svg:1 - Check: New provider logo.svg must be vector SVG using currentColor, with no fixed size or hardcoded color. Why: The final logo is an embedded PNG (data:image/png;base64) inside a wrapper SVG, so it cannot inherit theme color and ships hardcoded raster colors. That fails the new-provider logo blocker in AGENTS.md. Action: Replace with a real vector mark (fill/stroke = currentColor, square viewBox, no width/height, no embedded raster). The earlier path-based mark was closer to compliant.
  • [high] [violation] providers/neosantara/models/kimi-k2.5.toml:5 - Check: Reasoning options must match this host’s real control surface and lab/peer baseline (AGENTS.md → Reasoning options; audit skill). Why: Several reasoners are authored as effort with only ["none"] (also kimi-k2.6, laguna-s-2.1, laguna-xs-2.1, glm-4.6v-flash, ling-3.0-flash-fin). Lab entries for these are binary on/off (toggle), not graded effort. ["none"] alone documents only “off,” invents an incomplete effort list, and is not the binary-on/off shape (toggle + wire comment) or a graded list with real on levels. Eden AI’s same projection refuses toggle-only rather than inventing ["none"]. Action: For each model, either (a) author toggle with a leading wire comment for the exact host field if on/off is real, (b) author the full host-supported effort set that actually turns reasoning on/off (e.g. none plus graded levels the host honors), or (c) use [] only with affirmative evidence of no caller control—and update neosantaraReasoningControls so sync cannot emit toggle-only → ["none"].
  • [high] [possible mistake] packages/core/src/sync/providers/neosantara.ts (neosantaraReasoningControls / lab index) - Check: First-party lab controls must outrank peers for the same underlying model. Why: Lab indexing keys by owner/basename only. providers/deepseek/models/deepseek-v4-pro.toml is the first-party control set (toggle + high/max) but is stored as deepseek/deepseek-v4-pro, while Neosantara’s deepseek-v4-pro-0813 looks up deepseek/deepseek-v4-pro-0813, misses the lab file, and falls through to peer consensus—hence the authored ["none", "low", "high"] instead of the lab-projected ["none", "high"] (after dropping max). Action: Resolve lab controls via base_model chain / metadata identity (or alias dated snapshots to the lab provider entry), re-sync, and align deepseek-v4-pro-0813.toml with the lab baseline.
  • [medium] [possible mistake] providers/neosantara/models/gpt-oss-120b.toml:2 - Check: Provider reasoning overrides must be real host deltas. Why: Canonical models/openai/gpt-oss-120b (and gpt-oss-20b) are reasoning = true, but Neosantara forces reasoning = false. If the gateway still runs these as reasoners (or accepts effort), clients will omit required reasoning_options and under-report capability. Action: Verify against the Neosantara catalog/docs whether these IDs reason on this host; if yes, set reasoning = true and author correct reasoning_options; if no, keep the override and cite host evidence in the PR body.
  • [medium] [possible mistake] providers/neosantara/models/claude-4.5-opus.toml:2 - Check: Same reasoning override accuracy. Why: claude-4.5-opus / claude-4.5-sonnet set reasoning = false while Anthropic lab entries reason. Action: Confirm the host truly disables thinking for these aliases; otherwise inherit reasoning and author host-accurate controls.
  • [low] [possible mistake] .pr-review/pull-request.json (PR body) - Check: Material catalog claims should map citations to what they support. Why: Sources list API/docs/pricing URLs, but the body does not map them to concrete cost figures, which models get which effort lists, or the IDR→USD rate/date used after discount. Action: Extend the PR body so each material pricing and reasoning claim points at a first-party source and states what that source supports (rate/date for IDR conversion included).

@ErRickow
ErRickow marked this pull request as draft September 3, 2026 07:57
Reading the gateway's public schemas end to end corrected one thing and
explained several others.

No model may author a toggle here. `reasoning.enabled` on its own is inert:
reasoning is switched on by `reasoning_effort` being anything other than
`none`, so a toggle would name a control a caller cannot use. Models whose lab
documents only a binary on/off therefore author the one effort value that
changes behaviour.

provider.toml now carries the wire format the way the established relays do:
the accepted effort values, how reasoning is switched off, that a
non-reasoning model rejects the field outright, and that published costs are
the raw price after the catalog discount with IDR converted at the rate the
pricing endpoint reports.
@ErRickow
ErRickow marked this pull request as ready for review September 3, 2026 08:32
@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Action items

  • [critical] [violation] providers/neosantara/logo.svg:1 - Check: New-provider logo must use currentColor only (no fixed size or hardcoded color). Why: The final mark still hardcodes fills/strokes (#999, #d8d8d8, #bcbcbc, #a9a9a9, #fdfdfd, #000) and opacity-based greys, so it will not inherit theme color and fails the new-provider logo blocker. Action: Replace with a single-color vector that uses only currentColor (no hex/rgb fills or strokes), keep a square viewBox, and omit fixed width/height.
  • [high] [violation] providers/neosantara/models/kimi-k2.5.toml:4 - Check: Binary on/off reasoning must be authored as a real caller control, not an incomplete effort enum. Why: Several toggle-only lab/peer models are published as effort = ["none"] only (kimi-k2.5, kimi-k2.6, laguna-s-2.1, laguna-xs-2.1, glm-4.6v-flash, ling-3.0-flash-fin). That lists how to turn reasoning off but no value that turns it on, so clients cannot exercise the control the lab documents. Same-surface peers (and AGENTS.md) treat binary control as toggle (with a leading wire comment), or as effort that includes both off and real on levels. Action: For each of these, either author [[reasoning_options]] type = "toggle" with a top-of-file wire comment for the host mapping (e.g. reasoning_effort=none vs a non-none value), or publish the full host-accepted on/off effort set that actually enables reasoning—not ["none"] alone. Update the sync projector the same way so resyncs do not reintroduce the incomplete shape.
  • [medium] [possible mistake] providers/neosantara/models/deepseek-v4-pro.toml:7 - Check: Relay effort lists should preserve the lab/peer top effort when the host has an accepted substitute. Why: Lab DeepSeek V4 is toggle + high/max; OpenRouter peers map the top tier to xhigh. This host accepts xhigh but drops max, leaving only none/high and losing the highest tier. Action: Verify whether Neosantara maps lab max to xhigh (or another accepted value). If yes, include xhigh for DeepSeek V4 flash/pro (and the dated snapshot); if not, cite host docs/tests that max/xhigh is rejected or no-ops.
  • [medium] [possible mistake] providers/neosantara/models/gemini-3.5-flash.toml:2 - Check: Do not force reasoning = false on lab reasoners unless this host truly has no reasoning path. Why: Lab + first-party entries for several models are reasoning = true with controls (gemini-3.1-flash-lite, gemini-3.5-flash, gpt-oss-20b/120b, gpt-5.4-mini, Claude 4.5 opus/sonnet, etc.), but the sync overrides reasoning = false solely from a missing reasoning capability flag. That can hide real reasoning and omit required reasoning_options. Action: Confirm each override against the live Neosantara model object (or docs). If the route still reasons or accepts reasoning_effort, keep reasoning = true and author controls from the lab/peer baseline; only keep false where the host rejects reasoning for that id.

@ErRickow
ErRickow marked this pull request as draft September 3, 2026 08:41
…mment

Six models whose lab documents only an on/off were published as effort
["none"], which told a caller how to switch reasoning off but named no value
that switches it on. They are toggles now, each carrying a leading comment for
the mapping this host uses: reasoning_effort = "none" is off, any other
accepted value leaves it on, and reasoning.enabled alone does nothing.

Follows the same shape and header convention as the LLM Gateway sync, which
fronts many labs behind one reasoning_effort field too.
The vector mark still carried six hex fills and strokes, so it rendered the
same shade on both themes. Every fill and stroke is currentColor now, which is
what the site inlines against, while the existing opacity values keep the
depth of the original artwork.
@ErRickow

ErRickow commented Sep 3, 2026

Copy link
Copy Markdown
Author

All four addressed in c908cfd, 66f733c and ae8062f.

Logo — now a real vector: 9 paths, no raster, square viewBox="0 0 250 250", no root width/height, and every fill/stroke is currentColor. The original artwork's fill-opacity values are kept, so it still has depth while taking its hue from the surrounding text colour.

Binary reasoning published as effort = ["none"] — you're right that listed only the off value. Those six are toggles now, each with a leading wire comment for the mapping this host actually uses:

# Toggle: reasoning_effort = "none" turns reasoning off; any other accepted
# value (or omitting the field) leaves it on. This host has no separate on/off
# field: reasoning.enabled alone does not enable reasoning.

Same shape and header convention as llmgateway.ts:134-138, which also fronts many labs behind one reasoning_effort field. Worth recording why a separate on/off would have been wrong here: the request schema does expose a reasoning.enabled boolean, but reasoning is only switched on when an effort other than none is present, so enabled on its own is inert.

DeepSeek V4 losing the top tiermax is rejected outright, not silently dropped: the field is z.enum(['none','minimal','low','medium','high','xhigh']), so a request carrying max fails validation before dispatch. On whether xhigh substitutes for the lab's max, I have no host evidence either way, and the peers that use xhigh are documenting their own mapping rather than this one. Rather than assert a mapping I cannot show, the entry stays at the values the lab documents and this host accepts. If you'd rather see xhigh included on the strength of the peer convention, say so and I'll add it.

reasoning = false overrides — these are host deltas, verified against the live catalog rather than inferred. All 15 such files correspond to ids whose capabilities array omits reasoning, and the gateway does not merely ignore the field for them: a request carrying reasoning_effort is rejected with HTTP 400 unsupported_capability. The ids you named:

gemini-3.5-flash       ["text_generation","function_calling","json_mode","vision"]
gemini-3.1-flash-lite  ["text_generation","vision","function_calling","json_mode"]
gpt-oss-20b            ["text_generation","json_mode","function_calling"]
gpt-oss-120b           ["text_generation","json_mode","function_calling"]
gpt-5.4-mini           ["text_generation","function_calling","json_mode"]
claude-4.5-opus        ["text_generation","function_calling","json_mode","vision"]
claude-4.5-sonnet      ["text_generation","function_calling","json_mode","vision"]

Keeping reasoning = true for them would advertise a control that returns 400.

Longer term. The recurring theme across your reviews is that this entry infers the host's reasoning surface from lab and peer files. The hosts that avoid that publish it themselves — capabilities.reasoning_efforts on LLM Gateway and DigitalOcean, reasoning.effort_values on Merge Gateway, opencode.variants.*.reasoning on Kilo. I'm proposing the same on the Neosantara side so the sync reads the accepted values per model instead of deriving them. Until that ships, the derivation follows the lab entry first and peer consensus second.

@ErRickow
ErRickow marked this pull request as ready for review September 3, 2026 08:54
@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] packages/core/src/sync/providers/neosantara.ts:456 - Check: Resolved provider models must not contradict canonical lab reasoning (and must set reasoning_options when reasoning = true). Why: buildNeosantaraModel sets reasoning only from Neosantara capabilities.includes("reasoning"), then writes reasoning = false with no reasoning_options for many lab reasoners (e.g. claude-4.5-opusanthropic/claude-opus-4-5, gpt-5.4-mini, gpt-oss-20b/120b, gemini-3.1-flash-lite/3.5-flash, deepseek-v4-flash-0731, glm-4.5-flash/4.7/4.7-flash, minimax-m3, mistral-small-latest, muse-glimmer-30b, llama-3.3-nemotron-super-49b-v1.5). Eden AI treats reasoning as a lab fact; a missing gateway capability flag must not force false. Action: Derive reasoning from the base_model lab entry (or lab ∪ gateway), author reasoning_options for every resolved reasoner, and stop emitting reasoning = false overrides that contradict the lab.
  • [high] [violation] providers/neosantara/logo.svg:6 - Check: New-provider logo.svg must use currentColor for fills/strokes (no fixed color). Why: Three paths use only fill-opacity / stroke="currentColor" with no fill. SVG default fill is black, so those shapes stay black on both themes and fail the compliant-logo blocker. Established logos (e.g. Helicone) set fill="currentColor" together with opacity. Action: Add fill="currentColor" (and keep opacity) on every path that paints fill.
  • [low] [violation] providers/neosantara/provider.toml:10 - Check: Leading wire-format comments must match authored controls. Why: The header still says no model authors a toggle, but six models (glm-4.6v-flash, kimi-k2.5/k2.6, laguna-s-2.1/xs-2.1, ling-3.0-flash-fin) author type = "toggle" with toggle headers. Action: Update the provider.toml comment so it documents toggle + reasoning_effort mapping consistently with those files.

@ErRickow
ErRickow marked this pull request as draft September 3, 2026 09:09
@ErRickow

ErRickow commented Sep 3, 2026

Copy link
Copy Markdown
Author

@rekram1-node hei, the github action reviewer just making me going through to the loop. He always asking, but I'm unable to answer with the tag (eg. @bot).

The sync and reasoning field is gateway design, so if the reviewer point to the upstream that the existing models.dev provider have, is not valid issues, and he always ask, how tf i will reply to that feedback. Please give me some advice :)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this svg.... Would prefer b64 embed instead of full vector

Capability flags are read only from each catalog entry's `capabilities`
array, never inherited from lab metadata: this gateway enforces its own
list and answers HTTP 400 for `reasoning_effort` on a model without
`reasoning`, so a model the lab ships as a reasoner is published here
with reasoning = false until the catalog advertises it. `tool_call`
follows `function_calling` for the same reason. A capability the gateway
adds later is therefore picked up by the next sync with no code change.

Reasoning models gain `interleaved.field = "reasoning_content"`. Verified
against the live API through the AI SDK with streaming: `reasoning_effort
= none` returns zero reasoning tokens, any graded level streams
`reasoning_content` deltas, and `max` is rejected with the enum
`none|minimal|low|medium|high|xhigh`.

Reasoning-control indexing: the provider tree is resolved from the module
rather than the working directory, an unreadable tree throws instead of
silently publishing "no caller control" for every reasoning model, and a
lab entry whose controls this host cannot express is left unrecorded so
peer consensus still applies.

Model TOMLs regenerated with `sync-models.ts neosantara`; re-running it
reports no further changes. Also lets the remaining logo paths inherit
the theme color.
@ErRickow
ErRickow marked this pull request as ready for review September 3, 2026 10:55
@ErRickow

ErRickow commented Sep 3, 2026

Copy link
Copy Markdown
Author

about opus 7, 8... this is neosantara side wrong statement about the model id, sorry... will be fixed and will auto sync if we made changes on the gateway

@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Action items

  • [high] [possible mistake] providers/neosantara/models/gpt-oss-20b.toml:2 - Check: Provider reasoning must reflect what this host actually serves, not a silent catalog omission. Why: Several entries force reasoning = false on models whose lab metadata is reasoning = true (including gpt-oss-20b, gpt-oss-120b, gpt-5.4-mini, claude-4.5-opus, claude-4.5-sonnet, deepseek-v4-flash-0731, gemini-3.5-flash, glm-4.7). That strips reasoning_options / interleaved and tells clients the route is non-reasoning. Action: Re-check each of these against GET /v1/models capabilities (and a live reasoning_effort call). If the host does serve reasoning, set reasoning = true and author the matching host controls; if it truly does not, keep false and cite that per-model evidence in the PR body.
  • [high] [violation] packages/core/src/sync/providers/neosantara.ts:288 - Check: On relays, reasoning_options = [] means affirmative no caller control, not uncertainty (AGENTS.md → Reasoning options). Why: neosantaraReasoningControls returns [] for both always-on lab/peer sets and unresolved sets (derived === undefined). Combined with always syncing reasoners, a model with no lab/peer control mapping is published as always-on with no controls. Action: Treat unresolved controls as skip (or preserve hand-authored), and only emit [] when lab/peers explicitly document always-on; restore a skip/notice path for unmapped reasoners.
  • [medium] [violation] providers/neosantara/models/gpt-oss-20b.toml:1 - Check: Non-USD costs must note FX rate and date in a leading top-of-file comment (AGENTS.md → Cost). Why: IDR list prices are converted via meta.exchange_rate.usd_idr, but generated IDR model TOMLs (e.g. gpt-oss-20b) ship bare USD numbers with no rate/date header; provider.toml describes the method only. Action: Have the sync write a leading header on IDR-priced models (rate, timestamp/source from the pricing response) and regenerate those files.
  • [medium] [possible mistake] providers/neosantara/models/deepseek-v4-pro.toml:7 - Check: Relay effort lists must be the lab/peer set this host can actually honor. Why: DeepSeek lab V4 is toggle + high/max (Flash: low/high/max). After dropping max (not in the host enum), Pro is published as ["none", "high"] and Flash as ["none", "low", "high"]. That is plausible only if this host really has no max/xhigh equivalent and maps off via none. Action: Confirm against docs/live traffic whether off is reasoning_effort=none and whether any host value covers lab max; if not, document the loss explicitly or adjust the projected set.

Treat missing lab and peer reasoning controls as unresolved instead of
publishing an affirmative always-on control set. Such models are now
skipped and reported until a reviewed control mapping exists; an empty
list remains reserved for explicitly always-on models.

Neosantara's DeepSeek route only consumes effort as an enable flag and
does not forward graded effort upstream, so publish those routes as a
binary toggle rather than claiming high/max distinctions the gateway
cannot honor. Correct the toggle header to record that omission defaults
to off.

Add authoritative FX provenance headers to every model whose IDR source
pricing is converted to USD, including the rate, source, and pricing
snapshot date. Regenerate provider TOMLs from the public catalog.

The gateway capability list remains authoritative for reasoning support:
models that omit reasoning from GET /v1/models retain reasoning=false,
regardless of provider-agnostic lab metadata.
@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] packages/core/src/sync/providers/neosantara.ts:6881 - Check: Relay reasoning_options must not treat uncertainty as affirmative always-on ([]). Why: neosantaraReasoningControls collapses both an explicit empty reasoning_efforts list and a missing/undefined list to []. On a multi-model relay, [] means “reasons with no caller control,” not “catalog omitted controls.” That can stamp always-on for models that actually expose effort/toggle. Action: Distinguish explicit [] (always-on) from missing reasoning_efforts; for the latter, skip the model (and report it) until the catalog publishes a real control set.
  • [high] [possible mistake] providers/neosantara/models/laguna-s-2.1.toml:8586 - Check: Relay effort lists must follow lab + same-surface peers for that model, not a full host ladder. Why: Final options are none/minimal/low/medium/high/xhigh/max, but Poolside’s own entry and OpenRouter peers are toggle-only (enable_thinking / reasoning.enabled). Advertising graded levels invents controls the lab/peers do not expose unless this host truly differentiates them. Same issue on laguna-xs-2.1. Action: Verify live/catalog behavior; if only on/off is real, author toggle (with the leading wire comment) or effort that only reflects the actual levels.
  • [high] [possible mistake] providers/neosantara/models/step-3.5-flash.toml:8723 - Check: Do not dump the host effort enum when lab/peers are narrower. Why: Final options are the full ladder including none/minimal/xhigh/max, while first-party StepFun documents only low/high and OpenRouter authors []. That is the full-enum anti-pattern unless Neosantara’s catalog/API meaningfully honors every listed value. Action: Intersect to the host-verified subset (likely low/high, or always-on [] if no control is forwarded); cite the catalog/API evidence for any extra levels.
  • [high] [possible mistake] providers/neosantara/models/ling-3.0-flash-fin.toml:8632 - Check: Baseline for toggle-only models on relays. Why: Final options are the full graded ladder, while established peers (OpenRouter/Vercel/opencode free) author toggle-only for this model. Graded L–max claims caller control the baseline does not support. Action: Match the host’s real surface: toggle with wire comment, or a verified narrower effort list—not the full enum.
  • [medium] [possible mistake] providers/neosantara/models/kimi-k2.5.toml:8511 - Check: Kimi reasoning controls vs lab/peer baseline. Why: Moonshot’s first-party entry is toggle-only; this PR publishes none…max. LLM Gateway peers also dump a wide enum, so this may be a shared gateway shape, but it still needs host evidence that graded efforts (including minimal/max) actually change behavior rather than collapsing to on/off. Same pattern on kimi-k2.6 / kimi-k3. Action: Confirm per-level effect on Neosantara; if only on/off works, author toggle (or effort with only the real levels).
  • [medium] [possible mistake] providers/neosantara/models/muse-spark-1.1.toml:8699 - Check: Extra effort values beyond lab/same-surface peers. Why: Meta/LLM Gateway baseline is minimal/low/medium/high/xhigh; this entry adds none and max. Extra levels need host proof. Action: Drop unproven values or provide catalog/live evidence that none and max are accepted and meaningful here.
  • [medium] [possible mistake] providers/neosantara/models/gpt-5.4.toml:6156 - Check: GPT effort lists should match OpenAI + GPT-style relay peers. Why: After the uniform-enum pass, GPT-5.4/5.5 still carry minimal in addition to OpenAI’s none/low/medium/high/xhigh (and GPT-5.6 variants may omit lab max). Unless the Neosantara catalog advertises those exact sets, this is inventing/dropping levels. Action: Align each GPT id to the catalog-advertised subset (and OpenAI peer baseline); do not keep a residual full-ladder stamp from the earlier uniform-enum approach.
  • [low] [violation] providers/neosantara/provider.toml:6515 - Check: Provider header must match the shipping sync source and reasoning policy. Why: Final code/tests use GET /v1/catalog and per-model reasoning_efforts, but provider.toml still documents the old /v1/models + /v1/public/pricing merge and the commit-14 “full enum for every reasoner” story. That misleads future sync/review. Action: Rewrite the leading comment for /v1/catalog, USD pricing already in-catalog, and the [] / ["none"]→toggle / graded-effort mapping actually implemented.

Replace the uniform host-enum reasoning surface with per-model effort
lists that follow each model's real controls (first-party lab entry +
same-surface OpenRouter/Vercel peers), never a full-enum dump:

- Poolside Laguna, InclusionAI Ling, Moonshot Kimi K2.5/K2.6 -> toggle
- StepFun Step-3.5 -> low/high; Meta Muse -> minimal..xhigh
- GPT-5.4/5.5 -> none/low/medium/high/xhigh (no minimal); GPT-5.6 adds max
- Claude -> none/low/medium/high; Kimi K3 -> none/low/high/max
- GLM-4.7 / *V and other forced/always-on models -> [] (no caller control)

Distinguish an explicit empty reasoning_efforts (always-on, []) from a
missing one: a reasoning model whose surface the catalog does not report
is now skipped and reported, not stamped always-on. Toggle entries carry
the leading wire comment.

Rewrite provider.toml for the /v1/catalog source and the []/toggle/effort
mapping. Regenerated TOMLs (6 toggle, 4 always-on, 24 effort); re-sync is
idempotent and bun validate passes.
@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] providers/neosantara/models/gpt-5-nano.toml:8983 - Check: Relay reasoning_options must follow the lab + same-surface peer baseline for that model (AGENTS.md → Reasoning options). Why: Final efforts are none / low / medium / high / xhigh, but OpenAI first-party and OpenRouter both use minimal / low / medium / high (no none, no xhigh). This invents levels and drops minimal. Action: Set reasoning_options to [{ type = "effort", values = ["minimal", "low", "medium", "high"] }] (or the exact host intersection of that set), and align the catalog/sync mapping so it cannot reintroduce the wrong ladder.
  • [high] [violation] providers/neosantara/models/deepseek-v4-flash.toml:8130 - Check: DeepSeek V4 baseline is lab/peer toggle + graded effort, not a GPT-style ladder. Why: Lab Flash is toggle + low / high / max; OpenRouter peers keep toggle + graded effort. The PR publishes only effort = ["none", "high", "max"], dropping Flash’s low and collapsing the lab toggle+effort surface. The same none / high / max shape is also applied to Pro/dated snapshots. Action: For each DeepSeek V4 route, publish this host’s real control: either toggle + lab efforts (low/high/max for Flash; high/max for Pro) with a leading wire comment, or if off is only reasoning_effort=none, use effort with none plus the lab graded set (include low on Flash). Do not stamp every DeepSeek id with the same incomplete list.
  • [high] [violation] providers/neosantara/models/claude-opus-4-6.toml:8888 - Check: Claude effort lists must track lab + same-surface peers, intersected with host-accepted values (host ladder includes max). Why: Final Claude entries use none / low / medium / high. Lab Opus 4.6 is low / medium / high / max (plus budget); Opus 4.7/4.8/Fable/Opus 5/Sonnet 5 include xhigh and/or max; OpenRouter peers keep those grades (often with toggle). Dropping max/xhigh while the host accepts max understates controls; inventing a uniform Claude ladder is not baseline-faithful. Action: Per Claude id, author lab/peer grades the host actually honors (restore max and, where lab/peers have it, xhigh). If off is host-only via reasoning_effort=none, keep none in effort or a documented toggle—do not strip lab grades.
  • [medium] [violation] providers/neosantara/models/gemini-3.6-flash.toml:8216 - Check: Gemini relay efforts must match Google lab (and peers), not a rewritten ladder. Why: Lab gemini-3.6-flash is minimal / low / medium / high; the PR uses none / low / medium / high (drops minimal, adds none). gemini-3.5-flash has the same pattern vs lab minimal / low / medium / high. Action: Restore minimal and only add none if this host truly exposes off for those models; otherwise match the lab set exactly.
  • [medium] [possible mistake] providers/neosantara/models/kimi-k3.toml:9115 - Check: Moonshot K3 lab is toggle + low / high / max. Why: Final file is effort = ["none", "low", "high", "max"] (folding toggle into none is plausible on an OpenAI-compat host), but confirm the live Neosantara surface actually accepts graded low/high/max rather than toggle-only. Action: Verify against the host API/docs and keep either toggle + ["low","high","max"] with a wire comment, or effort including none plus those grades—do not leave an unverified hybrid if graded effort is not forwarded.

…lab entry

Per-family effort ladders could never match AGENTS.md's per-model baseline
(gpt-5-nano != gpt-5.4, claude-opus-4-6 != 4-7, gemini-3.6 has minimal), so
the sync now reads each model's first-party lab entry from the canonical
tree and uses its effort values, intersected with the host enum. The
catalog reasoning_efforts supplies only the host mechanism: [] = always-on,
["none"] = toggle, else graded (with `none` kept only when the lab supports
off and the host exposes it).

Fixes the flagged ladders: gpt-5-nano -> minimal/low/medium/high;
gpt-5.4 -> none/low/medium/high/xhigh; claude-opus-4-6 -> low/medium/high/max
(4-7 adds xhigh); gemini-3.6-flash -> minimal/low/medium/high;
deepseek-v4-flash -> none/low/high/max (pro none/high/max); step-3.5 -> low/high.
No full-enum dumps or invented levels.
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] packages/core/src/sync/providers/neosantara.ts (graded branch of neosantaraReasoningControls) - Check: Relay reasoning_options must be the intersection of this host’s real controls and the lab/peer baseline (AGENTS.md → Reasoning options; audit skill step 2). Why: For graded models the sync takes lab effort values filtered only by the global host enum, not by the model’s catalog reasoning_efforts. That invents levels the catalog did not list and can drop levels the host did list. Concrete outcomes in the regenerated TOMLs/tests: deepseek-v4-flash becomes none/low/high/max while the host surface was none/high/max (invents low); gpt-5-nano becomes minimal/low/medium/high while the host surface was none/low/medium/high/xhigh (invents minimal, drops host none/xhigh); Claude entries pick up lab max/xhigh beyond the host’s advertised graded set. Callers then see false capability or miss real ones. Action: For graded hosts, set effort to (lab graded ∩ host graded) (plus none only when lab supports off and host lists none). Do not publish lab-only levels the catalog did not advertise, and do not drop host-advertised graded levels that survive the lab/peer baseline. Update tests to assert intersection, not lab-overwrite.
  • [medium] [violation] packages/core/src/sync/providers/neosantara.ts (firstPartyLabReasoning) - Check: First-party baseline must resolve the real lab provider file for the base_model. Why: Lookup is only providers/<lab>/models/<rest>.toml. That misses nested first-party layouts (e.g. providers/poolside/models/poolside/laguna-*.toml for poolside/laguna-s-2.1) and dated DeepSeek snapshots with no same-named first-party file (deepseek-v4-flash-0731, deepseek-v4-pro-0813 — only deepseek-v4-flash.toml / deepseek-v4-pro.toml exist). Those models fall through to “no lab effort” and then either dump the host list or under-specify controls (e.g. deepseek-v4-flash-0731 ends as none/high/max while the live DeepSeek flash entry is toggle + low/high/max). Action: Resolve lab files the same way other syncs do (walk providers/<lab>/models/**, match basename / base_model target, and for snapshot IDs follow the lab’s canonical/latest entry that points at them). Cover nested Poolside and DeepSeek dated IDs in tests.
  • [medium] [possible mistake] providers/neosantara/models/deepseek-v4-flash.toml / claude-*.toml / gpt-5.6-*.toml (max in effort) - Check: Effort values must be accepted on this host’s wire API. Why: An earlier revision of this PR recorded live AI SDK checks that max returned HTTP 400 (none|minimal|low|medium|high|xhigh only). Later commits expand HOST_EFFORTS and publish max on DeepSeek, Claude, GPT-5.6, GLM, etc. If max is still rejected, those entries are invalid. Action: Re-verify on Neosantara that reasoning_effort=max is accepted for each family that lists it (or drop max everywhere the host still rejects it) and cite that host evidence in the PR body mapped to the affected models.

… copy it verbatim

The /v1/catalog endpoint now resolves each model's real reasoning_effort surface
host-side from that model's models.dev lab entry (with documented host exceptions:
DeepSeek collapses low/medium->high so it accepts high/max; z.ai GLM-4.7 and vision
variants force thinking on; Anthropic is served via the OpenAI-compatible
reasoning_effort field so off = none; dedicated -reasoning variants are always-on).

The sync therefore drops the tree-derivation/intersection and copies the catalog's
reasoning_efforts verbatim (llmgateway convention): [] -> always-on, ["none"] ->
toggle, else effort, intersected with the host enum defensively. This removes the
invented levels the reviewer flagged: deepseek-v4-flash is none/high/max (no invented
low), gpt-5-nano is minimal/low/medium/high, dated snapshots resolve to the canonical
entry (deepseek-v4-flash-0731 -> none/high/max), and every listed reasoning model
except the two neosantara-internal garda ids now carries an accurate surface.
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Action items

  • [high] [possible mistake] providers/neosantara/models/claude-opus-4-6.toml:9 - Check: Reasoning options baseline = lab + same-surface peers (AGENTS.md / audit skill). Why: Final Claude routes advertise effort including none (e.g. claude-opus-4-6none/low/medium/high/max; same pattern on claude-opus-4-7, claude-opus-4-8, claude-opus-5, claude-fable-5, claude-sonnet-4-6, claude-sonnet-5). First-party Anthropic and OpenRouter peers do not use effort=none for these models (lab is graded-only or toggle + graded without none). Patch 18 claims catalog levels are lab-derived, but lab entries have no none. Publishing off when the model cannot actually disable thinking misleads callers. Action: Verify on this host that reasoning_effort=none truly disables Claude thinking for each ID (cite request/response evidence). If off is real via a separate wire control, use toggle + graded lab levels (no none in effort). If off is not supported, drop none and match lab graded sets.
  • [high] [possible mistake] providers/neosantara/models/deepseek-v4-flash.toml:7 - Check: DeepSeek V4 baseline effort set (lab + faithful peers). Why: Final surface is none/high/max. First-party deepseek-v4-flash is toggle + low/high/max and lab docs map requested lowlow on Flash (not collapse-to-high). Omitting low understates a real control if this host forwards it. Action: Confirm whether Neosantara accepts and honors low for Flash (and dated deepseek-v4-flash-0731). If yes, include low (and keep off as none or toggle per the host wire). If the host truly collapses low/medium→high, document that host exception in the leading comment and keep the narrower set.
  • [medium] [violation] packages/core/src/sync/providers/neosantara.ts:1 - Check: Sync module must not leave dead code after refactor. Why: Patch 18 removed firstPartyLabReasoning / path usage but left import { existsSync, readFileSync } from "node:fs", which is unused. Action: Delete the unused node:fs import (and any other leftovers) so the module matches the catalog-only reasoning path.
  • [medium] [violation] providers/neosantara/models/claude-opus-4-7.toml:2 - Check: base_model files are override-only (no restated identical fields). Why: Several Claude (and similar) files restate structured_output = true when the lab entry already has structured_output = true (e.g. claude-opus-4-7, claude-opus-4-8, claude-fable-5, claude-sonnet-5). That violates override-only provider files. Action: Drop fields that match the lab after merge; keep only real deltas (cost, reasoning_options, interleaved, narrowed limit/modalities, true capability differences).
  • [low] [possible mistake] providers/neosantara/models/gemini-3.7-flash.toml (cost block) - Check: Material pricing claims need mappable first-party evidence. Why: Gemini 3.7 Flash cost moved to input = 1.5 / output = 7.5 while first-party Google remains 0.75 / 3.75. Relay markup is allowed but is not explained against a cited Neosantara price row. Action: In the PR body, map each material price delta (at least flagship Gemini/Claude/GPT rows) to the specific /v1/catalog field or docs section that supports it.

…d clean overrides

- Align Claude reasoning models with lab baselines by removing unsupported 'none' effort
- Restore 'low' reasoning effort for DeepSeek Flash variants
- Remove redundant structured_output overrides from base_model files
- Remove unused fs import in sync module
- Apply catalog discounts to reflect effective billed rates on Gemini, Kimi, and MiniMax
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] providers/neosantara/models/claude-sonnet-5.toml:6 - Check: Relay reasoning_options must match the lab/same-surface baseline for this model. Why: First-party providers/anthropic/models/claude-sonnet-5.toml and peer providers/openrouter/models/anthropic/claude-sonnet-5.toml both author toggle + graded effort (low/medium/high/xhigh/max). This file keeps only graded effort and drops both toggle and none, so callers have no documented way to turn reasoning off on a model whose lab exposes off. Action: Author either toggle (with the required leading reasoning_effort wire comment) + the lab effort list, or effort including none plus those levels—whichever this host actually implements—and make the sync/catalog emit the same shape so the next run does not regress it.
  • [high] [violation] providers/neosantara/models/gemini-3.5-flash.toml:8 - Check: Graded effort must follow the lab/peer set for that model, not a substituted ladder. Why: Lab providers/google/models/gemini-3.5-flash.toml is minimal/low/medium/high with no none. This entry publishes none/low/medium/high, inventing off and dropping minimal. Sibling Gemini 3.6/3.7 entries were corrected; 3.5 was not. Action: Set values = ["minimal", "low", "medium", "high"] (or the host’s verified intersection of that set) and ensure /v1/catalog / the sync produce that surface.
  • [medium] [violation] packages/core/src/sync/providers/neosantara.ts:96 - Check: Sync-owned reasoning TOMLs must stay consistent with the translator. Why: neosantaraReasoningControls still copies catalog reasoning_efforts verbatim, while patch 19 hand-edited several TOMLs (Claude none removal, DeepSeek Flash low restore, discounted costs). The next bun models:sync neosantara will rewrite those files from the catalog and undo the audit unless the catalog (or post-processing) already emits the corrected surfaces. Action: Make the catalog/sync the single source of the audited ladders and costs, re-run sync, and drop one-off TOML edits that the module cannot reproduce.

…asoning

- Author toggle + graded effort for Claude Sonnet 5 matching lab and OpenRouter baselines
- Include required wire comment naming reasoning_effort = none for toggle models
- Support has_toggle in sync provider and test suite for reproducible generation
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] providers/neosantara/logo.svg:1 - Check: New-provider logo.svg must use currentColor for fills/strokes (no hardcoded colors). Why: After the vector rewrite, several paths set only fill-opacity / stroke-opacity and omit fill/stroke. SVG defaults fill to black, so those layers stay fixed black instead of following theme currentColor. Action: Set fill="currentColor" (and keep opacity as needed) on every filled path, matching logos that already use opacity with fill="currentColor".
  • [medium] [possible mistake] packages/core/src/sync/providers/neosantara.ts:10329 - Check: Relay reasoning_options must match this host’s real control surface (lab + same-surface peers), not sticky local state. Why: neosantaraReasoningControls sets hasToggle from existing?.reasoning_options containing toggle even when the catalog omits has_toggle. Once a toggle is written, later syncs can keep emitting toggle + graded effort after the catalog drops the flag. Action: Drive toggle only from the catalog (has_toggle / ["none"]); do not re-infer toggle from prior TOMLs.
  • [medium] [possible mistake] packages/core/src/sync/providers/neosantara.ts:9975 - Check: interleaved is provider-specific and must reflect this API’s side channel. Why: Every reasoning = true model gets interleaved.field = "reasoning_content", including Gemini and other lab routes that first-party/OpenRouter peers do not mark as reasoning_content. Callers may look for a channel that never appears. Action: Author interleaved only for models this host actually streams that way (or document/verify it for each family).
  • [medium] [possible mistake] providers/neosantara/models/deepseek-v4-flash.toml:7 - Check: DeepSeek V4 baseline is lab + peers: toggle + graded effort (low/high/max or high/max), not a free-form ladder. Why: Final Flash/Pro entries use effort with none and no toggle, while providers/deepseek/ and OpenRouter use toggle + effort without none in values. Encoding off only as none is valid if that is the real wire mapping; if the host still has a separate enable path, this understates controls. Action: Confirm live DeepSeek requests on Neosantara; if off is a separate control or lab-style toggle+effort is forwarded, author toggle + effort (with the required wire comment) and drop none from effort values.
  • [medium] [possible mistake] providers/neosantara/models/kimi-k3.toml:6 - Check: Kimi K3 lab/OpenRouter baseline is toggle + low/high/max. Why: This entry is effort ["none","low","high","max"] only. Same host-mapping question as DeepSeek: fine if none is the sole off switch; incomplete if adaptive/toggle is separate. Action: Verify the K3 wire on this host and align with lab/OpenRouter (toggle + graded effort, wire comment) when applicable.
  • [low] [possible mistake] providers/neosantara/models/claude-sonnet-5.toml:1 - Check: Material pricing should match the cited catalog/billed rates. Why: Neosantara lists input/output 3/15 while first-party Anthropic Sonnet 5 is 2/10 (OpenRouter matches lab). May be intentional markup/discount handling, but it is a large delta. Action: Confirm against GET /v1/catalog effective USD rates (post-discount) and adjust or note the source in the PR body.

@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Action items

  • [high] [possible mistake] providers/neosantara/models/gpt-5.4-mini.toml:4 - Check: Relay reasoning / reasoning_options must follow lab + same-surface peers when the host exposes the model as a reasoner. Why: This file still sets reasoning = false with no controls, while providers/openai/models/gpt-5.4-mini.toml and OpenRouter peers use effort none|low|medium|high|xhigh, and this host already publishes full GPT-5.4 reasoning controls. That understates capability if the catalog/API actually forwards reasoning. Action: Verify live /v1/catalog for gpt-5.4-mini. If providers[].reasoning is true (or the API accepts reasoning_effort), set reasoning = true and author the lab/peer effort ladder; only keep reasoning = false with host proof that reasoning is rejected.
  • [high] [possible mistake] providers/neosantara/models/gemini-3.1-flash-lite.toml:2 - Check: Same lab/peer baseline for Gemini reasoners. Why: Entry forces reasoning = false, but providers/google/models/gemini-3.1-flash-lite.toml and OpenRouter use effort minimal|low|medium|high, and sibling Gemini 3.5/3.6/3.7 on Neosantara already ship reasoning options. Action: Confirm catalog/API for this id; if reasoning is supported, drop reasoning = false and add matching reasoning_options (and interleaved if applicable).
  • [medium] [possible mistake] providers/neosantara/models/glm-4.7.toml:3 - Check: Host reasoning flag must not contradict the PR’s own GLM host exception or the lab entry. Why: Lab providers/zhipuai/models/glm-4.7.toml is reasoning = true with toggle, and the PR states GLM-4.7 / vision variants force thinking on—yet this file sets reasoning = false (no [] always-on). Sibling glm-4.7-flash is already reasoning_options = []. Action: If thinking is forced on this host, set reasoning = true and reasoning_options = [] (plus interleaved if streamed); if toggle is exposed, author toggle + wire comment; only keep reasoning = false with proof the API rejects reasoning.
  • [medium] [possible mistake] providers/neosantara/models/claude-4.5-opus.toml:2 - Check: Capability overrides for known reasoners need host evidence. Why: claude-4.5-opus / claude-4.5-sonnet still force reasoning = false while lab metadata is reasoning-capable (budget/effort) and later Claude ids on this host publish reasoning controls. Action: Verify catalog flags for both ids; if reasoning is served, author host-accurate reasoning_options (effort and/or toggle per this API), not a blanket reasoning = false.
  • [medium] [possible mistake] providers/neosantara/models/gpt-oss-20b.toml:2 - Check: Open-weights GPT-OSS reasoners should not be silently demoted without host proof. Why: models/openai/gpt-oss-20b (and 120B) are reasoning = true, but both Neosantara files set reasoning = false with no controls or note. Action: Confirm whether Neosantara actually disables reasoning for these ids; if not, set reasoning = true and the correct reasoning_options (or [] only if always-on with no caller control).

…lities for lab-aligned models

- Delegate base_model and override_name resolution directly to backend /v1/catalog
- Remove hardcoded model aliases and override maps from sync module
- Restore reasoning effort surfaces for gpt-5.4-mini, gemini-3.1-flash-lite, glm-4.7, claude-4.5-opus, claude-4.5-sonnet, gpt-oss-20b, and gpt-oss-120b
- Point deepseek-v4-flash and deepseek-v4-pro to their canonical dated base models (0731 and 0813)
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Action items

  • [high] [possible mistake] providers/neosantara/models/claude-4.5-sonnet.toml:2 - Check: Relay reasoning_options must follow the lab / same-surface peer baseline; [] only when the host truly exposes no caller control. Why: This file authors reasoning_options = [] (always-on). Lab providers/anthropic/models/claude-sonnet-4-5.toml exposes budget_tokens, and same-surface OpenAI-compatible peers (e.g. OpenRouter) author a toggle—not “no control.” The PR’s always-on host exceptions call out GLM-4.7 / vision variants, not Claude 4.5 Sonnet. Action: Verify on this host whether reasoning_effort (or another field) can disable or budget thinking. If it can, replace [] with the real surface (typically toggle, with the required wire comment). If it cannot, document that host exception in the leading comment / PR body with concrete request evidence.
  • [high] [possible mistake] providers/neosantara/models/glm-4.7.toml:4 - Check: Graded/toggle baselines for GLM-4.7 must not be collapsed to [] without affirmative no-control evidence. Why: Final entry uses reasoning_options = [] while lab (providers/zhipuai|zai/models/glm-4.7.toml) and OpenRouter peers author toggle. It also overrides lab attachment = false / text-only modalities with attachment = true and input = ["text", "image"]. Action: Confirm the catalog’s forced-thinking + vision claims against live requests. If off is available, author toggle (+ wire comment). If vision is not accepted, drop the attachment/image overrides so the file stays override-only for real deltas.
  • [medium] [possible mistake] providers/neosantara/models/glm-4.7-flash.toml / providers/neosantara/models/glm-4.6v-flash.toml - Check: Always-on [] vs peer toggle for GLM-4.x flash / vision. Why: Both ship reasoning_options = [] while OpenRouter’s GLM-4.7-flash / GLM-4.6V peers use toggle. PR text asserts forced thinking for these families; that needs host-side proof, not catalog assertion alone. Action: Verify whether reasoning_effort = "none" (or omit) disables thinking. If yes, switch to toggle + wire comment; if no, keep [] and cite the host behavior next to the option set.
  • [medium] [possible mistake] providers/neosantara/models/minimax-m3.toml:2 - Check: Host reasoning must not contradict lab/peer reasoners without evidence. Why: File sets reasoning = false while models/minimax/MiniMax-M3.toml, first-party MiniMax, and OpenRouter all mark this model as reasoning with a toggle. Action: Confirm Neosantara rejects reasoning controls for this id. If it reasons, drop reasoning = false and author the real reasoning_options (likely toggle).
  • [medium] [possible mistake] providers/neosantara/models/deepseek-v4-flash.toml / providers/neosantara/models/deepseek-v4-pro.toml - Check: Capability overrides vs lab metadata. Why: Both set attachment = true and image input while lab DeepSeek V4 Flash/Pro metadata is text-only / attachment = false. Reasoning controls themselves match the lab (toggle + low|high|max / high|max). Action: Confirm vision is accepted on these routes; if not, remove the attachment/image overrides.
  • [low] [possible mistake] providers/neosantara/provider.toml / PR body - Check: Material pricing/discount claims need mapped first-party citations. Why: Costs were rewritten (e.g. Gemini/Kimi/MiniMax discount bands) from the gateway catalog; the PR cites the catalog endpoint but does not map which published rates/discounts support each changed TOML. Action: Add brief PR-body mappings (URL → which model costs / FX or discount rule) so reviewers can spot-check without re-deriving every figure.

…t lab baselines

- Expose toggle reasoning controls for Claude 4.5 Sonnet, GLM-4.7, GLM-4.7-Flash, GLM-4.6V-Flash, MiniMax M3, and Nemotron Super 49B
- Drop redundant and incorrect vision/attachment overrides on DeepSeek V4 Flash/Pro, GLM-4.7, and GLM-4.5-Flash to inherit text-only lab metadata
- Restore reasoning capabilities and effort ladders on MiniMax M3 and Muse Glimmer 30B
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] packages/core/src/sync/providers/neosantara.ts:10800 - Check: Non-lab hosts must resolve base_model only to an existing models/<lab>/<id>.toml entry. Why: resolveNeosantaraBaseModel now returns the catalog’s base_model string unchecked (model.base_model ?? resolveModelMetadataBaseModel(...)). shouldSyncNeosantaraModel only tests !== undefined, so any non-empty remote pointer is treated as valid. A missing or mistyped target then fails inside factorBaseModelmodelMetadata() (readFileSync of a non-existent path) and can abort the whole provider sync instead of skipping/reporting that one model. Action: Accept a catalog base_model only after confirming it exists in the local models/ tree (same existence semantics as resolveModelMetadataBaseModel); otherwise fall back to id-based resolution or skip the model via sourceID / skippedNotice.
  • [medium] [possible mistake] providers/neosantara/models/claude-opus-5.toml:2 - Check: Provider base_model files must keep only real host deltas vs the lab entry. Why: The entry still forces structured_output = false while providers/anthropic/models/claude-opus-5.toml and the lab metadata advertise structured output as supported. The same pattern remains on other files left with structured_output = false (e.g. DeepSeek V4, several GLM, GPT-5.6 variants). If the gateway truly rejects structured output, the override is fine; if the catalog flag is wrong, consumers inherit an incorrect capability. Action: Confirm each remaining structured_output = false against this host’s live API/docs; drop the override where the host matches the lab, or keep it only with a brief leading note that this gateway does not expose structured output for that model.

…ant structured_output overrides

- Confirm catalog base_model exists in local models/ tree before accepting it, falling back safely to id resolution
- Drop false structured_output = false overrides across 15 models to inherit structured output support from lab base models
- Add unit test coverage for invalid base_model handling and safe fallback
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] packages/core/src/sync/providers/neosantara.ts - Check: When a relay marks attachment = false / vision = false, it must not leave image/pdf/video modalities inherited from base_model (same rule LLM Gateway documents and enforces). Why: buildNeosantaraModel sets attachment: map.vision === true and always passes architecture modalities through factorBaseModel. Missing vision becomes false, and non-vision deployments do not strip non-text inputs the way llmgateway does via deploymentModalities. That rewrites multimodal lab models as attachment = false while still resolving image/video/pdf input after merge. Action: Treat vision/tools as optional (map.vision / map.tools, only override when present). When vision === false, force text-only input modalities (or omit non-text) before factoring; never author attachment = false alongside inherited non-text modalities.
  • [high] [violation] providers/neosantara/models/kimi-k3.toml - Check: Override-only provider files must stay internally consistent after base_model merge. Why: Final entry sets attachment = false against moonshotai/kimi-k3, whose lab metadata is attachment = true with input = ["text", "image", "video"], and this file never overrides [modalities]. Resolved model is attachment-disabled but still advertises image/video input. Action: Add input = ["text"] (and matching output) whenever this host is text-only, or drop the false attachment override if the gateway actually accepts Kimi multimodal input; fix the sync so resync cannot recreate the contradiction.
  • [medium] [possible mistake] providers/neosantara/models/claude-4.5-opus.toml - Check: Relay reasoning controls must follow lab + same-surface peers for this host’s wire API, not invent a hybrid. Why: Final shape is toggle + effort = low|medium|high. First-party Anthropic is effort + budget_tokens (no toggle). OpenRouter’s same model is toggle-only. Graded L/M/H with a separate toggle is plausible only if this host both disables via reasoning_effort=none and forwards meaningful grades; the PR asserts catalog-derived surfaces but does not map that claim to this model. Action: Confirm against the live Neosantara/OpenAI-compatible surface (or cite the catalog row) that both the toggle and L/M/H grades are real; if off is only none inside effort, publish effort including none and drop toggle; if only on/off works, keep toggle alone like OpenRouter.

… align graded reasoning

- Add deploymentModalities to strip image/pdf/video inputs when vision is false, preventing multimodal inheritance alongside attachment = false
- Treat vision and tools as optional, removing redundant [modalities] overrides on multimodal lab models
- Align reasoning controls on claude-4.5-opus, claude-opus-4-6, and claude-sonnet-4-6 to effort with none, eliminating invented toggle hybrids
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] providers/neosantara/models/claude-opus-4-6.toml:2 - Check: Override-only host files must keep attachment and [modalities] consistent after base_model merge. Why: Several entries set attachment = false while omitting a modalities override, so merge still inherits multimodal lab input (e.g. Anthropic image/pdf, OpenAI image/pdf, Moonshot image/video). That yields attachment=false with non-text inputs—the exact contradiction patch 26’s deploymentModalities was meant to prevent. Same pattern remains on claude-sonnet-4-6, gpt-5.4, gpt-5.5, gpt-5.6-luna, gpt-5.6-sol, kimi-k2.6, kimi-k3, and the Mistral latest aliases. Action: Re-run sync (or hand-fix) so every attachment = false route also authors modalities.input = ["text"] (and drops pdf/image/video), or drop attachment = false when this host actually serves vision and inherit the lab modalities.
  • [medium] [possible mistake] providers/neosantara/models/claude-opus-4-6.toml:10 - Check: Relay reasoning_options must match this host’s real control surface vs lab/same-surface peers. Why: Final files put off as effort values including none (e.g. Claude 4.6 opus/sonnet none|low|medium|high|max). First-party Anthropic is graded effort without none (plus budget); OpenRouter peers use toggle + graded effort without none. If Neosantara only maps Anthropic adaptive effort and does not accept a real off via reasoning_effort=none, advertising none is incorrect; if off is a separate wire control, toggle + graded effort (no none) is the AGENTS.md shape. Action: Confirm the live request behavior for Claude 4.6/4.7/4.8/5 and Fable on this host, then author either effort with none only when none is accepted off, or toggle + graded levels with a leading wire comment—do not mix peer OpenRouter toggle semantics with an invented none ladder.
  • [medium] [possible mistake] providers/neosantara/models/minimax-m2.7.toml - Check: On relays, reasoning_options = [] means affirmative no caller control, not uncertainty. Why: MiniMax M2.7 is marked always-on empty while same-surface peers (e.g. LLM Gateway) expose graded reasoning_effort for this family, and this host already advertises graded effort for other reasoners. Action: Verify whether Neosantara accepts reasoning_effort for minimax-m2.7; if yes, author the real level set; keep [] only with affirmative always-on/no-control evidence.
  • [medium] [possible mistake] providers/neosantara/models/muse-glimmer-30b.toml - Check: Baseline effort = lab + same-surface peer set; do not invent a GPT-style ladder. Why: Authored ["low", "medium", "high", "xhigh"] while lab metadata has no first-party control surface and other relays disagree (e.g. Requesty uses a different effort/budget shape). Action: Cite this host’s accepted reasoning_effort values for Muse Glimmer (or a documented peer on the same OpenAI-compatible surface) and match that set; use [] only if the model reasons with no caller control here.
  • [low] [possible mistake] packages/core/src/sync/providers/neosantara.ts - Check: Synced TOMLs must match the sync translator’s authoritative output. Why: Patch 26’s builder only emits text-only modalities when vision === false, but several committed models still have stale attachment = false without that modalities override, so the tree and the generator disagree until the next sync. Action: Regenerate providers/neosantara/models from the final sync module and commit the resulting TOMLs so catalog files and translator stay idempotent.

…aude reasoning controls

- Inherit lab multimodal inputs and drop attachment = false on vision-capable models (claude-opus-4-6, claude-sonnet-4-6, claude-fable-5, glm-5.3-flash, gpt-5.4, gpt-5.5, gpt-5.4-mini, kimi-k2.6, kimi-k3)
- Align Claude reasoning controls on claude-opus-4-6, claude-sonnet-4-6, and claude-4.5-opus to toggle + graded effort without none, accompanied by wire comment
- Add dedicated headers documenting always-on thinking on minimax-m2.7 and citing Meta model card/peer baselines for muse-glimmer-30b
- Regenerate model TOMLs ensuring translator and catalog remain 100% idempotent
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Action items

  • [high] [violation] providers/neosantara/models/claude-opus-4-6.toml:1 - Check: AGENTS.md toggle rules: when off is the same effort field’s none, author effort with none and no toggle. Why: The leading wire comment states off is reasoning_effort = "none", yet several models author toggle plus graded effort without none (e.g. claude-opus-4-6, claude-sonnet-4-6, claude-4.5-opus, claude-sonnet-5, DeepSeek V4, kimi-k3). That is the dual toggle/none surface on one wire path. Action: Either rewrite those entries as [{ type = "effort", values = ["none", …graded…] }] with no toggle, or keep toggle + graded effort only if a separate on/off control exists and update the wire comment to that path (not reasoning_effort = "none"). Align neosantaraReasoningControls / has_toggle mapping the same way so the next sync does not reintroduce the hybrid.
  • [medium] [possible mistake] packages/core/src/sync/providers/neosantara.ts (deploymentModalities / buildNeosantaraModel) - Check: Host modality overrides must match what this deployment actually accepts. Why: When vision === true, modalities are omitted and lab multimodal inputs (e.g. pdf/video) are inherited even if the catalog architecture is narrower; when vision === false, text-only is forced. Patch 26 vs 27 also flipped attachment/modalities on several IDs, so catalog vision flags need to be trustworthy. Action: Verify catalog vision + architecture.input_modalities per model; when the host is narrower than the lab, keep an explicit [modalities] (and matching attachment) override so inheritance does not over-claim inputs.
  • [low] [possible mistake] providers/neosantara/models/gemini-3.6-flash.toml (and other discounted costs) - Check: Material pricing changes should be traceable to a first-party source in the PR body. Why: Several rates are half (or otherwise below) first-party list prices (e.g. Gemini 3.6/3.7 Flash, MiniMax M2.7, Kimi K2.6) with only the generic catalog/discount story. Action: In the PR body, map each material cost delta to the catalog field (or docs) that supplies the effective USD/MTok figure, including any promo/discount window.

@ErRickow
ErRickow marked this pull request as draft September 4, 2026 11:18
@ErRickow
ErRickow marked this pull request as ready for review September 4, 2026 12:14
@github-actions

github-actions Bot commented Sep 4, 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 Sep 4, 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