Skip to content

Commit c704250

Browse files
authored
Merge pull request #396 from Portkey-AI/feat/guardrailsEndpoint
Guardrails API Support
2 parents 4f83fbb + cb3927d commit c704250

File tree

7 files changed

+375
-0
lines changed

7 files changed

+375
-0
lines changed

portkey_ai/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@
133133
AsyncIntegrationsModels,
134134
Providers,
135135
AsyncProviders,
136+
Guardrails,
137+
AsyncGuardrails,
136138
Webhooks,
137139
AsyncWebhooks,
138140
MainRealtime,
@@ -305,6 +307,8 @@
305307
"AsyncIntegrationsModels",
306308
"Providers",
307309
"AsyncProviders",
310+
"Guardrails",
311+
"AsyncGuardrails",
308312
"Webhooks",
309313
"AsyncWebhooks",
310314
"MainRealtime",

portkey_ai/api_resources/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@
121121
AsyncIntegrationsModels,
122122
Providers,
123123
AsyncProviders,
124+
Guardrails,
125+
AsyncGuardrails,
124126
Webhooks,
125127
AsyncWebhooks,
126128
MainRealtime,
@@ -297,6 +299,8 @@
297299
"AsyncIntegrationsModels",
298300
"Providers",
299301
"AsyncProviders",
302+
"Guardrails",
303+
"AsyncGuardrails",
300304
"Webhooks",
301305
"AsyncWebhooks",
302306
"MainRealtime",

portkey_ai/api_resources/apis/__init__.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,11 @@
150150
AsyncProviders,
151151
)
152152

