UNPKG

create-chuntianxiaozhu

Version:

春天小猪模板工具

95 lines (89 loc) 2.72 kB
import { BadRequestException, Body, Controller, Post } from '@nestjs/common'; import { QuestionDto } from './dtos/question.dto'; import axios from 'axios'; import OpenAI from 'openai'; // 60请求/小时/IP,也就是每分钟只能请求一次 const aiModels = [ new OpenAI({ apiKey: 'sk-PygfD6zHoPSRE059lm7CGlD2MaypjFsAlZk4RKTYd1K4Ij70', baseURL: 'https://api.chatanywhere.com.cn/v1', }), new OpenAI({ apiKey: 'sk-om2JJcplsNMqhoa2oTRxub52bMuhkleiOWMwURW405XLf1k8', baseURL: 'https://api.chatanywhere.com.cn/v1', }), ]; function runAiMode(q) { return aiModels.reduce((prev, cur) => { return prev.catch(() => { return cur.chat.completions .create({ messages: [{ role: 'user', content: q }], model: 'gpt-3.5-turbo', }) .then((res) => { return res.choices[0].message.content; }); }); }, Promise.reject()); } @Controller('ai') export class AiController { @Post('question') async questionAi(@Body() questionDto: QuestionDto) { const { q } = questionDto; try { // 第一个AI接口 const token1 = axios.CancelToken.source(); const promise1 = axios .get(`https://v1.apigpt.cn/?q=${q}&apitype=sql`, { cancelToken: token1.token, }) .then((res) => res.data.ChatGPT_Answer); // 第二个AI接口 const token2 = axios.CancelToken.source(); const promise2 = axios .post( 'https://us-central1-chat-for-chatgpt.cloudfunctions.net/basicUserRequestBeta', { data: { message: q, }, }, { headers: { 'User-Agent': 'com.tappz.aichat/1.2.2 iPhone/16.3.1 hw/iPhone12_5', }, cancelToken: token2.token, }, ) .then((res) => { return res.data.result.choices[0].text; }); return Promise.any([promise1, promise2]).then((value) => { token1.cancel(); token2.cancel(); return value; }); } catch { // 当以上的免费key不可用时用自己申请的免费APIKey try { return runAiMode(q); } catch { throw new BadRequestException('AI暂时无法回答,请等待一会儿'); } } } // TODO 暂时不需要流式输出的AI接口 // @Post('stream/question') // async questionAiByStream(@Body() questionDto: QuestionDto) { // const { q } = questionDto; // // 流式输出结果 // // 文言一心,不停置换响应内容的Acs-Token // try { // } catch { // throw new BadRequestException('AI暂时无法回答,请等待一会儿'); // } // } }