pygeai 0.1.51b3__py3-none-any.whl → 0.6.0b15__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pygeai might be problematic. Click here for more details.

Files changed (648) hide show
  1. pygeai/__init__.py +9 -1
  2. pygeai/_docs/Makefile +20 -0
  3. pygeai/_docs/make.bat +35 -0
  4. pygeai/_docs/source/conf.py +117 -0
  5. pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
  6. pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
  7. pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
  8. pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
  9. pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
  10. pygeai/_docs/source/content/ai_lab.rst +102 -0
  11. pygeai/_docs/source/content/analytics.rst +598 -0
  12. pygeai/_docs/source/content/api_reference/admin.rst +161 -0
  13. pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
  14. pygeai/_docs/source/content/api_reference/auth.rst +379 -0
  15. pygeai/_docs/source/content/api_reference/chat.rst +754 -0
  16. pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
  17. pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
  18. pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
  19. pygeai/_docs/source/content/api_reference/files.rst +592 -0
  20. pygeai/_docs/source/content/api_reference/gam.rst +401 -0
  21. pygeai/_docs/source/content/api_reference/health.rst +58 -0
  22. pygeai/_docs/source/content/api_reference/project.rst +738 -0
  23. pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
  24. pygeai/_docs/source/content/api_reference/rag.rst +710 -0
  25. pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
  26. pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
  27. pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
  28. pygeai/_docs/source/content/api_reference.rst +58 -0
  29. pygeai/_docs/source/content/authentication.rst +295 -0
  30. pygeai/_docs/source/content/chat_gui.rst +121 -0
  31. pygeai/_docs/source/content/cli.rst +203 -0
  32. pygeai/_docs/source/content/debugger.rst +651 -0
  33. pygeai/_docs/source/content/intro.rst +67 -0
  34. pygeai/_docs/source/content/migration.rst +929 -0
  35. pygeai/_docs/source/content/modules.rst +7 -0
  36. pygeai/_docs/source/content/quickstart.rst +143 -0
  37. pygeai/_docs/source/content/samples.rst +394 -0
  38. pygeai/_docs/source/index.rst +75 -0
  39. pygeai/_docs/source/modules.rst +7 -0
  40. pygeai/_docs/source/pygeai.admin.rst +29 -0
  41. pygeai/_docs/source/pygeai.analytics.rst +53 -0
  42. pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
  43. pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
  44. pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
  45. pygeai/_docs/source/pygeai.assistant.rst +55 -0
  46. pygeai/_docs/source/pygeai.auth.rst +29 -0
  47. pygeai/_docs/source/pygeai.chat.rst +69 -0
  48. pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
  49. pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
  50. pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
  51. pygeai/_docs/source/pygeai.cli.rst +62 -0
  52. pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
  53. pygeai/_docs/source/pygeai.core.base.rst +53 -0
  54. pygeai/_docs/source/pygeai.core.common.rst +37 -0
  55. pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
  56. pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
  57. pygeai/_docs/source/pygeai.core.files.rst +61 -0
  58. pygeai/_docs/source/pygeai.core.llm.rst +29 -0
  59. pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
  60. pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
  61. pygeai/_docs/source/pygeai.core.rst +63 -0
  62. pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
  63. pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
  64. pygeai/_docs/source/pygeai.core.services.rst +37 -0
  65. pygeai/_docs/source/pygeai.core.utils.rst +37 -0
  66. pygeai/_docs/source/pygeai.dbg.rst +21 -0
  67. pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
  68. pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
  69. pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
  70. pygeai/_docs/source/pygeai.evaluation.rst +31 -0
  71. pygeai/_docs/source/pygeai.flows.rst +29 -0
  72. pygeai/_docs/source/pygeai.gam.rst +29 -0
  73. pygeai/_docs/source/pygeai.health.rst +29 -0
  74. pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
  75. pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
  76. pygeai/_docs/source/pygeai.lab.rst +65 -0
  77. pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
  78. pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
  79. pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
  80. pygeai/_docs/source/pygeai.man.man1.rst +10 -0
  81. pygeai/_docs/source/pygeai.man.rst +18 -0
  82. pygeai/_docs/source/pygeai.migration.rst +29 -0
  83. pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
  84. pygeai/_docs/source/pygeai.organization.rst +61 -0
  85. pygeai/_docs/source/pygeai.proxy.rst +53 -0
  86. pygeai/_docs/source/pygeai.rst +35 -0
  87. pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
  88. pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
  89. pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
  90. pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
  91. pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
  92. pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
  93. pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
  94. pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
  95. pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
  96. pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
  97. pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
  98. pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
  99. pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
  100. pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
  101. pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
  102. pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
  103. pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
  104. pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
  105. pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
  106. pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
  107. pygeai/_docs/source/pygeai.tests.core.rst +39 -0
  108. pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
  109. pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
  110. pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
  111. pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
  112. pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
  113. pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
  114. pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
  115. pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
  116. pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
  117. pygeai/_docs/source/pygeai.tests.health.rst +21 -0
  118. pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
  119. pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
  120. pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
  121. pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
  122. pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
  123. pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
  124. pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
  125. pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
  126. pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
  127. pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
  128. pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
  129. pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
  130. pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
  131. pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
  132. pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
  133. pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
  134. pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
  135. pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
  136. pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
  137. pygeai/_docs/source/pygeai.tests.rst +33 -0
  138. pygeai/admin/clients.py +14 -11
  139. pygeai/admin/endpoints.py +2 -2
  140. pygeai/analytics/clients.py +505 -0
  141. pygeai/analytics/endpoints.py +35 -0
  142. pygeai/analytics/managers.py +606 -0
  143. pygeai/analytics/mappers.py +207 -0
  144. pygeai/analytics/responses.py +240 -0
  145. pygeai/assistant/clients.py +18 -45
  146. pygeai/assistant/data/clients.py +1 -0
  147. pygeai/assistant/data_analyst/clients.py +8 -12
  148. pygeai/assistant/managers.py +195 -157
  149. pygeai/assistant/mappers.py +4 -2
  150. pygeai/assistant/rag/clients.py +27 -67
  151. pygeai/assistant/rag/mappers.py +12 -6
  152. pygeai/assistant/rag/models.py +301 -159
  153. pygeai/auth/__init__.py +0 -0
  154. pygeai/auth/clients.py +129 -0
  155. pygeai/auth/endpoints.py +6 -0
  156. pygeai/chat/clients.py +308 -37
  157. pygeai/chat/endpoints.py +3 -0
  158. pygeai/chat/iris.py +2 -8
  159. pygeai/chat/managers.py +9 -6
  160. pygeai/chat/session.py +38 -0
  161. pygeai/chat/settings.py +6 -0
  162. pygeai/chat/ui.py +678 -0
  163. pygeai/cli/__init__.py +0 -1
  164. pygeai/cli/commands/admin.py +7 -10
  165. pygeai/cli/commands/analytics.py +533 -0
  166. pygeai/cli/commands/assistant.py +9 -9
  167. pygeai/cli/commands/auth.py +299 -0
  168. pygeai/cli/commands/base.py +71 -9
  169. pygeai/cli/commands/chat.py +676 -19
  170. pygeai/cli/commands/common.py +28 -24
  171. pygeai/cli/commands/configuration.py +66 -13
  172. pygeai/cli/commands/docs.py +105 -0
  173. pygeai/cli/commands/embeddings.py +58 -11
  174. pygeai/cli/commands/evaluation.py +38 -38
  175. pygeai/cli/commands/feedback.py +3 -4
  176. pygeai/cli/commands/files.py +7 -8
  177. pygeai/cli/commands/gam.py +85 -10
  178. pygeai/cli/commands/lab/ai_lab.py +340 -484
  179. pygeai/cli/commands/lab/options.py +8 -0
  180. pygeai/cli/commands/lab/spec.py +273 -0
  181. pygeai/cli/commands/lab/utils.py +13 -0
  182. pygeai/cli/commands/llm.py +6 -7
  183. pygeai/cli/commands/migrate.py +1064 -436
  184. pygeai/cli/commands/organization.py +516 -11
  185. pygeai/cli/commands/rag.py +13 -14
  186. pygeai/cli/commands/rerank.py +3 -5
  187. pygeai/cli/commands/secrets.py +8 -9
  188. pygeai/cli/commands/usage_limits.py +18 -20
  189. pygeai/cli/commands/validators.py +144 -1
  190. pygeai/cli/commands/version.py +4 -5
  191. pygeai/cli/error_handler.py +151 -0
  192. pygeai/cli/geai.py +170 -31
  193. pygeai/cli/geai_proxy.py +86 -25
  194. pygeai/cli/install_man.py +93 -22
  195. pygeai/cli/parsers.py +75 -25
  196. pygeai/cli/texts/help.py +265 -28
  197. pygeai/core/base/clients.py +53 -12
  198. pygeai/core/base/mappers.py +11 -2
  199. pygeai/core/base/session.py +95 -11
  200. pygeai/core/common/config.py +78 -14
  201. pygeai/core/common/exceptions.py +96 -6
  202. pygeai/core/embeddings/__init__.py +19 -0
  203. pygeai/core/embeddings/clients.py +23 -5
  204. pygeai/core/embeddings/managers.py +9 -4
  205. pygeai/core/embeddings/mappers.py +16 -2
  206. pygeai/core/embeddings/responses.py +9 -2
  207. pygeai/core/feedback/clients.py +8 -3
  208. pygeai/core/files/clients.py +23 -24
  209. pygeai/core/files/managers.py +121 -30
  210. pygeai/core/files/responses.py +4 -3
  211. pygeai/core/handlers.py +10 -1
  212. pygeai/core/llm/clients.py +22 -29
  213. pygeai/core/models.py +127 -11
  214. pygeai/core/plugins/clients.py +6 -6
  215. pygeai/core/rerank/clients.py +9 -3
  216. pygeai/core/rerank/managers.py +22 -5
  217. pygeai/core/secrets/clients.py +16 -37
  218. pygeai/core/services/response.py +18 -0
  219. pygeai/core/services/rest.py +159 -49
  220. pygeai/core/utils/__init__.py +0 -0
  221. pygeai/core/utils/console.py +83 -0
  222. pygeai/core/utils/parsers.py +32 -0
  223. pygeai/core/utils/validators.py +10 -0
  224. pygeai/dbg/__init__.py +3 -0
  225. pygeai/dbg/debugger.py +854 -14
  226. pygeai/evaluation/clients.py +7 -4
  227. pygeai/evaluation/dataset/clients.py +46 -44
  228. pygeai/evaluation/plan/clients.py +28 -26
  229. pygeai/evaluation/result/clients.py +38 -5
  230. pygeai/gam/clients.py +50 -28
  231. pygeai/gam/endpoints.py +2 -1
  232. pygeai/health/__init__.py +0 -0
  233. pygeai/health/clients.py +24 -0
  234. pygeai/health/endpoints.py +1 -0
  235. pygeai/lab/__init__.py +0 -90
  236. pygeai/lab/agents/clients.py +203 -162
  237. pygeai/lab/agents/endpoints.py +4 -0
  238. pygeai/lab/agents/mappers.py +57 -7
  239. pygeai/lab/clients.py +24 -0
  240. pygeai/lab/constants.py +3 -0
  241. pygeai/lab/managers.py +571 -541
  242. pygeai/lab/models.py +108 -19
  243. pygeai/lab/processes/clients.py +332 -340
  244. pygeai/lab/processes/mappers.py +3 -3
  245. pygeai/lab/runners.py +90 -0
  246. pygeai/lab/spec/__init__.py +0 -0
  247. pygeai/lab/spec/loader.py +24 -0
  248. pygeai/lab/spec/parsers.py +39 -0
  249. pygeai/lab/strategies/clients.py +67 -63
  250. pygeai/lab/strategies/mappers.py +1 -1
  251. pygeai/lab/tools/clients.py +85 -118
  252. pygeai/lab/tools/endpoints.py +4 -0
  253. pygeai/lab/tools/mappers.py +5 -5
  254. pygeai/man/man1/geai-proxy.1 +116 -0
  255. pygeai/man/man1/geai.1 +2580 -66
  256. pygeai/migration/__init__.py +33 -0
  257. pygeai/migration/strategies.py +468 -146
  258. pygeai/migration/tools.py +170 -3
  259. pygeai/organization/clients.py +245 -50
  260. pygeai/organization/endpoints.py +17 -8
  261. pygeai/organization/limits/clients.py +34 -32
  262. pygeai/organization/limits/managers.py +108 -49
  263. pygeai/organization/managers.py +347 -53
  264. pygeai/organization/mappers.py +102 -2
  265. pygeai/organization/responses.py +58 -1
  266. pygeai/proxy/clients.py +6 -3
  267. pygeai/proxy/config.py +14 -1
  268. pygeai/proxy/managers.py +61 -33
  269. pygeai/proxy/servers.py +196 -51
  270. pygeai/proxy/tool.py +33 -16
  271. pygeai/tests/admin/__init__.py +0 -0
  272. pygeai/tests/admin/test_clients.py +148 -0
  273. pygeai/tests/analytics/__init__.py +0 -0
  274. pygeai/tests/analytics/test_clients.py +86 -0
  275. pygeai/tests/analytics/test_managers.py +94 -0
  276. pygeai/tests/analytics/test_mappers.py +84 -0
  277. pygeai/tests/analytics/test_responses.py +73 -0
  278. pygeai/tests/assistants/rag/test_clients.py +346 -0
  279. pygeai/tests/assistants/rag/test_models.py +292 -0
  280. pygeai/tests/assistants/test_clients.py +176 -82
  281. pygeai/tests/assistants/test_managers.py +191 -57
  282. pygeai/tests/auth/__init__.py +0 -0
  283. pygeai/tests/auth/test_clients.py +289 -0
  284. pygeai/tests/auth/test_oauth.py +172 -0
  285. pygeai/tests/auth/test_session_logging.py +150 -0
  286. pygeai/tests/chat/__init__.py +0 -0
  287. pygeai/tests/chat/test_clients.py +393 -0
  288. pygeai/tests/chat/test_iris.py +38 -0
  289. pygeai/tests/chat/test_session.py +62 -0
  290. pygeai/tests/chat/test_ui.py +224 -0
  291. pygeai/tests/cli/commands/__init__.py +0 -0
  292. pygeai/tests/cli/commands/lab/__init__.py +0 -0
  293. pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
  294. pygeai/tests/cli/commands/lab/test_common.py +208 -0
  295. pygeai/tests/cli/commands/lab/test_spec.py +246 -0
  296. pygeai/tests/cli/commands/test_assistant.py +202 -0
  297. pygeai/tests/cli/commands/test_chat.py +130 -0
  298. pygeai/tests/cli/commands/test_common.py +350 -0
  299. pygeai/tests/cli/commands/test_embeddings.py +132 -0
  300. pygeai/tests/cli/commands/test_evaluation.py +656 -0
  301. pygeai/tests/cli/commands/test_feedback.py +65 -0
  302. pygeai/tests/cli/commands/test_files.py +161 -0
  303. pygeai/tests/cli/commands/test_gam.py +201 -0
  304. pygeai/tests/cli/commands/test_llm.py +114 -0
  305. pygeai/tests/cli/commands/test_migrate.py +176 -0
  306. pygeai/tests/cli/commands/test_organization.py +276 -0
  307. pygeai/tests/cli/commands/test_rag.py +266 -0
  308. pygeai/tests/cli/commands/test_rerank.py +110 -0
  309. pygeai/tests/cli/commands/test_secrets.py +171 -0
  310. pygeai/tests/cli/commands/test_show_help.py +41 -0
  311. pygeai/tests/cli/commands/test_usage_limits.py +412 -0
  312. pygeai/tests/cli/commands/test_validators.py +160 -0
  313. pygeai/tests/cli/commands/test_version.py +81 -0
  314. pygeai/tests/cli/docker/__init__.py +0 -0
  315. pygeai/tests/cli/test_credentials_flag.py +316 -0
  316. pygeai/tests/cli/test_error_handler.py +225 -0
  317. pygeai/tests/cli/test_geai_driver.py +154 -0
  318. pygeai/tests/cli/test_parsers.py +5 -5
  319. pygeai/tests/core/base/data/models.py +7 -0
  320. pygeai/tests/core/base/test_mappers.py +43 -11
  321. pygeai/tests/core/base/test_models.py +3 -1
  322. pygeai/tests/core/base/test_responses.py +53 -0
  323. pygeai/tests/core/common/__init__.py +0 -0
  324. pygeai/tests/core/common/data/__init__.py +0 -0
  325. pygeai/tests/core/common/test_config.py +186 -0
  326. pygeai/tests/core/common/test_decorators.py +69 -0
  327. pygeai/tests/core/embeddings/__init__.py +0 -0
  328. pygeai/tests/core/embeddings/test_clients.py +225 -0
  329. pygeai/tests/core/embeddings/test_managers.py +171 -0
  330. pygeai/tests/core/embeddings/test_mappers.py +142 -0
  331. pygeai/tests/core/feedback/__init__.py +0 -0
  332. pygeai/tests/core/feedback/test_clients.py +64 -0
  333. pygeai/tests/core/files/test_clients.py +128 -0
  334. pygeai/tests/core/files/test_managers.py +124 -78
  335. pygeai/tests/core/files/test_mappers.py +137 -0
  336. pygeai/tests/core/files/test_models.py +103 -0
  337. pygeai/tests/core/files/test_responses.py +122 -0
  338. pygeai/tests/core/llm/__init__.py +0 -0
  339. pygeai/tests/core/llm/test_clients.py +142 -0
  340. pygeai/tests/core/plugins/__init__.py +0 -0
  341. pygeai/tests/core/plugins/test_clients.py +66 -0
  342. pygeai/tests/core/rerank/test_clients.py +76 -0
  343. pygeai/tests/core/rerank/test_managers.py +61 -39
  344. pygeai/tests/core/secrets/__init__.py +0 -0
  345. pygeai/tests/core/secrets/test_clients.py +264 -0
  346. pygeai/tests/core/services/__init__.py +0 -0
  347. pygeai/tests/core/services/test_rest.py +273 -0
  348. pygeai/tests/core/test_handlers.py +66 -0
  349. pygeai/tests/core/utils/__init__.py +0 -0
  350. pygeai/tests/core/utils/test_console.py +80 -0
  351. pygeai/tests/dbg/__init__.py +0 -0
  352. pygeai/tests/dbg/test_debugger.py +591 -0
  353. pygeai/tests/evaluation/__init__.py +0 -0
  354. pygeai/tests/evaluation/dataset/__init__.py +0 -0
  355. pygeai/tests/evaluation/dataset/test_clients.py +265 -0
  356. pygeai/tests/evaluation/plan/__init__.py +0 -0
  357. pygeai/tests/evaluation/plan/test_clients.py +195 -0
  358. pygeai/tests/evaluation/result/__init__.py +0 -0
  359. pygeai/tests/evaluation/result/test_clients.py +66 -0
  360. pygeai/tests/gam/__init__.py +0 -0
  361. pygeai/tests/gam/test_clients.py +195 -0
  362. pygeai/tests/health/__init__.py +0 -0
  363. pygeai/tests/health/test_clients.py +41 -0
  364. pygeai/tests/integration/__init__.py +0 -0
  365. pygeai/tests/integration/assistants/__init__.py +0 -0
  366. pygeai/tests/integration/assistants/rag/__init__.py +0 -0
  367. pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
  368. pygeai/tests/integration/chat/__init__.py +0 -0
  369. pygeai/tests/integration/chat/test_generate_image.py +158 -0
  370. pygeai/tests/integration/lab/__init__.py +0 -0
  371. pygeai/tests/integration/lab/agents/__init__.py +0 -0
  372. pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
  373. pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
  374. pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
  375. pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
  376. pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
  377. pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
  378. pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
  379. pygeai/tests/integration/lab/processes/__init__.py +0 -0
  380. pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
  381. pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
  382. pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
  383. pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
  384. pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
  385. pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
  386. pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
  387. pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
  388. pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
  389. pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
  390. pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
  391. pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
  392. pygeai/tests/integration/lab/tools/__init__.py +0 -0
  393. pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
  394. pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
  395. pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
  396. pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
  397. pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
  398. pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
  399. pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
  400. pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
  401. pygeai/tests/lab/agents/__init__.py +0 -0
  402. pygeai/tests/lab/agents/test_clients.py +481 -0
  403. pygeai/tests/lab/agents/test_mappers.py +440 -0
  404. pygeai/tests/lab/processes/__init__.py +0 -0
  405. pygeai/tests/lab/processes/test_clients.py +1416 -0
  406. pygeai/tests/lab/processes/test_mappers.py +1092 -0
  407. pygeai/tests/lab/spec/__init__.py +0 -0
  408. pygeai/tests/lab/spec/test_loader.py +59 -0
  409. pygeai/tests/lab/spec/test_parsers.py +182 -0
  410. pygeai/tests/lab/strategies/__init__.py +0 -0
  411. pygeai/tests/lab/strategies/test_clients.py +241 -0
  412. pygeai/tests/lab/strategies/test_mappers.py +132 -0
  413. pygeai/tests/lab/test_managers.py +553 -0
  414. pygeai/tests/lab/test_models.py +500 -3
  415. pygeai/tests/lab/tools/__init__.py +0 -0
  416. pygeai/tests/lab/tools/test_clients.py +521 -0
  417. pygeai/tests/lab/tools/test_mappers.py +198 -0
  418. pygeai/tests/migration/__init__.py +0 -0
  419. pygeai/tests/migration/test_strategies.py +405 -0
  420. pygeai/tests/migration/test_tools.py +159 -0
  421. pygeai/tests/organization/limits/test_clients.py +567 -0
  422. pygeai/tests/organization/limits/test_managers.py +298 -56
  423. pygeai/tests/organization/test_clients.py +600 -30
  424. pygeai/tests/organization/test_managers.py +424 -0
  425. pygeai/tests/organization/test_mappers.py +153 -0
  426. pygeai/tests/organization/test_responses.py +137 -0
  427. pygeai/tests/proxy/__init__.py +1 -0
  428. pygeai/tests/proxy/test_clients.py +397 -0
  429. pygeai/tests/proxy/test_config.py +171 -0
  430. pygeai/tests/proxy/test_integration.py +305 -0
  431. pygeai/tests/proxy/test_managers.py +312 -0
  432. pygeai/tests/proxy/test_servers.py +387 -0
  433. pygeai/tests/proxy/test_tool.py +176 -0
  434. pygeai/tests/snippets/analytics/__init__.py +0 -0
  435. pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
  436. pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
  437. pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
  438. pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
  439. pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
  440. pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
  441. pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
  442. pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
  443. pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
  444. pygeai/tests/snippets/auth/__init__.py +0 -0
  445. pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
  446. pygeai/tests/snippets/chat/get_response.py +15 -0
  447. pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
  448. pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
  449. pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
  450. pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
  451. pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
  452. pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
  453. pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
  454. pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
  455. pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
  456. pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
  457. pygeai/tests/snippets/dbg/__init__.py +0 -0
  458. pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
  459. pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
  460. pygeai/tests/snippets/dbg/file_debugging.py +72 -0
  461. pygeai/tests/snippets/dbg/module_debugging.py +61 -0
  462. pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
  463. pygeai/tests/snippets/dbg/stepping_example.py +40 -0
  464. pygeai/tests/snippets/embeddings/cache_example.py +31 -0
  465. pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
  466. pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
  467. pygeai/tests/snippets/embeddings/openai_example.py +30 -0
  468. pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
  469. pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
  470. pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
  471. pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
  472. pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
  473. pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
  474. pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
  475. pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
  476. pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
  477. pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
  478. pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
  479. pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
  480. pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
  481. pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
  482. pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
  483. pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
  484. pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
  485. pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
  486. pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
  487. pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
  488. pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
  489. pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
  490. pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
  491. pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
  492. pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
  493. pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
  494. pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
  495. pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
  496. pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
  497. pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
  498. pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
  499. pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
  500. pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
  501. pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
  502. pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
  503. pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
  504. pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
  505. pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
  506. pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
  507. pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
  508. pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
  509. pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
  510. pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
  511. pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
  512. pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
  513. pygeai/tests/snippets/files/delete_file.py +1 -4
  514. pygeai/tests/snippets/files/get_file_content.py +2 -4
  515. pygeai/tests/snippets/files/get_file_data.py +1 -4
  516. pygeai/tests/snippets/files/get_file_list.py +1 -6
  517. pygeai/tests/snippets/files/upload_file.py +1 -5
  518. pygeai/tests/snippets/gam/gam_access_token.py +87 -0
  519. pygeai/tests/snippets/lab/agentic_flow_example_1.py +25 -23
  520. pygeai/tests/snippets/lab/agentic_flow_example_4.py +23 -23
  521. pygeai/tests/snippets/lab/agents/create_agent.py +5 -8
  522. pygeai/tests/snippets/lab/agents/create_agent_2.py +1 -5
  523. pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
  524. pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
  525. pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
  526. pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
  527. pygeai/tests/snippets/lab/agents/delete_agent.py +1 -5
  528. pygeai/tests/snippets/lab/agents/get_agent.py +2 -11
  529. pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
  530. pygeai/tests/snippets/lab/agents/get_sharing_link.py +2 -7
  531. pygeai/tests/snippets/lab/agents/list_agents.py +4 -7
  532. pygeai/tests/snippets/lab/agents/publish_agent_revision.py +2 -6
  533. pygeai/tests/snippets/lab/agents/update_agent.py +1 -5
  534. pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
  535. pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
  536. pygeai/tests/snippets/lab/crud_ui.py +462 -0
  537. pygeai/tests/snippets/lab/processes/create_process.py +3 -5
  538. pygeai/tests/snippets/lab/processes/create_task.py +3 -5
  539. pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +10 -19
  540. pygeai/tests/snippets/lab/processes/kbs/create_kb.py +2 -5
  541. pygeai/tests/snippets/lab/processes/kbs/get_kb.py +10 -16
  542. pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +13 -20
  543. pygeai/tests/snippets/lab/processes/kbs/try_all.py +5 -7
  544. pygeai/tests/snippets/lab/processes/list_processes.py +5 -7
  545. pygeai/tests/snippets/lab/runner_1.py +1 -1
  546. pygeai/tests/snippets/lab/samples/summarize_files.py +3 -3
  547. pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +2 -5
  548. pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +2 -5
  549. pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +3 -6
  550. pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +2 -5
  551. pygeai/tests/snippets/lab/tools/create_tool.py +4 -10
  552. pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
  553. pygeai/tests/snippets/lab/tools/delete_tool.py +2 -6
  554. pygeai/tests/snippets/lab/tools/get_parameter.py +5 -7
  555. pygeai/tests/snippets/lab/tools/get_tool.py +5 -7
  556. pygeai/tests/snippets/lab/tools/list_tools.py +3 -7
  557. pygeai/tests/snippets/lab/tools/publish_tool_revision.py +3 -5
  558. pygeai/tests/snippets/lab/tools/set_parameters.py +4 -9
  559. pygeai/tests/snippets/lab/tools/update_tool.py +4 -8
  560. pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
  561. pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
  562. pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
  563. pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
  564. pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
  565. pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
  566. pygeai/tests/snippets/lab/{file_summarizer_example.py → use_cases/file_summarizer_example.py} +3 -3
  567. pygeai/tests/snippets/lab/{file_summarizer_example_2.py → use_cases/file_summarizer_example_2.py} +12 -12
  568. pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
  569. pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
  570. pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
  571. pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
  572. pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
  573. pygeai/tests/snippets/migrate/__init__.py +45 -0
  574. pygeai/tests/snippets/migrate/agent_migration.py +110 -0
  575. pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
  576. pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
  577. pygeai/tests/snippets/migrate/process_migration.py +64 -0
  578. pygeai/tests/snippets/migrate/project_migration.py +42 -0
  579. pygeai/tests/snippets/migrate/tool_migration.py +64 -0
  580. pygeai/tests/snippets/organization/add_project_member.py +10 -0
  581. pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
  582. pygeai/tests/snippets/organization/create_project.py +2 -2
  583. pygeai/tests/snippets/organization/get_memberships.py +12 -0
  584. pygeai/tests/snippets/organization/get_organization_members.py +6 -0
  585. pygeai/tests/snippets/organization/get_project_members.py +6 -0
  586. pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
  587. pygeai/tests/snippets/organization/get_project_roles.py +6 -0
  588. pygeai/vendor/a2a/__init__.py +1 -0
  589. pygeai/vendor/a2a/auth/__init__.py +0 -0
  590. pygeai/vendor/a2a/auth/user.py +31 -0
  591. pygeai/vendor/a2a/client/__init__.py +19 -0
  592. pygeai/vendor/a2a/client/client.py +425 -0
  593. pygeai/vendor/a2a/client/errors.py +33 -0
  594. pygeai/vendor/a2a/client/helpers.py +22 -0
  595. pygeai/vendor/a2a/py.typed +0 -0
  596. pygeai/vendor/a2a/server/__init__.py +1 -0
  597. pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
  598. pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
  599. pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
  600. pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
  601. pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
  602. pygeai/vendor/a2a/server/apps/__init__.py +16 -0
  603. pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
  604. pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
  605. pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
  606. pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
  607. pygeai/vendor/a2a/server/context.py +23 -0
  608. pygeai/vendor/a2a/server/events/__init__.py +21 -0
  609. pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
  610. pygeai/vendor/a2a/server/events/event_queue.py +156 -0
  611. pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
  612. pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
  613. pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
  614. pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
  615. pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
  616. pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
  617. pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
  618. pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
  619. pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
  620. pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
  621. pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
  622. pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
  623. pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
  624. pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
  625. pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
  626. pygeai/vendor/a2a/types.py +1624 -0
  627. pygeai/vendor/a2a/utils/__init__.py +40 -0
  628. pygeai/vendor/a2a/utils/artifact.py +72 -0
  629. pygeai/vendor/a2a/utils/errors.py +69 -0
  630. pygeai/vendor/a2a/utils/helpers.py +176 -0
  631. pygeai/vendor/a2a/utils/message.py +83 -0
  632. pygeai/vendor/a2a/utils/task.py +57 -0
  633. pygeai/vendor/a2a/utils/telemetry.py +299 -0
  634. pygeai-0.6.0b15.dist-info/METADATA +205 -0
  635. pygeai-0.6.0b15.dist-info/RECORD +799 -0
  636. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
  637. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/entry_points.txt +2 -1
  638. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/licenses/LICENSE +13 -1
  639. pygeai-0.6.0b15.dist-info/top_level.txt +1 -0
  640. docs/geai-proxy/README.md +0 -145
  641. docs/source/conf.py +0 -45
  642. pygeai/tests/core/test_managers.py +0 -233
  643. pygeai-0.1.51b3.dist-info/METADATA +0 -130
  644. pygeai-0.1.51b3.dist-info/RECORD +0 -324
  645. pygeai-0.1.51b3.dist-info/top_level.txt +0 -3
  646. scripts/bump_beta_version.py +0 -56
  647. {scripts → pygeai/analytics}/__init__.py +0 -0
  648. /pygeai/tests/snippets/lab/{c_code_fixer_agent_flow.py → use_cases/c_code_fixer_agent_flow.py} +0 -0
