Conversation
Opper is an EU-hosted AI gateway: one OpenAI-compatible endpoint and one key in front of 30+ model providers. The entry mirrors OpenRouter and ZenMux: provider facts and the model catalog come from the models.dev snapshot (`opper`), the openai-compatible runtime adapter talks to https://api.opper.ai/v3/compat, and live discovery reads /models with the user's key. The models.dev snapshot gains only the Opper projection; a full refresh currently aborts on an upstream fireworks-ai override without an npm package, so every other provider's entries are left exactly as committed. Also: catalog display copy (en, zh-CN, zh-TW), the Opper brand mark as a masked monochrome asset, the renderer asset ledger, a catalog contract test and a snapshot pricing test. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Felixkw12
force-pushed
the
add-opper-provider
branch
from
September 17, 2026 13:45
1e19979 to
144516e
Compare
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.
feat(providers): add Opper as an aggregator provider
Summary
Adds Opper to the provider catalog as an aggregator: the EU-hosted AI gateway with 700+ models from 30+ providers behind one OpenAI-compatible API and one key (
OPPER_API_KEY). Users who need EU hosting or a single key across OpenAI, Anthropic, Google, Mistral, DeepSeek, Moonshot and open-weight models can pick it from the catalog instead of configuring a custom endpoint.The entry follows the OpenRouter / ZenMux shape exactly:
packages/core/src/models-dev-projection.tsmapsopperto the models.dev provideropper, so provider facts, model metadata and pricing come from the normal snapshot pipeline.packages/core/src/provider-registry.tsadds the facts guard, the tool-calling fallback list (recommended:anthropic/claude-sonnet-4-6,openai/gpt-5.5,gemini/gemini-3.5-flash,moonshot/kimi-k3) and the registry row:openai-compatibleruntime adapter onhttps://api.opper.ai/v3/compat,api_keyauth, liveprotocoldiscovery (/modelswith the user's key; 401 without one),overseas/aggregators,catalogOrder40.5 right after OpenRouter, signup at https://platform.opper.ai.apps/desktop/src/renderer/settings/provider-display-copy.ts: en / zh-CN / zh-TW copy with theAggregatorbadge.apps/desktop/src/renderer/settings/provider-brand-marks.tsx+assets/provider-brands/opper.svg: the Opper mark as a masked monochrome asset (same path as ZenMux), with a provenance comment;renderer-architecture.jsonledger updated via--write.opper:anthropic/claude-sonnet-4-6).Model ids are the ones models.dev lists for Opper today (
vendor/model, which pins one upstream route). models.dev is moving Opper to bare pool ids (anomalyco/models.dev#6542:claude-sonnet-4-6, Opper picks the route per request); when that lands, the regular snapshot refresh carries it over with no change here.Refs: none. New catalog entry, no open issue.
Verification
Run on 2026-09-17 against
main@f9d3efd(rebased after #5437 changed the metadata projection; Node 25.8, npm 11.11):node scripts/sync-model-metadata.mjs --check— generated modules match the committed snapshotnpm --workspace @maka/core run buildandnpm --workspace @maka/runtime run build— cleannode --test --test-concurrency=4 packages/core/dist/__tests__/provider-catalog-contract.test.js packages/core/dist/__tests__/model-metadata.test.js— 37 passednpm --workspace @maka/core run test:dist— 853 passednode --test --test-concurrency=4 packages/runtime/dist/__tests__/cost.test.js— 10 passednode --test --test-concurrency=4 packages/runtime/dist/__tests__/model-factory-thinking.test.js packages/runtime/dist/__tests__/provider-contract-matrix.test.js— 177 passednpm run lint,npm run format:check,npx knip --workspace apps/desktop,npx knip --workspace packages/ui,git diff --check— cleanNot clean on this machine, identically on pristine
main@f9d3efdwith the samenpm install(Node 25.8 / npm 11.11 rather than the pinned npm 11.19):npm run buildandnpm run typecheckstop in@maka/uiatsrc/primitives/module-page.tsx(149,5)(TS2769), andnpm --workspace @maka/desktop run test:distreports 54 failures out of 2408. None of those files are touched here; before the rebase (base of 2026-09-16) the full build, typecheck and desktop suite were green with this change applied (desktop 2719 passed). I am relying on CI for those three at the current base.Not run: a live chat completion through the desktop app with an Opper key (no key on the machine used for this branch); the catalog row, brand mark and copy are covered by the build and contract tests only.
Review focus
Snapshot.
scripts/model-metadata/models-dev-api.snapshot.jsongains only the Opper section (40 models, 27 priced) plus the newprojectionSha256; every other provider's entries are byte-for-byte as committed. A plain--refreshcurrently aborts before writing anything: upstream models.dev now shipsfireworks-ai/accounts/fireworks/models/minimax-m2p7with aprovideroverride that has nonpmfield, whichtoModelProviderOverriderejects ("fails loud and whole" by design). The Opper section was therefore projected with the repository's owntoMetadata/toPricingfrom the models.dev response retrieved 2026-09-17 13:45 UTC (ETagW/"735eea088a5e0c3a08b2b505eb43a532", SHA-256735eea088a5e0c3a08b2b505eb43a53259307659fc77d384c64872797d98be0b) and spliced in at the position a refresh would place it. Once upstream or the projector handles that override, a normal refresh reproduces the same Opper entries. Happy to rebase onto a full refresh instead if you prefer to land that first.AI use
Select exactly one:
Tool(s) and scope: Claude (Anthropic) drafted the registry entry, display copy, tests, snapshot splice and this description, mirroring the existing OpenRouter / ZenMux / Moonshot Global entries; a human at Opper reviewed every line, ran the checks above, and owns the submission.
Checklist
mainwith this install)Does this PR entail a change in behavior?
Notes
Opper is already listed on models.dev (
opper). Token rates are the model providers' rates with no markup. Opper charges a 3% fee when you buy credits. I work at Opper; happy to adjust anything to match project conventions.