diff --git a/src/locales/en-US/provider.ts b/src/locales/en-US/provider.ts index 2ce73a26..4270f4b4 100644 --- a/src/locales/en-US/provider.ts +++ b/src/locales/en-US/provider.ts @@ -21,5 +21,6 @@ export default { 'providers.form.addAll': 'Add All', 'providers.form.rules.models': 'Please select at least one model', 'providers.form.rules.tokens': 'Please enter a valid API Key', - 'providers.form.rules.model': 'Please select a model' + 'providers.form.rules.model': 'Please select a model', + 'providers.form.model.duplicate': 'Duplicate model exists' }; diff --git a/src/locales/ja-JP/provider.ts b/src/locales/ja-JP/provider.ts index 2ce73a26..4270f4b4 100644 --- a/src/locales/ja-JP/provider.ts +++ b/src/locales/ja-JP/provider.ts @@ -21,5 +21,6 @@ export default { 'providers.form.addAll': 'Add All', 'providers.form.rules.models': 'Please select at least one model', 'providers.form.rules.tokens': 'Please enter a valid API Key', - 'providers.form.rules.model': 'Please select a model' + 'providers.form.rules.model': 'Please select a model', + 'providers.form.model.duplicate': 'Duplicate model exists' }; diff --git a/src/locales/ru-RU/provider.ts b/src/locales/ru-RU/provider.ts index 2ce73a26..4270f4b4 100644 --- a/src/locales/ru-RU/provider.ts +++ b/src/locales/ru-RU/provider.ts @@ -21,5 +21,6 @@ export default { 'providers.form.addAll': 'Add All', 'providers.form.rules.models': 'Please select at least one model', 'providers.form.rules.tokens': 'Please enter a valid API Key', - 'providers.form.rules.model': 'Please select a model' + 'providers.form.rules.model': 'Please select a model', + 'providers.form.model.duplicate': 'Duplicate model exists' }; diff --git a/src/locales/zh-CN/provider.ts b/src/locales/zh-CN/provider.ts index 914d3f8b..6b624ecc 100644 --- a/src/locales/zh-CN/provider.ts +++ b/src/locales/zh-CN/provider.ts @@ -21,5 +21,6 @@ export default { 'providers.form.addAll': '添加全部', 'providers.form.rules.models': '请选择至少一个模型', 'providers.form.rules.tokens': '请输入有效的 API Key', - 'providers.form.rules.model': '请选择模型' + 'providers.form.rules.model': '请选择模型', + 'providers.form.model.duplicate': '存在相同的模型' }; diff --git a/src/pages/maas-provider/forms/model-item.tsx b/src/pages/maas-provider/forms/model-item.tsx index 58a79690..f0e0cacc 100644 --- a/src/pages/maas-provider/forms/model-item.tsx +++ b/src/pages/maas-provider/forms/model-item.tsx @@ -55,6 +55,7 @@ const ModelItem: React.FC = ({ const form = Form.useFormInstance(); const { runTestModel, loading: testLoading } = useTestProviderModel(); const { id, action, currentData } = useFormContext(); + const [openTip, setOpenTip] = React.useState(false); const generateCurrentAPIKey = (currentAPIKey: string) => { if ( @@ -87,6 +88,7 @@ const ModelItem: React.FC = ({ }; const handleOnChange = (value: string, option: any) => { + console.log('selected model', value, option); onChange({ ...option, name: value @@ -100,13 +102,26 @@ const ModelItem: React.FC = ({ }); }; - const renderSuffixIcon = () => { - console.log( - 'testLoading', - testLoading, - item.accessible, - item.accessible === false + const handleOnBlur = (e: any) => { + const value = e.target.value; + + const isDuplicate = selectedModelList.some( + (model) => model.name === value && model !== item ); + setOpenTip(isDuplicate); + // if duplicate, clear the value, and close the tooltip after 2 seconds + if (isDuplicate) { + onChange({ + ...item, + name: '' + }); + setTimeout(() => { + setOpenTip(false); + }, 2000); + } + }; + + const renderSuffixIcon = () => { if (testLoading) { return ; } @@ -140,26 +155,36 @@ const ModelItem: React.FC = ({ return ( - { - return ( - option!.value.toLowerCase().includes(inputValue.toLowerCase()) || - option.label - ?.toString() - .toLowerCase() - .includes(inputValue.toLowerCase()) - ); - } - }} - onOpenChange={onOpenChange} - suffixIcon={renderSuffixIcon()} - value={item.name} - onChange={handleOnChange} - options={filteredOptions} - placeholder={intl.formatMessage({ id: 'providers.table.models' })} - /> + + + { + return ( + option!.value + .toLowerCase() + .includes(inputValue.toLowerCase()) || + option.label + ?.toString() + .toLowerCase() + .includes(inputValue.toLowerCase()) + ); + } + }} + onOpenChange={onOpenChange} + suffixIcon={renderSuffixIcon()} + value={item.name} + onChange={handleOnChange} + onBlur={handleOnBlur} + options={filteredOptions} + placeholder={intl.formatMessage({ id: 'providers.table.models' })} + /> + + { await form.validateFields(['api_key', ['config', 'type']]); const currentAPIKey = form.getFieldValue('api_key') || ''; - console.log('handleOpenChange', { open, currentAPIKey }); // Avoid repeated requests with the same API key if (