From 5f86c4ab991970cb656434564569da6502b8e485 Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Tue, 21 Jan 2025 16:29:19 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E5=A2=9E=E5=BC=BA=20LLM=20=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86=20#243?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../process_stage/method/llm_request.py | 2 +- .../core/provider/sources/gemini_source.py | 23 ++++++++++++------ .../core/provider/sources/openai_source.py | 22 ++++++++++++----- astrbot/core/provider/sources/zhipu_source.py | 24 ++++++++++++------- 4 files changed, 49 insertions(+), 22 deletions(-) diff --git a/astrbot/core/pipeline/process_stage/method/llm_request.py b/astrbot/core/pipeline/process_stage/method/llm_request.py index 2cfa80437..81ac5c36e 100644 --- a/astrbot/core/pipeline/process_stage/method/llm_request.py +++ b/astrbot/core/pipeline/process_stage/method/llm_request.py @@ -105,5 +105,5 @@ class LLMRequestSubStage(Stage): except BaseException as e: logger.error(traceback.format_exc()) - event.set_result(MessageEventResult().message("AstrBot 请求 LLM 资源失败:" + str(e))) + event.set_result(MessageEventResult().message(f"AstrBot 请求失败。\n错误类型: {type(e).__name__}\n错误信息: {str(e)}")) return \ No newline at end of file diff --git a/astrbot/core/provider/sources/gemini_source.py b/astrbot/core/provider/sources/gemini_source.py index d5e52edea..67b025b6a 100644 --- a/astrbot/core/provider/sources/gemini_source.py +++ b/astrbot/core/provider/sources/gemini_source.py @@ -224,15 +224,24 @@ class ProviderGoogleGenAI(Provider): try: llm_response = await self._query(payloads, func_tool) + await self.save_history(contexts, new_record, session_id, llm_response) + return llm_response except Exception as e: if "maximum context length" in str(e): - logger.warning(f"请求失败:{e}。上下文长度超过限制。尝试弹出最早的记录然后重试。") - self.pop_record(session_id) - logger.warning(traceback.format_exc()) - - await self.save_history(contexts, new_record, session_id, llm_response) - - return llm_response + retry_cnt = 10 + while retry_cnt > 0: + logger.warning(f"请求失败:{e}。上下文长度超过限制。尝试弹出最早的记录然后重试。") + try: + self.pop_record(session_id) + llm_response = await self._query(payloads, func_tool) + break + except Exception as e: + if "maximum context length" in str(e): + retry_cnt -= 1 + else: + raise e + else: + raise e async def save_history(self, contexts: List, new_record: dict, session_id: str, llm_response: LLMResponse): if llm_response.role == "assistant" and session_id: diff --git a/astrbot/core/provider/sources/openai_source.py b/astrbot/core/provider/sources/openai_source.py index 5d18dea71..ef70ff00c 100644 --- a/astrbot/core/provider/sources/openai_source.py +++ b/astrbot/core/provider/sources/openai_source.py @@ -164,15 +164,25 @@ class ProviderOpenAIOfficial(Provider): try: llm_response = await self._query(payloads, func_tool) + await self.save_history(contexts, new_record, session_id, llm_response) + return llm_response except Exception as e: if "maximum context length" in str(e): - logger.warning(f"请求失败:{e}。上下文长度超过限制。尝试弹出最早的记录然后重试。") - self.pop_record(session_id) - logger.warning(traceback.format_exc()) - - await self.save_history(contexts, new_record, session_id, llm_response) + retry_cnt = 10 + while retry_cnt > 0: + logger.warning(f"请求失败:{e}。上下文长度超过限制。尝试弹出最早的记录然后重试。") + try: + self.pop_record(session_id) + llm_response = await self._query(payloads, func_tool) + break + except Exception as e: + if "maximum context length" in str(e): + retry_cnt -= 1 + else: + raise e + else: + raise e - return llm_response async def save_history(self, contexts: List, new_record: dict, session_id: str, llm_response: LLMResponse): if llm_response.role == "assistant" and session_id: diff --git a/astrbot/core/provider/sources/zhipu_source.py b/astrbot/core/provider/sources/zhipu_source.py index 98526862f..f1d576775 100644 --- a/astrbot/core/provider/sources/zhipu_source.py +++ b/astrbot/core/provider/sources/zhipu_source.py @@ -60,15 +60,23 @@ class ProviderZhipu(ProviderOpenAIOfficial): "messages": context_query, **model_cfgs } - llm_response = None try: llm_response = await self._query(payloads, func_tool) + await self.save_history(contexts, new_record, session_id, llm_response) + return llm_response except Exception as e: if "maximum context length" in str(e): - logger.warning(f"请求失败:{e}。上下文长度超过限制。尝试弹出最早的记录然后重试。") - self.pop_record(session_id) - logger.warning(traceback.format_exc()) - - await self.save_history(contexts, new_record, session_id, llm_response) - - return llm_response \ No newline at end of file + retry_cnt = 10 + while retry_cnt > 0: + logger.warning(f"请求失败:{e}。上下文长度超过限制。尝试弹出最早的记录然后重试。") + try: + self.pop_record(session_id) + llm_response = await self._query(payloads, func_tool) + break + except Exception as e: + if "maximum context length" in str(e): + retry_cnt -= 1 + else: + raise e + else: + raise e \ No newline at end of file