diff --git a/extensions/pollinations-api/README.md b/extensions/pollinations-api/README.md new file mode 100644 index 000000000..f62192aa5 --- /dev/null +++ b/extensions/pollinations-api/README.md @@ -0,0 +1,38 @@ +# Pollinations.AI API Extension for Stable Diffusion WebUI + +This extension integrates [Pollinations.AI](https://pollinations.ai) with the Stable Diffusion WebUI, allowing users to generate images using Pollinations.AI's free, no-signup API instead of local models. This is especially useful for users without high-end GPUs or those who want to try different models without downloading them. + +## Features + +- Generate images using Pollinations.AI's cloud-based API directly from the WebUI +- No API key or signup required +- Access to multiple image generation models +- Adjustable parameters (width, height, seed, etc.) +- Option to disable the Pollinations logo overlay + +## Usage + +1. Go to the txt2img or img2img tab +2. Select "Pollinations API" from the Script dropdown +3. Enter your prompt and adjust parameters as needed +4. Click Generate + +## Parameters + +- **Model**: Select the Pollinations.AI model to use for generation +- **Width**: Width of the generated image (default: 1024) +- **Height**: Height of the generated image (default: 1024) +- **No Logo**: Disable the Pollinations logo overlay +- **Enhance Prompt**: Use an LLM to enhance the prompt with more details + +## About Pollinations.AI + +Pollinations.AI is a free and open-source generative AI platform that provides: + +- Free access to text, image, and audio generation APIs +- No signup or API key required +- Simple URL-based endpoints for easy integration +- OpenAI-compatible interfaces +- HTTPS and CORS support + +Visit [Pollinations.AI](https://pollinations.ai) for more information. diff --git a/extensions/pollinations-api/__init__.py b/extensions/pollinations-api/__init__.py new file mode 100644 index 000000000..09256ac7d --- /dev/null +++ b/extensions/pollinations-api/__init__.py @@ -0,0 +1,6 @@ +from modules import script_callbacks, shared + +def on_app_started(demo, app): + print("Pollinations.AI API extension loaded!") + +script_callbacks.on_app_started(on_app_started) diff --git a/extensions/pollinations-api/install.py b/extensions/pollinations-api/install.py new file mode 100644 index 000000000..1ac3bbd8f --- /dev/null +++ b/extensions/pollinations-api/install.py @@ -0,0 +1,25 @@ +import os +import sys +import subprocess +import importlib.util + +# Check if required packages are installed +required_packages = ['requests', 'urllib3'] + +def is_package_installed(package_name): + return importlib.util.find_spec(package_name) is not None + +def install_package(package_name): + subprocess.check_call([sys.executable, '-m', 'pip', 'install', package_name]) + +def install_requirements(): + for package in required_packages: + if not is_package_installed(package): + print(f"Installing {package}...") + install_package(package) + print(f"{package} installed successfully.") + else: + print(f"{package} is already installed.") + +if __name__ == "__main__": + install_requirements() diff --git a/extensions/pollinations-api/scripts/pollinations_api.py b/extensions/pollinations-api/scripts/pollinations_api.py new file mode 100644 index 000000000..ed47408ac --- /dev/null +++ b/extensions/pollinations-api/scripts/pollinations_api.py @@ -0,0 +1,146 @@ +import os +import io +import json +import requests +import urllib.parse +from PIL import Image +from modules import scripts, shared, images +from modules.processing import process_images, Processed +from modules.shared import opts, cmd_opts, state +import gradio as gr + +class PollinationsAPI(scripts.Script): + def __init__(self): + super().__init__() + self.models = [] + self.fetch_models() + + def fetch_models(self): + try: + response = requests.get("https://image.pollinations.ai/models") + if response.status_code == 200: + self.models = response.json() + else: + print(f"Failed to fetch models: {response.status_code}") + self.models = ["flux", "sdxl", "pixart", "dalle"] # Default models + except Exception as e: + print(f"Error fetching models: {e}") + self.models = ["flux", "sdxl", "pixart", "dalle"] # Default models + + def title(self): + return "Pollinations API" + + def show(self, is_img2img): + return scripts.AlwaysVisible + + def ui(self, is_img2img): + with gr.Group(): + with gr.Accordion("Pollinations.AI API", open=False): + enabled = gr.Checkbox(label="Enable Pollinations.AI API", value=False) + model = gr.Dropdown(label="Model", choices=self.models, value=self.models[0] if self.models else "flux") + width = gr.Slider(minimum=256, maximum=2048, step=64, label="Width", value=1024) + height = gr.Slider(minimum=256, maximum=2048, step=64, label="Height", value=1024) + no_logo = gr.Checkbox(label="No Logo", value=False) + enhance = gr.Checkbox(label="Enhance Prompt", value=False) + private = gr.Checkbox(label="Private (Don't show in public feed)", value=True) + info = gr.HTML("
This extension uses Pollinations.AI's free, no-signup API to generate images.
") + + return [enabled, model, width, height, no_logo, enhance, private] + + def process( + self, + p, + enabled, + model, + width, + height, + no_logo, + enhance, + private, + ): + if not enabled: + return p + + p.do_not_save_grid = True + p.do_not_save_samples = True + + # Store original parameters + self.original_prompt = p.prompt + self.original_negative_prompt = p.negative_prompt + self.original_seed = p.seed + self.original_width = p.width + self.original_height = p.height + + # Override parameters + p.width = width + p.height = height + + return p + + def postprocess(self, p, processed, enabled, model, width, height, no_logo, enhance, private): + if not enabled: + return processed + + # Restore original parameters for metadata + p.prompt = self.original_prompt + p.negative_prompt = self.original_negative_prompt + p.seed = self.original_seed + p.width = self.original_width + p.height = self.original_height + + # Create a new Processed object + result = Processed(p, []) + + # Generate images using Pollinations API + for i in range(p.batch_size * p.n_iter): + try: + # Prepare parameters + params = { + "model": model, + "width": width, + "height": height, + "seed": p.seed + i if p.seed != -1 else None, + "nologo": "true" if no_logo else "false", + "enhance": "true" if enhance else "false", + "private": "true" if private else "false", + "referrer": "stable-diffusion-webui-extension" + } + + # Prepare prompt + prompt = p.prompt + if p.negative_prompt: + prompt += " | negative: " + p.negative_prompt + + # Encode prompt + encoded_prompt = urllib.parse.quote(prompt) + + # Build URL + url = f"https://image.pollinations.ai/prompt/{encoded_prompt}" + + # Make request + response = requests.get(url, params=params, timeout=60) + response.raise_for_status() + + # Convert response to image + image = Image.open(io.BytesIO(response.content)) + result.images.append(image) + + # Add info to image + images.save_image( + image, + p.outpath_samples, + "", + p.seed + i if p.seed != -1 else -1, + p.prompt, + opts.samples_format, + info=f"Pollinations.AI API, Model: {model}", + p=p, + ) + + except Exception as e: + print(f"Error generating image with Pollinations API: {e}") + # Add a blank image or error message image + error_image = Image.new('RGB', (width, height), color=(0, 0, 0)) + result.images.append(error_image) + + return result