perf: openapi. error catch

This commit is contained in:
archer
2023-04-10 13:16:24 +08:00
parent a7988c164e
commit 9b1c0e1a3c
8 changed files with 74 additions and 20 deletions

View File

@@ -13,4 +13,4 @@ export const getOpenApiKeys = () => GET<UserOpenApiKey[]>('/openapi/getKeys');
/** /**
* delete api by id * delete api by id
*/ */
export const delOpenApiById = (id: string) => DELETE(`/openapi/delKet?id=${id}`); export const delOpenApiById = (id: string) => DELETE(`/openapi/delKey?id=${id}`);

View File

@@ -123,7 +123,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
formatRedisPrompt.unshift(prompts.shift()?.value || ''); formatRedisPrompt.unshift(prompts.shift()?.value || '');
} }
// textArr 筛选,最多 2800 tokens // 系统提示词筛选,最多 2800 tokens
const systemPrompt = systemPromptFilter(formatRedisPrompt, 2800); const systemPrompt = systemPromptFilter(formatRedisPrompt, 2800);
prompts.unshift({ prompts.unshift({

View File

@@ -53,6 +53,12 @@ const ModelEditForm = ({
})} })}
></Input> ></Input>
</Flex> </Flex>
<Flex alignItems={'center'} mt={4}>
<Box flex={'0 0 80px'} w={0}>
modelId:
</Box>
<Box>{getValues('_id')}</Box>
</Flex>
</FormControl> </FormControl>
<Flex alignItems={'center'} mt={4}> <Flex alignItems={'center'} mt={4}>
<Box flex={'0 0 80px'} w={0}> <Box flex={'0 0 80px'} w={0}>

View File

@@ -1,4 +1,5 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import Link from 'next/link';
import { import {
Card, Card,
Box, Box,
@@ -54,10 +55,21 @@ const OpenApi = () => {
<> <>
<Card px={6} py={4} position={'relative'}> <Card px={6} py={4} position={'relative'}>
<Box fontSize={'xl'} fontWeight={'bold'}> <Box fontSize={'xl'} fontWeight={'bold'}>
Open Api Key Open Api
</Box> </Box>
<Box fontSize={'sm'} mt={2}> <Box fontSize={'sm'} mt={2}>
key Open Api Fast Gpt api Api
Key
</Box>
<Box
my={1}
as="a"
href="https://kjqvjse66l.feishu.cn/docx/DmLedTWtUoNGX8xui9ocdUEjnNh"
color={'blue.800'}
textDecoration={'underline'}
target={'_blank'}
>
</Box> </Box>
<TableContainer mt={2} position={'relative'}> <TableContainer mt={2} position={'relative'}>
<Table> <Table>
@@ -93,7 +105,9 @@ const OpenApi = () => {
))} ))}
</Tbody> </Tbody>
</Table> </Table>
</TableContainer>
<Button <Button
maxW={'200px'}
mt={5} mt={5}
isLoading={isCreating} isLoading={isCreating}
isDisabled={apiKeys.length >= 5} isDisabled={apiKeys.length >= 5}
@@ -102,7 +116,6 @@ const OpenApi = () => {
> >
Api Key Api Key
</Button> </Button>
</TableContainer>
<Loading loading={isGetting || isDeleting} fixed={false} /> <Loading loading={isGetting || isDeleting} fixed={false} />
</Card> </Card>
<Modal isOpen={!!apiKey} onClose={() => setApiKey('')}> <Modal isOpen={!!apiKey} onClose={() => setApiKey('')}>

View File

@@ -14,3 +14,30 @@ export const proxyError: Record<string, boolean> = {
ECONNABORTED: true, ECONNABORTED: true,
ECONNRESET: true ECONNRESET: true
}; };
export enum ERROR_ENUM {
unAuthorization = 'unAuthorization',
insufficientQuota = 'insufficientQuota'
}
export const ERROR_RESPONSE: Record<
any,
{
code: number;
statusText: string;
message: string;
data?: any;
}
> = {
[ERROR_ENUM.unAuthorization]: {
code: 403,
statusText: ERROR_ENUM.unAuthorization,
message: '凭证错误',
data: null
},
[ERROR_ENUM.insufficientQuota]: {
code: 403,
statusText: ERROR_ENUM.insufficientQuota,
message: '账号余额不足',
data: null
}
};

View File

@@ -1,5 +1,5 @@
import { NextApiResponse } from 'next'; import { NextApiResponse } from 'next';
import { openaiError, openaiError2, proxyError } from './errorCode'; import { openaiError, openaiError2, proxyError, ERROR_RESPONSE } from './errorCode';
export interface ResponseType<T = any> { export interface ResponseType<T = any> {
code: number; code: number;
@@ -18,7 +18,14 @@ export const jsonRes = <T = any>(
) => { ) => {
const { code = 200, message = '', data = null, error } = props || {}; const { code = 200, message = '', data = null, error } = props || {};
let msg = message; const errResponseKey = typeof error === 'string' ? error : error?.message;
// Specified error
if (ERROR_RESPONSE[errResponseKey]) {
return res.json(ERROR_RESPONSE[errResponseKey]);
}
// another error
let msg = message || error?.message;
if ((code < 200 || code >= 400) && !message) { if ((code < 200 || code >= 400) && !message) {
msg = error?.message || '请求错误'; msg = error?.message || '请求错误';
if (typeof error === 'string') { if (typeof error === 'string') {
@@ -40,7 +47,8 @@ export const jsonRes = <T = any>(
res.json({ res.json({
code, code,
statusText: '',
message: msg, message: msg,
data data: data || error || null
}); });
}; };

View File

@@ -1,11 +1,11 @@
import type { NextApiRequest } from 'next'; import type { NextApiRequest } from 'next';
import crypto from 'crypto'; import crypto from 'crypto';
import jwt from 'jsonwebtoken'; import jwt from 'jsonwebtoken';
import tunnel from 'tunnel';
import { ChatItemType } from '@/types/chat'; import { ChatItemType } from '@/types/chat';
import { encode } from 'gpt-token-utils'; import { encode } from 'gpt-token-utils';
import { OpenApi, User } from '../mongo'; import { OpenApi, User } from '../mongo';
import { formatPrice } from '@/utils/user'; import { formatPrice } from '@/utils/user';
import { ERROR_ENUM } from '../errorCode';
/* 密码加密 */ /* 密码加密 */
export const hashPassword = (psw: string) => { export const hashPassword = (psw: string) => {
@@ -49,20 +49,20 @@ export const authOpenApiKey = async (req: NextApiRequest) => {
const { apikey: apiKey } = req.headers; const { apikey: apiKey } = req.headers;
if (!apiKey) { if (!apiKey) {
return Promise.reject('api key is empty'); return Promise.reject(ERROR_ENUM.unAuthorization);
} }
try { try {
const openApi = await OpenApi.findOne({ apiKey }); const openApi = await OpenApi.findOne({ apiKey });
if (!openApi) { if (!openApi) {
return Promise.reject('api key is error'); return Promise.reject(ERROR_ENUM.unAuthorization);
} }
const userId = String(openApi.userId); const userId = String(openApi.userId);
// 余额校验 // 余额校验
const user = await User.findById(userId); const user = await User.findById(userId);
if (!user) { if (!user) {
return Promise.reject('user is empty'); return Promise.reject(ERROR_ENUM.unAuthorization);
} }
if (formatPrice(user.balance) <= 0) { if (formatPrice(user.balance) <= 0) {
return Promise.reject('Insufficient account balance'); return Promise.reject('Insufficient account balance');