I want a page that clones the behavior of ChatGPT
To upload files, please first save the app
import streamlit as st
from openai import OpenAI
import os
from dotenv import load_dotenv
# Load environment variables
load_dotenv()
st.title("ChatGPT Clone")
# Initialize OpenAI client
client = OpenAI(api_key=os.getenv('OPENAI_API_KEY'))
# Initialize session state for messages if it doesn't exist
if "messages" not in st.session_state:
st.session_state.messages = []
# Display chat messages
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.write(message["content"])
# Chat input
if prompt := st.chat_input("What would you like to know?"):
# Add user message to chat history
st.session_state.messages.append({"role": "user", "content": prompt})
# Display user message
with st.chat_message("user"):
st.write(prompt)
# Display assistant response in chat message container
with st.chat_message("assistant"):
message_placeholder = st.empty()
full_response = ""
# Send message to OpenAI API
for response in client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": m["role"], "content": m["content"]}
for m in st.session_state.messages],
stream=True,
):
if response.choices[0].delta.content is not None:
full_response += response.choices[0].delta.content
message_placeholder.write(full_response + "▌")
message_placeholder.write(full_response)
# Add assistant response to chat history
st.session_state.messages.append({"role": "assistant", "content": full_response})
# Add a sidebar with instructions
with st.sidebar:
st.markdown("""
## Instructions
1. Enter your question in the chat input box below
2. Press Enter to send your message
3. Wait for the AI to respond
4. Your chat history will be preserved during the session
**Note:** You need to set your OpenAI API key in a `.env` file:
```
OPENAI_API_KEY=your-api-key-here
```
""")
# Clear chat button
if st.button("Clear Chat"):
st.session_state.messages = []
st.rerun()
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?