pygeai 0.1.6__py3-none-any.whl → 0.6.0b15__py3-none-any.whl

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

Potentially problematic release.


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

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