✨ Minor Changes
-
ef46fa0: Per-assignment request body defaults: each tier and specificity slot now carries an optional
param_defaultsJSONB column that the proxy merges into the outbound provider request before forwarding. Initial knob is DeepSeek's thinking-mode toggle ({ thinking: { type: 'enabled' | 'disabled' } }) — fixes empty-content responses on DeepSeek V4 Flash/Pro that consume themax_tokensbudget on reasoning. Precedence is presence-based: client-supplied fields in the request body always win, so explicit per-call overrides keep working.Configure from the routing UI via a new "Parameters" button on each model chip; persisted via
PATCH /api/v1/routing/:agent/tiers/:tier/paramsand…/specificity/:category/params. -
085431c: Per-message model parameter telemetry. Each
agent_messagesrow now carries arequest_paramsJSONB snapshot of the effective request body parameters that hit the provider (today: DeepSeek'sthinkingtoggle; future provider knobs and user-defined custom-provider params land here without a schema change). The dashboard's expanded message detail shows a new "Model Parameters" accordion next to Request Headers, with an info tooltip explaining the field. Existing rows stay NULL — back-compat is preserved. -
d3b551f: Per-provider model refresh: a small refresh button next to each provider in the Connect Providers detail view and next to each section header in the model picker. Toasts now report the actual count or upstream error instead of a blanket "Models refreshed" lie. Empty discovery results no longer wipe a non-empty cache, so a transient API hiccup can't silently empty the model list. The model picker subtitle now shows "Default tier" instead of just "tier".
🐛 Patch Changes
-
ec7fc12: Restore the per-tier (and per-specificity) Model Parameters dialog that was inadvertently dropped during a stacked-PR merge. The sliders icon is back on every primary model chip in Routing for providers that consume known params (today: DeepSeek's
thinkingtoggle). The dialog persists per-assignment, so a single configured value applies to the primary model AND every fallback the proxy tries — without per-route schema changes. Multi-key compatible: pinning a different key on the same route does not affect the stored params, and switching keys mid-flight keeps using whatever the proxy resolved for that iteration.Adds back:
PATCH /api/v1/routing/:agent/tiers/:tier/params,…/specificity/:category/params,TierService.setParamDefaults,SpecificityService.setParamDefaults, frontendsetTierParamDefaults/setSpecificityParamDefaults, andModelParamsDialog. -
c446856: fix(routing): attribute models by their connection's provider, not by model-id prefix
The routing UI used to derive a model's logo from the prefix of its model id,
which broke for any provider that redistributes other vendors' models. Most
visibly, a Groq connection servingqwen/qwen3-32brendered with the Qwen
logo and Qwen-on-OpenRouter pricing (≈$0.08/$0.24 per 1M) instead of Groq's
own pricing ($0.29/$0.59).Two changes:
- Frontend (
RoutingTierCard.providerIdForModel): when a model row has a
storedproviderthat resolves to a registered first-party provider, that
wins over prefix inference. OpenRouter remains the documented exception
because its rows really do represent vendor-prefixed models served on behalf
of those vendors. - Backend (
ModelDiscoveryService.enrichModel):known-model-prices.ts
is now consulted before models.dev and the OpenRouter cache, so curated
per-provider prices win over upstream catalogs that may attribute the same
model id to a different (cheaper) inference provider. Behaviour change for
the existing entries (moonshot-v1, gemma-3-1b-it, gemini-pro-latest): they
become authoritative instead of last-resort, which matches their intent.
Builds on #1772, which introduced
route.provideras the routing identity. - Frontend (