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

XFEstudio/gpt4free

Support timeout in backend_api

9f941ae7
hlohaus <983577+hlohaus@users.noreply.github.com>
提交于

代码差异

4 个文件 +37 -15
Modified g4f/Provider/needs_auth/Video.py +10 -5
@@ -110,6 +110,7 @@ class Video(AsyncGeneratorProvider, ProviderModelMixin):
110 110 yield VideoResponse(str(response.url), prompt)
111 111 return
112 112 raise MissingRequirementsError("Video provider requires a browser to be installed.")
113 page = None
113 114 try:
114 115 yield ContinueResponse("Timeout waiting for Video URL")
115 116 page = await browser.get(cls.urls[model].format(quote(prompt)))
@@ -128,16 +129,20 @@ class Video(AsyncGeneratorProvider, ProviderModelMixin):
128 129 for key, value in event.request.headers.items():
129 130 RequestConfig.headers[key.lower()] = value
130 131 RequestConfig.urls[prompt].append(event.request.url)
131 await page.send(nodriver.cdp.network.enable())
132 page.add_handler(nodriver.cdp.network.RequestWillBeSent, on_request)
133 if model == "search":
134 for _ in range(5):
135 await page.scroll_down(50)
132 if page is not None:
133 await page.send(nodriver.cdp.network.enable())
134 page.add_handler(nodriver.cdp.network.RequestWillBeSent, on_request)
135 if model == "search":
136 for _ in range(5):
137 await page.scroll_down(50)
138 await asyncio.sleep(1)
136 139 response = await RequestConfig.get_response(prompt)
137 140 if response:
138 141 yield Reasoning(label="Found", status="")
139 142 yield response
140 143 return
144 if page is None:
145 raise RuntimeError("Failed to open page or get response.")
141 146 try:
142 147 await asyncio.sleep(3)
143 148 await page.select("textarea", 240)
Modified g4f/api/__init__.py +12 -6
@@ -5,6 +5,7 @@ import json
5 5 import uvicorn
6 6 import secrets
7 7 import os
8 import re
8 9 import shutil
9 10 from email.utils import formatdate
10 11 import os.path
@@ -703,6 +704,12 @@ class Api:
703 704 HTTP_404_NOT_FOUND: {}
704 705 })
705 706 async def get_media(filename, request: Request, thumbnail: bool = False):
707 def get_timestamp(str):
708 m=re.match("^[0-9]+", str)
709 if m:
710 return int(m.group(0))
711 else:
712 raise ValueError("No timestamp found in filename")
706 713 target = os.path.join(get_media_dir(), os.path.basename(filename))
707 714 if thumbnail and has_pillow:
708 715 thumbnail_dir = os.path.join(get_media_dir(), "thumbnails")
@@ -713,14 +720,13 @@ class Api:
713 720 target = other_name
714 721 ext = os.path.splitext(filename)[1][1:]
715 722 mime_type = EXTENSIONS_MAP.get(ext)
723 stat_result = SimpleNamespace()
724 stat_result.st_size = 0
725 stat_result.st_mtime = get_timestamp(filename)
716 726 if thumbnail and has_pillow and os.path.isfile(thumbnail):
717 stat_result = os.stat(thumbnail)
727 stat_result.st_size = os.stat(thumbnail).st_size
718 728 elif not thumbnail and os.path.isfile(target):
719 stat_result = os.stat(target)
720 else:
721 stat_result = SimpleNamespace()
722 stat_result.st_size = 0
723 stat_result.st_mtime = 0
729 stat_result.st_size = os.stat(target).st_size
724 730 headers = {
725 731 "cache-control": "public, max-age=31536000",
726 732 "last-modified": formatdate(stat_result.st_mtime, usegmt=True),
Modified g4f/gui/server/api.py +10 -1
@@ -199,7 +199,16 @@ class Api:
199 199 chunk.alt = format_media_prompt(kwargs.get("messages"), chunk.alt)
200 200 width, height = get_width_height(chunk.get("width"), chunk.get("height"))
201 201 tags = [model, kwargs.get("aspect_ratio"), kwargs.get("resolution")]
202 media = asyncio.run(copy_media(chunk.get_list(), chunk.get("cookies"), chunk.get("headers"), proxy=proxy, alt=chunk.alt, tags=tags, add_url=f"width={width}&height={height}&"))
202 media = asyncio.run(copy_media(
203 chunk.get_list(),
204 chunk.get("cookies"),
205 chunk.get("headers"),
206 proxy=proxy,
207 alt=chunk.alt,
208 tags=tags,
209 add_url=f"width={width}&height={height}&",
210 timeout=kwargs.get("timeout"),
211 ))
203 212 media = ImageResponse(media, chunk.alt) if isinstance(chunk, ImageResponse) else VideoResponse(media, chunk.alt)
204 213 yield self._format_json("content", str(media), urls=media.urls, alt=media.alt)
205 214 elif isinstance(chunk, SynthesizeData):
Modified g4f/image/copy_images.py +5 -3
@@ -7,8 +7,8 @@ import hashlib
7 7 import base64
8 8 from datetime import datetime
9 9 from typing import AsyncIterator
10 from urllib.parse import quote, unquote
11 from aiohttp import ClientSession, ClientError
10 from urllib.parse import quote
11 from aiohttp import ClientSession, ClientError, ClientTimeout
12 12 from urllib.parse import urlparse
13 13
14 14 from ..typing import Optional, Cookies, Union
@@ -117,7 +117,8 @@ async def copy_media(
117 117 tags: list[str] = None,
118 118 add_url: Union[bool, str] = True,
119 119 target: str = None,
120 ssl: bool = None
120 ssl: bool = None,
121 timeout: Optional[int] = None
121 122 ) -> list[str]:
122 123 """
123 124 Download and store images locally with Unicode-safe filenames
@@ -131,6 +132,7 @@ async def copy_media(
131 132 connector=get_connector(proxy=proxy),
132 133 cookies=cookies,
133 134 headers=headers,
135 timeout=ClientTimeout(total=timeout) if timeout else None,
134 136 ) as session:
135 137 async def copy_image(image: str, target: str = None) -> str:
136 138 """Process individual image and return its local URL"""