File size: 8,623 Bytes
e83ea81
343468f
 
e8b7d05
343468f
e83ea81
3c3c588
 
343468f
 
 
 
 
 
f54fc8b
 
 
 
e83ea81
f54fc8b
 
e83ea81
 
 
f54fc8b
e83ea81
 
f54fc8b
e83ea81
 
 
f54fc8b
 
 
 
 
 
 
 
 
 
 
 
b213c2c
343468f
 
 
b213c2c
 
f54fc8b
e83ea81
 
b213c2c
 
343468f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e8b7d05
 
143db94
e8b7d05
343468f
 
 
 
b213c2c
343468f
 
 
143db94
 
 
e83ea81
 
 
343468f
2b2818d
 
 
 
 
343468f
2b2818d
3c3c588
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e8b7d05
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b213c2c
 
 
3c3c588
b213c2c
 
 
 
 
 
 
 
 
 
 
 
 
f54fc8b
 
 
 
e83ea81
 
 
 
 
 
 
 
 
f54fc8b
e83ea81
 
f54fc8b
e83ea81
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f54fc8b
 
343468f
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
import uuid
import streamlit as st
import os
from datetime import date

from src.langgraphagenticai.ui.streamlitui.sdlcfeedback import SDLCUI
from src.langgraphagenticai.ui.uiconfigfile import Config
from langchain_core.messages import AIMessage, HumanMessage