@@ -1,20 +1,21 @@
1
- import json
2
- from json import JSONDecodeError
3
- from typing import Any, Union, List
1
+ from typing import List
4
2
 
5
- from pygeai.core.base.clients import BaseClient
3
+ from pygeai import logger
4
+ from pygeai.core.common.exceptions import InvalidAPIResponseException
5
+ from pygeai.core.utils.validators import validate_status_code
6
+ from pygeai.core.utils.parsers import parse_json_response
6
7
  from pygeai.lab.processes.endpoints import CREATE_PROCESS_V2, UPDATE_PROCESS_V2, UPSERT_PROCESS_V2, GET_PROCESS_V2, \
7
8
  LIST_PROCESSES_V2, LIST_PROCESS_INSTANCES_V2, DELETE_PROCESS_V2, PUBLISH_PROCESS_REVISION_V2, CREATE_TASK_V2, \
8
9
  UPDATE_TASK_V2, UPSERT_TASK_V2, GET_TASK_V2, LIST_TASKS_V2, DELETE_TASK_V2, PUBLISH_TASK_REVISION_V2, \
9
10
  START_INSTANCE_V2, ABORT_INSTANCE_V2, GET_INSTANCE_V2, GET_INSTANCE_HISTORY_V2, GET_THREAD_INFORMATION_V2, \
