local-deep-research 0.1.26__py3-none-any.whl → 0.2.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. local_deep_research/__init__.py +23 -22
  2. local_deep_research/__main__.py +16 -0
  3. local_deep_research/advanced_search_system/__init__.py +7 -0
  4. local_deep_research/advanced_search_system/filters/__init__.py +8 -0
  5. local_deep_research/advanced_search_system/filters/base_filter.py +38 -0
  6. local_deep_research/advanced_search_system/filters/cross_engine_filter.py +200 -0
  7. local_deep_research/advanced_search_system/findings/base_findings.py +81 -0
  8. local_deep_research/advanced_search_system/findings/repository.py +452 -0
  9. local_deep_research/advanced_search_system/knowledge/__init__.py +1 -0
  10. local_deep_research/advanced_search_system/knowledge/base_knowledge.py +151 -0
  11. local_deep_research/advanced_search_system/knowledge/standard_knowledge.py +159 -0
  12. local_deep_research/advanced_search_system/questions/__init__.py +1 -0
  13. local_deep_research/advanced_search_system/questions/base_question.py +64 -0
  14. local_deep_research/advanced_search_system/questions/decomposition_question.py +445 -0
  15. local_deep_research/advanced_search_system/questions/standard_question.py +119 -0
  16. local_deep_research/advanced_search_system/repositories/__init__.py +7 -0
  17. local_deep_research/advanced_search_system/strategies/__init__.py +1 -0
  18. local_deep_research/advanced_search_system/strategies/base_strategy.py +118 -0
  19. local_deep_research/advanced_search_system/strategies/iterdrag_strategy.py +450 -0
  20. local_deep_research/advanced_search_system/strategies/parallel_search_strategy.py +312 -0
  21. local_deep_research/advanced_search_system/strategies/rapid_search_strategy.py +270 -0
  22. local_deep_research/advanced_search_system/strategies/standard_strategy.py +300 -0
  23. local_deep_research/advanced_search_system/tools/__init__.py +1 -0
  24. local_deep_research/advanced_search_system/tools/base_tool.py +100 -0
  25. local_deep_research/advanced_search_system/tools/knowledge_tools/__init__.py +1 -0
  26. local_deep_research/advanced_search_system/tools/question_tools/__init__.py +1 -0
  27. local_deep_research/advanced_search_system/tools/search_tools/__init__.py +1 -0
  28. local_deep_research/api/__init__.py +5 -5
  29. local_deep_research/api/research_functions.py +154 -160
  30. local_deep_research/app.py +8 -0
  31. local_deep_research/citation_handler.py +25 -16
  32. local_deep_research/{config.py → config/config_files.py} +102 -110
  33. local_deep_research/config/llm_config.py +472 -0
  34. local_deep_research/config/search_config.py +77 -0
  35. local_deep_research/defaults/__init__.py +10 -5
  36. local_deep_research/defaults/main.toml +2 -2
  37. local_deep_research/defaults/search_engines.toml +60 -34
  38. local_deep_research/main.py +121 -19
  39. local_deep_research/migrate_db.py +147 -0
  40. local_deep_research/report_generator.py +87 -45
  41. local_deep_research/search_system.py +153 -283
  42. local_deep_research/setup_data_dir.py +35 -0
  43. local_deep_research/test_migration.py +178 -0
  44. local_deep_research/utilities/__init__.py +0 -0
  45. local_deep_research/utilities/db_utils.py +49 -0
  46. local_deep_research/{utilties → utilities}/enums.py +2 -2
  47. local_deep_research/{utilties → utilities}/llm_utils.py +63 -29
  48. local_deep_research/utilities/search_utilities.py +242 -0
  49. local_deep_research/{utilties → utilities}/setup_utils.py +4 -2
  50. local_deep_research/web/__init__.py +0 -1
  51. local_deep_research/web/app.py +86 -1709
  52. local_deep_research/web/app_factory.py +289 -0
  53. local_deep_research/web/database/README.md +70 -0
  54. local_deep_research/web/database/migrate_to_ldr_db.py +289 -0
  55. local_deep_research/web/database/migrations.py +447 -0
  56. local_deep_research/web/database/models.py +117 -0
  57. local_deep_research/web/database/schema_upgrade.py +107 -0
  58. local_deep_research/web/models/database.py +294 -0
  59. local_deep_research/web/models/settings.py +94 -0
  60. local_deep_research/web/routes/api_routes.py +559 -0
  61. local_deep_research/web/routes/history_routes.py +354 -0
  62. local_deep_research/web/routes/research_routes.py +715 -0
  63. local_deep_research/web/routes/settings_routes.py +1583 -0
  64. local_deep_research/web/services/research_service.py +947 -0
  65. local_deep_research/web/services/resource_service.py +149 -0
  66. local_deep_research/web/services/settings_manager.py +669 -0
  67. local_deep_research/web/services/settings_service.py +187 -0
  68. local_deep_research/web/services/socket_service.py +210 -0
  69. local_deep_research/web/static/css/custom_dropdown.css +277 -0
  70. local_deep_research/web/static/css/settings.css +1223 -0
  71. local_deep_research/web/static/css/styles.css +525 -48
  72. local_deep_research/web/static/js/components/custom_dropdown.js +428 -0
  73. local_deep_research/web/static/js/components/detail.js +348 -0
  74. local_deep_research/web/static/js/components/fallback/formatting.js +122 -0
  75. local_deep_research/web/static/js/components/fallback/ui.js +215 -0
  76. local_deep_research/web/static/js/components/history.js +487 -0
  77. local_deep_research/web/static/js/components/logpanel.js +949 -0
  78. local_deep_research/web/static/js/components/progress.js +1107 -0
  79. local_deep_research/web/static/js/components/research.js +1865 -0
  80. local_deep_research/web/static/js/components/results.js +766 -0
  81. local_deep_research/web/static/js/components/settings.js +3981 -0
  82. local_deep_research/web/static/js/components/settings_sync.js +106 -0
  83. local_deep_research/web/static/js/main.js +226 -0
  84. local_deep_research/web/static/js/services/api.js +253 -0
  85. local_deep_research/web/static/js/services/audio.js +31 -0
  86. local_deep_research/web/static/js/services/formatting.js +119 -0
  87. local_deep_research/web/static/js/services/pdf.js +622 -0
  88. local_deep_research/web/static/js/services/socket.js +882 -0
  89. local_deep_research/web/static/js/services/ui.js +546 -0
  90. local_deep_research/web/templates/base.html +72 -0
  91. local_deep_research/web/templates/components/custom_dropdown.html +47 -0
  92. local_deep_research/web/templates/components/log_panel.html +32 -0
  93. local_deep_research/web/templates/components/mobile_nav.html +22 -0
  94. local_deep_research/web/templates/components/settings_form.html +299 -0
  95. local_deep_research/web/templates/components/sidebar.html +21 -0
  96. local_deep_research/web/templates/pages/details.html +73 -0
  97. local_deep_research/web/templates/pages/history.html +51 -0
  98. local_deep_research/web/templates/pages/progress.html +57 -0
  99. local_deep_research/web/templates/pages/research.html +139 -0
  100. local_deep_research/web/templates/pages/results.html +59 -0
  101. local_deep_research/web/templates/settings_dashboard.html +78 -192
  102. local_deep_research/web/utils/__init__.py +0 -0
  103. local_deep_research/web/utils/formatters.py +76 -0
  104. local_deep_research/web_search_engines/engines/full_search.py +18 -16
  105. local_deep_research/web_search_engines/engines/meta_search_engine.py +182 -131
  106. local_deep_research/web_search_engines/engines/search_engine_arxiv.py +224 -139
  107. local_deep_research/web_search_engines/engines/search_engine_brave.py +88 -71
  108. local_deep_research/web_search_engines/engines/search_engine_ddg.py +48 -39
  109. local_deep_research/web_search_engines/engines/search_engine_github.py +415 -204
  110. local_deep_research/web_search_engines/engines/search_engine_google_pse.py +123 -90
  111. local_deep_research/web_search_engines/engines/search_engine_guardian.py +210 -157
  112. local_deep_research/web_search_engines/engines/search_engine_local.py +532 -369
  113. local_deep_research/web_search_engines/engines/search_engine_local_all.py +42 -36
  114. local_deep_research/web_search_engines/engines/search_engine_pubmed.py +358 -266
  115. local_deep_research/web_search_engines/engines/search_engine_searxng.py +212 -160
  116. local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py +213 -170
  117. local_deep_research/web_search_engines/engines/search_engine_serpapi.py +84 -68
  118. local_deep_research/web_search_engines/engines/search_engine_wayback.py +186 -154
  119. local_deep_research/web_search_engines/engines/search_engine_wikipedia.py +115 -77
  120. local_deep_research/web_search_engines/search_engine_base.py +174 -99
  121. local_deep_research/web_search_engines/search_engine_factory.py +192 -102
  122. local_deep_research/web_search_engines/search_engines_config.py +22 -15
  123. {local_deep_research-0.1.26.dist-info → local_deep_research-0.2.2.dist-info}/METADATA +177 -97
  124. local_deep_research-0.2.2.dist-info/RECORD +135 -0
  125. {local_deep_research-0.1.26.dist-info → local_deep_research-0.2.2.dist-info}/WHEEL +1 -2
  126. {local_deep_research-0.1.26.dist-info → local_deep_research-0.2.2.dist-info}/entry_points.txt +3 -0
  127. local_deep_research/defaults/llm_config.py +0 -338
  128. local_deep_research/utilties/search_utilities.py +0 -114
  129. local_deep_research/web/static/js/app.js +0 -3763
  130. local_deep_research/web/templates/api_keys_config.html +0 -82
  131. local_deep_research/web/templates/collections_config.html +0 -90
  132. local_deep_research/web/templates/index.html +0 -348
  133. local_deep_research/web/templates/llm_config.html +0 -120
  134. local_deep_research/web/templates/main_config.html +0 -89
  135. local_deep_research/web/templates/search_engines_config.html +0 -154
  136. local_deep_research/web/templates/settings.html +0 -519
  137. local_deep_research-0.1.26.dist-info/RECORD +0 -61
  138. local_deep_research-0.1.26.dist-info/top_level.txt +0 -1
  139. /local_deep_research/{utilties → config}/__init__.py +0 -0
  140. {local_deep_research-0.1.26.dist-info → local_deep_research-0.2.2.dist-info}/licenses/LICENSE +0 -0
