File size: 4,821 Bytes
418ed18
 
941bf52
 
 
 
 
 
 
 
 
 
 
 
 
 
b14c6ee
941bf52
 
 
 
 
 
 
 
 
 
 
 
348c6ea
 
 
 
 
 
aaf4dac
 
 
8ed4bb7
aaf4dac
 
941bf52
 
 
 
 
 
 
 
 
 
 
 
 
 
ad77aaa
941bf52
 
 
 
eca5d95
 
 
86e2152
2172c52
 
941bf52
a8fae85
 
 
 
 
 
2172c52
 
 
 
 
 
 
a8fae85
 
 
 
 
 
 
 
aaf4dac
8ed4bb7
aaf4dac
 
 
 
 
 
 
941bf52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
348c6ea
 
 
 
 
083c0a6
941bf52
 
 
 
 
 
 
083c0a6
941bf52
 
 
 
 
 
 
 
 
 
 
 
e81543b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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-3.5-turbo", # NOTE: feel free to change it to "gpt-4" or "gpt-4o"
            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("Yin's Profile πŸ€–")


with st.sidebar:
    with st.expander("Instruction Manual"):
        st.markdown("""
            ## Yin's Profile πŸ€– Chatbot
            This Streamlit app allows you to chat with GPT-4o model.
            ### How to Use:
            1. **Input**: Type your prompt into the chat input box labeled "What is up?".
            2. **Response**: The app will display a response from GPT-4o.
            3. **Chat History**: Previous conversations will be shown on the app.
            ### 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/)
            Enjoy chatting with Yin's assistant!
        """)

    # Example:
    st.success("Example: Who is Yiqiao Yin?")
    st.success("Example: What did Yiqiao do at graduate school?")
    st.success("Example: Where to find published papers by Yiqiao?")
    st.success("Example: What is Yiqiao's view on AI?")
    # st.success("Example: What are some online links by Yiqiao I can read about?")
    # st.success("Example: What is Yiqiao's view on stock market?")


    # Add a button to clear the session state
    if st.button("Clear Session"):
        st.session_state.messages = []
        st.experimental_rerun()

    # Consulting
    stripe_payment_link_consulting = os.environ["STRIPE_PAYMENT_LINK_CONSULTING"]
    st.markdown(
        f"""
        Want website with copilot like mine? Schedule an appointment with me [here]({stripe_payment_link_consulting})
        """
    )
    # Donation
    stripe_payment_link = os.environ["STRIPE_PAYMENT_LINK"]
    st.markdown(
        f"""
        Want to support me? πŸ˜„ Click here using this [link]({stripe_payment_link}).
        """
    )

    # 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 = []

# Display chat messages from history on app rerun
for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.markdown(message["content"])

# 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)

# 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": "system", "content": f"You know the following about Mr. Yiqiao Yin: {yiqiaoyin_profile}"})
    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})