diff options
Diffstat (limited to 'g4f/Provider')
-rw-r--r-- | g4f/Provider/Copilot.py | 16 | ||||
-rw-r--r-- | g4f/Provider/You.py | 82 | ||||
-rw-r--r-- | g4f/Provider/needs_auth/DeepInfraImage.py | 2 |
3 files changed, 20 insertions, 80 deletions
diff --git a/g4f/Provider/Copilot.py b/g4f/Provider/Copilot.py index c79f028d..e40278c7 100644 --- a/g4f/Provider/Copilot.py +++ b/g4f/Provider/Copilot.py @@ -15,17 +15,13 @@ try: has_nodriver = True except ImportError: has_nodriver = False -try: - from platformdirs import user_config_dir - has_platformdirs = True -except ImportError: - has_platformdirs = False from .base_provider import AbstractProvider, BaseConversation from .helper import format_prompt from ..typing import CreateResult, Messages, ImageType from ..errors import MissingRequirementsError from ..requests.raise_for_status import raise_for_status +from ..requests import get_nodriver from ..image import to_bytes, is_accepted_format from .. import debug @@ -130,6 +126,7 @@ class Copilot(AbstractProvider): except: break if msg.get("event") == "appendText": + is_started = True yield msg.get("text") elif msg.get("event") in ["done", "partCompleted"]: break @@ -138,14 +135,7 @@ class Copilot(AbstractProvider): @classmethod async def get_access_token_and_cookies(cls, proxy: str = None): - if not has_nodriver: - raise MissingRequirementsError('Install "nodriver" package | pip install -U nodriver') - user_data_dir = user_config_dir("g4f-nodriver") if has_platformdirs else None - debug.log(f"Copilot: Open nodriver with user_dir: {user_data_dir}") - browser = await nodriver.start( - user_data_dir=user_data_dir, - browser_args=None if proxy is None else [f"--proxy-server={proxy}"], - ) + browser = await get_nodriver(proxy=proxy) page = await browser.get(cls.url) access_token = None while access_token is None: diff --git a/g4f/Provider/You.py b/g4f/Provider/You.py index 02735038..095d638f 100644 --- a/g4f/Provider/You.py +++ b/g4f/Provider/You.py @@ -2,15 +2,15 @@ from __future__ import annotations import re import json -import base64 import uuid from ..typing import AsyncResult, Messages, ImageType, Cookies from .base_provider import AsyncGeneratorProvider, ProviderModelMixin from .helper import format_prompt from ..image import ImageResponse, ImagePreview, EXTENSIONS_MAP, to_bytes, is_accepted_format -from ..requests import StreamSession, FormData, raise_for_status -from .you.har_file import get_telemetry_ids +from ..requests import StreamSession, FormData, raise_for_status, get_nodriver +from ..cookies import get_cookies +from ..errors import MissingRequirementsError from .. import debug class You(AsyncGeneratorProvider, ProviderModelMixin): @@ -57,6 +57,7 @@ class You(AsyncGeneratorProvider, ProviderModelMixin): proxy: str = None, timeout: int = 240, chat_mode: str = "default", + cookies: Cookies = None, **kwargs, ) -> AsyncResult: if image is not None or model == cls.default_vision_model: @@ -69,12 +70,22 @@ class You(AsyncGeneratorProvider, ProviderModelMixin): else: chat_mode = "custom" model = cls.get_model(model) + if cookies is None and chat_mode != "default": + try: + cookies = get_cookies(".you.com") + except MissingRequirementsError: + browser = await get_nodriver(proxy=proxy) + page = await browser.get(cls.url) + await page.wait_for('[data-testid="user-profile-button"]', timeout=900) + cookies = {} + for c in await page.send(nodriver.cdp.network.get_cookies([cls.url])): + cookies[c.name] = c.value + await page.close() async with StreamSession( proxy=proxy, impersonate="chrome", timeout=(30, timeout) ) as session: - cookies = await cls.get_cookies(session) if chat_mode != "default" else None upload = "" if image is not None: upload_file = await cls.upload_file( @@ -156,65 +167,4 @@ class You(AsyncGeneratorProvider, ProviderModelMixin): result = await response.json() result["user_filename"] = filename result["size"] = len(file) - return result - - @classmethod - async def get_cookies(cls, client: StreamSession) -> Cookies: - if not cls._cookies or cls._cookies_used >= 5: - cls._cookies = await cls.create_cookies(client) - cls._cookies_used = 0 - cls._cookies_used += 1 - return cls._cookies - - @classmethod - def get_sdk(cls) -> str: - return base64.standard_b64encode(json.dumps({ - "event_id":f"event-id-{str(uuid.uuid4())}", - "app_session_id":f"app-session-id-{str(uuid.uuid4())}", - "persistent_id":f"persistent-id-{uuid.uuid4()}", - "client_sent_at":"","timezone":"", - "stytch_user_id":f"user-live-{uuid.uuid4()}", - "stytch_session_id":f"session-live-{uuid.uuid4()}", - "app":{"identifier":"you.com"}, - "sdk":{"identifier":"Stytch.js Javascript SDK","version":"3.3.0" - }}).encode()).decode() - - def get_auth() -> str: - auth_uuid = "507a52ad-7e69-496b-aee0-1c9863c7c819" - auth_token = f"public-token-live-{auth_uuid}:public-token-live-{auth_uuid}" - auth = base64.standard_b64encode(auth_token.encode()).decode() - return f"Basic {auth}" - - @classmethod - async def create_cookies(cls, client: StreamSession) -> Cookies: - if not cls._telemetry_ids: - cls._telemetry_ids = await get_telemetry_ids() - user_uuid = str(uuid.uuid4()) - telemetry_id = cls._telemetry_ids.pop() - if debug.logging: - print(f"Use telemetry_id: {telemetry_id}") - async with client.post( - "https://web.stytch.com/sdk/v1/passwords", - headers={ - "Authorization": cls.get_auth(), - "X-SDK-Client": cls.get_sdk(), - "X-SDK-Parent-Host": cls.url, - "Origin": "https://you.com", - "Referer": "https://you.com/" - }, - json={ - "dfp_telemetry_id": telemetry_id, - "email": f"{user_uuid}@gmail.com", - "password": f"{user_uuid}#{user_uuid}", - "session_duration_minutes": 129600 - } - ) as response: - await raise_for_status(response) - session = (await response.json())["data"] - - return { - "stytch_session": session["session_token"], - 'stytch_session_jwt': session["session_jwt"], - 'ydc_stytch_session': session["session_token"], - 'ydc_stytch_session_jwt': session["session_jwt"], - } + return result
\ No newline at end of file diff --git a/g4f/Provider/needs_auth/DeepInfraImage.py b/g4f/Provider/needs_auth/DeepInfraImage.py index 2310c1c8..24df04e3 100644 --- a/g4f/Provider/needs_auth/DeepInfraImage.py +++ b/g4f/Provider/needs_auth/DeepInfraImage.py @@ -73,7 +73,7 @@ class DeepInfraImage(AsyncGeneratorProvider, ProviderModelMixin): async with session.post(f"{api_base.rstrip('/')}/{model}", json=data) as response: await raise_for_status(response) data = await response.json() - images = data["output"] if "output" in data else data["images"] + images = data.get("output", data.get("images")) if not images: raise RuntimeError(f"Response: {data}") images = images[0] if len(images) == 1 else images |