pygeai 0.1.51b3__py3-none-any.whl → 0.6.0b15__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 (648) hide show
  1. pygeai/__init__.py +9 -1
  2. pygeai/_docs/Makefile +20 -0
  3. pygeai/_docs/make.bat +35 -0
  4. pygeai/_docs/source/conf.py +117 -0
  5. pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
  6. pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
  7. pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
  8. pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
  9. pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
  10. pygeai/_docs/source/content/ai_lab.rst +102 -0
  11. pygeai/_docs/source/content/analytics.rst +598 -0
  12. pygeai/_docs/source/content/api_reference/admin.rst +161 -0
  13. pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
  14. pygeai/_docs/source/content/api_reference/auth.rst +379 -0
  15. pygeai/_docs/source/content/api_reference/chat.rst +754 -0
  16. pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
  17. pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
  18. pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
  19. pygeai/_docs/source/content/api_reference/files.rst +592 -0
  20. pygeai/_docs/source/content/api_reference/gam.rst +401 -0
  21. pygeai/_docs/source/content/api_reference/health.rst +58 -0
  22. pygeai/_docs/source/content/api_reference/project.rst +738 -0
  23. pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
  24. pygeai/_docs/source/content/api_reference/rag.rst +710 -0
  25. pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
  26. pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
  27. pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
  28. pygeai/_docs/source/content/api_reference.rst +58 -0
  29. pygeai/_docs/source/content/authentication.rst +295 -0
  30. pygeai/_docs/source/content/chat_gui.rst +121 -0
  31. pygeai/_docs/source/content/cli.rst +203 -0
  32. pygeai/_docs/source/content/debugger.rst +651 -0
  33. pygeai/_docs/source/content/intro.rst +67 -0
  34. pygeai/_docs/source/content/migration.rst +929 -0
  35. pygeai/_docs/source/content/modules.rst +7 -0
  36. pygeai/_docs/source/content/quickstart.rst +143 -0
  37. pygeai/_docs/source/content/samples.rst +394 -0
  38. pygeai/_docs/source/index.rst +75 -0
  39. pygeai/_docs/source/modules.rst +7 -0
  40. pygeai/_docs/source/pygeai.admin.rst +29 -0
  41. pygeai/_docs/source/pygeai.analytics.rst +53 -0
  42. pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
  43. pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
  44. pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
  45. pygeai/_docs/source/pygeai.assistant.rst +55 -0
  46. pygeai/_docs/source/pygeai.auth.rst +29 -0
  47. pygeai/_docs/source/pygeai.chat.rst +69 -0
  48. pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
  49. pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
  50. pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
  51. pygeai/_docs/source/pygeai.cli.rst +62 -0
  52. pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
  53. pygeai/_docs/source/pygeai.core.base.rst +53 -0
  54. pygeai/_docs/source/pygeai.core.common.rst +37 -0
  55. pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
  56. pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
  57. pygeai/_docs/source/pygeai.core.files.rst +61 -0
  58. pygeai/_docs/source/pygeai.core.llm.rst +29 -0
  59. pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
  60. pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
  61. pygeai/_docs/source/pygeai.core.rst +63 -0
  62. pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
  63. pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
  64. pygeai/_docs/source/pygeai.core.services.rst +37 -0
  65. pygeai/_docs/source/pygeai.core.utils.rst +37 -0
  66. pygeai/_docs/source/pygeai.dbg.rst +21 -0
  67. pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
  68. pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
  69. pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
  70. pygeai/_docs/source/pygeai.evaluation.rst +31 -0
  71. pygeai/_docs/source/pygeai.flows.rst +29 -0
  72. pygeai/_docs/source/pygeai.gam.rst +29 -0
  73. pygeai/_docs/source/pygeai.health.rst +29 -0
  74. pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
  75. pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
  76. pygeai/_docs/source/pygeai.lab.rst +65 -0
  77. pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
  78. pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
  79. pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
  80. pygeai/_docs/source/pygeai.man.man1.rst +10 -0
  81. pygeai/_docs/source/pygeai.man.rst +18 -0
  82. pygeai/_docs/source/pygeai.migration.rst +29 -0
  83. pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
  84. pygeai/_docs/source/pygeai.organization.rst +61 -0
  85. pygeai/_docs/source/pygeai.proxy.rst +53 -0
  86. pygeai/_docs/source/pygeai.rst +35 -0
  87. pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
  88. pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
  89. pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
  90. pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
  91. pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
  92. pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
  93. pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
  94. pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
  95. pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
  96. pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
  97. pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
  98. pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
  99. pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
  100. pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
  101. pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
  102. pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
  103. pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
  104. pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
  105. pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
  106. pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
  107. pygeai/_docs/source/pygeai.tests.core.rst +39 -0
  108. pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
  109. pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
  110. pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
  111. pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
  112. pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
  113. pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
  114. pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
  115. pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
  116. pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
  117. pygeai/_docs/source/pygeai.tests.health.rst +21 -0
  118. pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
  119. pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
  120. pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
  121. pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
  122. pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
  123. pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
  124. pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
  125. pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
  126. pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
  127. pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
  128. pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
  129. pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
  130. pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
  131. pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
  132. pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
  133. pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
  134. pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
  135. pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
  136. pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
  137. pygeai/_docs/source/pygeai.tests.rst +33 -0
  138. pygeai/admin/clients.py +14 -11
  139. pygeai/admin/endpoints.py +2 -2
  140. pygeai/analytics/clients.py +505 -0
  141. pygeai/analytics/endpoints.py +35 -0
  142. pygeai/analytics/managers.py +606 -0
  143. pygeai/analytics/mappers.py +207 -0
  144. pygeai/analytics/responses.py +240 -0
  145. pygeai/assistant/clients.py +18 -45
  146. pygeai/assistant/data/clients.py +1 -0
  147. pygeai/assistant/data_analyst/clients.py +8 -12
  148. pygeai/assistant/managers.py +195 -157
  149. pygeai/assistant/mappers.py +4 -2
  150. pygeai/assistant/rag/clients.py +27 -67
  151. pygeai/assistant/rag/mappers.py +12 -6
  152. pygeai/assistant/rag/models.py +301 -159
  153. pygeai/auth/__init__.py +0 -0
  154. pygeai/auth/clients.py +129 -0
  155. pygeai/auth/endpoints.py +6 -0
  156. pygeai/chat/clients.py +308 -37
  157. pygeai/chat/endpoints.py +3 -0
  158. pygeai/chat/iris.py +2 -8
  159. pygeai/chat/managers.py +9 -6
  160. pygeai/chat/session.py +38 -0
  161. pygeai/chat/settings.py +6 -0
  162. pygeai/chat/ui.py +678 -0
  163. pygeai/cli/__init__.py +0 -1
  164. pygeai/cli/commands/admin.py +7 -10
  165. pygeai/cli/commands/analytics.py +533 -0
  166. pygeai/cli/commands/assistant.py +9 -9
  167. pygeai/cli/commands/auth.py +299 -0
  168. pygeai/cli/commands/base.py +71 -9
  169. pygeai/cli/commands/chat.py +676 -19
  170. pygeai/cli/commands/common.py +28 -24
  171. pygeai/cli/commands/configuration.py +66 -13
  172. pygeai/cli/commands/docs.py +105 -0
  173. pygeai/cli/commands/embeddings.py +58 -11
  174. pygeai/cli/commands/evaluation.py +38 -38
  175. pygeai/cli/commands/feedback.py +3 -4
  176. pygeai/cli/commands/files.py +7 -8
  177. pygeai/cli/commands/gam.py +85 -10
  178. pygeai/cli/commands/lab/ai_lab.py +340 -484
  179. pygeai/cli/commands/lab/options.py +8 -0
  180. pygeai/cli/commands/lab/spec.py +273 -0
  181. pygeai/cli/commands/lab/utils.py +13 -0
  182. pygeai/cli/commands/llm.py +6 -7
  183. pygeai/cli/commands/migrate.py +1064 -436
  184. pygeai/cli/commands/organization.py +516 -11
  185. pygeai/cli/commands/rag.py +13 -14
  186. pygeai/cli/commands/rerank.py +3 -5
  187. pygeai/cli/commands/secrets.py +8 -9
  188. pygeai/cli/commands/usage_limits.py +18 -20
  189. pygeai/cli/commands/validators.py +144 -1
  190. pygeai/cli/commands/version.py +4 -5
  191. pygeai/cli/error_handler.py +151 -0
  192. pygeai/cli/geai.py +170 -31
  193. pygeai/cli/geai_proxy.py +86 -25
  194. pygeai/cli/install_man.py +93 -22
  195. pygeai/cli/parsers.py +75 -25
  196. pygeai/cli/texts/help.py +265 -28
  197. pygeai/core/base/clients.py +53 -12
  198. pygeai/core/base/mappers.py +11 -2
  199. pygeai/core/base/session.py +95 -11
  200. pygeai/core/common/config.py +78 -14
  201. pygeai/core/common/exceptions.py +96 -6
  202. pygeai/core/embeddings/__init__.py +19 -0
  203. pygeai/core/embeddings/clients.py +23 -5
  204. pygeai/core/embeddings/managers.py +9 -4
  205. pygeai/core/embeddings/mappers.py +16 -2
  206. pygeai/core/embeddings/responses.py +9 -2
  207. pygeai/core/feedback/clients.py +8 -3
  208. pygeai/core/files/clients.py +23 -24
  209. pygeai/core/files/managers.py +121 -30
  210. pygeai/core/files/responses.py +4 -3
  211. pygeai/core/handlers.py +10 -1
  212. pygeai/core/llm/clients.py +22 -29
  213. pygeai/core/models.py +127 -11
  214. pygeai/core/plugins/clients.py +6 -6
  215. pygeai/core/rerank/clients.py +9 -3
  216. pygeai/core/rerank/managers.py +22 -5
  217. pygeai/core/secrets/clients.py +16 -37
  218. pygeai/core/services/response.py +18 -0
  219. pygeai/core/services/rest.py +159 -49
  220. pygeai/core/utils/__init__.py +0 -0
  221. pygeai/core/utils/console.py +83 -0
  222. pygeai/core/utils/parsers.py +32 -0
  223. pygeai/core/utils/validators.py +10 -0
  224. pygeai/dbg/__init__.py +3 -0
  225. pygeai/dbg/debugger.py +854 -14
  226. pygeai/evaluation/clients.py +7 -4
  227. pygeai/evaluation/dataset/clients.py +46 -44
  228. pygeai/evaluation/plan/clients.py +28 -26
  229. pygeai/evaluation/result/clients.py +38 -5
  230. pygeai/gam/clients.py +50 -28
  231. pygeai/gam/endpoints.py +2 -1
  232. pygeai/health/__init__.py +0 -0
  233. pygeai/health/clients.py +24 -0
  234. pygeai/health/endpoints.py +1 -0
  235. pygeai/lab/__init__.py +0 -90
  236. pygeai/lab/agents/clients.py +203 -162
  237. pygeai/lab/agents/endpoints.py +4 -0
  238. pygeai/lab/agents/mappers.py +57 -7
  239. pygeai/lab/clients.py +24 -0
  240. pygeai/lab/constants.py +3 -0
  241. pygeai/lab/managers.py +571 -541
  242. pygeai/lab/models.py +108 -19
  243. pygeai/lab/processes/clients.py +332 -340
  244. pygeai/lab/processes/mappers.py +3 -3
  245. pygeai/lab/runners.py +90 -0
  246. pygeai/lab/spec/__init__.py +0 -0
  247. pygeai/lab/spec/loader.py +24 -0
  248. pygeai/lab/spec/parsers.py +39 -0
  249. pygeai/lab/strategies/clients.py +67 -63
  250. pygeai/lab/strategies/mappers.py +1 -1
  251. pygeai/lab/tools/clients.py +85 -118
  252. pygeai/lab/tools/endpoints.py +4 -0
  253. pygeai/lab/tools/mappers.py +5 -5
  254. pygeai/man/man1/geai-proxy.1 +116 -0
  255. pygeai/man/man1/geai.1 +2580 -66
  256. pygeai/migration/__init__.py +33 -0
  257. pygeai/migration/strategies.py +468 -146
  258. pygeai/migration/tools.py +170 -3
  259. pygeai/organization/clients.py +245 -50
  260. pygeai/organization/endpoints.py +17 -8
  261. pygeai/organization/limits/clients.py +34 -32
  262. pygeai/organization/limits/managers.py +108 -49
  263. pygeai/organization/managers.py +347 -53
  264. pygeai/organization/mappers.py +102 -2
  265. pygeai/organization/responses.py +58 -1
  266. pygeai/proxy/clients.py +6 -3
  267. pygeai/proxy/config.py +14 -1
  268. pygeai/proxy/managers.py +61 -33
  269. pygeai/proxy/servers.py +196 -51
  270. pygeai/proxy/tool.py +33 -16
  271. pygeai/tests/admin/__init__.py +0 -0
  272. pygeai/tests/admin/test_clients.py +148 -0
  273. pygeai/tests/analytics/__init__.py +0 -0
  274. pygeai/tests/analytics/test_clients.py +86 -0
  275. pygeai/tests/analytics/test_managers.py +94 -0
  276. pygeai/tests/analytics/test_mappers.py +84 -0
  277. pygeai/tests/analytics/test_responses.py +73 -0
  278. pygeai/tests/assistants/rag/test_clients.py +346 -0
  279. pygeai/tests/assistants/rag/test_models.py +292 -0
  280. pygeai/tests/assistants/test_clients.py +176 -82
  281. pygeai/tests/assistants/test_managers.py +191 -57
  282. pygeai/tests/auth/__init__.py +0 -0
  283. pygeai/tests/auth/test_clients.py +289 -0
  284. pygeai/tests/auth/test_oauth.py +172 -0
  285. pygeai/tests/auth/test_session_logging.py +150 -0
  286. pygeai/tests/chat/__init__.py +0 -0
  287. pygeai/tests/chat/test_clients.py +393 -0
  288. pygeai/tests/chat/test_iris.py +38 -0
  289. pygeai/tests/chat/test_session.py +62 -0
  290. pygeai/tests/chat/test_ui.py +224 -0
  291. pygeai/tests/cli/commands/__init__.py +0 -0
  292. pygeai/tests/cli/commands/lab/__init__.py +0 -0
  293. pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
  294. pygeai/tests/cli/commands/lab/test_common.py +208 -0
  295. pygeai/tests/cli/commands/lab/test_spec.py +246 -0
  296. pygeai/tests/cli/commands/test_assistant.py +202 -0
  297. pygeai/tests/cli/commands/test_chat.py +130 -0
  298. pygeai/tests/cli/commands/test_common.py +350 -0
  299. pygeai/tests/cli/commands/test_embeddings.py +132 -0
  300. pygeai/tests/cli/commands/test_evaluation.py +656 -0
  301. pygeai/tests/cli/commands/test_feedback.py +65 -0
  302. pygeai/tests/cli/commands/test_files.py +161 -0
  303. pygeai/tests/cli/commands/test_gam.py +201 -0
  304. pygeai/tests/cli/commands/test_llm.py +114 -0
  305. pygeai/tests/cli/commands/test_migrate.py +176 -0
  306. pygeai/tests/cli/commands/test_organization.py +276 -0
  307. pygeai/tests/cli/commands/test_rag.py +266 -0
  308. pygeai/tests/cli/commands/test_rerank.py +110 -0
  309. pygeai/tests/cli/commands/test_secrets.py +171 -0
  310. pygeai/tests/cli/commands/test_show_help.py +41 -0
  311. pygeai/tests/cli/commands/test_usage_limits.py +412 -0
  312. pygeai/tests/cli/commands/test_validators.py +160 -0
  313. pygeai/tests/cli/commands/test_version.py +81 -0
  314. pygeai/tests/cli/docker/__init__.py +0 -0
  315. pygeai/tests/cli/test_credentials_flag.py +316 -0
  316. pygeai/tests/cli/test_error_handler.py +225 -0
  317. pygeai/tests/cli/test_geai_driver.py +154 -0
  318. pygeai/tests/cli/test_parsers.py +5 -5
  319. pygeai/tests/core/base/data/models.py +7 -0
  320. pygeai/tests/core/base/test_mappers.py +43 -11
  321. pygeai/tests/core/base/test_models.py +3 -1
  322. pygeai/tests/core/base/test_responses.py +53 -0
  323. pygeai/tests/core/common/__init__.py +0 -0
  324. pygeai/tests/core/common/data/__init__.py +0 -0
  325. pygeai/tests/core/common/test_config.py +186 -0
  326. pygeai/tests/core/common/test_decorators.py +69 -0
  327. pygeai/tests/core/embeddings/__init__.py +0 -0
  328. pygeai/tests/core/embeddings/test_clients.py +225 -0
  329. pygeai/tests/core/embeddings/test_managers.py +171 -0
  330. pygeai/tests/core/embeddings/test_mappers.py +142 -0
  331. pygeai/tests/core/feedback/__init__.py +0 -0
  332. pygeai/tests/core/feedback/test_clients.py +64 -0
  333. pygeai/tests/core/files/test_clients.py +128 -0
  334. pygeai/tests/core/files/test_managers.py +124 -78
  335. pygeai/tests/core/files/test_mappers.py +137 -0
  336. pygeai/tests/core/files/test_models.py +103 -0
  337. pygeai/tests/core/files/test_responses.py +122 -0
  338. pygeai/tests/core/llm/__init__.py +0 -0
  339. pygeai/tests/core/llm/test_clients.py +142 -0
  340. pygeai/tests/core/plugins/__init__.py +0 -0
  341. pygeai/tests/core/plugins/test_clients.py +66 -0
  342. pygeai/tests/core/rerank/test_clients.py +76 -0
  343. pygeai/tests/core/rerank/test_managers.py +61 -39
  344. pygeai/tests/core/secrets/__init__.py +0 -0
  345. pygeai/tests/core/secrets/test_clients.py +264 -0
  346. pygeai/tests/core/services/__init__.py +0 -0
  347. pygeai/tests/core/services/test_rest.py +273 -0
  348. pygeai/tests/core/test_handlers.py +66 -0
  349. pygeai/tests/core/utils/__init__.py +0 -0
  350. pygeai/tests/core/utils/test_console.py +80 -0
  351. pygeai/tests/dbg/__init__.py +0 -0
  352. pygeai/tests/dbg/test_debugger.py +591 -0
  353. pygeai/tests/evaluation/__init__.py +0 -0
  354. pygeai/tests/evaluation/dataset/__init__.py +0 -0
  355. pygeai/tests/evaluation/dataset/test_clients.py +265 -0
  356. pygeai/tests/evaluation/plan/__init__.py +0 -0
  357. pygeai/tests/evaluation/plan/test_clients.py +195 -0
  358. pygeai/tests/evaluation/result/__init__.py +0 -0
  359. pygeai/tests/evaluation/result/test_clients.py +66 -0
  360. pygeai/tests/gam/__init__.py +0 -0
  361. pygeai/tests/gam/test_clients.py +195 -0
  362. pygeai/tests/health/__init__.py +0 -0
  363. pygeai/tests/health/test_clients.py +41 -0
  364. pygeai/tests/integration/__init__.py +0 -0
  365. pygeai/tests/integration/assistants/__init__.py +0 -0
  366. pygeai/tests/integration/assistants/rag/__init__.py +0 -0
  367. pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
  368. pygeai/tests/integration/chat/__init__.py +0 -0
  369. pygeai/tests/integration/chat/test_generate_image.py +158 -0
  370. pygeai/tests/integration/lab/__init__.py +0 -0
  371. pygeai/tests/integration/lab/agents/__init__.py +0 -0
  372. pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
  373. pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
  374. pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
  375. pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
  376. pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
  377. pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
  378. pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
  379. pygeai/tests/integration/lab/processes/__init__.py +0 -0
  380. pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
  381. pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
  382. pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
  383. pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
  384. pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
  385. pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
  386. pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
  387. pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
  388. pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
  389. pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
  390. pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
  391. pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
  392. pygeai/tests/integration/lab/tools/__init__.py +0 -0
  393. pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
  394. pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
  395. pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
  396. pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
  397. pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
  398. pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
  399. pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
  400. pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
  401. pygeai/tests/lab/agents/__init__.py +0 -0
  402. pygeai/tests/lab/agents/test_clients.py +481 -0
  403. pygeai/tests/lab/agents/test_mappers.py +440 -0
  404. pygeai/tests/lab/processes/__init__.py +0 -0
  405. pygeai/tests/lab/processes/test_clients.py +1416 -0
  406. pygeai/tests/lab/processes/test_mappers.py +1092 -0
  407. pygeai/tests/lab/spec/__init__.py +0 -0
  408. pygeai/tests/lab/spec/test_loader.py +59 -0
  409. pygeai/tests/lab/spec/test_parsers.py +182 -0
  410. pygeai/tests/lab/strategies/__init__.py +0 -0
  411. pygeai/tests/lab/strategies/test_clients.py +241 -0
  412. pygeai/tests/lab/strategies/test_mappers.py +132 -0
  413. pygeai/tests/lab/test_managers.py +553 -0
  414. pygeai/tests/lab/test_models.py +500 -3
  415. pygeai/tests/lab/tools/__init__.py +0 -0
  416. pygeai/tests/lab/tools/test_clients.py +521 -0
  417. pygeai/tests/lab/tools/test_mappers.py +198 -0
  418. pygeai/tests/migration/__init__.py +0 -0
  419. pygeai/tests/migration/test_strategies.py +405 -0
  420. pygeai/tests/migration/test_tools.py +159 -0
  421. pygeai/tests/organization/limits/test_clients.py +567 -0
  422. pygeai/tests/organization/limits/test_managers.py +298 -56
  423. pygeai/tests/organization/test_clients.py +600 -30
  424. pygeai/tests/organization/test_managers.py +424 -0
  425. pygeai/tests/organization/test_mappers.py +153 -0
  426. pygeai/tests/organization/test_responses.py +137 -0
  427. pygeai/tests/proxy/__init__.py +1 -0
  428. pygeai/tests/proxy/test_clients.py +397 -0
  429. pygeai/tests/proxy/test_config.py +171 -0
  430. pygeai/tests/proxy/test_integration.py +305 -0
  431. pygeai/tests/proxy/test_managers.py +312 -0
  432. pygeai/tests/proxy/test_servers.py +387 -0
  433. pygeai/tests/proxy/test_tool.py +176 -0
  434. pygeai/tests/snippets/analytics/__init__.py +0 -0
  435. pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
  436. pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
  437. pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
  438. pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
  439. pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
  440. pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
  441. pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
  442. pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
  443. pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
  444. pygeai/tests/snippets/auth/__init__.py +0 -0
  445. pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
  446. pygeai/tests/snippets/chat/get_response.py +15 -0
  447. pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
  448. pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
  449. pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
  450. pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
  451. pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
  452. pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
  453. pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
  454. pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
  455. pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
  456. pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
  457. pygeai/tests/snippets/dbg/__init__.py +0 -0
  458. pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
  459. pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
  460. pygeai/tests/snippets/dbg/file_debugging.py +72 -0
  461. pygeai/tests/snippets/dbg/module_debugging.py +61 -0
  462. pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
  463. pygeai/tests/snippets/dbg/stepping_example.py +40 -0
  464. pygeai/tests/snippets/embeddings/cache_example.py +31 -0
  465. pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
  466. pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
  467. pygeai/tests/snippets/embeddings/openai_example.py +30 -0
  468. pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
  469. pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
  470. pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
  471. pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
  472. pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
  473. pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
  474. pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
  475. pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
  476. pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
  477. pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
  478. pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
  479. pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
  480. pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
  481. pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
  482. pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
  483. pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
  484. pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
  485. pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
  486. pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
  487. pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
  488. pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
  489. pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
  490. pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
  491. pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
  492. pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
  493. pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
  494. pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
  495. pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
  496. pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
  497. pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
  498. pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
  499. pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
  500. pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
  501. pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
  502. pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
  503. pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
  504. pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
  505. pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
  506. pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
  507. pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
  508. pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
  509. pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
  510. pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
  511. pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
  512. pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
  513. pygeai/tests/snippets/files/delete_file.py +1 -4
  514. pygeai/tests/snippets/files/get_file_content.py +2 -4
  515. pygeai/tests/snippets/files/get_file_data.py +1 -4
  516. pygeai/tests/snippets/files/get_file_list.py +1 -6
  517. pygeai/tests/snippets/files/upload_file.py +1 -5
  518. pygeai/tests/snippets/gam/gam_access_token.py +87 -0
  519. pygeai/tests/snippets/lab/agentic_flow_example_1.py +25 -23
  520. pygeai/tests/snippets/lab/agentic_flow_example_4.py +23 -23
  521. pygeai/tests/snippets/lab/agents/create_agent.py +5 -8
  522. pygeai/tests/snippets/lab/agents/create_agent_2.py +1 -5
  523. pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
  524. pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
  525. pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
  526. pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
  527. pygeai/tests/snippets/lab/agents/delete_agent.py +1 -5
  528. pygeai/tests/snippets/lab/agents/get_agent.py +2 -11
  529. pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
  530. pygeai/tests/snippets/lab/agents/get_sharing_link.py +2 -7
  531. pygeai/tests/snippets/lab/agents/list_agents.py +4 -7
  532. pygeai/tests/snippets/lab/agents/publish_agent_revision.py +2 -6
  533. pygeai/tests/snippets/lab/agents/update_agent.py +1 -5
  534. pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
  535. pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
  536. pygeai/tests/snippets/lab/crud_ui.py +462 -0
  537. pygeai/tests/snippets/lab/processes/create_process.py +3 -5
  538. pygeai/tests/snippets/lab/processes/create_task.py +3 -5
  539. pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +10 -19
  540. pygeai/tests/snippets/lab/processes/kbs/create_kb.py +2 -5
  541. pygeai/tests/snippets/lab/processes/kbs/get_kb.py +10 -16
  542. pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +13 -20
  543. pygeai/tests/snippets/lab/processes/kbs/try_all.py +5 -7
  544. pygeai/tests/snippets/lab/processes/list_processes.py +5 -7
  545. pygeai/tests/snippets/lab/runner_1.py +1 -1
  546. pygeai/tests/snippets/lab/samples/summarize_files.py +3 -3
  547. pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +2 -5
  548. pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +2 -5
  549. pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +3 -6
  550. pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +2 -5
  551. pygeai/tests/snippets/lab/tools/create_tool.py +4 -10
  552. pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
  553. pygeai/tests/snippets/lab/tools/delete_tool.py +2 -6
  554. pygeai/tests/snippets/lab/tools/get_parameter.py +5 -7
  555. pygeai/tests/snippets/lab/tools/get_tool.py +5 -7
  556. pygeai/tests/snippets/lab/tools/list_tools.py +3 -7
  557. pygeai/tests/snippets/lab/tools/publish_tool_revision.py +3 -5
  558. pygeai/tests/snippets/lab/tools/set_parameters.py +4 -9
  559. pygeai/tests/snippets/lab/tools/update_tool.py +4 -8
  560. pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
  561. pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
  562. pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
  563. pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
  564. pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
  565. pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
  566. pygeai/tests/snippets/lab/{file_summarizer_example.py → use_cases/file_summarizer_example.py} +3 -3
  567. pygeai/tests/snippets/lab/{file_summarizer_example_2.py → use_cases/file_summarizer_example_2.py} +12 -12
  568. pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
  569. pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
  570. pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
  571. pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
  572. pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
  573. pygeai/tests/snippets/migrate/__init__.py +45 -0
  574. pygeai/tests/snippets/migrate/agent_migration.py +110 -0
  575. pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
  576. pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
  577. pygeai/tests/snippets/migrate/process_migration.py +64 -0
  578. pygeai/tests/snippets/migrate/project_migration.py +42 -0
  579. pygeai/tests/snippets/migrate/tool_migration.py +64 -0
  580. pygeai/tests/snippets/organization/add_project_member.py +10 -0
  581. pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
  582. pygeai/tests/snippets/organization/create_project.py +2 -2
  583. pygeai/tests/snippets/organization/get_memberships.py +12 -0
  584. pygeai/tests/snippets/organization/get_organization_members.py +6 -0
  585. pygeai/tests/snippets/organization/get_project_members.py +6 -0
  586. pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
  587. pygeai/tests/snippets/organization/get_project_roles.py +6 -0
  588. pygeai/vendor/a2a/__init__.py +1 -0
  589. pygeai/vendor/a2a/auth/__init__.py +0 -0
  590. pygeai/vendor/a2a/auth/user.py +31 -0
  591. pygeai/vendor/a2a/client/__init__.py +19 -0
  592. pygeai/vendor/a2a/client/client.py +425 -0
  593. pygeai/vendor/a2a/client/errors.py +33 -0
  594. pygeai/vendor/a2a/client/helpers.py +22 -0
  595. pygeai/vendor/a2a/py.typed +0 -0
  596. pygeai/vendor/a2a/server/__init__.py +1 -0
  597. pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
  598. pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
  599. pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
  600. pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
  601. pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
  602. pygeai/vendor/a2a/server/apps/__init__.py +16 -0
  603. pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
  604. pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
  605. pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
  606. pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
  607. pygeai/vendor/a2a/server/context.py +23 -0
  608. pygeai/vendor/a2a/server/events/__init__.py +21 -0
  609. pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
  610. pygeai/vendor/a2a/server/events/event_queue.py +156 -0
  611. pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
  612. pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
  613. pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
  614. pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
  615. pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
  616. pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
  617. pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
  618. pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
  619. pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
  620. pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
  621. pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
  622. pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
  623. pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
  624. pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
  625. pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
  626. pygeai/vendor/a2a/types.py +1624 -0
  627. pygeai/vendor/a2a/utils/__init__.py +40 -0
  628. pygeai/vendor/a2a/utils/artifact.py +72 -0
  629. pygeai/vendor/a2a/utils/errors.py +69 -0
  630. pygeai/vendor/a2a/utils/helpers.py +176 -0
  631. pygeai/vendor/a2a/utils/message.py +83 -0
  632. pygeai/vendor/a2a/utils/task.py +57 -0
  633. pygeai/vendor/a2a/utils/telemetry.py +299 -0
  634. pygeai-0.6.0b15.dist-info/METADATA +205 -0
  635. pygeai-0.6.0b15.dist-info/RECORD +799 -0
  636. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
  637. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/entry_points.txt +2 -1
  638. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/licenses/LICENSE +13 -1
  639. pygeai-0.6.0b15.dist-info/top_level.txt +1 -0
  640. docs/geai-proxy/README.md +0 -145
  641. docs/source/conf.py +0 -45
  642. pygeai/tests/core/test_managers.py +0 -233
  643. pygeai-0.1.51b3.dist-info/METADATA +0 -130
  644. pygeai-0.1.51b3.dist-info/RECORD +0 -324
  645. pygeai-0.1.51b3.dist-info/top_level.txt +0 -3
  646. scripts/bump_beta_version.py +0 -56
  647. {scripts → pygeai/analytics}/__init__.py +0 -0
  648. /pygeai/tests/snippets/lab/{c_code_fixer_agent_flow.py → use_cases/c_code_fixer_agent_flow.py} +0 -0
