XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/gpt4free

Add Azure quota URL, enhance API model retrieval, and improve error handling for invalid API keys

270da337
hlohaus <hlohaus@users.noreply.github.com>
提交于

代码差异

6 个文件 +16 -7
Modified g4f/Provider/needs_auth/Azure.py +1 -0
@@ -18,6 +18,7 @@ class Azure(OpenaiTemplate):
18 18 working = True
19 19 active_by_default = False
20 20 login_url = "https://discord.gg/qXA4Wf4Fsm"
21 quota_url = "https://g4f.space/api/azure/chat/completions"
21 22 routes: dict[str, str] = {}
22 23 audio_models = ["gpt-4o-mini-audio-preview"]
23 24 vision_models = ["gpt-4.1", "o4-mini", "model-router", "flux.1-kontext-pro"]
Modified g4f/api/__init__.py +1 -1
@@ -348,7 +348,7 @@ class Api:
348 348 "vision": bool(getattr(provider, "vision_models", False)),
349 349 "provider": True,
350 350 } for provider_name, provider in ProviderUtils.convert.items()
351 if provider.working and provider_name not in ("Custom")
351 if provider.working
352 352 ]
353 353 }
354 354
Modified g4f/client/stubs.py +2 -0
@@ -41,6 +41,8 @@ class CompletionTokenDetails(BaseModel):
41 41 reasoning_tokens: int
42 42 image_tokens: int
43 43 audio_tokens: int
44 accepted_prediction_tokens: Optional[int] = None
45 rejected_prediction_tokens: Optional[int] = None
44 46
45 47 class UsageModel(BaseModel):
46 48 prompt_tokens: int
Modified g4f/gui/server/api.py +2 -2
@@ -32,7 +32,7 @@ logger = logging.getLogger(__name__)
32 32
33 33 class Api:
34 34 @staticmethod
35 def get_provider_models(provider: str, api_key: str = None, ignored: list = None):
35 def get_provider_models(provider: str, api_key: str = None, base_url: str = None, ignored: list = None):
36 36 def get_model_data(provider: ProviderModelMixin, model: str, default: bool = False) -> dict:
37 37 model_id = model.get("id") if isinstance(model, dict) else model
38 38 return {
@@ -53,7 +53,7 @@ class Api:
53 53 has_grouped_models = hasattr(provider, "get_grouped_models")
54 54 method = provider.get_grouped_models if has_grouped_models else provider.get_models
55 55 if "api_key" in signature(provider.get_models).parameters:
56 models = method(api_key=api_key)
56 models = method(api_key=api_key, base_url=base_url)
57 57 elif "ignored" in signature(provider.get_models).parameters:
58 58 models = method(ignored=ignored)
59 59 else:
Modified g4f/gui/server/backend_api.py +6 -4
@@ -225,9 +225,10 @@ class Backend_Api(Api):
225 225 except json.JSONDecodeError as e:
226 226 logger.exception(e)
227 227 return jsonify({"error": {"message": "Invalid JSON data"}}), 400
228 for key in ["base_url", "proxy"]:
229 if key in json_data:
230 del json_data[key] # Remove unsupported fields for security
228 if "proxy" in json_data:
229 del json_data["proxy"]
230 if json_data.get("provider") != "Custom" and "base_url" in json_data:
231 del json_data["base_url"]
231 232 if app.demo and has_crypto:
232 233 secret = request.headers.get("x-secret", request.headers.get("x_secret"))
233 234 if not secret or not validate_secret(secret):
@@ -676,8 +677,9 @@ class Backend_Api(Api):
676 677
677 678 def get_provider_models(self, provider: str):
678 679 api_key = request.headers.get("x-api-key")
680 base_url = request.headers.get("x-api-base") if provider == "Custom" else None
679 681 ignored = request.headers.get("x-ignored", "").split()
680 return super().get_provider_models(provider, api_key, ignored)
682 return super().get_provider_models(provider, api_key, base_url, ignored)
681 683
682 684 def _format_json(self, response_type: str, content = None, **kwargs) -> str:
683 685 """
Modified g4f/requests/raise_for_status.py +4 -0
@@ -58,6 +58,8 @@ async def raise_for_status_async(response: Union[StreamResponse, ClientResponse]
58 58 raise ResponseStatusError(f"Response {response.status}: Bad Gateway")
59 59 elif response.status == 504:
60 60 raise RateLimitError(f"Response {response.status}: Gateway Timeout ")
61 elif response.status == 400 and "API key not valid" in message:
62 raise MissingAuthError(f"Response {response.status}: Invalid API key")
61 63 else:
62 64 raise ResponseStatusError(f"Response {response.status}: {'HTML content' if is_html else message}")
63 65
@@ -85,5 +87,7 @@ def raise_for_status(response: Union[Response, StreamResponse, ClientResponse, R
85 87 raise ResponseStatusError(f"Response {response.status_code}: Bad Gateway")
86 88 elif response.status_code == 504:
87 89 raise RateLimitError(f"Response {response.status_code}: Gateway Timeout ")
90 elif response.status_code == 400 and "API key not valid" in message:
91 raise MissingAuthError(f"Response {response.status_code}: Invalid API key")
88 92 else:
89 93 raise ResponseStatusError(f"Response {response.status_code}: {'HTML content' if is_html else message}")