Erik22TY commited on
Commit
7b0efa7
Β·
verified Β·
1 Parent(s): b38d46a

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +138 -0
app.py ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
3
+ import torch
4
+ from collections import defaultdict
5
+ from datetime import datetime
6
+ import pandas as pd
7
+
8
+ # PDF creation
9
+ from reportlab.pdfgen import canvas
10
+ from reportlab.lib.pagesizes import letter
11
+ import tempfile
12
+
13
+ # Model + sentiment
14
+ MODEL_NAME = "HuggingFaceTB/SmolLM2-360M-Instruct"
15
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
16
+ model = AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map="auto")
17
+ sentiment_analyzer = pipeline("sentiment-analysis")
18
+
19
+ SYSTEM_PROMPT = "You are a friendly assistant with fire vibes."
20
+
21
+ feedback_store = []
22
+ like_leaderboard = defaultdict(int)
23
+
24
+ def now_str():
25
+ return datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S UTC")
26
+
27
+ def generate_reply(prompt_str, temp, max_tokens):
28
+ inputs = tokenizer(prompt_str, return_tensors="pt").to(model.device)
29
+ gen = model.generate(
30
+ **inputs,
31
+ max_new_tokens=max_tokens,
32
+ temperature=temp,
33
+ do_sample=True
34
+ )
35
+ return tokenizer.decode(gen[0], skip_special_tokens=True)
36
+
37
+ def respond(message, history, user, temp, max_tokens):
38
+ username = user.name if user else "anonymous"
39
+ prompt = SYSTEM_PROMPT + "\n"
40
+ for msg_info in history:
41
+ prompt += f"[{msg_info['timestamp']}] {msg_info['user']}: {msg_info['user_msg']}\n"
42
+ prompt += f"[{msg_info['timestamp']}] 🧠 {msg_info['bot_msg']}\n"
43
+ prompt += f"[{now_str()}] {username}: {message}\nAssistant:"
44
+
45
+ bot_reply = generate_reply(prompt, temp, max_tokens)
46
+ sentiment = sentiment_analyzer(bot_reply)[0]
47
+ icon = "😊" if sentiment["label"] == "POSITIVE" else "😐" if sentiment["label"] == "NEUTRAL" else "☹️"
48
+ record = {
49
+ "timestamp": now_str(),
50
+ "user": username,
51
+ "user_msg": message,
52
+ "bot_msg": bot_reply,
53
+ "sentiment": sentiment,
54
+ "icon": icon
55
+ }
56
+ history.append(record)
57
+ return history
58
+
59
+ def record_feedback(history, fb):
60
+ if history:
61
+ last = history[-1]
62
+ feedback_store.append({
63
+ "timestamp": last["timestamp"],
64
+ "user_msg": last["user_msg"],
65
+ "bot_msg": last["bot_msg"],
66
+ "sentiment": last["sentiment"],
67
+ "feedback": fb
68
+ })
69
+ if fb == "like":
70
+ like_leaderboard[last["bot_msg"]] += 1
71
+ return history
72
+
73
+ def download_csv():
74
+ df = pd.DataFrame(feedback_store)
75
+ path = "/tmp/sentiment_feedback.csv"
76
+ df.to_csv(path, index=False)
77
+ return path
78
+
79
+ def leaderboard_text():
80
+ sorted_leader = sorted(like_leaderboard.items(), key=lambda x: x[1], reverse=True)
81
+ lines = [f"{i+1}. {msg[:60]}... β†’ {count} likes" for i,(msg,count) in enumerate(sorted_leader)]
82
+ return "\n".join(lines)
83
+
84
+ def export_pdf(history):
85
+ # Create a temp PDF with chat content
86
+ temp_pdf = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf").name
87
+ c = canvas.Canvas(temp_pdf, pagesize=letter)
88
+ textobj = c.beginText(40, 750)
89
+ textobj.setFont("Helvetica", 10)
90
+
91
+ for msg in history:
92
+ line = f"[{msg['timestamp']}] {msg['user']}: {msg['user_msg']}"
93
+ textobj.textLine(line)
94
+ line2 = f" Assistant {msg['icon']}: {msg['bot_msg']}"
95
+ textobj.textLine(line2)
96
+ textobj.textLine("")
97
+ c.drawText(textobj)
98
+ c.save()
99
+ return temp_pdf
100
+
101
+ with gr.Blocks() as demo:
102
+ gr.Markdown("## πŸ”₯ Smol Chatbot πŸ”₯")
103
+
104
+ login_button = gr.LoginButton()
105
+ history_state = gr.State([])
106
+
107
+ with gr.Row():
108
+ temp_slider = gr.Slider(0.1, 1.2, value=0.7, label="Temperature")
109
+ max_tokens_slider = gr.Slider(20, 300, value=150, step=10, label="Max Tokens")
110
+
111
+ msg = gr.Textbox(label="Your message")
112
+ send = gr.Button("Send")
113
+ like = gr.Button("πŸ‘ Like")
114
+ dislike = gr.Button("πŸ‘Ž Dislike")
115
+ download_csv_btn = gr.Button("πŸ“₯ Download CSV")
116
+ download_pdf_btn = gr.Button("πŸ“„ Download PDF")
117
+ leaderboard_btn = gr.Button("πŸ† Leaderboard")
118
+ leaderboard_out = gr.Textbox(label="Leaderboard")
119
+
120
+ def on_send(message, history, user, temp, max_toks):
121
+ new_hist = respond(message, history, user, temp, max_toks)
122
+ return "", new_hist
123
+
124
+ send.click(
125
+ on_send,
126
+ [msg, history_state, login_button, temp_slider, max_tokens_slider],
127
+ [msg, history_state],
128
+ )
129
+
130
+ like.click(record_feedback, history_state, history_state, _js="() => ['like']")
131
+ dislike.click(record_feedback, history_state, history_state, _js="() => ['dislike']")
132
+
133
+ download_csv_btn.click(download_csv, None, gr.File())
134
+ download_pdf_btn.click(export_pdf, history_state, gr.File())
135
+
136
+ leaderboard_btn.click(lambda: leaderboard_text(), None, leaderboard_out)
137
+
138
+ demo.launch()