1 line
52 KiB
JSON
1 line
52 KiB
JSON
{"repo": "1225-1225/railway-8620", "files": {"settings.py": {"ac0eae99845e1fe04c2abf4a70554a25e1a118c4": {"t": 1785746908.0815022, "n": 2541, "h": "1bd4ef901883d416", "c": "import os\nfrom pydantic_settings import BaseSettings, SettingsConfigDict\n\n#项目根目录:settings.py所在目录\nPROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))\n\nclass Settings(BaseSettings):\n # RAGFlow 配置\n ragflow_host: str = \"http://localhost:9380\"\n ragflow_api_key: str = \"\"\n ragflow_dataset_id: str = \"\"\n\n # 检索\n kwargs: int = 5\n ragflow_similarity_threshold: float = 0.0\n\n # LLM 供应商(openai / anthropic)\n llm_provider: str = \"openai\"\n llm_api_key: str = \"\"\n llm_model_name: str = \"deepseek-v4-flash\"\n llm_base_url: str = \"\"\n\n # Embedding 供应商(阿里百炼等兼容 OpenAI 格式的服务)\n embedding_provider: str = \"openai\"\n embedding_api_key: str = \"\"\n embedding_model_name: str = \"text-embedding-v4\"\n embedding_base_url: str = \"\"\n\n # 对话历史\n session_config: dict = {\"configurable\": {\"session_id\": \"001\"}}\n chat_history_storage_path: str = \"\"\n history_database_name: str = \"chat_history_check_pointer\"\n\n # 数据路径(用于迁移脚本等)\n data_path: str = \"\"\n\n model_config = SettingsConfigDict(env_file=\".env\", extra=\"ignore\")\n\n\ndef _apply_path_defaults(s: Settings):\n \"\"\"补全未在.env中指定的相对路径\"\"\"\n if not s.data_path:\n s.data_path = os.path.join(PROJECT_ROOT, \"data\", \"cleaned_txts\")\n if not s.chat_history_storage_path:\n s.chat_history_storage_path = os.path.join(PROJECT_ROOT, \"chat_history\")\n\n\ndef _resolve_env_var_refs(s: Settings):\n \"\"\"将 API Key 字段中的环境变量名引用替换为实际值\n\n `.env` 中两种写法都支持:\n llm_api_key=sk-xxx → 直接用\n llm_api_key=DEEPSEEK_API_KEY → 视为环境变量名,取 os.environ[\"DEEPSEEK_API_KEY\"]\n \"\"\"\n for field in (\"llm_api_key\", \"embedding_api_key\", \"ragflow_api_key\"):\n raw = getattr(s, field)\n if raw and raw in os.environ and os.environ[raw]:\n setattr(s, field, os.environ[raw])\n\n\nclass _SettingsProxy:\n \"\"\"代理类:支持运行时从 .env 重新加载配置,无需重启进程\"\"\"\n\n def __init__(self):\n object.__setattr__(self, \"_settings\", None)\n self._load()\n\n def _load(self):\n s = Settings()\n _apply_path_defaults(s)\n _resolve_env_var_refs(s)\n object.__setattr__(self, \"_settings\", s)\n\n def reload(self):\n \"\"\"从 .env 重新加载所有配置\"\"\"\n self._load()\n\n def __getattr__(self, name):\n if name.startswith(\"_\"):\n raise AttributeError(name)\n return getattr(self._settings, name)\n\n def __setattr__(self, name, value):\n if name.startswith(\"_\"):\n object.__setattr__(self, name, value)\n else:\n setattr(self._settings, name, value)\n\n\nsettings = _SettingsProxy()"}, "28c5794216f2a0738cc27b44254bcb8c795599a6": {"t": 1785768801.5690706, "n": 2541, "h": "1bd4ef901883d416", "c": "import os\nfrom pydantic_settings import BaseSettings, SettingsConfigDict\n\n#项目根目录:settings.py所在目录\nPROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))\n\nclass Settings(BaseSettings):\n # RAGFlow 配置\n ragflow_host: str = \"http://localhost:9380\"\n ragflow_api_key: str = \"\"\n ragflow_dataset_id: str = \"\"\n\n # 检索\n kwargs: int = 5\n ragflow_similarity_threshold: float = 0.0\n\n # LLM 供应商(openai / anthropic)\n llm_provider: str = \"openai\"\n llm_api_key: str = \"\"\n llm_model_name: str = \"deepseek-v4-flash\"\n llm_base_url: str = \"\"\n\n # Embedding 供应商(阿里百炼等兼容 OpenAI 格式的服务)\n embedding_provider: str = \"openai\"\n embedding_api_key: str = \"\"\n embedding_model_name: str = \"text-embedding-v4\"\n embedding_base_url: str = \"\"\n\n # 对话历史\n session_config: dict = {\"configurable\": {\"session_id\": \"001\"}}\n chat_history_storage_path: str = \"\"\n history_database_name: str = \"chat_history_check_pointer\"\n\n # 数据路径(用于迁移脚本等)\n data_path: str = \"\"\n\n model_config = SettingsConfigDict(env_file=\".env\", extra=\"ignore\")\n\n\ndef _apply_path_defaults(s: Settings):\n \"\"\"补全未在.env中指定的相对路径\"\"\"\n if not s.data_path:\n s.data_path = os.path.join(PROJECT_ROOT, \"data\", \"cleaned_txts\")\n if not s.chat_history_storage_path:\n s.chat_history_storage_path = os.path.join(PROJECT_ROOT, \"chat_history\")\n\n\ndef _resolve_env_var_refs(s: Settings):\n \"\"\"将 API Key 字段中的环境变量名引用替换为实际值\n\n `.env` 中两种写法都支持:\n llm_api_key=sk-xxx → 直接用\n llm_api_key=DEEPSEEK_API_KEY → 视为环境变量名,取 os.environ[\"DEEPSEEK_API_KEY\"]\n \"\"\"\n for field in (\"llm_api_key\", \"embedding_api_key\", \"ragflow_api_key\"):\n raw = getattr(s, field)\n if raw and raw in os.environ and os.environ[raw]:\n setattr(s, field, os.environ[raw])\n\n\nclass _SettingsProxy:\n \"\"\"代理类:支持运行时从 .env 重新加载配置,无需重启进程\"\"\"\n\n def __init__(self):\n object.__setattr__(self, \"_settings\", None)\n self._load()\n\n def _load(self):\n s = Settings()\n _apply_path_defaults(s)\n _resolve_env_var_refs(s)\n object.__setattr__(self, \"_settings\", s)\n\n def reload(self):\n \"\"\"从 .env 重新加载所有配置\"\"\"\n self._load()\n\n def __getattr__(self, name):\n if name.startswith(\"_\"):\n raise AttributeError(name)\n return getattr(self._settings, name)\n\n def __setattr__(self, name, value):\n if name.startswith(\"_\"):\n object.__setattr__(self, name, value)\n else:\n setattr(self._settings, name, value)\n\n\nsettings = _SettingsProxy()"}, "38f6b38027a7f9195f6dfa83dd62c664e12a9b17": {"t": 1785768802.8143227, "n": 2801, "h": "cc74b511a9b69f18", "c": "import os\nfrom pydantic_settings import BaseSettings, SettingsConfigDict\n\n#项目根目录:settings.py所在目录\nPROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))\n\nclass Settings(BaseSettings):\n # 向量库和RAG\n collection_name: str = \"railway-8620\"\n persist_directory: str = \"\"\n chunk_size: int = 500\n chunk_overlap: int = 77\n separators: list = [\"\\n\\n\", \"\\n\", \"。\", \"?\", \"!\", \",\", \".\", \"?\", \"!\", \",\"]\n data_path: str = \"\"\n md5_path: str = \"\"\n split_starting_point: int = 1000\n\n # 检索\n kwargs: int = 5\n\n # LLM 供应商(openai / anthropic)\n llm_provider: str = \"openai\"\n llm_api_key: str = \"\"\n llm_model_name: str = \"deepseek-v4-flash\"\n llm_base_url: str = \"\"\n\n # Embedding 供应商(阿里百炼等兼容 OpenAI 格式的服务)\n embedding_provider: str = \"openai\"\n embedding_api_key: str = \"\"\n embedding_model_name: str = \"text-embedding-v4\"\n embedding_base_url: str = \"\"\n\n # 对话历史\n session_config: dict = {\"configurable\": {\"session_id\": \"001\"}}\n chat_history_storage_path: str = \"\"\n history_database_name: str = \"chat_history_check_pointer\"\n\n model_config = SettingsConfigDict(env_file=\".env\", extra=\"ignore\")\n\n\ndef _apply_path_defaults(s: Settings):\n \"\"\"补全未在.env中指定的相对路径\"\"\"\n if not s.persist_directory:\n s.persist_directory = os.path.join(PROJECT_ROOT, \"data\", \"vector_database\")\n if not s.data_path:\n s.data_path = os.path.join(PROJECT_ROOT, \"data\", \"cleaned_txts\")\n if not s.md5_path:\n s.md5_path = os.path.join(PROJECT_ROOT, \"MD5\")\n if not s.chat_history_storage_path:\n s.chat_history_storage_path = os.path.join(PROJECT_ROOT, \"chat_history\")\n\n\ndef _resolve_env_var_refs(s: Settings):\n \"\"\"将 API Key 字段中的环境变量名引用替换为实际值\n\n `.env` 中两种写法都支持:\n llm_api_key=sk-xxx → 直接用\n llm_api_key=DEEPSEEK_API_KEY → 视为环境变量名,取 os.environ[\"DEEPSEEK_API_KEY\"]\n \"\"\"\n for field in (\"llm_api_key\", \"embedding_api_key\"):\n raw = getattr(s, field)\n if raw and raw in os.environ and os.environ[raw]:\n setattr(s, field, os.environ[raw])\n\n\nclass _SettingsProxy:\n \"\"\"代理类:支持运行时从 .env 重新加载配置,无需重启进程\"\"\"\n\n def __init__(self):\n object.__setattr__(self, \"_settings\", None)\n self._load()\n\n def _load(self):\n s = Settings()\n _apply_path_defaults(s)\n _resolve_env_var_refs(s)\n object.__setattr__(self, \"_settings\", s)\n\n def reload(self):\n \"\"\"从 .env 重新加载所有配置\"\"\"\n self._load()\n\n def __getattr__(self, name):\n if name.startswith(\"_\"):\n raise AttributeError(name)\n return getattr(self._settings, name)\n\n def __setattr__(self, name, value):\n if name.startswith(\"_\"):\n object.__setattr__(self, name, value)\n else:\n setattr(self._settings, name, value)\n\n\nsettings = _SettingsProxy()"}, "b8ec7fcdce75ae7f28ba1fdcab7a1846ed424785": {"t": 1785768805.0782137, "n": 4015, "h": "8eec3403d6b13681", "c": "import os\nfrom pydantic_settings import BaseSettings, SettingsConfigDict\n\n#项目根目录:settings.py所在目录\nPROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))\n\nclass Settings(BaseSettings):\n # 向量库和RAG\n collection_name: str = \"railway-8620\"\n persist_directory: str = \"\"\n chunk_size: int = 500\n chunk_overlap: int = 77\n separators: list = [\"\\n\\n\", \"\\n\", \"。\", \"?\", \"!\", \",\", \".\", \"?\", \"!\", \",\"]\n data_path: str = \"\"\n md5_path: str = \"\"\n split_starting_point: int = 1000\n\n # 检索\n kwargs: int = 5\n\n # LLM 供应商(openai / anthropic)\n llm_provider: str = \"openai\"\n llm_api_key: str = \"\"\n llm_model_name: str = \"deepseek-v4-flash\"\n llm_base_url: str = \"\"\n\n # Embedding 供应商(阿里百炼等兼容 OpenAI 格式的服务)\n embedding_provider: str = \"openai\"\n embedding_api_key: str = \"\"\n embedding_model_name: str = \"text-embedding-v4\"\n embedding_base_url: str = \"\"\n\n # 对话历史\n session_config: dict = {\"configurable\": {\"session_id\": \"001\"}}\n chat_history_storage_path: str = \"\"\n history_database_name: str = \"chat_history_check_pointer\"\n\n # 铁路图数据\n station_geojson_path: str = \"\"\n railway_geojson_path: str = \"\"\n train_data_path: str = \"\"\n maps_output_dir: str = \"\"\n\n # 铁路路线图(基于 OSM 真实轨道几何,按车次代码绘制运行路线)\n route_map_gpkg_path: str = \"\"\n route_map_line_graph_path: str = \"\"\n route_map_timetable_path: str = \"\"\n\n model_config = SettingsConfigDict(env_file=\".env\", extra=\"ignore\")\n\n\ndef _apply_path_defaults(s: Settings):\n \"\"\"补全未在.env中指定的相对路径\"\"\"\n if not s.persist_directory:\n s.persist_directory = os.path.join(PROJECT_ROOT, \"data\", \"vector_database\")\n if not s.data_path:\n s.data_path = os.path.join(PROJECT_ROOT, \"data\", \"cleaned_txts\")\n if not s.md5_path:\n s.md5_path = os.path.join(PROJECT_ROOT, \"MD5\")\n if not s.chat_history_storage_path:\n s.chat_history_storage_path = os.path.join(PROJECT_ROOT, \"chat_history\")\n if not s.station_geojson_path:\n s.station_geojson_path = os.path.join(PROJECT_ROOT, \"data\", \"city_to_node.pkl\")\n if not s.railway_geojson_path:\n s.railway_geojson_path = os.path.join(PROJECT_ROOT, \"data\", \"china_railway.pkl\")\n if not s.train_data_path:\n s.train_data_path = os.path.join(PROJECT_ROOT, \"data\", \"train_data.json\")\n if not s.maps_output_dir:\n s.maps_output_dir = os.path.join(PROJECT_ROOT, \"frontend\", \"public\", \"maps\")\n if not s.route_map_gpkg_path:\n s.route_map_gpkg_path = os.path.join(PROJECT_ROOT, \"data\", \"railway_route\", \"china_railway_filtered.gpkg\")\n if not s.route_map_line_graph_path:\n s.route_map_line_graph_path = os.path.join(PROJECT_ROOT, \"data\", \"railway_route\", \"line_graph.json\")\n if not s.route_map_timetable_path:\n s.route_map_timetable_path = os.path.join(PROJECT_ROOT, \"data\", \"railway_route\", \"timetable.json\")\n\n\ndef _resolve_env_var_refs(s: Settings):\n \"\"\"将 API Key 字段中的环境变量名引用替换为实际值\n\n `.env` 中两种写法都支持:\n llm_api_key=sk-xxx → 直接用\n llm_api_key=DEEPSEEK_API_KEY → 视为环境变量名,取 os.environ[\"DEEPSEEK_API_KEY\"]\n \"\"\"\n for field in (\"llm_api_key\", \"embedding_api_key\"):\n raw = getattr(s, field)\n if raw and raw in os.environ and os.environ[raw]:\n setattr(s, field, os.environ[raw])\n\n\nclass _SettingsProxy:\n \"\"\"代理类:支持运行时从 .env 重新加载配置,无需重启进程\"\"\"\n\n def __init__(self):\n object.__setattr__(self, \"_settings\", None)\n self._load()\n\n def _load(self):\n s = Settings()\n _apply_path_defaults(s)\n _resolve_env_var_refs(s)\n object.__setattr__(self, \"_settings\", s)\n\n def reload(self):\n \"\"\"从 .env 重新加载所有配置\"\"\"\n self._load()\n\n def __getattr__(self, name):\n if name.startswith(\"_\"):\n raise AttributeError(name)\n return getattr(self._settings, name)\n\n def __setattr__(self, name, value):\n if name.startswith(\"_\"):\n object.__setattr__(self, name, value)\n else:\n setattr(self._settings, name, value)\n\n\nsettings = _SettingsProxy()"}, "df8fb41838dad46709a254cdc69dfabd71c45484": {"t": 1785768808.4179535, "n": 2560, "h": "7076399b508e895b", "c": "import os\nfrom pydantic_settings import BaseSettings, SettingsConfigDict\nfrom pydantic import AliasChoices, Field\n\n#项目根目录:settings.py所在目录\nPROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))\n\nclass Settings(BaseSettings):\n # 向量库和RAG\n collection_name: str = \"railway-8620\"\n persist_directory: str = \"\"\n chunk_size: int = 500\n chunk_overlap: int = 77\n separators: list = [\"\\n\\n\", \"\\n\", \"。\", \"?\", \"!\", \",\", \".\", \"?\", \"!\", \",\"]\n data_path: str = \"\"\n md5_path: str = \"\"\n split_starting_point: int = 1000\n\n # 检索\n kwargs: int = 5\n\n # LLM\n chat_model_name: str = \"deepseek-v4-flash\"\n\n # LLM 供应商(openai / anthropic)\n llm_provider: str = \"openai\"\n OPENCODE_GO_API_KEY: str = Field(\"\", validation_alias=AliasChoices(\"OPENCODE_GO_API_KEY\", \"llm_api_key\"))\n llm_model_name: str = \"qwen3-max-2025-09-23\"\n llm_base_url: str = \"\"\n\n # Embedding 供应商(阿里百炼等兼容 OpenAI 格式的服务)\n embedding_provider: str = \"openai\"\n DASHSCOPE_API_KEY: str = Field(\"\", validation_alias=AliasChoices(\"DASHSCOPE_API_KEY\", \"embedding_api_key\"))\n embedding_model_name: str = \"text-embedding-v4\"\n embedding_base_url: str = \"\"\n\n # 对话历史\n session_config: dict = {\"configurable\": {\"session_id\": \"001\"}}\n chat_history_storage_path: str = \"\"\n history_database_name: str = \"chat_history_check_pointer\"\n\n # 铁路图数据\n station_geojson_path: str = \"\"\n railway_geojson_path: str = \"\"\n train_data_path: str = \"\"\n maps_output_dir: str = \"\"\n\n model_config = SettingsConfigDict(env_file=\".env\", extra=\"ignore\")\n\n# 自动补全相对路径(基于PROJECT_ROOT)\nsettings = Settings()\n\n# 只有没在.env里指定的路径,才使用默认的相对路径\nif not settings.persist_directory:\n settings.persist_directory = os.path.join(PROJECT_ROOT, \"data\", \"vector_database\")\nif not settings.data_path:\n settings.data_path = os.path.join(PROJECT_ROOT, \"data\", \"cleaned_txts\")\nif not settings.md5_path:\n settings.md5_path = os.path.join(PROJECT_ROOT, \"MD5\")\nif not settings.chat_history_storage_path:\n settings.chat_history_storage_path = os.path.join(PROJECT_ROOT, \"chat_history\")\nif not settings.station_geojson_path:\n settings.station_geojson_path = os.path.join(PROJECT_ROOT, \"data\", \"city_to_node.pkl\")\nif not settings.railway_geojson_path:\n settings.railway_geojson_path = os.path.join(PROJECT_ROOT, \"data\", \"china_railway.pkl\")\nif not settings.train_data_path:\n settings.train_data_path = os.path.join(PROJECT_ROOT, \"data\", \"train_data.json\")\nif not settings.maps_output_dir:\n settings.maps_output_dir = os.path.join(PROJECT_ROOT, \"frontend\", \"public\", \"maps\")"}, "ed09372bf100580cf42ca8c1095d4edb6bff055b": {"t": 1785768809.7050574, "n": 2562, "h": "2da967dcce0d1e0d", "c": "import os\nfrom pydantic_settings import BaseSettings, SettingsConfigDict\nfrom pydantic import AliasChoices, Field\n\n#项目根目录:settings.py所在目录\nPROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))\n\nclass Settings(BaseSettings):\n # 向量库和RAG\n collection_name: str = \"langchain-8620\"\n persist_directory: str = \"\"\n chunk_size: int = 500\n chunk_overlap: int = 77\n separators: list = [\"\\n\\n\", \"\\n\", \"。\", \"?\", \"!\", \",\", \".\", \"?\", \"!\", \",\"]\n data_path: str = \"\"\n md5_path: str = \"\"\n split_starting_point: int = 1000\n\n # 检索\n kwargs: int = 5\n\n # LLM\n chat_model_name: str = \"deepseek-v4-flash\"\n\n # LLM 供应商(openai / anthropic)\n llm_provider: str = \"openai\"\n OPENCODE_GO_API_KEY: str = Field(\"\", validation_alias=AliasChoices(\"OPENCODE_GO_API_KEY\", \"llm_api_key\"))\n llm_model_name: str = \"qwen3-max-2025-09-23\"\n llm_base_url: str = \"\"\n\n # Embedding 供应商(阿里百炼等兼容 OpenAI 格式的服务)\n embedding_provider: str = \"openai\"\n DASHSCOPE_API_KEY: str = Field(\"\", validation_alias=AliasChoices(\"DASHSCOPE_API_KEY\", \"embedding_api_key\"))\n embedding_model_name: str = \"text-embedding-v4\"\n embedding_base_url: str = \"\"\n\n # 对话历史\n session_config: dict = {\"configurable\": {\"session_id\": \"001\"}}\n chat_history_storage_path: str = \"\"\n history_database_name: str = \"chat_history_check_pointer\"\n\n # 铁路图数据\n station_geojson_path: str = \"\"\n railway_geojson_path: str = \"\"\n train_data_path: str = \"\"\n maps_output_dir: str = \"\"\n\n model_config = SettingsConfigDict(env_file=\".env\", extra=\"ignore\")\n\n# 自动补全相对路径(基于PROJECT_ROOT)\nsettings = Settings()\n\n# 只有没在.env里指定的路径,才使用默认的相对路径\nif not settings.persist_directory:\n settings.persist_directory = os.path.join(PROJECT_ROOT, \"data\", \"vector_database\")\nif not settings.data_path:\n settings.data_path = os.path.join(PROJECT_ROOT, \"data\", \"cleaned_txts\")\nif not settings.md5_path:\n settings.md5_path = os.path.join(PROJECT_ROOT, \"MD5\")\nif not settings.chat_history_storage_path:\n settings.chat_history_storage_path = os.path.join(PROJECT_ROOT, \"chat_history\")\nif not settings.station_geojson_path:\n settings.station_geojson_path = os.path.join(PROJECT_ROOT, \"data\", \"city_to_node.pkl\")\nif not settings.railway_geojson_path:\n settings.railway_geojson_path = os.path.join(PROJECT_ROOT, \"data\", \"china_railway.pkl\")\nif not settings.train_data_path:\n settings.train_data_path = os.path.join(PROJECT_ROOT, \"data\", \"train_data.json\")\nif not settings.maps_output_dir:\n settings.maps_output_dir = os.path.join(PROJECT_ROOT, \"frontend\", \"public\", \"maps\")"}, "bd425a7e10ed9e71277bbdef94c30baa764f6ad4": {"t": 1785768810.8777552, "n": 2414, "h": "dda99a245bbe339a", "c": "import os\nfrom pydantic_settings import BaseSettings\nfrom pydantic import Field\n\n#项目根目录:settings.py所在目录\nPROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))\n\nclass Settings(BaseSettings):\n # 向量库和RAG\n collection_name: str = \"langchain-8620\"\n persist_directory: str = \"\"\n chunk_size: int = 500\n chunk_overlap: int = 77\n separators: list = [\"\\n\\n\", \"\\n\", \"。\", \"?\", \"!\", \",\", \".\", \"?\", \"!\", \",\"]\n data_path: str = \"\"\n md5_path: str = \"\"\n split_starting_point: int = 1000\n\n # 检索\n kwargs: int = 5\n\n # LLM\n chat_model_name: str = \"deepseek-v4-flash\"\n\n # LLM 供应商(openai / anthropic)\n llm_provider: str = \"openai\"\n OPENCODE_GO_API_KEY: str = Field(\"\", env=[\"OPENCODE_GO_API_KEY\", \"llm_api_key\"])\n llm_model_name: str = \"qwen3-max-2025-09-23\"\n llm_base_url: str = \"\"\n\n # Embedding 供应商(阿里百炼等兼容 OpenAI 格式的服务)\n embedding_provider: str = \"openai\"\n DASHSCOPE_API_KEY: str = Field(\"\", env=[\"DASHSCOPE_API_KEY\", \"embedding_api_key\"])\n embedding_model_name: str = \"text-embedding-v4\"\n embedding_base_url: str = \"\"\n\n # 对话历史\n session_config: dict = {\"configurable\": {\"session_id\": \"001\"}}\n chat_history_storage_path: str = \"\"\n\n # 铁路图数据\n station_geojson_path: str = \"\"\n railway_geojson_path: str = \"\"\n train_data_path: str = \"\"\n maps_output_dir: str = \"\"\n\n class Config:\n env_file = \".env\"\n extra = \"ignore\"\n\n# 自动补全相对路径(基于PROJECT_ROOT)\nsettings = Settings()\n\n# 只有没在.env里指定的路径,才使用默认的相对路径\nif not settings.persist_directory:\n settings.persist_directory = os.path.join(PROJECT_ROOT, \"data\", \"vector_database\")\nif not settings.data_path:\n settings.data_path = os.path.join(PROJECT_ROOT, \"data\", \"cleaned_txts\")\nif not settings.md5_path:\n settings.md5_path = os.path.join(PROJECT_ROOT, \"MD5\")\nif not settings.chat_history_storage_path:\n settings.chat_history_storage_path = os.path.join(PROJECT_ROOT, \"chat_history\")\nif not settings.station_geojson_path:\n settings.station_geojson_path = os.path.join(PROJECT_ROOT, \"data\", \"city_to_node.pkl\")\nif not settings.railway_geojson_path:\n settings.railway_geojson_path = os.path.join(PROJECT_ROOT, \"data\", \"china_railway.pkl\")\nif not settings.train_data_path:\n settings.train_data_path = os.path.join(PROJECT_ROOT, \"data\", \"train_data.json\")\nif not settings.maps_output_dir:\n settings.maps_output_dir = os.path.join(PROJECT_ROOT, \"frontend\", \"public\", \"maps\")"}}, "tests/test_settings.py": {"ac0eae99845e1fe04c2abf4a70554a25e1a118c4": {"t": 1785746926.1735737, "n": 4657, "h": "72161d917fcb4165", "c": "\"\"\"\n测试 settings.py —— 默认值、环境变量读取、路径补全\n\n注意:Chroma 相关配置(collection_name, chunk_size 等)已移除,\n 现在配置专注于 RAGFlow。\n\"\"\"\nimport os \nfrom unittest import mock\n\nclass TestSettingsDefaults:\n \"\"\"验证 Settings 类每个字段的默认值\"\"\"\n\n def test_default_ragflow_host(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.ragflow_host == \"http://localhost:9380\"\n\n def test_default_kwargs(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.kwargs == 5\n\n def test_default_similarity_threshold(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.ragflow_similarity_threshold == 0.0\n\n def test_default_llm_provider(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_provider == \"openai\"\n\n def test_default_ragflow_api_key_empty(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.ragflow_api_key == \"\"\n\n def test_default_ragflow_dataset_id_empty(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.ragflow_dataset_id == \"\"\n\n\nclass TestSettingsFromEnv:\n \"\"\"验证settings能从环境变量中读取值\"\"\"\n\n def test_model_name_from_env(self):\n with mock.patch.dict(os.environ, {\"llm_model_name\":\"deepseek-v4-air\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_model_name == \"deepseek-v4-air\"\n\n def test_api_key_from_env(self):\n with mock.patch.dict(os.environ, {\"llm_api_key\":\"sk-test-114514\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_api_key == \"sk-test-114514\"\n\n def test_embedding_api_key_from_env(self):\n with mock.patch.dict(os.environ, {\"embedding_api_key\":\"sk-test-1919810\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.embedding_api_key == \"sk-test-1919810\"\n\n def test_ragflow_api_key_from_env(self):\n with mock.patch.dict(os.environ, {\"ragflow_api_key\":\"sk-ragflow-001\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.ragflow_api_key == \"sk-ragflow-001\"\n\n def test_ragflow_host_from_env(self):\n with mock.patch.dict(os.environ, {\"ragflow_host\": \"http://192.168.1.100:9380\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.ragflow_host == \"http://192.168.1.100:9380\"\n\n def test_ragflow_dataset_id_from_env(self):\n with mock.patch.dict(os.environ, {\"ragflow_dataset_id\": \"ds-001\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.ragflow_dataset_id == \"ds-001\"\n\n def test_base_url_from_env(self):\n with mock.patch.dict(os.environ, {\"llm_base_url\": \"https://my-proxy.com/v1\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_base_url == \"https://my-proxy.com/v1\"\n\n def test_embedding_model_from_env(self):\n with mock.patch.dict(os.environ, {\"embedding_model_name\": \"text-embedding-v3\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.embedding_model_name == \"text-embedding-v3\"\n\n\nclass TestSettingsPathResolution:\n \"\"\"验证settings.py的底部自动补全逻辑\"\"\"\n\n def test_data_path_not_empty(self):\n from settings import settings as s\n assert s.data_path != \"\"\n\n def test_chat_history_storage_path_not_empty(self):\n from settings import settings as s\n assert s.chat_history_storage_path != \"\"\n\n\nclass TestSettingsMeta:\n \"\"\"Settings 类的元行为\"\"\"\n\n def test_session_config_is_dict(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert isinstance(s.session_config, dict)\n assert \"configurable\" in s.session_config\n\n def test_extra_fields_ignored(self):\n \"\"\"extra='ignore'->不存在的字段不会出现\"\"\"\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert not hasattr(s, \"this_never_existed\")"}, "28c5794216f2a0738cc27b44254bcb8c795599a6": {"t": 1785768801.4251368, "n": 4657, "h": "72161d917fcb4165", "c": "\"\"\"\n测试 settings.py —— 默认值、环境变量读取、路径补全\n\n注意:Chroma 相关配置(collection_name, chunk_size 等)已移除,\n 现在配置专注于 RAGFlow。\n\"\"\"\nimport os \nfrom unittest import mock\n\nclass TestSettingsDefaults:\n \"\"\"验证 Settings 类每个字段的默认值\"\"\"\n\n def test_default_ragflow_host(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.ragflow_host == \"http://localhost:9380\"\n\n def test_default_kwargs(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.kwargs == 5\n\n def test_default_similarity_threshold(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.ragflow_similarity_threshold == 0.0\n\n def test_default_llm_provider(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_provider == \"openai\"\n\n def test_default_ragflow_api_key_empty(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.ragflow_api_key == \"\"\n\n def test_default_ragflow_dataset_id_empty(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.ragflow_dataset_id == \"\"\n\n\nclass TestSettingsFromEnv:\n \"\"\"验证settings能从环境变量中读取值\"\"\"\n\n def test_model_name_from_env(self):\n with mock.patch.dict(os.environ, {\"llm_model_name\":\"deepseek-v4-air\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_model_name == \"deepseek-v4-air\"\n\n def test_api_key_from_env(self):\n with mock.patch.dict(os.environ, {\"llm_api_key\":\"sk-test-114514\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_api_key == \"sk-test-114514\"\n\n def test_embedding_api_key_from_env(self):\n with mock.patch.dict(os.environ, {\"embedding_api_key\":\"sk-test-1919810\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.embedding_api_key == \"sk-test-1919810\"\n\n def test_ragflow_api_key_from_env(self):\n with mock.patch.dict(os.environ, {\"ragflow_api_key\":\"sk-ragflow-001\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.ragflow_api_key == \"sk-ragflow-001\"\n\n def test_ragflow_host_from_env(self):\n with mock.patch.dict(os.environ, {\"ragflow_host\": \"http://192.168.1.100:9380\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.ragflow_host == \"http://192.168.1.100:9380\"\n\n def test_ragflow_dataset_id_from_env(self):\n with mock.patch.dict(os.environ, {\"ragflow_dataset_id\": \"ds-001\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.ragflow_dataset_id == \"ds-001\"\n\n def test_base_url_from_env(self):\n with mock.patch.dict(os.environ, {\"llm_base_url\": \"https://my-proxy.com/v1\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_base_url == \"https://my-proxy.com/v1\"\n\n def test_embedding_model_from_env(self):\n with mock.patch.dict(os.environ, {\"embedding_model_name\": \"text-embedding-v3\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.embedding_model_name == \"text-embedding-v3\"\n\n\nclass TestSettingsPathResolution:\n \"\"\"验证settings.py的底部自动补全逻辑\"\"\"\n\n def test_data_path_not_empty(self):\n from settings import settings as s\n assert s.data_path != \"\"\n\n def test_chat_history_storage_path_not_empty(self):\n from settings import settings as s\n assert s.chat_history_storage_path != \"\"\n\n\nclass TestSettingsMeta:\n \"\"\"Settings 类的元行为\"\"\"\n\n def test_session_config_is_dict(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert isinstance(s.session_config, dict)\n assert \"configurable\" in s.session_config\n\n def test_extra_fields_ignored(self):\n \"\"\"extra='ignore'->不存在的字段不会出现\"\"\"\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert not hasattr(s, \"this_never_existed\")"}, "b8ec7fcdce75ae7f28ba1fdcab7a1846ed424785": {"t": 1785768802.7137668, "n": 4410, "h": "14bfc4aa9c877bd5", "c": "\"\"\"\n测试 settings.py —— 默认值、环境变量读取、路径补全\n\"\"\"\nimport os \nfrom unittest import mock\nclass TestSettingsDefaults:\n \"\"\"验证 Settings 类每个字段的默认值\"\"\"\n def test_default_chunk_size(self):\n # clear=True 清空所有环境变量,Settings 只能用代码里的默认值\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.chunk_size == 500\n\n def test_default_chunk_overlap(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.chunk_overlap == 77\n\n def test_default_kwargs(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.kwargs == 5\n\n def test_default_collection_name(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.collection_name == \"railway-8620\"\n\n def test_default_llm_provider(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_provider == \"openai\"\n\n def test_default_separators_include_chinese(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert \"。\" in s.separators \n assert \"?\" in s.separators \n assert \"!\" in s.separators \n\n def test_default_split_starting_point(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.split_starting_point == 1000\n\nclass TestSettingsFromEnv:\n \"\"\"验证settings能从环境变量中读取值\"\"\"\n def test_model_name_from_env(self):\n with mock.patch.dict(os.environ, {\"llm_model_name\":\"deepseek-v4-air\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_model_name == \"deepseek-v4-air\"\n\n def test_api_key_from_env(self):\n with mock.patch.dict(os.environ, {\"llm_api_key\":\"sk-test-114514\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_api_key == \"sk-test-114514\"\n\n def test_embedding_api_key_from_env(self):\n with mock.patch.dict(os.environ, {\"embedding_api_key\":\"sk-test-1919810\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.embedding_api_key == \"sk-test-1919810\"\n\n def test_base_url_from_env(self):\n with mock.patch.dict(os.environ, {\"llm_base_url\": \"https://my-proxy.com/v1\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_base_url == \"https://my-proxy.com/v1\"\n\n def test_embedding_model_from_env(self):\n with mock.patch.dict(os.environ, {\"embedding_model_name\": \"text-embedding-v3\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.embedding_model_name == \"text-embedding-v3\"\n\nclass TestSettingsPathResolution:\n \"\"\"验证settings.py的底部自动补全逻辑\"\"\"\n def test_persist_directory_not_empty(self):\n # 用模块级单例 settings, 他已经执行过补全\n from settings import settings as s\n assert s.persist_directory != \"\"\n\n def test_data_path_not_empty(self):\n # 用模块级单例 settings, 他已经执行过补全\n from settings import settings as s\n assert s.data_path != \"\"\n\n def test_md5_path_not_empty(self):\n from settings import settings as s\n assert s.md5_path != \"\"\n\n def test_chat_history_storage_path_not_empty(self):\n from settings import settings as s\n assert s.chat_history_storage_path != \"\"\n\nclass TestSettingsMeta:\n \"\"\"Settings 类的元行为\"\"\"\n def test_session_config_is_dict(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert isinstance(s.session_config, dict)\n assert \"configurable\" in s.session_config\n\n def test_extra_fields_ignored(self):\n \"\"\"extra='ignore'->不存在的字段不会出现\"\"\"\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert not hasattr(s, \"this_never_existed\")"}, "df8fb41838dad46709a254cdc69dfabd71c45484": {"t": 1785768803.9719038, "n": 4426, "h": "89f9777b96854f72", "c": "\"\"\"\n测试 settings.py —— 默认值、环境变量读取、路径补全\n\"\"\"\nimport os \nfrom unittest import mock\nclass TestSettingsDefaults:\n \"\"\"验证 Settings 类每个字段的默认值\"\"\"\n def test_default_chunk_size(self):\n # clear=True 清空所有环境变量,Settings 只能用代码里的默认值\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.chunk_size == 500\n\n def test_default_chunk_overlap(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.chunk_overlap == 77\n\n def test_default_kwargs(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.kwargs == 5\n\n def test_default_collection_name(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.collection_name == \"railway-8620\"\n\n def test_default_llm_provider(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_provider == \"openai\"\n\n def test_default_separators_include_chinese(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert \"。\" in s.separators \n assert \"?\" in s.separators \n assert \"!\" in s.separators \n\n def test_default_split_starting_point(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.split_starting_point == 1000\n\nclass TestSettingsFromEnv:\n \"\"\"验证settings能从环境变量中读取值\"\"\"\n def test_model_name_from_env(self):\n with mock.patch.dict(os.environ, {\"llm_model_name\":\"deepseek-v4-air\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_model_name == \"deepseek-v4-air\"\n\n def test_api_key_from_nev(self):\n with mock.patch.dict(os.environ, {\"OPENCODE_GO_API_KEY\":\"sk-test-114514\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.OPENCODE_GO_API_KEY == \"sk-test-114514\"\n\n def test_dashscope_api_key_from_env(self):\n with mock.patch.dict(os.environ, {\"DASHSCOPE_API_KEY\":\"sk-test-1919810\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.DASHSCOPE_API_KEY == \"sk-test-1919810\"\n\n def test_base_url_from_env(self):\n with mock.patch.dict(os.environ, {\"llm_base_url\": \"https://my-proxy.com/v1\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_base_url == \"https://my-proxy.com/v1\"\n\n def test_embedding_model_from_env(self):\n with mock.patch.dict(os.environ, {\"embedding_model_name\": \"text-embedding-v3\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.embedding_model_name == \"text-embedding-v3\"\n\nclass TestSettingsPathResolution:\n \"\"\"验证settings.py的底部自动补全逻辑\"\"\"\n def test_persist_directory_not_empty(self):\n # 用模块级单例 settings, 他已经执行过补全\n from settings import settings as s\n assert s.persist_directory != \"\"\n\n def test_data_path_not_empty(self):\n # 用模块级单例 settings, 他已经执行过补全\n from settings import settings as s\n assert s.data_path != \"\"\n\n def test_md5_path_not_empty(self):\n from settings import settings as s\n assert s.md5_path != \"\"\n\n def test_chat_history_storage_path_not_empty(self):\n from settings import settings as s\n assert s.chat_history_storage_path != \"\"\n\nclass TestSettingsMeta:\n \"\"\"Settings 类的元行为\"\"\"\n def test_session_config_is_dict(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert isinstance(s.session_config, dict)\n assert \"configurable\" in s.session_config\n\n def test_extra_fields_ignored(self):\n \"\"\"extra='ignore'->不存在的字段不会出现\"\"\"\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert not hasattr(s, \"this_never_existed\")"}, "ed09372bf100580cf42ca8c1095d4edb6bff055b": {"t": 1785768806.4143877, "n": 4428, "h": "eb293b7766a2c1a7", "c": "\"\"\"\n测试 settings.py —— 默认值、环境变量读取、路径补全\n\"\"\"\nimport os \nfrom unittest import mock\nclass TestSettingsDefaults:\n \"\"\"验证 Settings 类每个字段的默认值\"\"\"\n def test_default_chunk_size(self):\n # clear=True 清空所有环境变量,Settings 只能用代码里的默认值\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.chunk_size == 500\n\n def test_default_chunk_overlap(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.chunk_overlap == 77\n\n def test_default_kwargs(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.kwargs == 5\n\n def test_default_collection_name(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.collection_name == \"langchain-8620\"\n\n def test_default_llm_provider(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_provider == \"openai\"\n\n def test_default_separators_include_chinese(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert \"。\" in s.separators \n assert \"?\" in s.separators \n assert \"!\" in s.separators \n\n def test_default_split_starting_point(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.split_starting_point == 1000\n\nclass TestSettingsFromEnv:\n \"\"\"验证settings能从环境变量中读取值\"\"\"\n def test_model_name_from_env(self):\n with mock.patch.dict(os.environ, {\"llm_model_name\":\"deepseek-v4-air\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_model_name == \"deepseek-v4-air\"\n\n def test_api_key_from_nev(self):\n with mock.patch.dict(os.environ, {\"OPENCODE_GO_API_KEY\":\"sk-test-114514\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.OPENCODE_GO_API_KEY == \"sk-test-114514\"\n\n def test_dashscope_api_key_from_env(self):\n with mock.patch.dict(os.environ, {\"DASHSCOPE_API_KEY\":\"sk-test-1919810\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.DASHSCOPE_API_KEY == \"sk-test-1919810\"\n\n def test_base_url_from_env(self):\n with mock.patch.dict(os.environ, {\"llm_base_url\": \"https://my-proxy.com/v1\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_base_url == \"https://my-proxy.com/v1\"\n\n def test_embedding_model_from_env(self):\n with mock.patch.dict(os.environ, {\"embedding_model_name\": \"text-embedding-v3\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.embedding_model_name == \"text-embedding-v3\"\n\nclass TestSettingsPathResolution:\n \"\"\"验证settings.py的底部自动补全逻辑\"\"\"\n def test_persist_directory_not_empty(self):\n # 用模块级单例 settings, 他已经执行过补全\n from settings import settings as s\n assert s.persist_directory != \"\"\n\n def test_data_path_not_empty(self):\n # 用模块级单例 settings, 他已经执行过补全\n from settings import settings as s\n assert s.data_path != \"\"\n\n def test_md5_path_not_empty(self):\n from settings import settings as s\n assert s.md5_path != \"\"\n\n def test_chat_history_storage_path_not_empty(self):\n from settings import settings as s\n assert s.chat_history_storage_path != \"\"\n\nclass TestSettingsMeta:\n \"\"\"Settings 类的元行为\"\"\"\n def test_session_config_is_dict(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert isinstance(s.session_config, dict)\n assert \"configurable\" in s.session_config\n\n def test_extra_fields_ignored(self):\n \"\"\"extra='ignore'->不存在的字段不会出现\"\"\"\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert not hasattr(s, \"this_never_existed\")"}, "10c543b67063c8a8afd4c1ebe45f2c6c19475d9b": {"t": 1785768807.5797253, "n": 4426, "h": "f16a7af555758a34", "c": "\"\"\"\n测试 settings.py —— 默认值、环境变量读取、路径补全\n\"\"\"\nimport os \nfrom unittest import mock\nclass TestSettingsDefaults:\n \"\"\"验证 Settings 类每个字段的默认值\"\"\"\n def test_default_chunk_size(self):\n # clear=True 清空所有环境变量,Settings 只能用代码里的默认值\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.chunk_size == 500\n\n def test_default_chunk_overlap(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.chunk_overlap == 77\n\n def test_default_kwargs(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.kwargs == 5\n\n def test_default_collection_name(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.collection_name == \"langchain-8620\"\n\n def test_default_llm_provider(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_provider == \"openai\"\n\n def test_default_separators_include_chinese(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert \"。\" in s.separators \n assert \"?\" in s.separators \n assert \"!\" in s.separators \n\n def test_default_split_starting_point(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.split_starting_point == 1000\n\nclass TestSettingsFromEnv:\n \"\"\"验证settings能从环境变量中读取值\"\"\"\n def test_model_name_from_env(self):\n with mock.patch.dict(os.environ, {\"llm_model_name\":\"deepseek-v4-air\"}, clear=True):\n from settings import Settings\n s = Settings\n assert s.llm_model_name == \"deepseek-v4-air\"\n\n def test_api_key_from_nev(self):\n with mock.patch.dict(os.environ, {\"OPENCODE_GO_API_KEY\":\"sk-test-114514\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.OPENCODE_GO_API_KEY == \"sk-test-114514\"\n\n def test_dashscope_api_key_from_env(self):\n with mock.patch.dict(os.environ, {\"DASHSCOPE_API_KEY\":\"sk-test-1919810\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.DASHSCOPE_API_KEY == \"sk-test-1919810\"\n\n def test_base_url_from_env(self):\n with mock.patch.dict(os.environ, {\"llm_base_url\": \"https://my-proxy.com/v1\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.llm_base_url == \"https://my-proxy.com/v1\"\n\n def test_embedding_model_from_env(self):\n with mock.patch.dict(os.environ, {\"embedding_model_name\": \"text-embedding-v3\"}, clear=True):\n from settings import Settings\n s = Settings()\n assert s.embedding_model_name == \"text-embedding-v3\"\n\nclass TestSettingsPathResolution:\n \"\"\"验证settings.py的底部自动补全逻辑\"\"\"\n def test_persist_directory_not_empty(self):\n # 用模块级单例 settings, 他已经执行过补全\n from settings import settings as s\n assert s.persist_directory != \"\"\n\n def test_data_path_not_empty(self):\n # 用模块级单例 settings, 他已经执行过补全\n from settings import settings as s\n assert s.data_path != \"\"\n\n def test_md5_path_not_empty(self):\n from settings import settings as s\n assert s.md5_path != \"\"\n\n def test_chat_history_storage_path_not_empty(self):\n from settings import settings as s\n assert s.chat_history_storage_path != \"\"\n\nclass TestSettingsMeta:\n \"\"\"Settings 类的元行为\"\"\"\n def test_session_config_is_dict(self):\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert isinstance(s.session_config, dict)\n assert \"configurable\" in s.session_config\n\n def test_extra_fields_ignored(self):\n \"\"\"extra='ignore'->不存在的字段不会出现\"\"\"\n with mock.patch.dict(os.environ, {}, clear=True):\n from settings import Settings\n s = Settings()\n assert not hasattr(s, \"this_never_existed\")"}}}} |