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
@@ -25,7 +25,6 @@ class TestMigrationStrategies(unittest.TestCase):
25
25
  self.to_api_key = "to_key"
26
26
  self.to_instance = "http://to.instance"
27
27
  self.from_project_id = "proj_123"
28
- self.to_project_id = "proj_456"
29
28
  self.to_project_name = "New Project"
30
29
  self.admin_email = "admin@example.com"
31
30
  self.agent_id = "agent_123"
@@ -54,10 +53,8 @@ class TestMigrationStrategies(unittest.TestCase):
54
53
  mock_org_manager.assert_any_call(api_key=self.from_api_key, base_url=self.from_instance)
55
54
  mock_org_manager.assert_any_call(api_key=self.to_api_key, base_url=self.to_instance)
56
55
 
57
- @patch('pygeai.core.utils.console.Console.write_stdout')
58
- @patch('pygeai.core.utils.console.Console.write_stderr')
59
56
  @patch('pygeai.migration.strategies.OrganizationManager')
60
- def test_project_migration_success(self, mock_org_manager, mock_stderr, mock_stdout):
57
+ def test_project_migration_success(self, mock_org_manager):
61
58
  mock_source = Mock()
62
59
  mock_destination = Mock()
63
60
  mock_org_manager.side_effect = [mock_source, mock_destination]
@@ -82,20 +79,14 @@ class TestMigrationStrategies(unittest.TestCase):
82
79
 
83
80
  mock_source.get_project_data.assert_called_with(project_id=self.from_project_id)
84
81
  mock_destination.create_project.assert_called_with(mock_project)
85
- mock_stdout.assert_called_once()
86
- self.assertIn("Migrated project:", mock_stdout.call_args[0][0])
87
- mock_stderr.assert_not_called()
88
82
 
89
- @patch('pygeai.core.utils.console.Console.write_stdout')
90
- @patch('pygeai.core.utils.console.Console.write_stderr')
91
83
  @patch('pygeai.migration.strategies.OrganizationManager')
92
- def test_project_migration_error(self, mock_org_manager, mock_stderr, mock_stdout):
84
+ def test_project_migration_error_no_project_data(self, mock_org_manager):
93
85
  mock_source = Mock()
94
86
  mock_destination = Mock()
95
87
  mock_org_manager.side_effect = [mock_source, mock_destination]
96
88
 
97
- mock_error_response = ErrorListResponse(errors=[Error(id=1, description="Migration failed")])
98
- mock_source.get_project_data.return_value = mock_error_response
89
+ mock_source.get_project_data.return_value = Mock(spec=[])
99
90
 
100
91
  strategy = ProjectMigrationStrategy(
101
92
  from_api_key=self.from_api_key,
@@ -106,22 +97,22 @@ class TestMigrationStrategies(unittest.TestCase):
106
97
  to_project_name=self.to_project_name,
107
98
  admin_email=self.admin_email
108
99
  )
109
- strategy.migrate()
110
100
 
111
- mock_source.get_project_data.assert_called_with(project_id=self.from_project_id)
101
+ with self.assertRaises(ValueError) as context:
102
+ strategy.migrate()
103
+ self.assertIn("Unable to retrieve project data", str(context.exception))
112
104
  mock_destination.create_project.assert_not_called()
113
- mock_stderr.assert_called_once()
114
- mock_stdout.assert_not_called()
115
105
 
116
- @patch('pygeai.core.utils.console.Console.write_stdout')
117
- @patch('pygeai.core.utils.console.Console.write_stderr')
118
106
  @patch('pygeai.migration.strategies.OrganizationManager')
119
- def test_project_migration_failure_no_response(self, mock_org_manager, mock_stderr, mock_stdout):
107
+ def test_project_migration_error_response(self, mock_org_manager):
120
108
  mock_source = Mock()
121
109
  mock_destination = Mock()
122
110
  mock_org_manager.side_effect = [mock_source, mock_destination]
123
111
 
124
- mock_source.get_project_data.return_value = Mock(spec=[])
112
+ mock_project = Mock(spec=Project)
113
+ mock_source.get_project_data.return_value = Mock(project=mock_project)
114
+ mock_error_response = ErrorListResponse(errors=[Error(id=1, description="Creation failed")])
115
+ mock_destination.create_project.return_value = mock_error_response
125
116
 
