enkryptai-sdk 0.1.6__py3-none-any.whl → 0.1.7__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,1261 @@
1
+ from enum import Enum
2
+ from .base import BaseDTO
3
+ from dataclasses import dataclass, field
4
+ from typing import List, Dict, Any, Set
5
+
6
+
7
+ class GuardrailsPIIModes(str, Enum):
8
+ REQUEST = "request"
9
+ RESPONSE = "response"
10
+
11
+
12
+ @dataclass
13
+ class GuardrailsHealthResponse(BaseDTO):
14
+ status: str
15
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
16
+
17
+ @classmethod
18
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsHealthResponse":
19
+ return cls(
20
+ status=data.get("status", "")
21
+ )
22
+
23
+ def to_dict(self) -> Dict[str, Any]:
24
+ return {
25
+ "status": self.status
26
+ }
27
+
28
+
29
+ @dataclass
30
+ class GuardrailsModelsResponse(BaseDTO):
31
+ models: List[str] = field(default_factory=list)
32
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
33
+
34
+ @classmethod
35
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsModelsResponse":
36
+ return cls(
37
+ models=data.get("models", [])
38
+ )
39
+
40
+ def to_dict(self) -> Dict[str, Any]:
41
+ return {
42
+ "models": self.models
43
+ }
44
+
45
+
46
+ # -------------------------------------
47
+ # Guardrails Detect Request
48
+ # -------------------------------------
49
+
50
+
51
+ @dataclass
52
+ class TopicDetector(BaseDTO):
53
+ enabled: bool = False
54
+ topic: List[str] = field(default_factory=list)
55
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
56
+
57
+ @classmethod
58
+ def from_dict(cls, data: Dict[str, Any]) -> "TopicDetector":
59
+ return cls(
60
+ enabled=data.get("enabled", False),
61
+ topic=data.get("topic", [])
62
+ )
63
+
64
+ def to_dict(self) -> Dict[str, Any]:
65
+ return {
66
+ "enabled": self.enabled,
67
+ "topic": self.topic
68
+ }
69
+
70
+
71
+ @dataclass
72
+ class NSFWDetector(BaseDTO):
73
+ enabled: bool = False
74
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
75
+
76
+ @classmethod
77
+ def from_dict(cls, data: Dict[str, Any]) -> "NSFWDetector":
78
+ return cls(
79
+ enabled=data.get("enabled", False)
80
+ )
81
+
82
+ def to_dict(self) -> Dict[str, Any]:
83
+ return {
84
+ "enabled": self.enabled
85
+ }
86
+
87
+
88
+ @dataclass
89
+ class ToxicityDetector(BaseDTO):
90
+ enabled: bool = False
91
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
92
+
93
+ @classmethod
94
+ def from_dict(cls, data: Dict[str, Any]) -> "ToxicityDetector":
95
+ return cls(
96
+ enabled=data.get("enabled", False)
97
+ )
98
+
99
+ def to_dict(self) -> Dict[str, Any]:
100
+ return {
101
+ "enabled": self.enabled
102
+ }
103
+
104
+
105
+ @dataclass
106
+ class PIIDetector(BaseDTO):
107
+ enabled: bool = False
108
+ entities: List[str] = field(default_factory=list)
109
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
110
+
111
+ @classmethod
112
+ def from_dict(cls, data: Dict[str, Any]) -> "PIIDetector":
113
+ return cls(
114
+ enabled=data.get("enabled", False),
115
+ entities=data.get("entities", [])
116
+ )
117
+
118
+ def to_dict(self) -> Dict[str, Any]:
119
+ return {
120
+ "enabled": self.enabled,
121
+ "entities": self.entities
122
+ }
123
+
124
+
125
+ @dataclass
126
+ class InjectionAttackDetector(BaseDTO):
127
+ enabled: bool = False
128
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
129
+
130
+ @classmethod
131
+ def from_dict(cls, data: Dict[str, Any]) -> "InjectionAttackDetector":
132
+ return cls(
133
+ enabled=data.get("enabled", False)
134
+ )
135
+
136
+ def to_dict(self) -> Dict[str, Any]:
137
+ return {
138
+ "enabled": self.enabled
139
+ }
140
+
141
+
142
+ @dataclass
143
+ class KeywordDetector(BaseDTO):
144
+ enabled: bool = False
145
+ banned_keywords: List[str] = field(default_factory=list)
146
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
147
+
148
+ @classmethod
149
+ def from_dict(cls, data: Dict[str, Any]) -> "KeywordDetector":
150
+ return cls(
151
+ enabled=data.get("enabled", False),
152
+ banned_keywords=data.get("banned_keywords", [])
153
+ )
154
+
155
+ def to_dict(self) -> Dict[str, Any]:
156
+ return {
157
+ "enabled": self.enabled,
158
+ "banned_keywords": self.banned_keywords
159
+ }
160
+
161
+
162
+ @dataclass
163
+ class PolicyViolationDetector(BaseDTO):
164
+ enabled: bool = False
165
+ policy_text: str = ""
166
+ need_explanation: bool = False
167
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
168
+
169
+ @classmethod
170
+ def from_dict(cls, data: Dict[str, Any]) -> "PolicyViolationDetector":
171
+ return cls(
172
+ enabled=data.get("enabled", False),
173
+ policy_text=data.get("policy_text", ""),
174
+ need_explanation=data.get("need_explanation", False)
175
+ )
176
+
177
+ def to_dict(self) -> Dict[str, Any]:
178
+ return {
179
+ "enabled": self.enabled,
180
+ "policy_text": self.policy_text,
181
+ "need_explanation": self.need_explanation
182
+ }
183
+
184
+
185
+ @dataclass
186
+ class BiasDetector(BaseDTO):
187
+ enabled: bool = False
188
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
189
+
190
+ @classmethod
191
+ def from_dict(cls, data: Dict[str, Any]) -> "BiasDetector":
192
+ return cls(
193
+ enabled=data.get("enabled", False)
194
+ )
195
+
196
+ def to_dict(self) -> Dict[str, Any]:
197
+ return {
198
+ "enabled": self.enabled
199
+ }
200
+
201
+
202
+ @dataclass
203
+ class CopyrightIPDetector(BaseDTO):
204
+ enabled: bool = False
205
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
206
+
207
+ @classmethod
208
+ def from_dict(cls, data: Dict[str, Any]) -> "CopyrightIPDetector":
209
+ return cls(
210
+ enabled=data.get("enabled", False)
211
+ )
212
+
213
+ def to_dict(self) -> Dict[str, Any]:
214
+ return {
215
+ "enabled": self.enabled
216
+ }
217
+
218
+
219
+ @dataclass
220
+ class SystemPromptDetector(BaseDTO):
221
+ enabled: bool = False
222
+ index: str = ""
223
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
224
+
225
+ @classmethod
226
+ def from_dict(cls, data: Dict[str, Any]) -> "SystemPromptDetector":
227
+ return cls(
228
+ enabled=data.get("enabled", False),
229
+ index=data.get("index", "")
230
+ )
231
+
232
+ def to_dict(self) -> Dict[str, Any]:
233
+ return {
234
+ "enabled": self.enabled,
235
+ "index": self.index
236
+ }
237
+
238
+
239
+ @dataclass
240
+ class GuardrailDetectors(BaseDTO):
241
+ topic_detector: TopicDetector = field(default_factory=TopicDetector)
242
+ nsfw: NSFWDetector = field(default_factory=NSFWDetector)
243
+ toxicity: ToxicityDetector = field(default_factory=ToxicityDetector)
244
+ pii: PIIDetector = field(default_factory=PIIDetector)
245
+ injection_attack: InjectionAttackDetector = field(default_factory=InjectionAttackDetector)
246
+ keyword_detector: KeywordDetector = field(default_factory=KeywordDetector)
247
+ policy_violation: PolicyViolationDetector = field(default_factory=PolicyViolationDetector)
248
+ bias: BiasDetector = field(default_factory=BiasDetector)
249
+ copyright_ip: CopyrightIPDetector = field(default_factory=CopyrightIPDetector)
250
+ system_prompt: SystemPromptDetector = field(default_factory=SystemPromptDetector)
251
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
252
+
253
+ @classmethod
254
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailDetectors":
255
+ return cls(
256
+ topic_detector=TopicDetector.from_dict(data.get("topic_detector", {})),
257
+ nsfw=NSFWDetector.from_dict(data.get("nsfw", {})),
258
+ toxicity=ToxicityDetector.from_dict(data.get("toxicity", {})),
259
+ pii=PIIDetector.from_dict(data.get("pii", {})),
260
+ injection_attack=InjectionAttackDetector.from_dict(data.get("injection_attack", {})),
261
+ keyword_detector=KeywordDetector.from_dict(data.get("keyword_detector", {})),
262
+ policy_violation=PolicyViolationDetector.from_dict(data.get("policy_violation", {})),
263
+ bias=BiasDetector.from_dict(data.get("bias", {})),
264
+ copyright_ip=CopyrightIPDetector.from_dict(data.get("copyright_ip", {})),
265
+ system_prompt=SystemPromptDetector.from_dict(data.get("system_prompt", {}))
266
+ )
267
+
268
+ def to_dict(self) -> Dict[str, Any]:
269
+ return {
270
+ "topic_detector": self.topic_detector.to_dict(),
271
+ "nsfw": self.nsfw.to_dict(),
272
+ "toxicity": self.toxicity.to_dict(),
273
+ "pii": self.pii.to_dict(),
274
+ "injection_attack": self.injection_attack.to_dict(),
275
+ "keyword_detector": self.keyword_detector.to_dict(),
276
+ "policy_violation": self.policy_violation.to_dict(),
277
+ "bias": self.bias.to_dict(),
278
+ "copyright_ip": self.copyright_ip.to_dict(),
279
+ "system_prompt": self.system_prompt.to_dict()
280
+ }
281
+
282
+
283
+ @dataclass
284
+ class GuardrailsDetectRequest(BaseDTO):
285
+ text: str
286
+ detectors: GuardrailDetectors = field(default_factory=GuardrailDetectors)
287
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
288
+
289
+ @classmethod
290
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsDetectRequest":
291
+ detectors_data = data.get("detectors", {})
292
+ return cls(
293
+ text=data.get("text", ""),
294
+ detectors=GuardrailDetectors.from_dict(detectors_data)
295
+ )
296
+
297
+ def to_dict(self) -> Dict[str, Any]:
298
+ return {
299
+ "text": self.text,
300
+ "detectors": self.detectors.to_dict()
301
+ }
302
+
303
+
304
+ @dataclass
305
+ class GuardrailsPolicyDetectRequest(BaseDTO):
306
+ text: str
307
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
308
+
309
+ @classmethod
310
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsPolicyDetectRequest":
311
+ return cls(
312
+ text=data.get("text", "")
313
+ )
314
+
315
+ def to_dict(self) -> Dict[str, Any]:
316
+ return {
317
+ "text": self.text
318
+ }
319
+
320
+
321
+ # -------------------------------------
322
+ # Guardrails Detect Response
323
+ # -------------------------------------
324
+
325
+
326
+ @dataclass
327
+ class TopicDetectorDetail(BaseDTO):
328
+ _extra_fields: Dict[str, float] = field(default_factory=dict)
329
+
330
+ @classmethod
331
+ def from_dict(cls, data: Dict[str, Any]) -> "TopicDetectorDetail":
332
+ obj = cls()
333
+ obj._extra_fields = {k: float(v) for k, v in data.items()}
334
+ return obj
335
+
336
+ def to_dict(self) -> Dict[str, Any]:
337
+ return self._extra_fields
338
+
339
+
340
+ @dataclass
341
+ class NSFWDetail(BaseDTO):
342
+ sfw: float = 0.0
343
+ nsfw: float = 0.0
344
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
345
+
346
+ @classmethod
347
+ def from_dict(cls, data: Dict[str, Any]) -> "NSFWDetail":
348
+ return cls(
349
+ sfw=float(data.get("sfw", 0.0)),
350
+ nsfw=float(data.get("nsfw", 0.0))
351
+ )
352
+
353
+ def to_dict(self) -> Dict[str, Any]:
354
+ result = {
355
+ "sfw": self.sfw,
356
+ "nsfw": self.nsfw
357
+ }
358
+ result.update(self._extra_fields)
359
+ return result
360
+
361
+
362
+ @dataclass
363
+ class ToxicityDetail(BaseDTO):
364
+ toxicity: float = 0.0
365
+ severe_toxicity: float = 0.0
366
+ obscene: float = 0.0
367
+ threat: float = 0.0
368
+ insult: float = 0.0
369
+ identity_hate: float = 0.0
370
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
371
+
372
+ @classmethod
373
+ def from_dict(cls, data: Dict[str, Any]) -> "ToxicityDetail":
374
+ return cls(
375
+ toxicity=float(data.get("toxicity", 0.0)),
376
+ severe_toxicity=float(data.get("severe_toxicity", 0.0)),
377
+ obscene=float(data.get("obscene", 0.0)),
378
+ threat=float(data.get("threat", 0.0)),
379
+ insult=float(data.get("insult", 0.0)),
380
+ identity_hate=float(data.get("identity_hate", 0.0))
381
+ )
382
+
383
+ def to_dict(self) -> Dict[str, Any]:
384
+ result = {
385
+ "toxicity": self.toxicity,
386
+ "severe_toxicity": self.severe_toxicity,
387
+ "obscene": self.obscene,
388
+ "threat": self.threat,
389
+ "insult": self.insult,
390
+ "identity_hate": self.identity_hate
391
+ }
392
+ result.update(self._extra_fields)
393
+ return result
394
+
395
+
396
+ @dataclass
397
+ class PIIEntityDetail(BaseDTO):
398
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
399
+
400
+ @classmethod
401
+ def from_dict(cls, data: Dict[str, Any]) -> "PIIEntityDetail":
402
+ obj = cls()
403
+ obj._extra_fields = data
404
+ return obj
405
+
406
+ def to_dict(self) -> Dict[str, Any]:
407
+ return self._extra_fields
408
+
409
+
410
+ @dataclass
411
+ class PIIDetail(BaseDTO):
412
+ pii: PIIEntityDetail = field(default_factory=PIIEntityDetail)
413
+ secrets: PIIEntityDetail = field(default_factory=PIIEntityDetail)
414
+ ip_address: PIIEntityDetail = field(default_factory=PIIEntityDetail)
415
+ url: PIIEntityDetail = field(default_factory=PIIEntityDetail)
416
+ person: PIIEntityDetail = field(default_factory=PIIEntityDetail)
417
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
418
+
419
+ @classmethod
420
+ def from_dict(cls, data: Dict[str, Any]) -> "PIIDetail":
421
+ return cls(
422
+ pii=PIIEntityDetail.from_dict(data.get("pii", {})),
423
+ secrets=PIIEntityDetail.from_dict(data.get("secrets", {})),
424
+ ip_address=PIIEntityDetail.from_dict(data.get("ip_address", {})),
425
+ url=PIIEntityDetail.from_dict(data.get("url", {})),
426
+ person=PIIEntityDetail.from_dict(data.get("person", {}))
427
+ )
428
+
429
+ def to_dict(self) -> Dict[str, Any]:
430
+ result = {
431
+ "pii": self.pii.to_dict(),
432
+ "secrets": self.secrets.to_dict(),
433
+ "ip_address": self.ip_address.to_dict(),
434
+ "url": self.url.to_dict(),
435
+ "person": self.person.to_dict()
436
+ }
437
+ result.update(self._extra_fields)
438
+ return result
439
+
440
+
441
+ @dataclass
442
+ class InjectionAttackDetail(BaseDTO):
443
+ safe: str = "0.0"
444
+ attack: str = "0.0"
445
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
446
+
447
+ @classmethod
448
+ def from_dict(cls, data: Dict[str, Any]) -> "InjectionAttackDetail":
449
+ return cls(
450
+ safe=data.get("safe", "0.0"),
451
+ attack=data.get("attack", "0.0")
452
+ )
453
+
454
+ def to_dict(self) -> Dict[str, Any]:
455
+ result = {
456
+ "safe": self.safe,
457
+ "attack": self.attack
458
+ }
459
+ result.update(self._extra_fields)
460
+ return result
461
+
462
+
463
+ @dataclass
464
+ class KeywordDetectorDetail(BaseDTO):
465
+ detected_keywords: List[str] = field(default_factory=list)
466
+ detected_counts: Dict[str, int] = field(default_factory=dict)
467
+ redacted_text: str = ""
468
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
469
+
470
+ @classmethod
471
+ def from_dict(cls, data: Dict[str, Any]) -> "KeywordDetectorDetail":
472
+ return cls(
473
+ detected_keywords=data.get("detected_keywords", []),
474
+ detected_counts=data.get("detected_counts", {}),
475
+ redacted_text=data.get("redacted_text", "")
476
+ )
477
+
478
+ def to_dict(self) -> Dict[str, Any]:
479
+ result = {
480
+ "detected_keywords": self.detected_keywords,
481
+ "detected_counts": self.detected_counts,
482
+ "redacted_text": self.redacted_text
483
+ }
484
+ result.update(self._extra_fields)
485
+ return result
486
+
487
+
488
+ @dataclass
489
+ class PolicyViolationDetail(BaseDTO):
490
+ violating_policy: str = ""
491
+ explanation: str = ""
492
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
493
+
494
+ @classmethod
495
+ def from_dict(cls, data: Dict[str, Any]) -> "PolicyViolationDetail":
496
+ return cls(
497
+ violating_policy=data.get("violating_policy", ""),
498
+ explanation=data.get("explanation", "")
499
+ )
500
+
501
+ def to_dict(self) -> Dict[str, Any]:
502
+ result = {
503
+ "violating_policy": self.violating_policy,
504
+ "explanation": self.explanation
505
+ }
506
+ result.update(self._extra_fields)
507
+ return result
508
+
509
+
510
+ @dataclass
511
+ class BiasDetail(BaseDTO):
512
+ bias_detected: bool = False
513
+ debiased_text: str = ""
514
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
515
+
516
+ @classmethod
517
+ def from_dict(cls, data: Dict[str, Any]) -> "BiasDetail":
518
+ return cls(
519
+ bias_detected=data.get("bias_detected", False),
520
+ debiased_text=data.get("debiased_text", "")
521
+ )
522
+
523
+ def to_dict(self) -> Dict[str, Any]:
524
+ result = {
525
+ "bias_detected": self.bias_detected,
526
+ "debiased_text": self.debiased_text
527
+ }
528
+ result.update(self._extra_fields)
529
+ return result
530
+
531
+
532
+ @dataclass
533
+ class CopyrightIPDetail(BaseDTO):
534
+ similarity_score: float = 0.0
535
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
536
+
537
+ @classmethod
538
+ def from_dict(cls, data: Dict[str, Any]) -> "CopyrightIPDetail":
539
+ return cls(
540
+ similarity_score=float(data.get("similarity_score", 0.0))
541
+ )
542
+
543
+ def to_dict(self) -> Dict[str, Any]:
544
+ result = {
545
+ "similarity_score": self.similarity_score
546
+ }
547
+ result.update(self._extra_fields)
548
+ return result
549
+
550
+
551
+ @dataclass
552
+ class SystemPromptDetail(BaseDTO):
553
+ similarity_score: float = 0.0
554
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
555
+
556
+ @classmethod
557
+ def from_dict(cls, data: Dict[str, Any]) -> "SystemPromptDetail":
558
+ return cls(
559
+ similarity_score=float(data.get("similarity_score", 0.0))
560
+ )
561
+
562
+ def to_dict(self) -> Dict[str, Any]:
563
+ result = {
564
+ "similarity_score": self.similarity_score
565
+ }
566
+ result.update(self._extra_fields)
567
+ return result
568
+
569
+
570
+ @dataclass
571
+ class DetectResponseSummary(BaseDTO):
572
+ on_topic: int = 0
573
+ nsfw: int = 0
574
+ toxicity: List[str] = field(default_factory=list)
575
+ pii: int = 0
576
+ injection_attack: int = 0
577
+ keyword_detected: int = 0
578
+ policy_violation: int = 0
579
+ bias: int = 0
580
+ copyright_ip_similarity: int = 0
581
+ system_prompt_similarity: int = 0
582
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
583
+
584
+ @classmethod
585
+ def from_dict(cls, data: Dict[str, Any]) -> "DetectResponseSummary":
586
+ return cls(
587
+ on_topic=data.get("on_topic", 0),
588
+ nsfw=data.get("nsfw", 0),
589
+ toxicity=data.get("toxicity", []),
590
+ pii=data.get("pii", 0),
591
+ injection_attack=data.get("injection_attack", 0),
592
+ keyword_detected=data.get("keyword_detected", 0),
593
+ policy_violation=data.get("policy_violation", 0),
594
+ bias=data.get("bias", 0),
595
+ copyright_ip_similarity=data.get("copyright_ip_similarity", 0),
596
+ system_prompt_similarity=data.get("system_prompt_similarity", 0)
597
+ )
598
+
599
+ def to_dict(self) -> Dict[str, Any]:
600
+ result = {
601
+ "on_topic": self.on_topic,
602
+ "nsfw": self.nsfw,
603
+ "toxicity": self.toxicity,
604
+ "pii": self.pii,
605
+ "injection_attack": self.injection_attack,
606
+ "keyword_detected": self.keyword_detected,
607
+ "policy_violation": self.policy_violation,
608
+ "bias": self.bias,
609
+ "copyright_ip_similarity": self.copyright_ip_similarity,
610
+ "system_prompt_similarity": self.system_prompt_similarity
611
+ }
612
+ result.update(self._extra_fields)
613
+ return result
614
+
615
+
616
+ @dataclass
617
+ class DetectResponseDetails(BaseDTO):
618
+ topic_detector: TopicDetectorDetail = field(default_factory=TopicDetectorDetail)
619
+ nsfw: NSFWDetail = field(default_factory=NSFWDetail)
620
+ toxicity: ToxicityDetail = field(default_factory=ToxicityDetail)
621
+ pii: PIIDetail = field(default_factory=PIIDetail)
622
+ injection_attack: InjectionAttackDetail = field(default_factory=InjectionAttackDetail)
623
+ keyword_detector: KeywordDetectorDetail = field(default_factory=KeywordDetectorDetail)
624
+ policy_violation: PolicyViolationDetail = field(default_factory=PolicyViolationDetail)
625
+ bias: BiasDetail = field(default_factory=BiasDetail)
626
+ copyright_ip: CopyrightIPDetail = field(default_factory=CopyrightIPDetail)
627
+ system_prompt: SystemPromptDetail = field(default_factory=SystemPromptDetail)
628
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
629
+
630
+ @classmethod
631
+ def from_dict(cls, data: Dict[str, Any]) -> "DetectResponseDetails":
632
+ return cls(
633
+ topic_detector=TopicDetectorDetail.from_dict(data.get("topic_detector", {})),
634
+ nsfw=NSFWDetail.from_dict(data.get("nsfw", {})),
635
+ toxicity=ToxicityDetail.from_dict(data.get("toxicity", {})),
636
+ pii=PIIDetail.from_dict(data.get("pii", {})),
637
+ injection_attack=InjectionAttackDetail.from_dict(data.get("injection_attack", {})),
638
+ keyword_detector=KeywordDetectorDetail.from_dict(data.get("keyword_detector", {})),
639
+ policy_violation=PolicyViolationDetail.from_dict(data.get("policy_violation", {})),
640
+ bias=BiasDetail.from_dict(data.get("bias", {})),
641
+ copyright_ip=CopyrightIPDetail.from_dict(data.get("copyright_ip", {})),
642
+ system_prompt=SystemPromptDetail.from_dict(data.get("system_prompt", {}))
643
+ )
644
+
645
+ def to_dict(self) -> Dict[str, Any]:
646
+ result = {
647
+ "topic_detector": self.topic_detector.to_dict(),
648
+ "nsfw": self.nsfw.to_dict(),
649
+ "toxicity": self.toxicity.to_dict(),
650
+ "pii": self.pii.to_dict(),
651
+ "injection_attack": self.injection_attack.to_dict(),
652
+ "keyword_detector": self.keyword_detector.to_dict(),
653
+ "policy_violation": self.policy_violation.to_dict(),
654
+ "bias": self.bias.to_dict(),
655
+ "copyright_ip": self.copyright_ip.to_dict(),
656
+ "system_prompt": self.system_prompt.to_dict()
657
+ }
658
+ result.update(self._extra_fields)
659
+ return result
660
+
661
+
662
+ @dataclass
663
+ class GuardrailsDetectResponse(BaseDTO):
664
+ summary: DetectResponseSummary
665
+ details: DetectResponseDetails
666
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
667
+
668
+ @classmethod
669
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsDetectResponse":
670
+ summary_data = data.get("summary", {})
671
+ details_data = data.get("details", {})
672
+
673
+ return cls(
674
+ summary=DetectResponseSummary.from_dict(summary_data),
675
+ details=DetectResponseDetails.from_dict(details_data)
676
+ )
677
+
678
+ def to_dict(self) -> Dict[str, Any]:
679
+ result = {
680
+ "summary": self.summary.to_dict(),
681
+ "details": self.details.to_dict()
682
+ }
683
+ result.update(self._extra_fields)
684
+ return result
685
+
686
+ def has_violations(self) -> bool:
687
+ """
688
+ Check if any detectors found violations in the content.
689
+
690
+ Returns:
691
+ bool: True if any detector reported a violation (score > 0), False otherwise
692
+ """
693
+ summary = self.summary.to_dict()
694
+ for key, value in summary.items():
695
+ if key == "toxicity" and isinstance(value, list) and len(value) > 0:
696
+ return True
697
+ elif isinstance(value, (int, float)) and value > 0:
698
+ return True
699
+ return False
700
+
701
+ def get_violations(self) -> list[str]:
702
+ """
703
+ Get a list of detector names that found violations.
704
+
705
+ Returns:
706
+ list[str]: Names of detectors that reported violations
707
+ """
708
+ summary = self.summary.to_dict()
709
+ violations = []
710
+ for detector, value in summary.items():
711
+ if detector == "toxicity" and isinstance(value, list) and len(value) > 0:
712
+ violations.append(detector)
713
+ elif isinstance(value, (int, float)) and value > 0:
714
+ violations.append(detector)
715
+ return violations
716
+
717
+ def is_safe(self) -> bool:
718
+ """
719
+ Check if the content is safe (no violations detected).
720
+
721
+ Returns:
722
+ bool: True if no violations were detected, False otherwise
723
+ """
724
+ return not self.has_violations()
725
+
726
+ def is_attack(self) -> bool:
727
+ """
728
+ Check if the content is attacked (violations detected).
729
+
730
+ Returns:
731
+ bool: True if violations were detected, False otherwise
732
+ """
733
+ return self.has_violations()
734
+
735
+ def __str__(self) -> str:
736
+ """
737
+ String representation of the response.
738
+
739
+ Returns:
740
+ str: A formatted string showing summary and violation status
741
+ """
742
+ violations = self.get_violations()
743
+ status = "UNSAFE" if violations else "SAFE"
744
+
745
+ if violations:
746
+ violation_str = f"Violations detected: {', '.join(violations)}"
747
+ else:
748
+ violation_str = "No violations detected"
749
+
750
+ return f"Response Status: {status}\n{violation_str}"
751
+
752
+
753
+ # -------------------------------------
754
+ # Guardrails PII
755
+ # -------------------------------------
756
+
757
+
758
+ @dataclass
759
+ class GuardrailsPIIRequest(BaseDTO):
760
+ text: str
761
+ # mode: GuardrailsPIIModes = GuardrailsPIIModes.REQUEST
762
+ mode: str = "request"
763
+ key: str = ""
764
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
765
+
766
+ @classmethod
767
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsPIIRequest":
768
+ return cls(
769
+ text=data.get("text", ""),
770
+ # mode=data.get("mode", GuardrailsPIIModes.REQUEST),
771
+ mode=data.get("mode", "request"),
772
+ key=data.get("key", "")
773
+ )
774
+
775
+ def to_dict(self) -> Dict[str, Any]:
776
+ return {
777
+ "text": self.text,
778
+ "mode": self.mode,
779
+ "key": self.key
780
+ }
781
+
782
+
783
+ @dataclass
784
+ class GuardrailsPIIResponse(BaseDTO):
785
+ text: str
786
+ key: str = ""
787
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
788
+
789
+ @classmethod
790
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsPIIResponse":
791
+ return cls(
792
+ text=data.get("text", ""),
793
+ key=data.get("key", "")
794
+ )
795
+
796
+ def to_dict(self) -> Dict[str, Any]:
797
+ return {
798
+ "text": self.text,
799
+ "key": self.key
800
+ }
801
+
802
+
803
+ # -------------------------------------
804
+ # Guardrails Hallucination
805
+ # -------------------------------------
806
+
807
+ @dataclass
808
+ class GuardrailsHallucinationRequest(BaseDTO):
809
+ request_text: str
810
+ response_text: str
811
+ context: str = ""
812
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
813
+
814
+ @classmethod
815
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsHallucinationRequest":
816
+ return cls(
817
+ request_text=data.get("request_text", ""),
818
+ response_text=data.get("response_text", ""),
819
+ context=data.get("context", "")
820
+ )
821
+
822
+ def to_dict(self) -> Dict[str, Any]:
823
+ return {
824
+ "request_text": self.request_text,
825
+ "response_text": self.response_text,
826
+ "context": self.context
827
+ }
828
+
829
+
830
+ @dataclass
831
+ class HallucinationSummary(BaseDTO):
832
+ is_hallucination: int
833
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
834
+
835
+ @classmethod
836
+ def from_dict(cls, data: Dict[str, Any]) -> "HallucinationSummary":
837
+ return cls(
838
+ is_hallucination=data.get("is_hallucination", 0)
839
+ )
840
+
841
+ def to_dict(self) -> Dict[str, Any]:
842
+ return {
843
+ "is_hallucination": self.is_hallucination
844
+ }
845
+
846
+
847
+ @dataclass
848
+ class HallucinationDetails(BaseDTO):
849
+ prompt_based: float
850
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
851
+
852
+ @classmethod
853
+ def from_dict(cls, data: Dict[str, Any]) -> "HallucinationDetails":
854
+ return cls(
855
+ prompt_based=float(data.get("prompt_based", 0.0))
856
+ )
857
+
858
+ def to_dict(self) -> Dict[str, Any]:
859
+ return {
860
+ "prompt_based": self.prompt_based
861
+ }
862
+
863
+
864
+ @dataclass
865
+ class GuardrailsHallucinationResponse(BaseDTO):
866
+ summary: HallucinationSummary
867
+ details: HallucinationDetails
868
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
869
+
870
+ @classmethod
871
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsHallucinationResponse":
872
+ summary_data = data.get("summary", {})
873
+ details_data = data.get("details", {})
874
+
875
+ return cls(
876
+ summary=HallucinationSummary.from_dict(summary_data),
877
+ details=HallucinationDetails.from_dict(details_data)
878
+ )
879
+
880
+ def to_dict(self) -> Dict[str, Any]:
881
+ return {
882
+ "summary": self.summary.to_dict(),
883
+ "details": self.details.to_dict()
884
+ }
885
+
886
+
887
+ # -------------------------------------
888
+ # Guardrails Adherence
889
+ # -------------------------------------
890
+
891
+
892
+ @dataclass
893
+ class GuardrailsAdherenceRequest(BaseDTO):
894
+ llm_answer: str
895
+ context: str
896
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
897
+
898
+ @classmethod
899
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsAdherenceRequest":
900
+ return cls(
901
+ llm_answer=data.get("llm_answer", ""),
902
+ context=data.get("context", "")
903
+ )
904
+
905
+ def to_dict(self) -> Dict[str, Any]:
906
+ return {
907
+ "llm_answer": self.llm_answer,
908
+ "context": self.context
909
+ }
910
+
911
+
912
+ @dataclass
913
+ class AdherenceSummary(BaseDTO):
914
+ adherence_score: float
915
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
916
+
917
+ @classmethod
918
+ def from_dict(cls, data: Dict[str, Any]) -> "AdherenceSummary":
919
+ return cls(
920
+ adherence_score=float(data.get("adherence_score", 0.0))
921
+ )
922
+
923
+ def to_dict(self) -> Dict[str, Any]:
924
+ return {
925
+ "adherence_score": self.adherence_score
926
+ }
927
+
928
+
929
+ @dataclass
930
+ class AdherenceDetails(BaseDTO):
931
+ atomic_facts: List[str] = field(default_factory=list)
932
+ adherence_list: List[int] = field(default_factory=list)
933
+ adherence_response: str = ""
934
+ adherence_latency: float = 0.0
935
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
936
+
937
+ @classmethod
938
+ def from_dict(cls, data: Dict[str, Any]) -> "AdherenceDetails":
939
+ return cls(
940
+ atomic_facts=data.get("atomic_facts", []),
941
+ adherence_list=data.get("adherence_list", []),
942
+ adherence_response=data.get("adherence_response", ""),
943
+ adherence_latency=float(data.get("adherence_latency", 0.0))
944
+ )
945
+
946
+ def to_dict(self) -> Dict[str, Any]:
947
+ return {
948
+ "atomic_facts": self.atomic_facts,
949
+ "adherence_list": self.adherence_list,
950
+ "adherence_response": self.adherence_response,
951
+ "adherence_latency": self.adherence_latency
952
+ }
953
+
954
+
955
+ @dataclass
956
+ class GuardrailsAdherenceResponse(BaseDTO):
957
+ summary: AdherenceSummary
958
+ details: AdherenceDetails
959
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
960
+
961
+ @classmethod
962
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsAdherenceResponse":
963
+ summary_data = data.get("summary", {})
964
+ details_data = data.get("details", {})
965
+
966
+ return cls(
967
+ summary=AdherenceSummary.from_dict(summary_data),
968
+ details=AdherenceDetails.from_dict(details_data)
969
+ )
970
+
971
+ def to_dict(self) -> Dict[str, Any]:
972
+ return {
973
+ "summary": self.summary.to_dict(),
974
+ "details": self.details.to_dict()
975
+ }
976
+
977
+
978
+ # -------------------------------------
979
+ # Guardrails Relevancy
980
+ # -------------------------------------
981
+
982
+ @dataclass
983
+ class GuardrailsRelevancyRequest(BaseDTO):
984
+ question: str
985
+ llm_answer: str
986
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
987
+
988
+ @classmethod
989
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsRelevancyRequest":
990
+ return cls(
991
+ question=data.get("question", ""),
992
+ llm_answer=data.get("llm_answer", "")
993
+ )
994
+
995
+ def to_dict(self) -> Dict[str, Any]:
996
+ return {
997
+ "question": self.question,
998
+ "llm_answer": self.llm_answer
999
+ }
1000
+
1001
+
1002
+ @dataclass
1003
+ class RelevancySummary(BaseDTO):
1004
+ relevancy_score: float
1005
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
1006
+
1007
+ @classmethod
1008
+ def from_dict(cls, data: Dict[str, Any]) -> "RelevancySummary":
1009
+ return cls(
1010
+ relevancy_score=float(data.get("relevancy_score", 0.0))
1011
+ )
1012
+
1013
+ def to_dict(self) -> Dict[str, Any]:
1014
+ return {
1015
+ "relevancy_score": self.relevancy_score
1016
+ }
1017
+
1018
+
1019
+ @dataclass
1020
+ class RelevancyDetails(BaseDTO):
1021
+ atomic_facts: List[str] = field(default_factory=list)
1022
+ relevancy_list: List[int] = field(default_factory=list)
1023
+ relevancy_response: str = ""
1024
+ relevancy_latency: float = 0.0
1025
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
1026
+
1027
+ @classmethod
1028
+ def from_dict(cls, data: Dict[str, Any]) -> "RelevancyDetails":
1029
+ return cls(
1030
+ atomic_facts=data.get("atomic_facts", []),
1031
+ relevancy_list=data.get("relevancy_list", []),
1032
+ relevancy_response=data.get("relevancy_response", ""),
1033
+ relevancy_latency=float(data.get("relevancy_latency", 0.0))
1034
+ )
1035
+
1036
+ def to_dict(self) -> Dict[str, Any]:
1037
+ return {
1038
+ "atomic_facts": self.atomic_facts,
1039
+ "relevancy_list": self.relevancy_list,
1040
+ "relevancy_response": self.relevancy_response,
1041
+ "relevancy_latency": self.relevancy_latency
1042
+ }
1043
+
1044
+
1045
+ @dataclass
1046
+ class GuardrailsRelevancyResponse(BaseDTO):
1047
+ summary: RelevancySummary
1048
+ details: RelevancyDetails
1049
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
1050
+
1051
+ @classmethod
1052
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsRelevancyResponse":
1053
+ summary_data = data.get("summary", {})
1054
+ details_data = data.get("details", {})
1055
+
1056
+ return cls(
1057
+ summary=RelevancySummary.from_dict(summary_data),
1058
+ details=RelevancyDetails.from_dict(details_data)
1059
+ )
1060
+
1061
+ def to_dict(self) -> Dict[str, Any]:
1062
+ return {
1063
+ "summary": self.summary.to_dict(),
1064
+ "details": self.details.to_dict()
1065
+ }
1066
+
1067
+
1068
+ # -------------------------------------
1069
+ # Guardrails Policy Request
1070
+ # -------------------------------------
1071
+
1072
+
1073
+ @dataclass
1074
+ class GuardrailsPolicyRequest(BaseDTO):
1075
+ name: str
1076
+ detectors: GuardrailDetectors = field(default_factory=GuardrailDetectors)
1077
+ description: str = ""
1078
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
1079
+
1080
+ @classmethod
1081
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsPolicyRequest":
1082
+ detectors_data = data.get("detectors", {})
1083
+ return cls(
1084
+ name=data.get("name", ""),
1085
+ detectors=GuardrailDetectors.from_dict(detectors_data),
1086
+ description=data.get("description", "")
1087
+ )
1088
+
1089
+ def to_dict(self) -> Dict[str, Any]:
1090
+ return {
1091
+ "name": self.name,
1092
+ "detectors": self.detectors.to_dict(),
1093
+ "description": self.description
1094
+ }
1095
+
1096
+
1097
+ # -------------------------------------
1098
+ # Guardrails Policy Response
1099
+ # -------------------------------------
1100
+
1101
+
1102
+ @dataclass
1103
+ class GuardrailsPolicyData(BaseDTO):
1104
+ created_at: str
1105
+ name: str
1106
+ updated_at: str
1107
+ description: str
1108
+ policy_id: int
1109
+ project_name: str = ""
1110
+ is_sample: bool = False
1111
+ detectors: GuardrailDetectors = field(default_factory=GuardrailDetectors)
1112
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
1113
+
1114
+ @classmethod
1115
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsPolicyData":
1116
+ detectors_data = data.get("detectors", {})
1117
+ return cls(
1118
+ created_at=data.get("created_at", ""),
1119
+ name=data.get("name", ""),
1120
+ updated_at=data.get("updated_at", ""),
1121
+ description=data.get("description", ""),
1122
+ policy_id=data.get("policy_id", 0),
1123
+ project_name=data.get("project_name", ""),
1124
+ detectors=GuardrailDetectors.from_dict(detectors_data)
1125
+ )
1126
+
1127
+ def to_dict(self) -> Dict[str, Any]:
1128
+ result = {
1129
+ "created_at": self.created_at,
1130
+ "name": self.name,
1131
+ "updated_at": self.updated_at,
1132
+ "description": self.description,
1133
+ "policy_id": self.policy_id,
1134
+ "project_name": self.project_name,
1135
+ "detectors": self.detectors.to_dict(),
1136
+ }
1137
+ result.update(self._extra_fields)
1138
+ return result
1139
+
1140
+
1141
+ @dataclass
1142
+ class GuardrailsaPolicyResponse(BaseDTO):
1143
+ message: str
1144
+ data: GuardrailsPolicyData
1145
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
1146
+
1147
+ @classmethod
1148
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsaPolicyResponse":
1149
+ policy_data = data.get("data", {})
1150
+ return cls(
1151
+ message=data.get("message", ""),
1152
+ data=GuardrailsPolicyData.from_dict(policy_data)
1153
+ )
1154
+
1155
+ def to_dict(self) -> Dict[str, Any]:
1156
+ result = {
1157
+ "message": self.message,
1158
+ "data": self.data.to_dict()
1159
+ }
1160
+ result.update(self._extra_fields)
1161
+ return result
1162
+
1163
+
1164
+ @dataclass
1165
+ class GuardrailsDeletePolicyData(BaseDTO):
1166
+ policy_id: int
1167
+ project_name: str = ""
1168
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
1169
+
1170
+ @classmethod
1171
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsDeletePolicyData":
1172
+ return cls(
1173
+ policy_id=data.get("policy_id", 0),
1174
+ project_name=data.get("project_name", "")
1175
+ )
1176
+
1177
+ def to_dict(self) -> Dict[str, Any]:
1178
+ result = {
1179
+ "policy_id": self.policy_id,
1180
+ "project_name": self.project
1181
+ }
1182
+ result.update(self._extra_fields)
1183
+ return result
1184
+
1185
+
1186
+ @dataclass
1187
+ class GuardrailsDeletePolicyResponse(BaseDTO):
1188
+ message: str
1189
+ data: GuardrailsDeletePolicyData
1190
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
1191
+
1192
+ @classmethod
1193
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsDeletePolicyResponse":
1194
+ policy_data = data.get("data", {})
1195
+ return cls(
1196
+ message=data.get("message", ""),
1197
+ data=GuardrailsDeletePolicyData.from_dict(policy_data)
1198
+ )
1199
+
1200
+ def to_dict(self) -> Dict[str, Any]:
1201
+ result = {
1202
+ "message": self.message,
1203
+ "data": self.data.to_dict()
1204
+ }
1205
+ result.update(self._extra_fields)
1206
+ return result
1207
+
1208
+
1209
+ @dataclass
1210
+ class GuardrailsPolicyListItem(BaseDTO):
1211
+ policy_id: str
1212
+ name: str
1213
+ description: str
1214
+ created_at: str
1215
+ updated_at: str
1216
+ project_name: str = "default"
1217
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
1218
+
1219
+ @classmethod
1220
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsPolicyListItem":
1221
+ return cls(
1222
+ policy_id=data.get("policy_id", ""),
1223
+ name=data.get("name", ""),
1224
+ description=data.get("description", ""),
1225
+ created_at=data.get("created_at", ""),
1226
+ updated_at=data.get("updated_at", ""),
1227
+ project_name=data.get("project_name", "default")
1228
+ )
1229
+
1230
+ def to_dict(self) -> Dict[str, Any]:
1231
+ result = {
1232
+ "policy_id": self.policy_id,
1233
+ "name": self.name,
1234
+ "description": self.description,
1235
+ "created_at": self.created_at,
1236
+ "updated_at": self.updated_at,
1237
+ "project_name": self.project_name
1238
+ }
1239
+ result.update(self._extra_fields)
1240
+ return result
1241
+
1242
+
1243
+ @dataclass
1244
+ class GuardrailsListPoliciesResponse(BaseDTO):
1245
+ policies: List[GuardrailsPolicyListItem] = field(default_factory=list)
1246
+ _extra_fields: Dict[str, Any] = field(default_factory=dict)
1247
+
1248
+ @classmethod
1249
+ def from_dict(cls, data: Dict[str, Any]) -> "GuardrailsListPoliciesResponse":
1250
+ policies_data = data.get("policies", [])
1251
+ return cls(
1252
+ policies=[GuardrailsPolicyListItem.from_dict(policy) for policy in policies_data]
1253
+ )
1254
+
1255
+ def to_dict(self) -> Dict[str, Any]:
1256
+ result = {
1257
+ "policies": [policy.to_dict() for policy in self.policies]
1258
+ }
1259
+ result.update(self._extra_fields)
1260
+ return result
1261
+