create-chuntianxiaozhu
Version:
春天小猪模板工具
95 lines (89 loc) • 2.72 kB
text/typescript
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());
}
('ai')
export class AiController {
('question')
async questionAi(() 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暂时无法回答,请等待一会儿');
// }
// }
}