102 lines
2.1 KiB
TypeScript
102 lines
2.1 KiB
TypeScript
import axios from 'axios';
|
||
import { getOpenAIApi } from '@/service/utils/chat';
|
||
import { httpsAgent } from './tools';
|
||
import { User } from '../models/user';
|
||
import { formatPrice } from '@/utils/user';
|
||
import { ChatModelNameEnum } from '@/constants/model';
|
||
import { pushGenerateVectorBill } from '../events/pushBill';
|
||
|
||
/* 获取用户 api 的 openai 信息 */
|
||
export const getUserApiOpenai = async (userId: string) => {
|
||
const user = await User.findById(userId);
|
||
|
||
const userApiKey = user?.accounts?.find((item: any) => item.type === 'openai')?.value;
|
||
|
||
if (!userApiKey) {
|
||
return Promise.reject('缺少ApiKey, 无法请求');
|
||
}
|
||
|
||
return {
|
||
user,
|
||
openai: getOpenAIApi(userApiKey),
|
||
apiKey: userApiKey
|
||
};
|
||
};
|
||
|
||
/* 获取 open api key,如果用户没有自己的key,就用平台的,用平台记得加账单 */
|
||
export const getOpenApiKey = async (userId: string) => {
|
||
const user = await User.findById(userId);
|
||
if (!user) {
|
||
return Promise.reject({
|
||
code: 501,
|
||
message: '找不到用户'
|
||
});
|
||
}
|
||
|
||
const userApiKey = user?.accounts?.find((item: any) => item.type === 'openai')?.value;
|
||
|
||
// 有自己的key
|
||
if (userApiKey) {
|
||
return {
|
||
user,
|
||
userApiKey,
|
||
systemKey: ''
|
||
};
|
||
}
|
||
|
||
// 平台账号余额校验
|
||
if (formatPrice(user.balance) <= 0) {
|
||
return Promise.reject({
|
||
code: 501,
|
||
message: '账号余额不足'
|
||
});
|
||
}
|
||
|
||
return {
|
||
user,
|
||
userApiKey: '',
|
||
systemKey: process.env.OPENAIKEY as string
|
||
};
|
||
};
|
||
|
||
/* 获取向量 */
|
||
export const openaiCreateEmbedding = async ({
|
||
isPay,
|
||
userId,
|
||
apiKey,
|
||
text
|
||
}: {
|
||
isPay: boolean;
|
||
userId: string;
|
||
apiKey: string;
|
||
text: string;
|
||
}) => {
|
||
// 获取 chatAPI
|
||
const chatAPI = getOpenAIApi(apiKey);
|
||
|
||
// 把输入的内容转成向量
|
||
const vector = await chatAPI
|
||
.createEmbedding(
|
||
{
|
||
model: ChatModelNameEnum.VECTOR,
|
||
input: text
|
||
},
|
||
{
|
||
timeout: 60000,
|
||
httpsAgent
|
||
}
|
||
)
|
||
.then((res) => res?.data?.data?.[0]?.embedding || []);
|
||
|
||
pushGenerateVectorBill({
|
||
isPay,
|
||
userId,
|
||
text
|
||
});
|
||
|
||
return {
|
||
vector,
|
||
chatAPI
|
||
};
|
||
};
|