返回提交历史
Modified
g4f/Provider/PerplexityAi.py
+8
-8
Modified
g4f/Provider/needs_auth/Bard.py
+77
-71
Modified
g4f/models.py
+1
-2
XFEstudio/gpt4free
Fix Bard Provider
510f534c
代码差异
3 个文件
+86
-81
@@ -14,7 +14,7 @@ from .helper import format_prompt, get_browser
14
14
class PerplexityAi(BaseProvider):
15
15
url = "https://www.perplexity.ai"
16
16
working = True
17
supports_gpt_4 = True
17
supports_gpt_35_turbo = True
18
18
supports_stream = True
19
19
20
20
@classmethod
@@ -30,10 +30,6 @@ class PerplexityAi(BaseProvider):
30
30
display: bool = True,
31
31
**kwargs
32
32
) -> CreateResult:
33
from selenium.webdriver.common.by import By
34
from selenium.webdriver.support.ui import WebDriverWait
35
from selenium.webdriver.support import expected_conditions as EC
36
37
33
if browser:
38
34
driver = browser
39
35
else:
@@ -42,11 +38,18 @@ class PerplexityAi(BaseProvider):
42
38
else:
43
39
driver = get_browser("", False, proxy)
44
40
41
from selenium.webdriver.common.by import By
42
from selenium.webdriver.support.ui import WebDriverWait
43
from selenium.webdriver.support import expected_conditions as EC
44
45
45
prompt = format_prompt(messages)
46
46
47
47
driver.get(f"{cls.url}/")
48
48
wait = WebDriverWait(driver, timeout)
49
49
50
# Page loaded?
51
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "textarea[placeholder='Ask anything...']")))
52
50
53
script = """
51
54
window._message = window._last_message = "";
52
55
window._message_finished = false;
@@ -75,9 +78,6 @@ WebSocket.prototype.send = function(...args) {
75
78
"""
76
79
driver.execute_script(script)
77
80
78
# Page loaded?
79
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "textarea[placeholder='Ask anything...']")))
80
81
81
if copilot:
82
82
try:
83
83
driver.find_element(By.CSS_SELECTOR, "img[alt='User avatar']")
@@ -1,90 +1,96 @@
1
1
from __future__ import annotations
2
2
3
import json
4
import random
5
import re
3
import time
4
try:
5
from selenium.webdriver.remote.webdriver import WebDriver
6
except ImportError:
7
class WebDriver():
8
pass
6
9
7
from aiohttp import ClientSession
10
from ...typing import CreateResult, Messages
11
from ..base_provider import BaseProvider
12
from ..helper import format_prompt, get_browser
8
13
9
from ...typing import Messages
10
from ..base_provider import AsyncProvider
11
from ..helper import format_prompt, get_cookies
12
13
14
class Bard(AsyncProvider):
14
class Bard(BaseProvider):
15
15
url = "https://bard.google.com"
16
needs_auth = True
17
16
working = True
18
_snlm0e = None
17
needs_auth = True
19
18
20
19
@classmethod
21
async def create_async(
20
def create_completion(
22
21
cls,
23
22
model: str,
24
23
messages: Messages,
24
stream: bool,
25
25
proxy: str = None,
26
cookies: dict = None,
26
browser: WebDriver = None,
27
display: bool = True,
27
28
**kwargs
28
) -> str:
29
) -> CreateResult:
29
30
prompt = format_prompt(messages)
30
if not cookies:
31
cookies = get_cookies(".google.com")
31
if browser:
32
driver = browser
33
else:
34
if display:
35
driver, display = get_browser(None, True, proxy)
36
else:
37
driver = get_browser(None, False, proxy)
32
38
33
headers = {
34
'authority': 'bard.google.com',
35
'origin': cls.url,
36
'referer': f'{cls.url}/',
37
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
38
'x-same-domain': '1',
39
}
40
async with ClientSession(
41
cookies=cookies,
42
headers=headers
43
) as session:
44
if not cls._snlm0e:
45
async with session.get(cls.url, proxy=proxy) as response:
46
text = await response.text()
39
from selenium.webdriver.common.by import By
40
from selenium.webdriver.support.ui import WebDriverWait
41
from selenium.webdriver.support import expected_conditions as EC
47
42
48
if match := re.search(r'SNlM0e\":\"(.*?)\"', text):
49
cls._snlm0e = match.group(1)
43
try:
44
driver.get(f"{cls.url}/chat")
45
wait = WebDriverWait(driver, 10)
46
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.ql-editor.textarea")))
47
except:
48
# Reopen browser for login
49
if not browser:
50
driver.quit()
51
# New browser should be visible
52
if display:
53
display.stop()
54
driver = get_browser(None, False, proxy)
55
driver.get(f"{cls.url}/chat")
56
wait = WebDriverWait(driver, 240)
57
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.ql-editor.textarea")))
58
else:
59
raise RuntimeError("Prompt textarea not found. You may not be logged in.")
50
60
51
else:
52
raise RuntimeError("No snlm0e value.")
53
params = {
54
'bl': 'boq_assistant-bard-web-server_20230326.21_p0',
55
'_reqid': random.randint(1111, 9999),
56
'rt': 'c'
57
}
58
59
data = {
60
'at': cls._snlm0e,
61
'f.req': json.dumps([None, json.dumps([[prompt]])])
62
}
61
try:
62
# Add hook in XMLHttpRequest
63
script = """
64
const _http_request_open = XMLHttpRequest.prototype.open;
65
window._message = "";
66
XMLHttpRequest.prototype.open = function(method, url) {
67
if (url.includes("/assistant.lamda.BardFrontendService/StreamGenerate")) {
68
this.addEventListener("load", (event) => {
69
window._message = JSON.parse(JSON.parse(this.responseText.split("\\n")[3])[0][2])[4][0][1][0];
70
});
71
}
72
return _http_request_open.call(this, method, url);
73
}
74
"""
75
driver.execute_script(script)
63
76
64
intents = '.'.join([
65
'assistant',
66
'lamda',
67
'BardFrontendService'
68
])
69
async with session.post(
70
f'{cls.url}/_/BardChatUi/data/{intents}/StreamGenerate',
71
data=data,
72
params=params,
73
proxy=proxy
74
) as response:
75
response = await response.text()
76
response = json.loads(response.splitlines()[3])[0][2]
77
response = json.loads(response)[4][0][1][0]
78
return response
77
# Send prompt
78
driver.find_element(By.CSS_SELECTOR, "div.ql-editor.ql-blank.textarea").send_keys(prompt)
79
driver.find_element(By.CSS_SELECTOR, "button.send-button").click()
79
80
80
@classmethod
81
@property
82
def params(cls):
83
params = [
84
("model", "str"),
85
("messages", "list[dict[str, str]]"),
86
("stream", "bool"),
87
("proxy", "str"),
88
]
89
param = ", ".join([": ".join(p) for p in params])
90
return f"g4f.provider.{cls.__name__} supports: ({param})"
81
# Read response
82
script = "return window._message;"
83
while True:
84
chunk = driver.execute_script(script)
85
if chunk:
86
yield chunk
87
return
88
else:
89
time.sleep(0.1)
90
finally:
91
driver.close()
92
if not browser:
93
time.sleep(0.1)
94
driver.quit()
95
if display:
96
display.stop()
@@ -5,7 +5,6 @@ from .Provider import BaseProvider, RetryProvider
5
5
from .Provider import (
6
6
Chatgpt4Online,
7
7
ChatAnywhere,
8
PerplexityAi,
9
8
GptForLove,
10
9
ChatgptAi,
11
10
DeepInfra,
@@ -77,7 +76,7 @@ gpt_4 = Model(
77
76
name = 'gpt-4',
78
77
base_provider = 'openai',
79
78
best_provider = RetryProvider([
80
Bing, Phind, PerplexityAi
79
Bing, Phind
81
80
])
82
81
)
83
82