126
117
  strategy = ProjectMigrationStrategy(
127
118
  from_api_key=self.from_api_key,
@@ -132,13 +123,10 @@ class TestMigrationStrategies(unittest.TestCase):
132
123
  to_project_name=self.to_project_name,
133
124
  admin_email=self.admin_email
134
125
  )
135
- strategy.migrate()
136
126
 
137
- mock_source.get_project_data.assert_called_with(project_id=self.from_project_id)
138
- mock_destination.create_project.assert_not_called()
139
- mock_stderr.assert_called_once()
140
- self.assertIn("Unable to migrate project", mock_stderr.call_args[0][0])
141
- mock_stdout.assert_not_called()
127
+ with self.assertRaises(ValueError) as context:
128
+ strategy.migrate()
129
+ self.assertIn("Failed to create project", str(context.exception))
142
130
 
143
131
  @patch('pygeai.migration.strategies.AILabManager')
144
132
  def test_agent_migration_strategy_init(self, mock_lab_manager):
@@ -147,24 +135,19 @@ class TestMigrationStrategies(unittest.TestCase):
147
135
  from_instance=self.from_instance,
148
136
  to_api_key=self.to_api_key,
149
137
  to_instance=self.to_instance,
150
- from_project_id=self.from_project_id,
151
- to_project_id=self.to_project_id,
152
138
  agent_id=self.agent_id
153
139
  )
154
140
  self.assertEqual(strategy.from_api_key, self.from_api_key)
155
141
  self.assertEqual(strategy.from_instance, self.from_instance)
156
142
  self.assertEqual(strategy.to_api_key, self.to_api_key)
157
143
  self.assertEqual(strategy.to_instance, self.to_instance)
158
- self.assertEqual(strategy.from_project_id, self.from_project_id)
159
- self.assertEqual(strategy.to_project_id, self.to_project_id)
160
144
  self.assertEqual(strategy.agent_id, self.agent_id)
161
145
  mock_lab_manager.assert_any_call(api_key=self.from_api_key, base_url=self.from_instance)
162
146
  mock_lab_manager.assert_any_call(api_key=self.to_api_key, base_url=self.to_instance)
163
147
 
164
148
  @patch('pygeai.core.utils.console.Console.write_stdout')
165
- @patch('pygeai.core.utils.console.Console.write_stderr')
166
149
  @patch('pygeai.migration.strategies.AILabManager')
167
- def test_agent_migration_success(self, mock_lab_manager, mock_stderr, mock_stdout):
150
+ def test_agent_migration_success(self, mock_lab_manager, mock_stdout):
168
151
  mock_source = Mock()
169
152
  mock_destination = Mock()
170
153
  mock_lab_manager.side_effect = [mock_source, mock_destination]
@@ -178,8 +161,6 @@ class TestMigrationStrategies(unittest.TestCase):
178
161
  from_instance=self.from_instance,
179
162
  to_api_key=self.to_api_key,
180
163
  to_instance=self.to_instance,
181
- from_project_id=self.from_project_id,
182
- to_project_id=self.to_project_id,
183
164
  agent_id=self.agent_id
184
165
  )
185
166
  strategy.migrate()
@@ -188,63 +169,47 @@ class TestMigrationStrategies(unittest.TestCase):
188
169
  mock_destination.create_agent.assert_called_with(agent=mock_agent)
189
170
  mock_stdout.assert_called_once()
190
171
  self.assertIn("New agent detail:", mock_stdout.call_args[0][0])
191
- mock_stderr.assert_not_called()
192
172
 
193
- @patch('pygeai.core.utils.console.Console.write_stdout')
194
- @patch('pygeai.core.utils.console.Console.write_stderr')
195
173
  @patch('pygeai.migration.strategies.AILabManager')
196
- def test_agent_migration_error(self, mock_lab_manager, mock_stderr, mock_stdout):
174
+ def test_agent_migration_error_not_agent(self, mock_lab_manager):
197
175
  mock_source = Mock()
198
176
  mock_destination = Mock()
199
177
  mock_lab_manager.side_effect = [mock_source, mock_destination]
