import gradio as gr import requests import io import random import os import time from PIL import Image from mistralai import Mistral from deep_translator import GoogleTranslator import json from theme import theme from fastapi import FastAPI app = FastAPI() # Based on a project by Nymbo API_URL = "https://api-inference.huggingface.co/models/black-forest-labs/FLUX.1-dev" API_TOKEN = os.getenv("HF_READ_TOKEN") headers = {"Authorization": f"Bearer {API_TOKEN}"} timeout = 100 # Function to query the API and return the generated image def query(prompt, is_negative=False, steps=35, cfg_scale=7, sampler="DPM++ 2M Karras", seed=-1, strength=0.7, width=1024, height=1024): if prompt == "" or prompt is None: return None key = random.randint(0, 999) API_TOKEN = random.choice([os.getenv("HF_READ_TOKEN")]) headers = {"Authorization": f"Bearer {API_TOKEN}"} # Translate the prompt from Russian to English if necessary prompt = GoogleTranslator(source='ru', target='en').translate(prompt) print(f'\033[1mGeneration {key} translation:\033[0m {prompt}') # Add some extra flair to the prompt prompt = f"{prompt} | ultra detail, ultra elaboration, ultra quality, perfect." print(f'\033[1mGeneration {key}:\033[0m {prompt}') # Prepare the payload for the API call, including width and height payload = { "inputs": prompt, "is_negative": is_negative, "steps": steps, "cfg_scale": cfg_scale, "seed": seed if seed != -1 else random.randint(1, 1000000000), "strength": strength, "parameters": { "width": width, # Pass the width to the API "height": height # Pass the height to the API } } # Send the request to the API and handle the response response = requests.post(API_URL, headers=headers, json=payload, timeout=timeout) if response.status_code != 200: print(f"Error: Failed to get image. Response status: {response.status_code}") print(f"Response content: {response.text}") if response.status_code == 503: raise gr.Error(f"{response.status_code} : The model is being loaded") raise gr.Error(f"{response.status_code}") try: # Convert the response content into an image image_bytes = response.content image = Image.open(io.BytesIO(image_bytes)) print(f'\033[1mGeneration {key} completed!\033[0m ({prompt})') return image except Exception as e: print(f"Error when trying to open the image: {e}") return None def encode_image(image_path): """Encode the image to base64.""" try: # Open the image file image = Image.open(image_path).convert("RGB") # Resize the image to a height of 512 while maintaining the aspect ratio base_height = 512 h_percent = (base_height / float(image.size[1])) w_size = int((float(image.size[0]) * float(h_percent))) image = image.resize((w_size, base_height), Image.LANCZOS) # Convert the image to a byte stream buffered = BytesIO() image.save(buffered, format="JPEG") img_str = base64.b64encode(buffered.getvalue()).decode("utf-8") return img_str except FileNotFoundError: print(f"Error: The file {image_path} was not found.") return None except Exception as e: # Add generic exception handling print(f"Error: {e}") return None def feifeichat(image): try: model = "pixtral-large-2411" # Define the messages for the chat base64_image = encode_image(image) messages = [{ "role": "user", "content": [ { "type": "text", "text": "Please provide a detailed description of this photo" }, { "type": "image_url", "image_url": f"data:image/jpeg;base64,{base64_image}" }, ], "stream": False, }] partial_message = "" for chunk in Mistralclient.chat.stream(model=model, messages=messages): if chunk.data.choices[0].delta.content is not None: partial_message = partial_message + chunk.data.choices[ 0].delta.content yield partial_message except Exception as e: # Adding generic exception handling print(f"Error: {e}") return "Please upload a photo" # CSS to style the app css = """ .gradio-container {background-color: MediumAquaMarine} footer{display:none !important} #app-container { max-width: 930px; margin-left: auto; margin-right: auto; } """ examples = [ "a beautiful woman with blonde hair and blue eyes", "a beautiful woman with brown hair and grey eyes", "a beautiful woman with black hair and brown eyes", ] # Build the Gradio UI with Blocks with gr.Blocks(theme=theme, css=css) as app: # Add a title to the app gr.HTML("