create a streamlit application for a chatbot, like chatgpt. This page need be possible keep the historical chats in the pass, to make possible choose the what conversation I want tho continue
To upload files, please first save the app
import streamlit as st
from datetime import datetime
from sqlalchemy import create_engine, Column, Integer, String, Text, DateTime, ForeignKey
from sqlalchemy.orm import Session, DeclarativeBase, relationship
# Database setup
class Base(DeclarativeBase):
pass
class Conversation(Base):
__tablename__ = 'conversations'
id = Column(Integer, primary_key=True)
title = Column(String(200))
created_at = Column(DateTime, default=datetime.utcnow)
messages = relationship("Message", back_populates="conversation", cascade="all, delete-orphan")
class Message(Base):
__tablename__ = 'messages'
id = Column(Integer, primary_key=True)
conversation_id = Column(Integer, ForeignKey('conversations.id'))
role = Column(String(50))
content = Column(Text)
created_at = Column(DateTime, default=datetime.utcnow)
conversation = relationship("Conversation", back_populates="messages")
# Create database and tables
engine = create_engine('sqlite:///chat_history.db')
Base.metadata.create_all(engine)
def get_or_create_conversation(session, conversation_id=None):
if conversation_id:
return session.query(Conversation).filter_by(id=conversation_id).first()
new_conv = Conversation(title=f"New Chat {datetime.now().strftime('%Y-%m-%d %H:%M')}")
session.add(new_conv)
session.commit()
return new_conv
# Initialize session states
if 'current_conversation_id' not in st.session_state:
st.session_state.current_conversation_id = None
# Page layout
st.title("ChatBot with History")
# Sidebar with conversation history
with st.sidebar:
st.title("Conversations")
# New chat button
if st.button("New Chat"):
st.session_state.current_conversation_id = None
st.rerun()
# List existing conversations
with Session(engine) as session:
conversations = session.query(Conversation).order_by(Conversation.created_at.desc()).all()
for conv in conversations:
if st.button(f"📝 {conv.title}", key=f"conv_{conv.id}"):
st.session_state.current_conversation_id = conv.id
st.rerun()
# Main chat interface
with Session(engine) as session:
# Get or create conversation
current_conversation = get_or_create_conversation(session, st.session_state.current_conversation_id)
st.session_state.current_conversation_id = current_conversation.id
# Display existing messages
messages = session.query(Message).filter_by(conversation_id=current_conversation.id).order_by(Message.created_at).all()
for message in messages:
with st.chat_message(message.role):
st.write(message.content)
# Chat input
if prompt := st.chat_input("Type your message here..."):
# Display user message
with st.chat_message("user"):
st.write(prompt)
# Save user message
user_message = Message(
conversation_id=current_conversation.id,
role="user",
content=prompt
)
session.add(user_message)
# Generate and display assistant response
assistant_response = f"You said: {prompt}\n\nThis is a demo response. In a real application, you would integrate with an AI model here."
with st.chat_message("assistant"):
st.write(assistant_response)
# Save assistant message
assistant_message = Message(
conversation_id=current_conversation.id,
role="assistant",
content=assistant_response
)
session.add(assistant_message)
session.commit()
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?