# For reading credentials from the .env file import os from dotenv import load_dotenv import streamlit as st import webchat # URL of the hosted LLMs is hardcoded because at this time all LLMs share the same endpoint url = "https://us-south.ml.cloud.ibm.com" # These global variables will be updated in get_credentials() function watsonx_project_id = "" # Replace with your IBM Cloud key api_key = "" def get_credentials(): load_dotenv() # Update the global variables that will be used for authentication in another function globals()["api_key"] = os.getenv("api_key", None) globals()["watsonx_project_id"] = os.getenv("project_id", None) def set_theme(): st.markdown(""" """, unsafe_allow_html=True) from urllib.parse import urlparse def create_collection_name(url): parsed_url = urlparse(url) domain_parts = parsed_url.netloc.split('.') if len(domain_parts) >= 2: return domain_parts[-2] # Extracting the second-level domain else: return "base" def main(): # Get the API key and project id and update global variables get_credentials() # Use the full page instead of a narrow central column st.set_page_config(layout="wide", page_title="RAG Web Demo", page_icon="") # Set the theme set_theme() # Streamlit app title with style st.markdown("""

Insert the website you want to chat with and ask your question.

""", unsafe_allow_html=True) # Sidebar for settings st.sidebar.header("Settings") st.sidebar.markdown("Insert your credentials of [IBM Cloud](https://cloud.ibm.com/login) for watsonx.ai", unsafe_allow_html=True) st.sidebar.markdown("
", unsafe_allow_html=True) api_key_input = st.sidebar.text_input("API Key", api_key, type="password") project_id_input = st.sidebar.text_input("Project ID", watsonx_project_id) # Update credentials if provided by the user if api_key_input: globals()["api_key"] = api_key_input if project_id_input: globals()["watsonx_project_id"] = project_id_input # Main input area #st.markdown("
", unsafe_allow_html=True) user_url = st.text_input('Provide a URL') # Provide a unique name for this website (lower case). Use the same name for the same URL to avoid loading data multiple times. collection_name = create_collection_name(user_url) # UI component to enter the question question = st.text_area('Question', height=100) button_clicked = st.button("Answer the question") st.markdown("
", unsafe_allow_html=True) st.subheader("Response") # Invoke the LLM when the button is clicked if button_clicked: response = webchat.answer_questions_from_web(api_key, watsonx_project_id, user_url, question, collection_name) st.write(response) if __name__ == "__main__": main()