返回提交历史
Modified
g4f/Provider/Copilot.py
+2
-2
Modified
g4f/Provider/needs_auth/Gemini.py
+1
-1
Modified
g4f/Provider/needs_auth/Grok.py
+1
-1
Modified
g4f/Provider/needs_auth/MicrosoftDesigner.py
+1
-1
Modified
g4f/Provider/needs_auth/Video.py
+7
-7
Modified
g4f/Provider/needs_auth/You.py
+1
-1
Modified
g4f/api/__init__.py
+1
-1
Modified
g4f/cookies.py
+1
-1
Modified
g4f/requests/__init__.py
+9
-9
XFEstudio/gpt4free
fix: update stop_browser calls to be asynchronous across multiple provider files
0943d16e
代码差异
9 个文件
+24
-24
@@ -385,10 +385,10 @@ async def get_access_token_and_cookies(url: str, proxy: str = None, needs_auth:
385
385
break
386
386
elif needs_auth and next(filter(lambda x: "auth0" in x, cookies), None):
387
387
break
388
stop_browser()
388
await stop_browser()
389
389
return access_token, useridentitytype, cookies
390
390
finally:
391
stop_browser()
391
await stop_browser()
392
392
393
393
def readHAR(url: str):
394
394
api_key = None
@@ -120,7 +120,7 @@ class Gemini(AsyncGeneratorProvider, ProviderModelMixin):
120
120
await page.close()
121
121
cls._cookies = cookies
122
122
finally:
123
stop_browser()
123
await stop_browser()
124
124
125
125
@classmethod
126
126
async def start_auto_refresh(cls, proxy: str = None) -> None:
@@ -118,7 +118,7 @@ class Grok(AsyncAuthedProvider, ProviderModelMixin):
118
118
auth_result.cookies[c.name] = c.value
119
119
await page.close()
120
120
finally:
121
stop_browser()
121
await stop_browser()
122
122
yield auth_result
123
123
124
124
@classmethod
@@ -168,4 +168,4 @@ async def get_access_token_and_user_agent(url: str, proxy: str = None):
168
168
await page.close()
169
169
return access_token, user_agent
170
170
finally:
171
stop_browser()
171
await stop_browser()
@@ -120,7 +120,7 @@ class Video(AsyncGeneratorProvider, ProviderModelMixin):
120
120
yield ContinueResponse("Timeout waiting for Video URL")
121
121
page = await browser.get(cls.urls[model].format(quote(prompt)))
122
122
except Exception as e:
123
stop_browser()
123
await stop_browser()
124
124
debug.error(f"Error opening page:", e)
125
125
if prompt not in RequestConfig.urls:
126
126
RequestConfig.urls[prompt] = []
@@ -141,7 +141,7 @@ class Video(AsyncGeneratorProvider, ProviderModelMixin):
141
141
if button:
142
142
break
143
143
if idx == 299:
144
stop_browser()
144
await stop_browser()
145
145
raise RuntimeError("Failed to wait for user menu.")
146
146
if model == "search" and page is not None:
147
147
await page.send(nodriver.cdp.network.enable())
@@ -151,7 +151,7 @@ class Video(AsyncGeneratorProvider, ProviderModelMixin):
151
151
await asyncio.sleep(1)
152
152
response = await RequestConfig.get_response(prompt, True)
153
153
if response:
154
stop_browser()
154
await stop_browser()
155
155
yield Reasoning(label="Found", status="")
156
156
yield response
157
157
return
@@ -229,7 +229,7 @@ class Video(AsyncGeneratorProvider, ProviderModelMixin):
229
229
if idx == 59:
230
230
debug.error(e)
231
231
if idx == 59:
232
stop_browser()
232
await stop_browser()
233
233
raise RuntimeError("Failed to click 'New Video' button")
234
234
await asyncio.sleep(3)
235
235
if model != "search" and page is not None:
@@ -242,12 +242,12 @@ class Video(AsyncGeneratorProvider, ProviderModelMixin):
242
242
await asyncio.sleep(2)
243
243
response = await RequestConfig.get_response(prompt, model=="search")
244
244
if response:
245
stop_browser()
245
await stop_browser()
246
246
yield Reasoning(label="Finished", status="")
247
247
yield response
248
248
return
249
249
if idx == 299:
250
stop_browser()
250
await stop_browser()
251
251
raise RuntimeError("Failed to get Video URL")
252
252
finally:
253
stop_browser()
253
await stop_browser()
@@ -94,7 +94,7 @@ class You(AsyncGeneratorProvider, ProviderModelMixin):
94
94
cookies[c.name] = c.value
95
95
await page.close()
96
96
finally:
97
stop_browser()
97
await stop_browser()
98
98
async with StreamSession(
99
99
proxy=proxy,
100
100
impersonate="chrome",
@@ -103,7 +103,7 @@ async def lifespan(app: FastAPI):
103
103
if has_nodriver:
104
104
for browser in util.get_registered_instances():
105
105
if browser.connection:
106
browser.stop()
106
await browser.stop()
107
107
lock_file = os.path.join(get_cookies_dir(), ".nodriver_is_open")
108
108
if os.path.exists(lock_file):
109
109
try:
@@ -53,7 +53,7 @@ class BrowserConfig:
53
53
impersonate: str = "chrome"
54
54
55
55
@staticmethod
56
def stop_browser():
56
async def stop_browser():
57
57
return None
58
58
59
59
browser_executable_path: str = None
@@ -82,7 +82,7 @@ async def get_args_from_webview(url: str) -> dict:
82
82
83
83
84
84
def get_cookie_params_from_dict(cookies: Cookies, url: str = None, domain: str = None) -> list[CookieParam]:
85
[CookieParam.from_json({
85
return [CookieParam.from_json({
86
86
"name": key,
87
87
"value": value,
88
88
"url": url,
@@ -104,7 +104,7 @@ async def get_args_from_nodriver(
104
104
if browser is None:
105
105
browser, stop_browser = await get_nodriver(proxy=proxy, timeout=timeout, user_data_dir=user_data_dir, browser_args=browser_args)
106
106
else:
107
def stop_browser():
107
async def stop_browser():
108
108
pass
109
109
try:
110
110
debug.log(f"Open nodriver with url: {url}")
@@ -115,7 +115,7 @@ async def get_args_from_nodriver(
115
115
await browser.cookies.set_all(get_cookie_params_from_dict(cookies, url=url, domain=domain))
116
116
page = await browser.get(url)
117
117
user_agent = await page.evaluate("window.navigator.userAgent", return_by_value=True)
118
while not await page.evaluate("document.querySelector('body:not(.no-js)')"):
118
while not await page.evaluate("!!document.querySelector('body:not(.no-js)')"):
119
119
await asyncio.sleep(1)
120
120
if wait_for is not None:
121
121
await page.wait_for(wait_for, timeout=timeout)
@@ -123,7 +123,7 @@ async def get_args_from_nodriver(
123
123
await callback(page)
124
124
for c in await page.send(nodriver.cdp.network.get_cookies([url])):
125
125
cookies[c.name] = c.value
126
stop_browser()
126
await stop_browser()
127
127
return {
128
128
"impersonate": "chrome",
129
129
"cookies": cookies,
@@ -135,7 +135,7 @@ async def get_args_from_nodriver(
135
135
"proxy": proxy,
136
136
}
137
137
except:
138
stop_browser()
138
await stop_browser()
139
139
raise
140
140
141
141
@@ -201,7 +201,7 @@ async def get_nodriver(
201
201
raise TimeoutError("Nodriver is already in use, please try again later.")
202
202
else:
203
203
debug.log(f"Nodriver: Browser was opened {time_open} secs ago, closing it.")
204
BrowserConfig.stop_browser()
204
await BrowserConfig.stop_browser()
205
205
lock_file.unlink(missing_ok=True)
206
206
lock_file.write_text(str(time.time()))
207
207
debug.log(f"Open nodriver with user_dir: {user_data_dir}")
@@ -227,10 +227,10 @@ async def get_nodriver(
227
227
else:
228
228
raise
229
229
230
def on_stop():
230
async def on_stop():
231
231
try:
232
232
if BrowserConfig.port is None and browser.connection:
233
browser.stop()
233
await browser.stop()
234
234
except:
235
235
pass
236
236
finally:
@@ -245,7 +245,7 @@ async def get_nodriver(
245
245
async def get_nodriver_session(**kwargs):
246
246
browser, stop_browser = await get_nodriver(**kwargs)
247
247
yield browser
248
stop_browser()
248
await stop_browser()
249
249
250
250
251
251
async def sse_stream(iter_lines: AsyncIterator[bytes]) -> AsyncIterator[dict]: