ReXploreBackend / image.py
raannakasturi's picture
Update image.py
d94ffa5 verified
import base64
import io
import os
import re
import time
from PIL import Image
from g4f.client import Client
from g4f.Provider import RetryProvider, PollinationsAI, ImageLabs, Blackbox, HuggingSpace, Airforce
from g4f.Provider.hf_space.BlackForestLabsFlux1Schnell import BlackForestLabsFlux1Schnell
from g4f.Provider.hf_space.VoodoohopFlux1Schnell import VoodoohopFlux1Schnell
NEGATIVE_PROMPT = (
"low quality, blurry, pixelated, bad anatomy, bad hands, three hands, three legs, bad arms, missing legs, "
"missing arms, poorly drawn face, poorly rendered hands, bad face, fused face, cloned face, worst face, "
"three crus, extra crus, fused crus, worst feet, three feet, fused feet, fused thigh, three thigh, extra thigh, "
"worst thigh, missing fingers, extra fingers, ugly fingers, long fingers, bad composition, horn, extra eyes, huge eyes, "
"2girl, amputation, disconnected limbs, cartoon, cg, 3d, unreal, animate, cgi, render, artwork, illustration, "
"3d render, cinema 4d, artstation, octane render, mutated body parts, painting, oil painting, 2d, sketch, bad photography, "
"bad photo, deviant art, aberrations, abstract, anime, black and white, collapsed, conjoined, creative, drawing, extra windows, "
"harsh lighting, jpeg artifacts, low saturation, monochrome, multiple levels, overexposed, oversaturated, photoshop, rotten, surreal, "
"twisted, UI, underexposed, unnatural, unreal engine, unrealistic, video game, deformed body features, NSFW, NUDE, vulgar, negative, "
"unsuitable, inappropriate, offensive, revealing, sexual, explicit"
)
def extract_summary(text):
"""
Clean and extract the summary portion from the text.
"""
text = text.replace("#", "").strip().lower()
match = re.search(r"summary(.*?)highlights", text, re.DOTALL)
return match.group(1).strip() if match else text
def fix_base64_padding(data):
"""
Ensure that the base64 string has the proper padding.
"""
missing_padding = len(data) % 4
if missing_padding:
data += "=" * (4 - missing_padding)
return data
def generate_image(title, category, summary):
print("Generating image...")
start = time.time()
prompt = f"Generate accurate image representing the {category} concept: ```{title.strip()}: {summary.strip()}```"
client = Client()
attempts = [
([BlackForestLabsFlux1Schnell, VoodoohopFlux1Schnell, HuggingSpace], "flux-schnell"),
([HuggingSpace, PollinationsAI], "flux-dev"),
([PollinationsAI], "flux-pro"),
([Airforce, PollinationsAI, Blackbox], "flux"),
([PollinationsAI], "dall-e-3"),
([HuggingSpace], "sd-3")
]
for providers, model in attempts:
try:
provider = RetryProvider(
providers=providers,
shuffle=True,
single_provider_retry=True,
max_retries=3,
)
response = client.images.generate(
provider=provider,
model=model,
prompt=prompt,
negative_prompt=NEGATIVE_PROMPT,
response_format="b64_json",
width=1024,
height=576,
)
img_data = response.data[0].b64_json
elapsed = time.time() - start
print(f"Image generated in {elapsed:.2f} seconds using model {model}")
if img_data:
return f"data:image/png;base64,{img_data}"
except Exception as e:
print(f"Attempt with model {model} failed: {e}")
return None
def verify_image(image_data):
try:
image_stream = io.BytesIO(image_data)
img = Image.open(image_stream)
img.verify()
return True
except Exception as e:
print(f"Error verifying image: {e}")
return False
def fetch_image(title, category, summary):
summary = extract_summary(summary)
fallback_url = "https://i.ibb.co/TBJqggw/Image-Not-Found.jpg"
try:
data_uri = generate_image(title, category, summary)
if data_uri:
base64_str = data_uri.split(",")[1]
base64_str = fix_base64_padding(base64_str)
decoded = base64.b64decode(base64_str, validate=True)
if verify_image(decoded):
return f"data:image/png;base64,{base64_str}"
return fallback_url
except Exception as e:
print(f"Error fetching image: {e}")
return fallback_url
finally:
if os.path.exists("image.png"):
os.remove("image.png")
if __name__ == "__main__":
title = "Exposition: Enumerative Geometry and Tree-Level Gromov-Witten Invariants"
category = "Mathematics"
summary = (
"The text discusses the Kontsevich-Manin formula for enumerating degree d rational curves via Gromov-Witten invariants. "
"It details the calculation of these invariants using moduli spaces of stable maps and explores their implications in enumerative geometry."
)
image_url = fetch_image(title, category, summary)
print(image_url)