From f154cfd22142dc58419d6f22f36c609460df5853 Mon Sep 17 00:00:00 2001 From: Felix <151852644+Felixkw12@users.noreply.github.com> Date: Thu, 8 Oct 2026 00:53:45 +0200 Subject: [PATCH] feat(wizard): add Opper as an LLM provider (#6399) * feat(wizard): add Opper as an LLM provider Opper (https://opper.ai) is an EU-hosted AI gateway: 700+ models from 50+ providers behind one OpenAI-compatible API and one key. This adds it to the setup wizard's LLM_PROVIDERS next to OpenRouter, with the same shape: langchain_openai:ChatOpenAI pointed at https://api.opper.ai/v3/compat, env var OPPER_API_KEY. Models use Opper's bare model ids: claude-sonnet-4-6 (default), gpt-5.5, gemini-3.8-flash and gpt-5.4-mini. Because the GPT ids are bare, langchain-openai drops the 0.7 temperature for them the same way it does for direct OpenAI gpt-5 models. Checked: python -m py_compile scripts/wizard/providers.py, and each model id against Opper's public model list (GET https://api.opper.ai/v3/models). Not run locally: make lint and make test. Disclosure: Opper is my startup. Co-Authored-By: Claude Opus 5.5 (1M context) * docs: add Opper to the config example and READMEs Add an Opper model example next to the other OpenAI-compatible gateways, as requested in review: - config.example.yaml: commented opper-claude-sonnet-4-6 block after the other gateway examples (ChatOpenAI + base_url, OPPER_API_KEY) - README.md and the translated READMEs: the same entry in the manual model configuration examples, after OpenRouter - .env.example and backend/docs/CONFIGURATION.md: OPPER_API_KEY, in the shape of the Novita lines claude-sonnet-4-6 is a pooled id in Opper's public catalogue (GET https://api.opper.ai/v3/models). config.example.yaml still parses with yaml.safe_load; config_version is unchanged because the schema is. Disclosure: Opper is my startup. Co-Authored-By: Claude Opus 5.5 (1M context) --------- Co-authored-by: Claude Opus 5.5 (1M context) --- .env.example | 1 + README.md | 7 +++++++ README_fr.md | 7 +++++++ README_ja.md | 7 +++++++ README_pt.md | 7 +++++++ README_ru.md | 7 +++++++ README_zh.md | 7 +++++++ backend/docs/CONFIGURATION.md | 1 + config.example.yaml | 16 ++++++++++++++++ scripts/wizard/providers.py | 17 +++++++++++++++++ 10 files changed, 77 insertions(+) diff --git a/.env.example b/.env.example index 93c179442d..c0cdb9ab83 100644 --- a/.env.example +++ b/.env.example @@ -40,6 +40,7 @@ UNBROWSE_API_KEY=your-unbrowse-api-key # DEEPSEEK_API_KEY=your-deepseek-api-key # NOVITA_API_KEY=your-novita-api-key # OpenAI-compatible, see https://novita.ai # MINIMAX_API_KEY=your-minimax-api-key # OpenAI-compatible, see https://platform.minimax.io +# OPPER_API_KEY=your-opper-api-key # OpenAI-compatible, see https://opper.ai # OpenAI-compatible Images API (used by the image-generation skill) # IMAGE_GENERATION_PROVIDER=openai # openai-compatible is also accepted # IMAGE_GENERATION_API_KEY=your-image-generation-api-key diff --git a/README.md b/README.md index a6ebb69ee9..8f12fbc442 100644 --- a/README.md +++ b/README.md @@ -268,6 +268,13 @@ For MindIE XML tool calls, see the api_key: $OPENROUTER_API_KEY base_url: https://openrouter.ai/api/v1 + - name: opper-claude-sonnet-4-6 + display_name: Claude Sonnet 4.6 (Opper) + use: langchain_openai:ChatOpenAI + model: claude-sonnet-4-6 + api_key: $OPPER_API_KEY + base_url: https://api.opper.ai/v3/compat + - name: gpt-5-responses display_name: GPT-5 (Responses API) use: langchain_openai:ChatOpenAI diff --git a/README_fr.md b/README_fr.md index 58bece6252..0c9ff211ee 100644 --- a/README_fr.md +++ b/README_fr.md @@ -149,6 +149,13 @@ Ce prompt est destiné aux coding agents. Il leur demande de cloner le dépôt s api_key: $OPENROUTER_API_KEY base_url: https://openrouter.ai/api/v1 + - name: opper-claude-sonnet-4-6 + display_name: Claude Sonnet 4.6 (Opper) + use: langchain_openai:ChatOpenAI + model: claude-sonnet-4-6 + api_key: $OPPER_API_KEY + base_url: https://api.opper.ai/v3/compat + - name: gpt-5-responses display_name: GPT-5 (Responses API) use: langchain_openai:ChatOpenAI diff --git a/README_ja.md b/README_ja.md index d986b38509..333f8d20ea 100644 --- a/README_ja.md +++ b/README_ja.md @@ -140,6 +140,13 @@ DeerFlow がまだ clone されていなければ先に clone してから、htt api_key: $OPENROUTER_API_KEY base_url: https://openrouter.ai/api/v1 + - name: opper-claude-sonnet-4-6 + display_name: Claude Sonnet 4.6 (Opper) + use: langchain_openai:ChatOpenAI + model: claude-sonnet-4-6 + api_key: $OPPER_API_KEY + base_url: https://api.opper.ai/v3/compat + - name: gpt-5-responses display_name: GPT-5 (Responses API) use: langchain_openai:ChatOpenAI diff --git a/README_pt.md b/README_pt.md index a605f7b19e..cbcf720b10 100644 --- a/README_pt.md +++ b/README_pt.md @@ -200,6 +200,13 @@ Para o endpoint oficial do Gemini compatível com OpenAI, do Google, use o [perf api_key: $OPENROUTER_API_KEY base_url: https://openrouter.ai/api/v1 + - name: opper-claude-sonnet-4-6 + display_name: Claude Sonnet 4.6 (Opper) + use: langchain_openai:ChatOpenAI + model: claude-sonnet-4-6 + api_key: $OPPER_API_KEY + base_url: https://api.opper.ai/v3/compat + - name: gpt-5-responses display_name: GPT-5 (Responses API) use: langchain_openai:ChatOpenAI diff --git a/README_ru.md b/README_ru.md index 2b323a0ee5..7f70cb2dee 100644 --- a/README_ru.md +++ b/README_ru.md @@ -152,6 +152,13 @@ DeerFlow интегрирован с инструментарием для ум api_key: $OPENROUTER_API_KEY base_url: https://openrouter.ai/api/v1 + - name: opper-claude-sonnet-4-6 + display_name: Claude Sonnet 4.6 (Opper) + use: langchain_openai:ChatOpenAI + model: claude-sonnet-4-6 + api_key: $OPPER_API_KEY + base_url: https://api.opper.ai/v3/compat + - name: gpt-5-responses display_name: GPT-5 (Responses API) use: langchain_openai:ChatOpenAI diff --git a/README_zh.md b/README_zh.md index 9249474878..27b3f52866 100644 --- a/README_zh.md +++ b/README_zh.md @@ -152,6 +152,13 @@ DeerFlow 新近集成了 BytePlus 自研的智能搜索与抓取工具集——[ api_key: $OPENROUTER_API_KEY base_url: https://openrouter.ai/api/v1 + - name: opper-claude-sonnet-4-6 + display_name: Claude Sonnet 4.6 (Opper) + use: langchain_openai:ChatOpenAI + model: claude-sonnet-4-6 + api_key: $OPPER_API_KEY + base_url: https://api.opper.ai/v3/compat + - name: gpt-5-responses display_name: GPT-5 (Responses API) use: langchain_openai:ChatOpenAI diff --git a/backend/docs/CONFIGURATION.md b/backend/docs/CONFIGURATION.md index b23b197ac3..23ff14880b 100644 --- a/backend/docs/CONFIGURATION.md +++ b/backend/docs/CONFIGURATION.md @@ -1405,6 +1405,7 @@ models: - `DEEPSEEK_API_KEY` - DeepSeek API key - `MIMO_API_KEY` - Xiaomi MiMo API key - `NOVITA_API_KEY` - Novita API key (OpenAI-compatible endpoint) +- `OPPER_API_KEY` - Opper API key (OpenAI-compatible endpoint) - `TAVILY_API_KEY` - Tavily search API key - `BRAVE_SEARCH_API_KEY` - Brave Search API key for `web_search` and `image_search` - `SERPER_API_KEY` - Serper (Google Search/Images API) key for `web_search` and `image_search` diff --git a/config.example.yaml b/config.example.yaml index 4f78b6e339..cf03678aad 100644 --- a/config.example.yaml +++ b/config.example.yaml @@ -759,6 +759,22 @@ models: # thinking: # type: disabled + # Example: Opper (OpenAI-compatible) + # Opper is an EU-hosted AI gateway: 700+ models from 50+ providers behind one + # OpenAI-compatible API, so it uses the same ChatOpenAI + base_url pattern as + # other OpenAI-compatible gateways. Model ids are bare names such as + # claude-sonnet-4-6; browse them at https://api.opper.ai/v3/models. See https://opper.ai + # - name: opper-claude-sonnet-4-6 + # display_name: Claude Sonnet 4.6 (Opper) + # use: langchain_openai:ChatOpenAI + # model: claude-sonnet-4-6 + # api_key: $OPPER_API_KEY + # base_url: https://api.opper.ai/v3/compat + # request_timeout: 600.0 + # max_retries: 2 + # max_tokens: 8192 + # temperature: 0.7 + # Example: vLLM 0.19.0 (OpenAI-compatible, with reasoning toggle) # DeerFlow's vLLM provider preserves vLLM reasoning across tool-call turns and # toggles Qwen-style reasoning by writing diff --git a/scripts/wizard/providers.py b/scripts/wizard/providers.py index f75d090f2f..3cfc9b25b7 100644 --- a/scripts/wizard/providers.py +++ b/scripts/wizard/providers.py @@ -495,6 +495,23 @@ LLM_PROVIDERS: list[LLMProvider] = [ "temperature": 0.7, }, ), + LLMProvider( + name="opper", + display_name="Opper", + description="EU-hosted AI gateway, 700+ models behind one OpenAI-compatible API", + use="langchain_openai:ChatOpenAI", + models=["claude-sonnet-4-6", "gpt-5.5", "gemini-3.8-flash", "gpt-5.4-mini"], + default_model="claude-sonnet-4-6", + env_var="OPPER_API_KEY", + package="langchain-openai", + extra_config={ + "base_url": "https://api.opper.ai/v3/compat", + "request_timeout": 600.0, + "max_retries": 2, + "max_tokens": 8192, + "temperature": 0.7, + }, + ), LLMProvider( name="vllm", display_name="vLLM",