From 02e53949243a0244d23678488fed95cefc20ebef Mon Sep 17 00:00:00 2001 From: scarqin Date: Wed, 25 Dec 2024 20:23:47 +0800 Subject: [PATCH] feat: add api keys --- .../src/components/AIProviderSelect/index.tsx | 26 +++- .../keySettings/components/ApiKeyModal.tsx | 139 +++++++++--------- .../core/src/pages/keySettings/index.tsx | 47 ++---- 3 files changed, 99 insertions(+), 113 deletions(-) diff --git a/frontend/packages/core/src/components/AIProviderSelect/index.tsx b/frontend/packages/core/src/components/AIProviderSelect/index.tsx index d0690cd5..3433e92c 100644 --- a/frontend/packages/core/src/components/AIProviderSelect/index.tsx +++ b/frontend/packages/core/src/components/AIProviderSelect/index.tsx @@ -4,12 +4,14 @@ import { Select, Space, message } from 'antd' import React, { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' -interface AIProvider { +export interface AIProvider { id: string name: string logo: string configured: boolean + getApikeyUrl: string status: string + config: string } interface AIProviderResponse { @@ -24,7 +26,7 @@ interface AIProviderResponse { interface AIProviderSelectProps { value?: string - onChange?: (value: string) => void + onChange?: (value: string, provider: AIProvider) => void style?: React.CSSProperties } @@ -35,24 +37,33 @@ const AIProviderSelect: React.FC = ({ value, onChange, st const { fetchData } = useFetch() useEffect(() => { + let isMounted = true const fetchProviders = async () => { - setLoading(true) + if (isMounted) setLoading(true) try { const response = await fetchData('simple/ai/providers', { method: 'GET' }) const { code, data, msg } = response if (code === STATUS_CODE.SUCCESS) { - setProviders(data.providers) + isMounted && setProviders(data.providers) + if (!data.providers?.length) return + + const selectedProvider: AIProvider = value ? providers.find((p) => p.id === value) : data.providers[0] + onChange?.(selectedProvider.id, selectedProvider) } else { message.error(msg || t('Failed to fetch AI providers')) } } catch (error) { message.error(t('Failed to fetch AI providers')) } finally { - setLoading(false) + isMounted && setLoading(false) } } fetchProviders() + + return () => { + isMounted = false + } }, []) return ( @@ -60,7 +71,10 @@ const AIProviderSelect: React.FC = ({ value, onChange, st {t('AI 供应商')}: - - {$t('API Key')} - {mode === 'add' && ( - - {$t('从 OpenAI 获取 API Key')} - - )} - - } - rules={[{ required: true, message: $t('请输入 API Key') }]} - > - {mode === 'add' ? ( -