200
178
 
201
- mock_source.get_agent.side_effect = ValueError("Unable to retrieve requested agent.")
179
+ mock_source.get_agent.return_value = Mock(spec=[])
202
180
 
203
181
  strategy = AgentMigrationStrategy(
204
182
  from_api_key=self.from_api_key,
205
183
  from_instance=self.from_instance,
206
184
  to_api_key=self.to_api_key,
207
185
  to_instance=self.to_instance,
208
- from_project_id=self.from_project_id,
209
- to_project_id=self.to_project_id,
210
186
  agent_id=self.agent_id
211
187
  )
212
- strategy.migrate()
213
188
 
214
- mock_source.get_agent.assert_called_with(agent_id=self.agent_id)
189
+ with self.assertRaises(ValueError) as context:
190
+ strategy.migrate()
191
+ self.assertIn("Agent migration failed", str(context.exception))
215
192
  mock_destination.create_agent.assert_not_called()
216
- mock_stderr.assert_called_once()
217
- self.assertIn("Agent migration failed:", mock_stderr.call_args[0][0])
218
- mock_stdout.assert_called_once()
219
- self.assertIn("New agent detail:", mock_stdout.call_args[0][0])
220
193
 
221
- @patch('pygeai.core.utils.console.Console.write_stdout')
222
- @patch('pygeai.core.utils.console.Console.write_stderr')
223
194
  @patch('pygeai.migration.strategies.AILabManager')
224
- def test_agent_migration_error_response(self, mock_lab_manager, mock_stderr, mock_stdout):
195
+ def test_agent_migration_error_exception(self, mock_lab_manager):
225
196
  mock_source = Mock()
226
197
  mock_destination = Mock()
227
198
  mock_lab_manager.side_effect = [mock_source, mock_destination]
228
199
 
229
- mock_error_response = ErrorListResponse(errors=[Error(id=1, description="Agent error")])
230
- mock_source.get_agent.return_value = mock_error_response
200
+ mock_source.get_agent.side_effect = Exception("API Error")
231
201
 
232
202
  strategy = AgentMigrationStrategy(
233
203
  from_api_key=self.from_api_key,
234
204
  from_instance=self.from_instance,
235
205
  to_api_key=self.to_api_key,
236
206
  to_instance=self.to_instance,
237
- from_project_id=self.from_project_id,
238
- to_project_id=self.to_project_id,
239
207
  agent_id=self.agent_id
240
208
  )
241
- strategy.migrate()
242
209
 
243
- mock_source.get_agent.assert_called_with(agent_id=self.agent_id)
244
- mock_destination.create_agent.assert_not_called()
245
- mock_stderr.assert_called_once()
246
- mock_stdout.assert_called_once()
247
- self.assertIn("New agent detail:", mock_stdout.call_args[0][0])
210
+ with self.assertRaises(ValueError) as context:
211
+ strategy.migrate()
212
+ self.assertIn("Agent migration failed", str(context.exception))
248
213
 
249
214
  @patch('pygeai.migration.strategies.AILabManager')
250
215
  def test_tool_migration_strategy_init(self, mock_lab_manager):
@@ -253,24 +218,19 @@ class TestMigrationStrategies(unittest.TestCase):
253
218
  from_instance=self.from_instance,
254
219
  to_api_key=self.to_api_key,
255
220
  to_instance=self.to_instance,
256
- from_project_id=self.from_project_id,
257
- to_project_id=self.to_project_id,
258
221
  tool_id=self.tool_id
259
222
  )
260
223
  self.assertEqual(strategy.from_api_key, self.from_api_key)
261
224
  self.assertEqual(strategy.from_instance, self.from_instance)
262
225
  self.assertEqual(strategy.to_api_key, self.to_api_key)
263
226
  self.assertEqual(strategy.to_instance, self.to_instance)
264
- self.assertEqual(strategy.from_project_id, self.from_project_id)
265
- self.assertEqual(strategy.to_project_id, self.to_project_id)
266
227
  self.assertEqual(strategy.tool_id, self.tool_id)
267
228
  mock_lab_manager.assert_any_call(api_key=self.from_api_key, base_url=self.from_instance)
