Spaces:
Sleeping
Sleeping
File size: 4,700 Bytes
c5edfc1 a4de076 272f768 a4de076 aa99297 a4de076 aa99297 a4de076 aa99297 a4de076 abf5905 272f768 aa99297 272f768 aa99297 272f768 abf5905 aa99297 abf5905 272f768 abf5905 321cb55 |
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 |
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):
# Combine profile info and last 7 days logs
context = []
for k, v in profile.items():
context.append(f"{k.capitalize()}: {v}")
for d in sorted(daily.keys(), reverse=True)[:7]:
context.append(f"On {d}: {daily[d].get('log','')}")
return "\n".join(context)
# QA Pipeline - loads once and is reused
qa_pipeline = pipeline("question-answering", model="deepset/roberta-base-squad2")
def chatbot_qa(user_q):
context = build_context(profile, daily)
try:
result = qa_pipeline(question=user_q, context=context)
answer = result["answer"].strip()
# If the model cannot answer, it often returns '' or 'empty'
if not answer or answer.lower() in ["empty", ""]:
return "Sheetal hasn't shared that yet!"
return answer
except Exception as e:
return f"Error: {e}"
def save_profile_and_log(name, city, job, about, freeform):
today = str(date.today())
profile.update({
"name": name,
"city": city,
"job": job,
"about": about
})
save_json(PROFILE_FILE, profile)
daily[today] = {"log": freeform}
save_json(DAILY_FILE, daily)
logs = ""
for d in sorted(daily.keys(), reverse=True)[:5]:
logs += f"**{d}**: {daily[d]['log']}\n"
return (
"β
Profile & log updated!",
logs
)
def recent_logs():
logs = ""
for d in sorted(daily.keys(), reverse=True)[:5]:
logs += f"**{d}**: {daily[d]['log']}\n"
return logs
ADMIN_PASSWORD = "YourSecret123" # CHANGE THIS!
def check_password(password):
if password == ADMIN_PASSWORD:
return gr.update(visible=True), gr.update(value="", visible=False)
else:
return gr.update(visible=False), gr.update(value="β Access denied. Try again.", visible=True)
def show_profile():
return json.dumps(profile, indent=2), json.dumps(daily, indent=2)
with gr.Blocks(title="Sheetal's Chatbot") as demo:
gr.Markdown("# πΈ Sheetal's Personal Chatbot")
gr.Markdown("Ask anything about Sheetal!")
with gr.Tab("π Admin (Sheetal)"):
admin_password = gr.Textbox(label="Enter admin password", type="password", max_lines=1)
unlock_panel = gr.Button("Unlock Admin Panel")
password_status = gr.Textbox(label="Password status", value="", interactive=False, visible=False)
with gr.Column(visible=False) as admin_panel:
with gr.Row():
name = gr.Textbox(label="Name", value=profile.get("name", "Sheetal"), max_lines=1)
city = gr.Textbox(label="City", value=profile.get("city", ""), max_lines=1)
job = gr.Textbox(label="Profession", value=profile.get("job", ""), max_lines=1)
about = gr.Textbox(label="About You", value=profile.get("about", ""), lines=2, max_lines=3)
today_log = gr.Textbox(label="What do you want to remember about today?", value=daily.get(str(date.today()), {}).get("log", ""), lines=2, max_lines=3)
save_btn = gr.Button("πΎ Save Profile & Today's Log")
admin_status = gr.Markdown("")
logs_output = gr.Markdown(recent_logs())
save_btn.click(
fn=save_profile_and_log,
inputs=[name, city, job, about, today_log],
outputs=[admin_status, logs_output]
)
# Debug: show current data
show_btn = gr.Button("Show Current Data")
profile_out = gr.Textbox(label="Profile JSON")
daily_out = gr.Textbox(label="Daily JSON")
show_btn.click(fn=show_profile, outputs=[profile_out, daily_out])
unlock_panel.click(
fn=check_password,
inputs=[admin_password],
outputs=[admin_panel, password_status]
)
with gr.Tab("π¬ Ask 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, lines=2, max_lines=4)
ask_btn.click(
fn=chatbot_qa,
inputs=user_q,
outputs=answer_box
)
if __name__ == "__main__":
demo.launch()
|