返回提交历史
Modified
g4f/Provider/hf/__init__.py
+3
-0
Modified
g4f/api/__init__.py
+25
-8
XFEstudio/gpt4free
Fix unittests on Github
e43902cd
代码差异
2 个文件
+28
-8
@@ -9,6 +9,7 @@ from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
9
9
from .HuggingChat import HuggingChat
10
10
from .HuggingFaceAPI import HuggingFaceAPI
11
11
from .HuggingFaceInference import HuggingFaceInference
12
from .models import model_aliases
12
13
from ... import debug
13
14
14
15
class HuggingFace(AsyncGeneratorProvider, ProviderModelMixin):
@@ -24,6 +25,8 @@ class HuggingFace(AsyncGeneratorProvider, ProviderModelMixin):
24
25
cls.image_models = HuggingFaceInference.image_models
25
26
return cls.models
26
27
28
model_aliases = model_aliases
29
27
30
@classmethod
28
31
async def create_async_generator(
29
32
cls,
@@ -6,7 +6,6 @@ import uvicorn
6
6
import secrets
7
7
import os
8
8
import shutil
9
import time
10
9
from email.utils import formatdate
11
10
import os.path
12
11
import hashlib
@@ -38,7 +37,7 @@ import g4f.debug
38
37
from g4f.client import AsyncClient, ChatCompletion, ImagesResponse, convert_to_provider
39
38
from g4f.providers.response import BaseConversation, JsonConversation
40
39
from g4f.client.helper import filter_none
41
from g4f.image import is_data_uri_an_image, images_dir
40
from g4f.image import is_data_uri_an_image, images_dir, copy_images
42
41
from g4f.errors import ProviderNotFoundError, ModelNotFoundError, MissingAuthError, NoValidHarFileError
43
42
from g4f.cookies import read_cookie_files, get_cookies_dir
44
43
from g4f.Provider import ProviderType, ProviderUtils, __providers__
@@ -50,6 +49,7 @@ from .stubs import (
50
49
ErrorResponseModel, ProviderResponseDetailModel,
51
50
FileResponseModel, UploadResponseModel, Annotated
52
51
)
52
from g4f import debug
53
53
54
54
logger = logging.getLogger(__name__)
55
55
@@ -72,7 +72,7 @@ def create_app():
72
72
api.register_routes()
73
73
api.register_authorization()
74
74
api.register_validation_exception_handler()
75
75
76
76
if AppConfig.gui:
77
77
gui_app = WSGIMiddleware(get_gui_app(AppConfig.demo))
78
78
app.mount("/", gui_app)
@@ -539,12 +539,12 @@ class Api:
539
539
response_data = provider_handler.synthesize({**request.query_params})
540
540
content_type = getattr(provider_handler, "synthesize_content_type", "application/octet-stream")
541
541
return StreamingResponse(response_data, media_type=content_type)
542
542
543
543
@self.app.get("/json/{filename}")
544
544
async def get_json(filename, request: Request):
545
545
return ""
546
546
547
@self.app.get("/images/{filename}", response_class=FileResponse, responses={
547
@self.app.get("/images/{filename}", responses={
548
548
HTTP_200_OK: {"content": {"image/*": {}}},
549
549
HTTP_404_NOT_FOUND: {}
550
550
})
@@ -558,7 +558,7 @@ class Api:
558
558
stat_result.st_mtime = int(f"{filename.split('_')[0]}") if filename.startswith("1") else 0
559
559
headers = {
560
560
"cache-control": "public, max-age=31536000",
561
"content-type": f"image/{ext.replace('jpg', 'jepg')}",
561
"content-type": f"image/{ext.replace('jpg', 'jpeg')[1:] or 'jpeg'}",
562
562
"content-length": str(stat_result.st_size),
563
563
"last-modified": formatdate(stat_result.st_mtime, usegmt=True),
564
564
"etag": f'"{hashlib.md5(filename.encode()).hexdigest()}"',
@@ -576,8 +576,25 @@ class Api:
576
576
except KeyError:
577
577
pass
578
578
if not os.path.isfile(target):
579
return Response(status_code=HTTP_404_NOT_FOUND)
580
return response
579
source_url = str(request.query_params).split("url=", 1)
580
if len(source_url) > 1:
581
source_url = source_url[1]
582
source_url = source_url.replace("%2F", "/").replace("%3A", ":").replace("%3F", "?")
583
if source_url.startswith("http"):
584
await copy_images(
585
[source_url],
586
target=target)
587
debug.log(f"Image copied from {source_url}")
588
if not os.path.isfile(target):
589
return ErrorResponse.from_message("File not found", HTTP_404_NOT_FOUND)
590
async def stream():
591
with open(target, "rb") as file:
592
while True:
593
chunk = file.read(65536)
594
if not chunk:
595
break
596
yield chunk
597
return StreamingResponse(stream(), headers=headers)
581
598
582
599
def format_exception(e: Union[Exception, str], config: Union[ChatCompletionsConfig, ImageGenerationConfig] = None, image: bool = False) -> str:
583
600
last_provider = {} if not image else g4f.get_last_provider(True)