268
229
  mock_lab_manager.assert_any_call(api_key=self.to_api_key, base_url=self.to_instance)
269
230
 
270
231
  @patch('pygeai.core.utils.console.Console.write_stdout')
271
- @patch('pygeai.core.utils.console.Console.write_stderr')
272
232
  @patch('pygeai.migration.strategies.AILabManager')
273
- def test_tool_migration_success(self, mock_lab_manager, mock_stderr, mock_stdout):
233
+ def test_tool_migration_success(self, mock_lab_manager, mock_stdout):
274
234
  mock_source = Mock()
275
235
  mock_destination = Mock()
276
236
  mock_lab_manager.side_effect = [mock_source, mock_destination]
@@ -284,8 +244,6 @@ class TestMigrationStrategies(unittest.TestCase):
284
244
  from_instance=self.from_instance,
285
245
  to_api_key=self.to_api_key,
286
246
  to_instance=self.to_instance,
287
- from_project_id=self.from_project_id,
288
- to_project_id=self.to_project_id,
289
247
  tool_id=self.tool_id
290
248
  )
291
249
  strategy.migrate()
@@ -294,63 +252,27 @@ class TestMigrationStrategies(unittest.TestCase):
294
252
  mock_destination.create_tool.assert_called_with(tool=mock_tool)
295
253
  mock_stdout.assert_called_once()
296
254
  self.assertIn("New tool detail:", mock_stdout.call_args[0][0])
297
- mock_stderr.assert_not_called()
298
-
299
- @patch('pygeai.core.utils.console.Console.write_stdout')
300
- @patch('pygeai.core.utils.console.Console.write_stderr')
301
- @patch('pygeai.migration.strategies.AILabManager')
302
- def test_tool_migration_error(self, mock_lab_manager, mock_stderr, mock_stdout):
303
- mock_source = Mock()
304
- mock_destination = Mock()
305
- mock_lab_manager.side_effect = [mock_source, mock_destination]
306
-
307
- mock_source.get_tool.side_effect = ValueError("Unable to retrieve requested tool.")
308
-
309
- strategy = ToolMigrationStrategy(
310
- from_api_key=self.from_api_key,
311
- from_instance=self.from_instance,
312
- to_api_key=self.to_api_key,
313
- to_instance=self.to_instance,
314
- from_project_id=self.from_project_id,
315
- to_project_id=self.to_project_id,
316
- tool_id=self.tool_id
317
- )
318
- strategy.migrate()
319
-
320
- mock_source.get_tool.assert_called_with(tool_id=self.tool_id)
321
- mock_destination.create_tool.assert_not_called()
322
- mock_stderr.assert_called_once()
323
- self.assertIn("Tool migration failed:", mock_stderr.call_args[0][0])
324
- mock_stdout.assert_called_once()
325
- self.assertIn("New tool detail:", mock_stdout.call_args[0][0])
326
255
 
327
- @patch('pygeai.core.utils.console.Console.write_stdout')
328
- @patch('pygeai.core.utils.console.Console.write_stderr')
329
256
  @patch('pygeai.migration.strategies.AILabManager')
330
- def test_tool_migration_error_response(self, mock_lab_manager, mock_stderr, mock_stdout):
257
+ def test_tool_migration_error_not_tool(self, mock_lab_manager):
331
258
  mock_source = Mock()
332
259
  mock_destination = Mock()
333
260
  mock_lab_manager.side_effect = [mock_source, mock_destination]
334
261
 
335
- mock_error_response = ErrorListResponse(errors=[Error(id=1, description="Tool error")])
336
- mock_source.get_tool.return_value = mock_error_response
262
+ mock_source.get_tool.return_value = Mock(spec=[])
337
263
 
338
264
  strategy = ToolMigrationStrategy(
339
265
  from_api_key=self.from_api_key,
340
266
  from_instance=self.from_instance,
341
267
  to_api_key=self.to_api_key,
342
268
  to_instance=self.to_instance,
343
- from_project_id=self.from_project_id,
344
- to_project_id=self.to_project_id,
345
269
  tool_id=self.tool_id
346
270
  )
347
- strategy.migrate()
348
271
 
