File size: 3,985 Bytes
233102d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99cac84
 
 
 
 
 
233102d
 
 
 
 
 
 
 
 
 
99cac84
233102d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2671aea
233102d
 
 
 
2671aea
9b7c6ff
944fb90
 
76e224e
2671aea
99cac84
233102d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
Central configuration for ResearchPilot

RULE: No hardcoded values anywhere else in this codebase.
Every constant lives here. This make the system to 
tune without hunting through multiple files.
"""

import os
from pathlib import Path
from dotenv import load_dotenv

# Load environment variables from .env file
# This must happen before anything else reads os.environ
load_dotenv()

# ------------------------------------------
# PROJECT PATHS
# ------------------------------------------
# Path(__file__) = config/setting.py 
# .parent =      = config/
# .parent.parent = researchpilot/ <- project root
ROOT_DIR = Path(__file__).parent.parent

DATA_DIR        = ROOT_DIR / "data"
RAW_DIR         = DATA_DIR / "raw"
PROCESSED_DIR   = DATA_DIR / "processed"
CHUNKS_DIR      = DATA_DIR / "chunks"
EMBEDDINGS_DIR  = DATA_DIR / "embeddings"
LOGS_DIR        = ROOT_DIR / "logs"    


# Create directories if they don't exist
# This ensures the app works on any machine without manual setup
for directory in [RAW_DIR, PROCESSED_DIR, CHUNKS_DIR, EMBEDDINGS_DIR, LOGS_DIR]:
    directory.mkdir(
        parents = True,
        exist_ok = True
    )

# ------------------------------------------
# DATA INGESTION SETTINGS
# ------------------------------------------
ARXIV_CATEGORIES = ["cs.LG", "cs.AI", "stat.ML"]    # Machine Learning + AI
MAX_PAPERS_PER_FETCH = 100                          # Papers per API call
TOTAL_PAPERS_TARGET  = 700                          # Total papers to collect
ARXIV_API_DELAY_SECONDS = 3.0                       # ArXiv rate limit: be respectful
PDF_DOWNLOAD_TIMEOUT = 30                           # Seconds before giving up on a PDF
MAX_DOWNLOAD_RETRIES = 3                            # Retry failed downloads N times

# ------------------------------------------
# DOCUMENT PROCESSING SETTINGS
# ------------------------------------------
MIN_TEXT_LENGTH = 500       # Skip papers with less that 500 chars
MAX_TEXT_LENGTH = 500_000   # Skip papers larger than 100k chars (corrupted)

# ------------------------------------------
# CHUNKING SETTINGS
# ------------------------------------------
CHUNK_SIZE = 512        # Characters per chunk
CHUNK_OVERLAP = 50      # Overlap between consecutive chunks
MIN_CHUNK_SIZE = 100    # Discard chunks smaller than this

# ------------------------------------------
# EMBEDDING SETTINGS
# ------------------------------------------
EMBEDDING_MODEL_NAME = "BAAI/bge-base-en-v1.5"
EMBEDDING_BATCH_SIZE = 32                       # Process N chunks at once
EMBEDDING_DIMENSION  = 768                      # BGE-base output dimension

# ------------------------------------------
# VECTOR STORE SETTINGS
# ------------------------------------------
QDRANT_COLLECTION_NAME = 'research_papers'
QDRANT_PATH = str(ROOT_DIR / 'data' / 'qdrant_db')  # Local Storage path
TOP_K_RETRIEVAL = 20                                # Retrieve top 20 candidates
TOP_K_RERANK = 5                                    # Keep top 5 after reranking

# ------------------------------------------
# LLM SETTINGS
GROQ_API_KEY = os.getenv('GROQ_API_KEY')            # Loaded from .env
HF_API_KEY = os.getenv('HF_API_KEY')
if HF_API_KEY:
    os.environ["HF_TOKEN"] = HF_API_KEY
LLM_MODEL_NAME = 'zai-org/GLM-5.1'                  # Primary model ID
LLM_TEMPERATURE = 0.1                               # Low = More factual/consistent 
LLM_MAX_TOKENS = 2048                               # Max response tokens

# ------------------------------------------
# API SETTINGS
# ------------------------------------------
API_HOST = "0.0.0.0"
API_PORT = 8000
API_RELOAD = True   # Auto-reload on code change (dev-only)

# ------------------------------------------
# LOGGING SETTINGS
# ------------------------------------------
LOG_LEVEL     = "INFO"
LOG_FILE      = LOGS_DIR / "researchpilot.log"
LOG_ROTATION  = "10 MB"                         # Create new log file after 10MB
LOG_RETENTION = "7 days"                        # Keep logs for 7 days