pygeai/lab/managers.py CHANGED
@@ -1,7 +1,10 @@
1
1
  from typing import Union, Optional, List
2
2
 
3
+ from pygeai import logger
4
+ from pygeai.admin.clients import AdminClient
3
5
  from pygeai.core.base.mappers import ResponseMapper
4
- from pygeai.core.base.responses import ErrorListResponse, EmptyResponse
6
+ from pygeai.core.base.responses import EmptyResponse
7
+ from pygeai.core.common.exceptions import APIError, MissingRequirementException
5
8
  from pygeai.core.handlers import ErrorHandler
6
9
  from pygeai.lab.agents.clients import AgentClient
7
10
  from pygeai.lab.agents.mappers import AgentMapper
@@ -19,35 +22,31 @@ from pygeai.lab.tools.mappers import ToolMapper
19
22
 
20
23
  class AILabManager:
21
24
 
22
- def __init__(self, api_key: str = None, base_url: str = None, alias: str = "default"):
23
- self.__agent_client = AgentClient(api_key=api_key, base_url=base_url, alias=alias)
24
- self.__tool_client = ToolClient(api_key=api_key, base_url=base_url, alias=alias)
25
- self.__reasoning_strategy_client = ReasoningStrategyClient(api_key=api_key, base_url=base_url, alias=alias)
26
- self.__process_client = AgenticProcessClient(api_key=api_key, base_url=base_url, alias=alias)
25
+ def __init__(self, api_key: str = None, base_url: str = None, alias: str = None, project_id: str = None):
26
+ self.__agent_client = AgentClient(api_key=api_key, base_url=base_url, alias=alias, project_id=project_id)
27
+ self.__tool_client = ToolClient(api_key=api_key, base_url=base_url, alias=alias, project_id=project_id)
28
+ self.__reasoning_strategy_client = ReasoningStrategyClient(api_key=api_key, base_url=base_url, alias=alias, project_id=project_id)
29
+ self.__process_client = AgenticProcessClient(api_key=api_key, base_url=base_url, alias=alias, project_id=project_id)
27
30
 
28
31
  def get_agent_list(
29
32
  self,
30
- project_id: str,
31
- filter_settings: FilterSettings = None
33
+ filter_settings: Optional[FilterSettings] = None
32
34
  ) -> AgentList:
