File size: 3,362 Bytes
809b1fe
ad77051
 
 
 
 
f76e239
4dd6ed2
 
 
 
1e13411
 
 
4dd6ed2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1e13411
 
4dd6ed2
 
ad77051
1e13411
 
 
 
 
 
 
 
 
 
8fd1381
 
 
4dd6ed2
8fd1381
 
 
 
 
 
 
ad77051
8fd1381
 
 
 
ad77051
8fd1381
 
ad77051
8fd1381
 
f76e239
8fd1381
 
 
 
 
 
ad77051
 
 
 
 
 
 
 
 
 
27cad67
ad77051
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1e13411
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import gradio as gr
from gradio_client import Client
import matplotlib.pyplot as plt
import numpy as np
import io
from PIL import Image
import base64
import os
import requests

# Load Hugging Face token from environment variable
HF_TOKEN = os.getenv("HF_TOKEN")
if not HF_TOKEN:
    raise ValueError("Hugging Face token not found in environment variables.")

def get_dynamic_endpoint():
    """
    Fetch the dynamic endpoint using the Hugging Face API.
    Returns:
        str: The current dynamic endpoint.
    """
    api_url = "https://api.huggingface.co/space/duchaba/friendly-text-moderation"
    headers = {"Authorization": f"Bearer {HF_TOKEN}"}

    response = requests.get(api_url, headers=headers)
    response.raise_for_status()  # Raise an error for bad status codes

    # Extract the endpoint from the response
    data = response.json()
    endpoint = data.get("url")
    if not endpoint:
        raise ValueError("Endpoint URL not found in the response.")
    return endpoint

def moderate_text(text, safer_value):
    """
    Moderate the given text using the Hugging Face API.
    
    Args:
        text (str): The text to be moderated.
        safer_value (float): The safer value to be used for moderation.
    
    Returns:
        tuple: A tuple containing the moderation result and the generated image.
    """
    try:
        # Fetch the dynamic endpoint
        dynamic_endpoint = get_dynamic_endpoint()

        # Initialize the client with the dynamic endpoint
        client = Client(dynamic_endpoint, hf_token=HF_TOKEN)
        result = client.predict(
            text,
            safer_value,
            api_name="/censor_me"
        )

        # Ensure the result contains the expected data
        base64_data = result.get('plot', '').split(',')[1] if 'plot' in result else None
        if not base64_data:
            raise ValueError("Expected plot data not found in the result.")

        # Decode base64 to bytes
        img_data = base64.b64decode(base64_data)

        # Convert bytes to PIL Image
        img = Image.open(io.BytesIO(img_data))

        return result, img
    
    except Exception as e:
        # Log the error for debugging purposes
        print(f"Error occurred: {e}")
        return str(e), None

# Define the Gradio interface
demo = gr.Interface(
    fn=moderate_text,
    inputs=[
        gr.Textbox(label="Enter Text:", placeholder="Type your text here...", lines=5),
        gr.Slider(minimum=0.005, maximum=0.1, value=0.005, label="Personalize Safer Value: (larger value is less safe)")
    ],
    outputs=[gr.Textbox(label="Moderated Text:", lines=5), gr.Image(type="pil", label="Moderation Pie Chart")],
    title="Friendly Text Moderator",
    description="Enter text to be moderated and adjust the safer value to see how it affects the moderation."
)

# Customize the CSS
custom_css = """
body {
    background-color: #f5f5f5;
    font-family: Arial, sans-serif;
}
.gradio-container {
    max-width: 800px;
    margin: auto;
    padding: 20px;
    background-color: white;
    border: 1px solid #ddd;
    border-radius: 8px;
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
.gr-button {
    background-color: #4CAF50;
    color: white;
}
.gr-button:hover {
    background-color: #45a049;
}
"""

# Add the custom CSS to the Gradio app
demo.css = custom_css

# Launch the app
demo.launch()