From f252a8e7e6504d8c5b47026dedcd6474ac24b24d Mon Sep 17 00:00:00 2001
From: Julie Huang <julhuang@gitlab.com>
Date: Thu, 6 Mar 2025 00:49:14 +1100
Subject: [PATCH] Update feature name to GitLab Duo Self-Hosted in the UI

As a result of consultation with Product, Brand Strategy, and Marketing, the decision has been
made to change the name of Self-Hosted Models to GitLab Duo Self-Hosted. The decision is
expected to make marketing and documentation simpler, align the name with a deployment designation
and is only a minor variation from the current name which creates continuity with the feature
as it's currently understood by customers and the media.

See https://gitlab.com/gitlab-org/gitlab/-/issues/515917 for more context

Changelog: changed
EE: true
---
 .../configure_duo_features.md                    | 12 ++++++------
 .../components/ai_gateway_url_input_form.vue     |  2 +-
 .../pages/admin/ai/duo_self_hosted/app.vue       |  2 +-
 .../index.js                                     |  4 ++--
 .../components/edit_self_hosted_model.vue        |  2 +-
 .../components/new_self_hosted_model.vue         |  2 +-
 ...ntroller.rb => duo_self_hosted_controller.rb} |  2 +-
 .../helpers/admin/application_settings_helper.rb |  2 +-
 .../admin/ai/duo_self_hosted/index.html.haml     |  2 ++
 .../admin/ai/self_hosted_models/index.html.haml  |  2 --
 ee/config/routes/admin.rb                        |  7 ++-----
 .../admin/menus/self_hosted_models_menu.rb       |  6 +++---
 .../ai/settings/pages/ai_admin_settings_spec.js  |  2 +-
 .../pages/admin/ai/duo_self_hosted/app_spec.js   |  2 +-
 .../edit_self_hosted_model_spec.js               |  4 +++-
 .../new_self_hosted_model_spec.js                |  4 +++-
 .../self_hosted_model_form_spec.js               |  2 +-
 .../admin/application_settings_helper_spec.rb    |  2 +-
 .../admin/menus/self_hosted_models_menu_spec.rb  |  6 +++---
 ...pec.rb => duo_self_hosted_controller_spec.rb} |  6 +++---
 .../ai/terms_and_conditions_controller_spec.rb   |  2 +-
 ee/spec/routing/admin_routing_spec.rb            | 16 ++++++++++++++++
 locale/gitlab.pot                                | 15 +++++++++------
 23 files changed, 63 insertions(+), 43 deletions(-)
 rename ee/app/assets/javascripts/pages/admin/ai/{self_hosted_models => duo_self_hosted}/index.js (87%)
 rename ee/app/controllers/admin/ai/{self_hosted_models_controller.rb => duo_self_hosted_controller.rb} (84%)
 create mode 100644 ee/app/views/admin/ai/duo_self_hosted/index.html.haml
 delete mode 100644 ee/app/views/admin/ai/self_hosted_models/index.html.haml
 rename ee/spec/requests/admin/ai/{self_hosted_models_controller_spec.rb => duo_self_hosted_controller_spec.rb} (84%)

diff --git a/doc/administration/gitlab_duo_self_hosted/configure_duo_features.md b/doc/administration/gitlab_duo_self_hosted/configure_duo_features.md
index eeb034b205215..f5323f22514c3 100644
--- a/doc/administration/gitlab_duo_self_hosted/configure_duo_features.md
+++ b/doc/administration/gitlab_duo_self_hosted/configure_duo_features.md
@@ -54,8 +54,8 @@ Prerequisites:
 To configure a self-hosted model:
 
 1. On the left sidebar, at the bottom, select **Admin**.
-1. Select **Self-hosted models**.
-   - If the **Self-hosted models** menu item is not available, synchronize your
+1. Select **GitLab Duo Self-Hosted**.
+   - If the **GitLab Duo Self-Hosted** menu item is not available, synchronize your
      subscription after purchase:
      1. On the left sidebar, select **Subscription**.
      1. In **Subscription details**, to the right of **Last sync**, select
@@ -115,8 +115,8 @@ Prerequisites:
 ### View configured features
 
 1. On the left sidebar, at the bottom, select **Admin**.
