aiecs 1.5.4__tar.gz → 1.8.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.
Potentially problematic release.
This version of aiecs might be problematic. Click here for more details.
- {aiecs-1.5.4 → aiecs-1.8.2}/MANIFEST.in +2 -1
- {aiecs-1.5.4/aiecs.egg-info → aiecs-1.8.2}/PKG-INFO +42 -7
- {aiecs-1.5.4 → aiecs-1.8.2}/README.md +16 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/__init__.py +1 -1
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/aiecs_client.py +37 -13
- aiecs-1.8.2/aiecs/application/knowledge_graph/builder/data_quality.py +302 -0
- aiecs-1.8.2/aiecs/application/knowledge_graph/builder/data_reshaping.py +293 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/builder/graph_builder.py +4 -6
- aiecs-1.8.2/aiecs/application/knowledge_graph/builder/import_optimizer.py +396 -0
- aiecs-1.8.2/aiecs/application/knowledge_graph/builder/schema_inference.py +462 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/builder/schema_mapping.py +84 -1
- aiecs-1.8.2/aiecs/application/knowledge_graph/builder/structured_pipeline.py +1384 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +12 -5
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +5 -2
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +3 -1
- aiecs-1.8.2/aiecs/application/knowledge_graph/fusion/__init__.py +78 -0
- aiecs-1.8.2/aiecs/application/knowledge_graph/fusion/ab_testing.py +395 -0
- aiecs-1.8.2/aiecs/application/knowledge_graph/fusion/abbreviation_expander.py +327 -0
- aiecs-1.8.2/aiecs/application/knowledge_graph/fusion/alias_index.py +597 -0
- aiecs-1.8.2/aiecs/application/knowledge_graph/fusion/alias_matcher.py +384 -0
- aiecs-1.8.2/aiecs/application/knowledge_graph/fusion/cache_coordinator.py +343 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +58 -7
- aiecs-1.8.2/aiecs/application/knowledge_graph/fusion/entity_linker.py +511 -0
- aiecs-1.8.2/aiecs/application/knowledge_graph/fusion/evaluation_dataset.py +240 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +72 -16
- aiecs-1.8.2/aiecs/application/knowledge_graph/fusion/matching_config.py +489 -0
- aiecs-1.8.2/aiecs/application/knowledge_graph/fusion/name_normalizer.py +352 -0
- aiecs-1.8.2/aiecs/application/knowledge_graph/fusion/semantic_name_matcher.py +464 -0
- aiecs-1.8.2/aiecs/application/knowledge_graph/fusion/similarity_pipeline.py +534 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +4 -2
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/reasoning/logic_parser/ast_nodes.py +306 -21
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +241 -17
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +18 -6
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +11 -4
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/reasoning/query_planner.py +28 -23
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/retrieval/query_intent_classifier.py +10 -4
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/search/hybrid_search.py +16 -3
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/search/reranker.py +4 -6
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/search/reranker_strategies.py +12 -16
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/search/text_similarity.py +5 -7
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/validators/relation_validator.py +67 -5
- aiecs-1.8.2/aiecs/config/__init__.py +30 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/config/config.py +330 -0
- aiecs-1.8.2/aiecs/config/tool_config.py +435 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/core/__init__.py +16 -0
- aiecs-1.8.2/aiecs/core/registry/__init__.py +31 -0
- aiecs-1.8.2/aiecs/core/registry/service_registry.py +92 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/base_agent.py +79 -0
- aiecs-1.8.2/aiecs/domain/agent/hybrid_agent.py +1812 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/integration/context_engine_adapter.py +24 -16
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/knowledge_aware_agent.py +68 -25
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/llm_agent.py +32 -7
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/memory/conversation.py +58 -15
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/models.py +24 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/tools/__init__.py +4 -1
- aiecs-1.8.2/aiecs/domain/agent/tools/schema_generator.py +377 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/community/resource_manager.py +6 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/context/context_engine.py +9 -6
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/context/graph_memory.py +143 -26
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/knowledge_graph/models/entity.py +21 -1
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/knowledge_graph/models/query.py +15 -2
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/knowledge_graph/models/relation.py +70 -1
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/knowledge_graph/schema/schema_manager.py +264 -59
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/graph_storage/base.py +280 -30
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/graph_storage/batch_operations.py +12 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/graph_storage/cache.py +4 -3
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/graph_storage/error_handling.py +1 -1
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/graph_storage/graceful_degradation.py +2 -2
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/graph_storage/health_checks.py +2 -2
- aiecs-1.8.2/aiecs/infrastructure/graph_storage/in_memory.py +1197 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/graph_storage/migration.py +19 -12
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/graph_storage/pagination.py +1 -1
- aiecs-1.8.2/aiecs/infrastructure/graph_storage/postgres.py +1563 -0
- aiecs-1.8.2/aiecs/infrastructure/graph_storage/property_storage.py +353 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/graph_storage/query_optimizer.py +32 -10
- aiecs-1.8.2/aiecs/infrastructure/graph_storage/sqlite.py +1373 -0
- aiecs-1.8.2/aiecs/infrastructure/graph_storage/tenant.py +412 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/messaging/websocket_manager.py +13 -6
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/persistence/__init__.py +2 -1
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/persistence/file_storage.py +27 -5
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/llm/__init__.py +2 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/llm/client_factory.py +13 -2
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/llm/client_resolver.py +6 -2
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/llm/clients/__init__.py +5 -0
- aiecs-1.8.2/aiecs/llm/clients/base_client.py +369 -0
- aiecs-1.8.2/aiecs/llm/clients/google_function_calling_mixin.py +415 -0
- aiecs-1.8.2/aiecs/llm/clients/googleai_client.py +415 -0
- aiecs-1.8.2/aiecs/llm/clients/openai_client.py +170 -0
- aiecs-1.8.2/aiecs/llm/clients/openai_compatible_mixin.py +407 -0
- aiecs-1.8.2/aiecs/llm/clients/openrouter_client.py +272 -0
- aiecs-1.8.2/aiecs/llm/clients/vertex_client.py +1260 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/llm/clients/xai_client.py +88 -35
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/llm/config/config_loader.py +1 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/llm/protocols.py +19 -1
- aiecs-1.8.2/aiecs/llm/utils/image_utils.py +179 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/main.py +11 -5
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/aid/VERSION_MANAGEMENT.md +47 -6
- aiecs-1.8.2/aiecs/scripts/aid/module_checker.py +499 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/aid/version_manager.py +34 -8
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/dependance_check/__init__.py +0 -2
- aiecs-1.8.2/aiecs/scripts/dependance_check/dependency_checker.py +1835 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/dependance_check/dependency_fixer.py +68 -7
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/dependance_check/download_nlp_data.py +91 -3
- aiecs-1.8.2/aiecs/scripts/knowledge_graph/__init__.py +3 -0
- aiecs-1.8.2/aiecs/scripts/knowledge_graph/run_threshold_experiments.py +212 -0
- aiecs-1.8.2/aiecs/scripts/migrations/multi_tenancy/README.md +142 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/tools_develop/README.md +244 -22
- aiecs-1.8.2/aiecs/scripts/tools_develop/README_CONFIG_CHECKER.md +273 -0
- aiecs-1.8.2/aiecs/scripts/tools_develop/TOOLS_CONFIG_GUIDE.md +1287 -0
- aiecs-1.8.2/aiecs/scripts/tools_develop/check_all_tools_config.py +548 -0
- aiecs-1.8.2/aiecs/scripts/tools_develop/pre-commit-schema-coverage.sh +66 -0
- aiecs-1.8.2/aiecs/scripts/tools_develop/schema_coverage.py +511 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/tools_develop/validate_tool_schemas.py +80 -4
- aiecs-1.8.2/aiecs/scripts/tools_develop/verify_executor_config_fix.py +98 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tasks/worker.py +3 -1
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/__init__.py +19 -1
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/apisource/intelligence/data_fusion.py +261 -9
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/apisource/providers/base.py +29 -3
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/apisource/providers/worldbank.py +1 -1
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/apisource/tool.py +34 -10
- aiecs-1.8.2/aiecs/tools/base_tool.py +596 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/docs/ai_document_orchestrator.py +29 -12
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/docs/ai_document_writer_orchestrator.py +59 -21
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/docs/content_insertion_tool.py +46 -15
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/docs/document_creator_tool.py +178 -15
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/docs/document_layout_tool.py +39 -15
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/docs/document_parser_tool.py +74 -26
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/docs/document_writer_tool.py +258 -15
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/knowledge_graph/graph_reasoning_tool.py +145 -57
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/knowledge_graph/graph_search_tool.py +114 -73
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/knowledge_graph/kg_builder_tool.py +99 -42
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/langchain_adapter.py +2 -2
- aiecs-1.8.2/aiecs/tools/schema_generator.py +455 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/search_tool/core.py +131 -48
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/statistics/ai_data_analysis_orchestrator.py +26 -9
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/statistics/ai_insight_generator_tool.py +26 -9
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/statistics/ai_report_orchestrator_tool.py +26 -9
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/statistics/data_loader_tool.py +25 -12
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/statistics/data_profiler_tool.py +21 -8
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/statistics/data_transformer_tool.py +21 -8
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/statistics/data_visualizer_tool.py +22 -9
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/statistics/model_trainer_tool.py +36 -12
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/statistics/statistical_analyzer_tool.py +26 -9
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/task_tools/__init__.py +10 -1
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/task_tools/chart_tool.py +27 -14
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/task_tools/classfire_tool.py +31 -25
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/task_tools/image_tool.py +138 -89
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/task_tools/office_tool.py +76 -63
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/task_tools/pandas_tool.py +267 -9
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/task_tools/report_tool.py +112 -11
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/task_tools/research_tool.py +72 -9
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/task_tools/scraper_tool.py +88 -10
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/task_tools/stats_tool.py +115 -9
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/tool_executor/tool_executor.py +8 -4
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/utils/cache_provider.py +2 -1
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/ws/socket_server.py +3 -0
- {aiecs-1.5.4 → aiecs-1.8.2/aiecs.egg-info}/PKG-INFO +42 -7
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs.egg-info/SOURCES.txt +33 -2
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs.egg-info/entry_points.txt +4 -1
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs.egg-info/requires.txt +24 -3
- {aiecs-1.5.4 → aiecs-1.8.2}/pyproject.toml +78 -36
- aiecs-1.5.4/aiecs/application/knowledge_graph/builder/structured_pipeline.py +0 -442
- aiecs-1.5.4/aiecs/application/knowledge_graph/fusion/__init__.py +0 -23
- aiecs-1.5.4/aiecs/application/knowledge_graph/fusion/entity_linker.py +0 -334
- aiecs-1.5.4/aiecs/config/__init__.py +0 -16
- aiecs-1.5.4/aiecs/config/registry.py +0 -23
- aiecs-1.5.4/aiecs/domain/agent/hybrid_agent.py +0 -1063
- aiecs-1.5.4/aiecs/domain/agent/tools/schema_generator.py +0 -221
- aiecs-1.5.4/aiecs/infrastructure/graph_storage/in_memory.py +0 -508
- aiecs-1.5.4/aiecs/infrastructure/graph_storage/postgres.py +0 -838
- aiecs-1.5.4/aiecs/infrastructure/graph_storage/sqlite.py +0 -648
- aiecs-1.5.4/aiecs/llm/clients/base_client.py +0 -180
- aiecs-1.5.4/aiecs/llm/clients/googleai_client.py +0 -179
- aiecs-1.5.4/aiecs/llm/clients/openai_client.py +0 -135
- aiecs-1.5.4/aiecs/llm/clients/vertex_client.py +0 -398
- aiecs-1.5.4/aiecs/scripts/dependance_check/dependency_checker.py +0 -925
- aiecs-1.5.4/aiecs/scripts/dependance_check/quick_dependency_check.py +0 -270
- aiecs-1.5.4/aiecs/tools/base_tool.py +0 -195
- aiecs-1.5.4/aiecs/tools/schema_generator.py +0 -272
- {aiecs-1.5.4 → aiecs-1.8.2}/LICENSE +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/__main__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/executors/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/executors/operation_executor.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/builder/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/builder/document_builder.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/builder/text_chunker.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/extractors/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/extractors/base.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/pattern_matching/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/pattern_matching/query_executor.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/profiling/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/profiling/query_profiler.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/reasoning/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/reasoning/evidence_synthesis.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/reasoning/inference_engine.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/reasoning/logic_parser/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/reasoning/logic_parser/ast_builder.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/retrieval/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/retrieval/strategy_types.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/search/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/traversal/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/traversal/path_scorer.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/validators/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/visualization/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/application/knowledge_graph/visualization/graph_visualizer.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/common/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/common/knowledge_graph/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/common/knowledge_graph/runnable.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/config/graph_config.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/core/interface/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/core/interface/execution_interface.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/core/interface/storage_interface.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/exceptions.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/graph_aware_mixin.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/integration/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/integration/context_compressor.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/integration/protocols.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/integration/retry_policy.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/integration/role_config.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/lifecycle.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/memory/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/migration/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/migration/conversion.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/migration/legacy_wrapper.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/observability.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/persistence.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/prompts/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/prompts/builder.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/prompts/formatters.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/prompts/template.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/registry.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/agent/tool_agent.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/community/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/community/agent_adapter.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/community/analytics.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/community/collaborative_workflow.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/community/communication_hub.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/community/community_builder.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/community/community_integration.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/community/community_manager.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/community/decision_engine.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/community/exceptions.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/community/models/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/community/models/community_models.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/community/shared_context_manager.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/context/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/context/conversation_models.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/execution/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/execution/model.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/knowledge_graph/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/knowledge_graph/models/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/knowledge_graph/models/evidence.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/knowledge_graph/models/inference_rule.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/knowledge_graph/models/path.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/knowledge_graph/models/path_pattern.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/knowledge_graph/models/query_plan.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/knowledge_graph/schema/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/knowledge_graph/schema/entity_type.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/knowledge_graph/schema/graph_schema.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/knowledge_graph/schema/property_schema.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/knowledge_graph/schema/relation_type.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/knowledge_graph/schema/type_enums.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/task/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/task/dsl_processor.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/task/model.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/domain/task/task_context.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/graph_storage/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/graph_storage/distributed.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/graph_storage/index_optimization.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/graph_storage/lazy_loading.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/graph_storage/metrics.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/graph_storage/performance_monitoring.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/graph_storage/protocols.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/graph_storage/schema_cache.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/graph_storage/streaming.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/messaging/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/messaging/celery_task_manager.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/monitoring/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/monitoring/executor_metrics.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/monitoring/global_metrics_manager.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/monitoring/structured_logger.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/monitoring/tracing_manager.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/persistence/context_engine_client.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/persistence/database_manager.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/infrastructure/persistence/redis_client.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/llm/callbacks/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/llm/callbacks/custom_callbacks.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/llm/config/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/llm/config/config_validator.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/llm/config/model_config.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/llm/utils/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/llm/utils/validate_config.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/aid/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/dependance_check/README_DEPENDENCY_CHECKER.md +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/dependance_check/setup_nlp_data.sh +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/dependance_patch/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/dependance_patch/fix_weasel/README_WEASEL_PATCH.md +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/dependance_patch/fix_weasel/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.sh +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/dependance_patch/fix_weasel/patch_weasel_library.sh +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/dependance_patch/fix_weasel/run_weasel_patch.sh +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/tools_develop/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/tools_develop/check_type_annotations.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/scripts/tools_develop/verify_tools.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tasks/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/apisource/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/apisource/intelligence/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/apisource/intelligence/query_analyzer.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/apisource/intelligence/search_enhancer.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/apisource/monitoring/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/apisource/monitoring/metrics.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/apisource/providers/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/apisource/providers/census.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/apisource/providers/fred.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/apisource/providers/newsapi.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/apisource/reliability/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/apisource/reliability/error_handler.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/apisource/reliability/fallback_strategy.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/apisource/utils/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/apisource/utils/validators.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/docs/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/knowledge_graph/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/search_tool/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/search_tool/analyzers.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/search_tool/cache.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/search_tool/constants.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/search_tool/context.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/search_tool/deduplicator.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/search_tool/error_handler.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/search_tool/metrics.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/search_tool/rate_limiter.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/search_tool/schemas.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/statistics/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/temp_file_manager.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/tools/tool_executor/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/utils/LLM_output_structor.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/utils/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/utils/base_callback.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/utils/execution_utils.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/utils/logging.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/utils/prompt_loader.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/utils/token_usage_repository.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs/ws/__init__.py +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs.egg-info/dependency_links.txt +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/aiecs.egg-info/top_level.txt +0 -0
- {aiecs-1.5.4 → aiecs-1.8.2}/setup.cfg +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aiecs
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.8.2
|
|
4
4
|
Summary: AI Execute Services - A middleware framework for AI-powered task execution and tool orchestration
|
|
5
5
|
Author-email: AIECS Team <iretbl@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
7
|
-
Project-URL: Homepage, https://github.com/
|
|
8
|
-
Project-URL: Bug Tracker, https://github.com/
|
|
7
|
+
Project-URL: Homepage, https://github.com/Howmany-Zeta/AI-Execute-Services
|
|
8
|
+
Project-URL: Bug Tracker, https://github.com/Howmany-Zeta/AI-Execute-Services/issues
|
|
9
9
|
Project-URL: Documentation, https://aiecs.readthedocs.io
|
|
10
10
|
Keywords: ai,middleware,llm,orchestration,async,tools
|
|
11
11
|
Classifier: Development Status :: 4 - Beta
|
|
@@ -18,7 +18,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
18
18
|
Classifier: Framework :: FastAPI
|
|
19
19
|
Classifier: Framework :: Celery
|
|
20
20
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
21
|
-
Requires-Python: <3.13,>=3.
|
|
21
|
+
Requires-Python: <3.13,>=3.11
|
|
22
22
|
Description-Content-Type: text/markdown
|
|
23
23
|
License-File: LICENSE
|
|
24
24
|
Requires-Dist: fastapi<0.116.0,>=0.115.12
|
|
@@ -38,7 +38,7 @@ Requires-Dist: tenacity<10.0.0,>=9.1.2
|
|
|
38
38
|
Requires-Dist: flower<3.0.0,>=2.0.1
|
|
39
39
|
Requires-Dist: openai<1.76.0,>=1.68.2
|
|
40
40
|
Requires-Dist: google-cloud-aiplatform<2.0.0,>=1.80.0
|
|
41
|
-
Requires-Dist: google-
|
|
41
|
+
Requires-Dist: google-genai<2.0.0,>=1.0.0
|
|
42
42
|
Requires-Dist: google-api-python-client<3.0.0,>=2.108.0
|
|
43
43
|
Requires-Dist: google-auth<3.0.0,>=2.25.0
|
|
44
44
|
Requires-Dist: google-auth-httplib2<1.0.0,>=0.2.0
|
|
@@ -48,19 +48,20 @@ Requires-Dist: langgraph<0.6.0,>=0.5.3
|
|
|
48
48
|
Requires-Dist: weasel==0.4.1
|
|
49
49
|
Requires-Dist: spacy<4.0.0,>=3.8.7
|
|
50
50
|
Requires-Dist: rake-nltk<2.0.0,>=1.0.6
|
|
51
|
-
Requires-Dist: numpy<3.0.0,>=2.
|
|
51
|
+
Requires-Dist: numpy<3.0.0,>=2.4.1
|
|
52
52
|
Requires-Dist: pandas<3.0.0,>=2.2.3
|
|
53
53
|
Requires-Dist: scipy<2.0.0,>=1.15.3
|
|
54
54
|
Requires-Dist: scikit-learn<2.0.0,>=1.5.0
|
|
55
55
|
Requires-Dist: statsmodels<0.15.0,>=0.14.4
|
|
56
56
|
Requires-Dist: pyreadstat<2.0.0,>=1.2.9
|
|
57
|
+
Requires-Dist: pyarrow<22.0.0,>=21.0.0
|
|
57
58
|
Requires-Dist: tabulate<0.10.0,>=0.9.0
|
|
58
59
|
Requires-Dist: python-docx<2.0.0,>=1.1.2
|
|
59
60
|
Requires-Dist: python-pptx<2.0.0,>=1.0.2
|
|
60
61
|
Requires-Dist: openpyxl<4.0.0,>=3.1.5
|
|
61
62
|
Requires-Dist: pdfplumber<0.12.0,>=0.11.7
|
|
62
63
|
Requires-Dist: pdfminer-six==20250506
|
|
63
|
-
Requires-Dist: tika<
|
|
64
|
+
Requires-Dist: tika<4.0.0,>=3.1.0
|
|
64
65
|
Requires-Dist: matplotlib<4.0.0,>=3.10.3
|
|
65
66
|
Requires-Dist: seaborn<0.14.0,>=0.13.2
|
|
66
67
|
Requires-Dist: jinja2<4.0.0,>=3.1.6
|
|
@@ -82,12 +83,30 @@ Requires-Dist: prometheus-client<1.0.0,>=0.21.1
|
|
|
82
83
|
Requires-Dist: jaeger-client<5.0.0,>=4.8.0
|
|
83
84
|
Requires-Dist: opentracing<3.0.0,>=2.4.0
|
|
84
85
|
Requires-Dist: psutil<8.0.0,>=7.0.0
|
|
86
|
+
Provides-Extra: dev
|
|
87
|
+
Requires-Dist: pytest<9.0.0,>=8.4.2; extra == "dev"
|
|
88
|
+
Requires-Dist: pytest-asyncio<2.0.0,>=1.2.0; extra == "dev"
|
|
89
|
+
Requires-Dist: pytest-cov<8.0.0,>=7.0.0; extra == "dev"
|
|
90
|
+
Requires-Dist: pytest-timeout<3.0.0,>=2.4.0; extra == "dev"
|
|
91
|
+
Requires-Dist: mypy<2.0.0,>=1.18.2; extra == "dev"
|
|
92
|
+
Requires-Dist: flake8<8.0.0,>=7.3.0; extra == "dev"
|
|
93
|
+
Requires-Dist: black<26.0.0,>=25.1.0; extra == "dev"
|
|
94
|
+
Requires-Dist: types-aiofiles>=25.1.0.20251011; extra == "dev"
|
|
95
|
+
Requires-Dist: types-cachetools>=6.2.0.20251022; extra == "dev"
|
|
96
|
+
Requires-Dist: types-colorama>=0.4.15.20250801; extra == "dev"
|
|
97
|
+
Requires-Dist: types-tqdm>=4.67.0.20250809; extra == "dev"
|
|
98
|
+
Requires-Dist: types-pyyaml>=6.0.12.20250915; extra == "dev"
|
|
99
|
+
Requires-Dist: types-opentracing>=2.4.10.20250622; extra == "dev"
|
|
100
|
+
Requires-Dist: types-lxml>=2025.8.25; extra == "dev"
|
|
101
|
+
Requires-Dist: types-bleach>=6.3.0.20251115; extra == "dev"
|
|
85
102
|
Provides-Extra: docs
|
|
86
103
|
Requires-Dist: sphinx<8.0.0,>=7.0.0; extra == "docs"
|
|
87
104
|
Requires-Dist: sphinx-rtd-theme<3.0.0,>=2.0.0; extra == "docs"
|
|
88
105
|
Requires-Dist: sphinx-autodoc-typehints<3.0.0,>=2.0.0; extra == "docs"
|
|
89
106
|
Requires-Dist: myst-parser<3.0.0,>=2.0.0; extra == "docs"
|
|
90
107
|
Requires-Dist: sphinx-copybutton<1.0.0,>=0.5.0; extra == "docs"
|
|
108
|
+
Provides-Extra: scraper
|
|
109
|
+
Requires-Dist: playwright-stealth<2.0.0,>=1.0.6; extra == "scraper"
|
|
91
110
|
Dynamic: license-file
|
|
92
111
|
|
|
93
112
|
# AIECS - AI Execute Services
|
|
@@ -150,6 +169,22 @@ aiecs-fix-deps
|
|
|
150
169
|
aiecs-patch-weasel
|
|
151
170
|
```
|
|
152
171
|
|
|
172
|
+
### Container Deployment
|
|
173
|
+
|
|
174
|
+
When installing aiecs in a container (e.g., Docker), you may encounter a warning about scripts not being on PATH:
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
WARNING: The scripts aiecs, aiecs-check-deps, ... are installed in '/tmp/.local/bin' which is not on PATH.
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Quick Fix:** Add the user bin directory to PATH in your Dockerfile:
|
|
181
|
+
|
|
182
|
+
```dockerfile
|
|
183
|
+
ENV PATH="${PATH}:/root/.local/bin"
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
For detailed troubleshooting and best practices, see [Deployment Troubleshooting Guide](docs/user/DEPLOYMENT_TROUBLESHOOTING.md).
|
|
187
|
+
|
|
153
188
|
## Quick Start
|
|
154
189
|
|
|
155
190
|
### Basic Usage
|
|
@@ -58,6 +58,22 @@ aiecs-fix-deps
|
|
|
58
58
|
aiecs-patch-weasel
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
+
### Container Deployment
|
|
62
|
+
|
|
63
|
+
When installing aiecs in a container (e.g., Docker), you may encounter a warning about scripts not being on PATH:
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
WARNING: The scripts aiecs, aiecs-check-deps, ... are installed in '/tmp/.local/bin' which is not on PATH.
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**Quick Fix:** Add the user bin directory to PATH in your Dockerfile:
|
|
70
|
+
|
|
71
|
+
```dockerfile
|
|
72
|
+
ENV PATH="${PATH}:/root/.local/bin"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
For detailed troubleshooting and best practices, see [Deployment Troubleshooting Guide](docs/user/DEPLOYMENT_TROUBLESHOOTING.md).
|
|
76
|
+
|
|
61
77
|
## Quick Start
|
|
62
78
|
|
|
63
79
|
### Basic Usage
|
|
@@ -5,7 +5,7 @@ A powerful Python middleware framework for building AI-powered applications
|
|
|
5
5
|
with tool orchestration, task execution, and multi-provider LLM support.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
__version__ = "1.
|
|
8
|
+
__version__ = "1.8.2"
|
|
9
9
|
__author__ = "AIECS Team"
|
|
10
10
|
__email__ = "iretbl@gmail.com"
|
|
11
11
|
|
|
@@ -160,14 +160,21 @@ class AIECS:
|
|
|
160
160
|
"mode": "simple",
|
|
161
161
|
}
|
|
162
162
|
|
|
163
|
-
#
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
163
|
+
# Direct task execution using process_task_async (no Celery required)
|
|
164
|
+
try:
|
|
165
|
+
result = await self.process_task_async(context)
|
|
166
|
+
return {
|
|
167
|
+
**result,
|
|
168
|
+
"mode": "simple",
|
|
169
|
+
}
|
|
170
|
+
except Exception as e:
|
|
171
|
+
logger.error(f"Simple mode execution failed: {e}", exc_info=True)
|
|
172
|
+
return {
|
|
173
|
+
"status": "failed",
|
|
174
|
+
"error": str(e),
|
|
175
|
+
"mode": "simple",
|
|
176
|
+
"context_id": context.user_id if hasattr(context, "user_id") else "unknown",
|
|
177
|
+
}
|
|
171
178
|
|
|
172
179
|
elif self.mode == "full":
|
|
173
180
|
if not self.task_manager:
|
|
@@ -203,11 +210,28 @@ class AIECS:
|
|
|
203
210
|
if not tool:
|
|
204
211
|
raise ValueError(f"Tool '{tool_name}' not found")
|
|
205
212
|
|
|
206
|
-
#
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
213
|
+
# Check if tool has execute() method (some tools like KnowledgeGraphBuilderTool)
|
|
214
|
+
if hasattr(tool, "execute") and callable(getattr(tool, "execute")):
|
|
215
|
+
# Tools with execute() method expect kwargs unpacked
|
|
216
|
+
# Some tools use "op", others use "action" - include both for compatibility
|
|
217
|
+
tool_params = {**params, "op": operation, "action": operation}
|
|
218
|
+
return await tool.execute(**tool_params)
|
|
219
|
+
|
|
220
|
+
# Check if tool has run_async() method (BaseTool-based tools)
|
|
221
|
+
elif hasattr(tool, "run_async") and callable(getattr(tool, "run_async")):
|
|
222
|
+
# BaseTool.run_async expects op as first parameter, then kwargs
|
|
223
|
+
return await tool.run_async(operation, **params)
|
|
224
|
+
|
|
225
|
+
# Check if tool has run() method (synchronous BaseTool)
|
|
226
|
+
elif hasattr(tool, "run") and callable(getattr(tool, "run")):
|
|
227
|
+
# BaseTool.run expects op as first parameter, then kwargs
|
|
228
|
+
return tool.run(operation, **params)
|
|
229
|
+
|
|
230
|
+
else:
|
|
231
|
+
raise ValueError(
|
|
232
|
+
f"Tool '{tool_name}' does not have an 'execute()', 'run_async()', or 'run()' method. "
|
|
233
|
+
f"Available methods: {[m for m in dir(tool) if not m.startswith('_')]}"
|
|
234
|
+
)
|
|
211
235
|
|
|
212
236
|
async def get_available_tools(self) -> List[Dict[str, Any]]:
|
|
213
237
|
"""Get list of all available tools"""
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Data Quality Validation for Knowledge Graph Import
|
|
3
|
+
|
|
4
|
+
Provides validation capabilities to ensure data quality during import,
|
|
5
|
+
including range validation, outlier detection, completeness checks, and
|
|
6
|
+
type consistency validation.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from typing import Dict, List, Optional, Any, Set, Union
|
|
10
|
+
from dataclasses import dataclass, field
|
|
11
|
+
from enum import Enum
|
|
12
|
+
import logging
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
# Check for pandas and numpy availability
|
|
17
|
+
try:
|
|
18
|
+
import pandas as pd
|
|
19
|
+
import numpy as np
|
|
20
|
+
PANDAS_AVAILABLE = True
|
|
21
|
+
except ImportError:
|
|
22
|
+
PANDAS_AVAILABLE = False
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ViolationType(Enum):
|
|
26
|
+
"""Types of data quality violations"""
|
|
27
|
+
RANGE_VIOLATION = "range_violation"
|
|
28
|
+
OUTLIER = "outlier"
|
|
29
|
+
MISSING_VALUE = "missing_value"
|
|
30
|
+
TYPE_MISMATCH = "type_mismatch"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@dataclass
|
|
34
|
+
class ValidationViolation:
|
|
35
|
+
"""
|
|
36
|
+
Represents a single data quality violation
|
|
37
|
+
|
|
38
|
+
Attributes:
|
|
39
|
+
violation_type: Type of violation
|
|
40
|
+
property_name: Property that violated the rule
|
|
41
|
+
row_id: Identifier of the row with violation
|
|
42
|
+
value: The violating value
|
|
43
|
+
expected: Expected value or constraint
|
|
44
|
+
message: Human-readable description
|
|
45
|
+
"""
|
|
46
|
+
violation_type: ViolationType
|
|
47
|
+
property_name: str
|
|
48
|
+
row_id: Any
|
|
49
|
+
value: Any
|
|
50
|
+
expected: Any
|
|
51
|
+
message: str
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@dataclass
|
|
55
|
+
class QualityReport:
|
|
56
|
+
"""
|
|
57
|
+
Data quality validation report
|
|
58
|
+
|
|
59
|
+
Attributes:
|
|
60
|
+
total_rows: Total number of rows validated
|
|
61
|
+
violations: List of all violations found
|
|
62
|
+
completeness: Completeness percentage per property
|
|
63
|
+
outlier_count: Number of outliers detected per property
|
|
64
|
+
range_violations: Number of range violations per property
|
|
65
|
+
type_violations: Number of type violations per property
|
|
66
|
+
passed: Whether validation passed (no critical violations)
|
|
67
|
+
"""
|
|
68
|
+
total_rows: int
|
|
69
|
+
violations: List[ValidationViolation] = field(default_factory=list)
|
|
70
|
+
completeness: Dict[str, float] = field(default_factory=dict)
|
|
71
|
+
outlier_count: Dict[str, int] = field(default_factory=dict)
|
|
72
|
+
range_violations: Dict[str, int] = field(default_factory=dict)
|
|
73
|
+
type_violations: Dict[str, int] = field(default_factory=dict)
|
|
74
|
+
passed: bool = True
|
|
75
|
+
|
|
76
|
+
def add_violation(self, violation: ValidationViolation):
|
|
77
|
+
"""Add a violation to the report"""
|
|
78
|
+
self.violations.append(violation)
|
|
79
|
+
|
|
80
|
+
# Update counts
|
|
81
|
+
if violation.violation_type == ViolationType.RANGE_VIOLATION:
|
|
82
|
+
self.range_violations[violation.property_name] = \
|
|
83
|
+
self.range_violations.get(violation.property_name, 0) + 1
|
|
84
|
+
elif violation.violation_type == ViolationType.OUTLIER:
|
|
85
|
+
self.outlier_count[violation.property_name] = \
|
|
86
|
+
self.outlier_count.get(violation.property_name, 0) + 1
|
|
87
|
+
elif violation.violation_type == ViolationType.TYPE_MISMATCH:
|
|
88
|
+
self.type_violations[violation.property_name] = \
|
|
89
|
+
self.type_violations.get(violation.property_name, 0) + 1
|
|
90
|
+
|
|
91
|
+
def get_summary(self) -> Dict[str, Any]:
|
|
92
|
+
"""Get a summary of the quality report"""
|
|
93
|
+
return {
|
|
94
|
+
"total_rows": self.total_rows,
|
|
95
|
+
"total_violations": len(self.violations),
|
|
96
|
+
"range_violations": sum(self.range_violations.values()),
|
|
97
|
+
"outliers": sum(self.outlier_count.values()),
|
|
98
|
+
"type_violations": sum(self.type_violations.values()),
|
|
99
|
+
"completeness": self.completeness,
|
|
100
|
+
"passed": self.passed
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
@dataclass
|
|
105
|
+
class RangeRule:
|
|
106
|
+
"""Range validation rule for numeric properties"""
|
|
107
|
+
min_value: Optional[float] = None
|
|
108
|
+
max_value: Optional[float] = None
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
@dataclass
|
|
112
|
+
class ValidationConfig:
|
|
113
|
+
"""
|
|
114
|
+
Configuration for data quality validation
|
|
115
|
+
|
|
116
|
+
Attributes:
|
|
117
|
+
range_rules: Range validation rules per property
|
|
118
|
+
required_properties: Set of required properties
|
|
119
|
+
detect_outliers: Whether to detect outliers (3 std devs)
|
|
120
|
+
fail_on_violations: Whether to fail import on violations
|
|
121
|
+
max_violation_rate: Maximum allowed violation rate (0.0-1.0)
|
|
122
|
+
"""
|
|
123
|
+
range_rules: Dict[str, RangeRule] = field(default_factory=dict)
|
|
124
|
+
required_properties: Set[str] = field(default_factory=set)
|
|
125
|
+
detect_outliers: bool = False
|
|
126
|
+
fail_on_violations: bool = False
|
|
127
|
+
max_violation_rate: float = 0.1 # 10% by default
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class DataQualityValidator:
|
|
131
|
+
"""
|
|
132
|
+
Validates data quality during knowledge graph import
|
|
133
|
+
|
|
134
|
+
Provides range validation, outlier detection, completeness checks,
|
|
135
|
+
and type consistency validation.
|
|
136
|
+
"""
|
|
137
|
+
|
|
138
|
+
def __init__(self, config: Optional[ValidationConfig] = None):
|
|
139
|
+
"""
|
|
140
|
+
Initialize validator with configuration
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
config: Validation configuration
|
|
144
|
+
"""
|
|
145
|
+
self.config = config or ValidationConfig()
|
|
146
|
+
self._property_stats: Dict[str, Dict[str, float]] = {}
|
|
147
|
+
|
|
148
|
+
def validate_dataframe(self, df: 'pd.DataFrame', id_column: Optional[str] = None) -> QualityReport:
|
|
149
|
+
"""
|
|
150
|
+
Validate a pandas DataFrame
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
df: DataFrame to validate
|
|
154
|
+
id_column: Column to use as row identifier
|
|
155
|
+
|
|
156
|
+
Returns:
|
|
157
|
+
QualityReport with validation results
|
|
158
|
+
"""
|
|
159
|
+
if not PANDAS_AVAILABLE:
|
|
160
|
+
raise ImportError("pandas and numpy are required for data quality validation")
|
|
161
|
+
|
|
162
|
+
report = QualityReport(total_rows=len(df))
|
|
163
|
+
|
|
164
|
+
# Use index as row ID if no id_column specified
|
|
165
|
+
row_ids = df[id_column] if id_column and id_column in df.columns else df.index
|
|
166
|
+
|
|
167
|
+
# Check completeness
|
|
168
|
+
self._check_completeness(df, report)
|
|
169
|
+
|
|
170
|
+
# Check required properties
|
|
171
|
+
self._check_required_properties(df, row_ids, report)
|
|
172
|
+
|
|
173
|
+
# Validate ranges
|
|
174
|
+
self._validate_ranges(df, row_ids, report)
|
|
175
|
+
|
|
176
|
+
# Detect outliers
|
|
177
|
+
if self.config.detect_outliers:
|
|
178
|
+
self._detect_outliers(df, row_ids, report)
|
|
179
|
+
|
|
180
|
+
# Check if validation passed
|
|
181
|
+
violation_rate = len(report.violations) / max(report.total_rows, 1)
|
|
182
|
+
if self.config.fail_on_violations and violation_rate > self.config.max_violation_rate:
|
|
183
|
+
report.passed = False
|
|
184
|
+
|
|
185
|
+
return report
|
|
186
|
+
|
|
187
|
+
def _check_completeness(self, df: 'pd.DataFrame', report: QualityReport):
|
|
188
|
+
"""Check completeness of properties"""
|
|
189
|
+
for col in df.columns:
|
|
190
|
+
non_null_count = df[col].notna().sum()
|
|
191
|
+
completeness = non_null_count / len(df) if len(df) > 0 else 0.0
|
|
192
|
+
report.completeness[col] = completeness
|
|
193
|
+
|
|
194
|
+
def _check_required_properties(self, df: 'pd.DataFrame', row_ids: Any, report: QualityReport):
|
|
195
|
+
"""Check that required properties are present and non-null"""
|
|
196
|
+
for prop in self.config.required_properties:
|
|
197
|
+
if prop not in df.columns:
|
|
198
|
+
# Property missing entirely
|
|
199
|
+
violation = ValidationViolation(
|
|
200
|
+
violation_type=ViolationType.MISSING_VALUE,
|
|
201
|
+
property_name=prop,
|
|
202
|
+
row_id="ALL",
|
|
203
|
+
value=None,
|
|
204
|
+
expected="required property",
|
|
205
|
+
message=f"Required property '{prop}' is missing from dataset"
|
|
206
|
+
)
|
|
207
|
+
report.add_violation(violation)
|
|
208
|
+
else:
|
|
209
|
+
# Check for null values in required property
|
|
210
|
+
null_mask = df[prop].isna()
|
|
211
|
+
for idx in df[null_mask].index:
|
|
212
|
+
row_id = row_ids.iloc[idx] if hasattr(row_ids, 'iloc') else row_ids[idx]
|
|
213
|
+
violation = ValidationViolation(
|
|
214
|
+
violation_type=ViolationType.MISSING_VALUE,
|
|
215
|
+
property_name=prop,
|
|
216
|
+
row_id=row_id,
|
|
217
|
+
value=None,
|
|
218
|
+
expected="non-null value",
|
|
219
|
+
message=f"Required property '{prop}' is null in row {row_id}"
|
|
220
|
+
)
|
|
221
|
+
report.add_violation(violation)
|
|
222
|
+
|
|
223
|
+
def _validate_ranges(self, df: 'pd.DataFrame', row_ids: Any, report: QualityReport):
|
|
224
|
+
"""Validate numeric properties are within specified ranges"""
|
|
225
|
+
for prop, rule in self.config.range_rules.items():
|
|
226
|
+
if prop not in df.columns:
|
|
227
|
+
continue
|
|
228
|
+
|
|
229
|
+
# Only validate numeric columns
|
|
230
|
+
if not pd.api.types.is_numeric_dtype(df[prop]):
|
|
231
|
+
continue
|
|
232
|
+
|
|
233
|
+
# Check min value
|
|
234
|
+
if rule.min_value is not None:
|
|
235
|
+
violations_mask = df[prop] < rule.min_value
|
|
236
|
+
for idx in df[violations_mask].index:
|
|
237
|
+
row_id = row_ids.iloc[idx] if hasattr(row_ids, 'iloc') else row_ids[idx]
|
|
238
|
+
value = df[prop].iloc[idx]
|
|
239
|
+
violation = ValidationViolation(
|
|
240
|
+
violation_type=ViolationType.RANGE_VIOLATION,
|
|
241
|
+
property_name=prop,
|
|
242
|
+
row_id=row_id,
|
|
243
|
+
value=value,
|
|
244
|
+
expected=f">= {rule.min_value}",
|
|
245
|
+
message=f"Value {value} is below minimum {rule.min_value} for property '{prop}' in row {row_id}"
|
|
246
|
+
)
|
|
247
|
+
report.add_violation(violation)
|
|
248
|
+
|
|
249
|
+
# Check max value
|
|
250
|
+
if rule.max_value is not None:
|
|
251
|
+
violations_mask = df[prop] > rule.max_value
|
|
252
|
+
for idx in df[violations_mask].index:
|
|
253
|
+
row_id = row_ids.iloc[idx] if hasattr(row_ids, 'iloc') else row_ids[idx]
|
|
254
|
+
value = df[prop].iloc[idx]
|
|
255
|
+
violation = ValidationViolation(
|
|
256
|
+
violation_type=ViolationType.RANGE_VIOLATION,
|
|
257
|
+
property_name=prop,
|
|
258
|
+
row_id=row_id,
|
|
259
|
+
value=value,
|
|
260
|
+
expected=f"<= {rule.max_value}",
|
|
261
|
+
message=f"Value {value} is above maximum {rule.max_value} for property '{prop}' in row {row_id}"
|
|
262
|
+
)
|
|
263
|
+
report.add_violation(violation)
|
|
264
|
+
|
|
265
|
+
def _detect_outliers(self, df: 'pd.DataFrame', row_ids: Any, report: QualityReport):
|
|
266
|
+
"""Detect outliers using 3 standard deviations rule"""
|
|
267
|
+
numeric_cols = df.select_dtypes(include=[np.number]).columns
|
|
268
|
+
|
|
269
|
+
for col in numeric_cols:
|
|
270
|
+
# Skip if all values are null
|
|
271
|
+
if df[col].isna().all():
|
|
272
|
+
continue
|
|
273
|
+
|
|
274
|
+
# Calculate mean and std
|
|
275
|
+
mean = df[col].mean()
|
|
276
|
+
std = df[col].std()
|
|
277
|
+
|
|
278
|
+
# Skip if std is 0 or NaN
|
|
279
|
+
if pd.isna(std) or std == 0:
|
|
280
|
+
continue
|
|
281
|
+
|
|
282
|
+
# Store stats for later use
|
|
283
|
+
self._property_stats[col] = {"mean": mean, "std": std}
|
|
284
|
+
|
|
285
|
+
# Detect outliers (beyond 3 standard deviations)
|
|
286
|
+
lower_bound = mean - 3 * std
|
|
287
|
+
upper_bound = mean + 3 * std
|
|
288
|
+
outliers_mask = (df[col] < lower_bound) | (df[col] > upper_bound)
|
|
289
|
+
|
|
290
|
+
for idx in df[outliers_mask].index:
|
|
291
|
+
row_id = row_ids.iloc[idx] if hasattr(row_ids, 'iloc') else row_ids[idx]
|
|
292
|
+
value = df[col].iloc[idx]
|
|
293
|
+
violation = ValidationViolation(
|
|
294
|
+
violation_type=ViolationType.OUTLIER,
|
|
295
|
+
property_name=col,
|
|
296
|
+
row_id=row_id,
|
|
297
|
+
value=value,
|
|
298
|
+
expected=f"within [{lower_bound:.2f}, {upper_bound:.2f}]",
|
|
299
|
+
message=f"Value {value} is an outlier (>3 std devs) for property '{col}' in row {row_id}"
|
|
300
|
+
)
|
|
301
|
+
report.add_violation(violation)
|
|
302
|
+
|