返回提交历史
Modified
g4f/Provider/needs_auth/Azure.py
+1
-0
Modified
g4f/api/__init__.py
+1
-1
Modified
g4f/client/stubs.py
+2
-0
Modified
g4f/gui/server/api.py
+2
-2
Modified
g4f/gui/server/backend_api.py
+6
-4
Modified
g4f/requests/raise_for_status.py
+4
-0
XFEstudio/gpt4free
Add Azure quota URL, enhance API model retrieval, and improve error handling for invalid API keys
270da337
代码差异
6 个文件
+16
-7
@@ -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"]
@@ -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
@@ -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
@@ -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:
@@ -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
"""
@@ -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}")