alibabacloud-agentrun20250910 4.0.1__tar.gz → 4.0.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (17) hide show
  1. {alibabacloud_agentrun20250910-4.0.1 → alibabacloud_agentrun20250910-4.0.3}/ChangeLog.md +7 -0
  2. {alibabacloud_agentrun20250910-4.0.1 → alibabacloud_agentrun20250910-4.0.3}/PKG-INFO +1 -1
  3. alibabacloud_agentrun20250910-4.0.3/alibabacloud_agentrun20250910/__init__.py +1 -0
  4. {alibabacloud_agentrun20250910-4.0.1 → alibabacloud_agentrun20250910-4.0.3}/alibabacloud_agentrun20250910/models.py +178 -8
  5. {alibabacloud_agentrun20250910-4.0.1 → alibabacloud_agentrun20250910-4.0.3}/alibabacloud_agentrun20250910.egg-info/PKG-INFO +1 -1
  6. {alibabacloud_agentrun20250910-4.0.1 → alibabacloud_agentrun20250910-4.0.3}/setup.py +1 -1
  7. alibabacloud_agentrun20250910-4.0.1/alibabacloud_agentrun20250910/__init__.py +0 -1
  8. {alibabacloud_agentrun20250910-4.0.1 → alibabacloud_agentrun20250910-4.0.3}/LICENSE +0 -0
  9. {alibabacloud_agentrun20250910-4.0.1 → alibabacloud_agentrun20250910-4.0.3}/MANIFEST.in +0 -0
  10. {alibabacloud_agentrun20250910-4.0.1 → alibabacloud_agentrun20250910-4.0.3}/README-CN.md +0 -0
  11. {alibabacloud_agentrun20250910-4.0.1 → alibabacloud_agentrun20250910-4.0.3}/README.md +0 -0
  12. {alibabacloud_agentrun20250910-4.0.1 → alibabacloud_agentrun20250910-4.0.3}/alibabacloud_agentrun20250910/client.py +0 -0
  13. {alibabacloud_agentrun20250910-4.0.1 → alibabacloud_agentrun20250910-4.0.3}/alibabacloud_agentrun20250910.egg-info/SOURCES.txt +0 -0
  14. {alibabacloud_agentrun20250910-4.0.1 → alibabacloud_agentrun20250910-4.0.3}/alibabacloud_agentrun20250910.egg-info/dependency_links.txt +0 -0
  15. {alibabacloud_agentrun20250910-4.0.1 → alibabacloud_agentrun20250910-4.0.3}/alibabacloud_agentrun20250910.egg-info/requires.txt +0 -0
  16. {alibabacloud_agentrun20250910-4.0.1 → alibabacloud_agentrun20250910-4.0.3}/alibabacloud_agentrun20250910.egg-info/top_level.txt +0 -0
  17. {alibabacloud_agentrun20250910-4.0.1 → alibabacloud_agentrun20250910-4.0.3}/setup.cfg +0 -0
@@ -1,3 +1,10 @@
1
+ 2025-12-09 Version: 4.0.2
2
+ - Generated python 2025-09-10 for AgentRun.
3
+
4
+ 2025-11-27 Version: 4.0.1
5
+ - Update API ListAgentRuntimes: add request parameters status.
6
+
7
+
1
8
  2025-11-24 Version: 4.0.0
2
9
  - Support API DeleteSandbox.
3
10
  - Update API ListTemplates: add request parameters status.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: alibabacloud_agentrun20250910
3
- Version: 4.0.1
3
+ Version: 4.0.3
4
4
  Summary: Alibaba Cloud AgentRun (20250910) SDK Library for Python
5
5
  Home-page: https://github.com/aliyun/alibabacloud-python-sdk
6
6
  Author: Alibaba Cloud SDK
@@ -68,12 +68,18 @@ class CodeConfiguration(TeaModel):
68
68
  class ContainerConfiguration(TeaModel):
69
69
  def __init__(
70
70
  self,
71
+ acr_instance_id: str = None,
71
72
  command: List[str] = None,
72
73
  image: str = None,
74
+ image_registry_type: str = None,
73
75
  ):
76
+ # 阿里云容器镜像服务(ACR)的实例ID或名称
77
+ self.acr_instance_id = acr_instance_id
74
78
  # 在容器中运行的命令(例如:[\"python3\", \"app.py\"])