@@ -1,39 +1,48 @@
1
- # local_deep_research/config.py
2
- from dynaconf import Dynaconf
3
- from pathlib import Path
4
1
  import logging
5
- from platformdirs import user_documents_dir
6
2
  import os
3
+ import platform
4
+ from pathlib import Path
5
+
6
+ from dotenv import load_dotenv
7
+ from dynaconf import Dynaconf
8
+ from platformdirs import user_documents_dir
9
+
7
10
  # Setup logging
8
11
  logger = logging.getLogger(__name__)
9
- from dotenv import load_dotenv
10
- import platform
11
12
 
12
- # Get config directory
13
+
13
14
  def get_config_dir():
14
15
 
15
-
16
16
  if platform.system() == "Windows":
17
17
  # Windows: Use Documents directory
18
18
  from platformdirs import user_documents_dir
19
- config_dir = Path(user_documents_dir()) / "LearningCircuit" / "local-deep-research"
19
+
20
+ config_dir = (
21
+ Path(user_documents_dir()) / "LearningCircuit" / "local-deep-research"
22
+ )
20
23
  else:
21
24
  # Linux/Mac: Use standard config directory
22
25
  from platformdirs import user_config_dir
26
+
23
27
  config_dir = Path(user_config_dir("local_deep_research", "LearningCircuit"))
