pygeai 0.6.0b6__py3-none-any.whl → 0.6.0b10__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.
Files changed (227) hide show
  1. pygeai/_docs/source/conf.py +78 -6
  2. pygeai/_docs/source/content/api_reference/admin.rst +161 -0
  3. pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
  4. pygeai/_docs/source/content/api_reference/auth.rst +379 -0
  5. pygeai/_docs/source/content/api_reference/embeddings.rst +31 -1
  6. pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
  7. pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
  8. pygeai/_docs/source/content/api_reference/files.rst +592 -0
  9. pygeai/_docs/source/content/api_reference/gam.rst +401 -0
  10. pygeai/_docs/source/content/api_reference/health.rst +58 -0
  11. pygeai/_docs/source/content/api_reference/project.rst +20 -18
  12. pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
  13. pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
  14. pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
  15. pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
  16. pygeai/_docs/source/content/api_reference.rst +13 -1
  17. pygeai/_docs/source/content/debugger.rst +376 -83
  18. pygeai/_docs/source/content/migration.rst +528 -0
  19. pygeai/_docs/source/content/modules.rst +1 -1
  20. pygeai/_docs/source/index.rst +59 -7
  21. pygeai/_docs/source/pygeai.auth.rst +29 -0
  22. pygeai/_docs/source/pygeai.cli.commands.rst +16 -0
  23. pygeai/_docs/source/pygeai.cli.rst +8 -0
  24. pygeai/_docs/source/pygeai.core.utils.rst +16 -0
  25. pygeai/_docs/source/pygeai.rst +1 -0
  26. pygeai/_docs/source/pygeai.tests.auth.rst +21 -0
  27. pygeai/_docs/source/pygeai.tests.cli.commands.rst +16 -0
  28. pygeai/_docs/source/pygeai.tests.cli.rst +16 -0
  29. pygeai/_docs/source/pygeai.tests.core.base.rst +8 -0
  30. pygeai/_docs/source/pygeai.tests.core.embeddings.rst +16 -0
  31. pygeai/_docs/source/pygeai.tests.core.files.rst +8 -0
  32. pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
  33. pygeai/_docs/source/pygeai.tests.core.rst +1 -0
  34. pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
  35. pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
  36. pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
  37. pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
  38. pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +8 -0
  39. pygeai/_docs/source/pygeai.tests.organization.rst +8 -0
  40. pygeai/_docs/source/pygeai.tests.rst +2 -0
  41. pygeai/_docs/source/pygeai.tests.snippets.auth.rst +10 -0
  42. pygeai/_docs/source/pygeai.tests.snippets.chat.rst +40 -0
  43. pygeai/_docs/source/pygeai.tests.snippets.dbg.rst +45 -0
  44. pygeai/_docs/source/pygeai.tests.snippets.embeddings.rst +40 -0
  45. pygeai/_docs/source/pygeai.tests.snippets.evaluation.dataset.rst +197 -0
  46. pygeai/_docs/source/pygeai.tests.snippets.evaluation.plan.rst +133 -0
  47. pygeai/_docs/source/pygeai.tests.snippets.evaluation.result.rst +37 -0
  48. pygeai/_docs/source/pygeai.tests.snippets.evaluation.rst +10 -0
  49. pygeai/_docs/source/pygeai.tests.snippets.organization.rst +40 -0
  50. pygeai/_docs/source/pygeai.tests.snippets.rst +2 -0
  51. pygeai/admin/clients.py +12 -32
  52. pygeai/assistant/clients.py +16 -44
  53. pygeai/assistant/data/clients.py +1 -0
  54. pygeai/assistant/data_analyst/clients.py +6 -13
  55. pygeai/assistant/rag/clients.py +24 -67
  56. pygeai/auth/clients.py +88 -14
  57. pygeai/auth/endpoints.py +4 -0
  58. pygeai/chat/clients.py +192 -25
  59. pygeai/chat/endpoints.py +2 -1
  60. pygeai/cli/commands/auth.py +178 -2
  61. pygeai/cli/commands/chat.py +227 -1
  62. pygeai/cli/commands/embeddings.py +56 -8
  63. pygeai/cli/commands/lab/ai_lab.py +0 -2
  64. pygeai/cli/commands/migrate.py +994 -434
  65. pygeai/cli/commands/organization.py +241 -0
  66. pygeai/cli/error_handler.py +116 -0
  67. pygeai/cli/geai.py +28 -10
  68. pygeai/cli/parsers.py +8 -2
  69. pygeai/core/base/clients.py +4 -1
  70. pygeai/core/common/exceptions.py +11 -10
  71. pygeai/core/embeddings/__init__.py +19 -0
  72. pygeai/core/embeddings/clients.py +20 -9
  73. pygeai/core/embeddings/mappers.py +16 -2
  74. pygeai/core/embeddings/responses.py +9 -2
  75. pygeai/core/feedback/clients.py +4 -8
  76. pygeai/core/files/clients.py +10 -25
  77. pygeai/core/files/managers.py +42 -0
  78. pygeai/core/llm/clients.py +11 -26
  79. pygeai/core/models.py +107 -0
  80. pygeai/core/plugins/clients.py +4 -7
  81. pygeai/core/rerank/clients.py +4 -8
  82. pygeai/core/secrets/clients.py +14 -37
  83. pygeai/core/services/rest.py +1 -1
  84. pygeai/core/utils/parsers.py +32 -0
  85. pygeai/core/utils/validators.py +10 -0
  86. pygeai/dbg/__init__.py +3 -0
  87. pygeai/dbg/debugger.py +565 -70
  88. pygeai/evaluation/clients.py +2 -1
  89. pygeai/evaluation/dataset/clients.py +46 -44
  90. pygeai/evaluation/plan/clients.py +28 -26
  91. pygeai/evaluation/result/clients.py +38 -5
  92. pygeai/gam/clients.py +10 -25
  93. pygeai/health/clients.py +4 -7
  94. pygeai/lab/agents/clients.py +21 -54
  95. pygeai/lab/agents/endpoints.py +2 -0
  96. pygeai/lab/clients.py +1 -0
  97. pygeai/lab/models.py +3 -3
  98. pygeai/lab/processes/clients.py +45 -127
  99. pygeai/lab/strategies/clients.py +11 -25
  100. pygeai/lab/tools/clients.py +23 -67
  101. pygeai/lab/tools/endpoints.py +3 -0
  102. pygeai/migration/__init__.py +31 -0
  103. pygeai/migration/strategies.py +404 -155
  104. pygeai/migration/tools.py +170 -3
  105. pygeai/organization/clients.py +135 -51
  106. pygeai/organization/endpoints.py +6 -1
  107. pygeai/organization/limits/clients.py +32 -91
  108. pygeai/organization/managers.py +157 -1
  109. pygeai/organization/mappers.py +76 -2
  110. pygeai/organization/responses.py +25 -1
  111. pygeai/proxy/clients.py +4 -1
  112. pygeai/tests/admin/test_clients.py +16 -11
  113. pygeai/tests/assistants/rag/test_clients.py +35 -23
  114. pygeai/tests/assistants/test_clients.py +22 -15
  115. pygeai/tests/auth/test_clients.py +191 -7
  116. pygeai/tests/chat/test_clients.py +211 -1
  117. pygeai/tests/cli/commands/test_embeddings.py +32 -9
  118. pygeai/tests/cli/commands/test_evaluation.py +7 -0
  119. pygeai/tests/cli/commands/test_migrate.py +112 -243
  120. pygeai/tests/cli/test_error_handler.py +225 -0
  121. pygeai/tests/cli/test_geai_driver.py +154 -0
  122. pygeai/tests/cli/test_parsers.py +5 -5
  123. pygeai/tests/core/embeddings/test_clients.py +144 -0
  124. pygeai/tests/core/embeddings/test_managers.py +171 -0
  125. pygeai/tests/core/embeddings/test_mappers.py +142 -0
  126. pygeai/tests/core/feedback/test_clients.py +2 -0
  127. pygeai/tests/core/files/test_clients.py +1 -0
  128. pygeai/tests/core/llm/test_clients.py +14 -9
  129. pygeai/tests/core/plugins/test_clients.py +5 -3
  130. pygeai/tests/core/rerank/test_clients.py +1 -0
  131. pygeai/tests/core/secrets/test_clients.py +19 -13
  132. pygeai/tests/dbg/test_debugger.py +453 -75
  133. pygeai/tests/evaluation/dataset/test_clients.py +3 -1
  134. pygeai/tests/evaluation/plan/test_clients.py +4 -2
  135. pygeai/tests/evaluation/result/test_clients.py +7 -5
  136. pygeai/tests/gam/test_clients.py +1 -1
  137. pygeai/tests/health/test_clients.py +1 -0
  138. pygeai/tests/lab/agents/test_clients.py +9 -0
  139. pygeai/tests/lab/processes/test_clients.py +36 -0
  140. pygeai/tests/lab/processes/test_mappers.py +3 -0
  141. pygeai/tests/lab/strategies/test_clients.py +14 -9
  142. pygeai/tests/migration/test_strategies.py +45 -218
  143. pygeai/tests/migration/test_tools.py +133 -9
  144. pygeai/tests/organization/limits/test_clients.py +17 -0
  145. pygeai/tests/organization/test_clients.py +206 -1
  146. pygeai/tests/organization/test_managers.py +122 -1
  147. pygeai/tests/proxy/test_clients.py +2 -0
  148. pygeai/tests/proxy/test_integration.py +1 -0
  149. pygeai/tests/snippets/auth/__init__.py +0 -0
  150. pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
  151. pygeai/tests/snippets/chat/get_response.py +15 -0
  152. pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
  153. pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
  154. pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
  155. pygeai/tests/snippets/dbg/__init__.py +0 -0
  156. pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
  157. pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
  158. pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
  159. pygeai/tests/snippets/dbg/stepping_example.py +40 -0
  160. pygeai/tests/snippets/embeddings/cache_example.py +31 -0
  161. pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
  162. pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
  163. pygeai/tests/snippets/embeddings/openai_example.py +30 -0
  164. pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
  165. pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
  166. pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
  167. pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
  168. pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
  169. pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
  170. pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
  171. pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
  172. pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
  173. pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
  174. pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
  175. pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
  176. pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
  177. pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
  178. pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
  179. pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
  180. pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
  181. pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
  182. pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
  183. pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
  184. pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
  185. pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
  186. pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
  187. pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
  188. pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
  189. pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
  190. pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
  191. pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
  192. pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
  193. pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
  194. pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
  195. pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
  196. pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
  197. pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
  198. pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
  199. pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
  200. pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
  201. pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
  202. pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
  203. pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
  204. pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
  205. pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
  206. pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
  207. pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
  208. pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
  209. pygeai/tests/snippets/migrate/__init__.py +45 -0
  210. pygeai/tests/snippets/migrate/agent_migration.py +110 -0
  211. pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
  212. pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
  213. pygeai/tests/snippets/migrate/process_migration.py +64 -0
  214. pygeai/tests/snippets/migrate/project_migration.py +42 -0
  215. pygeai/tests/snippets/migrate/tool_migration.py +64 -0
  216. pygeai/tests/snippets/organization/create_project.py +2 -2
  217. pygeai/tests/snippets/organization/get_memberships.py +12 -0
  218. pygeai/tests/snippets/organization/get_organization_members.py +6 -0
  219. pygeai/tests/snippets/organization/get_project_members.py +6 -0
  220. pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
  221. pygeai/tests/snippets/organization/get_project_roles.py +6 -0
  222. {pygeai-0.6.0b6.dist-info → pygeai-0.6.0b10.dist-info}/METADATA +1 -1
  223. {pygeai-0.6.0b6.dist-info → pygeai-0.6.0b10.dist-info}/RECORD +227 -124
  224. {pygeai-0.6.0b6.dist-info → pygeai-0.6.0b10.dist-info}/WHEEL +0 -0
  225. {pygeai-0.6.0b6.dist-info → pygeai-0.6.0b10.dist-info}/entry_points.txt +0 -0
  226. {pygeai-0.6.0b6.dist-info → pygeai-0.6.0b10.dist-info}/licenses/LICENSE +0 -0
  227. {pygeai-0.6.0b6.dist-info → pygeai-0.6.0b10.dist-info}/top_level.txt +0 -0
