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.
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/PKG-INFO +28 -20
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/README.md +27 -19
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/pyproject.toml +10 -1
- local_deep_research-0.3.11/src/local_deep_research/__version__.py +1 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/defaults/default_settings.json +17 -4
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/services/research_service.py +2 -2
- {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
- {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
- local_deep_research-0.3.9/src/local_deep_research/__main__.py +0 -16
- local_deep_research-0.3.9/src/local_deep_research/__version__.py +0 -1
- local_deep_research-0.3.9/src/local_deep_research/main.py +0 -215
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/LICENSE +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/__init__.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/__init__.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/filters/__init__.py +0 -0
- {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
- {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
- {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
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/findings/repository.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/knowledge/__init__.py +0 -0
- {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
- {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
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/questions/__init__.py +0 -0
- {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
- {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
- {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
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/repositories/__init__.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/strategies/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/advanced_search_system/tools/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/api/__init__.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/api/research_functions.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/app.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/citation_handler.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/config/__init__.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/config/llm_config.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/config/search_config.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/defaults/.env.template +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/defaults/__init__.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/migrate_db.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/report_generator.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/search_system.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/setup_data_dir.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/test_migration.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/utilities/__init__.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/utilities/db_utils.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/utilities/enums.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/utilities/llm_utils.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/utilities/search_utilities.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/utilities/setup_utils.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/__init__.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/app.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/app_factory.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/database/README.md +0 -0
- {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
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/database/migrations.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/database/models.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/database/schema_upgrade.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/models/database.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/models/settings.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/routes/api_routes.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/routes/history_routes.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/routes/research_routes.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/routes/settings_routes.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/services/resource_service.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/services/settings_manager.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/services/settings_service.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/services/socket_service.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/css/custom_dropdown.css +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/css/settings.css +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/css/styles.css +0 -0
- {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
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/components/detail.js +0 -0
- {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
- {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
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/components/history.js +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/components/logpanel.js +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/components/progress.js +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/components/research.js +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/components/results.js +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/components/settings.js +0 -0
- {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
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/main.js +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/research_form.js +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/services/api.js +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/services/audio.js +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/services/formatting.js +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/services/pdf.js +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/services/socket.js +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/js/services/ui.js +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/sounds/README.md +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/sounds/error.mp3 +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/static/sounds/success.mp3 +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/base.html +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/components/custom_dropdown.html +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/components/log_panel.html +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/components/mobile_nav.html +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/components/settings_form.html +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/components/sidebar.html +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/pages/details.html +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/pages/history.html +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/pages/progress.html +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/pages/research.html +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/pages/results.html +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/templates/settings_dashboard.html +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/utils/__init__.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/utils/formatters.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/utils/templates.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/__init__.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web_search_engines/engines/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/tests/__init__.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/tests/download_stuff_for_local_test.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/tests/fix_tests/README.md +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/tests/fix_tests/test_duplicate_links_fix.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/tests/searxng/test_searxng_instance.py +0 -0
- {local_deep_research-0.3.9 → local_deep_research-0.3.11}/tests/searxng/test_searxng_integration.py +0 -0
- {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.
|
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
|
-
|
113
|
-
|
114
|
-
|
123
|
+
git clone https://github.com/LearningCircuit/local-deep-research.git
|
124
|
+
cd local-deep-research
|
125
|
+
```
|
115
126
|
|
116
|
-
|
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
|
-
|
121
|
-
|
129
|
+
In the LDR repository, run the following command
|
130
|
+
to do generate the compose file:
|
122
131
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
# docker exec -it ollama ollama pull gemma3:12b
|
132
|
+
```bash
|
133
|
+
cookiecutter cookiecutter-docker/
|
134
|
+
```
|
127
135
|
|
128
|
-
|
129
|
-
docker
|
130
|
-
|
131
|
-
|
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
|
-
|
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
|
-
|
42
|
-
|
43
|
-
|
52
|
+
git clone https://github.com/LearningCircuit/local-deep-research.git
|
53
|
+
cd local-deep-research
|
54
|
+
```
|
44
55
|
|
45
|
-
|
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
|
-
|
50
|
-
|
58
|
+
In the LDR repository, run the following command
|
59
|
+
to do generate the compose file:
|
51
60
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
# docker exec -it ollama ollama pull gemma3:12b
|
61
|
+
```bash
|
62
|
+
cookiecutter cookiecutter-docker/
|
63
|
+
```
|
56
64
|
|
57
|
-
|
58
|
-
docker
|
59
|
-
|
60
|
-
|
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
|
-
|
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.
|
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": "
|
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":
|
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": "
|
3041
|
-
"value":
|
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().
|
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().
|
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:
|
@@ -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:
|
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
|
-
|
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()
|
File without changes
|
{local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/api/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/citation_handler.py
RENAMED
File without changes
|
{local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/config/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/migrate_db.py
RENAMED
File without changes
|
{local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/report_generator.py
RENAMED
File without changes
|
{local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/search_system.py
RENAMED
File without changes
|
{local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/setup_data_dir.py
RENAMED
File without changes
|
{local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/test_migration.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/utilities/enums.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/__init__.py
RENAMED
File without changes
|
File without changes
|
{local_deep_research-0.3.9 → local_deep_research-0.3.11}/src/local_deep_research/web/app_factory.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{local_deep_research-0.3.9 → local_deep_research-0.3.11}/tests/download_stuff_for_local_test.py
RENAMED
File without changes
|
File without changes
|
{local_deep_research-0.3.9 → local_deep_research-0.3.11}/tests/fix_tests/test_duplicate_links_fix.py
RENAMED
File without changes
|
{local_deep_research-0.3.9 → local_deep_research-0.3.11}/tests/searxng/test_searxng_instance.py
RENAMED
File without changes
|
{local_deep_research-0.3.9 → local_deep_research-0.3.11}/tests/searxng/test_searxng_integration.py
RENAMED
File without changes
|
File without changes
|