mirror of
https://github.com/xtekky/gpt4free.git
synced 2025-10-06 16:57:33 +08:00
Support timeout in backend_api
This commit is contained in:
@@ -50,6 +50,7 @@ class RequestConfig:
|
||||
|
||||
class Video(AsyncGeneratorProvider, ProviderModelMixin):
|
||||
urls = {
|
||||
"search": "https://sora.chatgpt.com/explore?query={0}",
|
||||
"sora": "https://sora.chatgpt.com/explore",
|
||||
#"veo": "https://aistudio.google.com/generate-video"
|
||||
}
|
||||
@@ -57,7 +58,7 @@ class Video(AsyncGeneratorProvider, ProviderModelMixin):
|
||||
drive_url = "https://www.googleapis.com/drive/v3/"
|
||||
|
||||
active_by_default = True
|
||||
default_model = "sora"
|
||||
default_model = "search"
|
||||
models = list(urls.keys())
|
||||
video_models = models
|
||||
|
||||
@@ -82,7 +83,7 @@ class Video(AsyncGeneratorProvider, ProviderModelMixin):
|
||||
if model not in cls.video_models:
|
||||
raise ValueError(f"Model '{model}' is not supported by {cls.__name__}. Supported models: {cls.models}")
|
||||
yield ProviderInfo(**cls.get_dict(), model="sora")
|
||||
prompt = format_media_prompt(messages, prompt)
|
||||
prompt = format_media_prompt(messages, prompt)[:100]
|
||||
if not prompt:
|
||||
raise ValueError("Prompt cannot be empty.")
|
||||
response = await RequestConfig.get_response(prompt)
|
||||
@@ -111,9 +112,26 @@ class Video(AsyncGeneratorProvider, ProviderModelMixin):
|
||||
raise MissingRequirementsError("Video provider requires a browser to be installed.")
|
||||
try:
|
||||
yield ContinueResponse("Timeout waiting for Video URL")
|
||||
cls.page = await browser.get(cls.urls[model])
|
||||
cls.page = await browser.get(cls.urls[model].format(quote(prompt)))
|
||||
except Exception as e:
|
||||
debug.error(f"Error opening page:", e)
|
||||
if prompt not in RequestConfig.urls:
|
||||
RequestConfig.urls[prompt] = []
|
||||
def on_request(event: nodriver.cdp.network.RequestWillBeSent, page=None):
|
||||
if ".mp4" in event.request.url:
|
||||
RequestConfig.headers = {}
|
||||
for key, value in event.request.headers.items():
|
||||
RequestConfig.headers[key.lower()] = value
|
||||
RequestConfig.urls[prompt].append(event.request.url)
|
||||
elif event.request.url.startswith(cls.drive_url):
|
||||
RequestConfig.headers = {}
|
||||
for key, value in event.request.headers.items():
|
||||
RequestConfig.headers[key.lower()] = value
|
||||
RequestConfig.urls[prompt].append(event.request.url)
|
||||
await page.send(nodriver.cdp.network.enable())
|
||||
page.add_handler(nodriver.cdp.network.RequestWillBeSent, on_request)
|
||||
if model == "search":
|
||||
asyncio.sleep(5)
|
||||
response = await RequestConfig.get_response(prompt)
|
||||
if response:
|
||||
yield Reasoning(label="Found", status="")
|
||||
@@ -186,22 +204,9 @@ class Video(AsyncGeneratorProvider, ProviderModelMixin):
|
||||
yield Reasoning(label=f"Clicked 'Queued' button")
|
||||
break
|
||||
except ProtocolException as e:
|
||||
pass
|
||||
if prompt not in RequestConfig.urls:
|
||||
RequestConfig.urls[prompt] = []
|
||||
def on_request(event: nodriver.cdp.network.RequestWillBeSent, page=None):
|
||||
if ".mp4" in event.request.url:
|
||||
RequestConfig.headers = {}
|
||||
for key, value in event.request.headers.items():
|
||||
RequestConfig.headers[key.lower()] = value
|
||||
RequestConfig.urls[prompt].append(event.request.url)
|
||||
elif event.request.url.startswith(cls.drive_url):
|
||||
RequestConfig.headers = {}
|
||||
for key, value in event.request.headers.items():
|
||||
RequestConfig.headers[key.lower()] = value
|
||||
RequestConfig.urls[prompt].append(event.request.url)
|
||||
await page.send(nodriver.cdp.network.enable())
|
||||
page.add_handler(nodriver.cdp.network.RequestWillBeSent, on_request)
|
||||
if idx == 59:
|
||||
debug.error(e)
|
||||
raise RuntimeError("Failed to click 'Queued' button")
|
||||
for idx in range(600):
|
||||
yield Reasoning(label="Waiting for Video...", status=f"{idx+1}/600")
|
||||
await asyncio.sleep(1)
|
||||
|
@@ -122,7 +122,7 @@ def create_app():
|
||||
if AppConfig.gui:
|
||||
if not has_a2wsgi:
|
||||
raise MissingRequirementsError("a2wsgi is required for GUI. Install it with: pip install a2wsgi")
|
||||
gui_app = WSGIMiddleware(get_gui_app(AppConfig.demo))
|
||||
gui_app = WSGIMiddleware(get_gui_app(AppConfig.demo, AppConfig.timeout))
|
||||
app.mount("/", gui_app)
|
||||
|
||||
if AppConfig.ignored_providers:
|
||||
|
@@ -8,12 +8,12 @@ try:
|
||||
except ImportError as e:
|
||||
import_error = e
|
||||
|
||||
def get_gui_app(demo: bool = False, api: bool = False):
|
||||
def get_gui_app(demo: bool = False, timeout: int = None):
|
||||
if import_error is not None:
|
||||
raise MissingRequirementsError(f'Install "gui" requirements | pip install -U g4f[gui]\n{import_error}')
|
||||
app = create_app()
|
||||
app.demo = demo
|
||||
app.api = api
|
||||
app.timeout = timeout
|
||||
|
||||
site = Website(app)
|
||||
for route in site.routes:
|
||||
|
@@ -126,7 +126,8 @@ class Backend_Api(Api):
|
||||
media.append((url, None))
|
||||
if media:
|
||||
json_data['media'] = media
|
||||
|
||||
if app.timeout:
|
||||
json_data['timeout'] = app.timeout
|
||||
if app.demo and not json_data.get("provider"):
|
||||
model = json_data.get("model")
|
||||
if model != "default" and model in models.demo_models:
|
||||
@@ -138,12 +139,12 @@ class Backend_Api(Api):
|
||||
debug.log("User:", request.headers.get("x_user", f"{user}:{ip}"))
|
||||
kwargs = self._prepare_conversation_kwargs(json_data)
|
||||
return self.app.response_class(
|
||||
self._create_response_stream(
|
||||
safe_iter_generator(self._create_response_stream(
|
||||
kwargs,
|
||||
json_data.get("provider"),
|
||||
json_data.get("download_media", True),
|
||||
tempfiles
|
||||
),
|
||||
)),
|
||||
mimetype='text/event-stream'
|
||||
)
|
||||
|
||||
|
Reference in New Issue
Block a user