33
35
  """
34
36
  Retrieves a list of agents for a given project based on filter settings.
35
37
 
36
38
  This method queries the agent client to fetch a list of agents associated with the specified
37
- project ID, applying the provided filter settings. If the response contains errors, it maps
38
- them to an `ErrorListResponse`. Otherwise, it maps the response to an `AgentList`.
39
+ project ID, applying the provided filter settings.
39
40
 
40
- :param project_id: str - The ID of the project to retrieve agents for.
41
- :param filter_settings: FilterSettings - The filter settings to apply to the agent list query.
41
+ :param filter_settings: The filter settings to apply to the agent list query.
42
42
  Includes fields such as status, start, count, access_scope, allow_drafts, and allow_external.
43
- :return: Union[AgentList, ErrorListResponse] - An `AgentList` containing the retrieved agents
44
- if successful, or an `ErrorListResponse` if the API returns errors.
43
+ :return: An `AgentList` containing the retrieved agents.
44
+ :raises APIError: If the API returns errors.
45
45
  """
46
46
  if not filter_settings:
47
47
  filter_settings = FilterSettings()
48
48
 
49
49
  response_data = self.__agent_client.list_agents(
50
- project_id=project_id,
51
50
  status=filter_settings.status,
52
51
  start=filter_settings.start,
53
52
  count=filter_settings.count,
@@ -56,36 +55,33 @@ class AILabManager:
56
55
  allow_external=filter_settings.allow_external
57
56
  )
58
57
  if ErrorHandler.has_errors(response_data):
59
- result = ErrorHandler.extract_error(response_data)
60
- else:
61
- result = AgentMapper.map_to_agent_list(response_data)
58
+ error = ErrorHandler.extract_error(response_data)
59
+ logger.error(f"Error received while obtaining agent list: {error}")
60
+ raise APIError(f"Error received while obtaining agent list: {error}")
62
61
 
62
+ result = AgentMapper.map_to_agent_list(response_data)
63
63
  return result
64
64
 
65
65
  def create_agent(
66
66
  self,
67
- project_id: str,
68
67
  agent: Agent,
69
68
  automatic_publish: bool = False
70
- ) -> Union[Agent, ErrorListResponse]:
69
+ ) -> Agent:
71
70
  """
72
71
  Creates a new agent in the specified project using the provided agent configuration.
73
72
 
74
73
  This method sends a request to the agent client to create an agent based on the attributes
75
- of the provided `Agent` object. If the response contains errors, it maps them to an
76
- `ErrorListResponse`. Otherwise, it maps the response to an `Agent` object.
74
+ of the provided `Agent` object.
77
75
 
78
- :param project_id: str - Unique identifier of the project where the agent will be created.
79
- :param agent: Agent - The agent configuration object containing all necessary details,
76
+ :param agent: The agent configuration object containing all necessary details,
80
77
  including name, access scope, public name, job description, avatar image, description,
81
78
  and agent data (prompt, LLM config, and models).
82
- :param automatic_publish: bool - Whether to automatically publish the agent after creation.
79
+ :param automatic_publish: Whether to automatically publish the agent after creation.
83
80
  Defaults to False.
84
- :return: Union[Agent, ErrorListResponse] - An `Agent` object representing the created agent
85
- if successful, or an `ErrorListResponse` if the API returns errors.
81
+ :return: An `Agent` object representing the created agent.
82
+ :raises APIError: If the API returns errors.
86
83
  """
87
84
  response_data = self.__agent_client.create_agent(
88
- project_id=project_id,
89
85
  name=agent.name,
90
86
  access_scope=agent.access_scope,
91
87
  public_name=agent.public_name,
@@ -93,48 +89,45 @@ class AILabManager:
93
89
  avatar_image=agent.avatar_image,
94
90
  description=agent.description,
95
91
  agent_data_prompt=agent.agent_data.prompt.to_dict() if agent.agent_data is not None else None,
92
+ agent_data_strategy_name=agent.agent_data.strategy_name if agent.agent_data is not None else None,
96
93
  agent_data_llm_config=agent.agent_data.llm_config.to_dict() if agent.agent_data is not None else None,
97
- agent_data_models=agent.agent_data.models.to_dict() if agent.agent_data is not None else None,
94
+ agent_data_models=agent.agent_data.models.to_dict() if agent.agent_data and agent.agent_data.models else None,
98
95
  agent_data_resource_pools=agent.agent_data.resource_pools.to_dict() if agent.agent_data and agent.agent_data.resource_pools else None,
99
96
  automatic_publish=automatic_publish
100
97
  )
101
98
  if ErrorHandler.has_errors(response_data):
102
- result = ErrorHandler.extract_error(response_data)
103
- else:
104
- result = AgentMapper.map_to_agent(response_data)
99
+ error = ErrorHandler.extract_error(response_data)
100
+ logger.error(f"Error received while creating agent: {error}")
101
+ raise APIError(f"Error received while creating agent: {error}")
105
102
 
103
+ result = AgentMapper.map_to_agent(response_data)
106
104
  return result
107
105
 
108
106
  def update_agent(
109
107
  self,
110
- project_id: str,
111
108
  agent: Agent,
112
109
  automatic_publish: bool = False,
113
110
  upsert: bool = False
114
- ) -> Union[Agent, ErrorListResponse]:
111
+ ) -> Agent:
115
112
  """
116
113
  Updates an existing agent in the specified project using the provided agent configuration.
117
114
 
118
- This method sends a request to the agent client to update an agent identified by `agent_id`
119
- (or `agent.id` if not provided) based on the attributes of the provided `Agent` object.
120
- It can optionally publish the agent automatically or perform an upsert if the agent doesn’t exist.
121
- If the response contains errors, it maps them to an `ErrorListResponse`. Otherwise, it maps
122
- the response to an `Agent` object.
115
+ This method sends a request to the agent client to update an agent identified by `agent.id`
116
+ based on the attributes of the provided `Agent` object. It can optionally publish the agent
117
+ automatically or perform an upsert if the agent doesn’t exist.
123
118
 
124
- :param project_id: str - Unique identifier of the project where the agent resides.
125
- :param agent: Agent - The agent configuration object containing updated details,
119
+ :param agent: The agent configuration object containing updated details,
126
120
  including id, name, access scope, public name, job description, avatar image, description,
127
121
  and agent data (prompt, LLM config, and models).
128
- :param automatic_publish: bool - Whether to automatically publish the agent after updating.
122
+ :param automatic_publish: Whether to automatically publish the agent after updating.
129
123
  Defaults to False.
130
- :param upsert: bool - Whether to insert the agent if it does not exist (upsert) instead of
124
+ :param upsert: Whether to insert the agent if it does not exist (upsert) instead of
131
125
  just updating. Defaults to False.
132
- :return: Union[Agent, ErrorListResponse] - An `Agent` object representing the updated agent
133
- if successful, or an `ErrorListResponse` if the API returns errors.
134
- :raises ValueError: If neither `agent_id` nor `agent.id` is provided.
126
+ :return: An `Agent` object representing the updated agent.
127
+ :raises MissingRequirementException: If `agent.id` is not provided.
128
+ :raises APIError: If the API returns errors.
135
129
  """
136
130
  response_data = self.__agent_client.update_agent(
137
- project_id=project_id,
138
131
  agent_id=agent.id,
139
132
  name=agent.name,
140
133
  access_scope=agent.access_scope,
@@ -144,37 +137,37 @@ class AILabManager:
144
137
  description=agent.description,
145
138
  agent_data_prompt=agent.agent_data.prompt.to_dict() if agent.agent_data is not None else None,
146
139
  agent_data_llm_config=agent.agent_data.llm_config.to_dict() if agent.agent_data is not None else None,
147
- agent_data_models=agent.agent_data.models.to_dict() if agent.agent_data is not None else None,
140
+ agent_data_strategy_name=agent.agent_data.strategy_name if agent.agent_data and agent.agent_data.strategy_name else None,
141
+ agent_data_models=agent.agent_data.models.to_dict() if agent.agent_data and agent.agent_data.models else None,
142
+ agent_data_resource_pools=agent.agent_data.resource_pools.to_dict() if agent.agent_data and agent.agent_data.resource_pools else None,
148
143
  automatic_publish=automatic_publish,
149
144
  upsert=upsert
150
145
  )
151
146
  if ErrorHandler.has_errors(response_data):
152
- result = ErrorHandler.extract_error(response_data)
153
- else:
154
- result = AgentMapper.map_to_agent(response_data)
147
+ error = ErrorHandler.extract_error(response_data)
148
+ logger.error(f"Error received while updating agent: {error}")
149
+ raise APIError(f"Error received while updating agent: {error}")
155
150
 
151
+ result = AgentMapper.map_to_agent(response_data)
156
152
  return result
157
153
 
158
154
  def get_agent(
159
155
  self,
160
- project_id: str,
161
156
  agent_id: str,
162
157
  filter_settings: Optional[FilterSettings] = None
163
- ) -> Union[Agent, ErrorListResponse]:
158
+ ) -> Agent:
164
159
  """
165
160
  Retrieves details of a specific agent from the specified project.
166
161
 
167
162
  This method sends a request to the agent client to retrieve an agent identified by `agent_id`
168
163
  from the specified project. Optional filter settings can be provided to specify the revision,
169
- version, and whether to allow drafts. If the response contains errors, it maps them to an
170
- `ErrorListResponse`. Otherwise, it maps the response to an `Agent` object.
164
+ version, and whether to allow drafts.
171
165
 
172
- :param project_id: str - Unique identifier of the project where the agent resides.
173
- :param agent_id: str - Unique identifier of the agent to retrieve.
174
- :param filter_settings: FilterSettings, optional - Settings to filter the agent retrieval,
175
- including revision (defaults to "0"), version (defaults to 0), and allow_drafts (defaults to True).
176
- :return: Union[Agent, ErrorListResponse] - An `Agent` object representing the retrieved agent
177
- if successful, or an `ErrorListResponse` if the API returns errors.
166
+ :param agent_id: Unique identifier of the agent to retrieve.
167
+ :param filter_settings: Settings to filter the agent retrieval,
168
+ including revision (defaults to "0"), version (defaults to "0"), and allow_drafts (defaults to True).
169
+ :return: An `Agent` object representing the retrieved agent.
170
+ :raises APIError: If the API returns errors.
178
171
  """
179
172
  if filter_settings is None:
180
173
  filter_settings = FilterSettings(
@@ -184,135 +177,120 @@ class AILabManager:
184
177
  )
185
178
 
186
179
  response_data = self.__agent_client.get_agent(
187
- project_id=project_id,
188
180
  agent_id=agent_id,
189
181
  revision=filter_settings.revision,
190
182
  version=filter_settings.version,
191
183
  allow_drafts=filter_settings.allow_drafts
192
184
  )
193
185
  if ErrorHandler.has_errors(response_data):
194
- result = ErrorHandler.extract_error(response_data)
195
- else:
196
- result = AgentMapper.map_to_agent(response_data)
186
+ error = ErrorHandler.extract_error(response_data)
187
+ logger.error(f"Error received while retrieving agent: {error}")
188
+ raise APIError(f"Error received while retrieving agent: {error}")
197
189
 
190
+ result = AgentMapper.map_to_agent(response_data)
198
191
  return result
199
192
 
200
193
  def create_sharing_link(
201
194
  self,
202
- project_id: str,
203
195
  agent_id: str
204
- ) -> Union[SharingLink, ErrorListResponse]:
196
+ ) -> SharingLink:
205
197
  """
206
198
  Creates a sharing link for a specific agent in the specified project.
207
199
 
208
200
  This method sends a request to the agent client to create a sharing link for the agent
209
- identified by `agent_id` in the specified project. If the response contains errors, it maps
210
- them to an `ErrorListResponse`. Otherwise, it maps the response to a `SharingLink` object.
201
+ identified by `agent_id` in the specified project.
211
202
 
212
- :param project_id: str - Unique identifier of the project where the agent resides.
213
- :param agent_id: str - Unique identifier of the agent for which to create a sharing link.
214
- :return: Union[SharingLink, ErrorListResponse] - A `SharingLink` object representing the
215
- sharing link details if successful, or an `ErrorListResponse` if the API returns errors.
203
+ :param agent_id: Unique identifier of the agent for which to create a sharing link.
204
+ :return: A `SharingLink` object representing the sharing link details.
205
+ :raises APIError: If the API returns errors.
216
206
  """
217
207
  response_data = self.__agent_client.create_sharing_link(
218
- project_id=project_id,
219
208
  agent_id=agent_id
220
209
  )
221
210
  if ErrorHandler.has_errors(response_data):
222
- result = ErrorHandler.extract_error(response_data)
223
- else:
224
- result = AgentMapper.map_to_sharing_link(response_data)
211
+ error = ErrorHandler.extract_error(response_data)
212
+ logger.error(f"Error received while creating sharing link: {error}")
213
+ raise APIError(f"Error received while creating sharing link: {error}")
225
214
 
215
+ result = AgentMapper.map_to_sharing_link(response_data)
226
216
  return result
227
217
 
228
218
  def publish_agent_revision(
229
219
  self,
230
- project_id: str,
231
220
  agent_id: str,
232
221
  revision: str
233
- ) -> Union[Agent, ErrorListResponse]:
222
+ ) -> Agent:
234
223
  """
235
224
  Publishes a specific revision of an agent in the specified project.
236
225
 
237
226
  This method sends a request to the agent client to publish the specified revision of the agent
238
- identified by `agent_id` in the specified project. If the response contains errors, it maps
239
- them to an `ErrorListResponse`. Otherwise, it maps the response to an `Agent` object
240
- representing the published agent.
227
+ identified by `agent_id` in the specified project.
241
228
 
242
- :param project_id: str - Unique identifier of the project where the agent resides.
243
- :param agent_id: str - Unique identifier of the agent to publish.
244
- :param revision: str - Revision of the agent to publish.
245
- :return: Union[Agent, ErrorListResponse] - An `Agent` object representing the published agent
246
- if successful, or an `ErrorListResponse` if the API returns errors.
229
+ :param agent_id: Unique identifier of the agent to publish.
230
+ :param revision: Revision of the agent to publish.
231
+ :return: An `Agent` object representing the published agent.
232
+ :raises APIError: If the API returns errors.
247
233
  """
248
234
  response_data = self.__agent_client.publish_agent_revision(
249
- project_id=project_id,
250
235
  agent_id=agent_id,
251
236
  revision=revision
252
237
  )
253
238
  if ErrorHandler.has_errors(response_data):
254
- result = ErrorHandler.extract_error(response_data)
255
- else:
256
- result = AgentMapper.map_to_agent(response_data)
239
+ error = ErrorHandler.extract_error(response_data)
240
+ logger.error(f"Error received while publishing agent revision: {error}")
241
+ raise APIError(f"Error received while publishing agent revision: {error}")
257
242
 
243
+ result = AgentMapper.map_to_agent(response_data)
258
244
  return result
259
245
 
260
246
  def delete_agent(
261
247
  self,
262
- project_id: str,
263
248
  agent_id: str
264
- ) -> Union[EmptyResponse, ErrorListResponse]:
249
+ ) -> EmptyResponse:
265
250
  """
266
251
  Deletes a specific agent from the specified project.
267
252
 
268
253
  This method sends a request to the agent client to delete the agent identified by `agent_id`
269
- from the specified project. Returns True if the deletion is successful (indicated by an
270
- empty response or success confirmation), or an `ErrorListResponse` if the API returns errors.
254
+ from the specified project.
271
255
 
272
- :param project_id: str - Unique identifier of the project where the agent resides.
273
- :param agent_id: str - Unique identifier of the agent to delete.
274
- :return: Union[EmptyResponse, ErrorListResponse] - EmptyResponse if the agent was deleted successfully,
275
- or an `ErrorListResponse` if the API returns errors.
256
+ :param agent_id: Unique identifier of the agent to delete.
257
+ :return: `EmptyResponse` if the agent was deleted successfully.
258
+ :raises APIError: If the API returns errors.
276
259
  """
277
260
  response_data = self.__agent_client.delete_agent(
278
- project_id=project_id,
279
261
  agent_id=agent_id
280
262
  )
281
263
  if ErrorHandler.has_errors(response_data):
282
- result = ErrorHandler.extract_error(response_data)
283
- else:
284
- response_data = response_data if response_data else "Agent deleted successfully"
285
- result = ResponseMapper.map_to_empty_response(response_data)
264
+ error = ErrorHandler.extract_error(response_data)
265
+ logger.error(f"Error received while deleting agent: {error}")
266
+ raise APIError(f"Error received while deleting agent: {error}")
286
267
 
268
+ result = ResponseMapper.map_to_empty_response(response_data or "Agent deleted successfully")
287
269
  return result
288
270
 
