File size: 4,140 Bytes
c5edfc1
a4de076
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
127
128
129
130
131
132
133
134
135
136
137
import gradio as gr
import json
import os
from datetime import date
from transformers import pipeline

PROFILE_FILE = "about_me.json"
DAILY_FILE = "daily_status.json"

def load_json(path, default):
    if os.path.exists(path):
        with open(path) as f:
            return json.load(f)
    return default

def save_json(path, data):
    with open(path, "w") as f:
        json.dump(data, f, indent=2)

profile = load_json(PROFILE_FILE, {})
daily = load_json(DAILY_FILE, {})

def build_context(profile, daily):
    recent_days = sorted(daily.keys(), reverse=True)[:7]
    daily_lines = "\n".join([f"{d}: {daily[d].get('log','')}" for d in recent_days])
    context = (
        f"Profile:\n{json.dumps(profile, indent=2)}\n"
        f"Recent daily logs:\n{daily_lines}\n"
        "You are a helpful assistant. Answer only using the provided information. "
        "If you don't know the answer, reply: 'Sheetal hasn't shared that yet!'"
    )
    return context

def get_llm():
    return pipeline(
        "text-generation",
        model="HuggingFaceH4/zephyr-7b-beta",
        max_new_tokens=256,
        do_sample=True,
        temperature=0.7,
        trust_remote_code=True,
    )

llm = None

def chatbot_qa(user_q):
    global llm
    if llm is None:
        llm = get_llm()
    context = build_context(profile, daily)
    prompt = f"System: {context}\nUser: {user_q}\nAssistant:"
    outputs = llm(prompt, max_new_tokens=256)
    answer = outputs[0]["generated_text"].split("Assistant:")[-1].strip()
    return answer

def update_profile(name, city, job, about):
    profile.update({
        "name": name,
        "city": city,
        "job": job,
        "about": about
    })
    save_json(PROFILE_FILE, profile)
    return "Profile updated!"

def update_daily_log(freeform):
    today = str(date.today())
    daily[today] = {"log": freeform}
    save_json(DAILY_FILE, daily)
    return f"Today's log saved! ({today})"

def get_profile_defaults():
    return (
        profile.get("name", "Sheetal"),
        profile.get("city", ""),
        profile.get("job", ""),
        profile.get("about", "")
    )

def get_today_log():
    today = str(date.today())
    return daily.get(today, {}).get("log", "")

def recent_logs():
    logs = ""
    for d in sorted(daily.keys(), reverse=True)[:5]:
        logs += f"**{d}**: {daily[d]['log']}\n"
    return logs

with gr.Blocks(title="Sheetal's Personal Chatbot") as demo:
    gr.Markdown("# 🌸 Sheetal's Personal Chatbot")

    with gr.Tab("πŸ“ Admin (Sheetal)"):
        gr.Markdown("### Edit Your Profile")
        with gr.Row():
            name = gr.Textbox(label="Name", value=profile.get("name", "Sheetal"))
            city = gr.Textbox(label="City", value=profile.get("city", ""))
            job = gr.Textbox(label="Profession", value=profile.get("job", ""))
        about = gr.Textbox(label="A few lines about you", value=profile.get("about", ""))
        save_profile_btn = gr.Button("Save Profile")
        profile_output = gr.Textbox(label="", interactive=False)

        save_profile_btn.click(
            fn=update_profile,
            inputs=[name, city, job, about],
            outputs=profile_output
        )

        gr.Markdown("---")
        gr.Markdown("### 🌱 Add Your Daily Status (free text!)")
        today_log = gr.Textbox(label="What do you want to remember about today?", value=get_today_log())
        save_log_btn = gr.Button("Save Today's Log")
        log_output = gr.Textbox(label="", interactive=False)

        save_log_btn.click(
            fn=update_daily_log,
            inputs=today_log,
            outputs=log_output
        )

        gr.Markdown("#### πŸ“… Recent Logs")
        recent_logs_box = gr.Markdown(recent_logs())

    with gr.Tab("πŸ’¬ Ask About Sheetal"):
        gr.Markdown("### πŸ’¬ Ask Anything About Sheetal")
        user_q = gr.Textbox(label="Type your question here:")
        ask_btn = gr.Button("Ask")
        answer_box = gr.Textbox(label="Bot answer", interactive=False)

        ask_btn.click(
            fn=chatbot_qa,
            inputs=user_q,
            outputs=answer_box
        )

demo.launch()