@@ -2,13 +2,14 @@ from pygeai.core.base.clients import BaseClient
2
2
  from pygeai.core.base.session import Session
3
3
  from pygeai.core.common.exceptions import MissingRequirementException
4
4
  from pygeai.core.services.rest import ApiService
5
+ from pygeai.core.utils.validators import validate_status_code
5
6
 
6
7
 
7
8
  class EvaluationClient(BaseClient):
8
9
 
9
10
  def __init__(self, api_key: str = None, base_url: str = None, alias: str = "default", eval_url: str = None):
10
11
  super().__init__(api_key, base_url, alias)
11
- eval_url = self.session.eval_url if not eval_url else None
12
+ eval_url = self.session.eval_url if not eval_url else eval_url
12
13
  if not eval_url:
13
14
  raise MissingRequirementException("EVAL URL must be defined in order to use the Evaluation module.")
14
15
 
@@ -9,6 +9,8 @@ from pygeai.evaluation.dataset.endpoints import (
9
9
  CREATE_FILTER_VARIABLE, LIST_FILTER_VARIABLES, GET_FILTER_VARIABLE, UPDATE_FILTER_VARIABLE, DELETE_FILTER_VARIABLE,
10
10
  UPLOAD_DATASET_ROWS_FILE
11
11
  )
