返回提交历史
Modified
README.md
+12
-12
Modified
etc/tool/readme_table.py
+8
-6
Modified
g4f/Provider/Bing.py
+2
-1
Modified
g4f/Provider/BingCreateImages.py
+1
-0
Modified
g4f/Provider/DeepInfra.py
+22
-11
Modified
g4f/Provider/DeepInfraImage.py
+1
-0
Modified
g4f/Provider/MetaAIAccount.py
+1
-0
Modified
g4f/Provider/ReplicateImage.py
+1
-0
Modified
g4f/Provider/You.py
+15
-7
Modified
g4f/Provider/needs_auth/Gemini.py
+60
-27
Modified
g4f/Provider/needs_auth/OpenaiAccount.py
+1
-0
Modified
g4f/Provider/needs_auth/OpenaiChat.py
+1
-0
Modified
g4f/gui/server/api.py
+9
-5
Modified
g4f/image.py
+8
-1
XFEstudio/gpt4free
Add vision models to readme
4bc4d635
代码差异
14 个文件
+142
-70
@@ -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
@@ -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()
@@ -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,
@@ -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
@@ -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,
@@ -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]
@@ -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
@@ -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 = [
@@ -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",
@@ -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:
@@ -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"]
@@ -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",