"""Configuration centralisée du projet.""" import os from pathlib import Path from dotenv import load_dotenv load_dotenv() # ── Chemins ────────────────────────────────────────────────────────────────── BASE_DIR = Path(__file__).resolve().parent.parent DATA_DIR = BASE_DIR / "data" VECTORSTORE_DIR = BASE_DIR / "vectorstores" SAMPLE_DIR = DATA_DIR / "sample" # Créer les répertoires s'ils n'existent pas DATA_DIR.mkdir(exist_ok=True) VECTORSTORE_DIR.mkdir(exist_ok=True) SAMPLE_DIR.mkdir(exist_ok=True) # ── API ────────────────────────────────────────────────────────────────────── ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY", "") # ── LLM Backend ───────────────────────────────────────────────────────────── # "ollama" → LLM local via Ollama (défaut local, gratuit) # "huggingface" → Inference API HF (défaut sur HF Spaces, gratuit) # "anthropic" → Claude API (nécessite ANTHROPIC_API_KEY) LLM_BACKEND = os.getenv("LLM_BACKEND", "ollama") # Ollama OLLAMA_BASE_URL = os.getenv("OLLAMA_BASE_URL", "http://localhost:11434") OLLAMA_MODEL = os.getenv("OLLAMA_MODEL", "mistral") # Anthropic (fallback) ANTHROPIC_MODEL = os.getenv("ANTHROPIC_MODEL", "claude-sonnet-4-20250514") # ── Embeddings ─────────────────────────────────────────────────────────────── EMBEDDING_MODEL = os.getenv( "EMBEDDING_MODEL", "sentence-transformers/all-MiniLM-L6-v2" ) # ── Chunking ───────────────────────────────────────────────────────────────── CHUNK_SIZE = int(os.getenv("CHUNK_SIZE", "500")) CHUNK_OVERLAP = int(os.getenv("CHUNK_OVERLAP", "50")) # ── Retrieval ──────────────────────────────────────────────────────────────── TOP_K = int(os.getenv("TOP_K", "4")) # ── Prompt système pour le LLM ─────────────────────────────────────────────── SYSTEM_PROMPT = """Tu es NormAssist, un assistant expert en documentation technique industrielle. Ton rôle est de répondre aux questions des ingénieurs et techniciens en te basant UNIQUEMENT sur les extraits de documents fournis dans le contexte. Règles strictes : 1. Réponds UNIQUEMENT à partir des extraits fournis. Si l'information n'est pas dans le contexte, dis-le clairement. 2. Cite TOUJOURS les passages exacts qui appuient ta réponse, entre guillemets, avec le numéro de page. 3. Structure ta réponse : résumé concis → détails avec citations → avertissements éventuels. 4. Utilise le vocabulaire technique précis du document source. 5. Si le document mentionne des valeurs numériques (tolérances, températures, pressions), restitue-les exactement. 6. En cas d'ambiguïté, signale les différentes interprétations possibles. Format de citation : [Document: «nom», Page X] "passage exact" """