349
- mock_source.get_tool.assert_called_with(tool_id=self.tool_id)
272
+ with self.assertRaises(ValueError) as context:
273
+ strategy.migrate()
274
+ self.assertIn("Tool migration failed", str(context.exception))
350
275
  mock_destination.create_tool.assert_not_called()
351
- mock_stderr.assert_called_once()
352
- mock_stdout.assert_called_once()
353
- self.assertIn("New tool detail:", mock_stdout.call_args[0][0])
354
276
 
355
277
  @patch('pygeai.migration.strategies.AILabManager')
356
278
  def test_process_migration_strategy_init(self, mock_lab_manager):
@@ -359,24 +281,19 @@ class TestMigrationStrategies(unittest.TestCase):
359
281
  from_instance=self.from_instance,
360
282
  to_api_key=self.to_api_key,
361
283
  to_instance=self.to_instance,
362
- from_project_id=self.from_project_id,
363
- to_project_id=self.to_project_id,
364
284
  process_id=self.process_id
365
285
  )
366
286
  self.assertEqual(strategy.from_api_key, self.from_api_key)
367
287
  self.assertEqual(strategy.from_instance, self.from_instance)
368
288
  self.assertEqual(strategy.to_api_key, self.to_api_key)
369
289
  self.assertEqual(strategy.to_instance, self.to_instance)
370
- self.assertEqual(strategy.from_project_id, self.from_project_id)
371
- self.assertEqual(strategy.to_project_id, self.to_project_id)
372
290
  self.assertEqual(strategy.process_id, self.process_id)
373
291
  mock_lab_manager.assert_any_call(api_key=self.from_api_key, base_url=self.from_instance)
374
292
  mock_lab_manager.assert_any_call(api_key=self.to_api_key, base_url=self.to_instance)
375
293
 
376
294
  @patch('pygeai.core.utils.console.Console.write_stdout')
377
- @patch('pygeai.core.utils.console.Console.write_stderr')
378
295
  @patch('pygeai.migration.strategies.AILabManager')
379
- def test_process_migration_success(self, mock_lab_manager, mock_stderr, mock_stdout):
296
+ def test_process_migration_success(self, mock_lab_manager, mock_stdout):
380
297
  mock_source = Mock()
381
298
  mock_destination = Mock()
382
299
  mock_lab_manager.side_effect = [mock_source, mock_destination]
@@ -390,8 +307,6 @@ class TestMigrationStrategies(unittest.TestCase):
390
307
  from_instance=self.from_instance,
391
308
  to_api_key=self.to_api_key,
392
309
  to_instance=self.to_instance,
393
- from_project_id=self.from_project_id,
394
- to_project_id=self.to_project_id,
395
310
  process_id=self.process_id
396
311
  )
397
312
  strategy.migrate()
@@ -400,63 +315,27 @@ class TestMigrationStrategies(unittest.TestCase):
400
315
  mock_destination.create_process.assert_called_with(process=mock_process)
401
316
  mock_stdout.assert_called_once()
402
317
  self.assertIn("New process detail:", mock_stdout.call_args[0][0])
403
- mock_stderr.assert_not_called()
404
318
 
405
- @patch('pygeai.core.utils.console.Console.write_stdout')
406
- @patch('pygeai.core.utils.console.Console.write_stderr')
407
319
  @patch('pygeai.migration.strategies.AILabManager')
408
- def test_process_migration_error(self, mock_lab_manager, mock_stderr, mock_stdout):
320
+ def test_process_migration_error_not_process(self, mock_lab_manager):
409
321
  mock_source = Mock()
410
322
  mock_destination = Mock()
411
323
  mock_lab_manager.side_effect = [mock_source, mock_destination]
412
324
 
413
- mock_source.get_process.side_effect = ValueError("Unable to retrieve requested process.")
325
+ mock_source.get_process.return_value = Mock(spec=[])
414
326
 
415
327
  strategy = AgenticProcessMigrationStrategy(
416
328
  from_api_key=self.from_api_key,
417
329
  from_instance=self.from_instance,
418
330
  to_api_key=self.to_api_key,
419
331
  to_instance=self.to_instance,
420
- from_project_id=self.from_project_id,
421
- to_project_id=self.to_project_id,
422
332
  process_id=self.process_id
423
333
  )
