aiecs 1.5.1__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.
- aiecs/__init__.py +72 -0
- aiecs/__main__.py +41 -0
- aiecs/aiecs_client.py +469 -0
- aiecs/application/__init__.py +10 -0
- aiecs/application/executors/__init__.py +10 -0
- aiecs/application/executors/operation_executor.py +363 -0
- aiecs/application/knowledge_graph/__init__.py +7 -0
- aiecs/application/knowledge_graph/builder/__init__.py +37 -0
- aiecs/application/knowledge_graph/builder/document_builder.py +375 -0
- aiecs/application/knowledge_graph/builder/graph_builder.py +356 -0
- aiecs/application/knowledge_graph/builder/schema_mapping.py +531 -0
- aiecs/application/knowledge_graph/builder/structured_pipeline.py +443 -0
- aiecs/application/knowledge_graph/builder/text_chunker.py +319 -0
- aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
- aiecs/application/knowledge_graph/extractors/base.py +100 -0
- aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +327 -0
- aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +349 -0
- aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +244 -0
- aiecs/application/knowledge_graph/fusion/__init__.py +23 -0
- aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +387 -0
- aiecs/application/knowledge_graph/fusion/entity_linker.py +343 -0
- aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +580 -0
- aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +189 -0
- aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
- aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +344 -0
- aiecs/application/knowledge_graph/pattern_matching/query_executor.py +378 -0
- aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
- aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +199 -0
- aiecs/application/knowledge_graph/profiling/query_profiler.py +223 -0
- aiecs/application/knowledge_graph/reasoning/__init__.py +27 -0
- aiecs/application/knowledge_graph/reasoning/evidence_synthesis.py +347 -0
- aiecs/application/knowledge_graph/reasoning/inference_engine.py +504 -0
- aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +167 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/__init__.py +79 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_builder.py +513 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_nodes.py +630 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +654 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +477 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +390 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +217 -0
- aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +169 -0
- aiecs/application/knowledge_graph/reasoning/query_planner.py +872 -0
- aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +554 -0
- aiecs/application/knowledge_graph/retrieval/__init__.py +19 -0
- aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +596 -0
- aiecs/application/knowledge_graph/search/__init__.py +59 -0
- aiecs/application/knowledge_graph/search/hybrid_search.py +423 -0
- aiecs/application/knowledge_graph/search/reranker.py +295 -0
- aiecs/application/knowledge_graph/search/reranker_strategies.py +553 -0
- aiecs/application/knowledge_graph/search/text_similarity.py +398 -0
- aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
- aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +329 -0
- aiecs/application/knowledge_graph/traversal/path_scorer.py +269 -0
- aiecs/application/knowledge_graph/validators/__init__.py +13 -0
- aiecs/application/knowledge_graph/validators/relation_validator.py +189 -0
- aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
- aiecs/application/knowledge_graph/visualization/graph_visualizer.py +321 -0
- aiecs/common/__init__.py +9 -0
- aiecs/common/knowledge_graph/__init__.py +17 -0
- aiecs/common/knowledge_graph/runnable.py +484 -0
- aiecs/config/__init__.py +16 -0
- aiecs/config/config.py +498 -0
- aiecs/config/graph_config.py +137 -0
- aiecs/config/registry.py +23 -0
- aiecs/core/__init__.py +46 -0
- aiecs/core/interface/__init__.py +34 -0
- aiecs/core/interface/execution_interface.py +152 -0
- aiecs/core/interface/storage_interface.py +171 -0
- aiecs/domain/__init__.py +289 -0
- aiecs/domain/agent/__init__.py +189 -0
- aiecs/domain/agent/base_agent.py +697 -0
- aiecs/domain/agent/exceptions.py +103 -0
- aiecs/domain/agent/graph_aware_mixin.py +559 -0
- aiecs/domain/agent/hybrid_agent.py +490 -0
- aiecs/domain/agent/integration/__init__.py +26 -0
- aiecs/domain/agent/integration/context_compressor.py +222 -0
- aiecs/domain/agent/integration/context_engine_adapter.py +252 -0
- aiecs/domain/agent/integration/retry_policy.py +219 -0
- aiecs/domain/agent/integration/role_config.py +213 -0
- aiecs/domain/agent/knowledge_aware_agent.py +646 -0
- aiecs/domain/agent/lifecycle.py +296 -0
- aiecs/domain/agent/llm_agent.py +300 -0
- aiecs/domain/agent/memory/__init__.py +12 -0
- aiecs/domain/agent/memory/conversation.py +197 -0
- aiecs/domain/agent/migration/__init__.py +14 -0
- aiecs/domain/agent/migration/conversion.py +160 -0
- aiecs/domain/agent/migration/legacy_wrapper.py +90 -0
- aiecs/domain/agent/models.py +317 -0
- aiecs/domain/agent/observability.py +407 -0
- aiecs/domain/agent/persistence.py +289 -0
- aiecs/domain/agent/prompts/__init__.py +29 -0
- aiecs/domain/agent/prompts/builder.py +161 -0
- aiecs/domain/agent/prompts/formatters.py +189 -0
- aiecs/domain/agent/prompts/template.py +255 -0
- aiecs/domain/agent/registry.py +260 -0
- aiecs/domain/agent/tool_agent.py +257 -0
- aiecs/domain/agent/tools/__init__.py +12 -0
- aiecs/domain/agent/tools/schema_generator.py +221 -0
- aiecs/domain/community/__init__.py +155 -0
- aiecs/domain/community/agent_adapter.py +477 -0
- aiecs/domain/community/analytics.py +481 -0
- aiecs/domain/community/collaborative_workflow.py +642 -0
- aiecs/domain/community/communication_hub.py +645 -0
- aiecs/domain/community/community_builder.py +320 -0
- aiecs/domain/community/community_integration.py +800 -0
- aiecs/domain/community/community_manager.py +813 -0
- aiecs/domain/community/decision_engine.py +879 -0
- aiecs/domain/community/exceptions.py +225 -0
- aiecs/domain/community/models/__init__.py +33 -0
- aiecs/domain/community/models/community_models.py +268 -0
- aiecs/domain/community/resource_manager.py +457 -0
- aiecs/domain/community/shared_context_manager.py +603 -0
- aiecs/domain/context/__init__.py +58 -0
- aiecs/domain/context/context_engine.py +989 -0
- aiecs/domain/context/conversation_models.py +354 -0
- aiecs/domain/context/graph_memory.py +467 -0
- aiecs/domain/execution/__init__.py +12 -0
- aiecs/domain/execution/model.py +57 -0
- aiecs/domain/knowledge_graph/__init__.py +19 -0
- aiecs/domain/knowledge_graph/models/__init__.py +52 -0
- aiecs/domain/knowledge_graph/models/entity.py +130 -0
- aiecs/domain/knowledge_graph/models/evidence.py +194 -0
- aiecs/domain/knowledge_graph/models/inference_rule.py +186 -0
- aiecs/domain/knowledge_graph/models/path.py +179 -0
- aiecs/domain/knowledge_graph/models/path_pattern.py +173 -0
- aiecs/domain/knowledge_graph/models/query.py +272 -0
- aiecs/domain/knowledge_graph/models/query_plan.py +187 -0
- aiecs/domain/knowledge_graph/models/relation.py +136 -0
- aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
- aiecs/domain/knowledge_graph/schema/entity_type.py +135 -0
- aiecs/domain/knowledge_graph/schema/graph_schema.py +271 -0
- aiecs/domain/knowledge_graph/schema/property_schema.py +155 -0
- aiecs/domain/knowledge_graph/schema/relation_type.py +171 -0
- aiecs/domain/knowledge_graph/schema/schema_manager.py +496 -0
- aiecs/domain/knowledge_graph/schema/type_enums.py +205 -0
- aiecs/domain/task/__init__.py +13 -0
- aiecs/domain/task/dsl_processor.py +613 -0
- aiecs/domain/task/model.py +62 -0
- aiecs/domain/task/task_context.py +268 -0
- aiecs/infrastructure/__init__.py +24 -0
- aiecs/infrastructure/graph_storage/__init__.py +11 -0
- aiecs/infrastructure/graph_storage/base.py +601 -0
- aiecs/infrastructure/graph_storage/batch_operations.py +449 -0
- aiecs/infrastructure/graph_storage/cache.py +429 -0
- aiecs/infrastructure/graph_storage/distributed.py +226 -0
- aiecs/infrastructure/graph_storage/error_handling.py +390 -0
- aiecs/infrastructure/graph_storage/graceful_degradation.py +306 -0
- aiecs/infrastructure/graph_storage/health_checks.py +378 -0
- aiecs/infrastructure/graph_storage/in_memory.py +514 -0
- aiecs/infrastructure/graph_storage/index_optimization.py +483 -0
- aiecs/infrastructure/graph_storage/lazy_loading.py +410 -0
- aiecs/infrastructure/graph_storage/metrics.py +357 -0
- aiecs/infrastructure/graph_storage/migration.py +413 -0
- aiecs/infrastructure/graph_storage/pagination.py +471 -0
- aiecs/infrastructure/graph_storage/performance_monitoring.py +466 -0
- aiecs/infrastructure/graph_storage/postgres.py +871 -0
- aiecs/infrastructure/graph_storage/query_optimizer.py +635 -0
- aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
- aiecs/infrastructure/graph_storage/sqlite.py +623 -0
- aiecs/infrastructure/graph_storage/streaming.py +495 -0
- aiecs/infrastructure/messaging/__init__.py +13 -0
- aiecs/infrastructure/messaging/celery_task_manager.py +383 -0
- aiecs/infrastructure/messaging/websocket_manager.py +298 -0
- aiecs/infrastructure/monitoring/__init__.py +34 -0
- aiecs/infrastructure/monitoring/executor_metrics.py +174 -0
- aiecs/infrastructure/monitoring/global_metrics_manager.py +213 -0
- aiecs/infrastructure/monitoring/structured_logger.py +48 -0
- aiecs/infrastructure/monitoring/tracing_manager.py +410 -0
- aiecs/infrastructure/persistence/__init__.py +24 -0
- aiecs/infrastructure/persistence/context_engine_client.py +187 -0
- aiecs/infrastructure/persistence/database_manager.py +333 -0
- aiecs/infrastructure/persistence/file_storage.py +754 -0
- aiecs/infrastructure/persistence/redis_client.py +220 -0
- aiecs/llm/__init__.py +86 -0
- aiecs/llm/callbacks/__init__.py +11 -0
- aiecs/llm/callbacks/custom_callbacks.py +264 -0
- aiecs/llm/client_factory.py +420 -0
- aiecs/llm/clients/__init__.py +33 -0
- aiecs/llm/clients/base_client.py +193 -0
- aiecs/llm/clients/googleai_client.py +181 -0
- aiecs/llm/clients/openai_client.py +131 -0
- aiecs/llm/clients/vertex_client.py +437 -0
- aiecs/llm/clients/xai_client.py +184 -0
- aiecs/llm/config/__init__.py +51 -0
- aiecs/llm/config/config_loader.py +275 -0
- aiecs/llm/config/config_validator.py +236 -0
- aiecs/llm/config/model_config.py +151 -0
- aiecs/llm/utils/__init__.py +10 -0
- aiecs/llm/utils/validate_config.py +91 -0
- aiecs/main.py +363 -0
- aiecs/scripts/__init__.py +3 -0
- aiecs/scripts/aid/VERSION_MANAGEMENT.md +97 -0
- aiecs/scripts/aid/__init__.py +19 -0
- aiecs/scripts/aid/version_manager.py +215 -0
- aiecs/scripts/dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md +242 -0
- aiecs/scripts/dependance_check/README_DEPENDENCY_CHECKER.md +310 -0
- aiecs/scripts/dependance_check/__init__.py +17 -0
- aiecs/scripts/dependance_check/dependency_checker.py +938 -0
- aiecs/scripts/dependance_check/dependency_fixer.py +391 -0
- aiecs/scripts/dependance_check/download_nlp_data.py +396 -0
- aiecs/scripts/dependance_check/quick_dependency_check.py +270 -0
- aiecs/scripts/dependance_check/setup_nlp_data.sh +217 -0
- aiecs/scripts/dependance_patch/__init__.py +7 -0
- aiecs/scripts/dependance_patch/fix_weasel/README_WEASEL_PATCH.md +126 -0
- aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
- aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.py +128 -0
- aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.sh +82 -0
- aiecs/scripts/dependance_patch/fix_weasel/patch_weasel_library.sh +188 -0
- aiecs/scripts/dependance_patch/fix_weasel/run_weasel_patch.sh +41 -0
- aiecs/scripts/tools_develop/README.md +449 -0
- aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
- aiecs/scripts/tools_develop/__init__.py +21 -0
- aiecs/scripts/tools_develop/check_type_annotations.py +259 -0
- aiecs/scripts/tools_develop/validate_tool_schemas.py +422 -0
- aiecs/scripts/tools_develop/verify_tools.py +356 -0
- aiecs/tasks/__init__.py +1 -0
- aiecs/tasks/worker.py +172 -0
- aiecs/tools/__init__.py +299 -0
- aiecs/tools/apisource/__init__.py +99 -0
- aiecs/tools/apisource/intelligence/__init__.py +19 -0
- aiecs/tools/apisource/intelligence/data_fusion.py +381 -0
- aiecs/tools/apisource/intelligence/query_analyzer.py +413 -0
- aiecs/tools/apisource/intelligence/search_enhancer.py +388 -0
- aiecs/tools/apisource/monitoring/__init__.py +9 -0
- aiecs/tools/apisource/monitoring/metrics.py +303 -0
- aiecs/tools/apisource/providers/__init__.py +115 -0
- aiecs/tools/apisource/providers/base.py +664 -0
- aiecs/tools/apisource/providers/census.py +401 -0
- aiecs/tools/apisource/providers/fred.py +564 -0
- aiecs/tools/apisource/providers/newsapi.py +412 -0
- aiecs/tools/apisource/providers/worldbank.py +357 -0
- aiecs/tools/apisource/reliability/__init__.py +12 -0
- aiecs/tools/apisource/reliability/error_handler.py +375 -0
- aiecs/tools/apisource/reliability/fallback_strategy.py +391 -0
- aiecs/tools/apisource/tool.py +850 -0
- aiecs/tools/apisource/utils/__init__.py +9 -0
- aiecs/tools/apisource/utils/validators.py +338 -0
- aiecs/tools/base_tool.py +201 -0
- aiecs/tools/docs/__init__.py +121 -0
- aiecs/tools/docs/ai_document_orchestrator.py +599 -0
- aiecs/tools/docs/ai_document_writer_orchestrator.py +2403 -0
- aiecs/tools/docs/content_insertion_tool.py +1333 -0
- aiecs/tools/docs/document_creator_tool.py +1317 -0
- aiecs/tools/docs/document_layout_tool.py +1166 -0
- aiecs/tools/docs/document_parser_tool.py +994 -0
- aiecs/tools/docs/document_writer_tool.py +1818 -0
- aiecs/tools/knowledge_graph/__init__.py +17 -0
- aiecs/tools/knowledge_graph/graph_reasoning_tool.py +734 -0
- aiecs/tools/knowledge_graph/graph_search_tool.py +923 -0
- aiecs/tools/knowledge_graph/kg_builder_tool.py +476 -0
- aiecs/tools/langchain_adapter.py +542 -0
- aiecs/tools/schema_generator.py +275 -0
- aiecs/tools/search_tool/__init__.py +100 -0
- aiecs/tools/search_tool/analyzers.py +589 -0
- aiecs/tools/search_tool/cache.py +260 -0
- aiecs/tools/search_tool/constants.py +128 -0
- aiecs/tools/search_tool/context.py +216 -0
- aiecs/tools/search_tool/core.py +749 -0
- aiecs/tools/search_tool/deduplicator.py +123 -0
- aiecs/tools/search_tool/error_handler.py +271 -0
- aiecs/tools/search_tool/metrics.py +371 -0
- aiecs/tools/search_tool/rate_limiter.py +178 -0
- aiecs/tools/search_tool/schemas.py +277 -0
- aiecs/tools/statistics/__init__.py +80 -0
- aiecs/tools/statistics/ai_data_analysis_orchestrator.py +643 -0
- aiecs/tools/statistics/ai_insight_generator_tool.py +505 -0
- aiecs/tools/statistics/ai_report_orchestrator_tool.py +694 -0
- aiecs/tools/statistics/data_loader_tool.py +564 -0
- aiecs/tools/statistics/data_profiler_tool.py +658 -0
- aiecs/tools/statistics/data_transformer_tool.py +573 -0
- aiecs/tools/statistics/data_visualizer_tool.py +495 -0
- aiecs/tools/statistics/model_trainer_tool.py +487 -0
- aiecs/tools/statistics/statistical_analyzer_tool.py +459 -0
- aiecs/tools/task_tools/__init__.py +86 -0
- aiecs/tools/task_tools/chart_tool.py +732 -0
- aiecs/tools/task_tools/classfire_tool.py +922 -0
- aiecs/tools/task_tools/image_tool.py +447 -0
- aiecs/tools/task_tools/office_tool.py +684 -0
- aiecs/tools/task_tools/pandas_tool.py +635 -0
- aiecs/tools/task_tools/report_tool.py +635 -0
- aiecs/tools/task_tools/research_tool.py +392 -0
- aiecs/tools/task_tools/scraper_tool.py +715 -0
- aiecs/tools/task_tools/stats_tool.py +688 -0
- aiecs/tools/temp_file_manager.py +130 -0
- aiecs/tools/tool_executor/__init__.py +37 -0
- aiecs/tools/tool_executor/tool_executor.py +881 -0
- aiecs/utils/LLM_output_structor.py +445 -0
- aiecs/utils/__init__.py +34 -0
- aiecs/utils/base_callback.py +47 -0
- aiecs/utils/cache_provider.py +695 -0
- aiecs/utils/execution_utils.py +184 -0
- aiecs/utils/logging.py +1 -0
- aiecs/utils/prompt_loader.py +14 -0
- aiecs/utils/token_usage_repository.py +323 -0
- aiecs/ws/__init__.py +0 -0
- aiecs/ws/socket_server.py +52 -0
- aiecs-1.5.1.dist-info/METADATA +608 -0
- aiecs-1.5.1.dist-info/RECORD +302 -0
- aiecs-1.5.1.dist-info/WHEEL +5 -0
- aiecs-1.5.1.dist-info/entry_points.txt +10 -0
- aiecs-1.5.1.dist-info/licenses/LICENSE +225 -0
- aiecs-1.5.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import time
|
|
2
|
+
import logging
|
|
3
|
+
import json
|
|
4
|
+
from typing import Dict, Any, Optional, AsyncGenerator, List
|
|
5
|
+
from contextlib import asynccontextmanager
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
logger = logging.getLogger(__name__)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass
|
|
13
|
+
class ContextUpdate:
|
|
14
|
+
"""Represents a single update to the context (e.g., message, metadata, or resource)."""
|
|
15
|
+
|
|
16
|
+
timestamp: float
|
|
17
|
+
update_type: str # e.g., "message", "metadata", "resource"
|
|
18
|
+
data: Any # Content of the update (e.g., message text, metadata dict)
|
|
19
|
+
# Additional metadata (e.g., file paths, model info)
|
|
20
|
+
metadata: Dict[str, Any]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class TaskContext:
|
|
24
|
+
"""
|
|
25
|
+
Enhanced context manager for task execution with:
|
|
26
|
+
- Context history tracking and checkpointing
|
|
27
|
+
- Resource acquisition and release
|
|
28
|
+
- Performance tracking
|
|
29
|
+
- File and model tracking
|
|
30
|
+
- Persistent storage
|
|
31
|
+
- Metadata toggles
|
|
32
|
+
- Enhanced error handling
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
def __init__(self, data: dict, task_dir: str = "./tasks"):
|
|
36
|
+
self.user_id = data.get("user_id", "anonymous")
|
|
37
|
+
self.chat_id = data.get("chat_id", "none")
|
|
38
|
+
# Ensure metadata includes aiPreference
|
|
39
|
+
self.metadata = data.get("metadata", {})
|
|
40
|
+
if "aiPreference" in data:
|
|
41
|
+
self.metadata["aiPreference"] = data["aiPreference"]
|
|
42
|
+
self.task_dir = Path(task_dir)
|
|
43
|
+
self.start_time: Optional[float] = None
|
|
44
|
+
self.resources: Dict[str, Any] = {}
|
|
45
|
+
self.context_history: List[ContextUpdate] = []
|
|
46
|
+
# Tracks file operations
|
|
47
|
+
self.file_tracker: Dict[str, Dict[str, Any]] = {}
|
|
48
|
+
self.model_tracker: List[Dict[str, Any]] = [] # Tracks model usage
|
|
49
|
+
self.metadata_toggles: Dict[str, bool] = data.get("metadata_toggles", {})
|
|
50
|
+
self._initialize_persistence()
|
|
51
|
+
|
|
52
|
+
def _initialize_persistence(self):
|
|
53
|
+
"""Initialize persistent storage for context history."""
|
|
54
|
+
try:
|
|
55
|
+
self.task_dir.mkdir(parents=True, exist_ok=True)
|
|
56
|
+
history_file = self.task_dir / f"context_history_{self.chat_id}.json"
|
|
57
|
+
if history_file.exists():
|
|
58
|
+
with open(history_file, "r") as f:
|
|
59
|
+
raw_history = json.load(f)
|
|
60
|
+
self.context_history = [
|
|
61
|
+
ContextUpdate(
|
|
62
|
+
timestamp=entry["timestamp"],
|
|
63
|
+
update_type=entry["update_type"],
|
|
64
|
+
data=entry["data"],
|
|
65
|
+
metadata=entry["metadata"],
|
|
66
|
+
)
|
|
67
|
+
for entry in raw_history
|
|
68
|
+
]
|
|
69
|
+
logger.debug(f"Loaded context history from {history_file}")
|
|
70
|
+
except Exception as e:
|
|
71
|
+
logger.error(f"Failed to initialize context history: {e}")
|
|
72
|
+
|
|
73
|
+
async def _save_context_history(self):
|
|
74
|
+
"""Save context history to disk."""
|
|
75
|
+
try:
|
|
76
|
+
history_file = self.task_dir / f"context_history_{self.chat_id}.json"
|
|
77
|
+
serialized_history = [
|
|
78
|
+
{
|
|
79
|
+
"timestamp": update.timestamp,
|
|
80
|
+
"update_type": update.update_type,
|
|
81
|
+
"data": update.data,
|
|
82
|
+
"metadata": update.metadata,
|
|
83
|
+
}
|
|
84
|
+
for update in self.context_history
|
|
85
|
+
]
|
|
86
|
+
with open(history_file, "w") as f:
|
|
87
|
+
json.dump(serialized_history, f, indent=2)
|
|
88
|
+
logger.debug(f"Saved context history to {history_file}")
|
|
89
|
+
except Exception as e:
|
|
90
|
+
logger.error(f"Failed to save context history: {e}")
|
|
91
|
+
|
|
92
|
+
def add_context_update(self, update_type: str, data: Any, metadata: Dict[str, Any] = None):
|
|
93
|
+
"""Add a context update (e.g., message, metadata change)."""
|
|
94
|
+
update = ContextUpdate(
|
|
95
|
+
timestamp=time.time(),
|
|
96
|
+
update_type=update_type,
|
|
97
|
+
data=data,
|
|
98
|
+
metadata=metadata or {},
|
|
99
|
+
)
|
|
100
|
+
self.context_history.append(update)
|
|
101
|
+
logger.debug(f"Added context update: {update_type}")
|
|
102
|
+
|
|
103
|
+
def add_resource(self, name: str, resource: Any) -> None:
|
|
104
|
+
"""Add a resource that needs cleanup."""
|
|
105
|
+
self.resources[name] = resource
|
|
106
|
+
self.add_context_update("resource", {"name": name}, {"type": type(resource).__name__})
|
|
107
|
+
logger.debug(f"Added resource: {name}")
|
|
108
|
+
|
|
109
|
+
def track_file_operation(self, file_path: str, operation: str, source: str = "task"):
|
|
110
|
+
"""Track a file operation (e.g., read, edit)."""
|
|
111
|
+
self.file_tracker[file_path] = {
|
|
112
|
+
"operation": operation,
|
|
113
|
+
"source": source,
|
|
114
|
+
"timestamp": time.time(),
|
|
115
|
+
"state": "active",
|
|
116
|
+
}
|
|
117
|
+
self.add_context_update(
|
|
118
|
+
"file_operation",
|
|
119
|
+
{"path": file_path, "operation": operation},
|
|
120
|
+
{"source": source},
|
|
121
|
+
)
|
|
122
|
+
logger.debug(f"Tracked file operation: {operation} on {file_path}")
|
|
123
|
+
|
|
124
|
+
def track_model_usage(self, model_id: str, provider_id: str, mode: str):
|
|
125
|
+
"""Track AI model usage."""
|
|
126
|
+
model_entry = {
|
|
127
|
+
"model_id": model_id,
|
|
128
|
+
"provider_id": provider_id,
|
|
129
|
+
"mode": mode,
|
|
130
|
+
"timestamp": time.time(),
|
|
131
|
+
}
|
|
132
|
+
# Avoid duplicates
|
|
133
|
+
if not self.model_tracker or self.model_tracker[-1] != model_entry:
|
|
134
|
+
self.model_tracker.append(model_entry)
|
|
135
|
+
self.add_context_update("model_usage", model_entry)
|
|
136
|
+
logger.debug(f"Tracked model usage: {model_id} ({provider_id}, {mode})")
|
|
137
|
+
|
|
138
|
+
def optimize_context(self, max_size: int = 1000) -> bool:
|
|
139
|
+
"""Optimize context by removing duplicates and old entries."""
|
|
140
|
+
deduplicated = {}
|
|
141
|
+
optimized_history = []
|
|
142
|
+
total_size = 0
|
|
143
|
+
|
|
144
|
+
for update in reversed(self.context_history):
|
|
145
|
+
key = f"{update.update_type}:{json.dumps(update.data, sort_keys=True)}"
|
|
146
|
+
if key not in deduplicated:
|
|
147
|
+
deduplicated[key] = update
|
|
148
|
+
data_size = len(str(update.data))
|
|
149
|
+
if total_size + data_size <= max_size:
|
|
150
|
+
optimized_history.append(update)
|
|
151
|
+
total_size += data_size
|
|
152
|
+
|
|
153
|
+
self.context_history = list(reversed(optimized_history))
|
|
154
|
+
if len(deduplicated) < len(self.context_history):
|
|
155
|
+
logger.debug(
|
|
156
|
+
f"Optimized context: removed {len(self.context_history) - len(deduplicated)} duplicates"
|
|
157
|
+
)
|
|
158
|
+
return True
|
|
159
|
+
return False
|
|
160
|
+
|
|
161
|
+
async def truncate_context_history(self, timestamp: float):
|
|
162
|
+
"""Truncate context history after a given timestamp."""
|
|
163
|
+
original_len = len(self.context_history)
|
|
164
|
+
self.context_history = [
|
|
165
|
+
update for update in self.context_history if update.timestamp <= timestamp
|
|
166
|
+
]
|
|
167
|
+
if len(self.context_history) < original_len:
|
|
168
|
+
await self._save_context_history()
|
|
169
|
+
logger.debug(f"Truncated context history at timestamp {timestamp}")
|
|
170
|
+
|
|
171
|
+
def get_active_metadata(self) -> Dict[str, Any]:
|
|
172
|
+
"""Return metadata filtered by toggles."""
|
|
173
|
+
return {
|
|
174
|
+
key: value
|
|
175
|
+
for key, value in self.metadata.items()
|
|
176
|
+
if key not in self.metadata_toggles or self.metadata_toggles[key] is not False
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
180
|
+
"""Convert context to dictionary."""
|
|
181
|
+
return {
|
|
182
|
+
"user_id": self.user_id,
|
|
183
|
+
"chat_id": self.chat_id,
|
|
184
|
+
"metadata": self.get_active_metadata(),
|
|
185
|
+
"context_history": [
|
|
186
|
+
{
|
|
187
|
+
"timestamp": update.timestamp,
|
|
188
|
+
"update_type": update.update_type,
|
|
189
|
+
"data": update.data,
|
|
190
|
+
"metadata": update.metadata,
|
|
191
|
+
}
|
|
192
|
+
for update in self.context_history
|
|
193
|
+
],
|
|
194
|
+
"file_tracker": self.file_tracker,
|
|
195
|
+
"model_tracker": self.model_tracker,
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
def __enter__(self):
|
|
199
|
+
"""Synchronous context entry."""
|
|
200
|
+
self.start_time = time.time()
|
|
201
|
+
logger.debug(f"Starting task context for user {self.user_id}, chat {self.chat_id}")
|
|
202
|
+
return self
|
|
203
|
+
|
|
204
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
205
|
+
"""Synchronous context exit with cleanup."""
|
|
206
|
+
duration = time.time() - self.start_time
|
|
207
|
+
logger.debug(f"Completed task context in {duration:.2f}s for user {self.user_id}")
|
|
208
|
+
for resource_name, resource in self.resources.items():
|
|
209
|
+
try:
|
|
210
|
+
if hasattr(resource, "close"):
|
|
211
|
+
resource.close()
|
|
212
|
+
logger.debug(f"Cleaned up resource: {resource_name}")
|
|
213
|
+
except Exception as e:
|
|
214
|
+
logger.error(f"Error cleaning up resource {resource_name}: {e}")
|
|
215
|
+
if exc_type:
|
|
216
|
+
logger.error(f"Task context exited with error: {exc_val}")
|
|
217
|
+
return False
|
|
218
|
+
|
|
219
|
+
async def __aenter__(self):
|
|
220
|
+
"""Asynchronous context entry."""
|
|
221
|
+
self.start_time = time.time()
|
|
222
|
+
logger.debug(f"Starting async task context for user {self.user_id}, chat {self.chat_id}")
|
|
223
|
+
return self
|
|
224
|
+
|
|
225
|
+
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
|
226
|
+
"""Asynchronous context exit with cleanup."""
|
|
227
|
+
duration = time.time() - self.start_time
|
|
228
|
+
logger.debug(f"Completed async task context in {duration:.2f}s for user {self.user_id}")
|
|
229
|
+
for resource_name, resource in self.resources.items():
|
|
230
|
+
try:
|
|
231
|
+
if hasattr(resource, "close"):
|
|
232
|
+
if callable(getattr(resource, "close")):
|
|
233
|
+
if hasattr(resource.close, "__await__"):
|
|
234
|
+
await resource.close()
|
|
235
|
+
else:
|
|
236
|
+
resource.close()
|
|
237
|
+
logger.debug(f"Cleaned up async resource: {resource_name}")
|
|
238
|
+
except Exception as e:
|
|
239
|
+
logger.error(f"Error cleaning up async resource {resource_name}: {e}")
|
|
240
|
+
if exc_type:
|
|
241
|
+
logger.error(f"Async task context exited with error: {exc_val}")
|
|
242
|
+
await self._save_context_history()
|
|
243
|
+
return False
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def build_context(data: dict) -> dict:
|
|
247
|
+
"""Build a simple context dictionary (for backward compatibility)."""
|
|
248
|
+
context = TaskContext(data)
|
|
249
|
+
return context.to_dict()
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
@asynccontextmanager
|
|
253
|
+
async def task_context(data: dict, task_dir: str = "./tasks") -> AsyncGenerator[TaskContext, None]:
|
|
254
|
+
"""
|
|
255
|
+
Async context manager for task execution.
|
|
256
|
+
|
|
257
|
+
Usage:
|
|
258
|
+
async with task_context(request_data, task_dir="/path/to/tasks") as context:
|
|
259
|
+
context.add_context_update("message", "User input", {"source": "user"})
|
|
260
|
+
context.track_file_operation("example.py", "read", "tool")
|
|
261
|
+
result = await service_instance.run(data, context)
|
|
262
|
+
"""
|
|
263
|
+
context = TaskContext(data, task_dir)
|
|
264
|
+
try:
|
|
265
|
+
await context.__aenter__()
|
|
266
|
+
yield context
|
|
267
|
+
finally:
|
|
268
|
+
await context.__aexit__(None, None, None)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Infrastructure layer module
|
|
2
|
+
|
|
3
|
+
Contains external system integrations and technical concerns.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from .messaging.celery_task_manager import CeleryTaskManager
|
|
7
|
+
from .messaging.websocket_manager import WebSocketManager, UserConfirmation
|
|
8
|
+
from .persistence.database_manager import DatabaseManager
|
|
9
|
+
from .persistence.redis_client import RedisClient
|
|
10
|
+
from .monitoring.executor_metrics import ExecutorMetrics
|
|
11
|
+
from .monitoring.tracing_manager import TracingManager
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
# Messaging
|
|
15
|
+
"CeleryTaskManager",
|
|
16
|
+
"WebSocketManager",
|
|
17
|
+
"UserConfirmation",
|
|
18
|
+
# Persistence
|
|
19
|
+
"DatabaseManager",
|
|
20
|
+
"RedisClient",
|
|
21
|
+
# Monitoring
|
|
22
|
+
"ExecutorMetrics",
|
|
23
|
+
"TracingManager",
|
|
24
|
+
]
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from aiecs.infrastructure.graph_storage.base import GraphStore
|
|
2
|
+
from aiecs.infrastructure.graph_storage.in_memory import InMemoryGraphStore
|
|
3
|
+
from aiecs.infrastructure.graph_storage.sqlite import SQLiteGraphStore
|
|
4
|
+
from aiecs.infrastructure.graph_storage.postgres import PostgresGraphStore
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"GraphStore",
|
|
8
|
+
"InMemoryGraphStore",
|
|
9
|
+
"SQLiteGraphStore",
|
|
10
|
+
"PostgresGraphStore",
|
|
11
|
+
]
|