local-deep-research 0.3.9__tar.gz → 0.3.11__tar.gz

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 (143) hide show
  1. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/PKG-INFO +28 -20
  2. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/README.md +27 -19
  3. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/pyproject.toml +10 -1
  4. local_deep_research-0.3.11/src/local_deep_research/__version__.py +1 -0
  5. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/defaults/default_settings.json +17 -4
  6. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/services/research_service.py +2 -2
  7. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/engines/full_search.py +1 -1
  8. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/engines/search_engine_searxng.py +23 -8
  9. local_deep_research-0.3.9/src/local_deep_research/__main__.py +0 -16
  10. local_deep_research-0.3.9/src/local_deep_research/__version__.py +0 -1
  11. local_deep_research-0.3.9/src/local_deep_research/main.py +0 -215
  12. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/LICENSE +0 -0
  13. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/__init__.py +0 -0
  14. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/__init__.py +0 -0
  15. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/filters/__init__.py +0 -0
  16. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/filters/base_filter.py +0 -0
  17. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/filters/cross_engine_filter.py +0 -0
  18. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/findings/base_findings.py +0 -0
  19. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/findings/repository.py +0 -0
  20. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/knowledge/__init__.py +0 -0
  21. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/knowledge/base_knowledge.py +0 -0
  22. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/knowledge/standard_knowledge.py +0 -0
  23. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/questions/__init__.py +0 -0
  24. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/questions/base_question.py +0 -0
  25. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/questions/decomposition_question.py +0 -0
  26. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/questions/standard_question.py +0 -0
  27. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/repositories/__init__.py +0 -0
  28. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/strategies/__init__.py +0 -0
  29. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/strategies/base_strategy.py +0 -0
  30. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/strategies/iterdrag_strategy.py +0 -0
  31. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/strategies/parallel_search_strategy.py +0 -0
  32. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/strategies/rapid_search_strategy.py +0 -0
  33. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/strategies/source_based_strategy.py +0 -0
  34. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/strategies/standard_strategy.py +0 -0
  35. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/tools/__init__.py +0 -0
  36. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/tools/base_tool.py +0 -0
  37. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/tools/knowledge_tools/__init__.py +0 -0
  38. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/tools/question_tools/__init__.py +0 -0
  39. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/tools/search_tools/__init__.py +0 -0
  40. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/api/__init__.py +0 -0
  41. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/api/research_functions.py +0 -0
  42. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/app.py +0 -0
  43. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/citation_handler.py +0 -0
  44. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/config/__init__.py +0 -0
  45. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/config/llm_config.py +0 -0
  46. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/config/search_config.py +0 -0
  47. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/defaults/.env.template +0 -0
  48. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/defaults/__init__.py +0 -0
  49. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/migrate_db.py +0 -0
  50. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/report_generator.py +0 -0
  51. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/search_system.py +0 -0
  52. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/setup_data_dir.py +0 -0
  53. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/test_migration.py +0 -0
  54. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/utilities/__init__.py +0 -0
  55. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/utilities/db_utils.py +0 -0
  56. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/utilities/enums.py +0 -0
  57. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/utilities/llm_utils.py +0 -0
  58. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/utilities/search_utilities.py +0 -0
  59. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/utilities/setup_utils.py +0 -0
  60. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/__init__.py +0 -0
  61. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/app.py +0 -0
  62. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/app_factory.py +0 -0
  63. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/database/README.md +0 -0
  64. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/database/migrate_to_ldr_db.py +0 -0
  65. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/database/migrations.py +0 -0
  66. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/database/models.py +0 -0
  67. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/database/schema_upgrade.py +0 -0
  68. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/models/database.py +0 -0
  69. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/models/settings.py +0 -0
  70. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/routes/api_routes.py +0 -0
  71. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/routes/history_routes.py +0 -0
  72. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/routes/research_routes.py +0 -0
  73. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/routes/settings_routes.py +0 -0
  74. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/services/resource_service.py +0 -0
  75. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/services/settings_manager.py +0 -0
  76. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/services/settings_service.py +0 -0
  77. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/services/socket_service.py +0 -0
  78. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/css/custom_dropdown.css +0 -0
  79. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/css/settings.css +0 -0
  80. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/css/styles.css +0 -0
  81. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/components/custom_dropdown.js +0 -0
  82. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/components/detail.js +0 -0
  83. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/components/fallback/formatting.js +0 -0
  84. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/components/fallback/ui.js +0 -0
  85. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/components/history.js +0 -0
  86. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/components/logpanel.js +0 -0
  87. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/components/progress.js +0 -0
  88. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/components/research.js +0 -0
  89. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/components/results.js +0 -0
  90. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/components/settings.js +0 -0
  91. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/components/settings_sync.js +0 -0
  92. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/main.js +0 -0
  93. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/research_form.js +0 -0
  94. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/services/api.js +0 -0
  95. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/services/audio.js +0 -0
  96. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/services/formatting.js +0 -0
  97. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/services/pdf.js +0 -0
  98. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/services/socket.js +0 -0
  99. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/services/ui.js +0 -0
  100. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/sounds/README.md +0 -0
  101. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/sounds/error.mp3 +0 -0
  102. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/sounds/success.mp3 +0 -0
  103. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/base.html +0 -0
  104. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/components/custom_dropdown.html +0 -0
  105. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/components/log_panel.html +0 -0
  106. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/components/mobile_nav.html +0 -0
  107. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/components/settings_form.html +0 -0
  108. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/components/sidebar.html +0 -0
  109. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/pages/details.html +0 -0
  110. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/pages/history.html +0 -0
  111. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/pages/progress.html +0 -0
  112. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/pages/research.html +0 -0
  113. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/pages/results.html +0 -0
  114. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/settings_dashboard.html +0 -0
  115. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/utils/__init__.py +0 -0
  116. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/utils/formatters.py +0 -0
  117. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/utils/templates.py +0 -0
  118. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/__init__.py +0 -0
  119. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/engines/__init__.py +0 -0
  120. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/engines/meta_search_engine.py +0 -0
  121. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/engines/search_engine_arxiv.py +0 -0
  122. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/engines/search_engine_brave.py +0 -0
  123. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/engines/search_engine_ddg.py +0 -0
  124. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/engines/search_engine_github.py +0 -0
  125. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/engines/search_engine_google_pse.py +0 -0
  126. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/engines/search_engine_guardian.py +0 -0
  127. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/engines/search_engine_local.py +0 -0
  128. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/engines/search_engine_local_all.py +0 -0
  129. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/engines/search_engine_pubmed.py +0 -0
  130. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py +0 -0
  131. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/engines/search_engine_serpapi.py +0 -0
  132. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/engines/search_engine_wayback.py +0 -0
  133. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/engines/search_engine_wikipedia.py +0 -0
  134. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/search_engine_base.py +0 -0
  135. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/search_engine_factory.py +0 -0
  136. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/search_engines_config.py +0 -0
  137. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/tests/__init__.py +0 -0
  138. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/tests/download_stuff_for_local_test.py +0 -0
  139. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/tests/fix_tests/README.md +0 -0
  140. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/tests/fix_tests/test_duplicate_links_fix.py +0 -0
  141. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/tests/searxng/test_searxng_instance.py +0 -0
  142. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/tests/searxng/test_searxng_integration.py +0 -0
  143. {local_deep_research-0.3.9 → local_deep_research-0.3.11}/tests/test_google_pse.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: local-deep-research