12
+ from pygeai.core.utils.validators import validate_status_code
13
+ from pygeai.core.utils.parsers import parse_json_response
12
14
 
13
15
 
14
16
  class EvaluationDatasetClient(EvaluationClient):
@@ -22,8 +24,8 @@ class EvaluationDatasetClient(EvaluationClient):
22
24
  response = self.api_service.get(
23
25
  endpoint=LIST_DATASETS
24
26
  )
25
- result = response.json()
26
- return result
27
+ validate_status_code(response)
28
+ return parse_json_response(response, "dataset operation")
27
29
 
28
30
  def create_dataset(
29
31
  self,
@@ -56,8 +58,8 @@ class EvaluationDatasetClient(EvaluationClient):
56
58
  endpoint=CREATE_DATASET,
57
59
  data=data
58
60
  )
59
- result = response.json()
60
- return result
61
+ validate_status_code(response)
62
+ return parse_json_response(response, "dataset operation")
61
63
 
62
64
  def create_dataset_from_file(self, file_path: str) -> dict:
63
65
  """
@@ -82,8 +84,8 @@ class EvaluationDatasetClient(EvaluationClient):
82
84
  headers=headers,
83
85
  file=file
84
86
  )
85
- result = response.json()
86
- return result
87
+ validate_status_code(response)
88
+ return parse_json_response(response, "upload dataset file")
87
89
  finally:
88
90
  if file:
89
91
  file.close()
@@ -100,8 +102,8 @@ class EvaluationDatasetClient(EvaluationClient):
100
102
  response = self.api_service.get(
101
103
  endpoint=endpoint
102
104
  )
103
- result = response.json()
104
- return result
105
+ validate_status_code(response)
106
+ return parse_json_response(response, "dataset operation")
105
107
 
106
108
  def update_dataset(
107
109
  self,
@@ -141,8 +143,8 @@ class EvaluationDatasetClient(EvaluationClient):
141
143
  endpoint=endpoint,
142
144
  data=data
143
145
  )
144
- result = response.json()
145
- return result
146
+ validate_status_code(response)
147
+ return parse_json_response(response, "dataset operation")
146
148
 
147
149
  def delete_dataset(self, dataset_id: str) -> dict:
148
150
  """
