|
|
|
@ -6,7 +6,7 @@ import os
|
|
|
|
|
import uuid
|
|
|
|
|
import time
|
|
|
|
|
from urllib import parse
|
|
|
|
|
from aiohttp import ClientSession, ClientTimeout
|
|
|
|
|
from aiohttp import ClientSession, ClientTimeout, BaseConnector
|
|
|
|
|
|
|
|
|
|
from ..typing import AsyncResult, Messages, ImageType
|
|
|
|
|
from ..image import ImageResponse
|
|
|
|
@ -39,6 +39,7 @@ class Bing(AsyncGeneratorProvider):
|
|
|
|
|
proxy: str = None,
|
|
|
|
|
timeout: int = 900,
|
|
|
|
|
cookies: dict = None,
|
|
|
|
|
connector: BaseConnector = None,
|
|
|
|
|
tone: str = Tones.balanced,
|
|
|
|
|
image: ImageType = None,
|
|
|
|
|
web_search: bool = False,
|
|
|
|
@ -67,8 +68,15 @@ class Bing(AsyncGeneratorProvider):
|
|
|
|
|
cookies = {**Defaults.cookies, **cookies} if cookies else Defaults.cookies
|
|
|
|
|
|
|
|
|
|
gpt4_turbo = True if model.startswith("gpt-4-turbo") else False
|
|
|
|
|
|
|
|
|
|
if proxy and not connector:
|
|
|
|
|
try:
|
|
|
|
|
from aiohttp_socks import ProxyConnector
|
|
|
|
|
connector = ProxyConnector.from_url(proxy)
|
|
|
|
|
except ImportError:
|
|
|
|
|
raise RuntimeError('Install "aiohttp_socks" package for proxy support')
|
|
|
|
|
|
|
|
|
|
return stream_generate(prompt, tone, image, context, proxy, cookies, web_search, gpt4_turbo, timeout)
|
|
|
|
|
return stream_generate(prompt, tone, image, context, cookies, connector, web_search, gpt4_turbo, timeout)
|
|
|
|
|
|
|
|
|
|
def create_context(messages: Messages) -> str:
|
|
|
|
|
"""
|
|
|
|
@ -253,8 +261,8 @@ async def stream_generate(
|
|
|
|
|
tone: str,
|
|
|
|
|
image: ImageType = None,
|
|
|
|
|
context: str = None,
|
|
|
|
|
proxy: str = None,
|
|
|
|
|
cookies: dict = None,
|
|
|
|
|
connector: BaseConnector = None,
|
|
|
|
|
web_search: bool = False,
|
|
|
|
|
gpt4_turbo: bool = False,
|
|
|
|
|
timeout: int = 900
|
|
|
|
@ -266,7 +274,6 @@ async def stream_generate(
|
|
|
|
|
:param tone: The desired tone for the response.
|
|
|
|
|
:param image: The image type involved in the response.
|
|
|
|
|
:param context: Additional context for the prompt.
|
|
|
|
|
:param proxy: Proxy settings for the request.
|
|
|
|
|
:param cookies: Cookies for the session.
|
|
|
|
|
:param web_search: Flag to enable web search.
|
|
|
|
|
:param gpt4_turbo: Flag to enable GPT-4 Turbo.
|
|
|
|
@ -278,10 +285,10 @@ async def stream_generate(
|
|
|
|
|
headers["Cookie"] = "; ".join(f"{k}={v}" for k, v in cookies.items())
|
|
|
|
|
|
|
|
|
|
async with ClientSession(
|
|
|
|
|
timeout=ClientTimeout(total=timeout), headers=headers
|
|
|
|
|
timeout=ClientTimeout(total=timeout), headers=headers, connector=connector
|
|
|
|
|
) as session:
|
|
|
|
|
conversation = await create_conversation(session, proxy)
|
|
|
|
|
image_response = await upload_image(session, image, tone, proxy) if image else None
|
|
|
|
|
conversation = await create_conversation(session)
|
|
|
|
|
image_response = await upload_image(session, image, tone) if image else None
|
|
|
|
|
if image_response:
|
|
|
|
|
yield image_response
|
|
|
|
|
|
|
|
|
@ -289,8 +296,7 @@ async def stream_generate(
|
|
|
|
|
async with session.ws_connect(
|
|
|
|
|
'wss://sydney.bing.com/sydney/ChatHub',
|
|
|
|
|
autoping=False,
|
|
|
|
|
params={'sec_access_token': conversation.conversationSignature},
|
|
|
|
|
proxy=proxy
|
|
|
|
|
params={'sec_access_token': conversation.conversationSignature}
|
|
|
|
|
) as wss:
|
|
|
|
|
await wss.send_str(format_message({'protocol': 'json', 'version': 1}))
|
|
|
|
|
await wss.receive(timeout=timeout)
|
|
|
|
@ -322,7 +328,7 @@ async def stream_generate(
|
|
|
|
|
elif message.get('contentType') == "IMAGE":
|
|
|
|
|
prompt = message.get('text')
|
|
|
|
|
try:
|
|
|
|
|
image_response = ImageResponse(await create_images(session, prompt, proxy), prompt)
|
|
|
|
|
image_response = ImageResponse(await create_images(session, prompt), prompt)
|
|
|
|
|
except:
|
|
|
|
|
response_txt += f"\nhttps://www.bing.com/images/create?q={parse.quote(prompt)}"
|
|
|
|
|
final = True
|
|
|
|
@ -342,4 +348,4 @@ async def stream_generate(
|
|
|
|
|
raise Exception(f"{result['value']}: {result['message']}")
|
|
|
|
|
return
|
|
|
|
|
finally:
|
|
|
|
|
await delete_conversation(session, conversation, proxy)
|
|
|
|
|
await delete_conversation(session, conversation)
|
|
|
|
|