Skip to content
This repository was archived by the owner on Dec 18, 2024. It is now read-only.

Commit fbf25f6

Browse files
authored
Merge pull request #114 from Integration-Automation/dev
Dev
2 parents a558aa0 + 180eb84 commit fbf25f6

File tree

14 files changed

+943
-103
lines changed

14 files changed

+943
-103
lines changed

dev.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ build-backend = "setuptools.build_meta"
66

77
[project]
88
name = "re_edge_gpt_dev"
9-
version = "0.0.31"
9+
version = "0.0.33"
1010
authors = [
1111
{ name = "JE-Chen", email = "[email protected]" },
1212
]
1313
dependencies = [
14-
"aiohttp", "certifi", "httpx", "prompt_toolkit", "requests", "rich", "regex"
14+
"aiohttp", "certifi", "httpx", "prompt_toolkit", "requests", "rich", "regex", "Brotli"
1515
]
1616
description = "Microsoft's Bing Chat AI"
1717
requires-python = ">=3.9"

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ build-backend = "setuptools.build_meta"
66

77
[project]
88
name = "re_edge_gpt"
9-
version = "0.0.28"
9+
version = "0.0.30"
1010
authors = [
1111
{ name = "JE-Chen", email = "[email protected]" },
1212
]
1313
dependencies = [
14-
"aiohttp", "certifi", "httpx", "prompt_toolkit", "requests", "rich", "regex"
14+
"aiohttp", "certifi", "httpx", "prompt_toolkit", "requests", "rich", "regex", "Brotli"
1515
]
1616
description = "Microsoft's Bing Chat AI"
1717
requires-python = ">=3.9"

