Skip to content
This repository has been archived by the owner on Aug 3, 2023. It is now read-only.

Commit

Permalink
Use local IP not random IP (Fix timeout error & Eventloop error). (#634)
Browse files Browse the repository at this point in the history
* Use local IP not random IP

Use local IP not random IP

* Add pull_request_target

Add pull_request_target

* Add edited state to test

Add edited state to test not only test on open pull request

* Move aiohttp session to stream

Move aiohttp session to stream
* Avoid Runtime error

* Refactor

Refactor

* Close aio session on stream

Close aio session on stream

* Not need to catch take IP exception

Not need to catch take IP exception
  • Loading branch information
JE-Chen authored Aug 2, 2023
1 parent 47951af commit 1da9d27
Show file tree
Hide file tree
Showing 4 changed files with 163 additions and 153 deletions.
2 changes: 2 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ name: tests
on:
push:
pull_request:
pull_request_target:
types: [ ready_for_review, review_requested, edited]


jobs:
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -131,3 +131,6 @@ cookies.json
output/*
README.md
*.json

# Pycharm
.idea/*
276 changes: 139 additions & 137 deletions src/EdgeGPT/chathub.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import ssl
import sys
import aiohttp

from time import time
from typing import Generator
from typing import List
Expand All @@ -29,11 +30,12 @@

class ChatHub:
def __init__(
self,
conversation: Conversation,
proxy: str = None,
cookies: Union[List[dict], None] = None,
self,
conversation: Conversation,
proxy: str = None,
cookies: Union[List[dict], None] = None,
) -> None:
self.aio_session = None
self.request: ChatHubRequest
self.loop: bool
self.task: asyncio.Task
Expand All @@ -45,35 +47,30 @@ def __init__(
self.cookies = cookies
self.proxy: str = proxy
proxy = (
proxy
or os.environ.get("all_proxy")
or os.environ.get("ALL_PROXY")
or os.environ.get("https_proxy")
or os.environ.get("HTTPS_PROXY")
or None
proxy
or os.environ.get("all_proxy")
or os.environ.get("ALL_PROXY")
or os.environ.get("https_proxy")
or os.environ.get("HTTPS_PROXY")
or None
)
if proxy is not None and proxy.startswith("socks5h://"):
proxy = "socks5://" + proxy[len("socks5h://") :]
proxy = "socks5://" + proxy[len("socks5h://"):]
self.session = httpx.AsyncClient(
proxies=proxy,
timeout=900,
headers=HEADERS_INIT_CONVER,
)
cookies = {}
if self.cookies is not None:
for cookie in self.cookies:
cookies[cookie["name"]] = cookie["value"]
self.aio_session = aiohttp.ClientSession(cookies=cookies)

async def get_conversation(
self,
conversation_id: str = None,
conversation_signature: str = None,
client_id: str = None,
self,
conversation_id: str = None,
conversation_signature: str = None,
client_id: str = None,
) -> dict:
conversation_id = conversation_id or self.request.conversation_id
conversation_signature = (
conversation_signature or self.request.conversation_signature
conversation_signature or self.request.conversation_signature
)
client_id = client_id or self.request.client_id
url = f"https://sydney.bing.com/sydney/GetConversation?conversationId={conversation_id}&source=cib&participantId={client_id}&conversationSignature={conversation_signature}&traceId={get_ran_hex()}"
Expand All @@ -92,164 +89,170 @@ async def get_activity(self) -> dict:
return response.json()

async def ask_stream(
self,
prompt: str,
wss_link: str = None,
conversation_style: CONVERSATION_STYLE_TYPE = None,
raw: bool = False,
webpage_context: Union[str, None] = None,
search_result: bool = False,
locale: str = guess_locale(),
self,
prompt: str,
wss_link: str = None,
conversation_style: CONVERSATION_STYLE_TYPE = None,
raw: bool = False,
webpage_context: Union[str, None] = None,
search_result: bool = False,
locale: str = guess_locale(),
) -> Generator[bool, Union[dict, str], None]:
""" """

cookies = {}
if self.cookies is not None:
for cookie in self.cookies:
cookies[cookie["name"]] = cookie["value"]
self.aio_session = aiohttp.ClientSession(cookies=cookies)
# Check if websocket is closed
async with self.aio_session.ws_connect(
wss = await self.aio_session.ws_connect(
wss_link or "wss://sydney.bing.com/sydney/ChatHub",
ssl=ssl_context,
headers=HEADERS,
proxy=self.proxy,
) as wss:
await self._initial_handshake(wss)
# Construct a ChatHub request
self.request.update(
prompt=prompt,
conversation_style=conversation_style,
webpage_context=webpage_context,
search_result=search_result,
locale=locale,
)
# Send request
await wss.send_str(append_identifier(self.request.struct))
draw = False
resp_txt = ""
result_text = ""
resp_txt_no_link = ""
retry_count = 5
while not wss.closed:
msg = await wss.receive_str()
if not msg:
retry_count -= 1
if retry_count == 0:
raise Exception("No response from server")
continue
if isinstance(msg, str):
objects = msg.split(DELIMITER)
else:
)
await self._initial_handshake(wss)
# Construct a ChatHub request
self.request.update(
prompt=prompt,
conversation_style=conversation_style,
webpage_context=webpage_context,
search_result=search_result,
locale=locale,
)
# Send request
await wss.send_str(append_identifier(self.request.struct))
draw = False
resp_txt = ""
result_text = ""
resp_txt_no_link = ""
retry_count = 5
while not wss.closed:
msg = await wss.receive_str()
if not msg:
retry_count -= 1
if retry_count == 0:
raise Exception("No response from server")
continue
if isinstance(msg, str):
objects = msg.split(DELIMITER)
else:
continue
for obj in objects:
if int(time()) % 6 == 0:
await wss.send_str(append_identifier({"type": 6}))
if obj is None or not obj:
continue
for obj in objects:
if int(time()) % 6 == 0:
await wss.send_str(append_identifier({"type": 6}))
if obj is None or not obj:
continue
response = json.loads(obj)
# print(response)
if response.get("type") == 1 and response["arguments"][0].get(
response = json.loads(obj)
# print(response)
if response.get("type") == 1 and response["arguments"][0].get(
"messages",
):
if not draw:
if (
):
if not draw:
if (
response["arguments"][0]["messages"][0].get(
"messageType",
)
== "GenerateContentQuery"
):
async with ImageGenAsync(
):
async with ImageGenAsync(
all_cookies=self.cookies,
) as image_generator:
images = await image_generator.get_images(
response["arguments"][0]["messages"][0]["text"],
)
for i, image in enumerate(images):
resp_txt = f"{resp_txt}\n![image{i}]({image})"
draw = True
if (
) as image_generator:
images = await image_generator.get_images(
response["arguments"][0]["messages"][0]["text"],
)
for i, image in enumerate(images):
resp_txt = f"{resp_txt}\n![image{i}]({image})"
draw = True
if (
(
response["arguments"][0]["messages"][0][
"contentOrigin"
]
!= "Apology"
response["arguments"][0]["messages"][0][
"contentOrigin"
]
!= "Apology"
)
and not draw
and not raw
):
resp_txt = result_text + response["arguments"][0][
"messages"
][0]["adaptiveCards"][0]["body"][0].get("text", "")
resp_txt_no_link = result_text + response["arguments"][
0
]["messages"][0].get("text", "")
if response["arguments"][0]["messages"][0].get(
):
resp_txt = result_text + response["arguments"][0][
"messages"
][0]["adaptiveCards"][0]["body"][0].get("text", "")
resp_txt_no_link = result_text + response["arguments"][
0
]["messages"][0].get("text", "")
if response["arguments"][0]["messages"][0].get(
"messageType",
):
resp_txt = (
):
resp_txt = (
resp_txt
+ response["arguments"][0]["messages"][0][
"adaptiveCards"
][0]["body"][0]["inlines"][0].get("text")
+ "\n"
)
result_text = (
)
result_text = (
result_text
+ response["arguments"][0]["messages"][0][
"adaptiveCards"
][0]["body"][0]["inlines"][0].get("text")
+ "\n"
)
if not raw:
yield False, resp_txt
)
if not raw:
yield False, resp_txt

elif response.get("type") == 2:
if response["item"]["result"].get("error"):
await self.close()
raise Exception(
f"{response['item']['result']['value']}: {response['item']['result']['message']}",
)
if draw:
cache = response["item"]["messages"][1]["adaptiveCards"][0][
"body"
][0]["text"]
response["item"]["messages"][1]["adaptiveCards"][0]["body"][
0
]["text"] = (cache + resp_txt)
if (
elif response.get("type") == 2:
if response["item"]["result"].get("error"):
await self.close()
raise Exception(
f"{response['item']['result']['value']}: {response['item']['result']['message']}",
)
if draw:
cache = response["item"]["messages"][1]["adaptiveCards"][0][
"body"
][0]["text"]
response["item"]["messages"][1]["adaptiveCards"][0]["body"][
0
]["text"] = (cache + resp_txt)
if (
response["item"]["messages"][-1]["contentOrigin"]
== "Apology"
and resp_txt
):
response["item"]["messages"][-1]["text"] = resp_txt_no_link
response["item"]["messages"][-1]["adaptiveCards"][0][
"body"
][0]["text"] = resp_txt
print(
"Preserved the message from being deleted",
file=sys.stderr,
)
await wss.close()
yield True, response
return
if response.get("type") != 2:
if response.get("type") == 6:
await wss.send_str(append_identifier({"type": 6}))
elif response.get("type") == 7:
await wss.send_str(append_identifier({"type": 7}))
elif raw:
yield False, response
):
response["item"]["messages"][-1]["text"] = resp_txt_no_link
response["item"]["messages"][-1]["adaptiveCards"][0][
"body"
][0]["text"] = resp_txt
print(
"Preserved the message from being deleted",
file=sys.stderr,
)
await wss.close()
if not self.aio_session.closed:
await self.aio_session.close()
yield True, response
return
if response.get("type") != 2:
if response.get("type") == 6:
await wss.send_str(append_identifier({"type": 6}))
elif response.get("type") == 7:
await wss.send_str(append_identifier({"type": 7}))
elif raw:
yield False, response

async def _initial_handshake(self, wss) -> None:
await wss.send_str(append_identifier({"protocol": "json", "version": 1}))
await wss.receive_str()
await wss.send_str(append_identifier({"type": 6}))

async def delete_conversation(
self,
conversation_id: str = None,
conversation_signature: str = None,
client_id: str = None,
self,
conversation_id: str = None,
conversation_signature: str = None,
client_id: str = None,
) -> None:
conversation_id = conversation_id or self.request.conversation_id
conversation_signature = (
conversation_signature or self.request.conversation_signature
conversation_signature or self.request.conversation_signature
)
client_id = client_id or self.request.client_id
url = "https://sydney.bing.com/sydney/DeleteSingleConversation"
Expand All @@ -266,4 +269,3 @@ async def delete_conversation(

async def close(self) -> None:
await self.session.aclose()
await self.aio_session.close()
Loading

0 comments on commit 1da9d27

Please sign in to comment.