Spaces:
Running
Running
import base64 | |
import io | |
import gradio as gr | |
from groq import Groq | |
from PIL import Image | |
import requests | |
def encode_image(image): | |
buffered = io.BytesIO() | |
image.save(buffered, format="JPEG") | |
return base64.b64encode(buffered.getvalue()).decode('utf-8') | |
def analyze_image(image, prompt, api_key, is_url=False): | |
client = Groq(api_key=api_key) | |
if is_url: | |
image_content = {"type": "image_url", "image_url": {"url": image}} | |
else: | |
base64_image = encode_image(image) | |
image_content = {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}} | |
try: | |
chat_completion = client.chat.completions.create( | |
messages=[ | |
{ | |
"role": "user", | |
"content": [ | |
{"type": "text", "text": prompt}, | |
image_content, | |
], | |
} | |
], | |
model="llava-v1.5-7b-4096-preview", | |
) | |
return chat_completion.choices[0].message.content | |
except Exception as e: | |
return f"Error: {str(e)}" | |
def check_content_safety(image_description, api_key): | |
client = Groq(api_key=api_key) | |
try: | |
chat_completion = client.chat.completions.create( | |
messages=[ | |
{"role": "system", "content": "You are a content safety classifier. Analyze the given text and determine if it contains any unsafe or inappropriate content."}, | |
{"role": "user", "content": f"Please analyze this image description for any unsafe or inappropriate content: {image_description}"} | |
], | |
model="llama-guard-3-8b", | |
) | |
return chat_completion.choices[0].message.content | |
except Exception as e: | |
return f"Error: {str(e)}" | |
def process_image(image, url, prompt, api_key): | |
if image is not None: | |
return analyze_image(image, prompt, api_key), check_content_safety(analyze_image(image, prompt, api_key), api_key) | |
elif url: | |
try: | |
response = requests.get(url) | |
image = Image.open(io.BytesIO(response.content)) | |
return analyze_image(url, prompt, api_key, is_url=True), check_content_safety(analyze_image(url, prompt, api_key, is_url=True), api_key) | |
except: | |
return "Invalid image URL. Please provide a direct link to an image.", "" | |
else: | |
return "Please provide an image to analyze.", "" | |
def launch(): | |
with gr.Blocks( | |
theme=gr.themes.Default(primary_hue="orange"), | |
css=""" | |
#app-container { max-width: 1000px; margin: auto; padding: 10px; } | |
#title { text-align: center; margin-bottom: 10px; font-size: 24px; } | |
#groq-badge { text-align: center; margin-top: 10px; } | |
.gr-button { border-radius: 15px; } | |
.gr-input, .gr-box { border-radius: 10px; } | |
.gr-form { gap: 5px; } | |
.gr-block.gr-box { padding: 10px; } | |
.gr-paddle { height: auto; } | |
""" | |
) as demo: | |
with gr.Column(elem_id="app-container"): | |
gr.Markdown("# πΌοΈ Groq x Gradio Image Analysis and Content Safety Check", elem_id="title") | |
with gr.Row(): | |
api_key = gr.Textbox(label="Groq API Key:", type="password", scale=2) | |
prompt = gr.Textbox( | |
label="Image Analysis Prompt:", | |
value="Describe the image content.", | |
scale=3 | |
) | |
with gr.Row(): | |
with gr.Column(scale=1): | |
image_input = gr.Image(type="pil", label="Upload Image:", height=200, sources=["upload"]) | |
with gr.Column(scale=1): | |
url_input = gr.Textbox(label="Or Paste Image URL:", lines=1) | |
analyze_button = gr.Button("π Analyze Image", variant="primary") | |
with gr.Row(): | |
with gr.Column(): | |
analysis_output = gr.Textbox(label="Image Analysis with LlaVA 1.5 7B:", lines=6) | |
with gr.Column(): | |
safety_output = gr.Textbox(label="Safety Check with Llama Guard 3 8B:", lines=6) | |
analyze_button.click( | |
fn=process_image, | |
inputs=[image_input, url_input, prompt, api_key], | |
outputs=[analysis_output, safety_output] | |
) | |
with gr.Row(): | |
with gr.Column(): | |
gr.HTML(""" | |
<div id="groq-badge"> | |
<div style="color: #f55036; font-weight: bold; font-size: 1em;">β‘ POWERED BY GROQ β‘</div> | |
</div> | |
""") | |
with gr.Column(): | |
gr.Markdown(""" | |
**How to use this app:** | |
1. Enter your [Groq API Key](https://console.groq.com/keys) in the provided field. | |
2. Upload an image file or paste an image URL. | |
3. Use default prompt or enter custom prompt for image analysis. | |
4. Click "Analyze Image" to check for content safety. | |
""") | |
demo.launch() | |
if __name__ == "__main__": | |
launch() |