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
@@ -9,7 +9,8 @@ from pygeai.core.base.responses import EmptyResponse
9
9
  from pygeai.organization.managers import OrganizationManager
10
10
  from pygeai.organization.mappers import OrganizationResponseMapper
11
11
  from pygeai.organization.responses import AssistantListResponse, ProjectListResponse, ProjectDataResponse, \
12
- ProjectTokensResponse, ProjectItemListResponse
12
+ ProjectTokensResponse, ProjectItemListResponse, MembershipsResponse, ProjectMembershipsResponse, \
13
+ ProjectRolesResponse, ProjectMembersResponse, OrganizationMembersResponse
13
14
 
14
15
 
15
16
  class TestOrganizationManager(unittest.TestCase):
@@ -261,3 +262,123 @@ class TestOrganizationManager(unittest.TestCase):
261
262
  skip=0,
262
263
  count=0
263
264
  )
265
+
266
+ @patch("pygeai.organization.clients.OrganizationClient.get_memberships")
267
+ def test_get_memberships(self, mock_get_memberships):
268
+ mock_response = MembershipsResponse(count=0, pages=0, organizations=[])
269
+ mock_get_memberships.return_value = {}
270
+
271
+ with patch.object(OrganizationResponseMapper, 'map_to_memberships_response', return_value=mock_response):
272
+ response = self.manager.get_memberships()
273
+
274
+ self.assertIsInstance(response, MembershipsResponse)
275
+ self.assertEqual(response.count, 0)
276
+ mock_get_memberships.assert_called_once_with(email=None, start_page=1, page_size=20, order_key=None, order_direction="desc", role_types=None)
277
+
278
+ @patch("pygeai.organization.clients.OrganizationClient.get_memberships")
279
+ def test_get_memberships_error(self, mock_get_memberships):
280
+ mock_get_memberships.return_value = self.error_response
281
+
282
+ with patch.object(ErrorHandler, 'has_errors', return_value=True):
283
+ with patch.object(ErrorHandler, 'extract_error', return_value="Access denied"):
284
+ with self.assertRaises(APIError) as context:
285
+ self.manager.get_memberships()
286
+
287
+ self.assertIn("Error received while retrieving memberships", str(context.exception))
288
+ mock_get_memberships.assert_called_once_with(email=None, start_page=1, page_size=20, order_key=None, order_direction="desc", role_types=None)
289
+
290
+ @patch("pygeai.organization.clients.OrganizationClient.get_project_memberships")
291
+ def test_get_project_memberships(self, mock_get_project_memberships):
292
+ mock_response = ProjectMembershipsResponse(count=0, pages=0, projects=[])
293
+ mock_get_project_memberships.return_value = {}
294
+
295
+ with patch.object(OrganizationResponseMapper, 'map_to_project_memberships_response', return_value=mock_response):
296
+ response = self.manager.get_project_memberships()
297
+
298
+ self.assertIsInstance(response, ProjectMembershipsResponse)
299
+ self.assertEqual(response.count, 0)
300
+ mock_get_project_memberships.assert_called_once_with(email=None, start_page=1, page_size=20, order_key=None, order_direction="desc", role_types=None)
301
+
302
+ @patch("pygeai.organization.clients.OrganizationClient.get_project_memberships")
303
+ def test_get_project_memberships_error(self, mock_get_project_memberships):
304
+ mock_get_project_memberships.return_value = self.error_response
305
+
306
+ with patch.object(ErrorHandler, 'has_errors', return_value=True):
307
+ with patch.object(ErrorHandler, 'extract_error', return_value="Access denied"):
308
+ with self.assertRaises(APIError) as context:
309
+ self.manager.get_project_memberships()
310
+
311
+ self.assertIn("Error received while retrieving project memberships", str(context.exception))
312
+ mock_get_project_memberships.assert_called_once_with(email=None, start_page=1, page_size=20, order_key=None, order_direction="desc", role_types=None)
313
+
314
+ @patch("pygeai.organization.clients.OrganizationClient.get_project_roles")
315
+ def test_get_project_roles(self, mock_get_project_roles):
316
+ mock_response = ProjectRolesResponse(roles=[])
317
+ mock_get_project_roles.return_value = {}
318
+
319
+ with patch.object(OrganizationResponseMapper, 'map_to_project_roles_response', return_value=mock_response):
320
+ response = self.manager.get_project_roles("proj-123")
321
+
322
+ self.assertIsInstance(response, ProjectRolesResponse)
323
+ self.assertEqual(response.roles, [])
324
+ mock_get_project_roles.assert_called_once_with(project_id="proj-123")
325
+
326
+ @patch("pygeai.organization.clients.OrganizationClient.get_project_roles")
327
+ def test_get_project_roles_error(self, mock_get_project_roles):
328
+ mock_get_project_roles.return_value = self.error_response
329
+
330
+ with patch.object(ErrorHandler, 'has_errors', return_value=True):
331
+ with patch.object(ErrorHandler, 'extract_error', return_value="Project not found"):
332
+ with self.assertRaises(APIError) as context:
333
+ self.manager.get_project_roles("proj-123")
334
+
335
+ self.assertIn("Error received while retrieving project roles", str(context.exception))
336
+ mock_get_project_roles.assert_called_once_with(project_id="proj-123")
337
+
338
+ @patch("pygeai.organization.clients.OrganizationClient.get_project_members")
339
+ def test_get_project_members(self, mock_get_project_members):
340
+ mock_response = ProjectMembersResponse(members=[])
341
+ mock_get_project_members.return_value = {}
342
+
343
+ with patch.object(OrganizationResponseMapper, 'map_to_project_members_response', return_value=mock_response):
344
+ response = self.manager.get_project_members("proj-123")
345
+
346
+ self.assertIsInstance(response, ProjectMembersResponse)
347
+ self.assertEqual(response.members, [])
348
+ mock_get_project_members.assert_called_once_with(project_id="proj-123")
349
+
350
+ @patch("pygeai.organization.clients.OrganizationClient.get_project_members")
351
+ def test_get_project_members_error(self, mock_get_project_members):
352
+ mock_get_project_members.return_value = self.error_response
353
+
354
+ with patch.object(ErrorHandler, 'has_errors', return_value=True):
355
+ with patch.object(ErrorHandler, 'extract_error', return_value="Project not found"):
356
+ with self.assertRaises(APIError) as context:
357
+ self.manager.get_project_members("proj-123")
358
+
359
+ self.assertIn("Error received while retrieving project members", str(context.exception))
360
+ mock_get_project_members.assert_called_once_with(project_id="proj-123")
361
+
362
+ @patch("pygeai.organization.clients.OrganizationClient.get_organization_members")
363
+ def test_get_organization_members(self, mock_get_organization_members):
364
+ mock_response = OrganizationMembersResponse(members=[])
365
+ mock_get_organization_members.return_value = {}
366
+
367
+ with patch.object(OrganizationResponseMapper, 'map_to_organization_members_response', return_value=mock_response):
368
+ response = self.manager.get_organization_members("org-123")
369
+
370
+ self.assertIsInstance(response, OrganizationMembersResponse)
371
+ self.assertEqual(response.members, [])
372
+ mock_get_organization_members.assert_called_once_with(organization_id="org-123")
373
+
374
+ @patch("pygeai.organization.clients.OrganizationClient.get_organization_members")
375
+ def test_get_organization_members_error(self, mock_get_organization_members):
376
+ mock_get_organization_members.return_value = self.error_response
377
+
378
+ with patch.object(ErrorHandler, 'has_errors', return_value=True):
379
+ with patch.object(ErrorHandler, 'extract_error', return_value="Organization not found"):
380
+ with self.assertRaises(APIError) as context:
381
+ self.manager.get_organization_members("org-123")
382
+
383
+ self.assertIn("Error received while retrieving organization members", str(context.exception))
384
+ mock_get_organization_members.assert_called_once_with(organization_id="org-123")
@@ -247,6 +247,7 @@ class TestProxyClient(unittest.TestCase):
247
247
  """Test successful request."""
