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

XFEstudio/gpt4free

feat: Add API key authentication and grouped model retrieval

- Added `login_url` attribute to `PollinationsAI` class. - Introduced API key authentication by adding `api_key` parameter to relevant functions in `PollinationsAI` and `PollinationsImage`. - Updated request headers to include `Authorization` header when an API key is provided. - Modified model retrieval to include `audio_models` voices in `get_models`. - Removed redundant audio model voice extensions from `text_models` initialization. - Added `get_grouped_models` method in `PollinationsAI` to categorize models into groups. - Updated async generator functions to pass API key where required. - Adjusted image request handling to use shared headers with API key support. - Refactored `PollinationsImage` async generator to include API key parameter.

2ba7b169
hlohaus <983577+hlohaus@users.noreply.github.com>
提交于

代码差异

2 个文件 +31 -10
Modified g4f/Provider/PollinationsAI.py +28 -9
@@ -65,6 +65,7 @@ FOLLOWUPS_DEVELOPER_MESSAGE = [{
65 65 class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
66 66 label = "Pollinations AI"
67 67 url = "https://pollinations.ai"
68 login_url = "https://auth.pollinations.ai"
68 69
69 70 working = True
70 71 supports_system_message = True
@@ -180,8 +181,6 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
180 181 for model in models
181 182 if "output_modalities" in model and "audio" in model["output_modalities"] and model.get("name") != "gemini"
182 183 }
183 if cls.default_audio_model in cls.audio_models:
184 cls.audio_models = {**cls.audio_models, **{voice: {} for voice in cls.audio_models[cls.default_audio_model]}}
185 184
186 185 cls.vision_models.extend([
187 186 model.get("name")
@@ -204,9 +203,6 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
204 203 if model_name and "input_modalities" in model and "text" in model["input_modalities"]:
205 204 unique_text_models.append(model_name)
206 205
207 if cls.default_audio_model in cls.audio_models:
208 unique_text_models.extend([voice for voice in cls.audio_models[cls.default_audio_model]])
209
210 206 # Convert to list and update text_models
211 207 cls.text_models = list(dict.fromkeys(unique_text_models))
212 208
@@ -224,8 +220,20 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
224 220 all_models = cls.text_models.copy()
225 221 all_models.extend(cls.image_models)
226 222 all_models.extend(cls.audio_models.keys())
223 if cls.default_audio_model in cls.audio_models:
224 all_models.extend(cls.audio_models[cls.default_audio_model])
227 225 return list(dict.fromkeys(all_models))
228 226
227 @classmethod
228 def get_grouped_models(cls) -> dict[str, list[str]]:
229 cls.get_models()
230 return [
231 {"group": "Text Generation", "models": cls.text_models},
232 {"group": "Image Generation", "models": cls.image_models},
233 {"group": "Audio Generation", "models": list(cls.audio_models.keys())},
234 {"group": "Audio Voices", "models": cls.audio_models[cls.default_audio_model]}
235 ]
236
229 237 @classmethod
230 238 async def create_async_generator(
231 239 cls,
@@ -235,6 +243,7 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
235 243 proxy: str = None,
236 244 cache: bool = False,
237 245 referrer: str = STATIC_URL,
246 api_key: str = None,
238 247 extra_body: dict = {},
239 248 # Image generation parameters
240 249 prompt: str = None,
@@ -287,7 +296,8 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
287 296 enhance=enhance,
288 297 safe=safe,
289 298 n=n,
290 referrer=referrer
299 referrer=referrer,
300 api_key=api_key
291 301 ):
292 302 yield chunk
293 303 else:
@@ -316,6 +326,7 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
316 326 stream=stream,
317 327 extra_parameters=extra_parameters,
318 328 referrer=referrer,
329 api_key=api_key,
319 330 extra_body=extra_body,
320 331 **kwargs
321 332 ):
@@ -337,7 +348,8 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
337 348 enhance: bool,
338 349 safe: bool,
339 350 n: int,
340 referrer: str
351 referrer: str,
352 api_key: str
341 353 ) -> AsyncResult:
342 354 params = use_aspect_ratio({
343 355 "width": width,
@@ -358,6 +370,9 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
358 370 else:
359 371 seed = random.randint(0, 2**32)
360 372 return f"{url}&seed={seed}" if seed else url
373 headers = {"referer": referrer}
374 if api_key:
375 headers["Authorization"] = f"Bearer {api_key}"
361 376 async with ClientSession(headers=DEFAULT_HEADERS, connector=get_connector(proxy=proxy)) as session:
362 377 responses = set()
363 378 responses.add(Reasoning(status=f"Generating {n} {'image' if n == 1 else 'images'}"))
@@ -365,7 +380,7 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
365 380 start = time.time()
366 381 async def get_image(responses: set, i: int, seed: Optional[int] = None):
367 382 nonlocal finished
368 async with session.get(get_image_url(i, seed), allow_redirects=False, headers={"referer": referrer}) as response:
383 async with session.get(get_image_url(i, seed), allow_redirects=False, headers=headers) as response:
369 384 try:
370 385 await raise_for_status(response)
371 386 except Exception as e:
@@ -399,6 +414,7 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
399 414 stream: bool,
400 415 extra_parameters: list[str],
401 416 referrer: str,
417 api_key: str,
402 418 extra_body: dict,
403 419 **kwargs
404 420 ) -> AsyncResult:
@@ -427,7 +443,10 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
427 443 cache=cache,
428 444 **extra_body
429 445 )
430 async with session.post(url, json=data, headers={"referer": referrer}) as response:
446 headers = {"referer": referrer}
447 if api_key:
448 headers["Authorization"] = f"Bearer {api_key}"
449 async with session.post(url, json=data, headers=headers) as response:
431 450 if response.status == 400:
432 451 debug.error(f"Error: 400 - Bad Request: {data}")
433 452 await raise_for_status(response)
Modified g4f/Provider/PollinationsImage.py +3 -1
@@ -39,6 +39,7 @@ class PollinationsImage(PollinationsAI):
39 39 messages: Messages,
40 40 proxy: str = None,
41 41 referrer: str = STATIC_URL,
42 api_key: str = None,
42 43 prompt: str = None,
43 44 aspect_ratio: str = "1:1",
44 45 width: int = None,
@@ -68,6 +69,7 @@ class PollinationsImage(PollinationsAI):
68 69 enhance=enhance,
69 70 safe=safe,
70 71 n=n,
71 referrer=referrer
72 referrer=referrer,
73 api_key=api_key
72 74 ):
73 75 yield chunk