diff --git a/packages/types/src/codebase-index.ts b/packages/types/src/codebase-index.ts index 61009ba301..d9170115bb 100644 --- a/packages/types/src/codebase-index.ts +++ b/packages/types/src/codebase-index.ts @@ -49,6 +49,7 @@ export const codebaseIndexConfigSchema = z.object({ codebaseIndexBedrockRegion: z.string().optional(), codebaseIndexBedrockProfile: z.string().optional(), // OpenRouter specific fields + codebaseIndexOpenRouterEmbedderBaseUrl: z.string().optional(), codebaseIndexOpenRouterSpecificProvider: z.string().optional(), }) diff --git a/packages/types/src/provider-settings.ts b/packages/types/src/provider-settings.ts index 95fbcf10c9..6678a486bb 100644 --- a/packages/types/src/provider-settings.ts +++ b/packages/types/src/provider-settings.ts @@ -205,7 +205,6 @@ const claudeCodeSchema = apiModelIdProviderModelSchema.extend({}) const openRouterSchema = baseProviderSettingsSchema.extend({ openRouterApiKey: z.string().optional(), openRouterModelId: z.string().optional(), - openRouterBaseUrl: z.string().optional(), openRouterSpecificProvider: z.string().optional(), }) diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index d19a6b6ea6..69cc824ef6 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -2046,6 +2046,7 @@ export class ClineProvider codebaseIndexBedrockRegion: codebaseIndexConfig?.codebaseIndexBedrockRegion, codebaseIndexBedrockProfile: codebaseIndexConfig?.codebaseIndexBedrockProfile, codebaseIndexOpenRouterSpecificProvider: codebaseIndexConfig?.codebaseIndexOpenRouterSpecificProvider, + codebaseIndexOpenRouterEmbedderBaseUrl: codebaseIndexConfig?.codebaseIndexOpenRouterEmbedderBaseUrl, }, // Only set mdmCompliant if there's an actual MDM policy // undefined means no MDM policy, true means compliant, false means non-compliant @@ -2292,6 +2293,8 @@ export class ClineProvider codebaseIndexSearchMinScore: stateValues.codebaseIndexConfig?.codebaseIndexSearchMinScore, codebaseIndexBedrockRegion: stateValues.codebaseIndexConfig?.codebaseIndexBedrockRegion, codebaseIndexBedrockProfile: stateValues.codebaseIndexConfig?.codebaseIndexBedrockProfile, + codebaseIndexOpenRouterEmbedderBaseUrl: + stateValues.codebaseIndexConfig?.codebaseIndexOpenRouterEmbedderBaseUrl, codebaseIndexOpenRouterSpecificProvider: stateValues.codebaseIndexConfig?.codebaseIndexOpenRouterSpecificProvider, }, diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 52ec814655..6d89cd21ad 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -2451,6 +2451,7 @@ export const webviewMessageHandler = async ( codebaseIndexSearchMaxResults: settings.codebaseIndexSearchMaxResults, codebaseIndexSearchMinScore: settings.codebaseIndexSearchMinScore, codebaseIndexOpenRouterSpecificProvider: settings.codebaseIndexOpenRouterSpecificProvider, + codebaseIndexOpenRouterEmbedderBaseUrl: settings.codebaseIndexOpenRouterEmbedderBaseUrl, } // Save global state first diff --git a/src/services/code-index/config-manager.ts b/src/services/code-index/config-manager.ts index b77d09d4cc..21ef7a3074 100644 --- a/src/services/code-index/config-manager.ts +++ b/src/services/code-index/config-manager.ts @@ -78,6 +78,7 @@ export class CodeIndexConfigManager { const bedrockRegion = codebaseIndexConfig.codebaseIndexBedrockRegion ?? "us-east-1" const bedrockProfile = codebaseIndexConfig.codebaseIndexBedrockProfile ?? "" const openRouterApiKey = this.contextProxy?.getSecret("codebaseIndexOpenRouterApiKey") ?? "" + const openRouterEmbedderBaseUrl = codebaseIndexConfig.codebaseIndexOpenRouterEmbedderBaseUrl ?? "" const openRouterSpecificProvider = codebaseIndexConfig.codebaseIndexOpenRouterSpecificProvider ?? "" // Update instance variables with configuration @@ -144,7 +145,7 @@ export class CodeIndexConfigManager { this.openRouterOptions = openRouterApiKey ? { apiKey: openRouterApiKey, - openRouterBaseUrl: codebaseIndexEmbedderBaseUrl, + openRouterBaseUrl: openRouterEmbedderBaseUrl, specificProvider: openRouterSpecificProvider || undefined, } : undefined @@ -359,8 +360,8 @@ export class CodeIndexConfigManager { const currentBedrockRegion = this.bedrockOptions?.region ?? "" const currentBedrockProfile = this.bedrockOptions?.profile ?? "" const currentOpenRouterApiKey = this.openRouterOptions?.apiKey ?? "" - const currentOpenRouterSpecificProvider = this.openRouterOptions?.specificProvider ?? "" const currentOpenRouterBaseUrl = this.openRouterOptions?.openRouterBaseUrl ?? "" + const currentOpenRouterSpecificProvider = this.openRouterOptions?.specificProvider ?? "" const currentQdrantUrl = this.qdrantUrl ?? "" const currentQdrantApiKey = this.qdrantApiKey ?? "" diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index d96fbd871c..e95980d97c 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -255,6 +255,7 @@ export interface WebviewMessage { codebaseIndexBedrockProfile?: string codebaseIndexSearchMaxResults?: number codebaseIndexSearchMinScore?: number + codebaseIndexOpenRouterEmbedderBaseUrl?: string codebaseIndexOpenRouterSpecificProvider?: string // OpenRouter provider routing // Secret settings diff --git a/webview-ui/src/components/chat/CodeIndexPopover.tsx b/webview-ui/src/components/chat/CodeIndexPopover.tsx index 1a9ba4679c..678d413814 100644 --- a/webview-ui/src/components/chat/CodeIndexPopover.tsx +++ b/webview-ui/src/components/chat/CodeIndexPopover.tsx @@ -84,6 +84,7 @@ interface LocalCodeIndexSettings { codebaseIndexMistralApiKey?: string codebaseIndexVercelAiGatewayApiKey?: string codebaseIndexOpenRouterApiKey?: string + codebaseIndexOpenRouterEmbedderBaseUrl?: string codebaseIndexOpenRouterSpecificProvider?: string } @@ -228,6 +229,7 @@ export const CodeIndexPopover: React.FC = ({ codebaseIndexMistralApiKey: "", codebaseIndexVercelAiGatewayApiKey: "", codebaseIndexOpenRouterApiKey: "", + codebaseIndexOpenRouterEmbedderBaseUrl: "", codebaseIndexOpenRouterSpecificProvider: "", }) @@ -267,6 +269,8 @@ export const CodeIndexPopover: React.FC = ({ codebaseIndexMistralApiKey: "", codebaseIndexVercelAiGatewayApiKey: "", codebaseIndexOpenRouterApiKey: "", + codebaseIndexOpenRouterEmbedderBaseUrl: + codebaseIndexConfig.codebaseIndexOpenRouterEmbedderBaseUrl || "", codebaseIndexOpenRouterSpecificProvider: codebaseIndexConfig.codebaseIndexOpenRouterSpecificProvider || "", } @@ -1327,28 +1331,32 @@ export const CodeIndexPopover: React.FC = ({ {t("settings:codeIndex.openRouterBaseUrlLabel")} - updateSetting("codebaseIndexEmbedderBaseUrl", e.target.value) + updateSetting( + "codebaseIndexOpenRouterEmbedderBaseUrl", + e.target.value, + ) } onBlur={(e: any) => { // Set default OpenRouter URL if field is empty if (!e.target.value.trim()) { e.target.value = DEFAULT_OPENROUTER_URL updateSetting( - "codebaseIndexEmbedderBaseUrl", + "codebaseIndexOpenRouterEmbedderBaseUrl", DEFAULT_OPENROUTER_URL, ) } }} - placeholder={t("settings:codeIndex.openRouterUrlPlaceholder")} + placeholder={t("settings:codeIndex.openRouterBaseUrlPlaceholder")} className={cn("w-full", { - "border-red-500": formErrors.codebaseIndexEmbedderBaseUrl, + "border-red-500": + formErrors.codebaseIndexOpenRouterEmbedderBaseUrl, })} /> - {formErrors.codebaseIndexEmbedderBaseUrl && ( + {formErrors.codebaseIndexOpenRouterEmbedderBaseUrl && (

- {formErrors.codebaseIndexEmbedderBaseUrl} + {formErrors.codebaseIndexOpenRouterEmbedderBaseUrl}

)} diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 6189378d1e..b47d9746e2 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -107,7 +107,7 @@ "openRouterProviderRoutingLabel": "OpenRouter Provider Routing", "openRouterProviderRoutingDescription": "OpenRouter routes requests to the best available providers for your embedding 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.", "openRouterBaseUrlLabel": "OpenRouter Base URL", - "openRouterUrlPlaceholder": "https://openrouter.ai/api/v1", + "openRouterBaseUrlPlaceholder": "https://openrouter.ai/api/v1", "openaiCompatibleProvider": "OpenAI Compatible", "openAiKeyLabel": "OpenAI API Key", "openAiKeyPlaceholder": "Enter your OpenAI API key",