File size: 4,463 Bytes
d108f4c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import os
from src.langgraphagenticai.ui.uiconfigfile import Config

# This class is responsible for creating and managing the Streamlit user interface (UI)
# for the LangGraph Agentic AI application.
class LoadStreamlitUI:
    def __init__(self):
        # Initialize the configuration object (reads from uiconfigfile.ini)
        self.config = Config()
        # A dictionary to store user-selected UI control values (e.g., LLM, model, API keys)
        self.user_controls = {}

    # Main function to load and display all Streamlit UI components
    def load_streamlit_ui(self):
        # Set page configuration such as title and layout
        st.set_page_config(
            page_title="🤖 " + self.config.get_page_title(),
            layout="wide"
        )

        # Display the main page header
        st.header("🤖 " + self.config.get_page_title())

        # Initialize session variables for controlling UI behavior
        st.session_state.timeframe = ''
        st.session_state.IsFetchButtonClicked = False

        # Everything inside 'with st.sidebar' will appear in the left sidebar
        with st.sidebar:
            # Retrieve configuration options (LLMs and Use Cases)
            llm_options = self.config.get_llm_options()
            usecase_options = self.config.get_usecase_options()

            # Dropdown to select which LLM provider to use (e.g., Groq)
            self.user_controls["selected_llm"] = st.selectbox("Select LLM", llm_options)

            # If user chooses 'Groq' as LLM, show additional Groq-specific inputs
            if self.user_controls["selected_llm"] == 'Groq':
                # Get Groq model list from config file
                model_options = self.config.get_groq_model_options()

                # Dropdown to select which Groq model to use (e.g., llama-3.1-8b)
                self.user_controls["selected_groq_model"] = st.selectbox("Select Model", model_options)

                # Textbox for entering Groq API key (masked as password)
                self.user_controls["GROQ_API_KEY"] = st.session_state["GROQ_API_KEY"] = st.text_input(
                    "API Key", type="password"
                )

                # Show a warning if the API key is not entered
                if not self.user_controls["GROQ_API_KEY"]:
                    st.warning("⚠️ Please enter your GROQ API key to proceed. Don't have one? Visit: https://console.groq.com/keys")

            # Dropdown to select which use case to run (e.g., Basic Chatbot, Chatbot With Web, AI News)
            self.user_controls["selected_usecase"] = st.selectbox("Select Usecases", usecase_options)

            # If the selected use case involves web search or news fetching,
            # ask for the Tavily API key (used for web search capabilities)
            if self.user_controls["selected_usecase"] in ["Chatbot With Web", "AI News"]:
                os.environ["TAVILY_API_KEY"] = self.user_controls["TAVILY_API_KEY"] = st.session_state["TAVILY_API_KEY"] = st.text_input(
                    "TAVILY API KEY", type="password"
                )

                # Show a warning if Tavily API key is not entered
                if not self.user_controls["TAVILY_API_KEY"]:
                    st.warning("⚠️ Please enter your TAVILY_API_KEY to proceed. Don't have one? Visit: https://app.tavily.com/home")

            # If the user selects "AI News" use case, show additional news-specific options
            if self.user_controls['selected_usecase'] == "AI News":
                st.subheader("📰 AI News Explorer ")

                # Allow user to choose the time frame for news updates
                with st.sidebar:
                    time_frame = st.selectbox(
                        "📅 Select Time Frame",
                        ["Daily", "Weekly", "Monthly"],
                        index=0
                    )

                # Button to trigger fetching AI news
                if st.button("🔍 Fetch Latest AI News", use_container_width=True):
                    # Mark that the fetch button was clicked and store selected time frame
                    st.session_state.IsFetchButtonClicked = True
                    st.session_state.timeframe = time_frame

        # Return all collected user input values for further processing
        return self.user_controls