24
-
28
+
25
29
  logger.info(f"Looking for config in: {config_dir}")
26
30
  return config_dir
31
+
32
+
27
33
  # Define config paths
28
34
  CONFIG_DIR = get_config_dir() / "config"
29
35
  CONFIG_DIR.mkdir(parents=True, exist_ok=True)
30
36
  SETTINGS_FILE = CONFIG_DIR / "settings.toml"
31
37
  SECRETS_FILE = CONFIG_DIR / ".secrets.toml"
32
- LLM_CONFIG_FILE = CONFIG_DIR / "llm_config.py"
33
38
  SEARCH_ENGINES_FILE = CONFIG_DIR / "search_engines.toml"
34
39
 
35
40
  LOCAL_COLLECTIONS_FILE = CONFIG_DIR / "local_collections.toml"
36
41
 
42
+ # Define data directory for database
43
+ DATA_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "data"))
44
+ os.makedirs(DATA_DIR, exist_ok=True)
45
+ DB_PATH = os.path.join(DATA_DIR, "ldr.db")
37
46
 
38
47
  env_file = CONFIG_DIR / ".env"
39
48
 
@@ -41,7 +50,9 @@ if env_file.exists():
41
50
  logger.info(f"Loading environment variables from: {env_file}")
42
51
  load_dotenv(dotenv_path=env_file)
