enkryptai-sdk 1.0.18__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 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
  """
@@ -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"
@@ -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
@@ -20,6 +20,7 @@ class RiskGuardrailDetectorsEnum(str, Enum):
20
20
  # Below are not yet supported by Guardrails. So, also not supported by Risk Mitigation.
21
21
  # COPYRIGHT_IP = "copyright_ip"
22
22
  # SYSTEM_PROMPT = "system_prompt"
23
+ # SPONGE_ATTACK = "sponge_attack"
23
24
 
24
25
 
25
26
  @dataclass
@@ -360,6 +361,28 @@ class TestConfig(BaseDTO):
360
361
  return cls(**data, attack_methods=attack_methods)
361
362
 
362
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
+
363
386
  @dataclass
364
387
  class RedTeamTestConfigurations(BaseDTO):
365
388
  # Basic tests
@@ -368,6 +391,12 @@ class RedTeamTestConfigurations(BaseDTO):
368
391
  insecure_code_test: TestConfig = field(default=None)
369
392
  toxicity_test: TestConfig = field(default=None)
370
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)
371
400
  # Advanced tests
372
401
  adv_info_test: TestConfig = field(default=None)
373
402
  adv_bias_test: TestConfig = field(default=None)
@@ -386,6 +415,13 @@ class RedTeamTestConfigurations(BaseDTO):
386
415
  access_control_test: TestConfig = field(default=None)
387
416
  physical_and_actuation_safety_test: TestConfig = field(default=None)
388
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)
389
425
  _extra_fields: Dict[str, Any] = field(default_factory=dict)
390
426
 
391
427
  @classmethod
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: enkryptai-sdk
3
- Version: 1.0.18
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=PyyuJRKWuiuFUaI90M21M141wlfIBeO_QVDU36KHKCs,9065
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
@@ -17,12 +17,12 @@ enkryptai_sdk/dto/base.py,sha256=y77kQL1X7389ifSVNc0E7CUFNxACh5AM3ml9YPon1KY,282
17
17
  enkryptai_sdk/dto/coc.py,sha256=Lp2aat_24J4KuUg4BeJl9S39tEak8Bw15eJ4cQDrRQk,4749
18
18
  enkryptai_sdk/dto/common.py,sha256=lrWMu4FKUGCN2dbS9fT4yNtfiPm1cNN16J4eCe4_tBM,1812
19
19
  enkryptai_sdk/dto/datasets.py,sha256=RFA9CmbhD-QDDyweBq_k9iBd00b6I6SWmdP9DPNd9fc,5002
20
- enkryptai_sdk/dto/deployments.py,sha256=Aw4b8tDA3FYIomqDvCjblCXTagL4bT8Fx91X0SFXs40,11216
21
- enkryptai_sdk/dto/guardrails.py,sha256=oJQqFhsdQd_yPU187AhKse-Y4xktgmVNwwKKkzFazbg,50167
20
+ enkryptai_sdk/dto/deployments.py,sha256=_tdSyRTJvthjLTbOxFO4f2P6vgirDsF3in5_gXE3a_U,11288
21
+ enkryptai_sdk/dto/guardrails.py,sha256=NUVz59c-lnlTOwg72QIk62-USfHO-dpS5u2Hr6q9QGA,51774
22
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,,
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,,