Spaces:
Sleeping
Sleeping
import gradio as gr | |
import requests | |
import os | |
import base64 | |
from PIL import Image | |
import numpy as np | |
import io | |
# Функция для обработки изображения и текста и отправки запроса к OpenAI | |
def generate_text(image, prompt): | |
# Конвертируем NumPy массив в объект Image | |
image_pil = Image.fromarray(image.astype('uint8'), 'RGB') | |
# Конвертируем изображение для отправки через API | |
image_bytes = io.BytesIO() | |
image_pil.save(image_bytes, format='PNG') | |
image_base64 = base64.b64encode(image_bytes.getvalue()).decode('utf-8') | |
# API ключ для OpenAI | |
api_key = os.getenv("API_KEY") | |
# Заголовки для запроса | |
headers = { | |
'Authorization': f'Bearer {api_key}', | |
'Content-Type': 'application/json', | |
} | |
# Данные для запроса | |
data = { | |
"model": "gpt-4-vision-preview", | |
"prompt": prompt, | |
"n": 1, | |
"temperature": 0.5, | |
"top_p": 1, | |
"frequency_penalty": 0, | |
"presence_penalty": 0, | |
"stop": ["\n"], | |
"image": { | |
"data": image_base64, | |
"mime_type": "image/png" | |
} | |
} | |
# URL для запроса к модели gpt-4-vision-preview | |
url = 'https://api.openai.com/v1/completions' | |
# Отправляем запрос к OpenAI | |
response = requests.post(url, headers=headers, json=data) | |
# Проверяем ответ и возвращаем результат | |
if response.status_code == 200: | |
response_data = response.json() | |
return response_data['choices'][0]['text'].strip() | |
else: | |
return f"Error: {response.status_code} - {response.text}" | |
# Создаем интерфейс с помощью Gradio | |
with gr.Blocks() as demo: | |
with gr.Row(): | |
with gr.Column(): | |
image_input = gr.Image(label="Загрузите изображение", type="numpy") | |
text_input = gr.Textbox(label="Введите текст") | |
submit_button = gr.Button("Решить") | |
with gr.Column(): | |
output_text = gr.Textbox(label="Ответ", interactive=True, lines=10) | |
output_markdown = gr.Textbox(label="Ответ в Markdown", interactive=True, lines=10, visible=False) | |
# Функция для обновления Markdown поля при получении ответа | |
def update_markdown(answer): | |
output_markdown.update(f"```\n{answer}\n```") | |
output_markdown.change_visibility(True) | |
# Привязываем функции к кнопке | |
submit_button.click(fn=generate_text, inputs=[image_input, text_input], outputs=[output_text]) | |
output_text.change(fn=update_markdown, inputs=[output_text], outputs=[output_markdown]) | |
demo.launch() |