aiecs 1.2.0__py3-none-any.whl → 1.2.2__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.

Files changed (31) hide show
  1. aiecs/__init__.py +1 -1
  2. aiecs/aiecs_client.py +1 -1
  3. aiecs/config/config.py +38 -1
  4. aiecs/infrastructure/monitoring/__init__.py +22 -0
  5. aiecs/infrastructure/monitoring/global_metrics_manager.py +207 -0
  6. aiecs/infrastructure/persistence/file_storage.py +41 -28
  7. aiecs/llm/__init__.py +44 -7
  8. aiecs/llm/callbacks/__init__.py +12 -0
  9. aiecs/llm/{custom_callbacks.py → callbacks/custom_callbacks.py} +1 -1
  10. aiecs/llm/client_factory.py +23 -6
  11. aiecs/llm/clients/__init__.py +35 -0
  12. aiecs/llm/{base_client.py → clients/base_client.py} +73 -1
  13. aiecs/llm/{googleai_client.py → clients/googleai_client.py} +19 -15
  14. aiecs/llm/{openai_client.py → clients/openai_client.py} +9 -14
  15. aiecs/llm/{vertex_client.py → clients/vertex_client.py} +15 -15
  16. aiecs/llm/{xai_client.py → clients/xai_client.py} +36 -50
  17. aiecs/llm/config/__init__.py +54 -0
  18. aiecs/llm/config/config_loader.py +275 -0
  19. aiecs/llm/config/config_validator.py +237 -0
  20. aiecs/llm/config/model_config.py +132 -0
  21. aiecs/llm/utils/__init__.py +11 -0
  22. aiecs/llm/utils/validate_config.py +91 -0
  23. aiecs/main.py +32 -2
  24. aiecs/tools/tool_executor/__init__.py +2 -2
  25. aiecs/tools/tool_executor/tool_executor.py +3 -3
  26. {aiecs-1.2.0.dist-info → aiecs-1.2.2.dist-info}/METADATA +1 -1
  27. {aiecs-1.2.0.dist-info → aiecs-1.2.2.dist-info}/RECORD +31 -22
  28. {aiecs-1.2.0.dist-info → aiecs-1.2.2.dist-info}/WHEEL +0 -0
  29. {aiecs-1.2.0.dist-info → aiecs-1.2.2.dist-info}/entry_points.txt +0 -0
  30. {aiecs-1.2.0.dist-info → aiecs-1.2.2.dist-info}/licenses/LICENSE +0 -0
  31. {aiecs-1.2.0.dist-info → aiecs-1.2.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Validation script for LLM models configuration.
4
+
5
+ This script validates the LLM models configuration file and prints
6
+ information about configured providers and models.
7
+ """
8
+
9
+ import sys
10
+ import logging
11
+ from pathlib import Path
12
+
13
+ # Setup logging
14
+ logging.basicConfig(
15
+ level=logging.INFO,
16
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
17
+ )
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ def main():
22
+ """Main validation function"""
23
+ try:
24
+ from aiecs.llm.config import get_llm_config_loader, validate_llm_config
25
+
26
+ logger.info("=" * 70)
27
+ logger.info("LLM Models Configuration Validator")
28
+ logger.info("=" * 70)
29
+
30
+ # Load configuration
31
+ loader = get_llm_config_loader()
32
+ config = loader.get_config()
33
+
34
+ logger.info(f"\nConfiguration loaded from: {loader.get_config_path()}")
35
+
36
+ # Validate configuration
37
+ logger.info("\nValidating configuration...")
38
+ is_valid, warnings = validate_llm_config(config)
39
+
40
+ if is_valid:
41
+ logger.info("✓ Configuration is valid!")
42
+
43
+ # Print summary
44
+ logger.info("\n" + "=" * 70)
45
+ logger.info("Configuration Summary")
46
+ logger.info("=" * 70)
47
+
48
+ logger.info(f"\nTotal Providers: {len(config.providers)}")
49
+
50
+ for provider_name, provider_config in config.providers.items():
51
+ logger.info(f"\n{provider_name}:")
52
+ logger.info(f" Default Model: {provider_config.default_model}")
53
+ logger.info(f" Total Models: {len(provider_config.models)}")
54
+
55
+ if provider_config.model_mappings:
56
+ logger.info(f" Model Aliases: {len(provider_config.model_mappings)}")
57
+
58
+ logger.info(" Available Models:")
59
+ for model in provider_config.models:
60
+ cost_str = f"${model.costs.input:.6f} in / ${model.costs.output:.6f} out (per 1K tokens)"
61
+ logger.info(f" - {model.name}: {cost_str}")
62
+ if model.capabilities.vision:
63
+ logger.info(f" Vision: Yes")
64
+ if model.capabilities.function_calling:
65
+ logger.info(f" Function Calling: Yes")
66
+
67
+ logger.info("\n" + "=" * 70)
68
+ logger.info("Validation Complete!")
69
+ logger.info("=" * 70)
70
+
71
+ if warnings:
72
+ logger.info(f"\nNote: {len(warnings)} warnings were generated during validation.")
73
+ logger.info("See logs above for details.")
74
+
75
+ return 0
76
+
77
+ except FileNotFoundError as e:
78
+ logger.error(f"\n✗ Configuration file not found: {e}")
79
+ logger.error("\nPlease ensure the LLM models configuration file exists at:")
80
+ logger.error(" - aiecs/config/llm_models.yaml")
81
+ logger.error(" - Or set LLM_MODELS_CONFIG environment variable")
82
+ return 1
83
+
84
+ except Exception as e:
85
+ logger.error(f"\n✗ Validation failed: {e}", exc_info=True)
86
+ return 1
87
+
88
+
89
+ if __name__ == "__main__":
90
+ sys.exit(main())
91
+
aiecs/main.py CHANGED
@@ -29,6 +29,10 @@ from aiecs.infrastructure.persistence import (
29
29
  )
30
30
  from aiecs.infrastructure.messaging.celery_task_manager import CeleryTaskManager
31
31
  from aiecs.infrastructure.monitoring.structured_logger import setup_structured_logging
32
+ from aiecs.infrastructure.monitoring import (
33
+ initialize_global_metrics,
34
+ close_global_metrics
35
+ )
32
36
 
33
37
  # Import LLM client factory
34
38
  from aiecs.llm.client_factory import LLMClientFactory
@@ -61,6 +65,13 @@ async def lifespan(app: FastAPI):
61
65
  # Setup structured logging
62
66
  setup_structured_logging()
63
67
 
68
+ # Initialize global metrics (early in startup)
69
+ try:
70
+ await initialize_global_metrics()
71
+ logger.info("Global metrics initialized")
72
+ except Exception as e:
73
+ logger.warning(f"Global metrics initialization failed (continuing without it): {e}")
74
+
64
75
  # Initialize database connection
65
76
  try:
66
77
  db_manager = DatabaseManager()
@@ -117,6 +128,13 @@ async def lifespan(app: FastAPI):
117
128
  await LLMClientFactory.close_all()
118
129
  logger.info("LLM clients closed")
119
130
 
131
+ # Close global metrics
132
+ try:
133
+ await close_global_metrics()
134
+ logger.info("Global metrics closed")
135
+ except Exception as e:
136
+ logger.warning(f"Error closing global metrics: {e}")
137
+
120
138
  logger.info("AIECS shutdown complete")
121
139
 
122
140
 
@@ -124,7 +142,7 @@ async def lifespan(app: FastAPI):
124
142
  app = FastAPI(
125
143
  title="AIECS - AI Execute Services",
126
144
  description="Middleware service for AI-powered task execution and tool orchestration",
127
- version="1.2.0",
145
+ version="1.2.2",
128
146
  lifespan=lifespan
129
147
  )
130
148
 
@@ -149,7 +167,19 @@ async def health_check():
149
167
  return {
150
168
  "status": "healthy",
151
169
  "service": "aiecs",
152
- "version": "1.2.0"
170
+ "version": "1.2.2"
171
+ }
172
+
173
+
174
+ # Metrics health check endpoint
175
+ @app.get("/metrics/health")
176
+ async def metrics_health():
177
+ """Check global metrics health"""
178
+ from aiecs.infrastructure.monitoring import is_metrics_initialized, get_metrics_summary
179
+
180
+ return {
181
+ "initialized": is_metrics_initialized(),
182
+ "summary": get_metrics_summary()
153
183
  }
154
184
 
155
185
 
@@ -8,7 +8,7 @@ from .tool_executor import (
8
8
  SecurityError,
9
9
  TimeoutError,
10
10
  ExecutorConfig,
11
- ExecutorMetrics,
11
+ ToolExecutorStats,
12
12
  get_executor,
13
13
  validate_input,
14
14
  cache_result,
@@ -25,7 +25,7 @@ __all__ = [
25
25
  'SecurityError',
26
26
  'TimeoutError',
27
27
  'ExecutorConfig',
28
- 'ExecutorMetrics',
28
+ 'ToolExecutorStats',
29
29
  'get_executor',
30
30
  'validate_input',
31
31
  'cache_result',
@@ -76,9 +76,9 @@ class ExecutorConfig(BaseModel):
76
76
  model_config = ConfigDict(env_prefix="TOOL_EXECUTOR_")
77
77
 
78
78
  # Metrics counter
79
- class ExecutorMetrics:
79
+ class ToolExecutorStats:
80
80
  """
81
- Tracks executor performance metrics.
81
+ Tracks tool executor performance statistics.
82
82
  """
83
83
  def __init__(self):
84
84
  self.requests: int = 0
@@ -257,7 +257,7 @@ class ToolExecutor:
257
257
  )
258
258
  self._thread_pool = ThreadPoolExecutor(max_workers=max(os.cpu_count() or 4, self.config.max_workers))
259
259
  self._locks: Dict[str, threading.Lock] = {}
260
- self._metrics = ExecutorMetrics()
260
+ self._metrics = ToolExecutorStats()
261
261
  self.execution_utils = ExecutionUtils(
262
262
  cache_size=self.config.cache_size,
263
263
  cache_ttl=self.config.cache_ttl,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiecs
3
- Version: 1.2.0
3
+ Version: 1.2.2
4
4
  Summary: AI Execute Services - A middleware framework for AI-powered task execution and tool orchestration
5
5
  Author-email: AIECS Team <iretbl@gmail.com>
6
6
  License-Expression: MIT
@@ -1,12 +1,12 @@
1
- aiecs/__init__.py,sha256=NjZbBge1ngw1XEAwUSHR0zmuJuW6-EmE5ecGuDgFzb4,1859
1
+ aiecs/__init__.py,sha256=j7nUkV4w38idj8EIJXaTfkFWstU-oYs-WfNnRjT6-Xo,1859
2
2
  aiecs/__main__.py,sha256=AfQpzy3SgwWuP4DuymYcm4MISMuzqwhxxGSYo53PBvY,1035
3
- aiecs/aiecs_client.py,sha256=2wzc_XVZvBaTABL2INLFiU_a1uf1xJ9NrL1GTcHOv7Y,17268
4
- aiecs/main.py,sha256=J9UGndJ1hv9KvfdARvrcAhLG_u-gNY-1XDPySyThzc4,9911
3
+ aiecs/aiecs_client.py,sha256=gIqecRBBH_bYIWhqiHCemdVgmGb9Jqdxf1b6RoqXWlQ,17276
4
+ aiecs/main.py,sha256=jgn6K3H28tKK5z1CPGh-GcswcISh0bhtRaL1yAhtmlg,10837
5
5
  aiecs/application/__init__.py,sha256=NkmrUH1DqxJ3vaVC8QwscNdlWqHfC7ZagL4k3nZ_qz4,192
6
6
  aiecs/application/executors/__init__.py,sha256=WIl7L9HBsEhNfbNtJdvBvFUJXzESvNZVaiAA6tdtJcs,191
7
7
  aiecs/application/executors/operation_executor.py,sha256=-7mFo1hUnWdehVPg0fnSiRhW3LACpIiyLSH-iu7bX4U,13818
8
8
  aiecs/config/__init__.py,sha256=HykU6FgZrUx0w8V1_kAjP9NpXZTddZ9M3xo0fmBwMU8,336
9
- aiecs/config/config.py,sha256=8Xm2x4Jgolx48tuGljzafQ3zXlxYPXT6-8M054V_UaQ,5345
9
+ aiecs/config/config.py,sha256=qjuvD7ew0RKtTftTL4PORwgmridBwS4tAep5llSNUSU,6528
10
10
  aiecs/config/registry.py,sha256=5CPJcjeMu3FLc_keuCtJT60DtUxF6w-I68uIoxpcdq8,637
11
11
  aiecs/core/__init__.py,sha256=H0ZIk96q0KHKivcobnUCVJdJZmewucVJ9MKhRgUxmk0,1037
12
12
  aiecs/core/interface/__init__.py,sha256=soI7zdoN3eQynVb9uiwmgXkM5E75JYffTILktHb48x8,688
@@ -40,23 +40,32 @@ aiecs/infrastructure/__init__.py,sha256=dE-T4IQ0sQTekkMJGqX3HkaaWKJ4gSbq7IN1o8PM
40
40
  aiecs/infrastructure/messaging/__init__.py,sha256=KOEywSnktNWEN4O8_GE4KSopjMNEyfYhfUaTOkMxLUE,299
41
41
  aiecs/infrastructure/messaging/celery_task_manager.py,sha256=yEKJdO_N9hYb3wlOnoVkBzWahvRj637tOkn4geIjPP0,12984
42
42
  aiecs/infrastructure/messaging/websocket_manager.py,sha256=HhhLQw2hRV5Scc5HNMMZbAQGQp9QZBYPJQHulKwaeiI,11280
43
- aiecs/infrastructure/monitoring/__init__.py,sha256=fQ13Q1MTIJTNlh35BSCqXpayCTM_kYvvPTMRzQfPymA,256
43
+ aiecs/infrastructure/monitoring/__init__.py,sha256=AwMER9ozL1Vvp-Ol8GKIBqMEO-eDQ38Z6Bh6Vnr_aHk,825
44
44
  aiecs/infrastructure/monitoring/executor_metrics.py,sha256=z8KJpq6tfCOEArfR-YJ4UClTsef2mNMFuSDHrP51Aww,6040
45
+ aiecs/infrastructure/monitoring/global_metrics_manager.py,sha256=coIBS6v2MmtlQdzAFZTy9XRQvTYzspiJzYTIciU__pw,6549
45
46
  aiecs/infrastructure/monitoring/structured_logger.py,sha256=iI895YHmPoaLdXjxHxd952PeTfGw6sh-yUDCnF8R7NY,1657
46
47
  aiecs/infrastructure/monitoring/tracing_manager.py,sha256=g4u6paNCZCYdGDEMZiv4bYv_GTG0s8oug-BJgFmkDp0,13449
47
48
  aiecs/infrastructure/persistence/__init__.py,sha256=yoog7fEHmhgY50vGdgDNqiZCPUUL2-xnJrdhT5PrPWU,570
48
49
  aiecs/infrastructure/persistence/context_engine_client.py,sha256=KIzreimtg6WbuBYI4U0JTiRmNddpdpKHnGvuHVh86Hs,6051
49
50
  aiecs/infrastructure/persistence/database_manager.py,sha256=MRkMTALeeybzAfnfuJrOXbEchBCrMAgsz8YYyEUVMjI,12592
50
- aiecs/infrastructure/persistence/file_storage.py,sha256=d3tcV7Wg_-TGsbw3PY9ttNANntR5rIo7mBgE0CGXKZQ,23321
51
+ aiecs/infrastructure/persistence/file_storage.py,sha256=Z8EozljYPBUuBTzDn2cM2uBEPp2uUW_eHLzwNxbKcOk,23889
51
52
  aiecs/infrastructure/persistence/redis_client.py,sha256=CqPtYFP8-KHl3cJG9VHun9YFFSp3kCc3ZaZbW7GlqUU,5791
52
- aiecs/llm/__init__.py,sha256=INfMR-xeQ0K53iXf_LRMVdo-hDXooIoAcmXRemLWmjQ,1150
53
- aiecs/llm/base_client.py,sha256=R4B-KBJ0aCEuvni5XwHd6sR3XNYQF3q1ZycgQvCJUfk,3275
54
- aiecs/llm/client_factory.py,sha256=qvQXo0kIcGC6SzIE7xfCN0f7CcGNKPwauFq2mTUP0SA,13718
55
- aiecs/llm/custom_callbacks.py,sha256=qwNwWqBl8EYj2aY16zXChZKLpxZahU9QeY4p57uZ5YU,9933
56
- aiecs/llm/googleai_client.py,sha256=4cJuhdzzn-svM7NLnYASYsnV2P758EeD5_ljVZu_XFc,6213
57
- aiecs/llm/openai_client.py,sha256=T3-LMDV-bzv0fwyDCw6h9D2XbNbWd0dt-QmjKg-wkd0,4397
58
- aiecs/llm/vertex_client.py,sha256=DSKyTwlhpOVTXfCTgTD7NholVFtVm7F5qmHk8p8X1Po,10823
59
- aiecs/llm/xai_client.py,sha256=VYfBGD8ns6NHscT68DDmAmvwBMEVykLQufH8kFNf_L8,6809
53
+ aiecs/llm/__init__.py,sha256=QlpjRn6WK5rCC0Aswx4AeFmSAIxJQ0XyxjimrIee7jE,1860
54
+ aiecs/llm/client_factory.py,sha256=534lVM4JplAFT-4tMHl4ebN9T9Cfz8WTyJjBGA9ly2s,14383
55
+ aiecs/llm/callbacks/__init__.py,sha256=ewPn_AKobfdCkjxFJ1xlIM3bTWdmM01v4XT9_KUZTbg,192
56
+ aiecs/llm/callbacks/custom_callbacks.py,sha256=V94TSNsorgExgzQkNwvId9lxa11oF7efYOT9ULwsdF0,9941
57
+ aiecs/llm/clients/__init__.py,sha256=uQM004TQappwJMqTxVZNscpVPQtirkvYUPea3QYB7d0,697
58
+ aiecs/llm/clients/base_client.py,sha256=j4NY-oEdG5ALBCSddblPpjttISn5teqLVVUuZyYn7g4,5880
59
+ aiecs/llm/clients/googleai_client.py,sha256=sTgdw4eicxWruNGOMSsuEHbfF9RuDQo8SClqEtu1JOQ,6591
60
+ aiecs/llm/clients/openai_client.py,sha256=x7Y_yTVu0kp-gu5Z-M0Bx-O20D0YDgZoJQxzkjNpr6c,4202
61
+ aiecs/llm/clients/vertex_client.py,sha256=LqCCJSCdsaZ9VuBp8SFDdkqk3MxxHn-0HrtH4_xZG7U,10961
62
+ aiecs/llm/clients/xai_client.py,sha256=XEELb9_qFeeQaansDWvAJRJVpt8CaBRLcYskuv9uDq0,6386
63
+ aiecs/llm/config/__init__.py,sha256=KZbwHoBlbcN7HgNueA5p-0GpyVMJRNG1V5T-tkri8G4,1115
64
+ aiecs/llm/config/config_loader.py,sha256=PTMsZax3CoTrMo6BZlUoI7takII3_DHm3w5xTKgBJpA,8921
65
+ aiecs/llm/config/config_validator.py,sha256=y-wGySLtXfv9ZCOAYY1MhlTkKKUplrSOyK2GlP619Ok,7703
66
+ aiecs/llm/config/model_config.py,sha256=cAEaJ-vtE9vD--1PDkPRUfHQI_roMJmG1RBlaJjapGU,5680
67
+ aiecs/llm/utils/__init__.py,sha256=8Fxcr203TcgNWQ5oalzZJ0P2kFSKbVS231kYYXvGPGs,240
68
+ aiecs/llm/utils/validate_config.py,sha256=oNdU8Zw_rwdJYZN9TO6hq6PNOngChjeIOaA4gV-uDlQ,3114
60
69
  aiecs/scripts/__init__.py,sha256=cVxQ5iqym520eDQSpV7B6hWolndCLMOVdvhC_D280PE,66
61
70
  aiecs/scripts/aid/VERSION_MANAGEMENT.md,sha256=ElbRZFB9KdnDt9Lc4SQWLNY_3NbnLsl2ZHvLmczh2qw,2497
62
71
  aiecs/scripts/aid/__init__.py,sha256=nWdqTPA9pib6NGqckhYHYTwuO70TPkW02eV-e3u5i4w,345
@@ -116,8 +125,8 @@ aiecs/tools/task_tools/research_tool.py,sha256=teF5PxwzmTdoJ4f1EHWeO6PmwI8p7n5Yr
116
125
  aiecs/tools/task_tools/scraper_tool.py,sha256=OquSAWrCHauWYJGyFoSD5hJwmWbSeBCYFLbZbEVwC4M,24628
117
126
  aiecs/tools/task_tools/search_tool.py,sha256=UJNSZwAw8BXECrH_PmyPYQ_ezv65RcuNxBZrgjp4pIA,37142
118
127
  aiecs/tools/task_tools/stats_tool.py,sha256=Z5VtdlToioFpgslaBr9aJO7cZn4pBZ5J9TiX2DmxI9s,24302
119
- aiecs/tools/tool_executor/__init__.py,sha256=gxuujSlQFj8DQ9ejCisO_cYqk5GQkJnwv0sJERd80CM,711
120
- aiecs/tools/tool_executor/tool_executor.py,sha256=fuoKQahLBgRT6AQbHuOCLzG53w4UAD-QTraGjraEEsw,19496
128
+ aiecs/tools/tool_executor/__init__.py,sha256=FzQ1paMoGF7gZySTSfg96FwAgV914iMx_rfaFU_UFb8,715
129
+ aiecs/tools/tool_executor/tool_executor.py,sha256=x8RDSdfUaGGSp7ilTsZLFQpRditzfXgqkVbSmzVrXZ8,19508
121
130
  aiecs/utils/LLM_output_structor.py,sha256=zKkOhrg6smToD0NTCqj3OepBQDTZXgPK4VsKJEFgxyg,15793
122
131
  aiecs/utils/__init__.py,sha256=PkukDzRaeeAJUmfm9vA9ez1l3tjvhDRnWZCqzWI6nNw,562
123
132
  aiecs/utils/base_callback.py,sha256=UpNrOZZ1RCmiVPnuhjFNde_m29yWg1ID16vzfzBMk7U,1661
@@ -127,9 +136,9 @@ aiecs/utils/prompt_loader.py,sha256=cBS2bZXpYQOWSiOGkhwIzyy3_bETqwIblRi_9qQT9iQ,
127
136
  aiecs/utils/token_usage_repository.py,sha256=1xjenLYwC0YT6lKZFEGO4scRCXLuWdec2MWjzih5SZY,10210
128
137
  aiecs/ws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
138
  aiecs/ws/socket_server.py,sha256=j_9idVY_rWlTsF51FgmuhWCWFVt7_gAHL8vNg3IxV5g,1476
130
- aiecs-1.2.0.dist-info/licenses/LICENSE,sha256=_1YRaIS0eZu1pv6xfz245UkU0i1Va2B841hv3OWRwqg,12494
131
- aiecs-1.2.0.dist-info/METADATA,sha256=XhuEwMPhkgzBUrSsh-jgfeqDySzA1cc9OmJSAr3-uAU,16635
132
- aiecs-1.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
133
- aiecs-1.2.0.dist-info/entry_points.txt,sha256=TfLBuwLOfgQqKvnoF1sgTS19-Hgl0aWvCZjIdblIiig,667
134
- aiecs-1.2.0.dist-info/top_level.txt,sha256=22IlUlOqh9Ni3jXlQNMNUqzbW8dcxXPeR_EQ-BJVcV8,6
135
- aiecs-1.2.0.dist-info/RECORD,,
139
+ aiecs-1.2.2.dist-info/licenses/LICENSE,sha256=_1YRaIS0eZu1pv6xfz245UkU0i1Va2B841hv3OWRwqg,12494
140
+ aiecs-1.2.2.dist-info/METADATA,sha256=ibzbDBa2h5RjgtWcUybkj25ex60eXekm92K0tVWCPOs,16635
141
+ aiecs-1.2.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
142
+ aiecs-1.2.2.dist-info/entry_points.txt,sha256=TfLBuwLOfgQqKvnoF1sgTS19-Hgl0aWvCZjIdblIiig,667
143
+ aiecs-1.2.2.dist-info/top_level.txt,sha256=22IlUlOqh9Ni3jXlQNMNUqzbW8dcxXPeR_EQ-BJVcV8,6
144
+ aiecs-1.2.2.dist-info/RECORD,,
File without changes