enkryptai-sdk 0.1.5__tar.gz → 0.1.6__tar.gz

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.
Files changed (24) hide show
  1. {enkryptai_sdk-0.1.5/src/enkryptai_sdk.egg-info → enkryptai_sdk-0.1.6}/PKG-INFO +1 -1
  2. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/setup.py +1 -1
  3. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/src/enkryptai_sdk/dto/models.py +13 -0
  4. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/src/enkryptai_sdk/models.py +23 -7
  5. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/src/enkryptai_sdk/red_team.py +19 -9
  6. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6/src/enkryptai_sdk.egg-info}/PKG-INFO +1 -1
  7. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/LICENSE +0 -0
  8. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/README.md +0 -0
  9. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/setup.cfg +0 -0
  10. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/src/enkryptai_sdk/__init__.py +0 -0
  11. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/src/enkryptai_sdk/config.py +0 -0
  12. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/src/enkryptai_sdk/dto/__init__.py +0 -0
  13. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/src/enkryptai_sdk/dto/red_team.py +0 -0
  14. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/src/enkryptai_sdk/evals.py +0 -0
  15. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/src/enkryptai_sdk/guardrails.py +0 -0
  16. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/src/enkryptai_sdk/response.py +0 -0
  17. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/src/enkryptai_sdk.egg-info/SOURCES.txt +0 -0
  18. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/src/enkryptai_sdk.egg-info/dependency_links.txt +0 -0
  19. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/src/enkryptai_sdk.egg-info/top_level.txt +0 -0
  20. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/tests/test_all.py +0 -0
  21. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/tests/test_basic.py +0 -0
  22. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/tests/test_detect_policy.py +0 -0
  23. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/tests/test_injection_attack.py +0 -0
  24. {enkryptai_sdk-0.1.5 → enkryptai_sdk-0.1.6}/tests/test_policy_violation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: enkryptai-sdk
3
- Version: 0.1.5
3
+ Version: 0.1.6
4
4
  Summary: A Python SDK with guardrails and red teaming functionality for API interactions
5
5
  Home-page: https://github.com/enkryptai/enkryptai-sdk
6
6
  Author: Enkrypt AI Team
@@ -8,7 +8,7 @@ with open(os.path.join(here, "README.md"), encoding="utf-8") as fh:
8
8
 
9
9
  setup(
10
10
  name="enkryptai-sdk", # This is the name of your package on PyPI
11
- version="0.1.5",
11
+ version="0.1.6",
12
12
  description="A Python SDK with guardrails and red teaming functionality for API interactions",
13
13
  long_description=long_description,
14
14
  long_description_content_type="text/markdown",
@@ -14,6 +14,19 @@ class Modality(Enum):
14
14
  return self.value
15
15
 
16
16
 
17
+ @dataclass
18
+ class ModelResponse:
19
+ message: Optional[str] = None
20
+ data: Optional[Dict] = None
21
+
22
+ def to_dict(self):
23
+ return asdict(self)
24
+
25
+ @classmethod
26
+ def from_dict(cls, data: dict):
27
+ return cls(**data)
28
+
29
+
17
30
  @dataclass
18
31
  class EndpointConfig:
19
32
  scheme: str = "https"
@@ -1,8 +1,16 @@
1
1
  import urllib3
2
- from .dto import ModelConfig, ModelDetailConfig
2
+ from .dto import ModelConfig, ModelResponse
3
3
  from urllib.parse import urlparse, urlsplit
4
4
 
5
5
 
6
+ class ModelClientError(Exception):
7
+ """
8
+ A custom exception for ModelClient errors.
9
+ """
10
+
11
+ pass
12
+
13
+
6
14
  class ModelClient:
7
15
  def __init__(self, api_key: str, base_url: str = "https://api.enkryptai.com:443"):
8
16
  self.api_key = api_key
@@ -23,14 +31,13 @@ class ModelClient:
23
31
  response = self.http.request(method, url, headers=request_headers, **kwargs)
24
32
 
25
33
  if response.status >= 400:
26
- error_response = (
34
+ error_data = (
27
35
  response.json()
28
36
  if response.data
29
37
  else {"message": f"HTTP {response.status}"}
30
38
  )
31
- raise urllib3.exceptions.HTTPError(
32
- f"HTTP {response.status}: {error_response}"
33
- )
39
+ error_message = error_data.get("message", str(error_data))
40
+ raise urllib3.exceptions.HTTPError(error_message)
34
41
  return response.json()
35
42
  except urllib3.exceptions.HTTPError as e:
36
43
  return {"error": str(e)}
@@ -101,8 +108,15 @@ class ModelClient:
101
108
  "default_request_options": config.model_config.default_request_options,
102
109
  },
103
110
  }
104
- print(payload)
105
- return self._request("POST", "/models/add-model", headers=headers, json=payload)
111
+ try:
112
+ response = self._request(
113
+ "POST", "/models/add-model", headers=headers, json=payload
114
+ )
115
+ if response.get("error"):
116
+ raise ModelClientError(response["error"])
117
+ return ModelResponse.from_dict(response)
118
+ except Exception as e:
119
+ raise ModelClientError(str(e))
106
120
 
