This commit is contained in:
Deleted user 2026-05-27 11:22:20 +08:00 committed by GitHub
commit b242aef9d7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
22 changed files with 203 additions and 18 deletions

View file

@ -206,6 +206,7 @@ const openRouterSchema = baseProviderSettingsSchema.extend({
openRouterModelId: z.string().optional(),
openRouterBaseUrl: z.string().optional(),
openRouterSpecificProvider: z.string().optional(),
openRouterExcludeLowQuantization: z.boolean().optional(),
})
const bedrockSchema = apiModelIdProviderModelSchema.extend({

View file

@ -566,4 +566,77 @@ describe("OpenRouterHandler", () => {
)
})
})
describe("buildProviderOptions", () => {
it("returns undefined when no specific provider and no quantization filter", () => {
const handler = new OpenRouterHandler({
openRouterApiKey: "test-key",
openRouterModelId: "anthropic/claude-sonnet-4",
})
const result = (handler as any).buildProviderOptions()
expect(result).toBeUndefined()
})
it("returns provider routing when specific provider is set", () => {
const handler = new OpenRouterHandler({
openRouterApiKey: "test-key",
openRouterModelId: "anthropic/claude-sonnet-4",
openRouterSpecificProvider: "Anthropic",
})
const result = (handler as any).buildProviderOptions()
expect(result).toEqual({
order: ["Anthropic"],
only: ["Anthropic"],
allow_fallbacks: false,
})
})
it("returns quantizations when excludeLowQuantization is enabled", () => {
const handler = new OpenRouterHandler({
openRouterApiKey: "test-key",
openRouterModelId: "anthropic/claude-sonnet-4",
openRouterExcludeLowQuantization: true,
})
const result = (handler as any).buildProviderOptions()
expect(result).toEqual({
quantizations: ["fp16", "bf16", "fp8", "int8"],
})
})
it("combines specific provider and quantization filter", () => {
const handler = new OpenRouterHandler({
openRouterApiKey: "test-key",
openRouterModelId: "anthropic/claude-sonnet-4",
openRouterSpecificProvider: "Anthropic",
openRouterExcludeLowQuantization: true,
})
const result = (handler as any).buildProviderOptions()
expect(result).toEqual({
order: ["Anthropic"],
only: ["Anthropic"],
allow_fallbacks: false,
quantizations: ["fp16", "bf16", "fp8", "int8"],
})
})
it("returns undefined when specific provider is the default", () => {
const handler = new OpenRouterHandler({
openRouterApiKey: "test-key",
openRouterModelId: "anthropic/claude-sonnet-4",
openRouterSpecificProvider: "[default]",
})
const result = (handler as any).buildProviderOptions()
expect(result).toBeUndefined()
})
it("returns undefined when excludeLowQuantization is false", () => {
const handler = new OpenRouterHandler({
openRouterApiKey: "test-key",
openRouterModelId: "anthropic/claude-sonnet-4",
openRouterExcludeLowQuantization: false,
})
const result = (handler as any).buildProviderOptions()
expect(result).toBeUndefined()
})
})
})

View file

