AlfredHarun commited on
Commit
13eceeb
·
verified ·
1 Parent(s): f286be2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +44 -60
app.py CHANGED
@@ -18,10 +18,13 @@ logging.basicConfig(level=logging.INFO)
18
  logger = logging.getLogger(__name__)
19
  st.set_page_config(page_title="IT Support System (RAG)", layout="centered")
20
 
21
- # Initialize session memory
22
  if "chat_history" not in st.session_state:
23
  st.session_state.chat_history = []
24
 
 
 
 
25
  # Knowledge Base Setup
26
  kb_path = os.path.join(os.path.dirname(__file__), 'kb.json')
27
  with open(kb_path, encoding='utf-8') as f:
@@ -61,10 +64,9 @@ def escalate_ticket(query: str, analysis: str = "") -> str:
61
  logger.info(f"Escalating issue with ticket {ticket_id}: {description}")
62
  return f"Escalated issue. Created ticket {ticket_id}. A support technician will contact you shortly."
63
 
64
- # LLM Configuration (local/open-source LLM API)
65
  llm_config = {
66
  "config_list": [{
67
- "model": "llama3", # or mistral, gemma, etc.
68
  "base_url": os.getenv("LLM_API_BASE", "http://localhost:11434/v1"),
69
  "api_key": "NULL",
70
  }],
@@ -72,7 +74,6 @@ llm_config = {
72
  "temperature": 0.5,
73
  }
74
 
75
- # Agent Definitions
76
  master_agent = AssistantAgent(
77
  name="Master",
78
  llm_config=llm_config,
@@ -165,17 +166,14 @@ Always include the ticket ID and expected follow-up timeframe.
165
  function_map={"escalate_ticket": escalate_ticket}
166
  )
167
 
168
- def handle_it_query(query: str, show_logs: bool = False) -> str:
169
  query = query.strip()
170
  if not query:
171
- return "Please enter an IT question or issue."
172
 
173
  workflow_logs = {"query": query}
174
-
175
  try:
176
- master_proxy = UserProxyAgent(
177
- name="MasterProxy", human_input_mode="NEVER", code_execution_config=False
178
- )
179
  master_prompt = f"User query: '{query}'. First, determine if this is an IT-related issue."
180
  master_proxy.initiate_chat(master_agent, message=master_prompt, max_turns=1)
181
  initial_assessment = master_proxy.chat_messages[master_agent][-1]["content"]
@@ -183,27 +181,21 @@ def handle_it_query(query: str, show_logs: bool = False) -> str:
183
  workflow_logs["initial_assessment"] = initial_assessment
184
 
185
  if "NOT IT-RELATED" in initial_assessment.upper():
186
- return initial_assessment
187
 
188
- plan_proxy = UserProxyAgent(
189
- name="PlanningProxy", human_input_mode="NEVER", code_execution_config=False
190
- )
191
  plan_proxy.initiate_chat(planning_agent, message=query, max_turns=1)
192
  planning_output = plan_proxy.chat_messages[planning_agent][-1]["content"]
193
  logger.info(f"Planning Agent Response: {planning_output}")
194
  workflow_logs["planning"] = planning_output
195
 
196
- analysis_proxy = UserProxyAgent(
197
- name="AnalysisProxy", human_input_mode="NEVER", code_execution_config=False
198
- )
199
  analysis_proxy.initiate_chat(analysis_agent, message=planning_output, max_turns=1)
200
  analysis_output = analysis_proxy.chat_messages[analysis_agent][-1]["content"]
201
  logger.info(f"Analysis Agent Response: {analysis_output}")
202
  workflow_logs["analysis"] = analysis_output
203
 
204
- res_proxy = UserProxyAgent(
205
- name="ResolutionProxy", human_input_mode="NEVER", code_execution_config=False
206
- )
207
  resolution_input = f"User Query: {query}\n\nPlanning: {planning_output}\n\nAnalysis: {analysis_output}"
208
  res_proxy.initiate_chat(resolution_agent, message=resolution_input, max_turns=1)
209
  resolution_output = res_proxy.chat_messages[resolution_agent][-1]["content"]
@@ -212,18 +204,14 @@ def handle_it_query(query: str, show_logs: bool = False) -> str:
212
 
213
  escalation_output = None
214
  if "ESCALATION NEEDED" in resolution_output.upper():
215
- esc_proxy = UserProxyAgent(
216
- name="EscalationProxy", human_input_mode="NEVER", code_execution_config=False
217
- )
218
  escalation_input = f"Original Query: {query}\n\nAnalysis: {analysis_output}\n\nResolution Attempt: {resolution_output}"
219
  esc_proxy.initiate_chat(escalation_agent, message=escalation_input, max_turns=1)
220
  escalation_output = esc_proxy.chat_messages[escalation_agent][-1]["content"]
221
  logger.info(f"Escalation Agent Response: {escalation_output}")
222
  workflow_logs["escalation"] = escalation_output
223
 
224
- final_master_proxy = UserProxyAgent(
225
- name="FinalMasterProxy", human_input_mode="NEVER", code_execution_config=False
226
- )
227
 
228
  if escalation_output:
229
  final_prompt = (
@@ -248,25 +236,11 @@ def handle_it_query(query: str, show_logs: bool = False) -> str:
248
  logger.info(f"Final Master Agent Response: {final_response}")
249
  workflow_logs["final_response"] = final_response
250
 
251
- # Store chat history with or without logs based on user preference
252
- if show_logs:
253
- st.session_state.chat_history.append({
254
- "user": query,
255
- "assistant": final_response,
256
- "workflow_logs": workflow_logs
257
- })
258
- else:
259
- st.session_state.chat_history.append({
260
- "user": query,
261
- "assistant": final_response,
262
- })
263
-
264
- return final_response
265
 
266
  except Exception as e:
267
  logger.error(f"Error in workflow: {e}", exc_info=True)
268
- return f"An error occurred during processing: {str(e)}\n\nPlease try rephrasing your question."
269
-
270
 
271
 
272
  st.title("AI Help Desk")
@@ -277,21 +251,31 @@ with st.form(key="query_form", clear_on_submit=True):
277
  show_logs = st.checkbox("Show workflow details", value=False)
278
  submitted = st.form_submit_button("Submit")
279
 
280
- if submitted:
281
- if not user_input:
282
- st.error("Please type a message before submitting.")
283
- else:
284
- with st.spinner("Processing your request through our agent workflow..."):
285
- response = handle_it_query(user_input, show_logs=show_logs)
286
-
287
- st.markdown("### Response")
288
- st.write(response)
289
-
290
- if show_logs and st.session_state.chat_history:
291
- st.markdown("---")
292
- st.markdown("### Workflow Logs")
293
- logs = st.session_state.chat_history[-1].get("workflow_logs", {})
294
- for step, content in logs.items():
295
- st.markdown(f"**{step.capitalize().replace('_', ' ')}:**")
296
- st.text(content)
297
- st.markdown("---")
 
 
 
 
 
 
 
 
 
 
 
18
  logger = logging.getLogger(__name__)
19
  st.set_page_config(page_title="IT Support System (RAG)", layout="centered")
20
 
21
+ # Initialize session state for chat and logs
22
  if "chat_history" not in st.session_state:
23
  st.session_state.chat_history = []
24
 
25
+ if "workflow_logs" not in st.session_state:
26
+ st.session_state.workflow_logs = []
27
+
28
  # Knowledge Base Setup
29
  kb_path = os.path.join(os.path.dirname(__file__), 'kb.json')
30
  with open(kb_path, encoding='utf-8') as f:
 
64
  logger.info(f"Escalating issue with ticket {ticket_id}: {description}")
65
  return f"Escalated issue. Created ticket {ticket_id}. A support technician will contact you shortly."
66
 
 
67
  llm_config = {
68
  "config_list": [{
69
+ "model": "llama3",
70
  "base_url": os.getenv("LLM_API_BASE", "http://localhost:11434/v1"),
71
  "api_key": "NULL",
72
  }],
 
74
  "temperature": 0.5,
75
  }
76
 
 
77
  master_agent = AssistantAgent(
78
  name="Master",
79
  llm_config=llm_config,
 
166
  function_map={"escalate_ticket": escalate_ticket}
167
  )
168
 
169
+ def handle_it_query(query: str) -> (str, dict):
170
  query = query.strip()
171
  if not query:
172
+ return "Please enter an IT question or issue.", {}
173
 
174
  workflow_logs = {"query": query}
 
175
  try:
176
+ master_proxy = UserProxyAgent(name="MasterProxy", human_input_mode="NEVER", code_execution_config=False)
 
 
177
  master_prompt = f"User query: '{query}'. First, determine if this is an IT-related issue."
178
  master_proxy.initiate_chat(master_agent, message=master_prompt, max_turns=1)
179
  initial_assessment = master_proxy.chat_messages[master_agent][-1]["content"]
 
181
  workflow_logs["initial_assessment"] = initial_assessment
182
 
183
  if "NOT IT-RELATED" in initial_assessment.upper():
184
+ return initial_assessment, workflow_logs
185
 
186
+ plan_proxy = UserProxyAgent(name="PlanningProxy", human_input_mode="NEVER", code_execution_config=False)
 
 
187
  plan_proxy.initiate_chat(planning_agent, message=query, max_turns=1)
188
  planning_output = plan_proxy.chat_messages[planning_agent][-1]["content"]
189
  logger.info(f"Planning Agent Response: {planning_output}")
190
  workflow_logs["planning"] = planning_output
191
 
192
+ analysis_proxy = UserProxyAgent(name="AnalysisProxy", human_input_mode="NEVER", code_execution_config=False)
 
 
193
  analysis_proxy.initiate_chat(analysis_agent, message=planning_output, max_turns=1)
194
  analysis_output = analysis_proxy.chat_messages[analysis_agent][-1]["content"]
195
  logger.info(f"Analysis Agent Response: {analysis_output}")
196
  workflow_logs["analysis"] = analysis_output
197
 
198
+ res_proxy = UserProxyAgent(name="ResolutionProxy", human_input_mode="NEVER", code_execution_config=False)
 
 
199
  resolution_input = f"User Query: {query}\n\nPlanning: {planning_output}\n\nAnalysis: {analysis_output}"
200
  res_proxy.initiate_chat(resolution_agent, message=resolution_input, max_turns=1)
201
  resolution_output = res_proxy.chat_messages[resolution_agent][-1]["content"]
 
204
 
205
  escalation_output = None
206
  if "ESCALATION NEEDED" in resolution_output.upper():
207
+ esc_proxy = UserProxyAgent(name="EscalationProxy", human_input_mode="NEVER", code_execution_config=False)
 
 
208
  escalation_input = f"Original Query: {query}\n\nAnalysis: {analysis_output}\n\nResolution Attempt: {resolution_output}"
209
  esc_proxy.initiate_chat(escalation_agent, message=escalation_input, max_turns=1)
210
  escalation_output = esc_proxy.chat_messages[escalation_agent][-1]["content"]
211
  logger.info(f"Escalation Agent Response: {escalation_output}")
212
  workflow_logs["escalation"] = escalation_output
213
 
214
+ final_master_proxy = UserProxyAgent(name="FinalMasterProxy", human_input_mode="NEVER", code_execution_config=False)
 
 
215
 
216
  if escalation_output:
217
  final_prompt = (
 
236
  logger.info(f"Final Master Agent Response: {final_response}")
237
  workflow_logs["final_response"] = final_response
238
 
239
+ return final_response, workflow_logs
 
 
 
 
 
 
 
 
 
 
 
 
 
240
 
241
  except Exception as e:
242
  logger.error(f"Error in workflow: {e}", exc_info=True)
243
+ return f"An error occurred during processing: {str(e)}\n\nPlease try rephrasing your question.", {}
 
244
 
245
 
246
  st.title("AI Help Desk")
 
251
  show_logs = st.checkbox("Show workflow details", value=False)
252
  submitted = st.form_submit_button("Submit")
253
 
254
+ if submitted:
255
+ if not user_input:
256
+ st.error("Please type a message before submitting.")
257
+ else:
258
+ with st.spinner("Processing your request through our agent workflow..."):
259
+ response, logs = handle_it_query(user_input)
260
+
261
+ # Append to session history to maintain conversation flow
262
+ st.session_state.chat_history.append({"user": user_input, "assistant": response})
263
+ if show_logs:
264
+ st.session_state.workflow_logs.append(logs)
265
+
266
+ # Display conversation history
267
+ st.markdown("## Conversation")
268
+ for chat in st.session_state.chat_history:
269
+ st.markdown(f"**User:** {chat['user']}")
270
+ st.markdown(f"**Assistant:** {chat['assistant']}")
271
+ st.markdown("---")
272
+
273
+ # Display logs if requested
274
+ if show_logs and st.session_state.workflow_logs:
275
+ st.markdown("## Workflow Logs")
276
+ for i, log in enumerate(st.session_state.workflow_logs):
277
+ st.markdown(f"### Query {i+1} Logs")
278
+ for step, content in log.items():
279
+ st.markdown(f"**{step.capitalize().replace('_', ' ')}:**")
280
+ st.text(content)
281
+ st.markdown("---")