From b13c3c4da5be539bb4c99c631eb63de84a575242 Mon Sep 17 00:00:00 2001 From: archer <545436317@qq.com> Date: Tue, 4 Apr 2023 21:32:51 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=B4=A6=E5=8D=95=E4=BD=99=E9=A2=9D?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/constants/common.ts | 9 ++++++ src/service/events/generateAbstract.ts | 2 +- src/service/events/generateQA.ts | 4 +-- src/service/events/generateVector.ts | 14 ++++++++- src/service/events/pushBill.ts | 2 +- src/service/utils/chat.ts | 5 +--- src/service/utils/openai.ts | 41 ++++---------------------- 7 files changed, 32 insertions(+), 45 deletions(-) diff --git a/src/constants/common.ts b/src/constants/common.ts index 90485d13c..a115307e8 100644 --- a/src/constants/common.ts +++ b/src/constants/common.ts @@ -36,6 +36,15 @@ wx: YNyiqi 4. 使用该模型对话。 注意:使用知识库模型对话时,tokens 消耗会加快。 + +### 价格表 +如果使用了自己的 Api Key,不会计费。可以在账号页,看到详细账单。单纯使用 chatGPT 模型进行对话,只有一个计费项目。使用知识库时,包含**对话**和**索引**生成两个计费项。 +| 计费项 | 价格: 元/ 1K tokens(包含上下文)| +| --- | --- | +| chatgpt - 对话 | 0.003 | +| 知识库 - 对话 | 0.003 | +| 知识库 - 索引 | 0.001 | +| 文件拆分 | 0.003 | `; export const chatProblem = ` diff --git a/src/service/events/generateAbstract.ts b/src/service/events/generateAbstract.ts index d53b4f762..ceab4fad4 100644 --- a/src/service/events/generateAbstract.ts +++ b/src/service/events/generateAbstract.ts @@ -39,7 +39,7 @@ export async function generateAbstract(next = false): Promise { // 获取 openapi Key let userApiKey, systemKey; try { - const key = await getOpenApiKey(dataItem.userId, true); + const key = await getOpenApiKey(dataItem.userId); userApiKey = key.userApiKey; systemKey = key.systemKey; } catch (error: any) { diff --git a/src/service/events/generateQA.ts b/src/service/events/generateQA.ts index cb517a2f0..f552f4c0f 100644 --- a/src/service/events/generateQA.ts +++ b/src/service/events/generateQA.ts @@ -38,7 +38,7 @@ export async function generateQA(next = false): Promise { // 获取 openapi Key let userApiKey, systemKey; try { - const key = await getOpenApiKey(dataItem.userId, true); + const key = await getOpenApiKey(dataItem.userId); userApiKey = key.userApiKey; systemKey = key.systemKey; } catch (error: any) { @@ -48,7 +48,7 @@ export async function generateQA(next = false): Promise { textList: [], errorText: error.message }); - throw new Error('账号余额不足'); + throw new Error(error?.message); } throw new Error('获取 openai key 失败'); diff --git a/src/service/events/generateVector.ts b/src/service/events/generateVector.ts index c3343cda3..f08d0933f 100644 --- a/src/service/events/generateVector.ts +++ b/src/service/events/generateVector.ts @@ -39,7 +39,19 @@ export async function generateVector(next = false): Promise { }; // 获取 openapi Key - const { userApiKey, systemKey } = await getOpenApiKey(dataItem.userId); + let userApiKey, systemKey; + try { + const res = await getOpenApiKey(dataItem.userId); + userApiKey = res.userApiKey; + systemKey = res.systemKey; + } catch (error: any) { + if (error?.code === 501) { + await redis.del(dataItem.id); + throw new Error(error?.message); + } + + throw new Error('获取 openai key 失败'); + } // 生成词向量 const { vector } = await openaiCreateEmbedding({ diff --git a/src/service/events/pushBill.ts b/src/service/events/pushBill.ts index 269fa50ed..a0ba64282 100644 --- a/src/service/events/pushBill.ts +++ b/src/service/events/pushBill.ts @@ -90,7 +90,7 @@ export const pushSplitDataBill = async ({ try { // 获取模型单价格, 都是用 gpt35 拆分 const modelItem = modelList.find((item) => item.model === ChatModelNameEnum.GPT35); - const unitPrice = modelItem?.price || 5; + const unitPrice = modelItem?.price || 3; // 计算价格 const price = unitPrice * tokens.length; diff --git a/src/service/utils/chat.ts b/src/service/utils/chat.ts index 237404f89..f86980746 100644 --- a/src/service/utils/chat.ts +++ b/src/service/utils/chat.ts @@ -36,10 +36,7 @@ export const authChat = async (chatId: string, authorization?: string) => { } // 获取 user 的 apiKey - const { user, userApiKey, systemKey } = await getOpenApiKey( - chat.userId as unknown as string, - false - ); + const { user, userApiKey, systemKey } = await getOpenApiKey(chat.userId as unknown as string); // filter 掉被 deleted 的内容 chat.content = chat.content.filter((item) => item.deleted !== true); diff --git a/src/service/utils/openai.ts b/src/service/utils/openai.ts index 26b3df39d..52f4a9e45 100644 --- a/src/service/utils/openai.ts +++ b/src/service/utils/openai.ts @@ -6,20 +6,6 @@ import { formatPrice } from '@/utils/user'; import { ChatModelNameEnum } from '@/constants/model'; import { pushGenerateVectorBill } from '../events/pushBill'; -/* 判断 apikey 是否还有余额 */ -export const checkKeyGrant = async (apiKey: string) => { - const grant = await axios.get('https://api.openai.com/dashboard/billing/credit_grants', { - headers: { - Authorization: `Bearer ${apiKey}` - }, - httpsAgent - }); - if (grant.data?.total_available <= 0.2) { - return false; - } - return true; -}; - /* 获取用户 api 的 openai 信息 */ export const getUserApiOpenai = async (userId: string) => { const user = await User.findById(userId); @@ -30,15 +16,6 @@ export const getUserApiOpenai = async (userId: string) => { return Promise.reject('缺少ApiKey, 无法请求'); } - // 余额校验 - const hasGrant = await checkKeyGrant(userApiKey); - if (!hasGrant) { - return Promise.reject({ - code: 501, - message: 'API 余额不足' - }); - } - return { user, openai: getOpenAIApi(userApiKey), @@ -47,27 +24,19 @@ export const getUserApiOpenai = async (userId: string) => { }; /* 获取 open api key,如果用户没有自己的key,就用平台的,用平台记得加账单 */ -export const getOpenApiKey = async (userId: string, checkGrant = false) => { +export const getOpenApiKey = async (userId: string) => { const user = await User.findById(userId); if (!user) { - return Promise.reject('找不到用户'); + return Promise.reject({ + code: 501, + message: '找不到用户' + }); } const userApiKey = user?.accounts?.find((item: any) => item.type === 'openai')?.value; // 有自己的key if (userApiKey) { - // api 余额校验 - if (checkGrant) { - const hasGrant = await checkKeyGrant(userApiKey); - if (!hasGrant) { - return Promise.reject({ - code: 501, - message: 'API 余额不足' - }); - } - } - return { user, userApiKey,