re_edge_gpt/chat/chathub.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ async def ask_stream(
8080
locale: str = guess_locale(),
8181
# Use for attachment
8282
attachment: dict = None,
83-
autosave: bool = True
83+
remove_options: list = None,
84+
add_options: list = None
8485
) -> Generator[bool, Union[dict, str], None]:
8586
""" """
8687
if self.encrypted_conversation_signature is not None:
@@ -107,14 +108,21 @@ async def ask_stream(
107108
image_url = None
108109
if attachment is not None:
109110
if attachment.get("image_url") is not None:
110-
response = await upload_image_url(**attachment, conversation_id=self.conversation_id)
111+
response = await upload_image_url(
112+
**attachment, conversation_id=self.conversation_id, cookies=cookies)
111113
else:
112-
response = await upload_image(**attachment)
114+
response = await upload_image(
115+
**attachment, conversation_id=self.conversation_id, cookies=cookies)
113116
if response:
114117
image_url = f"https://www.bing.com/images/blob?bcid={response}"
115118
# Construct a ChatHub request
116-
if autosave is False and "autosave" in conversation_style.value:
117-
conversation_style.value.remove("autosave")
119+
if remove_options is not None:
120+
for option in remove_options:
121+
if option in remove_options:
122+
conversation_style.value.remove(option)
123+
if add_options is not None:
124+
for option in add_options:
125+
conversation_style.value.append(option)
118126
self.request.update(
119127
prompt=prompt,
120128
conversation_style=conversation_style,

re_edge_gpt/chat/re_edge_gpt.py

Lines changed: 44 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from .chathub import *
77
from .conversation import *
88
from .request import *
9-
from re_edge_gpt.utils.utilities import *
109

1110

1211
class Chatbot:
@@ -53,7 +52,8 @@ async def ask(
5352
locale: str = guess_locale(),
5453
simplify_response: bool = False,
5554
attachment: dict[str, str] = None,
56-
autosave: bool = True
55+
remove_options: list = None,
56+
add_options: list = None
5757
):
5858
"""
5959
Ask a question to the bot
@@ -72,7 +72,8 @@ async def ask(
7272
attachment={"filename": r"<file_path>"})
7373
For base64 image using
7474
attachment={"base64_image": r"<base64_image_str>"})
75-
:param autosave: add autosave on request
75+
:param remove_options remove options from Style
76+
:param add_options add options to Style
7677
"""
7778
async for final, response in self.chat_hub.ask_stream(
7879
prompt=prompt,
@@ -82,47 +83,56 @@ async def ask(
8283
search_result=search_result,
8384
locale=locale,
8485
attachment=attachment,
85-
autosave=autosave
86+
remove_options=remove_options,
87+
add_options=add_options
8688
):
8789
if final:
8890
if not simplify_response:
8991
return response
90-
messages_left = response["item"]["throttling"][
91-
"maxNumUserMessagesInConversation"
92-
] - response["item"]["throttling"].get(
92+
messages_left = (response.get("item").get("throttling").get("maxNumUserMessagesInConversation")
93+
- response.get("item").get("throttling").get(
9394
"numUserMessagesInConversation",
9495
0,
95-
)
96+
))
9697
if messages_left == 0:
9798
raise Exception("Max messages reached")
98-
message = ""
99-
for msg in reversed(response["item"]["messages"]):
100-
if msg.get("adaptiveCards") and msg["adaptiveCards"][0]["body"][
101-
0
102-
].get("text"):
103-
message = msg
104-
break
99+
message = {}
100+
for msg in reversed(response.get("item").get("messages")):
101+
if msg.get("author") == "bot":
102+
old_message = message.get("text")
103+
if old_message:
104+
old_message = old_message + " \n "
105+
else:
106+
old_message = ""
107+
message.update({
108+
"author": "bot",
109+
"text": old_message + msg.get("text")
110+
})
105111
if not message:
106112
raise Exception("No message found")
107-
suggestions = [
108-
suggestion["text"]
109-
for suggestion in message.get("suggestedResponses", [])
110-
]
111-
adaptive_cards = message.get("adaptiveCards", [])
112-
sources = (
113-
adaptive_cards[0]["body"][0].get("text") if adaptive_cards else None
114-
)
115-
sources_link = (
116-
adaptive_cards[0]["body"][-1].get("text")
117-
if adaptive_cards
118-
else None
119-
)
113+
image_create_text = ""
114+
suggestions = []
115+
source_texts = []
116+
source_links = []
117+
for detail in reversed(response.get("item").get("messages")):
118+
suggestion_responses = detail.get("suggestedResponses", {})
119+
source_attr = detail.get("sourceAttributions", {})
120+
if suggestion_responses:
121+
for suggestion in suggestion_responses:
122+
suggestions.append(suggestion.get("text"))
123+
if source_attr:
124+
for source in source_attr:
125+
source_texts.append(source.get("providerDisplayName"))
126+
source_links.append(source.get("seeMoreUrl"))
127+
if detail.get("contentType") == "IMAGE" and detail.get("messageType") == "GenerateContentQuery":
128+
image_create_text = detail.get("text")
120129
return {
121130
"text": message["text"],
122131
"author": message["author"],
123-
"sources": sources,
124-
"sources_link": sources_link,
132+
"source_texts": source_texts,
133+
"source_links": source_links,
125134
"suggestions": suggestions,
135+
"image_create_text": image_create_text,
126136
"messages_left": messages_left,
127137
"max_messages": response["item"]["throttling"][
128138
"maxNumUserMessagesInConversation"
@@ -139,7 +149,8 @@ async def ask_stream(
139149
webpage_context: str | None = None,
140150
search_result: bool = False,
141151
locale: str = guess_locale(),
142-
autosave: bool = True
152+
remove_options: list = None,
153+
add_options: list = None
143154
) -> Generator[bool, dict | str, None]:
144155
"""
145156
Ask a question to the bot
@@ -152,7 +163,8 @@ async def ask_stream(
152163
webpage_context=webpage_context,
153164
search_result=search_result,
154165
locale=locale,
155-
autosave=autosave
166+
remove_options=remove_options,
167+
add_options=add_options
156168
):
157169
yield response
158170

re_edge_gpt/chat/request.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,14 @@ def update(
6363
"allowedMessageTypes": [
6464
"ActionRequest",
6565
"Chat",
66-
"ConfirmationCard",
6766
"Context",
68-
"Disengaged",
67+
"InternalSearchQuery",
68+
"InternalSearchResult",
69+
"InternalLoaderMessage",
6970
"Progress",
70-
"RenderContentRequest",
71-
"AdsQuery",
72-
"SemanticSerp",
7371
"GenerateContentQuery",
74-
"SearchQuery"
72+
"SearchQuery",
73+
"GeneratedCode",
7574
],
7675
"sliceIds": [
7776
"schurmsg",

re_edge_gpt/image/upload_image.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
import aiohttp
55

6+
from re_edge_gpt.utils.constants import IMAGE_HEADER
7+
68
payload = {
79
"imageInfo": {},
810
"knowledgeRequest": {
@@ -17,9 +19,10 @@
1719
}
1820

1921

20-
async def upload_image_url(image_url: str, conversation_id: str, proxy: str = None, face_blur: bool = True):
22+
async def upload_image_url(image_url: str, conversation_id: str, cookies: dict,
23+
proxy: str = None, face_blur: bool = True):
2124
async with aiohttp.ClientSession(
22-
headers={"Referer": "https://www.bing.com/search?q=Bing+AI&showconv=1&FORM=hpcodx"},
25+
headers=IMAGE_HEADER, cookies=cookies
2326
) as session:
2427
url = "https://www.bing.com/images/kblob"
2528

@@ -31,17 +34,22 @@ async def upload_image_url(image_url: str, conversation_id: str, proxy: str = No
3134
data = aiohttp.FormData()
3235
data.add_field('knowledgeRequest', json.dumps(new_payload), content_type="application/json")
3336
async with session.post(url, data=data, proxy=proxy) as resp:
37+
if not resp.status == 200:
38+
raise Exception("Upload image failed")
3439
return (await resp.json())["blobId"]
3540

3641

37-
async def upload_image(filename: str = None, base64_image: str = None, proxy: str = None, face_blur: bool = True):
42+
async def upload_image(conversation_id: str, cookies: dict, filename: str = None,
43+
base64_image: str = None, proxy: str = None, face_blur: bool = True):
3844
async with aiohttp.ClientSession(
39-
headers={"Referer": "https://www.bing.com/search?q=Bing+AI&showconv=1&FORM=hpcodx"},
45+
headers=IMAGE_HEADER, cookies=cookies
4046
) as session:
4147
url = "https://www.bing.com/images/kblob"
4248

43-
new_payload = payload.get("knowledgeRequest").update(
49+
new_payload = payload
50+
new_payload.get("knowledgeRequest").update(
4451
{"invokedSkillsRequestData": {"enableFaceBlur": face_blur}})
52+
new_payload.get("knowledgeRequest").get("convoData").update({"convoid": conversation_id})
4553

4654
if filename is not None:
4755
with open(filename, 'rb') as f:
@@ -55,6 +63,7 @@ async def upload_image(filename: str = None, base64_image: str = None, proxy: st
5563
data = aiohttp.FormData()
5664
data.add_field('knowledgeRequest', json.dumps(new_payload), content_type="application/json")
5765
data.add_field('imageBase64', image_base64, content_type="application/octet-stream")
58-
5966
async with session.post(url, data=data, proxy=proxy) as resp:
67+
if not resp.status == 200:
68+
raise Exception("Upload image failed")
6069
return (await resp.json())["blobId"]

re_edge_gpt/utils/constants.py

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@
1111
"accept-language": "en;q=0.9,en-US;q=0.8",
1212
"accept-encoding": "gzip, deflate, br, zsdch",
1313
"content-type": "application/json",
14-
"sec-ch-ua": '"Microsoft Edge";v="120", '
15-
'"Chromium";v="120", '
16-
'"Not?A_Brand";v="8"',
14+
"sec-ch-ua": '"Not A(Brand";v="99", '
15+
'"Microsoft Edge";v="121", '
16+
'"Chromium";v="121"',
1717
"sec-ch-ua-arch": '"x86"',
1818
"sec-ch-ua-bitness": '"64"',
19-
"sec-ch-ua-full-version": '"1-120.0.2210.133"',
20-
"sec-ch-ua-full-version-list": '"Not_A Brand";v="8.0.0.0", '
21-
'"Chromium";v="120.0.6099.217", '
22-
'"Microsoft Edge";v="120.0.2210.133',
19+
"sec-ch-ua-full-version": '"121.0.2277.83"',
20+
"sec-ch-ua-full-version-list": '"Not A(Brand";v="99.0.0.0", '
21+
'"Microsoft Edge";v="121.0.2277.83", '
22+
'"Chromium";v="121.0.6167.85"',
2323
"sec-ch-ua-mobile": "?0",
2424
"sec-ch-ua-model": "",
2525
"sec-ch-ua-platform": '"Windows"',
@@ -39,13 +39,15 @@
3939
"accept": "application/json",
4040
"accept-language": "en;q=0.9,en-US;q=0.8",
4141
"cache-control": "max-age=0",
42-
"sec-ch-ua": '"Not_A Brand";v="8.0.0.0", "Chromium";v="120.0.6099.217", "Microsoft Edge";v="120.0.2210.133',
42+
"sec-ch-ua": '"Not A(Brand";v="99", '
43+
'"Microsoft Edge";v="121", '
44+
'"Chromium";v="121"',
4345
"sec-ch-ua-arch": '"x86"',
4446
"sec-ch-ua-bitness": '"64"',
45-
"sec-ch-ua-full-version": '"1-120.0.2210.133"',
46-
"sec-ch-ua-full-version-list": '"Not_A Brand";v="8.0.0.0", '
47-
'"Chromium";v="120.0.6099.217", '
48-
'"Microsoft Edge";v="120.0.2210.133',
47+
"sec-ch-ua-full-version": '"121.0.2277.83"',
48+
"sec-ch-ua-full-version-list": '"Not A(Brand";v="99.0.0.0", '
49+
'"Microsoft Edge";v="121.0.2277.83", '
50+
'"Chromium";v="121.0.6167.85"',
4951
"sec-ch-ua-mobile": "?0",
5052
"sec-ch-ua-model": '""',
5153
"sec-ch-ua-platform": '"Windows"',
@@ -61,6 +63,32 @@
6163
"x-forwarded-for": FORWARDED_IP,
6264
}
6365

66+
IMAGE_HEADER = {
67+
"Accept": "*/*",
68+
"Accept-Encoding": "gzip, deflate, br",
69+
"Content-Type": "multipart/form-data",
70+
"Referer": "https://www.bing.com/search?q=Bing+AI&showconv=1&FORM=hpcodx",
71+
"sec-ch-ua": '"Not A(Brand";v="99", '
72+
'"Microsoft Edge";v="121", '
73+
'"Chromium";v="121"',
74+
"sec-ch-ua-arch": '"x86"',
75+
"sec-ch-ua-bitness": '"64"',
76+
"sec-ch-ua-full-version": '"121.0.2277.83"',
77+
"sec-ch-ua-full-version-list": '"Not A(Brand";v="99.0.0.0", '
78+
'"Microsoft Edge";v="121.0.2277.83", '
79+
'"Chromium";v="121.0.6167.85"',
80+
"Sec-Ch-Ua-Mobile": "?0",
81+
"Sec-Ch-Ua-Platform": "Windows",
82+
"Sec-Fetch-Dest": "empty",
83+
"Sec-Fetch-Mode": "cors",
84+
"Sec-Fetch-Site": "same-origin",
85+
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
86+
"AppleWebKit/537.36 (KHTML, like Gecko) "
87+
"Chrome/120.0.0.0 "
88+
"Safari/537.36 "
89+
"Edg/120.0.0.0",
90+
}
91+
6492
BUNDLE_VERSION = "1.1498.1"
6593

6694
SYDNEY_INIT_HEADER = HEADERS_INIT_CONVER.update(

0 commit comments

Comments
 (0)