enkryptai-sdk 0.1.6__py3-none-any.whl → 1.0.0__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/__init__.py +16 -4
- enkryptai_sdk/ai_proxy.py +70 -0
- enkryptai_sdk/base.py +36 -0
- enkryptai_sdk/datasets.py +148 -0
- enkryptai_sdk/deployments.py +121 -0
- enkryptai_sdk/dto/__init__.py +65 -0
- enkryptai_sdk/dto/ai_proxy.py +325 -0
- enkryptai_sdk/dto/base.py +70 -0
- enkryptai_sdk/dto/datasets.py +152 -0
- enkryptai_sdk/dto/deployments.py +334 -0
- enkryptai_sdk/dto/guardrails.py +1261 -0
- enkryptai_sdk/dto/models.py +199 -46
- enkryptai_sdk/dto/red_team.py +303 -61
- enkryptai_sdk/guardrails.py +219 -70
- enkryptai_sdk/guardrails_old.py +195 -0
- enkryptai_sdk/models.py +118 -52
- enkryptai_sdk/red_team.py +272 -73
- enkryptai_sdk-1.0.0.dist-info/METADATA +1312 -0
- enkryptai_sdk-1.0.0.dist-info/RECORD +25 -0
- {enkryptai_sdk-0.1.6.dist-info → enkryptai_sdk-1.0.0.dist-info}/WHEEL +1 -1
- enkryptai_sdk-0.1.6.dist-info/METADATA +0 -301
- enkryptai_sdk-0.1.6.dist-info/RECORD +0 -15
- {enkryptai_sdk-0.1.6.dist-info → enkryptai_sdk-1.0.0.dist-info/licenses}/LICENSE +0 -0
- {enkryptai_sdk-0.1.6.dist-info → enkryptai_sdk-1.0.0.dist-info}/top_level.txt +0 -0
|
@@ -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
|
+
|