File size: 5,743 Bytes
8391380
 
 
 
 
 
 
 
 
 
 
 
64ef0d1
 
 
51e4106
 
 
64ef0d1
8391380
 
 
5e7d9f7
 
8391380
46a7c4a
8391380
 
 
 
5e7d9f7
 
 
51e4106
64ef0d1
5e7d9f7
 
 
 
 
 
 
 
 
51e4106
8391380
5e7d9f7
 
 
64ef0d1
5e7d9f7
 
64ef0d1
 
51e4106
5e7d9f7
 
 
 
 
 
 
 
8391380
5e7d9f7
 
 
64ef0d1
8391380
 
 
64ef0d1
 
 
 
 
8391380
64ef0d1
 
 
 
 
 
 
 
 
8391380
64ef0d1
8391380
64ef0d1
 
 
8391380
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# session_state.py
import streamlit as st
import logging
from pathlib import Path
from typing import Optional
from chatbot_new import InitializationError, StateError
from config import VECTOR_STORE_PATH
from chatbot_new import IntelligentRAGChatbot
import os

logger = logging.getLogger(__name__)

import streamlit as st
from chatbot_new import IntelligentRAGChatbot
from environment_setup import setup_environment
import logging

logger = logging.getLogger(__name__)

def initialize_session_state():
    """Initialisiert den Session State"""
    try:
        st.info("Starte Initialisierung...")
        
        if "theme" not in st.session_state:
            st.session_state.theme = "dark"
            
        _initialize_basic_state()
        
        if "chatbot" not in st.session_state:
            status_container = st.empty()
            status_container.info("Lade Environment...")
            
            # Hole API Key und Vector Store Path
            api_key, vector_store_path = setup_environment()
            status_container.info("Environment geladen!")
            
            # Überprüfe ob die Datei existiert
            vector_file = vector_store_path / "vectorstore.pkl"
            if not vector_file.exists():
                status_container.error(f"Datei nicht gefunden: {vector_file}")
                raise FileNotFoundError(f"Vector Store Datei nicht gefunden: {vector_file}")
            
            status_container.info(f"Vector Store gefunden: {vector_file}")
            
            with st.spinner("Initialisiere Chatbot..."):
                logger.info("Starte Chatbot-Initialisierung...")
                status_container.info("Initialisiere Chatbot Komponenten...")
                
                st.session_state.chatbot = IntelligentRAGChatbot(
                    vectorstore_file=vector_file,
                    bm25_file=vector_file,  # Verwende die gleiche Datei
                    api_key=api_key
                )
                
                status_container.success("Chatbot erfolgreich initialisiert!")
                status_container.empty()
                
    except FileNotFoundError as e:
        error_msg = f"Datei nicht gefunden: {str(e)}"
        logger.error(error_msg)
        st.error(error_msg)
        raise
    except Exception as e:
        error_msg = f"Fehler bei der State-Initialisierung: {str(e)}"
        logger.error(error_msg)
        st.error(error_msg)
        raise

def _initialize_basic_state():
    """Initialisiert die grundlegenden Session State Variablen"""
    if "messages" not in st.session_state:
        st.session_state.messages = [{
            "role": "assistant", 
            "content": "Hallo! Ich bin Ihr KI-Assistent für Wirtschaftsprüfungsthemen. Wie kann ich Ihnen helfen?"
        }]

    default_settings = {
        "feedback": None,
        "debug": False,
        "theme": "light",
        "error_count": 0,
        "conversation_context": {
            "last_response": None,
            "active_themes": [],
            "interaction_count": 0
        }
    }

    for key, value in default_settings.items():
        if key not in st.session_state:
            st.session_state[key] = value

def _initialize_chatbot():
    """Initialisiert den Chatbot mit Fehlerprüfung"""
    try:
        # Pfadprüfungen
        _verify_paths()

        # API Key Prüfung
        api_key = _verify_api_key()

        # Chatbot Initialisierung
        logger.info("Starte Chatbot-Initialisierung...")
        st.session_state.chatbot = IntelligentRAGChatbot(
            vectorstore_file=VECTOR_STORE_PATH / "vectorstore.pkl",
            bm25_file=VECTOR_STORE_PATH / "bm25.pkl",
            api_key=api_key
        )

    except Exception as e:
        raise InitializationError(f"Chatbot-Initialisierung fehlgeschlagen: {str(e)}")

def _verify_paths():
    """Überprüft die erforderlichen Dateipfade"""
    if not VECTOR_STORE_PATH.exists():
        raise FileNotFoundError(f"Verzeichnis nicht gefunden: {VECTOR_STORE_PATH}")

    required_files = {
        "vectorstore.pkl": "Vector Store Datei",
        "bm25.pkl": "BM25 Datei"
    }

    for filename, description in required_files.items():
        file_path = VECTOR_STORE_PATH / filename
        if not file_path.exists():
            raise FileNotFoundError(f"{description} nicht gefunden: {file_path}")

def _verify_api_key() -> str:
    """Überprüft und gibt den API Key zurück"""
    api_key = os.getenv("GOOGLE_API_KEY")
    if not api_key:
        raise ValueError("Google API Key nicht gefunden. Bitte setzen Sie die Umgebungsvariable.")
    return api_key

def _handle_initialization_error(error: Exception):
    """Zentrale Fehlerbehandlung für Initialisierungsfehler"""
    error_messages = {
        FileNotFoundError: "Datei nicht gefunden",
        ValueError: "Konfigurationsfehler",
        InitializationError: "Chatbot-Initialisierungsfehler",
        StateError: "Session State Fehler"
    }

    error_type = type(error)
    base_message = error_messages.get(error_type, "Unerwarteter Fehler")

    error_msg = f"{base_message}: {str(error)}"

    # Debug-Modus Handling
    if st.session_state.get('debug', False):
        st.error(f"Detaillierter Fehler: {error_msg}")
        logger.error(error_msg, exc_info=True)
    else:
        st.error("Ein Fehler ist bei der Initialisierung aufgetreten.")
        logger.error(error_msg)

    # Fehlerzähler
    st.session_state.error_count = st.session_state.get('error_count', 0) + 1

    if st.session_state.error_count > 3:
        st.error("Mehrere Fehler aufgetreten. Bitte laden Sie die Seite neu.")
        logger.critical("Kritische Fehlerhäufung bei der Initialisierung")

    raise error