Spaces:
Paused
Paused
File size: 3,844 Bytes
44c5e78 bb37148 44c5e78 bca6285 44c5e78 b716bb2 44c5e78 21f117b 44c5e78 e85c831 44c5e78 b4870cf 8d91150 b4870cf 44c5e78 3a1b095 21f117b 3a1b095 bb37148 3a1b095 bb37148 3a1b095 bb37148 5095a2b e85c831 5095a2b bb37148 3a1b095 5095a2b 44c5e78 3a1b095 6ad10eb 8d91150 44c5e78 a2e9c80 44c5e78 6ad10eb e85c831 44c5e78 1bbf682 a2e9c80 44c5e78 1bbf682 c05a7fe 8d91150 44c5e78 e85c831 4b7ddb7 a2e9c80 44c5e78 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
import aiohttp
import asyncio
import httpx
import json
import urllib
from networks import (
ChathubRequestPayloadConstructor,
ConversationRequestHeadersConstructor,
)
from networks import MessageParser
from utils.logger import logger
http_proxy = "http://localhost:11111" # Replace with yours
class ConversationConnector:
def __init__(
self,
conversation_style: str = "precise",
sec_access_token: str = "",
client_id: str = "",
conversation_id: str = "",
invocation_id: int = 0,
cookies={},
):
self.conversation_style = conversation_style
self.sec_access_token = sec_access_token
self.client_id = client_id
self.conversation_id = conversation_id
self.invocation_id = invocation_id
self.cookies = cookies
async def wss_send(self, message):
serialized_websocket_message = json.dumps(message, ensure_ascii=False) + "\x1e"
await self.wss.send_str(serialized_websocket_message)
async def init_handshake(self):
await self.wss_send({"protocol": "json", "version": 1})
await self.wss.receive_str()
await self.wss_send({"type": 6})
async def init_wss_connection(self):
self.quotelized_sec_access_token = urllib.parse.quote(self.sec_access_token)
self.ws_url = (
f"wss://sydney.bing.com/sydney/ChatHub"
f"?sec_access_token={self.quotelized_sec_access_token}"
)
self.aiohttp_session = aiohttp.ClientSession(cookies=self.cookies)
headers_constructor = ConversationRequestHeadersConstructor()
self.wss = await self.aiohttp_session.ws_connect(
self.ws_url,
headers=headers_constructor.request_headers,
proxy=http_proxy,
)
await self.init_handshake()
async def send_chathub_request(self, prompt):
payload_constructor = ChathubRequestPayloadConstructor(
prompt=prompt,
conversation_style=self.conversation_style,
client_id=self.client_id,
conversation_id=self.conversation_id,
invocation_id=self.invocation_id,
)
self.connect_request_payload = payload_constructor.request_payload
await self.wss_send(self.connect_request_payload)
async def stream_chat(self, prompt=""):
await self.init_wss_connection()
await self.send_chathub_request(prompt)
message_parser = MessageParser()
while not self.wss.closed:
response_lines_str = await self.wss.receive_str()
if isinstance(response_lines_str, str):
response_lines = response_lines_str.split("\x1e")
else:
continue
for line in response_lines:
if not line:
continue
data = json.loads(line)
# Stream: Meaningful Messages
if data.get("type") == 1:
message_parser.parse(data)
# Stream: List of all messages in the whole conversation
elif data.get("type") == 2:
if data.get("item"):
# item = data.get("item")
# logger.note("\n[Saving chat messages ...]")
pass
# Stream: End of Conversation
elif data.get("type") == 3:
logger.success("\n[Finished]")
self.invocation_id += 1
await self.wss.close()
await self.aiohttp_session.close()
break
# Stream: Heartbeat Signal
elif data.get("type") == 6:
continue
# Stream: Not Monitored
else:
continue
|