289
271
  def create_tool(
290
272
  self,
291
- project_id: str,
292
273
  tool: Tool,
293
274
  automatic_publish: bool = False
294
- ) -> Union[Tool, ErrorListResponse]:
275
+ ) -> Tool:
295
276
  """
296
277
  Creates a new tool in the specified project using the provided tool configuration.
297
278
 
298
279
  This method sends a request to the tool client to create a tool based on the attributes
299
280
  of the provided `Tool` object, including name, description, scope, access_scope, public_name,
300
- icon, open_api, open_api_json, report_events, and parameters. If the response contains errors,
301
- it maps them to an `ErrorListResponse`. Otherwise, it maps the response to a `Tool` object.
281
+ icon, open_api, open_api_json, report_events, and parameters.
302
282
 
303
- :param project_id: str - Unique identifier of the project where the tool will be created.
304
- :param tool: Tool - The tool configuration object containing name, description, scope,
283
+ :param tool: The tool configuration object containing name, description, scope,
305
284
  access_scope, public_name, icon, open_api, open_api_json, report_events, and parameters.
306
285
  Optional fields (e.g., id, access_scope) are included if set in the `Tool` object.
307
- :param automatic_publish: bool - Whether to automatically publish the tool after creation.
286
+ :param automatic_publish: Whether to automatically publish the tool after creation.
308
287
  Defaults to False.
309
- :return: Union[Tool, ErrorListResponse] - A `Tool` object representing the created tool
310
- if successful, or an `ErrorListResponse` if the API returns errors.
288
+ :return: A `Tool` object representing the created tool.
289
+ :raises APIError: If the API returns errors.
311
290
  """
312
291
  parameters = [param.to_dict() for param in tool.parameters] if tool.parameters else []
313
292
 
314
293
  response_data = self.__tool_client.create_tool(
315
- project_id=project_id,
316
294
  name=tool.name,
317
295
  description=tool.description,
318
296
  scope=tool.scope,
@@ -326,19 +304,19 @@ class AILabManager:
326
304
  automatic_publish=automatic_publish
327
305
  )
328
306
  if ErrorHandler.has_errors(response_data):
329
- result = ErrorHandler.extract_error(response_data)
330
- else:
331
- result = ToolMapper.map_to_tool(response_data)
307
+ error = ErrorHandler.extract_error(response_data)
308
+ logger.error(f"Error received while creating tool: {error}")
309
+ raise APIError(f"Error received while creating tool: {error}")
332
310
 
311
+ result = ToolMapper.map_to_tool(response_data)
333
312
  return result
334
313
 
335
314
  def update_tool(
336
315
  self,
337
- project_id: str,
338
316
  tool: Tool,
339
317
  automatic_publish: bool = False,
340
318
  upsert: bool = False
341
- ) -> Union[Tool, ErrorListResponse]:
319
+ ) -> Tool:
342
320
  """
343
321
  Updates an existing tool in the specified project or upserts it if specified.
344
322
 
@@ -346,24 +324,20 @@ class AILabManager:
346
324
  based on the attributes of the provided `Tool` object, including name, description, scope,
347
325
  access_scope, public_name, icon, open_api, open_api_json, report_events, and parameters.
348
326
  It can optionally publish the tool automatically or perform an upsert if the tool doesn’t exist.
349
- If the response contains errors, it maps them to an `ErrorListResponse`. Otherwise, it maps
350
- the response to a `Tool` object.
351
327
 
352
- :param project_id: str - Unique identifier of the project where the tool resides.
353
- :param tool: Tool - The tool configuration object containing updated details, including
328
+ :param tool: The tool configuration object containing updated details, including
354
329
  id, name, description, scope, access_scope, public_name, icon, open_api, open_api_json,
355
330
  report_events, and parameters.
356
- :param automatic_publish: bool - Whether to automatically publish the tool after updating.
331
+ :param automatic_publish: Whether to automatically publish the tool after updating.
357
332
  Defaults to False.
358
- :param upsert: bool - Whether to insert the tool if it does not exist (upsert) instead of
333
+ :param upsert: Whether to insert the tool if it does not exist (upsert) instead of
359
334
  just updating. Defaults to False.
360
- :return: Union[Tool, ErrorListResponse] - A `Tool` object representing the updated tool
361
- if successful, or an `ErrorListResponse` if the API returns errors.
335
+ :return: A `Tool` object representing the updated tool.
336
+ :raises APIError: If the API returns errors.
362
337
  """
363
338
  parameters = [param.to_dict() for param in tool.parameters] if tool.parameters else []
364
339
 
365
340
  response_data = self.__tool_client.update_tool(
366
- project_id=project_id,
367
341
  tool_id=tool.id,
368
342
  name=tool.name,
369
343
  description=tool.description,
@@ -380,32 +354,30 @@ class AILabManager:
380
354
  )
381
355
 
382
356
  if ErrorHandler.has_errors(response_data):
383
- result = ErrorHandler.extract_error(response_data)
384
- else:
385
- result = ToolMapper.map_to_tool(response_data)
357
+ error = ErrorHandler.extract_error(response_data)
358
+ logger.error(f"Error received while updating tool: {error}")
359
+ raise APIError(f"Error received while updating tool: {error}")
386
360
 
361
+ result = ToolMapper.map_to_tool(response_data)
387
362
  return result
388
363
 
389
364
  def get_tool(
390
365
  self,
391
- project_id: str,
392
366
  tool_id: str,
393
367
  filter_settings: Optional[FilterSettings] = None
394
- ) -> Union[Tool, ErrorListResponse]:
368
+ ) -> Tool:
395
369
  """
396
370
  Retrieves details of a specific tool from the specified project.
397
371
 
398
372
  This method sends a request to the tool client to retrieve a tool identified by `tool_id`
399
373
  from the specified project. Optional filter settings can be provided to specify the revision,
400
- version, and whether to allow drafts. If the response contains errors, it maps them to an
401
- `ErrorListResponse`. Otherwise, it maps the response to a `Tool` object.
374
+ version, and whether to allow drafts.
402
375
 
403
- :param project_id: str - Unique identifier of the project where the tool resides.
404
- :param tool_id: str - Unique identifier of the tool to retrieve.
405
- :param filter_settings: FilterSettings, optional - Settings to filter the tool retrieval,
376
+ :param tool_id: Unique identifier of the tool to retrieve.
377
+ :param filter_settings: Settings to filter the tool retrieval,
406
378
  including revision (defaults to "0"), version (defaults to "0"), and allow_drafts (defaults to True).
407
- :return: Union[Tool, ErrorListResponse] - A `Tool` object representing the retrieved tool
408
- if successful, or an `ErrorListResponse` if the API returns errors.
379
+ :return: A `Tool` object representing the retrieved tool.
380
+ :raises APIError: If the API returns errors.
409
381
  """
410
382
  if filter_settings is None:
411
383
  filter_settings = FilterSettings(
@@ -415,7 +387,6 @@ class AILabManager:
415
387
  )
416
388
 
417
389
  response_data = self.__tool_client.get_tool(
418
- project_id=project_id,
419
390
  tool_id=tool_id,
420
391
  revision=filter_settings.revision,
421
392
  version=filter_settings.version,
@@ -423,67 +394,61 @@ class AILabManager:
423
394
  )
424
395
 
425
396
  if ErrorHandler.has_errors(response_data):
426
- result = ErrorHandler.extract_error(response_data)
427
- else:
428
- result = ToolMapper.map_to_tool(response_data)
397
+ error = ErrorHandler.extract_error(response_data)
398
+ logger.error(f"Error received while retrieving tool: {error}")
399
+ raise APIError(f"Error received while retrieving tool: {error}")
429
400
 
401
+ result = ToolMapper.map_to_tool(response_data)
430
402
  return result
431
403
 
432
404
  def delete_tool(
433
405
  self,
434
- project_id: str,
435
406
  tool_id: Optional[str] = None,
436
407
  tool_name: Optional[str] = None
437
- ) -> Union[EmptyResponse, ErrorListResponse]:
408
+ ) -> EmptyResponse:
438
409
  """
439
410
  Deletes a specific tool from the specified project.
440
411
 
441
412
  This method sends a request to the tool client to delete the tool identified by either
442
- `tool_id` or `tool_name`. Returns an `EmptyResponse` if the deletion is successful,
443
- or an `ErrorListResponse` if the API returns errors.
413
+ `tool_id` or `tool_name`.
444
414
 
445
- :param project_id: str - Unique identifier of the project where the tool resides.
446
- :param tool_id: str, optional - Unique identifier of the tool to delete.
447
- :param tool_name: str, optional - Name of the tool to delete.
448
- :return: Union[EmptyResponse, ErrorListResponse] - `EmptyResponse` if the tool was deleted successfully,
449
- or an `ErrorListResponse` if the API returns errors.
450
- :raises ValueError: If neither tool_id nor tool_name is provided.
415
+ :param tool_id: Unique identifier of the tool to delete.
416
+ :param tool_name: Name of the tool to delete.
417
+ :return: `EmptyResponse` if the tool was deleted successfully.
418
+ :raises MissingRequirementException: If neither tool_id nor tool_name is provided.
419
+ :raises APIError: If the API returns errors.
451
420
  """
452
421
  if not (tool_id or tool_name):
453
- raise ValueError("Either tool_id or tool_name must be provided.")
422
+ raise MissingRequirementException("Either tool_id or tool_name must be provided.")
454
423
 
455
424
  response_data = self.__tool_client.delete_tool(
456
- project_id=project_id,
457
425
  tool_id=tool_id,
458
426
  tool_name=tool_name
459
427
  )
460
428
 
461
429
  if ErrorHandler.has_errors(response_data):
462
- result = ErrorHandler.extract_error(response_data)
463
- else:
464
- response_data = response_data if response_data else "Tool deleted successfully"
465
- result = ResponseMapper.map_to_empty_response(response_data)
430
+ error = ErrorHandler.extract_error(response_data)
431
+ logger.error(f"Error received while deleting tool: {error}")
432
+ raise APIError(f"Error received while deleting tool: {error}")
466
433
 
434
+ result = ResponseMapper.map_to_empty_response(response_data or "Tool deleted successfully")
467
435
  return result
468
436
 
469
437
  def list_tools(
470
438
  self,
471
- project_id: str,
472
439
  filter_settings: Optional[FilterSettings] = None
473
- ) -> Union[ToolList, ErrorListResponse]:
440
+ ) -> ToolList:
474
441
  """
475
442
  Retrieves a list of tools associated with the specified project.
476
443
 
477
444
  This method queries the tool client to fetch a list of tools for the given project ID,
478
- applying the specified filter settings. If the response contains errors, it maps them to an
479
- `ErrorListResponse`. Otherwise, it maps the response to a `ToolList` object using `ToolMapper`.
445
+ applying the specified filter settings.
480
446
 
481
- :param project_id: str - Unique identifier of the project.
482
- :param filter_settings: FilterSettings, optional - Settings to filter the tool list query,
447
+ :param filter_settings: Settings to filter the tool list query,
483
448
  including id (defaults to ""), count (defaults to "100"), access_scope (defaults to "public"),
484
449
  allow_drafts (defaults to True), scope (defaults to "api"), and allow_external (defaults to True).
485
- :return: Union[ToolList, ErrorListResponse] - A `ToolList` object containing the retrieved tools
486
- if successful, or an `ErrorListResponse` if the API returns errors.
450
+ :return: A `ToolList` object containing the retrieved tools.
451
+ :raises APIError: If the API returns errors.
487
452
  """
488
453
  if filter_settings is None:
489
454
  filter_settings = FilterSettings(
@@ -496,7 +461,6 @@ class AILabManager:
496
461
  )
497
462
 
498
463
  response_data = self.__tool_client.list_tools(
499
- project_id=project_id,
500
464
  id=filter_settings.id,
501
465
  count=filter_settings.count,
502
466
  access_scope=filter_settings.access_scope,
@@ -506,70 +470,65 @@ class AILabManager:
506
470
  )
507
471
 
508
472
  if ErrorHandler.has_errors(response_data):
509
- result = ErrorHandler.extract_error(response_data)
510
- else:
511
- result = ToolMapper.map_to_tool_list(response_data)
473
+ error = ErrorHandler.extract_error(response_data)
474
+ logger.error(f"Error received while listing tools: {error}")
475
+ raise APIError(f"Error received while listing tools: {error}")
512
476
 
477
+ result = ToolMapper.map_to_tool_list(response_data)
513
478
  return result
514
479
 
515
480
  def publish_tool_revision(
516
481
  self,
517
- project_id: str,
518
482
  tool_id: str,
519
483
  revision: str
520
- ) -> Union[Tool, ErrorListResponse]:
484
+ ) -> Tool:
521
485
  """
522
486
  Publishes a specific revision of a tool in the specified project.
523
487
 
524
488
  This method sends a request to the tool client to publish the specified revision of the tool
525
- identified by `tool_id`. If the response contains errors, it maps them to an `ErrorListResponse`.
526
- Otherwise, it maps the response to a `Tool` object representing the published tool.
489
+ identified by `tool_id`.
527
490
 
528
- :param project_id: str - Unique identifier of the project where the tool resides.
529
- :param tool_id: str - Unique identifier of the tool to publish.
530
- :param revision: str - Revision of the tool to publish.
531
- :return: Union[Tool, ErrorListResponse] - A `Tool` object representing the published tool
532
- if successful, or an `ErrorListResponse` if the API returns errors.
491
+ :param tool_id: Unique identifier of the tool to publish.
492
+ :param revision: Revision of the tool to publish.
493
+ :return: A `Tool` object representing the published tool.
494
+ :raises APIError: If the API returns errors.
533
495
  """
534
496
  response_data = self.__tool_client.publish_tool_revision(
535
- project_id=project_id,
536
497
  tool_id=tool_id,
537
498
  revision=revision
538
499
  )
539
500
 
540
501
  if ErrorHandler.has_errors(response_data):
541
- result = ErrorHandler.extract_error(response_data)
542
- else:
543
- result = ToolMapper.map_to_tool(response_data)
502
+ error = ErrorHandler.extract_error(response_data)
503
+ logger.error(f"Error received while publishing tool revision: {error}")
504
+ raise APIError(f"Error received while publishing tool revision: {error}")
544
505
 
506
+ result = ToolMapper.map_to_tool(response_data)
545
507
  return result
546
508
 
547
509
  def get_parameter(
548
510
  self,
549
- project_id: str,
550
511
  tool_id: Optional[str] = None,
551
512
  tool_public_name: Optional[str] = None,
552
513
  filter_settings: Optional[FilterSettings] = None
553
- ) -> Union[List[ToolParameter], ErrorListResponse]:
514
+ ) -> List[ToolParameter]:
554
515
  """
555
516
  Retrieves details of parameters for a specific tool in the specified project.
556
517
 
557
518
  This method sends a request to the tool client to retrieve parameters for a tool identified
558
519
  by either `tool_id` or `tool_public_name`. Optional filter settings can specify revision,
559
- version, and whether to allow drafts. If the response contains errors, it maps them to an
560
- `ErrorListResponse`. Otherwise, it maps the response to a list of `ToolParameter` objects.
520
+ version, and whether to allow drafts.
561
521
 
562
- :param project_id: str - Unique identifier of the project.
563
- :param tool_id: str, optional - Unique identifier of the tool whose parameters are to be retrieved.
564
- :param tool_public_name: str, optional - Public name of the tool whose parameters are to be retrieved.
565
- :param filter_settings: FilterSettings, optional - Settings to filter the parameter retrieval,
522
+ :param tool_id: Unique identifier of the tool whose parameters are to be retrieved.
523
+ :param tool_public_name: Public name of the tool whose parameters are to be retrieved.
524
+ :param filter_settings: Settings to filter the parameter retrieval,
566
525
  including revision (defaults to "0"), version (defaults to "0"), and allow_drafts (defaults to True).
567
- :return: Union[List[ToolParameter], ErrorListResponse] - A list of `ToolParameter` objects if successful,
568
- or an `ErrorListResponse` if the API returns errors.
569
- :raises ValueError: If neither tool_id nor tool_public_name is provided.
526
+ :return: A list of `ToolParameter` objects.
527
+ :raises MissingRequirementException: If neither tool_id nor tool_public_name is provided.
528
+ :raises APIError: If the API returns errors.
570
529
  """
571
530
  if not (tool_id or tool_public_name):
572
- raise ValueError("Either tool_id or tool_public_name must be provided.")
531
+ raise MissingRequirementException("Either tool_id or tool_public_name must be provided.")
573
532
 
574
533
  if filter_settings is None:
575
534
  filter_settings = FilterSettings(
@@ -579,7 +538,6 @@ class AILabManager:
579
538
  )
580
539
 
581
540
  response_data = self.__tool_client.get_parameter(
582
- project_id=project_id,
583
541
  tool_id=tool_id,
584
542
  tool_public_name=tool_public_name,
585
543
  revision=filter_settings.revision,
@@ -588,59 +546,69 @@ class AILabManager:
588
546
  )
589
547
 
590
548
  if ErrorHandler.has_errors(response_data):
