From 6a624acf5589cf61e1cfe6ad9ccf104c7c97f175 Mon Sep 17 00:00:00 2001 From: Heiner Lohaus Date: Sat, 7 Dec 2024 19:38:04 +0100 Subject: Use custom user data dir for each provider Reuse cookies and access token in Copilot Send in the gui messages to multiple providers at once Add GUI documenation --- g4f/Provider/Copilot.py | 38 ++++++++++++++-------------- g4f/Provider/needs_auth/BingCreateImages.py | 4 +-- g4f/Provider/needs_auth/Gemini.py | 2 +- g4f/Provider/needs_auth/MicrosoftDesigner.py | 2 +- g4f/Provider/needs_auth/OpenaiChat.py | 2 +- 5 files changed, 24 insertions(+), 24 deletions(-) (limited to 'g4f/Provider') diff --git a/g4f/Provider/Copilot.py b/g4f/Provider/Copilot.py index ee9daf33..23f175ac 100644 --- a/g4f/Provider/Copilot.py +++ b/g4f/Provider/Copilot.py @@ -29,13 +29,9 @@ from .. import debug class Conversation(BaseConversation): conversation_id: str - cookie_jar: CookieJar - access_token: str - def __init__(self, conversation_id: str, cookie_jar: CookieJar, access_token: str = None): + def __init__(self, conversation_id: str): self.conversation_id = conversation_id - self.cookie_jar = cookie_jar - self.access_token = access_token class Copilot(AbstractProvider, ProviderModelMixin): label = "Microsoft Copilot" @@ -50,6 +46,9 @@ class Copilot(AbstractProvider, ProviderModelMixin): websocket_url = "wss://copilot.microsoft.com/c/api/chat?api-version=2" conversation_url = f"{url}/c/api/conversations" + + _access_token: str = None + _cookies: CookieJar = None @classmethod def create_completion( @@ -69,42 +68,43 @@ class Copilot(AbstractProvider, ProviderModelMixin): raise MissingRequirementsError('Install or update "curl_cffi" package | pip install -U curl_cffi') websocket_url = cls.websocket_url - access_token = None headers = None - cookies = conversation.cookie_jar if conversation is not None else None if cls.needs_auth or image is not None: - if conversation is None or conversation.access_token is None: + if cls._access_token is None: try: - access_token, cookies = readHAR(cls.url) + cls._access_token, cls._cookies = readHAR(cls.url) except NoValidHarFileError as h: debug.log(f"Copilot: {h}") try: get_running_loop(check_nested=True) - access_token, cookies = asyncio.run(get_access_token_and_cookies(cls.url, proxy)) + cls._access_token, cls._cookies = asyncio.run(get_access_token_and_cookies(cls.url, proxy)) except MissingRequirementsError: raise h - else: - access_token = conversation.access_token - debug.log(f"Copilot: Access token: {access_token[:7]}...{access_token[-5:]}") - websocket_url = f"{websocket_url}&accessToken={quote(access_token)}" - headers = {"authorization": f"Bearer {access_token}"} + debug.log(f"Copilot: Access token: {cls._access_token[:7]}...{cls._access_token[-5:]}") + websocket_url = f"{websocket_url}&accessToken={quote(cls._access_token)}" + headers = {"authorization": f"Bearer {cls._access_token}"} with Session( timeout=timeout, proxy=proxy, impersonate="chrome", headers=headers, - cookies=cookies, + cookies=cls._cookies, ) as session: + if cls._access_token is not None: + cls._cookies = session.cookies.jar response = session.get("https://copilot.microsoft.com/c/api/user") raise_for_status(response) - debug.log(f"Copilot: User: {response.json().get('firstName', 'null')}") + user = response.json().get('firstName') + if user is None: + cls._access_token = None + debug.log(f"Copilot: User: {user or 'null'}") if conversation is None: response = session.post(cls.conversation_url) raise_for_status(response) conversation_id = response.json().get("id") if return_conversation: - yield Conversation(conversation_id, session.cookies.jar, access_token) + yield Conversation(conversation_id) prompt = format_prompt(messages) debug.log(f"Copilot: Created conversation: {conversation_id}") else: @@ -162,7 +162,7 @@ class Copilot(AbstractProvider, ProviderModelMixin): raise RuntimeError(f"Invalid response: {last_msg}") async def get_access_token_and_cookies(url: str, proxy: str = None, target: str = "ChatAI",): - browser = await get_nodriver(proxy=proxy) + browser = await get_nodriver(proxy=proxy, user_data_dir="copilot") page = await browser.get(url) access_token = None while access_token is None: diff --git a/g4f/Provider/needs_auth/BingCreateImages.py b/g4f/Provider/needs_auth/BingCreateImages.py index b95a78c3..c2d403d7 100644 --- a/g4f/Provider/needs_auth/BingCreateImages.py +++ b/g4f/Provider/needs_auth/BingCreateImages.py @@ -9,11 +9,11 @@ from ..bing.create_images import create_images, create_session class BingCreateImages(AsyncGeneratorProvider, ProviderModelMixin): label = "Microsoft Designer in Bing" - parent = "Bing" url = "https://www.bing.com/images/create" working = True needs_auth = True - image_models = ["dall-e"] + image_models = ["dall-e-3"] + models = image_models def __init__(self, cookies: Cookies = None, proxy: str = None, api_key: str = None) -> None: if api_key is not None: diff --git a/g4f/Provider/needs_auth/Gemini.py b/g4f/Provider/needs_auth/Gemini.py index 3c842f3c..85b4ad0b 100644 --- a/g4f/Provider/needs_auth/Gemini.py +++ b/g4f/Provider/needs_auth/Gemini.py @@ -69,7 +69,7 @@ class Gemini(AsyncGeneratorProvider): if debug.logging: print("Skip nodriver login in Gemini provider") return - browser = await get_nodriver(proxy=proxy) + browser = await get_nodriver(proxy=proxy, user_data_dir="gemini") login_url = os.environ.get("G4F_LOGIN_URL") if login_url: yield f"Please login: [Google Gemini]({login_url})\n\n" diff --git a/g4f/Provider/needs_auth/MicrosoftDesigner.py b/g4f/Provider/needs_auth/MicrosoftDesigner.py index 715f11ac..57b96e2d 100644 --- a/g4f/Provider/needs_auth/MicrosoftDesigner.py +++ b/g4f/Provider/needs_auth/MicrosoftDesigner.py @@ -142,7 +142,7 @@ def readHAR(url: str) -> tuple[str, str]: return api_key, user_agent async def get_access_token_and_user_agent(url: str, proxy: str = None): - browser = await get_nodriver(proxy=proxy) + browser = await get_nodriver(proxy=proxy, user_data_dir="designer") page = await browser.get(url) user_agent = await page.evaluate("navigator.userAgent") access_token = None diff --git a/g4f/Provider/needs_auth/OpenaiChat.py b/g4f/Provider/needs_auth/OpenaiChat.py index d9ed6078..3ce5b1a1 100644 --- a/g4f/Provider/needs_auth/OpenaiChat.py +++ b/g4f/Provider/needs_auth/OpenaiChat.py @@ -510,7 +510,7 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin): @classmethod async def nodriver_auth(cls, proxy: str = None): - browser = await get_nodriver(proxy=proxy) + browser = await get_nodriver(proxy=proxy, user_data_dir="chatgpt") page = browser.main_tab def on_request(event: nodriver.cdp.network.RequestWillBeSent): if event.request.url == start_url or event.request.url.startswith(conversation_url): -- cgit v1.2.3