Skip to content

Commit b99552b

Browse files
committed
Hide manage model picker action item when required
1 parent 8a737a6 commit b99552b

2 files changed

Lines changed: 59 additions & 6 deletions

File tree

src/vs/workbench/contrib/chat/browser/widget/input/chatModelPicker.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ export function buildModelPickerItems(
130130
manageSettingsUrl: string | undefined,
131131
commandService: ICommandService,
132132
chatEntitlementService: IChatEntitlementService,
133+
canManageModels: boolean,
133134
showCuratedModels: boolean = true,
134135
): IActionListItem<IActionWidgetDropdownAction>[] {
135136
const isPro = isProUser(chatEntitlementService.entitlement);
@@ -331,12 +332,12 @@ export function buildModelPickerItems(
331332
}
332333

333334
if (
334-
chatEntitlementService.entitlement === ChatEntitlement.Free ||
335-
chatEntitlementService.entitlement === ChatEntitlement.Pro ||
336-
chatEntitlementService.entitlement === ChatEntitlement.ProPlus ||
337-
chatEntitlementService.entitlement === ChatEntitlement.Business ||
338-
chatEntitlementService.entitlement === ChatEntitlement.Enterprise ||
339-
chatEntitlementService.isInternal
335+
canManageModels && (chatEntitlementService.entitlement === ChatEntitlement.Free ||
336+
chatEntitlementService.entitlement === ChatEntitlement.Pro ||
337+
chatEntitlementService.entitlement === ChatEntitlement.ProPlus ||
338+
chatEntitlementService.entitlement === ChatEntitlement.Business ||
339+
chatEntitlementService.entitlement === ChatEntitlement.Enterprise ||
340+
chatEntitlementService.isInternal)
340341
) {
341342
items.push({ kind: ActionListItemKind.Separator, section: otherModels.length ? ModelPickerSection.Other : undefined });
342343
items.push({
@@ -540,6 +541,7 @@ export class ModelPickerWidget extends Disposable {
540541
this._productService.defaultChatAgent?.manageSettingsUrl,
541542
this._commandService,
542543
this._entitlementService,
544+
this._delegate.canManageModels(),
543545
showCuratedModels
544546
);
545547

src/vs/workbench/contrib/chat/test/browser/widget/input/chatModelPicker.test.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ function callBuild(
7878
updateStateType?: StateType;
7979
manageSettingsUrl?: string;
8080
anonymous?: boolean;
81+
canManageModels?: boolean;
8182
} = {},
8283
): IActionListItem<IActionWidgetDropdownAction>[] {
8384
const onSelect = () => { };
@@ -96,6 +97,7 @@ function callBuild(
9697
opts.manageSettingsUrl,
9798
stubCommandService,
9899
entitlementService,
100+
opts.canManageModels ?? true,
99101
);
100102
}
101103

@@ -447,6 +449,7 @@ suite('buildModelPickerItems', () => {
447449
undefined,
448450
stubCommandService,
449451
stubChatEntitlementService,
452+
true,
450453
);
451454
const gptItem = getActionItems(items).find(a => a.label === 'GPT-4o');
452455
assert.ok(gptItem?.item);
@@ -528,6 +531,7 @@ suite('buildModelPickerItems', () => {
528531
'https://aka.ms/github-copilot-settings',
529532
stubCommandService,
530533
stubChatEntitlementService,
534+
true,
531535
);
532536

533537
const adminItem = getActionItems(items).find(a => a.label === 'Missing Model');
@@ -591,6 +595,52 @@ suite('buildModelPickerItems', () => {
591595
assert.strictEqual(disabledItems[1].description, undefined);
592596
});
593597

598+
test('canManageModels true shows Manage Models entry for eligible entitlement', () => {
599+
const auto = createAutoModel();
600+
const modelA = createModel('gpt-4o', 'GPT-4o');
601+
const items = callBuild([auto, modelA], { canManageModels: true });
602+
const manageItem = getActionItems(items).find(a => a.item?.id === 'manageModels');
603+
assert.ok(manageItem);
604+
});
605+
606+
test('canManageModels false hides Manage Models entry', () => {
607+
const auto = createAutoModel();
608+
const modelA = createModel('gpt-4o', 'GPT-4o');
609+
const items = callBuild([auto, modelA], { canManageModels: false });
610+
const manageItem = getActionItems(items).find(a => a.item?.id === 'manageModels');
611+
assert.strictEqual(manageItem, undefined);
612+
});
613+
614+
test('canManageModels false hides Manage Models for all entitlement tiers', () => {
615+
const auto = createAutoModel();
616+
for (const entitlement of [ChatEntitlement.Free, ChatEntitlement.Pro, ChatEntitlement.ProPlus, ChatEntitlement.Business, ChatEntitlement.Enterprise]) {
617+
const items = callBuild([auto], { canManageModels: false, entitlement });
618+
const manageItem = getActionItems(items).find(a => a.item?.id === 'manageModels');
619+
assert.strictEqual(manageItem, undefined, `Manage Models should be hidden for entitlement ${entitlement}`);
620+
}
621+
});
622+
623+
test('canManageModels true shows Manage Models for empty model list', () => {
624+
const items = callBuild([], { canManageModels: true });
625+
const manageItem = getActionItems(items).find(a => a.item?.id === 'manageModels');
626+
assert.ok(manageItem);
627+
});
628+
629+
test('canManageModels false hides Manage Models for empty model list', () => {
630+
const items = callBuild([], { canManageModels: false });
631+
const manageItem = getActionItems(items).find(a => a.item?.id === 'manageModels');
632+
assert.strictEqual(manageItem, undefined);
633+
});
634+
635+
test('canManageModels false also removes trailing separator', () => {
636+
const auto = createAutoModel();
637+
const items = callBuild([auto], { canManageModels: false });
638+
const manageItem = getActionItems(items).find(a => a.item?.id === 'manageModels');
639+
assert.strictEqual(manageItem, undefined);
640+
// No trailing separator should exist for manage models
641+
assert.strictEqual(getSeparatorCount(items), 0);
642+
});
643+
594644
test('anonymous user model selection triggers onSelect normally', () => {
595645
const auto = createAutoModel();
596646
const modelA = createModel('gpt-4o', 'GPT-4o');
@@ -608,6 +658,7 @@ suite('buildModelPickerItems', () => {
608658
undefined,
609659
stubCommandService,
610660
anonymousEntitlementService,
661+
true,
611662
);
612663
const gptItem = getActionItems(items).find(a => a.label === 'GPT-4o');
613664
assert.ok(gptItem?.item);

0 commit comments

Comments
 (0)