From a58856fa00b55a4f75269fc1e827cab713ca49fd Mon Sep 17 00:00:00 2001 From: Lars Date: Tue, 2 Sep 2025 10:19:42 +0200 Subject: [PATCH] Dateien nach "app" hochladen --- app/__init__.py | Bin 0 -> 1024 bytes app/config.py | 20 ++++++++++++++++++++ app/embeddings.py | 22 ++++++++++++++++++++++ app/main.py | 18 ++++++++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 app/__init__.py create mode 100644 app/config.py create mode 100644 app/embeddings.py create mode 100644 app/main.py diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..06d7405020018ddf3cacee90fd4af10487da3d20 GIT binary patch literal 1024 ScmZQz7zLvtFd70QH3R?z00031 literal 0 HcmV?d00001 diff --git a/app/config.py b/app/config.py new file mode 100644 index 0000000..5452a90 --- /dev/null +++ b/app/config.py @@ -0,0 +1,20 @@ + +from __future__ import annotations +import os +from functools import lru_cache + +class Settings: + # Qdrant + QDRANT_URL: str = os.getenv("QDRANT_URL", "http://127.0.0.1:6333") + QDRANT_API_KEY: str | None = os.getenv("QDRANT_API_KEY") + COLLECTION_PREFIX: str = os.getenv("MINDNET_PREFIX", "mindnet") + VECTOR_SIZE: int = int(os.getenv("MINDNET_VECTOR_SIZE", "384")) + DISTANCE: str = os.getenv("MINDNET_DISTANCE", "Cosine") + # Embeddings + MODEL_NAME: str = os.getenv("MINDNET_MODEL", "sentence-transformers/all-MiniLM-L6-v2") + # API + DEBUG: bool = os.getenv("DEBUG", "false").lower() == "true" + +@lru_cache +def get_settings() -> Settings: + return Settings() diff --git a/app/embeddings.py b/app/embeddings.py new file mode 100644 index 0000000..2f23562 --- /dev/null +++ b/app/embeddings.py @@ -0,0 +1,22 @@ + +from __future__ import annotations +from typing import List +from functools import lru_cache + +from .config import get_settings + +# Lazy import so startup stays fast +@lru_cache +def _load_model(): + from sentence_transformers import SentenceTransformer + settings = get_settings() + model = SentenceTransformer(settings.MODEL_NAME, device="cpu") + return model + +def embed_texts(texts: List[str]) -> list[list[float]]: + model = _load_model() + # Normalize to list of str + texts = [t if isinstance(t, str) else str(t) for t in texts] + vecs = model.encode(texts, normalize_embeddings=True, convert_to_numpy=False) + # Ensure pure-python list of floats + return [list(map(float, v)) for v in vecs] diff --git a/app/main.py b/app/main.py new file mode 100644 index 0000000..0098913 --- /dev/null +++ b/app/main.py @@ -0,0 +1,18 @@ + +from __future__ import annotations +from fastapi import FastAPI +from .config import get_settings +from .routers.embed_router import router as embed_router +from .routers.qdrant_router import router as qdrant_router + +def create_app() -> FastAPI: + app = FastAPI(title="mindnet API", version="0.1.0") + s = get_settings() + @app.get("/healthz") + def healthz(): + return {"status": "ok", "qdrant": s.QDRANT_URL, "prefix": s.COLLECTION_PREFIX} + app.include_router(embed_router) + app.include_router(qdrant_router) + return app + +app = create_app()