|
|
|
@ -57,7 +57,7 @@ class Bing(AsyncGeneratorProvider):
|
|
|
|
|
|
|
|
|
|
def create_context(messages: Messages):
|
|
|
|
|
return "".join(
|
|
|
|
|
f"[{message['role']}](#message)\n{message['content']}\n\n"
|
|
|
|
|
f"[{message['role']}]" + ("(#message)" if message['role']!="system" else "(#additional_instructions)") + f"\n{message['content']}\n\n"
|
|
|
|
|
for message in messages
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
@ -166,9 +166,9 @@ class Defaults:
|
|
|
|
|
"ActionRequest",
|
|
|
|
|
"Chat",
|
|
|
|
|
"Context",
|
|
|
|
|
"Disengaged",
|
|
|
|
|
# "Disengaged", unwanted
|
|
|
|
|
"Progress",
|
|
|
|
|
"AdsQuery",
|
|
|
|
|
# "AdsQuery", unwanted
|
|
|
|
|
"SemanticSerp",
|
|
|
|
|
"GenerateContentQuery",
|
|
|
|
|
"SearchQuery",
|
|
|
|
@ -176,34 +176,21 @@ class Defaults:
|
|
|
|
|
# useless messages (such as "Analyzing images" or "Searching the web") while it's retrieving the AI response
|
|
|
|
|
# "InternalSearchQuery",
|
|
|
|
|
# "InternalSearchResult",
|
|
|
|
|
# Not entirely certain about these two, but these parameters may be used for real-time markdown rendering.
|
|
|
|
|
# Keeping them could potentially complicate the retrieval of the messages because link references written while
|
|
|
|
|
# the AI is responding would then be moved to the very end of its message.
|
|
|
|
|
# "RenderCardRequest",
|
|
|
|
|
"RenderCardRequest",
|
|
|
|
|
# "RenderContentRequest"
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
sliceIds = [
|
|
|
|
|
"wrapuxslimt5",
|
|
|
|
|
"wrapalgo",
|
|
|
|
|
"wraptopalgo",
|
|
|
|
|
"st14",
|
|
|
|
|
"arankr1_1_9_9",
|
|
|
|
|
"0731ziv2s0",
|
|
|
|
|
"voiceall",
|
|
|
|
|
"1015onstblg",
|
|
|
|
|
"vsspec",
|
|
|
|
|
"cacdiscf",
|
|
|
|
|
"909ajcopus0",
|
|
|
|
|
"scpbfmob",
|
|
|
|
|
"rwt1",
|
|
|
|
|
"cacmuidarb",
|
|
|
|
|
"sappdlpt",
|
|
|
|
|
"917fluxv14",
|
|
|
|
|
"delaygc",
|
|
|
|
|
"remsaconn3p",
|
|
|
|
|
"splitcss3p",
|
|
|
|
|
"sydconfigoptt"
|
|
|
|
|
'abv2',
|
|
|
|
|
'srdicton',
|
|
|
|
|
'convcssclick',
|
|
|
|
|
'stylewv2',
|
|
|
|
|
'contctxp2tf',
|
|
|
|
|
'802fluxv1pc_a',
|
|
|
|
|
'806log2sphs0',
|
|
|
|
|
'727savemem',
|
|
|
|
|
'277teditgnds0',
|
|
|
|
|
'207hlthgrds0',
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
location = {
|
|
|
|
@ -248,19 +235,21 @@ class Defaults:
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
optionsSets = [
|
|
|
|
|
"nlu_direct_response_filter",
|
|
|
|
|
"deepleo",
|
|
|
|
|
"disable_emoji_spoken_text",
|
|
|
|
|
"responsible_ai_policy_235",
|
|
|
|
|
"enablemm",
|
|
|
|
|
"dv3sugg",
|
|
|
|
|
"iyxapbing",
|
|
|
|
|
"iycapbing",
|
|
|
|
|
"h3imaginative",
|
|
|
|
|
"clgalileo",
|
|
|
|
|
"gencontentv3",
|
|
|
|
|
"fluxv14",
|
|
|
|
|
"eredirecturl"
|
|
|
|
|
'nlu_direct_response_filter',
|
|
|
|
|
'deepleo',
|
|
|
|
|
'disable_emoji_spoken_text',
|
|
|
|
|
'responsible_ai_policy_235',
|
|
|
|
|
'enablemm',
|
|
|
|
|
'iyxapbing',
|
|
|
|
|
'iycapbing',
|
|
|
|
|
'gencontentv3',
|
|
|
|
|
'fluxsrtrunc',
|
|
|
|
|
'fluxtrunc',
|
|
|
|
|
'fluxv1',
|
|
|
|
|
'rai278',
|
|
|
|
|
'replaceurl',
|
|
|
|
|
'eredirecturl',
|
|
|
|
|
'nojbfedge'
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
def format_message(msg: dict) -> str:
|
|
|
|
@ -297,7 +286,7 @@ def build_image_upload_api_payload(image_bin: str, conversation: Conversation, t
|
|
|
|
|
)
|
|
|
|
|
return data, boundary
|
|
|
|
|
|
|
|
|
|
def is_data_uri_an_image(data_uri):
|
|
|
|
|
def is_data_uri_an_image(data_uri: str):
|
|
|
|
|
try:
|
|
|
|
|
# Check if the data URI starts with 'data:image' and contains an image format (e.g., jpeg, png, gif)
|
|
|
|
|
if not re.match(r'data:image/(\w+);base64,', data_uri):
|
|
|
|
@ -310,7 +299,7 @@ def is_data_uri_an_image(data_uri):
|
|
|
|
|
except Exception as e:
|
|
|
|
|
raise e
|
|
|
|
|
|
|
|
|
|
def is_accepted_format(binary_data):
|
|
|
|
|
def is_accepted_format(binary_data: bytes) -> bool:
|
|
|
|
|
try:
|
|
|
|
|
check = False
|
|
|
|
|
if binary_data.startswith(b'\xFF\xD8\xFF'):
|
|
|
|
@ -331,7 +320,7 @@ def is_accepted_format(binary_data):
|
|
|
|
|
except Exception as e:
|
|
|
|
|
raise e
|
|
|
|
|
|
|
|
|
|
def extract_data_uri(data_uri):
|
|
|
|
|
def extract_data_uri(data_uri: str) -> bytes:
|
|
|
|
|
try:
|
|
|
|
|
data = data_uri.split(",")[1]
|
|
|
|
|
data = base64.b64decode(data)
|
|
|
|
@ -339,7 +328,7 @@ def extract_data_uri(data_uri):
|
|
|
|
|
except Exception as e:
|
|
|
|
|
raise e
|
|
|
|
|
|
|
|
|
|
def get_orientation(data: bytes):
|
|
|
|
|
def get_orientation(data: bytes) -> int:
|
|
|
|
|
try:
|
|
|
|
|
if data[:2] != b'\xFF\xD8':
|
|
|
|
|
raise Exception('NotJpeg')
|
|
|
|
@ -352,7 +341,7 @@ def get_orientation(data: bytes):
|
|
|
|
|
except Exception:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def process_image(orientation, img, new_width, new_height):
|
|
|
|
|
def process_image(orientation: int, img: Image.Image, new_width: int, new_height: int) -> Image.Image:
|
|
|
|
|
try:
|
|
|
|
|
# Initialize the canvas
|
|
|
|
|
new_img = Image.new("RGB", (new_width, new_height), color="#FFFFFF")
|
|
|
|
@ -370,7 +359,7 @@ def process_image(orientation, img, new_width, new_height):
|
|
|
|
|
except Exception as e:
|
|
|
|
|
raise e
|
|
|
|
|
|
|
|
|
|
def compress_image_to_base64(img, compression_rate):
|
|
|
|
|
def compress_image_to_base64(img, compression_rate) -> str:
|
|
|
|
|
try:
|
|
|
|
|
output_buffer = io.BytesIO()
|
|
|
|
|
img.save(output_buffer, format="JPEG", quality=int(compression_rate * 100))
|
|
|
|
@ -379,13 +368,22 @@ def compress_image_to_base64(img, compression_rate):
|
|
|
|
|
raise e
|
|
|
|
|
|
|
|
|
|
def create_message(conversation: Conversation, prompt: str, tone: str, context: str=None) -> str:
|
|
|
|
|
options_sets = Defaults.optionsSets
|
|
|
|
|
if tone == Tones.creative:
|
|
|
|
|
options_sets.append("h3imaginative")
|
|
|
|
|
elif tone == Tones.precise:
|
|
|
|
|
options_sets.append("h3precise")
|
|
|
|
|
elif tone == Tones.balanced:
|
|
|
|
|
options_sets.append("galileo")
|
|
|
|
|
else:
|
|
|
|
|
options_sets.append("harmonyv3")
|
|
|
|
|
|
|
|
|
|
request_id = str(uuid.uuid4())
|
|
|
|
|
struct = {
|
|
|
|
|
'arguments': [
|
|
|
|
|
{
|
|
|
|
|
'source': 'cib',
|
|
|
|
|
'optionsSets': Defaults.optionsSets,
|
|
|
|
|
'optionsSets': options_sets,
|
|
|
|
|
'allowedMessageTypes': Defaults.allowedMessageTypes,
|
|
|
|
|
'sliceIds': Defaults.sliceIds,
|
|
|
|
|
'traceId': os.urandom(16).hex(),
|
|
|
|
|