KaLLaM-Demo / gui /simple_gui.py
Koalar's picture
Upload 53 files
13c6cad verified
raw
history blame
5.56 kB
# simple_chat_app.py
import gradio as gr
from datetime import datetime
# Your existing manager
from kallam.app.chatbot_manager import ChatbotManager
mgr = ChatbotManager(log_level="INFO")
# -----------------------
# Core handlers
# -----------------------
def _session_status(session_id: str) -> str:
if not session_id:
return "🔴 No active session. Click **New Session**."
s = mgr.get_session(session_id) or {}
ts = s.get("timestamp", "N/A")
model = s.get("model_used", "N/A")
total = s.get("total_messages", 0)
return (
f"🟢 **Session:** `{session_id}` \n"
f"📅 Created: {ts} \n"
f"🤖 Model: {model} \n"
f"💬 Messages: {total}"
)
def start_new_session(saved_memories: str = ""):
"""Create a brand-new session and return clean UI state."""
sid = mgr.start_session(saved_memories=saved_memories or None)
status = _session_status(sid)
history = [] # gr.Chatbot(messages) shape: list[dict(role, content)]
return sid, history, "", status, "✅ New session created."
def send_message(user_msg: str, history: list, session_id: str):
"""Append user turn, get bot reply, and return updated history."""
if not session_id:
# Defensive: if somehow no session, auto-create one
sid, history, _, status, _ = start_new_session("")
history.append({"role": "assistant", "content": "New session spun up automatically. Proceed."})
return history, "", sid, status
if not user_msg.strip():
return history, "", session_id, _session_status(session_id)
# User turn
history = history + [{"role": "user", "content": user_msg}]
# Bot turn (your manager handles persistence)
bot = mgr.handle_message(session_id=session_id, user_message=user_msg)
history = history + [{"role": "assistant", "content": bot}]
return history, "", session_id, _session_status(session_id)
def force_summary(session_id: str):
if not session_id:
return "❌ No active session."
try:
s = mgr.summarize_session(session_id)
return f"📋 Summary updated:\n\n{s}"
except Exception as e:
return f"❌ Failed to summarize: {e}"
def lock_inputs():
# disable send + textbox
return gr.update(interactive=False), gr.update(interactive=False)
def unlock_inputs():
# re-enable send + textbox
return gr.update(interactive=True), gr.update(interactive=True)
# -----------------------
# Gradio app
# -----------------------
def create_app():
with gr.Blocks(title="Minimal Therapeutic Chat Sessions") as demo:
gr.Markdown("# Minimal Chat Sessions • clean and boring but try me.")
session_id = gr.State(value="")
with gr.Row():
status_md = gr.Markdown(value="🔄 Initializing session...")
saved_memories = gr.Textbox(
label="เนื้อหาเกี่ยวกับคุณ (optional)",
placeholder="กด ➕ session ใหม่เพื่อใช้งาน e.g., อายุ, เพศ, นิสัย",
lines=2,
)
new_btn = gr.Button("➕ session ใหม่", variant="primary")
# summarize_btn = gr.Button("📋 Summarize", variant="secondary")
chat = gr.Chatbot(label="Chat", type="messages", height=420)
with gr.Row():
msg = gr.Textbox(label="Message box", placeholder="พิมพ์ข้อความ", lines=1, scale=9)
send = gr.Button("↩", variant="primary", scale=1, min_width=40)
result_md = gr.Markdown(visible=True)
# -------- wiring --------
# On page load: create a fresh session
def _init():
sid, history, _, status, note = start_new_session("")
return sid, history, status, note
demo.load(_init, inputs=None, outputs=[session_id, chat, status_md, result_md])
# New session button
def _new(saved):
sid, history, _, status, note = start_new_session(saved or "")
return sid, history, "", status, note
new_btn.click(_new, inputs=[saved_memories], outputs=[session_id, chat, msg, status_md, result_md])
# Click flow: lock -> send -> unlock
send.click(
fn=lock_inputs,
inputs=None,
outputs=[send, msg],
queue=False, # lock applies instantly
).then(
fn=send_message,
inputs=[msg, chat, session_id],
outputs=[chat, msg, session_id, status_md],
).then(
fn=unlock_inputs,
inputs=None,
outputs=[send, msg],
queue=False,
)
# Enter/submit flow: same treatment
msg.submit(
fn=lock_inputs,
inputs=None,
outputs=[send, msg],
queue=False,
).then(
fn=send_message,
inputs=[msg, chat, session_id],
outputs=[chat, msg, session_id, status_md],
).then(
fn=unlock_inputs,
inputs=None,
outputs=[send, msg],
queue=False,
)
return demo
def main():
app = create_app()
app.launch(
share=True,
server_name="0.0.0.0",
server_port=7860,
debug=False,
show_error=True,
inbrowser=True,
)
if __name__ == "__main__":
main()