enkryptai-sdk 1.0.16__py3-none-any.whl → 1.0.18__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.
@@ -0,0 +1,64 @@
1
+ # To avoid circular imports
2
+ from enum import Enum
3
+ from .base import BaseDTO
4
+ from typing import Dict, List, Optional, Any
5
+ from dataclasses import dataclass, field, asdict
6
+
7
+
8
+ class ModelAuthTypeEnum(str, Enum):
9
+ APIKEY = "apikey"
10
+ JWT = "jwt"
11
+
12
+
13
+ class ModelJwtMethodEnum(str, Enum):
14
+ POST = "POST"
15
+ GET = "GET"
16
+
17
+
18
+ @dataclass
19
+ class CustomHeader(BaseDTO):
20
+ key: str
21
+ value: str
22
+
23
+ @classmethod
24
+ def from_dict(cls, data: Dict[str, Any]) -> "CustomHeader":
25
+ return cls(
26
+ key=data.get("key", ""),
27
+ value=data.get("value", "")
28
+ )
29
+
30
+ def to_dict(self) -> Dict[str, Any]:
31
+ return {
32
+ "key": self.key,
33
+ "value": self.value
34
+ }
35
+
36
+
37
+ @dataclass
38
+ class ModelJwtConfig(BaseDTO):
39
+ jwt_method: ModelJwtMethodEnum = ModelJwtMethodEnum.POST
40
+ jwt_url: str = ""
41
+ jwt_headers: List[CustomHeader] = field(default_factory=list)
42
+ jwt_body: str = ""
43
+ jwt_response_key: str = ""
44
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
45
+
46
+ @classmethod
47
+ def from_dict(cls, data: Dict[str, Any]) -> "ModelJwtConfig":
48
+ return cls(
49
+ jwt_method=ModelJwtMethodEnum(data.get("jwt_method", ModelJwtMethodEnum.POST)),
50
+ jwt_url=data.get("jwt_url", ""),
51
+ jwt_headers=[CustomHeader.from_dict(header) for header in data.get("jwt_headers", [])],
52
+ jwt_body=data.get("jwt_body", ""),
53
+ jwt_response_key=data.get("jwt_response_key", ""),
54
+ )
55
+
56
+ def to_dict(self) -> Dict[str, Any]:
57
+ return {
58
+ "jwt_method": self.jwt_method.value,
59
+ "jwt_url": self.jwt_url,
60
+ "jwt_headers": [header.to_dict() for header in self.jwt_headers],
61
+ "jwt_body": self.jwt_body,
62
+ "jwt_response_key": self.jwt_response_key,
63
+ }
64
+
@@ -5,6 +5,7 @@ from .base import BaseDTO
5
5
  from tabulate import tabulate
6
6
  from dataclasses import dataclass, field, asdict
7
7
  from typing import Optional, List, Set, Dict, Any
8
+ from .common import ModelAuthTypeEnum, CustomHeader, ModelJwtConfig
8
9
 
9
10
 
10
11
  # class Modality(Enum):
@@ -126,25 +127,6 @@ class OutputModality(str, Enum):
126
127
  # code = "code"
127
128
 
128
129
 
129
- @dataclass
130
- class CustomHeader(BaseDTO):
131
- key: str
132
- value: str
133
-
134
- @classmethod
135
- def from_dict(cls, data: Dict[str, Any]) -> "CustomHeader":
136
- return cls(
137
- key=data.get("key", ""),
138
- value=data.get("value", "")
139
- )
140
-
141
- def to_dict(self) -> Dict[str, Any]:
142
- return {
143
- "key": self.key,
144
- "value": self.value
145
- }
146
-
147
-
148
130
  @dataclass
149
131
  class ModelConfigDetails(BaseDTO):
150
132
  model_id: str = None
@@ -166,6 +148,8 @@ class ModelConfigDetails(BaseDTO):
166
148
  apikey: Optional[str] = None
167
149
  paths: Optional[PathsConfig] = None
168
150
  tools: List[Dict[str, str]] = field(default_factory=list)
151
+ model_auth_type: Optional[ModelAuthTypeEnum] = ModelAuthTypeEnum.APIKEY
152
+ model_jwt_config: Optional[ModelJwtConfig] = None
169
153
  auth_data: AuthData = field(default_factory=AuthData)
