local-deep-research 0.3.3__tar.gz → 0.3.6__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 (141) hide show
  1. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/PKG-INFO +54 -28
  2. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/README.md +53 -27
  3. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/pyproject.toml +1 -1
  4. local_deep_research-0.3.6/src/local_deep_research/__version__.py +1 -0
  5. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/strategies/parallel_search_strategy.py +0 -6
  6. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/strategies/source_based_strategy.py +0 -6
  7. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/api/__init__.py +0 -4
  8. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/config/llm_config.py +41 -21
  9. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/defaults/default_settings.json +37 -14
  10. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/database/migrations.py +4 -1
  11. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/routes/research_routes.py +12 -12
  12. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/routes/settings_routes.py +2 -2
  13. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/services/research_service.py +7 -2
  14. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/services/settings_manager.py +28 -7
  15. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/templates/components/sidebar.html +1 -1
  16. local_deep_research-0.3.6/src/local_deep_research/web/utils/templates.py +24 -0
  17. local_deep_research-0.3.3/src/local_deep_research/__version__.py +0 -1
  18. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/LICENSE +0 -0
  19. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/__init__.py +0 -0
  20. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/__main__.py +0 -0
  21. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/__init__.py +0 -0
  22. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/filters/__init__.py +0 -0
  23. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/filters/base_filter.py +0 -0
  24. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/filters/cross_engine_filter.py +0 -0
  25. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/findings/base_findings.py +0 -0
  26. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/findings/repository.py +0 -0
  27. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/knowledge/__init__.py +0 -0
  28. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/knowledge/base_knowledge.py +0 -0
  29. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/knowledge/standard_knowledge.py +0 -0
  30. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/questions/__init__.py +0 -0
  31. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/questions/base_question.py +0 -0
  32. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/questions/decomposition_question.py +0 -0
  33. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/questions/standard_question.py +0 -0
  34. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/repositories/__init__.py +0 -0
  35. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/strategies/__init__.py +0 -0
  36. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/strategies/base_strategy.py +0 -0
  37. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/strategies/iterdrag_strategy.py +0 -0
  38. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/strategies/rapid_search_strategy.py +0 -0
  39. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/strategies/standard_strategy.py +0 -0
  40. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/tools/__init__.py +0 -0
  41. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/tools/base_tool.py +0 -0
  42. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/tools/knowledge_tools/__init__.py +0 -0
  43. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/tools/question_tools/__init__.py +0 -0
  44. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/advanced_search_system/tools/search_tools/__init__.py +0 -0
  45. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/api/research_functions.py +0 -0
  46. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/app.py +0 -0
  47. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/citation_handler.py +0 -0
  48. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/config/__init__.py +0 -0
  49. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/config/search_config.py +0 -0
  50. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/defaults/.env.template +0 -0
  51. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/defaults/__init__.py +0 -0
  52. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/main.py +0 -0
  53. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/migrate_db.py +0 -0
  54. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/report_generator.py +0 -0
  55. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/search_system.py +0 -0
  56. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/setup_data_dir.py +0 -0
  57. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/test_migration.py +0 -0
  58. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/utilities/__init__.py +0 -0
  59. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/utilities/db_utils.py +0 -0
  60. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/utilities/enums.py +0 -0
  61. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/utilities/llm_utils.py +0 -0
  62. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/utilities/search_utilities.py +0 -0
  63. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/utilities/setup_utils.py +0 -0
  64. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/__init__.py +0 -0
  65. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/app.py +0 -0
  66. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/app_factory.py +0 -0
  67. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/database/README.md +0 -0
  68. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/database/migrate_to_ldr_db.py +0 -0
  69. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/database/models.py +0 -0
  70. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/database/schema_upgrade.py +0 -0
  71. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/models/database.py +0 -0
  72. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/models/settings.py +0 -0
  73. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/routes/api_routes.py +0 -0
  74. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/routes/history_routes.py +0 -0
  75. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/services/resource_service.py +0 -0
  76. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/services/settings_service.py +0 -0
  77. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/services/socket_service.py +0 -0
  78. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/css/custom_dropdown.css +0 -0
  79. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/css/settings.css +0 -0
  80. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/css/styles.css +0 -0
  81. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/js/components/custom_dropdown.js +0 -0
  82. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/js/components/detail.js +0 -0
  83. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/js/components/fallback/formatting.js +0 -0
  84. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/js/components/fallback/ui.js +0 -0
  85. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/js/components/history.js +0 -0
  86. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/js/components/logpanel.js +0 -0
  87. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/js/components/progress.js +0 -0
  88. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/js/components/research.js +0 -0
  89. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/js/components/results.js +0 -0
  90. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/js/components/settings.js +0 -0
  91. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/js/components/settings_sync.js +0 -0
  92. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/js/main.js +0 -0
  93. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/js/research_form.js +0 -0
  94. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/js/services/api.js +0 -0
  95. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/js/services/audio.js +0 -0
  96. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/js/services/formatting.js +0 -0
  97. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/js/services/pdf.js +0 -0
  98. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/js/services/socket.js +0 -0
  99. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/js/services/ui.js +0 -0
  100. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/sounds/README.md +0 -0
  101. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/sounds/error.mp3 +0 -0
  102. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/static/sounds/success.mp3 +0 -0
  103. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/templates/base.html +0 -0
  104. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/templates/components/custom_dropdown.html +0 -0
  105. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/templates/components/log_panel.html +0 -0
  106. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/templates/components/mobile_nav.html +0 -0
  107. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/templates/components/settings_form.html +0 -0
  108. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/templates/pages/details.html +0 -0
  109. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/templates/pages/history.html +0 -0
  110. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/templates/pages/progress.html +0 -0
  111. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/templates/pages/research.html +0 -0
  112. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/templates/pages/results.html +0 -0
  113. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/templates/settings_dashboard.html +0 -0
  114. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/utils/__init__.py +0 -0
  115. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web/utils/formatters.py +0 -0
  116. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/__init__.py +0 -0
  117. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/engines/__init__.py +0 -0
  118. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/engines/full_search.py +0 -0
  119. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/engines/meta_search_engine.py +0 -0
  120. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/engines/search_engine_arxiv.py +0 -0
  121. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/engines/search_engine_brave.py +0 -0
  122. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/engines/search_engine_ddg.py +0 -0
  123. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/engines/search_engine_github.py +0 -0
  124. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/engines/search_engine_google_pse.py +0 -0
  125. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/engines/search_engine_guardian.py +0 -0
  126. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/engines/search_engine_local.py +0 -0
  127. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/engines/search_engine_local_all.py +0 -0
  128. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/engines/search_engine_pubmed.py +0 -0
  129. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/engines/search_engine_searxng.py +0 -0
  130. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py +0 -0
  131. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/engines/search_engine_serpapi.py +0 -0
  132. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/engines/search_engine_wayback.py +0 -0
  133. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/engines/search_engine_wikipedia.py +0 -0
  134. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/search_engine_base.py +0 -0
  135. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/search_engine_factory.py +0 -0
  136. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/src/local_deep_research/web_search_engines/search_engines_config.py +0 -0
  137. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/tests/__init__.py +0 -0
  138. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/tests/download_stuff_for_local_test.py +0 -0
  139. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/tests/searxng/test_searxng_instance.py +0 -0
  140. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/tests/searxng/test_searxng_integration.py +0 -0
  141. {local_deep_research-0.3.3 → local_deep_research-0.3.6}/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.3
