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,138 @@
1
+ from unittest import TestCase
2
+ import unittest
3
+ from pygeai.lab.managers import AILabManager
4
+ from pygeai.lab.models import FilterSettings, AgenticProcessList
5
+ import copy
6
+
7
+ ai_lab_manager: AILabManager
8
+
9
+ class TestAILabListProcessesIntegration(TestCase):
10
+
11
+ def setUp(self):
12
+ self.ai_lab_manager = AILabManager()
13
+ self.filter_settings = FilterSettings(
14
+ start=0,
15
+ count=100,
16
+ allow_drafts=False
17
+ )
18
+
19
+
20
+ def __list_processes(self, filter_settings: FilterSettings = None):
21
+ return self.ai_lab_manager.list_processes(
22
+ filter_settings if filter_settings is not None else self.filter_settings
23
+ )
24
+
25
+
26
+ def test_default_list_processes(self):
27
+ processes = self.__list_processes()
28
+ self.assertIsInstance(processes, AgenticProcessList, "Expected a list of processes")
29
+
30
+
31
+ def test_list_processes_with_id_filter(self):
32
+ filter_settings = copy.deepcopy(self.filter_settings)
33
+ filter_settings.id = "7e28e9ab-b9a2-417e-9e87-ed7f6ec9534b"
34
+ result = self.__list_processes(filter_settings=filter_settings)
35
+ print(result)
36
+
37
+ self.assertIsInstance(result, AgenticProcessList, "Expected a list of processes")
38
+ if result.processes:
39
+ for process in result.processes:
40
+ self.assertEqual(
41
+ process.id, filter_settings.id,
42
+ f"Expected process ID to match filter value: {filter_settings.id}"
43
+ )
44
+
45
+
46
+ def test_list_processes_with_name_filter(self):
47
+ filter_settings = copy.deepcopy(self.filter_settings)
48
+ filter_settings.name = "ArithmeticProcess"
49
+ result = self.__list_processes(filter_settings=filter_settings)
50
+ print(result)
51
+
52
+ self.assertIsInstance(result, AgenticProcessList, "Expected a list of processes")
53
+ if result.processes:
54
+ for process in result.processes:
55
+ self.assertEqual(
56
+ "ArithmeticProcess",
57
+ process.name,
58
+ "Expected process name to contain filter value"
59
+ )
60
+
61
+
62
+ def test_list_processes_with_status_filter_active(self):
63
+ filter_settings = copy.deepcopy(self.filter_settings)
64
+ filter_settings.status = "active"
65
+ result = self.__list_processes(filter_settings=filter_settings)
66
+
67
+ self.assertIsInstance(result, AgenticProcessList, "Expected a list of processes")
68
+ if result.processes:
69
+ for process in result.processes:
70
+ self.assertEqual(
71
+ process.status.lower(), "active",
72
+ "Expected all processes to have active status"
73
+ )
74
+
75
+
76
+ def test_list_processes_with_status_filter_inactive(self):
77
+ filter_settings = copy.deepcopy(self.filter_settings)
78
+ filter_settings.status = "inactive"
79
+ result = self.__list_processes(filter_settings=filter_settings)
80
+
81
+ self.assertIsInstance(result, AgenticProcessList, "Expected a list of processes")
82
+ if result.processes:
83
+ for process in result.processes:
84
+ self.assertEqual(
85
+ process.status.lower(), "inactive",
86
+ "Expected all processes to have inactive status"
87
+ )
88
+
89
+
90
+ def test_list_processes_small_count(self):
91
+ filter_settings = copy.deepcopy(self.filter_settings)
92
+ filter_settings.count = 2
93
+ result = self.__list_processes(filter_settings=filter_settings)
94
+
95
+ self.assertIsInstance(result, AgenticProcessList, "Expected a list of processes")
96
+ self.assertLessEqual(
97
+ len(result.processes), 2,
98
+ "Expected list of processes returned to be 2 or less"
99
+ )
100
+
101
+
102
+ def test_list_processes_big_count(self):
103
+ filter_settings = copy.deepcopy(self.filter_settings)
104
+ filter_settings.count = 500
105
+ result = self.__list_processes(filter_settings=filter_settings)
106
+
107
+ self.assertIsInstance(result, AgenticProcessList, "Expected a list of processes")
108
+ self.assertLessEqual(
109
+ len(result.processes), 500,
110
+ "Expected list of processes returned to be 500 or less"
111
+ )
112
+
113
+ @unittest.skip("Method is not returning drafts")
114
+ def test_list_processes_allow_drafts_true(self):
115
+ filter_settings = copy.deepcopy(self.filter_settings)
116
+ filter_settings.allow_drafts = True
117
+ result = self.__list_processes(filter_settings=filter_settings)
118
+
119
+ self.assertIsInstance(result, AgenticProcessList, "Expected a list of processes")
120
+ # Note: This test verifies that draft processes are included when allow_drafts=True
121
+ has_draft = any(p.is_draft for p in result.processes)
122
+ self.assertTrue(has_draft, "Expected at least one draft process")
123
+
124
+
125
+ def test_list_processes_allow_drafts_false(self):
126
+ filter_settings = copy.deepcopy(self.filter_settings)
127
+ filter_settings.allow_drafts = False
128
+ result = self.__list_processes(filter_settings=filter_settings)
129
+
130
+ self.assertIsInstance(result, AgenticProcessList, "Expected a list of processes")
131
+ # Note: This test verifies that draft processes are excluded when allow_drafts=False
132
+ has_draft = any(p.is_draft == False for p in result.processes)
133
+ self.assertTrue(has_draft, "Expected at least one draft process")
134
+
135
+
136
+ def test_list_processes_none_filter_settings(self):
137
+ result = self.__list_processes(filter_settings=None)
138
+ self.assertIsInstance(result, AgenticProcessList, "Expected a list of processes")
@@ -0,0 +1,232 @@
1
+ from unittest import TestCase
2
+ import uuid
3
+ from pygeai.lab.managers import AILabManager
4
+ from pygeai.lab.models import AgenticProcess, KnowledgeBase, AgenticActivity, ArtifactSignal, UserSignal, Event, SequenceFlow
5
+ from pygeai.core.common.exceptions import InvalidAPIResponseException, MissingRequirementException, APIError
6
+
7
+ ai_lab_manager: AILabManager
8
+
9
+ class TestAILabPublishProcessRevisionIntegration(TestCase):
10
+
11
+ def setUp(self):
12
+ self.ai_lab_manager = AILabManager()
13
+ # Using a known process ID that should have revisions for testing
14
+ self.process_id = "7e28e9ab-b9a2-417e-9e87-ed7f6ec9534b"
15
+ self.process_name = "Test Process For Sdk Project"
16
+ self.revision = "1"
17
+
18
+
19
+ def __create_process(self):
20
+ """
21
+ Helper to create a process for testing publish revision functionality.
22
+ """
23
+ unique_key = str(uuid.uuid4())
24
+ process = AgenticProcess(
25
+ key="test_publish_key",
26
+ name=f"Test Publish Process {unique_key[:8]}",
27
+ description="Test process for publish revision testing",
28
+ kb=KnowledgeBase(name="basic-sample", artifact_type_name=["sample-artifact"]),
29
+ agentic_activities=[
30
+ AgenticActivity(
31
+ key="activityOne",
32
+ name="First Step",
33
+ task_name="basic-task",
34
+ agent_name="GoogleSummarizer2",
35
+ agent_revision_id=0
36
+ )
37
+ ],
38
+ artifact_signals=[
39
+ ArtifactSignal(
40
+ key="artifact.upload.1",
41
+ name="artifact.upload",
42
+ handling_type="C",
43
+ artifact_type_name=["sample-artifact"]
44
+ )
45
+ ],
46
+ user_signals=[
47
+ UserSignal(key="signal_done", name="process-completed")
48
+ ],
49
+ start_event=Event(key="artifact.upload.1", name="artifact.upload"),
50
+ end_event=Event(key="end", name="Done"),
51
+ sequence_flows=[
52
+ SequenceFlow(key="step1", source_key="artifact.upload.1", target_key="activityOne"),
53
+ SequenceFlow(key="step2", source_key="activityOne", target_key="signal_done"),
54
+ SequenceFlow(key="stepEnd", source_key="signal_done", target_key="end")
55
+ ]
56
+ )
57
+
58
+ return self.ai_lab_manager.create_process(
59
+ process=process,
60
+ automatic_publish=False
61
+ )
62
+
63
+
64
+ def __publish_process_revision(self, process_id: str = None, process_name: str = None, revision: str = None):
65
+ return self.ai_lab_manager.publish_process_revision(
66
+ process_id=process_id,
67
+ process_name=process_name,
68
+ revision=revision if revision is not None else self.revision
69
+ )
70
+
71
+
72
+ def test_publish_process_revision_by_id(self):
73
+ """Test publishing a process revision using process_id."""
74
+ published_process = self.__publish_process_revision(process_id=self.process_id)
75
+
76
+ self.assertIsInstance(published_process, AgenticProcess, "Expected AgenticProcess instance")
77
+ self.assertEqual(published_process.id, self.process_id, "Expected process ID to match")
78
+ self.assertIsNotNone(published_process.revision, "Expected revision to be set")
79
+
80
+
81
+ def test_publish_process_revision_by_name(self):
82
+ """Test publishing a process revision using process_name."""
83
+ published_process = self.__publish_process_revision(process_name=self.process_name)
84
+
85
+ self.assertIsInstance(published_process, AgenticProcess, "Expected AgenticProcess instance")
86
+ self.assertEqual(published_process.name, self.process_name, "Expected process name to match")
87
+ self.assertIsNotNone(published_process.revision, "Expected revision to be set")
88
+
89
+
90
+ def test_publish_process_revision_specific_revision(self):
91
+ """Test publishing a specific revision number."""
92
+ specific_revision = "2"
93
+ published_process = self.__publish_process_revision(
94
+ process_id=self.process_id,
95
+ revision=specific_revision
96
+ )
97
+
98
+ self.assertIsInstance(published_process, AgenticProcess, "Expected AgenticProcess instance")
99
+ self.assertEqual(published_process.id, self.process_id, "Expected process ID to match")
100
+
101
+
102
+ def test_publish_process_revision_no_parameters(self):
103
+ """Test error when neither process_id nor process_name is provided."""
104
+ with self.assertRaises(MissingRequirementException) as exception:
105
+ self.__publish_process_revision()
106
+
107
+ self.assertIn(
108
+ "Either process_id or process_name and revision must be provided",
109
+ str(exception.exception),
110
+ "Expected error message for missing parameters"
111
+ )
112
+
113
+
114
+ def test_publish_process_revision_empty_process_id(self):
115
+ """Test error when process_id is empty."""
116
+ with self.assertRaises(MissingRequirementException) as exception:
117
+ self.__publish_process_revision(process_id="")
118
+
119
+ self.assertIn(
120
+ "Either process_id or process_name and revision must be provided",
121
+ str(exception.exception),
122
+ "Expected error message for empty process_id"
123
+ )
124
+
125
+
126
+ def test_publish_process_revision_empty_process_name(self):
127
+ """Test error when process_name is empty."""
128
+ with self.assertRaises(MissingRequirementException) as exception:
129
+ self.__publish_process_revision(process_name="")
130
+
131
+ self.assertIn(
132
+ "Either process_id or process_name and revision must be provided",
133
+ str(exception.exception),
134
+ "Expected error message for empty process_name"
135
+ )
136
+
137
+
138
+ def test_publish_process_revision_no_revision(self):
139
+ """Test error when revision is not provided."""
140
+ with self.assertRaises(MissingRequirementException) as exception:
141
+ self.__publish_process_revision(process_id=self.process_id, revision="")
142
+
143
+ self.assertIn(
144
+ "Either process_id or process_name and revision must be provided",
145
+ str(exception.exception),
146
+ "Expected error message for missing revision"
147
+ )
148
+
149
+
150
+ def test_publish_process_revision_none_revision(self):
151
+ """Test error when revision is None."""
152
+ with self.assertRaises(MissingRequirementException) as exception:
153
+ self.__publish_process_revision(process_id=self.process_id, revision=None)
154
+
155
+ self.assertIn(
156
+ "Either process_id or process_name and revision must be provided",
157
+ str(exception.exception),
158
+ "Expected error message for None revision"
159
+ )
160
+
161
+
162
+ def test_publish_process_revision_invalid_process_id(self):
163
+ """Test error with invalid process_id."""
164
+ invalid_id = "0026e53d-ea78-4cac-af9f-12650invalid"
165
+ with self.assertRaises((APIError, InvalidAPIResponseException)) as exception:
166
+ self.__publish_process_revision(process_id=invalid_id)
167
+
168
+ self.assertTrue(
169
+ f"Unable to publish revision {self.revision} for process {invalid_id}" in str(exception.exception) or
170
+ "Error received while publishing process revision" in str(exception.exception),
171
+ "Expected error message for invalid process id"
172
+ )
173
+
174
+
175
+ def test_publish_process_revision_invalid_process_name(self):
176
+ """Test error with invalid process_name."""
177
+ invalid_name = "NonExistentProcessName123"
178
+ with self.assertRaises((APIError, InvalidAPIResponseException)) as exception:
179
+ self.__publish_process_revision(process_name=invalid_name)
180
+
181
+ self.assertTrue(
182
+ f"Unable to publish revision {self.revision} for process {invalid_name}" in str(exception.exception) or
183
+ "Error received while publishing process revision" in str(exception.exception),
184
+ "Expected error message for invalid process name"
185
+ )
186
+
187
+
188
+ def test_publish_process_revision_nonexistent_process_id(self):
189
+ """Test error with nonexistent process_id."""
190
+ nonexistent_id = "99999999-9999-9999-9999-999999999999"
191
+ with self.assertRaises((APIError, InvalidAPIResponseException)) as exception:
192
+ self.__publish_process_revision(process_id=nonexistent_id)
193
+
194
+ self.assertTrue(
195
+ f"Unable to publish revision {self.revision} for process {nonexistent_id}" in str(exception.exception) or
196
+ "Error received while publishing process revision" in str(exception.exception),
197
+ "Expected error message for nonexistent process id"
198
+ )
199
+
200
+
201
+ def test_publish_process_revision_invalid_revision(self):
202
+ """Test error with invalid revision number."""
203
+ invalid_revision = "999"
204
+ with self.assertRaises((APIError, InvalidAPIResponseException)) as exception:
205
+ self.__publish_process_revision(process_id=self.process_id, revision=invalid_revision)
206
+
207
+ self.assertTrue(
208
+ f"Unable to publish revision {invalid_revision} for process {self.process_id}" in str(exception.exception) or
209
+ "Error received while publishing process revision" in str(exception.exception),
210
+ "Expected error message for invalid revision"
211
+ )
212
+
213
+
214
+ def test_publish_process_revision_with_created_process(self):
215
+ """Test publishing revision with a newly created process."""
216
+ # Create a fresh process
217
+ created_process = self.__create_process()
218
+
219
+ # Note: A newly created process might not have additional revisions to publish
220
+ # This test verifies the process creation worked and we can attempt to publish
221
+ self.assertIsNotNone(created_process.id, "Expected created process to have an ID")
222
+
223
+ # Attempt to publish revision 0 (initial revision)
224
+ try:
225
+ published_process = self.__publish_process_revision(
226
+ process_id=created_process.id,
227
+ revision="0"
228
+ )
229
+ self.assertIsInstance(published_process, AgenticProcess, "Expected AgenticProcess instance")
230
+ except (APIError, InvalidAPIResponseException):
231
+ # This is expected for a new process that may not have publishable revisions yet
232
+ pass
@@ -0,0 +1,289 @@
1
+ from unittest import TestCase
2
+ import uuid
3
+
4
+ from pydantic import ValidationError
5
+ from pygeai.core.common.exceptions import APIResponseError, APIError
6
+ from pygeai.lab.managers import AILabManager
7
+ from pygeai.lab.models import (
8
+ AgenticProcess, KnowledgeBase, AgenticActivity, ArtifactSignal, Task,
9
+ UserSignal, Event, SequenceFlow, Variable
10
+ )
11
+
12
+
13
+ class TestAILabUpdateProcessIntegration(TestCase):
14
+ def setUp(self):
15
+ """
16
+ Set up the test environment.
17
+ """
18
+ self.ai_lab_manager = AILabManager()
19
+ self.process_to_update = self.__load_process()
20
+ self.created_process: AgenticProcess = None
21
+ self.updated_process: AgenticProcess = None
22
+
23
+
24
+ def tearDown(self):
25
+ """
26
+ Clean up after each test if necessary.
27
+ This can be used to delete the created process
28
+ """
29
+ if isinstance(self.created_process, AgenticProcess):
30
+ self.ai_lab_manager.delete_process(self.created_process.id)
31
+
32
+
33
+ def __load_process(self):
34
+ """
35
+ Helper to load a complete process configuration for testing.
36
+ """
37
+ self.random_str = str(uuid.uuid4())
38
+ return AgenticProcess(
39
+ id="3c071d2f-a044-4513-b2c0-6d27d9420693",
40
+ key=f"sdk_project_updated_process_{self.random_str[:8]}",
41
+ name=f"Updated Agentic Process {self.random_str[:8]}",
42
+ description=f"Process updated for SDK testing purposes {self.random_str[:8]}",
43
+ kb=KnowledgeBase(name="basic-sample", artifact_type_name=["sample-artifact"]),
44
+ agentic_activities=[
45
+ AgenticActivity(key="activityOne", name="First Step Updated", task_name="basic-task", agent_name="GoogleSummarizer2", agent_revision_id=0)
46
+ ],
47
+ artifact_signals=[
48
+ ArtifactSignal(key="artifact.upload.1", name="artifact.upload.updated", handling_type="C", artifact_type_name=["sample-artifact"])
49
+ ],
50
+ user_signals=[
51
+ UserSignal(key="signal_done", name="process-completed-updated")
52
+ ],
53
+ start_event=Event(key="artifact.upload.1", name="artifact.upload.updated"),
54
+ end_event=Event(key="end", name="Done Updated"),
55
+ sequence_flows=[
56
+ SequenceFlow(key="step1", source_key="artifact.upload.1", target_key="activityOne"),
57
+ SequenceFlow(key="step2", source_key="activityOne", target_key="signal_done"),
58
+ SequenceFlow(key="stepEnd", source_key="signal_done", target_key="end")
59
+ ]
60
+ )
61
+
62
+
63
+ def __update_process(self, process: AgenticProcess = None, automatic_publish: bool = False, upsert: bool = False):
64
+ """
65
+ Helper method to update a process.
66
+ """
67
+ return self.ai_lab_manager.update_process(
68
+ process=self.process_to_update if process is None else process,
69
+ automatic_publish=automatic_publish,
70
+ upsert=upsert
71
+ )
72
+
73
+
74
+ def test_update_process_all_fields_success(self):
75
+ """
76
+ Test updating a process with all available fields populated.
77
+ """
78
+ self.updated_process = self.__update_process()
79
+
80
+ # Assertions
81
+ self.assertEqual(self.updated_process.name, self.process_to_update.name)
82
+ self.assertEqual(self.updated_process.description, self.process_to_update.description)
83
+
84
+ # Assert knowledge base
85
+ self.assertIsNotNone(self.updated_process.kb)
86
+ self.assertEqual(self.updated_process.kb.name, self.process_to_update.kb.name)
87
+
88
+ # Assert agentic activities
89
+ self.assertIsNotNone(self.updated_process.agentic_activities)
90
+ updated_activity = self.updated_process.agentic_activities[0]
91
+ original_activity = self.process_to_update.agentic_activities[0]
92
+ self.assertEqual(updated_activity.name, original_activity.name)
93
+
94
+ # Assert artifact signals
95
+ updated_signal = self.updated_process.artifact_signals[0]
96
+ original_signal = self.process_to_update.artifact_signals[0]
97
+ self.assertTrue(isinstance(updated_signal, ArtifactSignal))
98
+ self.assertEqual(updated_signal.key.lower(), original_signal.key.lower())
99
+ self.assertEqual(updated_signal.name, original_signal.name)
100
+ self.assertEqual(updated_signal.handling_type, original_signal.handling_type)
101
+
102
+ # Assert that the process is in draft state after update
103
+ self.assertTrue(self.updated_process.is_draft, "Expected process to be in draft state after update")
104
+
105
+
106
+ def test_update_process_minimum_fields_success(self):
107
+ """
108
+ Test updating a process with minimum required fields (only name).
109
+ """
110
+ # Update with minimal data
111
+ minimal_update = AgenticProcess(
112
+ id=self.process_to_update.id,
113
+ name=f"Minimal Updated Process {str(uuid.uuid4())[:8]}"
114
+ )
115
+
116
+ self.updated_process = self.__update_process(process=minimal_update)
117
+ self.assertEqual(self.updated_process.name, minimal_update.name)
118
+
119
+
120
+ def test_update_process_invalid_name(self):
121
+ """
122
+ Test updating a process with invalid characters in name.
123
+ """
124
+ test_params = [True, False]
125
+
126
+ for auto_publish in test_params:
127
+ with self.subTest(input=auto_publish):
128
+ # Test invalid characters
129
+ invalid_names = [
130
+ f"{self.process_to_update.name}:invalid",
131
+ f"{self.process_to_update.name}/invalid"
132
+ ]
133
+
134
+ for invalid_name in invalid_names:
135
+ with self.assertRaises(APIError) as exception:
136
+ self.process_to_update.name = invalid_name
137
+ self.__update_process(automatic_publish=auto_publish)
138
+
139
+ self.assertIn(
140
+ f"Invalid character in name ({':' if ":" in invalid_name else "/"} is not allowed).",
141
+ str(exception.exception),
142
+ f"Expected an error about invalid character in process name with autopublish {'enabled' if auto_publish else 'disabled'}"
143
+ )
144
+
145
+
146
+ def test_update_process_duplicated_name(self):
147
+ """
148
+ Test updating a process with a name that already exists.
149
+ """
150
+ test_params = [True, False]
151
+
152
+ for auto_publish in test_params:
153
+ with self.subTest(input=auto_publish):
154
+ self.process_to_update.name = "Test Process For Sdk Project"
155
+
156
+ with self.assertRaises(APIError) as exception:
157
+ self.__update_process(automatic_publish=auto_publish)
158
+
159
+ self.assertIn(
160
+ "A process with this name already exists",
161
+ str(exception.exception),
162
+ f"Expected an error about duplicated process name with autopublish {'enabled' if auto_publish else 'disabled'}"
163
+ )
164
+
165
+
166
+ def test_update_process_no_name(self):
167
+ """
168
+ Test updating a process without providing a name.
169
+ """
170
+ test_params = [True, False]
171
+
172
+ for auto_publish in test_params:
173
+ with self.subTest(input=auto_publish):
174
+ self.process_to_update.name = ""
175
+
176
+ with self.assertRaises(APIError) as exception:
177
+ self.__update_process(automatic_publish=auto_publish)
178
+
179
+ self.assertIn(
180
+ "Process name cannot be empty",
181
+ str(exception.exception),
182
+ f"Expected an error when process name is empty with autopublish {'enabled' if auto_publish else 'disabled'}"
183
+ )
184
+
185
+
186
+ def test_update_process_invalid_id(self):
187
+ """
188
+ Test updating a process with an invalid ID.
189
+ """
190
+ test_params = [True, False]
191
+
192
+ for auto_publish in test_params:
193
+ with self.subTest(input=auto_publish):
194
+ invalid_id = "0026e53d-ea78-4cac-af9f-12650invalid"
195
+ self.process_to_update.id = invalid_id
196
+
197
+ with self.assertRaises(APIError) as exception:
198
+ self.__update_process(automatic_publish=auto_publish)
199
+
200
+ self.assertIn(
201
+ f"Process-Definition not found [IdOrName= {invalid_id}]",
202
+ str(exception.exception),
203
+ f"Expected an error when process id is invalid and autopublish is {'enabled' if auto_publish else 'disabled'}"
204
+ )
205
+
206
+
207
+ def test_update_process_no_id_invalid_name(self):
208
+ """
209
+ Test updating a process without ID.
210
+ """
211
+ test_params = [True, False]
212
+
213
+ for auto_publish in test_params:
214
+ with self.subTest(input=auto_publish):
215
+ self.process_to_update.id = ""
216
+
217
+ with self.assertRaises(APIError) as exception:
218
+ self.__update_process(automatic_publish=auto_publish)
219
+
220
+ self.assertIn(
221
+ f"Process-Definition not found [IdOrName= {self.process_to_update.name}]",
222
+ str(exception.exception),
223
+ f"Expected an error when process id is invalid and autopublish is {'enabled' if auto_publish else 'disabled'}"
224
+ )
225
+
226
+
227
+ def test_update_process_knowledge_base(self):
228
+ """
229
+ Test updating a process with different knowledge base configurations.
230
+ """
231
+
232
+ # Update with different KB
233
+ self.process_to_update.kb = KnowledgeBase(name="updated-kb", artifact_type_name=["updated-artifact"])
234
+
235
+ self.updated_process = self.__update_process()
236
+ self.assertEqual(self.updated_process.kb.name, "updated-kb")
237
+ self.assertEqual(self.updated_process.kb.artifact_type_name, ["updated-artifact"])
238
+
239
+
240
+ def test_update_process_automatic_publish(self):
241
+ """
242
+ Test updating a process with automatic publish enabled.
243
+ """
244
+ # Create a task for publishing
245
+ unique_key = str(uuid.uuid4())
246
+ task = Task(name=unique_key, description="Basic task for process", title_template="Basic Task")
247
+ self.ai_lab_manager.create_task(task=task, automatic_publish=True)
248
+
249
+ # Update process with task reference
250
+ self.process_to_update.agentic_activities[0].task_name = unique_key
251
+
252
+ self.updated_process = self.__update_process(automatic_publish=True)
253
+ self.assertFalse(self.updated_process.is_draft, "Expected process to be published after update with automatic_publish=True")
254
+
255
+
256
+ def test_update_process_upsert_existing(self):
257
+ """
258
+ Test updating a process with upsert=True when process exists.
259
+ """
260
+ # Update existing process with upsert
261
+ self.updated_process = self.__update_process(upsert=True)
262
+ self.assertEqual(self.updated_process.name, self.process_to_update.name)
263
+ self.assertEqual(self.updated_process.id, self.process_to_update.id)
264
+
265
+
266
+ def test_update_process_upsert_new(self):
267
+ """
268
+ Test updating a process with upsert=True when process doesn't exist (should create new).
269
+ """
270
+ new_id = str(uuid.uuid4())
271
+ self.process_to_update.id = new_id
272
+
273
+ self.created_process = self.__update_process(upsert=True)
274
+ self.assertEqual(self.created_process.name, self.process_to_update.name)
275
+ self.assertIsNotNone(self.created_process.id)
276
+
277
+
278
+ def test_update_process_by_name_instead_of_id(self):
279
+ """
280
+ Test updating a process by name instead of ID.
281
+ """
282
+ self.process = self.ai_lab_manager.get_process(self.process_to_update.id)
283
+ self.process_to_update.id = None
284
+ self.process_to_update.name = self.process.name
285
+ self.process_to_update.description = "Updated via name instead of ID"
286
+
287
+
288
+ self.updated_process = self.__update_process()
289
+ self.assertEqual(self.updated_process.description, "Updated via name instead of ID")