From 13f1275ca307d77542708c83066ef2fe86f6284a Mon Sep 17 00:00:00 2001 From: Heiner Lohaus Date: Wed, 13 Mar 2024 17:52:48 +0100 Subject: Add model preselection in gui --- g4f/Provider/Bing.py | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) (limited to 'g4f/Provider/Bing.py') diff --git a/g4f/Provider/Bing.py b/g4f/Provider/Bing.py index 786fec49..e3e47af9 100644 --- a/g4f/Provider/Bing.py +++ b/g4f/Provider/Bing.py @@ -12,7 +12,7 @@ from aiohttp import ClientSession, ClientTimeout, BaseConnector, WSMsgType from ..typing import AsyncResult, Messages, ImageType, Cookies from ..image import ImageRequest from ..errors import ResponseStatusError -from .base_provider import AsyncGeneratorProvider +from .base_provider import AsyncGeneratorProvider, ProviderModelMixin from .helper import get_connector, get_random_hex from .bing.upload_image import upload_image from .bing.conversation import Conversation, create_conversation, delete_conversation @@ -27,7 +27,7 @@ class Tones: balanced = "Balanced" precise = "Precise" -class Bing(AsyncGeneratorProvider): +class Bing(AsyncGeneratorProvider, ProviderModelMixin): """ Bing provider for generating responses using the Bing API. """ @@ -35,16 +35,21 @@ class Bing(AsyncGeneratorProvider): working = True supports_message_history = True supports_gpt_4 = True + default_model = Tones.balanced + models = [ + getattr(Tones, key) for key in dir(Tones) if not key.startswith("__") + ] - @staticmethod + @classmethod def create_async_generator( + cls, model: str, messages: Messages, proxy: str = None, timeout: int = 900, cookies: Cookies = None, connector: BaseConnector = None, - tone: str = Tones.balanced, + tone: str = None, image: ImageType = None, web_search: bool = False, **kwargs @@ -62,13 +67,11 @@ class Bing(AsyncGeneratorProvider): :param web_search: Flag to enable or disable web search. :return: An asynchronous result object. """ - if len(messages) < 2: - prompt = messages[0]["content"] - context = None - else: - prompt = messages[-1]["content"] - context = create_context(messages[:-1]) - + prompt = messages[-1]["content"] + context = create_context(messages[:-1]) if len(messages) > 1 else None + if tone is None: + tone = tone if model.startswith("gpt-4") else model + tone = cls.get_model(tone) gpt4_turbo = True if model.startswith("gpt-4-turbo") else False return stream_generate( @@ -86,7 +89,9 @@ def create_context(messages: Messages) -> str: :return: A string representing the context created from the messages. """ return "".join( - f"[{message['role']}]" + ("(#message)" if message['role'] != "system" else "(#additional_instructions)") + f"\n{message['content']}" + f"[{message['role']}]" + ("(#message)" + if message['role'] != "system" + else "(#additional_instructions)") + f"\n{message['content']}" for message in messages ) + "\n\n" @@ -403,7 +408,7 @@ async def stream_generate( do_read = False if response_txt.startswith(returned_text): new = response_txt[len(returned_text):] - if new != "\n": + if new not in ("", "\n"): yield new returned_text = response_txt if image_response: -- cgit v1.2.3 From 993c9498c4276836864b01f66f5d08676a994520 Mon Sep 17 00:00:00 2001 From: Heiner Lohaus Date: Thu, 14 Mar 2024 13:53:57 +0100 Subject: Add webview support to OpenaiChat --- g4f/Provider/Bing.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'g4f/Provider/Bing.py') diff --git a/g4f/Provider/Bing.py b/g4f/Provider/Bing.py index e3e47af9..f8b13020 100644 --- a/g4f/Provider/Bing.py +++ b/g4f/Provider/Bing.py @@ -303,7 +303,7 @@ def create_message( struct['arguments'][0]['previousMessages'] = [{ "author": "user", "description": context, - "contextType": "WebPage", + "contextType": "ClientApp", "messageType": "Context", "messageId": "discover-web--page-ping-mriduna-----" }] @@ -404,6 +404,8 @@ async def stream_generate( image_client = BingCreateImages(cookies, proxy) image_response = await image_client.create_async(prompt) except Exception as e: + if debug.logging: + print(f"Bing: Failed to create images: {e}") response_txt += f"\nhttps://www.bing.com/images/create?q={parse.quote(prompt)}" do_read = False if response_txt.startswith(returned_text): -- cgit v1.2.3 From 8cc6000ffbf4e12bf6c1d5e5878d376e36857ec0 Mon Sep 17 00:00:00 2001 From: Heiner Lohaus Date: Fri, 15 Mar 2024 11:46:06 +0100 Subject: Add Pyinstaller support, Use curl_cffi in You provider --- g4f/Provider/Bing.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'g4f/Provider/Bing.py') diff --git a/g4f/Provider/Bing.py b/g4f/Provider/Bing.py index f8b13020..925dae0a 100644 --- a/g4f/Provider/Bing.py +++ b/g4f/Provider/Bing.py @@ -406,14 +406,13 @@ async def stream_generate( except Exception as e: if debug.logging: print(f"Bing: Failed to create images: {e}") - response_txt += f"\nhttps://www.bing.com/images/create?q={parse.quote(prompt)}" - do_read = False + image_response = f"\nhttps://www.bing.com/images/create?q={parse.quote(prompt)}" if response_txt.startswith(returned_text): new = response_txt[len(returned_text):] if new not in ("", "\n"): yield new returned_text = response_txt - if image_response: + if image_response is not None: yield image_response elif response.get('type') == 2: result = response['item']['result'] -- cgit v1.2.3 From f861f322aa0a688fa81df360129530b1e70519bc Mon Sep 17 00:00:00 2001 From: Heiner Lohaus Date: Sat, 16 Mar 2024 14:40:06 +0100 Subject: Add copilot conversation mode --- g4f/Provider/Bing.py | 46 +++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 17 deletions(-) (limited to 'g4f/Provider/Bing.py') diff --git a/g4f/Provider/Bing.py b/g4f/Provider/Bing.py index 925dae0a..78f8e29b 100644 --- a/g4f/Provider/Bing.py +++ b/g4f/Provider/Bing.py @@ -26,6 +26,7 @@ class Tones: creative = "Creative" balanced = "Balanced" precise = "Precise" + copilot = "Balanced" class Bing(AsyncGeneratorProvider, ProviderModelMixin): """ @@ -35,10 +36,8 @@ class Bing(AsyncGeneratorProvider, ProviderModelMixin): working = True supports_message_history = True supports_gpt_4 = True - default_model = Tones.balanced - models = [ - getattr(Tones, key) for key in dir(Tones) if not key.startswith("__") - ] + default_model = "balanced" + models = [key for key in Tones.__dict__ if not key.startswith("__")] @classmethod def create_async_generator( @@ -71,7 +70,7 @@ class Bing(AsyncGeneratorProvider, ProviderModelMixin): context = create_context(messages[:-1]) if len(messages) > 1 else None if tone is None: tone = tone if model.startswith("gpt-4") else model - tone = cls.get_model(tone) + tone = cls.get_model("" if tone is None else tone.lower()) gpt4_turbo = True if model.startswith("gpt-4-turbo") else False return stream_generate( @@ -136,31 +135,32 @@ class Defaults: ] sliceIds = { - "Balanced": [ + "balanced": [ "supllmnfe","archnewtf", "stpstream", "stpsig", "vnextvoicecf", "scmcbase", "cmcpupsalltf", "sydtransctrl", "thdnsrch", "220dcl1s0", "0215wcrwips0", "0305hrthrots0", "0130gpt4t", "bingfc", "0225unsticky1", "0228scss0", "defquerycf", "defcontrol", "3022tphpv" ], - "Creative": [ + "creative": [ "bgstream", "fltltst2c", "stpstream", "stpsig", "vnextvoicecf", "cmcpupsalltf", "sydtransctrl", "0301techgnd", "220dcl1bt15", "0215wcrwip", "0305hrthrot", "0130gpt4t", "bingfccf", "0225unsticky1", "0228scss0", "3022tpvs0" ], - "Precise": [ + "precise": [ "bgstream", "fltltst2c", "stpstream", "stpsig", "vnextvoicecf", "cmcpupsalltf", "sydtransctrl", "0301techgnd", "220dcl1bt15", "0215wcrwip", "0305hrthrot", "0130gpt4t", "bingfccf", "0225unsticky1", "0228scss0", "defquerycf", "3022tpvs0" ], + "copilot": [] } optionsSets = { - "Balanced": [ + "balanced": [ "nlu_direct_response_filter", "deepleo", "disable_emoji_spoken_text", "responsible_ai_policy_235", "enablemm", "dv3sugg", "autosave", @@ -168,7 +168,7 @@ class Defaults: "galileo", "saharagenconv5", "gldcl1p", "gpt4tmncnp" ], - "Creative": [ + "creative": [ "nlu_direct_response_filter", "deepleo", "disable_emoji_spoken_text", "responsible_ai_policy_235", "enablemm", "dv3sugg", @@ -176,7 +176,7 @@ class Defaults: "h3imaginative", "techinstgnd", "hourthrot", "clgalileo", "gencontentv3", "gpt4tmncnp" ], - "Precise": [ + "precise": [ "nlu_direct_response_filter", "deepleo", "disable_emoji_spoken_text", "responsible_ai_policy_235", "enablemm", "dv3sugg", @@ -184,6 +184,13 @@ class Defaults: "h3precise", "techinstgnd", "hourthrot", "techinstgnd", "hourthrot", "clgalileo", "gencontentv3" ], + "copilot": [ + "nlu_direct_response_filter", "deepleo", + "disable_emoji_spoken_text", "responsible_ai_policy_235", + "enablemm", "dv3sugg", + "iyxapbing", "iycapbing", + "h3precise", "clgalileo", "gencontentv3", "prjupy" + ], } # Default location settings @@ -264,7 +271,7 @@ def create_message( "allowedMessageTypes": Defaults.allowedMessageTypes, "sliceIds": Defaults.sliceIds[tone], "verbosity": "verbose", - "scenario": "SERP", + "scenario": "CopilotMicrosoftCom", # "SERP", "plugins": [{"id": "c310c353-b9f0-4d76-ab0d-1dd5e979cf68", "category": 1}] if web_search else [], "traceId": get_random_hex(40), "conversationHistoryOptionsSets": ["autosave","savemem","uprofupd","uprofgen"], @@ -282,8 +289,7 @@ def create_message( "requestId": request_id, "messageId": request_id }, - "tone": tone, - "extraExtensionParameters": {"gpt-creator-persona": {"personaId": "copilot"}}, + "tone": getattr(Tones, tone), "spokenTextMode": "None", "conversationId": conversation.conversationId, "participant": {"id": conversation.clientId} @@ -322,6 +328,7 @@ async def stream_generate( gpt4_turbo: bool = False, timeout: int = 900, conversation: Conversation = None, + return_conversation: bool = False, raise_apology: bool = False, max_retries: int = 5, sleep_retry: int = 15, @@ -344,10 +351,15 @@ async def stream_generate( async with ClientSession( timeout=ClientTimeout(total=timeout), connector=connector ) as session: - while conversation is None: + first = True + while first or conversation is None: + first = False do_read = True try: - conversation = await create_conversation(session, headers) + if conversation is None: + conversation = await create_conversation(session, headers) + if return_conversation: + yield conversation except ResponseStatusError as e: max_retries -= 1 if max_retries < 1: @@ -358,7 +370,7 @@ async def stream_generate( await asyncio.sleep(sleep_retry) continue - image_request = await upload_image(session, image, tone, headers) if image else None + image_request = await upload_image(session, image, getattr(Tones, tone), headers) if image else None async with session.ws_connect( 'wss://sydney.bing.com/sydney/ChatHub', autoping=False, -- cgit v1.2.3 From 4778356064a005f0dec78a8fef40a26289217d7c Mon Sep 17 00:00:00 2001 From: Heiner Lohaus Date: Sat, 16 Mar 2024 18:07:53 +0100 Subject: Add conversation support for Bing --- g4f/Provider/Bing.py | 119 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 84 insertions(+), 35 deletions(-) (limited to 'g4f/Provider/Bing.py') diff --git a/g4f/Provider/Bing.py b/g4f/Provider/Bing.py index 78f8e29b..69c32775 100644 --- a/g4f/Provider/Bing.py +++ b/g4f/Provider/Bing.py @@ -51,6 +51,7 @@ class Bing(AsyncGeneratorProvider, ProviderModelMixin): tone: str = None, image: ImageType = None, web_search: bool = False, + context: str = None, **kwargs ) -> AsyncResult: """ @@ -67,7 +68,8 @@ class Bing(AsyncGeneratorProvider, ProviderModelMixin): :return: An asynchronous result object. """ prompt = messages[-1]["content"] - context = create_context(messages[:-1]) if len(messages) > 1 else None + if context is None: + context = create_context(messages[:-1]) if len(messages) > 1 else None if tone is None: tone = tone if model.startswith("gpt-4") else model tone = cls.get_model("" if tone is None else tone.lower()) @@ -126,7 +128,7 @@ class Defaults: "ActionRequest","Chat", "ConfirmationCard", "Context", "InternalSearchQuery", #"InternalSearchResult", - "Disengaged", #"InternalLoaderMessage", + #"Disengaged", "InternalLoaderMessage", "Progress", "RenderCardRequest", "RenderContentRequest", "AdsQuery", "SemanticSerp", "GenerateContentQuery", @@ -160,30 +162,62 @@ class Defaults: } optionsSets = { - "balanced": [ - "nlu_direct_response_filter", "deepleo", - "disable_emoji_spoken_text", "responsible_ai_policy_235", - "enablemm", "dv3sugg", "autosave", - "iyxapbing", "iycapbing", - "galileo", "saharagenconv5", "gldcl1p", - "gpt4tmncnp" - ], - "creative": [ - "nlu_direct_response_filter", "deepleo", - "disable_emoji_spoken_text", "responsible_ai_policy_235", - "enablemm", "dv3sugg", - "iyxapbing", "iycapbing", - "h3imaginative", "techinstgnd", "hourthrot", "clgalileo", "gencontentv3", - "gpt4tmncnp" - ], - "precise": [ - "nlu_direct_response_filter", "deepleo", - "disable_emoji_spoken_text", "responsible_ai_policy_235", - "enablemm", "dv3sugg", - "iyxapbing", "iycapbing", - "h3precise", "techinstgnd", "hourthrot", "techinstgnd", "hourthrot", - "clgalileo", "gencontentv3" - ], + "balanced": { + "default": [ + "nlu_direct_response_filter", "deepleo", + "disable_emoji_spoken_text", "responsible_ai_policy_235", + "enablemm", "dv3sugg", "autosave", + "iyxapbing", "iycapbing", + "galileo", "saharagenconv5", "gldcl1p", + "gpt4tmncnp" + ], + "nosearch": [ + "nlu_direct_response_filter", "deepleo", + "disable_emoji_spoken_text", "responsible_ai_policy_235", + "enablemm", "dv3sugg", "autosave", + "iyxapbing", "iycapbing", + "galileo", "sunoupsell", "base64filter", "uprv4p1upd", + "hourthrot", "noctprf", "gndlogcf", "nosearchall" + ] + }, + "creative": { + "default": [ + "nlu_direct_response_filter", "deepleo", + "disable_emoji_spoken_text", "responsible_ai_policy_235", + "enablemm", "dv3sugg", + "iyxapbing", "iycapbing", + "h3imaginative", "techinstgnd", "hourthrot", "clgalileo", "gencontentv3", + "gpt4tmncnp" + ], + "nosearch": [ + "nlu_direct_response_filter", "deepleo", + "disable_emoji_spoken_text", "responsible_ai_policy_235", + "enablemm", "dv3sugg", "autosave", + "iyxapbing", "iycapbing", + "h3imaginative", "sunoupsell", "base64filter", "uprv4p1upd", + "hourthrot", "noctprf", "gndlogcf", "nosearchall", + "clgalileo", "nocache", "up4rp14bstcst" + ] + }, + "precise": { + "default": [ + "nlu_direct_response_filter", "deepleo", + "disable_emoji_spoken_text", "responsible_ai_policy_235", + "enablemm", "dv3sugg", + "iyxapbing", "iycapbing", + "h3precise", "techinstgnd", "hourthrot", "techinstgnd", "hourthrot", + "clgalileo", "gencontentv3" + ], + "nosearch": [ + "nlu_direct_response_filter", "deepleo", + "disable_emoji_spoken_text", "responsible_ai_policy_235", + "enablemm", "dv3sugg", "autosave", + "iyxapbing", "iycapbing", + "h3precise", "sunoupsell", "base64filter", "uprv4p1upd", + "hourthrot", "noctprf", "gndlogcf", "nosearchall", + "clgalileo", "nocache", "up4rp14bstcst" + ] + }, "copilot": [ "nlu_direct_response_filter", "deepleo", "disable_emoji_spoken_text", "responsible_ai_policy_235", @@ -244,7 +278,8 @@ def create_message( context: str = None, image_request: ImageRequest = None, web_search: bool = False, - gpt4_turbo: bool = False + gpt4_turbo: bool = False, + new_conversation: bool = True ) -> str: """ Creates a message for the Bing API with specified parameters. @@ -259,7 +294,12 @@ def create_message( :return: A formatted string message for the Bing API. """ - options_sets = [] + options_sets = Defaults.optionsSets[tone] + if not web_search and "nosearch" in options_sets: + options_sets = options_sets["nosearch"] + elif "default" in options_sets: + options_sets = options_sets["default"] + options_sets = options_sets.copy() if gpt4_turbo: options_sets.append("dlgpt4t") @@ -267,7 +307,7 @@ def create_message( struct = { "arguments":[{ "source": "cib", - "optionsSets": [*Defaults.optionsSets[tone], *options_sets], + "optionsSets": options_sets, "allowedMessageTypes": Defaults.allowedMessageTypes, "sliceIds": Defaults.sliceIds[tone], "verbosity": "verbose", @@ -276,7 +316,7 @@ def create_message( "traceId": get_random_hex(40), "conversationHistoryOptionsSets": ["autosave","savemem","uprofupd","uprofgen"], "gptId": "copilot", - "isStartOfSession": True, + "isStartOfSession": new_conversation, "requestId": request_id, "message":{ **Defaults.location, @@ -330,7 +370,7 @@ async def stream_generate( conversation: Conversation = None, return_conversation: bool = False, raise_apology: bool = False, - max_retries: int = 5, + max_retries: int = None, sleep_retry: int = 15, **kwargs ): @@ -348,6 +388,8 @@ async def stream_generate( :return: An asynchronous generator yielding responses. """ headers = create_headers(cookies) + new_conversation = conversation is None + max_retries = (5 if new_conversation else 0) if max_retries is None else max_retries async with ClientSession( timeout=ClientTimeout(total=timeout), connector=connector ) as session: @@ -357,9 +399,9 @@ async def stream_generate( do_read = True try: if conversation is None: - conversation = await create_conversation(session, headers) - if return_conversation: - yield conversation + conversation = await create_conversation(session, headers, tone) + if return_conversation: + yield conversation except ResponseStatusError as e: max_retries -= 1 if max_retries < 1: @@ -372,6 +414,8 @@ async def stream_generate( image_request = await upload_image(session, image, getattr(Tones, tone), headers) if image else None async with session.ws_connect( + 'wss://s.copilot.microsoft.com/sydney/ChatHub' + if tone == "copilot" else 'wss://sydney.bing.com/sydney/ChatHub', autoping=False, params={'sec_access_token': conversation.conversationSignature}, @@ -380,7 +424,12 @@ async def stream_generate( await wss.send_str(format_message({'protocol': 'json', 'version': 1})) await wss.send_str(format_message({"type": 6})) await wss.receive(timeout=timeout) - await wss.send_str(create_message(conversation, prompt, tone, context, image_request, web_search, gpt4_turbo)) + await wss.send_str(create_message( + conversation, prompt, tone, + context if new_conversation else None, + image_request, web_search, gpt4_turbo, + new_conversation + )) response_txt = '' returned_text = '' message_id = None -- cgit v1.2.3