class LoadStreamlitUI:
    def __init__(self):
        self.config =  Config() # config
        self.user_controls = {}
        
    def initialize_session(self):
        return {
            "current_step": "requirements",
            "decision": None,
            "requirements": "",
            "user_stories": "",
            "design_docs": "",
            "code": "",
            "test_cases": "",
            "po_feedback": "",
            "design_feedback":"",
            'generate_code':"",
            "review_feedback": "",
            "security_feedback": "",
            "test_feedback": "",
            "human_decision": ""
        }
    def render_requirements(self):
        st.markdown("## πŸ“ Requirements Submission")
        st.session_state.state["requirements"] = st.text_area(
            "Enter your requirements:",
            height=200,
            key="req_input"
        )
        if st.button("Submit Requirements", key="submit_req"):
            st.session_state.state["current_step"] = "generate_user_stories"
            st.session_state.IsSDLC = True
            

    def load_streamlit_ui(self):
        st.set_page_config(page_title= "πŸ€– " + self.config.get_page_title(), layout="wide")
        st.header("πŸ€– " + self.config.get_page_title())
        st.session_state.timeframe = ''
        st.session_state.IsFetchButtonClicked = False
        st.session_state.IsSDLC = False
        ui = SDLCUI()
        
        
        

        with st.sidebar:
            # Get options from config
            llm_options = self.config.get_llm_options()
            usecase_options = self.config.get_usecase_options()

            # LLM selection
            self.user_controls["selected_llm"] = st.selectbox("Select LLM", llm_options)

            if self.user_controls["selected_llm"] == 'Groq':
                # Model selection
                model_options = self.config.get_groq_model_options()
                self.user_controls["selected_groq_model"] = st.selectbox("Select Model", model_options)
                # API key input
                self.user_controls["GROQ_API_KEY"] = st.session_state["GROQ_API_KEY"] = st.text_input("API Key",
                                                                                                      type="password")
                # Validate API key
                if not self.user_controls["GROQ_API_KEY"]:
                    st.warning("⚠️ Please enter your GROQ API key to proceed. Don't have? refer : https://console.groq.com/keys ")
                   
            
            # Use case selection
            self.user_controls["selected_usecase"] = st.selectbox("Select Usecases", usecase_options)
            
            if self.user_controls["selected_usecase"] =="Chatbot with Tool" or self.user_controls["selected_usecase"] =="AI News" :
            # API key input
                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")
                # Validate API key
                if not self.user_controls["TAVILY_API_KEY"]:
                    st.warning("⚠️ Please enter your TAVILY_API_KEY key to proceed. Don't have? refer : https://app.tavily.com/home")
        
        if self.user_controls['selected_usecase']!="SDLC Workflow":
            st.session_state['state'] = ''
        if self.user_controls['selected_usecase'] == "Appointment Receptionist":
            col1, col2 = st.columns(2)
            with col1:
                st.subheader("Appointment Manager")
            with col2:
                st.subheader("Appointments")
                    
        elif self.user_controls['selected_usecase']=="Customer Support":
            st.subheader('Flower Shop Chatbot' + 'πŸ’')
            greeting="Hi πŸ™‹πŸ»β€β™€οΈ, I am the flower shop chatbot. How can I help?"

            if 'message_history' not in st.session_state:
                st.session_state.message_history = [AIMessage(content=greeting)]
                
            with st.chat_message("assistant"):
                st.write(greeting) 
                
             # 1. Buttons for chat - Clear Button
            
        

            with  st.sidebar:
                if st.button('Clear Chat'):
                    st.session_state.message_history = []

        elif self.user_controls['selected_usecase']=="Travel Planner":
            st.subheader("✈️ AI Travel Planner")
            col1, col2 = st.columns(2)

            with col1:
                source = st.text_input("πŸ“ Source", value="London", help="Enter your travel source")
                destination = st.text_input("πŸ“ Destination", value="Goa", help="Enter your travel destination")
                preferences = st.text_area(
                    "🎯 Travel Preferences",
                    placeholder="E.g., I prefer beach destinations, luxury stays, and adventure activities.",
                    help="Describe your travel preferences"
                )

            with col2:
                start_date = st.date_input("πŸ“… Start Date", value=date.today(), help="Select your travel start date")
                end_date = st.date_input("πŸ“… End Date", value=date.today(), help="Select your travel end date")

            if destination and preferences and start_date and end_date:
                self.user_controls.update({
                "source": source,
                "destination": destination,
                "preferences": preferences,
                "start_date": start_date,
                "end_date": end_date,
            })
          
        elif self.user_controls['selected_usecase']=="AI News":
            st.subheader("πŸ“° AI News Explorer ")
            
            with st.sidebar:
                time_frame = st.selectbox(
                    "πŸ“… Select Time Frame",
                    ["Daily", "Weekly", "Monthly"],
                    index=0
                )
            
            if st.button("πŸ” Fetch Latest AI News", use_container_width=True):
                st.session_state.IsFetchButtonClicked = True
                st.session_state.timeframe = time_frame
            else :
                st.session_state.IsFetchButtonClicked = False
                    
        
        # Added for SDLC Workflow
        elif self.user_controls['selected_usecase']=="SDLC Workflow":
            st.subheader(" SDLC Workflow ")
            # if 'status' in st.session_state.state and st.session_state.state['status']== "__interrupt__" and 'decision' in st.session_state.state and st.session_state.state['decision']==None :
            #     ui.render()
            if "requirements" in st.session_state.state and  st.session_state.state['current_step']=="requirements":
                ui.render_requirements(st.session_state.state)
            # if st.session_state.state !='':
                
            #     ui.render()
                
                
            
            if st.button("start workflow"):
                st.session_state.state = ''
                st.session_state.state = self.initialize_session()
                # Initialize session state variables.
                if "thread_config" not in st.session_state:
                    st.session_state.thread_config = {"configurable": {"thread_id": uuid.uuid4()}}
                if "graph_stage" not in st.session_state:
                    st.session_state.graph_stage = "initial"  # Stages: initial, waiting, resumed, finished.
                if "output_chunks" not in st.session_state:
                    st.session_state.output_chunks = []
                if "user_decision" not in st.session_state:
                    st.session_state.user_decision = None
                st.session_state.IsSDLC = True
                ui.render_requirements(st.session_state.state)
                
                # if st.session_state.state['current_step']=="requirements":
                    # self.render_requirements()
            if 'requirements' in st.session_state.state and  st.session_state.state['requirements']=='':
                    st.stop()   
            
                
            
        
        return self.user_controls