Skip to content

feat(providers): add EURouter as an OpenAI-compatible gateway - #13025

Merged
diegosouzapw merged 1 commit into
diegosouzapw:release/v3.8.51from
ntdatt812:feat/12985-eurouter
Sep 10, 2026
Merged

diegosouzapw merged 1 commit into
diegosouzapw:release/v3.8.51from
ntdatt812:feat/12985-eurouter

Conversation

@ntdatt812

Copy link
Copy Markdown
Contributor

Closes #12985.

Registry entry in the mnn-ai / meganova-ai shape — no executor, no translator, passthroughModels: true.

Re-checked live rather than taken from the report

$ curl -s https://api.eurouter.ai/v1/models | node -e '…'
models: 147
sample id: qwen3.6-27b
has canonical_slug: true

HTTP 200, no auth, 147 models, OpenRouter-shaped entries — matching the reporter's figures.

Streaming SSE conformance is not exercised. That is where these gateways usually diverge, and where a passthrough entry breaks silently. Nothing in this entry claims it: no tool or vision capability is declared, and models stays empty rather than snapshotting a catalog that changes.

hasFree is false with no freeNote. The reporter's key was accepted with HTTP 402 Insufficient balance, so authentication is confirmed and pricing tiers are not — a "Free" badge would be a guess.

The sovereignty caveat, recorded rather than implied away

The name invites a data-residency reading that EURouter's own catalog contradicts: anthropic/claude-sonnet-5 carries providers: [{ name: "AWS Bedrock" }], and the catalog holds 19 models owned by openai, 9 by anthropic, 7 by amazon.

An EU-based router is a routing layer in the EU. Where a model executes, and under whose terms, is a per-upstream property. The apiHint says exactly that, and there is a test asserting the copy carries the upstream caveat and contains none of residency, stays in the EU, EU-hosted, sovereign.

One difference from #12986, on purpose

EURouter is added to AGGREGATOR_PROVIDER_IDS; GreenPT is not. EURouter routes to third parties, GreenPT serves its own inference, and that set is what the UI uses to say so. Both PRs have a test pinning their side of that call, so neither can drift into the other.

Verification

tests/unit/eurouter-provider.test.ts — 7 passed.
tests/unit/free-tier-providers-wave2-integration.test.ts — unaffected.

Pre-commit gates clean: prettier, eslint, docs-sync, check:any-budget:t11, tracked-artifacts. Changelog fragment included.

diegosouzapw added a commit to ntdatt812/OmniRoute that referenced this pull request Sep 10, 2026
check:file-size freezes src/shared/constants/providers/apikey/gateways.ts at
1462 lines, so a new catalog entry fails the gate on arrival. This PR's entry
and diegosouzapw#13025's take it to 1502 together.