3
+ Version: 0.3.6
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
@@ -99,41 +99,74 @@ Local Deep Research is a powerful AI research assistant that:
99
99
 
100
100
  Local Deep Research combines the power of large language models with intelligent search strategies to provide well-researched, properly cited answers to complex questions. It can process queries in just seconds with the Quick Summary option, or create detailed reports with proper section organization for more comprehensive analysis.
101
101
 
102
- ## ⚡ Quick Start (Recommended)
102
+ ## ⚡ Quick Start
103
+
104
+ ### Option 1: Docker (Recommended)
103
105
 
104
106
  ```bash
105
- # 1. Install
107
+ # Step 1: Pull and run SearXNG for optimal search results
108
+ docker pull searxng/searxng
109
+ docker run -d -p 8080:8080 --name searxng searxng/searxng
110
+
111
+ # Step 2: Pull and run Local Deep Research
112
+ docker pull localdeepresearch/local-deep-research
113
+ docker run -d -p 5000:5000 --name local-deep-research localdeepresearch/local-deep-research
114
+
115
+ # Optional 3a: For connecting to already installed local Ollama (https://ollama.com/download) or other local services
116
+ # docker run -d -p 5000:5000 --network host --name local-deep-research localdeepresearch/local-deep-research
117
+
118
+ # Optional 3b (recommended): Pull and run Ollama for local LLM capabilities
119
+ # docker pull ollama/ollama
120
+ # docker run -d -p 11434:11434 --name ollama ollama/ollama
121
+ # docker exec -it ollama ollama pull gemma3:12b
122
+
123
+ # Start containers - Required after each reboot (can be automated with this flag --restart unless-stopped in run)
124
+ docker start searxng
125
+ docker start local-deep-research
126
+ # docker start ollama
127
+ ```
128
+
129
+ Then visit `http://127.0.0.1:5000` to start researching!
130
+
131
+ > **Note**: If you need to connect to local services (like Ollama), add `--network host` to the command.
132
+ >
133
+ > **Don't have Docker? It's installed in a few clicks: [Install Docker here](https://www.docker.com/get-started/)**
134
+
135
+ ### Option 2: Python Package (mostly for programmatic access)
136
+
137
+ ```bash
138
+ # Install the package
106
139
  pip install local-deep-research
107
140
 
108
- # 2. Setup SearXNG for best results
141
+ # Setup SearXNG for best results
109
142
  docker pull searxng/searxng
110
143
  docker run -d -p 8080:8080 --name searxng searxng/searxng
111
- docker start searxng (required after every reboot)
112
144
 
113
- # 3. Install Ollama and pull a model
145
+ # Install Ollama and pull a model
114
146
  # Download from https://ollama.ai and run:
115
147
  ollama pull gemma3:12b
116
148
 
117
- # 4. Start the web interface
149
+ # Start the web interface
118
150
  python -m local_deep_research.web.app
119
151
  ```
120
152
 
121
- Then visit `http://127.0.0.1:5000` to start researching!
153
+ For programmatic use in your Python code:
122
154
 
123
- ### Alternative Installation Options
124
-
125
- **Windows Installer**: Download the [Windows Installer](https://github.com/LearningCircuit/local-deep-research/releases/download/v0.1.0/LocalDeepResearch_Setup.exe) for one-click setup.
155
+ ```python
156
+ from local_deep_research import quick_summary
126
157
 
127
- **Docker**: Run with Docker using:
128
- ```bash
129
- docker run --network=host \
130
- local-deep-research
158
+ results = quick_summary(
159
+ query="advances in fusion energy",
160
+ search_tool="auto",
161
+ iterations=1
162
+ )
163
+ print(results["summary"])
131
164
  ```
132
165
 
133
- **Command Line**: Alternatively, use the CLI version with:
134
- ```bash
135
- python -m local_deep_research.main
136
- ```
166
+ ### Additional Installation Options
167
+
168
+ **Windows**: Docker is the easiest option for Windows users. If preferred, a [Windows Installer](https://github.com/LearningCircuit/local-deep-research/releases/download/v0.1.0/LocalDeepResearch_Setup.exe) is also available.
169
+
137
170
 
138
171
  ## 🔍 Research Capabilities
139
172
 
@@ -271,15 +304,8 @@ Local Deep Research includes powerful Retrieval Augmented Generation (RAG) capab
271
304
  - CSV files
272
305
  - And more
273
306
 
274
- ### Using Document Collections
275
-
276
- You can use your documents in research via:
277
- - Auto-selection (when relevant to query)
278
- - Direct collection selection: `tool = "project_docs"`
279
- - All collections: `tool = "local_all"`
280
- - Query syntax: `collection:project_docs your query`
281
-
282
- This allows you to integrate your private knowledge base with web search results for comprehensive research that includes your own documents and data.
307
+ See [this page](https://github.com/LearningCircuit/local-deep-research/wiki/Configuring-Local-Search) for
308
+ configuration instructions.
283
309
 
284
310
  ## 🛠️ Advanced Configuration
285
311
 
@@ -28,41 +28,74 @@ Local Deep Research is a powerful AI research assistant that:
28
28
 
29
29
  Local Deep Research combines the power of large language models with intelligent search strategies to provide well-researched, properly cited answers to complex questions. It can process queries in just seconds with the Quick Summary option, or create detailed reports with proper section organization for more comprehensive analysis.
30
30
 
31
- ## ⚡ Quick Start (Recommended)
31
+ ## ⚡ Quick Start
32
+
33
+ ### Option 1: Docker (Recommended)
32
34
 
33
35
  ```bash
34
- # 1. Install
36
+ # Step 1: Pull and run SearXNG for optimal search results
37
+ docker pull searxng/searxng
38
+ docker run -d -p 8080:8080 --name searxng searxng/searxng
39
+
40
+ # Step 2: Pull and run Local Deep Research
41
+ docker pull localdeepresearch/local-deep-research
42
+ docker run -d -p 5000:5000 --name local-deep-research localdeepresearch/local-deep-research
43
+
44
+ # Optional 3a: For connecting to already installed local Ollama (https://ollama.com/download) or other local services
45
+ # docker run -d -p 5000:5000 --network host --name local-deep-research localdeepresearch/local-deep-research
46
+
47
+ # Optional 3b (recommended): Pull and run Ollama for local LLM capabilities
48
+ # docker pull ollama/ollama
49
+ # docker run -d -p 11434:11434 --name ollama ollama/ollama
50
+ # docker exec -it ollama ollama pull gemma3:12b
51
+
52
+ # Start containers - Required after each reboot (can be automated with this flag --restart unless-stopped in run)
53
+ docker start searxng
54
+ docker start local-deep-research
55
+ # docker start ollama
56
+ ```
57
+
58
+ Then visit `http://127.0.0.1:5000` to start researching!
59
+
60
+ > **Note**: If you need to connect to local services (like Ollama), add `--network host` to the command.
61
+ >
62
+ > **Don't have Docker? It's installed in a few clicks: [Install Docker here](https://www.docker.com/get-started/)**
63
+
64
+ ### Option 2: Python Package (mostly for programmatic access)
65
+
66
+ ```bash
67
+ # Install the package
35
68
  pip install local-deep-research
36
69
 
37
- # 2. Setup SearXNG for best results
70
+ # Setup SearXNG for best results
38
71
  docker pull searxng/searxng
39
72
  docker run -d -p 8080:8080 --name searxng searxng/searxng
40
- docker start searxng (required after every reboot)
41
73
 
42
- # 3. Install Ollama and pull a model
74
+ # Install Ollama and pull a model
43
75
  # Download from https://ollama.ai and run:
44
76
  ollama pull gemma3:12b
45
77
 
46
- # 4. Start the web interface
78
+ # Start the web interface
47
79
  python -m local_deep_research.web.app
48
80
  ```
49
81
 
50
- Then visit `http://127.0.0.1:5000` to start researching!
82
+ For programmatic use in your Python code:
51
83
 
52
- ### Alternative Installation Options
53
-
54
- **Windows Installer**: Download the [Windows Installer](https://github.com/LearningCircuit/local-deep-research/releases/download/v0.1.0/LocalDeepResearch_Setup.exe) for one-click setup.
84
+ ```python
85
+ from local_deep_research import quick_summary
55
86
 
56
- **Docker**: Run with Docker using:
57
- ```bash
58
- docker run --network=host \
59
- local-deep-research
87
+ results = quick_summary(
88
+ query="advances in fusion energy",
89
+ search_tool="auto",
90
+ iterations=1
91
+ )
92
+ print(results["summary"])
60
93
  ```
61
94
 
62
- **Command Line**: Alternatively, use the CLI version with:
63
- ```bash
64
- python -m local_deep_research.main
65
- ```
95
+ ### Additional Installation Options
96
+
97
+ **Windows**: Docker is the easiest option for Windows users. If preferred, a [Windows Installer](https://github.com/LearningCircuit/local-deep-research/releases/download/v0.1.0/LocalDeepResearch_Setup.exe) is also available.
98
+
66
99
 
67
100
  ## 🔍 Research Capabilities
68
101
 
@@ -200,15 +233,8 @@ Local Deep Research includes powerful Retrieval Augmented Generation (RAG) capab
200
233
  - CSV files
201
234
  - And more
202
235
 
203
- ### Using Document Collections
204
-
205
- You can use your documents in research via:
206
- - Auto-selection (when relevant to query)
207
- - Direct collection selection: `tool = "project_docs"`
208
- - All collections: `tool = "local_all"`
209
- - Query syntax: `collection:project_docs your query`
210
-
211
- This allows you to integrate your private knowledge base with web search results for comprehensive research that includes your own documents and data.
236
+ See [this page](https://github.com/LearningCircuit/local-deep-research/wiki/Configuring-Local-Search) for
237
+ configuration instructions.
212
238
 
213
239
  ## 🛠️ Advanced Configuration
214
240
 
@@ -57,7 +57,7 @@ dependencies = [
57
57
  "setuptools>=78.1.0",
58
58
  "flask-wtf>=1.2.2",
59
59
  ]
60
- version = "0.3.3"
60
+ version = "0.3.6"
61
61
 
62
62
  [project.license]
63
63
  file = "LICENSE"
@@ -0,0 +1 @@
1
+ __version__ = "0.3.6"
@@ -60,12 +60,6 @@ class ParallelSearchStrategy(BaseSearchStrategy):
60
60
  self.filter_reorder = filter_reorder
61
61
  self.filter_reindex = filter_reindex
62
62
 
63
- # Get max_filtered_results from database if not provided
64
- if cross_engine_max_results is None:
65
- cross_engine_max_results = get_db_setting(
66
- "search.cross_engine_max_results", 100
67
- )
68
-
69
63
  # Initialize the cross-engine filter
70
64
  self.cross_engine_filter = CrossEngineFilter(
71
65
  model=self.model,
@@ -45,12 +45,6 @@ class SourceBasedSearchStrategy(BaseSearchStrategy):
45
45
  self.filter_reorder = filter_reorder
46
46
  self.filter_reindex = filter_reindex
47
47
 
48
- # Get cross_engine_max_results from database if not provided
49
- if cross_engine_max_results is None:
50
- cross_engine_max_results = get_db_setting(
51
- "search.cross_engine_max_results", 100
52
- )
53
-
54
48
  # Initialize the cross-engine filter
55
49
  self.cross_engine_filter = CrossEngineFilter(
56
50
  model=self.model,
@@ -6,8 +6,6 @@ API module for programmatic access to Local Deep Research functionality.
6
6
  from .research_functions import (
7
7
  analyze_documents,
8
8
  generate_report,
9
- get_available_collections,
10
- get_available_search_engines,
11
9
  quick_summary,
12
10
  )
13
11
 
@@ -15,6 +13,4 @@ __all__ = [
15
13
  "quick_summary",
16
14
  "generate_report",
17
15
  "analyze_documents",
18
- "get_available_search_engines",
19
- "get_available_collections",
20
16
  ]
@@ -216,31 +216,51 @@ def get_llm(model_name=None, temperature=None, provider=None, openai_endpoint_ur
216
216
  )
217
217
  return wrap_llm_without_think_tags(llm)
218
218
 
219
+ # Update the llamacpp section in get_llm function
219
220
  elif provider == "llamacpp":
220
221
  # Import LlamaCpp
221
222
  from langchain_community.llms import LlamaCpp
222
223
 
223
- # Get LlamaCpp model path from settings
224
- model_path = get_db_setting("llm.llamacpp_model_path")
225
- if not model_path:
226
- logger.error("llamacpp_model_path not set in settings")
227
- raise ValueError("llamacpp_model_path not set in settings")
228
-
229
- # Get additional LlamaCpp parameters
230
- n_gpu_layers = get_db_setting("llm.llamacpp_n_gpu_layers", 1)
231
- n_batch = get_db_setting("llm.llamacpp_n_batch", 512)
232
- f16_kv = get_db_setting("llm.llamacpp_f16_kv", True)
233
-
234
- # Create LlamaCpp instance
235
- llm = LlamaCpp(
236
- model_path=model_path,
237
- temperature=temperature,
238
- max_tokens=get_db_setting("llm.max_tokens", 30000),
239
- n_gpu_layers=n_gpu_layers,
240
- n_batch=n_batch,
241
- f16_kv=f16_kv,
242
- verbose=True,
243
- )
224
+ # Get LlamaCpp connection mode from settings
225
+ connection_mode = get_db_setting("llm.llamacpp_connection_mode", "local")
226
+
227
+ if connection_mode == "http":
228
+ # Use HTTP client mode
229
+ from langchain_community.llms.llamacpp_client import LlamaCppClient
230
+
231
+ server_url = get_db_setting(
232
+ "llm.llamacpp_server_url", "http://localhost:8000"
233
+ )
234
+
235
+ llm = LlamaCppClient(
236
+ server_url=server_url,
237
+ temperature=temperature,
238
+ max_tokens=get_db_setting("llm.max_tokens", 30000),
239
+ )
240
+ else:
241
+ # Use direct model loading (existing code)
242
+ # Get LlamaCpp model path from settings
243
+ model_path = get_db_setting("llm.llamacpp_model_path")
244
+ if not model_path:
245
+ logger.error("llamacpp_model_path not set in settings")
246
+ raise ValueError("llamacpp_model_path not set in settings")
247
+
248
+ # Get additional LlamaCpp parameters
249
+ n_gpu_layers = get_db_setting("llm.llamacpp_n_gpu_layers", 1)
250
+ n_batch = get_db_setting("llm.llamacpp_n_batch", 512)
251
+ f16_kv = get_db_setting("llm.llamacpp_f16_kv", True)
252
+
253
+ # Create LlamaCpp instance
254
+ llm = LlamaCpp(
255
+ model_path=model_path,
256
+ temperature=temperature,
257
+ max_tokens=get_db_setting("llm.max_tokens", 30000),
258
+ n_gpu_layers=n_gpu_layers,
259
+ n_batch=n_batch,
260
+ f16_kv=f16_kv,
261
+ verbose=True,
262
+ )
263
+
244
264
  return wrap_llm_without_think_tags(llm)
245
265
 
246
266
  else:
@@ -1,18 +1,4 @@
1
1
  {
2
- "app.version": {
3
- "category": null,
4
- "description": "Version of the app this database is associated with.",
5
- "editable": false,
6
- "max_value": null,
7
- "min_value": null,
8
- "name": "App Version",
9
- "options": null,
10
- "step": null,
11
- "type": "APP",
12
- "ui_element": "text",
13
- "value": "0.3.3",
14
- "visible": false
15
- },
16
2
  "app.debug": {
17
3
  "category": "app_interface",
18
4
  "description": "Enable debug mode for the web application",
@@ -3992,5 +3978,42 @@
3992
3978
  "ui_element": "checkbox",
3993
3979
  "value": false,
3994
3980
  "visible": true
3981
+ },
3982
+ "llm.llamacpp_connection_mode": {
3983
+ "category": "llm_parameters",
3984
+ "description": "Connection mode for LlamaCpp: 'local' for direct model loading or 'http' for using a remote server",
3985
+ "editable": true,
3986
+ "max_value": null,
3987
+ "min_value": null,
3988
+ "name": "LlamaCpp Connection Mode",
3989
+ "options": [
3990
+ {
3991
+ "label": "Local Model",
3992
+ "value": "local"
3993
+ },
3994
+ {
3995
+ "label": "HTTP Server",
3996
+ "value": "http"
3997
+ }
3998
+ ],
3999
+ "step": null,
4000
+ "type": "LLM",
4001
+ "ui_element": "select",
4002
+ "value": "local",
4003
+ "visible": true
4004
+ },
4005
+ "llm.llamacpp_server_url": {
4006
+ "category": "llm_parameters",
4007
+ "description": "URL of the LlamaCpp HTTP server (only used when connection mode is 'http')",
4008
+ "editable": true,
4009
+ "max_value": null,
4010
+ "min_value": null,
4011
+ "name": "LlamaCpp Server URL",
4012
+ "options": null,
4013
+ "step": null,
4014
+ "type": "LLM",
4015
+ "ui_element": "text",
4016
+ "value": "http://localhost:8000",
4017
+ "visible": true
3995
4018
  }
3996
4019
  }
@@ -13,7 +13,7 @@ def import_default_settings_file(db_session):
13
13
  Imports all settings from the default settings file to the DB.
14
14
  """
15
15
  settings_mgr = SettingsManager(db_session)
16
- if settings_mgr.db_version_matches_defaults():
16
+ if settings_mgr.db_version_matches_package():
17
17
  # We probably shouldn't bother loading settings if the version didn't
18
18
  # change.
19
19
  return
@@ -26,6 +26,9 @@ def import_default_settings_file(db_session):
26
26
  # old versions of the settings.
27
27
  settings_mgr.load_from_defaults_file(overwrite=False, delete_extra=True)
28
28
  logger.info("Successfully imported settings from files")
29
+
30
+ # Update the saved version.
31
+ settings_mgr.update_db_version()
29
32
  except Exception as e:
30
33
  logger.error("Error importing settings from files: %s", e)
31
34
 
@@ -10,7 +10,6 @@ from flask import (
10
10
  current_app,
11
11
  jsonify,
12
12
  redirect,
13
- render_template,
14
13
  request,
15
14
  send_from_directory,
16
15
  url_for,
@@ -18,6 +17,7 @@ from flask import (
18
17
 
19
18
  from ..models.database import add_log_to_db, calculate_duration, get_db_connection
20
19
  from ..services.research_service import run_research_process, start_research_process
20
+ from ..utils.templates import render_template_with_defaults
21
21
 
22
22
  # Initialize logger
23
23
  logger = logging.getLogger(__name__)
@@ -48,7 +48,7 @@ def get_globals():
48
48
  # Route for index page - redirection
49
49
  @research_bp.route("/")
50
50
  def index():
51
- return render_template("pages/research.html")
51
+ return render_template_with_defaults("pages/research.html")
52
52
 
53
53
 
54
54
  # Add the missing static file serving route
@@ -70,62 +70,62 @@ def redirect_static(path):
70
70
  @research_bp.route("/progress/<int:research_id>")
71
71
  def progress_page(research_id):
72
72
  """Render the research progress page"""
73
- return render_template("pages/progress.html")
73
+ return render_template_with_defaults("pages/progress.html")
74
74
 
75
75
 
76
76
  @research_bp.route("/details/<int:research_id>")
77
77
  def research_details_page(research_id):
78
78
  """Render the research details page"""
79
- return render_template("pages/details.html")
79
+ return render_template_with_defaults("pages/details.html")
80
80
 
81
81
 
82
82
  @research_bp.route("/results/<int:research_id>")
83
83
  def results_page(research_id):
84
84
  """Render the research results page"""
85
- return render_template("pages/results.html")
85
+ return render_template_with_defaults("pages/results.html")
86
86
 
87
87
 
88
88
  @research_bp.route("/history")
89
89
  def history_page():
90
90
  """Render the history page"""
91
- return render_template("pages/history.html")
91
+ return render_template_with_defaults("pages/history.html")
92
92
 
93
93
 
94
94
  # Add missing settings routes
95
95
  @research_bp.route("/settings", methods=["GET"])
96
96
  def settings_page():
97
97
  """Render the settings page"""
98
- return render_template("settings_dashboard.html")
98
+ return render_template_with_defaults("settings_dashboard.html")
99
99
 
100
100
 
101
101
  @research_bp.route("/settings/main", methods=["GET"])
102
102
  def main_config_page():
103
103
  """Render the main settings config page"""
104
- return render_template("main_config.html")
104
+ return render_template_with_defaults("main_config.html")
105
105
 
106
106
 
107
107
  @research_bp.route("/settings/collections", methods=["GET"])
108
108
  def collections_config_page():
109
109
  """Render the collections config page"""
110
- return render_template("collections_config.html")
110
+ return render_template_with_defaults("collections_config.html")
111
111
 
112
112
 
113
113
  @research_bp.route("/settings/api_keys", methods=["GET"])
114
114
  def api_keys_config_page():
115
115
  """Render the API keys config page"""
116
- return render_template("api_keys_config.html")
116
+ return render_template_with_defaults("api_keys_config.html")
117
117
 
118
118
 
119
119
  @research_bp.route("/settings/search_engines", methods=["GET"])
120
120
  def search_engines_config_page():
121
121
  """Render the search engines config page"""
122
- return render_template("search_engines_config.html")
122
+ return render_template_with_defaults("search_engines_config.html")
123
123
 
124
124
 
125
125
  @research_bp.route("/settings/llm", methods=["GET"])
126
126
  def llm_config_page():
127
127
  """Render the LLM config page"""
128
- return render_template("llm_config.html")
128
+ return render_template_with_defaults("llm_config.html")
129
129
 
130
130
 
131
131
  @research_bp.route("/api/start_research", methods=["POST"])
@@ -12,7 +12,6 @@ from flask import (
12
12
  flash,
13
13
  jsonify,
14
14
  redirect,
15
- render_template,
16
15
  request,
17
16
  url_for,
18
17
  )
@@ -27,6 +26,7 @@ from ..services.settings_service import (
27
26
  get_settings_manager,
28
27
  set_setting,
29
28
  )
29
+ from ..utils.templates import render_template_with_defaults
30
30
 
31
31
  # Initialize logger
32
32
  logger = logging.getLogger(__name__)
@@ -88,7 +88,7 @@ def validate_setting(setting: Setting, value: Any) -> Tuple[bool, Optional[str]]
88
88
  @settings_bp.route("/", methods=["GET"])
89
89
  def settings_page():
90
90
  """Main settings dashboard with links to specialized config pages"""
91
- return render_template("settings_dashboard.html")
91
+ return render_template_with_defaults("settings_dashboard.html")
92
92
 
93
93
 
94
94
  @settings_bp.route("/save_all_settings", methods=["POST"])
@@ -528,7 +528,9 @@ def run_research_process(
528
528
  )[:50]
529
529
  safe_query = safe_query.replace(" ", "_").lower()
530
530
  report_path = os.path.join(
531
- OUTPUT_DIR, f"quick_summary_{safe_query}.md"
531
+ OUTPUT_DIR,
532
+ f"quick_summary_{safe_query}_"
533
+ f"{datetime.now().isoformat()}.md",
532
534
  )
533
535
 
534
536
  # Send progress update for writing to file
@@ -639,7 +641,10 @@ def run_research_process(
639
641
  x for x in query if x.isalnum() or x in [" ", "-", "_"]
640
642
  )[:50]
641
643
  safe_query = safe_query.replace(" ", "_").lower()
642
- report_path = os.path.join(OUTPUT_DIR, f"detailed_report_{safe_query}.md")
644
+ report_path = os.path.join(
645
+ OUTPUT_DIR,
646
+ f"detailed_report_{safe_query}_{datetime.now().isoformat()}.md",
647
+ )
643
648
 
644
649
  with open(report_path, "w", encoding="utf-8") as f:
645
650
  f.write(final_report["content"])
@@ -9,6 +9,7 @@ from sqlalchemy.exc import SQLAlchemyError
9
9
  from sqlalchemy.orm import Session
10
10
 
11
11
  from ... import defaults
12
+ from ...__version__ import __version__ as package_version
12
13
  from ..database.models import Setting, SettingType
13
14
  from ..models.settings import (
14
15
  AppSetting,
@@ -331,21 +332,41 @@ class SettingsManager:
331
332
  """
332
333
  self.import_settings(self.default_settings, commit=commit, **kwargs)
333
334
 
334
- def db_version_matches_defaults(self) -> bool:
335
+ def db_version_matches_package(self) -> bool:
335
336
  """
336
337
  Returns:
337
- True if the version saved in the DB matches that in the default
338
- settings file.
338
+ True if the version saved in the DB matches the package version.
339
339
 
340
340
  """
341
341
  db_version = self.get_setting("app.version")
342
- default_version = self.default_settings["app.version"]["value"]
343
342
  logger.debug(
344
- f"App version saved in DB is {db_version}, have default "
345
- f"settings from version {default_version}."
343
+ f"App version saved in DB is {db_version}, have package "
344
+ f"settings from version {package_version}."
346
345
  )
347
346
 
348
- return db_version == default_version
347
+ return db_version == package_version
348
+
349
+ def update_db_version(self) -> None:
350
+ """
351
+ Updates the version saved in the DB based on the package version.
352
+
353
+ """
354
+ logger.debug(f"Updating saved DB version to {package_version}.")
355
+
356
+ self.delete_setting("app.version", commit=False)
357
+ version = Setting(
358
+ key="app.version",
359
+ value=package_version,
360
+ description="Version of the app this database is associated with.",
361
+ editable=False,
362
+ name="App Version",
363
+ type=SettingType.APP,
364
+ ui_element="text",
365
+ visible=False,
366
+ )
367
+
368
+ self.db_session.add(version)
369
+ self.db_session.commit()
349
370
 
350
371
  @classmethod
351
372
  def get_instance(cls, db_session: Optional[Session] = None) -> "SettingsManager":
@@ -16,6 +16,6 @@
16
16
  </ul>
17
17
  </nav>
18
18
  <div class="sidebar-footer">
19
- <p>v0.2.0 | <i class="fas fa-brain"></i></p>
19
+ <p>{{ version }} | <i class="fas fa-brain"></i></p>
20
20
  </div>
21
21
  </aside>
@@ -0,0 +1,24 @@
1
+ """
2
+ Utilities for rendering templates.
3
+ """
4
+
5
+ from typing import Any
6
+
7
+ from flask import render_template
8
+
9
+ from ...__version__ import __version__
10
+
11
+
12
+ def render_template_with_defaults(*args: Any, **kwargs: Any) -> str:
13
+ """
14
+ Renders templates with some default values filled.
15
+
16
+ Args:
17
+ *args: Will be passed to the normal `render_template`.
18
+ **kwargs: Will be passed to the normal `render_template`.
19
+
20
+ Returns:
21
+ The rendered template.
22
+
23
+ """
24
+ return render_template(*args, version=__version__, **kwargs)
@@ -1 +0,0 @@
1
- __version__ = "0.3.3"