170
154
  input_modalities: List[InputModality] = field(default_factory=list)
171
155
  output_modalities: List[OutputModality] = field(default_factory=list)
@@ -186,6 +170,12 @@ class ModelConfigDetails(BaseDTO):
186
170
  if "custom_headers" in data:
187
171
  data["custom_headers"] = [CustomHeader.from_dict(h) for h in data["custom_headers"]]
188
172
 
173
+ if "model_auth_type" in data:
174
+ data["model_auth_type"] = ModelAuthTypeEnum(data["model_auth_type"])
175
+
176
+ if "model_jwt_config" in data:
177
+ data["model_jwt_config"] = ModelJwtConfig.from_dict(data["model_jwt_config"])
178
+
189
179
  # Convert input_modalities strings to enum values
190
180
  if "input_modalities" in data:
191
181
  data["input_modalities"] = [InputModality(m) for m in data["input_modalities"]]
@@ -251,6 +241,9 @@ class ModelConfigDetails(BaseDTO):
251
241
 
252
242
  def to_dict(self):
253
243
  d = super().to_dict()
244
+ d["model_auth_type"] = self.model_auth_type.value
245
+ if self.model_jwt_config:
246
+ d["model_jwt_config"] = self.model_jwt_config.to_dict()
254
247
  # Handle AuthData specifically
255
248
  d["auth_data"] = self.auth_data.to_dict()
256
249
  # Handle CustomHeader list
@@ -3,9 +3,11 @@ from enum import Enum
3
3
  from .base import BaseDTO
4
4
  from typing import Dict, List, Optional, Any
5
5
  from dataclasses import dataclass, field, asdict
6
+
6
7
  from .datasets import DatasetConfig
7
8
  from .models import ModelConfig
8
9
  from .guardrails import GuardrailDetectors
10
+ from .common import ModelAuthTypeEnum, CustomHeader, ModelJwtConfig
9
11
 
10
12
  # The risk mitigation do not support all detectors, so we need to create a separate enum for them.
11
13
  class RiskGuardrailDetectorsEnum(str, Enum):
@@ -95,6 +97,7 @@ class RedTeamTaskDetails(BaseDTO):
95
97
 
96
98
  @classmethod
97
99
  def from_dict(cls, data: Dict) -> "RedTeamTaskDetails":
