Files

1 line
52 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"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\")"}}}}