591
- result = ErrorHandler.extract_error(response_data)
592
- else:
593
- result = ToolMapper.map_to_parameter_list(response_data)
549
+ error = ErrorHandler.extract_error(response_data)
550
+ logger.error(f"Error received while retrieving tool parameters: {error}")
551
+ raise APIError(f"Error received while retrieving tool parameters: {error}")
594
552
 
553
+ result = ToolMapper.map_to_parameter_list(response_data)
595
554
  return result
596
555
 
597
556
  def set_parameter(
598
557
  self,
599
- project_id: str,
600
558
  tool_id: Optional[str] = None,
601
559
  tool_public_name: Optional[str] = None,
602
560
  parameters: List[ToolParameter] = None
603
- ) -> Union[Tool, ErrorListResponse]:
561
+ ) -> EmptyResponse:
604
562
  """
605
563
  Sets or updates parameters for a specific tool in the specified project.
606
564
 
607
565
  This method sends a request to the tool client to set parameters for a tool identified by
608
- either `tool_id` or `tool_public_name`. If the response contains errors, it maps them to an
609
- `ErrorListResponse`. Otherwise, it maps the response to a `Tool` object.
566
+ either `tool_id` or `tool_public_name`.
610
567
 
611
- :param project_id: str - Unique identifier of the project.
612
- :param tool_id: str, optional - Unique identifier of the tool whose parameters are to be set.
613
- :param tool_public_name: str, optional - Public name of the tool whose parameters are to be set.
614
- :param parameters: List[ToolParameter] - List of parameter objects defining the tool's parameters.
615
- :return: Union[Tool, ErrorListResponse] - A `Tool` object representing the updated tool if successful,
616
- or an `ErrorListResponse` if the API returns errors.
617
- :raises ValueError: If neither tool_id nor tool_public_name is provided, or if parameters is None or empty.
568
+ :param tool_id: Unique identifier of the tool whose parameters are to be set.
569
+ :param tool_public_name: Public name of the tool whose parameters are to be set.
570
+ :param parameters: List of parameter objects defining the tool's parameters.
571
+ :return: A `Tool` object representing the updated tool.
572
+ :raises MissingRequirementException: If neither tool_id nor tool_public_name is provided, or if parameters is None or empty.
573
+ :raises APIError: If the API returns errors.
618
574
  """
619
575
  if not (tool_id or tool_public_name):
620
- raise ValueError("Either tool_id or tool_public_name must be provided.")
576
+ raise MissingRequirementException("Either tool_id or tool_public_name must be provided.")
621
577
  if not parameters:
622
- raise ValueError("Parameters list must be provided and non-empty.")
578
+ raise MissingRequirementException("Parameters list must be provided and non-empty.")
623
579
 
624
580
  params_dict = [param.to_dict() for param in parameters]
625
581
 
626
582
  response_data = self.__tool_client.set_parameter(
627
- project_id=project_id,
628
583
  tool_id=tool_id,
629
584
  tool_public_name=tool_public_name,
630
585
  parameters=params_dict
631
586
  )
632
587
 
633
588
  if ErrorHandler.has_errors(response_data):
634
- result = ErrorHandler.extract_error(response_data)
635
- else:
636
- result = ResponseMapper.map_to_empty_response(response_data)
589
+ error = ErrorHandler.extract_error(response_data)
590
+ logger.error(f"Error received while setting tool parameters: {error}")
591
+ raise APIError(f"Error received while setting tool parameters: {error}")
637
592
 
593
+ result = ResponseMapper.map_to_empty_response(response_data or "Parameter set successfully")
638
594
  return result
639
595
 
640
596
  def list_reasoning_strategies(
641
597
  self,
642
598
  filter_settings: Optional[FilterSettings] = None
643
- ) -> Union[ReasoningStrategyList, ErrorListResponse]:
599
+ ) -> ReasoningStrategyList:
600
+ """
601
+ Retrieves a list of reasoning strategies.
602
+
603
+ This method queries the reasoning strategy client to fetch a list of reasoning strategies,
604
+ applying the specified filter settings.
605
+
606
+ :param filter_settings: Settings to filter the reasoning strategy list query,
607
+ including name (defaults to ""), start (defaults to "0"), count (defaults to "100"),
608
+ allow_external (defaults to True), and access_scope (defaults to "public").
609
+ :return: A `ReasoningStrategyList` object containing the retrieved reasoning strategies.
610
+ :raises APIError: If the API returns errors.
611
+ """
644
612
  if filter_settings is None:
645
613
  filter_settings = FilterSettings(
646
614
  start="0",
@@ -658,20 +626,32 @@ class AILabManager:
658
626
  )
659
627
 
660
628
  if ErrorHandler.has_errors(response_data):
661
- result = ErrorHandler.extract_error(response_data)
662
- else:
663
- result = ReasoningStrategyMapper.map_to_reasoning_strategy_list(response_data)
629
+ error = ErrorHandler.extract_error(response_data)
630
+ logger.error(f"Error received while listing reasoning strategies: {error}")
631
+ raise APIError(f"Error received while listing reasoning strategies: {error}")
664
632
 
633
+ result = ReasoningStrategyMapper.map_to_reasoning_strategy_list(response_data)
665
634
  return result
666
635
 
667
636
  def create_reasoning_strategy(
668
637
  self,
669
- project_id: str,
670
638
  strategy: ReasoningStrategy,
671
639
  automatic_publish: bool = False
672
- ) -> Union[ReasoningStrategy, ErrorListResponse]:
640
+ ) -> ReasoningStrategy:
641
+ """
642
+ Creates a new reasoning strategy in the specified project.
643
+
644
+ This method sends a request to the reasoning strategy client to create a reasoning strategy
645
+ based on the attributes of the provided `ReasoningStrategy` object.
646
+
647
+ :param strategy: The reasoning strategy configuration object containing name, system_prompt,
648
+ access_scope, type, and localized_descriptions.
649
+ :param automatic_publish: Whether to automatically publish the reasoning strategy after creation.
650
+ Defaults to False.
651
+ :return: A `ReasoningStrategy` object representing the created reasoning strategy.
652
+ :raises APIError: If the API returns errors.
653
+ """
673
654
  response_data = self.__reasoning_strategy_client.create_reasoning_strategy(
674
- project_id=project_id,
675
655
  name=strategy.name,
676
656
  system_prompt=strategy.system_prompt,
677
657
  access_scope=strategy.access_scope,
@@ -681,21 +661,35 @@ class AILabManager:
681
661
  )
682
662
 
683
663
  if ErrorHandler.has_errors(response_data):
684
- result = ErrorHandler.extract_error(response_data)
685
- else:
686
- result = ReasoningStrategyMapper.map_to_reasoning_strategy(response_data)
664
+ error = ErrorHandler.extract_error(response_data)
665
+ logger.error(f"Error received while creating reasoning strategy: {error}")
666
+ raise APIError(f"Error received while creating reasoning strategy: {error}")
687
667
 
668
+ result = ReasoningStrategyMapper.map_to_reasoning_strategy(response_data)
688
669
  return result
689
670
 
690
671
  def update_reasoning_strategy(
691
672
  self,
692
- project_id: str,
693
673
  strategy: ReasoningStrategy,
694
674
  automatic_publish: bool = False,
695
675
  upsert: bool = False
696
- ) -> Union[ReasoningStrategy, ErrorListResponse]:
676
+ ) -> ReasoningStrategy:
677
+ """
678
+ Updates an existing reasoning strategy in the specified project or upserts it if specified.
679
+
680
+ This method sends a request to the reasoning strategy client to update a reasoning strategy
681
+ identified by `strategy.id` based on the attributes of the provided `ReasoningStrategy` object.
682
+
683
+ :param strategy: The reasoning strategy configuration object containing updated details,
684
+ including id, name, system_prompt, access_scope, type, and localized_descriptions.
685
+ :param automatic_publish: Whether to automatically publish the reasoning strategy after updating.
686
+ Defaults to False.
687
+ :param upsert: Whether to insert the reasoning strategy if it does not exist.
688
+ Defaults to False.
689
+ :return: A `ReasoningStrategy` object representing the updated reasoning strategy.
690
+ :raises APIError: If the API returns errors.
691
+ """
697
692
  response_data = self.__reasoning_strategy_client.update_reasoning_strategy(
698
- project_id=project_id,
699
693
  reasoning_strategy_id=strategy.id,
700
694
  name=strategy.name,
701
695
  system_prompt=strategy.system_prompt,
@@ -707,99 +701,118 @@ class AILabManager:
707
701
  )
708
702
 
709
703
  if ErrorHandler.has_errors(response_data):
710
- result = ErrorHandler.extract_error(response_data)
711
- else:
712
- result = ReasoningStrategyMapper.map_to_reasoning_strategy(response_data)
704
+ error = ErrorHandler.extract_error(response_data)
705
+ logger.error(f"Error received while updating reasoning strategy: {error}")
706
+ raise APIError(f"Error received while updating reasoning strategy: {error}")
713
707
 
708
+ result = ReasoningStrategyMapper.map_to_reasoning_strategy(response_data)
714
709
  return result
715
710
 
716
711
  def get_reasoning_strategy(
717
712
  self,
718
- project_id: str,
719
713
  reasoning_strategy_id: Optional[str] = None,
720
714
  reasoning_strategy_name: Optional[str] = None
721
- ) -> Union[ReasoningStrategy, ErrorListResponse]:
715
+ ) -> ReasoningStrategy:
716
+ """
717
+ Retrieves details of a specific reasoning strategy from the specified project.
718
+
719
+ This method sends a request to the reasoning strategy client to retrieve a reasoning strategy
720
+ identified by either `reasoning_strategy_id` or `reasoning_strategy_name`.
721
+
722
+ :param reasoning_strategy_id: Unique identifier of the reasoning strategy to retrieve.
723
+ :param reasoning_strategy_name: Name of the reasoning strategy to retrieve.
724
+ :return: A `ReasoningStrategy` object representing the retrieved reasoning strategy.
725
+ :raises MissingRequirementException: If neither reasoning_strategy_id nor reasoning_strategy_name is provided.
726
+ :raises APIError: If the API returns errors.
727
+ """
722
728
  if not (reasoning_strategy_id or reasoning_strategy_name):
723
- raise ValueError("Either reasoning_strategy_id or reasoning_strategy_name must be provided.")
729
+ raise MissingRequirementException("Either reasoning_strategy_id or reasoning_strategy_name must be provided.")
724
730
 
725
731
  response_data = self.__reasoning_strategy_client.get_reasoning_strategy(
726
- project_id=project_id,
727
732
  reasoning_strategy_id=reasoning_strategy_id,
728
733
  reasoning_strategy_name=reasoning_strategy_name
729
734
  )
730
735
 
731
736
  if ErrorHandler.has_errors(response_data):
732
- result = ErrorHandler.extract_error(response_data)
733
- else:
734
- result = ReasoningStrategyMapper.map_to_reasoning_strategy(response_data)
737
+ error = ErrorHandler.extract_error(response_data)
738
+ logger.error(f"Error received while retrieving reasoning strategy: {error}")
739
+ raise APIError(f"Error received while retrieving reasoning strategy: {error}")
735
740
 
741
+ result = ReasoningStrategyMapper.map_to_reasoning_strategy(response_data)
736
742
  return result
737
743
 
738
744
  def create_process(
739
745
  self,
740
- project_id: str,
741
746
  process: AgenticProcess,
742
747
  automatic_publish: bool = False
743
- ) -> Union[AgenticProcess, ErrorListResponse]:
748
+ ) -> AgenticProcess:
744
749
  """
745
750
  Creates a new process in the specified project.
746
751
 
747
- :param project_id: str - Unique identifier of the project.
748
- :param process: AgenticProcess - The process configuration to create.
749
- :param automatic_publish: bool - Whether to publish the process after creation. Defaults to False.
750
- :return: Union[AgenticProcess, ErrorListResponse] - The created process if successful, or an error response.
752
+ This method sends a request to the process client to create a process based on the attributes
753
+ of the provided `AgenticProcess` object.
754
+
755
+ :param process: The process configuration to create, including key, name, description, kb,
756
+ agentic_activities, artifact_signals, user_signals, start_event, end_event, sequence_flows,
757
+ and variables.
758
+ :param automatic_publish: Whether to publish the process after creation. Defaults to False.
759
+ :return: An `AgenticProcess` object representing the created process.
760
+ :raises APIError: If the API returns errors.
751
761
  """
752
762
  response_data = self.__process_client.create_process(
753
- project_id=project_id,
754
763
  key=process.key,
755
764
  name=process.name,
756
765
  description=process.description,
757
- kb=process.kb.to_dict(),
766
+ kb=process.kb.to_dict() if process.kb else None,
758
767
  agentic_activities=[activity.to_dict() for activity in process.agentic_activities] if process.agentic_activities else None,
759
768
  artifact_signals=[signal.to_dict() for signal in process.artifact_signals] if process.artifact_signals else None,
760
769
  user_signals=[signal.to_dict() for signal in process.user_signals] if process.user_signals else None,
761
- start_event=process.start_event.to_dict(),
762
- end_event=process.end_event.to_dict(),
770
+ start_event=process.start_event.to_dict() if process.start_event else None,
771
+ end_event=process.end_event.to_dict() if process.end_event else None,
763
772
  sequence_flows=[flow.to_dict() for flow in process.sequence_flows] if process.sequence_flows else None,
764
773
  variables=[variable.to_dict() for variable in process.variables] if process.variables else None,
765
774
  automatic_publish=automatic_publish
766
775
  )
767
776
 
768
777
  if ErrorHandler.has_errors(response_data):
769
- result = ErrorHandler.extract_error(response_data)
770
- else:
771
- result = AgenticProcessMapper.map_to_agentic_process(response_data)
778
+ error = ErrorHandler.extract_error(response_data)
779
+ logger.error(f"Error received while creating process: {error}")
780
+ raise APIError(f"Error received while creating process: {error}")
772
781
 
782
+ result = AgenticProcessMapper.map_to_agentic_process(response_data)
773
783
  return result
774
784
 
775
785
  def update_process(
776
786
  self,
777
- project_id: str,
778
787
  process: AgenticProcess,
779
788
  automatic_publish: bool = False,
780
789
  upsert: bool = False
781
- ) -> Union[AgenticProcess, ErrorListResponse]:
790
+ ) -> AgenticProcess:
782
791
  """
783
792
  Updates an existing process in the specified project or upserts it if specified.
784
793
 
785
- :param project_id: str - Unique identifier of the project.
786
- :param process: AgenticProcess - The process configuration to update.
787
- :param automatic_publish: bool - Whether to publish the process after updating. Defaults to False.
788
- :param upsert: bool - Whether to insert the process if it does not exist. Defaults to False.
789
- :return: Union[AgenticProcess, ErrorListResponse] - The updated process if successful, or an error response.
794
+ This method sends a request to the process client to update a process identified by `process.id`
795
+ based on the attributes of the provided `AgenticProcess` object.
796
+
797
+ :param process: The process configuration to update, including id, key, name, description, kb,
798
+ agentic_activities, artifact_signals, user_signals, start_event, end_event, sequence_flows,
799
+ and variables.
800
+ :param automatic_publish: Whether to publish the process after updating. Defaults to False.
801
+ :param upsert: Whether to insert the process if it does not exist. Defaults to False.
802
+ :return: An `AgenticProcess` object representing the updated process.
803
+ :raises APIError: If the API returns errors.
790
804
  """
791
805
  response_data = self.__process_client.update_process(
792
- project_id=project_id,
793
806
  process_id=process.id,
794
807
  name=process.name,
795
808
  key=process.key,
796
809
  description=process.description,
797
- kb=process.kb.to_dict(),
810
+ kb=process.kb.to_dict() if process.kb else None,
798
811
  agentic_activities=[activity.to_dict() for activity in process.agentic_activities] if process.agentic_activities else None,
799
812
  artifact_signals=[signal.to_dict() for signal in process.artifact_signals] if process.artifact_signals else None,
800
813
  user_signals=[signal.to_dict() for signal in process.user_signals] if process.user_signals else None,
801
- start_event=process.start_event.to_dict(),
802
- end_event=process.end_event.to_dict(),
814
+ start_event=process.start_event.to_dict() if process.start_event else None,
815
+ end_event=process.end_event.to_dict() if process.end_event else None,
803
816
  sequence_flows=[flow.to_dict() for flow in process.sequence_flows] if process.sequence_flows else None,
804
817
  variables=[variable.to_dict() for variable in process.variables] if process.variables else None,
805
818
  automatic_publish=automatic_publish,
@@ -807,35 +820,38 @@ class AILabManager:
807
820
  )
808
821
 
809
822
  if ErrorHandler.has_errors(response_data):
810
- result = ErrorHandler.extract_error(response_data)
811
- else:
812
- result = AgenticProcessMapper.map_to_agentic_process(response_data)
823
+ error = ErrorHandler.extract_error(response_data)
824
+ logger.error(f"Error received while updating process: {error}")
825
+ raise APIError(f"Error received while updating process: {error}")
813
826
 