100
+ # print(f"RedTeamTaskDetails data: {data}")
98
101
  return cls(
99
102
  created_at=data.get("created_at"),
100
103
  model_saved_name=data.get("model_saved_name"),
@@ -368,8 +371,21 @@ class RedTeamTestConfigurations(BaseDTO):
368
371
  # Advanced tests
369
372
  adv_info_test: TestConfig = field(default=None)
370
373
  adv_bias_test: TestConfig = field(default=None)
374
+ adv_tool_test: TestConfig = field(default=None)
371
375
  adv_command_test: TestConfig = field(default=None)
376
+ adv_pii_test: TestConfig = field(default=None)
377
+ adv_competitor_test: TestConfig = field(default=None)
378
+ # Custom tests
372
379
  custom_test: TestConfig = field(default=None)
380
+ # Agents tests
381
+ alignment_and_governance_test: TestConfig = field(default=None)
382
+ input_and_content_integrity_test: TestConfig = field(default=None)
383
+ infrastructure_and_integration_test: TestConfig = field(default=None)
384
+ security_and_privacy_test: TestConfig = field(default=None)
385
+ human_factors_and_societal_impact_test: TestConfig = field(default=None)
386
+ access_control_test: TestConfig = field(default=None)
387
+ physical_and_actuation_safety_test: TestConfig = field(default=None)
388
+ reliability_and_monitoring_test: TestConfig = field(default=None)
373
389
  _extra_fields: Dict[str, Any] = field(default_factory=dict)
374
390
 
375
391
  @classmethod
@@ -391,25 +407,6 @@ class OutputModality(str, Enum):
391
407
  # audio = "audio"
392
408
  # video = "video"
393
409
  # code = "code"
394
-
395
-
396
- @dataclass
397
- class CustomHeader(BaseDTO):
398
- key: str
399
- value: str
400
-
401
- @classmethod
402
- def from_dict(cls, data: Dict[str, Any]) -> "CustomHeader":
403
- return cls(
404
- key=data.get("key", ""),
405
- value=data.get("value", "")
406
- )
407
-
408
- def to_dict(self) -> Dict[str, Any]:
409
- return {
410
- "key": self.key,
411
- "value": self.value
412
- }
413
410
 
414
411
 
415
412
  @dataclass
@@ -422,6 +419,8 @@ class TargetModelConfiguration(BaseDTO):
422
419
  rate_per_min: int = 20
423
420
  model_name: Optional[str] = "gpt-4o-mini"
424
421
  model_version: Optional[str] = None
422
+ model_auth_type: Optional[ModelAuthTypeEnum] = ModelAuthTypeEnum.APIKEY
423
+ model_jwt_config: Optional[ModelJwtConfig] = None
425
424
  model_api_key: Optional[str] = None
426
425
  input_modalities: List[InputModality] = field(default_factory=list)
427
426
  output_modalities: List[OutputModality] = field(default_factory=list)
@@ -437,10 +436,17 @@ class TargetModelConfiguration(BaseDTO):
437
436
  data = data.copy()
438
437
  if "custom_headers" in data:
439
438
  data["custom_headers"] = [CustomHeader.from_dict(header) for header in data["custom_headers"]]
439
+ if "model_auth_type" in data:
440
+ data["model_auth_type"] = ModelAuthTypeEnum(data["model_auth_type"])
441
+ if "model_jwt_config" in data:
442
+ data["model_jwt_config"] = ModelJwtConfig.from_dict(data["model_jwt_config"])
440
443
  return cls(**data)
441
444
 
442
445
  def to_dict(self) -> dict:
443
446
  d = asdict(self)
447
+ d["model_auth_type"] = self.model_auth_type.value
448
+ if self.model_jwt_config:
449
+ d["model_jwt_config"] = self.model_jwt_config.to_dict()
444
450
  d["custom_headers"] = [header.to_dict() for header in self.custom_headers]
445
451
  return d
446
452
 
enkryptai_sdk/models.py CHANGED
@@ -80,6 +80,8 @@ class ModelClient(BaseClient):
80
80
  "header_prefix": config.model_config.auth_data.header_prefix,
81
81
  "space_after_prefix": config.model_config.auth_data.space_after_prefix,
82
82
  },
83
+ "model_auth_type": config.model_config.model_auth_type,
84
+ "model_jwt_config": config.model_config.model_jwt_config,
83
85
  "apikeys": [config.model_config.apikey] if config.model_config.apikey else [],
84
86
  "tools": config.model_config.tools,
85
87
  "input_modalities": [m.value if hasattr(m, 'value') else m for m in config.model_config.input_modalities],
enkryptai_sdk/red_team.py CHANGED
@@ -367,6 +367,7 @@ class RedTeamClient(BaseClient):
367
367
  response = self._request("GET", "/redteam/get-task", headers=headers)
368
368
  if response.get("error"):
369
369
  raise RedTeamClientError(f"API Error: {str(response)}")
370
+ # print(f"RedTeamTaskDetails response: {response}")
370
371
  return RedTeamTaskDetails.from_dict(response["data"])
371
372
 
372
373
  def get_result_summary(self, task_id: str = None, test_name: str = None):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: enkryptai-sdk
3
- Version: 1.0.16
3
+ Version: 1.0.18
4
4
  Summary: A Python SDK with guardrails and red teaming functionality for API interactions
5
5
  Home-page: https://github.com/enkryptai/enkryptai-sdk
6
6
  Author: Enkrypt AI Team
@@ -8,20 +8,21 @@ enkryptai_sdk/deployments.py,sha256=A7XZ2JwrMod9V4_aV8bFY_Soh9E3jHdwaTuJ9BwXuyk,
8
8
  enkryptai_sdk/evals.py,sha256=BywyEgIT7xdJ58svO_sDNOMVowdB0RTGoAZPEbCnDVo,2595
9
9
  enkryptai_sdk/guardrails.py,sha256=NluimOA0gM9N3S_q47LTUeG97t9PlYqPHlZahDPkJvI,16365
10
10
  enkryptai_sdk/guardrails_old.py,sha256=SgzPZkTzbAPD9XfmYNG6M1-TrzbhDHpAkI3FjnVWS_s,6434
