Skip to content

feat(providers): add Opper as an OpenAI-compatible gateway - #869

Merged
LivXue merged 3 commits into
EverMind-AI:mainfrom
Felixkw12:feat/opper-provider
Oct 23, 2026
Merged

LivXue merged 3 commits into
EverMind-AI:mainfrom
Felixkw12:feat/opper-provider

Conversation

@Felixkw12

@Felixkw12 Felixkw12 commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Adds Opper as a gateway provider. Opper is an EU-hosted AI gateway that serves models from many providers behind one OpenAI-compatible API.

The entry sits at the end of the resale gateway block in raven/providers/registry.py and copies that block's shape: reached through OpenAI's driver at https://api.opper.ai/v3/compat, told apart by that address, OPENAI_API_KEY as the driver's variable, no default model and no shortlist. The gateway's own /v3/compat/models fills the picker once a key is entered. A bare model id reaches the pool of providers that serve that model and a provider/model id pins one provider (https://docs.opper.ai/control-plane/rules/routing.md), so strip_model_prefix stays off.

Also included: a ProvidersConfig section, a row in the onboarding wizard's key group, and a brand mark for the web UI. Neither bundled icon set carries an Opper mark, so the SVG comes from us, with a LICENSES/README.md entry beside AMD's. The registry totals written elsewhere (ui-web/CONTEXT.md, two comments on the settings provider page, a docstring in raven/providers/registry.py) now count fifty-six specs, twenty-two of them gateways.

Keys: https://platform.opper.ai
Docs: https://docs.opper.ai

Disclosure: Opper is my startup.

Type

  • Fix
  • Feature
  • Docs
  • CI / tooling
  • Refactor
  • Other

Verification

Run by a maintainer on this branch, rebased onto current main:

  • make check-commits, make check-large-files, make check-source-language: pass
  • PR_TITLE="feat(providers): add Opper as an OpenAI-compatible gateway (#869)" make check-pr-title: pass
  • make lint-python, make lint-imports, make lint-deps, make lint-types: pass
  • uv run --frozen --python 3.12 --all-extras pytest -q -n 2 (macOS, a loaded machine): 34294 passed, 182 skipped, 2 xfailed, 4 failed, 1 error. Three of the failures also fail on main without this change on the same machine (a case-insensitive APFS volume, a local LibreOffice install, a process-stop timing test). The fourth, in tests/test_node_stderr_replay.py, timed out under load, and the error is its teardown finding the agent it left; run alone it passes three times out of three here and passes on main. None is in provider code.
  • npm run gen:check, npm run lint, npm run type-check in ui-web: pass
  • npm test --prefix ui-web: 253 files, 4215 tests passed
  • npm run --prefix ui-web build, then ui-web/build.py: the page builds and both boot snapshots match their goldens
  • The mark rendered in headless Chromium at 20px and 40px, in the light theme and inverted for the dark theme: legible in both

Not run: a live call through Raven against the gateway; no Opper key was at hand.

  • Relevant tests pass locally
  • Relevant lint / type checks pass locally
  • User-facing docs or screenshots are updated when needed (no user-facing doc lists providers one by one)

Risk

  • Security impact considered
  • Backward compatibility considered
  • Rollback path is clear for risky changes

Additive: one new provider section, nothing existing changes. Rollback is reverting the commit.

Related Issues

N/A

@LivXue
LivXue self-requested a review October 20, 2026 11:28
@LivXue

LivXue commented Oct 20, 2026

Copy link
Copy Markdown
Member

We are closing this for now and will revisit Opper integration once LiteLLM has official native Opper support. Opper can currently be used through Raven's custom OpenAI-compatible provider configuration.

@gloryfromca gloryfromca left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No blockers; this can merge as far as I am concerned.

Technical review is clean. I checked the AGENTS.md and context vocabulary rules, the full diff, provider resolution/auth/protocol/catalog callers, the branch history and backward compatibility, test changes, and the provider architecture. Opper's current official documentation confirms https://api.opper.ai/v3/compat and provider-prefixed model IDs; the locked LiteLLM 1.85.0 has no native Opper route, so the borrowed OpenAI driver is internally consistent.

