~ | Merge pull request #808

Fix bard provider
pull/827/head
Tekky 1 year ago committed by GitHub
commit 649fd42655
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -3,99 +3,97 @@ import random
import re import re
import browser_cookie3 import browser_cookie3
import requests from aiohttp import ClientSession
import asyncio
from ..typing import Any, CreateResult from ..typing import Any, CreateResult
from .base_provider import BaseProvider from .base_provider import BaseProvider
class Bard(BaseProvider): class Bard(BaseProvider):
url = "https://bard.google.com" url = "https://bard.google.com"
needs_auth = True needs_auth = True
working = True working = True
@staticmethod @classmethod
def create_completion( def create_completion(
cls,
model: str, model: str,
messages: list[dict[str, str]], messages: list[dict[str, str]],
stream: bool, stream: bool,
proxy: str = None,
cookies: dict = {},
**kwargs: Any, **kwargs: Any,
) -> CreateResult: ) -> CreateResult:
psid = { yield asyncio.run(cls.create_async(str, messages, proxy, cookies))
cookie.name: cookie.value
for cookie in browser_cookie3.chrome(domain_name=".google.com") @classmethod
}["__Secure-1PSID"] async def create_async(
cls,
model: str,
messages: list[dict[str, str]],
proxy: str = None,
cookies: dict = {},
**kwargs: Any,
) -> str:
if not cookies:
for cookie in browser_cookie3.load(domain_name='.google.com'):
cookies[cookie.name] = cookie.value
formatted = "\n".join( formatted = "\n".join(
["%s: %s" % (message["role"], message["content"]) for message in messages] ["%s: %s" % (message["role"], message["content"]) for message in messages]
) )
prompt = f"{formatted}\nAssistant:" prompt = f"{formatted}\nAssistant:"
proxy = kwargs.get("proxy", False) if proxy and "://" not in proxy:
if proxy == False: proxy = f"http://{proxy}"
print(
"warning!, you did not give a proxy, a lot of countries are banned from Google Bard, so it may not work"
)
snlm0e = None
conversation_id = None
response_id = None
choice_id = None
client = requests.Session() headers = {
client.proxies = ( 'authority': 'bard.google.com',
{"http": f"http://{proxy}", "https": f"http://{proxy}"} if proxy else {} 'content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
) 'origin': 'https://bard.google.com',
'referer': 'https://bard.google.com/',
client.headers = { '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',
"authority": "bard.google.com", 'x-same-domain': '1',
"content-type": "application/x-www-form-urlencoded;charset=UTF-8",
"origin": "https://bard.google.com",
"referer": "https://bard.google.com/",
"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",
"x-same-domain": "1",
"cookie": f"__Secure-1PSID={psid}",
} }
if snlm0e is not None: async with ClientSession(
result = re.search( cookies=cookies,
r"SNlM0e\":\"(.*?)\"", client.get("https://bard.google.com/").text headers=headers
) ) as session:
if result is not None: async with session.get(cls.url, proxy=proxy) as response:
snlm0e = result.group(1) text = await response.text()
match = re.search(r'SNlM0e\":\"(.*?)\"', text)
if match:
snlm0e = match.group(1)
params = { params = {
"bl": "boq_assistant-bard-web-server_20230326.21_p0", 'bl': 'boq_assistant-bard-web-server_20230326.21_p0',
"_reqid": random.randint(1111, 9999), '_reqid': random.randint(1111, 9999),
"rt": "c", 'rt': 'c'
} }
data = { data = {
"at": snlm0e, 'at': snlm0e,
"f.req": json.dumps( 'f.req': json.dumps([None, json.dumps([[prompt]])])
[
None,
json.dumps(
[[prompt], None, [conversation_id, response_id, choice_id]]
),
]
),
} }
intents = ".".join(["assistant", "lamda", "BardFrontendService"]) intents = '.'.join([
'assistant',
'lamda',
'BardFrontendService'
])
response = client.post( async with session.post(
f"https://bard.google.com/_/BardChatUi/data/{intents}/StreamGenerate", f'{cls.url}/_/BardChatUi/data/{intents}/StreamGenerate',
data=data, data=data,
params=params, params=params,
) proxy=proxy
response.raise_for_status() ) as response:
response = await response.text()
chat_data = json.loads(response.content.splitlines()[3])[0][2] response = json.loads(response.splitlines()[3])[0][2]
if chat_data: response = json.loads(response)[4][0][1][0]
json_chat_data = json.loads(chat_data) return response
yield json_chat_data[0][0]
@classmethod @classmethod
@property @property

Loading…
Cancel
Save