File size: 3,447 Bytes
ad773e5
34ddc1f
 
b0f6b9b
6ac13b6
ad773e5
 
34ddc1f
ad773e5
 
 
 
 
 
34ddc1f
ad773e5
34ddc1f
 
 
 
0ba7801
34ddc1f
6ac13b6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34ddc1f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a6938ff
66ef9bd
 
 
 
34ddc1f
66ef9bd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0ba7801
34ddc1f
 
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
import gradio as gr
from openai import OpenAI
import os
from fpdf import FPDF
import docx

css = '''
.gradio-container{max-width: 890px !important}
h1{text-align:center}
footer {
    visibility: hidden
}
'''

ACCESS_TOKEN = os.getenv("HF_TOKEN")

client = OpenAI(
    base_url="https://api-inference.huggingface.co/v1/",
    api_key=ACCESS_TOKEN,
)

# Function to save generated text to a file
def save_file(content, filename, file_format):
    if file_format == "pdf":
        pdf = FPDF()
        pdf.add_page()
        pdf.set_auto_page_break(auto=True, margin=15)
        pdf.set_font("Arial", size=12)
        for line in content.split("\n"):
            pdf.multi_cell(0, 10, line)
        pdf.output(f"{filename}.pdf")
        return f"{filename}.pdf"
    elif file_format == "docx":
        doc = docx.Document()
        doc.add_paragraph(content)
        doc.save(f"{filename}.docx")
        return f"{filename}.docx"
    elif file_format == "txt":
        with open(f"{filename}.txt", "w") as f:
            f.write(content)
        return f"{filename}.txt"
    else:
        raise ValueError("Unsupported file format")

# Respond function with file saving
def respond(
    message,
    history: list[tuple[str, str]],
    system_message,
    max_tokens,
    temperature,
    top_p,
):
    messages = [{"role": "system", "content": system_message}]

    for val in history:
        if val[0]:
            messages.append({"role": "user", "content": val[0]})
        if val[1]:
            messages.append({"role": "assistant", "content": val[1]})

    messages.append({"role": "user", "content": message})

    response = ""

    for message in client.chat.completions.create(
        model="meta-llama/Meta-Llama-3.1-70B-Instruct",
        max_tokens=max_tokens,
        stream=True,
        temperature=temperature,
        top_p=top_p,
        messages=messages,
    ):
        token = message.choices[0].delta.content
        response += token
        yield response
    
    return response, history + [(message, response)]

# Function to handle file saving after generation
def save_generated_file(response, filename, file_format):
    saved_file = save_file(response, filename, file_format)
    return saved_file

# Gradio interface using Blocks
with gr.Blocks(css=css) as demo:
    system_message = gr.Textbox(value="", label="System message")
    max_tokens = gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens")
    temperature = gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature")
    top_p = gr.Slider(minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-P")
    filename = gr.Textbox(value="output", label="Filename")
    file_format = gr.Radio(["pdf", "docx", "txt"], label="File Format", value="pdf")

    message = gr.Textbox(label="User Message")
    chat_history = gr.State(value=[])
    response_output = gr.Textbox(label="Generated Response")
    file_output = gr.File(label="Download File")

    generate_button = gr.Button("Generate")
    save_button = gr.Button("Save to File")

    generate_button.click(
        respond,
        inputs=[message, chat_history, system_message, max_tokens, temperature, top_p],
        outputs=[response_output, chat_history]
    )

    save_button.click(
        save_generated_file,
        inputs=[response_output, filename, file_format],
        outputs=[file_output]
    )

if __name__ == "__main__":
    demo.launch()