153+
from .guardrails import (
154+
Guardrails,
155+
AsyncGuardrails,
156+
)
157+
153158
from .main_realtime import (
154159
MainRealtime,
155160
AsyncMainRealtime,
@@ -309,6 +314,8 @@
309314
"AsyncIntegrationsModels",
310315
"Providers",
311316
"AsyncProviders",
317+
"Guardrails",
318+
"AsyncGuardrails",
312319
"Webhooks",
313320
"AsyncWebhooks",
314321
"MainRealtime",
Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
from typing import Any, Dict, List, Optional
2+
from portkey_ai.api_resources.base_client import APIClient, AsyncAPIClient
3+
from urllib.parse import urlencode
4+
from portkey_ai.api_resources.apis.api_resource import APIResource, AsyncAPIResource
5+
from portkey_ai.api_resources.types.guardrails_type import (
6+
GuardrailListResponse,
7+
GuardrailDetailResponse,
8+
GuardrailCreateResponse,
9+
GuardrailUpdateResponse,
10+
)
11+
from portkey_ai.api_resources.utils import GenericResponse
12+
from portkey_ai.api_resources.utils import PortkeyApiPaths
13+
14+
15+
class Guardrails(APIResource):
16+
def __init__(self, client: APIClient) -> None:
17+
super().__init__(client)
18+
19+
def create(
20+
self,
21+
*,
22+
name: str,
23+
checks: List[Dict[str, Any]],
24+
actions: Dict[str, Any],
25+
workspace_id: Optional[str] = None,
26+
organisation_id: Optional[str] = None,
27+
**kwargs: Any,
28+
) -> GuardrailCreateResponse:
29+
body = {
30+
"name": name,
31+
"checks": checks,
32+
"actions": actions,
33+
"workspace_id": workspace_id,
34+
"organisation_id": organisation_id,
35+
**kwargs,
36+
}
37+
return self._post(
38+
f"{PortkeyApiPaths.GUARDRAILS_API}",
39+
body=body,
40+
params=None,
41+
cast_to=GuardrailCreateResponse,
42+
stream=False,
43+
stream_cls=None,
44+
headers={},
45+
)
46+
47+
def list(
48+
self,
49+
*,
50+
workspace_id: Optional[str] = None,
51+
organisation_id: Optional[str] = None,
52+
page_size: Optional[int] = 100,
53+
current_page: Optional[int] = 0,
54+
) -> GuardrailListResponse:
55+
query = {
56+
"workspace_id": workspace_id,
57+
"organisation_id": organisation_id,
58+
"page_size": page_size,
59+
"current_page": current_page,
60+
}
61+
filtered_query = {k: v for k, v in query.items() if v is not None}
62+
query_string = urlencode(filtered_query)
63+
return self._get(
64+
f"{PortkeyApiPaths.GUARDRAILS_API}?{query_string}",
65+
params=None,
66+
body=None,
67+
cast_to=GuardrailListResponse,
68+
stream=False,
69+
stream_cls=None,
70+
headers={},
71+
)
72+
73+
def retrieve(
74+
self,
75+
*,
76+
guardrail_id: str,
77+
) -> GuardrailDetailResponse:
78+
return self._get(
79+
f"{PortkeyApiPaths.GUARDRAILS_API}/{guardrail_id}",
80+
params=None,
81+
body=None,
82+
cast_to=GuardrailDetailResponse,
83+
stream=False,
84+
stream_cls=None,
85+
headers={},
86+
)
87+
88+
def update(
89+
self,
90+
*,
91+
guardrail_id: str,
92+
name: Optional[str] = None,
93+
checks: Optional[List[Dict[str, Any]]] = None,
94+
actions: Optional[Dict[str, Any]] = None,
95+
**kwargs: Any,
96+
) -> GuardrailUpdateResponse:
97+
body = {
98+
"name": name,
99+
"checks": checks,
100+
"actions": actions,
101+
**kwargs,
102+
}
103+
return self._put(
104+
f"{PortkeyApiPaths.GUARDRAILS_API}/{guardrail_id}",
105+
body=body,
106+
params=None,
107+
cast_to=GuardrailUpdateResponse,
108+
stream=False,
109+
stream_cls=None,
110+
headers={},
111+
)
112+
113+
def delete(
114+
self,
115+
*,
116+
guardrail_id: str,
117+
) -> GenericResponse:
118+
return self._delete(
119+
f"{PortkeyApiPaths.GUARDRAILS_API}/{guardrail_id}",
120+
params=None,
121+
body=None,
122+
cast_to=GenericResponse,
123+
stream=False,
124+
stream_cls=None,
125+
headers={},
126+
)
127+
128+
129+
class AsyncGuardrails(AsyncAPIResource):
130+
def __init__(self, client: AsyncAPIClient) -> None:
131+
super().__init__(client)
132+
133+
async def create(
134+
self,
135+
*,
136+
name: str,
137+
checks: List[Dict[str, Any]],
138+
actions: Dict[str, Any],
139+
workspace_id: Optional[str] = None,
140+
organisation_id: Optional[str] = None,
141+
**kwargs: Any,
142+
) -> GuardrailCreateResponse:
143+
body = {
144+
"name": name,
145+
"checks": checks,
146+
"actions": actions,
147+
"workspace_id": workspace_id,
148+
"organisation_id": organisation_id,
149+
**kwargs,
150+
}
151+
return await self._post(
152+
f"{PortkeyApiPaths.GUARDRAILS_API}",
153+
body=body,
154+
params=None,
155+
cast_to=GuardrailCreateResponse,
156+
stream=False,
157+
stream_cls=None,
158+
headers={},
159+
)
160+
161+
async def list(
162+
self,
163+
*,
164+
workspace_id: Optional[str] = None,
165+
organisation_id: Optional[str] = None,
166+
page_size: Optional[int] = 100,
167+
current_page: Optional[int] = 0,
168+
) -> GuardrailListResponse:
169+
query = {
170+
"workspace_id": workspace_id,
171+
"organisation_id": organisation_id,
172+
"page_size": page_size,
173+
"current_page": current_page,
174+
}
175+
filtered_query = {k: v for k, v in query.items() if v is not None}
176+
query_string = urlencode(filtered_query)
177+
return await self._get(
178+
f"{PortkeyApiPaths.GUARDRAILS_API}?{query_string}",
179+
params=None,
180+
body=None,
181+
cast_to=GuardrailListResponse,
182+
stream=False,
183+
stream_cls=None,
184+
headers={},
185+
)
186+
187+
async def retrieve(
188+
self,
189+
*,
190+
guardrail_id: str,
191+
) -> GuardrailDetailResponse:
192+
return await self._get(
193+
f"{PortkeyApiPaths.GUARDRAILS_API}/{guardrail_id}",
194+
params=None,
195+
body=None,
196+
cast_to=GuardrailDetailResponse,
197+
stream=False,
198+
stream_cls=None,
199+
headers={},
200+
)
201+
202+
async def update(
203+
self,
204+
*,
205+
guardrail_id: str,
206+
name: Optional[str] = None,
207+
checks: Optional[List[Dict[str, Any]]] = None,
208+
actions: Optional[Dict[str, Any]] = None,
209+
**kwargs: Any,
210+
) -> GuardrailUpdateResponse:
211+
body = {
212+
"name": name,
213+
"checks": checks,
214+
"actions": actions,
215+
**kwargs,
216+
}
217+
return await self._put(
218+
f"{PortkeyApiPaths.GUARDRAILS_API}/{guardrail_id}",
219+
body=body,
220+
params=None,
221+
cast_to=GuardrailUpdateResponse,
222+
stream=False,
223+
stream_cls=None,
224+
headers={},
225+
)
226+
227+
async def delete(
228+
self,
229+
*,
230+
guardrail_id: str,
231+
) -> GenericResponse:
232+
return await self._delete(
233+
f"{PortkeyApiPaths.GUARDRAILS_API}/{guardrail_id}",
234+
params=None,
235+
body=None,
236+
cast_to=GenericResponse,
237+
stream=False,
238+
stream_cls=None,
239+
headers={},
240+
)

portkey_ai/api_resources/client.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class Portkey(APIClient):
3838
collections: apis.Collections
3939
integrations: apis.Integrations
4040
providers: apis.Providers
41+
guardrails: apis.Guardrails
4142
realtime: apis.MainRealtime
4243
conversations: apis.Conversations
4344
videos: apis.Videos
@@ -189,6 +190,7 @@ def __init__(
189190
self.collections = apis.Collections(self)
190191
self.integrations = apis.Integrations(self)
191192
self.providers = apis.Providers(self)
193+
self.guardrails = apis.Guardrails(self)
192194
self.realtime = apis.MainRealtime(self)
193195
self.conversations = apis.Conversations(self)
194196
self.videos = apis.Videos(self)
@@ -374,6 +376,7 @@ class AsyncPortkey(AsyncAPIClient):
374376
collections: apis.AsyncCollections
375377
integrations: apis.AsyncIntegrations
376378
providers: apis.AsyncProviders
379+
guardrails: apis.AsyncGuardrails
377380
realtime: apis.AsyncMainRealtime
378381
conversations: apis.AsyncConversations
379382
videos: apis.AsyncVideos
@@ -525,6 +528,7 @@ def __init__(
525528
self.collections = apis.AsyncCollections(self)
526529
self.integrations = apis.AsyncIntegrations(self)
527530
self.providers = apis.AsyncProviders(self)
531+
self.guardrails = apis.AsyncGuardrails(self)
528532
self.realtime = apis.AsyncMainRealtime(self)
529533
self.conversations = apis.AsyncConversations(self)
530534
self.videos = apis.AsyncVideos(self)

0 commit comments

Comments
 (0)