@@ -156,8 +158,8 @@ class EvaluationDatasetClient(EvaluationClient):
156
158
  response = self.api_service.delete(
157
159
  endpoint=endpoint
158
160
  )
159
- result = response.json()
160
- return result
161
+ validate_status_code(response)
162
+ return parse_json_response(response, "dataset operation")
161
163
 
162
164
  def create_dataset_row(self, dataset_id: str, row: dict) -> dict:
163
165
  """
@@ -173,8 +175,8 @@ class EvaluationDatasetClient(EvaluationClient):
173
175
  endpoint=endpoint,
174
176
  data=row
175
177
  )
176
- result = response.json()
177
- return result
178
+ validate_status_code(response)
179
+ return parse_json_response(response, "dataset operation")
178
180
 
179
181
  def list_dataset_rows(self, dataset_id: str) -> dict:
180
182
  """
@@ -188,8 +190,8 @@ class EvaluationDatasetClient(EvaluationClient):
188
190
  response = self.api_service.get(
189
191
  endpoint=endpoint
190
192
  )
191
- result = response.json()
192
- return result
193
+ validate_status_code(response)
194
+ return parse_json_response(response, "dataset operation")
193
195
 
194
196
  def get_dataset_row(self, dataset_id: str, dataset_row_id: str) -> dict:
195
197
  """
@@ -204,8 +206,8 @@ class EvaluationDatasetClient(EvaluationClient):
204
206
  response = self.api_service.get(
205
207
  endpoint=endpoint
206
208
  )
207
- result = response.json()
208
- return result
209
+ validate_status_code(response)
210
+ return parse_json_response(response, "dataset operation")
209
211
 
210
212
  def update_dataset_row(self, dataset_id: str, dataset_row_id: str, row: dict) -> dict:
211
213
  """
@@ -222,8 +224,8 @@ class EvaluationDatasetClient(EvaluationClient):
222
224
  endpoint=endpoint,
223
225
  data=row
224
226
  )
225
- result = response.json()
226
- return result
227
+ validate_status_code(response)
228
+ return parse_json_response(response, "dataset operation")
227
229
 
228
230
  def delete_dataset_row(self, dataset_id: str, dataset_row_id: str) -> dict:
229
231
  """
@@ -238,8 +240,8 @@ class EvaluationDatasetClient(EvaluationClient):
238
240
  response = self.api_service.delete(
239
241
  endpoint=endpoint
240
242
  )
241
- result = response.json()
242
- return result
243
+ validate_status_code(response)
244
+ return parse_json_response(response, "dataset operation")
243
245
 
244
246
  def create_expected_source(
245
247
  self,
@@ -270,8 +272,8 @@ class EvaluationDatasetClient(EvaluationClient):
270
272
  endpoint=endpoint,
271
273
  data=data
272
274
  )
273
- result = response.json()
274
- return result
275
+ validate_status_code(response)
276
+ return parse_json_response(response, "dataset operation")
275
277
 
276
278
  def list_expected_sources(self, dataset_id: str, dataset_row_id: str) -> dict:
277
279
  """