Verification:

  • uv run --all-extras pytest tests/test_litellm_provider_model_names.py tests/test_provider_catalog.py tests/test_rpc_model.py tests/test_provider_wire_model.py tests/test_provider_resolution_invariants.py tests/test_cli_onboard_commands.py -q: 1686 passed, 104 skipped. An initial run without --all-extras produced 1443 setup errors because raven_everos was absent; the repository-correct rerun passed.
  • npm test --prefix ui-web -- ProviderMark.test.tsx: 15 passed.
  • npm run type-check --prefix ui-web: passed.
  • Source-language and large-file scripts against github/main..HEAD: passed. (make is unavailable in this environment, so I ran the Makefile's underlying commands directly.)
  • git diff --check github/main...HEAD: passed.

The maintainer's stated decision to close and defer this integration until LiteLLM has native support remains controlling as a scope decision; this review does not contest it.

@0xKT

0xKT commented Oct 22, 2026

Copy link
Copy Markdown
Member

Not a blocker (review of 5dd2740b, main 43159933): the new row routes as its neighbours do. Across the stock catalogues' model ids and a set of configs (OpenAI key only, an OpenAI base, a custom base with opper.ai in its path, an Opper section with and without a key), nothing that went elsewhere before now reaches api.opper.ai, and with the network blocked no OpenAI key was sent there. One small thing: the counts that describe the registry are now one short. ui-web/CONTEXT.md:332 still says the gateways are "Twenty-one of the fifty-five" (the registry now has 56 specs, 22 of them gateways), and "fifty-five" is still written in ui-web/src/features/settings/providers/ProviderSide.tsx:8, Roles.tsx:317 and raven/providers/registry.py:1533.

Severity of this one finding, not a verdict on the pull request. Any blocking findings from this pass are review threads on the changed files; GitHub renders those collapsed, as a file name with no text.

@LivXue
LivXue requested a review from 0xKT October 23, 2026 02:59
Felixkw12 and others added 3 commits October 23, 2026 11:14
Register Opper in the resale gateway block of the provider registry. It
is reached through OpenAI's driver at https://api.opper.ai/v3/compat and
told apart by that address, the same shape as the other gateways in the
block. It gets a ProvidersConfig section, a row in the onboarding
wizard's key group and a brand mark in the web UI.

Like the rest of the block it states no default model and ships no
shortlist; the gateway's own /v3/compat/models answers once a key is
entered. A provider/model id pins one route on Opper, so
strip_model_prefix stays off and that segment is sent as written.

Tests: the registry pin moves to 56, and Opper joins the resolution
tables, the no-shortlist vendor list and the branded marks. The wire
baseline gains an opper section; no existing entry moves.

Not run locally: make ci. Checked with an ast parse of every changed
Python file and a JSON parse of the wire baseline.

Disclosure: Opper is my startup.

Co-authored-by: Claude (claude-opus-5-5) <noreply@anthropic.com>
The resale gateway fields carry no trailing comment; the section comment
above them already says what they are. A trailing comment stays only
where it explains a name, as it does for baidu_cloud and ovms.

Co-authored-by: Claude (claude-opus-5-5) <noreply@anthropic.com>
The registry now holds fifty-six specs, twenty-two of them gateways.
Four places still said fifty-five and twenty-one: the gateway entry in
ui-web/CONTEXT.md, two comments on the settings provider page, and the
_tables docstring in raven/providers/registry.py.

Co-authored-by: Claude (claude-opus-5-5) <noreply@anthropic.com>
@LivXue
LivXue force-pushed the feat/opper-provider branch from 5dd2740 to 44bfba6 Compare October 23, 2026 03:16

@gloryfromca gloryfromca left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No blockers; this can merge as far as I am concerned.

The rebased revision preserves the previously reviewed implementation, removes the redundant schema comment, and correctly updates the four live totals to 56 providers and 22 gateways. I checked the new delta, the resulting full PR diff, current context terminology, commit history, callers, compatibility, tests, and provider architecture; I found no new defect or weakened test. The older 55-provider references still present under dated design/acceptance specs are historical snapshots rather than live totals.

Verification:

  • uv run --extra dev pytest tests/test_provider_catalog.py tests/test_litellm_provider_model_names.py tests/test_provider_wire_model.py -q: 712 passed, 7 skipped.
  • npm test --prefix ui-web -- ProviderMark.test.tsx: 15 passed.
  • npm run type-check --prefix ui-web: passed.
  • Source-language check and git diff --check github/main...HEAD: passed.
  • The repository's --all-extras setup could not build datrie because this environment lacks x86_64-linux-gnu-gcc; it stopped before test collection.

@LivXue

LivXue commented Oct 23, 2026

Copy link
Copy Markdown
Member

Reopening. We closed this to wait for native Opper support in LiteLLM, but that is not the bar the registry already applies: the thirteen resale gateways and the six CN vendors in raven/providers/registry.py all reach their endpoints through LiteLLM's OpenAI driver, because LiteLLM routes none of them. Opper qualifies on the same basis.

Since maintainer edits are allowed on this branch, we finished it here instead of sending it back:

  • Rebased your commit onto current main, unchanged and still authored by you. CI never actually ran on the old head (every run ended with zero jobs), so this push gives the first real CI run.
  • Dropped the trailing # Opper gateway comment in raven/config/schema.py: it restates the field name, and AGENTS.md section 1.1 keeps comments to what the code cannot say.
  • Updated the registry counts @0xKT pointed out: ui-web/CONTEXT.md now says twenty-two of the fifty-six, and ProviderSide.tsx, Roles.tsx and the _tables docstring in registry.py say fifty-six.
  • Updated the description, which becomes the squash commit message: the Verification section now lists what we ran, the model-id sentence links to your routing docs, and the summary no longer quotes model and provider counts.

One thing we could not do is a live call through Raven against the gateway, since we have no Opper key. If you can, please run one (fetch the model list, send one chat completion) and post the result here.

Heads-up: #1009 (Atlas Cloud) adds a gateway to the same registry block and changes the same counts, so whichever of the two lands second rebases and updates them: 57 providers, fifteen resale gateways, and the fifty-six and twenty-two written in the four places above.

@LivXue
LivXue merged commit b27b0ae into EverMind-AI:main Oct 23, 2026
26 checks passed
binyangzhu000-sudo added a commit to binyangzhu000-sudo/Raven that referenced this pull request Oct 27, 2026
…landed

Opper (EverMind-AI#869) joined the same block, so with Atlas Cloud the block holds
fifteen gateways and the registry 57 providers. Update the two comments
that count the block and the pinned provider count in the catalog test.

Co-authored-by: Claude (claude-sonnet-5-5) <noreply@anthropic.com>
Signed-off-by: binyangzhu000-sudo <224954946+binyangzhu000-sudo@users.noreply.github.com>
@0xKT 0xKT mentioned this pull request Oct 27, 2026
4 of 12 tasks
0xKT added a commit that referenced this pull request Oct 27, 2026
## Summary

Bump the package version from 0.2.5 to 0.2.6 for the next release. Only
pyproject.toml and uv.lock change.

Since v0.2.5, main merged 70 PRs: 15 features, 48 fixes, three test, two
docs,
one perf and one chore. The larger features are portable Agent Plugins
1.0
packages with their MCP servers (#1110), the compacting history strategy
with
source refs and checkpoints (#1031), sub-agent runs as their own
trajectory
spans and tabs (#1091, #1094, #1096, #1100), download mirror fallback
(#1053),
Keenable as a keyless web_search and web_fetch vendor (#1088), Opper as
an
OpenAI-compatible gateway (#869), and the MiniMax image and video roles
(#1013).
None carries a BREAKING CHANGE footer. The maintainer chose a patch
bump, the
way v0.2.1 through v0.2.5 were for their features.

A v0.2.6-rc1 tag goes first to dry-run the release pipeline, as v0.2.5
did. The
stable tag and release notes follow once this lands.

uv.lock is regenerated with uv 0.12.12, which leaves only the raven
version
line changed (uv 0.9.x rewrites unrelated dependency markers and uv
0.13.x
raises the lock revision).

## Type

- [ ] Fix
- [ ] Feature
- [ ] Docs
- [ ] CI / tooling
- [ ] Refactor
- [x] Other

## Verification

- `uvx --from uv==0.12.12 uv lock` on a clean worktree cut from
origin/main:
  Updated raven v0.2.5 -> v0.2.6
- `git diff --numstat origin/main..HEAD`: one line each in
pyproject.toml and
  uv.lock
- `uvx --from uv==0.13.3 uv lock --check`: exit 0, so the
  `uv export --locked` step in release.yml accepts the lock
- `PYTHONPATH=. python3 scripts/check_commit_messages.py
origin/main..HEAD`:
  exit 0
- `npx commitlint --from origin/main --to HEAD --config
commitlint.config.cjs`:
  exit 0
- No test run: the change is version metadata only.

- [ ] Relevant tests pass locally
- [x] Relevant lint / type checks pass locally
- [ ] User-facing docs or screenshots are updated when needed

## Risk

No code change. Rollback is reverting this commit before any v0.2.6 tag
is
pushed.

- [ ] Security impact considered
- [x] Backward compatibility considered
- [x] Rollback path is clear for risky changes

## Related Issues

N/A

Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
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.

4 participants