|
import base64 |
|
import requests |
|
from io import BytesIO |
|
from PIL import Image |
|
import gradio as gr |
|
|
|
def encode_image(img): |
|
""" |
|
Encodes a PIL Image to a base64 string. |
|
""" |
|
buffered = BytesIO() |
|
img.save(buffered, format="PNG") |
|
encoded_string = base64.b64encode(buffered.getvalue()).decode("utf-8") |
|
return encoded_string |
|
|
|
def get_image_description(api_key, uploaded_image): |
|
""" |
|
Sends the uploaded image and API key to the Hyperbolic API and retrieves the response. |
|
""" |
|
if not api_key: |
|
return {"error": "API key is required."} |
|
|
|
if uploaded_image is None: |
|
return {"error": "No image uploaded."} |
|
|
|
try: |
|
|
|
img = Image.open(uploaded_image) |
|
base64_img = encode_image(img) |
|
|
|
api_endpoint = "https://api.hyperbolic.xyz/v1/chat/completions" |
|
|
|
headers = { |
|
"Content-Type": "application/json", |
|
"Authorization": f"Bearer {api_key}", |
|
} |
|
|
|
payload = { |
|
"messages": [ |
|
{ |
|
"role": "user", |
|
"content": [ |
|
{"type": "text", "text": "What is this image?"}, |
|
{ |
|
"type": "image_url", |
|
"image_url": {"url": f"data:image/png;base64,{base64_img}"}, |
|
}, |
|
], |
|
} |
|
], |
|
"model": "Qwen/Qwen2-VL-72B-Instruct", |
|
"max_tokens": 2048, |
|
"temperature": 0.7, |
|
"top_p": 0.9, |
|
} |
|
|
|
response = requests.post(api_endpoint, headers=headers, json=payload) |
|
|
|
|
|
if response.status_code == 200: |
|
return response.json() |
|
else: |
|
return {"error": f"API Error: {response.status_code} - {response.text}"} |
|
|
|
except Exception as e: |
|
return {"error": str(e)} |
|
|
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown( |
|
""" |
|
# Image Description with Hyperbolic API |
|
|
|
Upload an image and enter your Hyperbolic API key to get a description of the image. |
|
""" |
|
) |
|
|
|
with gr.Row(): |
|
api_key_input = gr.Textbox( |
|
label="Hyperbolic API Key", |
|
type="password", |
|
placeholder="Enter your API key here", |
|
interactive=True |
|
) |
|
|
|
with gr.Row(): |
|
image_input = gr.Image( |
|
label="Upload Image", |
|
type="filepath" |
|
|
|
) |
|
|
|
with gr.Row(): |
|
submit_button = gr.Button("Get Description") |
|
|
|
output = gr.JSON(label="API Response") |
|
|
|
|
|
submit_button.click( |
|
fn=get_image_description, |
|
inputs=[api_key_input, image_input], |
|
outputs=output |
|
) |
|
|
|
gr.Markdown( |
|
""" |
|
--- |
|
**Note:** Your API key is used only for this session and is not stored. |
|
""" |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
demo.launch() |
|
|