import streamlit as st import time import base64 import io from PIL import Image from together import Together import os # Funzione per generare le immagini, con gestione errori e retry dopo 10 secondi def generate_image(prompt, max_retries=5): api_key = os.getenv('API_REPLIACATE') client = Together(api_key = api_key) retries = 0 while retries < max_retries: try: response = client.images.generate( prompt=prompt, model="black-forest-labs/FLUX.1-schnell-Free", width=960, height=1440, steps=4, n=1, response_format="b64_json" ) return response.data # Una lista di oggetti con attributo b64_json except Exception as e: st.error(f"Errore durante la generazione delle immagini: {e}. Riprovo tra 10 secondi...") time.sleep(10) retries += 1 st.error("Numero massimo di tentativi raggiunto. Impossibile generare le immagini.") return None def generate_images(prompt, num_immagini): for numero in range(num_immagini): images_data = generate_image(prompt) if images_data is not None: for i, img_obj in enumerate(images_data): try: image_bytes = base64.b64decode(img_obj.b64_json) image = Image.open(io.BytesIO(image_bytes)) st.image(image, caption="") except Exception as e: st.error(f"Errore nella visualizzazione dell'immagine {i+1}: {e}") else: st.error("Non è stato possibile generare le immagini. Riprova più tardi.") time.sleep(5) st.success("Immagini generate con successo!") def main(): st.title("AI Imaging") st.sidebar.header("Impostazioni") stile_default = "Highly detailed, painterly style with a historical yet stylized aesthetic. Rich textures, ornate patterns, and a color palette dominated by imperial gold, deep red, and aged marble tones. Inspired by ancient Roman mosaics, frescoes, and classical sculpture, with a balanced mix of realism and stylization. Elegant, decorative card borders with intricate engravings and antique flourishes. Designed for a tabletop card game, ensuring clarity, readability, and a visually immersive experience." stile_immagine = st.sidebar.text_area("Stile Immagine", stile_default, disabled=False) prompt_input = st.sidebar.text_area("Prompt Immagine") num_immagini = st.sidebar.slider("Variazioni", min_value=1, max_value=6, value=2) submit_button = st.sidebar.button(label="Genera Immagine", type = "primary", use_container_width=True) st.write("Inserisci il **Prompt** (che verrà unito allo stile) e clicca su *Genera Immagine*.") if submit_button: if not prompt_input.strip(): st.error("Per favore, inserisci un prompt per l'immagine!") else: # Combiniamo il prompt inserito con lo stile fisso prompt_completo = f"{prompt_input}, {stile_immagine}" st.info("Generazione in corso, attendere...") generate_images(prompt_completo, num_immagini) if __name__ == "__main__": main()