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/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 typing import Any, Dict, List, Optional, Union
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: Optional[str] = None
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[str] = None
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[List[str]] = None
71
+ resource_type__contains: Optional[list[str]] = None
74
72
  """Only records where resource type includes each substring."""
75
- resource_type__in: Optional[List[str]] = None
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[List[str]] = None
77
+ resource_id__contains: Optional[list[str]] = None
80
78
  """Only records where resource id includes each substring."""
81
- resource_id__in: Optional[List[str]] = None
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[List[str]] = None
83
+ relation__contains: Optional[list[str]] = None
86
84
  """Only records where relation includes each substring."""
87
- relation__in: Optional[List[str]] = None
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[List[str]] = None
89
+ subject_type__contains: Optional[list[str]] = None
92
90
  """Only records where subject type includes each substring."""
93
- subject_type__in: Optional[List[str]] = None
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[List[str]] = None
95
+ subject_id__contains: Optional[list[str]] = None
98
96
  """Only records where subject id includes each substring."""
99
- subject_id__in: Optional[List[str]] = None
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[List[str]] = None
101
+ subject_action__contains: Optional[list[str]] = None
104
102
  """Only records where subject action includes each substring."""
105
- subject_action__in: Optional[List[str]] = None
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[str] = None
105
+ expires_at: Optional[PangeaDateTime] = None
108
106
  """Only records where expires_at equals this value."""
109
- expires_at__gt: Optional[str] = None
107
+ expires_at__gt: Optional[PangeaDateTime] = None
110
108
  """Only records where expires_at is greater than this value."""
111
- expires_at__gte: Optional[str] = None
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[str] = None
111
+ expires_at__lt: Optional[PangeaDateTime] = None
114
112
  """Only records where expires_at is less than this value."""
115
- expires_at__lte: Optional[str] = None
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[Dict, TupleListFilter]] = None
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: List[Tuple]
126
+ tuples: list[Tuple]
129
127
  last: str
130
128
  count: int
131
129
 
132
130
 
133
131
  class TupleDeleteRequest(APIRequestModel):
134
- tuples: List[Tuple]
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: List[DebugPath]
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[Dict[str, Any]] = None
181
+ attributes: Optional[dict[str, Any]] = None
174
182
 
175
183
 
176
184
  class ListResourcesResult(PangeaResponseResult):
177
- ids: List[str]
185
+ ids: list[str]
178
186
 
179
187
 
180
188
  class ListSubjectsRequest(APIRequestModel):
181
189
  resource: Resource
182
190
  action: str
183
- attributes: Optional[Dict[str, Any]] = None
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: List[Subject]
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: list[Tuple]) -> PangeaResponse[TupleCreateResult]:
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
- input_data = TupleCreateRequest(tuples=tuples)
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: dict[str, Any] | None = None,
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: Additional attributes for the check.
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
- input_data = CheckRequest(resource=resource, action=action, subject=subject, debug=debug, attributes=attributes)
372
- return self.request.post("v1/check", CheckResult, data=input_data.model_dump(exclude_none=True))
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 Dict, Optional, Type, Union
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
- extra_headers: Dict = {}
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: List[str]
69
- hash_type: str
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
- pass
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: List[str],
538
- hash_type: str,
539
- provider: Optional[str] = None,
540
- verbose: Optional[bool] = None,
541
- raw: Optional[bool] = None,
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( # type: ignore[call-arg]
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: List[str],
618
- provider: Optional[str] = None,
619
- verbose: Optional[bool] = None,
620
- raw: Optional[bool] = None,
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 (List[str]): The path list to the files to be looked up
632
- provider (str, optional): Use reputation data from these providers: "reversinglabs" or "crowdstrike"
633
- verbose (bool, optional): Echo the API parameters in the response
634
- raw (bool, optional): Include raw data from this provider
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) # type: ignore[call-arg]
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
 
@@ -1,12 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
- from collections.abc import Mapping
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, PangeaDateTime, PangeaResponse, PangeaResponseResult
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
- )