@ -300,6 +300,7 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH
}
// https://openrouter.ai/docs/transforms
const providerOptions = this.buildProviderOptions()
const completionParams: OpenRouterChatCompletionParams = {
model: modelId,
...(maxTokens && maxTokens > 0 && { max_tokens: maxTokens }),
@ -308,15 +309,7 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH
messages: openAiMessages,
stream: true,
stream_options: { include_usage: true },
// Only include provider if openRouterSpecificProvider is not "[default]".
...(this.options.openRouterSpecificProvider &&
this.options.openRouterSpecificProvider !== OPENROUTER_DEFAULT_PROVIDER_NAME && {
provider: {
order: [this.options.openRouterSpecificProvider],
only: [this.options.openRouterSpecificProvider],
allow_fallbacks: false,
},
}),
...(providerOptions && { provider: providerOptions }),
...(reasoning && { reasoning }),
tools: this.convertToolsForOpenAI(metadata?.tools),
tool_choice: metadata?.tool_choice,
@ -537,24 +530,58 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH
return { id, info, topP: isDeepSeekR1 ? 0.95 : undefined, ...params }
}
/**
* Build the `provider` options object for OpenRouter requests.
* Combines specific provider routing and quantization filtering.
*/
private buildProviderOptions():
| {
order?: string[]
only?: string[]
allow_fallbacks?: boolean
quantizations?: string[]
}
| undefined {
const hasSpecificProvider =
this.options.openRouterSpecificProvider &&
this.options.openRouterSpecificProvider !== OPENROUTER_DEFAULT_PROVIDER_NAME
const excludeLowQuantization = this.options.openRouterExcludeLowQuantization
if (!hasSpecificProvider && !excludeLowQuantization) {
return undefined
}
const provider: {
order?: string[]
only?: string[]
allow_fallbacks?: boolean
quantizations?: string[]
} = {}
if (hasSpecificProvider) {
provider.order = [this.options.openRouterSpecificProvider!]
provider.only = [this.options.openRouterSpecificProvider!]
provider.allow_fallbacks = false
}
if (excludeLowQuantization) {
provider.quantizations = ["fp16", "bf16", "fp8", "int8"]
}
return provider
}
async completePrompt(prompt: string) {
let { id: modelId, maxTokens, temperature, reasoning } = await this.fetchModel()
const providerOptions = this.buildProviderOptions()
const completionParams: OpenRouterChatCompletionParams = {
model: modelId,
max_tokens: maxTokens,
temperature,
messages: [{ role: "user", content: prompt }],
stream: false,
// Only include provider if openRouterSpecificProvider is not "[default]".
...(this.options.openRouterSpecificProvider &&
this.options.openRouterSpecificProvider !== OPENROUTER_DEFAULT_PROVIDER_NAME && {
provider: {
order: [this.options.openRouterSpecificProvider],
only: [this.options.openRouterSpecificProvider],
allow_fallbacks: false,
},
}),
...(providerOptions && { provider: providerOptions }),
...(reasoning && { reasoning }),
}

View file

@ -103,6 +103,18 @@ export const OpenRouter = ({
)}
</div>
)}
<div>
<Checkbox
checked={apiConfiguration?.openRouterExcludeLowQuantization ?? false}
onChange={(checked: boolean) => {
setApiConfigurationField("openRouterExcludeLowQuantization", checked)
}}>
{t("settings:providers.openRouter.excludeLowQuantization.label")}
</Checkbox>
<div className="text-sm text-vscode-descriptionForeground mt-1 ml-6">
{t("settings:providers.openRouter.excludeLowQuantization.description")}
</div>
</div>
<ModelPicker
apiConfiguration={apiConfiguration}
setApiConfigurationField={setApiConfigurationField}

View file

