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,319 @@
1
+ from unittest import TestCase
2
+ import unittest
3
+ import uuid
4
+ from pygeai.lab.managers import AILabManager
5
+ from pygeai.lab.models import Agent, AgentData, Prompt, LlmConfig, Model, Sampling, PromptExample, PromptOutput
6
+ from pydantic import ValidationError
7
+ from pygeai.core.common.exceptions import APIError, InvalidAPIResponseException
8
+
9
+
10
+ class TestAILabCreateAgentIntegration(TestCase):
11
+ def setUp(self):
12
+ """
13
+ Set up the test environment.
14
+ """
15
+ self.ai_lab_manager = AILabManager()
16
+ self.new_agent = self.__load_agent()
17
+ self.created_agent: Agent = None
18
+
19
+
20
+ def tearDown(self):
21
+ """
22
+ Clean up after each test if necessary.
23
+ This can be used to delete the created agent or reset the state.
24
+ """
25
+ if isinstance(self.created_agent, Agent):
26
+ self.ai_lab_manager.delete_agent(self.created_agent.id)
27
+
28
+
29
+ def __load_agent(self):
30
+ random_str = str(uuid.uuid4())
31
+ return Agent(
32
+ name=random_str,
33
+ access_scope="public",
34
+ public_name=f"public_{random_str}",
35
+ job_description="Translator",
36
+ description="Agent that translates from any language to english.",
37
+ agent_data=AgentData(
38
+ prompt=Prompt(
39
+ instructions="the user will provide a text, you must return the same text translated to english",
40
+ inputs=["text", "avoid slang indicator"],
41
+ outputs=[
42
+ PromptOutput(key="translated_text", description="translated text, with slang or not depending on the indication. in plain text.")
43
+ ],
44
+ examples=[
45
+ PromptExample(input_data="hola mundo [no-slang]", output='{"translated_text":"hello world"}'),
46
+ PromptExample(input_data="esto es una prueba pincheguey [keep-slang]", output='{"translated_text":"this is a test pal"}')
47
+ ]
48
+ ),
49
+ llm_config=LlmConfig(
50
+ max_tokens=1800,
51
+ timeout=0,
52
+ sampling=Sampling(temperature=0.3, top_k=0, top_p=0)
53
+ ),
54
+ models=[Model(name="gpt-4o")]
55
+ )
56
+ )
57
+
58
+
59
+ def __create_agent(self, agent=None, automatic_publish=False):
60
+ """
61
+ Helper to create an agent with the current project_id and ai_lab_manager.
62
+ If automatic_publish is None, do not pass it (useful for tests that omit it).
63
+ """
64
+ return self.ai_lab_manager.create_agent(
65
+ agent=self.new_agent if agent is None else agent,
66
+ automatic_publish=automatic_publish
67
+ )
68
+
69
+
70
+ def test_create_agent_full_data(self):
71
+ self.created_agent = self.__create_agent()
72
+ created_agent = self.created_agent
73
+ agent = self.new_agent
74
+
75
+ self.assertTrue(isinstance(created_agent, Agent), "Expected a created agent")
76
+
77
+ # Assert the main fields of the created agent
78
+ self.assertIsNotNone(created_agent.id)
79
+ self.assertEqual(created_agent.name, agent.name)
80
+ self.assertEqual(created_agent.access_scope, agent.access_scope)
81
+ self.assertEqual(created_agent.public_name, agent.public_name)
82
+ self.assertEqual(created_agent.avatar_image, agent.avatar_image)
83
+ self.assertEqual(created_agent.description, agent.description)
84
+ self.assertEqual(created_agent.job_description, agent.job_description)
85
+
86
+ # Assert agentData fields
87
+ agent_data = created_agent.agent_data
88
+ self.assertIsNotNone(agent_data)
89
+ self.assertEqual(agent_data.llm_config.max_tokens, agent.agent_data.llm_config.max_tokens)
90
+ self.assertEqual(agent_data.llm_config.timeout, agent.agent_data.llm_config.timeout)
91
+ self.assertEqual(agent_data.llm_config.sampling.temperature, agent.agent_data.llm_config.sampling.temperature)
92
+ self.assertEqual(agent_data.llm_config.sampling.top_k, agent.agent_data.llm_config.sampling.top_k)
93
+ self.assertEqual(agent_data.llm_config.sampling.top_p, agent.agent_data.llm_config.sampling.top_p)
94
+ self.assertEqual(agent_data.models[0].name, agent.agent_data.models[0].name)
95
+
96
+ # Assert prompt fields
97
+ prompt = agent_data.prompt
98
+ self.assertEqual(prompt.instructions, agent.agent_data.prompt.instructions)
99
+ self.assertEqual(prompt.inputs, agent.agent_data.prompt.inputs)
100
+ self.assertEqual(prompt.outputs[0].key, agent.agent_data.prompt.outputs[0].key)
101
+ self.assertEqual(prompt.outputs[0].description, agent.agent_data.prompt.outputs[0].description)
102
+
103
+ # Assert prompt examples
104
+ self.assertEqual(prompt.examples[0].input_data, agent.agent_data.prompt.examples[0].input_data)
105
+ self.assertEqual(prompt.examples[0].output, agent.agent_data.prompt.examples[0].output)
106
+
107
+
108
+ def test_create_agent_minimum_required_data(self):
109
+ self.new_agent = Agent(
110
+ name=str(uuid.uuid4()),
111
+ description="Agent that translates from any language to english.",
112
+ agent_data=AgentData(
113
+ prompt=Prompt(
114
+ instructions="the user will provide a text, you must return the same text translated to english",
115
+ inputs=["text", "avoid slang indicator"]
116
+ ),
117
+ llm_config=LlmConfig(
118
+ max_tokens=1800,
119
+ timeout=0
120
+ ),
121
+ models=[Model(name="gpt-4o")]
122
+ )
123
+ )
124
+ self.created_agent = self.__create_agent()
125
+ agent = self.new_agent
126
+
127
+ self.assertIsNotNone(self.created_agent.id)
128
+ self.assertEqual(self.created_agent.name, agent.name)
129
+ self.assertEqual(self.created_agent.description, agent.description)
130
+
131
+ # Assert agentData fields
132
+ agent_data = self.created_agent.agent_data
133
+ self.assertIsNotNone(agent_data)
134
+ self.assertEqual(agent_data.llm_config.max_tokens, agent.agent_data.llm_config.max_tokens)
135
+ self.assertEqual(agent_data.llm_config.timeout, agent.agent_data.llm_config.timeout)
136
+ self.assertEqual(agent_data.models[0].name, agent.agent_data.models[0].name)
137
+
138
+ # Assert prompt fields
139
+ prompt = agent_data.prompt
140
+ self.assertEqual(prompt.instructions, agent.agent_data.prompt.instructions)
141
+ self.assertEqual(prompt.inputs, agent.agent_data.prompt.inputs)
142
+
143
+
144
+ def test_create_agent_without_required_data(self):
145
+ test_params = [ True, False ]
146
+
147
+ for auto_publish in test_params:
148
+
149
+ with self.subTest(input=auto_publish):
150
+ self.new_agent = Agent(
151
+ name=str(uuid.uuid4())
152
+ )
153
+ if auto_publish:
154
+
155
+ with self.assertRaises(APIError) as exception:
156
+ self.__create_agent(automatic_publish=auto_publish)
157
+
158
+ #TODO: Change validation error to a more specific one
159
+ self.assertIn(
160
+ "A valid prompt is required. To be valid, it must provide clear instructions to the model",
161
+ str(exception.exception)
162
+ )
163
+ else:
164
+ created_agent = self.__create_agent(automatic_publish=auto_publish)
165
+ self.assertTrue(isinstance(created_agent, Agent), "Expected a created agent")
166
+
167
+
168
+ def test_create_agent_no_name(self):
169
+ test_params = [ True, False ]
170
+
171
+ for auto_publish in test_params:
172
+ with self.subTest(input=auto_publish):
173
+ self.new_agent.name = ""
174
+ with self.assertRaises(APIError) as exception:
175
+ self.__create_agent(automatic_publish=auto_publish)
176
+
177
+ self.assertIn(
178
+ "Agent name cannot be empty.",
179
+ str(exception.exception),
180
+ f"Expected an error about the missing agent name with autopublish {'enabled' if auto_publish else 'disabled'}"
181
+ )
182
+
183
+
184
+ def test_create_agent_duplicated_name(self):
185
+ test_params = [ True, False ]
186
+
187
+ for auto_publish in test_params:
188
+
189
+ with self.subTest(input=auto_publish):
190
+ self.new_agent.name = "AritmeticaExpert"
191
+ with self.assertRaises(APIError) as exception:
192
+ self.__create_agent(automatic_publish=auto_publish)
193
+ self.assertIn(
194
+ "Agent cannot be created as it already exists [name=AritmeticaExpert].",
195
+ str(exception.exception),
196
+ f"Expected an error about duplicated agent name with autopublish {'enabled' if auto_publish else 'disabled'}"
197
+ )
198
+
199
+
200
+ def test_create_agent_invalid_name(self):
201
+ test_params = [ True, False ]
202
+
203
+ for auto_publish in test_params:
204
+ with self.subTest(input=auto_publish):
205
+ new_agent = self.__load_agent()
206
+ new_agent2 = self.__load_agent()
207
+
208
+ with self.assertRaises(APIError) as exception:
209
+ new_agent.name = f"{new_agent.name}:invalid"
210
+ self.__create_agent(agent=new_agent, automatic_publish=auto_publish)
211
+ self.assertIn(
212
+ "Invalid character in name (: is not allowed).",
213
+ str(exception.exception),
214
+ f"Expected an error about invalid character (:) in agent name with autopublish {'enabled' if auto_publish else 'disabled'}"
215
+ )
216
+
217
+ with self.assertRaises(APIError) as exception:
218
+ new_agent2.name = f"{new_agent2.name}/invalid"
219
+ self.__create_agent(agent=new_agent2, automatic_publish=auto_publish)
220
+ self.assertIn(
221
+ "Invalid character in name (/ is not allowed).",
222
+ str(exception.exception),
223
+ f"Expected an error about invalid character (/) in agent name with autopublish {'enabled' if auto_publish else 'disabled'}"
224
+ )
225
+
226
+
227
+ def test_create_agent_invalid_scope(self):
228
+ self.new_agent.access_scope = "project"
229
+ with self.assertRaises(ValueError) as exc:
230
+ self.__create_agent()
231
+ self.assertEqual(
232
+ str(exc.exception),
233
+ "Access scope must be one of public, private.",
234
+ "Expected a ValueError exception for invalid access scope"
235
+ )
236
+
237
+
238
+ def test_create_agent_default_scope(self):
239
+ self.new_agent.access_scope = None
240
+ self.created_agent = self.__create_agent()
241
+
242
+ self.assertEqual(self.created_agent.access_scope, "private", "Expected the default access scope to be 'private' when not specified")
243
+
244
+
245
+ def test_create_agent_no_public_name(self):
246
+ test_params = [ True, False ]
247
+
248
+ for auto_publish in test_params:
249
+
250
+ with self.subTest(input=auto_publish):
251
+ self.new_agent.public_name = None
252
+ with self.assertRaises(APIError) as exception:
253
+ self.__create_agent(automatic_publish=auto_publish)
254
+ self.assertIn(
255
+ "Agent publicName is required for agents with accessScope=public.",
256
+ str(exception.exception),
257
+ f"Expected an error about missing publicName for public access scope with autopublish {'enabled' if auto_publish else 'disabled'}"
258
+ )
259
+
260
+
261
+ def test_create_agent_invalid_public_name(self):
262
+ test_params = [ True, False ]
263
+
264
+ for auto_publish in test_params:
265
+ with self.subTest(input=auto_publish):
266
+ self.new_agent.public_name = self.new_agent.public_name.replace("_", "#") # Add invalid character to public name
267
+ with self.assertRaises(APIError) as exception:
268
+ self.__create_agent(automatic_publish=auto_publish)
269
+
270
+ self.assertIn(
271
+ "Invalid public name, it can only contain lowercase letters, numbers, periods (.), dashes (-), and underscores (_). Please remove any other characters.",
272
+ str(exception.exception),
273
+ f"The expected error about invalid publicName was not returned when autopublish is {'enabled' if auto_publish else 'disabled'}"
274
+ )
275
+
276
+
277
+ def test_create_agent_duplicated_public_name(self):
278
+ test_params = [ True, False ]
279
+ self.created_agent = self.__create_agent()
280
+
281
+ for auto_publish in test_params:
282
+ with self.subTest(input=auto_publish):
283
+ duplicated_pn_agent = self.__load_agent()
284
+ duplicated_pn_agent.public_name = self.created_agent.public_name
285
+
286
+ with self.assertRaises(APIError) as exception:
287
+ self.__create_agent(agent=duplicated_pn_agent, automatic_publish=auto_publish)
288
+ self.assertIn(
289
+ f"Agent already exists [publicName={self.created_agent.public_name}].",
290
+ str(exception.exception),
291
+ f"Expected an error about the duplicated public name when autopublish is {'enabled' if auto_publish else 'disabled'}"
292
+ )
293
+
294
+
295
+ def test_create_agent_no_prompt_instructions(self):
296
+ self.new_agent.agent_data.prompt.instructions = ""
297
+ self.created_agent = self.__create_agent()
298
+
299
+ self.assertTrue(
300
+ isinstance(self.created_agent, Agent),
301
+ "Expected a created agent"
302
+ )
303
+
304
+ self.assertIsNone(
305
+ self.created_agent.agent_data.prompt.instructions,
306
+ "Expected the created agent to not have prompt instructions"
307
+ )
308
+
309
+
310
+ def test_create_agent_autopublish(self):
311
+ self.created_agent = self.__create_agent(automatic_publish=True)
312
+ self.assertFalse(self.created_agent.is_draft, "Expected the agent to be published automatically")
313
+
314
+
315
+ def test_create_agent_autopublish_private_scope(self):
316
+ self.new_agent.access_scope = "private"
317
+
318
+ self.created_agent = self.__create_agent(automatic_publish=True)
319
+ self.assertFalse(self.created_agent.is_draft, "Expected the agent to be published automatically even with private scope")
@@ -0,0 +1,70 @@
1
+ from unittest import TestCase
2
+ import unittest
3
+ from pygeai.lab.managers import AILabManager
4
+ from pygeai.lab.models import SharingLink
5
+ from pygeai.core.common.exceptions import APIError, MissingRequirementException
6
+
7
+ ai_lab_manager: AILabManager
8
+
9
+ class TestAILabCreateSharingLinkIntegration(TestCase):
10
+
11
+ def setUp(self):
12
+ self.ai_lab_manager = AILabManager()
13
+ self.agent_id = "0026e53d-ea78-4cac-af9f-12650e5bb6d9"
14
+
15
+ def __create_sharing_link(self, agent_id=None):
16
+ return self.ai_lab_manager.create_sharing_link(
17
+ agent_id=self.agent_id if agent_id is None else agent_id
18
+ )
19
+
20
+ @unittest.skip("Endpoint is not found. Validate if it was deleted")
21
+ def test_create_sharing_link(self):
22
+ shared_link = self.__create_sharing_link()
23
+ self.assertIsInstance(shared_link, SharingLink, "Expected response to be an instance of SharingLink")
24
+
25
+ self.assertEqual(
26
+ shared_link.agent_id,
27
+ self.agent_id,
28
+ "Returned agentId should match the requested agent_id"
29
+ )
30
+ self.assertTrue(
31
+ shared_link.api_token.startswith("shared-"),
32
+ "apiToken should start with 'shared-'"
33
+ )
34
+ self.assertTrue(
35
+ shared_link.shared_link.startswith("https://"),
36
+ "sharedLink should be a valid URL"
37
+ )
38
+ self.assertIn(
39
+ f"agentId={self.agent_id}",
40
+ shared_link.shared_link,
41
+ "sharedLink should contain the agentId as a query parameter"
42
+ )
43
+ self.assertIn(
44
+ f"sharedToken={shared_link.api_token}",
45
+ shared_link.shared_link,
46
+ "sharedLink should contain the apiToken as sharedToken"
47
+ )
48
+
49
+
50
+ @unittest.skip("Endpoint is not found. Validate if it was deleted")
51
+ def test_create_sharing_link_no_agent_id(self):
52
+ with self.assertRaises(MissingRequirementException) as context:
53
+ self.__create_sharing_link(agent_id="")
54
+ self.assertEqual(
55
+ str(context.exception),
56
+ "agent_id must be specified in order to create sharing link",
57
+ "Expected exception for missing agent_id"
58
+ )
59
+
60
+
61
+ @unittest.skip("Endpoint is not found. Validate if it was deleted")
62
+ def test_create_sharing_link_invalid_agent_id(self):
63
+ with self.assertRaises(APIError) as exception:
64
+ invalid_id = "0026e53d-ea78-4cac-af9f-12650invalid"
65
+ self.__create_sharing_link(agent_id=invalid_id)
66
+ self.assertIn(
67
+ f"Agent not found [IdOrName= {invalid_id}].",
68
+ str(exception.exception),
69
+ "Expected error message for invalid agent id"
70
+ )
@@ -0,0 +1,75 @@
1
+ from unittest import TestCase
2
+ import uuid
3
+ from pygeai.lab.managers import AILabManager
4
+ from pygeai.lab.models import Agent, AgentData, Prompt, LlmConfig, Model
5
+ from pygeai.core.common.exceptions import InvalidAPIResponseException
6
+
7
+ ai_lab_manager: AILabManager
8
+
9
+ class TestAILabDeleteAgentIntegration(TestCase):
10
+
11
+ def setUp(self):
12
+ self.ai_lab_manager = AILabManager()
13
+
14
+
15
+ def __create_agent(self):
16
+ """
17
+ Helper to create an agent with the current project_id and ai_lab_manager.
18
+ If automatic_publish is None, do not pass it (useful for tests that omit it).
19
+ """
20
+ agent = Agent(
21
+ name=str(uuid.uuid4()),
22
+ description="Agent that translates from any language to english.",
23
+ agent_data=AgentData(
24
+ prompt=Prompt(
25
+ instructions="the user will provide a text, you must return the same text translated to english",
26
+ inputs=["text", "avoid slang indicator"]
27
+ ),
28
+ llm_config=LlmConfig(
29
+ max_tokens=1800,
30
+ timeout=0
31
+ ),
32
+ models=[Model(name="gpt-4o")]
33
+ )
34
+ )
35
+
36
+
37
+ return self.ai_lab_manager.create_agent(
38
+ agent=agent
39
+ )
40
+
41
+ def __delete_agent(self, agent_id: str):
42
+ return self.ai_lab_manager.delete_agent(
43
+ agent_id=agent_id
44
+ )
45
+
46
+
47
+ def test_delete_agent(self):
48
+ create_agent = self.__create_agent()
49
+ deleted_agent = self.__delete_agent(agent_id=create_agent.id)
50
+
51
+ self.assertEqual(
52
+ deleted_agent.content,
53
+ "Agent deleted successfully",
54
+ "Expected confirmation message after deletion"
55
+ )
56
+
57
+
58
+ def test_delete_agent_no_agent_id(self):
59
+ with self.assertRaises(InvalidAPIResponseException) as exception:
60
+ self.__delete_agent(agent_id="")
61
+
62
+ self.assertIn("405",str(exception.exception))
63
+ self.assertIn("Method Not Allowed",str(exception.exception))
64
+
65
+
66
+ def test_delete_agent_invalid_agent_id(self):
67
+ invalid_id = "0026e53d-ea78-4cac-af9f-12650invalid"
68
+ with self.assertRaises(InvalidAPIResponseException) as exception:
69
+ self.__delete_agent(agent_id=invalid_id)
70
+
71
+ self.assertIn(
72
+ f"Agent not found [IdOrName= {invalid_id}].",
73
+ str(exception.exception),
74
+ "Expected error message for invalid agent id"
75
+ )
@@ -0,0 +1,94 @@
1
+ from unittest import TestCase
2
+ from pygeai.lab.managers import AILabManager
3
+ from pygeai.lab.models import Agent, FilterSettings
4
+ from pygeai.core.common.exceptions import MissingRequirementException, APIError
5
+ import copy
6
+
7
+ ai_lab_manager: AILabManager
8
+
9
+ class TestAILabGetAgentIntegration(TestCase):
10
+ __required_attrs = [
11
+ 'id', 'status', 'name', 'access_scope', 'public_name',
12
+ 'avatar_image', 'description', 'job_description',
13
+ 'is_draft', 'is_readonly', 'revision', 'version', 'agent_data'
14
+ ]
15
+
16
+ def setUp(self):
17
+ self.ai_lab_manager = AILabManager()
18
+ self.agent_id = "0026e53d-ea78-4cac-af9f-12650e5bb6d9"
19
+ self.filter_settings = FilterSettings(
20
+ revision="0",
21
+ version="0"
22
+ )
23
+
24
+ def __get_agent(self, agent_id=None, filter_settings: FilterSettings = None):
25
+ return self.ai_lab_manager.get_agent(
26
+ agent_id=self.agent_id if agent_id is None else agent_id,
27
+ filter_settings=self.filter_settings if filter_settings is None else filter_settings
28
+ )
29
+
30
+ def test_get_agent(self):
31
+ agent = self.__get_agent()
32
+
33
+ self.assertIsInstance(agent, Agent, "Expected an agent")
34
+ for attr in self.__required_attrs:
35
+ self.assertTrue(
36
+ hasattr(agent, attr),
37
+ f"Agent should have an '{attr}' attribute"
38
+ )
39
+
40
+
41
+ def test_get_agent_no_agent_id(self):
42
+ with self.assertRaises(Exception) as context:
43
+ self.__get_agent(agent_id="")
44
+ self.assertIn(
45
+ "agent_id must be specified in order to retrieve the agent",
46
+ str(context.exception),
47
+ "Expected exception for missing agent_id"
48
+ )
49
+
50
+
51
+ def test_get_agent_invalid_agent_id(self):
52
+ invalid_id = "0026e53d-ea78-4cac-af9f-12650invalid"
53
+ with self.assertRaises(APIError) as context:
54
+ self.__get_agent(agent_id=invalid_id)
55
+ self.assertIn(
56
+ f"Agent not found [IdOrName= {invalid_id}].",
57
+ str(context.exception),
58
+ "Expected an error for invalid agent id"
59
+ )
60
+
61
+
62
+ def test_get_agent_no_revision(self):
63
+ filter_settings = copy.deepcopy(self.filter_settings)
64
+ filter_settings.revision = None
65
+ agent = self.__get_agent(filter_settings=filter_settings)
66
+
67
+ self.assertIsInstance(agent, Agent, "Expected an agent")
68
+ self.assertGreater(agent.revision, 1, "Expected agent revision to be the latest")
69
+
70
+
71
+ def test_get_agent_by_revision(self):
72
+ filter_settings = copy.deepcopy(self.filter_settings)
73
+ filter_settings.revision = "5"
74
+ agent = self.__get_agent(filter_settings=filter_settings)
75
+
76
+ self.assertEqual(5, agent.revision, "Expected agent revision to be 5")
77
+ self.assertIn("Version 2", agent.description, "Expected agent description to match the one in revision 5")
78
+
79
+
80
+ def test_get_agent_no_version(self):
81
+ filter_settings = copy.deepcopy(self.filter_settings)
82
+ filter_settings.version = None
83
+ agent = self.__get_agent(filter_settings=filter_settings)
84
+
85
+ self.assertGreater(agent.version, 1, "Expected agent version to be the latest")
86
+ self.assertIn("Latest version", agent.description, "Expected agent description to contain 'Latest version'")
87
+
88
+
89
+ def test_get_agent_by_version(self):
90
+ filter_settings = copy.deepcopy(self.filter_settings)
91
+ filter_settings.version = "1"
92
+ agent = self.__get_agent(filter_settings=filter_settings)
93
+
94
+ self.assertNotIn("Latest version", agent.description, "Expected agent description to not contain 'Latest version'")
@@ -0,0 +1,127 @@
1
+ from unittest import TestCase
2
+ import uuid
3
+ from pygeai.lab.managers import AILabManager
4
+ from pygeai.lab.models import Agent, AgentData, Prompt, PromptOutput, PromptExample, LlmConfig, Sampling, Model
5
+ from pygeai.core.common.exceptions import APIError
6
+
7
+ ai_lab_manager: AILabManager
8
+
9
+ class TestAILabPublishAgentRevisionIntegration(TestCase):
10
+
11
+ def setUp(self):
12
+ self.ai_lab_manager = AILabManager()
13
+ self.agent_id = "b4b09935-2ad2-42c0-bd55-1ee6fa4b6034"
14
+
15
+
16
+ def __publish_agent_revision(self, revision: str, agent_id=None):
17
+ return self.ai_lab_manager.publish_agent_revision(
18
+ agent_id=self.agent_id if agent_id is None else agent_id,
19
+ revision=revision
20
+ )
21
+
22
+
23
+ def __load_agent(self):
24
+ random_str = str(uuid.uuid4())
25
+ agent = Agent(
26
+ id="b4b09935-2ad2-42c0-bd55-1ee6fa4b6034",
27
+ name=f"UpdatedAgent{random_str}",
28
+ access_scope="public",
29
+ public_name=f"public_{random_str}",
30
+ job_description=f"SummarizerAgent{random_str}",
31
+ description=f"Agent that summarized documents. {random_str}",
32
+ agent_data=AgentData(
33
+ prompt=Prompt(
34
+ instructions="the user will provide a document, you must return a summary of the document.",
35
+ inputs=["text", "avoid slang indicator"],
36
+ outputs=[
37
+ PromptOutput(key="translated_text", description="translated text, with slang or not depending on the indication. in plain text.")
38
+ ],
39
+ examples=[
40
+ PromptExample(input_data="hola mundo [no-slang]", output='{"translated_text":"hello world"}'),
41
+ PromptExample(input_data="esto es una prueba pincheguey [keep-slang]", output='{"translated_text":"this is a test pal"}')
42
+ ]
43
+ ),
44
+ llm_config=LlmConfig(
45
+ max_tokens=1800,
46
+ timeout=0,
47
+ sampling=Sampling(temperature=0.3, top_k=0, top_p=0)
48
+ ),
49
+ models=[Model(name="openai/gpt-4o")]
50
+ )
51
+ )
52
+
53
+ return agent
54
+
55
+
56
+ def __update_agent(self):
57
+ """
58
+ Helper method to update agent and generate a new revision of it
59
+ """
60
+ agent = self.__load_agent()
61
+ return self.ai_lab_manager.update_agent(
62
+ agent=agent,
63
+ automatic_publish=False,
64
+ upsert=False
65
+ )
66
+
67
+
68
+ def test_publish_agent_revision(self):
69
+ new_revision = (self.__update_agent()).revision
70
+ published_agent = self.__publish_agent_revision(revision=new_revision)
71
+
72
+ self.assertFalse(published_agent.is_draft, "Expected draft to be false after publishing the revision")
73
+ self.assertEqual(published_agent.revision, new_revision, "Expected last revision to be published")
74
+
75
+
76
+ def test_publish_agent_earlier_revision_with_newer_revision_published(self):
77
+ with self.assertRaises(APIError) as exception:
78
+ self.__publish_agent_revision(revision="1")
79
+ self.assertIn(
80
+ "There are newer published revisions.",
81
+ str(exception.exception),
82
+ "Expected error when trying to send a earlier revision"
83
+ )
84
+
85
+
86
+ def test_publish_agent_earlier_revision(self):
87
+ earlier_revision = (self.__update_agent()).revision
88
+ self.__update_agent()
89
+ published_agent = self.__publish_agent_revision(revision=earlier_revision)
90
+
91
+ self.assertFalse(published_agent.is_draft, "Expected draft to be false after publishing the revision")
92
+ self.assertEqual(published_agent.revision, earlier_revision, "Expected last revision to be published")
93
+
94
+
95
+ def test_publish_agent_invalid_revision(self):
96
+ with self.assertRaises(APIError) as exception:
97
+ self.__publish_agent_revision(revision="10000000")
98
+ self.assertIn(
99
+ "Invalid revision [rev=10000000]",
100
+ str(exception.exception),
101
+ "Expected error when trying to send a revision that does not exist"
102
+ )
103
+
104
+
105
+ def test_publish_agent_string_revision(self):
106
+ with self.assertRaises(APIError) as exception:
107
+ self.__publish_agent_revision(revision="revision")
108
+ self.assertIn("Bad Request", str(exception.exception))
109
+ self.assertIn("400", str(exception.exception))
110
+
111
+
112
+ def test_publish_agent_invalid_agent_id(self):
113
+ invalid_id = "0026e53d-ea78-4cac-af9f-12650invalid"
114
+ with self.assertRaises(APIError) as exception:
115
+ self.__publish_agent_revision(revision="103", agent_id=invalid_id)
116
+ self.assertIn(
117
+ f"Agent not found [IdOrName= {invalid_id}].",
118
+ str(exception.exception),
119
+ "Expected error when sending and invalid agent id"
120
+ )
121
+
122
+
123
+ def test_publish_agent_no_agent_id(self):
124
+ with self.assertRaises(APIError) as exception:
125
+ self.__publish_agent_revision(revision="103", agent_id="")
126
+ self.assertIn("Not Found", str(exception.exception))
127
+ self.assertIn("404", str(exception.exception))