





















@@ -105,6 +105,7 @@ const LOCAL_AUTH_METHOD_ID = "local";
105105const LOCAL_PROFILE_ID = `${LOCAL_PROVIDER_ID}:default`;
106106const LOCAL_API_KEY = "local-provider-key";
107107const LOCAL_DEFAULT_MODEL = `${LOCAL_PROVIDER_ID}/demo-model`;
108+const EXISTING_DEFAULT_MODEL = "amazon-bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0";
108109109110function buildProvider(): ProviderPlugin {
110111return {
@@ -133,6 +134,43 @@ function buildProvider(): ProviderPlugin {
133134};
134135}
135136137+function buildProviderWithDefaultModelPatch(): ProviderPlugin {
138+return {
139+id: LOCAL_PROVIDER_ID,
140+label: LOCAL_PROVIDER_LABEL,
141+auth: [
142+{
143+id: LOCAL_AUTH_METHOD_ID,
144+label: LOCAL_PROVIDER_LABEL,
145+kind: "custom",
146+run: async () => ({
147+profiles: [
148+{
149+profileId: LOCAL_PROFILE_ID,
150+credential: {
151+type: "api_key",
152+provider: LOCAL_PROVIDER_ID,
153+key: LOCAL_API_KEY,
154+},
155+},
156+],
157+configPatch: {
158+agents: {
159+defaults: {
160+model: { primary: LOCAL_DEFAULT_MODEL },
161+models: {
162+[LOCAL_DEFAULT_MODEL]: { alias: "Local default" },
163+},
164+},
165+},
166+},
167+defaultModel: LOCAL_DEFAULT_MODEL,
168+}),
169+},
170+],
171+};
172+}
173+136174function buildParams(overrides: Partial<ApplyAuthChoiceParams> = {}): ApplyAuthChoiceParams {
137175return {
138176authChoice: LOCAL_PROVIDER_ID,
@@ -332,6 +370,48 @@ describe("applyAuthChoiceLoadedPluginProvider", () => {
332370});
333371});
334372373+it("keeps an existing default when provider auth patches its own primary model", async () => {
374+const provider = buildProviderWithDefaultModelPatch();
375+resolvePluginProviders.mockReturnValue([provider]);
376+resolveProviderPluginChoice.mockReturnValue({
377+ provider,
378+method: provider.auth[0],
379+});
380+const note = vi.fn(async () => {});
381+382+const result = await applyAuthChoiceLoadedPluginProvider(
383+buildParams({
384+config: {
385+agents: {
386+defaults: {
387+model: { primary: EXISTING_DEFAULT_MODEL },
388+models: {
389+[EXISTING_DEFAULT_MODEL]: { alias: "Bedrock" },
390+},
391+},
392+},
393+},
394+prompter: {
395+ note,
396+} as unknown as ApplyAuthChoiceParams["prompter"],
397+preserveExistingDefaultModel: true,
398+}),
399+);
400+401+expect(result?.config.agents?.defaults?.model).toEqual({
402+primary: EXISTING_DEFAULT_MODEL,
403+});
404+expect(result?.config.agents?.defaults?.models).toEqual({
405+[EXISTING_DEFAULT_MODEL]: { alias: "Bedrock" },
406+[LOCAL_DEFAULT_MODEL]: { alias: "Local default" },
407+});
408+expect(runProviderModelSelectedHook).not.toHaveBeenCalled();
409+expect(note).toHaveBeenCalledWith(
410+`Kept existing default model ${EXISTING_DEFAULT_MODEL}; ${LOCAL_DEFAULT_MODEL} is available.`,
411+"Model configured",
412+);
413+});
414+335415it("uses manifest-owned setup providers without loading the broad provider runtime", async () => {
336416const provider = buildProvider();
337417resolveManifestProviderAuthChoice.mockReturnValue({
@@ -611,6 +691,59 @@ describe("applyAuthChoiceLoadedPluginProvider", () => {
611691);
612692});
613693694+it("preserves the existing primary model for plugin auth choices that patch defaults", async () => {
695+const provider = buildProviderWithDefaultModelPatch();
696+resolvePluginProviders.mockReturnValue([provider]);
697+const note = vi.fn(async () => {});
698+699+const result = await applyAuthChoicePluginProvider(
700+buildParams({
701+authChoice: `provider-plugin:${LOCAL_PROVIDER_ID}:${LOCAL_AUTH_METHOD_ID}`,
702+config: {
703+agents: {
704+defaults: {
705+model: { primary: EXISTING_DEFAULT_MODEL },
706+models: {
707+[EXISTING_DEFAULT_MODEL]: { alias: "Bedrock" },
708+},
709+},
710+},
711+},
712+prompter: {
713+ note,
714+} as unknown as ApplyAuthChoiceParams["prompter"],
715+preserveExistingDefaultModel: true,
716+}),
717+{
718+authChoice: `provider-plugin:${LOCAL_PROVIDER_ID}:${LOCAL_AUTH_METHOD_ID}`,
719+pluginId: LOCAL_PROVIDER_ID,
720+providerId: LOCAL_PROVIDER_ID,
721+methodId: LOCAL_AUTH_METHOD_ID,
722+label: LOCAL_PROVIDER_LABEL,
723+},
724+);
725+726+expect(result?.config.agents?.defaults?.model).toEqual({
727+primary: EXISTING_DEFAULT_MODEL,
728+});
729+expect(result?.config.agents?.defaults?.models).toEqual({
730+[EXISTING_DEFAULT_MODEL]: { alias: "Bedrock" },
731+[LOCAL_DEFAULT_MODEL]: { alias: "Local default" },
732+});
733+expect(result?.config.plugins).toEqual({
734+entries: {
735+[LOCAL_PROVIDER_ID]: {
736+enabled: true,
737+},
738+},
739+});
740+expect(runProviderModelSelectedHook).not.toHaveBeenCalled();
741+expect(note).toHaveBeenCalledWith(
742+`Kept existing default model ${EXISTING_DEFAULT_MODEL}; ${LOCAL_DEFAULT_MODEL} is available.`,
743+"Model configured",
744+);
745+});
746+614747it("stops early when the plugin is disabled in config", async () => {
615748const note = vi.fn(async () => {});
616749此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。