enkryptai-sdk 1.0.17__py3-none-any.whl → 1.0.19__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.
- enkryptai_sdk/config.py +10 -0
- enkryptai_sdk/dto/common.py +64 -0
- enkryptai_sdk/dto/deployments.py +2 -0
- enkryptai_sdk/dto/guardrails.py +52 -6
- enkryptai_sdk/dto/models.py +1 -1
- enkryptai_sdk/dto/red_team.py +38 -58
- {enkryptai_sdk-1.0.17.dist-info → enkryptai_sdk-1.0.19.dist-info}/METADATA +12 -2
- {enkryptai_sdk-1.0.17.dist-info → enkryptai_sdk-1.0.19.dist-info}/RECORD +11 -10
- {enkryptai_sdk-1.0.17.dist-info → enkryptai_sdk-1.0.19.dist-info}/WHEEL +0 -0
- {enkryptai_sdk-1.0.17.dist-info → enkryptai_sdk-1.0.19.dist-info}/licenses/LICENSE +0 -0
- {enkryptai_sdk-1.0.17.dist-info → enkryptai_sdk-1.0.19.dist-info}/top_level.txt +0 -0
enkryptai_sdk/config.py
CHANGED
|
@@ -16,6 +16,7 @@ DEFAULT_GUARDRAILS_CONFIG = {
|
|
|
16
16
|
"bias": {"enabled": False},
|
|
17
17
|
"copyright_ip": {"enabled": False},
|
|
18
18
|
"system_prompt": {"enabled": False, "index": "system"},
|
|
19
|
+
"sponge_attack": {"enabled": False},
|
|
19
20
|
}
|
|
20
21
|
|
|
21
22
|
|
|
@@ -151,6 +152,15 @@ class GuardrailsConfig:
|
|
|
151
152
|
config = copy.deepcopy(DEFAULT_GUARDRAILS_CONFIG)
|
|
152
153
|
config["system_prompt"] = {"enabled": True, "index": index}
|
|
153
154
|
return cls(config)
|
|
155
|
+
|
|
156
|
+
@classmethod
|
|
157
|
+
def sponge_attack(cls):
|
|
158
|
+
"""
|
|
159
|
+
Returns a configuration instance pre-configured for sponge attack detection.
|
|
160
|
+
"""
|
|
161
|
+
config = copy.deepcopy(DEFAULT_GUARDRAILS_CONFIG)
|
|
162
|
+
config["sponge_attack"] = {"enabled": True}
|
|
163
|
+
return cls(config)
|
|
154
164
|
|
|
155
165
|
def update(self, **kwargs):
|
|
156
166
|
"""
|
|
@@ -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
|
+
|
enkryptai_sdk/dto/deployments.py
CHANGED
|
@@ -15,6 +15,7 @@ class InputGuardrailBlockType(str, Enum):
|
|
|
15
15
|
BIAS = "bias"
|
|
16
16
|
SYSTEM_PROMPT = "system_prompt"
|
|
17
17
|
COPYRIGHT_IP = "copyright_ip"
|
|
18
|
+
SPONGE_ATTACK = "sponge_attack"
|
|
18
19
|
|
|
19
20
|
|
|
20
21
|
class OutputGuardrailBlockType(str, Enum):
|
|
@@ -28,6 +29,7 @@ class OutputGuardrailBlockType(str, Enum):
|
|
|
28
29
|
BIAS = "bias"
|
|
29
30
|
SYSTEM_PROMPT = "system_prompt"
|
|
30
31
|
COPYRIGHT_IP = "copyright_ip"
|
|
32
|
+
SPONGE_ATTACK = "sponge_attack"
|
|
31
33
|
HALLUCINATION = "hallucination"
|
|
32
34
|
ADHERENCE = "adherence"
|
|
33
35
|
RELEVANCY = "relevancy"
|
enkryptai_sdk/dto/guardrails.py
CHANGED
|
@@ -243,6 +243,23 @@ class SystemPromptDetector(BaseDTO):
|
|
|
243
243
|
}
|
|
244
244
|
|
|
245
245
|
|
|
246
|
+
@dataclass
|
|
247
|
+
class SpongeAttackDetector(BaseDTO):
|
|
248
|
+
enabled: bool = False
|
|
249
|
+
_extra_fields: Dict[str, Any] = field(default_factory=dict)
|
|
250
|
+
|
|
251
|
+
@classmethod
|
|
252
|
+
def from_dict(cls, data: Dict[str, Any]) -> "SpongeAttackDetector":
|
|
253
|
+
return cls(
|
|
254
|
+
enabled=data.get("enabled", False)
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
258
|
+
return {
|
|
259
|
+
"enabled": self.enabled
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
|
|
246
263
|
class GuardrailDetectorsEnum(str, Enum):
|
|
247
264
|
TOPIC_DETECTOR = "topic_detector"
|
|
248
265
|
NSFW = "nsfw"
|
|
@@ -254,6 +271,7 @@ class GuardrailDetectorsEnum(str, Enum):
|
|
|
254
271
|
BIAS = "bias"
|
|
255
272
|
COPYRIGHT_IP = "copyright_ip"
|
|
256
273
|
SYSTEM_PROMPT = "system_prompt"
|
|
274
|
+
SPONGE_ATTACK = "sponge_attack"
|
|
257
275
|
|
|
258
276
|
|
|
259
277
|
@dataclass
|
|
@@ -268,6 +286,7 @@ class GuardrailDetectors(BaseDTO):
|
|
|
268
286
|
bias: BiasDetector = field(default_factory=BiasDetector)
|
|
269
287
|
copyright_ip: CopyrightIPDetector = field(default_factory=CopyrightIPDetector)
|
|
270
288
|
system_prompt: SystemPromptDetector = field(default_factory=SystemPromptDetector)
|
|
289
|
+
sponge_attack: SpongeAttackDetector = field(default_factory=SpongeAttackDetector)
|
|
271
290
|
_extra_fields: Dict[str, Any] = field(default_factory=dict)
|
|
272
291
|
|
|
273
292
|
@classmethod
|
|
@@ -282,7 +301,8 @@ class GuardrailDetectors(BaseDTO):
|
|
|
282
301
|
policy_violation=PolicyViolationDetector.from_dict(data.get("policy_violation", {})),
|
|
283
302
|
bias=BiasDetector.from_dict(data.get("bias", {})),
|
|
284
303
|
copyright_ip=CopyrightIPDetector.from_dict(data.get("copyright_ip", {})),
|
|
285
|
-
system_prompt=SystemPromptDetector.from_dict(data.get("system_prompt", {}))
|
|
304
|
+
system_prompt=SystemPromptDetector.from_dict(data.get("system_prompt", {})),
|
|
305
|
+
sponge_attack=SpongeAttackDetector.from_dict(data.get("sponge_attack", {}))
|
|
286
306
|
)
|
|
287
307
|
|
|
288
308
|
def to_dict(self) -> Dict[str, Any]:
|
|
@@ -296,7 +316,8 @@ class GuardrailDetectors(BaseDTO):
|
|
|
296
316
|
"policy_violation": self.policy_violation.to_dict(),
|
|
297
317
|
"bias": self.bias.to_dict(),
|
|
298
318
|
"copyright_ip": self.copyright_ip.to_dict(),
|
|
299
|
-
"system_prompt": self.system_prompt.to_dict()
|
|
319
|
+
"system_prompt": self.system_prompt.to_dict(),
|
|
320
|
+
"sponge_attack": self.sponge_attack.to_dict()
|
|
300
321
|
}
|
|
301
322
|
|
|
302
323
|
|
|
@@ -608,6 +629,25 @@ class SystemPromptDetail(BaseDTO):
|
|
|
608
629
|
return result
|
|
609
630
|
|
|
610
631
|
|
|
632
|
+
@dataclass
|
|
633
|
+
class SpongeAttackDetail(BaseDTO):
|
|
634
|
+
sponge_attack_detected: bool = False
|
|
635
|
+
_extra_fields: Dict[str, Any] = field(default_factory=dict)
|
|
636
|
+
|
|
637
|
+
@classmethod
|
|
638
|
+
def from_dict(cls, data: Dict[str, Any]) -> "SpongeAttackDetail":
|
|
639
|
+
return cls(
|
|
640
|
+
sponge_attack_detected=data.get("sponge_attack_detected", False)
|
|
641
|
+
)
|
|
642
|
+
|
|
643
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
644
|
+
result = {
|
|
645
|
+
"sponge_attack_detected": self.sponge_attack_detected
|
|
646
|
+
}
|
|
647
|
+
result.update(self._extra_fields)
|
|
648
|
+
return result
|
|
649
|
+
|
|
650
|
+
|
|
611
651
|
@dataclass
|
|
612
652
|
class DetectResponseSummary(BaseDTO):
|
|
613
653
|
on_topic: int = 0
|
|
@@ -620,6 +660,7 @@ class DetectResponseSummary(BaseDTO):
|
|
|
620
660
|
bias: int = 0
|
|
621
661
|
copyright_ip_similarity: int = 0
|
|
622
662
|
system_prompt_similarity: int = 0
|
|
663
|
+
sponge_attack: int = 0
|
|
623
664
|
_extra_fields: Dict[str, Any] = field(default_factory=dict)
|
|
624
665
|
|
|
625
666
|
@classmethod
|
|
@@ -634,7 +675,8 @@ class DetectResponseSummary(BaseDTO):
|
|
|
634
675
|
policy_violation=data.get("policy_violation", 0),
|
|
635
676
|
bias=data.get("bias", 0),
|
|
636
677
|
copyright_ip_similarity=data.get("copyright_ip_similarity", 0),
|
|
637
|
-
system_prompt_similarity=data.get("system_prompt_similarity", 0)
|
|
678
|
+
system_prompt_similarity=data.get("system_prompt_similarity", 0),
|
|
679
|
+
sponge_attack=data.get("sponge_attack", 0)
|
|
638
680
|
)
|
|
639
681
|
|
|
640
682
|
def to_dict(self) -> Dict[str, Any]:
|
|
@@ -648,7 +690,8 @@ class DetectResponseSummary(BaseDTO):
|
|
|
648
690
|
"policy_violation": self.policy_violation,
|
|
649
691
|
"bias": self.bias,
|
|
650
692
|
"copyright_ip_similarity": self.copyright_ip_similarity,
|
|
651
|
-
"system_prompt_similarity": self.system_prompt_similarity
|
|
693
|
+
"system_prompt_similarity": self.system_prompt_similarity,
|
|
694
|
+
"sponge_attack": self.sponge_attack
|
|
652
695
|
}
|
|
653
696
|
result.update(self._extra_fields)
|
|
654
697
|
return result
|
|
@@ -666,6 +709,7 @@ class DetectResponseDetails(BaseDTO):
|
|
|
666
709
|
bias: BiasDetail = field(default_factory=BiasDetail)
|
|
667
710
|
copyright_ip: CopyrightIPDetail = field(default_factory=CopyrightIPDetail)
|
|
668
711
|
system_prompt: SystemPromptDetail = field(default_factory=SystemPromptDetail)
|
|
712
|
+
sponge_attack: SpongeAttackDetail = field(default_factory=SpongeAttackDetail)
|
|
669
713
|
_extra_fields: Dict[str, Any] = field(default_factory=dict)
|
|
670
714
|
|
|
671
715
|
@classmethod
|
|
@@ -680,7 +724,8 @@ class DetectResponseDetails(BaseDTO):
|
|
|
680
724
|
policy_violation=PolicyViolationDetail.from_dict(data.get("policy_violation", {})),
|
|
681
725
|
bias=BiasDetail.from_dict(data.get("bias", {})),
|
|
682
726
|
copyright_ip=CopyrightIPDetail.from_dict(data.get("copyright_ip", {})),
|
|
683
|
-
system_prompt=SystemPromptDetail.from_dict(data.get("system_prompt", {}))
|
|
727
|
+
system_prompt=SystemPromptDetail.from_dict(data.get("system_prompt", {})),
|
|
728
|
+
sponge_attack=SpongeAttackDetail.from_dict(data.get("sponge_attack", {}))
|
|
684
729
|
)
|
|
685
730
|
|
|
686
731
|
def to_dict(self) -> Dict[str, Any]:
|
|
@@ -694,7 +739,8 @@ class DetectResponseDetails(BaseDTO):
|
|
|
694
739
|
"policy_violation": self.policy_violation.to_dict(),
|
|
695
740
|
"bias": self.bias.to_dict(),
|
|
696
741
|
"copyright_ip": self.copyright_ip.to_dict(),
|
|
697
|
-
"system_prompt": self.system_prompt.to_dict()
|
|
742
|
+
"system_prompt": self.system_prompt.to_dict(),
|
|
743
|
+
"sponge_attack": self.sponge_attack.to_dict()
|
|
698
744
|
}
|
|
699
745
|
result.update(self._extra_fields)
|
|
700
746
|
return result
|
enkryptai_sdk/dto/models.py
CHANGED
|
@@ -5,7 +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 .
|
|
8
|
+
from .common import ModelAuthTypeEnum, CustomHeader, ModelJwtConfig
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
# class Modality(Enum):
|
enkryptai_sdk/dto/red_team.py
CHANGED
|
@@ -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):
|
|
@@ -18,64 +20,7 @@ class RiskGuardrailDetectorsEnum(str, Enum):
|
|
|
18
20
|
# Below are not yet supported by Guardrails. So, also not supported by Risk Mitigation.
|
|
19
21
|
# COPYRIGHT_IP = "copyright_ip"
|
|
20
22
|
# SYSTEM_PROMPT = "system_prompt"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class ModelAuthTypeEnum(str, Enum):
|
|
24
|
-
APIKEY = "apikey"
|
|
25
|
-
JWT = "jwt"
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class ModelJwtMethodEnum(str, Enum):
|
|
29
|
-
POST = "POST"
|
|
30
|
-
GET = "GET"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
@dataclass
|
|
34
|
-
class CustomHeader(BaseDTO):
|
|
35
|
-
key: str
|
|
36
|
-
value: str
|
|
37
|
-
|
|
38
|
-
@classmethod
|
|
39
|
-
def from_dict(cls, data: Dict[str, Any]) -> "CustomHeader":
|
|
40
|
-
return cls(
|
|
41
|
-
key=data.get("key", ""),
|
|
42
|
-
value=data.get("value", "")
|
|
43
|
-
)
|
|
44
|
-
|
|
45
|
-
def to_dict(self) -> Dict[str, Any]:
|
|
46
|
-
return {
|
|
47
|
-
"key": self.key,
|
|
48
|
-
"value": self.value
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
@dataclass
|
|
53
|
-
class ModelJwtConfig(BaseDTO):
|
|
54
|
-
jwt_method: ModelJwtMethodEnum = ModelJwtMethodEnum.POST
|
|
55
|
-
jwt_url: str = ""
|
|
56
|
-
jwt_headers: List[CustomHeader] = field(default_factory=list)
|
|
57
|
-
jwt_body: str = ""
|
|
58
|
-
jwt_response_key: str = ""
|
|
59
|
-
_extra_fields: Dict[str, Any] = field(default_factory=dict)
|
|
60
|
-
|
|
61
|
-
@classmethod
|
|
62
|
-
def from_dict(cls, data: Dict[str, Any]) -> "ModelJwtConfig":
|
|
63
|
-
return cls(
|
|
64
|
-
jwt_method=ModelJwtMethodEnum(data.get("jwt_method", ModelJwtMethodEnum.POST)),
|
|
65
|
-
jwt_url=data.get("jwt_url", ""),
|
|
66
|
-
jwt_headers=[CustomHeader.from_dict(header) for header in data.get("jwt_headers", [])],
|
|
67
|
-
jwt_body=data.get("jwt_body", ""),
|
|
68
|
-
jwt_response_key=data.get("jwt_response_key", ""),
|
|
69
|
-
)
|
|
70
|
-
|
|
71
|
-
def to_dict(self) -> Dict[str, Any]:
|
|
72
|
-
return {
|
|
73
|
-
"jwt_method": self.jwt_method.value,
|
|
74
|
-
"jwt_url": self.jwt_url,
|
|
75
|
-
"jwt_headers": [header.to_dict() for header in self.jwt_headers],
|
|
76
|
-
"jwt_body": self.jwt_body,
|
|
77
|
-
"jwt_response_key": self.jwt_response_key,
|
|
78
|
-
}
|
|
23
|
+
# SPONGE_ATTACK = "sponge_attack"
|
|
79
24
|
|
|
80
25
|
|
|
81
26
|
@dataclass
|
|
@@ -416,6 +361,28 @@ class TestConfig(BaseDTO):
|
|
|
416
361
|
return cls(**data, attack_methods=attack_methods)
|
|
417
362
|
|
|
418
363
|
|
|
364
|
+
@dataclass
|
|
365
|
+
class CompetitorTestConfig(BaseDTO):
|
|
366
|
+
system_description: str
|
|
367
|
+
competitors_list: List[str]
|
|
368
|
+
sample_percentage: int = 1
|
|
369
|
+
attack_methods: AttackMethods = field(default_factory=AttackMethods)
|
|
370
|
+
|
|
371
|
+
def to_dict(self) -> dict:
|
|
372
|
+
return {
|
|
373
|
+
"sample_percentage": self.sample_percentage,
|
|
374
|
+
"competitors_list": self.competitors_list,
|
|
375
|
+
"system_description": self.system_description,
|
|
376
|
+
"attack_methods": self.attack_methods.to_dict(),
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
@classmethod
|
|
380
|
+
def from_dict(cls, data: dict):
|
|
381
|
+
data = data.copy()
|
|
382
|
+
attack_methods = AttackMethods.from_dict(data.pop("attack_methods", {}))
|
|
383
|
+
return cls(**data, attack_methods=attack_methods)
|
|
384
|
+
|
|
385
|
+
|
|
419
386
|
@dataclass
|
|
420
387
|
class RedTeamTestConfigurations(BaseDTO):
|
|
421
388
|
# Basic tests
|
|
@@ -424,6 +391,12 @@ class RedTeamTestConfigurations(BaseDTO):
|
|
|
424
391
|
insecure_code_test: TestConfig = field(default=None)
|
|
425
392
|
toxicity_test: TestConfig = field(default=None)
|
|
426
393
|
harmful_test: TestConfig = field(default=None)
|
|
394
|
+
pii_test: TestConfig = field(default=None)
|
|
395
|
+
copyright_test: TestConfig = field(default=None)
|
|
396
|
+
misinformation_test: TestConfig = field(default=None)
|
|
397
|
+
system_prompt_extractions_test: TestConfig = field(default=None)
|
|
398
|
+
sponge_test: TestConfig = field(default=None)
|
|
399
|
+
competitor_test: CompetitorTestConfig = field(default=None)
|
|
427
400
|
# Advanced tests
|
|
428
401
|
adv_info_test: TestConfig = field(default=None)
|
|
429
402
|
adv_bias_test: TestConfig = field(default=None)
|
|
@@ -442,6 +415,13 @@ class RedTeamTestConfigurations(BaseDTO):
|
|
|
442
415
|
access_control_test: TestConfig = field(default=None)
|
|
443
416
|
physical_and_actuation_safety_test: TestConfig = field(default=None)
|
|
444
417
|
reliability_and_monitoring_test: TestConfig = field(default=None)
|
|
418
|
+
governance_test: TestConfig = field(default=None)
|
|
419
|
+
agent_output_quality_test: TestConfig = field(default=None)
|
|
420
|
+
tool_misuse_test: TestConfig = field(default=None)
|
|
421
|
+
privacy_test: TestConfig = field(default=None)
|
|
422
|
+
reliability_and_observability_test: TestConfig = field(default=None)
|
|
423
|
+
agent_behaviour_test: TestConfig = field(default=None)
|
|
424
|
+
access_control_and_permissions_test: TestConfig = field(default=None)
|
|
445
425
|
_extra_fields: Dict[str, Any] = field(default_factory=dict)
|
|
446
426
|
|
|
447
427
|
@classmethod
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: enkryptai-sdk
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.19
|
|
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
|
|
@@ -275,6 +275,9 @@ sample_detectors = {
|
|
|
275
275
|
},
|
|
276
276
|
"bias": {
|
|
277
277
|
"enabled": False
|
|
278
|
+
},
|
|
279
|
+
"sponge_attack": {
|
|
280
|
+
"enabled": False
|
|
278
281
|
}
|
|
279
282
|
}
|
|
280
283
|
```
|
|
@@ -984,6 +987,7 @@ print(batch_detect_response.to_dict())
|
|
|
984
987
|
- `copyright_ip`: Check for copyright/IP violations ***(Coming soon)***
|
|
985
988
|
- `system_prompt`: Detect system prompt leaks ***(Coming soon)***
|
|
986
989
|
- `keyword_detector`: Check for specific keywords
|
|
990
|
+
- `sponge_attack`: Detect infinite loops
|
|
987
991
|
|
|
988
992
|
Each detector can be enabled/disabled and configured with specific options as documented in the [API docs](https://docs.enkryptai.com/guardrails-api-reference/introduction).
|
|
989
993
|
|
|
@@ -1058,6 +1062,12 @@ guardrails_config = GuardrailsConfig.copyright_ip()
|
|
|
1058
1062
|
guardrails_config = GuardrailsConfig.system_prompt(index="system")
|
|
1059
1063
|
```
|
|
1060
1064
|
|
|
1065
|
+
### [Sponge Attack](https://docs.enkryptai.com/guardrails-api-reference/Sponge_Attack_Detector)
|
|
1066
|
+
|
|
1067
|
+
```python Python
|
|
1068
|
+
guardrails_config = GuardrailsConfig.sponge_attack()
|
|
1069
|
+
```
|
|
1070
|
+
|
|
1061
1071
|
## [Detect with config](https://docs.enkryptai.com/guardrails-api-reference/Detect)
|
|
1062
1072
|
|
|
1063
1073
|
```python Python
|
|
@@ -1656,7 +1666,7 @@ custom_headers = {
|
|
|
1656
1666
|
|
|
1657
1667
|
# Example of making a request with custom headers
|
|
1658
1668
|
response = client.chat.completions.create(
|
|
1659
|
-
model='gpt-4o',
|
|
1669
|
+
# model='gpt-4o', # Optional
|
|
1660
1670
|
messages=[{'role': 'user', 'content': 'Hello!'}],
|
|
1661
1671
|
extra_headers=custom_headers
|
|
1662
1672
|
)
|
|
@@ -2,7 +2,7 @@ enkryptai_sdk/__init__.py,sha256=8H5tznmjirTVdrTmrsyU6fNVRj3-UC0nrTGkzfFp0h0,845
|
|
|
2
2
|
enkryptai_sdk/ai_proxy.py,sha256=ot1lqKk2LjcvlpnFm2kSA51vFThfquVlx86BhSbAzBo,3823
|
|
3
3
|
enkryptai_sdk/base.py,sha256=KonezvdjVzIr3gw75grzcCNyhzI_sHXi-Cb9tRJgSDE,3277
|
|
4
4
|
enkryptai_sdk/coc.py,sha256=5rq9LhZX-uvCmX8fM6JEndIEvd8rSzsSfDFnTvSvTQE,7396
|
|
5
|
-
enkryptai_sdk/config.py,sha256=
|
|
5
|
+
enkryptai_sdk/config.py,sha256=zUlWFr33JVz_kzUl3JalXeq-s1q0Qvyi4HBrGk0CTBU,9402
|
|
6
6
|
enkryptai_sdk/datasets.py,sha256=RQIR6spI2STXeVolYzBt6gPv6PD5AGh9krs16aKWdWA,6067
|
|
7
7
|
enkryptai_sdk/deployments.py,sha256=A7XZ2JwrMod9V4_aV8bFY_Soh9E3jHdwaTuJ9BwXuyk,4215
|
|
8
8
|
enkryptai_sdk/evals.py,sha256=BywyEgIT7xdJ58svO_sDNOMVowdB0RTGoAZPEbCnDVo,2595
|
|
@@ -15,13 +15,14 @@ enkryptai_sdk/dto/__init__.py,sha256=wHgIv_OCnVMJOys-vqImF59ifogDrMcgxVRmfNayVvc
|
|
|
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
|
-
enkryptai_sdk/dto/deployments.py,sha256=
|
|
20
|
-
enkryptai_sdk/dto/guardrails.py,sha256=
|
|
21
|
-
enkryptai_sdk/dto/models.py,sha256=
|
|
22
|
-
enkryptai_sdk/dto/red_team.py,sha256=
|
|
23
|
-
enkryptai_sdk-1.0.
|
|
24
|
-
enkryptai_sdk-1.0.
|
|
25
|
-
enkryptai_sdk-1.0.
|
|
26
|
-
enkryptai_sdk-1.0.
|
|
27
|
-
enkryptai_sdk-1.0.
|
|
20
|
+
enkryptai_sdk/dto/deployments.py,sha256=_tdSyRTJvthjLTbOxFO4f2P6vgirDsF3in5_gXE3a_U,11288
|
|
21
|
+
enkryptai_sdk/dto/guardrails.py,sha256=NUVz59c-lnlTOwg72QIk62-USfHO-dpS5u2Hr6q9QGA,51774
|
|
22
|
+
enkryptai_sdk/dto/models.py,sha256=4aeI9-iHPhSX5duRMTQRbkXhplAhN8OHw3gWdTxrafU,14531
|
|
23
|
+
enkryptai_sdk/dto/red_team.py,sha256=VoNQVte__bXf2-wXgTDMEk--7KSvQm7ZR45WXPPneHU,27324
|
|
24
|
+
enkryptai_sdk-1.0.19.dist-info/licenses/LICENSE,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
25
|
+
enkryptai_sdk-1.0.19.dist-info/METADATA,sha256=mtGop_UEL2riS3hMqfD3NOcIorcb5pOyqC0jddvVwFE,73153
|
|
26
|
+
enkryptai_sdk-1.0.19.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
27
|
+
enkryptai_sdk-1.0.19.dist-info/top_level.txt,sha256=s2X9UJJwvJamNmr6ZXWyyQe60sXtQGWFuaBYfhgHI_4,14
|
|
28
|
+
enkryptai_sdk-1.0.19.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|