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,1416 @@
1
+ import unittest
2
+ from json import JSONDecodeError
3
+ from unittest.mock import patch
4
+
5
+ from pygeai.core.common.exceptions import InvalidAPIResponseException
6
+ from pygeai.lab.processes.clients import AgenticProcessClient
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
+ GET_TASK_V2, LIST_TASKS_V2, DELETE_TASK_V2, PUBLISH_TASK_REVISION_V2, START_INSTANCE_V2, ABORT_INSTANCE_V2, \
10
+ GET_INSTANCE_HISTORY_V2, GET_THREAD_INFORMATION_V2, SEND_USER_SIGNAL_V2, CREATE_KB_V1, \
11
+ GET_KB_V1, LIST_KBS_V1, DELETE_KB_V1, LIST_JOBS_V1, UPSERT_TASK_V2, UPDATE_TASK_V2
12
+
13
+
14
+ class TestAgenticProcessClient(unittest.TestCase):
15
+ """
16
+ python -m unittest pygeai.tests.lab.processes.test_clients.TestAgenticProcessClient
17
+ """
18
+
19
+ def setUp(self):
20
+ self.project_id = "test-project-id"
21
+ self.client = AgenticProcessClient(api_key="test_key", base_url="https://test.url", project_id=self.project_id)
22
+ self.process_id = "test-process-id"
23
+ self.process_name = "test-process-name"
24
+ self.task_id = "test-task-id"
25
+ self.task_name = "test-task-name"
26
+ self.instance_id = "test-instance-id"
27
+ self.thread_id = "test-thread-id"
28
+ self.kb_id = "test-kb-id"
29
+ self.kb_name = "test-kb-name"
30
+ self.revision = "1"
31
+ self.signal_name = "approval"
32
+
33
+ @patch("pygeai.core.services.rest.ApiService.post")
34
+ def test_create_process_success(self, mock_post):
35
+ expected_response = {"id": "process-123", "name": "Test Process"}
36
+ mock_response = mock_post.return_value
37
+ mock_response.json.return_value = expected_response
38
+ mock_response.status_code = 200
39
+
40
+ result = self.client.create_process(
41
+ key="test-key",
42
+ name="Test Process",
43
+ description="Test Description",
44
+ kb={"name": "test-kb"},
45
+ agentic_activities=[{"name": "activity1"}],
46
+ artifact_signals=[{"name": "signal1"}],
47
+ user_signals=[{"name": "user-signal1"}],
48
+ start_event={"type": "start"},
49
+ end_event={"type": "end"},
50
+ sequence_flows=[{"from": "start", "to": "end"}],
51
+ variables=[{"key": "var1", "value": "value1"}],
52
+ automatic_publish=True
53
+ )
54
+
55
+ self.assertEqual(result, expected_response)
56
+ mock_post.assert_called_once_with(
57
+ endpoint=f"{CREATE_PROCESS_V2}?automaticPublish=true",
58
+ headers=mock_post.call_args[1]['headers'],
59
+ data=mock_post.call_args[1]['data']
60
+ )
61
+ data = mock_post.call_args[1]['data']['processDefinition']
62
+ self.assertEqual(data['key'], "test-key")
63
+ self.assertEqual(data['name'], "Test Process")
64
+ self.assertEqual(data['description'], "Test Description")
65
+ self.assertEqual(data['kb'], {"name": "test-kb"})
66
+ self.assertEqual(data['agenticActivities'], [{"name": "activity1"}])
67
+ self.assertEqual(data['artifactSignals'], [{"name": "signal1"}])
68
+ self.assertEqual(data['userSignals'], [{"name": "user-signal1"}])
69
+ self.assertEqual(data['startEvent'], {"type": "start"})
70
+ self.assertEqual(data['endEvent'], {"type": "end"})
71
+ self.assertEqual(data['sequenceFlows'], [{"from": "start", "to": "end"}])
72
+ self.assertEqual(data['variables'], [{"key": "var1", "value": "value1"}])
73
+ headers = mock_post.call_args[1]['headers']
74
+ self.assertEqual(headers['ProjectId'], self.project_id)
75
+
76
+ @patch("pygeai.core.services.rest.ApiService.post")
77
+ def test_create_process_json_decode_error(self, mock_post):
78
+ mock_response = mock_post.return_value
79
+ mock_response.status_code = 200
80
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
81
+ mock_response.text = "Invalid JSON response"
82
+
83
+ with self.assertRaises(InvalidAPIResponseException) as context:
84
+ self.client.create_process(
85
+ key="test-key",
86
+ name="Test Process"
87
+ )
88
+
89
+ self.assertEqual(str(context.exception), f"Unable to create process for project {self.project_id}: Invalid JSON response")
90
+ mock_post.assert_called_once()
91
+
92
+ @patch("pygeai.core.services.rest.ApiService.put")
93
+ @patch("pygeai.core.services.rest.ApiService.get")
94
+ def test_update_process_success_with_id(self, mock_get, mock_put):
95
+ expected_response = {"id": self.process_id, "name": "Updated Process"}
96
+ mock_response_put = mock_put.return_value
97
+ mock_response_put.json.return_value = expected_response
98
+ mock_response_put.status_code = 200
99
+
100
+ mock_response_get = mock_get.return_value
101
+ mock_response_get.json.return_value = {
102
+ "processDefinition": {
103
+ "kb": {"name": "current-kb"},
104
+ "agenticActivities": [{"name": "current-activity"}]
105
+ }
106
+ }
107
+ mock_response_get.status_code = 200
108
+
109
+ result = self.client.update_process(
110
+ process_id=self.process_id,
111
+ name="Updated Process",
112
+ description="Updated Description",
113
+ automatic_publish=True,
114
+ upsert=False
115
+ )
116
+
117
+ self.assertEqual(result, expected_response)
118
+ mock_put.assert_called_once_with(
119
+ endpoint=f"{UPDATE_PROCESS_V2.format(processId=self.process_id)}?automaticPublish=true",
120
+ headers=mock_put.call_args[1]['headers'],
121
+ data=mock_put.call_args[1]['data']
122
+ )
123
+ data = mock_put.call_args[1]['data']['processDefinition']
124
+ self.assertEqual(data['name'], "Updated Process")
125
+ self.assertEqual(data['description'], "Updated Description")
126
+ headers = mock_put.call_args[1]['headers']
127
+ self.assertEqual(headers['ProjectId'], self.project_id)
128
+ mock_get.assert_called_once()
129
+
130
+ @patch("pygeai.core.services.rest.ApiService.put")
131
+ @patch("pygeai.core.services.rest.ApiService.get")
132
+ def test_update_process_success_with_name(self, mock_get, mock_put):
133
+ expected_response = {"id": "process-123", "name": "Updated Process"}
134
+ mock_response_put = mock_put.return_value
135
+ mock_response_put.json.return_value = expected_response
136
+ mock_response_put.status_code = 200
137
+
138
+ mock_response_get = mock_get.return_value
139
+ mock_response_get.json.return_value = {
140
+ "processDefinition": {
141
+ "kb": {"name": "current-kb"},
142
+ "agenticActivities": [{"name": "current-activity"}]
143
+ }
144
+ }
145
+ mock_response_get.status_code = 200
146
+
147
+ result = self.client.update_process(
148
+ name=self.process_name,
149
+ key="updated-key",
150
+ description="Updated Description",
151
+ automatic_publish=False,
152
+ upsert=False
153
+ )
154
+
155
+ self.assertEqual(result, expected_response)
156
+ mock_put.assert_called_once_with(
157
+ endpoint=UPDATE_PROCESS_V2.format(processId=self.process_name),
158
+ headers=mock_put.call_args[1]['headers'],
159
+ data=mock_put.call_args[1]['data']
160
+ )
161
+ mock_get.assert_called_once()
162
+
163
+ @patch("pygeai.core.services.rest.ApiService.put")
164
+ def test_update_process_with_upsert(self, mock_put):
165
+ expected_response = {"id": self.process_id, "name": "Upserted Process"}
166
+ mock_response = mock_put.return_value
167
+ mock_response.json.return_value = expected_response
168
+ mock_response.status_code = 200
169
+
170
+ result = self.client.update_process(
171
+ process_id=self.process_id,
172
+ name="Upserted Process",
173
+ upsert=True
174
+ )
175
+
176
+ self.assertEqual(result, expected_response)
177
+ mock_put.assert_called_once_with(
178
+ endpoint=UPSERT_PROCESS_V2.format(processId=self.process_id),
179
+ headers=mock_put.call_args[1]['headers'],
180
+ data=mock_put.call_args[1]['data']
181
+ )
182
+
183
+ def test_update_process_missing_identifier(self):
184
+ with self.assertRaises(ValueError) as context:
185
+ self.client.update_process()
186
+ self.assertEqual(str(context.exception), "Either process_id or name must be provided.")
187
+
188
+ @patch("pygeai.core.services.rest.ApiService.put")
189
+ @patch("pygeai.core.services.rest.ApiService.get")
190
+ def test_update_process_json_decode_error(self, mock_get, mock_put):
191
+ mock_response_put = mock_put.return_value
192
+ mock_response_put.status_code = 200
193
+ mock_response_put.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
194
+ mock_response_put.text = "Invalid JSON response"
195
+
196
+ mock_response_get = mock_get.return_value
197
+ mock_response_get.json.return_value = {
198
+ "processDefinition": {
199
+ "kb": {"name": "current-kb"},
200
+ "agenticActivities": [{"name": "current-activity"}]
201
+ }
202
+ }
203
+ mock_response_get.status_code = 200
204
+
205
+ with self.assertRaises(InvalidAPIResponseException) as context:
206
+ self.client.update_process(
207
+ process_id=self.process_id,
208
+ name="Updated Process"
209
+ )
210
+
211
+ self.assertEqual(str(context.exception),
212
+ f"Unable to update process {self.process_id} in project {self.project_id}: Invalid JSON response")
213
+ mock_put.assert_called_once()
214
+ mock_get.assert_called_once()
215
+
216
+ @patch("pygeai.core.services.rest.ApiService.get")
217
+ def test_get_process_success_with_id(self, mock_get):
218
+ expected_response = {"id": self.process_id, "name": "Test Process"}
219
+ mock_response = mock_get.return_value
220
+ mock_response.json.return_value = expected_response
221
+ mock_response.status_code = 200
222
+
223
+ result = self.client.get_process(
224
+ process_id=self.process_id,
225
+ revision="0",
226
+ version=0,
227
+ allow_drafts=True
228
+ )
229
+
230
+ self.assertEqual(result, expected_response)
231
+ mock_get.assert_called_once_with(
232
+ endpoint=GET_PROCESS_V2.format(processId=self.process_id),
233
+ headers=mock_get.call_args[1]['headers'],
234
+ params={
235
+ "revision": "0",
236
+ "version": 0,
237
+ "allowDrafts": True
238
+ }
239
+ )
240
+ headers = mock_get.call_args[1]['headers']
241
+ self.assertEqual(headers['ProjectId'], self.project_id)
242
+
243
+ @patch("pygeai.core.services.rest.ApiService.get")
244
+ def test_get_process_success_with_name(self, mock_get):
245
+ expected_response = {"id": "process-123", "name": self.process_name}
246
+ mock_response = mock_get.return_value
247
+ mock_response.json.return_value = expected_response
248
+ mock_response.status_code = 200
249
+
250
+ result = self.client.get_process(
251
+ process_name=self.process_name
252
+ )
253
+
254
+ self.assertEqual(result, expected_response)
255
+ mock_get.assert_called_once_with(
256
+ endpoint=GET_PROCESS_V2.format(processId=self.process_name),
257
+ headers=mock_get.call_args[1]['headers'],
258
+ params=mock_get.call_args[1]['params']
259
+ )
260
+
261
+ def test_get_process_missing_identifier(self):
262
+ with self.assertRaises(ValueError) as context:
263
+ self.client.get_process()
264
+ self.assertEqual(str(context.exception), "Either process_id or process_name must be provided.")
265
+
266
+ @patch("pygeai.core.services.rest.ApiService.get")
267
+ def test_get_process_json_decode_error(self, mock_get):
268
+ mock_response = mock_get.return_value
269
+ mock_response.status_code = 200
270
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
271
+ mock_response.text = "Invalid JSON response"
272
+
273
+ with self.assertRaises(InvalidAPIResponseException) as context:
274
+ self.client.get_process(
275
+ process_id=self.process_id
276
+ )
277
+
278
+ self.assertEqual(str(context.exception), f"Unable to retrieve process {self.process_id} for project {self.project_id}: Invalid JSON response")
279
+ mock_get.assert_called_once()
280
+
281
+ @patch("pygeai.core.services.rest.ApiService.get")
282
+ def test_list_processes_success(self, mock_get):
283
+ expected_response = {"processes": [{"id": "process-1", "name": "Process1"}]}
284
+ mock_response = mock_get.return_value
285
+ mock_response.json.return_value = expected_response
286
+ mock_response.status_code = 200
287
+
288
+ result = self.client.list_processes(
289
+ id="process-1",
290
+ name="Process1",
291
+ status="active",
292
+ start="0",
293
+ count="10",
294
+ allow_draft=True
295
+ )
296
+
297
+ self.assertEqual(result, expected_response)
298
+ mock_get.assert_called_once_with(
299
+ endpoint=LIST_PROCESSES_V2,
300
+ headers=mock_get.call_args[1]['headers'],
301
+ params={
302
+ "id": "process-1",
303
+ "name": "Process1",
304
+ "status": "active",
305
+ "start": "0",
306
+ "count": "10",
307
+ "allowDraft": True
308
+ }
309
+ )
310
+ headers = mock_get.call_args[1]['headers']
311
+ self.assertEqual(headers['ProjectId'], self.project_id)
312
+
313
+ @patch("pygeai.core.services.rest.ApiService.get")
314
+ def test_list_processes_json_decode_error(self, mock_get):
315
+ mock_response = mock_get.return_value
316
+ mock_response.status_code = 200
317
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
318
+ mock_response.text = "Invalid JSON response"
319
+
320
+ with self.assertRaises(InvalidAPIResponseException) as context:
321
+ self.client.list_processes()
322
+
323
+ self.assertEqual(str(context.exception), f"Unable to list processes for project {self.project_id}: Invalid JSON response")
324
+ mock_get.assert_called_once()
325
+
326
+ @patch("pygeai.core.services.rest.ApiService.get")
327
+ def test_list_process_instances_success(self, mock_get):
328
+ expected_response = {"instances": [{"id": "instance-1"}]}
329
+ mock_response = mock_get.return_value
330
+ mock_response.json.return_value = expected_response
331
+ mock_response.status_code = 200
332
+
333
+ result = self.client.list_process_instances(
334
+ process_id=self.process_id,
335
+ is_active=True,
336
+ start="0",
337
+ count="5"
338
+ )
339
+
340
+ self.assertEqual(result, expected_response)
341
+ mock_get.assert_called_once_with(
342
+ endpoint=LIST_PROCESS_INSTANCES_V2.format(processId=self.process_id),
343
+ headers=mock_get.call_args[1]['headers'],
344
+ params={
345
+ "isActive": True,
346
+ "start": "0",
347
+ "count": "5"
348
+ }
349
+ )
350
+ headers = mock_get.call_args[1]['headers']
351
+ self.assertEqual(headers['ProjectId'], self.project_id)
352
+
353
+ def test_list_process_instances_missing_process_id(self):
354
+ with self.assertRaises(ValueError) as context:
355
+ self.client.list_process_instances(process_id="")
356
+ self.assertEqual(str(context.exception), "Process ID must be provided.")
357
+
358
+ @patch("pygeai.core.services.rest.ApiService.get")
359
+ def test_list_process_instances_json_decode_error(self, mock_get):
360
+ mock_response = mock_get.return_value
361
+ mock_response.status_code = 200
362
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
363
+ mock_response.text = "Invalid JSON response"
364
+
365
+ with self.assertRaises(InvalidAPIResponseException) as context:
366
+ self.client.list_process_instances(
367
+ process_id=self.process_id
368
+ )
369
+
370
+ self.assertEqual(str(context.exception), f"Unable to list process instances for process {self.process_id} in project {self.project_id}: Invalid JSON response")
371
+ mock_get.assert_called_once()
372
+
373
+ @patch("pygeai.core.services.rest.ApiService.delete")
374
+ def test_delete_process_success_with_id(self, mock_delete):
375
+ expected_response = {}
376
+ mock_response = mock_delete.return_value
377
+ mock_response.status_code = 204
378
+
379
+ result = self.client.delete_process(
380
+ process_id=self.process_id
381
+ )
382
+
383
+ self.assertEqual(result, expected_response)
384
+ mock_delete.assert_called_once_with(
385
+ endpoint=DELETE_PROCESS_V2.format(processId=self.process_id),
386
+ headers=mock_delete.call_args[1]['headers']
387
+ )
388
+ headers = mock_delete.call_args[1]['headers']
389
+ self.assertEqual(headers['ProjectId'], self.project_id)
390
+
391
+ @patch("pygeai.core.services.rest.ApiService.delete")
392
+ def test_delete_process_success_with_name(self, mock_delete):
393
+ expected_response = {}
394
+ mock_response = mock_delete.return_value
395
+ mock_response.status_code = 204
396
+
397
+ result = self.client.delete_process(
398
+ process_name=self.process_name
399
+ )
400
+
401
+ self.assertEqual(result, expected_response)
402
+ mock_delete.assert_called_once_with(
403
+ endpoint=DELETE_PROCESS_V2.format(processId=self.process_name),
404
+ headers=mock_delete.call_args[1]['headers']
405
+ )
406
+
407
+ def test_delete_process_missing_identifier(self):
408
+ with self.assertRaises(ValueError) as context:
409
+ self.client.delete_process()
410
+ self.assertEqual(str(context.exception), "Either process_id or process_name must be provided.")
411
+
412
+ @patch("pygeai.core.services.rest.ApiService.delete")
413
+ def test_delete_process_json_decode_error(self, mock_delete):
414
+ mock_response = mock_delete.return_value
415
+ mock_response.status_code = 200
416
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
417
+ mock_response.text = "Invalid JSON response"
418
+
419
+ with self.assertRaises(InvalidAPIResponseException) as context:
420
+ self.client.delete_process(
421
+ process_id=self.process_id
422
+ )
423
+
424
+ self.assertEqual(str(context.exception), f"Unable to delete process {self.process_id} from project {self.project_id}: Invalid JSON response")
425
+ mock_delete.assert_called_once()
426
+
427
+ @patch("pygeai.core.services.rest.ApiService.post")
428
+ def test_publish_process_revision_success_with_id(self, mock_post):
429
+ expected_response = {"status": "published"}
430
+ mock_response = mock_post.return_value
431
+ mock_response.json.return_value = expected_response
432
+ mock_response.status_code = 200
433
+
434
+ result = self.client.publish_process_revision(
435
+ process_id=self.process_id,
436
+ revision=self.revision
437
+ )
438
+
439
+ self.assertEqual(result, expected_response)
440
+ mock_post.assert_called_once_with(
441
+ endpoint=PUBLISH_PROCESS_REVISION_V2.format(processId=self.process_id),
442
+ headers=mock_post.call_args[1]['headers'],
443
+ data={"revision": self.revision}
444
+ )
445
+ headers = mock_post.call_args[1]['headers']
446
+ self.assertEqual(headers['ProjectId'], self.project_id)
447
+
448
+ @patch("pygeai.core.services.rest.ApiService.post")
449
+ def test_publish_process_revision_success_with_name(self, mock_post):
450
+ expected_response = {"status": "published"}
451
+ mock_response = mock_post.return_value
452
+ mock_response.json.return_value = expected_response
453
+ mock_response.status_code = 200
454
+
455
+ result = self.client.publish_process_revision(
456
+ process_name=self.process_name,
457
+ revision=self.revision
458
+ )
459
+
460
+ self.assertEqual(result, expected_response)
461
+ mock_post.assert_called_once_with(
462
+ endpoint=PUBLISH_PROCESS_REVISION_V2.format(processId=self.process_name),
463
+ headers=mock_post.call_args[1]['headers'],
464
+ data={"revision": self.revision}
465
+ )
466
+
467
+ def test_publish_process_revision_missing_identifier(self):
468
+ with self.assertRaises(ValueError) as context:
469
+ self.client.publish_process_revision(
470
+ revision=self.revision
471
+ )
472
+ self.assertEqual(str(context.exception), "Either process_id or process_name must be provided.")
473
+
474
+ def test_publish_process_revision_missing_revision(self):
475
+ with self.assertRaises(ValueError) as context:
476
+ self.client.publish_process_revision(
477
+ process_id=self.process_id
478
+ )
479
+ self.assertEqual(str(context.exception), "Revision must be provided.")
480
+
481
+ @patch("pygeai.core.services.rest.ApiService.post")
482
+ def test_publish_process_revision_json_decode_error(self, mock_post):
483
+ mock_response = mock_post.return_value
484
+ mock_response.status_code = 200
485
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
486
+ mock_response.text = "Invalid JSON response"
487
+
488
+ with self.assertRaises(InvalidAPIResponseException) as context:
489
+ self.client.publish_process_revision(
490
+ process_id=self.process_id,
491
+ revision=self.revision
492
+ )
493
+
494
+ self.assertEqual(str(context.exception), f"Unable to publish revision {self.revision} for process {self.process_id} in project {self.project_id}: Invalid JSON response")
495
+ mock_post.assert_called_once()
496
+
497
+ @patch("pygeai.core.services.rest.ApiService.post")
498
+ def test_create_task_success(self, mock_post):
499
+ expected_response = {"id": "task-123", "name": "Test Task"}
500
+ mock_response = mock_post.return_value
501
+ mock_response.json.return_value = expected_response
502
+ mock_response.status_code = 200
503
+
504
+ result = self.client.create_task(
505
+ name="Test Task",
506
+ description="Task Description",
507
+ title_template="Task for {{issue}}",
508
+ id="custom-task-id",
509
+ prompt_data={"instructions": "Complete this task"},
510
+ artifact_types=[{"name": "doc", "isRequired": True}],
511
+ automatic_publish=True
512
+ )
513
+
514
+ self.assertEqual(result, expected_response)
515
+ mock_post.assert_called_once_with(
516
+ endpoint=f"{CREATE_TASK_V2}?automaticPublish=true",
517
+ headers=mock_post.call_args[1]['headers'],
518
+ data=mock_post.call_args[1]['data']
519
+ )
520
+ data = mock_post.call_args[1]['data']['taskDefinition']
521
+ self.assertEqual(data['name'], "Test Task")
522
+ self.assertEqual(data['description'], "Task Description")
523
+ self.assertEqual(data['titleTemplate'], "Task for {{issue}}")
524
+ self.assertEqual(data['id'], "custom-task-id")
525
+ self.assertEqual(data['promptData'], {"instructions": "Complete this task"})
526
+ self.assertEqual(data['artifactTypes'], [{"name": "doc", "isRequired": True}])
527
+ headers = mock_post.call_args[1]['headers']
528
+ self.assertEqual(headers['ProjectId'], self.project_id)
529
+
530
+ @patch("pygeai.core.services.rest.ApiService.post")
531
+ def test_create_task_json_decode_error(self, mock_post):
532
+ mock_response = mock_post.return_value
533
+ mock_response.status_code = 200
534
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
535
+ mock_response.text = "Invalid JSON response"
536
+
537
+ with self.assertRaises(InvalidAPIResponseException) as context:
538
+ self.client.create_task(
539
+ name="Test Task"
540
+ )
541
+
542
+ self.assertEqual(str(context.exception), f"Unable to create task for project {self.project_id}: Invalid JSON response")
543
+ mock_post.assert_called_once()
544
+
545
+ @patch("pygeai.core.services.rest.ApiService.get")
546
+ def test_get_task_success_with_id(self, mock_get):
547
+ expected_response = {"id": self.task_id, "name": "Test Task"}
548
+ mock_response = mock_get.return_value
549
+ mock_response.json.return_value = expected_response
550
+ mock_response.status_code = 200
551
+
552
+ result = self.client.get_task(
553
+ task_id=self.task_id
554
+ )
555
+
556
+ self.assertEqual(result, expected_response)
557
+ mock_get.assert_called_once_with(
558
+ endpoint=GET_TASK_V2.format(taskId=self.task_id),
559
+ headers=mock_get.call_args[1]['headers']
560
+ )
561
+ headers = mock_get.call_args[1]['headers']
562
+ self.assertEqual(headers['ProjectId'], self.project_id)
563
+
564
+ @patch("pygeai.core.services.rest.ApiService.get")
565
+ def test_get_task_success_with_name(self, mock_get):
566
+ expected_response = {"id": "task-123", "name": self.task_name}
567
+ mock_response = mock_get.return_value
568
+ mock_response.json.return_value = expected_response
569
+ mock_response.status_code = 200
570
+
571
+ result = self.client.get_task(
572
+ task_id=self.task_id,
573
+ task_name=self.task_name
574
+ )
575
+
576
+ self.assertEqual(result, expected_response)
577
+ mock_get.assert_called_once_with(
578
+ endpoint=GET_TASK_V2.format(taskId=self.task_id),
579
+ headers=mock_get.call_args[1]['headers']
580
+ )
581
+
582
+ def test_get_task_missing_identifier(self):
583
+ with self.assertRaises(ValueError) as context:
584
+ self.client.get_task(task_id="", task_name="")
585
+ self.assertEqual(str(context.exception), "Either task_id or task_name must be provided.")
586
+
587
+ @patch("pygeai.core.services.rest.ApiService.get")
588
+ def test_get_task_json_decode_error(self, mock_get):
589
+ mock_response = mock_get.return_value
590
+ mock_response.status_code = 200
591
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
592
+ mock_response.text = "Invalid JSON response"
593
+
594
+ with self.assertRaises(InvalidAPIResponseException) as context:
595
+ self.client.get_task(
596
+ task_id=self.task_id
597
+ )
598
+
599
+ self.assertEqual(str(context.exception), f"Unable to retrieve task {self.task_id} for project {self.project_id}: Invalid JSON response")
600
+ mock_get.assert_called_once()
601
+
602
+ @patch("pygeai.core.services.rest.ApiService.get")
603
+ def test_list_tasks_success(self, mock_get):
604
+ expected_response = {"tasks": [{"id": "task-1", "name": "Task1"}]}
605
+ mock_response = mock_get.return_value
606
+ mock_response.json.return_value = expected_response
607
+ mock_response.status_code = 200
608
+
609
+ result = self.client.list_tasks(
610
+ id="task-1",
611
+ start="0",
612
+ count="10",
613
+ allow_drafts=True
614
+ )
615
+
616
+ self.assertEqual(result, expected_response)
617
+ mock_get.assert_called_once_with(
618
+ endpoint=LIST_TASKS_V2,
619
+ headers=mock_get.call_args[1]['headers'],
620
+ params={
621
+ "id": "task-1",
622
+ "start": "0",
623
+ "count": "10",
624
+ "allowDrafts": True
625
+ }
626
+ )
627
+ headers = mock_get.call_args[1]['headers']
628
+ self.assertEqual(headers['ProjectId'], self.project_id)
629
+
630
+ @patch("pygeai.core.services.rest.ApiService.get")
631
+ def test_list_tasks_json_decode_error(self, mock_get):
632
+ mock_response = mock_get.return_value
633
+ mock_response.status_code = 200
634
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
635
+ mock_response.text = "Invalid JSON response"
636
+
637
+ with self.assertRaises(InvalidAPIResponseException) as context:
638
+ self.client.list_tasks()
639
+
640
+ self.assertEqual(str(context.exception), f"Unable to list tasks for project {self.project_id}: Invalid JSON response")
641
+ mock_get.assert_called_once()
642
+
643
+ @patch("pygeai.core.services.rest.ApiService.put")
644
+ def test_update_task_success(self, mock_put):
645
+ expected_response = {"id": self.task_id, "name": "Updated Task"}
646
+ mock_response = mock_put.return_value
647
+ mock_response.json.return_value = expected_response
648
+ mock_response.status_code = 200
649
+
650
+ result = self.client.update_task(
651
+ task_id=self.task_id,
652
+ name="Updated Task",
653
+ description="Updated Description",
654
+ title_template="Updated Task for {{issue}}",
655
+ prompt_data={"instructions": "Complete this updated task"},
656
+ artifact_types=[{"name": "doc", "isRequired": True}],
657
+ automatic_publish=True,
658
+ upsert=False
659
+ )
660
+
661
+ self.assertEqual(result, expected_response)
662
+ mock_put.assert_called_once_with(
663
+ endpoint=f"{UPDATE_TASK_V2.format(taskId=self.task_id)}?automaticPublish=true",
664
+ headers=mock_put.call_args[1]['headers'],
665
+ data=mock_put.call_args[1]['data']
666
+ )
667
+ data = mock_put.call_args[1]['data']['taskDefinition']
668
+ self.assertEqual(data['name'], "Updated Task")
669
+ self.assertEqual(data['description'], "Updated Description")
670
+ self.assertEqual(data['titleTemplate'], "Updated Task for {{issue}}")
671
+ self.assertEqual(data['promptData'], {"instructions": "Complete this updated task"})
672
+ self.assertEqual(data['artifactTypes'], [{"name": "doc", "isRequired": True}])
673
+ headers = mock_put.call_args[1]['headers']
674
+ self.assertEqual(headers['ProjectId'], self.project_id)
675
+
676
+ @patch("pygeai.core.services.rest.ApiService.put")
677
+ def test_update_task_with_upsert(self, mock_put):
678
+ expected_response = {"id": self.task_id, "name": "Upserted Task"}
679
+ mock_response = mock_put.return_value
680
+ mock_response.json.return_value = expected_response
681
+ mock_response.status_code = 200
682
+
683
+ result = self.client.update_task(
684
+ task_id=self.task_id,
685
+ name="Upserted Task",
686
+ upsert=True
687
+ )
688
+
689
+ self.assertEqual(result, expected_response)
690
+ mock_put.assert_called_once_with(
691
+ endpoint=UPSERT_TASK_V2.format(taskId=self.task_id),
692
+ headers=mock_put.call_args[1]['headers'],
693
+ data=mock_put.call_args[1]['data']
694
+ )
695
+
696
+ def test_update_task_missing_task_id(self):
697
+ with self.assertRaises(ValueError) as context:
698
+ self.client.update_task(task_id="")
699
+ self.assertEqual(str(context.exception), "Task ID must be provided.")
700
+
701
+ @patch("pygeai.core.services.rest.ApiService.put")
702
+ def test_update_task_json_decode_error(self, mock_put):
703
+ mock_response = mock_put.return_value
704
+ mock_response.status_code = 200
705
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
706
+ mock_response.text = "Invalid JSON response"
707
+
708
+ with self.assertRaises(InvalidAPIResponseException) as context:
709
+ self.client.update_task(
710
+ task_id=self.task_id,
711
+ name="Updated Task"
712
+ )
713
+
714
+ self.assertEqual(str(context.exception), f"Unable to update task {self.task_id} in project {self.project_id}: Invalid JSON response")
715
+ mock_put.assert_called_once()
716
+
717
+ @patch("pygeai.core.services.rest.ApiService.delete")
718
+ def test_delete_task_success_with_id(self, mock_delete):
719
+ expected_response = {}
720
+ mock_response = mock_delete.return_value
721
+ mock_response.status_code = 204
722
+
723
+ result = self.client.delete_task(
724
+ task_id=self.task_id
725
+ )
726
+
727
+ self.assertEqual(result, expected_response)
728
+ mock_delete.assert_called_once_with(
729
+ endpoint=DELETE_TASK_V2.format(taskId=self.task_id),
730
+ headers=mock_delete.call_args[1]['headers']
731
+ )
732
+ headers = mock_delete.call_args[1]['headers']
733
+ self.assertEqual(headers['ProjectId'], self.project_id)
734
+
735
+ @patch("pygeai.core.services.rest.ApiService.delete")
736
+ def test_delete_task_success_with_name(self, mock_delete):
737
+ expected_response = {}
738
+ mock_response = mock_delete.return_value
739
+ mock_response.status_code = 204
740
+
741
+ result = self.client.delete_task(
742
+ task_id=self.task_id,
743
+ task_name=self.task_name
744
+ )
745
+
746
+ self.assertEqual(result, expected_response)
747
+ mock_delete.assert_called_once_with(
748
+ endpoint=DELETE_TASK_V2.format(taskId=self.task_id),
749
+ headers=mock_delete.call_args[1]['headers']
750
+ )
751
+
752
+ def test_delete_task_missing_identifier(self):
753
+ with self.assertRaises(ValueError) as context:
754
+ self.client.delete_task(task_id="", task_name="")
755
+ self.assertEqual(str(context.exception), "Either task_id or task_name must be provided.")
756
+
757
+ @patch("pygeai.core.services.rest.ApiService.delete")
758
+ def test_delete_task_json_decode_error(self, mock_delete):
759
+ mock_response = mock_delete.return_value
760
+ mock_response.status_code = 200
761
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
762
+ mock_response.text = "Invalid JSON response"
763
+
764
+ with self.assertRaises(InvalidAPIResponseException) as context:
765
+ self.client.delete_task(
766
+ task_id=self.task_id
767
+ )
768
+
769
+ self.assertEqual(str(context.exception), f"Unable to delete task {self.task_id} from project {self.project_id}: Invalid JSON response")
770
+ mock_delete.assert_called_once()
771
+
772
+ @patch("pygeai.core.services.rest.ApiService.post")
773
+ def test_publish_task_revision_success_with_id(self, mock_post):
774
+ expected_response = {"status": "published"}
775
+ mock_response = mock_post.return_value
776
+ mock_response.json.return_value = expected_response
777
+ mock_response.status_code = 200
778
+
779
+ result = self.client.publish_task_revision(
780
+ task_id=self.task_id,
781
+ revision=self.revision
782
+ )
783
+
784
+ self.assertEqual(result, expected_response)
785
+ mock_post.assert_called_once_with(
786
+ endpoint=PUBLISH_TASK_REVISION_V2.format(taskId=self.task_id),
787
+ headers=mock_post.call_args[1]['headers'],
788
+ data={"revision": self.revision}
789
+ )
790
+ headers = mock_post.call_args[1]['headers']
791
+ self.assertEqual(headers['ProjectId'], self.project_id)
792
+
793
+ @patch("pygeai.core.services.rest.ApiService.post")
794
+ def test_publish_task_revision_success_with_name(self, mock_post):
795
+ expected_response = {"status": "published"}
796
+ mock_response = mock_post.return_value
797
+ mock_response.json.return_value = expected_response
798
+ mock_response.status_code = 200
799
+
800
+ result = self.client.publish_task_revision(
801
+ task_id=self.task_id,
802
+ task_name=self.task_name,
803
+ revision=self.revision
804
+ )
805
+
806
+ self.assertEqual(result, expected_response)
807
+ mock_post.assert_called_once_with(
808
+ endpoint=PUBLISH_TASK_REVISION_V2.format(taskId=self.task_id),
809
+ headers=mock_post.call_args[1]['headers'],
810
+ data={"revision": self.revision}
811
+ )
812
+
813
+ def test_publish_task_revision_missing_identifier(self):
814
+ with self.assertRaises(ValueError) as context:
815
+ self.client.publish_task_revision(
816
+ task_id="",
817
+ task_name="",
818
+ revision=self.revision
819
+ )
820
+ self.assertEqual(str(context.exception), "Either task_id or task_name must be provided.")
821
+
822
+ def test_publish_task_revision_missing_revision(self):
823
+ with self.assertRaises(ValueError) as context:
824
+ self.client.publish_task_revision(
825
+ task_id=self.task_id
826
+ )
827
+ self.assertEqual(str(context.exception), "Revision must be provided.")
828
+
829
+ @patch("pygeai.core.services.rest.ApiService.post")
830
+ def test_publish_task_revision_json_decode_error(self, mock_post):
831
+ mock_response = mock_post.return_value
832
+ mock_response.status_code = 200
833
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
834
+ mock_response.text = "Invalid JSON response"
835
+
836
+ with self.assertRaises(InvalidAPIResponseException) as context:
837
+ self.client.publish_task_revision(
838
+ task_id=self.task_id,
839
+ revision=self.revision
840
+ )
841
+
842
+ self.assertEqual(str(context.exception), f"Unable to publish revision {self.revision} for task {self.task_id} in project {self.project_id}: Invalid JSON response")
843
+ mock_post.assert_called_once()
844
+
845
+ @patch("pygeai.core.services.rest.ApiService.post")
846
+ def test_start_instance_success(self, mock_post):
847
+ expected_response = {"id": "instance-123", "status": "started"}
848
+ mock_response = mock_post.return_value
849
+ mock_response.json.return_value = expected_response
850
+ mock_response.status_code = 200
851
+
852
+ result = self.client.start_instance(
853
+ process_name=self.process_name,
854
+ subject="Test Subject",
855
+ variables=[{"key": "location", "value": "Paris"}]
856
+ )
857
+
858
+ self.assertEqual(result, expected_response)
859
+ mock_post.assert_called_once_with(
860
+ endpoint=START_INSTANCE_V2,
861
+ headers=mock_post.call_args[1]['headers'],
862
+ data=mock_post.call_args[1]['data']
863
+ )
864
+ data = mock_post.call_args[1]['data']['instanceDefinition']
865
+ self.assertEqual(data['process'], self.process_name)
866
+ self.assertEqual(data['subject'], "Test Subject")
867
+ self.assertEqual(data['variables'], [{"key": "location", "value": "Paris"}])
868
+ headers = mock_post.call_args[1]['headers']
869
+ self.assertEqual(headers['ProjectId'], self.project_id)
870
+
871
+ @patch("pygeai.core.services.rest.ApiService.post")
872
+ def test_start_instance_json_decode_error(self, mock_post):
873
+ mock_response = mock_post.return_value
874
+ mock_response.status_code = 200
875
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
876
+ mock_response.text = "Invalid JSON response"
877
+
878
+ with self.assertRaises(InvalidAPIResponseException) as context:
879
+ self.client.start_instance(
880
+ process_name=self.process_name
881
+ )
882
+
883
+ self.assertEqual(str(context.exception), f"Unable to start instance for process {self.process_name} in project {self.project_id}: Invalid JSON response")
884
+ mock_post.assert_called_once()
885
+
886
+ @patch("pygeai.core.services.rest.ApiService.post")
887
+ def test_abort_instance_success(self, mock_post):
888
+ expected_response = {"status": "aborted"}
889
+ mock_response = mock_post.return_value
890
+ mock_response.json.return_value = expected_response
891
+ mock_response.status_code = 200
892
+
893
+ result = self.client.abort_instance(
894
+ instance_id=self.instance_id
895
+ )
896
+
897
+ self.assertEqual(result, expected_response)
898
+ mock_post.assert_called_once_with(
899
+ endpoint=ABORT_INSTANCE_V2.format(instanceId=self.instance_id),
900
+ headers=mock_post.call_args[1]['headers'],
901
+ data={}
902
+ )
903
+ headers = mock_post.call_args[1]['headers']
904
+ self.assertEqual(headers['ProjectId'], self.project_id)
905
+
906
+ def test_abort_instance_missing_id(self):
907
+ with self.assertRaises(ValueError) as context:
908
+ self.client.abort_instance(instance_id="")
909
+ self.assertEqual(str(context.exception), "Instance ID must be provided.")
910
+
911
+ @patch("pygeai.core.services.rest.ApiService.post")
912
+ def test_abort_instance_json_decode_error(self, mock_post):
913
+ mock_response = mock_post.return_value
914
+ mock_response.status_code = 200
915
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
916
+ mock_response.text = "Invalid JSON response"
917
+
918
+ with self.assertRaises(InvalidAPIResponseException) as context:
919
+ self.client.abort_instance(
920
+ instance_id=self.instance_id
921
+ )
922
+
923
+ self.assertEqual(str(context.exception), f"Unable to abort instance {self.instance_id} in project {self.project_id}: Invalid JSON response")
924
+ mock_post.assert_called_once()
925
+
926
+ def test_get_instance_missing_id(self):
927
+ with self.assertRaises(ValueError) as context:
928
+ self.client.get_instance(instance_id="")
929
+ self.assertEqual(str(context.exception), "Instance ID must be provided.")
930
+
931
+ @patch("pygeai.core.services.rest.ApiService.get")
932
+ def test_get_instance_json_decode_error(self, mock_get):
933
+ mock_response = mock_get.return_value
934
+ mock_response.status_code = 200
935
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
936
+ mock_response.text = "Invalid JSON response"
937
+
938
+ with self.assertRaises(InvalidAPIResponseException) as context:
939
+ self.client.get_instance(
940
+ instance_id=self.instance_id
941
+ )
942
+
943
+ self.assertEqual(str(context.exception),
944
+ f"Unable to retrieve instance {self.instance_id} for project {self.project_id}: Invalid JSON response")
945
+ mock_get.assert_called_once()
946
+
947
+ @patch("pygeai.core.services.rest.ApiService.get")
948
+ def test_get_instance_history_success(self, mock_get):
949
+ expected_response = {"history": [{"event": "start", "time": "2023-01-01"}]}
950
+ mock_response = mock_get.return_value
951
+ mock_response.json.return_value = expected_response
952
+ mock_response.status_code = 200
953
+
954
+ result = self.client.get_instance_history(
955
+ instance_id=self.instance_id
956
+ )
957
+
958
+ self.assertEqual(result, expected_response)
959
+ mock_get.assert_called_once_with(
960
+ endpoint=GET_INSTANCE_HISTORY_V2.format(instanceId=self.instance_id),
961
+ headers=mock_get.call_args[1]['headers']
962
+ )
963
+ headers = mock_get.call_args[1]['headers']
964
+ self.assertEqual(headers['ProjectId'], self.project_id)
965
+
966
+ def test_get_instance_history_missing_id(self):
967
+ with self.assertRaises(ValueError) as context:
968
+ self.client.get_instance_history(instance_id="")
969
+ self.assertEqual(str(context.exception), "Instance ID must be provided.")
970
+
971
+ @patch("pygeai.core.services.rest.ApiService.get")
972
+ def test_get_instance_history_json_decode_error(self, mock_get):
973
+ mock_response = mock_get.return_value
974
+ mock_response.status_code = 200
975
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
976
+ mock_response.text = "Invalid JSON response"
977
+
978
+ with self.assertRaises(InvalidAPIResponseException) as context:
979
+ self.client.get_instance_history(
980
+ instance_id=self.instance_id
981
+ )
982
+
983
+ self.assertEqual(str(context.exception),
984
+ f"Unable to retrieve history for instance {self.instance_id} in project {self.project_id}: Invalid JSON response")
985
+ mock_get.assert_called_once()
986
+
987
+ @patch("pygeai.core.services.rest.ApiService.get")
988
+ def test_get_thread_information_success(self, mock_get):
989
+ expected_response = {"thread": {"id": self.thread_id, "status": "active"}}
990
+ mock_response = mock_get.return_value
991
+ mock_response.json.return_value = expected_response
992
+ mock_response.status_code = 200
993
+
994
+ result = self.client.get_thread_information(
995
+ thread_id=self.thread_id
996
+ )
997
+
998
+ self.assertEqual(result, expected_response)
999
+ mock_get.assert_called_once_with(
1000
+ endpoint=GET_THREAD_INFORMATION_V2.format(threadId=self.thread_id),
1001
+ headers=mock_get.call_args[1]['headers']
1002
+ )
1003
+ headers = mock_get.call_args[1]['headers']
1004
+ self.assertEqual(headers['ProjectId'], self.project_id)
1005
+
1006
+ def test_get_thread_information_missing_id(self):
1007
+ with self.assertRaises(ValueError) as context:
1008
+ self.client.get_thread_information(thread_id="")
1009
+ self.assertEqual(str(context.exception), "Thread ID must be provided.")
1010
+
1011
+ @patch("pygeai.core.services.rest.ApiService.get")
1012
+ def test_get_thread_information_json_decode_error(self, mock_get):
1013
+ mock_response = mock_get.return_value
1014
+ mock_response.status_code = 200
1015
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
1016
+ mock_response.text = "Invalid JSON response"
1017
+
1018
+ with self.assertRaises(InvalidAPIResponseException) as context:
1019
+ self.client.get_thread_information(
1020
+ thread_id=self.thread_id
1021
+ )
1022
+
1023
+ self.assertEqual(str(context.exception),
1024
+ f"Unable to retrieve thread information for thread {self.thread_id} in project {self.project_id}: Invalid JSON response")
1025
+ mock_get.assert_called_once()
1026
+
1027
+ @patch("pygeai.core.services.rest.ApiService.post")
1028
+ def test_send_user_signal_success(self, mock_post):
1029
+ expected_response = {"status": "signal sent"}
1030
+ mock_response = mock_post.return_value
1031
+ mock_response.json.return_value = expected_response
1032
+ mock_response.status_code = 200
1033
+
1034
+ result = self.client.send_user_signal(
1035
+ instance_id=self.instance_id,
1036
+ signal_name=self.signal_name
1037
+ )
1038
+
1039
+ self.assertEqual(result, expected_response)
1040
+ mock_post.assert_called_once_with(
1041
+ endpoint=SEND_USER_SIGNAL_V2.format(instanceId=self.instance_id),
1042
+ headers=mock_post.call_args[1]['headers'],
1043
+ data={"name": self.signal_name}
1044
+ )
1045
+ headers = mock_post.call_args[1]['headers']
1046
+ self.assertEqual(headers['ProjectId'], self.project_id)
1047
+
1048
+ def test_send_user_signal_missing_instance_id(self):
1049
+ with self.assertRaises(ValueError) as context:
1050
+ self.client.send_user_signal(
1051
+ instance_id="",
1052
+ signal_name=self.signal_name
1053
+ )
1054
+ self.assertEqual(str(context.exception), "Instance ID must be provided.")
1055
+
1056
+ def test_send_user_signal_missing_signal_name(self):
1057
+ with self.assertRaises(ValueError) as context:
1058
+ self.client.send_user_signal(
1059
+ instance_id=self.instance_id,
1060
+ signal_name=""
1061
+ )
1062
+ self.assertEqual(str(context.exception), "Signal name must be provided.")
1063
+
1064
+ @patch("pygeai.core.services.rest.ApiService.post")
1065
+ def test_send_user_signal_json_decode_error(self, mock_post):
1066
+ mock_response = mock_post.return_value
1067
+ mock_response.status_code = 200
1068
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
1069
+ mock_response.text = "Invalid JSON response"
1070
+
1071
+ with self.assertRaises(InvalidAPIResponseException) as context:
1072
+ self.client.send_user_signal(
1073
+ instance_id=self.instance_id,
1074
+ signal_name=self.signal_name
1075
+ )
1076
+
1077
+ self.assertEqual(str(context.exception),
1078
+ f"Unable to send user signal {self.signal_name} to instance {self.instance_id} in project {self.project_id}: Invalid JSON response")
1079
+ mock_post.assert_called_once()
1080
+
1081
+ @patch("pygeai.core.services.rest.ApiService.post")
1082
+ def test_create_kb_success(self, mock_post):
1083
+ expected_response = {"id": "kb-123", "name": "Test KB"}
1084
+ mock_response = mock_post.return_value
1085
+ mock_response.json.return_value = expected_response
1086
+ mock_response.status_code = 200
1087
+
1088
+ result = self.client.create_kb(
1089
+ name="Test KB",
1090
+ artifacts=["artifact1"],
1091
+ metadata=["meta1"]
1092
+ )
1093
+
1094
+ self.assertEqual(result, expected_response)
1095
+ mock_post.assert_called_once_with(
1096
+ endpoint=CREATE_KB_V1,
1097
+ headers=mock_post.call_args[1]['headers'],
1098
+ data=mock_post.call_args[1]['data']
1099
+ )
1100
+ data = mock_post.call_args[1]['data']['KBDefinition']
1101
+ self.assertEqual(data['name'], "Test KB")
1102
+ self.assertEqual(data['artifacts'], ["artifact1"])
1103
+ self.assertEqual(data['metadata'], ["meta1"])
1104
+ headers = mock_post.call_args[1]['headers']
1105
+ self.assertEqual(headers['ProjectId'], self.project_id)
1106
+
1107
+ @patch("pygeai.core.services.rest.ApiService.post")
1108
+ def test_create_kb_json_decode_error(self, mock_post):
1109
+ mock_response = mock_post.return_value
1110
+ mock_response.status_code = 200
1111
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
1112
+ mock_response.text = "Invalid JSON response"
1113
+
1114
+ with self.assertRaises(InvalidAPIResponseException) as context:
1115
+ self.client.create_kb(
1116
+ name="Test KB"
1117
+ )
1118
+
1119
+ self.assertEqual(str(context.exception),
1120
+ f"Unable to create knowledge base for project {self.project_id}: Invalid JSON response")
1121
+ mock_post.assert_called_once()
1122
+
1123
+ @patch("pygeai.core.services.rest.ApiService.get")
1124
+ def test_get_kb_success_with_id(self, mock_get):
1125
+ expected_response = {"id": self.kb_id, "name": "Test KB"}
1126
+ mock_response = mock_get.return_value
1127
+ mock_response.json.return_value = expected_response
1128
+ mock_response.status_code = 200
1129
+
1130
+ result = self.client.get_kb(
1131
+ kb_id=self.kb_id
1132
+ )
1133
+
1134
+ self.assertEqual(result, expected_response)
1135
+ mock_get.assert_called_once_with(
1136
+ endpoint=GET_KB_V1.format(kbId=self.kb_id),
1137
+ headers=mock_get.call_args[1]['headers']
1138
+ )
1139
+ headers = mock_get.call_args[1]['headers']
1140
+ self.assertEqual(headers['ProjectId'], self.project_id)
1141
+
1142
+ @patch("pygeai.core.services.rest.ApiService.get")
1143
+ def test_get_kb_success_with_name(self, mock_get):
1144
+ expected_response = {"id": "kb-123", "name": self.kb_name}
1145
+ mock_response = mock_get.return_value
1146
+ mock_response.json.return_value = expected_response
1147
+ mock_response.status_code = 200
1148
+
1149
+ result = self.client.get_kb(
1150
+ kb_name=self.kb_name
1151
+ )
1152
+
1153
+ self.assertEqual(result, expected_response)
1154
+ mock_get.assert_called_once_with(
1155
+ endpoint=GET_KB_V1.format(kbId=self.kb_name),
1156
+ headers=mock_get.call_args[1]['headers']
1157
+ )
1158
+
1159
+ def test_get_kb_missing_identifier(self):
1160
+ with self.assertRaises(ValueError) as context:
1161
+ self.client.get_kb()
1162
+ self.assertEqual(str(context.exception), "Either kb_id or kb_name must be provided.")
1163
+
1164
+ @patch("pygeai.core.services.rest.ApiService.get")
1165
+ def test_get_kb_json_decode_error(self, mock_get):
1166
+ mock_response = mock_get.return_value
1167
+ mock_response.status_code = 200
1168
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
1169
+ mock_response.text = "Invalid JSON response"
1170
+
1171
+ with self.assertRaises(InvalidAPIResponseException) as context:
1172
+ self.client.get_kb(
1173
+ kb_id=self.kb_id
1174
+ )
1175
+
1176
+ self.assertEqual(str(context.exception),
1177
+ f"Unable to retrieve knowledge base {self.kb_id} for project {self.project_id}: Invalid JSON response")
1178
+ mock_get.assert_called_once()
1179
+
1180
+ @patch("pygeai.core.services.rest.ApiService.get")
1181
+ def test_list_kbs_success(self, mock_get):
1182
+ expected_response = {"kbs": [{"id": "kb-1", "name": "KB1"}]}
1183
+ mock_response = mock_get.return_value
1184
+ mock_response.json.return_value = expected_response
1185
+ mock_response.status_code = 200
1186
+
1187
+ result = self.client.list_kbs(
1188
+ name="KB1",
1189
+ start="0",
1190
+ count="10"
1191
+ )
1192
+
1193
+ self.assertEqual(result, expected_response)
1194
+ mock_get.assert_called_once_with(
1195
+ endpoint=LIST_KBS_V1,
1196
+ headers=mock_get.call_args[1]['headers'],
1197
+ params={
1198
+ "name": "KB1",
1199
+ "start": "0",
1200
+ "count": "10"
1201
+ }
1202
+ )
1203
+ headers = mock_get.call_args[1]['headers']
1204
+ self.assertEqual(headers['ProjectId'], self.project_id)
1205
+
1206
+ @patch("pygeai.core.services.rest.ApiService.get")
1207
+ def test_list_kbs_json_decode_error(self, mock_get):
1208
+ mock_response = mock_get.return_value
1209
+ mock_response.status_code = 200
1210
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
1211
+ mock_response.text = "Invalid JSON response"
1212
+
1213
+ with self.assertRaises(InvalidAPIResponseException) as context:
1214
+ self.client.list_kbs()
1215
+
1216
+ self.assertEqual(str(context.exception),
1217
+ f"Unable to list knowledge bases for project {self.project_id}: Invalid JSON response")
1218
+ mock_get.assert_called_once()
1219
+
1220
+ @patch("pygeai.core.services.rest.ApiService.delete")
1221
+ def test_delete_kb_success_with_id(self, mock_delete):
1222
+ expected_response = {}
1223
+ mock_response = mock_delete.return_value
1224
+ mock_response.status_code = 204
1225
+
1226
+ result = self.client.delete_kb(
1227
+ kb_id=self.kb_id
1228
+ )
1229
+
1230
+ self.assertEqual(result, expected_response)
1231
+ mock_delete.assert_called_once_with(
1232
+ endpoint=DELETE_KB_V1.format(kbId=self.kb_id),
1233
+ headers=mock_delete.call_args[1]['headers']
1234
+ )
1235
+ headers = mock_delete.call_args[1]['headers']
1236
+ self.assertEqual(headers['ProjectId'], self.project_id)
1237
+
1238
+ @patch("pygeai.core.services.rest.ApiService.delete")
1239
+ def test_delete_kb_success_with_name(self, mock_delete):
1240
+ expected_response = {}
1241
+ mock_response = mock_delete.return_value
1242
+ mock_response.status_code = 204
1243
+
1244
+ result = self.client.delete_kb(
1245
+ kb_name=self.kb_name
1246
+ )
1247
+
1248
+ self.assertEqual(result, expected_response)
1249
+ mock_delete.assert_called_once_with(
1250
+ endpoint=DELETE_KB_V1.format(kbId=self.kb_name),
1251
+ headers=mock_delete.call_args[1]['headers']
1252
+ )
1253
+
1254
+ def test_delete_kb_missing_identifier(self):
1255
+ with self.assertRaises(ValueError) as context:
1256
+ self.client.delete_kb()
1257
+ self.assertEqual(str(context.exception), "Either kb_id or kb_name must be provided.")
1258
+
1259
+ @patch("pygeai.core.services.rest.ApiService.delete")
1260
+ def test_delete_kb_json_decode_error(self, mock_delete):
1261
+ mock_response = mock_delete.return_value
1262
+ mock_response.status_code = 200
1263
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
1264
+ mock_response.text = "Invalid JSON response"
1265
+
1266
+ with self.assertRaises(InvalidAPIResponseException) as context:
1267
+ self.client.delete_kb(
1268
+ kb_id=self.kb_id
1269
+ )
1270
+
1271
+ self.assertEqual(str(context.exception),
1272
+ f"Unable to delete knowledge base {self.kb_id} from project {self.project_id}: Invalid JSON response")
1273
+ mock_delete.assert_called_once()
1274
+
1275
+ @patch("pygeai.core.services.rest.ApiService.get")
1276
+ def test_list_jobs_success(self, mock_get):
1277
+ expected_response = {"jobs": [{"id": "job-1", "name": "Job1"}]}
1278
+ mock_response = mock_get.return_value
1279
+ mock_response.json.return_value = expected_response
1280
+ mock_response.status_code = 200
1281
+
1282
+ result = self.client.list_jobs(
1283
+ start="0",
1284
+ count="10",
1285
+ topic="test-topic",
1286
+ token="test-token",
1287
+ name="Job1"
1288
+ )
1289
+
1290
+ self.assertEqual(result, expected_response)
1291
+ mock_get.assert_called_once_with(
1292
+ endpoint=LIST_JOBS_V1,
1293
+ headers=mock_get.call_args[1]['headers'],
1294
+ params={
1295
+ "start": "0",
1296
+ "count": "10",
1297
+ "topic": "test-topic",
1298
+ "token": "test-token",
1299
+ "name": "Job1"
1300
+ }
1301
+ )
1302
+ headers = mock_get.call_args[1]['headers']
1303
+ self.assertEqual(headers['ProjectId'], self.project_id)
1304
+
1305
+ @patch("pygeai.core.services.rest.ApiService.get")
1306
+ def test_list_jobs_json_decode_error(self, mock_get):
1307
+ mock_response = mock_get.return_value
1308
+ mock_response.status_code = 200
1309
+ mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
1310
+ mock_response.text = "Invalid JSON response"
1311
+
1312
+ with self.assertRaises(InvalidAPIResponseException) as context:
1313
+ self.client.list_jobs()
1314
+
1315
+ self.assertEqual(str(context.exception),
1316
+ f"Unable to list jobs for project {self.project_id}: Invalid JSON response")
1317
+ mock_get.assert_called_once()
1318
+
1319
+ @patch("pygeai.core.services.rest.ApiService.put")
1320
+ @patch("pygeai.core.services.rest.ApiService.get")
1321
+ def test_update_process_success_with_id(self, mock_get, mock_put):
1322
+ expected_response = {"id": self.process_id, "name": "Updated Process"}
1323
+ mock_response_put = mock_put.return_value
1324
+ mock_response_put.json.return_value = expected_response
1325
+ mock_response_put.status_code = 200
1326
+
1327
+ mock_response_get = mock_get.return_value
1328
+ mock_response_get.json.return_value = {
1329
+ "processDefinition": {
1330
+ "kb": {"name": "current-kb"},
1331
+ "agenticActivities": [{"name": "current-activity"}]
1332
+ }
1333
+ }
1334
+ mock_response_get.status_code = 200
1335
+
1336
+ result = self.client.update_process(
1337
+ process_id=self.process_id,
1338
+ name="Updated Process",
1339
+ description="Updated Description",
1340
+ automatic_publish=True,
1341
+ upsert=False
1342
+ )
1343
+
1344
+ self.assertEqual(result, expected_response)
1345
+ mock_put.assert_called_once_with(
1346
+ endpoint=f"{UPDATE_PROCESS_V2.format(processId=self.process_id)}?automaticPublish=true",
1347
+ headers=mock_put.call_args[1]['headers'],
1348
+ data=mock_put.call_args[1]['data']
1349
+ )
1350
+ data = mock_put.call_args[1]['data']['processDefinition']
1351
+ self.assertEqual(data['name'], "Updated Process")
1352
+ self.assertEqual(data['description'], "Updated Description")
1353
+ headers = mock_put.call_args[1]['headers']
1354
+ self.assertEqual(headers['ProjectId'], self.project_id)
1355
+ self.assertEqual(mock_get.call_count, 2)
1356
+
1357
+ @patch("pygeai.core.services.rest.ApiService.put")
1358
+ @patch("pygeai.core.services.rest.ApiService.get")
1359
+ def test_update_process_success_with_name(self, mock_get, mock_put):
1360
+ expected_response = {"id": "process-123", "name": "Updated Process"}
1361
+ mock_response_put = mock_put.return_value
1362
+ mock_response_put.json.return_value = expected_response
1363
+ mock_response_put.status_code = 200
1364
+
1365
+ mock_response_get = mock_get.return_value
1366
+ mock_response_get.json.return_value = {
1367
+ "processDefinition": {
1368
+ "kb": {"name": "current-kb"},
1369
+ "agenticActivities": [{"name": "current-activity"}]
1370
+ }
1371
+ }
1372
+ mock_response_get.status_code = 200
1373
+
1374
+ result = self.client.update_process(
1375
+ name=self.process_name,
1376
+ key="updated-key",
1377
+ description="Updated Description",
1378
+ automatic_publish=False,
1379
+ upsert=False
1380
+ )
1381
+
1382
+ self.assertEqual(result, expected_response)
1383
+ mock_put.assert_called_once_with(
1384
+ endpoint=UPDATE_PROCESS_V2.format(processId=self.process_name),
1385
+ headers=mock_put.call_args[1]['headers'],
1386
+ data=mock_put.call_args[1]['data']
1387
+ )
1388
+ self.assertEqual(mock_get.call_count, 2)
1389
+
1390
+ @patch("pygeai.core.services.rest.ApiService.put")
1391
+ @patch("pygeai.core.services.rest.ApiService.get")
1392
+ def test_update_process_json_decode_error(self, mock_get, mock_put):
1393
+ mock_response_put = mock_put.return_value
1394
+ mock_response_put.status_code = 200
1395
+ mock_response_put.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
1396
+ mock_response_put.text = "Invalid JSON response"
1397
+
1398
+ mock_response_get = mock_get.return_value
1399
+ mock_response_get.json.return_value = {
1400
+ "processDefinition": {
1401
+ "kb": {"name": "current-kb"},
1402
+ "agenticActivities": [{"name": "current-activity"}]
1403
+ }
1404
+ }
1405
+ mock_response_get.status_code = 200
1406
+
1407
+ with self.assertRaises(InvalidAPIResponseException) as context:
1408
+ self.client.update_process(
1409
+ process_id=self.process_id,
1410
+ name="Updated Process"
1411
+ )
1412
+
1413
+ self.assertEqual(str(context.exception),
1414
+ f"Unable to update process {self.process_id} in project {self.project_id}: Invalid JSON response")
1415
+ mock_put.assert_called_once()
1416
+ self.assertEqual(mock_get.call_count, 2)