From c5e8bc7e20969c0729c92eadf17a0d4b855908c6 Mon Sep 17 00:00:00 2001 From: Raven95676 Date: Fri, 11 Apr 2025 18:55:46 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E7=94=9F=E6=88=90=E5=86=85=E5=AE=B9=E7=9A=84=E9=87=8D=E8=AF=95?= =?UTF-8?q?=E6=9C=BA=E5=88=B6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/provider/sources/gemini_source.py | 59 +++++++++++-------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/astrbot/core/provider/sources/gemini_source.py b/astrbot/core/provider/sources/gemini_source.py index 2f865dbbb..50f4018ee 100644 --- a/astrbot/core/provider/sources/gemini_source.py +++ b/astrbot/core/provider/sources/gemini_source.py @@ -5,7 +5,7 @@ import random from typing import Dict, List, Optional from google import genai -from google.genai import errors, types +from google.genai import types import astrbot.core.message.components as Comp from astrbot import logger @@ -87,7 +87,7 @@ class ProviderGoogleGenAI(Provider): for m in models if "generateContent" in m.supported_actions ] - except errors.APIError as e: + except Exception as e: raise Exception(f"获取模型列表失败: {e}") @staticmethod @@ -186,9 +186,10 @@ class ProviderGoogleGenAI(Provider): if self.provider_config.get("gm_resp_image_modal", False): modalities.append("Image") + result: Optional[types.GenerateContentResponse] = None while True: - result: types.GenerateContentResponse = ( - await self.client.models.generate_content( + try: + result = await self.client.models.generate_content( model=self.get_model(), contents=conversation, config=types.GenerateContentConfig( @@ -204,30 +205,36 @@ class ProviderGoogleGenAI(Provider): ), ), ) - ) - result_str = str(result) - finish_reason = result.candidates[0].finish_reason - if "Developer instruction is not enabled" in result_str: - logger.warning(f"{self.get_model()} 不支持 system prompt,已自动去除。") - system_instruction = "" + if result.candidates[0].finish_reason == types.FinishReason.RECITATION: + if temperature > 2: + raise Exception("温度参数已超过最大值2,仍然发生recitation") + temperature += 0.2 + logger.warning( + f"发生了recitation,正在提高温度至{temperature:.1f}重试..." + ) + continue + + break + + except Exception as e: + error_msg = str(e) + if "Developer instruction is not enabled" in error_msg: + logger.warning( + f"{self.get_model()} 不支持 system prompt,已自动去除(影响人格设置)" + ) + system_instruction = None + elif "Function calling is not enabled" in error_msg: + logger.warning(f"{self.get_model()} 不支持函数调用,已自动去除") + tool_list = None + elif "Multi-modal output is not supported" in error_msg: + logger.warning( + f"{self.get_model()} 不支持多模态输出,降级为文本模态" + ) + modalities = ["Text"] + else: + raise continue - elif "Function calling is not enabled" in result_str: - logger.warning(f"{self.get_model()} 不支持函数调用,已自动去除。") - tool_list = None - continue - elif "Multi-modal output is not supported" in result_str: - logger.warning(f"{self.get_model()} 不支持多模态输出,降级为文本模态。") - modalities = ["Text"] - continue - elif finish_reason == types.FinishReason.RECITATION: - logger.warning("发生了recitation,正在尝试加温重试...") - temperature += 0.2 - logger.info(f"当前温度: {temperature}") - if temperature > 2: - raise Exception("温度已到达(或超过)2") - continue - break llm_response = LLMResponse("assistant") result_parts: Optional[types.Part] = result.candidates[0].content.parts