From cd52c1887a8dbe40cb9502718dce5f6b234672ae Mon Sep 17 00:00:00 2001 From: Daniel Riccio Date: Tue, 8 Jul 2025 17:23:13 -0500 Subject: [PATCH 1/3] feat: move codebase indexing out of experimental - Remove codebase indexing checkbox from experimental settings - Set codebase indexing enabled by default (true) - Update all default values and tests to reflect always-enabled state - Remove message handler for toggling codebase index setting --- src/core/webview/ClineProvider.ts | 4 +- .../webview/__tests__/ClineProvider.spec.ts | 2 +- src/core/webview/webviewMessageHandler.ts | 15 ------- .../__tests__/config-manager.spec.ts | 33 +++++++-------- src/services/code-index/config-manager.ts | 6 +-- .../src/components/chat/CodeIndexPopover.tsx | 4 +- .../settings/ExperimentalSettings.tsx | 42 +------------------ .../src/components/settings/SettingsView.tsx | 14 +------ .../src/context/ExtensionStateContext.tsx | 2 +- 9 files changed, 27 insertions(+), 95 deletions(-) diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 8eb2e70a8c..fa1d8971d1 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -1510,7 +1510,7 @@ export class ClineProvider customCondensingPrompt, codebaseIndexModels: codebaseIndexModels ?? EMBEDDING_MODEL_PROFILES, codebaseIndexConfig: codebaseIndexConfig ?? { - codebaseIndexEnabled: false, + codebaseIndexEnabled: true, codebaseIndexQdrantUrl: "http://localhost:6333", codebaseIndexEmbedderProvider: "openai", codebaseIndexEmbedderBaseUrl: "", @@ -1668,7 +1668,7 @@ export class ClineProvider customCondensingPrompt: stateValues.customCondensingPrompt, codebaseIndexModels: stateValues.codebaseIndexModels ?? EMBEDDING_MODEL_PROFILES, codebaseIndexConfig: stateValues.codebaseIndexConfig ?? { - codebaseIndexEnabled: false, + codebaseIndexEnabled: true, codebaseIndexQdrantUrl: "http://localhost:6333", codebaseIndexEmbedderProvider: "openai", codebaseIndexEmbedderBaseUrl: "", diff --git a/src/core/webview/__tests__/ClineProvider.spec.ts b/src/core/webview/__tests__/ClineProvider.spec.ts index 8c60467b55..19c9a7c9fc 100644 --- a/src/core/webview/__tests__/ClineProvider.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.spec.ts @@ -501,7 +501,7 @@ describe("ClineProvider", () => { alwaysAllowReadOnlyOutsideWorkspace: false, alwaysAllowWrite: false, codebaseIndexConfig: { - codebaseIndexEnabled: false, + codebaseIndexEnabled: true, codebaseIndexQdrantUrl: "", codebaseIndexEmbedderProvider: "openai", codebaseIndexEmbedderBaseUrl: "", diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index e1971db79e..a6577fb2fb 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -1221,21 +1221,6 @@ export const webviewMessageHandler = async ( break case "browserToolEnabled": await updateGlobalState("browserToolEnabled", message.bool ?? true) - await provider.postStateToWebview() - break - case "codebaseIndexEnabled": - // Update the codebaseIndexConfig with the new enabled state - const currentCodebaseConfig = getGlobalState("codebaseIndexConfig") || {} - await updateGlobalState("codebaseIndexConfig", { - ...currentCodebaseConfig, - codebaseIndexEnabled: message.bool ?? false, - }) - - // Notify the code index manager about the change - if (provider.codeIndexManager) { - await provider.codeIndexManager.handleSettingsChange() - } - await provider.postStateToWebview() break case "language": diff --git a/src/services/code-index/__tests__/config-manager.spec.ts b/src/services/code-index/__tests__/config-manager.spec.ts index 4571c9011a..78e3cdb377 100644 --- a/src/services/code-index/__tests__/config-manager.spec.ts +++ b/src/services/code-index/__tests__/config-manager.spec.ts @@ -32,7 +32,7 @@ describe("CodeIndexConfigManager", () => { describe("constructor", () => { it("should initialize with ContextProxy", () => { expect(configManager).toBeDefined() - expect(configManager.isFeatureEnabled).toBe(false) + expect(configManager.isFeatureEnabled).toBe(true) expect(configManager.currentEmbedderProvider).toBe("openai") }) }) @@ -45,7 +45,7 @@ describe("CodeIndexConfigManager", () => { const result = await configManager.loadConfiguration() expect(result.currentConfig).toEqual({ - isEnabled: false, + isEnabled: true, isConfigured: false, embedderProvider: "openai", modelId: undefined, @@ -326,14 +326,14 @@ describe("CodeIndexConfigManager", () => { }) it("should detect restart requirement when transitioning to enabled+configured", async () => { - // Initial state - disabled + // Initial state - enabled but not configured mockContextProxy.getGlobalState.mockReturnValue({ - codebaseIndexEnabled: false, + codebaseIndexEnabled: true, }) await configManager.loadConfiguration() - // Enable and configure + // Configure the feature mockContextProxy.getGlobalState.mockReturnValue({ codebaseIndexEnabled: true, codebaseIndexQdrantUrl: "http://qdrant.local", @@ -689,29 +689,28 @@ describe("CodeIndexConfigManager", () => { expect(result.requiresRestart).toBe(true) }) - it("should not require restart when disabled remains disabled", async () => { - // Initial state - disabled but configured + it("should require restart when enabled and provider changes even if unconfigured", async () => { + // Initial state - enabled but not configured (missing API key) mockContextProxy.getGlobalState.mockReturnValue({ - codebaseIndexEnabled: false, + codebaseIndexEnabled: true, codebaseIndexQdrantUrl: "http://qdrant.local", codebaseIndexEmbedderProvider: "openai", }) - setupSecretMocks({ - codeIndexOpenAiKey: "test-key", - }) + setupSecretMocks({}) await configManager.loadConfiguration() - // Still disabled but change other settings + // Still enabled but change provider while remaining unconfigured mockContextProxy.getGlobalState.mockReturnValue({ - codebaseIndexEnabled: false, - codebaseIndexQdrantUrl: "http://different-qdrant.local", + codebaseIndexEnabled: true, + codebaseIndexQdrantUrl: "http://qdrant.local", codebaseIndexEmbedderProvider: "ollama", codebaseIndexEmbedderBaseUrl: "http://ollama.local", }) const result = await configManager.loadConfiguration() - expect(result.requiresRestart).toBe(false) + // Should require restart because provider changed while enabled + expect(result.requiresRestart).toBe(true) }) it("should not require restart when unconfigured remains unconfigured", async () => { @@ -970,7 +969,7 @@ describe("CodeIndexConfigManager", () => { it("should not require restart when API keys transition from undefined to empty string", async () => { // Initial state with undefined API keys mockContextProxy.getGlobalState.mockReturnValue({ - codebaseIndexEnabled: false, // Start disabled to avoid restart due to enable+configure + codebaseIndexEnabled: true, // Always enabled now codebaseIndexQdrantUrl: "http://qdrant.local", codebaseIndexEmbedderProvider: "openai", }) @@ -1267,7 +1266,7 @@ describe("CodeIndexConfigManager", () => { it("should properly initialize with current config to prevent false restarts", async () => { // Setup configuration mockContextProxy.getGlobalState.mockReturnValue({ - codebaseIndexEnabled: false, // Start disabled to avoid transition restart + codebaseIndexEnabled: true, // Always enabled now codebaseIndexQdrantUrl: "http://qdrant.local", codebaseIndexEmbedderProvider: "openai", codebaseIndexEmbedderModelId: "text-embedding-3-small", diff --git a/src/services/code-index/config-manager.ts b/src/services/code-index/config-manager.ts index 8e2b8e082d..9c35709d63 100644 --- a/src/services/code-index/config-manager.ts +++ b/src/services/code-index/config-manager.ts @@ -42,7 +42,7 @@ export class CodeIndexConfigManager { private _loadAndSetConfiguration(): void { // Load configuration from storage const codebaseIndexConfig = this.contextProxy?.getGlobalState("codebaseIndexConfig") ?? { - codebaseIndexEnabled: false, + codebaseIndexEnabled: true, codebaseIndexQdrantUrl: "http://localhost:6333", codebaseIndexEmbedderProvider: "openai", codebaseIndexEmbedderBaseUrl: "", @@ -69,7 +69,7 @@ export class CodeIndexConfigManager { const geminiApiKey = this.contextProxy?.getSecret("codebaseIndexGeminiApiKey") ?? "" // Update instance variables with configuration - this.isEnabled = codebaseIndexEnabled || false + this.isEnabled = codebaseIndexEnabled ?? true this.qdrantUrl = codebaseIndexQdrantUrl this.qdrantApiKey = qdrantApiKey ?? "" this.searchMinScore = codebaseIndexSearchMinScore @@ -362,7 +362,7 @@ export class CodeIndexConfigManager { * Gets whether the code indexing feature is enabled */ public get isFeatureEnabled(): boolean { - return this.isEnabled + return true } /** diff --git a/webview-ui/src/components/chat/CodeIndexPopover.tsx b/webview-ui/src/components/chat/CodeIndexPopover.tsx index 7479115081..45a64957ed 100644 --- a/webview-ui/src/components/chat/CodeIndexPopover.tsx +++ b/webview-ui/src/components/chat/CodeIndexPopover.tsx @@ -81,7 +81,7 @@ export const CodeIndexPopover: React.FC = ({ // Default settings template const getDefaultSettings = (): LocalCodeIndexSettings => ({ - codebaseIndexEnabled: false, + codebaseIndexEnabled: true, codebaseIndexQdrantUrl: "", codebaseIndexEmbedderProvider: "openai", codebaseIndexEmbedderBaseUrl: "", @@ -111,7 +111,7 @@ export const CodeIndexPopover: React.FC = ({ useEffect(() => { if (codebaseIndexConfig) { const settings = { - codebaseIndexEnabled: codebaseIndexConfig.codebaseIndexEnabled || false, + codebaseIndexEnabled: codebaseIndexConfig.codebaseIndexEnabled ?? true, codebaseIndexQdrantUrl: codebaseIndexConfig.codebaseIndexQdrantUrl || "", codebaseIndexEmbedderProvider: codebaseIndexConfig.codebaseIndexEmbedderProvider || "openai", codebaseIndexEmbedderBaseUrl: codebaseIndexConfig.codebaseIndexEmbedderBaseUrl || "", diff --git a/webview-ui/src/components/settings/ExperimentalSettings.tsx b/webview-ui/src/components/settings/ExperimentalSettings.tsx index 958c7742fd..53801232ec 100644 --- a/webview-ui/src/components/settings/ExperimentalSettings.tsx +++ b/webview-ui/src/components/settings/ExperimentalSettings.tsx @@ -1,40 +1,26 @@ import { HTMLAttributes } from "react" import { FlaskConical } from "lucide-react" -import { VSCodeCheckbox, VSCodeLink } from "@vscode/webview-ui-toolkit/react" -import { Trans } from "react-i18next" -import type { Experiments, CodebaseIndexConfig, CodebaseIndexModels } from "@roo-code/types" +import type { Experiments } from "@roo-code/types" import { EXPERIMENT_IDS, experimentConfigsMap } from "@roo/experiments" import { useAppTranslation } from "@src/i18n/TranslationContext" import { cn } from "@src/lib/utils" -import { buildDocLink } from "@src/utils/docLinks" import { SetExperimentEnabled } from "./types" import { SectionHeader } from "./SectionHeader" import { Section } from "./Section" import { ExperimentalFeature } from "./ExperimentalFeature" -import { SetCachedStateField } from "./types" type ExperimentalSettingsProps = HTMLAttributes & { experiments: Experiments setExperimentEnabled: SetExperimentEnabled - // CodeIndexSettings props - codebaseIndexModels: CodebaseIndexModels | undefined - codebaseIndexConfig: CodebaseIndexConfig | undefined - // For codebase index enabled toggle - codebaseIndexEnabled?: boolean - setCachedStateField?: SetCachedStateField } export const ExperimentalSettings = ({ experiments, setExperimentEnabled, - codebaseIndexModels, - codebaseIndexConfig, - codebaseIndexEnabled, - setCachedStateField, className, ...props }: ExperimentalSettingsProps) => { @@ -79,32 +65,6 @@ export const ExperimentalSettings = ({ /> ) })} - - {/* Codebase Indexing Enable/Disable Toggle */} -
-
- { - const newEnabledState = e.target.checked - if (setCachedStateField && codebaseIndexConfig) { - setCachedStateField("codebaseIndexConfig", { - ...codebaseIndexConfig, - codebaseIndexEnabled: newEnabledState, - }) - } - }}> - {t("settings:codeIndex.enableLabel")} - -
-

- - - -

-
) diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index f64086859a..8550be1e1b 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -170,8 +170,6 @@ const SettingsView = forwardRef(({ onDone, t maxConcurrentFileReads, condensingApiConfigId, customCondensingPrompt, - codebaseIndexConfig, - codebaseIndexModels, customSupportPrompts, profileThresholds, alwaysAllowFollowupQuestions, @@ -322,9 +320,6 @@ const SettingsView = forwardRef(({ onDone, t vscode.postMessage({ type: "updateSupportPrompt", values: customSupportPrompts || {} }) vscode.postMessage({ type: "upsertApiConfiguration", text: currentApiConfigName, apiConfiguration }) vscode.postMessage({ type: "telemetrySetting", text: telemetrySetting }) - if (codebaseIndexConfig) { - vscode.postMessage({ type: "codebaseIndexEnabled", bool: codebaseIndexConfig.codebaseIndexEnabled }) - } vscode.postMessage({ type: "profileThresholds", values: profileThresholds }) setChangeDetected(false) } @@ -691,14 +686,7 @@ const SettingsView = forwardRef(({ onDone, t {/* Experimental Section */} {activeTab === "experimental" && ( - + )} {/* Language Section */} diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index df7cee5627..bf927211c2 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -214,7 +214,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode autoCondenseContextPercent: 100, profileThresholds: {}, codebaseIndexConfig: { - codebaseIndexEnabled: false, + codebaseIndexEnabled: true, codebaseIndexQdrantUrl: "http://localhost:6333", codebaseIndexEmbedderProvider: "openai", codebaseIndexEmbedderBaseUrl: "", From 3065ef006280cdd89729b227dff01ede6c493d96 Mon Sep 17 00:00:00 2001 From: Daniel Riccio Date: Tue, 8 Jul 2025 21:50:22 -0500 Subject: [PATCH 2/3] refactor: remove isEnabled property from code index configuration - Remove isEnabled property from CodeIndexConfig interface - Remove isEnabled field from config-manager.ts - Simplify restart detection logic since feature is always enabled - Update all tests to remove isEnabled references - Feature is now always enabled, configuration status is the only check needed --- .../__tests__/config-manager.spec.ts | 7 ------- .../code-index/__tests__/manager.spec.ts | 3 --- src/services/code-index/config-manager.ts | 21 +++++++------------ src/services/code-index/interfaces/config.ts | 1 - 4 files changed, 7 insertions(+), 25 deletions(-) diff --git a/src/services/code-index/__tests__/config-manager.spec.ts b/src/services/code-index/__tests__/config-manager.spec.ts index 78e3cdb377..641abfa306 100644 --- a/src/services/code-index/__tests__/config-manager.spec.ts +++ b/src/services/code-index/__tests__/config-manager.spec.ts @@ -45,7 +45,6 @@ describe("CodeIndexConfigManager", () => { const result = await configManager.loadConfiguration() expect(result.currentConfig).toEqual({ - isEnabled: true, isConfigured: false, embedderProvider: "openai", modelId: undefined, @@ -77,7 +76,6 @@ describe("CodeIndexConfigManager", () => { const result = await configManager.loadConfiguration() expect(result.currentConfig).toEqual({ - isEnabled: true, isConfigured: true, embedderProvider: "openai", modelId: "text-embedding-3-large", @@ -111,7 +109,6 @@ describe("CodeIndexConfigManager", () => { const result = await configManager.loadConfiguration() expect(result.currentConfig).toEqual({ - isEnabled: true, isConfigured: true, embedderProvider: "openai-compatible", modelId: "text-embedding-3-large", @@ -149,7 +146,6 @@ describe("CodeIndexConfigManager", () => { const result = await configManager.loadConfiguration() expect(result.currentConfig).toEqual({ - isEnabled: true, isConfigured: true, embedderProvider: "openai-compatible", modelId: "custom-model", @@ -188,7 +184,6 @@ describe("CodeIndexConfigManager", () => { const result = await configManager.loadConfiguration() expect(result.currentConfig).toEqual({ - isEnabled: true, isConfigured: true, embedderProvider: "openai-compatible", modelId: "custom-model", @@ -227,7 +222,6 @@ describe("CodeIndexConfigManager", () => { const result = await configManager.loadConfiguration() expect(result.currentConfig).toEqual({ - isEnabled: true, isConfigured: true, embedderProvider: "openai-compatible", modelId: "custom-model", @@ -1207,7 +1201,6 @@ describe("CodeIndexConfigManager", () => { it("should return correct configuration via getConfig", () => { const config = configManager.getConfig() expect(config).toEqual({ - isEnabled: true, isConfigured: true, embedderProvider: "openai", modelId: "text-embedding-3-large", diff --git a/src/services/code-index/__tests__/manager.spec.ts b/src/services/code-index/__tests__/manager.spec.ts index ae473e3870..82fa9f3c14 100644 --- a/src/services/code-index/__tests__/manager.spec.ts +++ b/src/services/code-index/__tests__/manager.spec.ts @@ -81,7 +81,6 @@ describe("CodeIndexManager - handleSettingsChange regression", () => { isFeatureConfigured: true, isFeatureEnabled: true, getConfig: vi.fn().mockReturnValue({ - isEnabled: true, isConfigured: true, embedderProvider: "openai", modelId: "text-embedding-3-small", @@ -149,7 +148,6 @@ describe("CodeIndexManager - handleSettingsChange regression", () => { isFeatureConfigured: true, isFeatureEnabled: true, getConfig: vi.fn().mockReturnValue({ - isEnabled: true, isConfigured: true, embedderProvider: "openai", modelId: "text-embedding-3-small", @@ -276,7 +274,6 @@ describe("CodeIndexManager - handleSettingsChange regression", () => { isFeatureConfigured: true, isFeatureEnabled: true, getConfig: vitest.fn().mockReturnValue({ - isEnabled: true, isConfigured: true, embedderProvider: "openai", modelId: "text-embedding-3-small", diff --git a/src/services/code-index/config-manager.ts b/src/services/code-index/config-manager.ts index 9c35709d63..22ef30d820 100644 --- a/src/services/code-index/config-manager.ts +++ b/src/services/code-index/config-manager.ts @@ -10,7 +10,6 @@ import { getDefaultModelId, getModelDimension, getModelScoreThreshold } from ".. * Handles loading, validating, and providing access to configuration values. */ export class CodeIndexConfigManager { - private isEnabled: boolean = false private embedderProvider: EmbedderProvider = "openai" private modelId?: string private modelDimension?: number @@ -69,7 +68,7 @@ export class CodeIndexConfigManager { const geminiApiKey = this.contextProxy?.getSecret("codebaseIndexGeminiApiKey") ?? "" // Update instance variables with configuration - this.isEnabled = codebaseIndexEnabled ?? true + // Note: codebaseIndexEnabled is no longer used as the feature is always enabled this.qdrantUrl = codebaseIndexQdrantUrl this.qdrantApiKey = qdrantApiKey ?? "" this.searchMinScore = codebaseIndexSearchMinScore @@ -127,7 +126,6 @@ export class CodeIndexConfigManager { public async loadConfiguration(): Promise<{ configSnapshot: PreviousConfigSnapshot currentConfig: { - isEnabled: boolean isConfigured: boolean embedderProvider: EmbedderProvider modelId?: string @@ -144,7 +142,7 @@ export class CodeIndexConfigManager { }> { // Capture the ACTUAL previous state before loading new configuration const previousConfigSnapshot: PreviousConfigSnapshot = { - enabled: this.isEnabled, + enabled: true, // Feature is always enabled configured: this.isConfigured(), embedderProvider: this.embedderProvider, modelId: this.modelId, @@ -169,7 +167,6 @@ export class CodeIndexConfigManager { return { configSnapshot: previousConfigSnapshot, currentConfig: { - isEnabled: this.isEnabled, isConfigured: this.isConfigured(), embedderProvider: this.embedderProvider, modelId: this.modelId, @@ -246,23 +243,20 @@ export class CodeIndexConfigManager { const prevQdrantUrl = prev?.qdrantUrl ?? "" const prevQdrantApiKey = prev?.qdrantApiKey ?? "" - // 1. Transition from disabled/unconfigured to enabled+configured - if ((!prevEnabled || !prevConfigured) && this.isEnabled && nowConfigured) { + // 1. Transition from unconfigured to configured + // Since the feature is always enabled, we only check configuration status + if (!prevConfigured && nowConfigured) { return true } - // 2. If was disabled and still is, no restart needed - if (!prevEnabled && !this.isEnabled) { - return false - } - // 3. If wasn't ready before and isn't ready now, no restart needed if (!prevConfigured && !nowConfigured) { return false } // 4. CRITICAL CHANGES - Always restart for these - if (this.isEnabled || prevEnabled) { + // Since feature is always enabled, we always check for critical changes + { // Provider change if (prevProvider !== this.embedderProvider) { return true @@ -342,7 +336,6 @@ export class CodeIndexConfigManager { */ public getConfig(): CodeIndexConfig { return { - isEnabled: this.isEnabled, isConfigured: this.isConfigured(), embedderProvider: this.embedderProvider, modelId: this.modelId, diff --git a/src/services/code-index/interfaces/config.ts b/src/services/code-index/interfaces/config.ts index f4eb55c183..190a23e2a3 100644 --- a/src/services/code-index/interfaces/config.ts +++ b/src/services/code-index/interfaces/config.ts @@ -5,7 +5,6 @@ import { EmbedderProvider } from "./manager" * Configuration state for the code indexing feature */ export interface CodeIndexConfig { - isEnabled: boolean isConfigured: boolean embedderProvider: EmbedderProvider modelId?: string From d6d646f8b3d4a4c4109024d4cc96ef8af70f4a26 Mon Sep 17 00:00:00 2001 From: Daniel Riccio Date: Tue, 8 Jul 2025 21:55:35 -0500 Subject: [PATCH 3/3] refactor: streamline configuration change checks in CodeIndexConfigManager --- src/services/code-index/config-manager.ts | 75 +++++++++++------------ 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/src/services/code-index/config-manager.ts b/src/services/code-index/config-manager.ts index 22ef30d820..245621a1bd 100644 --- a/src/services/code-index/config-manager.ts +++ b/src/services/code-index/config-manager.ts @@ -256,50 +256,49 @@ export class CodeIndexConfigManager { // 4. CRITICAL CHANGES - Always restart for these // Since feature is always enabled, we always check for critical changes - { - // Provider change - if (prevProvider !== this.embedderProvider) { - return true - } - // Authentication changes (API keys) - const currentOpenAiKey = this.openAiOptions?.openAiNativeApiKey ?? "" - const currentOllamaBaseUrl = this.ollamaOptions?.ollamaBaseUrl ?? "" - const currentOpenAiCompatibleBaseUrl = this.openAiCompatibleOptions?.baseUrl ?? "" - const currentOpenAiCompatibleApiKey = this.openAiCompatibleOptions?.apiKey ?? "" - const currentModelDimension = this.modelDimension - const currentGeminiApiKey = this.geminiOptions?.apiKey ?? "" - const currentQdrantUrl = this.qdrantUrl ?? "" - const currentQdrantApiKey = this.qdrantApiKey ?? "" - - if (prevOpenAiKey !== currentOpenAiKey) { - return true - } + // Provider change + if (prevProvider !== this.embedderProvider) { + return true + } - if (prevOllamaBaseUrl !== currentOllamaBaseUrl) { - return true - } + // Authentication changes (API keys) + const currentOpenAiKey = this.openAiOptions?.openAiNativeApiKey ?? "" + const currentOllamaBaseUrl = this.ollamaOptions?.ollamaBaseUrl ?? "" + const currentOpenAiCompatibleBaseUrl = this.openAiCompatibleOptions?.baseUrl ?? "" + const currentOpenAiCompatibleApiKey = this.openAiCompatibleOptions?.apiKey ?? "" + const currentModelDimension = this.modelDimension + const currentGeminiApiKey = this.geminiOptions?.apiKey ?? "" + const currentQdrantUrl = this.qdrantUrl ?? "" + const currentQdrantApiKey = this.qdrantApiKey ?? "" + + if (prevOpenAiKey !== currentOpenAiKey) { + return true + } - if ( - prevOpenAiCompatibleBaseUrl !== currentOpenAiCompatibleBaseUrl || - prevOpenAiCompatibleApiKey !== currentOpenAiCompatibleApiKey - ) { - return true - } + if (prevOllamaBaseUrl !== currentOllamaBaseUrl) { + return true + } - // Check for model dimension changes (generic for all providers) - if (prevModelDimension !== currentModelDimension) { - return true - } + if ( + prevOpenAiCompatibleBaseUrl !== currentOpenAiCompatibleBaseUrl || + prevOpenAiCompatibleApiKey !== currentOpenAiCompatibleApiKey + ) { + return true + } - if (prevQdrantUrl !== currentQdrantUrl || prevQdrantApiKey !== currentQdrantApiKey) { - return true - } + // Check for model dimension changes (generic for all providers) + if (prevModelDimension !== currentModelDimension) { + return true + } - // Vector dimension changes (still important for compatibility) - if (this._hasVectorDimensionChanged(prevProvider, prev?.modelId)) { - return true - } + if (prevQdrantUrl !== currentQdrantUrl || prevQdrantApiKey !== currentQdrantApiKey) { + return true + } + + // Vector dimension changes (still important for compatibility) + if (this._hasVectorDimensionChanged(prevProvider, prev?.modelId)) { + return true } return false