fix: my models

This commit is contained in:
jialin
2025-10-13 15:21:17 +08:00
parent f42f159785
commit d3f39ae06b
13 changed files with 97 additions and 22 deletions
+1 -1
View File
@@ -2,7 +2,7 @@ import { createFromIconfontCN } from '@ant-design/icons';
// import './iconfont/iconfont.js';
const IconFont = createFromIconfontCN({
scriptUrl: '//at.alicdn.com/t/c/font_4613488_759c66g4c2g.js'
scriptUrl: '//at.alicdn.com/t/c/font_4613488_lg2z989p7f.js'
});
export default IconFont;
@@ -158,7 +158,6 @@ const Inner = styled.div.attrs({
className: '__inner__'
})`
width: 100%;
display: flex;
`;
const Extra = styled.div`
@@ -6,6 +6,7 @@ const SliderWrapper = styled.div`
height: 100%;
justify-content: center;
}
.borderless {
background-color: transparent;
}
+2 -1
View File
@@ -22,5 +22,6 @@ export default {
'backend.form.defaultBackendParameters': 'Default Backend Parameters',
'backend.form.versionConfig': 'Versions Config',
'backend.form.addParameter': 'Add Parameter',
'backend.form.noVersion': 'No versions added'
'backend.form.noVersion': 'No versions added',
'backend.noVersion': 'No versions found'
};
+2 -1
View File
@@ -22,5 +22,6 @@ export default {
'backend.form.defaultBackendParameters': 'Default Backend Parameters',
'backend.form.versionConfig': 'Versions Config',
'backend.form.addParameter': 'Add Parameter',
'backend.form.noVersion': 'No versions added'
'backend.form.noVersion': 'No versions added',
'backend.noVersion': 'No versions found'
};
+2 -1
View File
@@ -22,5 +22,6 @@ export default {
'backend.form.defaultBackendParameters': 'Default Backend Parameters',
'backend.form.versionConfig': 'Versions Config',
'backend.form.addParameter': 'Add Parameter',
'backend.form.noVersion': 'No versions added'
'backend.form.noVersion': 'No versions added',
'backend.noVersion': 'No versions found'
};
+2 -1
View File
@@ -22,5 +22,6 @@ export default {
'backend.form.defaultBackendParameters': '默认后端参数',
'backend.form.versionConfig': '版本配置',
'backend.form.addParameter': '添加参数',
'backend.form.noVersion': '未添加版本'
'backend.form.noVersion': '未添加版本',
'backend.noVersion': '未找到版本'
};
@@ -6,7 +6,7 @@ import { PageAction } from '@/config';
import { PageActionType } from '@/config/types';
import ColumnWrapper from '@/pages/_components/column-wrapper';
import { useIntl } from '@umijs/max';
import { Button, Form, Tag } from 'antd';
import { Form, Tag } from 'antd';
import dayjs from 'dayjs';
import _ from 'lodash';
import { useEffect, useState } from 'react';
@@ -194,9 +194,18 @@ const AddModal: React.FC<AddModalProps> = ({
}}
></ModalFooter>
) : (
<Button type="primary" onClick={handleDone}>
{intl.formatMessage({ id: 'common.button.done' })}
</Button>
<ModalFooter
onOk={handleDone}
onCancel={onCancel}
loading={loading}
okText={intl.formatMessage({ id: 'common.button.done' })}
showCancelBtn={false}
style={{
padding: '16px 24px',
display: 'flex',
justifyContent: 'flex-end'
}}
></ModalFooter>
)
}
>
+1 -1
View File
@@ -174,7 +174,7 @@ const VersionList: React.FC<{ versionConfigs: VersionListItem[] }> = ({
<Empty
style={{ width: '100%' }}
image={Empty.PRESENTED_IMAGE_SIMPLE}
description="Data not found"
description={intl.formatMessage({ id: 'backend.noVersion' })}
/>
)}
</ListWrapper>
+32
View File
@@ -1,3 +1,4 @@
import { ListItem as UserListItem } from '@/pages/users/config/types';
import { downloadFile, listFiles, listModels } from '@huggingface/hub';
import { PipelineType } from '@huggingface/tasks';
import { request } from '@umijs/max';
@@ -416,3 +417,34 @@ export async function queryBackendList(params?: { cluster_id: number }) {
params
});
}
export async function queryModelAccessUserList(id: number) {
return request<{ items: UserListItem[] }>(`${MODELS_API}/${id}/access`, {
method: 'GET'
});
}
export async function updateModelAccessUser(params: {
id: number;
data: { users: { id: number }[]; set_public: boolean };
}) {
return request(`${MODELS_API}/${params.id}/access`, {
method: 'POST',
data: params.data
});
}
export async function queryMyModels(params: Global.SearchParams) {
return request<Global.PageResponse<ListItem>>(
`${MY_MODELS_API}?${qs.stringify(params)}`,
{
method: 'GET'
}
);
}
export async function queryMyModelDetail(id: number) {
return request(`${MY_MODELS_API}/${id}`, {
method: 'GET'
});
}
+31 -7
View File
@@ -2,18 +2,19 @@ import IconFont from '@/components/icon-font';
import StatusTag from '@/components/status-tag';
import ThemeTag from '@/components/tags-wrapper/theme-tag';
import Card from '@/components/templates/card';
import { useIntl, useNavigate } from '@umijs/max';
import { Button } from 'antd';
import dayjs from 'dayjs';
import _ from 'lodash';
import React from 'react';
import styled from 'styled-components';
import {
InstanceStatusMap,
InstanceStatusMapValue,
modelCategories,
modelSourceMap,
status
modelCategoriesMap,
modelSourceMap
} from '../config';
import { categoryToPathMap } from '../config/button-actions';
const ModelItemContent = styled.div`
display: flex;
@@ -87,7 +88,7 @@ const Header = styled.div`
const sourceIconMap = {
[modelSourceMap.local_path_value]: 'icon-hard-disk',
[modelSourceMap.huggingface_value]: 'icon-huggingface',
[modelSourceMap.modelscope_value]: 'icon-modelscope'
[modelSourceMap.modelscope_value]: 'icon-tu2'
};
const ModelItem: React.FC<{
@@ -95,6 +96,28 @@ const ModelItem: React.FC<{
onClick: (model: any) => void;
}> = (props) => {
const { model, onClick } = props;
const intl = useIntl();
const navigate = useNavigate();
const handleOpenPlayGround = () => {
for (const [category, path] of Object.entries(categoryToPathMap)) {
if (
model.categories?.includes(category) &&
[
modelCategoriesMap.text_to_speech,
modelCategoriesMap.speech_to_text
].includes(category)
) {
navigate(`${path}&model=${model.name}`);
return;
}
if (model.categories?.includes(category)) {
navigate(`${path}?model=${model.name}`);
return;
}
}
navigate(`/playground/chat?model=${model.name}`);
};
return (
<Card
@@ -113,8 +136,8 @@ const ModelItem: React.FC<{
<StatusTag
maxTooltipWidth={400}
statusValue={{
status: status[InstanceStatusMap.Running] as any,
text: InstanceStatusMapValue[InstanceStatusMap.Running],
status: model.state as any,
text: InstanceStatusMapValue[model.state],
message: model.state_message
}}
></StatusTag>
@@ -141,8 +164,9 @@ const ModelItem: React.FC<{
className="btn"
variant="filled"
color="default"
onClick={handleOpenPlayGround}
>
Go to Playground
{intl.formatMessage({ id: 'models.openinplayground' })}
</Button>
</div>
</div>
+9 -3
View File
@@ -1,3 +1,4 @@
import IconFont from '@/components/icon-font';
import ModalFooter from '@/components/modal-footer';
import ScrollerModal from '@/components/scroller-modal';
import SealInput from '@/components/seal-form/seal-input';
@@ -5,7 +6,6 @@ import SealSelect from '@/components/seal-form/seal-select';
import SealSwitch from '@/components/seal-form/seal-switch';
import { PageAction, PasswordReg } from '@/config';
import { PageActionType } from '@/config/types';
import { UserOutlined, UserSwitchOutlined } from '@ant-design/icons';
import { useIntl } from '@umijs/max';
import { Form, Select } from 'antd';
import { useEffect } from 'react';
@@ -106,9 +106,15 @@ const AddModal: React.FC<AddModalProps> = ({
return (
<Select.Option value={item.value} key={item.value}>
{item.value === UserRoles.ADMIN ? (
<UserSwitchOutlined className="size-16" />
<IconFont
type="icon-manage_user"
className="size-16"
></IconFont>
) : (
<UserOutlined className="size-16" />
<IconFont
type="icon-user"
className="size-16"
></IconFont>
)}
<span className="m-l-5">
{intl.formatMessage({ id: item.label })}
+1 -1
View File
@@ -281,7 +281,7 @@ const Users: React.FC = () => {
return record.is_admin ? (
<AutoTooltip ghost minWidth={50}>
<IconFont
type="icon-admin-user"
type="icon-manage_user"
className="size-16"
></IconFont>
<span className="m-l-5">