diff options
-rw-r--r-- | README.md | 15 | ||||
-rw-r--r-- | g4f/Provider/needs_auth/OpenaiChat.py | 25 | ||||
-rw-r--r-- | setup.py | 2 |
3 files changed, 34 insertions, 8 deletions
@@ -358,6 +358,21 @@ response = g4f.ChatCompletion.create( # Displaying the response print(response) + +from g4f.image import ImageResponse + +# Get image links from response +for chunk in g4f.ChatCompletion.create( + model=g4f.models.default, # Using the default model + provider=g4f.Provider.OpenaiChat, # Specifying the provider as OpenaiChat + messages=[{"role": "user", "content": "Create images with dogs"}], + access_token="...", # Need a access token from a plus user + stream=True, + ignore_stream=True +): + if isinstance(chunk, ImageResponse): + print(chunk.images) # Print generated image links + print(chunk.alt) # Print used prompt for image generation ``` ##### Using Browser diff --git a/g4f/Provider/needs_auth/OpenaiChat.py b/g4f/Provider/needs_auth/OpenaiChat.py index 32aee9fb..c122da46 100644 --- a/g4f/Provider/needs_auth/OpenaiChat.py +++ b/g4f/Provider/needs_auth/OpenaiChat.py @@ -342,26 +342,30 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin): raise MissingAuthError(f'Missing "access_token"') cls._cookies = cookies - headers = {"Authorization": f"Bearer {access_token}"} + auth_headers = {"Authorization": f"Bearer {access_token}"} async with StreamSession( proxies={"https": proxy}, impersonate="chrome110", timeout=timeout, - cookies=dict([(name, value) for name, value in cookies.items() if name == "_puid"]) + headers={"Cookie": "; ".join(f"{k}={v}" for k, v in cookies.items())} ) as session: try: image_response = None if image: - image_response = await cls.upload_image(session, headers, image, kwargs.get("image_name")) + image_response = await cls.upload_image(session, auth_headers, image, kwargs.get("image_name")) except Exception as e: yield e end_turn = EndTurn() - model = cls.get_model(model or await cls.get_default_model(session, headers)) + model = cls.get_model(model or await cls.get_default_model(session, auth_headers)) model = "text-davinci-002-render-sha" if model == "gpt-3.5-turbo" else model while not end_turn.is_end: + arkose_token = await cls.get_arkose_token(session) data = { "action": action, - "arkose_token": await cls.get_arkose_token(session), + "arkose_token": arkose_token, + "conversation_mode": {"kind": "primary_assistant"}, + "force_paragen": False, + "force_rate_limit": False, "conversation_id": conversation_id, "parent_message_id": parent_id, "model": model, @@ -373,7 +377,11 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin): async with session.post( f"{cls.url}/backend-api/conversation", json=data, - headers={"Accept": "text/event-stream", **headers} + headers={ + "Accept": "text/event-stream", + "OpenAI-Sentinel-Arkose-Token": arkose_token, + **auth_headers + } ) as response: if not response.ok: raise RuntimeError(f"Response {response.status_code}: {await response.text()}") @@ -439,7 +447,8 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin): Returns: tuple[str, dict]: A tuple containing the access token and cookies. """ - with get_browser(proxy=proxy) as driver: + driver = get_browser(proxy=proxy) + try: driver.get(f"{cls.url}/") WebDriverWait(driver, timeout).until(EC.presence_of_element_located((By.ID, "prompt-textarea"))) access_token = driver.execute_script( @@ -451,6 +460,8 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin): "return accessToken;" ) return access_token, get_driver_cookies(driver) + finally: + driver.close() @classmethod async def get_arkose_token(cls, session: StreamSession) -> str: @@ -15,7 +15,7 @@ INSTALL_REQUIRE = [ EXTRA_REQUIRE = { 'all': [ - "curl_cffi>=0.5.10", + "curl_cffi>=0.6.0b9", "certifi", "async-property", # openai "py-arkose-generator", # openai |