refactor: streamline image param handling and fix media URL extraction

- Removed extension of `vision_models` into `text_models` in `PollinationsAI.get_models`
- Unified image parameter handling in `PollinationsAI.create_payload`, removing special case for `"gptimage"` model
- Added conditional inclusion of `"transparent"` and `"image"` params based on `transparent` flag and media content
- Replaced `quote_plus` with `quote` for URL encoding in query string construction
- In `OpenaiTemplate.create_payload`, wrapped media URL extraction in `iter()` to fix `next()` usage with list comprehension
This commit is contained in:
hlohaus 2025-07-09 20:25:27 +02:00
parent 571a2ac37b
commit dc9f1156ec
2 changed files with 9 additions and 16 deletions

View file

@ -5,7 +5,7 @@ import json
import random
import requests
import asyncio
from urllib.parse import quote_plus
from urllib.parse import quote, quote_plus
from typing import Optional
from aiohttp import ClientSession, ClientTimeout
@ -180,9 +180,6 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
# Create a set of unique text models starting with default model
text_models = cls.text_models.copy()
# Add models from vision_models
text_models.extend(cls.vision_models)
# Add models from the API response
for model in models:
model_name = model.get("name")
@ -355,22 +352,18 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
"enhance": str(enhance).lower(),
"safe": str(safe).lower(),
}
if model == "gptimage":
n = 1
# Only remote images are supported
image = [item[0] for item in media if isinstance(item[0], str) and item[0].startswith("http")] if media else []
params = {
**params,
"transparent": str(transparent).lower(),
"image": ",".join(image) if image else "",
}
else:
if transparent:
params["transparent"] = "true"
image = [data for data, _ in media if isinstance(data, str) and data.startswith("http")] if media else []
if image:
params["image"] = ",".join(image)
if model != "gptimage":
params = use_aspect_ratio({
"width": width,
"height": height,
**params
}, "1:1" if aspect_ratio is None else aspect_ratio)
query = "&".join(f"{k}={quote_plus(str(v))}" for k, v in params.items() if v is not None)
query = "&".join(f"{k}={quote(str(v))}" for k, v in params.items() if v is not None)
encoded_prompt = prompt.strip(". \n")
if model == "gptimage" and aspect_ratio is not None:
encoded_prompt = f"{encoded_prompt} aspect-ratio: {aspect_ratio}"

View file

@ -94,7 +94,7 @@ class OpenaiTemplate(AsyncGeneratorProvider, ProviderModelMixin, RaiseErrorMixin
}
# Handle media if provided
if media is not None:
data["image_url"] = next([data for data, _ in media if data and isinstance(data, str) and data.startswith("http://") or data.startswith("https://")], None)
data["image_url"] = next(iter([data for data, _ in media if data and isinstance(data, str) and data.startswith("http://") or data.startswith("https://")]), None)
async with session.post(f"{api_base.rstrip('/')}/images/generations", json=data, ssl=cls.ssl) as response:
data = await response.json()
cls.raise_error(data, response.status)