43
52
  else:
44
- logger.warning(f"Warning: .env file not found at {env_file}. Trying secondary location.")
53
+ logger.warning(
54
+ f"Warning: .env file not found at {env_file}. Trying secondary location."
55
+ )
45
56
  env_file_secondary = get_config_dir() / ".env"
46
57
  if env_file_secondary.exists():
47
58
  get_config_dir() / "config"
@@ -56,114 +67,77 @@ docs_base = Path(user_documents_dir()) / "local_deep_research"
56
67
  os.environ["DOCS_DIR"] = str(docs_base)
57
68
 
58
69
 
59
- # Expose get_llm function
60
- def get_llm(*args, **kwargs):
61
- """
62
- Helper function to get LLM from llm_config.py
63
- """
64
- # Import here to avoid circular imports
65
- import importlib.util
66
- import sys
67
-
68
- llm_config_path = CONFIG_DIR / "llm_config.py"
69
-
70
- # If llm_config.py exists, use it
71
- if llm_config_path.exists():
72
- if str(CONFIG_DIR) not in sys.path:
73
- sys.path.insert(0, str(CONFIG_DIR))
74
-
75
- spec = importlib.util.spec_from_file_location("llm_config", llm_config_path)
76
- llm_config = importlib.util.module_from_spec(spec)
77
- spec.loader.exec_module(llm_config)
78
-
79
- if hasattr(llm_config, "get_llm"):
80
- return llm_config.get_llm(*args, **kwargs)
81
-
82
- # Fallback to utility function
83
- from .utilties.llm_utils import get_model
84
- return get_model(*args, **kwargs)
85
-
86
- # Expose get_search function
87
- def get_search(search_tool=None):
88
- """
89
- Helper function to get search engine
90
- """
91
-
92
- # Use specified tool or default from settings
93
- tool = search_tool or settings.search.tool
94
- logger.info(f"Search tool is: {tool}")
95
-
96
- # Import here to avoid circular imports
97
- from .web_search_engines.search_engine_factory import get_search as factory_get_search
98
-
99
- # Get search parameters
100
- params = {
101
- "search_tool": tool,
102
- "llm_instance": get_llm(),
103
- "max_results": settings.search.max_results,
104
- "region": settings.search.region,
105
- "time_period": settings.search.time_period,
106
- "safe_search": settings.search.safe_search,
107
- "search_snippets_only": settings.search.snippets_only,
108
- "search_language": settings.search.search_language,
109
- "max_filtered_results": settings.search.max_filtered_results
110
- }
111
- logger.info(f"Search config params: {params}")
112
- # Create and return search engine
113
- return factory_get_search(**params)
114
-
115
70
  def init_config_files():
116
71
  """Initialize config files if they don't exist"""
117
- import shutil
118
72
  import os
119
- import sys
120
73
  import platform
121
-
74
+ import shutil
75
+
122
76
  # Ensure CONFIG_DIR exists with explicit creation
123
77
  os.makedirs(CONFIG_DIR, exist_ok=True)
124
-
78
+
125
79
  # Get default files path with more reliable approach for Windows
126
80
  if platform.system() == "Windows":
127
81
  # Use a more reliable method on Windows
128
82
  from pkg_resources import resource_filename
83
+
129
84
  try:
130
- defaults_dir = Path(resource_filename('local_deep_research', 'defaults'))
85
+ defaults_dir = Path(resource_filename("local_deep_research", "defaults"))
131
86
  logger.info(f"Using pkg_resources for Windows: {defaults_dir}")
132
-
87
+
133
88
  # Create settings.toml if it doesn't exist (with explicit Windows paths)
134
89
  settings_file = os.path.join(CONFIG_DIR, "settings.toml")
135
90
  default_settings = os.path.join(defaults_dir, "main.toml")
136
91
  if not os.path.exists(settings_file) and os.path.exists(default_settings):
137
92
  shutil.copyfile(default_settings, settings_file)