75
79
  self.command = command
76
80
  self.image = image
81
+ # 容器镜像的来源类型,支持ACR(阿里云容器镜像服务)、ACREE(阿里云容器镜像服务企业版)、CUSTOM(自定义镜像仓库)
82
+ self.image_registry_type = image_registry_type
77
83
 
78
84
  def validate(self):
79
85
  pass
@@ -84,18 +90,26 @@ class ContainerConfiguration(TeaModel):
84
90
  return _map
85
91
 
86
92
  result = dict()
93
+ if self.acr_instance_id is not None:
94
+ result['acrInstanceId'] = self.acr_instance_id
87
95
  if self.command is not None:
88
96
  result['command'] = self.command
89
97
  if self.image is not None:
90
98
  result['image'] = self.image
99
+ if self.image_registry_type is not None:
100
+ result['imageRegistryType'] = self.image_registry_type
91
101
  return result
92
102
 
93
103
  def from_map(self, m: dict = None):
94
104
  m = m or dict()
105
+ if m.get('acrInstanceId') is not None:
106
+ self.acr_instance_id = m.get('acrInstanceId')
95
107
  if m.get('command') is not None:
96
108
  self.command = m.get('command')
97
109
  if m.get('image') is not None:
98
110
  self.image = m.get('image')
111
+ if m.get('imageRegistryType') is not None:
112
+ self.image_registry_type = m.get('imageRegistryType')
99
113
  return self
100
114
 
101
115
 
@@ -3558,6 +3572,81 @@ class ProxyConfigEndpoints(TeaModel):
3558
3572
  return self
3559
3573
 
3560
3574
 
3575
+ class ProxyConfigPoliciesAiGuardrailConfig(TeaModel):
3576
+ def __init__(
3577
+ self,
3578
+ block_on_content_moderation: bool = None,
3579
+ block_on_malicious_url: bool = None,
3580
+ block_on_model_hallucination: bool = None,
3581
+ block_on_prompt_attack: bool = None,
3582
+ block_on_sensitive_data: bool = None,
3583
+ check_request: bool = None,
3584
+ check_response: bool = None,
3585
+ level: str = None,
3586
+ max_text_length: int = None,
3587
+ ):
3588
+ self.block_on_content_moderation = block_on_content_moderation
3589
+ self.block_on_malicious_url = block_on_malicious_url
3590
+ self.block_on_model_hallucination = block_on_model_hallucination
3591
+ self.block_on_prompt_attack = block_on_prompt_attack
3592
+ self.block_on_sensitive_data = block_on_sensitive_data
3593
+ self.check_request = check_request
3594
+ self.check_response = check_response
3595
+ self.level = level
3596
+ self.max_text_length = max_text_length
3597
+
3598
+ def validate(self):
3599
+ pass
3600
+
3601
+ def to_map(self):
3602
+ _map = super().to_map()
3603
+ if _map is not None:
3604
+ return _map
3605
+
3606
+ result = dict()
3607
+ if self.block_on_content_moderation is not None:
3608
+ result['blockOnContentModeration'] = self.block_on_content_moderation
3609
+ if self.block_on_malicious_url is not None:
3610
+ result['blockOnMaliciousUrl'] = self.block_on_malicious_url
3611
+ if self.block_on_model_hallucination is not None:
3612
+ result['blockOnModelHallucination'] = self.block_on_model_hallucination
3613
+ if self.block_on_prompt_attack is not None:
3614
+ result['blockOnPromptAttack'] = self.block_on_prompt_attack
3615
+ if self.block_on_sensitive_data is not None:
3616
+ result['blockOnSensitiveData'] = self.block_on_sensitive_data
3617
+ if self.check_request is not None:
3618
+ result['checkRequest'] = self.check_request
3619
+ if self.check_response is not None:
3620
+ result['checkResponse'] = self.check_response
3621
+ if self.level is not None:
3622
+ result['level'] = self.level
3623
+ if self.max_text_length is not None:
3624
+ result['maxTextLength'] = self.max_text_length
3625
+ return result
3626
+
3627
+ def from_map(self, m: dict = None):
3628
+ m = m or dict()
3629
+ if m.get('blockOnContentModeration') is not None:
3630
+ self.block_on_content_moderation = m.get('blockOnContentModeration')
3631
+ if m.get('blockOnMaliciousUrl') is not None:
3632
+ self.block_on_malicious_url = m.get('blockOnMaliciousUrl')
3633
+ if m.get('blockOnModelHallucination') is not None:
3634
+ self.block_on_model_hallucination = m.get('blockOnModelHallucination')
3635
+ if m.get('blockOnPromptAttack') is not None:
3636
+ self.block_on_prompt_attack = m.get('blockOnPromptAttack')
3637
+ if m.get('blockOnSensitiveData') is not None:
3638
+ self.block_on_sensitive_data = m.get('blockOnSensitiveData')
3639
+ if m.get('checkRequest') is not None:
3640
+ self.check_request = m.get('checkRequest')
3641
+ if m.get('checkResponse') is not None:
3642
+ self.check_response = m.get('checkResponse')
3643
+ if m.get('level') is not None:
3644
+ self.level = m.get('level')
3645
+ if m.get('maxTextLength') is not None:
3646
+ self.max_text_length = m.get('maxTextLength')
3647
+ return self
3648
+
3649
+
3561
3650
  class ProxyConfigPoliciesFallbacks(TeaModel):
