返回提交历史
Modified
g4f/api/__init__.py
+1
-0
Modified
g4f/client/factory.py
+2
-0
Modified
g4f/gui/server/api.py
+2
-6
Modified
g4f/gui/server/backend_api.py
+15
-28
XFEstudio/gpt4free
Add support for .py file type in MIME type mapping and refactor provider handling in Backend_Api
3c2662eb
代码差异
4 个文件
+20
-34
@@ -1023,6 +1023,7 @@ class Api:
1023
1023
"woff2": "font/woff2",
1024
1024
"ttf": "font/ttf",
1025
1025
"otf": "font/otf",
1026
"py": "text/plain; charset=utf-8",
1026
1027
}
1027
1028
1028
1029
@self.app.get("/pa/files/{file_path:path}", responses={
@@ -126,6 +126,8 @@ class AbstractClientFactory:
126
126
from g4f.mcp.pa_provider import get_pa_registry
127
127
registry = get_pa_registry()
128
128
if provider:
129
if provider.startswith("pa:"):
130
provider = provider[3:]
129
131
provider_cls = registry.get_provider_class(provider)
130
132
if provider_cls:
131
133
return provider_cls
@@ -178,10 +178,8 @@ class Api:
178
178
debug.log = decorated_log
179
179
proxy = os.environ.get("G4F_PROXY")
180
180
try:
181
model, provider_handler = get_model_and_provider(
182
kwargs.get("model"), provider or AnyProvider,
183
has_images="media" in kwargs,
184
)
181
provider_handler = provider or AnyProvider
182
provider = provider_handler.__name__ if provider_handler else provider
185
183
if "user" in kwargs:
186
184
debug.error("User:", kwargs.get("user", "Unknown"))
187
185
debug.error("Referrer:", kwargs.get("referer", ""))
@@ -191,8 +189,6 @@ class Api:
191
189
yield self._format_json('error', type(e).__name__, message=get_error_message(e))
192
190
return
193
191
if not isinstance(provider_handler, BaseRetryProvider):
194
if not provider:
195
provider = provider_handler.__name__
196
192
yield self.handle_provider(provider_handler, model)
197
193
if hasattr(provider_handler, "get_parameters"):
198
194
yield self._format_json("parameters", provider_handler.get_parameters(as_json=True))
@@ -38,7 +38,6 @@ except ImportError:
38
38
has_crypto = False
39
39
40
40
from ...client import Client
41
from ...client.service import convert_to_provider
42
41
from ...providers.asyncio import to_sync_generator
43
42
from ...providers.response import FinishReason, AudioResponse, MediaResponse, Reasoning, HiddenResponse, JsonResponse
44
43
from ...client.helper import filter_markdown
@@ -49,10 +48,7 @@ from ...image import is_allowed_extension, process_image, MEDIA_TYPE_MAP, is_saf
49
48
from ...cookies import get_cookies_dir
50
49
from ...image.copy_images import secure_filename, get_source_url, get_media_dir, copy_media
51
50
from ...client.service import get_model_and_provider
52
from ...providers.any_model_map import model_map
53
from ... import Provider
54
from ... import models
55
from ...Provider import ProviderUtils
51
from ...client.factory import AbstractClientFactory
56
52
from .api import Api
57
53
58
54
logger = logging.getLogger(__name__)
@@ -260,8 +256,8 @@ class Backend_Api(Api):
260
256
261
257
# Resolve provider class
262
258
try:
263
provider_class = ProviderUtils.get_by_label(provider)
264
except ValueError as e:
259
provider_class = AbstractClientFactory.create_provider(None, provider)
260
except ProviderNotFoundError as e:
265
261
return jsonify({"error": {"message": str(e)}}), 404
266
262
267
263
if request.method == 'GET':
@@ -345,25 +341,16 @@ class Backend_Api(Api):
345
341
json_data['timeout'] = app.timeout
346
342
if app.stream_timeout:
347
343
json_data['stream_timeout'] = app.stream_timeout
348
if app.demo and not json_data.get("provider"):
349
model = json_data.get("model")
350
if model != "default" and model in models.demo_models:
351
json_data["provider"] = random.choice(models.demo_models[model][1])
352
else:
353
json_data["provider"] = models.HuggingFace
354
344
if app.demo:
355
345
json_data["user"] = request.headers.get("x-user", "error")
356
346
json_data["referer"] = request.headers.get("referer", "")
357
347
json_data["user-agent"] = request.headers.get("user-agent", "")
358
348
359
349
kwargs = self._prepare_conversation_kwargs(json_data)
360
provider = kwargs.pop("provider", None)
361
if provider and provider not in Provider.__map__:
362
if provider in model_map:
363
kwargs['model'] = provider
364
provider = None
365
else:
366
return jsonify({"error": {"message": "Provider not found"}}), 404
350
try:
351
provider = AbstractClientFactory.create_provider(None, kwargs.pop("provider", None))
352
except ProviderNotFoundError as e:
353
return jsonify({"error": {"message": str(e)}}), 404
367
354
return self.app.response_class(
368
355
safe_iter_generator(self._create_response_stream(
369
356
kwargs,
@@ -406,11 +393,11 @@ class Backend_Api(Api):
406
393
@app.route('/backend-api/v2/quota/<provider>', methods=['GET'])
407
394
async def get_quota(provider: str):
408
395
try:
409
provider_handler = convert_to_provider(provider)
410
except ProviderNotFoundError:
411
return "Provider not found", 404
396
provider_handler = AbstractClientFactory.create_provider(None, provider)
397
except ProviderNotFoundError as e:
398
return jsonify({"error": {"message": str(e)}}), 404
412
399
if not hasattr(provider_handler, "get_quota"):
413
return "Provider doesn't support get_quota", 500
400
return jsonify({"error": {"message": "Provider doesn't support get_quota"}}), 500
414
401
request_api_key = request.headers.get("x-api-key")
415
402
try:
416
403
return jsonify(await provider_handler.get_quota(api_key=request_api_key))
@@ -751,11 +738,11 @@ class Backend_Api(Api):
751
738
752
739
def handle_synthesize(self, provider: str):
753
740
try:
754
provider_handler = convert_to_provider(provider)
755
except ProviderNotFoundError:
756
return "Provider not found", 404
741
provider_handler = AbstractClientFactory.create_provider(None, provider)
742
except ProviderNotFoundError as e:
743
return jsonify({"error": {"message": str(e)}}), 404
757
744
if not hasattr(provider_handler, "synthesize"):
758
return "Provider doesn't support synthesize", 500
745
return jsonify({"error": {"message": "Provider doesn't support synthesize"}}), 500
759
746
response_data = provider_handler.synthesize({**request.args})
760
747
if asyncio.iscoroutinefunction(provider_handler.synthesize):
761
748
response_data = asyncio.run(response_data)