mirror of
https://github.com/labring/FastGPT.git
synced 2025-07-27 08:25:07 +00:00
fix: 账单余额问题
This commit is contained in:
@@ -36,6 +36,15 @@ wx: YNyiqi
|
|||||||
4. 使用该模型对话。
|
4. 使用该模型对话。
|
||||||
|
|
||||||
注意:使用知识库模型对话时,tokens 消耗会加快。
|
注意:使用知识库模型对话时,tokens 消耗会加快。
|
||||||
|
|
||||||
|
### 价格表
|
||||||
|
如果使用了自己的 Api Key,不会计费。可以在账号页,看到详细账单。单纯使用 chatGPT 模型进行对话,只有一个计费项目。使用知识库时,包含**对话**和**索引**生成两个计费项。
|
||||||
|
| 计费项 | 价格: 元/ 1K tokens(包含上下文)|
|
||||||
|
| --- | --- |
|
||||||
|
| chatgpt - 对话 | 0.003 |
|
||||||
|
| 知识库 - 对话 | 0.003 |
|
||||||
|
| 知识库 - 索引 | 0.001 |
|
||||||
|
| 文件拆分 | 0.003 |
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export const chatProblem = `
|
export const chatProblem = `
|
||||||
|
@@ -39,7 +39,7 @@ export async function generateAbstract(next = false): Promise<any> {
|
|||||||
// 获取 openapi Key
|
// 获取 openapi Key
|
||||||
let userApiKey, systemKey;
|
let userApiKey, systemKey;
|
||||||
try {
|
try {
|
||||||
const key = await getOpenApiKey(dataItem.userId, true);
|
const key = await getOpenApiKey(dataItem.userId);
|
||||||
userApiKey = key.userApiKey;
|
userApiKey = key.userApiKey;
|
||||||
systemKey = key.systemKey;
|
systemKey = key.systemKey;
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
|
@@ -38,7 +38,7 @@ export async function generateQA(next = false): Promise<any> {
|
|||||||
// 获取 openapi Key
|
// 获取 openapi Key
|
||||||
let userApiKey, systemKey;
|
let userApiKey, systemKey;
|
||||||
try {
|
try {
|
||||||
const key = await getOpenApiKey(dataItem.userId, true);
|
const key = await getOpenApiKey(dataItem.userId);
|
||||||
userApiKey = key.userApiKey;
|
userApiKey = key.userApiKey;
|
||||||
systemKey = key.systemKey;
|
systemKey = key.systemKey;
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
@@ -48,7 +48,7 @@ export async function generateQA(next = false): Promise<any> {
|
|||||||
textList: [],
|
textList: [],
|
||||||
errorText: error.message
|
errorText: error.message
|
||||||
});
|
});
|
||||||
throw new Error('账号余额不足');
|
throw new Error(error?.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Error('获取 openai key 失败');
|
throw new Error('获取 openai key 失败');
|
||||||
|
@@ -39,7 +39,19 @@ export async function generateVector(next = false): Promise<any> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 获取 openapi Key
|
// 获取 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({
|
const { vector } = await openaiCreateEmbedding({
|
||||||
|
@@ -90,7 +90,7 @@ export const pushSplitDataBill = async ({
|
|||||||
try {
|
try {
|
||||||
// 获取模型单价格, 都是用 gpt35 拆分
|
// 获取模型单价格, 都是用 gpt35 拆分
|
||||||
const modelItem = modelList.find((item) => item.model === ChatModelNameEnum.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;
|
const price = unitPrice * tokens.length;
|
||||||
|
|
||||||
|
@@ -36,10 +36,7 @@ export const authChat = async (chatId: string, authorization?: string) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 获取 user 的 apiKey
|
// 获取 user 的 apiKey
|
||||||
const { user, userApiKey, systemKey } = await getOpenApiKey(
|
const { user, userApiKey, systemKey } = await getOpenApiKey(chat.userId as unknown as string);
|
||||||
chat.userId as unknown as string,
|
|
||||||
false
|
|
||||||
);
|
|
||||||
|
|
||||||
// filter 掉被 deleted 的内容
|
// filter 掉被 deleted 的内容
|
||||||
chat.content = chat.content.filter((item) => item.deleted !== true);
|
chat.content = chat.content.filter((item) => item.deleted !== true);
|
||||||
|
@@ -6,20 +6,6 @@ import { formatPrice } from '@/utils/user';
|
|||||||
import { ChatModelNameEnum } from '@/constants/model';
|
import { ChatModelNameEnum } from '@/constants/model';
|
||||||
import { pushGenerateVectorBill } from '../events/pushBill';
|
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 信息 */
|
/* 获取用户 api 的 openai 信息 */
|
||||||
export const getUserApiOpenai = async (userId: string) => {
|
export const getUserApiOpenai = async (userId: string) => {
|
||||||
const user = await User.findById(userId);
|
const user = await User.findById(userId);
|
||||||
@@ -30,15 +16,6 @@ export const getUserApiOpenai = async (userId: string) => {
|
|||||||
return Promise.reject('缺少ApiKey, 无法请求');
|
return Promise.reject('缺少ApiKey, 无法请求');
|
||||||
}
|
}
|
||||||
|
|
||||||
// 余额校验
|
|
||||||
const hasGrant = await checkKeyGrant(userApiKey);
|
|
||||||
if (!hasGrant) {
|
|
||||||
return Promise.reject({
|
|
||||||
code: 501,
|
|
||||||
message: 'API 余额不足'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
user,
|
user,
|
||||||
openai: getOpenAIApi(userApiKey),
|
openai: getOpenAIApi(userApiKey),
|
||||||
@@ -47,27 +24,19 @@ export const getUserApiOpenai = async (userId: string) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* 获取 open api key,如果用户没有自己的key,就用平台的,用平台记得加账单 */
|
/* 获取 open api key,如果用户没有自己的key,就用平台的,用平台记得加账单 */
|
||||||
export const getOpenApiKey = async (userId: string, checkGrant = false) => {
|
export const getOpenApiKey = async (userId: string) => {
|
||||||
const user = await User.findById(userId);
|
const user = await User.findById(userId);
|
||||||
if (!user) {
|
if (!user) {
|
||||||
return Promise.reject('找不到用户');
|
return Promise.reject({
|
||||||
|
code: 501,
|
||||||
|
message: '找不到用户'
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const userApiKey = user?.accounts?.find((item: any) => item.type === 'openai')?.value;
|
const userApiKey = user?.accounts?.find((item: any) => item.type === 'openai')?.value;
|
||||||
|
|
||||||
// 有自己的key
|
// 有自己的key
|
||||||
if (userApiKey) {
|
if (userApiKey) {
|
||||||
// api 余额校验
|
|
||||||
if (checkGrant) {
|
|
||||||
const hasGrant = await checkKeyGrant(userApiKey);
|
|
||||||
if (!hasGrant) {
|
|
||||||
return Promise.reject({
|
|
||||||
code: 501,
|
|
||||||
message: 'API 余额不足'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
user,
|
user,
|
||||||
userApiKey,
|
userApiKey,
|
||||||
|
Reference in New Issue
Block a user