返回提交历史
Modified
g4f/Provider/PollinationsAI.py
+20
-12
Modified
g4f/Provider/PollinationsImage.py
+4
-4
XFEstudio/gpt4free
Refactor PollinationsAI and PollinationsImage models: update endpoints and default model settings
8faa8607
代码差异
2 个文件
+24
-16
@@ -41,9 +41,10 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
41
41
# API endpoints
42
42
text_api_endpoint = "https://text.pollinations.ai/openai"
43
43
image_api_endpoint = "https://image.pollinations.ai/prompt/{}"
44
image_models_endpoint = "https://image.pollinations.ai/models"
44
45
gen_image_api_endpoint = "https://gen.pollinations.ai/image/{}"
45
46
gen_text_api_endpoint = "https://gen.pollinations.ai/v1/chat/completions"
46
image_models_endpoint = "https://gen.pollinations.ai/image/models"
47
gen_image_models_endpoint = "https://gen.pollinations.ai/image/models"
47
48
text_models_endpoint = "https://gen.pollinations.ai/text/models"
48
49
balance_endpoint = "https://g4f.space/api/pollinations/account/balance"
49
50
worker_api_endpoint = "https://g4f.space/api/pollinations/chat/completions"
@@ -52,11 +53,10 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
52
53
# Models configuration
53
54
default_model = "openai-fast"
54
55
fallback_model = "deepseek"
55
default_image_model = "flux"
56
56
default_vision_model = default_model
57
57
default_voice = "alloy"
58
58
text_models = {default_model: {"id": default_model}}
59
image_models = {default_image_model: {"id": default_image_model}, "turbo": {"id": "turbo"}, "kontext": {"id": "kontext"}}
59
image_models = {}
60
60
audio_models = {}
61
61
vision_models = [default_vision_model]
62
62
model_aliases = {
@@ -119,12 +119,15 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
119
119
if (not api_key or api_key.startswith("g4f_") or api_key.startswith("gfs_")) and cls.balance or cls.balance is None and cls.get_balance(api_key, timeout) and cls.balance > 0:
120
120
debug.log(f"Authenticated with Pollinations AI using G4F API.")
121
121
models_url = cls.worker_models_endpoint
122
image_url = cls.image_models_endpoint
122
123
elif api_key:
123
124
debug.log(f"Using Pollinations AI with provided API key.")
124
125
models_url = cls.gen_text_api_endpoint
126
image_url = cls.gen_image_models_endpoint
125
127
else:
126
128
debug.log(f"Using Pollinations AI without authentication.")
127
129
models_url = cls.text_models_endpoint
130
image_url = cls.image_models_endpoint
128
131
129
132
if cls.current_models_endpoint != models_url:
130
133
path = Path(get_cookies_dir()) / "models" / datetime.today().strftime('%Y-%m-%d') / f"{secure_filename(models_url)}.json"
@@ -139,7 +142,7 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
139
142
debug.error(f"Failed to load cached models from {path}: {e}")
140
143
try:
141
144
# Update of image models
142
image_response = requests.get(cls.image_models_endpoint, timeout=timeout)
145
image_response = requests.get(image_url, timeout=timeout)
143
146
if image_response.ok:
144
147
new_image_models = image_response.json()
145
148
else:
@@ -147,14 +150,17 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
147
150
148
151
# Add image and video models
149
152
cls.vision_models = []
150
cls.video_models = [model.get("name") for model in new_image_models if "video" in model.get("output_modalities", [])]
153
cls.video_models = [model.get("name") for model in new_image_models if isinstance(model, dict) and "video" in model.get("output_modalities", [])]
151
154
for model in new_image_models:
152
if model.get("name") not in cls.video_models:
153
cls.image_models[model.get("name")] = {"id": model.get("name"), "label": get_alias(model), **model}
154
if "image" in model.get("input_modalities", []):
155
cls.vision_models.append(model.get("name"))
156
for alias in model.get("aliases", []):
157
cls.model_aliases[alias] = model.get("name")
155
if isinstance(model, dict):
156
if model.get("name") not in cls.video_models:
157
cls.image_models[model.get("name")] = {"id": model.get("name"), "label": get_alias(model), **model}
158
if "image" in model.get("input_modalities", []):
159
cls.vision_models.append(model.get("name"))
160
for alias in model.get("aliases", []):
161
cls.model_aliases[alias] = model.get("name")
162
else:
163
cls.image_models[model] = {"id": model}
158
164
159
165
text_response = requests.get(cls.text_models_endpoint, timeout=timeout)
160
166
if not text_response.ok:
@@ -180,7 +186,7 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
180
186
cls.swap_model_aliases = {v: k for k, v in cls.model_aliases.items()}
181
187
cls.text_models = {model.get("name"): {"id": model.get("name"), "label": get_alias(model), **model} for model in models}
182
188
cls.models = cls.text_models.copy()
183
cls.models.update({model.get("name"): {"id": model.get("name"), "label": get_alias(model), **model} for model in new_image_models})
189
cls.models.update(cls.image_models)
184
190
finally:
185
191
cls.current_models_endpoint = models_url
186
192
# Cache the models to a file
@@ -341,6 +347,8 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
341
347
"enhance": str(enhance).lower(),
342
348
"safe": str(safe).lower(),
343
349
}
350
if not model or model == "auto":
351
del params["model"]
344
352
if transparent:
345
353
params["transparent"] = "true"
346
354
image = [data for data, _ in media if isinstance(data, str) and data.startswith("http")] if media else []
@@ -10,7 +10,7 @@ class PollinationsImage(PollinationsAI):
10
10
label = "PollinationsImage"
11
11
parent = PollinationsAI.__name__
12
12
active_by_default = False
13
default_model = "flux"
13
default_model = "auto"
14
14
default_vision_model = None
15
15
default_image_model = default_model
16
16
audio_models = {}
@@ -18,15 +18,15 @@ class PollinationsImage(PollinationsAI):
18
18
@classmethod
19
19
def get_models(cls, **kwargs):
20
20
PollinationsAI.get_models()
21
cls.image_models = PollinationsAI.image_models
21
cls.image_models = {"Auto-Select": "auto", **PollinationsAI.image_models}
22
22
cls.models = cls.image_models
23
23
return cls.models
24
24
25
25
@classmethod
26
26
def get_grouped_models(cls) -> dict[str, list[str]]:
27
PollinationsAI.get_models()
27
cls.get_models()
28
28
return [
29
{"group": "Image Generation", "models": PollinationsAI.image_models},
29
{"group": "Image Generation", "models": cls.image_models},
30
30
]
31
31
32
32
@classmethod