返回提交历史
Modified
g4f/Provider/needs_auth/Video.py
+24
-19
Modified
g4f/api/__init__.py
+1
-1
Modified
g4f/gui/__init__.py
+2
-2
Modified
g4f/gui/server/backend_api.py
+4
-3
XFEstudio/gpt4free
Support timeout in backend_api
c27f0c99
代码差异
4 个文件
+31
-25
@@ -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)
@@ -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:
@@ -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:
@@ -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