From 051aeb5509666d598da13b1bbf2a3daf80e9fa11 Mon Sep 17 00:00:00 2001 From: Haozhe Wu Date: Mon, 21 Sep 2026 20:35:37 +0800 Subject: [PATCH] refactor(providers): remove the Requesty built-in provider Requesty (added in #474) is an OpenAI-compatible gateway whose capabilities were a copy of OpenRouter's: same provider/model naming, same extra_body.reasoning opt-in, no adapter code of its own. Built-in slots are kept for providers with their own behaviour; a gateway that speaks an existing wire format is configured through that provider, and #1532 (API Route) is being closed on the same grounds. Migration, identical request shape: LANGCHAIN_PROVIDER=openrouter, OPENROUTER_BASE_URL=https://router.requesty.ai/v1, OPENROUTER_API_KEY=. Past news and contributor credits in the READMEs are left as history; the supported-provider lists drop it. --- README.md | 2 +- README_ar.md | 2 +- README_es.md | 2 +- README_id.md | 2 +- README_ja.md | 2 +- README_ko.md | 2 +- README_zh.md | 2 +- agent/.env.example | 8 -------- agent/cli/_legacy.py | 14 -------------- agent/cli/onboard.py | 6 ------ agent/src/providers/capabilities.py | 12 +----------- agent/src/providers/llm.py | 4 ++-- agent/src/providers/llm_providers.json | 9 --------- agent/src/swarm/models.py | 1 - agent/tests/test_llm.py | 3 +-- agent/tests/test_llm_provider_defaults.py | 1 - agent/tests/test_llm_reasoning_effort.py | 19 ++----------------- agent/tests/test_provider_diagnostics.py | 12 ------------ desktop/electron/src/secure-credentials.ts | 1 - 19 files changed, 13 insertions(+), 91 deletions(-) diff --git a/README.md b/README.md index d5a546ab..fea39841 100644 --- a/README.md +++ b/README.md @@ -854,7 +854,7 @@ vibe-trading-mcp # start MCP server (stdio) - OpenAI Codex can also be used with ChatGPT OAuth: set `LANGCHAIN_PROVIDER=openai-codex`, then run `vibe-trading provider login openai-codex`. This does not use `OPENAI_API_KEY`. - GitHub Copilot can be used with an active Copilot subscription instead of a separately billed LLM API key. See [GitHub Copilot SDK provider](#github-copilot-sdk-provider). -> **Supported LLM providers:** OpenRouter, Requesty, OpenAI, Anthropic (native Messages API), DeepSeek, OpenCode (Go / Zen), Gemini, Groq, DashScope/Qwen, Zhipu, Moonshot/Kimi, MiniMax, SiliconFlow (CN + Global), Xiaomi MIMO, Novita AI, iFlytek Spark, Z.ai, NVIDIA NIM, ModelScope, GitHub Copilot, Ollama (local). When no `*_BASE_URL` is set, each provider falls back to its canonical endpoint, so just a key is enough. See `.env.example` for config. +> **Supported LLM providers:** OpenRouter, OpenAI, Anthropic (native Messages API), DeepSeek, OpenCode (Go / Zen), Gemini, Groq, DashScope/Qwen, Zhipu, Moonshot/Kimi, MiniMax, SiliconFlow (CN + Global), Xiaomi MIMO, Novita AI, iFlytek Spark, Z.ai, NVIDIA NIM, ModelScope, GitHub Copilot, Ollama (local). When no `*_BASE_URL` is set, each provider falls back to its canonical endpoint, so just a key is enough. See `.env.example` for config. > **Tip:** All markets work without any API keys thanks to automatic fallback. yfinance/Yahoo (HK/US/Canada/UK), OKX (crypto), mootdx (A-shares, TCP-direct, no IP throttle), and AKShare (A-shares, US, HK, futures, forex) are all free. LSE `.L` quotes must declare GBP or GBp so pence can be normalized before GBP accounting. Tushare token is optional — mootdx is the preferred no-token A-share fallback, with AKShare as a broader backup. diff --git a/README_ar.md b/README_ar.md index 37c28d36..1aca61d1 100644 --- a/README_ar.md +++ b/README_ar.md @@ -803,7 +803,7 @@ vibe-trading-mcp # start MCP server (stdio) - **Docker** للمسار A - يمكن استخدام OpenAI Codex أيضاً عبر ChatGPT OAuth: اضبط `LANGCHAIN_PROVIDER=openai-codex`، ثم شغل `vibe-trading provider login openai-codex`. هذا لا يستخدم `OPENAI_API_KEY`. -> **مزودو LLM المدعومون:** OpenRouter, Requesty, OpenAI, Anthropic (Messages API الأصلي), DeepSeek, Gemini, Groq, DashScope/Qwen, Zhipu, Moonshot/Kimi, MiniMax, SiliconFlow (CN + Global), Xiaomi MIMO, Novita AI, iFlytek Spark, Z.ai, NVIDIA NIM, ModelScope, GitHub Copilot, Ollama (local). عند عدم ضبط أي `*_BASE_URL`، يتراجع كل مزوّد إلى نقطة نهايته القانونية، فيكفي مفتاح واحد. راجع `.env.example` للإعداد. +> **مزودو LLM المدعومون:** OpenRouter, OpenAI, Anthropic (Messages API الأصلي), DeepSeek, Gemini, Groq, DashScope/Qwen, Zhipu, Moonshot/Kimi, MiniMax, SiliconFlow (CN + Global), Xiaomi MIMO, Novita AI, iFlytek Spark, Z.ai, NVIDIA NIM, ModelScope, GitHub Copilot, Ollama (local). عند عدم ضبط أي `*_BASE_URL`، يتراجع كل مزوّد إلى نقطة نهايته القانونية، فيكفي مفتاح واحد. راجع `.env.example` للإعداد. > **نصيحة:** تعمل كل الأسواق دون مفاتيح API بفضل fallback التلقائي. yfinance/Yahoo (HK/US/كندا/المملكة المتحدة)، وOKX (crypto)، وmootdx (أسهم A، اتصال TCP مباشر بدون قيود IP)، وAKShare (A-shares, US, HK, futures, forex) كلها مجانية. يجب أن تعلن أسعار LSE `.L` عملة GBP أو GBp لتطبيع البنس قبل المحاسبة بالجنيه. رمز Tushare اختياري — mootdx هو الـ fallback الموصى به لأسهم A بدون رمز، بينما يوفر AKShare احتياطياً أوسع تغطية. diff --git a/README_es.md b/README_es.md index 95c9d0af..58538d1e 100644 --- a/README_es.md +++ b/README_es.md @@ -823,7 +823,7 @@ vibe-trading-mcp # inicia el servidor MCP (stdio) - **Docker** para el Path A - OpenAI Codex también se puede usar con ChatGPT OAuth: configura `LANGCHAIN_PROVIDER=openai-codex` y luego ejecuta `vibe-trading provider login openai-codex`. Esto no usa `OPENAI_API_KEY`. -> **Proveedores de LLM compatibles:** OpenRouter, Requesty, OpenAI, Anthropic (API de Messages nativa), DeepSeek, Gemini, Groq, DashScope/Qwen, Zhipu, Moonshot/Kimi, MiniMax, SiliconFlow (CN + Global), Xiaomi MIMO, Novita AI, iFlytek Spark, Z.ai, NVIDIA NIM, ModelScope, GitHub Copilot, Ollama (local). Cuando no se configura ningún `*_BASE_URL`, cada proveedor recurre a su endpoint canónico, así que basta con una clave. Consulta `.env.example` para la configuración. +> **Proveedores de LLM compatibles:** OpenRouter, OpenAI, Anthropic (API de Messages nativa), DeepSeek, Gemini, Groq, DashScope/Qwen, Zhipu, Moonshot/Kimi, MiniMax, SiliconFlow (CN + Global), Xiaomi MIMO, Novita AI, iFlytek Spark, Z.ai, NVIDIA NIM, ModelScope, GitHub Copilot, Ollama (local). Cuando no se configura ningún `*_BASE_URL`, cada proveedor recurre a su endpoint canónico, así que basta con una clave. Consulta `.env.example` para la configuración. > **Consejo:** Todos los mercados funcionan sin ninguna clave de API gracias al fallback automático. yfinance/Yahoo (HK/US/Canadá/Reino Unido), OKX (cripto), mootdx (acciones A, conexión TCP directa, sin limitación de IP) y AKShare (acciones A, EE. UU., HK, futuros, forex) son gratuitos. Las cotizaciones LSE `.L` deben declarar GBP o GBp para normalizar los peniques antes de la contabilidad en GBP. El token de Tushare es opcional — mootdx es el fallback preferido sin token para acciones A, con AKShare como respaldo más amplio. diff --git a/README_id.md b/README_id.md index 36ea9905..aee7f953 100644 --- a/README_id.md +++ b/README_id.md @@ -977,7 +977,7 @@ vibe-trading-mcp # start MCP server (stdio) - OpenAI Codex juga dapat digunakan dengan ChatGPT OAuth: atur `LANGCHAIN_PROVIDER=openai-codex`, lalu jalankan `vibe-trading provider login openai-codex`. Ini tidak menggunakan `OPENAI_API_KEY`. - GitHub Copilot dapat digunakan dengan subscription Copilot aktif tanpa LLM API key yang ditagihkan terpisah. Lihat [provider GitHub Copilot SDK](#github-copilot-sdk-provider). -> **Provider LLM yang didukung:** OpenRouter, Requesty, OpenAI, Anthropic (native Messages API), DeepSeek, OpenCode (Go / Zen), Gemini, Groq, DashScope/Qwen, Zhipu, Moonshot/Kimi, MiniMax, SiliconFlow (CN + Global), Xiaomi MIMO, Novita AI, iFlytek Spark, Z.ai, NVIDIA NIM, ModelScope, GitHub Copilot, Ollama (lokal). Jika `*_BASE_URL` tidak diatur, setiap provider fallback ke endpoint canonical-nya, jadi cukup key saja. Lihat `.env.example` untuk config. +> **Provider LLM yang didukung:** OpenRouter, OpenAI, Anthropic (native Messages API), DeepSeek, OpenCode (Go / Zen), Gemini, Groq, DashScope/Qwen, Zhipu, Moonshot/Kimi, MiniMax, SiliconFlow (CN + Global), Xiaomi MIMO, Novita AI, iFlytek Spark, Z.ai, NVIDIA NIM, ModelScope, GitHub Copilot, Ollama (lokal). Jika `*_BASE_URL` tidak diatur, setiap provider fallback ke endpoint canonical-nya, jadi cukup key saja. Lihat `.env.example` untuk config. > **Tip:** Semua market dapat bekerja tanpa API key berkat fallback otomatis. yfinance/Yahoo (HK/AS/Kanada/UK), OKX (crypto), mootdx (A-share, TCP langsung, tanpa throttle IP), dan AKShare (A-share, AS, HK, futures, forex) semuanya gratis. Quote LSE `.L` harus mendeklarasikan GBP atau GBp agar pence dapat dinormalisasi sebelum accounting GBP. Token Tushare opsional — mootdx adalah fallback A-share tanpa token yang disarankan, dengan AKShare sebagai backup yang lebih luas. diff --git a/README_ja.md b/README_ja.md index b8a8c422..0c3cc53b 100644 --- a/README_ja.md +++ b/README_ja.md @@ -808,7 +808,7 @@ vibe-trading-mcp # start MCP server (stdio) - Path A では **Docker** - OpenAI Codex は ChatGPT OAuth でも利用できます。`LANGCHAIN_PROVIDER=openai-codex` を設定し、`vibe-trading provider login openai-codex` を実行してください。`OPENAI_API_KEY` は使いません。 -> **Supported LLM providers:** OpenRouter、Requesty、OpenAI、Anthropic(ネイティブ Messages API)、DeepSeek、Gemini、Groq、DashScope/Qwen、Zhipu、Moonshot/Kimi、MiniMax、SiliconFlow(CN + Global)、Xiaomi MIMO、Novita AI、iFlytek Spark、Z.ai、NVIDIA NIM、ModelScope、GitHub Copilot、Ollama(local)。`*_BASE_URL` が未設定の場合、各プロバイダーは canonical なエンドポイントにフォールバックするため、key だけで十分です。設定は `.env.example` を参照してください。 +> **Supported LLM providers:** OpenRouter、OpenAI、Anthropic(ネイティブ Messages API)、DeepSeek、Gemini、Groq、DashScope/Qwen、Zhipu、Moonshot/Kimi、MiniMax、SiliconFlow(CN + Global)、Xiaomi MIMO、Novita AI、iFlytek Spark、Z.ai、NVIDIA NIM、ModelScope、GitHub Copilot、Ollama(local)。`*_BASE_URL` が未設定の場合、各プロバイダーは canonical なエンドポイントにフォールバックするため、key だけで十分です。設定は `.env.example` を参照してください。 > **Tip:** 自動フォールバックにより、すべての市場は API key なしで利用できます。yfinance/Yahoo(HK/US/カナダ/英国)、OKX(crypto)、mootdx(A 株、TCP 直結で IP 制限なし)、AKShare(A-shares、US、HK、futures、forex)はすべて無料です。LSE `.L` クォートは GBP または GBp の明示が必要で、GBP 会計の前にペンスを正規化します。Tushare token は任意で、A 株は mootdx が推奨の no-token fallback、AKShare がより広いカバレッジのバックアップになります。 diff --git a/README_ko.md b/README_ko.md index 1f2c6264..dc07f861 100644 --- a/README_ko.md +++ b/README_ko.md @@ -806,7 +806,7 @@ vibe-trading-mcp # start MCP server (stdio) - 경로 A용 **Docker** - OpenAI Codex도 ChatGPT OAuth로 사용할 수 있습니다. `LANGCHAIN_PROVIDER=openai-codex`를 설정한 뒤 `vibe-trading provider login openai-codex`를 실행하세요. 이 방식은 `OPENAI_API_KEY`를 사용하지 않습니다. -> **지원 LLM provider:** OpenRouter, Requesty, OpenAI, Anthropic (native Messages API), DeepSeek, Gemini, Groq, DashScope/Qwen, Zhipu, Moonshot/Kimi, MiniMax, SiliconFlow (CN + Global), Xiaomi MIMO, Novita AI, iFlytek Spark, Z.ai, NVIDIA NIM, ModelScope, GitHub Copilot, Ollama(local). `*_BASE_URL`이 설정되지 않으면 각 provider는 canonical endpoint로 폴백하므로 key만 있으면 충분합니다. 설정은 `.env.example`을 참고하세요. +> **지원 LLM provider:** OpenRouter, OpenAI, Anthropic (native Messages API), DeepSeek, Gemini, Groq, DashScope/Qwen, Zhipu, Moonshot/Kimi, MiniMax, SiliconFlow (CN + Global), Xiaomi MIMO, Novita AI, iFlytek Spark, Z.ai, NVIDIA NIM, ModelScope, GitHub Copilot, Ollama(local). `*_BASE_URL`이 설정되지 않으면 각 provider는 canonical endpoint로 폴백하므로 key만 있으면 충분합니다. 설정은 `.env.example`을 참고하세요. > **팁:** 자동 fallback 덕분에 모든 시장은 API key 없이도 작동합니다. yfinance/Yahoo(HK/US/캐나다/영국), OKX(crypto), mootdx(A주, TCP 직결, IP 제한 없음), AKShare(A주, US, HK, futures, forex)는 모두 무료입니다. LSE `.L` 호가는 GBP 또는 GBp로 명시되어야 하며, GBP 회계 전에 펜스를 정규화합니다. Tushare token은 선택 사항이며, mootdx가 권장 no-token A주 fallback이고 AKShare는 더 넓은 커버리지의 백업입니다. diff --git a/README_zh.md b/README_zh.md index 9c7cbcdb..06c996af 100644 --- a/README_zh.md +++ b/README_zh.md @@ -813,7 +813,7 @@ vibe-trading-mcp # start MCP server (stdio) - 路径 A 需要 **Docker** - OpenAI Codex 也可通过 ChatGPT OAuth 使用:设置 `LANGCHAIN_PROVIDER=openai-codex`,然后运行 `vibe-trading provider login openai-codex`。它不使用 `OPENAI_API_KEY`。 -> **支持的 LLM providers:** OpenRouter、Requesty、OpenAI、Anthropic(原生 Messages API)、DeepSeek、Gemini、Groq、DashScope/Qwen、Zhipu、Moonshot/Kimi、MiniMax、SiliconFlow(CN + Global)、Xiaomi MIMO、Novita AI、iFlytek 星火、Z.ai、NVIDIA NIM、ModelScope、GitHub Copilot、Ollama(本地)。未设置 `*_BASE_URL` 时,每个 provider 会回退到其规范端点,因此只需一个 key 即可。配置见 `.env.example`。 +> **支持的 LLM providers:** OpenRouter、OpenAI、Anthropic(原生 Messages API)、DeepSeek、Gemini、Groq、DashScope/Qwen、Zhipu、Moonshot/Kimi、MiniMax、SiliconFlow(CN + Global)、Xiaomi MIMO、Novita AI、iFlytek 星火、Z.ai、NVIDIA NIM、ModelScope、GitHub Copilot、Ollama(本地)。未设置 `*_BASE_URL` 时,每个 provider 会回退到其规范端点,因此只需一个 key 即可。配置见 `.env.example`。 > **提示:** 由于自动 fallback,所有市场都可以在没有任何 API key 的情况下工作。yfinance/Yahoo(港股/美股/加拿大/英国)、OKX(加密)、mootdx(A 股,TCP 直连不封 IP)和 AKShare(A 股、美股、港股、期货、外汇)都是免费的。LSE `.L` 报价必须明示为 GBP 或 GBp,以便在英镑记账前将便士归一化。Tushare token 是可选项 —— mootdx 是首选的免 token A 股 fallback,AKShare 作为覆盖更广的兜底。 diff --git a/agent/.env.example b/agent/.env.example index fc11258d..36f43e52 100644 --- a/agent/.env.example +++ b/agent/.env.example @@ -9,14 +9,6 @@ LANGCHAIN_MODEL_NAME=deepseek/deepseek-v4-pro OPENROUTER_API_KEY=sk-or-...here OPENROUTER_BASE_URL=https://openrouter.ai/api/v1 -# --- Requesty (OpenAI-compatible multi-model gateway) --- -# Same provider/model naming as OpenRouter. Get a key at https://app.requesty.ai/api-keys -# EU endpoint: https://router.eu.requesty.ai/v1 -# LANGCHAIN_PROVIDER=requesty -# LANGCHAIN_MODEL_NAME=openai/gpt-4o-mini -# REQUESTY_API_KEY=xxx -# REQUESTY_BASE_URL=https://router.requesty.ai/v1 - # --- OpenAI --- # LANGCHAIN_PROVIDER=openai # LANGCHAIN_MODEL_NAME=gpt-5.5-instant diff --git a/agent/cli/_legacy.py b/agent/cli/_legacy.py index ab01144f..77245a82 100644 --- a/agent/cli/_legacy.py +++ b/agent/cli/_legacy.py @@ -435,7 +435,6 @@ def _provider_key_env(provider: str | None) -> str | None: """Return the credential environment variable for a provider.""" return { "openrouter": "OPENROUTER_API_KEY", - "requesty": "REQUESTY_API_KEY", "openai": "OPENAI_API_KEY", "deepseek": "DEEPSEEK_API_KEY", "nvidia": "NVIDIA_API_KEY", @@ -460,7 +459,6 @@ def _provider_base_env(provider: str | None) -> str | None: """Return the base URL environment variable for a provider.""" return { "openrouter": "OPENROUTER_BASE_URL", - "requesty": "REQUESTY_BASE_URL", "openai": "OPENAI_BASE_URL", "openai-codex": "OPENAI_CODEX_BASE_URL", "deepseek": "DEEPSEEK_BASE_URL", @@ -5715,16 +5713,6 @@ _PROVIDER_CHOICES: list[dict[str, str | None]] = [ "key_prefix": "sk-or-", "key_placeholder": "sk-or-v1-...", }, - { - "label": "Requesty (OpenAI-compatible gateway - multiple models)", - "provider": "requesty", - "key_env": "REQUESTY_API_KEY", - "base_env": "REQUESTY_BASE_URL", - "base_url": "https://router.requesty.ai/v1", - "model": "openai/gpt-4o-mini", - "key_prefix": None, - "key_placeholder": "api-key...", - }, { "label": "DeepSeek", "provider": "deepseek", @@ -5932,8 +5920,6 @@ def _render_env_content(config: dict[str, str]) -> str: "LANGCHAIN_PROVIDER", "OPENROUTER_API_KEY", "OPENROUTER_BASE_URL", - "REQUESTY_API_KEY", - "REQUESTY_BASE_URL", "DEEPSEEK_API_KEY", "DEEPSEEK_BASE_URL", "NVIDIA_API_KEY", diff --git a/agent/cli/onboard.py b/agent/cli/onboard.py index 36691354..de7744cb 100644 --- a/agent/cli/onboard.py +++ b/agent/cli/onboard.py @@ -57,12 +57,6 @@ PROVIDERS: Final[tuple[Provider, ...]] = ( "https://openrouter.ai/api/v1", "sk-or-", ("deepseek/deepseek-v4-pro", "deepseek/deepseek-v4-flash", "openai/gpt-5.5-pro", "google/gemini-3.5-flash")), - Provider("requesty", "Requesty", "OpenAI-compatible gateway — 600+ models, one key", - "openai/gpt-4o-mini", - "REQUESTY_API_KEY", "REQUESTY_BASE_URL", - "https://router.requesty.ai/v1", None, - ("openai/gpt-4o-mini", "openai/gpt-4o", - "anthropic/claude-sonnet-4-5", "deepseek/deepseek-chat")), Provider("openai", "OpenAI", "GPT-5.5 direct", "gpt-5.5", "OPENAI_API_KEY", "OPENAI_BASE_URL", "https://api.openai.com/v1", "sk-", diff --git a/agent/src/providers/capabilities.py b/agent/src/providers/capabilities.py index 03e6fce8..74b15cfd 100644 --- a/agent/src/providers/capabilities.py +++ b/agent/src/providers/capabilities.py @@ -183,16 +183,6 @@ _PROVIDERS: dict[str, ProviderCapabilities] = { capture_reasoning=True, openrouter_reasoning_body=True, ), - # Requesty is an OpenAI-compatible LLM gateway using the same - # ``provider/model`` naming and the same opt-in ``extra_body.reasoning`` - # request option as OpenRouter, so it shares OpenRouter's capability shape. - "requesty": ProviderCapabilities( - "requesty", - "REQUESTY_API_KEY", - "REQUESTY_BASE_URL", - capture_reasoning=True, - openrouter_reasoning_body=True, - ), # Verified live against DeepSeek Flash in #1025: a chat-completions request # carrying top-level ``reasoning_effort`` came back with reasoning content # and non-zero reasoning usage. @@ -294,7 +284,7 @@ def get_provider_capabilities( Notes: Model-name inference (``_infer_from_model``) activates for the default ``"openai"`` provider and empty/None providers. Explicit non-OpenAI - providers (OpenRouter, Requesty, DeepSeek, etc.) are never inferred — + providers (OpenRouter, DeepSeek, etc.) are never inferred — the explicit provider choice always wins. """ normalized = (provider or "").strip().lower().replace("_", "-") diff --git a/agent/src/providers/llm.py b/agent/src/providers/llm.py index 30047e23..5928f65c 100644 --- a/agent/src/providers/llm.py +++ b/agent/src/providers/llm.py @@ -1420,8 +1420,8 @@ def _supports_top_level_reasoning_effort(caps: ProviderCapabilities) -> bool: strictly rejects the unknown key outright — so the default is off and the consequence of that default is a no-op, not a failed call. - Relays that take the effort inside ``extra_body.reasoning`` (OpenRouter, - Requesty) use that path instead and are excluded here. + Relays that take the effort inside ``extra_body.reasoning`` (OpenRouter) + use that path instead and are excluded here. Args: caps: Canonical capabilities resolved for the provider and model. Note diff --git a/agent/src/providers/llm_providers.json b/agent/src/providers/llm_providers.json index b9417f96..ed8bc4d5 100644 --- a/agent/src/providers/llm_providers.json +++ b/agent/src/providers/llm_providers.json @@ -8,15 +8,6 @@ "default_base_url": "https://openrouter.ai/api/v1", "api_key_required": true }, - { - "name": "requesty", - "label": "Requesty", - "api_key_env": "REQUESTY_API_KEY", - "base_url_env": "REQUESTY_BASE_URL", - "default_model": "openai/gpt-4o-mini", - "default_base_url": "https://router.requesty.ai/v1", - "api_key_required": true - }, { "name": "openai", "label": "OpenAI", diff --git a/agent/src/swarm/models.py b/agent/src/swarm/models.py index 8c01ece8..bb3d2446 100644 --- a/agent/src/swarm/models.py +++ b/agent/src/swarm/models.py @@ -43,7 +43,6 @@ _PUBLIC_PROVIDERS = frozenset( "opencode-zen", "openrouter", "qwen", - "requesty", "siliconflow-cn", "siliconflow-global", "spark", diff --git a/agent/tests/test_llm.py b/agent/tests/test_llm.py index 1de65249..8e536430 100644 --- a/agent/tests/test_llm.py +++ b/agent/tests/test_llm.py @@ -94,7 +94,6 @@ class TestProviderCapabilityAliases: [ # Gateway providers — explicit choice must never be overridden. ("openrouter", "deepseek/deepseek-v4-pro", "openrouter"), - ("requesty", "deepseek/deepseek-v4-pro", "requesty"), ("openrouter", "gemini-3.5-flash", "openrouter"), ("openrouter", "glm-4.6", "openrouter"), ], @@ -102,7 +101,7 @@ class TestProviderCapabilityAliases: def test_gateway_provider_not_inferred_from_model( self, provider: str, model: str, expected: str ) -> None: - """Gateway providers (OpenRouter/Requesty) must never be overridden. (#549) + """Gateway providers (OpenRouter) must never be overridden. (#549) Their model names contain direct-provider prefixes like ``deepseek/`` that would trigger inference, but the explicit gateway choice must win. diff --git a/agent/tests/test_llm_provider_defaults.py b/agent/tests/test_llm_provider_defaults.py index 2d8c941c..b9c1fff5 100644 --- a/agent/tests/test_llm_provider_defaults.py +++ b/agent/tests/test_llm_provider_defaults.py @@ -15,7 +15,6 @@ from src.providers.capabilities import ( EXPECTED_PROVIDER_DEFAULTS = { "openrouter": "deepseek/deepseek-v4-pro", - "requesty": "openai/gpt-4o-mini", "openai": "gpt-5.5", "anthropic": "claude-sonnet-4-6", "openai-codex": "openai-codex/gpt-5.4", diff --git a/agent/tests/test_llm_reasoning_effort.py b/agent/tests/test_llm_reasoning_effort.py index fa9db90a..877c2f9a 100644 --- a/agent/tests/test_llm_reasoning_effort.py +++ b/agent/tests/test_llm_reasoning_effort.py @@ -2,7 +2,7 @@ The setting has two mutually exclusive delivery paths: -* Relays that require an opt-in (OpenRouter, Requesty) receive +* Relays that require an opt-in (OpenRouter) receive ``extra_body={"reasoning": {"effort": ...}}``. * ChatOpenAI-compatible providers receive a top-level ``reasoning_effort``. Its ``gpt-5.6-*`` models reject function tools on ``/v1/chat/completions`` without one:: @@ -478,7 +478,7 @@ class TestAnthropicNativeProvider: class TestRelayOptIn: - """OpenRouter/Requesty keep the pre-existing extra_body opt-in.""" + """OpenRouter keeps the pre-existing extra_body opt-in.""" def test_openrouter_keeps_extra_body_and_no_top_level_field(self) -> None: kwargs = _capture_kwargs( @@ -495,21 +495,6 @@ class TestRelayOptIn: assert kwargs["extra_body"] == {"reasoning": {"effort": "high"}} assert kwargs["reasoning_effort"] is None - def test_requesty_keeps_extra_body_and_no_top_level_field(self) -> None: - kwargs = _capture_kwargs( - { - "LANGCHAIN_PROVIDER": "requesty", - "REQUESTY_API_KEY": "rq-test", - "REQUESTY_BASE_URL": "https://router.requesty.ai/v1", - "LANGCHAIN_MODEL_NAME": "openai/gpt-4o-mini", - "LANGCHAIN_REASONING_EFFORT": "medium", - "LANGCHAIN_USE_RESPONSES_API": "false", - } - ) - - assert kwargs["extra_body"] == {"reasoning": {"effort": "medium"}} - assert kwargs["reasoning_effort"] is None - class TestRequestPayload: """The kwarg has to survive as a top-level chat-completions request field. diff --git a/agent/tests/test_provider_diagnostics.py b/agent/tests/test_provider_diagnostics.py index b055d697..a6210471 100644 --- a/agent/tests/test_provider_diagnostics.py +++ b/agent/tests/test_provider_diagnostics.py @@ -66,18 +66,6 @@ def test_provider_capabilities_are_provider_specific() -> None: assert openrouter.send_reasoning_content is False -def test_requesty_capabilities_mirror_openrouter() -> None: - """Requesty is an OpenAI-compatible gateway wired like OpenRouter.""" - requesty = get_provider_capabilities("requesty", "openai/gpt-4o-mini") - - assert requesty.name == "requesty" - assert requesty.api_key_env == "REQUESTY_API_KEY" - assert requesty.base_url_env == "REQUESTY_BASE_URL" - assert requesty.capture_reasoning is True - assert requesty.openrouter_reasoning_body is True - assert requesty.send_reasoning_content is False - - def test_spark_capabilities_use_generic_openai_path() -> None: """iFlytek Spark rides the plain OpenAI-compatible path; iflytek is an alias.""" spark = get_provider_capabilities("spark", "4.0Ultra") diff --git a/desktop/electron/src/secure-credentials.ts b/desktop/electron/src/secure-credentials.ts index 283c9004..acf2792b 100644 --- a/desktop/electron/src/secure-credentials.ts +++ b/desktop/electron/src/secure-credentials.ts @@ -11,7 +11,6 @@ type CredentialFile = { const ENV_CREDENTIALS = new Set([ "OPENROUTER_API_KEY", - "REQUESTY_API_KEY", "OPENAI_API_KEY", "ANTHROPIC_API_KEY", "DEEPSEEK_API_KEY",