local-deep-research 0.5.0__tar.gz → 0.5.2__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.5.0 → local_deep_research-0.5.2}/PKG-INFO +1 -1
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/pyproject.toml +1 -1
- local_deep_research-0.5.2/src/local_deep_research/__version__.py +1 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/database/migrations.py +16 -1
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/database/models.py +31 -31
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/models/database.py +13 -23
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/routes/research_routes.py +65 -113
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/services/research_service.py +112 -158
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/api_tests/test_api_basic.py +8 -65
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/api_tests/test_rest_api.py +0 -61
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/api_tests/test_rest_api_simple.py +9 -73
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/feature_tests/test_custom_context.py +2 -2
- local_deep_research-0.5.0/src/local_deep_research/__version__.py +0 -1
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/LICENSE +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/README.md +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/answer_decoding/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/answer_decoding/browsecomp_answer_decoder.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidate_exploration/README.md +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidate_exploration/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidate_exploration/adaptive_explorer.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidate_exploration/base_explorer.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidate_exploration/constraint_guided_explorer.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidate_exploration/diversity_explorer.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidate_exploration/parallel_explorer.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidate_exploration/progressive_explorer.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidates/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidates/base_candidate.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/README.md +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/base_constraint_checker.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/constraint_checker.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/constraint_satisfaction_tracker.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/dual_confidence_checker.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/evidence_analyzer.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/intelligent_constraint_relaxer.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/rejection_engine.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/strict_checker.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/threshold_checker.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraints/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraints/base_constraint.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraints/constraint_analyzer.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/evidence/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/evidence/base_evidence.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/evidence/evaluator.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/evidence/requirements.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/filters/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/filters/base_filter.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/filters/cross_engine_filter.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/findings/base_findings.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/findings/repository.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/knowledge/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/knowledge/base_knowledge.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/knowledge/standard_knowledge.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/query_generation/adaptive_query_generator.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/questions/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/questions/atomic_fact_question.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/questions/base_question.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/questions/browsecomp_question.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/questions/decomposition_question.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/questions/entity_aware_question.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/questions/standard_question.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/repositories/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/search_optimization/cross_constraint_manager.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/source_management/diversity_manager.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/adaptive_decomposition_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/base_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/browsecomp_entity_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/browsecomp_optimized_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/concurrent_dual_confidence_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/constrained_search_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/constraint_parallel_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/direct_search_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/dual_confidence_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/dual_confidence_with_rejection.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/early_stop_constrained_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/entity_aware_source_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/evidence_based_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/evidence_based_strategy_v2.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/focused_iteration_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/improved_evidence_based_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/iterative_reasoning_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/iterdrag_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/llm_driven_modular_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/modular_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/parallel_constrained_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/parallel_search_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/rapid_search_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/recursive_decomposition_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/smart_decomposition_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/smart_query_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/source_based_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/standard_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/tools/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/tools/base_tool.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/tools/knowledge_tools/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/tools/question_tools/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/tools/search_tools/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/api/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/api/benchmark_functions.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/api/research_functions.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/README.md +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/benchmark_functions.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/cli/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/cli/benchmark_commands.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/cli.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/comparison/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/comparison/evaluator.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/datasets/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/datasets/base.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/datasets/browsecomp.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/datasets/custom_dataset_template.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/datasets/simpleqa.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/datasets/utils.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/datasets.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/efficiency/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/efficiency/resource_monitor.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/efficiency/speed_profiler.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/evaluators/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/evaluators/base.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/evaluators/browsecomp.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/evaluators/composite.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/evaluators/simpleqa.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/graders.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/metrics/README.md +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/metrics/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/metrics/calculation.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/metrics/reporting.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/metrics/visualization.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/metrics.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/optimization/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/optimization/api.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/optimization/metrics.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/optimization/optuna_optimizer.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/runners.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/templates.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/citation_handler.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/citation_handlers/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/citation_handlers/base_citation_handler.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/citation_handlers/forced_answer_citation_handler.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/citation_handlers/precision_extraction_handler.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/citation_handlers/standard_citation_handler.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/config/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/config/llm_config.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/config/search_config.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/defaults/.env.template +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/defaults/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/defaults/default_settings.json +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/database.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/db_models.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/migrate_add_provider_to_token_usage.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/migrate_call_stack_tracking.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/migrate_enhanced_tracking.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/migrate_research_ratings.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/models.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/pricing/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/pricing/cost_calculator.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/pricing/pricing_cache.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/pricing/pricing_fetcher.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/query_utils.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/search_tracker.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/token_counter.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/migrate_db.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/report_generator.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/search_system.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/setup_data_dir.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/test_migration.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/db_utils.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/enums.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/es_utils.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/llm_utils.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/log_utils.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/search_cache.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/search_utilities.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/setup_utils.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/threading_utils.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/url_utils.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/api.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/app.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/app_factory.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/database/README.md +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/database/migrate_to_ldr_db.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/database/schema_upgrade.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/models/settings.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/routes/api_routes.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/routes/benchmark_routes.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/routes/globals.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/routes/history_routes.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/routes/metrics_routes.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/routes/settings_routes.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/services/resource_service.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/services/settings_manager.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/services/settings_service.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/services/socket_service.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/css/custom_dropdown.css +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/css/settings.css +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/css/styles.css +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/custom_dropdown.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/detail.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/details.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/fallback/formatting.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/fallback/ui.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/history.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/logpanel.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/progress.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/research.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/results.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/settings.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/settings_sync.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/main.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/research_form.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/services/api.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/services/audio.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/services/formatting.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/services/keyboard.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/services/pdf.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/services/socket.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/services/ui.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/sounds/README.md +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/sounds/error.mp3 +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/sounds/success.mp3 +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/base.html +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/components/custom_dropdown.html +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/components/log_panel.html +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/components/mobile_nav.html +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/components/settings_form.html +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/components/sidebar.html +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/pages/cost_analytics.html +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/pages/details.html +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/pages/history.html +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/pages/metrics.html +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/pages/progress.html +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/pages/research.html +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/pages/results.html +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/pages/star_reviews.html +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/settings_dashboard.html +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/utils/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/utils/formatters.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/utils/templates.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/default_search_engines.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/full_search.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/meta_search_engine.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_arxiv.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_brave.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_ddg.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_elasticsearch.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_github.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_google_pse.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_guardian.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_local.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_local_all.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_pubmed.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_searxng.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_serpapi.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_wayback.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_wikipedia.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/search_engine_base.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/search_engine_factory.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/search_engines_config.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/CI_INTEGRATION.md +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/README.md +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/TESTING_COMPARISON.md +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/TESTING_PROPOSAL.md +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/api_tests/README.md +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/api_tests/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/api_tests/test_api_pytest.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/conftest.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/debug_url_utils.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/download_stuff_for_local.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/feature_tests/IMPLEMENTATION_GUIDE_241.md +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/feature_tests/README.md +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/feature_tests/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/fix_tests/README.md +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/fix_tests/test_duplicate_links_fix.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/fixtures/README.md +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/fixtures/search_engine_mocks.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/health_check/README.md +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/health_check/run_quick_health_check.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/health_check/test_endpoints_health.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/health_check/test_endpoints_health.sh +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/mock_fixtures.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/mock_llm_config.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/mock_modules.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/run_all_tests.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/search_engines/test_wikipedia_search.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/searxng/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/searxng/test_searxng.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/strategies/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/strategies/compare_strategies_visual.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/strategies/test_adaptive_strategy.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/strategies/test_iterative_reasoning.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/strategies/test_search_system_iterative.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_ci_config.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_citation_handler.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_google_pse.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_report_generator.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_research_strategy_orm.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_search_engines_enhanced.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_search_system.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_settings_manager.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_url_utils.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_url_utils_simple.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_utils.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_wikipedia_url_security.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/README.md +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/__init__.py +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/run_all_tests.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_charts.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_cost_analytics.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_metrics.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_metrics_browser.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_metrics_chart.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_metrics_charts.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_metrics_only.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_network_requests.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_pages_browser.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_research_results.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_settings_errors.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_settings_page.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_settings_save.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_star_reviews.js +0 -0
- {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_star_reviews_debug.js +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: local-deep-research
|
3
|
-
Version: 0.5.
|
3
|
+
Version: 0.5.2
|
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
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.5.2"
|
@@ -2,7 +2,14 @@ from loguru import logger
|
|
2
2
|
from sqlalchemy import inspect
|
3
3
|
|
4
4
|
from ..services.settings_manager import SettingsManager
|
5
|
-
from .models import
|
5
|
+
from .models import (
|
6
|
+
Base,
|
7
|
+
Journal,
|
8
|
+
Setting,
|
9
|
+
ResearchLog,
|
10
|
+
Research,
|
11
|
+
ResearchHistory,
|
12
|
+
)
|
6
13
|
|
7
14
|
|
8
15
|
def import_default_settings_file(db_session):
|
@@ -52,6 +59,14 @@ def run_migrations(engine, db_session=None):
|
|
52
59
|
logger.info("Creating research logs table.")
|
53
60
|
Base.metadata.create_all(engine, tables=[ResearchLog.__table__])
|
54
61
|
|
62
|
+
if not inspector.has_table(Research.__tablename__):
|
63
|
+
logger.info("Creating research table.")
|
64
|
+
Base.metadata.create_all(engine, tables=[Research.__table__])
|
65
|
+
|
66
|
+
if not inspector.has_table(ResearchHistory.__tablename__):
|
67
|
+
logger.info("Creating research table.")
|
68
|
+
Base.metadata.create_all(engine, tables=[ResearchHistory.__table__])
|
69
|
+
|
55
70
|
# Import existing settings from files
|
56
71
|
if db_session:
|
57
72
|
import_default_settings_file(db_session)
|
@@ -34,6 +34,37 @@ class ResearchStatus(enum.Enum):
|
|
34
34
|
CANCELLED = "cancelled"
|
35
35
|
|
36
36
|
|
37
|
+
class ResearchHistory(Base):
|
38
|
+
"""Represents the research table."""
|
39
|
+
|
40
|
+
__tablename__ = "research_history"
|
41
|
+
|
42
|
+
# Unique identifier for each record.
|
43
|
+
id = Column(Integer, primary_key=True, autoincrement=True)
|
44
|
+
# The search query.
|
45
|
+
query = Column(Text, nullable=False)
|
46
|
+
# The mode of research (e.g., 'quick_summary', 'detailed_report').
|
47
|
+
mode = Column(Text, nullable=False)
|
48
|
+
# Current status of the research.
|
49
|
+
status = Column(Text, nullable=False)
|
50
|
+
# The timestamp when the research started.
|
51
|
+
created_at = Column(Text, nullable=False)
|
52
|
+
# The timestamp when the research was completed.
|
53
|
+
completed_at = Column(Text)
|
54
|
+
# Duration of the research in seconds.
|
55
|
+
duration_seconds = Column(Integer)
|
56
|
+
# Path to the generated report.
|
57
|
+
report_path = Column(Text)
|
58
|
+
# Additional metadata about the research.
|
59
|
+
research_meta = Column(JSON)
|
60
|
+
# Latest progress log message.
|
61
|
+
progress_log = Column(JSON)
|
62
|
+
# Current progress of the research (as a percentage).
|
63
|
+
progress = Column(Integer)
|
64
|
+
# Title of the research report.
|
65
|
+
title = Column(Text)
|
66
|
+
|
67
|
+
|
37
68
|
class Research(Base):
|
38
69
|
__tablename__ = "research"
|
39
70
|
|
@@ -54,14 +85,6 @@ class Research(Base):
|
|
54
85
|
end_time = Column(DateTime, nullable=True)
|
55
86
|
error_message = Column(Text, nullable=True)
|
56
87
|
|
57
|
-
# Relationships
|
58
|
-
report = relationship(
|
59
|
-
"ResearchReport",
|
60
|
-
back_populates="research",
|
61
|
-
uselist=False,
|
62
|
-
cascade="all, delete-orphan",
|
63
|
-
)
|
64
|
-
|
65
88
|
|
66
89
|
class ResearchLog(Base):
|
67
90
|
__tablename__ = "app_logs"
|
@@ -88,29 +111,6 @@ class ResearchLog(Base):
|
|
88
111
|
)
|
89
112
|
|
90
113
|
|
91
|
-
class ResearchReport(Base):
|
92
|
-
__tablename__ = "research_report"
|
93
|
-
|
94
|
-
id = Column(Integer, primary_key=True, index=True)
|
95
|
-
research_id = Column(
|
96
|
-
Integer,
|
97
|
-
ForeignKey("research.id", ondelete="CASCADE"),
|
98
|
-
nullable=False,
|
99
|
-
unique=True,
|
100
|
-
)
|
101
|
-
content = Column(Text, nullable=True)
|
102
|
-
created_at = Column(DateTime, server_default=func.now(), nullable=False)
|
103
|
-
updated_at = Column(
|
104
|
-
DateTime, server_default=func.now(), onupdate=func.now(), nullable=False
|
105
|
-
)
|
106
|
-
report_metadata = Column(
|
107
|
-
JSON, nullable=True
|
108
|
-
) # Additional metadata about the report
|
109
|
-
|
110
|
-
# Relationships
|
111
|
-
research = relationship("Research", back_populates="report")
|
112
|
-
|
113
|
-
|
114
114
|
class SettingType(enum.Enum):
|
115
115
|
APP = "app"
|
116
116
|
LLM = "llm"
|
@@ -43,26 +43,6 @@ def init_db():
|
|
43
43
|
conn = get_db_connection()
|
44
44
|
cursor = conn.cursor()
|
45
45
|
|
46
|
-
# Create the table if it doesn't exist
|
47
|
-
cursor.execute(
|
48
|
-
"""
|
49
|
-
CREATE TABLE IF NOT EXISTS research_history (
|
50
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
51
|
-
query TEXT NOT NULL,
|
52
|
-
mode TEXT NOT NULL,
|
53
|
-
status TEXT NOT NULL,
|
54
|
-
created_at TEXT NOT NULL,
|
55
|
-
completed_at TEXT,
|
56
|
-
duration_seconds INTEGER,
|
57
|
-
report_path TEXT,
|
58
|
-
metadata TEXT,
|
59
|
-
progress_log TEXT,
|
60
|
-
progress INTEGER,
|
61
|
-
title TEXT
|
62
|
-
)
|
63
|
-
"""
|
64
|
-
)
|
65
|
-
|
66
46
|
# Create a dedicated table for research logs
|
67
47
|
cursor.execute(
|
68
48
|
"""
|
@@ -101,7 +81,7 @@ def init_db():
|
|
101
81
|
columns = [column[1] for column in cursor.fetchall()]
|
102
82
|
|
103
83
|
if "duration_seconds" not in columns:
|
104
|
-
|
84
|
+
logger.info(
|
105
85
|
"Adding missing 'duration_seconds' column to research_history table"
|
106
86
|
)
|
107
87
|
cursor.execute(
|
@@ -110,16 +90,26 @@ def init_db():
|
|
110
90
|
|
111
91
|
# Check if the progress column exists, add it if missing
|
112
92
|
if "progress" not in columns:
|
113
|
-
|
93
|
+
logger.info(
|
94
|
+
"Adding missing 'progress' column to research_history table"
|
95
|
+
)
|
114
96
|
cursor.execute(
|
115
97
|
"ALTER TABLE research_history ADD COLUMN progress INTEGER"
|
116
98
|
)
|
117
99
|
|
118
100
|
# Check if the title column exists, add it if missing
|
119
101
|
if "title" not in columns:
|
120
|
-
|
102
|
+
logger.info("Adding missing 'title' column to research_history table")
|
121
103
|
cursor.execute("ALTER TABLE research_history ADD COLUMN title TEXT")
|
122
104
|
|
105
|
+
# Check if the metadata column exists, and rename it to "research_meta"
|
106
|
+
# if it does.
|
107
|
+
if "metadata" in columns:
|
108
|
+
logger.info("Renaming 'metadata' column to 'research_meta'")
|
109
|
+
cursor.execute(
|
110
|
+
"ALTER TABLE research_history RENAME COLUMN metadata TO research_meta"
|
111
|
+
)
|
112
|
+
|
123
113
|
# Enable foreign key support
|
124
114
|
cursor.execute("PRAGMA foreign_keys = ON")
|
125
115
|
|
@@ -15,13 +15,18 @@ from flask import (
|
|
15
15
|
)
|
16
16
|
from loguru import logger
|
17
17
|
|
18
|
-
from ..models.database import
|
18
|
+
from ..models.database import (
|
19
|
+
calculate_duration,
|
20
|
+
get_db_connection,
|
21
|
+
)
|
19
22
|
from ..services.research_service import (
|
20
23
|
run_research_process,
|
21
24
|
start_research_process,
|
22
25
|
)
|
23
26
|
from ..utils.templates import render_template_with_defaults
|
24
27
|
from .globals import active_research, termination_flags
|
28
|
+
from ..database.models import ResearchHistory, ResearchLog
|
29
|
+
from ...utilities.db_utils import get_db_session
|
25
30
|
|
26
31
|
# Create a Blueprint for the research application
|
27
32
|
research_bp = Blueprint("research", __name__, url_prefix="/research")
|
@@ -220,20 +225,19 @@ def start_research():
|
|
220
225
|
"questions_per_iteration": questions_per_iteration,
|
221
226
|
}
|
222
227
|
|
223
|
-
|
224
|
-
|
225
|
-
(
|
226
|
-
query,
|
227
|
-
mode,
|
228
|
-
"in_progress",
|
229
|
-
created_at,
|
230
|
-
|
231
|
-
|
232
|
-
)
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
conn.close()
|
228
|
+
db_session = get_db_session()
|
229
|
+
with db_session:
|
230
|
+
research = ResearchHistory(
|
231
|
+
query=query,
|
232
|
+
mode=mode,
|
233
|
+
status="in_progress",
|
234
|
+
created_at=created_at,
|
235
|
+
progress_log=[{"time": created_at, "progress": 0}],
|
236
|
+
research_meta=research_settings,
|
237
|
+
)
|
238
|
+
db_session.add(research)
|
239
|
+
db_session.commit()
|
240
|
+
research_id = research.id
|
237
241
|
|
238
242
|
# Start the research process with the selected parameters
|
239
243
|
research_thread = start_research_process(
|
@@ -612,59 +616,30 @@ def get_history():
|
|
612
616
|
|
613
617
|
@research_bp.route("/api/research/<int:research_id>")
|
614
618
|
def get_research_details(research_id):
|
615
|
-
"""Get full details of a research"""
|
619
|
+
"""Get full details of a research using ORM"""
|
616
620
|
try:
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
FROM research_history WHERE id = ?""",
|
623
|
-
(research_id,),
|
621
|
+
db_session = get_db_session()
|
622
|
+
research = (
|
623
|
+
db_session.query(ResearchHistory)
|
624
|
+
.filter(ResearchHistory.id == research_id)
|
625
|
+
.first()
|
624
626
|
)
|
625
|
-
result = cursor.fetchone()
|
626
627
|
|
627
|
-
if
|
628
|
-
conn.close()
|
628
|
+
if not research:
|
629
629
|
return jsonify({"error": "Research not found"}), 404
|
630
630
|
|
631
|
-
# Unpack the result
|
632
|
-
(
|
633
|
-
research_id,
|
634
|
-
query,
|
635
|
-
status,
|
636
|
-
progress,
|
637
|
-
mode,
|
638
|
-
created_at,
|
639
|
-
completed_at,
|
640
|
-
report_path,
|
641
|
-
metadata_str,
|
642
|
-
) = result
|
643
|
-
|
644
|
-
# Parse metadata if it exists
|
645
|
-
metadata = {}
|
646
|
-
if metadata_str:
|
647
|
-
try:
|
648
|
-
metadata = json.loads(metadata_str)
|
649
|
-
except json.JSONDecodeError:
|
650
|
-
logger.warning(
|
651
|
-
f"Invalid JSON in metadata for research {research_id}"
|
652
|
-
)
|
653
|
-
|
654
|
-
conn.close()
|
655
|
-
|
656
631
|
return jsonify(
|
657
632
|
{
|
658
|
-
"id":
|
659
|
-
"query": query,
|
660
|
-
"status": status,
|
661
|
-
"progress": progress,
|
662
|
-
"progress_percentage": progress or 0,
|
663
|
-
"mode": mode,
|
664
|
-
"created_at": created_at,
|
665
|
-
"completed_at": completed_at,
|
666
|
-
"report_path": report_path,
|
667
|
-
"metadata":
|
633
|
+
"id": research.id,
|
634
|
+
"query": research.query,
|
635
|
+
"status": research.status,
|
636
|
+
"progress": research.progress,
|
637
|
+
"progress_percentage": research.progress or 0,
|
638
|
+
"mode": research.mode,
|
639
|
+
"created_at": research.created_at,
|
640
|
+
"completed_at": research.completed_at,
|
641
|
+
"report_path": research.report_path,
|
642
|
+
"metadata": research.research_meta,
|
668
643
|
}
|
669
644
|
)
|
670
645
|
except Exception as e:
|
@@ -676,50 +651,36 @@ def get_research_details(research_id):
|
|
676
651
|
def get_research_logs(research_id):
|
677
652
|
"""Get logs for a specific research"""
|
678
653
|
try:
|
679
|
-
conn = get_db_connection()
|
680
|
-
cursor = conn.cursor()
|
681
|
-
|
682
654
|
# First check if the research exists
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
|
655
|
+
db_session = get_db_session()
|
656
|
+
with db_session:
|
657
|
+
research = (
|
658
|
+
db_session.query(ResearchHistory)
|
659
|
+
.filter_by(id=research_id)
|
660
|
+
.first()
|
661
|
+
)
|
662
|
+
if not research:
|
663
|
+
return jsonify({"error": "Research not found"}), 404
|
664
|
+
|
665
|
+
# Get logs from research_logs table
|
666
|
+
log_results = (
|
667
|
+
db_session.query(ResearchLog)
|
668
|
+
.filter_by(research_id=research_id)
|
669
|
+
.order_by(ResearchLog.timestamp)
|
670
|
+
.all()
|
671
|
+
)
|
698
672
|
|
699
673
|
logs = []
|
700
|
-
for row in
|
701
|
-
log_id, message, timestamp, log_type, progress, metadata_str = row
|
702
|
-
|
703
|
-
# Parse metadata if it exists
|
704
|
-
metadata = {}
|
705
|
-
if metadata_str:
|
706
|
-
try:
|
707
|
-
metadata = json.loads(metadata_str)
|
708
|
-
except json.JSONDecodeError:
|
709
|
-
pass
|
710
|
-
|
674
|
+
for row in log_results:
|
711
675
|
logs.append(
|
712
676
|
{
|
713
|
-
"id":
|
714
|
-
"message": message,
|
715
|
-
"timestamp": timestamp,
|
716
|
-
"log_type":
|
717
|
-
"progress": progress,
|
718
|
-
"metadata": metadata,
|
677
|
+
"id": row.id,
|
678
|
+
"message": row.message,
|
679
|
+
"timestamp": row.timestamp,
|
680
|
+
"log_type": row.level,
|
719
681
|
}
|
720
682
|
)
|
721
683
|
|
722
|
-
conn.close()
|
723
684
|
return jsonify(logs)
|
724
685
|
|
725
686
|
except Exception as e:
|
@@ -730,27 +691,18 @@ def get_research_logs(research_id):
|
|
730
691
|
@research_bp.route("/api/report/<int:research_id>")
|
731
692
|
def get_research_report(research_id):
|
732
693
|
"""Get the research report content"""
|
733
|
-
from ..database.models import Research
|
734
|
-
from ...utilities.db_utils import get_db_session
|
735
|
-
|
736
694
|
session = get_db_session()
|
737
695
|
try:
|
738
696
|
# Query using ORM
|
739
|
-
research =
|
697
|
+
research = (
|
698
|
+
session.query(ResearchHistory).filter_by(id=research_id).first()
|
699
|
+
)
|
740
700
|
|
741
701
|
if research is None:
|
742
702
|
return jsonify({"error": "Research not found"}), 404
|
743
703
|
|
744
704
|
# Parse metadata if it exists
|
745
|
-
metadata =
|
746
|
-
if research.metadata:
|
747
|
-
try:
|
748
|
-
metadata = json.loads(research.metadata)
|
749
|
-
except json.JSONDecodeError:
|
750
|
-
logger.warning(
|
751
|
-
f"Invalid JSON in metadata for research {research_id}"
|
752
|
-
)
|
753
|
-
|
705
|
+
metadata = research.research_meta
|
754
706
|
# Check if report file exists
|
755
707
|
if not research.report_path or not os.path.exists(research.report_path):
|
756
708
|
return jsonify({"error": "Report file not found"}), 404
|
@@ -771,11 +723,11 @@ def get_research_report(research_id):
|
|
771
723
|
"content": content,
|
772
724
|
"metadata": {
|
773
725
|
"query": research.query,
|
774
|
-
"mode": research.mode
|
775
|
-
"created_at": research.created_at
|
726
|
+
"mode": research.mode if research.mode else None,
|
727
|
+
"created_at": research.created_at
|
776
728
|
if research.created_at
|
777
729
|
else None,
|
778
|
-
"completed_at": research.completed_at
|
730
|
+
"completed_at": research.completed_at
|
779
731
|
if research.completed_at
|
780
732
|
else None,
|
781
733
|
"report_path": research.report_path,
|