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=<the
Requesty key>. Past news and contributor credits in the READMEs are left
as history; the supported-provider lists drop it.
This commit is contained in:
Haozhe Wu committed 2026-09-21 20:35:37 +08:00
1 parent 61972397b4
commit 051aeb5509
19 files changed
+13 -91

No files matched your search

+1 -1
View File
@@ -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.
+1 -1
View File
@@ -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 احتياطياً أوسع تغطية.
+1 -1
View File
@@ -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.
+1 -1
View File
@@ -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.
+1 -1
View File
@@ -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 がより広いカバレッジのバックアップになります。
+1 -1
View File
@@ -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는 더 넓은 커버리지의 백업입니다.
+1 -1
View File
@@ -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 作为覆盖更广的兜底。
-8
View File
@@ -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
-14
View File
@@ -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",
-6
View File
@@ -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-",
+1 -11
View File
@@ -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("_", "-")
+2 -2
View File
@@ -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
-9
View File
@@ -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",
-1
View File
@@ -43,7 +43,6 @@ _PUBLIC_PROVIDERS = frozenset(
"opencode-zen",
"openrouter",
"qwen",
"requesty",
"siliconflow-cn",
"siliconflow-global",
"spark",
+1 -2
View File
@@ -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.
@@ -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",
+2 -17
View File
@@ -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.
-12
View File
@@ -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")
@@ -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",