XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/gpt4free

Add vision models to readme

4bc4d635
Heiner Lohaus <hlohaus@users.noreply.github.com>
提交于

代码差异

14 个文件 +142 -70
Modified README.md +12 -12
@@ -91,7 +91,7 @@ As per the survey, here is a list of improvements to come
91 91
92 92 ```sh
93 93 docker pull hlohaus789/g4f
94 docker run -p 8080:8080 -p 1337:1337 -p 7900:7900 --shm-size="2g" -v ${PWD}/hardir:/app/har_and_cookies hlohaus789/g4f:latest
94 docker run -p 8080:8080 -p 1337:1337 -p 7900:7900 --shm-size="2g" -v ${PWD}/har_and_cookies:/app/har_and_cookies hlohaus789/g4f:latest
95 95 ```
96 96
97 97 3. **Access the Client:**
@@ -400,17 +400,17 @@ While we wait for gpt-5, here is a list of new models that are at least better t
400 400 | openchat_3.5 | Huggingface | 2+ Providers | [huggingface.co](https://huggingface.co/) |
401 401 | pi | Inflection | g4f.Provider.Pi | [inflection.ai](https://inflection.ai/) |
402 402
403 ### Image Models
404
405 | Label | Provider | Model | Website |
406 | ----- | -------- | ----- | ------- |
407 | Microsoft Designer | Bing | dall-e | [bing.com](https://www.bing.com/images/create) |
408 | OpenAI ChatGPT | Openai | dall-e | [chat.openai.com](https://chat.openai.com) |
409 | You.com | You | dall-e | [you.com](https://you.com) |
410 | DeepInfraImage | DeepInfra | stability-ai/sdxl | [deepinfra.com](https://deepinfra.com) |
411 | ReplicateImage | Replicate | stability-ai/sdxl | [replicate.com](https://replicate.com) |
412 | Gemini | Gemini | gemini | [gemini.google.com](https://gemini.google.com) |
413 | Meta AI | MetaAI | meta | [meta.ai](https://www.meta.ai) |
403 ### Image and Vision Models
404
405 | Label | Provider | Image Model | Vision Model | Website |
406 | ----- | -------- | ----------- | ------------ | ------- |
407 | Microsoft Copilot in Bing | `g4f.Provider.Bing` | dall-e| gpt-4-vision | [bing.com](https://bing.com/chat) |
408 | DeepInfra | `g4f.Provider.DeepInfra` | stability-ai/sdxl| llava-1.5-7b-hf | [deepinfra.com](https://deepinfra.com) |
409 | Gemini | `g4f.Provider.Gemini` | gemini| gemini | [gemini.google.com](https://gemini.google.com) |
410 | Meta AI | `g4f.Provider.MetaAI` | meta| ❌ | [meta.ai](https://www.meta.ai) |
411 | OpenAI ChatGPT | `g4f.Provider.OpenaiChat` | dall-e| gpt-4-vision | [chat.openai.com](https://chat.openai.com) |
412 | Replicate | `g4f.Provider.Replicate` | stability-ai/sdxl| ❌ | [replicate.com](https://replicate.com) |
413 | You.com | `g4f.Provider.You` | dall-e| agent | [you.com](https://you.com) |
414 414
415 415 ## 🔗 Powered by gpt4free
416 416
Modified etc/tool/readme_table.py +8 -6
@@ -127,8 +127,8 @@ def print_models():
127 127
128 128 def print_image_models():
129 129 lines = [
130 "| Label | Provider | Model | Website |",
131 "| ----- | -------- | ----- | ------- |",
130 "| Label | Provider | Image Model | Vision Model | Website |",
131 "| ----- | -------- | ----------- | ------------ | ------- |",
132 132 ]
133 133 from g4f.gui.server.api import Api
134 134 for image_model in Api.get_image_models():
@@ -136,13 +136,15 @@ def print_image_models():
136 136 netloc = urlparse(provider_url).netloc.replace("www.", "")
137 137 website = f"[{netloc}]({provider_url})"
138 138 label = image_model["provider"] if image_model["label"] is None else image_model["label"]
139 lines.append(f'| {label} | {image_model["provider"]} | {image_model["image_model"]} | {website} |')
139 if image_model["vision_model"] is None:
140 image_model["vision_model"] = "❌"
141 lines.append(f'| {label} | `g4f.Provider.{image_model["provider"]}` | {image_model["image_model"]}| {image_model["vision_model"]} | {website} |')
140 142
141 143 print("\n".join(lines))
142 144
143 145 if __name__ == "__main__":
144 print_providers()
145 print("\n", "-" * 50, "\n")
146 print_models()
146 #print_providers()
147 #print("\n", "-" * 50, "\n")
148 #print_models()
147 149 print("\n", "-" * 50, "\n")
148 150 print_image_models()
Modified g4f/Provider/Bing.py +2 -1
@@ -38,8 +38,9 @@ class Bing(AsyncGeneratorProvider, ProviderModelMixin):
38 38 supports_message_history = True
39 39 supports_gpt_4 = True
40 40 default_model = "Balanced"
41 default_vision_model = "gpt-4-vision"
41 42 models = [getattr(Tones, key) for key in Tones.__dict__ if not key.startswith("__")]
42
43
43 44 @classmethod
44 45 def create_async_generator(
45 46 cls,
Modified g4f/Provider/BingCreateImages.py +1 -0
@@ -13,6 +13,7 @@ from .bing.create_images import create_images, create_session, get_cookies_from_
13 13
14 14 class BingCreateImages(AsyncGeneratorProvider, ProviderModelMixin):
15 15 label = "Microsoft Designer"
16 parent = "Bing"
16 17 url = "https://www.bing.com/images/create"
17 18 working = True
18 19 needs_auth = True
Modified g4f/Provider/DeepInfra.py +22 -11
@@ -1,17 +1,22 @@
1 1 from __future__ import annotations
2 2
3 3 import requests
4 from ..typing import AsyncResult, Messages
4 from ..typing import AsyncResult, Messages, ImageType
5 from ..image import to_data_uri
5 6 from .needs_auth.Openai import Openai
6 7
7 8 class DeepInfra(Openai):
8 9 label = "DeepInfra"
9 10 url = "https://deepinfra.com"
10 11 working = True
11 needs_auth = False
12 has_auth = True
12 13 supports_stream = True
13 14 supports_message_history = True
14 default_model = 'HuggingFaceH4/zephyr-orpo-141b-A35b-v0.1'
15 default_model = "meta-llama/Meta-Llama-3-70b-instruct"
16 default_vision_model = "llava-hf/llava-1.5-7b-hf"
17 model_aliases = {
18 'mixtral-8x22b': 'HuggingFaceH4/zephyr-orpo-141b-A35b-v0.1'
19 }
15 20
16 21 @classmethod
17 22 def get_models(cls):
@@ -27,19 +32,12 @@ class DeepInfra(Openai):
27 32 model: str,
28 33 messages: Messages,
29 34 stream: bool,
35 image: ImageType = None,
30 36 api_base: str = "https://api.deepinfra.com/v1/openai",
31 37 temperature: float = 0.7,
32 38 max_tokens: int = 1028,
33 39 **kwargs
34 40 ) -> AsyncResult:
35
36 if not '/' in model:
37 models = {
38 'mixtral-8x22b': 'HuggingFaceH4/zephyr-orpo-141b-A35b-v0.1',
39 'dbrx-instruct': 'databricks/dbrx-instruct',
40 }
41 model = models.get(model, model)
42
43 41 headers = {
44 42 'Accept-Encoding': 'gzip, deflate, br',
45 43 'Accept-Language': 'en-US',
@@ -55,6 +53,19 @@ class DeepInfra(Openai):
55 53 'sec-ch-ua-mobile': '?0',
56 54 'sec-ch-ua-platform': '"macOS"',
57 55 }
56 if image is not None:
57 if not model:
58 model = cls.default_vision_model
59 messages[-1]["content"] = [
60 {
61 "type": "image_url",
62 "image_url": {"url": to_data_uri(image)}
63 },
64 {
65 "type": "text",
66 "text": messages[-1]["content"]
67 }
68 ]
58 69 return super().create_async_generator(
59 70 model, messages,
60 71 stream=stream,
Modified g4f/Provider/DeepInfraImage.py +1 -0
@@ -9,6 +9,7 @@ from ..image import ImageResponse
9 9
10 10 class DeepInfraImage(AsyncGeneratorProvider, ProviderModelMixin):
11 11 url = "https://deepinfra.com"
12 parent = "DeepInfra"
12 13 working = True
13 14 default_model = 'stability-ai/sdxl'
14 15 image_models = [default_model]
Modified g4f/Provider/MetaAIAccount.py +1 -0
@@ -6,6 +6,7 @@ from .MetaAI import MetaAI
6 6
7 7 class MetaAIAccount(MetaAI):
8 8 needs_auth = True
9 parent = "MetaAI"
9 10 image_models = ["meta"]
10 11
11 12 @classmethod
Modified g4f/Provider/ReplicateImage.py +1 -0
@@ -11,6 +11,7 @@ from ..errors import ResponseError
11 11
12 12 class ReplicateImage(AsyncGeneratorProvider, ProviderModelMixin):
13 13 url = "https://replicate.com"
14 parent = "Replicate"
14 15 working = True
15 16 default_model = 'stability-ai/sdxl'
16 17 default_versions = [
Modified g4f/Provider/You.py +15 -7
@@ -14,13 +14,16 @@ from .you.har_file import get_telemetry_ids
14 14 from .. import debug
15 15
16 16 class You(AsyncGeneratorProvider, ProviderModelMixin):
17 label = "You.com"
17 18 url = "https://you.com"
18 19 working = True
19 20 supports_gpt_35_turbo = True
20 21 supports_gpt_4 = True
21 22 default_model = "gpt-3.5-turbo"
23 default_vision_model = "agent"
24 image_models = ["dall-e"]
22 25 models = [
23 "gpt-3.5-turbo",
26 default_model,
24 27 "gpt-4",
25 28 "gpt-4-turbo",
26 29 "claude-instant",
@@ -29,12 +32,12 @@ class You(AsyncGeneratorProvider, ProviderModelMixin):
29 32 "claude-3-sonnet",
30 33 "gemini-pro",
31 34 "zephyr",
32 "dall-e",
35 default_vision_model,
36 *image_models
33 37 ]
34 38 model_aliases = {
35 39 "claude-v2": "claude-2"
36 40 }
37 image_models = ["dall-e"]
38 41 _cookies = None
39 42 _cookies_used = 0
40 43 _telemetry_ids = []
@@ -52,7 +55,7 @@ class You(AsyncGeneratorProvider, ProviderModelMixin):
52 55 chat_mode: str = "default",
53 56 **kwargs,
54 57 ) -> AsyncResult:
55 if image is not None:
58 if image is not None or model == cls.default_vision_model:
56 59 chat_mode = "agent"
57 60 elif not model or model == cls.default_model:
58 61 ...
@@ -63,13 +66,18 @@ class You(AsyncGeneratorProvider, ProviderModelMixin):
63 66 chat_mode = "custom"
64 67 model = cls.get_model(model)
65 68 async with StreamSession(
66 proxies={"all": proxy},
69 proxy=proxy,
67 70 impersonate="chrome",
68 71 timeout=(30, timeout)
69 72 ) as session:
70 73 cookies = await cls.get_cookies(session) if chat_mode != "default" else None
71
72 upload = json.dumps([await cls.upload_file(session, cookies, to_bytes(image), image_name)]) if image else ""
74 upload = ""
75 if image is not None:
76 upload_file = await cls.upload_file(
77 session, cookies,
78 to_bytes(image), image_name
79 )
80 upload = json.dumps([upload_file])
73 81 headers = {
74 82 "Accept": "text/event-stream",
75 83 "Referer": f"{cls.url}/search?fromSearchBar=true&tbm=youchat",
Modified g4f/Provider/needs_auth/Gemini.py +60 -27
@@ -16,6 +16,7 @@ try:
16 16 except ImportError:
17 17 pass
18 18
19 from ... import debug
19 20 from ...typing import Messages, Cookies, ImageType, AsyncResult
20 21 from ..base_provider import AsyncGeneratorProvider
21 22 from ..helper import format_prompt, get_cookies
@@ -54,6 +55,55 @@ class Gemini(AsyncGeneratorProvider):
54 55 needs_auth = True
55 56 working = True
56 57 image_models = ["gemini"]
58 default_vision_model = "gemini"
59 _cookies: Cookies = None
60
61 @classmethod
62 async def nodriver_login(cls) -> Cookies:
63 try:
64 import nodriver as uc
65 except ImportError:
66 return
67 try:
68 from platformdirs import user_config_dir
69 user_data_dir = user_config_dir("g4f-nodriver")
70 except:
71 user_data_dir = None
72 if debug.logging:
73 print(f"Open nodriver with user_dir: {user_data_dir}")
74 browser = await uc.start(user_data_dir=user_data_dir)
75 page = await browser.get(f"{cls.url}/app")
76 await page.select("div.ql-editor.textarea", 240)
77 cookies = {}
78 for c in await page.browser.cookies.get_all():
79 if c.domain.endswith(".google.com"):
80 cookies[c.name] = c.value
81 await page.close()
82 return cookies
83
84 @classmethod
85 async def webdriver_login(cls, proxy: str):
86 driver = None
87 try:
88 driver = get_browser(proxy=proxy)
89 try:
90 driver.get(f"{cls.url}/app")
91 WebDriverWait(driver, 5).until(
92 EC.visibility_of_element_located((By.CSS_SELECTOR, "div.ql-editor.textarea"))
93 )
94 except:
95 login_url = os.environ.get("G4F_LOGIN_URL")
96 if login_url:
97 yield f"Please login: [Google Gemini]({login_url})\n\n"
98 WebDriverWait(driver, 240).until(
99 EC.visibility_of_element_located((By.CSS_SELECTOR, "div.ql-editor.textarea"))
100 )
101 cls._cookies = get_driver_cookies(driver)
102 except MissingRequirementsError:
103 pass
104 finally:
105 if driver:
106 driver.close()
57 107
58 108 @classmethod
59 109 async def create_async_generator(
@@ -73,47 +123,30 @@ class Gemini(AsyncGeneratorProvider):
73 123 if cookies is None:
74 124 cookies = {}
75 125 cookies["__Secure-1PSID"] = api_key
76 cookies = cookies if cookies else get_cookies(".google.com", False, True)
126 cls._cookies = cookies or cls._cookies or get_cookies(".google.com", False, True)
77 127 base_connector = get_connector(connector, proxy)
78 128 async with ClientSession(
79 129 headers=REQUEST_HEADERS,
80 130 connector=base_connector
81 131 ) as session:
82 snlm0e = await cls.fetch_snlm0e(session, cookies) if cookies else None
132 snlm0e = await cls.fetch_snlm0e(session, cls._cookies) if cls._cookies else None
83 133 if not snlm0e:
84 driver = None
85 try:
86 driver = get_browser(proxy=proxy)
87 try:
88 driver.get(f"{cls.url}/app")
89 WebDriverWait(driver, 5).until(
90 EC.visibility_of_element_located((By.CSS_SELECTOR, "div.ql-editor.textarea"))
91 )
92 except:
93 login_url = os.environ.get("G4F_LOGIN_URL")
94 if login_url:
95 yield f"Please login: [Google Gemini]({login_url})\n\n"
96 WebDriverWait(driver, 240).until(
97 EC.visibility_of_element_located((By.CSS_SELECTOR, "div.ql-editor.textarea"))
98 )
99 cookies = get_driver_cookies(driver)
100 except MissingRequirementsError:
101 pass
102 finally:
103 if driver:
104 driver.close()
134 cls._cookies = await cls.nodriver_login();
135 if cls._cookies is None:
136 async for chunk in cls.webdriver_login(proxy):
137 yield chunk
105 138
106 139 if not snlm0e:
107 if "__Secure-1PSID" not in cookies:
140 if "__Secure-1PSID" not in cls._cookies:
108 141 raise MissingAuthError('Missing "__Secure-1PSID" cookie')
109 snlm0e = await cls.fetch_snlm0e(session, cookies)
142 snlm0e = await cls.fetch_snlm0e(session, cls._cookies)
110 143 if not snlm0e:
111 raise RuntimeError("Invalid auth. SNlM0e not found")
144 raise RuntimeError("Invalid cookies. SNlM0e not found")
112 145
113 146 image_url = await cls.upload_image(base_connector, to_bytes(image), image_name) if image else None
114 147
115 148 async with ClientSession(
116 cookies=cookies,
149 cookies=cls._cookies,
117 150 headers=REQUEST_HEADERS,
118 151 connector=base_connector,
119 152 ) as client:
Modified g4f/Provider/needs_auth/OpenaiAccount.py +1 -0
@@ -4,4 +4,5 @@ from .OpenaiChat import OpenaiChat
4 4
5 5 class OpenaiAccount(OpenaiChat):
6 6 needs_auth = True
7 parent = "OpenaiChat"
7 8 image_models = ["dall-e"]
Modified g4f/Provider/needs_auth/OpenaiChat.py +1 -0
@@ -44,6 +44,7 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin):
44 44 supports_message_history = True
45 45 supports_system_message = True
46 46 default_model = None
47 default_vision_model = "gpt-4-vision"
47 48 models = ["gpt-3.5-turbo", "gpt-4", "gpt-4-gizmo"]
48 49 model_aliases = {
49 50 "text-davinci-002-render-sha": "gpt-3.5-turbo",
Modified g4f/gui/server/api.py +9 -5
Modified g4f/image.py +8 -1