File size: 3,528 Bytes
ad773e5
 
 
b0f6b9b
edb2d41
ad773e5
 
b0f6b9b
ad773e5
 
 
 
 
 
 
 
 
 
 
 
 
edb2d41
 
 
 
 
 
 
 
fec8e6e
edb2d41
ad773e5
 
 
 
 
 
 
 
 
 
b0f6b9b
ad773e5
 
 
 
 
 
 
 
b0f6b9b
ad773e5
 
 
b0f6b9b
 
 
 
 
 
edb2d41
b0f6b9b
 
 
 
edb2d41
b0f6b9b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
edb2d41
b0f6b9b
 
 
edb2d41
0ba7801
 
 
 
b0f6b9b
 
 
 
ad0387f
 
9c151a0
b0f6b9b
edb2d41
 
 
 
ad773e5
0ba7801
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ad773e5
edb2d41
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
117
118
119
120
121
122
123
124
125
126
import gradio as gr
from openai import OpenAI
import os
from fpdf import FPDF
from docx import Document

css = '''
.gradio-container{max-width: 1000px !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,
)

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-8B-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

def save_to_file(history, 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 user_message, assistant_message in history:
            pdf.multi_cell(0, 10, f"User: {user_message}")
            pdf.multi_cell(0, 10, f"Assistant: {assistant_message}")
        file_name = "chat_history.pdf"
        pdf.output(file_name)
        
    elif file_format == "DOCX":
        doc = Document()
        for user_message, assistant_message in history:
            doc.add_paragraph(f"User: {user_message}")
            doc.add_paragraph(f"Assistant: {assistant_message}")
        file_name = "chat_history.docx"
        doc.save(file_name)
        
    elif file_format == "TXT":
        file_name = "chat_history.txt"
        with open(file_name, "w") as file:
            for user_message, assistant_message in history:
                file.write(f"User: {user_message}\n")
                file.write(f"Assistant: {assistant_message}\n")
                
    return file_name

def save_conversation(history, file_format):
    file_name = save_to_file(history, file_format)
    return file_name

def save_and_download(history, file_format):
    file_name = save_conversation(history, file_format)
    return file_name

demo = gr.ChatInterface(
    respond,
    additional_inputs=[
        gr.Textbox(value="", label="System message"),
        gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
        gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
        gr.Slider(minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-P"),
        gr.Radio(["PDF", "DOCX", "TXT"], label="Save As"),
    ],
    css=css,
    theme="allenai/gradio-theme",
)

save_button = gr.Button("Save Conversation")
output_file = gr.File(label="Download File")

def handle_save(history, save_format):
    return save_conversation(history, save_format)

save_button.click(
    handle_save,
    inputs=[demo.history, demo.inputs[-1]],  # Passing history and format
    outputs=output_file
)

demo = gr.Blocks()

with demo:
    with gr.Column():
        demo.render()
        save_button.render()
        output_file.render()

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