From 41ada6ecda8be7bb89492b826217f563458f4237 Mon Sep 17 00:00:00 2001 From: archer <545436317@qq.com> Date: Fri, 23 Jun 2023 17:12:52 +0800 Subject: [PATCH] perf: keys --- admin/README.md | 3 +- admin/service/schema.js | 12 ------ admin/src/fields.ts | 3 -- client/.env.template | 2 - .../src/pages/api/openapi/kb/appKbSearch.ts | 3 +- client/src/pages/api/openapi/kb/searchTest.ts | 3 +- client/src/pages/api/openapi/kb/updateData.ts | 3 +- .../api/openapi/plugin/openaiEmbedding.ts | 12 ++---- .../pages/api/openapi/text/sensitiveCheck.ts | 2 +- client/src/pages/api/system/getModels.ts | 4 +- .../pages/kb/components/SelectFileModal.tsx | 2 +- client/src/service/events/generateQA.ts | 1 - client/src/service/events/generateVector.ts | 1 - client/src/service/models/system.ts | 12 ------ client/src/service/mongo.ts | 3 -- client/src/service/utils/auth.ts | 33 ++++----------- client/src/types/index.d.ts | 3 -- docs/deploy/fastgpt/docker-compose.yml | 40 ++++++++++++++----- 18 files changed, 49 insertions(+), 93 deletions(-) diff --git a/admin/README.md b/admin/README.md index 35a934591..0ae559d83 100644 --- a/admin/README.md +++ b/admin/README.md @@ -26,7 +26,8 @@ MONGODB_NAME=fastgpt ADMIN_USER=username ADMIN_PASS=password ADMIN_SECRET=any -VITE_PUBLIC_SERVER_URL=http://localhost:3001 # 和server.js一致 +PARENT_URL=http://localhost:3000 +PARENT_ROOT_KEY=rootkey ``` ## sealos 部署 diff --git a/admin/service/schema.js b/admin/service/schema.js index d05a47811..3698d3aee 100644 --- a/admin/service/schema.js +++ b/admin/service/schema.js @@ -86,18 +86,6 @@ const modelSchema = new mongoose.Schema({ }); const SystemSchema = new mongoose.Schema({ - openAIKeys: { - type: String, - default: '' - }, - openAITrainingKeys: { - type: String, - default: '' - }, - gpt4Key: { - type: String, - default: '' - }, vectorMaxProcess: { type: Number, default: 10 diff --git a/admin/src/fields.ts b/admin/src/fields.ts index 563766beb..3c3bed8c2 100644 --- a/admin/src/fields.ts +++ b/admin/src/fields.ts @@ -45,9 +45,6 @@ export const ModelFields = [ ]; export const SystemFields = [ - createTextField('openAIKeys', { label: 'openAIKeys,逗号隔开' }), - createTextField('openAITrainingKeys', { label: 'openAITrainingKeys' }), - createTextField('gpt4Key', { label: 'gpt4Key' }), createTextField('vectorMaxProcess', { label: '向量最大进程' }), createTextField('qaMaxProcess', { label: 'qa最大进程' }), createTextField('pgIvfflatProbe', { label: 'pg 探针数量' }), diff --git a/client/.env.template b/client/.env.template index 1ceaa8716..e5c179ace 100644 --- a/client/.env.template +++ b/client/.env.template @@ -21,8 +21,6 @@ ROOT_KEY=fdafasd # OPENAI_BASE_URL=http://ai.openai.com/v1 # OPENAI_BASE_URL_AUTH=可选安全凭证,会放到 header.auth 里 OPENAIKEY=sk-xxx -OPENAI_TRAINING_KEY=sk-xxx -GPT4KEY=sk-xxx # db MONGODB_URI=mongodb://username:password@0.0.0.0:27017/?authSource=admin MONGODB_NAME=fastgpt diff --git a/client/src/pages/api/openapi/kb/appKbSearch.ts b/client/src/pages/api/openapi/kb/appKbSearch.ts index e6755bb96..acd3b1c24 100644 --- a/client/src/pages/api/openapi/kb/appKbSearch.ts +++ b/client/src/pages/api/openapi/kb/appKbSearch.ts @@ -96,8 +96,7 @@ export async function appKbSearch({ // get vector const promptVector = await openaiEmbedding({ userId, - input: [prompt.value], - type: 'chat' + input: [prompt.value] }); // search kb diff --git a/client/src/pages/api/openapi/kb/searchTest.ts b/client/src/pages/api/openapi/kb/searchTest.ts index e4b366689..b1aa608f8 100644 --- a/client/src/pages/api/openapi/kb/searchTest.ts +++ b/client/src/pages/api/openapi/kb/searchTest.ts @@ -29,8 +29,7 @@ export default withNextCors(async function handler(req: NextApiRequest, res: Nex const vector = await openaiEmbedding({ userId, - input: [text], - type: 'training' + input: [text] }); const response: any = await PgClient.query( diff --git a/client/src/pages/api/openapi/kb/updateData.ts b/client/src/pages/api/openapi/kb/updateData.ts index ecb134dd6..f38fb6240 100644 --- a/client/src/pages/api/openapi/kb/updateData.ts +++ b/client/src/pages/api/openapi/kb/updateData.ts @@ -21,8 +21,7 @@ export default withNextCors(async function handler(req: NextApiRequest, res: Nex if (q) { return openaiEmbedding({ userId, - input: [q], - type: 'chat' + input: [q] }); } return []; diff --git a/client/src/pages/api/openapi/plugin/openaiEmbedding.ts b/client/src/pages/api/openapi/plugin/openaiEmbedding.ts index 2eb9ee588..8c006d7c5 100644 --- a/client/src/pages/api/openapi/plugin/openaiEmbedding.ts +++ b/client/src/pages/api/openapi/plugin/openaiEmbedding.ts @@ -6,26 +6,24 @@ import { getOpenAIApi } from '@/service/utils/chat/openai'; import { embeddingModel } from '@/constants/model'; import { axiosConfig } from '@/service/utils/tools'; import { pushGenerateVectorBill } from '@/service/events/pushBill'; -import { ApiKeyType } from '@/service/utils/auth'; import { OpenAiChatEnum } from '@/constants/model'; type Props = { input: string[]; - type?: ApiKeyType; }; type Response = number[][]; export default withNextCors(async function handler(req: NextApiRequest, res: NextApiResponse) { try { const { userId } = await authUser({ req }); - let { input, type } = req.query as Props; + let { input } = req.query as Props; if (!Array.isArray(input)) { throw new Error('缺少参数'); } jsonRes(res, { - data: await openaiEmbedding({ userId, input, type, mustPay: true }) + data: await openaiEmbedding({ userId, input, mustPay: true }) }); } catch (err) { console.log(err); @@ -39,14 +37,12 @@ export default withNextCors(async function handler(req: NextApiRequest, res: Nex export async function openaiEmbedding({ userId, input, - mustPay = false, - type = 'chat' + mustPay = false }: { userId: string; mustPay?: boolean } & Props) { const { userOpenAiKey, systemAuthKey } = await getApiKey({ model: OpenAiChatEnum.GPT35, userId, - mustPay, - type + mustPay }); // 获取 chatAPI diff --git a/client/src/pages/api/openapi/text/sensitiveCheck.ts b/client/src/pages/api/openapi/text/sensitiveCheck.ts index 58b491c1a..272e74746 100644 --- a/client/src/pages/api/openapi/text/sensitiveCheck.ts +++ b/client/src/pages/api/openapi/text/sensitiveCheck.ts @@ -33,7 +33,7 @@ export async function sensitiveCheck({ input }: Props) { } const response = await axios({ - ...axiosConfig(getSystemOpenAiKey('chat')), + ...axiosConfig(getSystemOpenAiKey()), method: 'POST', url: `/moderations`, data: { diff --git a/client/src/pages/api/system/getModels.ts b/client/src/pages/api/system/getModels.ts index 58d331e26..6c4341eba 100644 --- a/client/src/pages/api/system/getModels.ts +++ b/client/src/pages/api/system/getModels.ts @@ -7,11 +7,9 @@ import { ChatModelMap, OpenAiChatEnum } from '@/constants/model'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { const chatModelList: ChatModelItemType[] = []; - if (global.systemEnv.openAIKeys) { + if (process.env.OPENAIKEY) { chatModelList.push(ChatModelMap[OpenAiChatEnum.GPT3516k]); chatModelList.push(ChatModelMap[OpenAiChatEnum.GPT35]); - } - if (global.systemEnv.gpt4Key) { chatModelList.push(ChatModelMap[OpenAiChatEnum.GPT4]); } diff --git a/client/src/pages/kb/components/SelectFileModal.tsx b/client/src/pages/kb/components/SelectFileModal.tsx index 06c6c95b1..e8a405480 100644 --- a/client/src/pages/kb/components/SelectFileModal.tsx +++ b/client/src/pages/kb/components/SelectFileModal.tsx @@ -256,7 +256,7 @@ const SelectFileModal = ({ )} {/* chunk size */} {mode === TrainingModeEnum.index && ( - + 段落长度 diff --git a/client/src/service/events/generateQA.ts b/client/src/service/events/generateQA.ts index d5d00f9bc..733c040b4 100644 --- a/client/src/service/events/generateQA.ts +++ b/client/src/service/events/generateQA.ts @@ -55,7 +55,6 @@ export async function generateQA(): Promise { const { systemAuthKey } = await getApiKey({ model: OpenAiChatEnum.GPT35, userId, - type: 'training', mustPay: true }); diff --git a/client/src/service/events/generateVector.ts b/client/src/service/events/generateVector.ts index eafd1ccf2..2234fddac 100644 --- a/client/src/service/events/generateVector.ts +++ b/client/src/service/events/generateVector.ts @@ -58,7 +58,6 @@ export async function generateVector(): Promise { const vectors = await openaiEmbedding({ input: dataItems.map((item) => item.q), userId, - type: 'training', mustPay: true }); diff --git a/client/src/service/models/system.ts b/client/src/service/models/system.ts index 65be791c5..5762eb5cc 100644 --- a/client/src/service/models/system.ts +++ b/client/src/service/models/system.ts @@ -1,18 +1,6 @@ import { Schema, model, models } from 'mongoose'; const SystemSchema = new Schema({ - openAIKeys: { - type: String, - default: '' - }, - openAITrainingKeys: { - type: String, - default: '' - }, - gpt4Key: { - type: String, - default: '' - }, vectorMaxProcess: { type: Number, default: 10 diff --git a/client/src/service/mongo.ts b/client/src/service/mongo.ts index b95dc2c23..7dbdaa9e5 100644 --- a/client/src/service/mongo.ts +++ b/client/src/service/mongo.ts @@ -15,9 +15,6 @@ export async function connectToDatabase(): Promise { global.qaQueueLen = 0; global.vectorQueueLen = 0; global.systemEnv = { - openAIKeys: process.env.OPENAIKEY || '', - openAITrainingKeys: process.env.OPENAI_TRAINING_KEY || '', - gpt4Key: process.env.GPT4KEY || '', vectorMaxProcess: 10, qaMaxProcess: 10, pgIvfflatProbe: 10, diff --git a/client/src/service/utils/auth.ts b/client/src/service/utils/auth.ts index ab158c94b..82f74c490 100644 --- a/client/src/service/utils/auth.ts +++ b/client/src/service/utils/auth.ts @@ -11,7 +11,6 @@ import { ERROR_ENUM } from '../errorCode'; import { ChatModelType, OpenAiChatEnum } from '@/constants/model'; import { hashPassword } from '@/service/utils/tools'; -export type ApiKeyType = 'training' | 'chat'; export type AuthType = 'token' | 'root' | 'apikey'; export const parseCookie = (cookie?: string): Promise => { @@ -163,37 +162,19 @@ export const authUser = async ({ }; /* random get openai api key */ -export const getSystemOpenAiKey = (type: ApiKeyType) => { - const keys = (() => { - if (type === 'training') { - return global.systemEnv.openAITrainingKeys?.split(',') || []; - } - return global.systemEnv.openAIKeys?.split(',') || []; - })(); - - // 纯字符串类型 - const i = Math.floor(Math.random() * keys.length); - return keys[i] || (global.systemEnv.openAIKeys as string); -}; -export const getGpt4Key = () => { - const keys = global.systemEnv.gpt4Key?.split(',') || []; - - // 纯字符串类型 - const i = Math.floor(Math.random() * keys.length); - return keys[i] || (global.systemEnv.openAIKeys as string); +export const getSystemOpenAiKey = () => { + return process.env.OPENAIKEY || ''; }; /* 获取 api 请求的 key */ export const getApiKey = async ({ model, userId, - mustPay = false, - type = 'chat' + mustPay = false }: { model: ChatModelType; userId: string; mustPay?: boolean; - type?: ApiKeyType; }) => { const user = await User.findById(userId); if (!user) { @@ -203,19 +184,19 @@ export const getApiKey = async ({ const keyMap = { [OpenAiChatEnum.GPT35]: { userOpenAiKey: user.openaiKey || '', - systemAuthKey: getSystemOpenAiKey(type) as string + systemAuthKey: getSystemOpenAiKey() }, [OpenAiChatEnum.GPT3516k]: { userOpenAiKey: user.openaiKey || '', - systemAuthKey: getSystemOpenAiKey(type) as string + systemAuthKey: getSystemOpenAiKey() }, [OpenAiChatEnum.GPT4]: { userOpenAiKey: user.openaiKey || '', - systemAuthKey: getGpt4Key() as string + systemAuthKey: getSystemOpenAiKey() }, [OpenAiChatEnum.GPT432k]: { userOpenAiKey: user.openaiKey || '', - systemAuthKey: getGpt4Key() as string + systemAuthKey: getSystemOpenAiKey() } }; diff --git a/client/src/types/index.d.ts b/client/src/types/index.d.ts index 98bbcdbcb..884b62049 100644 --- a/client/src/types/index.d.ts +++ b/client/src/types/index.d.ts @@ -23,9 +23,6 @@ declare global { var vectorQueueLen: number; var OpenAiEncMap: Record; var systemEnv: { - openAIKeys: string; - openAITrainingKeys: string; - gpt4Key: string; vectorMaxProcess: number; qaMaxProcess: number; pgIvfflatProbe: number; diff --git a/docs/deploy/fastgpt/docker-compose.yml b/docs/deploy/fastgpt/docker-compose.yml index 21baa344c..290dc62ea 100644 --- a/docs/deploy/fastgpt/docker-compose.yml +++ b/docs/deploy/fastgpt/docker-compose.yml @@ -1,3 +1,4 @@ +# host 版本。 version: '3.3' services: pg: @@ -31,10 +32,9 @@ services: - /root/fastgpt/mongo/data:/data/db - /root/fastgpt/mongo/logs:/var/log/mongodb fastgpt: - # image: ghcr.io/c121914yu/fastgpt:latest # github # image: c121914yu/fast-gpt:latest # docker hub image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:latest # 阿里云 - network_mode: host + # network_mode: host # restart: always container_name: fastgpt environment: # 可选的变量,不需要的话需要去掉 @@ -55,9 +55,9 @@ services: - CLIENT_GOOGLE_VER_TOKEN=xxx - SERVICE_GOOGLE_VER_TOKEN=xx # token加密凭证(随便填,作为登录凭证) - - TOKEN_KEY=xxxx + - TOKEN_KEY=any # root key, 最高权限,可以内部接口互相调用 - - ROOT_KEY=xxx + - ROOT_KEY=root_key # 和上方mongo镜像的username,password对应 - MONGODB_URI=mongodb://username:password@0.0.0.0:27017/?authSource=admin - MONGODB_NAME=fastgpt @@ -68,14 +68,34 @@ services: - PG_PASSWORD=1234 - PG_DB_NAME=fastgpt # openai - # 对话用的key,多个key,逗号分开 - - OPENAIKEY=sk-xxxxx,sk-xxx - # 训练用的key - - OPENAI_TRAINING_KEY=sk-xxx,sk-xxxx - - GPT4KEY=sk-xxx + - OPENAIKEY=sk-xxxxx - OPENAI_BASE_URL=https://api.openai.com/v1 - OPENAI_BASE_URL_AUTH=可选的安全凭证 - nginx: + fastgpt-admin: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-admin:latest + container_name: fastgpt-admin + restart: always + ports: + - 3001:3001 + environment: + - MONGODB_URI=mongodb://username:password@0.0.0.0:27017/?authSource=admin + - MONGODB_NAME=fastgpt + - ADMIN_USER=username + - ADMIN_PASS=password + - ADMIN_SECRET=any + - PARENT_URL=http://0.0.0.0:3000 + - PARENT_ROOT_KEY=root_key + key-admin: + container_name: key-admin + image: justsong/one-api + restart: always + ports: + - 3002:3000 + environment: + - TZ=Asia/Shanghai + volumes: + - /home/ubuntu/data/one-api:/data + nginx: # 宝塔不需要额外装 nginx image: registry.cn-hangzhou.aliyuncs.com/fastgpt/nginx:alpine3.17 # image: nginx:alpine3.17 container_name: nginx