local-deep-research 0.4.4__py3-none-any.whl → 0.5.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- local_deep_research/__init__.py +7 -0
- local_deep_research/__version__.py +1 -1
- local_deep_research/advanced_search_system/answer_decoding/__init__.py +5 -0
- local_deep_research/advanced_search_system/answer_decoding/browsecomp_answer_decoder.py +421 -0
- local_deep_research/advanced_search_system/candidate_exploration/README.md +219 -0
- local_deep_research/advanced_search_system/candidate_exploration/__init__.py +25 -0
- local_deep_research/advanced_search_system/candidate_exploration/adaptive_explorer.py +329 -0
- local_deep_research/advanced_search_system/candidate_exploration/base_explorer.py +341 -0
- local_deep_research/advanced_search_system/candidate_exploration/constraint_guided_explorer.py +436 -0
- local_deep_research/advanced_search_system/candidate_exploration/diversity_explorer.py +457 -0
- local_deep_research/advanced_search_system/candidate_exploration/parallel_explorer.py +250 -0
- local_deep_research/advanced_search_system/candidate_exploration/progressive_explorer.py +255 -0
- local_deep_research/advanced_search_system/candidates/__init__.py +5 -0
- local_deep_research/advanced_search_system/candidates/base_candidate.py +59 -0
- local_deep_research/advanced_search_system/constraint_checking/README.md +150 -0
- local_deep_research/advanced_search_system/constraint_checking/__init__.py +35 -0
- local_deep_research/advanced_search_system/constraint_checking/base_constraint_checker.py +122 -0
- local_deep_research/advanced_search_system/constraint_checking/constraint_checker.py +223 -0
- local_deep_research/advanced_search_system/constraint_checking/constraint_satisfaction_tracker.py +387 -0
- local_deep_research/advanced_search_system/constraint_checking/dual_confidence_checker.py +424 -0
- local_deep_research/advanced_search_system/constraint_checking/evidence_analyzer.py +174 -0
- local_deep_research/advanced_search_system/constraint_checking/intelligent_constraint_relaxer.py +503 -0
- local_deep_research/advanced_search_system/constraint_checking/rejection_engine.py +143 -0
- local_deep_research/advanced_search_system/constraint_checking/strict_checker.py +259 -0
- local_deep_research/advanced_search_system/constraint_checking/threshold_checker.py +213 -0
- local_deep_research/advanced_search_system/constraints/__init__.py +6 -0
- local_deep_research/advanced_search_system/constraints/base_constraint.py +58 -0
- local_deep_research/advanced_search_system/constraints/constraint_analyzer.py +143 -0
- local_deep_research/advanced_search_system/evidence/__init__.py +12 -0
- local_deep_research/advanced_search_system/evidence/base_evidence.py +57 -0
- local_deep_research/advanced_search_system/evidence/evaluator.py +159 -0
- local_deep_research/advanced_search_system/evidence/requirements.py +122 -0
- local_deep_research/advanced_search_system/filters/base_filter.py +3 -1
- local_deep_research/advanced_search_system/filters/cross_engine_filter.py +8 -2
- local_deep_research/advanced_search_system/filters/journal_reputation_filter.py +43 -29
- local_deep_research/advanced_search_system/findings/repository.py +54 -17
- local_deep_research/advanced_search_system/knowledge/standard_knowledge.py +3 -1
- local_deep_research/advanced_search_system/query_generation/adaptive_query_generator.py +405 -0
- local_deep_research/advanced_search_system/questions/__init__.py +16 -0
- local_deep_research/advanced_search_system/questions/atomic_fact_question.py +171 -0
- local_deep_research/advanced_search_system/questions/browsecomp_question.py +287 -0
- local_deep_research/advanced_search_system/questions/decomposition_question.py +13 -4
- local_deep_research/advanced_search_system/questions/entity_aware_question.py +184 -0
- local_deep_research/advanced_search_system/questions/standard_question.py +9 -3
- local_deep_research/advanced_search_system/search_optimization/cross_constraint_manager.py +624 -0
- local_deep_research/advanced_search_system/source_management/diversity_manager.py +613 -0
- local_deep_research/advanced_search_system/strategies/__init__.py +42 -0
- local_deep_research/advanced_search_system/strategies/adaptive_decomposition_strategy.py +564 -0
- local_deep_research/advanced_search_system/strategies/base_strategy.py +4 -4
- local_deep_research/advanced_search_system/strategies/browsecomp_entity_strategy.py +1031 -0
- local_deep_research/advanced_search_system/strategies/browsecomp_optimized_strategy.py +778 -0
- local_deep_research/advanced_search_system/strategies/concurrent_dual_confidence_strategy.py +446 -0
- local_deep_research/advanced_search_system/strategies/constrained_search_strategy.py +1348 -0
- local_deep_research/advanced_search_system/strategies/constraint_parallel_strategy.py +522 -0
- local_deep_research/advanced_search_system/strategies/direct_search_strategy.py +217 -0
- local_deep_research/advanced_search_system/strategies/dual_confidence_strategy.py +320 -0
- local_deep_research/advanced_search_system/strategies/dual_confidence_with_rejection.py +219 -0
- local_deep_research/advanced_search_system/strategies/early_stop_constrained_strategy.py +369 -0
- local_deep_research/advanced_search_system/strategies/entity_aware_source_strategy.py +140 -0
- local_deep_research/advanced_search_system/strategies/evidence_based_strategy.py +1248 -0
- local_deep_research/advanced_search_system/strategies/evidence_based_strategy_v2.py +1337 -0
- local_deep_research/advanced_search_system/strategies/focused_iteration_strategy.py +537 -0
- local_deep_research/advanced_search_system/strategies/improved_evidence_based_strategy.py +782 -0
- local_deep_research/advanced_search_system/strategies/iterative_reasoning_strategy.py +760 -0
- local_deep_research/advanced_search_system/strategies/iterdrag_strategy.py +55 -21
- local_deep_research/advanced_search_system/strategies/llm_driven_modular_strategy.py +865 -0
- local_deep_research/advanced_search_system/strategies/modular_strategy.py +1142 -0
- local_deep_research/advanced_search_system/strategies/parallel_constrained_strategy.py +506 -0
- local_deep_research/advanced_search_system/strategies/parallel_search_strategy.py +34 -16
- local_deep_research/advanced_search_system/strategies/rapid_search_strategy.py +29 -9
- local_deep_research/advanced_search_system/strategies/recursive_decomposition_strategy.py +492 -0
- local_deep_research/advanced_search_system/strategies/smart_decomposition_strategy.py +284 -0
- local_deep_research/advanced_search_system/strategies/smart_query_strategy.py +515 -0
- local_deep_research/advanced_search_system/strategies/source_based_strategy.py +48 -24
- local_deep_research/advanced_search_system/strategies/standard_strategy.py +34 -14
- local_deep_research/advanced_search_system/tools/base_tool.py +7 -2
- local_deep_research/api/benchmark_functions.py +6 -2
- local_deep_research/api/research_functions.py +10 -4
- local_deep_research/benchmarks/__init__.py +9 -7
- local_deep_research/benchmarks/benchmark_functions.py +6 -2
- local_deep_research/benchmarks/cli/benchmark_commands.py +27 -10
- local_deep_research/benchmarks/cli.py +38 -13
- local_deep_research/benchmarks/comparison/__init__.py +4 -2
- local_deep_research/benchmarks/comparison/evaluator.py +316 -239
- local_deep_research/benchmarks/datasets/__init__.py +1 -1
- local_deep_research/benchmarks/datasets/base.py +91 -72
- local_deep_research/benchmarks/datasets/browsecomp.py +54 -33
- local_deep_research/benchmarks/datasets/custom_dataset_template.py +19 -19
- local_deep_research/benchmarks/datasets/simpleqa.py +14 -14
- local_deep_research/benchmarks/datasets/utils.py +48 -29
- local_deep_research/benchmarks/datasets.py +4 -11
- local_deep_research/benchmarks/efficiency/__init__.py +8 -4
- local_deep_research/benchmarks/efficiency/resource_monitor.py +223 -171
- local_deep_research/benchmarks/efficiency/speed_profiler.py +62 -48
- local_deep_research/benchmarks/evaluators/browsecomp.py +3 -1
- local_deep_research/benchmarks/evaluators/composite.py +6 -2
- local_deep_research/benchmarks/evaluators/simpleqa.py +36 -13
- local_deep_research/benchmarks/graders.py +32 -10
- local_deep_research/benchmarks/metrics/README.md +1 -1
- local_deep_research/benchmarks/metrics/calculation.py +25 -10
- local_deep_research/benchmarks/metrics/reporting.py +7 -3
- local_deep_research/benchmarks/metrics/visualization.py +42 -23
- local_deep_research/benchmarks/metrics.py +1 -1
- local_deep_research/benchmarks/optimization/__init__.py +3 -1
- local_deep_research/benchmarks/optimization/api.py +7 -1
- local_deep_research/benchmarks/optimization/optuna_optimizer.py +75 -26
- local_deep_research/benchmarks/runners.py +48 -15
- local_deep_research/citation_handler.py +65 -92
- local_deep_research/citation_handlers/__init__.py +15 -0
- local_deep_research/citation_handlers/base_citation_handler.py +70 -0
- local_deep_research/citation_handlers/forced_answer_citation_handler.py +179 -0
- local_deep_research/citation_handlers/precision_extraction_handler.py +550 -0
- local_deep_research/citation_handlers/standard_citation_handler.py +80 -0
- local_deep_research/config/llm_config.py +271 -169
- local_deep_research/config/search_config.py +14 -5
- local_deep_research/defaults/__init__.py +0 -1
- local_deep_research/metrics/__init__.py +13 -0
- local_deep_research/metrics/database.py +58 -0
- local_deep_research/metrics/db_models.py +115 -0
- local_deep_research/metrics/migrate_add_provider_to_token_usage.py +148 -0
- local_deep_research/metrics/migrate_call_stack_tracking.py +105 -0
- local_deep_research/metrics/migrate_enhanced_tracking.py +75 -0
- local_deep_research/metrics/migrate_research_ratings.py +31 -0
- local_deep_research/metrics/models.py +61 -0
- local_deep_research/metrics/pricing/__init__.py +12 -0
- local_deep_research/metrics/pricing/cost_calculator.py +237 -0
- local_deep_research/metrics/pricing/pricing_cache.py +143 -0
- local_deep_research/metrics/pricing/pricing_fetcher.py +240 -0
- local_deep_research/metrics/query_utils.py +51 -0
- local_deep_research/metrics/search_tracker.py +380 -0
- local_deep_research/metrics/token_counter.py +1078 -0
- local_deep_research/migrate_db.py +3 -1
- local_deep_research/report_generator.py +22 -8
- local_deep_research/search_system.py +390 -9
- local_deep_research/test_migration.py +15 -5
- local_deep_research/utilities/db_utils.py +7 -4
- local_deep_research/utilities/es_utils.py +115 -104
- local_deep_research/utilities/llm_utils.py +15 -5
- local_deep_research/utilities/log_utils.py +151 -0
- local_deep_research/utilities/search_cache.py +387 -0
- local_deep_research/utilities/search_utilities.py +14 -6
- local_deep_research/utilities/threading_utils.py +92 -0
- local_deep_research/utilities/url_utils.py +6 -0
- local_deep_research/web/api.py +347 -0
- local_deep_research/web/app.py +13 -17
- local_deep_research/web/app_factory.py +71 -66
- local_deep_research/web/database/migrate_to_ldr_db.py +12 -4
- local_deep_research/web/database/migrations.py +20 -3
- local_deep_research/web/database/models.py +74 -25
- local_deep_research/web/database/schema_upgrade.py +49 -29
- local_deep_research/web/models/database.py +63 -83
- local_deep_research/web/routes/api_routes.py +56 -22
- local_deep_research/web/routes/benchmark_routes.py +4 -1
- local_deep_research/web/routes/globals.py +22 -0
- local_deep_research/web/routes/history_routes.py +71 -46
- local_deep_research/web/routes/metrics_routes.py +1155 -0
- local_deep_research/web/routes/research_routes.py +192 -54
- local_deep_research/web/routes/settings_routes.py +156 -55
- local_deep_research/web/services/research_service.py +412 -251
- local_deep_research/web/services/resource_service.py +36 -11
- local_deep_research/web/services/settings_manager.py +55 -17
- local_deep_research/web/services/settings_service.py +12 -4
- local_deep_research/web/services/socket_service.py +295 -188
- local_deep_research/web/static/css/custom_dropdown.css +180 -0
- local_deep_research/web/static/css/styles.css +39 -1
- local_deep_research/web/static/js/components/detail.js +633 -267
- local_deep_research/web/static/js/components/details.js +751 -0
- local_deep_research/web/static/js/components/fallback/formatting.js +11 -11
- local_deep_research/web/static/js/components/fallback/ui.js +23 -23
- local_deep_research/web/static/js/components/history.js +76 -76
- local_deep_research/web/static/js/components/logpanel.js +61 -13
- local_deep_research/web/static/js/components/progress.js +13 -2
- local_deep_research/web/static/js/components/research.js +99 -12
- local_deep_research/web/static/js/components/results.js +239 -106
- local_deep_research/web/static/js/main.js +40 -40
- local_deep_research/web/static/js/services/audio.js +1 -1
- local_deep_research/web/static/js/services/formatting.js +11 -11
- local_deep_research/web/static/js/services/keyboard.js +157 -0
- local_deep_research/web/static/js/services/pdf.js +80 -80
- local_deep_research/web/static/sounds/README.md +1 -1
- local_deep_research/web/templates/base.html +1 -0
- local_deep_research/web/templates/components/log_panel.html +7 -1
- local_deep_research/web/templates/components/mobile_nav.html +1 -1
- local_deep_research/web/templates/components/sidebar.html +3 -0
- local_deep_research/web/templates/pages/cost_analytics.html +1245 -0
- local_deep_research/web/templates/pages/details.html +325 -24
- local_deep_research/web/templates/pages/history.html +1 -1
- local_deep_research/web/templates/pages/metrics.html +1929 -0
- local_deep_research/web/templates/pages/progress.html +2 -2
- local_deep_research/web/templates/pages/research.html +53 -17
- local_deep_research/web/templates/pages/results.html +12 -1
- local_deep_research/web/templates/pages/star_reviews.html +803 -0
- local_deep_research/web/utils/formatters.py +9 -3
- local_deep_research/web_search_engines/default_search_engines.py +5 -3
- local_deep_research/web_search_engines/engines/full_search.py +8 -2
- local_deep_research/web_search_engines/engines/meta_search_engine.py +59 -20
- local_deep_research/web_search_engines/engines/search_engine_arxiv.py +19 -6
- local_deep_research/web_search_engines/engines/search_engine_brave.py +6 -2
- local_deep_research/web_search_engines/engines/search_engine_ddg.py +3 -1
- local_deep_research/web_search_engines/engines/search_engine_elasticsearch.py +81 -58
- local_deep_research/web_search_engines/engines/search_engine_github.py +46 -15
- local_deep_research/web_search_engines/engines/search_engine_google_pse.py +16 -6
- local_deep_research/web_search_engines/engines/search_engine_guardian.py +39 -15
- local_deep_research/web_search_engines/engines/search_engine_local.py +58 -25
- local_deep_research/web_search_engines/engines/search_engine_local_all.py +15 -5
- local_deep_research/web_search_engines/engines/search_engine_pubmed.py +63 -21
- local_deep_research/web_search_engines/engines/search_engine_searxng.py +37 -11
- local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py +27 -9
- local_deep_research/web_search_engines/engines/search_engine_serpapi.py +12 -4
- local_deep_research/web_search_engines/engines/search_engine_wayback.py +31 -10
- local_deep_research/web_search_engines/engines/search_engine_wikipedia.py +12 -3
- local_deep_research/web_search_engines/search_engine_base.py +83 -35
- local_deep_research/web_search_engines/search_engine_factory.py +25 -8
- local_deep_research/web_search_engines/search_engines_config.py +9 -3
- {local_deep_research-0.4.4.dist-info → local_deep_research-0.5.2.dist-info}/METADATA +7 -1
- local_deep_research-0.5.2.dist-info/RECORD +265 -0
- local_deep_research-0.4.4.dist-info/RECORD +0 -177
- {local_deep_research-0.4.4.dist-info → local_deep_research-0.5.2.dist-info}/WHEEL +0 -0
- {local_deep_research-0.4.4.dist-info → local_deep_research-0.5.2.dist-info}/entry_points.txt +0 -0
- {local_deep_research-0.4.4.dist-info → local_deep_research-0.5.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,284 @@
|
|
1
|
+
"""
|
2
|
+
Smart Decomposition Strategy that chooses between recursive and adaptive approaches.
|
3
|
+
|
4
|
+
This strategy analyzes the query type and chooses the most appropriate
|
5
|
+
decomposition method for optimal results.
|
6
|
+
"""
|
7
|
+
|
8
|
+
from enum import Enum
|
9
|
+
from typing import Any, Dict, List
|
10
|
+
|
11
|
+
from langchain_core.language_models import BaseChatModel
|
12
|
+
from loguru import logger
|
13
|
+
|
14
|
+
from ...utilities.search_utilities import remove_think_tags
|
15
|
+
from .adaptive_decomposition_strategy import AdaptiveDecompositionStrategy
|
16
|
+
from .base_strategy import BaseSearchStrategy
|
17
|
+
from .browsecomp_optimized_strategy import BrowseCompOptimizedStrategy
|
18
|
+
from .evidence_based_strategy import EvidenceBasedStrategy
|
19
|
+
from .recursive_decomposition_strategy import RecursiveDecompositionStrategy
|
20
|
+
|
21
|
+
|
22
|
+
class QueryType(Enum):
|
23
|
+
"""Types of queries that benefit from different strategies."""
|
24
|
+
|
25
|
+
PUZZLE_LIKE = "puzzle_like" # Queries with specific clues/constraints
|
26
|
+
HIERARCHICAL = "hierarchical" # Multi-part questions with clear structure
|
27
|
+
EXPLORATORY = "exploratory" # Open-ended research questions
|
28
|
+
COMPARATIVE = "comparative" # Comparison between multiple entities
|
29
|
+
FACTUAL = "factual" # Simple factual questions
|
30
|
+
CONSTRAINT_BASED = (
|
31
|
+
"constraint_based" # Queries with multiple verifiable constraints
|
32
|
+
)
|
33
|
+
|
34
|
+
|
35
|
+
class SmartDecompositionStrategy(BaseSearchStrategy):
|
36
|
+
"""
|
37
|
+
A meta-strategy that intelligently chooses between decomposition approaches.
|
38
|
+
|
39
|
+
It analyzes the query characteristics and selects either:
|
40
|
+
- Adaptive decomposition for puzzle-like or constraint-based queries
|
41
|
+
- Recursive decomposition for clearly hierarchical queries
|
42
|
+
- Direct search for simple factual queries
|
43
|
+
"""
|
44
|
+
|
45
|
+
def __init__(
|
46
|
+
self,
|
47
|
+
model: BaseChatModel,
|
48
|
+
search: Any,
|
49
|
+
all_links_of_system: List[str],
|
50
|
+
**kwargs,
|
51
|
+
):
|
52
|
+
"""Initialize the smart decomposition strategy.
|
53
|
+
|
54
|
+
Args:
|
55
|
+
model: The language model to use
|
56
|
+
search: The search engine instance
|
57
|
+
all_links_of_system: List to store all encountered links
|
58
|
+
**kwargs: Additional parameters for sub-strategies
|
59
|
+
"""
|
60
|
+
super().__init__(all_links_of_system)
|
61
|
+
self.model = model
|
62
|
+
self.search = search
|
63
|
+
self.strategy_params = kwargs
|
64
|
+
|
65
|
+
def analyze_topic(self, query: str) -> Dict:
|
66
|
+
"""Analyze a topic using the most appropriate strategy.
|
67
|
+
|
68
|
+
Args:
|
69
|
+
query: The research query to analyze
|
70
|
+
|
71
|
+
Returns:
|
72
|
+
Dictionary containing analysis results
|
73
|
+
"""
|
74
|
+
# Determine query type
|
75
|
+
query_type = self._classify_query(query)
|
76
|
+
logger.info(f"Query classified as: {query_type.value}")
|
77
|
+
|
78
|
+
# Progress callback for UI
|
79
|
+
if self.progress_callback:
|
80
|
+
self.progress_callback(
|
81
|
+
f"Analyzing query type: {query_type.value}",
|
82
|
+
5,
|
83
|
+
{
|
84
|
+
"phase": "query_classification",
|
85
|
+
"query_type": query_type.value,
|
86
|
+
},
|
87
|
+
)
|
88
|
+
|
89
|
+
# Choose and execute appropriate strategy
|
90
|
+
if query_type == QueryType.PUZZLE_LIKE:
|
91
|
+
# Check if it's specifically a BrowseComp-style puzzle
|
92
|
+
if self._is_browsecomp_style(query):
|
93
|
+
return self._use_browsecomp_strategy(query)
|
94
|
+
else:
|
95
|
+
return self._use_evidence_strategy(query)
|
96
|
+
elif query_type == QueryType.CONSTRAINT_BASED:
|
97
|
+
return self._use_evidence_strategy(query)
|
98
|
+
elif query_type == QueryType.HIERARCHICAL:
|
99
|
+
return self._use_recursive_strategy(query)
|
100
|
+
elif query_type in [QueryType.COMPARATIVE, QueryType.EXPLORATORY]:
|
101
|
+
return self._use_recursive_strategy(query)
|
102
|
+
else: # FACTUAL or unknown
|
103
|
+
return self._use_adaptive_strategy(query)
|
104
|
+
|
105
|
+
def _classify_query(self, query: str) -> QueryType:
|
106
|
+
"""Classify the query type to determine best strategy.
|
107
|
+
|
108
|
+
Args:
|
109
|
+
query: The query to classify
|
110
|
+
|
111
|
+
Returns:
|
112
|
+
QueryType enum value
|
113
|
+
"""
|
114
|
+
prompt = f"""Analyze this query and classify its type:
|
115
|
+
|
116
|
+
Query: {query}
|
117
|
+
|
118
|
+
Query Types:
|
119
|
+
1. PUZZLE_LIKE - Contains specific clues, constraints, or puzzle elements that need to be solved step by step
|
120
|
+
2. HIERARCHICAL - Multi-part question with clear subtopics that can be addressed independently
|
121
|
+
3. EXPLORATORY - Open-ended research question seeking broad understanding
|
122
|
+
4. COMPARATIVE - Requires comparing multiple entities or concepts
|
123
|
+
5. FACTUAL - Simple factual question with a direct answer
|
124
|
+
6. CONSTRAINT_BASED - Has multiple specific constraints that need verification (dates, numbers, properties)
|
125
|
+
|
126
|
+
Consider:
|
127
|
+
- Does it have specific constraints or clues to follow?
|
128
|
+
- Can it be broken into independent subtasks?
|
129
|
+
- Is it seeking a specific answer or broad understanding?
|
130
|
+
- Does it require step-by-step verification?
|
131
|
+
|
132
|
+
Respond with:
|
133
|
+
QUERY_TYPE: [type]
|
134
|
+
REASONING: [brief explanation]
|
135
|
+
KEY_CHARACTERISTICS: [list main characteristics]
|
136
|
+
"""
|
137
|
+
|
138
|
+
response = self.model.invoke(prompt)
|
139
|
+
content = remove_think_tags(response.content)
|
140
|
+
|
141
|
+
# Parse response
|
142
|
+
query_type = QueryType.EXPLORATORY # Default
|
143
|
+
|
144
|
+
lines = content.strip().split("\n")
|
145
|
+
for line in lines:
|
146
|
+
if line.startswith("QUERY_TYPE:"):
|
147
|
+
type_str = line.split(":", 1)[1].strip()
|
148
|
+
try:
|
149
|
+
query_type = QueryType[type_str]
|
150
|
+
except KeyError:
|
151
|
+
# Try to match by value
|
152
|
+
for q_type in QueryType:
|
153
|
+
if q_type.value in type_str.lower():
|
154
|
+
query_type = q_type
|
155
|
+
break
|
156
|
+
|
157
|
+
logger.info(f"Query classification reasoning: {content}")
|
158
|
+
return query_type
|
159
|
+
|
160
|
+
def _use_adaptive_strategy(self, query: str) -> Dict:
|
161
|
+
"""Use adaptive decomposition strategy.
|
162
|
+
|
163
|
+
Args:
|
164
|
+
query: The query to analyze
|
165
|
+
|
166
|
+
Returns:
|
167
|
+
Analysis results
|
168
|
+
"""
|
169
|
+
logger.info("Using adaptive decomposition strategy")
|
170
|
+
|
171
|
+
strategy = AdaptiveDecompositionStrategy(
|
172
|
+
model=self.model,
|
173
|
+
search=self.search,
|
174
|
+
all_links_of_system=self.all_links_of_system,
|
175
|
+
**self.strategy_params,
|
176
|
+
)
|
177
|
+
|
178
|
+
if self.progress_callback:
|
179
|
+
strategy.set_progress_callback(self.progress_callback)
|
180
|
+
|
181
|
+
return strategy.analyze_topic(query)
|
182
|
+
|
183
|
+
def _is_browsecomp_style(self, query: str) -> bool:
|
184
|
+
"""Check if query is a BrowseComp-style puzzle.
|
185
|
+
|
186
|
+
Args:
|
187
|
+
query: The query to check
|
188
|
+
|
189
|
+
Returns:
|
190
|
+
True if it appears to be a BrowseComp puzzle
|
191
|
+
"""
|
192
|
+
browsecomp_indicators = [
|
193
|
+
"specific scenic location",
|
194
|
+
"body part",
|
195
|
+
"fell from",
|
196
|
+
"viewpoint",
|
197
|
+
"search and rescue",
|
198
|
+
"SAR incidents",
|
199
|
+
"exact answer",
|
200
|
+
"multiple clues",
|
201
|
+
"last ice age",
|
202
|
+
"times more",
|
203
|
+
"between",
|
204
|
+
"what is the name",
|
205
|
+
]
|
206
|
+
|
207
|
+
lower_query = query.lower()
|
208
|
+
indicator_count = sum(
|
209
|
+
1
|
210
|
+
for indicator in browsecomp_indicators
|
211
|
+
if indicator.lower() in lower_query
|
212
|
+
)
|
213
|
+
|
214
|
+
# If 3+ indicators present, likely BrowseComp-style
|
215
|
+
return indicator_count >= 3
|
216
|
+
|
217
|
+
def _use_browsecomp_strategy(self, query: str) -> Dict:
|
218
|
+
"""Use BrowseComp-optimized strategy.
|
219
|
+
|
220
|
+
Args:
|
221
|
+
query: The query to analyze
|
222
|
+
|
223
|
+
Returns:
|
224
|
+
Analysis results
|
225
|
+
"""
|
226
|
+
logger.info("Using BrowseComp-optimized strategy for puzzle query")
|
227
|
+
|
228
|
+
strategy = BrowseCompOptimizedStrategy(
|
229
|
+
model=self.model,
|
230
|
+
search=self.search,
|
231
|
+
all_links_of_system=self.all_links_of_system,
|
232
|
+
**self.strategy_params,
|
233
|
+
)
|
234
|
+
|
235
|
+
if self.progress_callback:
|
236
|
+
strategy.set_progress_callback(self.progress_callback)
|
237
|
+
|
238
|
+
return strategy.analyze_topic(query)
|
239
|
+
|
240
|
+
def _use_evidence_strategy(self, query: str) -> Dict:
|
241
|
+
"""Use evidence-based strategy.
|
242
|
+
|
243
|
+
Args:
|
244
|
+
query: The query to analyze
|
245
|
+
|
246
|
+
Returns:
|
247
|
+
Analysis results
|
248
|
+
"""
|
249
|
+
logger.info("Using evidence-based strategy for constraint-based query")
|
250
|
+
|
251
|
+
strategy = EvidenceBasedStrategy(
|
252
|
+
model=self.model,
|
253
|
+
search=self.search,
|
254
|
+
all_links_of_system=self.all_links_of_system,
|
255
|
+
**self.strategy_params,
|
256
|
+
)
|
257
|
+
|
258
|
+
if self.progress_callback:
|
259
|
+
strategy.set_progress_callback(self.progress_callback)
|
260
|
+
|
261
|
+
return strategy.analyze_topic(query)
|
262
|
+
|
263
|
+
def _use_recursive_strategy(self, query: str) -> Dict:
|
264
|
+
"""Use recursive decomposition strategy.
|
265
|
+
|
266
|
+
Args:
|
267
|
+
query: The query to analyze
|
268
|
+
|
269
|
+
Returns:
|
270
|
+
Analysis results
|
271
|
+
"""
|
272
|
+
logger.info("Using recursive decomposition strategy")
|
273
|
+
|
274
|
+
strategy = RecursiveDecompositionStrategy(
|
275
|
+
model=self.model,
|
276
|
+
search=self.search,
|
277
|
+
all_links_of_system=self.all_links_of_system,
|
278
|
+
**self.strategy_params,
|
279
|
+
)
|
280
|
+
|
281
|
+
if self.progress_callback:
|
282
|
+
strategy.set_progress_callback(self.progress_callback)
|
283
|
+
|
284
|
+
return strategy.analyze_topic(query)
|