~ | Merge pull request #808

Fix bard provider
pull/827/head
Tekky 11 months 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()
client.proxies = (
{"http": f"http://{proxy}", "https": f"http://{proxy}"} if proxy else {}
)
client.headers = { headers = {
"authority": "bard.google.com", 'authority': 'bard.google.com',
"content-type": "application/x-www-form-urlencoded;charset=UTF-8", 'content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
"origin": "https://bard.google.com", 'origin': 'https://bard.google.com',
"referer": "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", '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", '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()
params = { match = re.search(r'SNlM0e\":\"(.*?)\"', text)
"bl": "boq_assistant-bard-web-server_20230326.21_p0", if match:
"_reqid": random.randint(1111, 9999), snlm0e = match.group(1)
"rt": "c",
} params = {
'bl': 'boq_assistant-bard-web-server_20230326.21_p0',
data = { '_reqid': random.randint(1111, 9999),
"at": snlm0e, 'rt': 'c'
"f.req": json.dumps( }
[
None, data = {
json.dumps( 'at': snlm0e,
[[prompt], None, [conversation_id, response_id, choice_id]] 'f.req': json.dumps([None, json.dumps([[prompt]])])
), }
]
), intents = '.'.join([
} 'assistant',
'lamda',
intents = ".".join(["assistant", "lamda", "BardFrontendService"]) 'BardFrontendService'
])
response = client.post(
f"https://bard.google.com/_/BardChatUi/data/{intents}/StreamGenerate", async with session.post(
data=data, f'{cls.url}/_/BardChatUi/data/{intents}/StreamGenerate',
params=params, data=data,
) params=params,
response.raise_for_status() proxy=proxy
) as response:
chat_data = json.loads(response.content.splitlines()[3])[0][2] response = await response.text()
if chat_data: response = json.loads(response.splitlines()[3])[0][2]
json_chat_data = json.loads(chat_data) response = json.loads(response)[4][0][1][0]
return response
yield json_chat_data[0][0]
@classmethod @classmethod
@property @property

Loading…
Cancel
Save