10
11
  SEND_USER_SIGNAL_V2, CREATE_KB_V1, GET_KB_V1, LIST_KBS_V1, DELETE_KB_V1, LIST_JOBS_V1
12
+ from pygeai.lab.clients import AILabClient
11
13
 
12
14
 
13
- class AgenticProcessClient(BaseClient):
15
+ class AgenticProcessClient(AILabClient):
14
16
 
15
17
  def create_process(
16
18
  self,
17
- project_id: str,
18
19
  key: str,
19
20
  name: str,
20
21
  description: str = None,
@@ -27,14 +28,13 @@ class AgenticProcessClient(BaseClient):
27
28
  sequence_flows: list = None,
28
29
  variables: list = None,
29
30
  automatic_publish: bool = False
30
- ):
31
+ ) -> dict:
31
32
  """
32
33
  Creates a new process in the specified project.
33
34
 
34
- :param project_id: str - Unique identifier of the project.
35
- :param key: str - Unique key for the process.
35
+ :param key: str - Unique key for the process within the project.
36
36
  :param name: str - Name of the process.
37
- :param description: str, optional - Description of the process.
37
+ :param description: str, optional - Description of the process purpose.
38
38
  :param kb: dict, optional - Knowledge base configuration.
39
39
  :param agentic_activities: list, optional - List of agentic activity definitions.
40
40
  :param artifact_signals: list, optional - List of artifact signal definitions.
@@ -42,9 +42,10 @@ class AgenticProcessClient(BaseClient):
42
42
  :param start_event: dict, optional - Start event definition.
43
43
  :param end_event: dict, optional - End event definition.
44
44
  :param sequence_flows: list, optional - List of sequence flow definitions.
45
- :param variables: list, optional - Updated list of variables.
46
- :param automatic_publish: bool - Whether to publish the process after creation. Defaults to False.
47
- :return: dict or str - JSON response with the created process details if successful, otherwise raw text.
45
+ :param variables: list, optional - List of variables used in the process.
46
+ :param automatic_publish: bool, optional - Publish the process after creation (default: False).
47
+ :return: dict or str - Created process details or error message.
48
+ :raises InvalidAPIResponseException: If an error occurs during creation.
48
49
  """
