feat(providers): add EURouter as an OpenAI-compatible gateway - #13025
Merged
diegosouzapw merged 1 commit intoSep 10, 2026
Merged
Conversation
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
force-pushed
the
feat/12985-eurouter
branch
from
September 10, 2026 21:16
45784d6 to
2cce096
Compare
diegosouzapw
merged commit Sep 10, 2026
22473de
into
diegosouzapw:release/v3.8.51
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
This was referenced Sep 11, 2026
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>
7 tasks done
5 tasks done
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #12985.
Registry entry in the
mnn-ai/meganova-aishape — no executor, no translator,passthroughModels: true.Re-checked live rather than taken from the report
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
modelsstays empty rather than snapshotting a catalog that changes.hasFreeisfalsewith nofreeNote. The reporter's key was accepted with HTTP 402Insufficient 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-5carriesproviders: [{ name: "AWS Bedrock" }], and the catalog holds 19 models owned byopenai, 9 byanthropic, 7 byamazon.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
apiHintsays exactly that, and there is a test asserting the copy carries the upstream caveat and contains none ofresidency,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.