perf: 完善openai异常处理

This commit is contained in:
RockChinQ
2024-02-01 18:11:47 +08:00
parent a9d92115f8
commit 7026abe56a
14 changed files with 1195 additions and 9 deletions

View File

@@ -78,6 +78,8 @@ class Controller:
self.ap.logger.debug(result.debug_notice)
if result.console_notice:
self.ap.logger.info(result.console_notice)
if result.error_notice:
self.ap.logger.error(result.error_notice)
async def _execute_from_stage(
self,

View File

@@ -35,4 +35,7 @@ class StageProcessResult(pydantic.BaseModel):
"""只要设置了就会输出到控制台"""
debug_notice: typing.Optional[str] = ''
error_notice: typing.Optional[str] = ''

View File

@@ -2,6 +2,7 @@ from __future__ import annotations
import typing
import time
import traceback
import mirai
@@ -78,6 +79,14 @@ class ChatMessageHandler(handler.MessageHandler):
result_type=entities.ResultType.CONTINUE,
new_query=query
)
except Exception as e:
yield entities.StageProcessResult(
result_type=entities.ResultType.INTERRUPT,
new_query=query,
user_notice=self.ap.tips_mgr.data['alter_tip_message'] if self.ap.cfg_mgr.data['hide_exce_info_to_user'] else f'{e}',
error_notice=f'{e}',
debug_notice=traceback.format_exc()
)
finally:
query.session.using_conversation.messages.append(query.user_message)
query.session.using_conversation.messages.extend(query.resp_messages)

View File

@@ -3,11 +3,14 @@ from __future__ import annotations
import asyncio
import typing
import json
from typing import AsyncGenerator
import openai
import openai.types.chat.chat_completion as chat_completion
from .. import api, entities
from pkg.provider.entities import Message
from .. import api, entities, errors
from ....core import entities as core_entities
from ... import entities as llm_entities
from ...tools import entities as tools_entities
@@ -69,7 +72,7 @@ class OpenAIChatCompletion(api.LLMAPIRequester):
return message
async def request(
async def _request(
self, query: core_entities.Query
) -> typing.AsyncGenerator[llm_entities.Message, None]:
"""请求"""
@@ -116,3 +119,20 @@ class OpenAIChatCompletion(api.LLMAPIRequester):
pending_tool_calls = msg.tool_calls
req_messages.append(msg.dict(exclude_none=True))
async def request(self, query: core_entities.Query) -> AsyncGenerator[Message, None]:
try:
async for msg in self._request(query):
yield msg
except asyncio.TimeoutError:
raise errors.RequesterError('请求超时')
except openai.BadRequestError as e:
raise errors.RequesterError(f'请求错误: {e.message}')
except openai.AuthenticationError as e:
raise errors.RequesterError(f'无效的 api-key: {e.message}')
except openai.NotFoundError as e:
raise errors.RequesterError(f'请求路径错误: {e.message}')
except openai.RateLimitError as e:
raise errors.RequesterError(f'请求过于频繁: {e.message}')
except openai.APIError as e:
raise errors.RequesterError(f'请求错误: {e.message}')

View File

@@ -0,0 +1,5 @@
class RequesterError(Exception):
"""Base class for all Requester errors."""
def __init__(self, message: str):
super().__init__("模型请求失败: "+message)