Update app.py
Browse files
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
|
| 367 |
-
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|
| 375 |
system_prompt = prompt_template
|
| 376 |
|
| 377 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|
| 387 |
response = anthropic_client.messages.create(
|
| 388 |
-
model=
|
| 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 |
-
|
|
|
|
|
|
|
| 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:
|
| 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])
|