From ff4d9ae584cd3e9eefee6642c2a5290b63351b0a Mon Sep 17 00:00:00 2001 From: Heiner Lohaus Date: Mon, 2 Oct 2023 17:01:15 +0200 Subject: Add Phind Provider Add release_curl in url_cffi requets Support create image response in Bing --- g4f/Provider/Bing.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) (limited to 'g4f/Provider/Bing.py') diff --git a/g4f/Provider/Bing.py b/g4f/Provider/Bing.py index 05be27e7..e4e56519 100644 --- a/g4f/Provider/Bing.py +++ b/g4f/Provider/Bing.py @@ -3,6 +3,7 @@ from __future__ import annotations import random import json import os +import urllib.parse from aiohttp import ClientSession, ClientTimeout from ..typing import AsyncGenerator from .base_provider import AsyncGeneratorProvider, get_cookies @@ -245,7 +246,6 @@ async def stream_generate( await wss.send_str(create_message(conversation, prompt, context)) response_txt = '' - result_text = '' returned_text = '' final = False @@ -260,14 +260,18 @@ async def stream_generate( if response.get('type') == 1 and response['arguments'][0].get('messages'): message = response['arguments'][0]['messages'][0] if (message['contentOrigin'] != 'Apology'): - response_txt = result_text + \ - message['adaptiveCards'][0]['body'][0].get('text', '') - - if message.get('messageType'): - inline_txt = message['adaptiveCards'][0]['body'][0]['inlines'][0].get('text') - response_txt += inline_txt + '\n' - result_text += inline_txt + '\n' - + if 'adaptiveCards' in message: + card = message['adaptiveCards'][0]['body'][0] + if "text" in card: + response_txt = card.get('text') + if message.get('messageType'): + inline_txt = card['inlines'][0].get('text') + response_txt += inline_txt + '\n' + elif message.get('contentType') == "IMAGE": + query = urllib.parse.quote(message.get('text')) + url = f"\nhttps://www.bing.com/images/create?q={query}" + response_txt += url + final = True if response_txt.startswith(returned_text): new = response_txt[len(returned_text):] if new != "\n": -- cgit v1.2.3 From 252f595b6a1f0bd4068c1f2becd5a932e3345bb7 Mon Sep 17 00:00:00 2001 From: Heiner Lohaus Date: Mon, 2 Oct 2023 22:43:36 +0200 Subject: Bing Updates: Add retry create conversation Removed get_cookies fallback Add creative tone parameter --- g4f/Provider/Bing.py | 78 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 33 deletions(-) (limited to 'g4f/Provider/Bing.py') diff --git a/g4f/Provider/Bing.py b/g4f/Provider/Bing.py index e4e56519..940b3a0b 100644 --- a/g4f/Provider/Bing.py +++ b/g4f/Provider/Bing.py @@ -6,8 +6,12 @@ import os import urllib.parse from aiohttp import ClientSession, ClientTimeout from ..typing import AsyncGenerator -from .base_provider import AsyncGeneratorProvider, get_cookies +from .base_provider import AsyncGeneratorProvider +class Tones(): + creative = "Creative" + balanced = "Balanced" + precise = "Precise" class Bing(AsyncGeneratorProvider): url = "https://bing.com/chat" @@ -16,12 +20,13 @@ class Bing(AsyncGeneratorProvider): @staticmethod def create_async_generator( - model: str, - messages: list[dict[str, str]], - cookies: dict = None, **kwargs) -> AsyncGenerator: + model: str, + messages: list[dict[str, str]], + cookies: dict = None, + tone: str = Tones.creative, + **kwargs + ) -> AsyncGenerator: - if not cookies: - cookies = get_cookies(".bing.com") if len(messages) < 2: prompt = messages[0]["content"] context = None @@ -38,7 +43,7 @@ class Bing(AsyncGeneratorProvider): 'SRCHUSR' : '', 'SRCHHPGUSR' : '', } - return stream_generate(prompt, context, cookies) + return stream_generate(prompt, tone, context, cookies) def create_context(messages: list[dict[str, str]]): context = "".join(f"[{message['role']}](#message)\n{message['content']}\n\n" for message in messages) @@ -64,6 +69,14 @@ async def create_conversation(session: ClientSession) -> Conversation: return Conversation(conversationId, clientId, conversationSignature) +async def retry_conversation(session: ClientSession) -> Conversation: + for _ in range(5): + try: + return await create_conversation(session) + except: + session.cookie_jar.clear() + return await create_conversation(session) + async def list_conversations(session: ClientSession) -> list: url = "https://www.bing.com/turing/conversation/chats" async with session.get(url) as response: @@ -162,34 +175,32 @@ class Defaults: 'x-forwarded-for': ip_address, } - optionsSets = { - "optionsSets": [ - 'saharasugg', - 'enablenewsfc', - 'clgalileo', - 'gencontentv3', - "nlu_direct_response_filter", - "deepleo", - "disable_emoji_spoken_text", - "responsible_ai_policy_235", - "enablemm", - "h3precise" - "dtappid", - "cricinfo", - "cricinfov2", - "dv3sugg", - "nojbfedge" - ] - } + optionsSets = [ + 'saharasugg', + 'enablenewsfc', + 'clgalileo', + 'gencontentv3', + "nlu_direct_response_filter", + "deepleo", + "disable_emoji_spoken_text", + "responsible_ai_policy_235", + "enablemm", + "h3precise" + "dtappid", + "cricinfo", + "cricinfov2", + "dv3sugg", + "nojbfedge" + ] def format_message(msg: dict) -> str: return json.dumps(msg, ensure_ascii=False) + Defaults.delimiter -def create_message(conversation: Conversation, prompt: str, context: str=None) -> str: +def create_message(conversation: Conversation, prompt: str, tone: str, context: str=None) -> str: struct = { 'arguments': [ { - **Defaults.optionsSets, + 'optionsSets': Defaults.optionsSets, 'source': 'cib', 'allowedMessageTypes': Defaults.allowedMessageTypes, 'sliceIds': Defaults.sliceIds, @@ -201,6 +212,7 @@ def create_message(conversation: Conversation, prompt: str, context: str=None) - 'text': prompt, 'messageType': 'Chat' }, + 'tone': tone, 'conversationSignature': conversation.conversationSignature, 'participant': { 'id': conversation.clientId @@ -225,15 +237,16 @@ def create_message(conversation: Conversation, prompt: str, context: str=None) - async def stream_generate( prompt: str, + tone: str, context: str=None, - cookies: dict=None + cookies: dict=None, ): async with ClientSession( timeout=ClientTimeout(total=900), cookies=cookies, headers=Defaults.headers, ) as session: - conversation = await create_conversation(session) + conversation = await retry_conversation(session) try: async with session.ws_connect( 'wss://sydney.bing.com/sydney/ChatHub', @@ -243,7 +256,7 @@ async def stream_generate( await wss.send_str(format_message({'protocol': 'json', 'version': 1})) msg = await wss.receive(timeout=900) - await wss.send_str(create_message(conversation, prompt, context)) + await wss.send_str(create_message(conversation, prompt, tone, context)) response_txt = '' returned_text = '' @@ -281,7 +294,6 @@ async def stream_generate( result = response['item']['result'] if result.get('error'): raise Exception(f"{result['value']}: {result['message']}") - final = True - break + return finally: await delete_conversation(session, conversation) \ No newline at end of file -- cgit v1.2.3 From 0bd5730bcd5de82d77d90e256661e5d9626d8264 Mon Sep 17 00:00:00 2001 From: abc <98614666+xtekky@users.noreply.github.com> Date: Wed, 4 Oct 2023 21:04:31 +0100 Subject: ~ | g4f v-0.1.4.8 - Fixed `g4f.Provider.Bing` implemented new "X-Sydney-EncryptedConversationSignature" found in headers from "turing/conversation/create" --- g4f/Provider/Bing.py | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) (limited to 'g4f/Provider/Bing.py') diff --git a/g4f/Provider/Bing.py b/g4f/Provider/Bing.py index 940b3a0b..e333f132 100644 --- a/g4f/Provider/Bing.py +++ b/g4f/Provider/Bing.py @@ -1,6 +1,7 @@ from __future__ import annotations import random +import uuid import json import os import urllib.parse @@ -57,14 +58,39 @@ class Conversation(): self.conversationSignature = conversationSignature async def create_conversation(session: ClientSession) -> Conversation: - url = 'https://www.bing.com/turing/conversation/create' - async with await session.get(url) as response: - response = await response.json() + url = 'https://www.bing.com/turing/conversation/create?bundleVersion=1.1055.6' + headers = { + 'authority': 'www.bing.com', + 'accept': 'application/json', + 'accept-language': 'en,fr-FR;q=0.9,fr;q=0.8,es-ES;q=0.7,es;q=0.6,en-US;q=0.5,am;q=0.4,de;q=0.3', + 'cache-control': 'no-cache', + 'pragma': 'no-cache', + 'referer': 'https://www.bing.com/search?q=Bing+AI&showconv=1', + 'sec-ch-ua': '"Google Chrome";v="117", "Not;A=Brand";v="8", "Chromium";v="117"', + 'sec-ch-ua-arch': '"arm"', + 'sec-ch-ua-bitness': '"64"', + 'sec-ch-ua-full-version': '"117.0.5938.132"', + 'sec-ch-ua-full-version-list': '"Google Chrome";v="117.0.5938.132", "Not;A=Brand";v="8.0.0.0", "Chromium";v="117.0.5938.132"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-model': '""', + 'sec-ch-ua-platform': '"macOS"', + 'sec-ch-ua-platform-version': '"14.0.0"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-origin', + 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36', + 'x-ms-client-request-id': str(uuid.uuid4()), + 'x-ms-useragent': 'azsdk-js-api-client-factory/1.0.0-beta.1 core-rest-pipeline/1.12.0 OS/macOS', + } + + async with await session.get(url, headers=headers) as response: + conversationSignature = response.headers.get('X-Sydney-EncryptedConversationSignature', '') + + response = await response.json() conversationId = response.get('conversationId') - clientId = response.get('clientId') - conversationSignature = response.get('conversationSignature') - - if not conversationId or not clientId or not conversationSignature: + clientId = response.get('clientId') + + if not conversationId or not clientId: raise Exception('Failed to create conversation.') return Conversation(conversationId, clientId, conversationSignature) @@ -249,7 +275,7 @@ async def stream_generate( conversation = await retry_conversation(session) try: async with session.ws_connect( - 'wss://sydney.bing.com/sydney/ChatHub', + f'wss://sydney.bing.com/sydney/ChatHub?sec_access_token={urllib.parse.quote_plus(conversation.conversationSignature)}', autoping=False, ) as wss: -- cgit v1.2.3 From 88d2cbff099df00944ed6dfb6c73b1b5e8dfc7f9 Mon Sep 17 00:00:00 2001 From: Heiner Lohaus Date: Thu, 5 Oct 2023 05:13:37 +0200 Subject: Add AiAsk, Chatgpt4Online, ChatgptDemo and ChatgptX Provider Fix Bing, Liaobots and ChatgptAi Provider Add "gpt_35_long" model and custom timeout --- g4f/Provider/Bing.py | 89 ++++++++++++++++++---------------------------------- 1 file changed, 31 insertions(+), 58 deletions(-) (limited to 'g4f/Provider/Bing.py') diff --git a/g4f/Provider/Bing.py b/g4f/Provider/Bing.py index e333f132..b669d800 100644 --- a/g4f/Provider/Bing.py +++ b/g4f/Provider/Bing.py @@ -4,6 +4,7 @@ import random import uuid import json import os +import uuid import urllib.parse from aiohttp import ClientSession, ClientTimeout from ..typing import AsyncGenerator @@ -14,6 +15,15 @@ class Tones(): balanced = "Balanced" precise = "Precise" +default_cookies = { + 'SRCHD' : 'AF=NOFORM', + 'PPLState' : '1', + 'KievRPSSecAuth': '', + 'SUID' : '', + 'SRCHUSR' : '', + 'SRCHHPGUSR' : '', +} + class Bing(AsyncGeneratorProvider): url = "https://bing.com/chat" working = True @@ -27,7 +37,6 @@ class Bing(AsyncGeneratorProvider): tone: str = Tones.creative, **kwargs ) -> AsyncGenerator: - if len(messages) < 2: prompt = messages[0]["content"] context = None @@ -36,14 +45,7 @@ class Bing(AsyncGeneratorProvider): context = create_context(messages[:-1]) if not cookies or "SRCHD" not in cookies: - cookies = { - 'SRCHD' : 'AF=NOFORM', - 'PPLState' : '1', - 'KievRPSSecAuth': '', - 'SUID' : '', - 'SRCHUSR' : '', - 'SRCHHPGUSR' : '', - } + cookies = default_cookies return stream_generate(prompt, tone, context, cookies) def create_context(messages: list[dict[str, str]]): @@ -58,51 +60,18 @@ class Conversation(): self.conversationSignature = conversationSignature async def create_conversation(session: ClientSession) -> Conversation: - url = 'https://www.bing.com/turing/conversation/create?bundleVersion=1.1055.6' - headers = { - 'authority': 'www.bing.com', - 'accept': 'application/json', - 'accept-language': 'en,fr-FR;q=0.9,fr;q=0.8,es-ES;q=0.7,es;q=0.6,en-US;q=0.5,am;q=0.4,de;q=0.3', - 'cache-control': 'no-cache', - 'pragma': 'no-cache', - 'referer': 'https://www.bing.com/search?q=Bing+AI&showconv=1', - 'sec-ch-ua': '"Google Chrome";v="117", "Not;A=Brand";v="8", "Chromium";v="117"', - 'sec-ch-ua-arch': '"arm"', - 'sec-ch-ua-bitness': '"64"', - 'sec-ch-ua-full-version': '"117.0.5938.132"', - 'sec-ch-ua-full-version-list': '"Google Chrome";v="117.0.5938.132", "Not;A=Brand";v="8.0.0.0", "Chromium";v="117.0.5938.132"', - 'sec-ch-ua-mobile': '?0', - 'sec-ch-ua-model': '""', - 'sec-ch-ua-platform': '"macOS"', - 'sec-ch-ua-platform-version': '"14.0.0"', - 'sec-fetch-dest': 'empty', - 'sec-fetch-mode': 'cors', - 'sec-fetch-site': 'same-origin', - 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36', - 'x-ms-client-request-id': str(uuid.uuid4()), - 'x-ms-useragent': 'azsdk-js-api-client-factory/1.0.0-beta.1 core-rest-pipeline/1.12.0 OS/macOS', - } - - async with await session.get(url, headers=headers) as response: - conversationSignature = response.headers.get('X-Sydney-EncryptedConversationSignature', '') - - response = await response.json() - conversationId = response.get('conversationId') - clientId = response.get('clientId') - - if not conversationId or not clientId: + url = 'https://www.bing.com/turing/conversation/create' + async with await session.get(url) as response: + data = await response.json() + conversationId = data.get('conversationId') + clientId = data.get('clientId') + conversationSignature = response.headers.get('X-Sydney-Encryptedconversationsignature') + + if not conversationId or not clientId or not conversationSignature: raise Exception('Failed to create conversation.') return Conversation(conversationId, clientId, conversationSignature) -async def retry_conversation(session: ClientSession) -> Conversation: - for _ in range(5): - try: - return await create_conversation(session) - except: - session.cookie_jar.clear() - return await create_conversation(session) - async def list_conversations(session: ClientSession) -> list: url = "https://www.bing.com/turing/conversation/chats" async with session.get(url) as response: @@ -223,30 +192,34 @@ def format_message(msg: dict) -> str: return json.dumps(msg, ensure_ascii=False) + Defaults.delimiter def create_message(conversation: Conversation, prompt: str, tone: str, context: str=None) -> str: + request_id = str(uuid.uuid4()) struct = { 'arguments': [ { - 'optionsSets': Defaults.optionsSets, 'source': 'cib', + 'optionsSets': Defaults.optionsSets, 'allowedMessageTypes': Defaults.allowedMessageTypes, 'sliceIds': Defaults.sliceIds, 'traceId': os.urandom(16).hex(), 'isStartOfSession': True, + 'requestId': request_id, 'message': Defaults.location | { 'author': 'user', 'inputMethod': 'Keyboard', 'text': prompt, - 'messageType': 'Chat' + 'messageType': 'Chat', + 'requestId': request_id, + 'messageId': request_id, }, 'tone': tone, - 'conversationSignature': conversation.conversationSignature, + 'spokenTextMode': 'None', + 'conversationId': conversation.conversationId, 'participant': { 'id': conversation.clientId }, - 'conversationId': conversation.conversationId } ], - 'invocationId': '0', + 'invocationId': '1', 'target': 'chat', 'type': 4 } @@ -272,16 +245,16 @@ async def stream_generate( cookies=cookies, headers=Defaults.headers, ) as session: - conversation = await retry_conversation(session) + conversation = await create_conversation(session) try: async with session.ws_connect( f'wss://sydney.bing.com/sydney/ChatHub?sec_access_token={urllib.parse.quote_plus(conversation.conversationSignature)}', autoping=False, + params={'sec_access_token': conversation.conversationSignature} ) as wss: await wss.send_str(format_message({'protocol': 'json', 'version': 1})) - msg = await wss.receive(timeout=900) - + await wss.receive(timeout=900) await wss.send_str(create_message(conversation, prompt, tone, context)) response_txt = '' -- cgit v1.2.3 From c8835b15d4bda70fb9530d2cf8f4dbd75eaf3cd8 Mon Sep 17 00:00:00 2001 From: abc <98614666+xtekky@users.noreply.github.com> Date: Fri, 6 Oct 2023 12:21:42 +0100 Subject: ~ --- g4f/Provider/Bing.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'g4f/Provider/Bing.py') diff --git a/g4f/Provider/Bing.py b/g4f/Provider/Bing.py index b669d800..aa2db990 100644 --- a/g4f/Provider/Bing.py +++ b/g4f/Provider/Bing.py @@ -60,9 +60,11 @@ class Conversation(): self.conversationSignature = conversationSignature async def create_conversation(session: ClientSession) -> Conversation: - url = 'https://www.bing.com/turing/conversation/create' + url = 'https://www.bing.com/turing/conversation/create?bundleVersion=1.1150.3' + async with await session.get(url) as response: data = await response.json() + conversationId = data.get('conversationId') clientId = data.get('clientId') conversationSignature = response.headers.get('X-Sydney-Encryptedconversationsignature') @@ -267,7 +269,7 @@ async def stream_generate( for obj in objects: if obj is None or not obj: continue - + response = json.loads(obj) if response.get('type') == 1 and response['arguments'][0].get('messages'): message = response['arguments'][0]['messages'][0] -- cgit v1.2.3 From af9ed889c11f2ca5f1df96c40f072012a68b5713 Mon Sep 17 00:00:00 2001 From: Heiner Lohaus Date: Fri, 6 Oct 2023 18:21:56 +0200 Subject: Fix timeout in create_async --- g4f/Provider/Bing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'g4f/Provider/Bing.py') diff --git a/g4f/Provider/Bing.py b/g4f/Provider/Bing.py index aa2db990..f4275a5f 100644 --- a/g4f/Provider/Bing.py +++ b/g4f/Provider/Bing.py @@ -250,7 +250,7 @@ async def stream_generate( conversation = await create_conversation(session) try: async with session.ws_connect( - f'wss://sydney.bing.com/sydney/ChatHub?sec_access_token={urllib.parse.quote_plus(conversation.conversationSignature)}', + f'wss://sydney.bing.com/sydney/ChatHub', autoping=False, params={'sec_access_token': conversation.conversationSignature} ) as wss: -- cgit v1.2.3