-1. Select **Self-hosted models**.
-   - If the **Self-hosted models** menu item is not available, synchronize your
+1. Select **GitLab Duo Self-Hosted**.
+   - If the **GitLab Duo Self-Hosted** menu item is not available, synchronize your
      subscription after purchase:
      1. On the left sidebar, select **Subscription**.
      1. In **Subscription details**, to the right of **Last sync**, select
@@ -128,6 +128,6 @@ Prerequisites:
 Configure the GitLab Duo feature to send queries to the configured self-hosted model:
 
 1. On the left sidebar, at the bottom, select **Admin**.
-1. Select **Self-hosted models**.
-1. Select the **AI-powered features** tab.
+1. Select **GitLab Duo Self-Hosted**.
+1. Select the **GitLab Duo Self-Hosted** tab.
 1. For the feature you want to configure, from the dropdown list, choose the self-hosted model you want to use. For example, `Mistral`.
diff --git a/ee/app/assets/javascripts/ai/settings/components/ai_gateway_url_input_form.vue b/ee/app/assets/javascripts/ai/settings/components/ai_gateway_url_input_form.vue
index aa3778005be3c..107c186d51b11 100644
--- a/ee/app/assets/javascripts/ai/settings/components/ai_gateway_url_input_form.vue
+++ b/ee/app/assets/javascripts/ai/settings/components/ai_gateway_url_input_form.vue
@@ -14,7 +14,7 @@ export default {
   i18n: {
     label: s__('AiPowered|Local AI Gateway URL'),
     description: s__(
-      'AiPowered|Enter the URL for your local AI Gateway. This endpoint is used for self-hosted models requests.%{br}The URL must be a complete URL, including either the "http://" or "https://" protocol. For example "http://EXAMPLE-URL".%{br}For more information, see how to %{linkStart}install the GitLab AI Gateway.%{linkEnd}',
+      'AiPowered|Enter the URL for your local AI Gateway. This endpoint is used for GitLab Duo Self-Hosted requests.%{br}The URL must be a complete URL, including either the "http://" or "https://" protocol. For example "http://EXAMPLE-URL".%{br}For more information, see how to %{linkStart}install the GitLab AI Gateway.%{linkEnd}',
     ),
   },
   aiGatewaySetupUrl: helpPagePath('install/install_ai_gateway'),
diff --git a/ee/app/assets/javascripts/pages/admin/ai/duo_self_hosted/app.vue b/ee/app/assets/javascripts/pages/admin/ai/duo_self_hosted/app.vue
index 238537334abdc..ad71ec35d7203 100644
--- a/ee/app/assets/javascripts/pages/admin/ai/duo_self_hosted/app.vue
+++ b/ee/app/assets/javascripts/pages/admin/ai/duo_self_hosted/app.vue
@@ -17,7 +17,7 @@ export default {
     PageHeading,
   },
   i18n: {
-    title: s__('AdminSelfHostedModels|Self-hosted models'),
+    title: s__('AdminSelfHostedModels|GitLab Duo Self-Hosted'),
     description: s__(
       'AdminSelfHostedModels|Manage GitLab Duo by configuring and assigning self-hosted models to AI-powered features.',
     ),
diff --git a/ee/app/assets/javascripts/pages/admin/ai/self_hosted_models/index.js b/ee/app/assets/javascripts/pages/admin/ai/duo_self_hosted/index.js
similarity index 87%
rename from ee/app/assets/javascripts/pages/admin/ai/self_hosted_models/index.js
rename to ee/app/assets/javascripts/pages/admin/ai/duo_self_hosted/index.js
index 58a625aab96e7..164a03571256b 100644
--- a/ee/app/assets/javascripts/pages/admin/ai/self_hosted_models/index.js
+++ b/ee/app/assets/javascripts/pages/admin/ai/duo_self_hosted/index.js
@@ -1,7 +1,7 @@
 import Vue from 'vue';
 import VueApollo from 'vue-apollo';
 import createDefaultClient from '~/lib/graphql';
-import createRouter from '../duo_self_hosted/router';
+import createRouter from './router';
 
 Vue.use(VueApollo);
 
@@ -10,7 +10,7 @@ const apolloProvider = new VueApollo({
 });
 
 function mountSelfHostedModelsApp() {
-  const el = document.getElementById('js-self-hosted-models');
+  const el = document.getElementById('js-duo-self-hosted');
 
   if (!el) {
     return null;
diff --git a/ee/app/assets/javascripts/pages/admin/ai/self_hosted_models/components/edit_self_hosted_model.vue b/ee/app/assets/javascripts/pages/admin/ai/self_hosted_models/components/edit_self_hosted_model.vue
index 3435b9d4cc5be..78ef363c42e2c 100644
--- a/ee/app/assets/javascripts/pages/admin/ai/self_hosted_models/components/edit_self_hosted_model.vue
+++ b/ee/app/assets/javascripts/pages/admin/ai/self_hosted_models/components/edit_self_hosted_model.vue
@@ -21,7 +21,7 @@ export default {
   i18n: {
     title: s__('AdminSelfHostedModels|Edit self-hosted model'),
     description: s__(
-      'AdminSelfHostedModels|Edit the AI model that can be used for GitLab Duo features.',
+      'AdminSelfHostedModels|Edit the AI model that can be used for GitLab Duo self-hosted features.',
     ),
     errorMessage: s__(
       'AdminSelfHostedModels|An error occurred while loading the self-hosted model. Please try again.',
diff --git a/ee/app/assets/javascripts/pages/admin/ai/self_hosted_models/components/new_self_hosted_model.vue b/ee/app/assets/javascripts/pages/admin/ai/self_hosted_models/components/new_self_hosted_model.vue
index 428a3f6a2334d..470a3de584a86 100644
--- a/ee/app/assets/javascripts/pages/admin/ai/self_hosted_models/components/new_self_hosted_model.vue
+++ b/ee/app/assets/javascripts/pages/admin/ai/self_hosted_models/components/new_self_hosted_model.vue
@@ -12,7 +12,7 @@ export default {
   i18n: {
     title: s__('AdminSelfHostedModels|Add self-hosted model'),
     description: s__(
-      'AdminSelfHostedModels|Add a new AI model that can be used for GitLab Duo features.',
+      'AdminSelfHostedModels|Add a new AI model that can be used for GitLab Duo self-hosted features.',
     ),
   },
   mutationData: {
diff --git a/ee/app/controllers/admin/ai/self_hosted_models_controller.rb b/ee/app/controllers/admin/ai/duo_self_hosted_controller.rb
similarity index 84%
rename from ee/app/controllers/admin/ai/self_hosted_models_controller.rb
rename to ee/app/controllers/admin/ai/duo_self_hosted_controller.rb
index 561aca0cb7e52..bb3995d6a1822 100644
--- a/ee/app/controllers/admin/ai/self_hosted_models_controller.rb
+++ b/ee/app/controllers/admin/ai/duo_self_hosted_controller.rb
@@ -2,7 +2,7 @@
 
 module Admin
   module Ai
-    class SelfHostedModelsController < Admin::ApplicationController
+    class DuoSelfHostedController < Admin::ApplicationController
       feature_category :"self-hosted_models"
       urgency :low
 
diff --git a/ee/app/helpers/admin/application_settings_helper.rb b/ee/app/helpers/admin/application_settings_helper.rb
index 1f0ed75999bd7..48b698a4396b0 100644
--- a/ee/app/helpers/admin/application_settings_helper.rb
+++ b/ee/app/helpers/admin/application_settings_helper.rb
@@ -89,7 +89,7 @@ def ai_settings_helper_data
         duo_pro_visible: code_suggestions_purchased.to_s,
         disabled_direct_connection_method: disabled_direct_code_suggestions.to_s,
         beta_self_hosted_models_enabled: beta_self_hosted_models_enabled.to_s,
-        toggle_beta_models_path: toggle_beta_models_admin_ai_self_hosted_models_path,
+        toggle_beta_models_path: admin_ai_duo_self_hosted_toggle_beta_models_path,
         can_manage_self_hosted_models: can_manage_self_hosted_models.to_s,
         ai_gateway_url: ai_gateway_url
       }
diff --git a/ee/app/views/admin/ai/duo_self_hosted/index.html.haml b/ee/app/views/admin/ai/duo_self_hosted/index.html.haml
new file mode 100644
index 0000000000000..79ada4f8ed1fd
--- /dev/null
+++ b/ee/app/views/admin/ai/duo_self_hosted/index.html.haml
@@ -0,0 +1,2 @@
+- page_title s_("AdminSelfHostedModels|GitLab Duo Self-Hosted")
+#js-duo-self-hosted{ data: { view_model: { basePath: admin_ai_duo_self_hosted_path, modelOptions: model_choices_as_options, betaModelsEnabled: beta_models_enabled?, duoConfigurationSettingsPath: admin_gitlab_duo_configuration_index_url }.to_json } }
diff --git a/ee/app/views/admin/ai/self_hosted_models/index.html.haml b/ee/app/views/admin/ai/self_hosted_models/index.html.haml
deleted file mode 100644
index 12e2d3cc21a8a..0000000000000
--- a/ee/app/views/admin/ai/self_hosted_models/index.html.haml
+++ /dev/null
@@ -1,2 +0,0 @@
-- page_title s_("AdminSelfHostedModels|Self-hosted models")
-#js-self-hosted-models{ data: { view_model: { basePath: admin_ai_self_hosted_models_path, modelOptions: model_choices_as_options, betaModelsEnabled: beta_models_enabled?, duoConfigurationSettingsPath: admin_gitlab_duo_configuration_index_url }.to_json } }
diff --git a/ee/config/routes/admin.rb b/ee/config/routes/admin.rb
index 5c2abe5963df7..20bd1ac405a0c 100644
--- a/ee/config/routes/admin.rb
+++ b/ee/config/routes/admin.rb
@@ -53,11 +53,8 @@
   get '/code_suggestions', to: redirect('admin/gitlab_duo/seat_utilization')
 
   namespace :ai do
-    resources :self_hosted_models, only: [:index], path: 'self_hosted_models(/*vueroute)' do
-      collection do
-        post 'toggle_beta_models', to: 'terms_and_conditions#toggle_beta_models'
-      end
-    end
+    get 'duo_self_hosted(/*vueroute)', to: 'duo_self_hosted#index', as: :duo_self_hosted
+    post 'duo_self_hosted/toggle_beta_models', to: 'terms_and_conditions#toggle_beta_models'
 
     resources :amazon_q_settings, only: [:index, :create] do
       collection do
diff --git a/ee/lib/sidebars/admin/menus/self_hosted_models_menu.rb b/ee/lib/sidebars/admin/menus/self_hosted_models_menu.rb
index e4e29fb4147a1..71adadcdc6317 100644
--- a/ee/lib/sidebars/admin/menus/self_hosted_models_menu.rb
+++ b/ee/lib/sidebars/admin/menus/self_hosted_models_menu.rb
@@ -6,12 +6,12 @@ module Menus
       class SelfHostedModelsMenu < ::Sidebars::Admin::BaseMenu
         override :link
         def link
-          admin_ai_self_hosted_models_path
+          admin_ai_duo_self_hosted_path
         end
 
         override :title
         def title
-          s_('Admin|Self-hosted models')
+          s_('Admin|GitLab Duo Self-Hosted')
         end
 
         override :sprite_icon
@@ -21,7 +21,7 @@ def sprite_icon
 
         override :active_routes
         def active_routes
-          { controller: :self_hosted_models }
+          { controller: :duo_self_hosted }
         end
       end
     end
diff --git a/ee/spec/frontend/ai/settings/pages/ai_admin_settings_spec.js b/ee/spec/frontend/ai/settings/pages/ai_admin_settings_spec.js
index d0f28eab237c4..15c565a7f58f5 100644
--- a/ee/spec/frontend/ai/settings/pages/ai_admin_settings_spec.js
+++ b/ee/spec/frontend/ai/settings/pages/ai_admin_settings_spec.js
@@ -27,7 +27,7 @@ let wrapper;
 let axiosMock;
 
 const aiGatewayUrl = 'http://localhost:5052';
-const toggleBetaModelsPath = '/admin/ai/self_hosted_models/terms_and_condition';
+const toggleBetaModelsPath = '/admin/ai/duo_self_hosted/terms_and_condition';
 const updateAiSettingsSuccessHandler = jest.fn().mockResolvedValue({
   data: {
     duoSettings: {
diff --git a/ee/spec/frontend/pages/admin/ai/duo_self_hosted/app_spec.js b/ee/spec/frontend/pages/admin/ai/duo_self_hosted/app_spec.js
index 69ad652c80bcb..c69ad263c04df 100644
--- a/ee/spec/frontend/pages/admin/ai/duo_self_hosted/app_spec.js
+++ b/ee/spec/frontend/pages/admin/ai/duo_self_hosted/app_spec.js
@@ -31,7 +31,7 @@ describe('DuoSelfHostedApp', () => {
   it('has a title', () => {
     const title = wrapper.findByTestId('self-hosted-title');
 
-    expect(title.text()).toBe('Self-hosted models');
+    expect(title.text()).toBe('GitLab Duo Self-Hosted');
   });
 
   it('has a description', () => {
diff --git a/ee/spec/frontend/pages/admin/ai/self_hosted_models/edit_self_hosted_model_spec.js b/ee/spec/frontend/pages/admin/ai/self_hosted_models/edit_self_hosted_model_spec.js
index b3b999ab7246f..f9891b53b74e6 100644
--- a/ee/spec/frontend/pages/admin/ai/self_hosted_models/edit_self_hosted_model_spec.js
+++ b/ee/spec/frontend/pages/admin/ai/self_hosted_models/edit_self_hosted_model_spec.js
@@ -53,7 +53,9 @@ describe('EditSelfHostedModel', () => {
   it('has a description', () => {
     createComponent();
 
-    expect(wrapper.text()).toMatch('Edit the AI model that can be used for GitLab Duo features.');
+    expect(wrapper.text()).toMatch(
+      'Edit the AI model that can be used for GitLab Duo self-hosted features.',
+    );
   });
 
   it('fetches self-hosted model data', () => {
diff --git a/ee/spec/frontend/pages/admin/ai/self_hosted_models/new_self_hosted_model_spec.js b/ee/spec/frontend/pages/admin/ai/self_hosted_models/new_self_hosted_model_spec.js
index 1cfade439319e..a01aae776c1c4 100644
--- a/ee/spec/frontend/pages/admin/ai/self_hosted_models/new_self_hosted_model_spec.js
+++ b/ee/spec/frontend/pages/admin/ai/self_hosted_models/new_self_hosted_model_spec.js
@@ -22,7 +22,9 @@ describe('NewSelfHostedModel', () => {
   });
 
   it('has a description', () => {
-    expect(wrapper.text()).toMatch('Add a new AI model that can be used for GitLab Duo features.');
+    expect(wrapper.text()).toMatch(
+      'Add a new AI model that can be used for GitLab Duo self-hosted features.',
+    );
   });
 
   it('renders the self-hosted model form and passes the correct props', () => {
diff --git a/ee/spec/frontend/pages/admin/ai/self_hosted_models/self_hosted_model_form_spec.js b/ee/spec/frontend/pages/admin/ai/self_hosted_models/self_hosted_model_form_spec.js
index c7d1728501922..33e398378a58c 100644
--- a/ee/spec/frontend/pages/admin/ai/self_hosted_models/self_hosted_model_form_spec.js
+++ b/ee/spec/frontend/pages/admin/ai/self_hosted_models/self_hosted_model_form_spec.js
@@ -30,7 +30,7 @@ jest.mock('~/lib/utils/url_utility');
 describe('SelfHostedModelForm', () => {
   let wrapper;
 
-  const basePath = '/admin/ai/self_hosted_models';
+  const basePath = '/admin/ai/duo_self_hosted';
   const duoConfigurationSettingsPath = '/admin/gitlab_duo/configuration';
   const createMutationSuccessHandler = jest.fn().mockResolvedValue({
     data: {
diff --git a/ee/spec/helpers/admin/application_settings_helper_spec.rb b/ee/spec/helpers/admin/application_settings_helper_spec.rb
index 86732f7b9a49c..0b01f63343cd0 100644
--- a/ee/spec/helpers/admin/application_settings_helper_spec.rb
+++ b/ee/spec/helpers/admin/application_settings_helper_spec.rb
@@ -88,7 +88,7 @@
             enabled_expanded_logging: enabled_expanded_logging.to_s,
             disabled_direct_connection_method: disabled_direct_code_suggestions.to_s,
             beta_self_hosted_models_enabled: terms_accepted.to_s,
-            toggle_beta_models_path: toggle_beta_models_admin_ai_self_hosted_models_path,
+            toggle_beta_models_path: admin_ai_duo_self_hosted_toggle_beta_models_path,
             duo_pro_visible: expected_duo_pro_visible_value,
             can_manage_self_hosted_models: can_manage_self_hosted_models.to_s,
             ai_gateway_url: ai_gateway_url
diff --git a/ee/spec/lib/sidebars/admin/menus/self_hosted_models_menu_spec.rb b/ee/spec/lib/sidebars/admin/menus/self_hosted_models_menu_spec.rb
index 8aa20fc645578..cce88630d49bc 100644
--- a/ee/spec/lib/sidebars/admin/menus/self_hosted_models_menu_spec.rb
+++ b/ee/spec/lib/sidebars/admin/menus/self_hosted_models_menu_spec.rb
@@ -4,9 +4,9 @@
 
 RSpec.describe Sidebars::Admin::Menus::SelfHostedModelsMenu, feature_category: :navigation do
   it_behaves_like 'Admin menu',
-    link: '/admin/ai/self_hosted_models',
-    title: s_('Admin|Self-hosted models'),
+    link: '/admin/ai/duo_self_hosted',
+    title: s_('Admin|GitLab Duo Self-Hosted'),
     icon: 'machine-learning'
 
-  it_behaves_like 'Admin menu without sub menus', active_routes: { controller: :self_hosted_models }
+  it_behaves_like 'Admin menu without sub menus', active_routes: { controller: :duo_self_hosted }
 end
diff --git a/ee/spec/requests/admin/ai/self_hosted_models_controller_spec.rb b/ee/spec/requests/admin/ai/duo_self_hosted_controller_spec.rb
similarity index 84%
rename from ee/spec/requests/admin/ai/self_hosted_models_controller_spec.rb
rename to ee/spec/requests/admin/ai/duo_self_hosted_controller_spec.rb
index 0f8ba94ee8ee2..054245d073d66 100644
--- a/ee/spec/requests/admin/ai/self_hosted_models_controller_spec.rb
+++ b/ee/spec/requests/admin/ai/duo_self_hosted_controller_spec.rb
@@ -2,7 +2,7 @@
 
 require 'spec_helper'
 
-RSpec.describe Admin::Ai::SelfHostedModelsController, :enable_admin_mode, feature_category: :"self-hosted_models" do
+RSpec.describe Admin::Ai::DuoSelfHostedController, :enable_admin_mode, feature_category: :"self-hosted_models" do
   let(:admin) { create(:admin) }
   let(:duo_features_enabled) { true }
   let_it_be(:license) { create(:license, plan: License::ULTIMATE_PLAN) }
@@ -32,10 +32,10 @@
     let(:page) { Nokogiri::HTML(response.body) }
 
     subject :perform_request do
-      get admin_ai_self_hosted_models_path
+      get admin_ai_duo_self_hosted_path
     end
 
-    it 'returns list of self-hosted models' do
+    it 'returns 200' do
       perform_request
 
       expect(response).to have_gitlab_http_status(:ok)
diff --git a/ee/spec/requests/admin/ai/terms_and_conditions_controller_spec.rb b/ee/spec/requests/admin/ai/terms_and_conditions_controller_spec.rb
index a67277d3b6380..a2b88dc9d07ea 100644
--- a/ee/spec/requests/admin/ai/terms_and_conditions_controller_spec.rb
+++ b/ee/spec/requests/admin/ai/terms_and_conditions_controller_spec.rb
@@ -30,7 +30,7 @@
 
   describe 'POST #toggle_beta_models' do
     subject :perform_request do
-      post toggle_beta_models_admin_ai_self_hosted_models_path
+      post admin_ai_duo_self_hosted_toggle_beta_models_path
     end
 
     context 'if a testing terms acceptance record exists' do
diff --git a/ee/spec/routing/admin_routing_spec.rb b/ee/spec/routing/admin_routing_spec.rb
index 45cc3a0f6b2b5..a12e3b529817e 100644
--- a/ee/spec/routing/admin_routing_spec.rb
+++ b/ee/spec/routing/admin_routing_spec.rb
@@ -40,6 +40,22 @@
     end
   end
 
+  describe Admin::Ai::DuoSelfHostedController, 'routing' do
+    it 'routes /duo_self_hosted to #index' do
+      expect(get('/admin/ai/duo_self_hosted/')).to route_to('admin/ai/duo_self_hosted#index')
+    end
+
+    it 'routes /duo_self_hosted with vue route params to #index' do
+      expect(get('/admin/ai/duo_self_hosted/features')).to route_to('admin/ai/duo_self_hosted#index',
+        vueroute: 'features')
+    end
+
+    it 'routes /duo_self_hosted/toggle_beta_models to terms_and_conditions#toggle_beta_models' do
+      expect(post('/admin/ai/duo_self_hosted/toggle_beta_models'))
+        .to route_to('admin/ai/terms_and_conditions#toggle_beta_models')
+    end
+  end
+
   describe Admin::Geo::SettingsController, 'routing' do
     it 'routes / to #show' do
       expect(get('/admin/geo/settings')).to route_to('admin/geo/settings#show')
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 05d278e27f566..f05e57e8bcabf 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -4064,7 +4064,7 @@ msgstr ""
 msgid "AdminSelfHostedModels|API token"
 msgstr ""
 
-msgid "AdminSelfHostedModels|Add a new AI model that can be used for GitLab Duo features."
+msgid "AdminSelfHostedModels|Add a new AI model that can be used for GitLab Duo self-hosted features."
 msgstr ""
 
 msgid "AdminSelfHostedModels|Add self-hosted model"
@@ -4097,12 +4097,15 @@ msgstr ""
 msgid "AdminSelfHostedModels|Edit self-hosted model"
 msgstr ""
 
-msgid "AdminSelfHostedModels|Edit the AI model that can be used for GitLab Duo features."
+msgid "AdminSelfHostedModels|Edit the AI model that can be used for GitLab Duo self-hosted features."
 msgstr ""
 
 msgid "AdminSelfHostedModels|Endpoint"
 msgstr ""
 
+msgid "AdminSelfHostedModels|GitLab Duo Self-Hosted"
+msgstr ""
+
 msgid "AdminSelfHostedModels|If required, provide the API token that grants access to your self-hosted model deployment."
 msgstr ""
 
@@ -5183,6 +5186,9 @@ msgstr ""
 msgid "Admin|Geo"
 msgstr ""
 
+msgid "Admin|GitLab Duo Self-Hosted"
+msgstr ""
+
 msgid "Admin|Kubernetes"
 msgstr ""
 
@@ -5210,9 +5216,6 @@ msgstr ""
 msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
 msgstr ""
 
-msgid "Admin|Self-hosted models"
-msgstr ""
-
 msgid "Admin|Settings"
 msgstr ""
 
@@ -5426,7 +5429,7 @@ msgstr ""
 msgid "AiPowered|Enroll in the Early Access Program"
 msgstr ""
 
-msgid "AiPowered|Enter the URL for your local AI Gateway. This endpoint is used for self-hosted models requests.%{br}The URL must be a complete URL, including either the \"http://\" or \"https://\" protocol. For example \"http://EXAMPLE-URL\".%{br}For more information, see how to %{linkStart}install the GitLab AI Gateway.%{linkEnd}"
+msgid "AiPowered|Enter the URL for your local AI Gateway. This endpoint is used for GitLab Duo Self-Hosted requests.%{br}The URL must be a complete URL, including either the \"http://\" or \"https://\" protocol. For example \"http://EXAMPLE-URL\".%{br}For more information, see how to %{linkStart}install the GitLab AI Gateway.%{linkEnd}"
 msgstr ""
 
 msgid "AiPowered|Experiment and beta features"
-- 
GitLab