fix(coding-agent): preserve models when re-registering provider with overrides only (#3651)
Previously, registerProvider() overwrote the stored config for a provider, so a models registration followed by a baseUrl/headers-only override lost the models. After refresh(), only the override-only config was replayed, causing extension-provided models to disappear. Added upsertRegisteredProvider() that merges defined fields into the existing stored config instead of replacing it. Fields absent from the incoming config are preserved from the stored config. Also adds regression tests for dynamic provider override persistence across refresh.
This commit is contained in:
@@ -758,7 +758,7 @@ export class ModelRegistry {
|
||||
registerProvider(providerName: string, config: ProviderConfigInput): void {
|
||||
this.validateProviderConfig(providerName, config);
|
||||
this.applyProviderConfig(providerName, config);
|
||||
this.registeredProviders.set(providerName, config);
|
||||
this.upsertRegisteredProvider(providerName, config);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -776,6 +776,25 @@ export class ModelRegistry {
|
||||
this.refresh();
|
||||
}
|
||||
|
||||
/**
|
||||
* Upsert a provider config into registeredProviders.
|
||||
* If the provider is already registered, defined values in the incoming config
|
||||
* override existing ones; undefined values are preserved from the stored config.
|
||||
* If the provider is not registered, the incoming config is stored as-is.
|
||||
*/
|
||||
private upsertRegisteredProvider(providerName: string, config: ProviderConfigInput): void {
|
||||
const existing = this.registeredProviders.get(providerName);
|
||||
if (!existing) {
|
||||
this.registeredProviders.set(providerName, config);
|
||||
return;
|
||||
}
|
||||
for (const k of Object.keys(config) as (keyof ProviderConfigInput)[]) {
|
||||
if (config[k] !== undefined) {
|
||||
(existing as Record<string, unknown>)[k] = config[k];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private validateProviderConfig(providerName: string, config: ProviderConfigInput): void {
|
||||
if (config.streamSimple && !config.api) {
|
||||
throw new Error(`Provider ${providerName}: "api" is required when registering streamSimple.`);
|
||||
|
||||
Reference in New Issue
Block a user