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.
Files changed (302) hide show
  1. aiecs/__init__.py +72 -0
  2. aiecs/__main__.py +41 -0
  3. aiecs/aiecs_client.py +469 -0
  4. aiecs/application/__init__.py +10 -0
  5. aiecs/application/executors/__init__.py +10 -0
  6. aiecs/application/executors/operation_executor.py +363 -0
  7. aiecs/application/knowledge_graph/__init__.py +7 -0
  8. aiecs/application/knowledge_graph/builder/__init__.py +37 -0
  9. aiecs/application/knowledge_graph/builder/document_builder.py +375 -0
  10. aiecs/application/knowledge_graph/builder/graph_builder.py +356 -0
  11. aiecs/application/knowledge_graph/builder/schema_mapping.py +531 -0
  12. aiecs/application/knowledge_graph/builder/structured_pipeline.py +443 -0
  13. aiecs/application/knowledge_graph/builder/text_chunker.py +319 -0
  14. aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
  15. aiecs/application/knowledge_graph/extractors/base.py +100 -0
  16. aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +327 -0
  17. aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +349 -0
  18. aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +244 -0
  19. aiecs/application/knowledge_graph/fusion/__init__.py +23 -0
  20. aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +387 -0
  21. aiecs/application/knowledge_graph/fusion/entity_linker.py +343 -0
  22. aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +580 -0
  23. aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +189 -0
  24. aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
  25. aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +344 -0
  26. aiecs/application/knowledge_graph/pattern_matching/query_executor.py +378 -0
  27. aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
  28. aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +199 -0
  29. aiecs/application/knowledge_graph/profiling/query_profiler.py +223 -0
  30. aiecs/application/knowledge_graph/reasoning/__init__.py +27 -0
  31. aiecs/application/knowledge_graph/reasoning/evidence_synthesis.py +347 -0
  32. aiecs/application/knowledge_graph/reasoning/inference_engine.py +504 -0
  33. aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +167 -0
  34. aiecs/application/knowledge_graph/reasoning/logic_parser/__init__.py +79 -0
  35. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_builder.py +513 -0
  36. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_nodes.py +630 -0
  37. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +654 -0
  38. aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +477 -0
  39. aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +390 -0
  40. aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +217 -0
  41. aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +169 -0
  42. aiecs/application/knowledge_graph/reasoning/query_planner.py +872 -0
  43. aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +554 -0
  44. aiecs/application/knowledge_graph/retrieval/__init__.py +19 -0
  45. aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +596 -0
  46. aiecs/application/knowledge_graph/search/__init__.py +59 -0
  47. aiecs/application/knowledge_graph/search/hybrid_search.py +423 -0
  48. aiecs/application/knowledge_graph/search/reranker.py +295 -0
  49. aiecs/application/knowledge_graph/search/reranker_strategies.py +553 -0
  50. aiecs/application/knowledge_graph/search/text_similarity.py +398 -0
  51. aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
  52. aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +329 -0
  53. aiecs/application/knowledge_graph/traversal/path_scorer.py +269 -0
  54. aiecs/application/knowledge_graph/validators/__init__.py +13 -0
  55. aiecs/application/knowledge_graph/validators/relation_validator.py +189 -0
  56. aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
  57. aiecs/application/knowledge_graph/visualization/graph_visualizer.py +321 -0
  58. aiecs/common/__init__.py +9 -0
  59. aiecs/common/knowledge_graph/__init__.py +17 -0
  60. aiecs/common/knowledge_graph/runnable.py +484 -0
  61. aiecs/config/__init__.py +16 -0
  62. aiecs/config/config.py +498 -0
  63. aiecs/config/graph_config.py +137 -0
  64. aiecs/config/registry.py +23 -0
  65. aiecs/core/__init__.py +46 -0
  66. aiecs/core/interface/__init__.py +34 -0
  67. aiecs/core/interface/execution_interface.py +152 -0
  68. aiecs/core/interface/storage_interface.py +171 -0
  69. aiecs/domain/__init__.py +289 -0
  70. aiecs/domain/agent/__init__.py +189 -0
  71. aiecs/domain/agent/base_agent.py +697 -0
  72. aiecs/domain/agent/exceptions.py +103 -0
  73. aiecs/domain/agent/graph_aware_mixin.py +559 -0
  74. aiecs/domain/agent/hybrid_agent.py +490 -0
  75. aiecs/domain/agent/integration/__init__.py +26 -0
  76. aiecs/domain/agent/integration/context_compressor.py +222 -0
  77. aiecs/domain/agent/integration/context_engine_adapter.py +252 -0
  78. aiecs/domain/agent/integration/retry_policy.py +219 -0
  79. aiecs/domain/agent/integration/role_config.py +213 -0
  80. aiecs/domain/agent/knowledge_aware_agent.py +646 -0
  81. aiecs/domain/agent/lifecycle.py +296 -0
  82. aiecs/domain/agent/llm_agent.py +300 -0
  83. aiecs/domain/agent/memory/__init__.py +12 -0
  84. aiecs/domain/agent/memory/conversation.py +197 -0
  85. aiecs/domain/agent/migration/__init__.py +14 -0
  86. aiecs/domain/agent/migration/conversion.py +160 -0
  87. aiecs/domain/agent/migration/legacy_wrapper.py +90 -0
  88. aiecs/domain/agent/models.py +317 -0
  89. aiecs/domain/agent/observability.py +407 -0
  90. aiecs/domain/agent/persistence.py +289 -0
  91. aiecs/domain/agent/prompts/__init__.py +29 -0
  92. aiecs/domain/agent/prompts/builder.py +161 -0
  93. aiecs/domain/agent/prompts/formatters.py +189 -0
  94. aiecs/domain/agent/prompts/template.py +255 -0
  95. aiecs/domain/agent/registry.py +260 -0
  96. aiecs/domain/agent/tool_agent.py +257 -0
  97. aiecs/domain/agent/tools/__init__.py +12 -0
  98. aiecs/domain/agent/tools/schema_generator.py +221 -0
  99. aiecs/domain/community/__init__.py +155 -0
  100. aiecs/domain/community/agent_adapter.py +477 -0
  101. aiecs/domain/community/analytics.py +481 -0
  102. aiecs/domain/community/collaborative_workflow.py +642 -0
  103. aiecs/domain/community/communication_hub.py +645 -0
  104. aiecs/domain/community/community_builder.py +320 -0
  105. aiecs/domain/community/community_integration.py +800 -0
  106. aiecs/domain/community/community_manager.py +813 -0
  107. aiecs/domain/community/decision_engine.py +879 -0
  108. aiecs/domain/community/exceptions.py +225 -0
  109. aiecs/domain/community/models/__init__.py +33 -0
  110. aiecs/domain/community/models/community_models.py +268 -0
  111. aiecs/domain/community/resource_manager.py +457 -0
  112. aiecs/domain/community/shared_context_manager.py +603 -0
  113. aiecs/domain/context/__init__.py +58 -0
  114. aiecs/domain/context/context_engine.py +989 -0
  115. aiecs/domain/context/conversation_models.py +354 -0
  116. aiecs/domain/context/graph_memory.py +467 -0
  117. aiecs/domain/execution/__init__.py +12 -0
  118. aiecs/domain/execution/model.py +57 -0
  119. aiecs/domain/knowledge_graph/__init__.py +19 -0
  120. aiecs/domain/knowledge_graph/models/__init__.py +52 -0
  121. aiecs/domain/knowledge_graph/models/entity.py +130 -0
  122. aiecs/domain/knowledge_graph/models/evidence.py +194 -0
  123. aiecs/domain/knowledge_graph/models/inference_rule.py +186 -0
  124. aiecs/domain/knowledge_graph/models/path.py +179 -0
  125. aiecs/domain/knowledge_graph/models/path_pattern.py +173 -0
  126. aiecs/domain/knowledge_graph/models/query.py +272 -0
  127. aiecs/domain/knowledge_graph/models/query_plan.py +187 -0
  128. aiecs/domain/knowledge_graph/models/relation.py +136 -0
  129. aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
  130. aiecs/domain/knowledge_graph/schema/entity_type.py +135 -0
  131. aiecs/domain/knowledge_graph/schema/graph_schema.py +271 -0
  132. aiecs/domain/knowledge_graph/schema/property_schema.py +155 -0
  133. aiecs/domain/knowledge_graph/schema/relation_type.py +171 -0
  134. aiecs/domain/knowledge_graph/schema/schema_manager.py +496 -0
  135. aiecs/domain/knowledge_graph/schema/type_enums.py +205 -0
  136. aiecs/domain/task/__init__.py +13 -0
  137. aiecs/domain/task/dsl_processor.py +613 -0
  138. aiecs/domain/task/model.py +62 -0
  139. aiecs/domain/task/task_context.py +268 -0
  140. aiecs/infrastructure/__init__.py +24 -0
  141. aiecs/infrastructure/graph_storage/__init__.py +11 -0
  142. aiecs/infrastructure/graph_storage/base.py +601 -0
  143. aiecs/infrastructure/graph_storage/batch_operations.py +449 -0
  144. aiecs/infrastructure/graph_storage/cache.py +429 -0
  145. aiecs/infrastructure/graph_storage/distributed.py +226 -0
  146. aiecs/infrastructure/graph_storage/error_handling.py +390 -0
  147. aiecs/infrastructure/graph_storage/graceful_degradation.py +306 -0
  148. aiecs/infrastructure/graph_storage/health_checks.py +378 -0
  149. aiecs/infrastructure/graph_storage/in_memory.py +514 -0
  150. aiecs/infrastructure/graph_storage/index_optimization.py +483 -0
  151. aiecs/infrastructure/graph_storage/lazy_loading.py +410 -0
  152. aiecs/infrastructure/graph_storage/metrics.py +357 -0
  153. aiecs/infrastructure/graph_storage/migration.py +413 -0
  154. aiecs/infrastructure/graph_storage/pagination.py +471 -0
  155. aiecs/infrastructure/graph_storage/performance_monitoring.py +466 -0
  156. aiecs/infrastructure/graph_storage/postgres.py +871 -0
  157. aiecs/infrastructure/graph_storage/query_optimizer.py +635 -0
  158. aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
  159. aiecs/infrastructure/graph_storage/sqlite.py +623 -0
  160. aiecs/infrastructure/graph_storage/streaming.py +495 -0
  161. aiecs/infrastructure/messaging/__init__.py +13 -0
  162. aiecs/infrastructure/messaging/celery_task_manager.py +383 -0
  163. aiecs/infrastructure/messaging/websocket_manager.py +298 -0
  164. aiecs/infrastructure/monitoring/__init__.py +34 -0
  165. aiecs/infrastructure/monitoring/executor_metrics.py +174 -0
  166. aiecs/infrastructure/monitoring/global_metrics_manager.py +213 -0
  167. aiecs/infrastructure/monitoring/structured_logger.py +48 -0
  168. aiecs/infrastructure/monitoring/tracing_manager.py +410 -0
  169. aiecs/infrastructure/persistence/__init__.py +24 -0
  170. aiecs/infrastructure/persistence/context_engine_client.py +187 -0
  171. aiecs/infrastructure/persistence/database_manager.py +333 -0
  172. aiecs/infrastructure/persistence/file_storage.py +754 -0
  173. aiecs/infrastructure/persistence/redis_client.py +220 -0
  174. aiecs/llm/__init__.py +86 -0
  175. aiecs/llm/callbacks/__init__.py +11 -0
  176. aiecs/llm/callbacks/custom_callbacks.py +264 -0
  177. aiecs/llm/client_factory.py +420 -0
  178. aiecs/llm/clients/__init__.py +33 -0
  179. aiecs/llm/clients/base_client.py +193 -0
  180. aiecs/llm/clients/googleai_client.py +181 -0
  181. aiecs/llm/clients/openai_client.py +131 -0
  182. aiecs/llm/clients/vertex_client.py +437 -0
  183. aiecs/llm/clients/xai_client.py +184 -0
  184. aiecs/llm/config/__init__.py +51 -0
  185. aiecs/llm/config/config_loader.py +275 -0
  186. aiecs/llm/config/config_validator.py +236 -0
  187. aiecs/llm/config/model_config.py +151 -0
  188. aiecs/llm/utils/__init__.py +10 -0
  189. aiecs/llm/utils/validate_config.py +91 -0
  190. aiecs/main.py +363 -0
  191. aiecs/scripts/__init__.py +3 -0
  192. aiecs/scripts/aid/VERSION_MANAGEMENT.md +97 -0
  193. aiecs/scripts/aid/__init__.py +19 -0
  194. aiecs/scripts/aid/version_manager.py +215 -0
  195. aiecs/scripts/dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md +242 -0
  196. aiecs/scripts/dependance_check/README_DEPENDENCY_CHECKER.md +310 -0
  197. aiecs/scripts/dependance_check/__init__.py +17 -0
  198. aiecs/scripts/dependance_check/dependency_checker.py +938 -0
  199. aiecs/scripts/dependance_check/dependency_fixer.py +391 -0
  200. aiecs/scripts/dependance_check/download_nlp_data.py +396 -0
  201. aiecs/scripts/dependance_check/quick_dependency_check.py +270 -0
  202. aiecs/scripts/dependance_check/setup_nlp_data.sh +217 -0
  203. aiecs/scripts/dependance_patch/__init__.py +7 -0
  204. aiecs/scripts/dependance_patch/fix_weasel/README_WEASEL_PATCH.md +126 -0
  205. aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
  206. aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.py +128 -0
  207. aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.sh +82 -0
  208. aiecs/scripts/dependance_patch/fix_weasel/patch_weasel_library.sh +188 -0
  209. aiecs/scripts/dependance_patch/fix_weasel/run_weasel_patch.sh +41 -0
  210. aiecs/scripts/tools_develop/README.md +449 -0
  211. aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
  212. aiecs/scripts/tools_develop/__init__.py +21 -0
  213. aiecs/scripts/tools_develop/check_type_annotations.py +259 -0
  214. aiecs/scripts/tools_develop/validate_tool_schemas.py +422 -0
  215. aiecs/scripts/tools_develop/verify_tools.py +356 -0
  216. aiecs/tasks/__init__.py +1 -0
  217. aiecs/tasks/worker.py +172 -0
  218. aiecs/tools/__init__.py +299 -0
  219. aiecs/tools/apisource/__init__.py +99 -0
  220. aiecs/tools/apisource/intelligence/__init__.py +19 -0
  221. aiecs/tools/apisource/intelligence/data_fusion.py +381 -0
  222. aiecs/tools/apisource/intelligence/query_analyzer.py +413 -0
  223. aiecs/tools/apisource/intelligence/search_enhancer.py +388 -0
  224. aiecs/tools/apisource/monitoring/__init__.py +9 -0
  225. aiecs/tools/apisource/monitoring/metrics.py +303 -0
  226. aiecs/tools/apisource/providers/__init__.py +115 -0
  227. aiecs/tools/apisource/providers/base.py +664 -0
  228. aiecs/tools/apisource/providers/census.py +401 -0
  229. aiecs/tools/apisource/providers/fred.py +564 -0
  230. aiecs/tools/apisource/providers/newsapi.py +412 -0
  231. aiecs/tools/apisource/providers/worldbank.py +357 -0
  232. aiecs/tools/apisource/reliability/__init__.py +12 -0
  233. aiecs/tools/apisource/reliability/error_handler.py +375 -0
  234. aiecs/tools/apisource/reliability/fallback_strategy.py +391 -0
  235. aiecs/tools/apisource/tool.py +850 -0
  236. aiecs/tools/apisource/utils/__init__.py +9 -0
  237. aiecs/tools/apisource/utils/validators.py +338 -0
  238. aiecs/tools/base_tool.py +201 -0
  239. aiecs/tools/docs/__init__.py +121 -0
  240. aiecs/tools/docs/ai_document_orchestrator.py +599 -0
  241. aiecs/tools/docs/ai_document_writer_orchestrator.py +2403 -0
  242. aiecs/tools/docs/content_insertion_tool.py +1333 -0
  243. aiecs/tools/docs/document_creator_tool.py +1317 -0
  244. aiecs/tools/docs/document_layout_tool.py +1166 -0
  245. aiecs/tools/docs/document_parser_tool.py +994 -0
  246. aiecs/tools/docs/document_writer_tool.py +1818 -0
  247. aiecs/tools/knowledge_graph/__init__.py +17 -0
  248. aiecs/tools/knowledge_graph/graph_reasoning_tool.py +734 -0
  249. aiecs/tools/knowledge_graph/graph_search_tool.py +923 -0
  250. aiecs/tools/knowledge_graph/kg_builder_tool.py +476 -0
  251. aiecs/tools/langchain_adapter.py +542 -0
  252. aiecs/tools/schema_generator.py +275 -0
  253. aiecs/tools/search_tool/__init__.py +100 -0
  254. aiecs/tools/search_tool/analyzers.py +589 -0
  255. aiecs/tools/search_tool/cache.py +260 -0
  256. aiecs/tools/search_tool/constants.py +128 -0
  257. aiecs/tools/search_tool/context.py +216 -0
  258. aiecs/tools/search_tool/core.py +749 -0
  259. aiecs/tools/search_tool/deduplicator.py +123 -0
  260. aiecs/tools/search_tool/error_handler.py +271 -0
  261. aiecs/tools/search_tool/metrics.py +371 -0
  262. aiecs/tools/search_tool/rate_limiter.py +178 -0
  263. aiecs/tools/search_tool/schemas.py +277 -0
  264. aiecs/tools/statistics/__init__.py +80 -0
  265. aiecs/tools/statistics/ai_data_analysis_orchestrator.py +643 -0
  266. aiecs/tools/statistics/ai_insight_generator_tool.py +505 -0
  267. aiecs/tools/statistics/ai_report_orchestrator_tool.py +694 -0
  268. aiecs/tools/statistics/data_loader_tool.py +564 -0
  269. aiecs/tools/statistics/data_profiler_tool.py +658 -0
  270. aiecs/tools/statistics/data_transformer_tool.py +573 -0
  271. aiecs/tools/statistics/data_visualizer_tool.py +495 -0
  272. aiecs/tools/statistics/model_trainer_tool.py +487 -0
  273. aiecs/tools/statistics/statistical_analyzer_tool.py +459 -0
  274. aiecs/tools/task_tools/__init__.py +86 -0
  275. aiecs/tools/task_tools/chart_tool.py +732 -0
  276. aiecs/tools/task_tools/classfire_tool.py +922 -0
  277. aiecs/tools/task_tools/image_tool.py +447 -0
  278. aiecs/tools/task_tools/office_tool.py +684 -0
  279. aiecs/tools/task_tools/pandas_tool.py +635 -0
  280. aiecs/tools/task_tools/report_tool.py +635 -0
  281. aiecs/tools/task_tools/research_tool.py +392 -0
  282. aiecs/tools/task_tools/scraper_tool.py +715 -0
  283. aiecs/tools/task_tools/stats_tool.py +688 -0
  284. aiecs/tools/temp_file_manager.py +130 -0
  285. aiecs/tools/tool_executor/__init__.py +37 -0
  286. aiecs/tools/tool_executor/tool_executor.py +881 -0
  287. aiecs/utils/LLM_output_structor.py +445 -0
  288. aiecs/utils/__init__.py +34 -0
  289. aiecs/utils/base_callback.py +47 -0
  290. aiecs/utils/cache_provider.py +695 -0
  291. aiecs/utils/execution_utils.py +184 -0
  292. aiecs/utils/logging.py +1 -0
  293. aiecs/utils/prompt_loader.py +14 -0
  294. aiecs/utils/token_usage_repository.py +323 -0
  295. aiecs/ws/__init__.py +0 -0
  296. aiecs/ws/socket_server.py +52 -0
  297. aiecs-1.5.1.dist-info/METADATA +608 -0
  298. aiecs-1.5.1.dist-info/RECORD +302 -0
  299. aiecs-1.5.1.dist-info/WHEEL +5 -0
  300. aiecs-1.5.1.dist-info/entry_points.txt +10 -0
  301. aiecs-1.5.1.dist-info/licenses/LICENSE +225 -0
  302. aiecs-1.5.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,155 @@
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(
62
+ default=PropertyType.STRING, description="Data type of the property"
63
+ )
64
+
65
+ required: bool = Field(default=False, description="Whether this property is required")
66
+
67
+ description: Optional[str] = Field(
68
+ default=None, description="Human-readable description of the property"
69
+ )
70
+
71
+ default: Optional[Any] = Field(
72
+ default=None, description="Default value if property is not provided"
73
+ )
74
+
75
+ allowed_values: Optional[List[Any]] = Field(
76
+ default=None,
77
+ description="List of allowed values (for enum-like properties)",
78
+ )
79
+
80
+ min_value: Optional[float] = Field(
81
+ default=None, description="Minimum value (for numeric types)"
82
+ )
83
+
84
+ max_value: Optional[float] = Field(
85
+ default=None, description="Maximum value (for numeric types)"
86
+ )
87
+
88
+ class Config:
89
+ use_enum_values = True
90
+
91
+ def validate_value(self, value: Any) -> bool:
92
+ """
93
+ Validate a value against this schema
94
+
95
+ Args:
96
+ value: Value to validate
97
+
98
+ Returns:
99
+ True if value is valid
100
+
101
+ Raises:
102
+ ValueError: If value doesn't match schema
103
+ """
104
+ if value is None:
105
+ if self.required:
106
+ raise ValueError(f"Property '{self.name}' is required but got None")
107
+ return True
108
+
109
+ # Type validation
110
+ if self.property_type == PropertyType.STRING:
111
+ if not isinstance(value, str):
112
+ raise ValueError(f"Property '{self.name}' must be string, got {type(value)}")
113
+
114
+ elif self.property_type == PropertyType.INTEGER:
115
+ if not isinstance(value, int) or isinstance(value, bool):
116
+ raise ValueError(f"Property '{self.name}' must be integer, got {type(value)}")
117
+
118
+ elif self.property_type == PropertyType.FLOAT:
119
+ if not isinstance(value, (int, float)) or isinstance(value, bool):
120
+ raise ValueError(f"Property '{self.name}' must be numeric, got {type(value)}")
121
+
122
+ elif self.property_type == PropertyType.BOOLEAN:
123
+ if not isinstance(value, bool):
124
+ raise ValueError(f"Property '{self.name}' must be boolean, got {type(value)}")
125
+
126
+ elif self.property_type == PropertyType.LIST:
127
+ if not isinstance(value, list):
128
+ raise ValueError(f"Property '{self.name}' must be list, got {type(value)}")
129
+
130
+ elif self.property_type == PropertyType.DICT:
131
+ if not isinstance(value, dict):
132
+ raise ValueError(f"Property '{self.name}' must be dict, got {type(value)}")
133
+
134
+ # Allowed values validation
135
+ if self.allowed_values is not None:
136
+ if value not in self.allowed_values:
137
+ raise ValueError(
138
+ f"Property '{self.name}' value must be one of {self.allowed_values}, got {value}"
139
+ )
140
+
141
+ # Range validation for numeric types
142
+ if self.property_type in (PropertyType.INTEGER, PropertyType.FLOAT):
143
+ if self.min_value is not None and value < self.min_value:
144
+ raise ValueError(f"Property '{self.name}' must be >= {self.min_value}, got {value}")
145
+ if self.max_value is not None and value > self.max_value:
146
+ raise ValueError(f"Property '{self.name}' must be <= {self.max_value}, got {value}")
147
+
148
+ return True
149
+
150
+ def __str__(self) -> str:
151
+ required_str = " (required)" if self.required else ""
152
+ return f"PropertySchema(name='{self.name}', type={self.property_type}{required_str})"
153
+
154
+ def __repr__(self) -> str:
155
+ return self.__str__()
@@ -0,0 +1,171 @@
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(
126
+ f"Required property '{prop_name}' missing for relation type '{self.name}'"
127
+ )
128
+
129
+ # Validate each provided property
130
+ for prop_name, prop_value in properties.items():
131
+ if prop_name in self.properties:
132
+ prop_schema = self.properties[prop_name]
133
+ prop_schema.validate_value(prop_value)
134
+
135
+ return True
136
+
137
+ def validate_entity_types(self, source_entity_type: str, target_entity_type: str) -> bool:
138
+ """
139
+ Validate that source and target entity types are allowed
140
+
141
+ Args:
142
+ source_entity_type: Source entity type name
143
+ target_entity_type: Target entity type name
144
+
145
+ Returns:
146
+ True if entity types are valid
147
+
148
+ Raises:
149
+ ValueError: If entity types are not allowed
150
+ """
151
+ if self.source_entity_types is not None:
152
+ if source_entity_type not in self.source_entity_types:
153
+ raise ValueError(
154
+ f"Source entity type '{source_entity_type}' not allowed for "
155
+ f"relation '{self.name}'. Allowed: {self.source_entity_types}"
156
+ )
157
+
158
+ if self.target_entity_types is not None:
159
+ if target_entity_type not in self.target_entity_types:
160
+ raise ValueError(
161
+ f"Target entity type '{target_entity_type}' not allowed for "
162
+ f"relation '{self.name}'. Allowed: {self.target_entity_types}"
163
+ )
164
+
165
+ return True
166
+
167
+ def __str__(self) -> str:
168
+ return f"RelationType(name='{self.name}', properties={len(self.properties)})"
169
+
170
+ def __repr__(self) -> str:
171
+ return self.__str__()