49
50
  endpoint = CREATE_PROCESS_V2
50
51
  if automatic_publish:
@@ -52,7 +53,7 @@ class AgenticProcessClient(BaseClient):
52
53
 
53
54
  headers = {
54
55
  "Authorization": self.api_service.token,
55
- "ProjectId": project_id,
56
+ "ProjectId": self.project_id,
56
57
  "Content-Type": "application/json",
57
58
  "Accept": "application/json"
58
59
  }
@@ -81,17 +82,15 @@ class AgenticProcessClient(BaseClient):
81
82
  if variables:
82
83
  data["processDefinition"]["variables"] = variables
83
84
 
85
+ logger.debug(f"Creating agentic process with data: {data}")
86
+
84
87
  response = self.api_service.post(endpoint=endpoint, headers=headers, data=data)
85
- try:
86
- result = response.json()
87
- except JSONDecodeError:
88
- result = response.text
88
+ validate_status_code(response)
89
+ return parse_json_response(response, f"create process for project {self.project_id}")
89
90
 
90
- return result
91
91
 
92
92
  def update_process(
93
93
  self,
94
- project_id: str,
95
94
  process_id: str = None,
96
95
  name: str = None,
97
96
  key: str = None,
@@ -106,13 +105,12 @@ class AgenticProcessClient(BaseClient):
106
105
  variables: list = None,
107
106
  automatic_publish: bool = False,
108
107
  upsert: bool = False
109
- ):
108
+ ) -> dict:
110
109
  """
111
- Updates an existing process in the specified project or upserts it if specified.
110
+ Updates an existing process or creates it if upsert is enabled.
112
111
 
113
- :param project_id: str - Unique identifier of the project.
114
112
  :param process_id: str, optional - Unique identifier of the process to update.
115
- :param name: str, optional - Name of the process to update (used if process_id is not provided).
113
+ :param name: str, optional - Name of the process to update or create.
116
114
  :param key: str, optional - Updated unique key for the process.
117
115
  :param description: str, optional - Updated description of the process.
118
116
  :param kb: dict, optional - Updated knowledge base configuration.
@@ -123,10 +121,11 @@ class AgenticProcessClient(BaseClient):
123
121
  :param end_event: dict, optional - Updated end event definition.
124
122
  :param sequence_flows: list, optional - Updated list of sequence flow definitions.
125
123
  :param variables: list, optional - Updated list of variables.
126
- :param automatic_publish: bool - Whether to publish the process after updating. Defaults to False.
127
- :param upsert: bool - Whether to insert the process if it does not exist. Defaults to False.
128
- :return: dict or str - JSON response with the updated process details if successful, otherwise raw text.
124
+ :param automatic_publish: bool, optional - Publish the process after updating (default: False).
125
+ :param upsert: bool, optional - Create the process if it does not exist (default: False).
126
+ :return: dict or str - Updated or created process details or error message.
129
127
  :raises ValueError: If neither process_id nor name is provided.
128
+ :raises InvalidAPIResponseException: If an error occurs during the update.
130
129
  """
131
130
  if not (process_id or name):
132
131
  raise ValueError("Either process_id or name must be provided.")
@@ -140,7 +139,7 @@ class AgenticProcessClient(BaseClient):
140
139
 
141
140
  headers = {
142
141
  "Authorization": self.api_service.token,
143
- "ProjectId": project_id,
142
+ "ProjectId": self.project_id,
144
143
  "Content-Type": "application/json",
145
144
  "Accept": "application/json"
146
145
  }
@@ -171,49 +170,50 @@ class AgenticProcessClient(BaseClient):
171
170
  data["processDefinition"]["variables"] = variables
172
171
 
173
172
  if kb is None and not upsert:
174
- current_process = self.get_process(project_id=project_id, process_id=process_id, process_name=name)
173
+ current_process = self.get_process(process_id=process_id, process_name=name)
175
174
  if isinstance(current_process, dict) and "processDefinition" in current_process:
176
175
  kb = current_process["processDefinition"].get("kb")
177
176
 
178
177
  if agentic_activities is None and not upsert:
179
- current_process = self.get_process(project_id=project_id, process_id=process_id, process_name=name)
178
+ current_process = self.get_process(process_id=process_id, process_name=name)
180
179
  if isinstance(current_process, dict) and "processDefinition" in current_process:
181
180
  agentic_activities = current_process["processDefinition"].get("agenticActivities")
182
181
  if agentic_activities is not None:
183
182
  data["processDefinition"]["agenticActivities"] = agentic_activities
184
183
 
184
+ if process_id:
185
+ logger.debug(f"Updating agentic process with ID {process_id} with data: {data}")
186
+ else:
187
+ logger.debug(f"Updating agentic process with name{name} with data: {data}")
188
+
185
189
  response = self.api_service.put(
186
190
  endpoint=endpoint,
187
191
  headers=headers,
188
192
  data=data
189
193
  )
190
- try:
191
- result = response.json()
192
- except JSONDecodeError:
193
- result = response.text
194
+ validate_status_code(response)
195
+ return parse_json_response(response, f"update process {process_id or name} in project {self.project_id}")
194
196
 
195
- return result
196
197
 
197
198
  def get_process(
198
199
  self,
199
- project_id: str,
200
200
  process_id: str = None,
201
201
  process_name: str = None,
202
202
  revision: str = "0",
203
203
  version: int = 0,
204
204
  allow_drafts: bool = True
205
- ):
205
+ ) -> dict:
206
206
  """
207
- Retrieves details of a specific process in the specified project, identified by either its ID or name.
208
-
209
- :param project_id: str - Unique identifier of the project.
210
- :param process_id: str, optional - Unique identifier of the process to retrieve. Defaults to None.
211
- :param process_name: str, optional - Name of the process to retrieve. Defaults to None.
212
- :param revision: str - Revision of the process to retrieve. Defaults to '0' (latest revision).
213
- :param version: int - Version of the process to retrieve. Defaults to 0 (latest version).
214
- :param allow_drafts: bool - Whether to include draft processes in the retrieval. Defaults to True.
215
- :return: dict or str - JSON response containing the process details if successful, otherwise the raw response text.
207
+ Retrieves details of a specific process by its ID or name.
208
+
209
+ :param process_id: str, optional - Unique identifier of the process.
210
+ :param process_name: str, optional - Name of the process.
211
+ :param revision: str, optional - Revision of the process (default: '0').
212
+ :param version: int, optional - Version of the process (default: 0).
213
+ :param allow_drafts: bool, optional - Include draft processes (default: True).
214
+ :return: dict or str - Process details or error message.
216
215
  :raises ValueError: If neither process_id nor process_name is provided.
216
+ :raises InvalidAPIResponseException: If an error occurs during retrieval.
217
217
  """
218
218
  if not (process_id or process_name):
219
219
  raise ValueError("Either process_id or process_name must be provided.")
@@ -223,7 +223,7 @@ class AgenticProcessClient(BaseClient):
223
223
 
224
224
  headers = {
225
225
  "Authorization": self.api_service.token,
226
- "ProjectId": project_id
226
+ "ProjectId": self.project_id
227
227
  }
228
228
  params = {
229
229
  "revision": revision,
@@ -231,44 +231,45 @@ class AgenticProcessClient(BaseClient):
231
231
  "allowDrafts": allow_drafts
232
232
  }
233
233
 
234
+ if process_id:
235
+ logger.debug(f"Retrieving agentic process detail with ID {process_id}")
236
+ else:
237
+ logger.debug(f"Retrieving agentic process detail with name '{process_name}'")
238
+
234
239
  response = self.api_service.get(
235
240
  endpoint=endpoint,
236
241
  headers=headers,
237
242
  params=params
238
243
  )
239
- try:
240
- result = response.json()
241
- except JSONDecodeError:
242
- result = response.text
244
+ validate_status_code(response)
245
+ return parse_json_response(response, f"retrieve process {process_id or process_name} for project {self.project_id}")
243
246
 
244
- return result
245
247
 
246
248
  def list_processes(
247
249
  self,
248
- project_id: str,
249
250
  id: str = None,
250
251
  name: str = None,
251
252
  status: str = None,
252
253
  start: str = "0",
253
254
  count: str = "100",
254
255
  allow_draft: bool = True
255
- ):
256
+ ) -> dict:
256
257
  """
257
- Retrieves a list of processes in the specified project, filtered by the provided criteria.
258
-
259
- :param project_id: str - Unique identifier of the project.
260
- :param id: str, optional - ID of the process to filter by. Defaults to None.
261
- :param name: str, optional - Name of the process to filter by. Defaults to None.
262
- :param status: str, optional - Status of the processes to filter by (e.g., 'active', 'inactive'). Defaults to None.
263
- :param start: str - Starting index for pagination. Defaults to '0'.
264
- :param count: str - Number of processes to retrieve. Defaults to '100'.
265
- :param allow_draft: bool - Whether to include draft processes in the list. Defaults to True.
266
- :return: dict or str - JSON response containing the list of processes if successful, otherwise the raw response text.
258
+ Retrieves a list of processes in the specified project.
259
+
260
+ :param id: str, optional - ID of the process to filter by.
261
+ :param name: str, optional - Name of the process to filter by.
262
+ :param status: str, optional - Status of the processes (e.g., 'active', 'inactive').
263
+ :param start: str, optional - Starting index for pagination (default: '0').
264
+ :param count: str, optional - Number of processes to retrieve (default: '100').
265
+ :param allow_draft: bool, optional - Include draft processes (default: True).
266
+ :return: dict or str - List of processes or error message.
267
+ :raises InvalidAPIResponseException: If an error occurs during retrieval.
267
268
  """
268
269
  endpoint = LIST_PROCESSES_V2
269
270
  headers = {
270
271
  "Authorization": self.api_service.token,
271
- "ProjectId": project_id
272
+ "ProjectId": self.project_id
272
273
  }
