diff --git a/.changeset/v2-model-catalog-efforts.md b/.changeset/v2-model-catalog-efforts.md new file mode 100644 index 0000000000..36a52fa378 --- /dev/null +++ b/.changeset/v2-model-catalog-efforts.md @@ -0,0 +1,5 @@ +--- +"@moonshot-ai/agent-core-v2": patch +--- + +Fix the v2 model catalog response omitting support_efforts and default_effort, restoring thinking-effort selection for clients connected to the v2 backend. diff --git a/packages/agent-core-v2/src/app/modelCatalog/modelCatalog.ts b/packages/agent-core-v2/src/app/modelCatalog/modelCatalog.ts index be358af25b..66fc872f46 100644 --- a/packages/agent-core-v2/src/app/modelCatalog/modelCatalog.ts +++ b/packages/agent-core-v2/src/app/modelCatalog/modelCatalog.ts @@ -21,6 +21,7 @@ import type { import { createDecorator, type ServiceIdentifier } from '#/_base/di/instantiation'; import type { ModelAlias } from '#/app/model/model'; +import { effectiveModelConfig } from '#/app/model/modelAuth'; import type { ProviderConfig } from '#/app/provider/provider'; export type RefreshProviderModelsScope = 'all' | 'oauth'; @@ -51,12 +52,15 @@ export interface ProviderCredentialState { } export function toProtocolModel(modelId: string, alias: ModelAlias): ModelCatalogItem { + const effective = effectiveModelConfig(alias); return { - provider: alias.provider ?? '', + provider: effective.provider ?? '', model: modelId, - display_name: alias.displayName ?? alias.model ?? modelId, - max_context_size: alias.maxContextSize ?? 0, - capabilities: alias.capabilities, + display_name: effective.displayName ?? effective.model ?? modelId, + max_context_size: effective.maxContextSize ?? 0, + capabilities: effective.capabilities, + support_efforts: effective.supportEfforts, + default_effort: effective.defaultEffort, }; } diff --git a/packages/agent-core-v2/test/app/modelCatalog/modelCatalog.test.ts b/packages/agent-core-v2/test/app/modelCatalog/modelCatalog.test.ts index 5ac93de22e..a5ecc2e4de 100644 --- a/packages/agent-core-v2/test/app/modelCatalog/modelCatalog.test.ts +++ b/packages/agent-core-v2/test/app/modelCatalog/modelCatalog.test.ts @@ -159,6 +159,34 @@ describe('ModelCatalogService', () => { ]); }); + it('projects support_efforts and default_effort from the model config', async () => { + backing.models['k2'] = { + ...backing.models['k2'], + supportEfforts: ['low', 'high', 'max'], + defaultEffort: 'max', + }; + const [k2] = await catalog().listModels(); + expect(k2).toMatchObject({ + model: 'k2', + support_efforts: ['low', 'high', 'max'], + default_effort: 'max', + }); + }); + + it('projects effort fields from overrides when present', async () => { + backing.models['k2'] = { + ...backing.models['k2'], + supportEfforts: ['low', 'high'], + defaultEffort: 'high', + overrides: { supportEfforts: ['low', 'high', 'max'], defaultEffort: 'max' }, + }; + const [k2] = await catalog().listModels(); + expect(k2).toMatchObject({ + support_efforts: ['low', 'high', 'max'], + default_effort: 'max', + }); + }); + it('lists providers with per-provider models, default model, and credential state', async () => { await expect(catalog().listProviders()).resolves.toEqual([ {