k96beni commited on
Commit
0b33a03
·
verified ·
1 Parent(s): a07803d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +198 -7
app.py CHANGED
@@ -46,7 +46,8 @@ scheduler = CommitScheduler(
46
 
47
  # --- Globala variabler ---
48
  last_log = None # Sparar loggdata från senaste svar för feedback
49
-
 
50
  # --- Slack Webhook funktionalitet ---
51
  def send_report_to_slack(subject, content):
52
  """Skickar rapport till Slack via webhook."""
@@ -288,31 +289,90 @@ def get_feedback_stats(logs):
288
 
289
  # Skicka statusrapport till Slack
290
  def send_status_slack():
291
- """Skickar ett statusmeddelande till Slack med statistik."""
292
  print("Försöker skicka status-rapport till Slack...")
293
 
294
  try:
295
  # Samla in statistik
296
  logs = read_logs()
297
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
298
  # 1. Samla statistik
299
  conversations = get_latest_conversations(logs)
300
  feedback_stats, negative_examples = get_feedback_stats(logs)
 
 
301
  total_sessions = len(set(log.get('session_id', 'unknown') for log in logs if 'session_id' in log))
302
  total_questions = sum(1 for log in logs if 'user_message' in log)
303
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
304
  # 2. Formatera för Slack (Markdown)
305
- now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
306
- subject = f"ChargeNode AI Bot - Status {now}"
307
 
308
  content = f"""
309
- *ChargeNode AI Bot - Statusrapport {now}*
310
 
311
  *Sammanfattning*
 
 
 
 
 
 
 
 
 
 
 
 
312
  - Totalt antal sessioner: {total_sessions}
313
  - Totalt antal frågor: {total_questions}
314
- - Tumme upp: {feedback_stats['up']}
315
- - Tumme ned: {feedback_stats['down']}
316
 
317
  *De 5 senaste frågorna*
318
  """
@@ -350,6 +410,137 @@ def send_status_slack():
350
  print(f"Fel vid sändning av status-rapport till Slack: {e}")
351
  return False
352
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
353
  def send_support_to_slack(områdeskod, uttagsnummer, email, chat_history):
354
  """Skickar en supportförfrågan till Slack."""
355
  try:
 
46
 
47
  # --- Globala variabler ---
48
  last_log = None # Sparar loggdata från senaste svar för feedback
49
+ # Lägg till i början av skriptet med andra globala variabler
50
+ active_sessions = {} # Dictionary för att spåra aktiva sessioner: {session_id: (senaste_tid, meddelanden)}
51
  # --- Slack Webhook funktionalitet ---
52
  def send_report_to_slack(subject, content):
53
  """Skickar rapport till Slack via webhook."""
 
289
 
290
  # Skicka statusrapport till Slack
291
  def send_status_slack():
292
+ """Skickar ett statusmeddelande till Slack med utökad statistik."""
293
  print("Försöker skicka status-rapport till Slack...")
294
 
295
  try:
296
  # Samla in statistik
297
  logs = read_logs()
298
 
299
+ # Beräkna tid för 24 timmar sedan och 14 dagar sedan
300
+ now = datetime.now()
301
+ yesterday = now - timedelta(days=1)
302
+ two_weeks_ago = now - timedelta(days=14)
303
+
304
+ # Konvertera timestamps till datetime
305
+ for log in logs:
306
+ if 'timestamp' in log:
307
+ try:
308
+ log['datetime'] = datetime.strptime(log['timestamp'], "%Y-%m-%d %H:%M:%S")
309
+ except:
310
+ log['datetime'] = now # Default om formatering misslyckas
311
+
312
+ # Filtrera loggar för senaste 24h och 14 dagar
313
+ logs_24h = [log for log in logs if 'datetime' in log and log['datetime'] >= yesterday]
314
+ logs_14d = [log for log in logs if 'datetime' in log and log['datetime'] >= two_weeks_ago]
315
+
316
  # 1. Samla statistik
317
  conversations = get_latest_conversations(logs)
318
  feedback_stats, negative_examples = get_feedback_stats(logs)
319
+
320
+ # Basinformation
321
  total_sessions = len(set(log.get('session_id', 'unknown') for log in logs if 'session_id' in log))
322
  total_questions = sum(1 for log in logs if 'user_message' in log)
323
 
324
+ # 24h statistik
325
+ sessions_24h = len(set(log.get('session_id', 'unknown') for log in logs_24h if 'session_id' in log))
326
+ messages_24h = sum(1 for log in logs_24h if 'user_message' in log)
327
+
328
+ # Beräkna snitt antal meddelanden per session (om minst en session finns)
329
+ avg_messages_per_session = round(messages_24h / sessions_24h, 2) if sessions_24h > 0 else 0
330
+
331
+ # Snittsvarstid
332
+ response_times_24h = [log.get('response_time', 0) for log in logs_24h if 'response_time' in log]
333
+ avg_response_time = round(sum(response_times_24h) / len(response_times_24h), 2) if response_times_24h else 0
334
+
335
+ # 14 dagars statistik
336
+ messages_14d = sum(1 for log in logs_14d if 'user_message' in log)
337
+ unique_users_14d = len(set(log.get('user_id', 'unknown') for log in logs_14d if 'user_id' in log))
338
+
339
+ # Likes och dislikes
340
+ likes_24h = sum(1 for log in logs_24h if log.get('feedback') == 'up')
341
+ dislikes_24h = sum(1 for log in logs_24h if log.get('feedback') == 'down')
342
+
343
+ # Browser-fördelning
344
+ browser_counts = {}
345
+ for log in logs_24h:
346
+ if 'browser' in log:
347
+ browser = log['browser']
348
+ browser_counts[browser] = browser_counts.get(browser, 0) + 1
349
+
350
+ # Sortera browsers efter antal
351
+ top_browsers = sorted(browser_counts.items(), key=lambda x: x[1], reverse=True)[:3]
352
+ browser_text = ", ".join([f"{browser}: {count}" for browser, count in top_browsers]) if top_browsers else "Ingen data"
353
+
354
  # 2. Formatera för Slack (Markdown)
355
+ slack_date = now.strftime("%Y-%m-%d")
356
+ subject = f"ChargeNode AI Bot - Daglig rapport {slack_date}"
357
 
358
  content = f"""
359
+ *ChargeNode AI Bot - Statusrapport {now.strftime('%Y-%m-%d %H:%M:%S')}*
360
 
361
  *Sammanfattning*
362
+ - Datum: {slack_date}
363
+ - Antal meddelanden senaste 24h: {messages_24h}
364
+ - Unika sessioner senaste 24h: {sessions_24h}
365
+ - Meddelanden per session (snitt): {avg_messages_per_session}
366
+ - Snittsvarstid senaste 24h: {avg_response_time} sekunder
367
+ - Antal meddelanden (14 dagar): {messages_14d}
368
+ - Unika användare (14 dagar): {unique_users_14d}
369
+ - Tumme upp senaste 24h: {likes_24h}
370
+ - Tumme ned senaste 24h: {dislikes_24h}
371
+ - Browser-fördelning senaste 24h: {browser_text}
372
+
373
+ *Trender*
374
  - Totalt antal sessioner: {total_sessions}
375
  - Totalt antal frågor: {total_questions}
 
 
376
 
377
  *De 5 senaste frågorna*
378
  """
 
410
  print(f"Fel vid sändning av status-rapport till Slack: {e}")
411
  return False
412
 
413
+ # Funktion för att skicka en avslutad session till Slack
414
+ def send_session_to_slack(session_id, messages):
415
+ """Skickar en avslutad chatsession till Slack."""
416
+ if not messages:
417
+ return False
418
+
419
+ try:
420
+ user_messages = [msg for msg in messages if msg.get('role') == 'user']
421
+ bot_messages = [msg for msg in messages if msg.get('role') == 'assistant']
422
+
423
+ if not user_messages:
424
+ return False # Ingen användarsession att rapportera
425
+
426
+ # Räkna feedback
427
+ likes = sum(1 for msg in messages if msg.get('feedback') == 'up')
428
+ dislikes = sum(1 for msg in messages if msg.get('feedback') == 'down')
429
+
430
+ # Hämta information om sessionen
431
+ first_msg_time = messages[0].get('timestamp', 'okänd tid')
432
+ last_msg_time = messages[-1].get('timestamp', 'okänd tid')
433
+
434
+ # Formatera sessionen för Slack
435
+ subject = f"Avslutad chatsession {session_id[:8]} - {first_msg_time}"
436
+
437
+ content = f"""
438
+ *Chatsession avslutad*
439
+ - *Session ID:* {session_id[:8]}...
440
+ - *Starttid:* {first_msg_time}
441
+ - *Sluttid:* {last_msg_time}
442
+ - *Antal frågor:* {len(user_messages)}
443
+ - *Antal svar:* {len(bot_messages)}
444
+ - *Tumme upp:* {likes}
445
+ - *Tumme ned:* {dislikes}
446
+
447
+ *Konversation:*
448
+ """
449
+
450
+ # Lägg till konversationen
451
+ for i, msg in enumerate(messages):
452
+ if msg.get('role') == 'user':
453
+ content += f"> *Användare:* {msg.get('content', '')}\n\n"
454
+ elif msg.get('role') == 'assistant':
455
+ content += f"> *Bot:* {msg.get('content', '')[:150]}...\n\n"
456
+
457
+ # Skicka till Slack
458
+ success = send_report_to_slack(subject, content)
459
+ return success
460
+ except Exception as e:
461
+ print(f"Fel vid sändning av sessionrapport till Slack: {e}")
462
+ return False
463
+
464
+ # Modifiera respond-funktionen för att spåra sessioner
465
+ def respond(message, chat_history, request: gr.Request):
466
+ global last_log, active_sessions
467
+ start = time.time()
468
+ response = generate_answer(message)
469
+ elapsed = round(time.time() - start, 2)
470
+
471
+ timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
472
+ session_id = str(uuid.uuid4())
473
+ user_id = request.client.host if request else "okänd"
474
+
475
+ # Resten av din befintliga kod här...
476
+
477
+ # Spara sessionsdata för chattrapporter
478
+ if last_log and 'session_id' in last_log:
479
+ # Använd session_id från tidigare logg om det finns
480
+ session_id = last_log.get('session_id')
481
+
482
+ # Uppdatera aktiva sessioner
483
+ if session_id not in active_sessions:
484
+ active_sessions[session_id] = {
485
+ 'last_activity': datetime.now(),
486
+ 'messages': []
487
+ }
488
+
489
+ # Lägg till användarfråga
490
+ active_sessions[session_id]['messages'].append({
491
+ 'role': 'user',
492
+ 'content': message,
493
+ 'timestamp': timestamp
494
+ })
495
+
496
+ # Lägg till bot-svar
497
+ active_sessions[session_id]['messages'].append({
498
+ 'role': 'assistant',
499
+ 'content': response,
500
+ 'timestamp': timestamp
501
+ })
502
+
503
+ # Uppdatera senaste aktivitet
504
+ active_sessions[session_id]['last_activity'] = datetime.now()
505
+
506
+ # Fortsätt med din befintliga kod...
507
+ chat_history.append({"role": "user", "content": message})
508
+ chat_history.append({"role": "assistant", "content": response})
509
+ return "", chat_history
510
+
511
+ # Periodisk kontroll av inaktiva sessioner
512
+ def check_inactive_sessions():
513
+ """Kontrollerar efter inaktiva sessioner och skickar dem till Slack."""
514
+ now = datetime.now()
515
+ sessions_to_remove = []
516
+
517
+ for session_id, session_data in active_sessions.items():
518
+ last_activity = session_data['last_activity']
519
+ inactive_time = (now - last_activity).total_seconds() / 60 # i minuter
520
+
521
+ if inactive_time >= 2: # Inaktiv i minst 2 minuter
522
+ # Skicka sessionen till Slack
523
+ send_session_to_slack(session_id, session_data['messages'])
524
+ sessions_to_remove.append(session_id)
525
+
526
+ # Ta bort skickade sessioner
527
+ for session_id in sessions_to_remove:
528
+ del active_sessions[session_id]
529
+
530
+ # Uppdatera schemaläggningsfunktionen för att kontrollera inaktiva sessioner
531
+ def run_scheduler():
532
+ """Kör schemaläggaren i en separat tråd."""
533
+ # Schemalägga rapporter till Slack
534
+ schedule.every().day.at("09:32").do(send_status_slack)
535
+ schedule.every().day.at("15:00").do(send_status_slack)
536
+ schedule.every().day.at("08:00").do(send_status_slack)
537
+
538
+ # Kontrollera inaktiva sessioner var 30:e sekund
539
+ schedule.every(30).seconds.do(check_inactive_sessions)
540
+
541
+ while True:
542
+ schedule.run_pending()
543
+ time.sleep(10) # Kontrollera var 10:e sekund
544
  def send_support_to_slack(områdeskod, uttagsnummer, email, chat_history):
545
  """Skickar en supportförfrågan till Slack."""
546
  try: