diff --git a/client/src/pages/number/index.tsx b/client/src/pages/number/index.tsx index 485517a54..c0c64db70 100644 --- a/client/src/pages/number/index.tsx +++ b/client/src/pages/number/index.tsx @@ -13,7 +13,8 @@ import { useQuery } from '@tanstack/react-query'; import dynamic from 'next/dynamic'; import { useSelectFile } from '@/hooks/useSelectFile'; import { compressImg } from '@/utils/file'; -import { useCopyData } from '@/utils/tools'; +import { getErrText, useCopyData } from '@/utils/tools'; +import { authOpenAiKey } from '@/utils/plugin/openai'; import Loading from '@/components/Loading'; import Avatar from '@/components/Avatar'; @@ -83,6 +84,7 @@ const NumberSetting = ({ tableType }: { tableType: `${TableEnum}` }) => { async (data: UserUpdateParams) => { setLoading(true); try { + data.openaiKey && (await authOpenAiKey(data.openaiKey)); await putUserInfo({ openaiKey: data.openaiKey, avatar: data.avatar @@ -96,7 +98,12 @@ const NumberSetting = ({ tableType }: { tableType: `${TableEnum}` }) => { title: '更新成功', status: 'success' }); - } catch (error) {} + } catch (error) { + toast({ + title: getErrText(error), + status: 'error' + }); + } setLoading(false); }, [reset, setLoading, toast, updateUserInfo] diff --git a/client/src/utils/plugin/openai.ts b/client/src/utils/plugin/openai.ts index e19151d6c..161751c84 100644 --- a/client/src/utils/plugin/openai.ts +++ b/client/src/utils/plugin/openai.ts @@ -4,6 +4,8 @@ import { ChatRoleEnum } from '@/constants/chat'; import { ChatCompletionRequestMessage, ChatCompletionRequestMessageRoleEnum } from 'openai'; import { OpenAiChatEnum } from '@/constants/model'; import Graphemer from 'graphemer'; +import axios from 'axios'; +import dayjs from 'dayjs'; const textDecoder = new TextDecoder(); const graphemer = new Graphemer(); @@ -175,3 +177,26 @@ export const openAiSliceTextByToken = ({ const decoder = new TextDecoder(); return decoder.decode(enc.decode(encodeText.slice(0, length))); }; + +export const authOpenAiKey = async (key: string) => { + return axios + .get('https://ccdbwscohpmu.cloud.sealos.io/openai/v1/dashboard/billing/subscription', { + headers: { + Authorization: `Bearer ${key}` + } + }) + .then((res) => { + if (!res.data.access_until) { + return Promise.reject('OpenAI Key 无效,请重试或更换 key'); + } + const keyExpiredTime = dayjs(res.data.access_until * 1000); + const currentTime = dayjs(); + if (keyExpiredTime.isBefore(currentTime)) { + return Promise.reject('OpenAI Key 已过期'); + } + }) + .catch((err) => { + console.log(err); + return Promise.reject(err?.response?.data?.error || 'OpenAI 账号无效,请重试或更换 key'); + }); +};