3
- Version: 0.3.9
3
+ Version: 0.3.11
4
4
  Summary: AI-powered research assistant with deep, iterative analysis using LLMs and web searches
5
5
  Author-Email: LearningCircuit <185559241+LearningCircuit@users.noreply.github.com>, HashedViking <6432677+HashedViking@users.noreply.github.com>
6
6
  License: MIT License
@@ -108,34 +108,42 @@ Local Deep Research combines the power of large language models with intelligent
108
108
 
109
109
  ### Option 1: Docker (Recommended)
110
110
 
111
+ LDR uses Docker compose to bundle the web app and all it's dependencies so
112
+ you can get up and running quickly.
113
+
114
+ ### Prerequisites
115
+
116
+ - [Docker](https://docs.docker.com/engine/install/)
117
+ - [Docker Compose](https://docs.docker.com/compose/install/)
118
+ - `cookiecutter`: Run `pip install --user cookiecutter`
119
+
120
+ Clone the repository:
121
+
111
122
  ```bash
112
- # Step 1: Pull and run SearXNG for optimal search results
113
- docker pull searxng/searxng
114
- docker run -d -p 8080:8080 --name searxng searxng/searxng
123
+ git clone https://github.com/LearningCircuit/local-deep-research.git
124
+ cd local-deep-research
125
+ ```
115
126
 
116
- # Step 2: Pull and run Local Deep Research
117
- docker pull localdeepresearch/local-deep-research
118
- docker run -d -p 5000:5000 --name local-deep-research localdeepresearch/local-deep-research
127
+ ### Configuring with Docker Compose
119
128
 
120
- # Optional 3a: For connecting to already installed local Ollama (https://ollama.com/download) or other local services
121
- # docker run -d -p 5000:5000 --network host --name local-deep-research localdeepresearch/local-deep-research
129
+ In the LDR repository, run the following command
130
+ to do generate the compose file:
122
131
 
123
- # Optional 3b (recommended): Pull and run Ollama for local LLM capabilities
124
- # docker pull ollama/ollama
125
- # docker run -d -p 11434:11434 --name ollama ollama/ollama
126
- # docker exec -it ollama ollama pull gemma3:12b
132
+ ```bash
133
+ cookiecutter cookiecutter-docker/
134
+ ```
127
135
 
128
- # Start containers - Required after each reboot (can be automated with this flag --restart unless-stopped in run)
129
- docker start searxng
130
- docker start local-deep-research
131
- # docker start ollama
136
+ This will prompt you to answer a series of questions. Hit Enter repeatedly
137
+ to accept the default values. It should generate a file in the repository called `docker-compose.default.yml`. To run LDR, use the following command:
138
+
139
+ ```bash
140
+ docker compose -f docker-compose.default.yml up
132
141
  ```
133
142
 
134
143
  Then visit `http://127.0.0.1:5000` to start researching!
135
144
 
136
- > **Note**: If you need to connect to local services (like Ollama), add `--network host` to the command.
137
- >
138
- > **Don't have Docker? It's installed in a few clicks: [Install Docker here](https://www.docker.com/get-started/)**
145
+ See [here](https://github.com/LearningCircuit/local-deep-research/wiki/Installation#docker-installation-recommended) for more information about
146
+ using Docker.
139
147
 
140
148
  ### Option 2: Python Package (mostly for programmatic access)
141
149
 
@@ -37,34 +37,42 @@ Local Deep Research combines the power of large language models with intelligent
37
37
 
38
38
  ### Option 1: Docker (Recommended)
39
39
 
40
+ LDR uses Docker compose to bundle the web app and all it's dependencies so
41
+ you can get up and running quickly.
42
+
43
+ ### Prerequisites
44
+
45
+ - [Docker](https://docs.docker.com/engine/install/)
46
+ - [Docker Compose](https://docs.docker.com/compose/install/)
47
+ - `cookiecutter`: Run `pip install --user cookiecutter`
48
+
49
+ Clone the repository:
50
+
40
51
  ```bash
41
- # Step 1: Pull and run SearXNG for optimal search results
42
- docker pull searxng/searxng
43
- docker run -d -p 8080:8080 --name searxng searxng/searxng
52
+ git clone https://github.com/LearningCircuit/local-deep-research.git
53
+ cd local-deep-research
54
+ ```
44
55
 
45
- # Step 2: Pull and run Local Deep Research
46
- docker pull localdeepresearch/local-deep-research
47
- docker run -d -p 5000:5000 --name local-deep-research localdeepresearch/local-deep-research
56
+ ### Configuring with Docker Compose
48
57
 
49
- # Optional 3a: For connecting to already installed local Ollama (https://ollama.com/download) or other local services
50
- # docker run -d -p 5000:5000 --network host --name local-deep-research localdeepresearch/local-deep-research
58
+ In the LDR repository, run the following command
59
+ to do generate the compose file:
51
60
 
52
- # Optional 3b (recommended): Pull and run Ollama for local LLM capabilities
53
- # docker pull ollama/ollama
54
- # docker run -d -p 11434:11434 --name ollama ollama/ollama
55
- # docker exec -it ollama ollama pull gemma3:12b
61
+ ```bash
62
+ cookiecutter cookiecutter-docker/
63
+ ```
56
64
 
57
- # Start containers - Required after each reboot (can be automated with this flag --restart unless-stopped in run)
58
- docker start searxng
59
- docker start local-deep-research
60
- # docker start ollama
65
+ This will prompt you to answer a series of questions. Hit Enter repeatedly
66
+ to accept the default values. It should generate a file in the repository called `docker-compose.default.yml`. To run LDR, use the following command:
67
+
68
+ ```bash
69
+ docker compose -f docker-compose.default.yml up
61
70
  ```
62
71
 
63
72
  Then visit `http://127.0.0.1:5000` to start researching!
64
73
 
65
- > **Note**: If you need to connect to local services (like Ollama), add `--network host` to the command.
66
- >
67
- > **Don't have Docker? It's installed in a few clicks: [Install Docker here](https://www.docker.com/get-started/)**
74
+ See [here](https://github.com/LearningCircuit/local-deep-research/wiki/Installation#docker-installation-recommended) for more information about
75
+ using Docker.
68
76
 
69
77
  ### Option 2: Python Package (mostly for programmatic access)
70
78
 
@@ -57,7 +57,7 @@ dependencies = [
57
57
  "setuptools>=78.1.0",
58
58
  "flask-wtf>=1.2.2",
59
59
  ]
60
- version = "0.3.9"
60
+ version = "0.3.11"
61
61
 
62
62
  [project.license]
63
63
  file = "LICENSE"
@@ -93,6 +93,14 @@ distribution = true
93
93
  source = "file"
94
94
  path = "src/local_deep_research/__version__.py"
95
95
 
96
+ [[tool.pdm.source]]
97
+ url = "https://download.pytorch.org/whl/cpu"
98
+ name = "torch"
99
+ include_packages = [
100
+ "torch",
101
+ "torch*",
102
+ ]
103
+
96
104
  [dependency-groups]
97
105
  dev = [
98
106
  "isort>=6.0.1",
@@ -100,4 +108,5 @@ dev = [
100
108
  "pre-commit>=4.2.0",
101
109
  "flake8>=7.1.2",
102
110
  "jupyter>=1.1.1",
111
+ "cookiecutter>=2.6.0",
103
112
  ]
@@ -0,0 +1 @@
1
+ __version__ = "0.3.11"
@@ -3029,16 +3029,29 @@
3029
3029
  },
3030
3030
  "search.engine.web.searxng.default_params.safe_search": {
3031
3031
  "category": "searxng",
3032
- "description": "Setting for searxng.default_params.safe_search",
3032
+ "description": "Configure the safe search level",
3033
3033
  "editable": true,
3034
3034
  "max_value": null,
3035
3035
  "min_value": null,
3036
3036
  "name": "Safe Search",
3037
- "options": null,
3037
+ "options": [
3038
+ {
3039
+ "label": "Off",
3040
+ "value": "OFF"
3041
+ },
3042
+ {
3043
+ "label": "Moderate",
3044
+ "value": "MODERATE"
3045
+ },
3046
+ {
3047
+ "label": "Strict",
3048
+ "value": "STRICT"
3049
+ }
3050
+ ],
3038
3051
  "step": null,
3039
3052
  "type": "SEARCH",
3040
- "ui_element": "checkbox",
3041
- "value": 1,
3053
+ "ui_element": "select",
3054
+ "value": "OFF",
3042
3055
  "visible": true
3043
3056
  },
3044
3057
  "search.engine.web.searxng.full_search_class": {
@@ -530,7 +530,7 @@ def run_research_process(
530
530
  report_path = os.path.join(
531
531
  OUTPUT_DIR,
532
532
  f"quick_summary_{safe_query}_"
533
- f"{datetime.now().isoformat()}.md",
533
+ f"{int(datetime.now().timestamp())}.md",
534
534
  )
535
535
 
536
536
  # Send progress update for writing to file
@@ -643,7 +643,7 @@ def run_research_process(
643
643
  safe_query = safe_query.replace(" ", "_").lower()
644
644
  report_path = os.path.join(
645
645
  OUTPUT_DIR,
646
- f"detailed_report_{safe_query}_{datetime.now().isoformat()}.md",
646
+ f"detailed_report_{safe_query}_{int(datetime.now().timestamp())}.md",
647
647
  )
648
648
 
649
649
  with open(report_path, "w", encoding="utf-8") as f:
@@ -25,7 +25,7 @@ class FullSearchResults:
25
25
  max_results: int = 10,
26
26
  region: str = "wt-wt",
27
27
  time: str = "y",
28
- safesearch: str = "Moderate",
28
+ safesearch: str | int = "Moderate",
29
29
  ):
30
30
  self.llm = llm
31
31
  self.output_format = output_format
@@ -1,3 +1,4 @@
1
+ import enum
1
2
  import logging
2
3
  import os
3
4
  import time
@@ -15,6 +16,17 @@ logging.basicConfig(level=logging.INFO)
15
16
  logger = logging.getLogger(__name__)
16
17
 
17
18
 
19
+ @enum.unique
20
+ class SafeSearchSetting(enum.IntEnum):
21
+ """
22
+ Acceptable settings for safe search.
23
+ """
24
+
25
+ OFF = 0
26
+ MODERATE = 1
27
+ STRICT = 2
28
+
29
+
18
30
  class SearXNGSearchEngine(BaseSearchEngine):
19
31
  """
20
32
  SearXNG search engine implementation that requires an instance URL provided via
@@ -29,7 +41,7 @@ class SearXNGSearchEngine(BaseSearchEngine):
29
41
  categories: Optional[List[str]] = None,
30
42
  engines: Optional[List[str]] = None,
31
43
  language: str = "en",
32
- safe_search: int = 1,
44
+ safe_search: str = SafeSearchSetting.OFF.name,
33
45
  time_range: Optional[str] = None,
34
46
  delay_between_requests: float = 0.0,
35
47
  llm: Optional[BaseLLM] = None,
@@ -89,7 +101,14 @@ class SearXNGSearchEngine(BaseSearchEngine):
89
101
  self.categories = categories or ["general"]
90
102
  self.engines = engines
91
103
  self.language = language
92
- self.safe_search = safe_search
104
+ try:
105
+ self.safe_search = SafeSearchSetting[safe_search]
106
+ except ValueError:
107
+ logger.error(
108
+ "'{}' is not a valid safe search setting. Disabling safe search",
109
+ safe_search,
110
+ )
111
+ self.safe_search = SafeSearchSetting.OFF
93
112
  self.time_range = time_range
94
113
 
95
114
  self.delay_between_requests = float(
@@ -114,11 +133,7 @@ class SearXNGSearchEngine(BaseSearchEngine):
114
133
  max_results=max_results,
115
134
  region="wt-wt",
116
135
  time="y",
117
- safesearch=(
118
- "Moderate"
119
- if safe_search == 1
120
- else "Off" if safe_search == 0 else "Strict"
121
- ),
136
+ safesearch=self.safe_search.value,
122
137
  )
123
138
 
124
139
  self.last_request_time = 0
@@ -177,7 +192,7 @@ class SearXNGSearchEngine(BaseSearchEngine):
177
192
  "language": self.language,
178
193
  "format": "html", # Use HTML format instead of JSON
179
194
  "pageno": 1,
180
- "safesearch": self.safe_search,
195
+ "safesearch": self.safe_search.value,
181
196
  "count": self.max_results,
182
197
  }
183
198
 
@@ -1,16 +0,0 @@
1
- """
2
- Main entry point when running the package with `python -m local_deep_research`.
3
- This avoids circular imports by directly importing the main function after
4
- the package is fully loaded.
5
- """
6
-
7
-
8
- def main():
9
- # Only import main after the whole package has been initialized
10
- from .main import main as main_func
11
-
12
- main_func()
13
-
14
-
15
- if __name__ == "__main__":
16
- main()
@@ -1 +0,0 @@
1
- __version__ = "0.3.9"
@@ -1,215 +0,0 @@
1
- import logging
2
- import sys
3
- from typing import Dict
4
-
5
- from . import get_advanced_search_system, get_report_generator
6
- from .config.config_files import settings
7
- from .utilities.db_utils import get_db_setting
8
-
9
-
10
- def print_report(report: Dict):
11
- """Print and save the report in a readable format"""
12
-
13
- # Print to console in readable format
14
- print("\n=== GENERATED REPORT ===\n")
15
-
16
- # Print content
17
- print(report["content"])
18
-
19
- # Save to file in markdown format
20
- with open("report.md", "w", encoding="utf-8") as markdown_file:
21
- # Write content
22
- markdown_file.write(report["content"])
23
-
24
- # Write metadata at the end of the file
25
- markdown_file.write("\n\n---\n\n")
26
- markdown_file.write("## Report Metadata\n")
27
-
28
- markdown_file.write(f"- Query: {report['metadata']['query']}\n")
29
-
30
- print("\nReport has been saved to report.md")
31
-
32
-
33
- # Create the report generator lazily to avoid circular imports
34
- def get_report_generator_instance():
35
- return get_report_generator()
36
-
37
-
38
- # report_generator = IntegratedReportGenerator()
39
- report_generator = None # Will be initialized when needed
40
-
41
-
42
- def main():
43
- import logging
44
-
45
- from .utilities.setup_utils import setup_user_directories
46
-
47
- # Configure logging
48
- logging.basicConfig(level=logging.INFO)
49
- logger = logging.getLogger(__name__)
50
- search_iterations = get_db_setting("search.iterations", settings.search.iterations)
51
- questions_per_iteration = get_db_setting(
52
- "search.questions_per_iteration", settings.search.questions_per_iteration
53
- )
54
- logger.info(
55
- f"Starting with settings: iterations={search_iterations}, "
56
- f"questions_per_iteration={questions_per_iteration}"
57
- )
58
-
59
- # Explicitly run setup
60
- logger.info("Initializing configuration...")
61
- setup_user_directories()
62
-
63
- system = get_advanced_search_system()
64
-
65
- print("Welcome to the Advanced Research System")
66
- print("Type 'quit' to exit")
67
-
68
- while True:
69
- print("\nSelect output type:")
70
- print("1) Quick Summary (Generated in a few minutes)")
71
- print(
72
- "2) Detailed Research Report (Recommended for deeper analysis - may take several hours)"
73
- )
74
- choice = input("Enter number (1 or 2): ").strip()
75
-
76
- while choice not in ["1", "2"]:
77
- print("\nInvalid input. Please enter 1 or 2:")
78
- print("1) Quick Summary (Generated in a few minutes)")
79
- print(
80
- "2) Detailed Research Report (Recommended for deeper analysis - may take several hours)"
81
- )
82
- choice = input("Enter number (1 or 2): ").strip()
83
-
84
- query = input("\nEnter your research query: ").strip()
85
-
86
- if query.lower() == "quit":
87
- break
88
-
89
- # System will automatically use updated configuration
90
- # through the automatic reloading in get_llm() and get_search()
91
-
92
- if choice == "1":
93
- print("\nResearching... This may take a few minutes.\n")
94
- else:
95
- print(
96
- "\nGenerating detailed report... This may take several hours. Please be patient as this enables deeper analysis.\n"
97
- )
98
-
99
- results = system.analyze_topic(query)
100
- if results:
101
- if choice == "1":
102
- # Quick Summary
103
- print("\n=== QUICK SUMMARY ===")
104
- if results["findings"] and len(results["findings"]) > 0:
105
- initial_analysis = [
106
- finding["content"] for finding in results["findings"]
107
- ]
108
- print(initial_analysis)
109
-
110
- else:
111
- # Full Report
112
- # Initialize report_generator if not already done
113
- global report_generator
114
- if report_generator is None:
115
- report_generator = get_report_generator()
116
-
117
- final_report = report_generator.generate_report(results, query)
118
- print("\n=== RESEARCH REPORT ===")
119
- print_report(final_report)
120
-
121
- print("\n=== RESEARCH METRICS ===")
122
- print(f"Search Iterations: {results['iterations']}")
123
-
124
- else:
125
- print("Research failed. Please try again.")
126
-
127
-
128
- # Add command for database migration
129
- if __name__ == "__main__":
130
- import argparse
131
-
132
- parser = argparse.ArgumentParser(description="Local Deep Research")
133
- parser.add_argument("--web", action="store_true", help="Start the web server")
134
- parser.add_argument(
135
- "--migrate-db", action="store_true", help="Migrate legacy databases to ldr.db"
136
- )
137
- parser.add_argument("--debug", action="store_true", help="Enable debug mode")
138
- parser.add_argument(
139
- "--test-migration",
140
- action="store_true",
141
- help="Test migration by checking database contents",
142
- )
143
- parser.add_argument(
144
- "--schema-upgrade",
145
- action="store_true",
146
- help="Run schema upgrades on the database (e.g., remove redundant tables)",
147
- )
148
-
149
- args = parser.parse_args()
150
-
151
- if args.debug:
152
- logging.basicConfig(level=logging.DEBUG)
153
- else:
154
- logging.basicConfig(level=logging.INFO)
155
-
156
- if args.migrate_db:
157
- try:
158
- # First ensure data directory exists
159
- from src.local_deep_research.setup_data_dir import setup_data_dir
160
-
161
- setup_data_dir()
162
-
163
- # Then run the migration
164
- from src.local_deep_research.web.database.migrate_to_ldr_db import (
165
- migrate_to_ldr_db,
166
- )
167
-
168
- print("Starting database migration...")
169
- success = migrate_to_ldr_db()
170
- if success:
171
- print("Database migration completed successfully")
172
- sys.exit(0)
173
- else:
174
- print("Database migration failed")
175
- sys.exit(1)
176
- except Exception as e:
177
- print(f"Error running database migration: {e}")
178
- sys.exit(1)
179
-
180
- if args.test_migration:
181
- try:
182
- from src.local_deep_research.test_migration import main as test_main
183
-
184
- sys.exit(test_main())
185
- except Exception as e:
186
- print(f"Error running migration test: {e}")
187
- sys.exit(1)
188
-
189
- if args.schema_upgrade:
190
- try:
191
- from src.local_deep_research.web.database.schema_upgrade import (
192
- run_schema_upgrades,
193
- )
194
-
195
- print("Running database schema upgrades...")
196
- success = run_schema_upgrades()
197
- if success:
198
- print("Schema upgrades completed successfully")
199
- sys.exit(0)
200
- else:
201
- print("Schema upgrades failed")
202
- sys.exit(1)
203
- except Exception as e:
204
- print(f"Error running schema upgrades: {e}")
205
- sys.exit(1)
206
-
207
- if args.web:
208
- from src.local_deep_research.web.app import main as web_main
209
-
210
- web_main()
211
- else:
212
- # Default to web if no command specified
213
- from src.local_deep_research.web.app import main as web_main
214
-
215
- web_main()