11
- enkryptai_sdk/models.py,sha256=OfADGvP2gy52_fXT5iAj81Q07iDGAEYWiKYLD_ycozU,8786
12
- enkryptai_sdk/red_team.py,sha256=cjN4LODbpYiECcoL0JROMcCPCzm3Ib6kXi7kQspP4hQ,19869
11
+ enkryptai_sdk/models.py,sha256=0R0I4KOq0aDNi5utabANot-E8dT9GqiSsgrcI9RULHM,8932
12
+ enkryptai_sdk/red_team.py,sha256=7bWNognd6TCzNQDocml-C_f6u5z1MeursSe3Rtz16Sw,19929
13
13
  enkryptai_sdk/response.py,sha256=43JRubzgGCpoVxYNzBZY0AlUgLbfcXD_AwD7wU3qY9o,4086
14
14
  enkryptai_sdk/dto/__init__.py,sha256=wHgIv_OCnVMJOys-vqImF59ifogDrMcgxVRmfNayVvc,2761
15
15
  enkryptai_sdk/dto/ai_proxy.py,sha256=clwMN4xdH8Zr55dnhilHbs-qaHRlCOrLPrij0Zd1Av0,11283
16
16
  enkryptai_sdk/dto/base.py,sha256=y77kQL1X7389ifSVNc0E7CUFNxACh5AM3ml9YPon1KY,2822
17
17
  enkryptai_sdk/dto/coc.py,sha256=Lp2aat_24J4KuUg4BeJl9S39tEak8Bw15eJ4cQDrRQk,4749
18
+ enkryptai_sdk/dto/common.py,sha256=lrWMu4FKUGCN2dbS9fT4yNtfiPm1cNN16J4eCe4_tBM,1812
18
19
  enkryptai_sdk/dto/datasets.py,sha256=RFA9CmbhD-QDDyweBq_k9iBd00b6I6SWmdP9DPNd9fc,5002
19
20
  enkryptai_sdk/dto/deployments.py,sha256=Aw4b8tDA3FYIomqDvCjblCXTagL4bT8Fx91X0SFXs40,11216
20
21
  enkryptai_sdk/dto/guardrails.py,sha256=oJQqFhsdQd_yPU187AhKse-Y4xktgmVNwwKKkzFazbg,50167
21
- enkryptai_sdk/dto/models.py,sha256=SDzNMwxDVIp2D1qO29ere8WgqC5n_bJuitesaoxitZo,14312
22
- enkryptai_sdk/dto/red_team.py,sha256=EHwDbDM0mMLDyGB_kN4KEOO65ng9Bn51q9O3IdwO5Ng,24766
23
- enkryptai_sdk-1.0.16.dist-info/licenses/LICENSE,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- enkryptai_sdk-1.0.16.dist-info/METADATA,sha256=T7ws5lOF-ynN_Z3cegMX0Ysotjp2_n7pet8Ci-ULFmI,72860
25
- enkryptai_sdk-1.0.16.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
26
- enkryptai_sdk-1.0.16.dist-info/top_level.txt,sha256=s2X9UJJwvJamNmr6ZXWyyQe60sXtQGWFuaBYfhgHI_4,14
27
- enkryptai_sdk-1.0.16.dist-info/RECORD,,
22
+ enkryptai_sdk/dto/models.py,sha256=4aeI9-iHPhSX5duRMTQRbkXhplAhN8OHw3gWdTxrafU,14531
23
+ enkryptai_sdk/dto/red_team.py,sha256=BAvjpz_Xxb4UW5GRmvfOLV3KvvciPyVGUyYgNDBzq2E,25790
24
+ enkryptai_sdk-1.0.18.dist-info/licenses/LICENSE,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
+ enkryptai_sdk-1.0.18.dist-info/METADATA,sha256=PWAkBaJJiqgxvUfRfSbO9wUSNaYsAczTiFwB8sycVo0,72860
26
+ enkryptai_sdk-1.0.18.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
27
+ enkryptai_sdk-1.0.18.dist-info/top_level.txt,sha256=s2X9UJJwvJamNmr6ZXWyyQe60sXtQGWFuaBYfhgHI_4,14
28
+ enkryptai_sdk-1.0.18.dist-info/RECORD,,