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
@@ -71,7 +71,7 @@ class IterDRAGStrategy(BaseSearchStrategy):
|
|
71
71
|
try:
|
72
72
|
# Format context for question generation
|
73
73
|
context = f"""Current Query: {query}
|
74
|
-
Current Date: {datetime.now().strftime(
|
74
|
+
Current Date: {datetime.now().strftime("%Y-%m-%d")}
|
75
75
|
Past Questions: {self.questions_by_iteration}
|
76
76
|
Current Knowledge: {current_knowledge}
|
77
77
|
|
@@ -80,7 +80,9 @@ Initial Search Results:
|
|
80
80
|
|
81
81
|
# Generate sub-queries using the question generator
|
82
82
|
return self.question_generator.generate_questions(
|
83
|
-
query,
|
83
|
+
query,
|
84
|
+
context,
|
85
|
+
int(get_db_setting("search.questions_per_iteration")),
|
84
86
|
)
|
85
87
|
except Exception:
|
86
88
|
logger.exception("Error generating sub-queries")
|
@@ -100,9 +102,7 @@ Initial Search Results:
|
|
100
102
|
|
101
103
|
# Check if search engine is available
|
102
104
|
if self.search is None:
|
103
|
-
error_msg =
|
104
|
-
"Error: No search engine available. Please check your configuration."
|
105
|
-
)
|
105
|
+
error_msg = "Error: No search engine available. Please check your configuration."
|
106
106
|
self._update_progress(
|
107
107
|
error_msg,
|
108
108
|
100,
|
@@ -140,7 +140,10 @@ Initial Search Results:
|
|
140
140
|
self._update_progress(
|
141
141
|
f"Found {len(initial_results)} initial results",
|
142
142
|
15,
|
143
|
-
{
|
143
|
+
{
|
144
|
+
"phase": "search_complete",
|
145
|
+
"result_count": len(initial_results),
|
146
|
+
},
|
144
147
|
)
|
145
148
|
|
146
149
|
# Extract and save links
|
@@ -161,7 +164,9 @@ Initial Search Results:
|
|
161
164
|
|
162
165
|
# Store questions in repository and in self.questions_by_iteration
|
163
166
|
self.questions_by_iteration = {0: sub_queries}
|
164
|
-
self.findings_repository.set_questions_by_iteration(
|
167
|
+
self.findings_repository.set_questions_by_iteration(
|
168
|
+
self.questions_by_iteration
|
169
|
+
)
|
165
170
|
|
166
171
|
if not sub_queries:
|
167
172
|
logger.error("No sub-queries were generated to analyze.")
|
@@ -231,11 +236,15 @@ Initial Search Results:
|
|
231
236
|
}
|
232
237
|
findings.append(finding)
|
233
238
|
self.findings_repository.add_finding(sub_query, finding)
|
234
|
-
self.findings_repository.add_documents(
|
239
|
+
self.findings_repository.add_documents(
|
240
|
+
result["documents"]
|
241
|
+
)
|
235
242
|
|
236
243
|
# Add to current knowledge with space around +
|
237
244
|
current_knowledge = (
|
238
|
-
current_knowledge
|
245
|
+
current_knowledge
|
246
|
+
+ "\n\n\n New: \n"
|
247
|
+
+ result["content"]
|
239
248
|
)
|
240
249
|
except Exception:
|
241
250
|
logger.exception("Error analyzing sub-query results:")
|
@@ -259,7 +268,9 @@ Initial Search Results:
|
|
259
268
|
|
260
269
|
try:
|
261
270
|
# Extract finding contents for synthesis
|
262
|
-
finding_contents = [
|
271
|
+
finding_contents = [
|
272
|
+
f["content"] for f in findings if "content" in f
|
273
|
+
]
|
263
274
|
|
264
275
|
# Synthesize findings into a final answer
|
265
276
|
final_answer = self.findings_repository.synthesize_findings(
|
@@ -270,7 +281,9 @@ Initial Search Results:
|
|
270
281
|
)
|
271
282
|
|
272
283
|
# Check if the synthesis failed with an error
|
273
|
-
if isinstance(final_answer, str) and final_answer.startswith(
|
284
|
+
if isinstance(final_answer, str) and final_answer.startswith(
|
285
|
+
"Error:"
|
286
|
+
):
|
274
287
|
logger.error(f"Synthesis returned an error: {final_answer}")
|
275
288
|
|
276
289
|
# Extract error type for better handling
|
@@ -287,7 +300,9 @@ Initial Search Results:
|
|
287
300
|
error_type = "connection"
|
288
301
|
|
289
302
|
# Log with specific error type
|
290
|
-
logger.error(
|
303
|
+
logger.error(
|
304
|
+
f"Synthesis failed with error type: {error_type}"
|
305
|
+
)
|
291
306
|
|
292
307
|
# Add error information to progress update
|
293
308
|
self._update_progress(
|
@@ -304,7 +319,9 @@ Initial Search Results:
|
|
304
319
|
longest_finding = f["content"]
|
305
320
|
|
306
321
|
if longest_finding:
|
307
|
-
logger.info(
|
322
|
+
logger.info(
|
323
|
+
"Using longest finding as fallback synthesis"
|
324
|
+
)
|
308
325
|
final_answer = f"""
|
309
326
|
# Research Results (Fallback Mode)
|
310
327
|
|
@@ -316,7 +333,9 @@ This is a fallback response using the most detailed individual finding.
|
|
316
333
|
"""
|
317
334
|
else:
|
318
335
|
# If we don't have any findings with content, use current_knowledge
|
319
|
-
logger.info(
|
336
|
+
logger.info(
|
337
|
+
"Using current knowledge as fallback synthesis"
|
338
|
+
)
|
320
339
|
final_answer = f"""
|
321
340
|
# Research Results (Fallback Mode)
|
322
341
|
|
@@ -338,7 +357,9 @@ This is a fallback response using the accumulated knowledge.
|
|
338
357
|
findings.append(finding)
|
339
358
|
|
340
359
|
# Store the synthesized content
|
341
|
-
self.findings_repository.add_finding(
|
360
|
+
self.findings_repository.add_finding(
|
361
|
+
query + "_synthesis", final_answer
|
362
|
+
)
|
342
363
|
|
343
364
|
# Update current knowledge with the synthesized version
|
344
365
|
current_knowledge = final_answer
|
@@ -366,7 +387,11 @@ This is a fallback response using the accumulated knowledge.
|
|
366
387
|
# Extract best content from findings
|
367
388
|
key_findings = []
|
368
389
|
for i, f in enumerate(findings):
|
369
|
-
if
|
390
|
+
if (
|
391
|
+
isinstance(f, dict)
|
392
|
+
and "content" in f
|
393
|
+
and f.get("content")
|
394
|
+
):
|
370
395
|
# Only take the first 500 chars of each finding for the fallback
|
371
396
|
content_preview = f.get("content", "")[:500]
|
372
397
|
if content_preview:
|
@@ -405,10 +430,15 @@ Please try again with a different query or contact support.
|
|
405
430
|
"""
|
406
431
|
|
407
432
|
# Compress knowledge if needed
|
408
|
-
if
|
433
|
+
if (
|
434
|
+
get_db_setting("general.knowledge_accumulation", "ITERATION")
|
435
|
+
== "ITERATION"
|
436
|
+
):
|
409
437
|
try:
|
410
438
|
self._update_progress(
|
411
|
-
"Compressing knowledge",
|
439
|
+
"Compressing knowledge",
|
440
|
+
90,
|
441
|
+
{"phase": "knowledge_compression"},
|
412
442
|
)
|
413
443
|
current_knowledge = self.knowledge_generator.compress_knowledge(
|
414
444
|
current_knowledge, query, section_links
|
@@ -435,12 +465,16 @@ Please try again with a different query or contact support.
|
|
435
465
|
)
|
436
466
|
|
437
467
|
# Now format the findings with search questions and sources
|
438
|
-
formatted_findings =
|
439
|
-
|
468
|
+
formatted_findings = (
|
469
|
+
self.findings_repository.format_findings_to_text(
|
470
|
+
findings, final_answer
|
471
|
+
)
|
440
472
|
)
|
441
473
|
except Exception:
|
442
474
|
logger.exception("Error formatting final findings")
|
443
|
-
formatted_findings =
|
475
|
+
formatted_findings = (
|
476
|
+
"Error: Could not format findings due to an error."
|
477
|
+
)
|
444
478
|
|
445
479
|
self._update_progress("Research complete", 100, {"phase": "complete"})
|
446
480
|
|