424
- strategy.migrate()
425
-
426
- mock_source.get_process.assert_called_with(process_id=self.process_id)
427
- mock_destination.create_process.assert_not_called()
428
- mock_stderr.assert_called_once()
429
- self.assertIn("Process migration failed:", mock_stderr.call_args[0][0])
430
- mock_stdout.assert_called_once()
431
- self.assertIn("New process detail:", mock_stdout.call_args[0][0])
432
-
433
- @patch('pygeai.core.utils.console.Console.write_stdout')
434
- @patch('pygeai.core.utils.console.Console.write_stderr')
435
- @patch('pygeai.migration.strategies.AILabManager')
436
- def test_process_migration_error_response(self, mock_lab_manager, mock_stderr, mock_stdout):
437
- mock_source = Mock()
438
- mock_destination = Mock()
439
- mock_lab_manager.side_effect = [mock_source, mock_destination]
440
-
441
- mock_error_response = ErrorListResponse(errors=[Error(id=1, description="Process error")])
442
- mock_source.get_process.return_value = mock_error_response
443
-
444
- strategy = AgenticProcessMigrationStrategy(
445
- from_api_key=self.from_api_key,
446
- from_instance=self.from_instance,
447
- to_api_key=self.to_api_key,
448
- to_instance=self.to_instance,
449
- from_project_id=self.from_project_id,
450
- to_project_id=self.to_project_id,
451
- process_id=self.process_id
452
- )
453
- strategy.migrate()
454
334
 
455
- mock_source.get_process.assert_called_with(process_id=self.process_id)
335
+ with self.assertRaises(ValueError) as context:
336
+ strategy.migrate()
337
+ self.assertIn("Process migration failed", str(context.exception))
456
338
  mock_destination.create_process.assert_not_called()
457
- mock_stdout.assert_called_once()
458
- mock_stderr.assert_called_once()
459
- self.assertIn("Process migration failed:", mock_stderr.call_args[0][0])
460
339
 
461
340
  @patch('pygeai.migration.strategies.AILabManager')
462
341
  def test_task_migration_strategy_init(self, mock_lab_manager):
@@ -465,24 +344,19 @@ class TestMigrationStrategies(unittest.TestCase):
465
344
  from_instance=self.from_instance,
466
345
  to_api_key=self.to_api_key,
467
346
  to_instance=self.to_instance,
468
- from_project_id=self.from_project_id,
469
- to_project_id=self.to_project_id,
470
347
  task_id=self.task_id
471
348
  )
472
349
  self.assertEqual(strategy.from_api_key, self.from_api_key)
473
350
  self.assertEqual(strategy.from_instance, self.from_instance)
474
351
  self.assertEqual(strategy.to_api_key, self.to_api_key)
475
352
  self.assertEqual(strategy.to_instance, self.to_instance)
476
- self.assertEqual(strategy.from_project_id, self.from_project_id)
477
- self.assertEqual(strategy.to_project_id, self.to_project_id)
478
353
  self.assertEqual(strategy.task_id, self.task_id)
479
354
  mock_lab_manager.assert_any_call(api_key=self.from_api_key, base_url=self.from_instance)
480
355
  mock_lab_manager.assert_any_call(api_key=self.to_api_key, base_url=self.to_instance)
481
356
 
482
357
  @patch('pygeai.core.utils.console.Console.write_stdout')
483
- @patch('pygeai.core.utils.console.Console.write_stderr')
484
358
  @patch('pygeai.migration.strategies.AILabManager')
485
- def test_task_migration_success(self, mock_lab_manager, mock_stderr, mock_stdout):
359
+ def test_task_migration_success(self, mock_lab_manager, mock_stdout):
486
360
  mock_source = Mock()
487
361
  mock_destination = Mock()
488
362
  mock_lab_manager.side_effect = [mock_source, mock_destination]
@@ -496,8 +370,6 @@ class TestMigrationStrategies(unittest.TestCase):
496
370
  from_instance=self.from_instance,
497
371
  to_api_key=self.to_api_key,
498
372
  to_instance=self.to_instance,
499
- from_project_id=self.from_project_id,
500
- to_project_id=self.to_project_id,
501
373
  task_id=self.task_id
