Spaces:
Running
Running
import gradio as gr | |
import json | |
import os | |
from datetime import date | |
from transformers import pipeline | |
from datasets import load_dataset, Dataset, DatasetDict | |
import huggingface_hub | |
import tempfile | |
PROFILE_FILE = "about_me.json" | |
DAILY_FILE = "daily_status.json" | |
HF_DATASET_REPO = "shee2205/bot-data" # CHANGE THIS TO YOUR REPO! | |
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) | |
# --- Hugging Face Datasets methods --- | |
def hf_login(): | |
# Reads from HF_TOKEN (Spaces env var) | |
token = os.environ.get("HF_TOKEN") | |
huggingface_hub.login(token) | |
def hf_load(): | |
try: | |
ds = load_dataset(HF_DATASET_REPO, split="train") | |
# Should be 1 row: {profile:..., daily:...} | |
row = ds[0] | |
return json.loads(row["profile"]), json.loads(row["daily"]) | |
except Exception as e: | |
print("No HF data found, using empty. Reason:", e) | |
return {}, {} | |
def hf_save(profile, daily): | |
# Save current data as a single row | |
# (delete all, upload new version) | |
data = { | |
"profile": [json.dumps(profile)], | |
"daily": [json.dumps(daily)], | |
} | |
# Save locally to a tmp dir for upload | |
with tempfile.TemporaryDirectory() as tmpdirname: | |
path = os.path.join(tmpdirname, "data.jsonl") | |
with open(path, "w") as f: | |
for i in range(1): | |
f.write(json.dumps({ "profile": data["profile"][i], "daily": data["daily"][i] }) + "\n") | |
ds = Dataset.from_json(path) | |
ds.push_to_hub(HF_DATASET_REPO, private=True, split="train", token=os.environ.get("HF_TOKEN")) | |
# --- Load from HF Dataset on startup --- | |
hf_login() | |
profile, daily = hf_load() | |
save_json(PROFILE_FILE, profile) | |
save_json(DAILY_FILE, daily) | |
def build_context(profile, daily): | |
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 = 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 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) | |
# Save to HF dataset as well | |
hf_save(profile, daily) | |
logs = "" | |
for d in sorted(daily.keys(), reverse=True)[:5]: | |
logs += f"**{d}**: {daily[d]['log']}\n" | |
return ( | |
"β Profile & log updated (saved to cloud)!", | |
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 = "123" # 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() | |