Annotated rather than split: the file is declarative provider data, already
divided into six family files under apikey/, and every previous gateway entry
took the same route (diegosouzapw#11786 seekai, diegosouzapw#10987 logfare, diegosouzapw#10668 tabitoken, diegosouzapw#10531
freebuff, diegosouzapw#11631 1min.ai). Splitting a catalog for two entries would break the
semantic-families rule instead of helping.

The bump covers both entries because they land in the same batch.
diegosouzapw pushed a commit that referenced this pull request Sep 10, 2026
Merged with a rebaseline commit added on top of your branch: check:file-size freezes the gateways catalog at 1462 lines, so any new entry fails the gate on arrival. The annotation covers this entry and EURouter's (#13025) together, following the route every previous gateway entry took (#11786 seekai, #10987 logfare, #10668 tabitoken, #10531 freebuff, #11631 1min.ai) — the file is declarative data already split into six family files, so splitting it for two entries would break the semantic-families rule.

Validated in a combined worktree with 13 sibling PRs: 132 focused tests pass, typecheck:core clean, file-size green after the rebaseline.

Thank you for stating plainly what you did not verify. "The endpoint exists and is key-gated; catalog, streaming and tool calls not exercised" is worth more than a confident entry that turns out to be guesswork, and the conservative entry that follows from it — empty models, no capability declared, hasFree false with the billing shape spelled out — is exactly right.
…ouzapw#12985)

Registry entry in the mnn-ai / meganova-ai shape: no executor, no
translator, `passthroughModels: true`.

Re-checked live rather than taken from the report:

  GET https://api.eurouter.ai/v1/models -> HTTP 200, 147 models,
  OpenRouter-shaped entries (canonical_slug present)

Streaming SSE conformance is NOT exercised -- the usual place these
gateways diverge, and where a passthrough entry breaks silently. Nothing
in the entry claims it: no tool or vision capability is declared, and
`models` is empty rather than snapshotted from a catalog that changes.

`hasFree` is false with no freeNote. The reporter's key was accepted with
HTTP 402 "Insufficient balance", so authentication is confirmed and
pricing tiers are not; a "Free" badge would be a guess.

The name invites a data-residency reading that EURouter's own catalog
contradicts: `anthropic/claude-sonnet-5` lists `providers: [AWS Bedrock]`,
and the catalog carries 19 models owned by openai, 9 by anthropic, 7 by
amazon. An EU-based router is a routing layer in the EU; where a model
executes is a per-upstream property. The apiHint says exactly that, and a
test asserts the copy carries the upstream caveat and none of the
residency phrasings.

Unlike GreenPT (diegosouzapw#12986), this one IS added to AGGREGATOR_PROVIDER_IDS: it
routes to third parties rather than serving its own inference.

7 tests pass in tests/unit/eurouter-provider.test.ts; the wave2 gateway
integration test is unaffected.
@diegosouzapw
diegosouzapw merged commit 22473de into diegosouzapw:release/v3.8.51 Sep 10, 2026
3 of 7 checks passed
diegosouzapw added a commit that referenced this pull request Sep 11, 2026
…ount 356 to 358

EURouter (#13025) and GreenPT (#13024) took the live provider modules to
358 unique IDs, so check:docs-all reported 7 STRICT drifts on the tip and
the Release-Green run 34532113514 flagged 'Docs sync + fabricated-docs
(strict)' as a HARD failure.

- docs/reference/PROVIDER_REFERENCE.md: regenerated with the official
  generator (npm run gen:provider-reference), not hand-edited.
- 4 diagrams + 2 tier-flow images: the embedded '356 providers' label.
- AGENTS.md, llm.txt (+ its 50 i18n mirrors) and package.json's
  description: the numeral only, so the mirrors keep matching root.

Only the count changes — no prose, no instruction text. Validation:
npm run check:docs-all goes from '7 STRICT drift(s)' to PASS (docs-sync,
mirrors for 50 locales, doc-links and fabricated-docs all green).

Refs #12732
diegosouzapw added a commit that referenced this pull request Sep 11, 2026
Four base-reds that appeared on the tip today, none owned by any open PR:

- providers-constants-split / provider-node-reserved-prefix: GreenPT (#13024)
  and EURouter (#13025) move the totals 238 -> 240 and 408 -> 410.
- provider-translate-path-golden: same two providers, regenerated with
  UPDATE_GOLDEN=1; the snapshot delta is purely additive.
- glm-sse-transform-arity: #12925 declared the buffer-size slot GLM had been
  filling since #12179. The invariant is unchanged — the value must land in a
  real parameter, never a dropped positional — so the guard now checks it from
  the helper side and requires the named constant at the call site instead of
  a magic literal.
- injection-guard-scan-bound-3932: #13104 split the 16 KB budget between head
  and tail, so 'outside the window' is now the middle of an oversized body,
  not its end. The 16 KB ceiling these cases protect is untouched.

Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
JJAbrams-eng added a commit to JJAbrams-eng/OmniRoute that referenced this pull request Sep 22, 2026
Path-space bug (checkout path contains a space, "Claude Code") hit three
more files the same way as the earlier webdav/zai fixes: new URL(...).pathname
double-decodes on macOS with spaces in the path. Switched to fileURLToPath().

Also bumps the hardcoded provider count (238->240) after GreenPT (diegosouzapw#13024)
and EURouter (diegosouzapw#13025) landed in the gateways family, and regenerates the
stale translate-path golden snapshot to match.
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
…ouzapw#13024)

Merged with a rebaseline commit added on top of your branch: check:file-size freezes the gateways catalog at 1462 lines, so any new entry fails the gate on arrival. The annotation covers this entry and EURouter's (diegosouzapw#13025) together, following the route every previous gateway entry took (diegosouzapw#11786 seekai, diegosouzapw#10987 logfare, diegosouzapw#10668 tabitoken, diegosouzapw#10531 freebuff, diegosouzapw#11631 1min.ai) — the file is declarative data already split into six family files, so splitting it for two entries would break the semantic-families rule.

Validated in a combined worktree with 13 sibling PRs: 132 focused tests pass, typecheck:core clean, file-size green after the rebaseline.

Thank you for stating plainly what you did not verify. "The endpoint exists and is key-gated; catalog, streaming and tool calls not exercised" is worth more than a confident entry that turns out to be guesswork, and the conservative entry that follows from it — empty models, no capability declared, hasFree false with the billing shape spelled out — is exactly right.
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
…ouzapw#12985) (diegosouzapw#13025)

Rebased onto the release tip after diegosouzapw#13024 landed: both PRs extend the same three registration files, so the sibling merge turned this into a conflict. The resolution is additive — both catalog entries kept, both registry imports kept, both base URLs kept — and EURouter stays in AGGREGATOR_PROVIDER_IDS while GreenPT stays out, exactly as each PR argued. 14 provider tests pass on the rebased branch and the file-size gate is green under the annotated rebaseline.

Thank you for re-checking the endpoint live instead of trusting the report, and for the sovereignty caveat. Naming the upstreams from EURouter's own catalog — Claude Sonnet served by AWS Bedrock, 19 models owned by openai — and then writing an apiHint that says routing rather than residency is the kind of care that keeps a provider entry honest. The test asserting the copy contains none of "residency", "stays in the EU", "EU-hosted" or "sovereign" is a good guard against that drifting later.
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.

feat(providers): add EURouter as an OpenAI-compatible gateway (147 models, passthrough)

2 participants