k96beni commited on
Commit
c2d420c
·
verified ·
1 Parent(s): ef95ed9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +45 -13
app.py CHANGED
@@ -23,6 +23,9 @@ MAX_CHUNK_SIZE = 2000 # Ökad chunkstorleken för att bättre hantera FAQ-svar
23
  CHUNK_OVERLAP = 200 # Nytt: Overlapping chunks för att inte tappa kontext
24
  RETRIEVAL_K = 5 # Antal chunker att hämta vid varje sökning
25
 
 
 
 
26
  # Kontrollera om vi kör i Hugging Face-miljön
27
  IS_HUGGINGFACE = os.environ.get("SPACE_ID") is not None
28
 
@@ -363,18 +366,42 @@ def retrieve_context(query, k=RETRIEVAL_K):
363
  # Ladda prompt template
364
  prompt_template = load_prompt()
365
 
366
- def generate_answer(query):
367
- """Genererar svar baserat fråga och retrieval-baserad kontext med Claude Haiku."""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
368
  # Hämta relevant kontext via RAG istället för hela databasen
369
  context, sources = retrieve_context(query)
370
 
371
  if not context.strip():
372
  return "Jag hittar ingen relevant information i mina källor.\n\nDetta är ett AI genererat svar."
373
 
374
- # System-prompts och användarfråga
375
  system_prompt = prompt_template
376
 
377
- # Skapa ett renare användarmeddelande med bara den relevanta kontexten
 
 
 
 
 
 
 
 
 
378
  user_message = f"""Jag har en fråga om ChargeNode.
379
 
380
  Relevant kontext för frågan:
@@ -382,20 +409,22 @@ Relevant kontext för frågan:
382
 
383
  Min fråga är: {query}"""
384
 
 
 
 
385
  try:
386
- # Använd Claude Haiku med RAG-baserad kontext
387
  response = anthropic_client.messages.create(
388
- model="claude-3-7-sonnet-20250219",
389
  max_tokens=500,
390
  temperature=0.3,
391
  system=system_prompt,
392
- messages=[
393
- {"role": "user", "content": user_message}
394
- ]
395
  )
396
  answer = response.content[0].text
397
  return answer + "\n\nAI-genererat. Otillräcklig hjälp? Kontakta support@chargenode.eu eller 010-2051055"
398
  except Exception as e:
 
399
  return f"Tekniskt fel: {str(e)}\n\nAI-genererat. Kontakta support@chargenode.eu eller 010-2051055"
400
 
401
  # --- Slack Integration ---
@@ -809,7 +838,9 @@ with gr.Blocks(css=custom_css, title="ChargeNode Kundtjänst") as app:
809
  def respond(message, chat_history, request: gr.Request):
810
  global last_log
811
  start = time.time()
812
- response = generate_answer(message)
 
 
813
  elapsed = round(time.time() - start, 2)
814
 
815
  timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
@@ -846,7 +877,8 @@ with gr.Blocks(css=custom_css, title="ChargeNode Kundtjänst") as app:
846
  "ip": ip,
847
  "browser": browser,
848
  "os": osys,
849
- "platform": platform
 
850
  }
851
 
852
  # Använd den förbättrade loggfunktionen
@@ -863,7 +895,7 @@ with gr.Blocks(css=custom_css, title="ChargeNode Kundtjänst") as app:
863
 
864
  *Bot:* {response[:300]}{'...' if len(response) > 300 else ''}
865
 