138
93
  logger.info(f"Created settings.toml at {settings_file}")
139
-
140
- # Create llm_config.py if it doesn't exist
141
- llm_config_file = os.path.join(CONFIG_DIR, "llm_config.py")
142
- default_llm = os.path.join(defaults_dir, "llm_config.py")
143
- if not os.path.exists(llm_config_file) and os.path.exists(default_llm):
144
- shutil.copyfile(default_llm, llm_config_file)
145
- logger.info(f"Created llm_config.py at {llm_config_file}")
146
-
94
+ # Add note about database-first settings
95
+ with open(settings_file, "a") as f:
96
+ f.write(
97
+ "\n\n# NOTE: Settings in this file are used as fallback only.\n"
98
+ )
99
+ f.write(
100
+ "# Settings stored in the database (ldr.db) take precedence.\n"
101
+ )
102
+ f.write(
103
+ "# To modify settings permanently, use the web interface settings page.\n"
104
+ )
105
+
147
106
  # Create local_collections.toml if it doesn't exist
148
107
  collections_file = os.path.join(CONFIG_DIR, "local_collections.toml")
149
108
  default_collections = os.path.join(defaults_dir, "local_collections.toml")
150
- if not os.path.exists(collections_file) and os.path.exists(default_collections):
109
+ if not os.path.exists(collections_file) and os.path.exists(
110
+ default_collections
111
+ ):
151
112
  shutil.copyfile(default_collections, collections_file)
152
113
  logger.info(f"Created local_collections.toml at {collections_file}")
153
-
114
+
154
115
  # Create search_engines.toml if it doesn't exist
155
116
  search_engines_file = os.path.join(CONFIG_DIR, "search_engines.toml")
156
117
  default_engines = os.path.join(defaults_dir, "search_engines.toml")
157
- if not os.path.exists(search_engines_file) and os.path.exists(default_engines):
118
+ if not os.path.exists(search_engines_file) and os.path.exists(
119
+ default_engines
120
+ ):
158
121
  shutil.copyfile(default_engines, search_engines_file)
159
122
  logger.info(f"Created search_engines.toml at {search_engines_file}")
160
-
161
- # Create .env.template if it doesn't exist
123
+ # Add note about database-first settings
124
+ with open(search_engines_file, "a") as f:
125
+ f.write(
126
+ "\n\n# NOTE: Settings in this file are used as fallback only.\n"
127
+ )
128
+ f.write(
129
+ "# Settings stored in the database (ldr.db) take precedence.\n"
130
+ )
131
+ f.write(
132
+ "# To modify search settings permanently, use the web interface settings page.\n"
133
+ )
134
+
135
+ # Create .env.template if it doesn't exist
162
136
  env_template_file = CONFIG_DIR / ".env.template"
163
137
  if not env_template_file.exists():
164
138
  shutil.copy(defaults_dir / ".env.template", env_template_file)
165
139
  logger.info(f"Created .env.template at {env_template_file}")
166
-
140
+
167
141
  # Optionally create an empty .env file if it doesn't exist
168
142
  env_file = CONFIG_DIR / ".env"
169
143
  if not env_file.exists():
@@ -176,53 +150,68 @@ def init_config_files():
176
150
  """Initialize config files if they don't exist"""
177
151
  import shutil
178
152
  from importlib.resources import files
179
-
153
+
180
154
  # Get default files path
181
155
  try:
182
- defaults_dir = files('local_deep_research.defaults')
156
+ defaults_dir = files("local_deep_research.defaults")
183
157
  except ImportError:
184
158
  # Fallback for older Python versions
185
159
  from pkg_resources import resource_filename
186
- defaults_dir = Path(resource_filename('local_deep_research', 'defaults'))
187
-
160
+
161
+ defaults_dir = Path(resource_filename("local_deep_research", "defaults"))
162
+
188
163
  # Create settings.toml if it doesn't exist
189
164
  settings_file = CONFIG_DIR / "settings.toml"
190
165
  if not settings_file.exists():
191
166
  shutil.copy(defaults_dir / "main.toml", settings_file)
192
167
  logger.info(f"Created settings.toml at {settings_file}")