273
274
  params = {
274
275
  "start": start,
@@ -282,36 +283,34 @@ class AgenticProcessClient(BaseClient):
282
283
  if status:
283
284
  params["status"] = status
284
285
 
286
+ logger.debug(f"Listing agentic processes for project with ID {self.project_id}")
287
+
285
288
  response = self.api_service.get(
286
289
  endpoint=endpoint,
287
290
  headers=headers,
288
291
  params=params
289
292
  )
290
- try:
291
- result = response.json()
292
- except JSONDecodeError:
293
- result = response.text
293
+ validate_status_code(response)
294
+ return parse_json_response(response, f"list processes for project {self.project_id}")
294
295
 
295
- return result
296
296
 
297
297
  def list_process_instances(
298
298
  self,
299
- project_id: str,
300
299
  process_id: str,
301
300
  is_active: bool = True,
302
301
  start: str = "0",
303
302
  count: str = "10"
304
- ):
303
+ ) -> dict:
305
304
  """
306
- Retrieves a list of process instances for a specific process in the specified project.
307
-
308
- :param project_id: str - Unique identifier of the project.
309
- :param process_id: str - Unique identifier of the process to list instances for.
310
- :param is_active: bool - Whether to list only active process instances. Defaults to True.
311
- :param start: str - Starting index for pagination. Defaults to '0'.
312
- :param count: str - Number of process instances to retrieve. Defaults to '10'.
313
- :return: dict or str - JSON response containing the list of process instances if successful, otherwise the raw response text.
305
+ Retrieves a list of process instances for a specific process.
306
+
307
+ :param process_id: str - Unique identifier of the process.
308
+ :param is_active: bool, optional - List only active instances (default: True).
309
+ :param start: str, optional - Starting index for pagination (default: '0').
310
+ :param count: str, optional - Number of instances to retrieve (default: '10').
311
+ :return: dict or str - List of process instances or error message.
314
312
  :raises ValueError: If process_id is not provided.
313
+ :raises InvalidAPIResponseException: If an error occurs during retrieval.
315
314
  """
316
315
  if not process_id:
317
316
  raise ValueError("Process ID must be provided.")
@@ -319,7 +318,7 @@ class AgenticProcessClient(BaseClient):
319
318
  endpoint = LIST_PROCESS_INSTANCES_V2.format(processId=process_id)
320
319
  headers = {
321
320
  "Authorization": self.api_service.token,
322
- "ProjectId": project_id
321
+ "ProjectId": self.project_id
323
322
  }
324
323
  params = {
325
324
  "isActive": is_active,
@@ -327,32 +326,30 @@ class AgenticProcessClient(BaseClient):
327
326
  "count": count
328
327
  }
329
328
 
329
+ logger.debug(f"Listing instances for agentic process with ID {process_id}")
330
+
330
331
  response = self.api_service.get(
331
332
  endpoint=endpoint,
332
333
  headers=headers,
333
334
  params=params
334
335
  )
335
- try:
336
- result = response.json()
337
- except JSONDecodeError:
338
- result = response.text
336
+ validate_status_code(response)
337
+ return parse_json_response(response, f"list process instances for process {process_id} in project {self.project_id}")
339
338
 
340
- return result
341
339
 
342
340
  def delete_process(
343
341
  self,
344
- project_id: str,
345
342
  process_id: str = None,
346
343
  process_name: str = None
347
- ):
344
+ ) -> dict:
348
345
  """
349
- Deletes a specific process in the specified project, identified by either its ID or name.
346
+ Deletes a specific process by its ID or name.
350
347
 
351
- :param project_id: str - Unique identifier of the project.
352
- :param process_id: str, optional - Unique identifier of the process to delete. Defaults to None.
353
- :param process_name: str, optional - Name of the process to delete. Defaults to None.
354
- :return: dict or str - JSON response confirming the deletion if successful, otherwise the raw response text.
348
+ :param process_id: str, optional - Unique identifier of the process.
349
+ :param process_name: str, optional - Name of the process.
350
+ :return: dict or str - Confirmation of deletion or error message.
355
351
  :raises ValueError: If neither process_id nor process_name is provided.
352
+ :raises InvalidAPIResponseException: If an error occurs during deletion.
356
353
  """
357
354
  if not (process_id or process_name):
358
355
  raise ValueError("Either process_id or process_name must be provided.")
@@ -362,36 +359,37 @@ class AgenticProcessClient(BaseClient):
362
359
 
363
360
  headers = {
364
361
  "Authorization": self.api_service.token,
365
- "ProjectId": project_id
362
+ "ProjectId": self.project_id
366
363
  }
367
364
 
365
+ logger.debug(f"Deleting agentic process with ID {process_id}")
366
+
368
367
  response = self.api_service.delete(
369
368
  endpoint=endpoint,
370
369
  headers=headers
371
370
  )
372
- try:
373
- result = response.json()
374
- except JSONDecodeError:
375
- result = response.text
376
371
 
377
- return result
372
+ if response.status_code != 204:
373
+ logger.error(f"Unable to delete process {process_id or process_name} from project {self.project_id}: JSON parsing error (status {response.status_code}). Response: {response.text}")
374
+ raise InvalidAPIResponseException(f"Unable to delete process {process_id or process_name} from project {self.project_id}: {response.text}")
375
+ else:
376
+ return {}
378
377
 
379
378
  def publish_process_revision(
380
379
  self,
381
- project_id: str,
382
380
  process_id: str = None,
383
381
  process_name: str = None,
384
382
  revision: str = None
385
- ):
383
+ ) -> dict:
386
384
  """
387
- Publishes a specific revision of a process in the specified project.
385
+ Publishes a specific revision of a process.
388
386
 
389
- :param project_id: str - Unique identifier of the project.
390
- :param process_id: str, optional - Unique identifier of the process to publish. Defaults to None.
391
- :param process_name: str, optional - Name of the process to publish. Defaults to None.
392
- :param revision: str - Revision of the process to publish.
393
- :return: dict or str - JSON response containing the result of the publish operation if successful, otherwise the raw response text.
387
+ :param process_id: str, optional - Unique identifier of the process.
388
+ :param process_name: str, optional - Name of the process.
389
+ :param revision: str, optional - Revision of the process to publish.
390
+ :return: dict or str - Result of the publish operation or error message.
394
391
  :raises ValueError: If neither process_id nor process_name is provided, or if revision is not specified.
392
+ :raises InvalidAPIResponseException: If an error occurs during publishing.
395
393
  """
396
394
  if not (process_id or process_name):
397
395
  raise ValueError("Either process_id or process_name must be provided.")
@@ -403,9 +401,14 @@ class AgenticProcessClient(BaseClient):
403
401
 
404
402
  headers = {
405
403
  "Authorization": self.api_service.token,
406
- "ProjectId": project_id
404
+ "ProjectId": self.project_id
407
405
  }
408
406
 
407
+ if process_id:
408
+ logger.debug(f"Publishing revision {revision} for agentic process with ID {process_id}")
409
+ else:
410
+ logger.debug(f"Publishing revision {revision} for agentic process with name '{process_name}'")
411
+
409
412
  response = self.api_service.post(
410
413
  endpoint=endpoint,
411
414
  headers=headers,
@@ -413,16 +416,12 @@ class AgenticProcessClient(BaseClient):
413
416
  "revision": revision
414
417
  }
415
418
  )
416
- try:
417
- result = response.json()
418
- except JSONDecodeError:
419
- result = response.text
419
+ validate_status_code(response)
420
+ return parse_json_response(response, f"publish revision {revision} for process {process_id or process_name} in project {self.project_id}")
420
421
 
421
- return result
422
422
 
423
423
  def create_task(
424
424
  self,
425
- project_id: str,
426
425
  name: str,
427
426
  description: str = None,
428
427
  title_template: str = None,
@@ -430,19 +429,19 @@ class AgenticProcessClient(BaseClient):
430
429
  prompt_data: dict = None,
431
430
  artifact_types: List[dict] = None,
432
431
  automatic_publish: bool = False
433
- ):
432
+ ) -> dict:
434
433
  """
435
434
  Creates a new task in the specified project.
436
435
 
437
- :param project_id: str - Unique identifier of the project where the task will be created.
438
- :param name: str - Required name of the task, must be unique within the project and exclude ':' or '/'.
439
- :param description: str, optional - Description of what the task does, for user understanding (not used by agents).
440
- :param title_template: str, optional - Template for naming task instances (e.g., 'specs for {{issue}}'), with variables replaced during execution.
441
- :param id: str, optional - Custom identifier for the task; if provided, overrides system-assigned ID in insert mode.
442
- :param prompt_data: dict, optional - Prompt configuration (same as AgentData prompt), combined with agent prompt during execution.
443
- :param artifact_types: List[dict], optional - List of artifact types associated with the task, each with 'name', 'description', 'isRequired', 'usageType', and 'artifactVariableKey'.
444
- :param automatic_publish: bool - Whether to publish the task after creation. Defaults to False.
445
- :return: dict or str - JSON response with the created task details if successful, otherwise raw text.
436
+ :param name: str - Name of the task, unique within the project, excluding ':' or '/'.
437
+ :param description: str, optional - Description of the task purpose.
438
+ :param title_template: str, optional - Template for task instance names (e.g., 'specs for {{issue}}').
439
+ :param id: str, optional - Custom identifier for the task.
440
+ :param prompt_data: dict, optional - Prompt configuration for task execution.
441
+ :param artifact_types: List[dict], optional - List of artifact types with 'name', 'description', 'isRequired', 'usageType', and 'artifactVariableKey'.
442
+ :param automatic_publish: bool, optional - Publish the task after creation (default: False).
443
+ :return: dict or str - Created task details or error message.
444
+ :raises InvalidAPIResponseException: If an error occurs during creation.
446
445
  """
447
446
  endpoint = CREATE_TASK_V2
448
447
  if automatic_publish:
@@ -450,7 +449,7 @@ class AgenticProcessClient(BaseClient):
450
449
 
451
450
  headers = {
452
451
  "Authorization": self.api_service.token,
453
- "ProjectId": project_id,
452
+ "ProjectId": self.project_id,
454
453
  "Content-Type": "application/json",
455
454
  "Accept": "application/json"
456
455
  }
@@ -470,26 +469,24 @@ class AgenticProcessClient(BaseClient):
470
469
  if artifact_types:
471
470
  data["taskDefinition"]["artifactTypes"] = artifact_types
472
471
 
473
- response = self.api_service.post(endpoint=endpoint, headers=headers, data=data)
474
- try:
475
- return response.json()
476
- except JSONDecodeError:
477
- return response.text
472
+ logger.debug(f"Creating task with data: {data}")
478
473
 
474
+ response = self.api_service.post(endpoint=endpoint, headers=headers, data=data)
475
+ validate_status_code(response)
476
+ return parse_json_response(response, f"create task for project {self.project_id}")
479
477
  def get_task(
480
478
  self,
481
- project_id: str,
482
479
  task_id: str,
483
480
  task_name: str = None
484
- ):
481
+ ) -> dict:
485
482
  """
486
- Retrieves details of a specific task in the specified project.
483
+ Retrieves details of a specific task by its ID or name.
487
484
 
488
- :param project_id: str - Unique identifier of the project.
489
- :param task_id: str, optional - Unique identifier of the task to retrieve.
490
- :param task_name: str, optional - Name of the task to retrieve.
491
- :return: dict or str - JSON response containing the task details if successful, otherwise raw text.
485
+ :param task_id: str, optional - Unique identifier of the task.
486
+ :param task_name: str, optional - Name of the task.
487
+ :return: dict or str - Task details or error message.
492
488
  :raises ValueError: If neither task_id nor task_name is provided.
489
+ :raises InvalidAPIResponseException: If an error occurs during retrieval.
493
490
  """
