From 5e9c7cdd91db37d3f3773e540f7bf1ebb3b73625 Mon Sep 17 00:00:00 2001 From: anka <1350989414@qq.com> Date: Sun, 12 Oct 2025 10:50:01 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=BD=93=E6=B2=A1=E6=9C=89=E5=A1=AB?= =?UTF-8?q?=E5=86=99=20api=20key=20=E6=97=B6=EF=BC=8C=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E4=B8=BA=E7=A9=BA=E5=AD=97=E7=AC=A6=E4=B8=B2=20(#2834)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 修复空key导致的无法创建Provider对象的问题 * style: format code * Update astrbot/core/provider/provider.py Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> --------- Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: Soulter <905617992@qq.com> --- astrbot/core/provider/provider.py | 3 +- .../core/provider/sources/anthropic_source.py | 20 ++++++---- .../core/provider/sources/gemini_source.py | 38 ++++++++++--------- .../core/provider/sources/openai_source.py | 2 +- 4 files changed, 37 insertions(+), 26 deletions(-) diff --git a/astrbot/core/provider/provider.py b/astrbot/core/provider/provider.py index fdbd9daec..901036b11 100644 --- a/astrbot/core/provider/provider.py +++ b/astrbot/core/provider/provider.py @@ -68,7 +68,8 @@ class Provider(AbstractProvider): def get_keys(self) -> List[str]: """获得提供商 Key""" - return self.provider_config.get("key", []) + keys = self.provider_config.get("key", [""]) + return keys or [""] @abc.abstractmethod def set_key(self, key: str): diff --git a/astrbot/core/provider/sources/anthropic_source.py b/astrbot/core/provider/sources/anthropic_source.py index aaff177e5..57bffdc81 100644 --- a/astrbot/core/provider/sources/anthropic_source.py +++ b/astrbot/core/provider/sources/anthropic_source.py @@ -33,7 +33,7 @@ class ProviderAnthropic(Provider): ) self.chosen_api_key: str = "" - self.api_keys: List = provider_config.get("key", []) + self.api_keys: List = super().get_keys() self.chosen_api_key = self.api_keys[0] if len(self.api_keys) > 0 else "" self.base_url = provider_config.get("api_base", "https://api.anthropic.com") self.timeout = provider_config.get("timeout", 120) @@ -70,9 +70,13 @@ class ProviderAnthropic(Provider): { "type": "tool_use", "name": tool_call["function"]["name"], - "input": json.loads(tool_call["function"]["arguments"]) - if isinstance(tool_call["function"]["arguments"], str) - else tool_call["function"]["arguments"], + "input": ( + json.loads(tool_call["function"]["arguments"]) + if isinstance( + tool_call["function"]["arguments"], str + ) + else tool_call["function"]["arguments"] + ), "id": tool_call["id"], } ) @@ -355,9 +359,11 @@ class ProviderAnthropic(Provider): "source": { "type": "base64", "media_type": mime_type, - "data": image_data.split("base64,")[1] - if "base64," in image_data - else image_data, + "data": ( + image_data.split("base64,")[1] + if "base64," in image_data + else image_data + ), }, } ) diff --git a/astrbot/core/provider/sources/gemini_source.py b/astrbot/core/provider/sources/gemini_source.py index cc4475b6b..b14a9bdcb 100644 --- a/astrbot/core/provider/sources/gemini_source.py +++ b/astrbot/core/provider/sources/gemini_source.py @@ -3,7 +3,7 @@ import base64 import json import logging import random -from typing import Optional +from typing import Optional, List from collections.abc import AsyncGenerator from google import genai @@ -60,7 +60,7 @@ class ProviderGoogleGenAI(Provider): provider_settings, default_persona, ) - self.api_keys: list = provider_config.get("key", []) + self.api_keys: List = super().get_keys() self.chosen_api_key: str = self.api_keys[0] if len(self.api_keys) > 0 else "" self.timeout: int = int(provider_config.get("timeout", 180)) @@ -218,19 +218,21 @@ class ProviderGoogleGenAI(Provider): response_modalities=modalities, tools=tool_list, safety_settings=self.safety_settings if self.safety_settings else None, - thinking_config=types.ThinkingConfig( - thinking_budget=min( - int( - self.provider_config.get("gm_thinking_config", {}).get( - "budget", 0 - ) + thinking_config=( + types.ThinkingConfig( + thinking_budget=min( + int( + self.provider_config.get("gm_thinking_config", {}).get( + "budget", 0 + ) + ), + 24576, ), - 24576, - ), - ) - if "gemini-2.5-flash" in self.get_model() - and hasattr(types.ThinkingConfig, "thinking_budget") - else None, + ) + if "gemini-2.5-flash" in self.get_model() + and hasattr(types.ThinkingConfig, "thinking_budget") + else None + ), automatic_function_calling=types.AutomaticFunctionCallingConfig( disable=True ), @@ -274,9 +276,11 @@ class ProviderGoogleGenAI(Provider): if role == "user": if isinstance(content, list): parts = [ - types.Part.from_text(text=item["text"] or " ") - if item["type"] == "text" - else process_image_url(item["image_url"]) + ( + types.Part.from_text(text=item["text"] or " ") + if item["type"] == "text" + else process_image_url(item["image_url"]) + ) for item in content ] else: diff --git a/astrbot/core/provider/sources/openai_source.py b/astrbot/core/provider/sources/openai_source.py index 5b199ed96..81342ad53 100644 --- a/astrbot/core/provider/sources/openai_source.py +++ b/astrbot/core/provider/sources/openai_source.py @@ -38,7 +38,7 @@ class ProviderOpenAIOfficial(Provider): default_persona, ) self.chosen_api_key = None - self.api_keys: List = provider_config.get("key", []) + self.api_keys: List = super().get_keys() self.chosen_api_key = self.api_keys[0] if len(self.api_keys) > 0 else None self.timeout = provider_config.get("timeout", 120) if isinstance(self.timeout, str):