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,457 @@
1
+ """
2
+ Community Resource Manager
3
+
4
+ Manages shared resources, knowledge bases, and collaborative tools
5
+ within agent communities.
6
+ """
7
+
8
+ import logging
9
+ from datetime import datetime
10
+ from typing import Dict, List, Any, Optional, Set
11
+ import json
12
+
13
+ from .models.community_models import (
14
+ CommunityResource,
15
+ CommunityMember,
16
+ ResourceType,
17
+ )
18
+ from .exceptions import CommunityValidationError as TaskValidationError
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+
23
+ class ResourceManager:
24
+ """
25
+ Manager for community resources, knowledge sharing, and collaborative tools.
26
+ """
27
+
28
+ def __init__(self, community_manager=None, context_engine=None):
29
+ """
30
+ Initialize the resource manager.
31
+
32
+ Args:
33
+ community_manager: Reference to the community manager
34
+ context_engine: Optional context engine for persistent storage
35
+ """
36
+ self.community_manager = community_manager
37
+ self.context_engine = context_engine
38
+
39
+ # Resource indexing and search
40
+ # tag -> set of resource_ids
41
+ self.resource_index: Dict[str, Set[str]] = {}
42
+ # type -> set of resource_ids
43
+ self.type_index: Dict[ResourceType, Set[str]] = {}
44
+ # owner_id -> set of resource_ids
45
+ self.owner_index: Dict[str, Set[str]] = {}
46
+
47
+ # Knowledge graph for resource relationships
48
+ self.resource_relationships: Dict[str, Dict[str, List[str]]] = {}
49
+
50
+ # Usage analytics
51
+ self.usage_analytics: Dict[str, Dict[str, Any]] = {}
52
+
53
+ logger.info("Resource manager initialized")
54
+
55
+ async def create_knowledge_resource(
56
+ self,
57
+ community_id: str,
58
+ owner_member_id: str,
59
+ title: str,
60
+ content: str,
61
+ knowledge_type: str = "general",
62
+ tags: Optional[List[str]] = None,
63
+ related_resources: Optional[List[str]] = None,
64
+ ) -> str:
65
+ """
66
+ Create a knowledge resource for the community.
67
+
68
+ Args:
69
+ community_id: ID of the community
70
+ owner_member_id: ID of the member creating the resource
71
+ title: Title of the knowledge resource
72
+ content: Knowledge content
73
+ knowledge_type: Type of knowledge (general, expertise, experience, etc.)
74
+ tags: Tags for categorization
75
+ related_resources: IDs of related resources
76
+
77
+ Returns:
78
+ Resource ID
79
+ """
80
+ resource_content = {
81
+ "title": title,
82
+ "content": content,
83
+ "knowledge_type": knowledge_type,
84
+ "created_at": datetime.utcnow().isoformat(),
85
+ "version": "1.0",
86
+ }
87
+
88
+ if related_resources:
89
+ resource_content["related_resources"] = related_resources
90
+
91
+ resource_id = await self.community_manager.create_community_resource(
92
+ community_id=community_id,
93
+ owner_member_id=owner_member_id,
94
+ name=title,
95
+ resource_type=ResourceType.KNOWLEDGE,
96
+ content=resource_content,
97
+ description=f"Knowledge resource: {knowledge_type}",
98
+ tags=tags or [],
99
+ )
100
+
101
+ # Update indexes
102
+ await self._update_resource_indexes(
103
+ resource_id, tags or [], ResourceType.KNOWLEDGE, owner_member_id
104
+ )
105
+
106
+ # Create relationships
107
+ if related_resources:
108
+ await self._create_resource_relationships(resource_id, related_resources)
109
+
110
+ logger.info(f"Created knowledge resource: {title} ({resource_id})")
111
+ return resource_id
112
+
113
+ async def create_tool_resource(
114
+ self,
115
+ community_id: str,
116
+ owner_member_id: str,
117
+ tool_name: str,
118
+ tool_config: Dict[str, Any],
119
+ description: str,
120
+ usage_instructions: str,
121
+ tags: Optional[List[str]] = None,
122
+ ) -> str:
123
+ """
124
+ Create a tool resource for community sharing.
125
+
126
+ Args:
127
+ community_id: ID of the community
128
+ owner_member_id: ID of the member creating the resource
129
+ tool_name: Name of the tool
130
+ tool_config: Tool configuration
131
+ description: Tool description
132
+ usage_instructions: Instructions for using the tool
133
+ tags: Tags for categorization
134
+
135
+ Returns:
136
+ Resource ID
137
+ """
138
+ resource_content = {
139
+ "tool_name": tool_name,
140
+ "tool_config": tool_config,
141
+ "description": description,
142
+ "usage_instructions": usage_instructions,
143
+ "created_at": datetime.utcnow().isoformat(),
144
+ "version": "1.0",
145
+ }
146
+
147
+ resource_id = await self.community_manager.create_community_resource(
148
+ community_id=community_id,
149
+ owner_member_id=owner_member_id,
150
+ name=tool_name,
151
+ resource_type=ResourceType.TOOL,
152
+ content=resource_content,
153
+ description=description,
154
+ tags=tags or [],
155
+ )
156
+
157
+ # Update indexes
158
+ await self._update_resource_indexes(
159
+ resource_id, tags or [], ResourceType.TOOL, owner_member_id
160
+ )
161
+
162
+ logger.info(f"Created tool resource: {tool_name} ({resource_id})")
163
+ return resource_id
164
+
165
+ async def create_experience_resource(
166
+ self,
167
+ community_id: str,
168
+ owner_member_id: str,
169
+ experience_title: str,
170
+ situation: str,
171
+ actions_taken: List[str],
172
+ outcomes: Dict[str, Any],
173
+ lessons_learned: List[str],
174
+ tags: Optional[List[str]] = None,
175
+ ) -> str:
176
+ """
177
+ Create an experience resource for knowledge sharing.
178
+
179
+ Args:
180
+ community_id: ID of the community
181
+ owner_member_id: ID of the member sharing the experience
182
+ experience_title: Title of the experience
183
+ situation: Description of the situation
184
+ actions_taken: List of actions taken
185
+ outcomes: Outcomes and results
186
+ lessons_learned: Key lessons learned
187
+ tags: Tags for categorization
188
+
189
+ Returns:
190
+ Resource ID
191
+ """
192
+ resource_content = {
193
+ "experience_title": experience_title,
194
+ "situation": situation,
195
+ "actions_taken": actions_taken,
196
+ "outcomes": outcomes,
197
+ "lessons_learned": lessons_learned,
198
+ "created_at": datetime.utcnow().isoformat(),
199
+ "experience_type": "case_study",
200
+ }
201
+
202
+ resource_id = await self.community_manager.create_community_resource(
203
+ community_id=community_id,
204
+ owner_member_id=owner_member_id,
205
+ name=experience_title,
206
+ resource_type=ResourceType.EXPERIENCE,
207
+ content=resource_content,
208
+ description=f"Experience sharing: {situation[:100]}...",
209
+ tags=tags or [],
210
+ )
211
+
212
+ # Update indexes
213
+ await self._update_resource_indexes(
214
+ resource_id, tags or [], ResourceType.EXPERIENCE, owner_member_id
215
+ )
216
+
217
+ logger.info(f"Created experience resource: {experience_title} ({resource_id})")
218
+ return resource_id
219
+
220
+ async def search_resources(
221
+ self,
222
+ community_id: str,
223
+ query: Optional[str] = None,
224
+ resource_type: Optional[ResourceType] = None,
225
+ tags: Optional[List[str]] = None,
226
+ owner_id: Optional[str] = None,
227
+ limit: int = 10,
228
+ ) -> List[Dict[str, Any]]:
229
+ """
230
+ Search for community resources.
231
+
232
+ Args:
233
+ community_id: ID of the community
234
+ query: Text query for searching
235
+ resource_type: Filter by resource type
236
+ tags: Filter by tags
237
+ owner_id: Filter by owner
238
+ limit: Maximum number of results
239
+
240
+ Returns:
241
+ List of matching resources
242
+ """
243
+ if not self.community_manager:
244
+ raise TaskValidationError("Community manager not available")
245
+
246
+ community = self.community_manager.communities.get(community_id)
247
+ if not community:
248
+ raise TaskValidationError(f"Community not found: {community_id}")
249
+
250
+ # Get candidate resource IDs
251
+ candidate_ids = set(community.shared_resources)
252
+
253
+ # Apply filters
254
+ if resource_type and resource_type in self.type_index:
255
+ candidate_ids &= self.type_index[resource_type]
256
+
257
+ if tags:
258
+ for tag in tags:
259
+ if tag in self.resource_index:
260
+ candidate_ids &= self.resource_index[tag]
261
+
262
+ if owner_id and owner_id in self.owner_index:
263
+ candidate_ids &= self.owner_index[owner_id]
264
+
265
+ # Get resource details and apply text search
266
+ results = []
267
+ for resource_id in candidate_ids:
268
+ resource = self.community_manager.resources.get(resource_id)
269
+ if not resource:
270
+ continue
271
+
272
+ # Text search in resource content
273
+ if query:
274
+ searchable_text = (
275
+ f"{resource.name} {resource.description or ''} {json.dumps(resource.content)}"
276
+ )
277
+ if query.lower() not in searchable_text.lower():
278
+ continue
279
+
280
+ # Add to results
281
+ results.append(
282
+ {
283
+ "resource_id": resource.resource_id,
284
+ "name": resource.name,
285
+ "resource_type": resource.resource_type,
286
+ "description": resource.description,
287
+ "owner_id": resource.owner_id,
288
+ "tags": resource.tags,
289
+ "usage_count": resource.usage_count,
290
+ "rating": resource.rating,
291
+ "created_at": resource.created_at,
292
+ "content_preview": self._get_content_preview(resource.content),
293
+ }
294
+ )
295
+
296
+ if len(results) >= limit:
297
+ break
298
+
299
+ # Sort by relevance (usage count and rating)
300
+ results.sort(key=lambda x: (x["usage_count"], x["rating"]), reverse=True)
301
+
302
+ logger.info(f"Found {len(results)} resources for query: {query}")
303
+ return results
304
+
305
+ async def get_resource_recommendations(
306
+ self,
307
+ community_id: str,
308
+ member_id: str,
309
+ context: Optional[Dict[str, Any]] = None,
310
+ limit: int = 5,
311
+ ) -> List[Dict[str, Any]]:
312
+ """
313
+ Get personalized resource recommendations for a member.
314
+
315
+ Args:
316
+ community_id: ID of the community
317
+ member_id: ID of the member
318
+ context: Optional context for recommendations
319
+ limit: Maximum number of recommendations
320
+
321
+ Returns:
322
+ List of recommended resources
323
+ """
324
+ if not self.community_manager:
325
+ raise TaskValidationError("Community manager not available")
326
+
327
+ member = self.community_manager.members.get(member_id)
328
+ if not member:
329
+ raise TaskValidationError(f"Member not found: {member_id}")
330
+
331
+ # Get member's specializations and interests
332
+ member_tags = set(member.specializations)
333
+
334
+ # Find resources matching member's interests
335
+ candidate_resources = []
336
+ for tag in member_tags:
337
+ if tag in self.resource_index:
338
+ for resource_id in self.resource_index[tag]:
339
+ resource = self.community_manager.resources.get(resource_id)
340
+ if resource and resource.owner_id != member_id: # Don't recommend own resources
341
+ candidate_resources.append(resource)
342
+
343
+ # Score and rank resources
344
+ scored_resources = []
345
+ for resource in candidate_resources:
346
+ score = self._calculate_recommendation_score(resource, member, context)
347
+ scored_resources.append((score, resource))
348
+
349
+ # Sort by score and return top recommendations
350
+ scored_resources.sort(key=lambda x: x[0], reverse=True)
351
+
352
+ recommendations = []
353
+ for score, resource in scored_resources[:limit]:
354
+ recommendations.append(
355
+ {
356
+ "resource_id": resource.resource_id,
357
+ "name": resource.name,
358
+ "resource_type": resource.resource_type,
359
+ "description": resource.description,
360
+ "recommendation_score": score,
361
+ "tags": resource.tags,
362
+ "usage_count": resource.usage_count,
363
+ "rating": resource.rating,
364
+ }
365
+ )
366
+
367
+ logger.info(f"Generated {len(recommendations)} recommendations for member {member_id}")
368
+ return recommendations
369
+
370
+ def _calculate_recommendation_score(
371
+ self,
372
+ resource: CommunityResource,
373
+ member: CommunityMember,
374
+ context: Optional[Dict[str, Any]] = None,
375
+ ) -> float:
376
+ """Calculate recommendation score for a resource."""
377
+ score = 0.0
378
+
379
+ # Tag matching score
380
+ member_tags = set(member.specializations)
381
+ resource_tags = set(resource.tags)
382
+ tag_overlap = len(member_tags & resource_tags)
383
+ score += tag_overlap * 2.0
384
+
385
+ # Usage popularity score
386
+ score += resource.usage_count * 0.1
387
+
388
+ # Quality score
389
+ score += resource.rating * 1.0
390
+
391
+ # Recency score (newer resources get slight boost)
392
+ days_old = (datetime.utcnow() - resource.created_at).days
393
+ recency_score = max(0, 1.0 - (days_old / 365)) # Decay over a year
394
+ score += recency_score * 0.5
395
+
396
+ return score
397
+
398
+ async def _update_resource_indexes(
399
+ self,
400
+ resource_id: str,
401
+ tags: List[str],
402
+ resource_type: ResourceType,
403
+ owner_id: str,
404
+ ) -> None:
405
+ """Update resource indexes for efficient searching."""
406
+ # Tag index
407
+ for tag in tags:
408
+ if tag not in self.resource_index:
409
+ self.resource_index[tag] = set()
410
+ self.resource_index[tag].add(resource_id)
411
+
412
+ # Type index
413
+ if resource_type not in self.type_index:
414
+ self.type_index[resource_type] = set()
415
+ self.type_index[resource_type].add(resource_id)
416
+
417
+ # Owner index
418
+ if owner_id not in self.owner_index:
419
+ self.owner_index[owner_id] = set()
420
+ self.owner_index[owner_id].add(resource_id)
421
+
422
+ async def _create_resource_relationships(
423
+ self, resource_id: str, related_resource_ids: List[str]
424
+ ) -> None:
425
+ """Create relationships between resources."""
426
+ if resource_id not in self.resource_relationships:
427
+ self.resource_relationships[resource_id] = {
428
+ "related_to": [],
429
+ "referenced_by": [],
430
+ }
431
+
432
+ for related_id in related_resource_ids:
433
+ # Add forward relationship
434
+ if related_id not in self.resource_relationships[resource_id]["related_to"]:
435
+ self.resource_relationships[resource_id]["related_to"].append(related_id)
436
+
437
+ # Add backward relationship
438
+ if related_id not in self.resource_relationships:
439
+ self.resource_relationships[related_id] = {
440
+ "related_to": [],
441
+ "referenced_by": [],
442
+ }
443
+ if resource_id not in self.resource_relationships[related_id]["referenced_by"]:
444
+ self.resource_relationships[related_id]["referenced_by"].append(resource_id)
445
+
446
+ def _get_content_preview(self, content: Dict[str, Any], max_length: int = 200) -> str:
447
+ """Get a preview of resource content."""
448
+ if "content" in content:
449
+ text = str(content["content"])
450
+ elif "description" in content:
451
+ text = str(content["description"])
452
+ else:
453
+ text = str(content)
454
+
455
+ if len(text) > max_length:
456
+ return text[:max_length] + "..."
457
+ return text