494
491
  if not (task_id or task_name):
495
492
  raise ValueError("Either task_id or task_name must be provided.")
@@ -498,37 +495,38 @@ class AgenticProcessClient(BaseClient):
498
495
  endpoint = GET_TASK_V2.format(taskId=identifier)
499
496
  headers = {
500
497
  "Authorization": self.api_service.token,
501
- "ProjectId": project_id
498
+ "ProjectId": self.project_id
502
499
  }
503
500
 
504
- response = self.api_service.get(endpoint=endpoint, headers=headers)
505
- try:
506
- return response.json()
507
- except JSONDecodeError:
508
- return response.text
501
+ if task_id:
502
+ logger.debug(f"Retrieving task detail with ID {task_id}")
503
+ else:
504
+ logger.debug(f"Retrieving task detail with name {task_name}")
509
505
 
506
+ response = self.api_service.get(endpoint=endpoint, headers=headers)
507
+ validate_status_code(response)
508
+ return parse_json_response(response, f"retrieve task {task_id or task_name} for project {self.project_id}")
510
509
  def list_tasks(
511
510
  self,
512
- project_id: str,
513
511
  id: str = None,
514
512
  start: str = "0",
515
513
  count: str = "100",
516
514
  allow_drafts: bool = True
517
- ):
515
+ ) -> dict:
518
516
  """
519
517
  Retrieves a list of tasks in the specified project.
520
518
 
521
- :param project_id: str - Unique identifier of the project.
522
519
  :param id: str, optional - ID of the task to filter by.
523
- :param start: str - Starting index for pagination. Defaults to '0'.
524
- :param count: str - Number of tasks to retrieve. Defaults to '100'.
525
- :param allow_drafts: bool - Whether to include draft tasks in the list. Defaults to True.
526
- :return: dict or str - JSON response containing the list of tasks if successful, otherwise raw text.
520
+ :param start: str, optional - Starting index for pagination (default: '0').
521
+ :param count: str, optional - Number of tasks to retrieve (default: '100').
522
+ :param allow_drafts: bool, optional - Include draft tasks (default: True).
523
+ :return: dict or str - List of tasks or error message.
524
+ :raises InvalidAPIResponseException: If an error occurs during retrieval.
527
525
  """
528
526
  endpoint = LIST_TASKS_V2
529
527
  headers = {
530
528
  "Authorization": self.api_service.token,
531
- "ProjectId": project_id
529
+ "ProjectId": self.project_id
532
530
  }
533
531
  params = {
534
532
  "start": start,
@@ -538,15 +536,13 @@ class AgenticProcessClient(BaseClient):
538
536
  if id:
539
537
  params["id"] = id
540
538
 
541
- response = self.api_service.get(endpoint=endpoint, headers=headers, params=params)
542
- try:
543
- return response.json()
544
- except JSONDecodeError:
545
- return response.text
539
+ logger.debug(f"Listing tasks for project with ID {self.project_id}")
546
540
 
541
+ response = self.api_service.get(endpoint=endpoint, headers=headers, params=params)
542
+ validate_status_code(response)
543
+ return parse_json_response(response, f"list tasks for project {self.project_id}")
547
544
  def update_task(
548
545
  self,
549
- project_id: str,
550
546
  task_id: str,
551
547
  name: str = None,
552
548
  description: str = None,
@@ -556,22 +552,22 @@ class AgenticProcessClient(BaseClient):
556
552
  artifact_types: List[dict] = None,
557
553
  automatic_publish: bool = False,
558
554
  upsert: bool = False
559
- ):
555
+ ) -> dict:
560
556
  """
561
- Updates an existing task in the specified project or upserts it if specified.
557
+ Updates an existing task or creates it if upsert is enabled.
562
558
 
563
- :param project_id: str - Unique identifier of the project where the task resides.
564
559
  :param task_id: str - Unique identifier of the task to update.
565
- :param name: str, optional - Updated name of the task, must be unique within the project and exclude ':' or '/' if provided.
566
- :param description: str, optional - Updated description of what the task does, for user understanding (not used by agents).
567
- :param title_template: str, optional - Updated template for naming task instances (e.g., 'specs for {{issue}}'), with variables replaced during execution.
568
- :param id: str, optional - Custom identifier for the task; only used in upsert mode to set the ID if creating a new task.
569
- :param prompt_data: dict, optional - Updated prompt configuration (same as AgentData prompt), combined with agent prompt during execution.
570
- :param artifact_types: List[dict], optional - Updated list of artifact types associated with the task, each with 'name', 'description', 'isRequired', 'usageType', and 'artifactVariableKey'.
571
- :param automatic_publish: bool - Whether to publish the task after updating. Defaults to False.
572
- :param upsert: bool - Whether to insert the task if it does not exist. Defaults to False.
573
- :return: dict or str - JSON response with the updated task details if successful, otherwise raw text.
560
+ :param name: str, optional - Updated name of the task, unique within the project, excluding ':' or '/'.
561
+ :param description: str, optional - Updated description of the task purpose.
562
+ :param title_template: str, optional - Updated template for task instance names (e.g., 'specs for {{issue}}').
563
+ :param id: str, optional - Custom identifier for the task (used in upsert mode).
564
+ :param prompt_data: dict, optional - Updated prompt configuration for task execution.
565
+ :param artifact_types: List[dict], optional - Updated list of artifact types with 'name', 'description', 'isRequired', 'usageType', and 'artifactVariableKey'.
566
+ :param automatic_publish: bool, optional - Publish the task after updating (default: False).
567
+ :param upsert: bool, optional - Create the task if it does not exist (default: False).
568
+ :return: dict or str - Updated or created task details or error message.
574
569
  :raises ValueError: If task_id is not provided.
570
+ :raises InvalidAPIResponseException: If an error occurs during the update.
575
571
  """
576
572
  if not task_id:
577
573
  raise ValueError("Task ID must be provided.")
@@ -584,7 +580,7 @@ class AgenticProcessClient(BaseClient):
584
580
 
585
581
  headers = {
586
582
  "Authorization": self.api_service.token,
587
- "ProjectId": project_id,
583
+ "ProjectId": self.project_id,
588
584
  "Content-Type": "application/json",
589
585
  "Accept": "application/json"
590
586
  }
@@ -604,26 +600,24 @@ class AgenticProcessClient(BaseClient):
604
600
  if artifact_types is not None:
605
601
  data["taskDefinition"]["artifactTypes"] = artifact_types
606
602
 
607
- response = self.api_service.put(endpoint=endpoint, headers=headers, data=data)
608
- try:
609
- return response.json()
610
- except JSONDecodeError:
611
- return response.text
603
+ logger.debug(f"Updating task with ID {task_id} with data: {data}")
612
604
 
605
+ response = self.api_service.put(endpoint=endpoint, headers=headers, data=data)
606
+ validate_status_code(response)
607
+ return parse_json_response(response, f"update task {task_id} in project {self.project_id}")
613
608
  def delete_task(
614
609
  self,
615
- project_id: str,
616
610
  task_id: str,
617
611
  task_name: str = None
618
- ):
612
+ ) -> dict:
619
613
  """
620
- Deletes a specific task in the specified project.
614
+ Deletes a specific task by its ID or name.
621
615
 
622
- :param project_id: str - Unique identifier of the project.
623
- :param task_id: str, optional - Unique identifier of the task to delete.
624
- :param task_name: str, optional - Name of the task to delete.
625
- :return: dict or str - JSON response confirming deletion if successful, otherwise raw text.
616
+ :param task_id: str, optional - Unique identifier of the task.
617
+ :param task_name: str, optional - Name of the task.
618
+ :return: dict or str - Confirmation of deletion or error message.
626
619
  :raises ValueError: If neither task_id nor task_name is provided.
620
+ :raises InvalidAPIResponseException: If an error occurs during deletion.
627
621
  """
628
622
  if not (task_id or task_name):
629
623
  raise ValueError("Either task_id or task_name must be provided.")
@@ -632,31 +626,37 @@ class AgenticProcessClient(BaseClient):
632
626
  endpoint = DELETE_TASK_V2.format(taskId=identifier)
633
627
  headers = {
634
628
  "Authorization": self.api_service.token,
635
- "ProjectId": project_id
629
+ "ProjectId": self.project_id
636
630
  }
637
631
 
632
+ if task_id:
633
+ logger.debug(f"Deleting task with ID {task_id}")
634
+ else:
635
+ logger.debug(f"Deleting task with name {task_name}")
636
+
638
637
  response = self.api_service.delete(endpoint=endpoint, headers=headers)
639
- try:
640
- return response.json()
641
- except JSONDecodeError:
642
- return response.text
638
+
639
+ if response.status_code != 204:
640
+ logger.error(f"Unable to delete task {task_id or task_name} from project {self.project_id}: JSON parsing error (status {response.status_code}). Response: {response.text}")
641
+ raise InvalidAPIResponseException(f"Unable to delete task {task_id or task_name} from project {self.project_id}: {response.text}")
642
+ else:
643
+ return {}
643
644
 
644
645
  def publish_task_revision(
645
646
  self,
646
- project_id: str,
647
647
  task_id: str,
648
648
  task_name: str = None,
649
649
  revision: str = None
650
- ):
650
+ ) -> dict:
651
651
  """
652
- Publishes a specific revision of a task in the specified project.
652
+ Publishes a specific revision of a task.
653
653
 
654
- :param project_id: str - Unique identifier of the project.
655
- :param task_id: str, optional - Unique identifier of the task to publish.
656
- :param task_name: str, optional - Name of the task to publish.
657
- :param revision: str - Revision of the task to publish.
658
- :return: dict or str - JSON response containing the result of the publish operation if successful, otherwise raw text.
654
+ :param task_id: str, optional - Unique identifier of the task.
655
+ :param task_name: str, optional - Name of the task.
656
+ :param revision: str, optional - Revision of the task to publish.
657
+ :return: dict or str - Result of the publish operation or error message.
659
658
  :raises ValueError: If neither task_id nor task_name is provided, or if revision is not specified.
659
+ :raises InvalidAPIResponseException: If an error occurs during publishing.
660
660
  """
661
661
  if not (task_id or task_name):
662
662
  raise ValueError("Either task_id or task_name must be provided.")
@@ -667,7 +667,7 @@ class AgenticProcessClient(BaseClient):
667
667
  endpoint = PUBLISH_TASK_REVISION_V2.format(taskId=identifier)
668
668
  headers = {
669
669
  "Authorization": self.api_service.token,
670
- "ProjectId": project_id,
670
+ "ProjectId": self.project_id,
671
671
  "Content-Type": "application/json",
672
672
  "Accept": "application/json"
673
673
  }
@@ -675,32 +675,33 @@ class AgenticProcessClient(BaseClient):
675
675
  "revision": revision
