Spaces:
Running
Running
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) | |