diff --git a/.gitea/workflows/main.yaml b/.gitea/workflows/main.yaml index e44c8f2..b12b0df 100644 --- a/.gitea/workflows/main.yaml +++ b/.gitea/workflows/main.yaml @@ -22,7 +22,9 @@ jobs: with: python-version: "3.14" - name: Install dependencies - run: pip install -r requirements.txt pytest + run: pip install -r requirements.txt pytest ruff==0.17.1 + - name: Lint (undefined names) + run: ruff check src/ tests/ --select F821 - name: Run unit tests run: pytest tests/ -v env: diff --git a/src/indexer.py b/src/indexer.py index 944fcc1..639f097 100644 --- a/src/indexer.py +++ b/src/indexer.py @@ -29,6 +29,13 @@ MAILDIR_FOLDERS = os.environ.get("MAILDIR_FOLDERS", "") QDRANT_URL = os.environ.get("QDRANT_URL", "") COLLECTION_NAME = os.environ.get("COLLECTION_NAME", "") +# Embedding model and batching. EMBEDDING_MODEL_NAME MUST stay in sync with the +# one used by server.py: indexer and server have to embed with the same model, +# otherwise the vectors stored in Qdrant are not comparable with query vectors. +EMBEDDING_MODEL_NAME = os.environ.get("EMBEDDING_MODEL_NAME", "BAAI/bge-small-en-v1.5") +BATCH_SIZE = int(os.environ.get("BATCH_SIZE", "100")) +EMBEDDING_BATCH_SIZE = int(os.environ.get("EMBEDDING_BATCH_SIZE", "64")) + METADATA_COLLECTION = "mcp_indexer_metadata" INCREMENTAL_DAYS = int(os.environ.get("INCREMENTAL_DAYS", "7")) FORCE_REINDEX = os.environ.get("FORCE_REINDEX", "").lower() in ("1", "true", "yes") diff --git a/tests/test_indexer.py b/tests/test_indexer.py index 4b33ce7..2fe62db 100644 --- a/tests/test_indexer.py +++ b/tests/test_indexer.py @@ -21,6 +21,9 @@ from indexer import ( parse_email_message, get_recent_keys, METADATA_COLLECTION, + EMBEDDING_MODEL_NAME, + BATCH_SIZE, + EMBEDDING_BATCH_SIZE, ) @@ -227,3 +230,25 @@ class TestGetRecentKeys: assert key.split(":")[0] in keys for k in keys: assert ":" not in k + + +# --------------------------------------------------------------------------- +# Regression: module-level constants consumed by main() +# --------------------------------------------------------------------------- + + +def test_indexer_module_constants_are_defined(): + """Regression (e32806a): the "make indexer importable without env" refactor + dropped these three module-level definitions while main() kept using them, + so every indexer run died with NameError before touching Qdrant.""" + assert isinstance(EMBEDDING_MODEL_NAME, str) and EMBEDDING_MODEL_NAME + assert isinstance(BATCH_SIZE, int) and BATCH_SIZE > 0 + assert isinstance(EMBEDDING_BATCH_SIZE, int) and EMBEDDING_BATCH_SIZE > 0 + + +def test_embedding_model_is_the_same_as_the_server_one(): + """Indexer and server must embed with the same model, otherwise the vectors + stored by the indexer are not comparable with the query vectors.""" + from server import EMBEDDING_MODEL_NAME as server_embedding_model + + assert EMBEDDING_MODEL_NAME == server_embedding_model