"""
configuration for vector Storage and retriever
can adjust settings for Pinecone and embedding model configurations.
edit these values as needed when the embedding model changes.
"""
import os
from pathlib import Path
# ============================================================================
# PINECONE CONFIGURATION
# ============================================================================
# API Key - loaded from .envpinecone file
_envfile = Path(__file__).parent / ".envpinecone"
PINECONE_API_KEY = _envfile.read_text().strip() if _envfile.exists() else ""
# Index Configuration
# Index Configuration
PINECONE_INDEX_NAME = os.environ.get("PINECONE_INDEX_NAME", "rag-hybrid-index-v2")
PINECONE_CLOUD = os.environ.get("PINECONE_CLOUD", "aws")
PINECONE_REGION = os.environ.get("PINECONE_REGION", "us-east-1")
# ============================================================================
# EMBEDDING CONFIGURATION (NVIDIA NIM)
# ============================================================================
# NVIDIA API Key - loaded from environment or .envnvidia file
_nvidia_envfile = Path(__file__).parent / ".envnvidia"
NVIDIA_API_KEY = os.environ.get("NVIDIA_API_KEY") or (
_nvidia_envfile.read_text().strip() if _nvidia_envfile.exists() else ""
)
# embedding dimension - must match the model output
# current: nvidia/llama-3.2-nv-embedqa-1b-v2 (2048 dimensions)
EMBEDDING_DIMENSION = int(os.environ.get("EMBEDDING_DIMENSION", "2048"))
# embedding model identifier
EMBEDDING_MODEL = os.environ.get("EMBEDDING_MODEL", "nvidia/llama-3.2-nv-embedqa-1b-v2")
# ============================================================================
# RETRIEVAL CONFIGURATION
# ============================================================================
# number of top results to return from similarity search
TOP_K = int(os.environ.get("TOP_K", "30"))
# similarity metric used by Pinecone
# options: "cosine", "euclidean", "dotproduct" (cosine is the most used usually)
SIMILARITY_METRIC = os.environ.get("SIMILARITY_METRIC", "cosine")
# RRF constant for hybrid retrieval (higher = more equal weighting between dense/sparse)
RRF_K = int(os.environ.get("RRF_K", "60"))
# ============================================================================
# CROSS-ENCODER RERANKER CONFIGURATION
# ============================================================================
# Enable/disable cross-encoder reranking after retrieval
RERANKER_ENABLED = os.environ.get("RERANKER_ENABLED", "true").lower() in ("true", "1", "yes")
# Cross-encoder model for reranking
RERANKER_MODEL = os.environ.get("RERANKER_MODEL", "cross-encoder/ms-marco-MiniLM-L6-v2")
# Number of passages to return after reranking (controls how many chunks the LLM sees)
RERANKER_TOP_N = int(os.environ.get("RERANKER_TOP_N", "10"))
# ============================================================================
# CONVERSATION MEMORY CONFIGURATION
# ============================================================================
# Namespace for conversation memories (separate from document vectors)
CONVERSATION_MEMORY_NAMESPACE = "conversation_memory"
# Default boost for memory results during retrieval merging
MEMORY_BOOST = float(os.environ.get("MEMORY_BOOST", "0.5"))
# Minimum similarity score for conversation memories (filters out irrelevant ones)
MEMORY_MIN_SCORE = float(os.environ.get("MEMORY_MIN_SCORE", "0.2"))
# ============================================================================
# SPARSE INDEX CONFIGURATION
# ============================================================================
# Sparse index for BM25-style retrieval (separate from dense index)
SPARSE_INDEX_NAME = os.environ.get("SPARSE_INDEX_NAME", "rag-sparse-index-v1")
SPARSE_EMBEDDING_MODEL = "pinecone-sparse-english-v0"
# ============================================================================
# LANGSMITH CONFIGURATION
# ============================================================================
# LangSmith API Key - loaded from .envlangsmith file
_langsmith_envfile = Path(__file__).parent / ".envlangsmith"
LANGCHAIN_API_KEY = os.environ.get("LANGCHAIN_API_KEY") or (
_langsmith_envfile.read_text().strip() if _langsmith_envfile.exists() else ""
)
# Enable tracing when API key is available
LANGCHAIN_TRACING_V2 = "true" if LANGCHAIN_API_KEY else "false"
LANGCHAIN_PROJECT = os.environ.get("LANGCHAIN_PROJECT", "cognitive-rag-retrieval")
def get_config_summary() -> dict:
"""return a summary of current configuration (for debugging mostly)."""
return {
"pinecone_index": PINECONE_INDEX_NAME,
"pinecone_cloud": PINECONE_CLOUD,
"pinecone_region": PINECONE_REGION,
"embedding_dimension": EMBEDDING_DIMENSION,
"embedding_model": EMBEDDING_MODEL,
"top_k": TOP_K,
"similarity_metric": SIMILARITY_METRIC,
"reranker_enabled": RERANKER_ENABLED,
"reranker_model": RERANKER_MODEL,
"reranker_top_n": RERANKER_TOP_N,
"api_key_set": bool(PINECONE_API_KEY),
}