import { Configuration, OpenAIApi } from 'openai'; import { Chat } from '../mongo'; import type { ChatPopulate } from '@/types/mongoSchema'; import { formatPrice } from '@/utils/user'; import { authToken } from './tools'; export const getOpenAIApi = (apiKey: string) => { const configuration = new Configuration({ apiKey }); return new OpenAIApi(configuration, undefined); }; export const authChat = async (chatId: string, authorization?: string) => { // 获取 chat 数据 const chat = await Chat.findById(chatId) .populate({ path: 'modelId', options: { strictPopulate: false } }) .populate({ path: 'userId', options: { strictPopulate: false } }); if (!chat || !chat.modelId || !chat.userId) { return Promise.reject('模型不存在'); } // 凭证校验 if (!chat.isShare) { const userId = await authToken(authorization); if (userId !== String(chat.userId._id)) { return Promise.reject('无权使用该对话'); } } else if (chat.loadAmount === 0 || chat.expiredTime <= Date.now()) { return Promise.reject('聊天框已过期'); } // 获取 user 的 apiKey const user = chat.userId; const userApiKey = user.accounts?.find((item: any) => item.type === 'openai')?.value; // 没有 apikey ,校验余额 if (!userApiKey && formatPrice(user.balance) <= 0) { return Promise.reject('该账号余额不足'); } // filter 掉被 deleted 的内容 chat.content = chat.content.filter((item) => item.deleted !== true); return { userApiKey, systemKey: process.env.OPENAIKEY as string, chat, userId: user._id }; };