107
121
  def get_model(self, model_id: str) -> ModelConfig:
108
122
  """
@@ -116,6 +130,8 @@ class ModelClient:
116
130
  """
117
131
  headers = {"X-Enkrypt-Model": model_id}
118
132
  response = self._request("GET", "/models/get-model", headers=headers)
133
+ if response.get("error"):
134
+ raise ModelClientError(response["error"])
119
135
  return ModelConfig.from_dict(response)
120
136
 
121
137
  def get_model_list(self):
@@ -9,7 +9,7 @@ from .dto import (
9
9
  )
10
10
 
11
11
 
12
- class RedTeamError(Exception):
12
+ class RedTeamClientError(Exception):
13
13
  """
14
14
  A custom exception for Red Team errors.
15
15
  """
@@ -39,18 +39,17 @@ class RedTeamClient:
39
39
 
40
40
  try:
41
41
  response = self.http.request(method, url, headers=request_headers, **kwargs)
42
+
42
43
  if response.status >= 400:
43
- error_response = (
44
+ error_data = (
44
45
  response.json()
45
46
  if response.data
46
47
  else {"message": f"HTTP {response.status}"}
47
48
  )
48
- raise urllib3.exceptions.HTTPError(
49
- f"HTTP {response.status}: {error_response}"
50
- )
49
+ error_message = error_data.get("message", str(error_data))
50
+ raise urllib3.exceptions.HTTPError(error_message)
51
51
  return response.json()
52
52
  except urllib3.exceptions.HTTPError as e:
53
- print(f"Request failed: {e}")
54
53
  return {"error": str(e)}
55
54
 
56
55
  def get_model(self, model):
@@ -105,9 +104,11 @@ class RedTeamClient:
105
104
  "/redteam/v2/add-task",
106
105
  json=payload,
107
106
  )
107
+ if response.get("error"):
108
+ raise RedTeamClientError(response["error"])
108
109
  return RedTeamResponse.from_dict(response)
109
110
  else:
110
- raise RedTeamError(
111
+ raise RedTeamClientError(
111
112
  "Please use a saved model or provide a target model configuration"
112
113
  )
113
114
 
@@ -124,6 +125,8 @@ class RedTeamClient:
124
125
  headers = {"X-Enkrypt-Task-ID": task_id}
125
126
 
126
127
  response = self._request("GET", "/redteam/task-status", headers=headers)
128
+ if response.get("error"):
129
+ raise RedTeamClientError(response["error"])
127
130
  return RedTeamTaskStatus.from_dict(response)
128
131
 
129
132
  def cancel_task(self, task_id: str):
@@ -133,7 +136,7 @@ class RedTeamClient:
133
136
  Args:
134
137
  task_id (str): The ID of the task to cancel
135
138
  """
136
- raise RedTeamError(
139
+ raise RedTeamClientError(
137
140
  "This feature is currently under development. Please check our documentation "
138
141
  "at https://docs.enkrypt.ai for updates or contact support@enkrypt.ai for assistance."
139
142
  )
@@ -151,7 +154,10 @@ class RedTeamClient:
151
154
  headers = {"X-Enkrypt-Task-ID": task_id}
152
155
 
153
156
  response = self._request("GET", "/redteam/get-task", headers=headers)
154
- response["data"]["task_id"] = response["data"].pop("job_id")
157
+ if response.get("error"):
158
+ raise RedTeamClientError(response["error"])
159
+ if response.get("data").get("job_id "):
160
+ response["data"]["task_id"] = response["data"].pop("job_id")
155
161
  return RedTeamTaskDetails.from_dict(response["data"])
156
162
 
157
163
  def get_result_summary(self, task_id: str):
@@ -167,6 +173,8 @@ class RedTeamClient:
167
173
  headers = {"X-Enkrypt-Task-ID": task_id}
168
174
 
169
175
  response = self._request("GET", "/redteam/results/summary", headers=headers)
176
+ if response.get("error"):
177
+ raise RedTeamClientError(response["error"])
170
178
  return RedTeamResultSummary.from_dict(response["summary"])
171
179
 
172
180
  def get_result_details(self, task_id: str):
@@ -182,4 +190,6 @@ class RedTeamClient:
182
190
  # TODO: Update the response to be updated
183
191
  headers = {"X-Enkrypt-Task-ID": task_id}
184
192
  response = self._request("GET", "/redteam/results/details", headers=headers)
193
+ if response.get("error"):
194
+ raise RedTeamClientError(response["error"])
185
195
  return RedTeamResultDetails.from_dict(response["details"])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: enkryptai-sdk
3
- Version: 0.1.5
3
+ Version: 0.1.6
4
4
  Summary: A Python SDK with guardrails and red teaming functionality for API interactions
5
5
  Home-page: https://github.com/enkryptai/enkryptai-sdk
6
6
  Author: Enkrypt AI Team
File without changes
File without changes
File without changes