193
-
194
- # Create llm_config.py if it doesn't exist
195
- llm_config_file = CONFIG_DIR / "llm_config.py"
196
- if not llm_config_file.exists():
197
- shutil.copy(defaults_dir / "llm_config.py", llm_config_file)
198
- logger.info(f"Created llm_config.py at {llm_config_file}")
199
-
168
+ # Add note about database-first settings
169
+ with open(settings_file, "a") as f:
170
+ f.write(
171
+ "\n\n# NOTE: Settings in this file are used as fallback only.\n"
172
+ )
173
+ f.write("# Settings stored in the database (ldr.db) take precedence.\n")
174
+ f.write(
175
+ "# To modify settings permanently, use the web interface settings page.\n"
176
+ )
177
+
200
178
  # Create local_collections.toml if it doesn't exist
201
179
  collections_file = CONFIG_DIR / "local_collections.toml"
202
180
  if not collections_file.exists():
203
181
  shutil.copy(defaults_dir / "local_collections.toml", collections_file)
204
182
  logger.info(f"Created local_collections.toml at {collections_file}")
205
-
183
+
206
184
  # Create search_engines.toml if it doesn't exist
207
185
  search_engines_file = CONFIG_DIR / "search_engines.toml"
208
186
  if not search_engines_file.exists():
209
187
  shutil.copy(defaults_dir / "search_engines.toml", search_engines_file)
210
188
  logger.info(f"Created search_engines.toml at {search_engines_file}")
189
+ # Add note about database-first settings
190
+ with open(search_engines_file, "a") as f:
191
+ f.write(
192
+ "\n\n# NOTE: Settings in this file are used as fallback only.\n"
193
+ )
194
+ f.write("# Settings stored in the database (ldr.db) take precedence.\n")
195
+ f.write(
196
+ "# To modify search settings permanently, use the web interface settings page.\n"
197
+ )
198
+
211
199
  env_template_file = CONFIG_DIR / ".env.template"
212
200
  if not env_template_file.exists():
213
201
  shutil.copy(defaults_dir / ".env.template", env_template_file)
214
202
  logger.info(f"Created .env.template at {env_template_file}")
215
-
203
+
216
204
  # Optionally create an empty .env file if it doesn't exist
217
205
  env_file = CONFIG_DIR / ".env"
218
206
  if not env_file.exists():
219
207
  with open(env_file, "w") as f:
220
208
  f.write("# Add your environment variables here\n")
221
- logger.info(f"Created empty .env file at {env_file}")
209
+ logger.info(f"Created empty .env file at {env_file}")
222
210
  secrets_file = CONFIG_DIR / ".secrets.toml"
223
211
  if not secrets_file.exists():
224
212
  with open(secrets_file, "w") as f:
225
- f.write("""
213
+ f.write(
214
+ """
226
215
  # ANTHROPIC_API_KEY = "your-api-key-here"
227
216
  # OPENAI_API_KEY = "your-openai-key-here"
228
217
  # GOOGLE_API_KEY = "your-google-key-here"
@@ -230,19 +219,20 @@ def init_config_files():
230
219
  # GUARDIAN_API_KEY = "your-api-key-here"
231
220
  # GOOGLE_PSE_API_KEY = "your-google-api-key-here"
232
221
  # GOOGLE_PSE_ENGINE_ID = "your-programmable-search-engine-id-here"
233
- """)
234
-
235
- # Initialize config files on import
236
- init_config_files()
222
+ """
223
+ )
224
+
237
225
 
238
- # Use an absolute path to your .secrets.toml for testing
239
- secrets_file = Path(SECRETS_FILE)
226
+ # Add a comment to explain the DB-first settings approach
227
+ logger.info(
228
+ "Using database-first settings approach. TOML files are used as fallback only."
229
+ )
240
230
 
241
231
  settings = Dynaconf(
242
232
  settings_files=[
243
233
  str(SETTINGS_FILE),
244
234
  str(LOCAL_COLLECTIONS_FILE),
245
- str(SEARCH_ENGINES_FILE),
235
+ str(SEARCH_ENGINES_FILE),
246
236
  ],
247
237
  secrets=str(SECRETS_FILE),
248
238
  env_prefix="LDR",
@@ -251,3 +241,5 @@ settings = Dynaconf(
251
241
  env_file=str(CONFIG_DIR / ".env"),
252
242
  )
253
243
 
244
+ # Initialize config files on import
245
+ init_config_files()