From ba60296677cdddb622fad71f957ecf1e442a0fca Mon Sep 17 00:00:00 2001 From: hlohaus <983577+hlohaus@users.noreply.github.com> Date: Sat, 22 Feb 2025 13:19:52 +0100 Subject: Fix unittest, update model lists --- g4f/Provider/PollinationsAI.py | 5 +- g4f/Provider/PollinationsImage.py | 1 - g4f/Provider/needs_auth/Gemini.py | 38 +++++++++++-- g4f/gui/client/index.html | 46 +-------------- g4f/gui/client/static/css/style.css | 14 +++++ g4f/gui/client/static/js/chat.v1.js | 101 ++++++++++++++++++++------------- g4f/gui/client/static/js/photoswipe.js | 63 ++++++++++++++++++++ g4f/gui/server/api.py | 4 ++ g4f/gui/server/backend_api.py | 8 +-- g4f/models.py | 2 +- g4f/requests/curl_cffi.py | 1 + g4f/tools/files.py | 4 +- 12 files changed, 187 insertions(+), 100 deletions(-) create mode 100644 g4f/gui/client/static/js/photoswipe.js (limited to 'g4f') diff --git a/g4f/Provider/PollinationsAI.py b/g4f/Provider/PollinationsAI.py index 43f7a934..10242ff4 100644 --- a/g4f/Provider/PollinationsAI.py +++ b/g4f/Provider/PollinationsAI.py @@ -39,7 +39,7 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin): default_model = "openai" default_image_model = "flux" default_vision_model = "gpt-4o" - extra_image_models = ["flux-pro", "flux-dev", "flux-schnell", "midjourney", "dall-e-3"] + image_models = ["flux-pro", "flux-dev", "flux-schnell", "midjourney", "dall-e-3", "turbo"] vision_models = [default_vision_model, "gpt-4o-mini"] extra_text_models = ["claude", "claude-email", "deepseek-reasoner", "deepseek-r1"] + vision_models model_aliases = { @@ -67,7 +67,6 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin): "sdxl-turbo": "turbo", } text_models = [] - image_models = [] @classmethod def get_models(cls, **kwargs): @@ -76,7 +75,7 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin): image_response = requests.get("https://image.pollinations.ai/models") image_response.raise_for_status() new_image_models = image_response.json() - cls.image_models = list(dict.fromkeys([*cls.extra_image_models, *new_image_models])) + cls.image_models = list(dict.fromkeys([*cls.image_models, *new_image_models])) text_response = requests.get("https://text.pollinations.ai/models") text_response.raise_for_status() diff --git a/g4f/Provider/PollinationsImage.py b/g4f/Provider/PollinationsImage.py index bdbc2035..591de7e7 100644 --- a/g4f/Provider/PollinationsImage.py +++ b/g4f/Provider/PollinationsImage.py @@ -10,7 +10,6 @@ class PollinationsImage(PollinationsAI): default_model = "flux" default_vision_model = None default_image_model = default_model - image_models = [default_image_model] @classmethod def get_models(cls, **kwargs): diff --git a/g4f/Provider/needs_auth/Gemini.py b/g4f/Provider/needs_auth/Gemini.py index 1e954183..077fa927 100644 --- a/g4f/Provider/needs_auth/Gemini.py +++ b/g4f/Provider/needs_auth/Gemini.py @@ -19,7 +19,7 @@ from ... import debug from ...typing import Messages, Cookies, ImagesType, AsyncResult, AsyncIterator from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin from ..helper import format_prompt, get_cookies -from ...providers.response import JsonConversation, SynthesizeData, RequestLogin, ImageResponse +from ...providers.response import JsonConversation, Reasoning, RequestLogin, ImageResponse from ...requests.raise_for_status import raise_for_status from ...requests.aiohttp import get_connector from ...requests import get_nodriver @@ -53,6 +53,17 @@ UPLOAD_IMAGE_HEADERS = { "x-tenant-id": "bard-storage", } +models = { + "gemini-2.0-flash": {"x-goog-ext-525001261-jspb": '[null,null,null,null,"f299729663a2343f"]'}, + "gemini-2.0-flash-exp": {"x-goog-ext-525001261-jspb": '[null,null,null,null,"f299729663a2343f"]'}, + "gemini-2.0-flash-thinking": {"x-goog-ext-525001261-jspb": '[null,null,null,null,"9c17b1863f581b8a"]'}, + "gemini-2.0-flash-thinking-with-apps": {"x-goog-ext-525001261-jspb": '[null,null,null,null,"f8f8f5ea629f5d37"]'}, + "gemini-2.0-exp-advanced": {"x-goog-ext-525001261-jspb": '[null,null,null,null,"b1e46a6037e6aa9f"]'}, + "gemini-1.5-flash": {"x-goog-ext-525001261-jspb": '[null,null,null,null,"418ab5ea040b5c43"]'}, + "gemini-1.5-pro": {"x-goog-ext-525001261-jspb": '[null,null,null,null,"9d60dfae93c9ff1f"]'}, + "gemini-1.5-pro-research": {"x-goog-ext-525001261-jspb": '[null,null,null,null,"e5a44cb1dae2b489"]'}, +} + class Gemini(AsyncGeneratorProvider, ProviderModelMixin): label = "Google Gemini" url = "https://gemini.google.com" @@ -61,11 +72,14 @@ class Gemini(AsyncGeneratorProvider, ProviderModelMixin): working = True use_nodriver = True - default_model = 'gemini' + default_model = "" default_image_model = default_model default_vision_model = default_model image_models = [default_image_model] - models = [default_model, "gemini-2.0"] + models = [ + default_model, *models.keys() + ] + model_aliases = {"gemini-2.0": ""} synthesize_content_type = "audio/vnd.wav" @@ -131,7 +145,6 @@ class Gemini(AsyncGeneratorProvider, ProviderModelMixin): if not cls._snlm0e: raise RuntimeError("Invalid cookies. SNlM0e not found") - yield SynthesizeData(cls.__name__, {"text": messages[-1]["content"]}) images = await cls.upload_images(base_connector, images) if images else None async with ClientSession( cookies=cls._cookies, @@ -158,6 +171,7 @@ class Gemini(AsyncGeneratorProvider, ProviderModelMixin): REQUEST_URL, data=data, params=params, + headers=models[model] if model in models else None ) as response: await raise_for_status(response) image_prompt = response_part = None @@ -177,7 +191,23 @@ class Gemini(AsyncGeneratorProvider, ProviderModelMixin): continue if return_conversation: yield Conversation(response_part[1][0], response_part[1][1], response_part[4][0][0]) + def read_recusive(data): + for item in data: + if isinstance(item, list): + yield from read_recusive(item) + elif isinstance(item, str) and not item.startswith("rc_"): + yield item + def first_str(data, skip=0): + for item in read_recusive(data): + if skip > 0: + skip -= 1 + continue + yield item + reasoning = "".join(first_str(response_part[4][0], 3)) content = response_part[4][0][1][0] + if reasoning: + yield Reasoning(status="🤔") + yield Reasoning(reasoning) except (ValueError, KeyError, TypeError, IndexError) as e: debug.error(f"{cls.__name__} {type(e).__name__}: {e}") continue diff --git a/g4f/gui/client/index.html b/g4f/gui/client/index.html index a0def867..f007a084 100644 --- a/g4f/gui/client/index.html +++ b/g4f/gui/client/index.html @@ -49,51 +49,7 @@ document.head.appendChild(template.content); } - +