@ -468,6 +468,10 @@
"title": "Encaminament de Proveïdors d'OpenRouter",
"description": "OpenRouter dirigeix les sol·licituds als millors proveïdors disponibles per al vostre model. Per defecte, les sol·licituds s'equilibren entre els principals proveïdors per maximitzar el temps de funcionament. No obstant això, podeu triar un proveïdor específic per utilitzar amb aquest model.",
"learnMore": "Més informació sobre l'encaminament de proveïdors"
},
"excludeLowQuantization": {
"label": "Excloure la quantització de baixa precisió (FP4/FP6/Int4)",
"description": "Permet només proveïdors d'alta precisió (FP8/FP16/BF16/Int8). Ajuda a prevenir problemes de codificació CJK (coreà/xinès/japonès) amb models agressivament quantitzats."
}
},
"customModel": {

View file

@ -468,6 +468,10 @@
"title": "OpenRouter Anbieter-Routing",
"description": "OpenRouter leitet Anfragen an die besten verfügbaren Anbieter für dein Modell weiter. Standardmäßig werden Anfragen über die Top-Anbieter lastverteilt, um maximale Verfügbarkeit zu gewährleisten. Du kannst jedoch einen bestimmten Anbieter für dieses Modell auswählen.",
"learnMore": "Mehr über Anbieter-Routing erfahren"
},
"excludeLowQuantization": {
"label": "Niedrigbit-Quantisierung ausschließen (FP4/FP6/Int4)",
"description": "Nur Anbieter mit höherer Präzision erlauben (FP8/FP16/BF16/Int8). Hilft, fehlerhafte CJK-Kodierung (Koreanisch/Chinesisch/Japanisch) durch aggressiv quantisierte Modelle zu vermeiden."
}
},
"customModel": {

View file

@ -530,6 +530,10 @@
"title": "OpenRouter Provider Routing",
"description": "OpenRouter routes requests to the best available providers for your model. By default, requests are load balanced across the top providers to maximize uptime. However, you can choose a specific provider to use for this model.",
"learnMore": "Learn more about provider routing"
},
"excludeLowQuantization": {
"label": "Exclude low-bit quantization (FP4/FP6/Int4)",
"description": "Only allow higher precision providers (FP8/FP16/BF16/Int8). Helps prevent broken CJK (Korean/Chinese/Japanese) encoding from aggressively quantized models."
}
},
"customModel": {

View file

@ -468,6 +468,10 @@
"title": "Enrutamiento de Proveedores de OpenRouter",
"description": "OpenRouter dirige las solicitudes a los mejores proveedores disponibles para su modelo. Por defecto, las solicitudes se equilibran entre los principales proveedores para maximizar el tiempo de actividad. Sin embargo, puede elegir un proveedor específico para este modelo.",
"learnMore": "Más información sobre el enrutamiento de proveedores"
},
"excludeLowQuantization": {
"label": "Excluir cuantización de baja precisión (FP4/FP6/Int4)",
"description": "Solo permitir proveedores de mayor precisión (FP8/FP16/BF16/Int8). Ayuda a prevenir problemas de codificación CJK (coreano/chino/japonés) con modelos agresivamente cuantizados."
}
},
"customModel": {

View file

@ -468,6 +468,10 @@
"title": "Routage des fournisseurs OpenRouter",
"description": "OpenRouter dirige les requêtes vers les meilleurs fournisseurs disponibles pour votre modèle. Par défaut, les requêtes sont équilibrées entre les principaux fournisseurs pour maximiser la disponibilité. Cependant, vous pouvez choisir un fournisseur spécifique à utiliser pour ce modèle.",
"learnMore": "En savoir plus sur le routage des fournisseurs"
},
"excludeLowQuantization": {
"label": "Exclure la quantification basse précision (FP4/FP6/Int4)",
"description": "N'autoriser que les fournisseurs de haute précision (FP8/FP16/BF16/Int8). Aide à prévenir les problèmes d'encodage CJK (coréen/chinois/japonais) avec les modèles agressivement quantifiés."
}
},
"customModel": {

View file

@ -468,6 +468,10 @@
"title": "OpenRouter प्रदाता रूटिंग",
"description": "OpenRouter आपके मॉडल के लिए सर्वोत्तम उपलब्ध प्रदाताओं को अनुरोध भेजता है। डिफ़ॉल्ट रूप से, अपटाइम को अधिकतम करने के लिए अनुरोधों को शीर्ष प्रदाताओं के बीच संतुलित किया जाता है। हालांकि, आप इस मॉडल के लिए उपयोग करने के लिए एक विशिष्ट प्रदाता चुन सकते हैं।",
"learnMore": "प्रदाता रूटिंग के बारे में अधिक जानें"
},
"excludeLowQuantization": {
"label": "कम-बिट क्वांटाइज़ेशन बाहर करें (FP4/FP6/Int4)",
"description": "केवल उच्च परिशुद्धता प्रदाताओं को अनुमति दें (FP8/FP16/BF16/Int8)। आक्रामक रूप से क्वांटाइज़ किए गए मॉडलों से टूटी हुई CJK (कोरियाई/चीनी/जापानी) एन्कोडिंग को रोकने में मदद करता है।"
}
},
"customModel": {

View file

@ -468,6 +468,10 @@
"title": "OpenRouter Provider Routing",
"description": "OpenRouter mengarahkan permintaan ke provider terbaik yang tersedia untuk model kamu. Secara default, permintaan diseimbangkan beban di seluruh provider teratas untuk memaksimalkan uptime. Namun, kamu dapat memilih provider spesifik untuk digunakan untuk model ini.",
"learnMore": "Pelajari lebih lanjut tentang provider routing"
},
"excludeLowQuantization": {
"label": "Kecualikan kuantisasi bit rendah (FP4/FP6/Int4)",
"description": "Hanya izinkan penyedia presisi tinggi (FP8/FP16/BF16/Int8). Membantu mencegah masalah encoding CJK (Korea/Cina/Jepang) dari model yang dikuantisasi secara agresif."
}
},
"customModel": {

View file

@ -468,6 +468,10 @@
"title": "Routing dei fornitori OpenRouter",
"description": "OpenRouter indirizza le richieste ai migliori fornitori disponibili per il tuo modello. Per impostazione predefinita, le richieste sono bilanciate tra i principali fornitori per massimizzare il tempo di attività. Tuttavia, puoi scegliere un fornitore specifico da utilizzare per questo modello.",
"learnMore": "Scopri di più sul routing dei fornitori"
},
"excludeLowQuantization": {
"label": "Escludi quantizzazione a bassa precisione (FP4/FP6/Int4)",
"description": "Consenti solo fornitori ad alta precisione (FP8/FP16/BF16/Int8). Aiuta a prevenire problemi di codifica CJK (coreano/cinese/giapponese) con modelli quantizzati aggressivamente."
}
},
"customModel": {

View file

@ -468,6 +468,10 @@
"title": "OpenRouterプロバイダールーティング",
"description": "OpenRouterはあなたのモデルに最適な利用可能なプロバイダーにリクエストを転送します。デフォルトでは、稼働時間を最大化するために、リクエストはトッププロバイダー間でロードバランスされます。ただし、このモデルに使用する特定のプロバイダーを選択することもできます。",
"learnMore": "プロバイダールーティングについて詳しく知る"
},
"excludeLowQuantization": {
"label": "低ビット量子化を除外する (FP4/FP6/Int4)",
"description": "高精度プロバイダーのみを許可します (FP8/FP16/BF16/Int8)。積極的に量子化されたモデルによるCJK韓国語/中国語/日本語)エンコーディングの問題を防ぎます。"
}
},
"customModel": {

View file

@ -468,6 +468,10 @@
"title": "OpenRouter 제공자 라우팅",
"description": "OpenRouter는 귀하의 모델에 가장 적합한 사용 가능한 제공자에게 요청을 전달합니다. 기본적으로 요청은 가동 시간을 최대화하기 위해 상위 제공자 간에 부하 분산됩니다. 그러나 이 모델에 사용할 특정 제공자를 선택할 수 있습니다.",
"learnMore": "제공자 라우팅에 대해 자세히 알아보기"
},
"excludeLowQuantization": {
"label": "저비트 양자화 제외 (FP4/FP6/Int4)",
"description": "고정밀 제공자만 허용합니다 (FP8/FP16/BF16/Int8). 과도하게 양자화된 모델로 인한 CJK (한국어/중국어/일본어) 인코딩 오류를 방지하는 데 도움이 됩니다."
}
},
"customModel": {

View file

@ -468,6 +468,10 @@
"title": "OpenRouter-providerroutering",
"description": "OpenRouter stuurt verzoeken naar de best beschikbare providers voor je model. Standaard worden verzoeken gebalanceerd over de beste providers voor maximale uptime. Je kunt echter een specifieke provider kiezen voor dit model.",
"learnMore": "Meer informatie over providerroutering"
},
"excludeLowQuantization": {
"label": "Lagebit-kwantisatie uitsluiten (FP4/FP6/Int4)",
"description": "Sta alleen hogere-precisieproviders toe (FP8/FP16/BF16/Int8). Helpt problemen met CJK-codering (Koreaans/Chinees/Japans) door agressief gekwantiseerde modellen te voorkomen."
}
},
"customModel": {

View file

@ -468,6 +468,10 @@
"title": "Routing dostawców OpenRouter",
"description": "OpenRouter kieruje żądania do najlepszych dostępnych dostawców dla Twojego modelu. Domyślnie żądania są równoważone między najlepszymi dostawcami, aby zmaksymalizować czas działania. Możesz jednak wybrać konkretnego dostawcę do użycia z tym modelem.",
"learnMore": "Dowiedz się więcej o routingu dostawców"
},
"excludeLowQuantization": {
"label": "Wyklucz kwantyzację niskich bitów (FP4/FP6/Int4)",
"description": "Zezwalaj tylko na dostawców o wyższej precyzji (FP8/FP16/BF16/Int8). Pomaga zapobiegać problemom z kodowaniem CJK (koreański/chiński/japoński) w agresywnie skwantyzowanych modelach."
}
},
"customModel": {

View file

@ -468,6 +468,10 @@
"title": "Roteamento de Provedores OpenRouter",
"description": "OpenRouter direciona solicitações para os melhores provedores disponíveis para seu modelo. Por padrão, as solicitações são balanceadas entre os principais provedores para maximizar o tempo de atividade. No entanto, você pode escolher um provedor específico para usar com este modelo.",
"learnMore": "Saiba mais sobre roteamento de provedores"
},
"excludeLowQuantization": {
"label": "Excluir quantização de baixa precisão (FP4/FP6/Int4)",
"description": "Permitir apenas provedores de maior precisão (FP8/FP16/BF16/Int8). Ajuda a prevenir problemas de codificação CJK (coreano/chinês/japonês) em modelos quantizados agressivamente."
}
},
"customModel": {

View file

@ -468,6 +468,10 @@
"title": "Маршрутизация провайдера OpenRouter",
"description": "OpenRouter направляет запросы к лучшим доступным провайдерам для вашей модели. По умолчанию запросы балансируются между топовыми провайдерами для максимальной доступности. Однако вы можете выбрать конкретного провайдера для этой модели.",
"learnMore": "Подробнее о маршрутизации провайдеров"
},
"excludeLowQuantization": {
"label": "Исключить низкобитовую квантизацию (FP4/FP6/Int4)",
"description": "Разрешить только провайдеров с высокой точностью (FP8/FP16/BF16/Int8). Помогает предотвратить проблемы с кодировкой CJK (корейский/китайский/японский) при использовании агрессивно квантизированных моделей."
}
},
"customModel": {

View file

@ -468,6 +468,10 @@
"title": "OpenRouter Sağlayıcı Yönlendirmesi",
"description": "OpenRouter, modeliniz için mevcut en iyi sağlayıcılara istekleri yönlendirir. Varsayılan olarak, istekler çalışma süresini en üst düzeye çıkarmak için en iyi sağlayıcılar arasında dengelenir. Ancak, bu model için kullanılacak belirli bir sağlayıcı seçebilirsiniz.",
"learnMore": "Sağlayıcı yönlendirmesi hakkında daha fazla bilgi edinin"
},
"excludeLowQuantization": {
"label": "Düşük bit kuantalamayı hariç tut (FP4/FP6/Int4)",
"description": "Yalnızca yüksek hassasiyetli sağlayıcılara izin ver (FP8/FP16/BF16/Int8). Agresif şekilde kuantalanmış modellerden kaynaklanan CJK (Korece/Çince/Japonca) kodlama sorunlarını önlemeye yardımcı olur."
}
},
"customModel": {

View file

@ -468,6 +468,10 @@
"title": "Định tuyến nhà cung cấp OpenRouter",
"description": "OpenRouter chuyển hướng yêu cầu đến các nhà cung cấp tốt nhất hiện có cho mô hình của bạn. Theo mặc định, các yêu cầu được cân bằng giữa các nhà cung cấp hàng đầu để tối đa hóa thời gian hoạt động. Tuy nhiên, bạn có thể chọn một nhà cung cấp cụ thể để sử dụng cho mô hình này.",
"learnMore": "Tìm hiểu thêm về định tuyến nhà cung cấp"
},
"excludeLowQuantization": {
"label": "Loại trừ lượng tử hóa bit thấp (FP4/FP6/Int4)",
"description": "Chỉ cho phép các nhà cung cấp có độ chính xác cao (FP8/FP16/BF16/Int8). Giúp ngăn ngừa lỗi mã hóa CJK (Hàn Quốc/Trung Quốc/Nhật Bản) từ các mô hình được lượng tử hóa mạnh."
}
},
"customModel": {

View file

@ -468,6 +468,10 @@
"title": "OpenRouter 提供商路由",
"description": "OpenRouter 将请求路由到适合您模型的最佳可用提供商。默认情况下,请求会在顶级提供商之间进行负载均衡以最大化正常运行时间。但是,您可以为此模型选择特定的提供商。",
"learnMore": "了解更多"
},
"excludeLowQuantization": {
"label": "排除低位量化 (FP4/FP6/Int4)",
"description": "仅允许高精度提供商 (FP8/FP16/BF16/Int8)。有助于防止激进量化模型导致的 CJK韩文/中文/日文)编码问题。"
}
},
"customModel": {

View file

@ -478,6 +478,10 @@
"title": "OpenRouter 供應商路由",
"description": "OpenRouter 會將請求路由到適合您模型的最佳可用供應商。預設情況下,請求會在頂尖供應商之間進行負載平衡以最大化正常運作時間。您也可以為此模型選擇特定的供應商。",
"learnMore": "了解更多關於供應商路由的資訊"
},
"excludeLowQuantization": {
"label": "排除低位元量化 (FP4/FP6/Int4)",
"description": "僅允許高精度供應商 (FP8/FP16/BF16/Int8)。有助於防止激進量化模型導致的 CJK韓文/中文/日文)編碼問題。"
}
},
"customModel": {