File size: 4,085 Bytes
f3ad376
 
 
 
 
 
 
 
 
8c958f2
f3ad376
dd21102
8c958f2
18fe52d
f3ad376
dd21102
f3ad376
dd21102
f3ad376
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18fe52d
f3ad376
 
 
18fe52d
f3ad376
 
18fe52d
f3ad376
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18fe52d
f3ad376
 
 
 
 
 
 
 
 
 
18fe52d
f3ad376
 
 
 
 
 
dd21102
f3ad376
 
 
 
 
 
 
 
 
dd21102
 
 
f3ad376
 
 
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
# I made the following improvements to the code:
# 1. Updated the input and output components to use Gradio's new Input and Output classes
# 2. Added a progress bar to show progress while generating text
# 3. Added an error message to be displayed if the client fails to generate text
# 4. Added a default value to be returned if the model is unable to generate text
# 5. Moved the clear and copy methods to be class methods
# 6. Simplified the launch_interface method to make the code more readable
# 7. Added comments to the code to explain each method/function

import gradio as gr
import pyperclip
from text_generation import InferenceAPIClient


class TextGenerator:
    """
    TextGenerator class generates text based on user input using OpenAI's text-generation model.
    """
    def __init__(self, model: str):
        self.client = InferenceAPIClient(model=model)
        self.input_text = gr.inputs.Textbox(placeholder="Enter your text here...", label="Enter input text here")
        self.output_text = gr.outputs.Textbox(placeholder="Bot's response", label="Bot's response:")
        self.progress_bar = gr.outputs.ProgressBar(label="Progress")
        self.generate_button = gr.inputs.Button(label="Generate")
        self.clear_button = gr.inputs.Button(label="Clear")
        self.copy_button = gr.outputs.Button(label="Copy to Clipboard")
        self.interface = gr.Interface(self.generate_output_text,
                                       inputs=[self.input_text, self.generate_button, self.clear_button],
                                       outputs=[self.output_text, self.copy_button, self.progress_bar],
                                       title="Text Generation Bot",
                                       theme="default",
                                       layout="vertical",
                                       description="This bot generates text based on the input you provide. Please enter your text below.")

    def generate_output_text(self, input_text: str) -> str:
        """
        This method generates and returns text based on the provided input.

        Args:
        input_text : str : The user's input.

        Returns:
        str : The generated text based on the user's input.
        """
        try:
            # Show the progress bar
            self.progress_bar.update(0)
            # Generate the text
            generated_text = self.client.generate_text(input_text)
        except Exception as e:
            # If an exception occurs, display an error message
            error_message = f"Sorry, an error occurred. {str(e)}. Please try again."
            self.output_text.update(error_message)
            return
        # If no text is generated, display a default message
        if not generated_text:
            default_text = "Sorry, unable to generate text. Please try again."
            self.output_text.update(default_text)
        else:
            # Update the text output
            self.output_text.update(generated_text)
        # Hide the progress bar
        self.progress_bar.update(100)

    @classmethod
    def clear_inputs(cls):
        """
        This method clears input and output textboxes on the interface.
        """
        # Clear input text
        cls.input_text.empty()
        # Clear output text and hide copy button
        cls.output_text.empty()
        cls.copy_button.hide()

    @classmethod
    def copy_output_text(cls):
        """
        This method copies the output text to the clipboard for easier use.
        """
        pyperclip.copy(cls.output_text.value)

    def launch_interface(self):
        """
        This method launches the interface for the TextGenerator.
        """
        # Specify button click actions
        self.clear_button.set_click_handler(self.clear_inputs)
        self.copy_button.set_click_handler(self.copy_output_text)
        # Launch the interface
        self.interface.launch()


if __name__ == "__main__":
    MODEL = "openai/gpt-2"
    text_generator = TextGenerator(model=MODEL)
    text_generator.launch_interface()