Skip to content

feat: add EUrouter provider and automated model sync#3218

Open
DavidLoDico wants to merge 4 commits into
anomalyco:devfrom
DavidLoDico:david/eur-415-eurouter-provider-sync
Open

feat: add EUrouter provider and automated model sync#3218
DavidLoDico wants to merge 4 commits into
anomalyco:devfrom
DavidLoDico:david/eur-415-eurouter-provider-sync

Conversation

@DavidLoDico

@DavidLoDico DavidLoDico commented Jul 12, 2026

Copy link
Copy Markdown

Summary

EUrouter is the european AI gateway.

  • add EUrouter as an OpenAI-compatible provider with the official theme-safe EU logo
  • add 122 verified EUrouter model TOMLs from the live catalog
  • add an automated sync adapter and register it in the provider matrix / aggregator group
  • cover price conversion, modalities, capabilities, reasoning controls, canonical factoring, preservation, and macOS case-sensitive canonical lookup regressions

Integration details

  • API base: https://api.eurouter.ai/api/v1
  • Catalog: GET /models is public; EUROUTER_API_KEY is optional. On 2026-07-12, public and authenticated requests both returned the same 122-model response, so scheduled sync does not require a new secret.
  • Pricing: EUrouter exposes per-token strings with an explicit currency. USD prices are multiplied by 1,000,000 for models.dev's USD per-1M-token cost fields, including input, output, reasoning, cache-read, and cache-write prices. Non-USD prices are omitted rather than mislabeled as USD.
  • Canonical mapping: canonical_slug is preferred, then the namespaced author/id route is used as a fallback. Known namespace differences (zhipuzhipuai, moonshotmoonshotai, and mistralmistral) are resolved through models.dev metadata. Existing base_model / base_model_omit factoring is preserved.
  • Capabilities: attachment/modalities come from architecture; tool calling, structured output, temperature, and fallback reasoning detection come from supported_parameters; exact reasoning effort/budget controls come from the catalog's reasoning object. Missing or all-false reasoning controls are treated as unknown and inherit canonical or authored truth.
  • Lifecycle safety: release dates come only from the catalog's explicit lifecycle fields or canonical metadata; the catalog insertion timestamp is never treated as a model release date. All 122 live routes now expose authoritative release dates and are included.
  • Preservation: authored descriptions, lifecycle dates, knowledge cutoffs, status, interleaving, input limits, pricing tiers, and reasoning options survive when the source is not authoritative.
  • Determinism: a clean sync created 122 TOMLs; the immediately following dry run reported 0 created, 0 updated, 0 removed, 122 unchanged.

Validation

  • bun test packages/core/test/sync.test.ts — 57 passed
  • bun --cwd packages/sdk test — 23 passed
  • bun models:sync eurouter
  • bun models:sync eurouter --dry-run — clean second run
  • bun validate
  • git diff --check

The root bun test command also runs a repository metadata audit that currently fails on dev for 30 pre-existing open-weight metadata entries without weights links; the same failure was reproduced in an untouched origin/dev worktree. The prescribed SDK test command above generates its ignored snapshot first and passes.

E2E model coverage

EUrouter's existing route E2E fixtures exercise openai/gpt-4o-mini for Chat Completions / Responses and mistral/mistral-embed for Embeddings. Adapter regression fixtures additionally cover claude-sonnet-5 and gpt-5.1. This data-only contribution did not issue paid inference requests.

Sources

@DavidLoDico DavidLoDico left a comment

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.

Adding EUrouter, the european AI gateway. Use any AI model, keep your data in the EU.

@DavidLoDico DavidLoDico marked this pull request as ready for review July 12, 2026 16:36
@github-actions

Copy link
Copy Markdown
Contributor

Action items

  • [medium] [possible mistake] providers/eurouter/models/qwen3-235b-a22b-thinking.toml:6, qwen3-30b-a3b-thinking.toml:6, qwen3-vl-235b-a22b-thinking.toml:6, deepseek-r1-distill-llama-70b.toml:7, green-r.toml:7, green-r-raw.toml:7 - Check: reasoning = false on models whose names or descriptions explicitly indicate reasoning/thinking capability. Why: These inline models have reasoning = false despite names containing "thinking" (e.g. "Qwen3 235B A22B Thinking") or descriptions mentioning "chain-of-thought reasoning with `` tokens" (deepseek-r1-distill-llama-70b) or "Reasoning model" (green-r, green-r-raw). The sync sets reasoning = false as a fallback when the EUrouter API omits the `reasoning` object and no matching `models/` metadata entry exists for `base_model` inheritance. In contrast, `qwen3-next-80b-a3b-thinking.toml` correctly inherits `reasoning = true` via `base_model = "alibaba/qwen3-next-80b-a3b-thinking"` with `reasoning_options = []`, proving that "thinking" variants on EUrouter can and should be reasoning models. Users filtering for reasoning models on models.dev would miss these models. Action: Verify whether the EUrouter API actually omits reasoning metadata for these specific models. If reasoning is exposed but unreported, manually set `reasoning = true` and `reasoning_options = []` in each affected TOML — the sync preserves existing `reasoning` and `reasoning_options` values on subsequent runs via the `existing?.reasoning` and `existing?.reasoning_options` fallbacks in `buildEUrouterModel`.

@DavidLoDico

Copy link
Copy Markdown
Author

I'll review the action items. Update coming soon.

@DavidLoDico DavidLoDico marked this pull request as draft July 12, 2026 16:49
@DavidLoDico DavidLoDico force-pushed the david/eur-415-eurouter-provider-sync branch from 8dc6e4a to e34e5c7 Compare July 12, 2026 17:01
@DavidLoDico DavidLoDico force-pushed the david/eur-415-eurouter-provider-sync branch from e34e5c7 to eaab167 Compare July 12, 2026 18:52
@DavidLoDico DavidLoDico marked this pull request as ready for review July 12, 2026 18:54
@github-actions

Copy link
Copy Markdown
Contributor

No actionable findings.

@DavidLoDico

Copy link
Copy Markdown
Author

@rekram1-node hey, wondering if you need any more info to merge this PR?

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.

1 participant