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

XFEstudio/gpt4free

Fix Bard Provider

510f534c
Heiner Lohaus <hlohaus@users.noreply.github.com>
提交于

代码差异

3 个文件 +86 -81
Modified g4f/Provider/PerplexityAi.py +8 -8
@@ -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']")
Modified g4f/Provider/needs_auth/Bard.py +77 -71
@@ -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()
Modified g4f/models.py +1 -2
@@ -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