import gradio as gr import requests import os import random from io import BytesIO from PIL import Image import base64 # Получение списка API ключей из переменной окружения api_keys = os.getenv("HF_API_KEYS", "").split(",") if not api_keys or not all(api_keys): raise ValueError("HF_API_KEYS environment variable is not set or contains invalid keys.") # Выбор случайного API ключа api_key = random.choice(api_keys) headers = { "Authorization": f"Bearer {api_key}" } # Ссылка на API Hugging Face api_url = "https://api-inference.huggingface.co/models/Salesforce/blip-image-captioning-large" # Функция для генерации описания изображения def caption_image(image): if image is None: return "" # Преобразование изображения в байтовый формат buffered = BytesIO() try: image.save(buffered, format="PNG") # Используем PNG except Exception as e: return f"Error: Failed to save image - {str(e)}" image_bytes = buffered.getvalue() # Логирование размера байтового объекта print(f"Image size: {len(image_bytes)} bytes") # Отправка изображения в base64 image_base64 = base64.b64encode(image_bytes).decode('utf-8') data = {"inputs": image_base64} response = requests.post(api_url, headers=headers, json=data, timeout=150) # Логирование ответа if response.status_code == 200: return response.json()[0]['generated_text'] else: print(f"Error: {response.status_code} - {response.text}") return f"Error: {response.status_code} - {response.text}" # Ссылка на файл CSS (опционально) css_url = "https://neurixyufi-aihub.static.hf.space/style.css" try: response = requests.get(css_url) css = response.text + ".gradio-container{max-width: 700px !important} h1{text-align:center}" except requests.exceptions.RequestException as e: print(f"Warning: Could not load CSS from {css_url}: {e}") # Создание интерфейса Gradio with gr.Blocks(css=css) as demo: gr.Markdown("# Описание изображения") with gr.Row(): with gr.Column(): image_input = gr.Image(type="pil", label="Ваше изображение") with gr.Column(): caption_output = gr.Textbox(label="Описание") image_input.change(fn=caption_image, inputs=image_input, outputs=caption_output) # Запуск интерфейса demo.launch(share=False, debug=False, show_error=False, show_api=False).queue(max_size=150)