File size: 3,113 Bytes
0b35d70
 
 
 
 
 
 
 
 
 
 
 
 
 
5e63253
0b35d70
 
806346b
8b2c48f
 
0b35d70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bbd3c3e
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
# utils.py

import logging
import streamlit as st
import os
from dotenv import load_dotenv

# --- Configuration ---
def load_config():
    """Loads API keys and other config from .env file."""
    load_dotenv()
    config = {
        "openrouter_api_key": os.getenv("OPENROUTER_API_KEY"),
        "openrouter_base_url": "https://openrouter.ai/api/v1",
        "openrouter_chat_model": "deepseek/deepseek-r1-0528-qwen3-8b:free",
        # Removed openrouter_embedding_model as we'll use HF
        "huggingface_api_token": os.getenv("HUGGINGFACEHUB_API_TOKEN"), # Load HF token
        "huggingface_embedding_model": "sentence-transformers/all-MiniLM-L6-v2", # Define HF model
        "use_local_embeddings": True,  # Flag to indicate we're using local embeddings
        "embedding_cache_dir": "/tmp/hf_models"  # Cache directory for local models
    }
    if not config["openrouter_api_key"]:
        st.error("🚨 OpenRouter API key not found! Please set OPENROUTER_API_KEY in the .env file.")
        st.stop()
    if not config["huggingface_api_token"]:
        st.warning(
            "⚠️ Hugging Face API token (HUGGINGFACEHUB_API_TOKEN) not found in .env file. "
            "Inference API Embeddings might fail if the model requires authentication or hits rate limits. "
            "Consider using local embeddings (HuggingFaceEmbeddings) if issues persist."
        )
        # Depending on the model, the API might work without a key for public models under rate limits
        # Set it to None if not found, the HuggingFaceInferenceAPIEmbeddings class might handle it.
        config["huggingface_api_token"] = None # Allow proceeding without key, but with warning

    return config

# --- Logging Setup --- (Keep the rest of the logging code as is)
class StreamlitLogHandler(logging.Handler):
    def __init__(self, container):
        super().__init__()
        self.container = container
        self.log_records = []
    def emit(self, record):
        try:
            msg = self.format(record)
            self.log_records.append(msg)
        except Exception:
            self.handleError(record)
    def get_logs(self): return "\n".join(self.log_records)
    def clear_logs(self): self.log_records = []

logger = logging.getLogger("RAG_APP")
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
if not logger.handlers: pass

def setup_streamlit_logging(log_container):
    for handler in logger.handlers[:]:
        if isinstance(handler, StreamlitLogHandler): logger.removeHandler(handler)
    st_handler = StreamlitLogHandler(log_container)
    st_handler.setFormatter(formatter)
    logger.addHandler(st_handler)
    return st_handler

# --- Helper Functions ---
def get_manual_text(filepath="data/ace900_takeoff_manual.txt"):
    try:
        with open(filepath, 'r', encoding='utf-8') as f: return f.read()
    except FileNotFoundError:
        st.error(f"🚨 Manual file not found at: {filepath}")
        st.stop()
    except Exception as e:
        st.error(f"🚨 Error reading manual file: {e}")
        st.stop()