aiecs 1.0.1__py3-none-any.whl → 1.7.17__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.
Potentially problematic release.
This version of aiecs might be problematic. Click here for more details.
- aiecs/__init__.py +13 -16
- aiecs/__main__.py +7 -7
- aiecs/aiecs_client.py +269 -75
- aiecs/application/executors/operation_executor.py +79 -54
- aiecs/application/knowledge_graph/__init__.py +7 -0
- aiecs/application/knowledge_graph/builder/__init__.py +37 -0
- aiecs/application/knowledge_graph/builder/data_quality.py +302 -0
- aiecs/application/knowledge_graph/builder/data_reshaping.py +293 -0
- aiecs/application/knowledge_graph/builder/document_builder.py +369 -0
- aiecs/application/knowledge_graph/builder/graph_builder.py +490 -0
- aiecs/application/knowledge_graph/builder/import_optimizer.py +396 -0
- aiecs/application/knowledge_graph/builder/schema_inference.py +462 -0
- aiecs/application/knowledge_graph/builder/schema_mapping.py +563 -0
- aiecs/application/knowledge_graph/builder/structured_pipeline.py +1384 -0
- aiecs/application/knowledge_graph/builder/text_chunker.py +317 -0
- aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
- aiecs/application/knowledge_graph/extractors/base.py +98 -0
- aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +422 -0
- aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +347 -0
- aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +241 -0
- aiecs/application/knowledge_graph/fusion/__init__.py +78 -0
- aiecs/application/knowledge_graph/fusion/ab_testing.py +395 -0
- aiecs/application/knowledge_graph/fusion/abbreviation_expander.py +327 -0
- aiecs/application/knowledge_graph/fusion/alias_index.py +597 -0
- aiecs/application/knowledge_graph/fusion/alias_matcher.py +384 -0
- aiecs/application/knowledge_graph/fusion/cache_coordinator.py +343 -0
- aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +433 -0
- aiecs/application/knowledge_graph/fusion/entity_linker.py +511 -0
- aiecs/application/knowledge_graph/fusion/evaluation_dataset.py +240 -0
- aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +632 -0
- aiecs/application/knowledge_graph/fusion/matching_config.py +489 -0
- aiecs/application/knowledge_graph/fusion/name_normalizer.py +352 -0
- aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +183 -0
- aiecs/application/knowledge_graph/fusion/semantic_name_matcher.py +464 -0
- aiecs/application/knowledge_graph/fusion/similarity_pipeline.py +534 -0
- aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
- aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +342 -0
- aiecs/application/knowledge_graph/pattern_matching/query_executor.py +366 -0
- aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
- aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +195 -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 +341 -0
- aiecs/application/knowledge_graph/reasoning/inference_engine.py +500 -0
- aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +163 -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 +913 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +866 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +475 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +396 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +208 -0
- aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +170 -0
- aiecs/application/knowledge_graph/reasoning/query_planner.py +855 -0
- aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +518 -0
- aiecs/application/knowledge_graph/retrieval/__init__.py +27 -0
- aiecs/application/knowledge_graph/retrieval/query_intent_classifier.py +211 -0
- aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +592 -0
- aiecs/application/knowledge_graph/retrieval/strategy_types.py +23 -0
- aiecs/application/knowledge_graph/search/__init__.py +59 -0
- aiecs/application/knowledge_graph/search/hybrid_search.py +457 -0
- aiecs/application/knowledge_graph/search/reranker.py +293 -0
- aiecs/application/knowledge_graph/search/reranker_strategies.py +535 -0
- aiecs/application/knowledge_graph/search/text_similarity.py +392 -0
- aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
- aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +305 -0
- aiecs/application/knowledge_graph/traversal/path_scorer.py +271 -0
- aiecs/application/knowledge_graph/validators/__init__.py +13 -0
- aiecs/application/knowledge_graph/validators/relation_validator.py +239 -0
- aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
- aiecs/application/knowledge_graph/visualization/graph_visualizer.py +313 -0
- aiecs/common/__init__.py +9 -0
- aiecs/common/knowledge_graph/__init__.py +17 -0
- aiecs/common/knowledge_graph/runnable.py +471 -0
- aiecs/config/__init__.py +20 -5
- aiecs/config/config.py +762 -31
- aiecs/config/graph_config.py +131 -0
- aiecs/config/tool_config.py +435 -0
- aiecs/core/__init__.py +29 -13
- aiecs/core/interface/__init__.py +2 -2
- aiecs/core/interface/execution_interface.py +22 -22
- aiecs/core/interface/storage_interface.py +37 -88
- aiecs/core/registry/__init__.py +31 -0
- aiecs/core/registry/service_registry.py +92 -0
- aiecs/domain/__init__.py +270 -1
- aiecs/domain/agent/__init__.py +191 -0
- aiecs/domain/agent/base_agent.py +3949 -0
- aiecs/domain/agent/exceptions.py +99 -0
- aiecs/domain/agent/graph_aware_mixin.py +569 -0
- aiecs/domain/agent/hybrid_agent.py +1731 -0
- aiecs/domain/agent/integration/__init__.py +29 -0
- aiecs/domain/agent/integration/context_compressor.py +216 -0
- aiecs/domain/agent/integration/context_engine_adapter.py +587 -0
- aiecs/domain/agent/integration/protocols.py +281 -0
- aiecs/domain/agent/integration/retry_policy.py +218 -0
- aiecs/domain/agent/integration/role_config.py +213 -0
- aiecs/domain/agent/knowledge_aware_agent.py +1892 -0
- aiecs/domain/agent/lifecycle.py +291 -0
- aiecs/domain/agent/llm_agent.py +692 -0
- aiecs/domain/agent/memory/__init__.py +12 -0
- aiecs/domain/agent/memory/conversation.py +1124 -0
- aiecs/domain/agent/migration/__init__.py +14 -0
- aiecs/domain/agent/migration/conversion.py +163 -0
- aiecs/domain/agent/migration/legacy_wrapper.py +86 -0
- aiecs/domain/agent/models.py +894 -0
- aiecs/domain/agent/observability.py +479 -0
- aiecs/domain/agent/persistence.py +449 -0
- aiecs/domain/agent/prompts/__init__.py +29 -0
- aiecs/domain/agent/prompts/builder.py +159 -0
- aiecs/domain/agent/prompts/formatters.py +187 -0
- aiecs/domain/agent/prompts/template.py +255 -0
- aiecs/domain/agent/registry.py +253 -0
- aiecs/domain/agent/tool_agent.py +444 -0
- aiecs/domain/agent/tools/__init__.py +15 -0
- aiecs/domain/agent/tools/schema_generator.py +377 -0
- aiecs/domain/community/__init__.py +155 -0
- aiecs/domain/community/agent_adapter.py +469 -0
- aiecs/domain/community/analytics.py +432 -0
- aiecs/domain/community/collaborative_workflow.py +648 -0
- aiecs/domain/community/communication_hub.py +634 -0
- aiecs/domain/community/community_builder.py +320 -0
- aiecs/domain/community/community_integration.py +796 -0
- aiecs/domain/community/community_manager.py +803 -0
- aiecs/domain/community/decision_engine.py +849 -0
- aiecs/domain/community/exceptions.py +231 -0
- aiecs/domain/community/models/__init__.py +33 -0
- aiecs/domain/community/models/community_models.py +234 -0
- aiecs/domain/community/resource_manager.py +461 -0
- aiecs/domain/community/shared_context_manager.py +589 -0
- aiecs/domain/context/__init__.py +40 -10
- aiecs/domain/context/context_engine.py +1910 -0
- aiecs/domain/context/conversation_models.py +87 -53
- aiecs/domain/context/graph_memory.py +582 -0
- aiecs/domain/execution/model.py +12 -4
- aiecs/domain/knowledge_graph/__init__.py +19 -0
- aiecs/domain/knowledge_graph/models/__init__.py +52 -0
- aiecs/domain/knowledge_graph/models/entity.py +148 -0
- aiecs/domain/knowledge_graph/models/evidence.py +178 -0
- aiecs/domain/knowledge_graph/models/inference_rule.py +184 -0
- aiecs/domain/knowledge_graph/models/path.py +171 -0
- aiecs/domain/knowledge_graph/models/path_pattern.py +171 -0
- aiecs/domain/knowledge_graph/models/query.py +261 -0
- aiecs/domain/knowledge_graph/models/query_plan.py +181 -0
- aiecs/domain/knowledge_graph/models/relation.py +202 -0
- aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
- aiecs/domain/knowledge_graph/schema/entity_type.py +131 -0
- aiecs/domain/knowledge_graph/schema/graph_schema.py +253 -0
- aiecs/domain/knowledge_graph/schema/property_schema.py +143 -0
- aiecs/domain/knowledge_graph/schema/relation_type.py +163 -0
- aiecs/domain/knowledge_graph/schema/schema_manager.py +691 -0
- aiecs/domain/knowledge_graph/schema/type_enums.py +209 -0
- aiecs/domain/task/dsl_processor.py +172 -56
- aiecs/domain/task/model.py +20 -8
- aiecs/domain/task/task_context.py +27 -24
- aiecs/infrastructure/__init__.py +0 -2
- aiecs/infrastructure/graph_storage/__init__.py +11 -0
- aiecs/infrastructure/graph_storage/base.py +837 -0
- aiecs/infrastructure/graph_storage/batch_operations.py +458 -0
- aiecs/infrastructure/graph_storage/cache.py +424 -0
- aiecs/infrastructure/graph_storage/distributed.py +223 -0
- aiecs/infrastructure/graph_storage/error_handling.py +380 -0
- aiecs/infrastructure/graph_storage/graceful_degradation.py +294 -0
- aiecs/infrastructure/graph_storage/health_checks.py +378 -0
- aiecs/infrastructure/graph_storage/in_memory.py +1197 -0
- aiecs/infrastructure/graph_storage/index_optimization.py +446 -0
- aiecs/infrastructure/graph_storage/lazy_loading.py +431 -0
- aiecs/infrastructure/graph_storage/metrics.py +344 -0
- aiecs/infrastructure/graph_storage/migration.py +400 -0
- aiecs/infrastructure/graph_storage/pagination.py +483 -0
- aiecs/infrastructure/graph_storage/performance_monitoring.py +456 -0
- aiecs/infrastructure/graph_storage/postgres.py +1563 -0
- aiecs/infrastructure/graph_storage/property_storage.py +353 -0
- aiecs/infrastructure/graph_storage/protocols.py +76 -0
- aiecs/infrastructure/graph_storage/query_optimizer.py +642 -0
- aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
- aiecs/infrastructure/graph_storage/sqlite.py +1373 -0
- aiecs/infrastructure/graph_storage/streaming.py +487 -0
- aiecs/infrastructure/graph_storage/tenant.py +412 -0
- aiecs/infrastructure/messaging/celery_task_manager.py +92 -54
- aiecs/infrastructure/messaging/websocket_manager.py +51 -35
- aiecs/infrastructure/monitoring/__init__.py +22 -0
- aiecs/infrastructure/monitoring/executor_metrics.py +45 -11
- aiecs/infrastructure/monitoring/global_metrics_manager.py +212 -0
- aiecs/infrastructure/monitoring/structured_logger.py +3 -7
- aiecs/infrastructure/monitoring/tracing_manager.py +63 -35
- aiecs/infrastructure/persistence/__init__.py +14 -1
- aiecs/infrastructure/persistence/context_engine_client.py +184 -0
- aiecs/infrastructure/persistence/database_manager.py +67 -43
- aiecs/infrastructure/persistence/file_storage.py +180 -103
- aiecs/infrastructure/persistence/redis_client.py +74 -21
- aiecs/llm/__init__.py +73 -25
- aiecs/llm/callbacks/__init__.py +11 -0
- aiecs/llm/{custom_callbacks.py → callbacks/custom_callbacks.py} +26 -19
- aiecs/llm/client_factory.py +230 -37
- aiecs/llm/client_resolver.py +155 -0
- aiecs/llm/clients/__init__.py +38 -0
- aiecs/llm/clients/base_client.py +328 -0
- aiecs/llm/clients/google_function_calling_mixin.py +415 -0
- aiecs/llm/clients/googleai_client.py +314 -0
- aiecs/llm/clients/openai_client.py +158 -0
- aiecs/llm/clients/openai_compatible_mixin.py +367 -0
- aiecs/llm/clients/vertex_client.py +1186 -0
- aiecs/llm/clients/xai_client.py +201 -0
- aiecs/llm/config/__init__.py +51 -0
- aiecs/llm/config/config_loader.py +272 -0
- aiecs/llm/config/config_validator.py +206 -0
- aiecs/llm/config/model_config.py +143 -0
- aiecs/llm/protocols.py +149 -0
- aiecs/llm/utils/__init__.py +10 -0
- aiecs/llm/utils/validate_config.py +89 -0
- aiecs/main.py +140 -121
- aiecs/scripts/aid/VERSION_MANAGEMENT.md +138 -0
- aiecs/scripts/aid/__init__.py +19 -0
- aiecs/scripts/aid/module_checker.py +499 -0
- aiecs/scripts/aid/version_manager.py +235 -0
- aiecs/scripts/{DEPENDENCY_SYSTEM_SUMMARY.md → dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md} +1 -0
- aiecs/scripts/{README_DEPENDENCY_CHECKER.md → dependance_check/README_DEPENDENCY_CHECKER.md} +1 -0
- aiecs/scripts/dependance_check/__init__.py +15 -0
- aiecs/scripts/dependance_check/dependency_checker.py +1835 -0
- aiecs/scripts/{dependency_fixer.py → dependance_check/dependency_fixer.py} +192 -90
- aiecs/scripts/{download_nlp_data.py → dependance_check/download_nlp_data.py} +203 -71
- aiecs/scripts/dependance_patch/__init__.py +7 -0
- aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
- aiecs/scripts/{fix_weasel_validator.py → dependance_patch/fix_weasel/fix_weasel_validator.py} +21 -14
- aiecs/scripts/{patch_weasel_library.sh → dependance_patch/fix_weasel/patch_weasel_library.sh} +1 -1
- aiecs/scripts/knowledge_graph/__init__.py +3 -0
- aiecs/scripts/knowledge_graph/run_threshold_experiments.py +212 -0
- aiecs/scripts/migrations/multi_tenancy/README.md +142 -0
- aiecs/scripts/tools_develop/README.md +671 -0
- aiecs/scripts/tools_develop/README_CONFIG_CHECKER.md +273 -0
- aiecs/scripts/tools_develop/TOOLS_CONFIG_GUIDE.md +1287 -0
- aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
- aiecs/scripts/tools_develop/__init__.py +21 -0
- aiecs/scripts/tools_develop/check_all_tools_config.py +548 -0
- aiecs/scripts/tools_develop/check_type_annotations.py +257 -0
- aiecs/scripts/tools_develop/pre-commit-schema-coverage.sh +66 -0
- aiecs/scripts/tools_develop/schema_coverage.py +511 -0
- aiecs/scripts/tools_develop/validate_tool_schemas.py +475 -0
- aiecs/scripts/tools_develop/verify_executor_config_fix.py +98 -0
- aiecs/scripts/tools_develop/verify_tools.py +352 -0
- aiecs/tasks/__init__.py +0 -1
- aiecs/tasks/worker.py +115 -47
- aiecs/tools/__init__.py +194 -72
- aiecs/tools/apisource/__init__.py +99 -0
- aiecs/tools/apisource/intelligence/__init__.py +19 -0
- aiecs/tools/apisource/intelligence/data_fusion.py +632 -0
- aiecs/tools/apisource/intelligence/query_analyzer.py +417 -0
- aiecs/tools/apisource/intelligence/search_enhancer.py +385 -0
- aiecs/tools/apisource/monitoring/__init__.py +9 -0
- aiecs/tools/apisource/monitoring/metrics.py +330 -0
- aiecs/tools/apisource/providers/__init__.py +112 -0
- aiecs/tools/apisource/providers/base.py +671 -0
- aiecs/tools/apisource/providers/census.py +397 -0
- aiecs/tools/apisource/providers/fred.py +535 -0
- aiecs/tools/apisource/providers/newsapi.py +409 -0
- aiecs/tools/apisource/providers/worldbank.py +352 -0
- aiecs/tools/apisource/reliability/__init__.py +12 -0
- aiecs/tools/apisource/reliability/error_handler.py +363 -0
- aiecs/tools/apisource/reliability/fallback_strategy.py +376 -0
- aiecs/tools/apisource/tool.py +832 -0
- aiecs/tools/apisource/utils/__init__.py +9 -0
- aiecs/tools/apisource/utils/validators.py +334 -0
- aiecs/tools/base_tool.py +415 -21
- aiecs/tools/docs/__init__.py +121 -0
- aiecs/tools/docs/ai_document_orchestrator.py +607 -0
- aiecs/tools/docs/ai_document_writer_orchestrator.py +2350 -0
- aiecs/tools/docs/content_insertion_tool.py +1320 -0
- aiecs/tools/docs/document_creator_tool.py +1464 -0
- aiecs/tools/docs/document_layout_tool.py +1160 -0
- aiecs/tools/docs/document_parser_tool.py +1016 -0
- aiecs/tools/docs/document_writer_tool.py +2008 -0
- aiecs/tools/knowledge_graph/__init__.py +17 -0
- aiecs/tools/knowledge_graph/graph_reasoning_tool.py +807 -0
- aiecs/tools/knowledge_graph/graph_search_tool.py +944 -0
- aiecs/tools/knowledge_graph/kg_builder_tool.py +524 -0
- aiecs/tools/langchain_adapter.py +300 -138
- aiecs/tools/schema_generator.py +455 -0
- aiecs/tools/search_tool/__init__.py +100 -0
- aiecs/tools/search_tool/analyzers.py +581 -0
- aiecs/tools/search_tool/cache.py +264 -0
- aiecs/tools/search_tool/constants.py +128 -0
- aiecs/tools/search_tool/context.py +224 -0
- aiecs/tools/search_tool/core.py +778 -0
- aiecs/tools/search_tool/deduplicator.py +119 -0
- aiecs/tools/search_tool/error_handler.py +242 -0
- aiecs/tools/search_tool/metrics.py +343 -0
- aiecs/tools/search_tool/rate_limiter.py +172 -0
- aiecs/tools/search_tool/schemas.py +275 -0
- aiecs/tools/statistics/__init__.py +80 -0
- aiecs/tools/statistics/ai_data_analysis_orchestrator.py +646 -0
- aiecs/tools/statistics/ai_insight_generator_tool.py +508 -0
- aiecs/tools/statistics/ai_report_orchestrator_tool.py +684 -0
- aiecs/tools/statistics/data_loader_tool.py +555 -0
- aiecs/tools/statistics/data_profiler_tool.py +638 -0
- aiecs/tools/statistics/data_transformer_tool.py +580 -0
- aiecs/tools/statistics/data_visualizer_tool.py +498 -0
- aiecs/tools/statistics/model_trainer_tool.py +507 -0
- aiecs/tools/statistics/statistical_analyzer_tool.py +472 -0
- aiecs/tools/task_tools/__init__.py +49 -36
- aiecs/tools/task_tools/chart_tool.py +200 -184
- aiecs/tools/task_tools/classfire_tool.py +268 -267
- aiecs/tools/task_tools/image_tool.py +220 -141
- aiecs/tools/task_tools/office_tool.py +226 -146
- aiecs/tools/task_tools/pandas_tool.py +477 -121
- aiecs/tools/task_tools/report_tool.py +390 -142
- aiecs/tools/task_tools/research_tool.py +149 -79
- aiecs/tools/task_tools/scraper_tool.py +339 -145
- aiecs/tools/task_tools/stats_tool.py +448 -209
- aiecs/tools/temp_file_manager.py +26 -24
- aiecs/tools/tool_executor/__init__.py +18 -16
- aiecs/tools/tool_executor/tool_executor.py +364 -52
- aiecs/utils/LLM_output_structor.py +74 -48
- aiecs/utils/__init__.py +14 -3
- aiecs/utils/base_callback.py +0 -3
- aiecs/utils/cache_provider.py +696 -0
- aiecs/utils/execution_utils.py +50 -31
- aiecs/utils/prompt_loader.py +1 -0
- aiecs/utils/token_usage_repository.py +37 -11
- aiecs/ws/socket_server.py +14 -4
- {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/METADATA +52 -15
- aiecs-1.7.17.dist-info/RECORD +337 -0
- aiecs-1.7.17.dist-info/entry_points.txt +13 -0
- aiecs/config/registry.py +0 -19
- aiecs/domain/context/content_engine.py +0 -982
- aiecs/llm/base_client.py +0 -99
- aiecs/llm/openai_client.py +0 -125
- aiecs/llm/vertex_client.py +0 -186
- aiecs/llm/xai_client.py +0 -184
- aiecs/scripts/dependency_checker.py +0 -857
- aiecs/scripts/quick_dependency_check.py +0 -269
- aiecs/tools/task_tools/search_api.py +0 -7
- aiecs-1.0.1.dist-info/RECORD +0 -90
- aiecs-1.0.1.dist-info/entry_points.txt +0 -7
- /aiecs/scripts/{setup_nlp_data.sh → dependance_check/setup_nlp_data.sh} +0 -0
- /aiecs/scripts/{README_WEASEL_PATCH.md → dependance_patch/fix_weasel/README_WEASEL_PATCH.md} +0 -0
- /aiecs/scripts/{fix_weasel_validator.sh → dependance_patch/fix_weasel/fix_weasel_validator.sh} +0 -0
- /aiecs/scripts/{run_weasel_patch.sh → dependance_patch/fix_weasel/run_weasel_patch.sh} +0 -0
- {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/WHEEL +0 -0
- {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/licenses/LICENSE +0 -0
- {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Property Schema Definition
|
|
3
|
+
|
|
4
|
+
Defines the schema for properties that can be attached to entities and relations.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any, Optional, List
|
|
8
|
+
from enum import Enum
|
|
9
|
+
from pydantic import BaseModel, Field
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class PropertyType(str, Enum):
|
|
13
|
+
"""Property data types"""
|
|
14
|
+
|
|
15
|
+
STRING = "string"
|
|
16
|
+
INTEGER = "integer"
|
|
17
|
+
FLOAT = "float"
|
|
18
|
+
BOOLEAN = "boolean"
|
|
19
|
+
DATE = "date"
|
|
20
|
+
DATETIME = "datetime"
|
|
21
|
+
LIST = "list"
|
|
22
|
+
DICT = "dict"
|
|
23
|
+
ANY = "any"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class PropertySchema(BaseModel):
|
|
27
|
+
"""
|
|
28
|
+
Property Schema Definition
|
|
29
|
+
|
|
30
|
+
Defines the schema for a single property that can be attached to
|
|
31
|
+
entities or relations in the knowledge graph.
|
|
32
|
+
|
|
33
|
+
Attributes:
|
|
34
|
+
name: Property name
|
|
35
|
+
property_type: Data type of the property
|
|
36
|
+
required: Whether the property is required
|
|
37
|
+
description: Human-readable description
|
|
38
|
+
default: Default value if not provided
|
|
39
|
+
allowed_values: List of allowed values (for enums)
|
|
40
|
+
min_value: Minimum value (for numeric types)
|
|
41
|
+
max_value: Maximum value (for numeric types)
|
|
42
|
+
|
|
43
|
+
Example:
|
|
44
|
+
```python
|
|
45
|
+
prop = PropertySchema(
|
|
46
|
+
name="age",
|
|
47
|
+
property_type=PropertyType.INTEGER,
|
|
48
|
+
required=False,
|
|
49
|
+
description="Person's age in years",
|
|
50
|
+
min_value=0,
|
|
51
|
+
max_value=150
|
|
52
|
+
)
|
|
53
|
+
```
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
name: str = Field(
|
|
57
|
+
...,
|
|
58
|
+
description="Property name (must be unique within entity/relation type)",
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
property_type: PropertyType = Field(default=PropertyType.STRING, description="Data type of the property")
|
|
62
|
+
|
|
63
|
+
required: bool = Field(default=False, description="Whether this property is required")
|
|
64
|
+
|
|
65
|
+
description: Optional[str] = Field(default=None, description="Human-readable description of the property")
|
|
66
|
+
|
|
67
|
+
default: Optional[Any] = Field(default=None, description="Default value if property is not provided")
|
|
68
|
+
|
|
69
|
+
allowed_values: Optional[List[Any]] = Field(
|
|
70
|
+
default=None,
|
|
71
|
+
description="List of allowed values (for enum-like properties)",
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
min_value: Optional[float] = Field(default=None, description="Minimum value (for numeric types)")
|
|
75
|
+
|
|
76
|
+
max_value: Optional[float] = Field(default=None, description="Maximum value (for numeric types)")
|
|
77
|
+
|
|
78
|
+
class Config:
|
|
79
|
+
use_enum_values = True
|
|
80
|
+
|
|
81
|
+
def validate_value(self, value: Any) -> bool:
|
|
82
|
+
"""
|
|
83
|
+
Validate a value against this schema
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
value: Value to validate
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
True if value is valid
|
|
90
|
+
|
|
91
|
+
Raises:
|
|
92
|
+
ValueError: If value doesn't match schema
|
|
93
|
+
"""
|
|
94
|
+
if value is None:
|
|
95
|
+
if self.required:
|
|
96
|
+
raise ValueError(f"Property '{self.name}' is required but got None")
|
|
97
|
+
return True
|
|
98
|
+
|
|
99
|
+
# Type validation
|
|
100
|
+
if self.property_type == PropertyType.STRING:
|
|
101
|
+
if not isinstance(value, str):
|
|
102
|
+
raise ValueError(f"Property '{self.name}' must be string, got {type(value)}")
|
|
103
|
+
|
|
104
|
+
elif self.property_type == PropertyType.INTEGER:
|
|
105
|
+
if not isinstance(value, int) or isinstance(value, bool):
|
|
106
|
+
raise ValueError(f"Property '{self.name}' must be integer, got {type(value)}")
|
|
107
|
+
|
|
108
|
+
elif self.property_type == PropertyType.FLOAT:
|
|
109
|
+
if not isinstance(value, (int, float)) or isinstance(value, bool):
|
|
110
|
+
raise ValueError(f"Property '{self.name}' must be numeric, got {type(value)}")
|
|
111
|
+
|
|
112
|
+
elif self.property_type == PropertyType.BOOLEAN:
|
|
113
|
+
if not isinstance(value, bool):
|
|
114
|
+
raise ValueError(f"Property '{self.name}' must be boolean, got {type(value)}")
|
|
115
|
+
|
|
116
|
+
elif self.property_type == PropertyType.LIST:
|
|
117
|
+
if not isinstance(value, list):
|
|
118
|
+
raise ValueError(f"Property '{self.name}' must be list, got {type(value)}")
|
|
119
|
+
|
|
120
|
+
elif self.property_type == PropertyType.DICT:
|
|
121
|
+
if not isinstance(value, dict):
|
|
122
|
+
raise ValueError(f"Property '{self.name}' must be dict, got {type(value)}")
|
|
123
|
+
|
|
124
|
+
# Allowed values validation
|
|
125
|
+
if self.allowed_values is not None:
|
|
126
|
+
if value not in self.allowed_values:
|
|
127
|
+
raise ValueError(f"Property '{self.name}' value must be one of {self.allowed_values}, got {value}")
|
|
128
|
+
|
|
129
|
+
# Range validation for numeric types
|
|
130
|
+
if self.property_type in (PropertyType.INTEGER, PropertyType.FLOAT):
|
|
131
|
+
if self.min_value is not None and value < self.min_value:
|
|
132
|
+
raise ValueError(f"Property '{self.name}' must be >= {self.min_value}, got {value}")
|
|
133
|
+
if self.max_value is not None and value > self.max_value:
|
|
134
|
+
raise ValueError(f"Property '{self.name}' must be <= {self.max_value}, got {value}")
|
|
135
|
+
|
|
136
|
+
return True
|
|
137
|
+
|
|
138
|
+
def __str__(self) -> str:
|
|
139
|
+
required_str = " (required)" if self.required else ""
|
|
140
|
+
return f"PropertySchema(name='{self.name}', type={self.property_type}{required_str})"
|
|
141
|
+
|
|
142
|
+
def __repr__(self) -> str:
|
|
143
|
+
return self.__str__()
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Relation Type Schema Definition
|
|
3
|
+
|
|
4
|
+
Defines the schema for relation types in the knowledge graph.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Dict, List, Optional, Any
|
|
8
|
+
from pydantic import BaseModel, Field
|
|
9
|
+
from aiecs.domain.knowledge_graph.schema.property_schema import PropertySchema
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class RelationType(BaseModel):
|
|
13
|
+
"""
|
|
14
|
+
Relation Type Schema
|
|
15
|
+
|
|
16
|
+
Defines the schema for a type of relation in the knowledge graph,
|
|
17
|
+
including source/target constraints and properties.
|
|
18
|
+
|
|
19
|
+
Attributes:
|
|
20
|
+
name: Relation type name (e.g., "WORKS_FOR", "KNOWS")
|
|
21
|
+
description: Human-readable description
|
|
22
|
+
properties: Dictionary of property schemas
|
|
23
|
+
source_entity_types: Allowed source entity types (None = any)
|
|
24
|
+
target_entity_types: Allowed target entity types (None = any)
|
|
25
|
+
is_symmetric: Whether the relation is symmetric (A->B implies B->A)
|
|
26
|
+
is_transitive: Whether the relation is transitive (A->B, B->C implies A->C)
|
|
27
|
+
|
|
28
|
+
Example:
|
|
29
|
+
```python
|
|
30
|
+
works_for = RelationType(
|
|
31
|
+
name="WORKS_FOR",
|
|
32
|
+
description="Employment relationship",
|
|
33
|
+
source_entity_types=["Person"],
|
|
34
|
+
target_entity_types=["Company"],
|
|
35
|
+
properties={
|
|
36
|
+
"since": PropertySchema(name="since", property_type=PropertyType.DATE),
|
|
37
|
+
"role": PropertySchema(name="role", property_type=PropertyType.STRING),
|
|
38
|
+
}
|
|
39
|
+
)
|
|
40
|
+
```
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
name: str = Field(..., description="Relation type name (must be unique)")
|
|
44
|
+
|
|
45
|
+
description: Optional[str] = Field(
|
|
46
|
+
default=None,
|
|
47
|
+
description="Human-readable description of this relation type",
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
properties: Dict[str, PropertySchema] = Field(
|
|
51
|
+
default_factory=dict,
|
|
52
|
+
description="Dictionary of property schemas (key=property name)",
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
source_entity_types: Optional[List[str]] = Field(
|
|
56
|
+
default=None,
|
|
57
|
+
description="Allowed source entity types (None = any type allowed)",
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
target_entity_types: Optional[List[str]] = Field(
|
|
61
|
+
default=None,
|
|
62
|
+
description="Allowed target entity types (None = any type allowed)",
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
is_symmetric: bool = Field(
|
|
66
|
+
default=False,
|
|
67
|
+
description="Whether relation is symmetric (A->B implies B->A)",
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
is_transitive: bool = Field(
|
|
71
|
+
default=False,
|
|
72
|
+
description="Whether relation is transitive (A->B, B->C implies A->C)",
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
class Config:
|
|
76
|
+
arbitrary_types_allowed = True
|
|
77
|
+
|
|
78
|
+
def add_property(self, prop: PropertySchema) -> None:
|
|
79
|
+
"""
|
|
80
|
+
Add a property to this relation type
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
prop: Property schema to add
|
|
84
|
+
"""
|
|
85
|
+
self.properties[prop.name] = prop
|
|
86
|
+
|
|
87
|
+
def remove_property(self, property_name: str) -> None:
|
|
88
|
+
"""
|
|
89
|
+
Remove a property from this relation type
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
property_name: Name of property to remove
|
|
93
|
+
"""
|
|
94
|
+
if property_name in self.properties:
|
|
95
|
+
del self.properties[property_name]
|
|
96
|
+
|
|
97
|
+
def get_property(self, property_name: str) -> Optional[PropertySchema]:
|
|
98
|
+
"""
|
|
99
|
+
Get a property schema by name
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
property_name: Name of property to get
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Property schema or None if not found
|
|
106
|
+
"""
|
|
107
|
+
return self.properties.get(property_name)
|
|
108
|
+
|
|
109
|
+
def validate_properties(self, properties: Dict[str, Any]) -> bool:
|
|
110
|
+
"""
|
|
111
|
+
Validate a dictionary of properties against this schema
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
properties: Dictionary of properties to validate
|
|
115
|
+
|
|
116
|
+
Returns:
|
|
117
|
+
True if all properties are valid
|
|
118
|
+
|
|
119
|
+
Raises:
|
|
120
|
+
ValueError: If validation fails
|
|
121
|
+
"""
|
|
122
|
+
# Check required properties
|
|
123
|
+
for prop_name, prop_schema in self.properties.items():
|
|
124
|
+
if prop_schema.required and prop_name not in properties:
|
|
125
|
+
raise ValueError(f"Required property '{prop_name}' missing for relation type '{self.name}'")
|
|
126
|
+
|
|
127
|
+
# Validate each provided property
|
|
128
|
+
for prop_name, prop_value in properties.items():
|
|
129
|
+
if prop_name in self.properties:
|
|
130
|
+
prop_schema = self.properties[prop_name]
|
|
131
|
+
prop_schema.validate_value(prop_value)
|
|
132
|
+
|
|
133
|
+
return True
|
|
134
|
+
|
|
135
|
+
def validate_entity_types(self, source_entity_type: str, target_entity_type: str) -> bool:
|
|
136
|
+
"""
|
|
137
|
+
Validate that source and target entity types are allowed
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
source_entity_type: Source entity type name
|
|
141
|
+
target_entity_type: Target entity type name
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
True if entity types are valid
|
|
145
|
+
|
|
146
|
+
Raises:
|
|
147
|
+
ValueError: If entity types are not allowed
|
|
148
|
+
"""
|
|
149
|
+
if self.source_entity_types is not None:
|
|
150
|
+
if source_entity_type not in self.source_entity_types:
|
|
151
|
+
raise ValueError(f"Source entity type '{source_entity_type}' not allowed for " f"relation '{self.name}'. Allowed: {self.source_entity_types}")
|
|
152
|
+
|
|
153
|
+
if self.target_entity_types is not None:
|
|
154
|
+
if target_entity_type not in self.target_entity_types:
|
|
155
|
+
raise ValueError(f"Target entity type '{target_entity_type}' not allowed for " f"relation '{self.name}'. Allowed: {self.target_entity_types}")
|
|
156
|
+
|
|
157
|
+
return True
|
|
158
|
+
|
|
159
|
+
def __str__(self) -> str:
|
|
160
|
+
return f"RelationType(name='{self.name}', properties={len(self.properties)})"
|
|
161
|
+
|
|
162
|
+
def __repr__(self) -> str:
|
|
163
|
+
return self.__str__()
|