| import streamlit as st |
| from knowledge_bases import KNOWLEDGE_BASE_OPTIONS, SYSTEM_PROMPTS |
| import genparam |
| from functions import ( |
| check_password, |
| initialize_session_state, |
| setup_client, |
| fetch_response, |
| capture_tokens |
| ) |
|
|
| |
| three_column_style = """ |
| <style> |
| .stColumn { |
| padding: 0.5rem; |
| border-right: 1px solid #dedede; |
| } |
| .stColumn:last-child { |
| border-right: none; |
| } |
| .chat-container { |
| height: calc(100vh - 200px); |
| overflow-y: auto; |
| display: flex; |
| flex-direction: column; |
| } |
| .chat-messages { |
| display: flex; |
| flex-direction: column; |
| gap: 1rem; |
| } |
| </style> |
| """ |
|
|
| def main(): |
| |
| st.set_page_config( |
| page_title="Fading Moments", |
| page_icon="🌫️", |
| initial_sidebar_state="collapsed", |
| layout="wide" |
| ) |
|
|
| initialize_session_state() |
| st.markdown(three_column_style, unsafe_allow_html=True) |
| |
| |
| st.sidebar.header('The Solutioning Sages') |
| st.sidebar.divider() |
| |
| |
| selected_kb = st.sidebar.selectbox( |
| "Select Knowledge Base", |
| KNOWLEDGE_BASE_OPTIONS, |
| index=KNOWLEDGE_BASE_OPTIONS.index(st.session_state.selected_kb) |
| ) |
| |
| |
| if selected_kb != st.session_state.selected_kb: |
| st.session_state.selected_kb = selected_kb |
| |
| |
| with st.sidebar.expander("Knowledge Base Contents"): |
| st.write("📄 [Knowledge base files would be listed here]") |
| |
| |
| st.sidebar.divider() |
| active_model = genparam.SELECTED_MODEL_1 if genparam.ACTIVE_MODEL == 0 else genparam.SELECTED_MODEL_2 |
| st.sidebar.markdown("**Active Model:**") |
| st.sidebar.code(active_model) |
| |
| st.sidebar.divider() |
| |
| |
| st.sidebar.subheader("Token Usage Statistics") |
| if st.session_state.token_statistics: |
| interaction_count = 0 |
| stats_by_time = {} |
| |
| |
| for stat in st.session_state.token_statistics: |
| if stat["timestamp"] not in stats_by_time: |
| stats_by_time[stat["timestamp"]] = [] |
| stats_by_time[stat["timestamp"]].append(stat) |
| |
| |
| for timestamp, stats in stats_by_time.items(): |
| interaction_count += 1 |
| st.sidebar.markdown(f"**Interaction {interaction_count}** ({timestamp})") |
| |
| total_input = sum(stat['input_tokens'] for stat in stats) |
| total_output = sum(stat['output_tokens'] for stat in stats) |
| total = total_input + total_output |
| |
| for stat in stats: |
| st.sidebar.markdown( |
| f"_{stat['bot_name']}_ \n" |
| f"Input: {stat['input_tokens']} tokens \n" |
| f"Output: {stat['output_tokens']} tokens \n" |
| f"Total: {stat['total_tokens']} tokens" |
| ) |
| |
| st.sidebar.markdown("**Interaction Totals:**") |
| st.sidebar.markdown( |
| f"Total Input: {total_input} tokens \n" |
| f"Total Output: {total_output} tokens \n" |
| f"Total Usage: {total} tokens" |
| ) |
| st.sidebar.markdown("---") |
|
|
| if not check_password(): |
| st.stop() |
|
|
| |
| wml_credentials, client = setup_client() |
|
|
| |
| user_input = st.chat_input("Ask your question here", key="user_input") |
| |
| if user_input: |
| |
| col1, col2, col3 = st.columns(3) |
| |
| |
| with col1: |
| st.markdown("<div class='chat-container'>", unsafe_allow_html=True) |
| st.subheader(f"{genparam.BOT_1_AVATAR} {genparam.BOT_1_NAME}") |
| st.markdown("<div class='chat-messages'>", unsafe_allow_html=True) |
| |
| |
| for message in st.session_state.chat_history_1: |
| with st.chat_message(message["role"], avatar=message.get("avatar", None)): |
| st.markdown(message['content']) |
| |
| |
| with st.chat_message("user", avatar=genparam.USER_AVATAR): |
| st.markdown(user_input) |
| |
| st.session_state.chat_history_1.append({ |
| "role": "user", |
| "content": user_input, |
| "avatar": genparam.USER_AVATAR |
| }) |
|
|
| |
| system_prompt = SYSTEM_PROMPTS[st.session_state.selected_kb]["bot_1"] |
| stream, prompt_data = fetch_response( |
| user_input, |
| client, |
| system_prompt, |
| st.session_state.chat_history_1 |
| ) |
|
|
| with st.chat_message(genparam.BOT_1_NAME, avatar=genparam.BOT_1_AVATAR): |
| response = st.write_stream(stream) |
| |
| st.session_state.chat_history_1.append({ |
| "role": genparam.BOT_1_NAME, |
| "content": response, |
| "avatar": genparam.BOT_1_AVATAR |
| }) |
|
|
| |
| if genparam.TOKEN_CAPTURE_ENABLED: |
| token_stats = capture_tokens(prompt_data, response, client, genparam.BOT_1_NAME) |
| if token_stats: |
| st.session_state.token_statistics.append(token_stats) |
|
|
| st.markdown("</div></div>", unsafe_allow_html=True) |
|
|
| |
| with col2: |
| st.markdown("<div class='chat-container'>", unsafe_allow_html=True) |
| st.subheader(f"{genparam.BOT_2_AVATAR} {genparam.BOT_2_NAME}") |
| st.markdown("<div class='chat-messages'>", unsafe_allow_html=True) |
| |
| |
| for message in st.session_state.chat_history_2: |
| with st.chat_message(message["role"], avatar=message.get("avatar", None)): |
| st.markdown(message['content']) |
| |
| st.session_state.chat_history_2.append({ |
| "role": "user", |
| "content": user_input, |
| "avatar": genparam.USER_AVATAR |
| }) |
|
|
| |
| system_prompt = SYSTEM_PROMPTS[st.session_state.selected_kb]["bot_2"] |
| stream, prompt_data = fetch_response( |
| user_input, |
| client, |
| system_prompt, |
| st.session_state.chat_history_2 |
| ) |
|
|
| with st.chat_message(genparam.BOT_2_NAME, avatar=genparam.BOT_2_AVATAR): |
| response = st.write_stream(stream) |
| |
| st.session_state.chat_history_2.append({ |
| "role": genparam.BOT_2_NAME, |
| "content": response, |
| "avatar": genparam.BOT_2_AVATAR |
| }) |
|
|
| |
| if genparam.TOKEN_CAPTURE_ENABLED: |
| token_stats = capture_tokens(prompt_data, response, client, genparam.BOT_2_NAME) |
| if token_stats: |
| st.session_state.token_statistics.append(token_stats) |
|
|
| st.markdown("</div></div>", unsafe_allow_html=True) |
| |
| |
| with col3: |
| st.markdown("<div class='chat-container'>", unsafe_allow_html=True) |
| st.subheader(f"{genparam.BOT_3_AVATAR} {genparam.BOT_3_NAME}") |
| st.markdown("<div class='chat-messages'>", unsafe_allow_html=True) |
| |
| |
| for message in st.session_state.chat_history_3: |
| with st.chat_message(message["role"], avatar=message.get("avatar", None)): |
| st.markdown(message['content']) |
| |
| st.session_state.chat_history_3.append({ |
| "role": "user", |
| "content": user_input, |
| "avatar": genparam.USER_AVATAR |
| }) |
|
|
| |
| system_prompt = SYSTEM_PROMPTS[st.session_state.selected_kb]["bot_3"] |
| stream, prompt_data = fetch_response( |
| user_input, |
| client, |
| system_prompt, |
| st.session_state.chat_history_3 |
| ) |
|
|
| with st.chat_message(genparam.BOT_3_NAME, avatar=genparam.BOT_3_AVATAR): |
| response = st.write_stream(stream) |
| |
| st.session_state.chat_history_3.append({ |
| "role": genparam.BOT_3_NAME, |
| "content": response, |
| "avatar": genparam.BOT_3_AVATAR |
| }) |
|
|
| |
| if genparam.TOKEN_CAPTURE_ENABLED: |
| token_stats = capture_tokens(prompt_data, response, client, genparam.BOT_3_NAME) |
| if token_stats: |
| st.session_state.token_statistics.append(token_stats) |
|
|
| st.markdown("</div></div>", unsafe_allow_html=True) |
|
|
| |
| st.sidebar.markdown("---") |
| st.sidebar.markdown("**Latest Question:**") |
| st.sidebar.markdown(f"_{user_input}_") |
|
|
| if __name__ == "__main__": |
| main() |