@@ -286,8 +288,8 @@ class EvaluationDatasetClient(EvaluationClient):
286
288
  response = self.api_service.get(
287
289
  endpoint=endpoint
288
290
  )
289
- result = response.json()
290
- return result
291
+ validate_status_code(response)
292
+ return parse_json_response(response, "dataset operation")
291
293
 
292
294
  def get_expected_source(self, dataset_id: str, dataset_row_id: str, expected_source_id: str) -> dict:
293
295
  """
@@ -303,8 +305,8 @@ class EvaluationDatasetClient(EvaluationClient):
303
305
  response = self.api_service.get(
304
306
  endpoint=endpoint
305
307
  )
306
- result = response.json()
307
- return result
308
+ validate_status_code(response)
309
+ return parse_json_response(response, "dataset operation")
308
310
 
309
311
  def update_expected_source(
310
312
  self,
@@ -337,8 +339,8 @@ class EvaluationDatasetClient(EvaluationClient):
337
339
  endpoint=endpoint,
338
340
  data=data
339
341
  )
340
- result = response.json()
341
- return result
342
+ validate_status_code(response)
343
+ return parse_json_response(response, "dataset operation")
342
344
 
343
345
  def delete_expected_source(self, dataset_id: str, dataset_row_id: str, expected_source_id: str) -> dict:
344
346
  """
@@ -354,8 +356,8 @@ class EvaluationDatasetClient(EvaluationClient):
354
356
  response = self.api_service.delete(
355
357
  endpoint=endpoint
356
358
  )
357
- result = response.json()
358
- return result
359
+ validate_status_code(response)
360
+ return parse_json_response(response, "dataset operation")
359
361
 
360
362
  def create_filter_variable(
361
363
  self,
@@ -389,8 +391,8 @@ class EvaluationDatasetClient(EvaluationClient):
389
391
  endpoint=endpoint,
390
392
  data=data
391
393
  )
392
- result = response.json()
393
- return result
394
+ validate_status_code(response)
395
+ return parse_json_response(response, "dataset operation")
394
396
 
395
397
  def list_filter_variables(self, dataset_id: str, dataset_row_id: str) -> dict:
396
398
  """
@@ -405,8 +407,8 @@ class EvaluationDatasetClient(EvaluationClient):
405
407
  response = self.api_service.get(
406
408
  endpoint=endpoint
407
409
  )
408
- result = response.json()
409
- return result
410
+ validate_status_code(response)
411
+ return parse_json_response(response, "dataset operation")
410
412
 
411
413
  def get_filter_variable(self, dataset_id: str, dataset_row_id: str, filter_variable_id: str) -> dict:
412
414
  """
@@ -422,8 +424,8 @@ class EvaluationDatasetClient(EvaluationClient):
422
424
  response = self.api_service.get(
423
425
  endpoint=endpoint
424
426
  )
425
- result = response.json()
426
- return result
427
+ validate_status_code(response)
428
+ return parse_json_response(response, "dataset operation")
427
429
 
428
430
  def update_filter_variable(
429
431
  self,
@@ -459,8 +461,8 @@ class EvaluationDatasetClient(EvaluationClient):
459
461
  endpoint=endpoint,
460
462
  data=data
461
463
  )
462
- result = response.json()
463
- return result
464
+ validate_status_code(response)
465
+ return parse_json_response(response, "dataset operation")
464
466
 
465
467
  def delete_filter_variable(self, dataset_id: str, dataset_row_id: str, filter_variable_id: str) -> dict:
466
468
  """
@@ -476,8 +478,8 @@ class EvaluationDatasetClient(EvaluationClient):
476
478
  response = self.api_service.delete(
477
479
  endpoint=endpoint
478
480
  )
479
- result = response.json()
480
- return result
481
+ validate_status_code(response)
482
+ return parse_json_response(response, "dataset operation")
481
483
 
482
484
  def upload_dataset_rows_file(self, dataset_id: str, file_path: str) -> dict:
483
485
  """
@@ -504,8 +506,8 @@ class EvaluationDatasetClient(EvaluationClient):
504
506
  headers=headers,
505
507
  file=file
506
508
  )
507
- result = response.json()
508
- return result
509
+ validate_status_code(response)
510
+ return parse_json_response(response, "upload dataset rows file")
509
511
  finally:
510
512
  if file:
511
513
  file.close()
@@ -5,6 +5,8 @@ from pygeai.evaluation.plan.endpoints import LIST_EVALUATION_PLANS, CREATE_EVALU
5
5
  UPDATE_EVALUATION_PLAN, DELETE_EVALUATION_PLAN, LIST_EVALUATION_PLAN_SYSTEM_METRICS, \
