Skip to content
代码片段 群组 项目
未验证 提交 4096e3ae 编辑于 作者: Tomas Bulva's avatar Tomas Bulva 提交者: GitLab
浏览文件

Merge branch 'jh/front-end-tweaks-to-self-hosted-models-table' into 'master'

Align self-hosted models UI to new designs

See merge request https://gitlab.com/gitlab-org/gitlab/-/merge_requests/167127



Merged-by: default avatarTomas Bulva <tbulva@gitlab.com>
Approved-by: default avatarEduardo Bonet <ebonet@gitlab.com>
Approved-by: default avatarTim Noah <tnoah@gitlab.com>
Approved-by: default avatarTomas Bulva <tbulva@gitlab.com>
Co-authored-by: default avatarJulie Huang <julhuang@gitlab.com>
No related branches found
No related tags found
无相关合并请求
<script> <script>
import { GlEmptyState, GlButton, GlSkeletonLoader } from '@gitlab/ui'; import { GlEmptyState, GlButton, GlSkeletonLoader } from '@gitlab/ui';
import EmptyLabelsSvg from '@gitlab/svgs/dist/illustrations/empty-state/empty-labels-md.svg?url'; import EmptyEnvironmentSvg from '@gitlab/svgs/dist/illustrations/empty-state/empty-environment-md.svg?url';
import { s__ } from '~/locale'; import { s__ } from '~/locale';
import { createAlert } from '~/alert'; import { createAlert } from '~/alert';
import getSelfHostedModelsQuery from '../queries/get_self_hosted_models.query.graphql'; import getSelfHostedModelsQuery from '../queries/get_self_hosted_models.query.graphql';
...@@ -25,11 +25,11 @@ export default { ...@@ -25,11 +25,11 @@ export default {
}, },
}, },
i18n: { i18n: {
emptyStateTitle: s__('AdminSelfHostedModels|Define your set of self-hosted models'), emptyStateTitle: s__('AdminSelfHostedModels|Get started with Selfhosted models'),
emptyStateDescription: s__( emptyStateDescription: s__(
'AdminSelfHostedModels|Add self-hosted language models to use as backups for GitLab Duo features.', 'AdminSelfHostedModels|Add and manage models that can be used for GitLab AI features.',
), ),
emptyStatePrimaryButtonText: s__('AdminSelfHostedModels|New self-hosted model'), emptyStatePrimaryButtonText: s__('AdminSelfHostedModels|Add self-hosted model'),
errorMessage: s__( errorMessage: s__(
'AdminSelfHostedModels|An error occurred while loading self-hosted models. Please try again.', 'AdminSelfHostedModels|An error occurred while loading self-hosted models. Please try again.',
), ),
...@@ -58,45 +58,42 @@ export default { ...@@ -58,45 +58,42 @@ export default {
return this.$apollo?.queries?.selfHostedModels?.loading; return this.$apollo?.queries?.selfHostedModels?.loading;
}, },
}, },
emptyStateSvgPath: EmptyLabelsSvg, emptyStateSvgPath: EmptyEnvironmentSvg,
}; };
</script> </script>
<template> <template>
<div> <div>
<section>
<h1 class="page-title gl-text-size-h-display">
{{ s__('AdminSelfHostedModels|Self-hosted models') }}
</h1>
<div class="gl-items-top gl-flex gl-justify-between">
<p>
{{
s__(
'AdminSelfHostedModels|Self-hosted AI models can be used to power GitLab AI features.',
)
}}
</p>
<div v-if="hasModels" class="gl-pb-4">
<gl-button
category="primary"
variant="confirm"
size="small"
:href="newSelfHostedModelPath"
>{{ s__('AdminSelfHostedModels|New model') }}
</gl-button>
</div>
</div>
</section>
<div v-if="!hasModels && !isLoading"> <div v-if="!hasModels && !isLoading">
<gl-empty-state <div class="justify-content-center gl-flex gl-items-center">
:title="$options.i18n.emptyStateTitle" <gl-empty-state
:description="$options.i18n.emptyStateDescription" class="gl-w-1/4"
:svg-path="$options.emptyStateSvgPath" :title="$options.i18n.emptyStateTitle"
:svg-height="150" :description="$options.i18n.emptyStateDescription"
:primary-button-text="$options.i18n.emptyStatePrimaryButtonText" :svg-path="$options.emptyStateSvgPath"
:primary-button-link="newSelfHostedModelPath" :svg-height="150"
/> :primary-button-text="$options.i18n.emptyStatePrimaryButtonText"
:primary-button-link="newSelfHostedModelPath"
/>
</div>
</div> </div>
<div v-else> <div v-else>
<section>
<h1 class="page-title gl-text-size-h-display">
{{ s__('AdminSelfHostedModels|Self-hosted models') }}
</h1>
<div class="gl-items-top gl-flex gl-justify-between gl-pb-2">
<p>
{{
s__('AdminSelfHostedModels|Manage AI models that can be used for GitLab AI features.')
}}
</p>
<div v-if="hasModels" class="gl-pb-4">
<gl-button category="primary" variant="confirm" :href="newSelfHostedModelPath"
>{{ s__('AdminSelfHostedModels|Add self-hosted model') }}
</gl-button>
</div>
</div>
</section>
<gl-skeleton-loader v-if="isLoading" /> <gl-skeleton-loader v-if="isLoading" />
<self-hosted-models-table v-else :models="selfHostedModels" :base-path="basePath" /> <self-hosted-models-table v-else :models="selfHostedModels" :base-path="basePath" />
</div> </div>
......
...@@ -24,32 +24,32 @@ export default { ...@@ -24,32 +24,32 @@ export default {
fields: [ fields: [
{ {
key: 'name', key: 'name',
label: __('Name'), label: s__('AdminSelfHostedModels|Name'),
thClass: 'w-15p', thClass: 'gl-w-2/8',
tdClass: 'gl-content-center', tdClass: 'gl-content-center',
}, },
{ {
key: 'model', key: 'model',
label: __('Model'), label: s__('AdminSelfHostedModels|Model'),
thClass: 'w-15p', thClass: 'gl-w-2/8',
tdClass: 'gl-content-center', tdClass: 'gl-content-center',
}, },
{ {
key: 'endpoint', key: 'endpoint',
label: s__('AdminSelfHostedModels|Endpoint'), label: s__('AdminSelfHostedModels|Endpoint'),
thClass: 'w-15p', thClass: 'gl-w-2/8',
tdClass: 'gl-content-center gl-text-ellipsis', tdClass: 'gl-content-center gl-text-ellipsis',
}, },
{ {
key: 'has_api_key', key: 'has_api_key',
label: __('API key'), label: s__('AdminSelfHostedModels|API token'),
thClass: 'w-15p', thClass: 'gl-w-1/8 gl-text-center',
tdClass: 'gl-content-center', tdClass: 'gl-content-center gl-text-center',
}, },
{ {
key: 'edit', key: 'edit',
label: '', label: '',
thClass: 'w-15p', thClass: 'gl-w-1/8',
tdClass: 'gl-content-center gl-text-right', tdClass: 'gl-content-center gl-text-right',
}, },
], ],
...@@ -84,20 +84,15 @@ export default { ...@@ -84,20 +84,15 @@ export default {
<template #cell(has_api_key)="{ item }"> <template #cell(has_api_key)="{ item }">
<gl-icon <gl-icon
v-if="item.hasApiToken" v-if="item.hasApiToken"
:aria-label="s__('AdminSelfHostedModels|Model has API key')" :aria-label="s__('AdminSelfHostedModels|Model uses an API token')"
name="check-xs" name="check-circle"
/>
<gl-icon
v-else
:aria-label="s__('AdminSelfHostedModels|Model does not have API key')"
name="close-xs"
/> />
</template> </template>
<template #cell(edit)="{ item }"> <template #cell(edit)="{ item }">
<div> <div>
<gl-disclosure-dropdown <gl-disclosure-dropdown
class="gl-py-2"
category="tertiary" category="tertiary"
variant="default"
size="small" size="small"
icon="ellipsis_v" icon="ellipsis_v"
:no-caret="true" :no-caret="true"
......
...@@ -65,7 +65,7 @@ describe('SelfHostedModelsApp', () => { ...@@ -65,7 +65,7 @@ describe('SelfHostedModelsApp', () => {
it('renders button to create new self-hosted model', () => { it('renders button to create new self-hosted model', () => {
const button = findButton(); const button = findButton();
expect(button.text()).toBe('New model'); expect(button.text()).toBe('Add self-hosted model');
expect(button.attributes('href')).toBe('/admin/ai/self_hosted_models/new'); expect(button.attributes('href')).toBe('/admin/ai/self_hosted_models/new');
}); });
}); });
......
...@@ -12,7 +12,7 @@ export const mockSelfHostedModelsList = [ ...@@ -12,7 +12,7 @@ export const mockSelfHostedModelsList = [
name: 'mock-self-hosted-model-1', name: 'mock-self-hosted-model-1',
model: 'mixtral', model: 'mixtral',
endpoint: 'https://mock-endpoint-1.com', endpoint: 'https://mock-endpoint-1.com',
hasApiToken: false, hasApiToken: true,
}, },
{ {
id: 'gid://gitlab/SelfHostedModel/2', id: 'gid://gitlab/SelfHostedModel/2',
......
...@@ -37,7 +37,7 @@ describe('SelfHostedModelsTable', () => { ...@@ -37,7 +37,7 @@ describe('SelfHostedModelsTable', () => {
'Name', 'Name',
'Model', 'Model',
'Endpoint', 'Endpoint',
'API key', 'API token',
'', // The 'edit' column does not have a header name '', // The 'edit' column does not have a header name
]; ];
...@@ -51,8 +51,8 @@ describe('SelfHostedModelsTable', () => { ...@@ -51,8 +51,8 @@ describe('SelfHostedModelsTable', () => {
expect(firstModel.text()).toContain('mock-self-hosted-model-1'); expect(firstModel.text()).toContain('mock-self-hosted-model-1');
expect(firstModel.text()).toContain('mixtral'); expect(firstModel.text()).toContain('mixtral');
expect(firstModel.text()).toContain('https://mock-endpoint-1.com');
expect(firstModel.find('[data-testid="close-xs-icon"]').exists()).toBe(true); expect(firstModel.find('[data-testid="check-circle-icon"]').exists()).toBe(true);
}); });
it('renders a disclosure dropdown for each self-hosted model entry', () => { it('renders a disclosure dropdown for each self-hosted model entry', () => {
......
...@@ -3868,15 +3868,24 @@ msgstr "" ...@@ -3868,15 +3868,24 @@ msgstr ""
msgid "AdminSelfHostedModels|API Key (optional)" msgid "AdminSelfHostedModels|API Key (optional)"
msgstr "" msgstr ""
   
msgid "AdminSelfHostedModels|API token"
msgstr ""
msgid "AdminSelfHostedModels|API token (if needed)" msgid "AdminSelfHostedModels|API token (if needed)"
msgstr "" 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 features."
msgstr "" msgstr ""
   
msgid "AdminSelfHostedModels|Add and manage models that can be used for GitLab AI features."
msgstr ""
msgid "AdminSelfHostedModels|Add self-hosted language models to use as backups for GitLab Duo features." msgid "AdminSelfHostedModels|Add self-hosted language models to use as backups for GitLab Duo features."
msgstr "" msgstr ""
   
msgid "AdminSelfHostedModels|Add self-hosted model"
msgstr ""
msgid "AdminSelfHostedModels|Add self-hosted models" msgid "AdminSelfHostedModels|Add self-hosted models"
msgstr "" msgstr ""
   
...@@ -3919,19 +3928,22 @@ msgstr "" ...@@ -3919,19 +3928,22 @@ msgstr ""
msgid "AdminSelfHostedModels|Endpoint" msgid "AdminSelfHostedModels|Endpoint"
msgstr "" msgstr ""
   
msgid "AdminSelfHostedModels|Model" msgid "AdminSelfHostedModels|Get started with Self‑hosted models"
msgstr ""
msgid "AdminSelfHostedModels|Manage AI models that can be used for GitLab AI features."
msgstr "" msgstr ""
   
msgid "AdminSelfHostedModels|Model does not have API key" msgid "AdminSelfHostedModels|Model"
msgstr "" msgstr ""
   
msgid "AdminSelfHostedModels|Model has API key" msgid "AdminSelfHostedModels|Model uses an API token"
msgstr "" msgstr ""
   
msgid "AdminSelfHostedModels|Name the deployment (must be unique)" msgid "AdminSelfHostedModels|Name"
msgstr "" msgstr ""
   
msgid "AdminSelfHostedModels|New model" msgid "AdminSelfHostedModels|Name the deployment (must be unique)"
msgstr "" msgstr ""
   
msgid "AdminSelfHostedModels|New self-hosted model" msgid "AdminSelfHostedModels|New self-hosted model"
...@@ -3955,9 +3967,6 @@ msgstr "" ...@@ -3955,9 +3967,6 @@ msgstr ""
msgid "AdminSelfHostedModels|Select model" msgid "AdminSelfHostedModels|Select model"
msgstr "" msgstr ""
   
msgid "AdminSelfHostedModels|Self-hosted AI models can be used to power GitLab AI features."
msgstr ""
msgid "AdminSelfHostedModels|Self-hosted models" msgid "AdminSelfHostedModels|Self-hosted models"
msgstr "" msgstr ""
   
...@@ -34944,9 +34953,6 @@ msgstr "" ...@@ -34944,9 +34953,6 @@ msgstr ""
msgid "Modal|Close" msgid "Modal|Close"
msgstr "" msgstr ""
   
msgid "Model"
msgstr ""
msgid "Model description" msgid "Model description"
msgstr "" msgstr ""
   
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册