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

XFEstudio/gpt4free

Support timeout in backend_api

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

代码差异

4 个文件 +31 -25
Modified g4f/Provider/needs_auth/Video.py +24 -19
@@ -50,6 +50,7 @@ class RequestConfig:
50 50
51 51 class Video(AsyncGeneratorProvider, ProviderModelMixin):
52 52 urls = {
53 "search": "https://sora.chatgpt.com/explore?query={0}",
53 54 "sora": "https://sora.chatgpt.com/explore",
54 55 #"veo": "https://aistudio.google.com/generate-video"
55 56 }
@@ -57,7 +58,7 @@ class Video(AsyncGeneratorProvider, ProviderModelMixin):
57 58 drive_url = "https://www.googleapis.com/drive/v3/"
58 59
59 60 active_by_default = True
60 default_model = "sora"
61 default_model = "search"
61 62 models = list(urls.keys())
62 63 video_models = models
63 64
@@ -82,7 +83,7 @@ class Video(AsyncGeneratorProvider, ProviderModelMixin):
82 83 if model not in cls.video_models:
83 84 raise ValueError(f"Model '{model}' is not supported by {cls.__name__}. Supported models: {cls.models}")
84 85 yield ProviderInfo(**cls.get_dict(), model="sora")
85 prompt = format_media_prompt(messages, prompt)
86 prompt = format_media_prompt(messages, prompt)[:100]
86 87 if not prompt:
87 88 raise ValueError("Prompt cannot be empty.")
88 89 response = await RequestConfig.get_response(prompt)
@@ -111,9 +112,26 @@ class Video(AsyncGeneratorProvider, ProviderModelMixin):
111 112 raise MissingRequirementsError("Video provider requires a browser to be installed.")
112 113 try:
113 114 yield ContinueResponse("Timeout waiting for Video URL")
114 cls.page = await browser.get(cls.urls[model])
115 cls.page = await browser.get(cls.urls[model].format(quote(prompt)))
115 116 except Exception as e:
116 117 debug.error(f"Error opening page:", e)
118 if prompt not in RequestConfig.urls:
119 RequestConfig.urls[prompt] = []
120 def on_request(event: nodriver.cdp.network.RequestWillBeSent, page=None):
121 if ".mp4" in event.request.url:
122 RequestConfig.headers = {}
123 for key, value in event.request.headers.items():
124 RequestConfig.headers[key.lower()] = value
125 RequestConfig.urls[prompt].append(event.request.url)
126 elif event.request.url.startswith(cls.drive_url):
127 RequestConfig.headers = {}
128 for key, value in event.request.headers.items():
129 RequestConfig.headers[key.lower()] = value
130 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 asyncio.sleep(5)
117 135 response = await RequestConfig.get_response(prompt)
118 136 if response:
119 137 yield Reasoning(label="Found", status="")
@@ -186,22 +204,9 @@ class Video(AsyncGeneratorProvider, ProviderModelMixin):
186 204 yield Reasoning(label=f"Clicked 'Queued' button")
187 205 break
188 206 except ProtocolException as e:
189 pass
190 if prompt not in RequestConfig.urls:
191 RequestConfig.urls[prompt] = []
192 def on_request(event: nodriver.cdp.network.RequestWillBeSent, page=None):
193 if ".mp4" in event.request.url:
194 RequestConfig.headers = {}
195 for key, value in event.request.headers.items():
196 RequestConfig.headers[key.lower()] = value
197 RequestConfig.urls[prompt].append(event.request.url)
198 elif event.request.url.startswith(cls.drive_url):
199 RequestConfig.headers = {}
200 for key, value in event.request.headers.items():
201 RequestConfig.headers[key.lower()] = value
202 RequestConfig.urls[prompt].append(event.request.url)
203 await page.send(nodriver.cdp.network.enable())
204 page.add_handler(nodriver.cdp.network.RequestWillBeSent, on_request)
207 if idx == 59:
208 debug.error(e)
209 raise RuntimeError("Failed to click 'Queued' button")
205 210 for idx in range(600):
206 211 yield Reasoning(label="Waiting for Video...", status=f"{idx+1}/600")
207 212 await asyncio.sleep(1)
Modified g4f/api/__init__.py +1 -1
@@ -122,7 +122,7 @@ def create_app():
122 122 if AppConfig.gui:
123 123 if not has_a2wsgi:
124 124 raise MissingRequirementsError("a2wsgi is required for GUI. Install it with: pip install a2wsgi")
125 gui_app = WSGIMiddleware(get_gui_app(AppConfig.demo))
125 gui_app = WSGIMiddleware(get_gui_app(AppConfig.demo, AppConfig.timeout))
126 126 app.mount("/", gui_app)
127 127
128 128 if AppConfig.ignored_providers:
Modified g4f/gui/__init__.py +2 -2
@@ -8,12 +8,12 @@ try:
8 8 except ImportError as e:
9 9 import_error = e
10 10
11 def get_gui_app(demo: bool = False, api: bool = False):
11 def get_gui_app(demo: bool = False, timeout: int = None):
12 12 if import_error is not None:
13 13 raise MissingRequirementsError(f'Install "gui" requirements | pip install -U g4f[gui]\n{import_error}')
14 14 app = create_app()
15 15 app.demo = demo
16 app.api = api
16 app.timeout = timeout
17 17
18 18 site = Website(app)
19 19 for route in site.routes:
Modified g4f/gui/server/backend_api.py +4 -3
@@ -126,7 +126,8 @@ class Backend_Api(Api):
126 126 media.append((url, None))
127 127 if media:
128 128 json_data['media'] = media
129
129 if app.timeout:
130 json_data['timeout'] = app.timeout
130 131 if app.demo and not json_data.get("provider"):
131 132 model = json_data.get("model")
132 133 if model != "default" and model in models.demo_models:
@@ -138,12 +139,12 @@ class Backend_Api(Api):
138 139 debug.log("User:", request.headers.get("x_user", f"{user}:{ip}"))
139 140 kwargs = self._prepare_conversation_kwargs(json_data)
140 141 return self.app.response_class(
141 self._create_response_stream(
142 safe_iter_generator(self._create_response_stream(
142 143 kwargs,
143 144 json_data.get("provider"),
144 145 json_data.get("download_media", True),
145 146 tempfiles
146 ),
147 )),
147 148 mimetype='text/event-stream'
148 149 )
149 150