From 64efe2125c30b8cf0190e36673f4671109c09225 Mon Sep 17 00:00:00 2001 From: Nathan Weinshenker Date: Mon, 6 Oct 2025 10:40:59 -0700 Subject: [PATCH 1/2] Ensure selectable models on dropdown are sorted the change ensures that all the models in the model selection dropdown are sorted in alphabetical order Changelog: added EE: true --- .../ai/model_selection/model_selector.vue | 10 ++++--- .../ai/model_selection/model_selector_spec.js | 29 ++++++++++++++++++- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/ee/app/assets/javascripts/ai/model_selection/model_selector.vue b/ee/app/assets/javascripts/ai/model_selection/model_selector.vue index ba88e94d766d22..339bd4c1ec4f49 100644 --- a/ee/app/assets/javascripts/ai/model_selection/model_selector.vue +++ b/ee/app/assets/javascripts/ai/model_selection/model_selector.vue @@ -41,10 +41,12 @@ export default { return { value: GITLAB_DEFAULT_MODEL, text }; }, listItems() { - const modelOptions = this.aiFeatureSetting.selectableModels.map(({ ref, name }) => ({ - value: ref, - text: name, - })); + const modelOptions = this.aiFeatureSetting.selectableModels + .map(({ ref, name }) => ({ + value: ref, + text: name, + })) + .sort((a, b) => b.text.localeCompare(a.text)); return [...modelOptions, this.defaultModelOption]; }, diff --git a/ee/spec/frontend/ai/model_selection/model_selector_spec.js b/ee/spec/frontend/ai/model_selection/model_selector_spec.js index 0e668293277fd1..2c2219772eee62 100644 --- a/ee/spec/frontend/ai/model_selection/model_selector_spec.js +++ b/ee/spec/frontend/ai/model_selection/model_selector_spec.js @@ -111,7 +111,7 @@ describe('ModelSelector', () => { }); describe('.listItems', () => { - it('contains a list of models, including a default model option', () => { + it('contains a list of models sorted in descending alphabetical order, including a default model option', () => { createComponent(); expect(findModelSelectDropdown().props('items')).toEqual([ @@ -124,6 +124,33 @@ describe('ModelSelector', () => { }, ]); }); + + it('sorts models in descending alphabetical order', () => { + const testFeatureSetting = { + ...aiFeatureSetting, + selectableModels: [ + { ref: 'claude_3_haiku_20240307', name: 'Claude Haiku 3 - Anthropic' }, + { ref: 'gpt_5', name: 'OpenAI GPT-5' }, + { ref: 'claude_sonnet_4_20250514', name: 'Claude Sonnet 4 - Anthropic' }, + { ref: 'claude_3_5_sonnet_20240620', name: 'Claude Sonnet 3.5 - Anthropic' }, + { ref: 'claude_sonnet_3_7_20250219', name: 'Claude Sonnet 3.7 - Anthropic' }, + ], + }; + + createComponent({ props: { aiFeatureSetting: testFeatureSetting } }); + + const items = findModelSelectDropdown().props('items'); + const modelNames = items.map((item) => item.text); + + expect(modelNames).toEqual([ + 'OpenAI GPT-5', + 'Claude Sonnet 4 - Anthropic', + 'Claude Sonnet 3.7 - Anthropic', + 'Claude Sonnet 3.5 - Anthropic', + 'Claude Haiku 3 - Anthropic', + 'GitLab default model (Claude Sonnet 3.7 - Anthropic)', + ]); + }); }); describe('onSelect', () => { -- GitLab From 78535e0bb4a9ea05e39402553193fd87fb125d77 Mon Sep 17 00:00:00 2001 From: Nathan Weinshenker Date: Mon, 6 Oct 2025 12:11:37 -0600 Subject: [PATCH 2/2] Fix ordering in descending Make sure the proper ordering is in place --- .../ai/model_selection/model_selector.vue | 2 +- .../ai/model_selection/model_selector_spec.js | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/ee/app/assets/javascripts/ai/model_selection/model_selector.vue b/ee/app/assets/javascripts/ai/model_selection/model_selector.vue index 339bd4c1ec4f49..44983a5e875953 100644 --- a/ee/app/assets/javascripts/ai/model_selection/model_selector.vue +++ b/ee/app/assets/javascripts/ai/model_selection/model_selector.vue @@ -46,7 +46,7 @@ export default { value: ref, text: name, })) - .sort((a, b) => b.text.localeCompare(a.text)); + .sort((a, b) => a.text.localeCompare(b.text)); return [...modelOptions, this.defaultModelOption]; }, diff --git a/ee/spec/frontend/ai/model_selection/model_selector_spec.js b/ee/spec/frontend/ai/model_selection/model_selector_spec.js index 2c2219772eee62..cea4231a1f1df0 100644 --- a/ee/spec/frontend/ai/model_selection/model_selector_spec.js +++ b/ee/spec/frontend/ai/model_selection/model_selector_spec.js @@ -95,7 +95,7 @@ describe('ModelSelector', () => { }); describe('loading state', () => { - it('passes corect loading state to `ModelSelectDropdown` while saving', async () => { + it('passes correct loading state to `ModelSelectDropdown` while saving', async () => { createComponent(); await findModelSelectDropdown().vm.$emit('select', 'claude_3_5_sonnet_20240620'); @@ -103,7 +103,7 @@ describe('ModelSelector', () => { expect(findModelSelectDropdown().props('isLoading')).toBe(true); }); - it('passes corect loading state to `ModelSelectDropdown` while batch saving', () => { + it('passes correct loading state to `ModelSelectDropdown` while batch saving', () => { createComponent({ props: { batchUpdateIsSaving: true } }); expect(findModelSelectDropdown().props('isLoading')).toBe(true); @@ -111,13 +111,13 @@ describe('ModelSelector', () => { }); describe('.listItems', () => { - it('contains a list of models sorted in descending alphabetical order, including a default model option', () => { + it('contains a list of models sorted in ascending alphabetical order, including a default model option', () => { createComponent(); expect(findModelSelectDropdown().props('items')).toEqual([ - { value: 'claude_sonnet_3_7_20250219', text: 'Claude Sonnet 3.7 - Anthropic' }, - { value: 'claude_3_5_sonnet_20240620', text: 'Claude Sonnet 3.5 - Anthropic' }, { value: 'claude_3_haiku_20240307', text: 'Claude Haiku 3 - Anthropic' }, + { value: 'claude_3_5_sonnet_20240620', text: 'Claude Sonnet 3.5 - Anthropic' }, + { value: 'claude_sonnet_3_7_20250219', text: 'Claude Sonnet 3.7 - Anthropic' }, { value: GITLAB_DEFAULT_MODEL, text: 'GitLab default model (Claude Sonnet 3.7 - Anthropic)', @@ -125,7 +125,7 @@ describe('ModelSelector', () => { ]); }); - it('sorts models in descending alphabetical order', () => { + it('sorts models in ascending alphabetical order', () => { const testFeatureSetting = { ...aiFeatureSetting, selectableModels: [ @@ -143,11 +143,11 @@ describe('ModelSelector', () => { const modelNames = items.map((item) => item.text); expect(modelNames).toEqual([ - 'OpenAI GPT-5', - 'Claude Sonnet 4 - Anthropic', - 'Claude Sonnet 3.7 - Anthropic', - 'Claude Sonnet 3.5 - Anthropic', 'Claude Haiku 3 - Anthropic', + 'Claude Sonnet 3.5 - Anthropic', + 'Claude Sonnet 3.7 - Anthropic', + 'Claude Sonnet 4 - Anthropic', + 'OpenAI GPT-5', 'GitLab default model (Claude Sonnet 3.7 - Anthropic)', ]); }); -- GitLab