827
+ result = AgenticProcessMapper.map_to_agentic_process(response_data)
814
828
  return result
815
829
 
816
830
  def get_process(
817
831
  self,
818
- project_id: str,
819
832
  process_id: Optional[str] = None,
820
833
  process_name: Optional[str] = None,
821
834
  filter_settings: Optional[FilterSettings] = None
822
- ) -> Union[AgenticProcess, ErrorListResponse]:
835
+ ) -> AgenticProcess:
823
836
  """
824
837
  Retrieves details of a specific process in the specified project.
825
838
 
826
- :param project_id: str - Unique identifier of the project.
827
- :param process_id: Optional[str] - Unique identifier of the process to retrieve. Defaults to None.
828
- :param process_name: Optional[str] - Name of the process to retrieve. Defaults to None.
829
- :param filter_settings: Optional[FilterSettings] - Settings to filter the process retrieval (revision, version, allow_drafts).
830
- :return: Union[AgenticProcess, ErrorListResponse] - The retrieved process if successful, or an error response.
831
- :raises ValueError: If neither process_id nor process_name is provided.
839
+ This method sends a request to the process client to retrieve a process identified by either
840
+ `process_id` or `process_name`. Optional filter settings can specify revision, version, and
841
+ whether to allow drafts.
842
+
843
+ :param process_id: Unique identifier of the process to retrieve.
844
+ :param process_name: Name of the process to retrieve.
845
+ :param filter_settings: Settings to filter the process retrieval (revision, version, allow_drafts).
846
+ :return: An `AgenticProcess` object representing the retrieved process.
847
+ :raises MissingRequirementException: If neither process_id nor process_name is provided.
848
+ :raises APIError: If the API returns errors.
832
849
  """
833
850
  if not (process_id or process_name):
834
- raise ValueError("Either process_id or process_name must be provided.")
851
+ raise MissingRequirementException("Either process_id or process_name must be provided.")
835
852
 
836
853
  filter_settings = filter_settings or FilterSettings(revision="0", version="0", allow_drafts=True)
837
854
  response_data = self.__process_client.get_process(
838
- project_id=project_id,
839
855
  process_id=process_id,
840
856
  process_name=process_name,
841
857
  revision=filter_settings.revision,
@@ -844,27 +860,29 @@ class AILabManager:
844
860
  )
845
861
 
846
862
  if ErrorHandler.has_errors(response_data):
847
- result = ErrorHandler.extract_error(response_data)
848
- else:
849
- result = AgenticProcessMapper.map_to_agentic_process(response_data)
863
+ error = ErrorHandler.extract_error(response_data)
864
+ logger.error(f"Error received while retrieving process: {error}")
865
+ raise APIError(f"Error received while retrieving process: {error}")
850
866
 
867
+ result = AgenticProcessMapper.map_to_agentic_process(response_data)
851
868
  return result
852
869
 
853
870
  def list_processes(
854
871
  self,
855
- project_id: str,
856
872
  filter_settings: Optional[FilterSettings] = None
857
- ) -> Union[AgenticProcessList, ErrorListResponse]:
873
+ ) -> AgenticProcessList:
858
874
  """
859
875
  Retrieves a list of processes in the specified project.
860
876
 
861
- :param project_id: str - Unique identifier of the project.
862
- :param filter_settings: Optional[FilterSettings] - Settings to filter the process list (id, name, status, start, count, allow_drafts).
863
- :return: Union[AgenticProcessList, ErrorListResponse] - The list of processes if successful, or an error response.
877
+ This method queries the process client to fetch a list of processes for the given project ID,
878
+ applying the specified filter settings.
879
+
880
+ :param filter_settings: Settings to filter the process list (id, name, status, start, count, allow_drafts).
881
+ :return: An `AgenticProcessList` object containing the retrieved processes.
882
+ :raises APIError: If the API returns errors.
864
883
  """
865
884
  filter_settings = filter_settings or FilterSettings(start="0", count="100", allow_drafts=True)
866
885
  response_data = self.__process_client.list_processes(
867
- project_id=project_id,
868
886
  id=filter_settings.id,
869
887
  name=filter_settings.name,
870
888
  status=filter_settings.status,
@@ -874,29 +892,31 @@ class AILabManager:
874
892
  )
875
893
 
876
894
  if ErrorHandler.has_errors(response_data):
877
- result = ErrorHandler.extract_error(response_data)
878
- else:
879
- result = AgenticProcessMapper.map_to_agentic_process_list(response_data)
895
+ error = ErrorHandler.extract_error(response_data)
896
+ logger.error(f"Error received while listing processes: {error}")
897
+ raise APIError(f"Error received while listing processes: {error}")
880
898
 
899
+ result = AgenticProcessMapper.map_to_agentic_process_list(response_data)
881
900
  return result
882
901
 
883
902
  def list_process_instances(
884
903
  self,
885
- project_id: str,
886
904
  process_id: str,
887
905
  filter_settings: Optional[FilterSettings] = None
888
- ) -> Union[ProcessInstanceList, ErrorListResponse]:
906
+ ) -> ProcessInstanceList:
889
907
  """
890
908
  Retrieves a list of process instances for a specific process in the specified project.
891
909
 
892
- :param project_id: str - Unique identifier of the project.
893
- :param process_id: str - Unique identifier of the process to list instances for.
894
- :param filter_settings: Optional[FilterSettings] - Settings to filter the instance list (is_active, start, count).
895
- :return: Union[ProcessInstanceList, ErrorListResponse] - The list of process instances if successful, or an error response.
910
+ This method queries the process client to fetch a list of process instances for the given
911
+ process ID, applying the specified filter settings.
912
+
913
+ :param process_id: Unique identifier of the process to list instances for.
914
+ :param filter_settings: Settings to filter the instance list (is_active, start, count).
915
+ :return: A `ProcessInstanceList` object containing the retrieved process instances.
916
+ :raises APIError: If the API returns errors.
896
917
  """
897
918
  filter_settings = filter_settings or FilterSettings(start="0", count="10", is_active=True)
898
919
  response_data = self.__process_client.list_process_instances(
899
- project_id=project_id,
900
920
  process_id=process_id,
901
921
  is_active=filter_settings.is_active,
902
922
  start=filter_settings.start,
@@ -904,156 +924,166 @@ class AILabManager:
904
924
  )
905
925
 
906
926
  if ErrorHandler.has_errors(response_data):
907
- result = ErrorHandler.extract_error(response_data)
908
- else:
909
- result = ProcessInstanceMapper.map_to_process_instance_list(response_data)
927
+ error = ErrorHandler.extract_error(response_data)
928
+ logger.error(f"Error received while listing process instances: {error}")
929
+ raise APIError(f"Error received while listing process instances: {error}")
910
930
 
931
+ result = ProcessInstanceMapper.map_to_process_instance_list(response_data)
911
932
  return result
912
933
 
913
934
  def delete_process(
914
935
  self,
915
- project_id: str,
916
936
  process_id: Optional[str] = None,
917
937
  process_name: Optional[str] = None
918
- ) -> Union[EmptyResponse, ErrorListResponse]:
938
+ ) -> EmptyResponse:
919
939
  """
920
940
  Deletes a specific process in the specified project.
921
941
 
922
- :param project_id: str - Unique identifier of the project.
923
- :param process_id: Optional[str] - Unique identifier of the process to delete. Defaults to None.
924
- :param process_name: Optional[str] - Name of the process to delete. Defaults to None.
925
- :return: Union[EmptyResponse, ErrorListResponse] - Empty response if successful, or an error response.
926
- :raises ValueError: If neither process_id nor process_name is provided.
942
+ This method sends a request to the process client to delete a process identified by either
943
+ `process_id` or `process_name`.
944
+
945
+ :param process_id: Unique identifier of the process to delete.
946
+ :param process_name: Name of the process to delete.
947
+ :return: `EmptyResponse` if the process was deleted successfully.
948
+ :raises MissingRequirementException: If neither process_id nor process_name is provided.
949
+ :raises APIError: If the API returns errors.
927
950
  """
928
951
  if not (process_id or process_name):
929
- raise ValueError("Either process_id or process_name must be provided.")
952
+ raise MissingRequirementException("Either process_id or process_name must be provided.")
930
953
 
931
954
  response_data = self.__process_client.delete_process(
932
- project_id=project_id,
933
955
  process_id=process_id,
934
956
  process_name=process_name
935
957
  )
936
958
 
937
959
  if ErrorHandler.has_errors(response_data):
938
- result = ErrorHandler.extract_error(response_data)
939
- else:
940
- result = ResponseMapper.map_to_empty_response(response_data or "Process deleted successfully")
960
+ error = ErrorHandler.extract_error(response_data)
961
+ logger.error(f"Error received while deleting process: {error}")
962
+ raise APIError(f"Error received while deleting process: {error}")
941
963
 
964
+ result = ResponseMapper.map_to_empty_response(response_data or "Process deleted successfully")
942
965
  return result
943
966
 
944
967
  def publish_process_revision(
945
968
  self,
946
- project_id: str,
947
969
  process_id: Optional[str] = None,
948
970
  process_name: Optional[str] = None,
949
971
  revision: str = None
950
- ) -> Union[AgenticProcess, ErrorListResponse]:
972
+ ) -> AgenticProcess:
951
973
  """
952
974
  Publishes a specific revision of a process in the specified project.
953
975
 
954
- :param project_id: str - Unique identifier of the project.
955
- :param process_id: Optional[str] - Unique identifier of the process to publish. Defaults to None.
956
- :param process_name: Optional[str] - Name of the process to publish. Defaults to None.
957
- :param revision: str - Revision of the process to publish. Defaults to None.
958
- :return: Union[AgenticProcess, ErrorListResponse] - The published process if successful, or an error response.
959
- :raises ValueError: If neither process_id nor process_name is provided, or if revision is not specified.
976
+ This method sends a request to the process client to publish the specified revision of the
977
+ process identified by either `process_id` or `process_name`.
978
+
979
+ :param process_id: Unique identifier of the process to publish.
980
+ :param process_name: Name of the process to publish.
981
+ :param revision: Revision of the process to publish.
982
+ :return: An `AgenticProcess` object representing the published process.
983
+ :raises MissingRequirementException: If neither process_id nor process_name is provided, or if revision is not specified.
984
+ :raises APIError: If the API returns errors.
960
985
  """
961
986
  if not (process_id or process_name) or not revision:
962
- raise ValueError("Either process_id or process_name and revision must be provided.")
987
+ raise MissingRequirementException("Either process_id or process_name and revision must be provided.")
963
988
 
964
989
  response_data = self.__process_client.publish_process_revision(
965
- project_id=project_id,
966
990
  process_id=process_id,
967
991
  process_name=process_name,
968
992
  revision=revision
969
993
  )
970
994
 
971
995
  if ErrorHandler.has_errors(response_data):
972
- result = ErrorHandler.extract_error(response_data)
973
- else:
974
- result = AgenticProcessMapper.map_to_agentic_process(response_data)
996
+ error = ErrorHandler.extract_error(response_data)
997
+ logger.error(f"Error received while publishing process revision: {error}")
998
+ raise APIError(f"Error received while publishing process revision: {error}")
975
999
 
1000
+ result = AgenticProcessMapper.map_to_agentic_process(response_data)
976
1001
  return result
977
1002
 
978
1003
  def create_task(
979
1004
  self,
980
- project_id: str,
981
1005
  task: Task,
982
1006
  automatic_publish: bool = False
983
- ) -> Union[Task, ErrorListResponse]:
1007
+ ) -> Task:
984
1008
  """
985
1009
  Creates a new task in the specified project.
986
1010
 
987
- :param project_id: str - Unique identifier of the project where the task will be created.
988
- :param task: Task - The task configuration to create, including name (required), description,
1011
+ This method sends a request to the process client to create a task based on the attributes
1012
+ of the provided `Task` object.
1013
+
1014
+ :param task: The task configuration to create, including name (required), description,
989
1015
  title_template, id, prompt_data, and artifact_types. Optional fields are included if set.
990
- :param automatic_publish: bool - Whether to publish the task after creation. Defaults to False.
991
- :return: Union[Task, ErrorListResponse] - The created task if successful, or an error response.
1016
+ :param automatic_publish: Whether to publish the task after creation. Defaults to False.
1017
+ :return: A `Task` object representing the created task.
1018
+ :raises APIError: If the API returns errors.
992
1019
  """
993
1020
  response_data = self.__process_client.create_task(
994
- project_id=project_id,
995
1021
  name=task.name,
996
1022
  description=task.description,
997
1023
  title_template=task.title_template,
998
1024
  id=task.id,
999
- prompt_data=task.prompt_data.to_dict(),
1000
- artifact_types=task.artifact_types.to_dict(),
1025
+ prompt_data=task.prompt_data.to_dict() if task.prompt_data else None,
1026
+ artifact_types=task.artifact_types.to_dict() if task.artifact_types else None,
1001
1027
  automatic_publish=automatic_publish
1002
1028
  )
1003
1029
 
1004
1030
  if ErrorHandler.has_errors(response_data):
1005
- result = ErrorHandler.extract_error(response_data)
1006
- else:
1007
- result = TaskMapper.map_to_task(response_data)
1031
+ error = ErrorHandler.extract_error(response_data)
1032
+ logger.error(f"Error received while creating task: {error}")
1033
+ raise APIError(f"Error received while creating task: {error}")
1008
1034
 
1035
+ result = TaskMapper.map_to_task(response_data)
1009
1036
  return result
1010
1037
 
1011
1038
  def get_task(
1012
1039
  self,
1013
- project_id: str,
1014
1040
  task_id: Optional[str] = None,
1015
1041
  task_name: Optional[str] = None
1016
- ) -> Union[Task, ErrorListResponse]:
1042
+ ) -> Task:
1017
1043
  """
1018
1044
  Retrieves details of a specific task in the specified project.
1019
1045
 
1020
- :param project_id: str - Unique identifier of the project.
1021
- :param task_id: Optional[str] - Unique identifier of the task to retrieve. Defaults to None.
1022
- :param task_name: Optional[str] - Name of the task to retrieve. Defaults to None.
1023
- :return: Union[Task, ErrorListResponse] - The retrieved task if successful, or an error response.
1024
- :raises ValueError: If neither task_id nor task_name is provided.
1046
+ This method sends a request to the process client to retrieve a task identified by either
1047
+ `task_id` or `task_name`.
1048
+
1049
+ :param task_id: Unique identifier of the task to retrieve.
1050
+ :param task_name: Name of the task to retrieve.
1051
+ :return: A `Task` object representing the retrieved task.
1052
+ :raises MissingRequirementException: If neither task_id nor task_name is provided.
1053
+ :raises APIError: If the API returns errors.
1025
1054
  """
1026
1055
  if not (task_id or task_name):
1027
- raise ValueError("Either task_id or task_name must be provided.")
1056
+ raise MissingRequirementException("Either task_id or task_name must be provided.")
1028
1057
 
1029
1058
  response_data = self.__process_client.get_task(
1030
- project_id=project_id,
1031
1059
  task_id=task_id,
1032
1060
  task_name=task_name
1033
1061
  )
1034
1062
 
1035
1063
  if ErrorHandler.has_errors(response_data):
1036
- result = ErrorHandler.extract_error(response_data)
1037
- else:
1038
- result = TaskMapper.map_to_task(response_data)
1064
+ error = ErrorHandler.extract_error(response_data)
1065
+ logger.error(f"Error received while retrieving task: {error}")
1066
+ raise APIError(f"Error received while retrieving task: {error}")
1039
1067
 
1068
+ result = TaskMapper.map_to_task(response_data)
1040
1069
  return result
1041
1070
 
1042
1071
  def list_tasks(
1043
1072
  self,
1044
- project_id: str,
1045
1073
  filter_settings: Optional[FilterSettings] = None
1046
- ) -> Union[TaskList, ErrorListResponse]:
1074
+ ) -> TaskList:
1047
1075
  """
1048
1076
  Retrieves a list of tasks in the specified project.
1049
1077
 
1050
- :param project_id: str - Unique identifier of the project.
1051
- :param filter_settings: Optional[FilterSettings] - Settings to filter the task list (id, start, count, allow_drafts).
1052
- :return: Union[TaskList, ErrorListResponse] - The list of tasks if successful, or an error response.
1078
+ This method queries the process client to fetch a list of tasks for the given project ID,
1079
+ applying the specified filter settings.
1080
+
1081
+ :param filter_settings: Settings to filter the task list (id, start, count, allow_drafts).
1082
+ :return: A `TaskList` object containing the retrieved tasks.
1083
+ :raises APIError: If the API returns errors.
1053
1084
  """
1054
1085
  filter_settings = filter_settings or FilterSettings(start="0", count="100", allow_drafts=True)