866
- *Sessionsinfo:* {session_id[:8]}... | {browser} | {platform}
867
  """
868
  # Skicka asynkront för att inte blockera svarstiden
869
  threading.Thread(
@@ -984,7 +1016,7 @@ with gr.Blocks(css=custom_css, title="ChargeNode Kundtjänst") as app:
984
  }
985
 
986
  msg.submit(respond, [msg, chatbot], [msg, chatbot])
987
- clear.click(lambda: None, None, chatbot, queue=False)
988
  support_btn.click(show_support_form, chatbot, [chat_interface, support_interface, success_interface, chat_preview])
989
  back_btn.click(back_to_chat, None, [chat_interface, support_interface, success_interface])
990
  back_to_chat_btn.click(back_to_chat, None, [chat_interface, support_interface, success_interface])
 
23
  CHUNK_OVERLAP = 200 # Nytt: Overlapping chunks för att inte tappa kontext
24
  RETRIEVAL_K = 5 # Antal chunker att hämta vid varje sökning
25
 
26
+ # Uppdaterad modell till Sonnet 4
27
+ MODEL_NAME = "claude-sonnet-4-20250514"
28
+
29
  # Kontrollera om vi kör i Hugging Face-miljön
30
  IS_HUGGINGFACE = os.environ.get("SPACE_ID") is not None
31
 
 
366
  # Ladda prompt template
367
  prompt_template = load_prompt()
368
 
369
+ def format_chat_history_for_claude(chat_history):
370
+ """Formaterar chatthistoriken för Claude API med endast de senaste meddelandena för att undvika token-gränser."""
371
+ # Ta endast de senaste 10 meddelandena för att hålla kontexten hanterbar
372
+ recent_history = chat_history[-10:] if len(chat_history) > 10 else chat_history
373
+
374
+ messages = []
375
+ for msg in recent_history:
376
+ if msg["role"] in ["user", "assistant"]:
377
+ messages.append({
378
+ "role": msg["role"],
379
+ "content": msg["content"]
380
+ })
381
+
382
+ return messages
383
+
384
+ def generate_answer(query, chat_history=None):
385
+ """Genererar svar baserat på fråga, chatthistorik och retrieval-baserad kontext med Claude Sonnet 4."""
386
  # Hämta relevant kontext via RAG istället för hela databasen
387
  context, sources = retrieve_context(query)
388
 
389
  if not context.strip():
390
  return "Jag hittar ingen relevant information i mina källor.\n\nDetta är ett AI genererat svar."
391
 
392
+ # System-prompts
393
  system_prompt = prompt_template
394
 
395
+ # Förbered meddelanden för Claude API
396
+ messages = []
397
+
398
+ # Lägg till chatthistorik om den finns
399
+ if chat_history and len(chat_history) > 1:
400
+ # Formatera tidigare meddelanden (exkludera det senaste som är den aktuella frågan)
401
+ formatted_history = format_chat_history_for_claude(chat_history[:-1])
402
+ messages.extend(formatted_history)
403
+
404
+ # Skapa användarmeddelandet med kontext och aktuell fråga
405
  user_message = f"""Jag har en fråga om ChargeNode.
406
 
407
  Relevant kontext för frågan:
 
409
 
410
  Min fråga är: {query}"""
411
 
412
+ # Lägg till det aktuella användarmeddelandet
413
+ messages.append({"role": "user", "content": user_message})
414
+
415
  try:
416
+ # Använd Claude Sonnet 4 med RAG-baserad kontext och chatthistorik
417
  response = anthropic_client.messages.create(
418
+ model=MODEL_NAME,
419
  max_tokens=500,
420
  temperature=0.3,
421
  system=system_prompt,
422
+ messages=messages
 
 
423
  )
424
  answer = response.content[0].text
425
  return answer + "\n\nAI-genererat. Otillräcklig hjälp? Kontakta support@chargenode.eu eller 010-2051055"
426
  except Exception as e:
427
+ print(f"Fel vid API-anrop: {str(e)}")
428
  return f"Tekniskt fel: {str(e)}\n\nAI-genererat. Kontakta support@chargenode.eu eller 010-2051055"
429
 
430
  # --- Slack Integration ---
 
838
  def respond(message, chat_history, request: gr.Request):
839
  global last_log
840
  start = time.time()
841
+
842
+ # Skicka hela chatthistoriken till generate_answer
843
+ response = generate_answer(message, chat_history)
844
  elapsed = round(time.time() - start, 2)
845
 
846
  timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
 
877
  "ip": ip,
878
  "browser": browser,
879
  "os": osys,
880
+ "platform": platform,
881
+ "chat_history_length": len(chat_history) # Lägg till information om chatthistorikens längd
882
  }
883
 
884
  # Använd den förbättrade loggfunktionen
 
895
 
896
  *Bot:* {response[:300]}{'...' if len(response) > 300 else ''}
897
 
898
+ *Sessionsinfo:* {session_id[:8]}... | {browser} | {platform} | Chat längd: {len(chat_history)} meddelanden
899
  """
900
  # Skicka asynkront för att inte blockera svarstiden
901
  threading.Thread(
 
1016
  }
1017
 
1018
  msg.submit(respond, [msg, chatbot], [msg, chatbot])
1019
+ clear.click(lambda: initial_chat, None, chatbot, queue=False)
1020
  support_btn.click(show_support_form, chatbot, [chat_interface, support_interface, success_interface, chat_preview])
1021
  back_btn.click(back_to_chat, None, [chat_interface, support_interface, success_interface])
1022
  back_to_chat_btn.click(back_to_chat, None, [chat_interface, support_interface, success_interface])