502
374
  )
503
375
  strategy.migrate()
@@ -506,73 +378,28 @@ class TestMigrationStrategies(unittest.TestCase):
506
378
  mock_destination.create_task.assert_called_with(task=mock_task)
507
379
  mock_stdout.assert_called_once()
508
380
  self.assertIn("New task detail:", mock_stdout.call_args[0][0])
509
- mock_stderr.assert_not_called()
510
381
 
511
- @patch('pygeai.core.utils.console.Console.write_stdout')
512
- @patch('pygeai.core.utils.console.Console.write_stderr')
513
382
  @patch('pygeai.migration.strategies.AILabManager')
514
- def test_task_migration_error(self, mock_lab_manager, mock_stderr, mock_stdout):
383
+ def test_task_migration_error_not_task(self, mock_lab_manager):
515
384
  mock_source = Mock()
516
385
  mock_destination = Mock()
517
386
  mock_lab_manager.side_effect = [mock_source, mock_destination]
518
387
 
519
- mock_source.get_task.side_effect = ValueError("Unable to retrieve requested task.")
388
+ mock_source.get_task.return_value = Mock(spec=[])
520
389
 
521
390
  strategy = TaskMigrationStrategy(
522
391
  from_api_key=self.from_api_key,
523
392
  from_instance=self.from_instance,
524
393
  to_api_key=self.to_api_key,
525
394
  to_instance=self.to_instance,
526
- from_project_id=self.from_project_id,
527
- to_project_id=self.to_project_id,
528
395
  task_id=self.task_id
529
396
  )
530
- strategy.migrate()
531
397
 
532
- mock_source.get_task.assert_called_with(task_id=self.task_id)
398
+ with self.assertRaises(ValueError) as context:
399
+ strategy.migrate()
400
+ self.assertIn("Task migration failed", str(context.exception))
533
401
  mock_destination.create_task.assert_not_called()
534
- mock_stderr.assert_called_once()
535
- self.assertIn("Task migration failed:", mock_stderr.call_args[0][0])
536
- mock_stdout.assert_called_once()
537
- self.assertIn("New task detail:", mock_stdout.call_args[0][0])
538
-
539
- @patch('pygeai.core.utils.console.Console.write_stdout')
540
- @patch('pygeai.core.utils.console.Console.write_stderr')
541
- @patch('pygeai.migration.strategies.AILabManager')
542
- def test_task_migration_error_response(self, mock_lab_manager, mock_stderr, mock_stdout):
543
- mock_source = Mock()
544
- mock_destination = Mock()
545
- mock_lab_manager.side_effect = [mock_source, mock_destination]
546
402
 
547
- mock_error_response = ErrorListResponse(errors=[Error(id=1, description="Task error")])
548
- mock_source.get_task.return_value = mock_error_response
549
403
 
550
- strategy = TaskMigrationStrategy(
551
- from_api_key=self.from_api_key,
552
- from_instance=self.from_instance,
553
- to_api_key=self.to_api_key,
554
- to_instance=self.to_instance,
555
- from_project_id=self.from_project_id,
556
- to_project_id=self.to_project_id,
557
- task_id=self.task_id
558
- )
559
- strategy.migrate()
560
-
561
- mock_source.get_task.assert_called_with(task_id=self.task_id)
562
- mock_destination.create_task.assert_not_called()
563
- mock_stderr.assert_called_once()
564
- mock_stdout.assert_called_once()
565
- self.assertIn("New task detail:", mock_stdout.call_args[0][0])
566
-
567
- @patch('pygeai.migration.strategies.ProjectMigrationStrategy')
568
- def test_migration_strategy_default_to_api_key(self, mock_strategy):
569
- strategy = ProjectMigrationStrategy(
570
- from_api_key=self.from_api_key,
571
- from_instance=self.from_instance,
572
- to_api_key=None,
573
- to_instance=self.to_instance,
574
- from_project_id=self.from_project_id,
575
- to_project_name=self.to_project_name,
576
- admin_email=self.admin_email
577
- )
578
- self.assertEqual(strategy.to_api_key, self.from_api_key)
404
+ if __name__ == '__main__':
405
+ unittest.main()