1055
1086
  response_data = self.__process_client.list_tasks(
1056
- project_id=project_id,
1057
1087
  id=filter_settings.id,
1058
1088
  start=filter_settings.start,
1059
1089
  count=filter_settings.count,
@@ -1061,458 +1091,457 @@ class AILabManager:
1061
1091
  )
1062
1092
 
1063
1093
  if ErrorHandler.has_errors(response_data):
1064
- result = ErrorHandler.extract_error(response_data)
1065
- else:
1066
- result = TaskMapper.map_to_task_list(response_data)
1094
+ error = ErrorHandler.extract_error(response_data)
1095
+ logger.error(f"Error received while listing tasks: {error}")
1096
+ raise APIError(f"Error received while listing tasks: {error}")
1067
1097
 
1098
+ result = TaskMapper.map_to_task_list(response_data)
1068
1099
  return result
1069
1100
 
1070
1101
  def update_task(
1071
1102
  self,
1072
- project_id: str,
1073
1103
  task: Task,
1074
1104
  automatic_publish: bool = False,
1075
1105
  upsert: bool = False
1076
- ) -> Union[Task, ErrorListResponse]:
1106
+ ) -> Task:
1077
1107
  """
1078
1108
  Updates an existing task in the specified project or upserts it if specified.
1079
1109
 
1080
- :param project_id: str - Unique identifier of the project where the task resides.
1081
- :param task: Task - The task configuration to update, including id (required), name, description,
1110
+ This method sends a request to the process client to update a task identified by `task.id`
1111
+ based on the attributes of the provided `Task` object.
1112
+
1113
+ :param task: The task configuration to update, including id (required), name, description,
1082
1114
  title_template, prompt_data, and artifact_types. Optional fields are included if set.
1083
- :param automatic_publish: bool - Whether to publish the task after updating. Defaults to False.
1084
- :param upsert: bool - Whether to insert the task if it does not exist. Defaults to False.
1085
- :return: Union[Task, ErrorListResponse] - The updated task if successful, or an error response.
1086
- :raises ValueError: If task.id is not provided.
1115
+ :param automatic_publish: Whether to publish the task after updating. Defaults to False.
1116
+ :param upsert: Whether to insert the task if it does not exist. Defaults to False.
1117
+ :return: A `Task` object representing the updated task.
1118
+ :raises MissingRequirementException: If task.id is not provided.
1119
+ :raises APIError: If the API returns errors.
1087
1120
  """
1088
1121
  if not task.id:
1089
- raise ValueError("Task ID must be provided for update.")
1122
+ raise MissingRequirementException("Task ID must be provided for update.")
1090
1123
 
1091
1124
  response_data = self.__process_client.update_task(
1092
- project_id=project_id,
1093
1125
  task_id=task.id,
1094
1126
  name=task.name,
1095
1127
  description=task.description,
1096
1128
  title_template=task.title_template,
1097
1129
  id=task.id,
1098
- prompt_data=task.prompt_data.to_dict(),
1099
- artifact_types=task.artifact_types.to_dict(),
1130
+ prompt_data=task.prompt_data.to_dict() if task.prompt_data else None,
1131
+ artifact_types=task.artifact_types.to_dict() if task.artifact_types else None,
1100
1132
  automatic_publish=automatic_publish,
1101
1133
  upsert=upsert
1102
1134
  )
1103
1135
 
1104
1136
  if ErrorHandler.has_errors(response_data):
1105
- result = ErrorHandler.extract_error(response_data)
1106
- else:
1107
- result = TaskMapper.map_to_task(response_data)
1137
+ error = ErrorHandler.extract_error(response_data)
1138
+ logger.error(f"Error received while updating task: {error}")
1139
+ raise APIError(f"Error received while updating task: {error}")
1108
1140
 
1141
+ result = TaskMapper.map_to_task(response_data)
1109
1142
  return result
1110
1143
 
1111
1144
  def delete_task(
1112
1145
  self,
1113
- project_id: str,
1114
1146
  task_id: Optional[str] = None,
1115
1147
  task_name: Optional[str] = None
1116
- ) -> Union[EmptyResponse, ErrorListResponse]:
1148
+ ) -> EmptyResponse:
1117
1149
  """
1118
1150
  Deletes a specific task in the specified project.
1119
1151
 
1120
- :param project_id: str - Unique identifier of the project.
1121
- :param task_id: Optional[str] - Unique identifier of the task to delete. Defaults to None.
1122
- :param task_name: Optional[str] - Name of the task to delete. Defaults to None.
1123
- :return: Union[EmptyResponse, ErrorListResponse] - Empty response if successful, or an error response.
1124
- :raises ValueError: If neither task_id nor task_name is provided.
1152
+ This method sends a request to the process client to delete a task identified by either
1153
+ `task_id` or `task_name`.
1154
+
1155
+ :param task_id: Unique identifier of the task to delete.
1156
+ :param task_name: Name of the task to delete.
1157
+ :return: `EmptyResponse` if the task was deleted successfully.
1158
+ :raises MissingRequirementException: If neither task_id nor task_name is provided.
1159
+ :raises APIError: If the API returns errors.
1125
1160
  """
1126
1161
  if not (task_id or task_name):
1127
- raise ValueError("Either task_id or task_name must be provided.")
1162
+ raise MissingRequirementException("Either task_id or task_name must be provided.")
1128
1163
 
1129
1164
  response_data = self.__process_client.delete_task(
1130
- project_id=project_id,
1131
1165
  task_id=task_id,
1132
1166
  task_name=task_name
1133
1167
  )
1134
1168
 
1135
1169
  if ErrorHandler.has_errors(response_data):
1136
- result = ErrorHandler.extract_error(response_data)
1137
- else:
1138
- result = ResponseMapper.map_to_empty_response(response_data or "Task deleted successfully")
1170
+ error = ErrorHandler.extract_error(response_data)
1171
+ logger.error(f"Error received while deleting task: {error}")
1172
+ raise APIError(f"Error received while deleting task: {error}")
1139
1173
 
1174
+ result = ResponseMapper.map_to_empty_response(response_data or "Task deleted successfully")
1140
1175
  return result
1141
1176
 
1142
1177
  def publish_task_revision(
1143
1178
  self,
1144
- project_id: str,
1145
1179
  task_id: Optional[str] = None,
1146
1180
  task_name: Optional[str] = None,
1147
1181
  revision: str = None
1148
- ) -> Union[Task, ErrorListResponse]:
1182
+ ) -> Task:
1149
1183
  """
1150
1184
  Publishes a specific revision of a task in the specified project.
1151
1185
 
1152
- :param project_id: str - Unique identifier of the project.
1153
- :param task_id: Optional[str] - Unique identifier of the task to publish. Defaults to None.
1154
- :param task_name: Optional[str] - Name of the task to publish. Defaults to None.
1155
- :param revision: str - Revision of the task to publish. Defaults to None.
1156
- :return: Union[Task, ErrorListResponse] - The published task if successful, or an error response.
1157
- :raises ValueError: If neither task_id nor task_name is provided, or if revision is not specified.
1186
+ This method sends a request to the process client to publish the specified revision of the
1187
+ task identified by either `task_id` or `task_name`.
1188
+
1189
+ :param task_id: Unique identifier of the task to publish.
1190
+ :param task_name: Name of the task to publish.
1191
+ :param revision: Revision of the task to publish.
1192
+ :return: A `Task` object representing the published task.
1193
+ :raises MissingRequirementException: If neither task_id nor task_name is provided, or if revision is not specified.
1194
+ :raises APIError: If the API returns errors.
1158
1195
  """
1159
1196
  if not (task_id or task_name) or not revision:
1160
- raise ValueError("Either task_id or task_name and revision must be provided.")
1197
+ raise MissingRequirementException("Either task_id or task_name and revision must be provided.")
1161
1198
 
1162
1199
  response_data = self.__process_client.publish_task_revision(
1163
- project_id=project_id,
1164
1200
  task_id=task_id,
1165
1201
  task_name=task_name,
1166
1202
  revision=revision
1167
1203
  )
1168
1204
 
1169
1205
  if ErrorHandler.has_errors(response_data):
1170
- result = ErrorHandler.extract_error(response_data)
1171
- else:
1172
- result = TaskMapper.map_to_task(response_data)
1206
+ error = ErrorHandler.extract_error(response_data)
1207
+ logger.error(f"Error received while publishing task revision: {error}")
1208
+ raise APIError(f"Error received while publishing task revision: {error}")
1173
1209
 
1210
+ result = TaskMapper.map_to_task(response_data)
1174
1211
  return result
1175
1212
 
1176
1213
  def start_instance(
1177
1214
  self,
1178
- project_id: str,
1179
1215
  process_name: str,
1180
1216
  subject: Optional[str] = None,
1181
- variables: Optional[List[Variable] | VariableList] = None
1182
- ) -> Union[ProcessInstance, ErrorListResponse]:
1217
+ variables: Optional[Union[List[Variable], VariableList]] = None
1218
+ ) -> ProcessInstance:
1183
1219
  """
1184
1220
  Starts a new process instance in the specified project.
1185
1221
 
1186
- :param project_id: str - Unique identifier of the project.
1187
- :param process_name: str - Name of the process to start an instance for.
1188
- :param subject: Optional[str] - Subject of the process instance. Defaults to None.
1189
- :param variables: Optional[List[dict]] - List of variables for the instance. Defaults to None.
1190
- :return: Union[StartInstanceResponse, ErrorListResponse] - The started instance if successful, or an error response.
1222
+ This method sends a request to the process client to start a new process instance for the
1223
+ specified `process_name`.
1224
+
1225
+ :param process_name: Name of the process to start an instance for.
1226
+ :param subject: Subject of the process instance. Defaults to None.
1227
+ :param variables: List of variables for the instance. Defaults to None.
1228
+ :return: A `ProcessInstance` object representing the started instance.
1229
+ :raises APIError: If the API returns errors.
1191
1230
  """
1192
1231
  if not isinstance(variables, VariableList):
1193
1232
  variables = VariableList(variables=variables)
1194
1233
 
1195
1234
  response_data = self.__process_client.start_instance(
1196
- project_id=project_id,
1197
1235
  process_name=process_name,
1198
1236
  subject=subject,
1199
1237
  variables=variables.to_dict()
1200
1238
  )
1201
1239
 
1202
1240
  if ErrorHandler.has_errors(response_data):
1203
- result = ErrorHandler.extract_error(response_data)
1204
- else:
1205
- result = ProcessInstanceMapper.map_to_process_instance(response_data)
1241
+ error = ErrorHandler.extract_error(response_data)
1242
+ logger.error(f"Error received while starting process instance: {error}")
1243
+ raise APIError(f"Error received while starting process instance: {error}")
1206
1244
 
1245
+ result = ProcessInstanceMapper.map_to_process_instance(response_data)
1207
1246
  return result
1208
1247
 
1209
1248
  def abort_instance(
1210
1249
  self,
1211
- project_id: str,
1212
1250
  instance_id: str
1213
- ) -> Union[EmptyResponse, ErrorListResponse]:
1251
+ ) -> EmptyResponse:
1214
1252
  """
1215
1253
  Aborts a specific process instance in the specified project.
1216
1254
 
1217
- :param project_id: str - Unique identifier of the project.
1218
- :param instance_id: str - Unique identifier of the instance to abort.
1219
- :return: Union[EmptyResponse, ErrorListResponse] - Empty response if successful, or an error response.
1220
- :raises ValueError: If instance_id is not provided.
1255
+ This method sends a request to the process client to abort a process instance identified
1256
+ by `instance_id`.
1257
+
1258
+ :param instance_id: Unique identifier of the instance to abort.
1259
+ :return: `EmptyResponse` if the instance was aborted successfully.
1260
+ :raises MissingRequirementException: If instance_id is not provided.
1261
+ :raises APIError: If the API returns errors.
1221
1262
  """
1222
1263
  if not instance_id:
1223
- raise ValueError("Instance ID must be provided.")
1264
+ raise MissingRequirementException("Instance ID must be provided.")
1224
1265
 
1225
1266
  response_data = self.__process_client.abort_instance(
1226
- project_id=project_id,
1227
1267
  instance_id=instance_id
1228
1268
  )
1229
1269
 
1230
1270
  if ErrorHandler.has_errors(response_data):
1231
- result = ErrorHandler.extract_error(response_data)
1232
- else:
1233
- result = ResponseMapper.map_to_empty_response(response_data or "Instance aborted successfully")
1271
+ error = ErrorHandler.extract_error(response_data)
1272
+ logger.error(f"Error received while aborting process instance: {error}")
1273
+ raise APIError(f"Error received while aborting process instance: {error}")
1234
1274
 
1275
+ result = ResponseMapper.map_to_empty_response(response_data or "Instance aborted successfully")
1235
1276
  return result
1236
1277
 
1237
1278
  def get_instance(
1238
1279
  self,
1239
- project_id: str,
1240
1280
  instance_id: str
1241
- ) -> Union[ProcessInstance, ErrorListResponse]:
1281
+ ) -> ProcessInstance:
1242
1282
  """
1243
1283
  Retrieves details of a specific process instance in the specified project.
1244
1284
 
1245
- :param project_id: str - Unique identifier of the project.
1246
- :param instance_id: str - Unique identifier of the instance to retrieve.
1247
- :return: Union[ProcessInstance, ErrorListResponse] - The retrieved instance if successful, or an error response.
1248
- :raises ValueError: If instance_id is not provided.
1285
+ This method sends a request to the process client to retrieve a process instance identified
1286
+ by `instance_id`.
1287
+
1288
+ :param instance_id: Unique identifier of the instance to retrieve.
1289
+ :return: A `ProcessInstance` object representing the retrieved instance.
1290
+ :raises MissingRequirementException: If instance_id is not provided.
1291
+ :raises APIError: If the API returns errors.
1249
1292
  """
1250
1293
  if not instance_id:
1251
- raise ValueError("Instance ID must be provided.")
1294
+ raise MissingRequirementException("Instance ID must be provided.")
1252
1295
 
1253
1296
  response_data = self.__process_client.get_instance(
1254
- project_id=project_id,
1255
1297
  instance_id=instance_id
1256
1298
  )
1257
1299
  if ErrorHandler.has_errors(response_data):
1258
- result = ErrorHandler.extract_error(response_data)
1259
- else:
1260
- result = ProcessInstanceMapper.map_to_process_instance(response_data)
1300
+ error = ErrorHandler.extract_error(response_data)
1301
+ logger.error(f"Error received while retrieving process instance: {error}")
1302
+ raise APIError(f"Error received while retrieving process instance: {error}")
1261
1303
 
1304
+ result = ProcessInstanceMapper.map_to_process_instance(response_data)
1262
1305
  return result
1263
1306
 
1264
1307
  def get_instance_history(
1265
1308
  self,
1266
- project_id: str,
1267
1309
  instance_id: str
1268
- ) -> Union[dict, ErrorListResponse]:
1310
+ ) -> dict:
1269
1311
  """
1270
1312
  Retrieves the history of a specific process instance in the specified project.
1271
1313
 
1272
- :param project_id: str - Unique identifier of the project.
1273
- :param instance_id: str - Unique identifier of the instance to retrieve history for.
1274
- :return: Union[dict, ErrorListResponse] - The instance history if successful, or an error response.
1275
- :raises ValueError: If instance_id is not provided.
1314
+ This method sends a request to the process client to retrieve the history of a process instance
1315
+ identified by `instance_id`.
1316
+
1317
+ :param instance_id: Unique identifier of the instance to retrieve history for.
1318
+ :return: A dictionary containing the instance history.
1319
+ :raises MissingRequirementException: If instance_id is not provided.
1320
+ :raises APIError: If the API returns errors.
1276
1321
  """
1277
1322
  if not instance_id:
1278
- raise ValueError("Instance ID must be provided.")
1323
+ raise MissingRequirementException("Instance ID must be provided.")
1279
1324
 
1280
1325
  response_data = self.__process_client.get_instance_history(
1281
- project_id=project_id,
1282
1326
  instance_id=instance_id
1283
1327
  )
1284
1328
 
1285
1329
  if ErrorHandler.has_errors(response_data):
1286
- result = ErrorHandler.extract_error(response_data)
1287
- else:
1288
- result = response_data
1330
+ error = ErrorHandler.extract_error(response_data)
1331
+ logger.error(f"Error received while retrieving instance history: {error}")
1332
+ raise APIError(f"Error received while retrieving instance history: {error}")
1289
1333
 
1334
+ result = response_data
1290
1335
  return result
1291
1336
 