676
676
  }
677
677
 
678
- response = self.api_service.post(endpoint=endpoint, headers=headers, data=data)
679
- try:
680
- return response.json()
681
- except JSONDecodeError:
682
- return response.text
678
+ if task_id:
679
+ logger.debug(f"Publishing revision {revision} for task with ID {task_id}")
680
+ else:
681
+ logger.debug(f"Publishing revision {revision} for task with name {task_name}")
683
682
 
683
+ response = self.api_service.post(endpoint=endpoint, headers=headers, data=data)
684
+ validate_status_code(response)
685
+ return parse_json_response(response, f"publish revision {revision} for task {task_id or task_name} in project {self.project_id}")
684
686
  def start_instance(
685
687
  self,
686
- project_id: str,
687
688
  process_name: str,
688
689
  subject: str = None,
689
690
  variables: list = None
690
- ):
691
+ ) -> dict:
691
692
  """
692
- Starts a new process instance in the specified project.
693
+ Starts a new process instance.
693
694
 
694
- :param project_id: str - Unique identifier of the project.
695
- :param process_name: str - Name of the process to start an instance for.
695
+ :param process_name: str - Name of the process to start.
696
696
  :param subject: str, optional - Subject of the process instance.
697
- :param variables: list, optional - List of variables for the instance (e.g., [{"key": "location", "value": "Paris"}]).
698
- :return: dict or str - JSON response with the started instance details if successful, otherwise raw text.
697
+ :param variables: list, optional - List of variables (e.g., [{"key": "location", "value": "Paris"}]).
698
+ :return: dict or str - Started instance details or error message.
699
+ :raises InvalidAPIResponseException: If an error occurs during instance creation.
699
700
  """
700
701
  endpoint = START_INSTANCE_V2
701
702
  headers = {
702
703
  "Authorization": self.api_service.token,
703
- "ProjectId": project_id,
704
+ "ProjectId": self.project_id,
704
705
  "Content-Type": "application/json",
705
706
  "Accept": "application/json"
706
707
  }
@@ -714,24 +715,22 @@ class AgenticProcessClient(BaseClient):
714
715
  if variables:
715
716
  data["instanceDefinition"]["variables"] = variables
716
717
 
717
- response = self.api_service.post(endpoint=endpoint, headers=headers, data=data)
718
- try:
719
- return response.json()
720
- except JSONDecodeError:
721
- return response.text
718
+ logger.info(f"Starting instance for process with name '{process_name}'")
722
719
 
720
+ response = self.api_service.post(endpoint=endpoint, headers=headers, data=data)
721
+ validate_status_code(response)
722
+ return parse_json_response(response, f"start instance for process {process_name} in project {self.project_id}")
723
723
  def abort_instance(
724
724
  self,
725
- project_id: str,
726
725
  instance_id: str
727
- ):
726
+ ) -> dict:
728
727
  """
729
- Aborts a specific process instance in the specified project.
728
+ Aborts a specific process instance.
730
729
 
731
- :param project_id: str - Unique identifier of the project.
732
730
  :param instance_id: str - Unique identifier of the instance to abort.
733
- :return: dict or str - JSON response confirming the abort operation if successful, otherwise raw text.
731
+ :return: dict or str - Confirmation of abort operation or error message.
734
732
  :raises ValueError: If instance_id is not provided.
733
+ :raises InvalidAPIResponseException: If an error occurs during the abort.
735
734
  """
736
735
  if not instance_id:
737
736
  raise ValueError("Instance ID must be provided.")
@@ -739,29 +738,27 @@ class AgenticProcessClient(BaseClient):
739
738
  endpoint = ABORT_INSTANCE_V2.format(instanceId=instance_id)
740
739
  headers = {
741
740
  "Authorization": self.api_service.token,
742
- "ProjectId": project_id,
741
+ "ProjectId": self.project_id,
743
742
  "Content-Type": "application/json",
744
743
  "Accept": "application/json"
745
744
  }
746
745
 
747
- response = self.api_service.post(endpoint=endpoint, headers=headers, data={})
748
- try:
749
- return response.json()
750
- except JSONDecodeError:
751
- return response.text
746
+ logger.info(f"Aborting instance with ID '{instance_id}'")
752
747
 
748
+ response = self.api_service.post(endpoint=endpoint, headers=headers, data={})
749
+ validate_status_code(response)
750
+ return parse_json_response(response, f"abort instance {instance_id} in project {self.project_id}")
753
751
  def get_instance(
754
752
  self,
755
- project_id: str,
756
753
  instance_id: str
757
- ):
754
+ ) -> dict:
758
755
  """
759
- Retrieves details of a specific process instance in the specified project.
756
+ Retrieves details of a specific process instance.
760
757
 
761
- :param project_id: str - Unique identifier of the project.
762
- :param instance_id: str - Unique identifier of the instance to retrieve.
763
- :return: dict or str - JSON response containing the instance details if successful, otherwise raw text.
758
+ :param instance_id: str - Unique identifier of the instance.
759
+ :return: dict or str - Instance details or error message.
764
760
  :raises ValueError: If instance_id is not provided.
761
+ :raises InvalidAPIResponseException: If an error occurs during retrieval.
765
762
  """
766
763
  if not instance_id:
767
764
  raise ValueError("Instance ID must be provided.")
@@ -769,27 +766,25 @@ class AgenticProcessClient(BaseClient):
769
766
  endpoint = GET_INSTANCE_V2.format(instanceId=instance_id)
770
767
  headers = {
771
768
  "Authorization": self.api_service.token,
772
- "ProjectId": project_id
769
+ "ProjectId": self.project_id
773
770
  }
774
771
 
775
- response = self.api_service.get(endpoint=endpoint, headers=headers)
776
- try:
777
- return response.json()
778
- except JSONDecodeError:
779
- return response.text
772
+ logger.info(f"Retrieving instance detail with ID '{instance_id}'")
780
773
 
774
+ response = self.api_service.get(endpoint=endpoint, headers=headers)
775
+ validate_status_code(response)
776
+ return parse_json_response(response, f"retrieve instance {instance_id} for project {self.project_id}")
781
777
  def get_instance_history(
782
778
  self,
783
- project_id: str,
784
779
  instance_id: str
785
- ):
780
+ ) -> dict:
786
781
  """
787
- Retrieves the history (trace) of a specific process instance in the specified project.
782
+ Retrieves the history of a specific process instance.
788
783
 
789
- :param project_id: str - Unique identifier of the project.
790
- :param instance_id: str - Unique identifier of the instance to retrieve history for.
791
- :return: dict or str - JSON response containing the instance history if successful, otherwise raw text.
784
+ :param instance_id: str - Unique identifier of the instance.
785
+ :return: dict or str - Instance history or error message.
792
786
  :raises ValueError: If instance_id is not provided.
787
+ :raises InvalidAPIResponseException: If an error occurs during retrieval.
793
788
  """
794
789
  if not instance_id:
795
790
  raise ValueError("Instance ID must be provided.")
@@ -797,27 +792,25 @@ class AgenticProcessClient(BaseClient):
797
792
  endpoint = GET_INSTANCE_HISTORY_V2.format(instanceId=instance_id)
798
793
  headers = {
799
794
  "Authorization": self.api_service.token,
800
- "ProjectId": project_id
795
+ "ProjectId": self.project_id
801
796
  }
802
797
 
803
- response = self.api_service.get(endpoint=endpoint, headers=headers)
804
- try:
805
- return response.json()
806
- except JSONDecodeError:
807
- return response.text
798
+ logger.info(f"Retrieving instance history with ID '{instance_id}'")
808
799
 
800
+ response = self.api_service.get(endpoint=endpoint, headers=headers)
801
+ validate_status_code(response)
802
+ return parse_json_response(response, f"retrieve history for instance {instance_id} in project {self.project_id}")
809
803
  def get_thread_information(
810
804
  self,
811
- project_id: str,
812
805
  thread_id: str
813
- ):
806
+ ) -> dict:
814
807
  """
815
- Retrieves information about a specific thread in the specified project.
808
+ Retrieves information about a specific thread.
816
809
 
817
- :param project_id: str - Unique identifier of the project.
818
- :param thread_id: str - Unique identifier of the thread to retrieve information for.
819
- :return: dict or str - JSON response containing the thread information if successful, otherwise raw text.
810
+ :param thread_id: str - Unique identifier of the thread.
811
+ :return: dict or str - Thread information or error message.
820
812
  :raises ValueError: If thread_id is not provided.
813
+ :raises InvalidAPIResponseException: If an error occurs during retrieval.
821
814
  """
822
815
  if not thread_id:
823
816
  raise ValueError("Thread ID must be provided.")
@@ -825,29 +818,27 @@ class AgenticProcessClient(BaseClient):
825
818
  endpoint = GET_THREAD_INFORMATION_V2.format(threadId=thread_id)
826
819
  headers = {
827
820
  "Authorization": self.api_service.token,
828
- "ProjectId": project_id
821
+ "ProjectId": self.project_id
829
822
  }
830
823
 
831
- response = self.api_service.get(endpoint=endpoint, headers=headers)
832
- try:
833
- return response.json()
834
- except JSONDecodeError:
835
- return response.text
824
+ logger.debug(f"Retrieving information about thread with ID {thread_id}")
836
825
 
826
+ response = self.api_service.get(endpoint=endpoint, headers=headers)
827
+ validate_status_code(response)
828
+ return parse_json_response(response, f"retrieve thread information for thread {thread_id} in project {self.project_id}")
837
829
  def send_user_signal(
838
830
  self,
839
- project_id: str,
840
831
  instance_id: str,
841
832
  signal_name: str
842
- ):
833
+ ) -> dict:
843
834
  """
844
- Sends a user signal to a specific process instance in the specified project.
835
+ Sends a user signal to a specific process instance.
845
836
 
846
- :param project_id: str - Unique identifier of the project.
847
- :param instance_id: str - Unique identifier of the instance to send the signal to.
848
- :param signal_name: str - Name of the user signal to send (e.g., 'approval').
849
- :return: dict or str - JSON response confirming the signal operation if successful, otherwise raw text.
837
+ :param instance_id: str - Unique identifier of the instance.
838
+ :param signal_name: str - Name of the user signal (e.g., 'approval').
839
+ :return: dict or str - Confirmation of signal operation or error message.
850
840
  :raises ValueError: If instance_id or signal_name is not provided.
841
+ :raises InvalidAPIResponseException: If an error occurs during signal sending.
851
842
  """
852
843
  if not instance_id:
853
844
  raise ValueError("Instance ID must be provided.")
@@ -857,7 +848,7 @@ class AgenticProcessClient(BaseClient):
857
848
  endpoint = SEND_USER_SIGNAL_V2.format(instanceId=instance_id)
858
849
  headers = {
859
850
  "Authorization": self.api_service.token,
860
- "ProjectId": project_id,
851
+ "ProjectId": self.project_id,
861
852
  "Content-Type": "application/json",
862
853
  "Accept": "application/json"
863
854
  }
@@ -865,32 +856,30 @@ class AgenticProcessClient(BaseClient):
865
856
  "name": signal_name
866
857
  }
867
858
 
