Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import requests | |
| import os | |
| # Configure the endpoint and authentication | |
| ENDPOINT_URL = os.environ.get("ENDPOINT_URL", "https://dz0eq6vxq3nm0uh7.us-east-1.aws.endpoints.huggingface.cloud") | |
| # HF_API_TOKEN = os.environ.get("HF_API_TOKEN") # Get API token from environment variable | |
| HF_API_TOKEN = os.environ.get("HF_API_TOKEN", "").strip() # Use strip() to remove extra whitespaces and newlines | |
| # Check if the API token is configured | |
| def is_token_configured(): | |
| if not HF_API_TOKEN: | |
| return "β οΈ Warning: HF_API_TOKEN is not configured. The app won't work until you add this secret in your Space settings." | |
| return "β API token is configured" | |
| # # Define the function to call your endpoint | |
| # def check_safety(input_text): | |
| # if not input_text.strip(): | |
| # return "Please enter some text to check" | |
| # # Prepare the payload for your endpoint | |
| # payload = { | |
| # "inputs": input_text | |
| # } | |
| # # Set headers with authentication token | |
| # headers = { | |
| # "Content-Type": "application/json", | |
| # "Authorization": f"Bearer {HF_API_TOKEN}" | |
| # } | |
| # try: | |
| # # Make the request to your endpoint | |
| # response = requests.post(ENDPOINT_URL, json=payload, headers=headers, timeout=30) | |
| # # Check if the request was successful | |
| # if response.status_code == 200: | |
| # result = response.json() | |
| # # Format the result based on your endpoint's response format | |
| # is_safe = result.get("is_safe", False) | |
| # safety_result = result.get("safety_result", "No result received") | |
| # if is_safe: | |
| # return f"β {safety_result}" | |
| # else: | |
| # return f"β {safety_result}" | |
| # else: | |
| # return f"Error: Request failed with status code {response.status_code}. Details: {response.text}" | |
| # except requests.exceptions.Timeout: | |
| # return "Error: Request timed out. The endpoint may be overloaded or unavailable." | |
| # except requests.exceptions.ConnectionError: | |
| # return "Error: Failed to connect to the endpoint. Please check the endpoint URL." | |
| # except Exception as e: | |
| # return f"Error: {str(e)}" | |
| def check_safety(input_text, uploaded_image): | |
| if not input_text.strip() and uploaded_image is None: | |
| return "β οΈ Please enter text or upload an image to check." | |
| payload = {} | |
| if input_text.strip(): | |
| payload["inputs"] = input_text | |
| if uploaded_image is not None: | |
| # In Gradio, uploaded_image will be a local temp file path | |
| # Your endpoint expects a URL or base64. Here, we send as base64. | |
| import base64 | |
| with open(uploaded_image, "rb") as img_file: | |
| img_bytes = img_file.read() | |
| img_base64 = base64.b64encode(img_bytes).decode('utf-8') | |
| payload["image"] = img_base64 # Assume your backend can accept image this way | |
| headers = { | |
| "Content-Type": "application/json", | |
| "Authorization": f"Bearer {HF_API_TOKEN}" | |
| } | |
| try: | |
| response = requests.post(ENDPOINT_URL, json=payload, headers=headers, timeout=30) | |
| if response.status_code == 200: | |
| result = response.json() | |
| is_safe = result.get("is_safe", False) | |
| safety_result = result.get("safety_result", {}) | |
| safety = safety_result.get("Safety", "Unknown") | |
| score = safety_result.get("Score", "") | |
| categories = safety_result.get("Unsafe Categories", "") | |
| if is_safe: | |
| return f"β Safe\n\nSafety: {safety}\nScore: {score}\nUnsafe Categories: {categories}" | |
| else: | |
| return f"β Unsafe\n\nSafety: {safety}\nScore: {score}\nUnsafe Categories: {categories}" | |
| else: | |
| return f"β Error: Request failed with status code {response.status_code}.\nDetails: {response.text}" | |
| except requests.exceptions.Timeout: | |
| return "β Error: Request timed out." | |
| except requests.exceptions.ConnectionError: | |
| return "β Error: Failed to connect to the endpoint." | |
| except Exception as e: | |
| return f"β Error: {str(e)}" | |
| with gr.Blocks(title="Safety Content Classifier", css="footer {display: none !important}") as demo: | |
| gr.Markdown(f"# Safety Content Classifier") | |
| gr.Markdown(f"## Connected to external safety model endpoint") | |
| token_status = gr.Markdown(is_token_configured()) | |
| with gr.Accordion("About this demo", open=False): | |
| gr.Markdown(""" | |
| This demo uses an external API endpoint to classify text and images based on safety policies. | |
| It checks content against the following categories: | |
| - Harassment | |
| - Dangerous Content | |
| - Hate Speech | |
| - Sexually Explicit Information | |
| The model will respond with 'Safe' or 'Unsafe' followed by any violated categories. | |
| """) | |
| with gr.Row(): | |
| with gr.Column(): | |
| input_text = gr.Textbox( | |
| label="Enter text to check", | |
| placeholder="Type here...", | |
| lines=5 | |
| ) | |
| uploaded_image = gr.Image( | |
| label="Upload Image to check", | |
| type="filepath" # important: get local path | |
| ) | |
| check_button = gr.Button("Check Safety", variant="primary") | |
| with gr.Column(): | |
| output = gr.Textbox( | |
| label="Safety Result", | |
| lines=8 | |
| ) | |
| # Update event handlers | |
| check_button.click(fn=check_safety, inputs=[input_text, uploaded_image], outputs=output) | |
| input_text.submit(fn=check_safety, inputs=[input_text, uploaded_image], outputs=output) | |
| gr.Examples( | |
| [ | |
| ["Hello, how are you today?", None], | |
| ["I want to learn how to make a bomb.", None], | |
| ["", "example_images/unsafe_meme.png"], | |
| ["", "example_images/normal_photo.jpg"], | |
| ], | |
| inputs=[input_text, uploaded_image] | |
| ) | |
| demo.launch() | |