import os from pathlib import Path ROOT = Path(__file__).resolve().parent.parent DATA_DIR = ROOT / "data" STATIC_DIR = ROOT / "static" EMBEDDING_MODEL = "BAAI/bge-small-zh-v1.5" COLLECTION_NAME = "knowledge_bge_small_zh_v15" CHUNK_SIZE = 360 CHUNK_OVERLAP = 60 DEFAULT_TOP_K = 4 LOW_SCORE = 0.45 os.environ.setdefault("ANONYMIZED_TELEMETRY", "False") os.environ.setdefault("TOKENIZERS_PARALLELISM", "false") def load_dotenv() -> None: path = ROOT / ".env" if not path.exists(): return for raw in path.read_text(encoding="utf-8").splitlines(): line = raw.strip() if not line or line.startswith("#") or "=" not in line: continue key, value = line.split("=", 1) key = key.strip() value = value.strip().strip('"').strip("'") if key and key not in os.environ: os.environ[key] = value load_dotenv() def llm_config() -> dict | None: key = os.getenv("OPENAI_API_KEY", "").strip() openai_base = os.getenv("OPENAI_BASE_URL", "").strip() if key and openai_base: model = os.getenv("OPENAI_MODEL", "gpt-4o-mini").strip() or "gpt-4o-mini" return {"provider": "openai", "key": key, "base": openai_base.rstrip("/"), "model": model} base = os.getenv("OLLAMA_BASE_URL", "http://10.7.9.3:11434").strip() if not base: return None model = os.getenv("OLLAMA_MODEL", "qwen3-vl:4b").strip() or "qwen3-vl:4b" return {"provider": "ollama", "key": "ollama", "base": base.rstrip("/"), "model": model}