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'; // import './iconfont/iconfont.js';
const IconFont = createFromIconfontCN({ 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; export default IconFont;
@@ -158,7 +158,6 @@ const Inner = styled.div.attrs({
className: '__inner__' className: '__inner__'
})` })`
width: 100%; width: 100%;
display: flex;
`; `;
const Extra = styled.div` const Extra = styled.div`
@@ -6,6 +6,7 @@ const SliderWrapper = styled.div`
height: 100%; height: 100%;
justify-content: center; justify-content: center;
} }
.borderless { .borderless {
background-color: transparent; background-color: transparent;
} }
+2 -1
View File
@@ -22,5 +22,6 @@ export default {
'backend.form.defaultBackendParameters': 'Default Backend Parameters', 'backend.form.defaultBackendParameters': 'Default Backend Parameters',
'backend.form.versionConfig': 'Versions Config', 'backend.form.versionConfig': 'Versions Config',
'backend.form.addParameter': 'Add Parameter', '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.defaultBackendParameters': 'Default Backend Parameters',
'backend.form.versionConfig': 'Versions Config', 'backend.form.versionConfig': 'Versions Config',
'backend.form.addParameter': 'Add Parameter', '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.defaultBackendParameters': 'Default Backend Parameters',
'backend.form.versionConfig': 'Versions Config', 'backend.form.versionConfig': 'Versions Config',
'backend.form.addParameter': 'Add Parameter', '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.defaultBackendParameters': '默认后端参数',
'backend.form.versionConfig': '版本配置', 'backend.form.versionConfig': '版本配置',
'backend.form.addParameter': '添加参数', '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 { PageActionType } from '@/config/types';
import ColumnWrapper from '@/pages/_components/column-wrapper'; import ColumnWrapper from '@/pages/_components/column-wrapper';
import { useIntl } from '@umijs/max'; import { useIntl } from '@umijs/max';
import { Button, Form, Tag } from 'antd'; import { Form, Tag } from 'antd';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import _ from 'lodash'; import _ from 'lodash';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
@@ -194,9 +194,18 @@ const AddModal: React.FC<AddModalProps> = ({
}} }}
></ModalFooter> ></ModalFooter>
) : ( ) : (
<Button type="primary" onClick={handleDone}> <ModalFooter
{intl.formatMessage({ id: 'common.button.done' })} onOk={handleDone}
</Button> 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 <Empty
style={{ width: '100%' }} style={{ width: '100%' }}
image={Empty.PRESENTED_IMAGE_SIMPLE} image={Empty.PRESENTED_IMAGE_SIMPLE}
description="Data not found" description={intl.formatMessage({ id: 'backend.noVersion' })}
/> />
)} )}
</ListWrapper> </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 { downloadFile, listFiles, listModels } from '@huggingface/hub';
import { PipelineType } from '@huggingface/tasks'; import { PipelineType } from '@huggingface/tasks';
import { request } from '@umijs/max'; import { request } from '@umijs/max';
@@ -416,3 +417,34 @@ export async function queryBackendList(params?: { cluster_id: number }) {
params 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 StatusTag from '@/components/status-tag';
import ThemeTag from '@/components/tags-wrapper/theme-tag'; import ThemeTag from '@/components/tags-wrapper/theme-tag';
import Card from '@/components/templates/card'; import Card from '@/components/templates/card';
import { useIntl, useNavigate } from '@umijs/max';
import { Button } from 'antd'; import { Button } from 'antd';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import _ from 'lodash'; import _ from 'lodash';
import React from 'react'; import React from 'react';
import styled from 'styled-components'; import styled from 'styled-components';
import { import {
InstanceStatusMap,
InstanceStatusMapValue, InstanceStatusMapValue,
modelCategories, modelCategories,
modelSourceMap, modelCategoriesMap,
status modelSourceMap
} from '../config'; } from '../config';
import { categoryToPathMap } from '../config/button-actions';
const ModelItemContent = styled.div` const ModelItemContent = styled.div`
display: flex; display: flex;
@@ -87,7 +88,7 @@ const Header = styled.div`
const sourceIconMap = { const sourceIconMap = {
[modelSourceMap.local_path_value]: 'icon-hard-disk', [modelSourceMap.local_path_value]: 'icon-hard-disk',
[modelSourceMap.huggingface_value]: 'icon-huggingface', [modelSourceMap.huggingface_value]: 'icon-huggingface',
[modelSourceMap.modelscope_value]: 'icon-modelscope' [modelSourceMap.modelscope_value]: 'icon-tu2'
}; };
const ModelItem: React.FC<{ const ModelItem: React.FC<{
@@ -95,6 +96,28 @@ const ModelItem: React.FC<{
onClick: (model: any) => void; onClick: (model: any) => void;
}> = (props) => { }> = (props) => {
const { model, onClick } = 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 ( return (
<Card <Card
@@ -113,8 +136,8 @@ const ModelItem: React.FC<{
<StatusTag <StatusTag
maxTooltipWidth={400} maxTooltipWidth={400}
statusValue={{ statusValue={{
status: status[InstanceStatusMap.Running] as any, status: model.state as any,
text: InstanceStatusMapValue[InstanceStatusMap.Running], text: InstanceStatusMapValue[model.state],
message: model.state_message message: model.state_message
}} }}
></StatusTag> ></StatusTag>
@@ -141,8 +164,9 @@ const ModelItem: React.FC<{
className="btn" className="btn"
variant="filled" variant="filled"
color="default" color="default"
onClick={handleOpenPlayGround}
> >
Go to Playground {intl.formatMessage({ id: 'models.openinplayground' })}
</Button> </Button>
</div> </div>
</div> </div>
+9 -3
View File
@@ -1,3 +1,4 @@
import IconFont from '@/components/icon-font';
import ModalFooter from '@/components/modal-footer'; import ModalFooter from '@/components/modal-footer';
import ScrollerModal from '@/components/scroller-modal'; import ScrollerModal from '@/components/scroller-modal';
import SealInput from '@/components/seal-form/seal-input'; 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 SealSwitch from '@/components/seal-form/seal-switch';
import { PageAction, PasswordReg } from '@/config'; import { PageAction, PasswordReg } from '@/config';
import { PageActionType } from '@/config/types'; import { PageActionType } from '@/config/types';
import { UserOutlined, UserSwitchOutlined } from '@ant-design/icons';
import { useIntl } from '@umijs/max'; import { useIntl } from '@umijs/max';
import { Form, Select } from 'antd'; import { Form, Select } from 'antd';
import { useEffect } from 'react'; import { useEffect } from 'react';
@@ -106,9 +106,15 @@ const AddModal: React.FC<AddModalProps> = ({
return ( return (
<Select.Option value={item.value} key={item.value}> <Select.Option value={item.value} key={item.value}>
{item.value === UserRoles.ADMIN ? ( {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"> <span className="m-l-5">
{intl.formatMessage({ id: item.label })} {intl.formatMessage({ id: item.label })}
+1 -1
View File
@@ -281,7 +281,7 @@ const Users: React.FC = () => {
return record.is_admin ? ( return record.is_admin ? (
<AutoTooltip ghost minWidth={50}> <AutoTooltip ghost minWidth={50}>
<IconFont <IconFont
type="icon-admin-user" type="icon-manage_user"
className="size-16" className="size-16"
></IconFont> ></IconFont>
<span className="m-l-5"> <span className="m-l-5">