diff --git a/src/components/seal-form/wrapper/select.ts b/src/components/seal-form/wrapper/select.ts index 6eb6184c..9091971a 100644 --- a/src/components/seal-form/wrapper/select.ts +++ b/src/components/seal-form/wrapper/select.ts @@ -89,13 +89,18 @@ const SelectWrapper = styled.div` } .ant-select-placeholder { position: absolute; - top: 10px; + top: 1px; left: 0; right: 0; } .ant-select .ant-select-content { padding-block: 0px 0; } + .ant-select-auto-complete { + .ant-select-placeholder { + top: 1px; + } + } .ant-select.ant-cascader { .ant-select-placeholder { top: 0px !important; diff --git a/src/pages/llmodels/hooks/index.ts b/src/pages/llmodels/hooks/index.ts index 4559840a..4318f504 100644 --- a/src/pages/llmodels/hooks/index.ts +++ b/src/pages/llmodels/hooks/index.ts @@ -271,6 +271,12 @@ export const useCheckCompatibility = () => { let compatibilityMessage = compatibility_messages.join(' '); + compatibilityMessage = compatibilityMessage.startsWith( + `The model file path you specified does not exist on the GPUStack server. It's recommended` + ) + ? intl.formatMessage({ id: 'models.form.modelfile.notfound' }) + : compatibilityMessage; + let msgData = { title: scheduling_messages?.length > 0 ? compatibilityMessage : '', message: diff --git a/src/pages/maas-provider/forms/advance-config.tsx b/src/pages/maas-provider/forms/advance-config.tsx index ab900e78..37a9dae0 100644 --- a/src/pages/maas-provider/forms/advance-config.tsx +++ b/src/pages/maas-provider/forms/advance-config.tsx @@ -1,12 +1,15 @@ +import IconFont from '@/components/icon-font'; import SealInput from '@/components/seal-form/seal-input'; import { PageActionType } from '@/config/types'; import YamlEditor from '@/pages/_components/yaml-editor'; import { useIntl } from '@umijs/max'; -import { Form } from 'antd'; +import { Button, Form } from 'antd'; import React, { forwardRef, useImperativeHandle } from 'react'; import APIKeys from './api-keys'; import ProxyConfig from './proxy-config'; +const referLink = `https://higress.cn/docs/latest/plugins/ai/api-provider/ai-proxy/?spm=36971b57.3562eb7c.0.0.31764f5f7uLs2F#%E6%8F%90%E4%BE%9B%E5%95%86%E7%89%B9%E6%9C%89%E9%85%8D%E7%BD%AE`; + const AdvanceConfig: React.FC<{ action: PageActionType; ref?: any; @@ -45,7 +48,18 @@ const AdvanceConfig: React.FC<{ + {`${intl.formatMessage({ id: 'providers.form.customConfig' })} YAML`} + + + } value={fileContent} height={300} onUpload={(content) => { diff --git a/src/pages/maas-provider/forms/basic.tsx b/src/pages/maas-provider/forms/basic.tsx index 53879341..2289ad15 100644 --- a/src/pages/maas-provider/forms/basic.tsx +++ b/src/pages/maas-provider/forms/basic.tsx @@ -21,6 +21,13 @@ const Basic = () => { ); }; + const filterOption = (input: string, option?: any) => { + return ( + option?.label?.toLowerCase().includes(input.toLowerCase()) || + option?.value?.toLowerCase().includes(input.toLowerCase()) + ); + }; + return ( <> name="name" data-field="name"> @@ -38,19 +45,21 @@ const Basic = () => { required: true, message: getRuleMessage( 'select', - intl.formatMessage({ id: 'providers.table.providerName' }) + intl.formatMessage({ id: 'common.table.type' }) ) } ]} > diff --git a/src/pages/maas-provider/forms/model-item.tsx b/src/pages/maas-provider/forms/model-item.tsx index 30084f0a..c732ec79 100644 --- a/src/pages/maas-provider/forms/model-item.tsx +++ b/src/pages/maas-provider/forms/model-item.tsx @@ -1,3 +1,4 @@ +import AutoComplete from '@/components/seal-form/auto-complete'; import SealSelect from '@/components/seal-form/seal-select'; import { categoryOptions } from '@/pages/llmodels/config'; import { @@ -28,7 +29,8 @@ const SelectWrapper = styled.div` interface ModelItemProps { onOpenChange: (open: boolean) => void; onChange: (data: ProviderModel) => void; - providerModelList: ProviderModel[]; + providerModelList: Global.BaseOption[]; + selectedModelList: ProviderModel[]; item: ProviderModel; loading?: boolean; } @@ -38,6 +40,7 @@ const ModelItem: React.FC = ({ onChange, loading, providerModelList, + selectedModelList, item }) => { const intl = useIntl(); @@ -96,20 +99,30 @@ const ModelItem: React.FC = ({ return null; }; + // filter out already selected models, but keep the current one + const selectedModelMap = new Map( + selectedModelList?.map((model) => [model.name, true]) + ); + const filteredOptions = () => { + return providerModelList.filter((model) => { + return model.value === item.name || !selectedModelMap.has(model.value); + }); + }; + return ( - { {(item, index) => ( onChange(data, index)} loading={loading} diff --git a/src/pages/model-routes/components/route-targets.tsx b/src/pages/model-routes/components/route-targets.tsx index 75767d9c..a8076528 100644 --- a/src/pages/model-routes/components/route-targets.tsx +++ b/src/pages/model-routes/components/route-targets.tsx @@ -33,11 +33,6 @@ interface TargetItemProps { } export const childActionList = [ - // { - // key: 'fallback', - // label: 'routes.table.setAsFallback', - // icon: - // }, { key: 'delete', label: 'common.button.delete',