Spaces:
Running
Running
from datetime import datetime | |
import streamlit as st | |
import os | |
from openai import OpenAI | |
class ChatBot: | |
def __init__(self): | |
self.client = OpenAI(api_key=os.environ["OPENAI_API_KEY"]) | |
self.history = [{"role": "system", "content": "You are a helpful assistant."}] | |
def generate_response(self, prompt: str) -> str: | |
self.history.append({"role": "user", "content": prompt}) | |
completion = self.client.chat.completions.create( | |
model="gpt-4o-mini", # NOTE: feel free to change it to "gpt-4" or "our LLM" | |
messages=self.history | |
) | |
response = completion.choices[0].message.content | |
self.history.append({"role": "assistant", "content": response}) | |
return response | |
def get_history(self) -> list: | |
return self.history | |
# Read the content of the Markdown file | |
def read_markdown_file(file_path): | |
with open(file_path, 'r', encoding='utf-8') as file: | |
return file.read() | |
# Credit: Time | |
def current_year(): | |
now = datetime.now() | |
return now.year | |
st.set_page_config(layout="wide") | |
st.title("A.V.A. π€: How can I help?") | |
with st.sidebar: | |
# Example: | |
st.write("## Examples:") | |
if st.button("Who is Yiqiao Yin?"): | |
st.session_state["example_prompt"] = "Who is Yiqiao Yin?" | |
if st.button("Where to find published papers by Yiqiao?"): | |
st.session_state["example_prompt"] = "Where to find published papers by Yiqiao?" | |
if st.button("What is Yiqiao's view on AI?"): | |
st.session_state["example_prompt"] = "What is Yiqiao's view on AI?" | |
if st.button("What is Yiqiao's view on stock market?"): | |
st.session_state["example_prompt"] = "What is Yiqiao's view on stock market?" | |
# Add a button to clear the session state | |
st.write("---------------------------------") | |
if st.button("Clear Session"): | |
st.session_state.messages = [] | |
st.experimental_rerun() | |
st.markdown(""" | |
### Credits: | |
- **Developer**: [Yiqiao Yin](https://www.y-yin.io/) | [App URL](https://huggingface.co/spaces/eagle0504/y-yin-homepage) | [LinkedIn](https://www.linkedin.com/in/yiqiaoyin/) | [YouTube](https://youtube.com/YiqiaoYin/) | |
""") | |
# Credit: | |
current_year = current_year() # This will print the current year | |
st.markdown( | |
f""" | |
<h6 style='text-align: left;'>Copyright Β© 2010-{current_year} Present Yiqiao Yin</h6> | |
""", | |
unsafe_allow_html=True, | |
) | |
# Initialize chat history | |
if "messages" not in st.session_state: | |
st.session_state.messages = [] | |
# Ensure messages are a list of dictionaries | |
if not isinstance(st.session_state.messages, list): | |
st.session_state.messages = [] | |
if not all(isinstance(msg, dict) for msg in st.session_state.messages): | |
st.session_state.messages = [] | |
# Path to the Markdown file | |
md_file_path = 'docs/yiqiao_yin.md' | |
# Get the content of the Markdown file | |
yiqiaoyin_profile = read_markdown_file(md_file_path) | |
# Add the system message with the profile information to the chat history if it hasn't been added yet | |
if not any(msg["role"] == "system" for msg in st.session_state.messages): | |
st.session_state.messages.append({"role": "system", "content": f"You know the following about Mr. Yiqiao Yin: {yiqiaoyin_profile}"}) | |
# Display chat messages from history on app rerun | |
for message in st.session_state.messages: | |
if message["role"] != "system": # Skip system messages | |
with st.chat_message(message["role"]): | |
st.markdown(message["content"]) | |
# Check if an example prompt was selected | |
if "example_prompt" in st.session_state and st.session_state["example_prompt"]: | |
example_prompt = st.session_state.pop("example_prompt") # Remove after using | |
st.session_state.messages.append({"role": "user", "content": example_prompt}) | |
# Display user message in chat message container | |
st.chat_message("user").markdown(example_prompt) | |
# API Call | |
bot = ChatBot() | |
bot.history = st.session_state.messages.copy() # Update history from messages | |
response = bot.generate_response(example_prompt) | |
# Display assistant response in chat message container | |
with st.chat_message("assistant"): | |
st.markdown(response) | |
# Add assistant response to chat history | |
st.session_state.messages.append({"role": "assistant", "content": response}) | |
# React to user input | |
if prompt := st.chat_input("π Ask any question or feel free to use the examples provided in the left sidebar."): | |
# Display user message in chat message container | |
st.chat_message("user").markdown(prompt) | |
# Add user message to chat history | |
st.session_state.messages.append({"role": "user", "content": prompt}) | |
# API Call | |
bot = ChatBot() | |
bot.history = st.session_state.messages.copy() # Update history from messages | |
response = bot.generate_response(prompt) | |
# Display assistant response in chat message container | |
with st.chat_message("assistant"): | |
st.markdown(response) | |
# Add assistant response to chat history | |
st.session_state.messages.append({"role": "assistant", "content": response}) | |