diff --git a/src/core/config/ProviderSettingsManager.ts b/src/core/config/ProviderSettingsManager.ts index 7df34e7844a..27ebc6593f4 100644 --- a/src/core/config/ProviderSettingsManager.ts +++ b/src/core/config/ProviderSettingsManager.ts @@ -77,6 +77,18 @@ export class ProviderSettingsManager { let isDirty = false + // Migrate existing installs to have per-mode API config map + if (!providerProfiles.modeApiConfigs) { + // Use the currently selected config for all modes initially + const currentName = providerProfiles.currentApiConfigName + const seedId = + providerProfiles.apiConfigs[currentName]?.id ?? + Object.values(providerProfiles.apiConfigs)[0]?.id ?? + this.defaultConfigId + providerProfiles.modeApiConfigs = Object.fromEntries(modes.map((m) => [m.slug, seedId])) + isDirty = true + } + // Ensure all configs have IDs. for (const [_name, apiConfig] of Object.entries(providerProfiles.apiConfigs)) { if (!apiConfig.id) { @@ -307,8 +319,12 @@ export class ProviderSettingsManager { try { return await this.lock(async () => { const providerProfiles = await this.load() - const { modeApiConfigs = {} } = providerProfiles - modeApiConfigs[mode] = configId + // Ensure the per-mode config map exists + if (!providerProfiles.modeApiConfigs) { + providerProfiles.modeApiConfigs = {} + } + // Assign the chosen config ID to this mode + providerProfiles.modeApiConfigs[mode] = configId await this.store(providerProfiles) }) } catch (error) { diff --git a/src/core/config/__tests__/ProviderSettingsManager.test.ts b/src/core/config/__tests__/ProviderSettingsManager.test.ts index ade40c29d38..d705e5f9c08 100644 --- a/src/core/config/__tests__/ProviderSettingsManager.test.ts +++ b/src/core/config/__tests__/ProviderSettingsManager.test.ts @@ -53,6 +53,7 @@ describe("ProviderSettingsManager", () => { fuzzyMatchThreshold: 1.0, }, }, + modeApiConfigs: {}, migrations: { rateLimitSecondsMigrated: true, diffSettingsMigrated: true,