6
6
  ADD_EVALUATION_PLAN_SYSTEM_METRIC, GET_EVALUATION_PLAN_SYSTEM_METRIC, UPDATE_EVALUATION_PLAN_SYSTEM_METRIC, \
7
7
  DELETE_EVALUATION_PLAN_SYSTEM_METRIC, LIST_SYSTEM_METRICS, GET_SYSTEM_METRIC, EXECUTE_EVALUATION_PLAN
8
+ from pygeai.core.utils.validators import validate_status_code
9
+ from pygeai.core.utils.parsers import parse_json_response
8
10
 
9
11
 
10
12
  class EvaluationPlanClient(EvaluationClient):
@@ -18,8 +20,8 @@ class EvaluationPlanClient(EvaluationClient):
18
20
  response = self.api_service.get(
19
21
  endpoint=LIST_EVALUATION_PLANS
20
22
  )
21
- result = json.loads(response.content)
22
- return result
23
+ validate_status_code(response)
24
+ return parse_json_response(response, "evaluation plan operation")
23
25
 
24
26
  def create_evaluation_plan(
25
27
  self,
@@ -68,8 +70,8 @@ class EvaluationPlanClient(EvaluationClient):
68
70
  endpoint=CREATE_EVALUATION_PLAN,
69
71
  data=data
70
72
  )
71
- result = json.loads(response.content)
72
- return result
73
+ validate_status_code(response)
74
+ return parse_json_response(response, "evaluation plan operation")
73
75
 
74
76
  def get_evaluation_plan(self, evaluation_plan_id: str) -> dict:
75
77
  """
@@ -83,8 +85,8 @@ class EvaluationPlanClient(EvaluationClient):
83
85
  response = self.api_service.get(
84
86
  endpoint=endpoint
85
87
  )
86
- result = json.loads(response.content)
87
- return result
88
+ validate_status_code(response)
89
+ return parse_json_response(response, "evaluation plan operation")
88
90
 
89
91
  def update_evaluation_plan(
90
92
  self,
@@ -139,8 +141,8 @@ class EvaluationPlanClient(EvaluationClient):
139
141
  endpoint=endpoint,
140
142
  data=data
141
143
  )
142
- result = json.loads(response.content)
143
- return result
144
+ validate_status_code(response)
145
+ return parse_json_response(response, "evaluation plan operation")
144
146
 
145
147
  def delete_evaluation_plan(self, evaluation_plan_id: str) -> dict:
146
148
  """
@@ -154,8 +156,8 @@ class EvaluationPlanClient(EvaluationClient):
154
156
  response = self.api_service.delete(
155
157
  endpoint=endpoint
156
158
  )
157
- result = json.loads(response.content)
158
- return result
159
+ validate_status_code(response)
160
+ return parse_json_response(response, "evaluation plan operation")
159
161
 
160
162
  def list_evaluation_plan_system_metrics(self, evaluation_plan_id: str) -> dict:
161
163
  """
@@ -169,8 +171,8 @@ class EvaluationPlanClient(EvaluationClient):
169
171
  response = self.api_service.get(
170
172
  endpoint=endpoint
171
173
  )
172
- result = json.loads(response.content)
173
- return result
174
+ validate_status_code(response)
175
+ return parse_json_response(response, "evaluation plan operation")
174
176
 
175
177
  def add_evaluation_plan_system_metric(
176
178
  self,
@@ -196,8 +198,8 @@ class EvaluationPlanClient(EvaluationClient):
196
198
  endpoint=endpoint,
197
199
  data=data
198
200
  )
199
- result = json.loads(response.content)
200
- return result
201
+ validate_status_code(response)
202
+ return parse_json_response(response, "evaluation plan operation")
201
203
 
202
204
  def get_evaluation_plan_system_metric(self, evaluation_plan_id: str, system_metric_id: str) -> dict:
203
205
  """
@@ -212,8 +214,8 @@ class EvaluationPlanClient(EvaluationClient):
212
214
  response = self.api_service.get(
213
215
  endpoint=endpoint
214
216
  )
215
- result = json.loads(response.content)
216
- return result
217
+ validate_status_code(response)
218
+ return parse_json_response(response, "evaluation plan operation")
217
219
 
218
220
  def update_evaluation_plan_system_metric(
219
221
  self,
@@ -238,8 +240,8 @@ class EvaluationPlanClient(EvaluationClient):
238
240
  endpoint=endpoint,
239
241
  data=data
240
242
  )
241
- result = json.loads(response.content)
242
- return result
243
+ validate_status_code(response)
244
+ return parse_json_response(response, "evaluation plan operation")
243
245
 
244
246
  def delete_evaluation_plan_system_metric(self, evaluation_plan_id: str, system_metric_id: str) -> dict:
245
247
  """
@@ -254,8 +256,8 @@ class EvaluationPlanClient(EvaluationClient):
254
256
  response = self.api_service.delete(
255
257
  endpoint=endpoint
256
258
  )
257
- result = json.loads(response.content)
258
- return result
259
+ validate_status_code(response)
260
+ return parse_json_response(response, "evaluation plan operation")
259
261
 
260
262
  def list_system_metrics(self) -> dict:
261
263
  """
@@ -266,8 +268,8 @@ class EvaluationPlanClient(EvaluationClient):
266
268
  response = self.api_service.get(
267
269
  endpoint=LIST_SYSTEM_METRICS
268
270
  )
269
- result = json.loads(response.content)
270
- return result
271
+ validate_status_code(response)
272
+ return parse_json_response(response, "evaluation plan operation")
271
273
 
272
274
  def get_system_metric(self, system_metric_id: str) -> dict:
273
275
  """
@@ -281,8 +283,8 @@ class EvaluationPlanClient(EvaluationClient):
281
283
  response = self.api_service.get(
282
284
  endpoint=endpoint
283
285
  )
284
- result = json.loads(response.content)
285
- return result
286
+ validate_status_code(response)
287
+ return parse_json_response(response, "evaluation plan operation")
286
288
 
287
289
  def execute_evaluation_plan(self, evaluation_plan_id: str) -> dict:
288
290
  """
@@ -296,5 +298,5 @@ class EvaluationPlanClient(EvaluationClient):
296
298
  response = self.api_service.post(
297
299
  endpoint=endpoint,
298
300
  )
299
- result = json.loads(response.content)
300
- return result
301
+ validate_status_code(response)
302
+ return parse_json_response(response, "evaluation plan operation")
@@ -2,9 +2,27 @@ import json
2
2
 
3
3
  from pygeai.evaluation.clients import EvaluationClient
4
4
  from pygeai.evaluation.result.endpoints import LIST_EVALUATION_RESULTS, GET_EVALUATION_RESULT
5
+ from pygeai.core.utils.validators import validate_status_code
6
+ from pygeai.core.utils.parsers import parse_json_response
5
7
 
6
8
 
7
9
  class EvaluationResultClient(EvaluationClient):
10
+ """
11
+ Client for interacting with the Evaluation Result API.
12
+
13
+ This API is read-only and retrieves results from executed evaluation plans.
14
+
15
+ .. warning::
16
+ The API documentation at https://docs.globant.ai/en/wiki?856,Evaluation+Result+API
17
+ contains several typos in field names. The actual API responses use these typo'd names:
18
+
19
+ - evaluationResultAssitantRevision (missing 's' in Assistant)
20
+ - evaluationResultChunckCount (should be Chunk, not Chunck)
21
+ - evaluationResultChunckSize (should be Chunk, not Chunck)
22
+ - evaluationResultaMaxTokens (lowercase 'a' should be uppercase 'M', no 'a')
23
+
24
+ Our implementation returns these fields as-is from the API.
25
+ """
8
26
 
9
27
  def list_evaluation_results(self, evaluation_plan_id: str) -> dict:
10
28
  """
@@ -13,13 +31,20 @@ class EvaluationResultClient(EvaluationClient):
13
31
  :param evaluation_plan_id: str - The ID of the evaluation plan.
14
32
 
15
33
  :return: dict - API response containing a list of evaluation results.
34
+
35
+ .. note::
36
+ Response contains evaluation result objects with fields including:
37
+ dataSetId, evaluationPlanId, evaluationResultId, evaluationResultStatus,
38
+ evaluationResultCost, evaluationResultDuration, and others.
39
+
40
+ See class documentation for field name typos in the API.
16
41
  """
17
42
  endpoint = LIST_EVALUATION_RESULTS.format(evaluationPlanId=evaluation_plan_id)
18
43
  response = self.api_service.get(
19
44
  endpoint=endpoint
20
45
  )
21
- result = json.loads(response.content)
22
- return result
46
+ validate_status_code(response)
47
+ return parse_json_response(response, "evaluation plan operation")
23
48
 
24
49
  def get_evaluation_result(self, evaluation_result_id: str) -> dict:
25
50
  """
@@ -27,11 +52,19 @@ class EvaluationResultClient(EvaluationClient):
27
52
 
28
53
  :param evaluation_result_id: str - The ID of the evaluation result.
29
54
 
30
- :return: dict - The evaluation result metadata as a dictionary.
55
+ :return: dict - The evaluation result metadata as a dictionary, including row-level data.
56
+
57
+ .. note::
58
+ Response includes all fields from list_evaluation_results plus a 'rows' array
59
+ containing detailed row-level evaluation data with fields like:
60
+ dataSetRowId, evaluationResultRowStatus, evaluationResultRowOutput,
61
+ evaluationResultRowCost, etc.
62
+
63
+ See class documentation for field name typos in the API.
31
64
  """