3562
3651
  def __init__(
3563
3652
  self,
@@ -3591,26 +3680,79 @@ class ProxyConfigPoliciesFallbacks(TeaModel):
3591
3680
  return self
3592
3681
 
3593
3682
 
3683
+ class ProxyConfigPoliciesTokenRateLimiter(TeaModel):
3684
+ def __init__(
3685
+ self,
3686
+ tpd: int = None,
3687
+ tph: int = None,
3688
+ tpm: int = None,
3689
+ tps: int = None,
3690
+ ):
3691
+ self.tpd = tpd
3692
+ self.tph = tph
3693
+ self.tpm = tpm
3694
+ self.tps = tps
3695
+
3696
+ def validate(self):
3697
+ pass
3698
+
3699
+ def to_map(self):
3700
+ _map = super().to_map()
3701
+ if _map is not None:
3702
+ return _map
3703
+
3704
+ result = dict()
3705
+ if self.tpd is not None:
3706
+ result['tpd'] = self.tpd
3707
+ if self.tph is not None:
3708
+ result['tph'] = self.tph
3709
+ if self.tpm is not None:
3710
+ result['tpm'] = self.tpm
3711
+ if self.tps is not None:
3712
+ result['tps'] = self.tps
3713
+ return result
3714
+
3715
+ def from_map(self, m: dict = None):
3716
+ m = m or dict()
3717
+ if m.get('tpd') is not None:
3718
+ self.tpd = m.get('tpd')
3719
+ if m.get('tph') is not None:
3720
+ self.tph = m.get('tph')
3721
+ if m.get('tpm') is not None:
3722
+ self.tpm = m.get('tpm')
3723
+ if m.get('tps') is not None:
3724
+ self.tps = m.get('tps')
3725
+ return self
3726
+
3727
+
3594
3728
  class ProxyConfigPolicies(TeaModel):
3595
3729
  def __init__(
3596
3730
  self,
3731
+ ai_guardrail_config: ProxyConfigPoliciesAiGuardrailConfig = None,
3597
3732
  cache: bool = None,
3598
3733
  concurrency_limit: int = None,
3599
3734
  fallbacks: List[ProxyConfigPoliciesFallbacks] = None,
3600
3735
  num_retries: int = None,
3601
3736
  request_timeout: int = None,
3737
+ token_rate_limiter: ProxyConfigPoliciesTokenRateLimiter = None,
3602
3738
  ):
3739
+ self.ai_guardrail_config = ai_guardrail_config
3603
3740
  self.cache = cache
3604
3741
  self.concurrency_limit = concurrency_limit
3605
3742
  self.fallbacks = fallbacks
3606
3743
  self.num_retries = num_retries
3607
3744
  self.request_timeout = request_timeout
3745
+ self.token_rate_limiter = token_rate_limiter
3608
3746
 
3609
3747
  def validate(self):
3748
+ if self.ai_guardrail_config:
3749
+ self.ai_guardrail_config.validate()
3610
3750
  if self.fallbacks:
3611
3751
  for k in self.fallbacks:
3612
3752
  if k:
3613
3753
  k.validate()
3754
+ if self.token_rate_limiter:
3755
+ self.token_rate_limiter.validate()
3614
3756
 
3615
3757
  def to_map(self):
3616
3758
  _map = super().to_map()
@@ -3618,6 +3760,8 @@ class ProxyConfigPolicies(TeaModel):
3618
3760
  return _map
3619
3761
 
3620
3762
  result = dict()
3763
+ if self.ai_guardrail_config is not None:
3764
+ result['aiGuardrailConfig'] = self.ai_guardrail_config.to_map()
3621
3765
  if self.cache is not None:
3622
3766
  result['cache'] = self.cache
3623
3767
  if self.concurrency_limit is not None:
@@ -3630,10 +3774,15 @@ class ProxyConfigPolicies(TeaModel):
3630
3774
  result['numRetries'] = self.num_retries
3631
3775
  if self.request_timeout is not None:
3632
3776
  result['requestTimeout'] = self.request_timeout
3777
+ if self.token_rate_limiter is not None:
3778
+ result['tokenRateLimiter'] = self.token_rate_limiter.to_map()
3633
3779
  return result
3634
3780
 
3635
3781
  def from_map(self, m: dict = None):
3636
3782
  m = m or dict()
3783
+ if m.get('aiGuardrailConfig') is not None:
3784
+ temp_model = ProxyConfigPoliciesAiGuardrailConfig()
3785
+ self.ai_guardrail_config = temp_model.from_map(m['aiGuardrailConfig'])
3637
3786
  if m.get('cache') is not None:
3638
3787
  self.cache = m.get('cache')
3639
3788
  if m.get('concurrencyLimit') is not None:
@@ -3647,6 +3796,9 @@ class ProxyConfigPolicies(TeaModel):
3647
3796
  self.num_retries = m.get('numRetries')
3648
3797
  if m.get('requestTimeout') is not None:
3649
3798
  self.request_timeout = m.get('requestTimeout')
3799
+ if m.get('tokenRateLimiter') is not None:
3800
+ temp_model = ProxyConfigPoliciesTokenRateLimiter()
3801
+ self.token_rate_limiter = temp_model.from_map(m['tokenRateLimiter'])
3650
3802
  return self
3651
3803
 
3652
3804
 
@@ -3701,6 +3853,7 @@ class CreateModelProxyInput(TeaModel):
3701
3853
  cpu: float = None,
3702
3854
  credential_name: str = None,
3703
3855
  description: str = None,
3856
+ execution_role_arn: str = None,
3704
3857
  litellm_version: str = None,
3705
3858
  log_configuration: LogConfiguration = None,
3706
3859
  memory: int = None,
@@ -3716,6 +3869,7 @@ class CreateModelProxyInput(TeaModel):
3716
3869
  self.cpu = cpu
3717
3870
  self.credential_name = credential_name
3718
3871
  self.description = description
3872
+ self.execution_role_arn = execution_role_arn
3719
3873
  self.litellm_version = litellm_version
3720
3874
  self.log_configuration = log_configuration
3721
3875
  # This parameter is required.
@@ -3754,6 +3908,8 @@ class CreateModelProxyInput(TeaModel):
3754
3908
  result['credentialName'] = self.credential_name
3755
3909
  if self.description is not None:
3756
3910
  result['description'] = self.description
3911
+ if self.execution_role_arn is not None:
3912
+ result['executionRoleArn'] = self.execution_role_arn
3757
3913
  if self.litellm_version is not None:
3758
3914
  result['litellmVersion'] = self.litellm_version
3759
3915
  if self.log_configuration is not None:
@@ -3785,6 +3941,8 @@ class CreateModelProxyInput(TeaModel):
3785
3941
  self.credential_name = m.get('credentialName')
3786
3942
  if m.get('description') is not None:
3787
3943
  self.description = m.get('description')
3944
+ if m.get('executionRoleArn') is not None:
3945
+ self.execution_role_arn = m.get('executionRoleArn')
3788
3946
  if m.get('litellmVersion') is not None:
3789
3947
  self.litellm_version = m.get('litellmVersion')
3790
3948
  if m.get('logConfiguration') is not None:
@@ -4988,6 +5146,7 @@ class ModelProxy(TeaModel):
4988
5146
  credential_name: str = None,
4989
5147
  description: str = None,
4990
5148
  endpoint: str = None,
5149
+ execution_role_arn: str = None,
4991
5150
  function_name: str = None,
4992
5151
  last_updated_at: str = None,
4993
5152
  litellm_version: str = None,
@@ -5008,6 +5167,7 @@ class ModelProxy(TeaModel):
5008
5167
  self.credential_name = credential_name
5009
5168
  self.description = description
5010
5169
  self.endpoint = endpoint
5170
+ self.execution_role_arn = execution_role_arn
5011
5171
  self.function_name = function_name
5012
5172
  self.last_updated_at = last_updated_at
5013
5173
  self.litellm_version = litellm_version
@@ -5047,6 +5207,8 @@ class ModelProxy(TeaModel):
5047
5207
  result['description'] = self.description
5048
5208
  if self.endpoint is not None:
5049
5209
  result['endpoint'] = self.endpoint
5210
+ if self.execution_role_arn is not None:
5211
+ result['executionRoleArn'] = self.execution_role_arn
5050
5212
  if self.function_name is not None:
5051
5213
  result['functionName'] = self.function_name
5052
5214
  if self.last_updated_at is not None:
@@ -5089,6 +5251,8 @@ class ModelProxy(TeaModel):
5089
5251
  self.description = m.get('description')
5090
5252
  if m.get('endpoint') is not None:
5091
5253
  self.endpoint = m.get('endpoint')
5254
+ if m.get('executionRoleArn') is not None:
5255
+ self.execution_role_arn = m.get('executionRoleArn')
5092
5256
  if m.get('functionName') is not None:
5093
5257
  self.function_name = m.get('functionName')
5094
5258
  if m.get('lastUpdatedAt') is not None:
@@ -5171,8 +5335,8 @@ class ModelService(TeaModel):
5171
5335
  credential_name: str = None,
5172
5336
  description: str = None,
5173
5337
  last_updated_at: str = None,
5174
- mode_service_id: str = None,
5175
5338
  model_info_configs: List[ModelInfoConfig] = None,
5339
+ model_service_id: str = None,
5176
5340
  model_service_name: str = None,
5177
5341
  model_type: str = None,
5178
5342
  network_configuration: NetworkConfiguration = None,
@@ -5185,8 +5349,8 @@ class ModelService(TeaModel):
5185
5349
  self.credential_name = credential_name
5186
5350
  self.description = description
5187
5351
  self.last_updated_at = last_updated_at
5188
- self.mode_service_id = mode_service_id
5189
5352
  self.model_info_configs = model_info_configs
5353
+ self.model_service_id = model_service_id
5190
5354
  self.model_service_name = model_service_name
5191
5355
  self.model_type = model_type
5192
5356
  self.network_configuration = network_configuration
@@ -5219,12 +5383,12 @@ class ModelService(TeaModel):
5219
5383
  result['description'] = self.description
5220
5384
  if self.last_updated_at is not None:
5221
5385
  result['lastUpdatedAt'] = self.last_updated_at
5222
- if self.mode_service_id is not None:
5223
- result['modeServiceId'] = self.mode_service_id
5224
5386
  result['modelInfoConfigs'] = []
5225
5387
  if self.model_info_configs is not None:
5226
5388
  for k in self.model_info_configs:
5227
5389
  result['modelInfoConfigs'].append(k.to_map() if k else None)
5390
+ if self.model_service_id is not None:
5391
+ result['modelServiceId'] = self.model_service_id
5228
5392
  if self.model_service_name is not None:
5229
5393
  result['modelServiceName'] = self.model_service_name
5230
5394
  if self.model_type is not None:
@@ -5251,13 +5415,13 @@ class ModelService(TeaModel):
5251
5415
  self.description = m.get('description')
5252
5416
  if m.get('lastUpdatedAt') is not None:
5253
5417
  self.last_updated_at = m.get('lastUpdatedAt')
5254
- if m.get('modeServiceId') is not None:
5255
- self.mode_service_id = m.get('modeServiceId')
5256
5418
  self.model_info_configs = []
5257
5419
  if m.get('modelInfoConfigs') is not None:
5258
5420
  for k in m.get('modelInfoConfigs'):
5259
5421
  temp_model = ModelInfoConfig()
5260
5422
  self.model_info_configs.append(temp_model.from_map(k))
5423
+ if m.get('modelServiceId') is not None:
5424
+ self.model_service_id = m.get('modelServiceId')
5261
5425
  if m.get('modelServiceName') is not None:
5262
5426
  self.model_service_name = m.get('modelServiceName')
5263
5427
  if m.get('modelType') is not None:
@@ -5537,7 +5701,7 @@ class Template(TeaModel):
5537
5701
  credential_configuration: CredentialConfiguration = None,
5538
5702
  description: str = None,
5539
5703
  disk_size: int = None,
5540
- environment_variables: str = None,
5704
+ environment_variables: Dict[str, str] = None,
5541
5705
  execution_role_arn: str = None,
5542
5706
  last_updated_at: str = None,
5543
5707
  log_configuration: LogConfiguration = None,
@@ -5552,7 +5716,7 @@ class Template(TeaModel):
5552
5716
  status: str = None,
5553
5717
  status_reason: str = None,
5554
5718
  template_arn: str = None,
5555
- template_configuration: str = None,
5719
+ template_configuration: Dict[str, Any] = None,
5556
5720
  template_id: str = None,
5557
5721
  template_name: str = None,
5558
5722
  template_type: str = None,
@@ -9569,6 +9733,7 @@ class UpdateModelProxyInput(TeaModel):
9569
9733
  arms_configuration: ArmsConfiguration = None,
9570
9734
  credential_name: str = None,
9571
9735
  description: str = None,
9736
+ execution_role_arn: str = None,
9572
9737
  log_configuration: LogConfiguration = None,
9573
9738
  network_configuration: NetworkConfiguration = None,
9574
9739
  proxy_config: ProxyConfig = None,
@@ -9576,6 +9741,7 @@ class UpdateModelProxyInput(TeaModel):
9576
9741
  self.arms_configuration = arms_configuration
9577
9742
  self.credential_name = credential_name
9578
9743
  self.description = description
9744
+ self.execution_role_arn = execution_role_arn
9579
9745
  self.log_configuration = log_configuration
9580
9746
  self.network_configuration = network_configuration
9581
9747
  self.proxy_config = proxy_config
@@ -9602,6 +9768,8 @@ class UpdateModelProxyInput(TeaModel):
9602
9768
  result['credentialName'] = self.credential_name
9603
9769
  if self.description is not None:
9604
9770
  result['description'] = self.description
9771
+ if self.execution_role_arn is not None:
9772
+ result['executionRoleArn'] = self.execution_role_arn
9605
9773
  if self.log_configuration is not None:
9606
9774
  result['logConfiguration'] = self.log_configuration.to_map()
9607
9775
  if self.network_configuration is not None:
@@ -9619,6 +9787,8 @@ class UpdateModelProxyInput(TeaModel):
9619
9787
  self.credential_name = m.get('credentialName')
9620
9788
  if m.get('description') is not None:
9621
9789
  self.description = m.get('description')
9790
+ if m.get('executionRoleArn') is not None:
9791
+ self.execution_role_arn = m.get('executionRoleArn')
9622
9792
  if m.get('logConfiguration') is not None:
9623
9793
  temp_model = LogConfiguration()
9624
9794
  self.log_configuration = temp_model.from_map(m['logConfiguration'])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: alibabacloud-agentrun20250910
3
- Version: 4.0.1
3
+ Version: 4.0.3
4
4
  Summary: Alibaba Cloud AgentRun (20250910) SDK Library for Python
5
5
  Home-page: https://github.com/aliyun/alibabacloud-python-sdk
6
6
  Author: Alibaba Cloud SDK
@@ -24,7 +24,7 @@ from setuptools import setup, find_packages
24
24
  """
25
25
  setup module for alibabacloud_agentrun20250910.
26
26
 
27
- Created on 27/11/2025
27
+ Created on 17/12/2025
28
28
 
29
29
  @author: Alibaba Cloud SDK
30
30
  """
@@ -1 +0,0 @@
1
- __version__ = '4.0.1'