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