32
65
  endpoint = GET_EVALUATION_RESULT.format(evaluationResultId=evaluation_result_id)
33
66
  response = self.api_service.get(
34
67
  endpoint=endpoint
35
68
  )
36
- result = json.loads(response.content)
37
- return result
69
+ validate_status_code(response)
70
+ return parse_json_response(response, "evaluation plan operation")
pygeai/gam/clients.py CHANGED
@@ -1,8 +1,9 @@
1
- from json import JSONDecodeError
2
1
 
3
2
  from pygeai import logger
4
3
  from pygeai.core.base.clients import BaseClient
5
4
  from pygeai.core.common.exceptions import MissingRequirementException, InvalidAPIResponseException
5
+ from pygeai.core.utils.validators import validate_status_code
6
+ from pygeai.core.utils.parsers import parse_json_response
6
7
  from pygeai.gam.endpoints import GET_ACCESS_TOKEN_V2, GET_USER_INFO_V2, IDP_SIGNIN_V1
7
8
 
8
9
 
@@ -104,12 +105,8 @@ class GAMClient(BaseClient):
104
105
  headers=headers,
105
106
  form=True
106
107
  )
107
- try:
108
- result = response.json()
109
- return result
110
- except JSONDecodeError as e:
111
- logger.error(f"Unable to get access token: JSON parsing error (status {response.status_code}): {e}. Response: {response.text}")
112
- raise InvalidAPIResponseException(f"Unable to get access token: {response.text}")
108
+ validate_status_code(response)
109
+ return parse_json_response(response, "get access token")
113
110
 
114
111
  def get_user_info(
115
112
  self,
@@ -130,12 +127,8 @@ class GAMClient(BaseClient):
130
127
  endpoint=GET_USER_INFO_V2,
131
128
  headers=headers
132
129
  )
133
- try:
134
- result = response.json()
135
- return result
136
- except JSONDecodeError as e:
137
- logger.error(f"Unable to get user info: JSON parsing error (status {response.status_code}): {e}. Response: {response.text}")
138
- raise InvalidAPIResponseException(f"Unable to get user info: {response.text}")
130
+ validate_status_code(response)
131
+ return parse_json_response(response, "get user info")
139
132
 
140
133
  def refresh_access_token(
141
134
  self,
@@ -173,21 +166,13 @@ class GAMClient(BaseClient):
173
166
  headers=headers,
174
167
  form=True
175
168
  )
176
- try:
177
- result = response.json()
178
- return result
179
- except JSONDecodeError as e:
180
- logger.error(f"Unable to refresh access token: JSON parsing error (status {response.status_code}): {e}. Response: {response.text}")
181
- raise InvalidAPIResponseException(f"Unable to refresh access token: {response.text}")
169
+ validate_status_code(response)
170
+ return parse_json_response(response, "refresh access token")
182
171
 
183
172
  def get_authentication_types(self):
184
173
  response = self.api_service.get(
185
174
  endpoint=GET_ACCESS_TOKEN_V2,
186
175
  params={},
187
176
  )
188
- try:
189
- result = response.json()
190
- return result
191
- except JSONDecodeError as e:
192
- logger.error(f"Unable to get authentication types: JSON parsing error (status {response.status_code}): {e}. Response: {response.text}")
193
- raise InvalidAPIResponseException(f"Unable to get authentication types: {response.text}")
177
+ validate_status_code(response)
178
+ return parse_json_response(response, "get authentication types")
pygeai/health/clients.py CHANGED
@@ -1,8 +1,9 @@
1
- from json import JSONDecodeError
2
1
 
3
2
  from pygeai import logger
4
3
  from pygeai.core.base.clients import BaseClient
5
4
  from pygeai.core.common.exceptions import InvalidAPIResponseException
5
+ from pygeai.core.utils.validators import validate_status_code
6
+ from pygeai.core.utils.parsers import parse_json_response
6
7
  from pygeai.health.endpoints import STATUS_CHECK_V1
7
8
 
8
9
 
@@ -19,9 +20,5 @@ class HealthClient(BaseClient):
19
20
  response = self.api_service.get(
20
21
  endpoint=endpoint
21
22
  )
22
- try:
23
- result = response.json()
24
- return result
25
- except JSONDecodeError as e:
26
- logger.error(f"Unable to check API status: JSON parsing error (status {response.status_code}): {e}. Response: {response.text}")
27
- raise InvalidAPIResponseException(f"Unable to check API status: {response.text}")
23
+ validate_status_code(response)
24
+ return parse_json_response(response, "check API status")