=== IMPLEMENTAZIONE COMPLETA: GPT-4 VISION + DALL-E === Data: 14/01/2025 02:05:00 Obiettivo: Far sì che DALL-E si basi sull'immagine caricata usando GPT-4 Vision per l'analisi WORKFLOW CORRETTO: 1. Utente carica immagine (URL: https://scontent-fra5-1.xx.fbcdn.net/v/t39.30808-6/492735930_1109968394493840_558364310382117236_n.jpg...) 2. GPT-4 Vision analizza l'immagine e la descrive dettagliatamente 3. DALL-E usa quella descrizione per creare un'immagine simile ma diversa MODIFICHE NECESSARIE NEL FILE server.py: === MODIFICA 1: Sostituire funzione genera_immagine_openai_dalle (riga ~6489) === PRIMA (da sostituire): ```python def genera_immagine_openai_dalle(testo_curiosita): """ Genera un'immagine usando OpenAI DALL-E dal testo della curiosità. Creato: 08/01/2025 23:35:00 - Integrazione DALL-E per pagina Microsoft """ import requests import os from datetime import datetime print(f"🎨 GENERAZIONE IMMAGINE DALL-E per: '{testo_curiosita[:50]}...'") # ... resto del codice vecchio ... ``` DOPO (nuova versione completa): ```python def genera_immagine_openai_dalle(testo_curiosita, immagine_riferimento=None, url_riferimento=None): """ Genera un'immagine usando OpenAI DALL-E dal testo della curiosità. AGGIORNATO: 14/01/2025 02:05:00 - Supporto GPT-4 Vision per analizzare immagine di riferimento Args: testo_curiosita (str): Testo della curiosità immagine_riferimento (file): File immagine di riferimento (opzionale) url_riferimento (str): URL immagine di riferimento (opzionale) """ import requests import os from datetime import datetime import base64 print(f"🎨 GENERAZIONE IMMAGINE DALL-E per: '{testo_curiosita[:50]}...'") if immagine_riferimento or url_riferimento: print(f" 📎 Con immagine di riferimento: {'File' if immagine_riferimento else 'URL'}") # Cartella di destinazione if not os.path.exists('generated_images'): os.makedirs('generated_images') # Genera nome file univoco timestamp = datetime.now().strftime("%H%M%S") nome_file = f"dalle_image_{timestamp}.png" percorso_locale = os.path.join('generated_images', nome_file) try: # STEP 1: Analizza immagine di riferimento con GPT-4 Vision (se presente) descrizione_immagine = None if immagine_riferimento or url_riferimento: print(f" 🔍 ANALISI IMMAGINE CON GPT-4 VISION...") try: # Prepara l'immagine per GPT-4 Vision if url_riferimento: # URL diretto image_url = url_riferimento print(f" 📡 Uso URL diretto: {url_riferimento[:100]}...") elif immagine_riferimento: # File caricato - converti in base64 image_data = base64.b64encode(immagine_riferimento.read()).decode('utf-8') image_url = f"data:image/jpeg;base64,{image_data}" print(f" 📁 Immagine convertita in base64") # Chiamata a GPT-4 Vision per analizzare l'immagine vision_response = client.chat.completions.create( model="gpt-4-vision-preview", messages=[ { "role": "user", "content": [ { "type": "text", "text": "Descrivi questa immagine in modo molto dettagliato, includendo: stile artistico, colori dominanti, composizione, atmosfera, oggetti presenti, lighting, texture e qualsiasi dettaglio visivo importante. Scrivi una descrizione che permetterebbe a un artista di ricreare un'immagine simile ma diversa." }, { "type": "image_url", "image_url": { "url": image_url, "detail": "high" } } ] } ], max_tokens=500 ) descrizione_immagine = vision_response.choices[0].message.content print(f" ✅ GPT-4 Vision - Descrizione ottenuta:") print(f" 📝 {descrizione_immagine[:200]}...") except Exception as vision_error: print(f" ❌ Errore GPT-4 Vision: {vision_error}") descrizione_immagine = None # STEP 2: Crea prompt per DALL-E basato sull'analisi if descrizione_immagine: # Modalità con immagine di riferimento analizzata prompt_dalle = f"Crea un'immagine simile a questa descrizione ma diversa: {descrizione_immagine}. Mantieni lo stesso stile, composizione e atmosfera, ma cambia i dettagli specifici. L'immagine deve essere correlata a questo tema: {testo_curiosita}. Non includere testo, scritte o simboli." print(f" 🎯 Modalità: Con riferimento GPT-4 Vision") else: # Modalità standard senza riferimento prompt_dalle = f"Crea un'immagine realistica che rappresenti visivamente questa curiosità: {testo_curiosita}. L'immagine deve sembrare il più reale possibile, come una fotografia, senza includere alcun testo, scritta, numero o simbolo nell'immagine." print(f" 🎯 Modalità: Standard senza riferimento") print(f" 📝 Prompt DALL-E: {prompt_dalle[:200]}...") # STEP 3: Chiamata DALL-E API response = client.images.generate( model="dall-e-3", prompt=prompt_dalle, size="1024x1024", quality="standard", n=1, ) # Estrai URL dell'immagine generata image_url = response.data[0].url # Scarica l'immagine img_response = requests.get(image_url, timeout=30) if img_response.status_code == 200: with open(percorso_locale, 'wb') as f: f.write(img_response.content) # Verifica che il file sia stato creato correttamente if os.path.exists(percorso_locale) and os.path.getsize(percorso_locale) > 1000: file_size = os.path.getsize(percorso_locale) print(f"✅ DALL-E: Immagine generata con successo!") print(f" 📁 File: {nome_file}") print(f" 📊 Dimensione: {file_size} bytes") print(f" 🎨 Risoluzione: 1024x1024") return { "successo": True, "url_locale": percorso_locale, "nome_file": nome_file, "fonte": "OpenAI DALL-E 3", "prompt_usato": prompt_dalle, "testo_originale": testo_curiosita, "con_riferimento": bool(immagine_riferimento or url_riferimento), "descrizione_riferimento": descrizione_immagine } else: print(f" ⚠️ File non creato o troppo piccolo") return { "successo": False, "errore": "File immagine non creato correttamente" } else: print(f" ⚠️ Errore download immagine: {img_response.status_code}") return { "successo": False, "errore": f"Errore download immagine: {img_response.status_code}" } except Exception as e: print(f" ❌ Errore DALL-E: {str(e)}") return { "successo": False, "errore": f"Errore DALL-E: {str(e)}" } ``` === MODIFICA 2: Aggiornare chiamata funzione nell'endpoint test (riga ~3703) === PRIMA: ```python risultato_download = genera_immagine_openai_dalle(curiosita_generata) ``` DOPO: ```python risultato_download = genera_immagine_openai_dalle( curiosita_generata, immagine_riferimento=immagine_riferimento, url_riferimento=immagine_riferimento_url ) ``` === COSA ACCADRÀ DOPO LE MODIFICHE === 1. ✅ Frontend: Già modificato per mandare immagine di riferimento 2. ✅ Backend parsing: Già modificato per ricevere FormData 3. ⏳ GPT-4 Vision: Analizzerà l'immagine di riferimento 4. ⏳ DALL-E: Userà la descrizione di GPT-4 Vision per creare immagine simile RISULTATO ATTESO CON L'URL FORNITO: 1. GPT-4 Vision analizzerà l'immagine di Facebook 2. Creerà una descrizione dettagliata (stile, colori, composizione, etc.) 3. DALL-E userà quella descrizione per creare un'immagine simile ma diversa 4. L'immagine finale sarà basata sull'immagine di riferimento, non solo sul testo TEST CONSIGLIATO: 1. Applicare le modifiche al server.py 2. Ricaricare il server 3. Andare su http://54.38.34.29:5050/test 4. Incollare l'URL: https://scontent-fra5-1.xx.fbcdn.net/v/t39.30808-6/492735930_1109968394493840_558364310382117236_n.jpg... 5. Verificare nei log del server l'analisi GPT-4 Vision 6. Controllare che DALL-E generi un'immagine basata sulla descrizione COSTI API: - GPT-4 Vision: ~$0.01-0.03 per immagine analizzata - DALL-E 3: ~$0.04 per immagine generata - Totale: ~$0.05-0.07 per generazione con riferimento LIMITAZIONI: - GPT-4 Vision ha limiti di dimensione file - URL immagini devono essere accessibili pubblicamente - File upload limitati a formati comuni (JPG, PNG, etc.) FILE DA MODIFICARE: - server.py: 2 modifiche (funzione + chiamata) - templates/test.html: ✅ Già modificato - Tutto il resto: ✅ Già pronto