1292
1337
  def get_thread_information(
1293
1338
  self,
1294
- project_id: str,
1295
1339
  thread_id: str
1296
- ) -> Union[dict, ErrorListResponse]:
1340
+ ) -> dict:
1297
1341
  """
1298
1342
  Retrieves information about a specific thread in the specified project.
1299
1343
 
1300
- :param project_id: str - Unique identifier of the project.
1301
- :param thread_id: str - Unique identifier of the thread to retrieve information for.
1302
- :return: Union[dict, ErrorListResponse] - The thread information if successful, or an error response.
1303
- :raises ValueError: If thread_id is not provided.
1344
+ This method sends a request to the process client to retrieve information about a thread
1345
+ identified by `thread_id`.
1346
+
1347
+ :param thread_id: Unique identifier of the thread to retrieve information for.
1348
+ :return: A dictionary containing the thread information.
1349
+ :raises MissingRequirementException: If thread_id is not provided.
1350
+ :raises APIError: If the API returns errors.
1304
1351
  """
1305
1352
  if not thread_id:
1306
- raise ValueError("Thread ID must be provided.")
1353
+ raise MissingRequirementException("Thread ID must be provided.")
1307
1354
 
1308
1355
  response_data = self.__process_client.get_thread_information(
1309
- project_id=project_id,
1310
1356
  thread_id=thread_id
1311
1357
  )
1312
1358
 
1313
1359
  if ErrorHandler.has_errors(response_data):
1314
- result = ErrorHandler.extract_error(response_data)
1315
- else:
1316
- result = response_data
1360
+ error = ErrorHandler.extract_error(response_data)
1361
+ logger.error(f"Error received while retrieving thread information: {error}")
1362
+ raise APIError(f"Error received while retrieving thread information: {error}")
1317
1363
 
1364
+ result = response_data
1318
1365
  return result
1319
1366
 
1320
1367
  def send_user_signal(
1321
1368
  self,
1322
- project_id: str,
1323
1369
  instance_id: str,
1324
1370
  signal_name: str
1325
- ) -> Union[EmptyResponse, ErrorListResponse]:
1371
+ ) -> EmptyResponse:
1326
1372
  """
1327
1373
  Sends a user signal to a specific process instance in the specified project.
1328
1374
 
1329
- :param project_id: str - Unique identifier of the project.
1330
- :param instance_id: str - Unique identifier of the instance to send the signal to.
1331
- :param signal_name: str - Name of the user signal to send.
1332
- :return: Union[EmptyResponse, ErrorListResponse] - Empty response if successful, or an error response.
1333
- :raises ValueError: If instance_id or signal_name is not provided.
1375
+ This method sends a request to the process client to send a user signal identified by
1376
+ `signal_name` to a process instance identified by `instance_id`.
1377
+
1378
+ :param instance_id: Unique identifier of the instance to send the signal to.
1379
+ :param signal_name: Name of the user signal to send.
1380
+ :return: `EmptyResponse` if the signal was sent successfully.
1381
+ :raises MissingRequirementException: If instance_id or signal_name is not provided.
1382
+ :raises APIError: If the API returns errors.
1334
1383
  """
1335
1384
  if not instance_id or not signal_name:
1336
- raise ValueError("Instance ID and signal name must be provided.")
1385
+ raise MissingRequirementException("Instance ID and signal name must be provided.")
1337
1386
 
1338
1387
  response_data = self.__process_client.send_user_signal(
1339
- project_id=project_id,
1340
1388
  instance_id=instance_id,
1341
1389
  signal_name=signal_name
1342
1390
  )
1343
1391
 
1344
1392
  if ErrorHandler.has_errors(response_data):
1345
- result = ErrorHandler.extract_error(response_data)
1346
- else:
1347
- result = ResponseMapper.map_to_empty_response(response_data or "Signal sent successfully")
1393
+ error = ErrorHandler.extract_error(response_data)
1394
+ logger.error(f"Error received while sending user signal: {error}")
1395
+ raise APIError(f"Error received while sending user signal: {error}")
1348
1396
 
1397
+ result = ResponseMapper.map_to_empty_response(response_data or "Signal sent successfully")
1349
1398
  return result
1350
1399
 
1351
1400
  def create_knowledge_base(
1352
1401
  self,
1353
- project_id: str,
1354
1402
  knowledge_base: KnowledgeBase,
1355
- ) -> Union[KnowledgeBase, ErrorListResponse]:
1403
+ ) -> KnowledgeBase:
1356
1404
  """
1357
1405
  Creates a new knowledge base in the specified project using the provided configuration.
1358
1406
 
1359
1407
  This method sends a request to the process client to create a knowledge base based on
1360
- the attributes of the provided `KnowledgeBase` object. If the response contains errors, it
1361
- maps them to an `ErrorListResponse`. Otherwise, it maps the response to a `KnowledgeBase` object.
1408
+ the attributes of the provided `KnowledgeBase` object.
1362
1409
 
1363
- :param project_id: str - Unique identifier of the project where the knowledge base will be created.
1364
- :param knowledge_base: KnowledgeBase - The knowledge base configuration object containing name
1410
+ :param knowledge_base: The knowledge base configuration object containing name
1365
1411
  and artifact type names.
1366
- :return: Union[KnowledgeBase, ErrorListResponse] - A `KnowledgeBase` object representing the created
1367
- knowledge base if successful, or an `ErrorListResponse` if the API returns errors.
1412
+ :return: A `KnowledgeBase` object representing the created knowledge base.
1413
+ :raises APIError: If the API returns errors.
1368
1414
  """
1369
1415
  response_data = self.__process_client.create_kb(
1370
- project_id=project_id,
1371
1416
  name=knowledge_base.name,
1372
1417
  artifacts=knowledge_base.artifacts if knowledge_base.artifacts else None,
1373
1418
  metadata=knowledge_base.metadata if knowledge_base.metadata else None
1374
1419
  )
1375
1420
  if ErrorHandler.has_errors(response_data):
1376
- result = ErrorHandler.extract_error(response_data)
1377
- else:
1378
- result = KnowledgeBaseMapper.map_to_knowledge_base(response_data)
1421
+ error = ErrorHandler.extract_error(response_data)
1422
+ logger.error(f"Error received while creating knowledge base: {error}")
1423
+ raise APIError(f"Error received while creating knowledge base: {error}")
1379
1424
 
1425
+ result = KnowledgeBaseMapper.map_to_knowledge_base(response_data)
1380
1426
  return result
1381
1427
 
1382
1428
  def list_knowledge_bases(
1383
1429
  self,
1384
- project_id: str,
1385
1430
  name: Optional[str] = None,
1386
1431
  start: Optional[int] = 0,
1387
1432
  count: Optional[int] = 10
1388
- ) -> Union[KnowledgeBaseList, ErrorListResponse]:
1433
+ ) -> KnowledgeBaseList:
1389
1434
  """
1390
1435
  Retrieves a list of knowledge bases for the specified project.
1391
1436
 
1392
1437
  This method queries the process client to fetch a list of knowledge bases associated
1393
- with the specified project ID, applying optional filters for name and pagination. If the
1394
- response contains errors, it maps them to an `ErrorListResponse`. Otherwise, it maps the
1395
- response to a `KnowledgeBaseList`.
1438
+ with the specified project ID, applying optional filters for name and pagination.
1396
1439
 
1397
- :param project_id: str - Unique identifier of the project to retrieve knowledge bases for.
1398
- :param name: Optional[str] - Name filter to narrow down the list of knowledge bases.
1399
- :param start: Optional[int] - Starting index for pagination, defaults to 0.
1400
- :param count: Optional[int] - Number of knowledge bases to return, defaults to 10.
1401
- :return: Union[KnowledgeBaseList, ErrorListResponse] - A `KnowledgeBaseList` containing the
1402
- retrieved knowledge bases if successful, or an `ErrorListResponse` if the API returns errors.
1440
+ :param name: Name filter to narrow down the list of knowledge bases.
1441
+ :param start: Starting index for pagination, defaults to 0.
1442
+ :param count: Number of knowledge bases to return, defaults to 10.
1443
+ :return: A `KnowledgeBaseList` containing the retrieved knowledge bases.
1444
+ :raises APIError: If the API returns errors.
1403
1445
  """
1404
1446
  response_data = self.__process_client.list_kbs(
1405
- project_id=project_id,
1406
1447
  name=name,
1407
1448
  start=start,
1408
1449
  count=count
1409
1450
  )
1410
1451
  if ErrorHandler.has_errors(response_data):
1411
- result = ErrorHandler.extract_error(response_data)
1412
- else:
1413
- result = KnowledgeBaseMapper.map_to_knowledge_base_list(response_data)
1452
+ error = ErrorHandler.extract_error(response_data)
1453
+ logger.error(f"Error received while listing knowledge bases: {error}")
1454
+ raise APIError(f"Error received while listing knowledge bases: {error}")
1414
1455
 
1456
+ result = KnowledgeBaseMapper.map_to_knowledge_base_list(response_data)
1415
1457
  return result
1416
1458
 
1417
1459
  def get_knowledge_base(
1418
1460
  self,
1419
- project_id: str,
1420
1461
  kb_name: Optional[str] = None,
1421
1462
  kb_id: Optional[str] = None
1422
- ) -> Union[KnowledgeBase, ErrorListResponse]:
1463
+ ) -> KnowledgeBase:
1423
1464
  """
1424
1465
  Retrieves details of a specific knowledge base from the specified project.
1425
1466
 
1426
1467
  This method sends a request to the process client to retrieve a knowledge base
1427
- identified by either `kb_name` or `kb_id`. If the response contains errors, it maps them to
1428
- an `ErrorListResponse`. Otherwise, it maps the response to a `KnowledgeBase` object.
1468
+ identified by either `kb_name` or `kb_id`.
1429
1469
 
1430
- :param project_id: str - Unique identifier of the project where the knowledge base resides.
1431
- :param kb_name: Optional[str] - Name of the knowledge base to retrieve.
1432
- :param kb_id: Optional[str] - Unique identifier of the knowledge base to retrieve.
1433
- :return: Union[KnowledgeBase, ErrorListResponse] - A `KnowledgeBase` object representing the
1434
- retrieved knowledge base if successful, or an `ErrorListResponse` if the API returns errors.
1435
- :raises ValueError: If neither `kb_name` nor `kb_id` is provided.
1470
+ :param kb_name: Name of the knowledge base to retrieve.
1471
+ :param kb_id: Unique identifier of the knowledge base to retrieve.
1472
+ :return: A `KnowledgeBase` object representing the retrieved knowledge base.
1473
+ :raises MissingRequirementException: If neither `kb_name` nor `kb_id` is provided.
1474
+ :raises APIError: If the API returns errors.
1436
1475
  """
1437
1476
  if not (kb_name or kb_id):
1438
- raise ValueError("Either kb_name or kb_id must be provided.")
1477
+ raise MissingRequirementException("Either kb_name or kb_id must be provided.")
1439
1478
 
1440
1479
  response_data = self.__process_client.get_kb(
1441
- project_id=project_id,
1442
1480
  kb_name=kb_name,
1443
1481
  kb_id=kb_id
1444
1482
  )
1445
1483
  if ErrorHandler.has_errors(response_data):
1446
- result = ErrorHandler.extract_error(response_data)
1447
- else:
1448
- result = KnowledgeBaseMapper.map_to_knowledge_base(response_data)
1484
+ error = ErrorHandler.extract_error(response_data)
1485
+ logger.error(f"Error received while retrieving knowledge base: {error}")
1486
+ raise APIError(f"Error received while retrieving knowledge base: {error}")
1449
1487
 
1488
+ result = KnowledgeBaseMapper.map_to_knowledge_base(response_data)
1450
1489
  return result
1451
1490
 
1452
1491
  def delete_knowledge_base(
1453
1492
  self,
1454
- project_id: str,
1455
1493
  kb_name: Optional[str] = None,
1456
1494
  kb_id: Optional[str] = None
1457
- ) -> Union[EmptyResponse, ErrorListResponse]:
1495
+ ) -> EmptyResponse:
1458
1496
  """
1459
1497
  Deletes a specific knowledge base from the specified project.
1460
1498
 
1461
1499
  This method sends a request to the process client to delete a knowledge base
1462
- identified by either `kb_name` or `kb_id`. Returns an `EmptyResponse` if the deletion is
1463
- successful, or an `ErrorListResponse` if the API returns errors.
1500
+ identified by either `kb_name` or `kb_id`.
1464
1501
 
1465
- :param project_id: str - Unique identifier of the project where the knowledge base resides.
1466
- :param kb_name: Optional[str] - Name of the knowledge base to delete.
1467
- :param kb_id: Optional[str] - Unique identifier of the knowledge base to delete.
1468
- :return: Union[EmptyResponse, ErrorListResponse] - `EmptyResponse` if the knowledge base was
1469
- deleted successfully, or an `ErrorListResponse` if the API returns errors.
1470
- :raises ValueError: If neither `kb_name` nor `kb_id` is provided.
1502
+ :param kb_name: Name of the knowledge base to delete.
1503
+ :param kb_id: Unique identifier of the knowledge base to delete.
1504
+ :return: `EmptyResponse` if the knowledge base was deleted successfully.
1505
+ :raises MissingRequirementException: If neither `kb_name` nor `kb_id` is provided.
1506
+ :raises APIError: If the API returns errors.
1471
1507
  """
1472
1508
  if not (kb_name or kb_id):
1473
- raise ValueError("Either kb_name or kb_id must be provided.")
1509
+ raise MissingRequirementException("Either kb_name or kb_id must be provided.")
1474
1510
 
1475
1511
  response_data = self.__process_client.delete_kb(
1476
- project_id=project_id,
1477
1512
  kb_name=kb_name,
1478
1513
  kb_id=kb_id
1479
1514
  )
1480
1515
  if ErrorHandler.has_errors(response_data):
1481
- result = ErrorHandler.extract_error(response_data)
1482
- else:
1483
- response_data = response_data if response_data else "Knowledge base deleted successfully"
1484
- result = ResponseMapper.map_to_empty_response(response_data)
1516
+ error = ErrorHandler.extract_error(response_data)
1517
+ logger.error(f"Error received while deleting knowledge base: {error}")
1518
+ raise APIError(f"Error received while deleting knowledge base: {error}")
1485
1519
 
1520
+ result = ResponseMapper.map_to_empty_response(response_data or "Knowledge base deleted successfully")
1486
1521
  return result
1487
1522
 
1488
1523
  def list_jobs(
1489
1524
  self,
1490
- project_id: str,
1491
1525
  filter_settings: Optional[FilterSettings] = None,
1492
1526
  topic: Optional[str] = None,
1493
1527
  token: Optional[str] = None
1494
- ) -> Union[JobList, ErrorListResponse]:
1528
+ ) -> JobList:
1495
1529
  """
1496
1530
  Retrieves a list of jobs in the specified project.
1497
1531
 
1498
1532
  This method queries the process client to fetch a list of jobs associated with the specified
1499
- project ID, applying optional filter settings. If the response contains errors,
1500
- it maps them to an `ErrorListResponse`. Otherwise, it maps the response to a `JobList`.
1533
+ project ID, applying optional filter settings.
1501
1534
 
1502
- :param project_id: str - Unique identifier of the project.
1503
- :param filter_settings: Optional[FilterSettings] - Settings to filter the job list (start, count).
1504
- :param topic: Optional[str] - Topic to filter the jobs (e.g., 'Default', 'Event'). Defaults to None.
1505
- :param token: Optional[str] - Unique token identifier to filter a specific job. Defaults to None.
1506
- :return: Union[JobList, ErrorListResponse] - A `JobList` containing the retrieved jobs if successful,
1507
- or an `ErrorListResponse` if the API returns errors.
1508
- :raises ValueError: If project_id is not provided.
1535
+ :param filter_settings: Settings to filter the job list (start, count).
1536
+ :param topic: Topic to filter the jobs (e.g., 'Default', 'Event'). Defaults to None.
1537
+ :param token: Unique token identifier to filter a specific job. Defaults to None.
1538
+ :return: A `JobList` containing the retrieved jobs.
1539
+ :raises MissingRequirementException: If project_id is not provided.
1540
+ :raises APIError: If the API returns errors.
1509
1541
  """
1510
- if not project_id:
1511
- raise ValueError("Project ID must be provided.")
1512
1542
 
1513
1543
  filter_settings = filter_settings or FilterSettings(start="0", count="100")
1514
1544
  response_data = self.__process_client.list_jobs(
1515
- project_id=project_id,
1516
1545
  start=filter_settings.start,
1517
1546
  count=filter_settings.count,
1518
1547
  topic=topic,
@@ -1521,8 +1550,9 @@ class AILabManager:
1521
1550
  )
1522
1551
 
1523
1552
  if ErrorHandler.has_errors(response_data):
1524
- result = ErrorHandler.extract_error(response_data)
1525
- else:
1526
- result = JobMapper.map_to_job_list(response_data)
1553
+ error = ErrorHandler.extract_error(response_data)
1554
+ logger.error(f"Error received while listing jobs: {error}")
1555
+ raise APIError(f"Error received while listing jobs: {error}")
1527
1556
 
1557
+ result = JobMapper.map_to_job_list(response_data)
1528
1558
  return result