From d8b950e0e8eb6af96650a11aab6e981a443a3295 Mon Sep 17 00:00:00 2001 From: Felix Wunderlich Date: Wed, 28 Oct 2026 15:29:42 +0100 Subject: [PATCH] feat(providers): add Opper Adds Opper as a built-in provider card in the extended catalog, in the same shape as the Requesty card. Opper is an EU-hosted, OpenAI-compatible AI gateway: 700+ models from 50+ providers behind one API key. - Card id: opper, category router, disabled by default. - Base URL: https://api.opper.ai/v3/compat. Default model gpt-5.4-mini (400000 tokens), vision on. - Chrome and Firefox catalogs, icons and SOURCES rows stay identical. - test/run.js: id list, counts (82 extra cards, 117/116 defaults) and a defaults check. - docs/providers-and-models.md and README.md: ids, counts and a short setup section. Disclosure: Opper is my startup. Co-Authored-By: Claude Opus 5.5 (1M context) --- README.md | 2 +- docs/providers-and-models.md | 21 ++++++++++-- src/chrome/icons/providers/SOURCES.md | 1 + src/chrome/icons/providers/opper.svg | 1 + src/chrome/src/providers/provider-catalog.js | 1 + src/firefox/icons/providers/SOURCES.md | 1 + src/firefox/icons/providers/opper.svg | 1 + src/firefox/src/providers/provider-catalog.js | 1 + test/run.js | 32 ++++++++++++++++--- 9 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 src/chrome/icons/providers/opper.svg create mode 100644 src/firefox/icons/providers/opper.svg diff --git a/README.md b/README.md index 5be502d69..38d7ee576 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,7 @@ preview `ollama launch webbrain --model ` handoff. Details: **Cloud APIs** — OpenAI, Anthropic Claude, Google Gemini, Azure OpenAI, AWS Bedrock, Mistral, DeepSeek, xAI Grok, MiniMax, Kimi, Qwen, z.ai GLM, Groq, Together, Cloudflare, Nvidia NIM, Hugging Face, Fireworks, OpenRouter, and more. -The Providers page ships **115 built-in provider cards on Chromium** (114 on Firefox), +The Providers page ships **116 built-in provider cards on Chromium** (115 on Firefox), including an endpoint-free local WebGPU option with the tested LFM2.5 2.6B preset and an experimental custom Hugging Face ONNX repository option — see the [full catalog](docs/providers-and-models.md#extended-provider-catalog). diff --git a/docs/providers-and-models.md b/docs/providers-and-models.md index b3c7e4cdb..681b761dd 100644 --- a/docs/providers-and-models.md +++ b/docs/providers-and-models.md @@ -506,18 +506,18 @@ times the standard rate. ### Extended provider catalog -WebBrain also ships 81 disabled-by-default provider cards. Most are sourced +WebBrain also ships 82 disabled-by-default provider cards. Most are sourced from the OpenCode provider catalog snapshot at commit `62e4641235d7847dadc60da37cca8a023dd54fc1`; provider-specific additions use their official API documentation. Together with the original cards, the -Providers page lists **115 built-in providers on Chromium** and **114 on Firefox**; the +Providers page lists **116 built-in providers on Chromium** and **115 on Firefox**; the difference is the Chromium-only in-browser WebGPU runtime. | IDs | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `302ai`, `abacus`, `aihubmix`, `alibaba-coding-plan`, `alibaba-coding-plan-cn`, `azure-cognitive-services`, `bailing`, `baseten`, `berget`, `cerebras`, `cheaperinference`, `chutes`, `clarifai`, `cloudferro-sherlock`, `cohere`, `cortecs`, `deepinfra`, `digitalocean`, `dinference`, `drun`, `evroc`, `fastrouter`, `friendli` | | `freebuff2api`, `google-vertex`, `google-vertex-anthropic`, `helicone`, `iflowcn`, `inception`, `inference`, `io-net`, `jiekou`, `kilo`, `kimi-for-coding`, `kuae-cloud-coding-plan`, `llama`, `lucidquery`, `meganova`, `minimax-cn-coding-plan`, `minimax-coding-plan`, `moark`, `modelscope`, `morph` | -| `nano-gpt`, `nearai`, `nebius`, `nova`, `novita-ai`, `ollama-cloud`, `opencode`, `opencode-go`, `orcarouter`, `ovhcloud`, `perplexity`, `perplexity-agent`, `poe`, `pollinations`, `privatemode-ai`, `qihang-ai`, `qiniu-ai`, `requesty`, `scaleway`, `siliconflow`, `siliconflow-cn`, `stackit` | +| `nano-gpt`, `nearai`, `nebius`, `nova`, `novita-ai`, `ollama-cloud`, `opencode`, `opencode-go`, `opper`, `orcarouter`, `ovhcloud`, `perplexity`, `perplexity-agent`, `poe`, `pollinations`, `privatemode-ai`, `qihang-ai`, `qiniu-ai`, `requesty`, `scaleway`, `siliconflow`, `siliconflow-cn`, `stackit` | | `stepfun`, `submodel`, `synthetic`, `tencent-coding-plan`, `upstage`, `v0`, `venice`, `vercel`, `vivgrid`, `vultr`, `wandb`, `xiaomi`, `zai-coding-plan`, `zenmux`, `zhipuai`, `zhipuai-coding-plan` | Most use the OpenAI-compatible Chat Completions contract and bearer API keys. @@ -584,6 +584,21 @@ into the card, keep the default `gpt-5.4-mini` model (400000 tokens), then click **Test Connection**. Interactive Ask streaming, tool calls, and vision work through the existing OpenAI-compatible path. +#### Opper + +[Opper](https://opper.ai) is an EU-hosted, OpenAI-compatible AI gateway at +`https://api.opper.ai/v3/compat`. One API key gives access to 700+ models from +50+ providers; model IDs are bare pool names (such as `gpt-5.4-mini`, +`claude-sonnet-4-6`, `gemini-3.8-flash`, and `deepseek-v4-flash`), and a +`provider/model` ID such as `anthropic/claude-sonnet-4-6` pins one route. See +the [docs](https://docs.opper.ai). + +In WebBrain, open **Providers -> LLM -> Opper**. Create an API key at +[platform.opper.ai](https://platform.opper.ai), paste it into the card, keep +the default `gpt-5.4-mini` model (400000 tokens), then click **Test +Connection**. Interactive Ask streaming, tool calls, and vision work through +the existing OpenAI-compatible path. + ### Ask response streaming Providers with `supportsAskStreaming` stream visible text during interactive diff --git a/src/chrome/icons/providers/SOURCES.md b/src/chrome/icons/providers/SOURCES.md index f5dec3e0e..abf9b2d5b 100644 --- a/src/chrome/icons/providers/SOURCES.md +++ b/src/chrome/icons/providers/SOURCES.md @@ -20,6 +20,7 @@ Most brand marks come from [Lobe Icons](https://github.com/lobehub/lobe-icons) | orcarouter | OrcaRouter official docs favicon (`Continuum-AI-Corp/docs`, MIT) | | nearai | WebBrain-authored simple N mark (not an official NEAR brand asset) | | cheaperinference | Cheaper Inference logo mark (cheaperinference.com) | +| opper | Opper official logo mark (opper.ai) | Brand trademarks remain property of their owners; used only for provider identification in the settings UI. diff --git a/src/chrome/icons/providers/opper.svg b/src/chrome/icons/providers/opper.svg new file mode 100644 index 000000000..ba0a224cb --- /dev/null +++ b/src/chrome/icons/providers/opper.svg @@ -0,0 +1 @@ +Opper diff --git a/src/chrome/src/providers/provider-catalog.js b/src/chrome/src/providers/provider-catalog.js index df8e45fc8..503f294d3 100644 --- a/src/chrome/src/providers/provider-catalog.js +++ b/src/chrome/src/providers/provider-catalog.js @@ -111,6 +111,7 @@ const PROVIDERS = [ provider('ollama-cloud', 'Ollama Cloud', 'https://ollama.com/v1', 'deepseek-v4-flash', 1048576, { category: 'cloud', apiKeyUrl: 'https://docs.ollama.com/cloud' }), provider('opencode', 'OpenCode Zen', 'https://opencode.ai/zen/v1', 'muse-spark-1.2-contributor-free', 262000, { apiKeyUrl: 'https://opencode.ai/docs/zen', suggestions: ['muse-spark-1.2-contributor-free', 'mimo-v2.5-free', 'ling-3.0-flash-fin-free', 'nemotron-3-ultra-free', 'nemotron-3.5-lightning-free', 'big-pickle'], inputCostPerMillionUsd: 0, outputCostPerMillionUsd: 0, cacheReadCostPerMillionUsd: 0 }), provider('opencode-go', 'OpenCode Go', 'https://opencode.ai/zen/go/v1', 'deepseek-v4-flash', 1000000, { apiKeyUrl: 'https://opencode.ai/docs/zen', inputCostPerMillionUsd: 0.14, cacheReadCostPerMillionUsd: 0.0028, outputCostPerMillionUsd: 0.28 }), + provider('opper', 'Opper', 'https://api.opper.ai/v3/compat', 'gpt-5.4-mini', 400000, { apiKeyUrl: 'https://platform.opper.ai', supportsVision: true, suggestions: ['gpt-5.4-mini', 'claude-sonnet-4-6', 'gemini-3.8-flash', 'deepseek-v4-flash'] }), provider('orcarouter', 'OrcaRouter', 'https://api.orcarouter.ai/v1', 'orcarouter/auto', 128000, { apiKeyUrl: 'https://www.orcarouter.ai/console', supportsVision: true }), provider('ovhcloud', 'OVHcloud AI Endpoints', 'https://oai.endpoints.kepler.ai.cloud.ovh.net/v1', 'qwen3-coder-30b-a3b-instruct', 262144, { apiKeyUrl: 'https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog/', inputCostPerMillionUsd: 0.07, outputCostPerMillionUsd: 0.26 }), provider('perplexity', 'Perplexity Sonar', 'https://api.perplexity.ai', 'sonar-reasoning-pro', 128000, { category: 'cloud', apiKeyUrl: 'https://www.perplexity.ai/settings/api', supportsVision: true, supportsTools: false, inputCostPerMillionUsd: 2, outputCostPerMillionUsd: 8 }), diff --git a/src/firefox/icons/providers/SOURCES.md b/src/firefox/icons/providers/SOURCES.md index f918b3218..2d879c9e3 100644 --- a/src/firefox/icons/providers/SOURCES.md +++ b/src/firefox/icons/providers/SOURCES.md @@ -20,6 +20,7 @@ Most brand marks come from [Lobe Icons](https://github.com/lobehub/lobe-icons) | orcarouter | OrcaRouter official docs favicon (`Continuum-AI-Corp/docs`, MIT) | | nearai | WebBrain-authored simple N mark (not an official NEAR brand asset) | | cheaperinference | Cheaper Inference logo mark (cheaperinference.com) | +| opper | Opper official logo mark (opper.ai) | Brand trademarks remain property of their owners; used only for provider identification in the settings UI. diff --git a/src/firefox/icons/providers/opper.svg b/src/firefox/icons/providers/opper.svg new file mode 100644 index 000000000..ba0a224cb --- /dev/null +++ b/src/firefox/icons/providers/opper.svg @@ -0,0 +1 @@ +Opper diff --git a/src/firefox/src/providers/provider-catalog.js b/src/firefox/src/providers/provider-catalog.js index df8e45fc8..503f294d3 100644 --- a/src/firefox/src/providers/provider-catalog.js +++ b/src/firefox/src/providers/provider-catalog.js @@ -111,6 +111,7 @@ const PROVIDERS = [ provider('ollama-cloud', 'Ollama Cloud', 'https://ollama.com/v1', 'deepseek-v4-flash', 1048576, { category: 'cloud', apiKeyUrl: 'https://docs.ollama.com/cloud' }), provider('opencode', 'OpenCode Zen', 'https://opencode.ai/zen/v1', 'muse-spark-1.2-contributor-free', 262000, { apiKeyUrl: 'https://opencode.ai/docs/zen', suggestions: ['muse-spark-1.2-contributor-free', 'mimo-v2.5-free', 'ling-3.0-flash-fin-free', 'nemotron-3-ultra-free', 'nemotron-3.5-lightning-free', 'big-pickle'], inputCostPerMillionUsd: 0, outputCostPerMillionUsd: 0, cacheReadCostPerMillionUsd: 0 }), provider('opencode-go', 'OpenCode Go', 'https://opencode.ai/zen/go/v1', 'deepseek-v4-flash', 1000000, { apiKeyUrl: 'https://opencode.ai/docs/zen', inputCostPerMillionUsd: 0.14, cacheReadCostPerMillionUsd: 0.0028, outputCostPerMillionUsd: 0.28 }), + provider('opper', 'Opper', 'https://api.opper.ai/v3/compat', 'gpt-5.4-mini', 400000, { apiKeyUrl: 'https://platform.opper.ai', supportsVision: true, suggestions: ['gpt-5.4-mini', 'claude-sonnet-4-6', 'gemini-3.8-flash', 'deepseek-v4-flash'] }), provider('orcarouter', 'OrcaRouter', 'https://api.orcarouter.ai/v1', 'orcarouter/auto', 128000, { apiKeyUrl: 'https://www.orcarouter.ai/console', supportsVision: true }), provider('ovhcloud', 'OVHcloud AI Endpoints', 'https://oai.endpoints.kepler.ai.cloud.ovh.net/v1', 'qwen3-coder-30b-a3b-instruct', 262144, { apiKeyUrl: 'https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog/', inputCostPerMillionUsd: 0.07, outputCostPerMillionUsd: 0.26 }), provider('perplexity', 'Perplexity Sonar', 'https://api.perplexity.ai', 'sonar-reasoning-pro', 128000, { category: 'cloud', apiKeyUrl: 'https://www.perplexity.ai/settings/api', supportsVision: true, supportsTools: false, inputCostPerMillionUsd: 2, outputCostPerMillionUsd: 8 }), diff --git a/test/run.js b/test/run.js index 35e4ab21c..c6faa5ce2 100644 --- a/test/run.js +++ b/test/run.js @@ -76465,7 +76465,7 @@ test('extended provider catalog is complete, mirrored, safe, and excluded-provid iflowcn inception inference io-net jiekou kilo kimi-for-coding kuae-cloud-coding-plan llama lucidquery meganova minimax-cn-coding-plan minimax-coding-plan moark modelscope morph nano-gpt nearai nebius nova novita-ai - ollama-cloud opencode opencode-go orcarouter ovhcloud perplexity + ollama-cloud opencode opencode-go opper orcarouter ovhcloud perplexity perplexity-agent poe pollinations privatemode-ai qihang-ai qiniu-ai requesty scaleway siliconflow siliconflow-cn stackit stepfun submodel synthetic tencent-coding-plan upstage v0 venice vercel vivgrid vultr wandb xiaomi zai-coding-plan zenmux @@ -76473,7 +76473,7 @@ test('extended provider catalog is complete, mirrored, safe, and excluded-provid `.trim().split(/\s+/); const excluded = ['github-models', 'github-copilot', 'gitlab', 'sap-ai-core']; - assert.equal(expectedIds.length, 81); + assert.equal(expectedIds.length, 82); assert.deepEqual(ProviderCatalogCh.ADDITIONAL_PROVIDER_IDS, expectedIds); assert.deepEqual(ProviderCatalogFx.ADDITIONAL_PROVIDER_IDS, expectedIds); assert.deepEqual( @@ -76488,8 +76488,8 @@ test('extended provider catalog is complete, mirrored, safe, and excluded-provid ]) { const defaults = new PM()._defaultConfigs(); // Includes the sidepanel-only WebBrain Compass XL runtime profile, which is - // deliberately omitted from the 115/114 Settings provider cards. - const expectedDefaultCount = label === 'chrome' ? 116 : 115; + // deliberately omitted from the 116/115 Settings provider cards. + const expectedDefaultCount = label === 'chrome' ? 117 : 116; assert.equal( Object.keys(defaults).length, expectedDefaultCount, @@ -76636,6 +76636,30 @@ test('extended provider catalog is complete, mirrored, safe, and excluded-provid ProviderCatalogCh.ADDITIONAL_PROVIDER_UI.cheaperinference.suggestions, ['gpt-5.4-mini', 'claude-sonnet-5', 'gemini-3.5-flash', 'deepseek-v4-flash'], ); + assert.deepEqual( + { + baseUrl: ProviderCatalogCh.ADDITIONAL_PROVIDER_DEFAULTS.opper.baseUrl, + model: ProviderCatalogCh.ADDITIONAL_PROVIDER_DEFAULTS.opper.model, + contextWindow: ProviderCatalogCh.ADDITIONAL_PROVIDER_DEFAULTS.opper.contextWindow, + supportsVision: ProviderCatalogCh.ADDITIONAL_PROVIDER_DEFAULTS.opper.supportsVision, + supportsTools: ProviderCatalogCh.ADDITIONAL_PROVIDER_DEFAULTS.opper.supportsTools, + supportsAskStreaming: ProviderCatalogCh.ADDITIONAL_PROVIDER_DEFAULTS.opper.supportsAskStreaming, + apiKeyUrl: ProviderCatalogCh.ADDITIONAL_PROVIDER_DEFAULTS.opper.apiKeyUrl, + }, + { + baseUrl: 'https://api.opper.ai/v3/compat', + model: 'gpt-5.4-mini', + contextWindow: 400000, + supportsVision: true, + supportsTools: true, + supportsAskStreaming: true, + apiKeyUrl: 'https://platform.opper.ai', + }, + ); + assert.deepEqual( + ProviderCatalogCh.ADDITIONAL_PROVIDER_UI.opper.suggestions, + ['gpt-5.4-mini', 'claude-sonnet-4-6', 'gemini-3.8-flash', 'deepseek-v4-flash'], + ); assert.deepEqual( ProviderCatalogCh.ADDITIONAL_PROVIDER_UI['kimi-for-coding'].suggestions, ['kimi-for-coding', 'kimi-for-coding-highspeed', 'k3'],