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("""