pangea-sdk 6.2.0b2__py3-none-any.whl → 6.3.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.
- pangea/__init__.py +1 -1
- pangea/asyncio/request.py +25 -154
- pangea/asyncio/services/__init__.py +0 -1
- pangea/asyncio/services/ai_guard.py +9 -101
- pangea/asyncio/services/audit.py +1 -301
- pangea/asyncio/services/authn.py +7 -9
- pangea/asyncio/services/authz.py +45 -11
- pangea/asyncio/services/intel.py +20 -26
- pangea/asyncio/services/prompt_guard.py +2 -112
- pangea/asyncio/services/redact.py +4 -265
- pangea/asyncio/services/vault.py +52 -40
- pangea/request.py +30 -167
- pangea/response.py +6 -6
- pangea/services/__init__.py +0 -1
- pangea/services/ai_guard.py +20 -490
- pangea/services/audit/audit.py +2 -301
- pangea/services/audit/models.py +65 -307
- pangea/services/authn/authn.py +6 -8
- pangea/services/authn/models.py +183 -151
- pangea/services/authz.py +101 -57
- pangea/services/base.py +2 -3
- pangea/services/intel.py +32 -19
- pangea/services/prompt_guard.py +2 -193
- pangea/services/redact.py +7 -473
- pangea/services/vault/models/common.py +11 -12
- pangea/services/vault/models/keys.py +4 -9
- pangea/services/vault/models/secret.py +3 -8
- pangea/services/vault/vault.py +52 -40
- {pangea_sdk-6.2.0b2.dist-info → pangea_sdk-6.3.0.dist-info}/METADATA +34 -15
- pangea_sdk-6.3.0.dist-info/RECORD +60 -0
- pangea/asyncio/services/management.py +0 -576
- pangea/services/management.py +0 -720
- pangea_sdk-6.2.0b2.dist-info/RECORD +0 -62
- {pangea_sdk-6.2.0b2.dist-info → pangea_sdk-6.3.0.dist-info}/WHEEL +0 -0
pangea/services/authz.py
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
# Copyright 2022 Pangea Cyber Corporation
|
2
2
|
# Author: Pangea Cyber Corporation
|
3
3
|
|
4
|
-
# TODO: Use `list` instead of `List`.
|
5
|
-
# ruff: noqa: UP006, UP035
|
6
|
-
|
7
4
|
from __future__ import annotations
|
8
5
|
|
9
6
|
import enum
|
10
|
-
from
|
7
|
+
from collections.abc import Mapping, Sequence
|
8
|
+
from typing import Annotated, Any, Optional, Union
|
9
|
+
|
10
|
+
from pydantic import Field
|
11
11
|
|
12
12
|
from pangea.config import PangeaConfig
|
13
|
-
from pangea.response import APIRequestModel, APIResponseModel, PangeaResponse, PangeaResponseResult
|
13
|
+
from pangea.response import APIRequestModel, APIResponseModel, PangeaDateTime, PangeaResponse, PangeaResponseResult
|
14
14
|
from pangea.services.base import ServiceBase
|
15
15
|
|
16
16
|
|
@@ -47,20 +47,18 @@ class Resource(PangeaResponseResult):
|
|
47
47
|
|
48
48
|
class Subject(PangeaResponseResult):
|
49
49
|
type: str
|
50
|
-
id:
|
51
|
-
action: Optional[str] = None
|
50
|
+
id: Annotated[str, Field(pattern="^([a-zA-Z0-9_][a-zA-Z0-9/|_.@-]*)$")]
|
51
|
+
action: Annotated[Optional[str], Field(pattern="^([a-zA-Z0-9_][a-zA-Z0-9/|_]*)$")] = None
|
52
52
|
|
53
53
|
|
54
54
|
class Tuple(PangeaResponseResult):
|
55
55
|
resource: Resource
|
56
|
-
relation: str
|
56
|
+
relation: Annotated[str, Field(pattern="^([a-zA-Z0-9_][a-zA-Z0-9/|_]*)$")]
|
57
57
|
subject: Subject
|
58
|
-
expires_at: Optional[
|
58
|
+
expires_at: Optional[PangeaDateTime] = None
|
59
59
|
"""A time in ISO-8601 format"""
|
60
|
-
|
61
|
-
|
62
|
-
class TupleCreateRequest(APIRequestModel):
|
63
|
-
tuples: List[Tuple]
|
60
|
+
attributes: Optional[dict[str, Any]] = None
|
61
|
+
"""A JSON object of attribute data."""
|
64
62
|
|
65
63
|
|
66
64
|
class TupleCreateResult(PangeaResponseResult):
|
@@ -70,54 +68,54 @@ class TupleCreateResult(PangeaResponseResult):
|
|
70
68
|
class TupleListFilter(APIRequestModel):
|
71
69
|
resource_type: Optional[str] = None
|
72
70
|
"""Only records where resource type equals this value."""
|
73
|
-
resource_type__contains: Optional[
|
71
|
+
resource_type__contains: Optional[list[str]] = None
|
74
72
|
"""Only records where resource type includes each substring."""
|
75
|
-
resource_type__in: Optional[
|
73
|
+
resource_type__in: Optional[list[str]] = None
|
76
74
|
"""Only records where resource type equals one of the provided substrings."""
|
77
75
|
resource_id: Optional[str] = None
|
78
76
|
"""Only records where resource id equals this value."""
|
79
|
-
resource_id__contains: Optional[
|
77
|
+
resource_id__contains: Optional[list[str]] = None
|
80
78
|
"""Only records where resource id includes each substring."""
|
81
|
-
resource_id__in: Optional[
|
79
|
+
resource_id__in: Optional[list[str]] = None
|
82
80
|
"""Only records where resource id equals one of the provided substrings."""
|
83
81
|
relation: Optional[str] = None
|
84
82
|
"""Only records where relation equals this value."""
|
85
|
-
relation__contains: Optional[
|
83
|
+
relation__contains: Optional[list[str]] = None
|
86
84
|
"""Only records where relation includes each substring."""
|
87
|
-
relation__in: Optional[
|
85
|
+
relation__in: Optional[list[str]] = None
|
88
86
|
"""Only records where relation equals one of the provided substrings."""
|
89
87
|
subject_type: Optional[str] = None
|
90
88
|
"""Only records where subject type equals this value."""
|
91
|
-
subject_type__contains: Optional[
|
89
|
+
subject_type__contains: Optional[list[str]] = None
|
92
90
|
"""Only records where subject type includes each substring."""
|
93
|
-
subject_type__in: Optional[
|
91
|
+
subject_type__in: Optional[list[str]] = None
|
94
92
|
"""Only records where subject type equals one of the provided substrings."""
|
95
93
|
subject_id: Optional[str] = None
|
96
94
|
"""Only records where subject id equals this value."""
|
97
|
-
subject_id__contains: Optional[
|
95
|
+
subject_id__contains: Optional[list[str]] = None
|
98
96
|
"""Only records where subject id includes each substring."""
|
99
|
-
subject_id__in: Optional[
|
97
|
+
subject_id__in: Optional[list[str]] = None
|
100
98
|
"""Only records where subject id equals one of the provided substrings."""
|
101
99
|
subject_action: Optional[str] = None
|
102
100
|
"""Only records where subject action equals this value."""
|
103
|
-
subject_action__contains: Optional[
|
101
|
+
subject_action__contains: Optional[list[str]] = None
|
104
102
|
"""Only records where subject action includes each substring."""
|
105
|
-
subject_action__in: Optional[
|
103
|
+
subject_action__in: Optional[list[str]] = None
|
106
104
|
"""Only records where subject action equals one of the provided substrings."""
|
107
|
-
expires_at: Optional[
|
105
|
+
expires_at: Optional[PangeaDateTime] = None
|
108
106
|
"""Only records where expires_at equals this value."""
|
109
|
-
expires_at__gt: Optional[
|
107
|
+
expires_at__gt: Optional[PangeaDateTime] = None
|
110
108
|
"""Only records where expires_at is greater than this value."""
|
111
|
-
expires_at__gte: Optional[
|
109
|
+
expires_at__gte: Optional[PangeaDateTime] = None
|
112
110
|
"""Only records where expires_at is greater than or equal to this value."""
|
113
|
-
expires_at__lt: Optional[
|
111
|
+
expires_at__lt: Optional[PangeaDateTime] = None
|
114
112
|
"""Only records where expires_at is less than this value."""
|
115
|
-
expires_at__lte: Optional[
|
113
|
+
expires_at__lte: Optional[PangeaDateTime] = None
|
116
114
|
"""Only records where expires_at is less than or equal to this value."""
|
117
115
|
|
118
116
|
|
119
117
|
class TupleListRequest(APIRequestModel):
|
120
|
-
filter: Optional[Union[
|
118
|
+
filter: Optional[Union[dict, TupleListFilter]] = None
|
121
119
|
size: Optional[int] = None
|
122
120
|
last: Optional[str] = None
|
123
121
|
order: Optional[ItemOrder] = None
|
@@ -125,37 +123,27 @@ class TupleListRequest(APIRequestModel):
|
|
125
123
|
|
126
124
|
|
127
125
|
class TupleListResult(PangeaResponseResult):
|
128
|
-
tuples:
|
126
|
+
tuples: list[Tuple]
|
129
127
|
last: str
|
130
128
|
count: int
|
131
129
|
|
132
130
|
|
133
131
|
class TupleDeleteRequest(APIRequestModel):
|
134
|
-
tuples:
|
132
|
+
tuples: list[Tuple]
|
135
133
|
|
136
134
|
|
137
135
|
class TupleDeleteResult(PangeaResponseResult):
|
138
136
|
pass
|
139
137
|
|
140
138
|
|
141
|
-
class CheckRequest(APIRequestModel):
|
142
|
-
resource: Resource
|
143
|
-
action: str
|
144
|
-
subject: Subject
|
145
|
-
debug: Optional[bool] = None
|
146
|
-
"""In the event of an allowed check, return a path that granted access."""
|
147
|
-
attributes: Optional[Dict[str, Any]] = None
|
148
|
-
"""A JSON object of attribute data."""
|
149
|
-
|
150
|
-
|
151
139
|
class DebugPath(APIResponseModel):
|
152
|
-
type: str
|
153
|
-
id: str
|
140
|
+
type: Optional[str] = None
|
141
|
+
id: Optional[str] = None
|
154
142
|
action: Optional[str] = None
|
155
143
|
|
156
144
|
|
157
145
|
class Debug(APIResponseModel):
|
158
|
-
path:
|
146
|
+
path: list[DebugPath]
|
159
147
|
|
160
148
|
|
161
149
|
class CheckResult(PangeaResponseResult):
|
@@ -166,27 +154,47 @@ class CheckResult(PangeaResponseResult):
|
|
166
154
|
debug: Optional[Debug] = None
|
167
155
|
|
168
156
|
|
157
|
+
class BulkCheckRequestItem(APIRequestModel):
|
158
|
+
resource: Resource
|
159
|
+
action: Annotated[str, Field(pattern="^([a-zA-Z0-9_][a-zA-Z0-9/|_]*)$")]
|
160
|
+
subject: Subject
|
161
|
+
|
162
|
+
|
163
|
+
class BulkCheckItemResult(APIResponseModel):
|
164
|
+
checked: str
|
165
|
+
allowed: bool
|
166
|
+
depth: int
|
167
|
+
debug: Optional[Debug] = None
|
168
|
+
|
169
|
+
|
170
|
+
class BulkCheckResult(PangeaResponseResult):
|
171
|
+
schema_id: str
|
172
|
+
schema_version: int
|
173
|
+
allowed: bool
|
174
|
+
results: list[BulkCheckItemResult]
|
175
|
+
|
176
|
+
|
169
177
|
class ListResourcesRequest(APIRequestModel):
|
170
178
|
type: str
|
171
179
|
action: str
|
172
180
|
subject: Subject
|
173
|
-
attributes: Optional[
|
181
|
+
attributes: Optional[dict[str, Any]] = None
|
174
182
|
|
175
183
|
|
176
184
|
class ListResourcesResult(PangeaResponseResult):
|
177
|
-
ids:
|
185
|
+
ids: list[str]
|
178
186
|
|
179
187
|
|
180
188
|
class ListSubjectsRequest(APIRequestModel):
|
181
189
|
resource: Resource
|
182
190
|
action: str
|
183
|
-
attributes: Optional[
|
191
|
+
attributes: Optional[dict[str, Any]] = None
|
184
192
|
debug: Optional[bool] = None
|
185
193
|
"""Return a path for each found subject"""
|
186
194
|
|
187
195
|
|
188
196
|
class ListSubjectsResult(PangeaResponseResult):
|
189
|
-
subjects:
|
197
|
+
subjects: list[Subject]
|
190
198
|
|
191
199
|
|
192
200
|
class AuthZ(ServiceBase):
|
@@ -232,7 +240,7 @@ class AuthZ(ServiceBase):
|
|
232
240
|
|
233
241
|
super().__init__(token, config, logger_name, config_id=config_id)
|
234
242
|
|
235
|
-
def tuple_create(self, tuples:
|
243
|
+
def tuple_create(self, tuples: Sequence[Tuple]) -> PangeaResponse[TupleCreateResult]:
|
236
244
|
"""Create tuples.
|
237
245
|
|
238
246
|
Create tuples in the AuthZ Service. The request will fail if there is no schema
|
@@ -261,8 +269,7 @@ class AuthZ(ServiceBase):
|
|
261
269
|
)
|
262
270
|
"""
|
263
271
|
|
264
|
-
|
265
|
-
return self.request.post("v1/tuple/create", TupleCreateResult, data=input_data.model_dump(exclude_none=True))
|
272
|
+
return self.request.post("v1/tuple/create", TupleCreateResult, data={"tuples": tuples})
|
266
273
|
|
267
274
|
def tuple_list(
|
268
275
|
self,
|
@@ -337,8 +344,9 @@ class AuthZ(ServiceBase):
|
|
337
344
|
resource: Resource,
|
338
345
|
action: str,
|
339
346
|
subject: Subject,
|
347
|
+
*,
|
340
348
|
debug: bool | None = None,
|
341
|
-
attributes:
|
349
|
+
attributes: Mapping[str, Any] | None = None,
|
342
350
|
) -> PangeaResponse[CheckResult]:
|
343
351
|
"""Perform a check request.
|
344
352
|
|
@@ -349,7 +357,7 @@ class AuthZ(ServiceBase):
|
|
349
357
|
action: The action to check.
|
350
358
|
subject: The subject to check.
|
351
359
|
debug: In the event of an allowed check, return a path that granted access.
|
352
|
-
attributes:
|
360
|
+
attributes: A JSON object of attribute data.
|
353
361
|
|
354
362
|
Raises:
|
355
363
|
PangeaAPIException: If an API Error happens.
|
@@ -368,8 +376,44 @@ class AuthZ(ServiceBase):
|
|
368
376
|
)
|
369
377
|
"""
|
370
378
|
|
371
|
-
|
372
|
-
|
379
|
+
return self.request.post(
|
380
|
+
"v1/check",
|
381
|
+
CheckResult,
|
382
|
+
data={"resource": resource, "action": action, "subject": subject, "debug": debug, "attributes": attributes},
|
383
|
+
)
|
384
|
+
|
385
|
+
def bulk_check(
|
386
|
+
self,
|
387
|
+
checks: Sequence[BulkCheckRequestItem],
|
388
|
+
*,
|
389
|
+
debug: bool | None = None,
|
390
|
+
attributes: Mapping[str, Any] | None = None,
|
391
|
+
) -> PangeaResponse[BulkCheckResult]:
|
392
|
+
"""Perform a bulk check request
|
393
|
+
|
394
|
+
Perform multiple checks in a single request to see if a subjects have
|
395
|
+
permission to do actions on the resources.
|
396
|
+
|
397
|
+
Args:
|
398
|
+
checks: Check requests to perform.
|
399
|
+
debug: In the event of an allowed check, return a path that granted access.
|
400
|
+
attributes: A JSON object of attribute data.
|
401
|
+
|
402
|
+
Examples:
|
403
|
+
authz.bulk_check(
|
404
|
+
checks=[
|
405
|
+
BulkCheckRequestItem(
|
406
|
+
resource=Resource(type="file", id="file_1"),
|
407
|
+
action="read",
|
408
|
+
subject=Subject(type="user", id="user_1", action="read"),
|
409
|
+
)
|
410
|
+
]
|
411
|
+
)
|
412
|
+
"""
|
413
|
+
|
414
|
+
return self.request.post(
|
415
|
+
"v1/check/bulk", BulkCheckResult, data={"checks": checks, "debug": debug, "attributes": attributes}
|
416
|
+
)
|
373
417
|
|
374
418
|
def list_resources(
|
375
419
|
self, type: str, action: str, subject: Subject, attributes: dict[str, Any] | None = None
|
pangea/services/base.py
CHANGED
@@ -8,7 +8,7 @@ from __future__ import annotations
|
|
8
8
|
|
9
9
|
import copy
|
10
10
|
import logging
|
11
|
-
from typing import
|
11
|
+
from typing import Optional, Type, Union
|
12
12
|
|
13
13
|
from typing_extensions import TypeVar
|
14
14
|
|
@@ -47,8 +47,7 @@ class ServiceBase:
|
|
47
47
|
self._token = token
|
48
48
|
self.config_id: Optional[str] = config_id
|
49
49
|
self._request: Optional[Union[PangeaRequest, PangeaRequestAsync]] = None
|
50
|
-
|
51
|
-
self.request.set_extra_headers(extra_headers)
|
50
|
+
self.request.set_extra_headers({})
|
52
51
|
|
53
52
|
@property
|
54
53
|
def token(self) -> str:
|
pangea/services/intel.py
CHANGED
@@ -8,7 +8,7 @@ from __future__ import annotations
|
|
8
8
|
|
9
9
|
import enum
|
10
10
|
import hashlib
|
11
|
-
from typing import Dict, List, Optional
|
11
|
+
from typing import Dict, List, Literal, Optional
|
12
12
|
|
13
13
|
from pangea.exceptions import PangeaException
|
14
14
|
from pangea.response import APIRequestModel, PangeaResponse, PangeaResponseResult
|
@@ -65,8 +65,20 @@ class FileReputationBulkRequest(APIRequestModel):
|
|
65
65
|
hash_type (str): Type of hash, can be "sha256", "sha" or "md5"
|
66
66
|
"""
|
67
67
|
|
68
|
-
hashes:
|
69
|
-
|
68
|
+
hashes: list[str]
|
69
|
+
"""The hash of the file to be looked up"""
|
70
|
+
|
71
|
+
hash_type: Literal["sha256", "sha", "md5"]
|
72
|
+
"""One of "sha256", "sha", "md5"."""
|
73
|
+
|
74
|
+
verbose: Optional[bool] = None
|
75
|
+
"""Echo the API parameters in the response"""
|
76
|
+
|
77
|
+
raw: Optional[bool] = None
|
78
|
+
"""Include raw data from this provider"""
|
79
|
+
|
80
|
+
provider: Optional[Literal["reversinglabs", "crowdstrike"]] = None
|
81
|
+
"""Use reputation data from this provider"""
|
70
82
|
|
71
83
|
|
72
84
|
class FileReputationData(IntelReputationData):
|
@@ -360,7 +372,8 @@ class DomainWhoIsRequest(DomainCommonRequest):
|
|
360
372
|
Domain whois request data
|
361
373
|
"""
|
362
374
|
|
363
|
-
|
375
|
+
domain: str
|
376
|
+
"""The domain to query."""
|
364
377
|
|
365
378
|
|
366
379
|
class DomainWhoIsData(PangeaResponseResult):
|
@@ -534,11 +547,11 @@ class FileIntel(ServiceBase):
|
|
534
547
|
|
535
548
|
def hash_reputation_bulk(
|
536
549
|
self,
|
537
|
-
hashes:
|
538
|
-
hash_type:
|
539
|
-
provider:
|
540
|
-
verbose:
|
541
|
-
raw:
|
550
|
+
hashes: list[str],
|
551
|
+
hash_type: Literal["sha256", "sha", "md5"],
|
552
|
+
provider: Literal["reversinglabs", "crowdstrike"] | None = None,
|
553
|
+
verbose: bool | None = None,
|
554
|
+
raw: bool | None = None,
|
542
555
|
) -> PangeaResponse[FileReputationBulkResult]:
|
543
556
|
"""
|
544
557
|
Reputation check V2
|
@@ -566,7 +579,7 @@ class FileIntel(ServiceBase):
|
|
566
579
|
provider="reversinglabs",
|
567
580
|
)
|
568
581
|
"""
|
569
|
-
input = FileReputationBulkRequest(
|
582
|
+
input = FileReputationBulkRequest(
|
570
583
|
hashes=hashes, hash_type=hash_type, verbose=verbose, raw=raw, provider=provider
|
571
584
|
)
|
572
585
|
return self.request.post("v2/reputation", FileReputationBulkResult, data=input.model_dump(exclude_none=True))
|
@@ -614,10 +627,10 @@ class FileIntel(ServiceBase):
|
|
614
627
|
|
615
628
|
def filepath_reputation_bulk(
|
616
629
|
self,
|
617
|
-
filepaths:
|
618
|
-
provider:
|
619
|
-
verbose:
|
620
|
-
raw:
|
630
|
+
filepaths: list[str],
|
631
|
+
provider: Literal["reversinglabs", "crowdstrike"] | None = None,
|
632
|
+
verbose: bool | None = None,
|
633
|
+
raw: bool | None = None,
|
621
634
|
) -> PangeaResponse[FileReputationBulkResult]:
|
622
635
|
"""
|
623
636
|
Reputation, from filepath V2
|
@@ -628,10 +641,10 @@ class FileIntel(ServiceBase):
|
|
628
641
|
OperationId: file_intel_post_v2_reputation
|
629
642
|
|
630
643
|
Args:
|
631
|
-
filepaths
|
632
|
-
provider
|
633
|
-
verbose
|
634
|
-
raw
|
644
|
+
filepaths: The path list to the files to be looked up
|
645
|
+
provider: Use reputation data from these providers: "reversinglabs" or "crowdstrike"
|
646
|
+
verbose: Echo the API parameters in the response
|
647
|
+
raw: Include raw data from this provider
|
635
648
|
|
636
649
|
Raises:
|
637
650
|
PangeaAPIException: If an API Error happens
|
@@ -781,7 +794,7 @@ class DomainIntel(ServiceBase):
|
|
781
794
|
provider="whoisxml",
|
782
795
|
)
|
783
796
|
"""
|
784
|
-
input = DomainWhoIsRequest(domain=domain, verbose=verbose, provider=provider, raw=raw)
|
797
|
+
input = DomainWhoIsRequest(domain=domain, verbose=verbose, provider=provider, raw=raw)
|
785
798
|
return self.request.post("v1/whois", DomainWhoIsResult, data=input.model_dump(exclude_none=True))
|
786
799
|
|
787
800
|
|
pangea/services/prompt_guard.py
CHANGED
@@ -1,12 +1,9 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
from
|
4
|
-
from typing import TYPE_CHECKING, Annotated, Literal, Optional
|
5
|
-
|
6
|
-
from pydantic import BaseModel, Field
|
3
|
+
from typing import TYPE_CHECKING, Literal, Optional
|
7
4
|
|
8
5
|
from pangea.config import PangeaConfig
|
9
|
-
from pangea.response import APIRequestModel, APIResponseModel,
|
6
|
+
from pangea.response import APIRequestModel, APIResponseModel, PangeaResponse, PangeaResponseResult
|
10
7
|
from pangea.services.base import ServiceBase
|
11
8
|
|
12
9
|
if TYPE_CHECKING:
|
@@ -49,92 +46,6 @@ class GuardResult(PangeaResponseResult):
|
|
49
46
|
"""List of classification results with labels and confidence scores"""
|
50
47
|
|
51
48
|
|
52
|
-
class Areas(BaseModel):
|
53
|
-
malicious_prompt: Optional[bool] = None
|
54
|
-
benign_prompt: Optional[bool] = None
|
55
|
-
|
56
|
-
|
57
|
-
class AuditDataActivityConfig(BaseModel):
|
58
|
-
enabled: bool
|
59
|
-
audit_service_config_id: str
|
60
|
-
areas: Areas
|
61
|
-
|
62
|
-
|
63
|
-
class ServiceConfig(BaseModel):
|
64
|
-
id: Optional[str] = None
|
65
|
-
version: Optional[str] = None
|
66
|
-
analyzers: Optional[dict[str, bool]] = None
|
67
|
-
malicious_detection_threshold: Annotated[Optional[float], Field(ge=0.0, le=1.0)] = None
|
68
|
-
benign_detection_threshold: Annotated[Optional[float], Field(ge=0.0, le=1.0)] = None
|
69
|
-
audit_data_activity: Optional[AuditDataActivityConfig] = None
|
70
|
-
|
71
|
-
|
72
|
-
class ServiceConfigFilter(BaseModel):
|
73
|
-
id: Optional[str] = None
|
74
|
-
"""
|
75
|
-
Only records where id equals this value.
|
76
|
-
"""
|
77
|
-
id__contains: Optional[list[str]] = None
|
78
|
-
"""
|
79
|
-
Only records where id includes each substring.
|
80
|
-
"""
|
81
|
-
id__in: Optional[list[str]] = None
|
82
|
-
"""
|
83
|
-
Only records where id equals one of the provided substrings.
|
84
|
-
"""
|
85
|
-
created_at: Optional[PangeaDateTime] = None
|
86
|
-
"""
|
87
|
-
Only records where created_at equals this value.
|
88
|
-
"""
|
89
|
-
created_at__gt: Optional[PangeaDateTime] = None
|
90
|
-
"""
|
91
|
-
Only records where created_at is greater than this value.
|
92
|
-
"""
|
93
|
-
created_at__gte: Optional[PangeaDateTime] = None
|
94
|
-
"""
|
95
|
-
Only records where created_at is greater than or equal to this value.
|
96
|
-
"""
|
97
|
-
created_at__lt: Optional[PangeaDateTime] = None
|
98
|
-
"""
|
99
|
-
Only records where created_at is less than this value.
|
100
|
-
"""
|
101
|
-
created_at__lte: Optional[PangeaDateTime] = None
|
102
|
-
"""
|
103
|
-
Only records where created_at is less than or equal to this value.
|
104
|
-
"""
|
105
|
-
updated_at: Optional[PangeaDateTime] = None
|
106
|
-
"""
|
107
|
-
Only records where updated_at equals this value.
|
108
|
-
"""
|
109
|
-
updated_at__gt: Optional[PangeaDateTime] = None
|
110
|
-
"""
|
111
|
-
Only records where updated_at is greater than this value.
|
112
|
-
"""
|
113
|
-
updated_at__gte: Optional[PangeaDateTime] = None
|
114
|
-
"""
|
115
|
-
Only records where updated_at is greater than or equal to this value.
|
116
|
-
"""
|
117
|
-
updated_at__lt: Optional[PangeaDateTime] = None
|
118
|
-
"""
|
119
|
-
Only records where updated_at is less than this value.
|
120
|
-
"""
|
121
|
-
updated_at__lte: Optional[PangeaDateTime] = None
|
122
|
-
"""
|
123
|
-
Only records where updated_at is less than or equal to this value.
|
124
|
-
"""
|
125
|
-
|
126
|
-
|
127
|
-
class ServiceConfigsPage(PangeaResponseResult):
|
128
|
-
count: Optional[int] = None
|
129
|
-
"""The total number of service configs matched by the list request."""
|
130
|
-
last: Optional[str] = None
|
131
|
-
"""
|
132
|
-
Used to fetch the next page of the current listing when provided in a
|
133
|
-
repeated request's last parameter.
|
134
|
-
"""
|
135
|
-
items: Optional[list[ServiceConfig]] = None
|
136
|
-
|
137
|
-
|
138
49
|
class PromptGuard(ServiceBase):
|
139
50
|
"""Prompt Guard service client.
|
140
51
|
|
@@ -205,105 +116,3 @@ class PromptGuard(ServiceBase):
|
|
205
116
|
GuardResult,
|
206
117
|
data={"messages": messages, "analyzers": analyzers, "classify": classify},
|
207
118
|
)
|
208
|
-
|
209
|
-
def get_service_config(
|
210
|
-
self,
|
211
|
-
*,
|
212
|
-
id: str | None = None,
|
213
|
-
version: str | None = None,
|
214
|
-
analyzers: Mapping[str, bool] | None = None,
|
215
|
-
malicious_detection_threshold: float | None = None,
|
216
|
-
benign_detection_threshold: float | None = None,
|
217
|
-
audit_data_activity: AuditDataActivityConfig | None = None,
|
218
|
-
) -> PangeaResponse[PangeaResponseResult]:
|
219
|
-
"""
|
220
|
-
OperationId: prompt_guard_post_v1beta_config
|
221
|
-
"""
|
222
|
-
return self.request.post(
|
223
|
-
"v1beta/config",
|
224
|
-
data={
|
225
|
-
"id": id,
|
226
|
-
"version": version,
|
227
|
-
"analyzers": analyzers,
|
228
|
-
"malicious_detection_threshold": malicious_detection_threshold,
|
229
|
-
"benign_detection_threshold": benign_detection_threshold,
|
230
|
-
"audit_data_activity": audit_data_activity,
|
231
|
-
},
|
232
|
-
result_class=PangeaResponseResult,
|
233
|
-
)
|
234
|
-
|
235
|
-
def create_service_config(
|
236
|
-
self,
|
237
|
-
*,
|
238
|
-
id: str | None = None,
|
239
|
-
version: str | None = None,
|
240
|
-
analyzers: Mapping[str, bool] | None = None,
|
241
|
-
malicious_detection_threshold: float | None = None,
|
242
|
-
benign_detection_threshold: float | None = None,
|
243
|
-
audit_data_activity: AuditDataActivityConfig | None = None,
|
244
|
-
) -> PangeaResponse[PangeaResponseResult]:
|
245
|
-
"""
|
246
|
-
OperationId: prompt_guard_post_v1beta_config_create
|
247
|
-
"""
|
248
|
-
return self.request.post(
|
249
|
-
"v1beta/config/create",
|
250
|
-
data={
|
251
|
-
"id": id,
|
252
|
-
"version": version,
|
253
|
-
"analyzers": analyzers,
|
254
|
-
"malicious_detection_threshold": malicious_detection_threshold,
|
255
|
-
"benign_detection_threshold": benign_detection_threshold,
|
256
|
-
"audit_data_activity": audit_data_activity,
|
257
|
-
},
|
258
|
-
result_class=PangeaResponseResult,
|
259
|
-
)
|
260
|
-
|
261
|
-
def update_service_config(
|
262
|
-
self,
|
263
|
-
*,
|
264
|
-
id: str | None = None,
|
265
|
-
version: str | None = None,
|
266
|
-
analyzers: Mapping[str, bool] | None = None,
|
267
|
-
malicious_detection_threshold: float | None = None,
|
268
|
-
benign_detection_threshold: float | None = None,
|
269
|
-
audit_data_activity: AuditDataActivityConfig | None = None,
|
270
|
-
) -> PangeaResponse[PangeaResponseResult]:
|
271
|
-
"""
|
272
|
-
OperationId: prompt_guard_post_v1beta_config_update
|
273
|
-
"""
|
274
|
-
return self.request.post(
|
275
|
-
"v1beta/config/update",
|
276
|
-
data={
|
277
|
-
"id": id,
|
278
|
-
"version": version,
|
279
|
-
"analyzers": analyzers,
|
280
|
-
"malicious_detection_threshold": malicious_detection_threshold,
|
281
|
-
"benign_detection_threshold": benign_detection_threshold,
|
282
|
-
"audit_data_activity": audit_data_activity,
|
283
|
-
},
|
284
|
-
result_class=PangeaResponseResult,
|
285
|
-
)
|
286
|
-
|
287
|
-
def delete_service_config(self, id: str) -> PangeaResponse[PangeaResponseResult]:
|
288
|
-
"""
|
289
|
-
OperationId: prompt_guard_post_v1beta_config_delete
|
290
|
-
"""
|
291
|
-
return self.request.post("v1beta/config/delete", data={"id": id}, result_class=PangeaResponseResult)
|
292
|
-
|
293
|
-
def list_service_configs(
|
294
|
-
self,
|
295
|
-
*,
|
296
|
-
filter: ServiceConfigFilter | None = None,
|
297
|
-
last: str | None = None,
|
298
|
-
order: Literal["asc", "desc"] | None = None,
|
299
|
-
order_by: Literal["id", "created_at", "updated_at"] | None = None,
|
300
|
-
size: int | None = None,
|
301
|
-
) -> PangeaResponse[ServiceConfigsPage]:
|
302
|
-
"""
|
303
|
-
OperationId: prompt_guard_post_v1beta_config_list
|
304
|
-
"""
|
305
|
-
return self.request.post(
|
306
|
-
"v1beta/config/list",
|
307
|
-
data={"filter": filter, "last": last, "order": order, "order_by": order_by, "size": size},
|
308
|
-
result_class=ServiceConfigsPage,
|
309
|
-
)
|