fix(server): apply provider model overrides to agent default resolution
Built-in provider clients bypassed mergeModels in listModels(), so configured profileModels/additionalModels were honored by the catalog but ignored when AgentManager picked a default for new agents. Wrap the inner client whenever overrides exist (not only when the provider id differs) and route listModels through mergeModels. Fixes #579
This commit is contained in:
@@ -905,4 +905,72 @@ describe("model merging", () => {
|
|||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("built-in createClient().listModels() honors profile model replacement (issue #579)", async () => {
|
||||||
|
mockState.runtimeModels.set("claude", [
|
||||||
|
{
|
||||||
|
provider: "claude",
|
||||||
|
id: "runtime-default",
|
||||||
|
label: "Runtime Default",
|
||||||
|
isDefault: true,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
const registry = buildProviderRegistry(logger, {
|
||||||
|
providerOverrides: {
|
||||||
|
claude: {
|
||||||
|
models: [
|
||||||
|
{
|
||||||
|
id: "profile-fast",
|
||||||
|
label: "Profile Fast",
|
||||||
|
isDefault: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const client = registry.claude.createClient(logger);
|
||||||
|
const models = await client.listModels({
|
||||||
|
cwd: "/tmp/registry-models",
|
||||||
|
force: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(models.map((model) => model.id)).toEqual(["profile-fast"]);
|
||||||
|
expect(models.find((model) => model.isDefault)?.id).toBe("profile-fast");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("built-in createClient().listModels() honors additionalModels default (issue #579)", async () => {
|
||||||
|
mockState.runtimeModels.set("claude", [
|
||||||
|
{
|
||||||
|
provider: "claude",
|
||||||
|
id: "runtime-default",
|
||||||
|
label: "Runtime Default",
|
||||||
|
isDefault: true,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
const registry = buildProviderRegistry(logger, {
|
||||||
|
providerOverrides: {
|
||||||
|
claude: {
|
||||||
|
additionalModels: [
|
||||||
|
{
|
||||||
|
id: "profile-default",
|
||||||
|
label: "Profile Default",
|
||||||
|
isDefault: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const client = registry.claude.createClient(logger);
|
||||||
|
const models = await client.listModels({
|
||||||
|
cwd: "/tmp/registry-models",
|
||||||
|
force: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
const defaultModel = models.find((model) => model.isDefault) ?? models[0];
|
||||||
|
expect(defaultModel?.id).toBe("profile-default");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -308,7 +308,12 @@ function wrapSessionProvider(provider: AgentProvider, inner: AgentSession): Agen
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function wrapClientProvider(provider: AgentProvider, inner: AgentClient): AgentClient {
|
function wrapClientProvider(
|
||||||
|
provider: AgentProvider,
|
||||||
|
inner: AgentClient,
|
||||||
|
profileModels: ProviderProfileModel[],
|
||||||
|
additionalModels: ProviderProfileModel[],
|
||||||
|
): AgentClient {
|
||||||
const listPersistedAgents = inner.listPersistedAgents?.bind(inner);
|
const listPersistedAgents = inner.listPersistedAgents?.bind(inner);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -343,7 +348,7 @@ function wrapClientProvider(provider: AgentProvider, inner: AgentClient): AgentC
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
listModels: async (options) =>
|
listModels: async (options) =>
|
||||||
(await inner.listModels(options)).map((model) => mapModel(provider, model)),
|
mergeModels(provider, profileModels, additionalModels, await inner.listModels(options)),
|
||||||
listModes: inner.listModes?.bind(inner),
|
listModes: inner.listModes?.bind(inner),
|
||||||
listPersistedAgents: listPersistedAgents
|
listPersistedAgents: listPersistedAgents
|
||||||
? async (options?: ListPersistedAgentsOptions) =>
|
? async (options?: ListPersistedAgentsOptions) =>
|
||||||
@@ -398,7 +403,12 @@ function createResolvedProviderClient(
|
|||||||
resolved: ResolvedProvider,
|
resolved: ResolvedProvider,
|
||||||
): AgentClient {
|
): AgentClient {
|
||||||
const inner = resolved.createBaseClient(logger);
|
const inner = resolved.createBaseClient(logger);
|
||||||
return inner.provider === provider ? inner : wrapClientProvider(provider, inner);
|
const hasModelOverrides =
|
||||||
|
resolved.profileModels.length > 0 || resolved.additionalModels.length > 0;
|
||||||
|
if (inner.provider === provider && !hasModelOverrides) {
|
||||||
|
return inner;
|
||||||
|
}
|
||||||
|
return wrapClientProvider(provider, inner, resolved.profileModels, resolved.additionalModels);
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildResolvedBuiltinProviders(
|
function buildResolvedBuiltinProviders(
|
||||||
|
|||||||
Reference in New Issue
Block a user