248
248
  mock_response = Mock()
249
249
  mock_response.json.return_value = {"status": "success"}
250
+ mock_response.status_code = 200
250
251
  mock_response.raise_for_status.return_value = None
251
252
  mock_session.return_value.request.return_value = mock_response
252
253
 
@@ -311,6 +312,7 @@ class TestProxyClient(unittest.TestCase):
311
312
  mock_response = Mock()
312
313
  mock_response.json.side_effect = ValueError("Invalid JSON")
313
314
  mock_response.text = "plain text response"
315
+ mock_response.status_code = 200
314
316
  mock_response.raise_for_status.return_value = None
315
317
  mock_session.return_value.request.return_value = mock_response
316
318
 
@@ -230,6 +230,7 @@ class TestProxyIntegration(unittest.IsolatedAsyncioTestCase):
230
230
  # Mock response
231
231
  mock_response = Mock()
232
232
  mock_response.json.return_value = {"status": "success", "data": "test_data"}
233
+ mock_response.status_code = 200
233
234
  mock_response.raise_for_status.return_value = None
234
235
  mock_session.return_value.request.return_value = mock_response
235
236
 
File without changes
@@ -0,0 +1,18 @@
1
+ from pygeai.chat.clients import ChatClient
2
+
3
+ client = ChatClient()
4
+
5
+ messages = [
6
+ {
7
+ "role": "user",
8
+ "content": "Explain quantum computing in simple terms"
9
+ }
10
+ ]
11
+
12
+ response = client.chat_completion(
13
+ model="openai/gpt-4o",
14
+ messages=messages,
15
+ reasoning_effort="high"
16
+ )
17
+
18
+ print(response)
@@ -0,0 +1,15 @@
1
+ from pygeai.chat.clients import ChatClient
2
+
3
+ client = ChatClient()
4
+
5
+ model = "openai/o1-pro"
6
+ input_text = "What is the weather like in Paris today?"
7
+
8
+ response = client.get_response(
9
+ model=model,
10
+ input=input_text,
11
+ temperature=0.7,
12
+ max_output_tokens=1000
13
+ )
14
+
15
+ print(response)
@@ -0,0 +1,20 @@
1
+ from pygeai.chat.clients import ChatClient
2
+
3
+ client = ChatClient()
4
+
5
+ model = "openai/o1-pro"
6
+ input_text = "Tell me a short story about a robot"
7
+
8
+ response = client.get_response(
9
+ model=model,
10
+ input=input_text,
11
+ stream=True,
12
+ temperature=0.7,
13
+ max_output_tokens=500
14
+ )
15
+
16
+ print("Streaming response:")
17
+ for chunk in response:
18
+ print(chunk, end='', flush=True)
19
+
20
+ print("\n\nStreaming complete!")
@@ -0,0 +1,16 @@
1
+ from pygeai.chat.clients import ChatClient
2
+
3
+ client = ChatClient()
4
+
5
+ model = "openai/o1-pro"
6
+ input_text = "Please analyze this image and describe what you see"
7
+ files = ["files/image.svg", "files/document.pdf"]
8
+
9
+ response = client.get_response(
10
+ model=model,
11
+ input=input_text,
12
+ files=files,
13
+ temperature=0.7
14
+ )
15
+
16
+ print(response)
@@ -0,0 +1,36 @@
1
+ from pygeai.chat.clients import ChatClient
2
+
3
+ client = ChatClient()
4
+
5
+ model = "openai/o1-pro"
6
+ input_text = "What is the weather like in Paris today?"
7
+
8
+ tools = [
9
+ {
10
+ "type": "function",
11
+ "name": "get_weather",
12
+ "description": "Get current temperature for a given location.",
13
+ "parameters": {
14
+ "type": "object",
15
+ "properties": {
16
+ "location": {
17
+ "type": "string",
18
+ "description": "City and country e.g. Paris, France"
19
+ }
20
+ },
21
+ "required": ["location"],
22
+ "additionalProperties": False
23
+ }
24
+ }
25
+ ]
26
+
27
+ response = client.get_response(
28
+ model=model,
29
+ input=input_text,
30
+ tools=tools,
31
+ tool_choice="auto",
32
+ temperature=1.0,
33
+ reasoning={"effort": "medium"}
34
+ )
35
+
36
+ print(response)
File without changes
@@ -0,0 +1,32 @@
1
+ """
2
+ Basic debugging example with geai-dbg.
3
+
4
+ This demonstrates setting breakpoints and inspecting variables.
5
+ """
6
+ from pygeai.dbg.debugger import Debugger
7
+
8
+
9
+ def example_function(x, y):
10
+ """A simple function to debug."""
11
+ result = x + y
12
+ print(f"Result: {result}")
13
+ return result
14
+
15
+
16
+ def main():
17
+ """Main entry point."""
18
+ a = 10
19
+ b = 20
20
+ c = example_function(a, b)
21
+ print(f"Final value: {c}")
22
+
23
+
24
+ if __name__ == "__main__":
25
+ dbg = Debugger(target=main, module_filter="__main__")
26
+ dbg.add_breakpoint(module="__main__", function_name="example_function")
27
+
28
+ print("Starting debugger...")
29
+ print("Type 'h' for help")
30
+ print("Try commands like: 'p x', 'p y', 'locals', 's', 'n', 'c'")
31
+
32
+ dbg.run()
@@ -0,0 +1,48 @@
1
+ """
2
+ Demonstrates breakpoint management (add, list, remove, enable/disable).
3
+ """
4
+ from pygeai.dbg.debugger import Debugger
5
+
6
+
7
+ def func_a():
8
+ """Function A."""
9
+ print("In function A")
10
+ return "A"
11
+
12
+
13
+ def func_b():
14
+ """Function B."""
15
+ print("In function B")
16
+ return "B"
17
+
18
+
19
+ def func_c():
20
+ """Function C."""
21
+ print("In function C")
22
+ return "C"
23
+
24
+
25
+ def main():
26
+ """Main entry point."""
27
+ results = []
28
+ results.append(func_a())
29
+ results.append(func_b())
30
+ results.append(func_c())
31
+ print(f"Results: {results}")
32
+
33
+
34
+ if __name__ == "__main__":
35
+ dbg = Debugger(target=main, module_filter="__main__")
36
+
37
+ print("Starting debugger...")
38
+ print("No breakpoints set initially. At first function, try:")
39
+ print(" 'b func_b' - add breakpoint on func_b")
40
+ print(" 'b __main__:func_c' - add breakpoint on specific module:function")
41
+ print(" 'b' - list all breakpoints")
42
+ print(" 'dis func_b' - disable breakpoint on func_b")
43
+ print(" 'en func_b' - enable breakpoint on func_b")
44
+ print(" 'cl func_b' - remove breakpoint on func_b")
45
+ print(" 'c' - continue to next breakpoint")
46
+
47
+ dbg.add_breakpoint(module="__main__", function_name="func_a")
48
+ dbg.run()
@@ -0,0 +1,45 @@
1
+ """
2
+ Demonstrates stack navigation (up, down, where).
3
+ """
4
+ from pygeai.dbg.debugger import Debugger
5
+
6
+
7
+ def level_3():
8
+ """Deepest level of call stack."""
9
+ value = "level 3"
10
+ print(f"At {value}")
11
+ return value
12
+
13
+
14
+ def level_2():
15
+ """Middle level of call stack."""
16
+ value = "level 2"
17
+ result = level_3()
18
+ return f"{value} -> {result}"
19
+
20
+
21
+ def level_1():
22
+ """Top level of call stack."""
23
+ value = "level 1"
24
+ result = level_2()
25
+ return f"{value} -> {result}"
26
+
27
+
28
+ def main():
29
+ """Main entry point."""
30
+ result = level_1()
31
+ print(f"Final: {result}")
32
+
33
+
34
+ if __name__ == "__main__":
35
+ dbg = Debugger(target=main, module_filter="__main__")
36
+ dbg.add_breakpoint(module="__main__", function_name="level_3")
37
+
38
+ print("Starting debugger...")
39
+ print("At breakpoint in level_3, try:")
40
+ print(" 'where' or 'bt' - show call stack")
41
+ print(" 'up' - move to level_2 frame")
42
+ print(" 'down' - move back to level_3 frame")
43
+ print(" 'locals' - show local variables in current frame")
44
+
45
+ dbg.run()
@@ -0,0 +1,40 @@
1
+ """
2
+ Demonstrates stepping functionality (step, next, return).
3
+ """
4
+ from pygeai.dbg.debugger import Debugger
5
+
6
+
7
+ def helper_function(n):
8
+ """Helper function to demonstrate step-into."""
9
+ doubled = n * 2
10
+ return doubled
11
+
12
+
13
+ def process_data(data):
14
+ """Process some data."""
15
+ result = []
16
+ for item in data:
17
+ processed = helper_function(item)
18
+ result.append(processed)
19
+ return result
20
+
21
+
22
+ def main():
23
+ """Main entry point."""
24
+ numbers = [1, 2, 3, 4, 5]
25
+ processed = process_data(numbers)
26
+ print(f"Processed: {processed}")
27
+
28
+
29
+ if __name__ == "__main__":
30
+ dbg = Debugger(target=main, module_filter="__main__")
31
+ dbg.add_breakpoint(module="__main__", function_name="process_data")
32
+
33
+ print("Starting debugger...")
34
+ print("At breakpoint, try:")
35
+ print(" 's' - step into helper_function")
36
+ print(" 'n' - step over helper_function call")
37
+ print(" 'ret' - return from current function")
38
+ print(" 'l' - list source code")
39
+
40
+ dbg.run()
@@ -0,0 +1,31 @@
1
+ from pygeai.core.embeddings.managers import EmbeddingsManager
2
+ from pygeai.core.embeddings.models import EmbeddingConfiguration
3
+ from pygeai.core.services.llm.model import Model
4
+ from pygeai.core.services.llm.providers import Provider
5
+ import time
6
+
7
+ manager = EmbeddingsManager()
8
+
9
+ inputs = ["This text will be cached for faster repeated access"]
10
+
11
+ configuration = EmbeddingConfiguration(
12
+ inputs=inputs,
13
+ model=f"{Provider.OPENAI}/{Model.OpenAI.TEXT_EMBEDDING_3_SMALL}",
14
+ cache=True
15
+ )
16
+
17
+ print("First request (not cached)...")
18
+ start = time.time()
19
+ embeddings1 = manager.generate_embeddings(configuration)
20
+ elapsed1 = time.time() - start
21
+ print(f"Time: {elapsed1:.3f}s")
22
+ print(f"Cost: ${embeddings1.usage.total_cost} {embeddings1.usage.currency}")
23
+
24
+ print("\nSecond request (should be cached)...")
25
+ start = time.time()
26
+ embeddings2 = manager.generate_embeddings(configuration)
27
+ elapsed2 = time.time() - start
28
+ print(f"Time: {elapsed2:.3f}s")
29
+ print(f"Cost: ${embeddings2.usage.total_cost} {embeddings2.usage.currency}")
30
+
31
+ print(f"\nCache speedup: {elapsed1/elapsed2:.2f}x faster")
@@ -0,0 +1,41 @@
1
+ from pygeai.core.embeddings.managers import EmbeddingsManager
2
+ from pygeai.core.embeddings.models import EmbeddingConfiguration
3
+ from pygeai.core.services.llm.model import Model
4
+ from pygeai.core.services.llm.providers import Provider
5
+
6
+ manager = EmbeddingsManager()
7
+
8
+ document_inputs = [
9
+ "Machine learning is a subset of artificial intelligence",
10
+ "Neural networks are inspired by the human brain"
11
+ ]
12
+
13
+ configuration = EmbeddingConfiguration(
14
+ inputs=document_inputs,
15
+ model=f"{Provider.COHERE}/{Model.Cohere.EMBED_ENGLISH_V3_0}",
16
+ input_type="search_document",
17
+ timeout=600,
18
+ cache=False
19
+ )
20
+
21
+ embeddings = manager.generate_embeddings(configuration)
22
+
23
+ print(f"Model: {embeddings.model}")
24
+ print(f"Input type: search_document")
25
+ print(f"Documents embedded: {len(embeddings.data)}")
26
+ print(f"Usage - Prompt tokens: {embeddings.usage.prompt_tokens}")
27
+ print(f"Usage - Total cost: ${embeddings.usage.total_cost} {embeddings.usage.currency}")
28
+
29
+ query_input = ["What is neural network?"]
30
+
31
+ query_configuration = EmbeddingConfiguration(
32
+ inputs=query_input,
33
+ model=f"{Provider.COHERE}/{Model.Cohere.EMBED_ENGLISH_V3_0}",
34
+ input_type="search_query",
35
+ timeout=600,
36
+ cache=False
37
+ )
38
+
39
+ query_embeddings = manager.generate_embeddings(query_configuration)
40
+ print(f"\nQuery embedded with input_type: search_query")
41
+ print(f"Usage - Total cost: ${query_embeddings.usage.total_cost} {query_embeddings.usage.currency}")
@@ -0,0 +1,27 @@
1
+ from pygeai.core.embeddings.managers import EmbeddingsManager
2
+ from pygeai.core.embeddings.models import EmbeddingConfiguration
3
+ from pygeai.core.services.llm.model import Model
4
+ from pygeai.core.services.llm.providers import Provider
5
+
6
+ manager = EmbeddingsManager()
7
+
8
+ inputs = ["Text to embed with base64 encoding"]
9
+
10
+ configuration = EmbeddingConfiguration(
11
+ inputs=inputs,
12
+ model=f"{Provider.OPENAI}/{Model.OpenAI.TEXT_EMBEDDING_3_SMALL}",
13
+ encoding_format="base64",
14
+ dimensions=512,
15
+ user=None,
16
+ input_type=None,
17
+ timeout=600,
18
+ cache=False
19
+ )
20
+
21
+ embeddings = manager.generate_embeddings(configuration)
22
+
23
+ print(f"Model: {embeddings.model}")
24
+ print(f"Encoding format: base64")
25
+ print(f"Embedding (base64 encoded, first 100 chars): {embeddings.data[0].embedding[:100]}")
26
+ print(f"Type of embedding: {type(embeddings.data[0].embedding)}")
27
+ print(f"Usage - Total cost: ${embeddings.usage.total_cost} {embeddings.usage.currency}")
@@ -0,0 +1,30 @@
1
+ from pygeai.core.embeddings.managers import EmbeddingsManager
2
+ from pygeai.core.embeddings.models import EmbeddingConfiguration
3
+ from pygeai.core.services.llm.model import Model
4
+ from pygeai.core.services.llm.providers import Provider
5
+
6
+ manager = EmbeddingsManager()
7
+
8
+ inputs = [
9
+ "The quick brown fox jumps over the lazy dog",
10
+ "Python is a high-level programming language"
11
+ ]
12
+
13
+ configuration = EmbeddingConfiguration(
14
+ inputs=inputs,
15
+ model=f"{Provider.OPENAI}/{Model.OpenAI.TEXT_EMBEDDING_3_SMALL}",
16
+ encoding_format="float",
17
+ dimensions=1536,
18
+ user=None,
19
+ input_type=None,
20
+ timeout=600,
21
+ cache=False
22
+ )
23
+
24
+ embeddings = manager.generate_embeddings(configuration)
25
+
26
+ print(f"Model: {embeddings.model}")
27
+ print(f"Total embeddings generated: {len(embeddings.data)}")
28
+ print(f"Embedding dimensions: {len(embeddings.data[0].embedding)}")
29
+ print(f"Usage - Prompt tokens: {embeddings.usage.prompt_tokens}")
30
+ print(f"Usage - Total cost: ${embeddings.usage.total_cost} {embeddings.usage.currency}")
@@ -0,0 +1,42 @@
1
+ from pygeai.core.embeddings.managers import EmbeddingsManager
2
+ from pygeai.core.embeddings.models import EmbeddingConfiguration
3
+ from pygeai.core.services.llm.model import Model
4
+ from pygeai.core.services.llm.providers import Provider
5
+ import numpy as np
6
+
7
+ def cosine_similarity(vec1, vec2):
8
+ """Calculate cosine similarity between two vectors."""
9
+ vec1 = np.array(vec1)
10
+ vec2 = np.array(vec2)
11
+ return np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))
12
+
13
+ manager = EmbeddingsManager()
14
+
15
+ texts = [
16
+ "The cat sits on the mat",
17
+ "A feline rests on a rug",
18
+ "Python is a programming language"
19
+ ]
20
+
21
+ configuration = EmbeddingConfiguration(
22
+ inputs=texts,
23
+ model=f"{Provider.OPENAI}/{Model.OpenAI.TEXT_EMBEDDING_3_SMALL}",
24
+ )
25
+
26
+ embeddings = manager.generate_embeddings(configuration)
27
+
28
+ embedding_vectors = [emb.embedding for emb in embeddings.data]
29
+
30
+ print("Cosine Similarity Matrix:")
31
+ print("=" * 60)
32
+ for i, text1 in enumerate(texts):
33
+ for j, text2 in enumerate(texts):
34
+ if i <= j:
35
+ similarity = cosine_similarity(embedding_vectors[i], embedding_vectors[j])
36
+ print(f"\nText {i+1} vs Text {j+1}: {similarity:.4f}")
37
+ if i != j:
38
+ print(f" '{text1[:40]}...'")
39
+ print(f" '{text2[:40]}...'")
40
+
41
+ print(f"\n{'='*60}")
42
+ print(f"Total cost: ${embeddings.usage.total_cost} {embeddings.usage.currency}")
File without changes