868
- response = self.api_service.post(endpoint=endpoint, headers=headers, data=data)
869
- try:
870
- return response.json()
871
- except JSONDecodeError:
872
- return response.text
859
+ logger.debug(f"Sending user signal to process instance with ID {instance_id} with data: {data}")
873
860
 
861
+ response = self.api_service.post(endpoint=endpoint, headers=headers, data=data)
862
+ validate_status_code(response)
863
+ return parse_json_response(response, f"send user signal {signal_name} to instance {instance_id} in project {self.project_id}")
874
864
  def create_kb(
875
865
  self,
876
- project_id: str,
877
866
  name: str,
878
867
  artifacts: List[str] = None,
879
868
  metadata: List[str] = None
880
- ):
869
+ ) -> dict:
881
870
  """
882
871
  Creates a new knowledge base (KB) in the specified project.
883
872
 
884
- :param project_id: str - Unique identifier of the project.
885
873
  :param name: str - Name of the knowledge base.
886
874
  :param artifacts: List[str], optional - List of artifact names associated with the KB.
887
875
  :param metadata: List[str], optional - List of metadata fields for the KB.
888
- :return: dict or str - JSON response with the created KB details if successful, otherwise raw text.
876
+ :return: dict or str - Created KB details or error message.
877
+ :raises InvalidAPIResponseException: If an error occurs during creation.
889
878
  """
890
879
  endpoint = CREATE_KB_V1
891
880
  headers = {
892
881
  "Authorization": self.api_service.token,
893
- "ProjectId": project_id,
882
+ "ProjectId": self.project_id,
894
883
  "Content-Type": "application/json",
895
884
  "Accept": "application/json"
896
885
  }
@@ -904,30 +893,28 @@ class AgenticProcessClient(BaseClient):
904
893
  if metadata:
905
894
  data["KBDefinition"]["metadata"] = metadata
906
895
 
896
+ logger.debug(f"Creating KB with data: {data}")
897
+
907
898
  response = self.api_service.post(
908
899
  endpoint=endpoint,
909
900
  headers=headers,
910
901
  data=data
911
902
  )
912
- try:
913
- return response.json()
914
- except JSONDecodeError:
915
- return response.text
916
-
903
+ validate_status_code(response)
904
+ return parse_json_response(response, f"create knowledge base for project {self.project_id}")
917
905
  def get_kb(
918
906
  self,
919
- project_id: str,
920
907
  kb_id: str = None,
921
908
  kb_name: str = None
922
- ):
909
+ ) -> dict:
923
910
  """
924
- Retrieves details of a specific knowledge base (KB) in the specified project.
911
+ Retrieves details of a specific knowledge base (KB) by its ID or name.
925
912
 
926
- :param project_id: str - Unique identifier of the project.
927
- :param kb_id: str, optional - Unique identifier of the KB to retrieve.
928
- :param kb_name: str, optional - Name of the KB to retrieve.
929
- :return: dict or str - JSON response containing the KB details if successful, otherwise raw text.
913
+ :param kb_id: str, optional - Unique identifier of the KB.
914
+ :param kb_name: str, optional - Name of the KB.
915
+ :return: dict or str - KB details or error message.
930
916
  :raises ValueError: If neither kb_id nor kb_name is provided.
917
+ :raises InvalidAPIResponseException: If an error occurs during retrieval.
931
918
  """
932
919
  if not (kb_id or kb_name):
933
920
  raise ValueError("Either kb_id or kb_name must be provided.")
@@ -936,35 +923,37 @@ class AgenticProcessClient(BaseClient):
936
923
  endpoint = GET_KB_V1.format(kbId=identifier)
937
924
  headers = {
938
925
  "Authorization": self.api_service.token,
939
- "ProjectId": project_id
926
+ "ProjectId": self.project_id
940
927
  }
941
928
 
942
- response = self.api_service.get(endpoint=endpoint, headers=headers)
943
- try:
944
- return response.json()
945
- except JSONDecodeError:
946
- return response.text
929
+ if kb_id:
930
+ logger.debug(f"Retrieving KB detail with ID {kb_id}")
931
+ else:
932
+ logger.debug(f"Retrieving KB detail with name {kb_name}")
947
933
 
934
+ response = self.api_service.get(endpoint=endpoint, headers=headers)
935
+ kb_identifier = kb_id or kb_name
936
+ validate_status_code(response)
937
+ return parse_json_response(response, f"retrieve knowledge base {kb_identifier} for project {self.project_id}")
948
938
  def list_kbs(
949
939
  self,
950
- project_id: str,
951
940
  name: str = None,
952
941
  start: str = "0",
953
942
  count: str = "100"
954
- ):
943
+ ) -> dict:
955
944
  """
956
- Retrieves a list of knowledge bases (KBs) in the specified project, filtered by the provided criteria.
945
+ Retrieves a list of knowledge bases (KBs) in the specified project.
957
946
 
958
- :param project_id: str - Unique identifier of the project.
959
- :param name: str, optional - Name of the KB to filter by. Defaults to None.
960
- :param start: str - Starting index for pagination. Defaults to '0'.
961
- :param count: str - Number of KBs to retrieve. Defaults to '100'.
962
- :return: dict or str - JSON response containing the list of KBs if successful, otherwise raw text.
947
+ :param name: str, optional - Name of the KB to filter by.
948
+ :param start: str, optional - Starting index for pagination (default: '0').
949
+ :param count: str, optional - Number of KBs to retrieve (default: '100').
950
+ :return: dict or str - List of KBs or error message.
951
+ :raises InvalidAPIResponseException: If an error occurs during retrieval.
963
952
  """
964
953
  endpoint = LIST_KBS_V1
965
954
  headers = {
966
955
  "Authorization": self.api_service.token,
967
- "ProjectId": project_id
956
+ "ProjectId": self.project_id
968
957
  }
969
958
  params = {
970
959
  "start": start,
@@ -973,26 +962,24 @@ class AgenticProcessClient(BaseClient):
973
962
  if name:
974
963
  params["name"] = name
975
964
 
976
- response = self.api_service.get(endpoint=endpoint, headers=headers, params=params)
977
- try:
978
- return response.json()
979
- except JSONDecodeError:
980
- return response.text
965
+ logger.debug(f"Listing tasks in project with ID {self.project_id}")
981
966
 
967
+ response = self.api_service.get(endpoint=endpoint, headers=headers, params=params)
968
+ validate_status_code(response)
969
+ return parse_json_response(response, f"list knowledge bases for project {self.project_id}")
982
970
  def delete_kb(
983
971
  self,
984
- project_id: str,
985
972
  kb_id: str = None,
986
973
  kb_name: str = None
987
- ):
974
+ ) -> dict:
988
975
  """
989
- Deletes a specific knowledge base (KB) in the specified project.
976
+ Deletes a specific knowledge base (KB) by its ID or name.
990
977
 
991
- :param project_id: str - Unique identifier of the project.
992
- :param kb_id: str, optional - Unique identifier of the KB to delete.
993
- :param kb_name: str, optional - Name of the KB to delete.
994
- :return: dict or str - JSON response confirming deletion if successful, otherwise raw text.
978
+ :param kb_id: str, optional - Unique identifier of the KB.
979
+ :param kb_name: str, optional - Name of the KB.
980
+ :return: dict or str - Confirmation of deletion or error message.
995
981
  :raises ValueError: If neither kb_id nor kb_name is provided.
982
+ :raises InvalidAPIResponseException: If an error occurs during deletion.
996
983
  """
997
984
  if not (kb_id or kb_name):
998
985
  raise ValueError("Either kb_id or kb_name must be provided.")
@@ -1001,39 +988,45 @@ class AgenticProcessClient(BaseClient):
1001
988
  endpoint = DELETE_KB_V1.format(kbId=identifier)
1002
989
  headers = {
1003
990
  "Authorization": self.api_service.token,
1004
- "ProjectId": project_id
991
+ "ProjectId": self.project_id
1005
992
  }
1006
993
 
994
+ if kb_id:
995
+ logger.debug(f"Deleting KB with ID {kb_id}")
996
+ else:
997
+ logger.debug(f"Deleting KB with name {kb_name}")
998
+
1007
999
  response = self.api_service.delete(endpoint=endpoint, headers=headers)
1008
- try:
1009
- return response.json()
1010
- except JSONDecodeError:
1011
- return response.text
1000
+
1001
+ if response.status_code != 204:
1002
+ logger.error(f"Unable to delete knowledge base {kb_id or kb_name} from project {self.project_id}: JSONDecodeError parsing error (status {response.status_code}). Response: {response.text}")
1003
+ raise InvalidAPIResponseException(f"Unable to delete knowledge base {kb_id or kb_name} from project {self.project_id}: {response.text}")
1004
+ else:
1005
+ return {}
1012
1006
 
1013
1007
  def list_jobs(
1014
1008
  self,
1015
- project_id: str,
1016
1009
  start: str = "0",
1017
1010
  count: str = "100",
1018
1011
  topic: str = None,
1019
1012
  token: str = None,
1020
1013
  name: str = None
1021
- ):
1014
+ ) -> dict:
1022
1015
  """
1023
- Retrieves a list of jobs in the specified project, filtered by the provided criteria.
1024
-
1025
- :param project_id: str - Unique identifier of the project.
1026
- :param start: str - Starting index for pagination. Defaults to '0'.
1027
- :param count: str - Number of jobs to retrieve. Defaults to '100'.
1028
- :param topic: str, optional - Topic of the jobs to filter by. Defaults to None.
1029
- :param token: str, optional - Token of the jobs to filter by. Defaults to None.
1030
- :param name: str, optional - Name of the jobs to filter by. Defaults to None.
1031
- :return: dict or str - JSON response containing the list of jobs if successful, otherwise the raw response text.
1016
+ Retrieves a specific list of jobs in the specified project.
1017
+
1018
+ :param start: str, optional - Starting index for pagination (default: '0').
1019
+ :param count: str, optional - Number of jobs to retrieve (default: '100').
1020
+ :param topic: str - optional - Topiccollege of the jobs to filter by.
1021
+ :param token: str, optional - Token of the jobs to filter by.
1022
+ :param name: str, optional - Name of the jobs to filter by.
1023
+ :return: dict or str - List of jobs or error message.
1024
+ :raises InvalidAPIResponseException: If an error occurs during retrieval.
1032
1025
  """
1033
1026
  endpoint = LIST_JOBS_V1
1034
1027
  headers = {
1035
1028
  "Authorization": self.api_service.token,
1036
- "ProjectId": project_id
1029
+ "ProjectId": self.project_id
1037
1030
  }
1038
1031
  params = {
1039
1032
  "start": start,
@@ -1046,14 +1039,13 @@ class AgenticProcessClient(BaseClient):
1046
1039
  if name:
1047
1040
  params["name"] = name
1048
1041
 
1042
+ logger.debug(f"Listing jobs for project with ID {self.project_id}")
1043
+
1049
1044
  response = self.api_service.get(
1050
1045
  endpoint=endpoint,
1051
1046
  headers=headers,
1052
1047
  params=params
1053
1048
  )
1054
- try:
1055
- result = response.json()
1056
- except JSONDecodeError:
1057
- result = response.text
1049
+ validate_status_code(response)
1050
+ return parse_json_response(response, f"list jobs for project {self.project_id}")
1058
1051
 
1059
- return result