diff --git a/.env.template b/.env.template index a33d2433b..63b43ae6e 100644 --- a/.env.template +++ b/.env.template @@ -1,8 +1,6 @@ # proxy # AXIOS_PROXY_HOST=127.0.0.1 # AXIOS_PROXY_PORT=7890 -# OPENAI_BASE_URL=https://api.openai.com/v1 -# OPENAI_BASE_URL_AUTH=可选的安全凭证 # 是否开启队列任务。 1-开启,0-关闭(请求parentUrl去执行任务,单机时直接填1) queueTask=1 parentUrl=https://hostname/api/openapi/startEvents @@ -17,7 +15,13 @@ aliTemplateCode=SMS_xxx # token TOKEN_KEY=xxx # openai +# OPENAI_BASE_URL=https://api.openai.com/v1 +# OPENAI_BASE_URL_AUTH=可选的安全凭证 OPENAIKEY=sk-xxx +GPT4KEY=sk-xxx +# claude +CLAUDE_BASE_URL=calude模型请求地址 +CLAUDE_KEY=CLAUDE_KEY # db MONGODB_URI=mongodb://username:password@0.0.0.0:27017/test?authSource=admin PG_HOST=0.0.0.0 diff --git a/docs/deploy/docker.md b/docs/deploy/docker.md index a48b28492..536d14ec4 100644 --- a/docs/deploy/docker.md +++ b/docs/deploy/docker.md @@ -170,9 +170,6 @@ services: # proxy(可选) - AXIOS_PROXY_HOST=127.0.0.1 - AXIOS_PROXY_PORT=7890 - # openai 中转连接(可选) - - OPENAI_BASE_URL=https://api.openai.com/v1 - - OPENAI_BASE_URL_AUTH=可选的安全凭证 # 是否开启队列任务。 1-开启,0-关闭(请求 parentUrl 去执行任务,单机时直接填1) - queueTask=1 - parentUrl=https://hostname/api/openapi/startEvents @@ -195,8 +192,14 @@ services: - PG_USER=fastgpt # POSTGRES_USER - PG_PASSWORD=1234 # POSTGRES_PASSWORD - PG_DB_NAME=fastgpt # POSTGRES_DB - # openai api key + # openai - OPENAIKEY=sk-xxxxx + - GPT4KEY=sk-xxx + - OPENAI_BASE_URL=https://api.openai.com/v1 + - OPENAI_BASE_URL_AUTH=可选的安全凭证 + # claude + - CLAUDE_BASE_URL=calude模型请求地址 + - CLAUDE_KEY=CLAUDE_KEY nginx: image: nginx:alpine3.17 container_name: nginx diff --git a/docs/deploy/fastgpt/docker-compose.yml b/docs/deploy/fastgpt/docker-compose.yml index 669182dbd..1f43001eb 100644 --- a/docs/deploy/fastgpt/docker-compose.yml +++ b/docs/deploy/fastgpt/docker-compose.yml @@ -39,9 +39,6 @@ services: # proxy(可选) - AXIOS_PROXY_HOST=127.0.0.1 - AXIOS_PROXY_PORT=7890 - # openai 中转连接(可选) - - OPENAI_BASE_URL=https://api.openai.com/v1 - - OPENAI_BASE_URL_AUTH=可选的安全凭证 # 是否开启队列任务。 1-开启,0-关闭(请求 parentUrl 去执行任务,单机时直接填1) - queueTask=1 - parentUrl=https://hostname/api/openapi/startEvents @@ -64,8 +61,14 @@ services: - PG_USER=fastgpt # POSTGRES_USER - PG_PASSWORD=1234 # POSTGRES_PASSWORD - PG_DB_NAME=fastgpt # POSTGRES_DB - # openai api key + # openai - OPENAIKEY=sk-xxxxx + - GPT4KEY=sk-xxx + - OPENAI_BASE_URL=https://api.openai.com/v1 + - OPENAI_BASE_URL_AUTH=可选的安全凭证 + # claude + - CLAUDE_BASE_URL=calude模型请求地址 + - CLAUDE_KEY=CLAUDE_KEY nginx: image: nginx:alpine3.17 container_name: nginx diff --git a/src/api/system.ts b/src/api/system.ts index 5c977f22d..c42102495 100644 --- a/src/api/system.ts +++ b/src/api/system.ts @@ -1,3 +1,6 @@ import { GET, POST, PUT } from './request'; +import type { ChatModelItemType } from '@/constants/model'; export const getFilling = () => GET<{ beianText: string }>('/system/getFiling'); + +export const getSystemModelList = () => GET('/system/getModels'); diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx index 0495e0787..949947bb5 100644 --- a/src/components/Layout/index.tsx +++ b/src/components/Layout/index.tsx @@ -21,7 +21,7 @@ const Layout = ({ children, isPcDevice }: { children: JSX.Element; isPcDevice: b const { isPc } = useScreen({ defaultIsPc: isPcDevice }); const router = useRouter(); const { colorMode, setColorMode } = useColorMode(); - const { Loading } = useLoading({ defaultLoading: true }); + const { Loading } = useLoading(); const { loading } = useGlobalStore(); const isChatPage = useMemo( diff --git a/src/constants/model.ts b/src/constants/model.ts index 795badd7e..5dac862e6 100644 --- a/src/constants/model.ts +++ b/src/constants/model.ts @@ -1,3 +1,4 @@ +import { getSystemModelList } from '@/api/system'; import type { ModelSchema } from '@/types/mongoSchema'; export const embeddingModel = 'text-embedding-ada-002'; @@ -58,11 +59,15 @@ export const ChatModelMap = { } }; -export const chatModelList: ChatModelItemType[] = [ - ChatModelMap[OpenAiChatEnum.GPT35], - ChatModelMap[OpenAiChatEnum.GPT4], - ChatModelMap[ClaudeEnum.Claude] -]; +let chatModelList: ChatModelItemType[] = []; +export const getChatModelList = async () => { + if (chatModelList.length > 0) { + return chatModelList; + } + const list = await getSystemModelList(); + chatModelList = list; + return list; +}; export enum ModelStatusEnum { running = 'running', diff --git a/src/pages/api/system/getModels.ts b/src/pages/api/system/getModels.ts new file mode 100644 index 000000000..df03da0f4 --- /dev/null +++ b/src/pages/api/system/getModels.ts @@ -0,0 +1,23 @@ +import type { NextApiRequest, NextApiResponse } from 'next'; +import { jsonRes } from '@/service/response'; +import type { ChatModelItemType } from '@/constants/model'; +import { ChatModelMap, OpenAiChatEnum, ClaudeEnum } from '@/constants/model'; + +// get the models available to the system +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + const chatModelList: ChatModelItemType[] = []; + + if (process.env.OPENAIKEY) { + chatModelList.push(ChatModelMap[OpenAiChatEnum.GPT35]); + } + if (process.env.GPT4KEY) { + chatModelList.push(ChatModelMap[OpenAiChatEnum.GPT4]); + } + if (process.env.CLAUDE_KEY) { + chatModelList.push(ChatModelMap[ClaudeEnum.Claude]); + } + + jsonRes(res, { + data: chatModelList + }); +} diff --git a/src/pages/model/components/detail/components/ModelDataCard.tsx b/src/pages/model/components/detail/components/ModelDataCard.tsx index 0733caacb..79a6959e6 100644 --- a/src/pages/model/components/detail/components/ModelDataCard.tsx +++ b/src/pages/model/components/detail/components/ModelDataCard.tsx @@ -138,7 +138,7 @@ const ModelDataCard = ({ modelId, isOwner }: { modelId: string; isOwner: boolean }); return ( - <> + 知识库数据: {total}组 @@ -303,7 +303,7 @@ const ModelDataCard = ({ modelId, isOwner }: { modelId: string; isOwner: boolean {isOpenSelectCsvModal && ( )} - + ); }; diff --git a/src/pages/model/components/detail/components/ModelEditForm.tsx b/src/pages/model/components/detail/components/ModelEditForm.tsx index b568cf351..a3db5a061 100644 --- a/src/pages/model/components/detail/components/ModelEditForm.tsx +++ b/src/pages/model/components/detail/components/ModelEditForm.tsx @@ -21,12 +21,13 @@ import { import { QuestionOutlineIcon } from '@chakra-ui/icons'; import type { ModelSchema } from '@/types/mongoSchema'; import { UseFormReturn } from 'react-hook-form'; -import { ChatModelMap, ModelVectorSearchModeMap, chatModelList } from '@/constants/model'; +import { ChatModelMap, ModelVectorSearchModeMap, getChatModelList } from '@/constants/model'; import { formatPrice } from '@/utils/user'; import { useConfirm } from '@/hooks/useConfirm'; import { useSelectFile } from '@/hooks/useSelectFile'; import { useToast } from '@/hooks/useToast'; import { compressImg } from '@/utils/file'; +import { useQuery } from '@tanstack/react-query'; const ModelEditForm = ({ formHooks, @@ -70,6 +71,8 @@ const ModelEditForm = ({ [setValue, toast] ); + const { data: chatModelList = [] } = useQuery(['init'], getChatModelList); + return ( <> @@ -299,104 +302,6 @@ const ModelEditForm = ({ )} - - {/* - 安全策略 - - - - 单句最大长度: - - - - - - - - 上下文最大长度: - - - - - - - - 聊天过期时间: - - - 小时 - - - - - - 聊天最大加载次数: - - - - - 设置为-1代表不限制次数 - - - - - - */} ); diff --git a/src/pages/model/index.tsx b/src/pages/model/index.tsx index 78d10f6de..41f4d91e4 100644 --- a/src/pages/model/index.tsx +++ b/src/pages/model/index.tsx @@ -34,7 +34,7 @@ const Model = ({ modelId, isPcDevice }: { modelId: string; isPcDevice: boolean } )} - + {modelId && } diff --git a/src/service/utils/auth.ts b/src/service/utils/auth.ts index 7897cf739..894633bd3 100644 --- a/src/service/utils/auth.ts +++ b/src/service/utils/auth.ts @@ -63,7 +63,7 @@ export const getApiKey = async ({ }, [ClaudeEnum.Claude]: { userOpenAiKey: '', - systemAuthKey: process.env.LAFKEY as string + systemAuthKey: process.env.CLAUDE_KEY as string } }; diff --git a/src/service/utils/chat/claude.ts b/src/service/utils/chat/claude.ts index 95ae5dbdb..d5ceee5d5 100644 --- a/src/service/utils/chat/claude.ts +++ b/src/service/utils/chat/claude.ts @@ -30,7 +30,7 @@ export const lafClaudChat = async ({ const prompt = `${systemPromptText}我的问题是:'${messages[messages.length - 1].value}'`; const lafResponse = await axios.post( - 'https://hnvacz.laf.run/claude-gpt', + process.env.CLAUDE_BASE_URL || '', { prompt, stream,