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,70 @@
1
+ from unittest import TestCase
2
+ from pygeai.lab.managers import AILabManager
3
+ from pygeai.lab.models import ReasoningStrategy
4
+ from pygeai.core.common.exceptions import APIError
5
+
6
+ ai_lab_manager: AILabManager
7
+
8
+ class TestAILabGetReasoningStrategyIntegration(TestCase):
9
+
10
+ def setUp(self):
11
+ self.ai_lab_manager = AILabManager()
12
+ self.strategy_id = "0a3b039e-25bd-4cf9-ad67-7af2b654874b"
13
+ self.strategy_name = "Chain of Thought"
14
+
15
+ def __get_reasoning_strategy(self, strategy_id = None, strategy_name = None):
16
+ return self.ai_lab_manager.get_reasoning_strategy(
17
+ reasoning_strategy_id= strategy_id if strategy_id is not None else self.strategy_id,
18
+ reasoning_strategy_name=strategy_name if strategy_name is not None else self.strategy_name
19
+ )
20
+
21
+ def test_get_reasoning_strategy_by_id(self):
22
+ strategy = self.__get_reasoning_strategy(strategy_name="")
23
+
24
+ self.assertIsInstance(strategy, ReasoningStrategy, "Expected a reasoning strategy")
25
+ self.assertEqual(strategy.id, self.strategy_id, "Expected reasoning strategy ID to match")
26
+
27
+
28
+ def test_get_reasoning_strategy_by_name(self):
29
+ strategy = self.__get_reasoning_strategy(strategy_id="")
30
+
31
+ self.assertIsInstance(strategy, ReasoningStrategy, "Expected a reasoning strategy")
32
+ self.assertEqual(
33
+ strategy.name,
34
+ self.strategy_name,
35
+ "Expected reasoning strategy name to match"
36
+ )
37
+
38
+
39
+ def test_get_reasoning_strategy_no_id_or_name(self):
40
+ with self.assertRaises(Exception) as context:
41
+ self.__get_reasoning_strategy(strategy_id="", strategy_name="")
42
+
43
+ self.assertIn(
44
+ "Either reasoning_strategy_id or reasoning_strategy_name must be provided.",
45
+ str(context.exception),
46
+ "Expected error message for missing id and name"
47
+ )
48
+
49
+
50
+ def test_get_reasoning_strategy_invalid_id(self):
51
+ invalid_id = "invalid-id-1234"
52
+ with self.assertRaises(APIError) as context:
53
+ self.__get_reasoning_strategy(strategy_id=invalid_id)
54
+ self.assertIn(
55
+ f"Reasoning-Strategy not found (idOrName={invalid_id}",
56
+ str(context.exception),
57
+ "Expected an error for invalid reasoning strategy id"
58
+ )
59
+
60
+
61
+ def test_get_reasoning_strategy_invalid_name(self):
62
+ invalid_name = "Nonexistent Strategy"
63
+ with self.assertRaises(APIError) as context:
64
+ self.__get_reasoning_strategy(strategy_id="", strategy_name=invalid_name)
65
+
66
+ self.assertIn(
67
+ f"Reasoning-Strategy not found (idOrName={invalid_name})",
68
+ str(context.exception),
69
+ "Expected an error for invalid reasoning strategy name"
70
+ )
@@ -0,0 +1,93 @@
1
+ from unittest import TestCase
2
+ from pygeai.lab.managers import AILabManager
3
+ from pygeai.lab.models import FilterSettings, ReasoningStrategyList
4
+ import copy
5
+
6
+ ai_lab_manager: AILabManager
7
+
8
+ class TestAILabListReasoningStrategiesIntegration(TestCase):
9
+
10
+ def setUp(self):
11
+ self.ai_lab_manager = AILabManager()
12
+ self.filter_settings = FilterSettings(
13
+ name="",
14
+ start=0,
15
+ count=100,
16
+ allow_external=True,
17
+ access_scope="public"
18
+ )
19
+
20
+
21
+ def __list_reasoning_strategies(self, filter_settings: FilterSettings = None):
22
+ filter_settings = filter_settings if filter_settings is not None else self.filter_settings
23
+ return self.ai_lab_manager.list_reasoning_strategies(filter_settings=filter_settings)
24
+
25
+
26
+ def test_public_list_reasoning_strategies(self):
27
+ result = self.__list_reasoning_strategies()
28
+
29
+ self.assertIsInstance(result, ReasoningStrategyList, "Expected a list of reasoning strategies")
30
+ for strategy in result.strategies:
31
+ self.assertTrue(
32
+ strategy.access_scope == "public",
33
+ "Expected all reasoning strategies to be public"
34
+ )
35
+
36
+
37
+ def test_private_list_reasoning_strategies(self):
38
+ filter_settings = copy.deepcopy(self.filter_settings)
39
+ filter_settings.access_scope = "private"
40
+ result = self.__list_reasoning_strategies(filter_settings=filter_settings)
41
+
42
+ self.assertIsInstance(result, ReasoningStrategyList, "Expected a list of reasoning strategies")
43
+ for strategy in result.strategies:
44
+ self.assertTrue(
45
+ strategy.access_scope == "private",
46
+ "Expected all reasoning strategies to be private"
47
+ )
48
+
49
+
50
+ def test_list_reasoning_strategies_small_count(self):
51
+ filter_settings = copy.deepcopy(self.filter_settings)
52
+ filter_settings.count = 2
53
+ result = self.__list_reasoning_strategies(filter_settings=filter_settings)
54
+ self.assertEqual(
55
+ len(result), 2,
56
+ "Expected list of reasoning strategies returned to be 2"
57
+ )
58
+
59
+
60
+ def test_list_reasoning_strategies_big_count(self):
61
+ filter_settings = copy.deepcopy(self.filter_settings)
62
+ filter_settings.count = 500
63
+ result = self.__list_reasoning_strategies(filter_settings=filter_settings)
64
+ self.assertLessEqual(
65
+ len(result), 500,
66
+ "Expected list of reasoning strategies returned to be 500 or less"
67
+ )
68
+
69
+
70
+ def test_list_reasoning_strategies_name_filter(self):
71
+ filter_settings = copy.deepcopy(self.filter_settings)
72
+ filter_settings.name = "Chain of Thought"
73
+ result = self.__list_reasoning_strategies(filter_settings=filter_settings)
74
+
75
+ for strategy in result.strategies:
76
+ self.assertIn(
77
+ "Chain of Thought",
78
+ strategy.name,
79
+ "Expected reasoning strategy name to contain filter value"
80
+ )
81
+
82
+
83
+ def test_list_reasoning_strategies_invalid_scope(self):
84
+ filter_settings = copy.deepcopy(self.filter_settings)
85
+ filter_settings.access_scope = "project"
86
+
87
+ with self.assertRaises(ValueError) as exception:
88
+ self.__list_reasoning_strategies(filter_settings=filter_settings)
89
+ self.assertIn(
90
+ "Access scope must be either 'public' or 'private'.",
91
+ str(exception.exception),
92
+ "The expected error about invalid scope was not returned"
93
+ )
@@ -0,0 +1,149 @@
1
+ from unittest import TestCase
2
+ import unittest
3
+ import uuid
4
+ from pygeai.lab.managers import AILabManager
5
+ from pygeai.lab.models import LocalizedDescription, ReasoningStrategy
6
+ from pydantic import ValidationError
7
+ from pygeai.core.common.exceptions import APIError, APIResponseError
8
+
9
+ class TestAILabCreateReasoningStrategyIntegration(TestCase):
10
+ def setUp(self):
11
+ """
12
+ Set up the test environment.
13
+ """
14
+ self.ai_lab_manager = AILabManager()
15
+ self.strategy_to_update = self.__load_strategy()
16
+
17
+
18
+ def __load_strategy(self):
19
+ self.random_str = str(uuid.uuid4())
20
+ return ReasoningStrategy(
21
+ id="323f5f94-5a3d-4717-89f3-3554a33c093f",
22
+ name=f"UpdatedStrategy_{self.random_str}",
23
+ system_prompt=f"Let's think step by step. {self.random_str}",
24
+ access_scope="private",
25
+ type="addendum",
26
+ localized_descriptions=[
27
+ LocalizedDescription(language="spanish", description=f"RSName spanish description {self.random_str}"),
28
+ LocalizedDescription(language="english", description=f"RSName english description {self.random_str}"),
29
+ LocalizedDescription(language="japanese", description=f"RSName japanese description {self.random_str}")
30
+ ]
31
+ )
32
+
33
+
34
+ def __update_strategy(self, strategy=None, upsert = False):
35
+ """
36
+ Helper to create a reasoning strategy using ai_lab_manager.
37
+ """
38
+ return self.ai_lab_manager.update_reasoning_strategy(
39
+ strategy=self.strategy_to_update if strategy is None else strategy,
40
+ upsert=upsert
41
+ )
42
+
43
+
44
+ def test_update_strategy_full_data(self):
45
+ self.updated_strategy = self.__update_strategy()
46
+
47
+ self.assertEqual(self.updated_strategy.name, self.strategy_to_update.name)
48
+ self.assertEqual(self.updated_strategy.system_prompt, self.strategy_to_update.system_prompt)
49
+
50
+ for locale in self.updated_strategy.localized_descriptions:
51
+ self.assertIn(
52
+ self.random_str,
53
+ locale.description,
54
+ "Expected the localized description to be updated correctly"
55
+ )
56
+
57
+
58
+ def test_update_strategy_no_name(self):
59
+ self.strategy_to_update.name = None
60
+
61
+ with self.assertRaises(APIError) as exception:
62
+ self.__update_strategy()
63
+ self.assertIn(
64
+ "ReasoningStrategy name cannot be empty",
65
+ str(exception.exception),
66
+ "The expected error about empty name was not returned"
67
+ )
68
+
69
+
70
+ def test_update_strategy_no_system_prompt(self):
71
+ self.strategy_to_update.system_prompt = None
72
+
73
+ with self.assertRaises(APIError) as exception:
74
+ self.__update_strategy()
75
+ self.assertIn(
76
+ "ReasoningStrategy template or systemPrompt are required.",
77
+ str(exception.exception),
78
+ "The expected error about empty system_prompt was not returned"
79
+ )
80
+
81
+
82
+ def test_update_strategy_no_public_name(self):
83
+ self.strategy_to_update.access_scope = "public"
84
+ with self.assertRaises(APIError) as exception:
85
+ self.__update_strategy()
86
+ self.assertIn(
87
+ "ReasoningStrategy publicName is required for public strategies",
88
+ str(exception.exception),
89
+ "The expected error about missing public name was not returned"
90
+ )
91
+
92
+
93
+ def test_update_strategy_no_access_scope(self):
94
+ self.strategy_to_update.access_scope = ""
95
+ with self.assertRaises(ValueError) as exception:
96
+ self.__update_strategy()
97
+ self.assertIn(
98
+ "Access scope must be either 'public' or 'private'",
99
+ str(exception.exception),
100
+ "The expected error about missing access scope was not returned"
101
+ )
102
+
103
+
104
+ def test_update_strategy_no_type(self):
105
+ self.strategy_to_update.type = ""
106
+ with self.assertRaises(ValueError) as exception:
107
+ self.__update_strategy()
108
+ self.assertIn(
109
+ "Type must be 'addendum'",
110
+ str(exception.exception),
111
+ "The expected error about missing type was not returned"
112
+ )
113
+
114
+
115
+ def test_update_strategy_invalid_type(self):
116
+ self.strategy_to_update.type = "strategy_type"
117
+
118
+ with self.assertRaises(ValueError) as exception:
119
+ self.__update_strategy()
120
+ self.assertIn(
121
+ "Type must be 'addendum'",
122
+ str(exception.exception),
123
+ "The expected error about missing type was not returned"
124
+ )
125
+
126
+
127
+ def test_update_strategy_no_localized_descriptions(self):
128
+ self.strategy_to_update.localized_descriptions = []
129
+ updated_strategy = self.__update_strategy()
130
+ self.assertIsNone(
131
+ updated_strategy.localized_descriptions,
132
+ "Expected no localized descriptions after update"
133
+ )
134
+
135
+ @unittest.skip("Skipping upsert test to avoid creating new strategies during routine testing before having a cleanup mechanism.")
136
+ def test_update_strategy_upsert(self):
137
+ new_id = str(uuid.uuid4())
138
+ new_strategy = ReasoningStrategy(
139
+ id=new_id,
140
+ name=f"UpsertStrategy_{self.random_str}",
141
+ system_prompt=f"Upsert system prompt {self.random_str}",
142
+ access_scope="private",
143
+ type="addendum",
144
+ localized_descriptions=[
145
+ LocalizedDescription(language="english", description=f"Upsert description {self.random_str}")
146
+ ]
147
+ )
148
+ upserted_strategy = self.__update_strategy(strategy=new_strategy, upsert=True)
149
+ self.assertEqual(upserted_strategy.id, new_id, "Expected the reasoning strategy to be created via upsert")
File without changes
@@ -0,0 +1,288 @@
1
+ from unittest import TestCase
2
+ import uuid
3
+ from pygeai.lab.managers import AILabManager
4
+ from pygeai.lab.models import Tool, ToolParameter
5
+ from pygeai.core.common.exceptions import APIResponseError
6
+
7
+
8
+ class TestAILabCreateToolIntegration(TestCase):
9
+ def setUp(self):
10
+ """
11
+ Set up the test environment.
12
+ """
13
+ self.ai_lab_manager = AILabManager()
14
+ self.new_tool = self.__load_tool()
15
+ self.created_tool: Tool = None
16
+
17
+
18
+ def tearDown(self):
19
+ """
20
+ Clean up after each test if necessary.
21
+ This can be used to delete the created tool
22
+ """
23
+ if isinstance(self.created_tool, Tool):
24
+
25
+ self.ai_lab_manager.delete_tool(self.created_tool.id)
26
+
27
+
28
+ def __load_tool(self):
29
+ return Tool(
30
+ name=str(uuid.uuid4()),
31
+ description="Tool created for sdk testing purposes",
32
+ scope="builtin",
33
+ openApi="https://raw.usercontent.com//openapi.json",
34
+ openApiJson={"openapi": "3.0.0","info": {"title": "Simple API overview","version": "2.0.0"}},
35
+ accessScope="private",
36
+ reportEvents="None",
37
+ parameters=[{"key": "param", "description": "param description", "type":"app", "value":"param value", "data_type": "String", "isRequired": False}],
38
+ )
39
+
40
+
41
+ def __create_tool(self, tool=None, automatic_publish=False):
42
+ """
43
+ Helper to create a tool using ai_lab_manager.
44
+ """
45
+ return self.ai_lab_manager.create_tool(
46
+ tool=self.new_tool if tool is None else tool,
47
+ automatic_publish=automatic_publish
48
+ )
49
+
50
+
51
+ def test_create_tool_full_data(self):
52
+ self.created_tool = self.__create_tool()
53
+ created_tool = self.created_tool
54
+ tool = self.new_tool
55
+ self.assertTrue(isinstance(created_tool, Tool), "Expected a created tool")
56
+
57
+ # Assert the main fields of the created tool
58
+ self.assertIsNotNone(created_tool.id)
59
+ self.assertEqual(created_tool.name, tool.name)
60
+ self.assertEqual(created_tool.description, tool.description)
61
+ self.assertEqual(created_tool.scope, tool.scope)
62
+ self.assertEqual(created_tool.access_scope, tool.access_scope)
63
+ self.assertEqual(created_tool.open_api, tool.open_api)
64
+ self.assertEqual(created_tool.status, "active")
65
+
66
+ # Assert agentData fields
67
+ tool_param = created_tool.parameters[0]
68
+ self.assertTrue(isinstance(tool_param, ToolParameter), "Expected parameters to be of type ToolParameter")
69
+ self.assertEqual(tool_param.key, tool.parameters[0].key)
70
+ self.assertEqual(tool_param.data_type, tool.parameters[0].data_type)
71
+ self.assertEqual(tool_param.description, tool.parameters[0].description)
72
+ self.assertEqual(tool_param.is_required, tool.parameters[0].is_required)
73
+ self.assertEqual(tool_param.type, tool.parameters[0].type)
74
+ self.assertEqual(tool_param.value, tool.parameters[0].value)
75
+
76
+
77
+ def test_create_tool_minimum_required_data(self):
78
+ self.new_tool = Tool(
79
+ name=str(uuid.uuid4()),
80
+ description="Tool created for sdk testing purposes",
81
+ scope="builtin"
82
+ )
83
+ self.created_tool = self.__create_tool()
84
+ tool = self.new_tool
85
+
86
+ self.assertIsNotNone(self.created_tool.id)
87
+ self.assertEqual(self.created_tool.name, tool.name)
88
+ self.assertEqual(self.created_tool.description, tool.description)
89
+
90
+
91
+ def test_create_tool_without_required_data(self):
92
+ test_params = [ True, False ]
93
+
94
+ for auto_publish in test_params:
95
+
96
+ with self.subTest(input=auto_publish):
97
+ self.new_tool = Tool(
98
+ name=str(uuid.uuid4())
99
+ )
100
+ created_tool = self.__create_tool(automatic_publish=auto_publish)
101
+ self.assertTrue(isinstance(created_tool, Tool), "Expected a created tool")
102
+
103
+
104
+ def test_create_tool_no_name(self):
105
+ test_params = [ True, False ]
106
+
107
+ for auto_publish in test_params:
108
+ with self.subTest(input=auto_publish):
109
+ self.new_tool.name = ""
110
+ with self.assertRaises(APIResponseError) as exception:
111
+ self.__create_tool(automatic_publish=auto_publish)
112
+
113
+ self.assertIn(
114
+ "Tool name cannot be empty.",
115
+ str(exception.exception),
116
+ f"Expected an error about the missing tool name with autopublish {'enabled' if auto_publish else 'disabled'}"
117
+ )
118
+
119
+
120
+ def test_create_tool_duplicated_name(self):
121
+ test_params = [ True, False ]
122
+
123
+ for auto_publish in test_params:
124
+
125
+ with self.subTest(input=auto_publish):
126
+ self.new_tool.name = "sdk_project_gemini_tool"
127
+ with self.assertRaises(APIResponseError) as exception:
128
+ self.__create_tool(automatic_publish=auto_publish)
129
+ self.assertIn(
130
+ "Tool already exists [name=sdk_project_gemini_tool]..",
131
+ str(exception.exception),
132
+ f"Expected an error about duplicated tool name with autopublish {'enabled' if auto_publish else 'disabled'}"
133
+ )
134
+
135
+
136
+ def test_create_tool_invalid_name(self):
137
+ test_params = [ True, False ]
138
+
139
+ for auto_publish in test_params:
140
+ with self.subTest(input=auto_publish):
141
+ new_tool = self.__load_tool()
142
+ new_tool2 = self.__load_tool()
143
+
144
+ with self.assertRaises(APIResponseError) as exception:
145
+ new_tool.name = f"{new_tool.name}:invalid"
146
+ self.__create_tool(tool=new_tool, automatic_publish=auto_publish)
147
+ self.assertIn(
148
+ "Invalid character in name (: is not allowed).",
149
+ str(exception.exception),
150
+ f"Expected an error about invalid character (:) in tool name with autopublish {'enabled' if auto_publish else 'disabled'}"
151
+ )
152
+
153
+ with self.assertRaises(APIResponseError) as exception:
154
+ new_tool2.name = f"{new_tool2.name}/invalid"
155
+ self.__create_tool(tool=new_tool2, automatic_publish=auto_publish)
156
+ self.assertIn(
157
+ "Invalid character in name (/ is not allowed).",
158
+ str(exception.exception),
159
+ f"Expected an error about invalid character (/) in tool name with autopublish {'enabled' if auto_publish else 'disabled'}"
160
+ )
161
+
162
+
163
+ def test_create_tool_invalid_access_scope(self):
164
+ self.new_tool.access_scope = "project"
165
+ with self.assertRaises(ValueError) as exc:
166
+ self.__create_tool()
167
+ self.assertEqual(
168
+ str(exc.exception),
169
+ "Access scope must be one of public, private.",
170
+ "Expected a ValueError exception for invalid access scope"
171
+ )
172
+
173
+
174
+ def test_create_tool_default_scope(self):
175
+ self.new_tool.access_scope = None
176
+ self.created_tool = self.__create_tool()
177
+
178
+ self.assertEqual(self.created_tool.access_scope, "private", "Expected the default access scope to be 'private' when not specified")
179
+
180
+
181
+ def test_create_tool_no_public_name(self):
182
+ test_params = [ True, False ]
183
+
184
+ for auto_publish in test_params:
185
+
186
+ with self.subTest(input=auto_publish):
187
+ self.new_tool.access_scope = "public"
188
+ self.new_tool.public_name = None
189
+ with self.assertRaises(APIResponseError) as exception:
190
+ self.__create_tool(automatic_publish=auto_publish)
191
+ self.assertIn(
192
+ "Tool publicName is required for tools with accessScope=public.",
193
+ str(exception.exception),
194
+ f"Expected an error about missing publicName for public access scope with autopublish {'enabled' if auto_publish else 'disabled'}"
195
+ )
196
+
197
+
198
+ def test_create_tool_invalid_public_name(self):
199
+ test_params = [ True, False ]
200
+
201
+ for auto_publish in test_params:
202
+ with self.subTest(input=auto_publish):
203
+ self.new_tool.access_scope = "public"
204
+ self.new_tool.public_name = "com.sdk.testing#" # Add invalid character to public name
205
+ with self.assertRaises(APIResponseError) as exception:
206
+ self.__create_tool(automatic_publish=auto_publish)
207
+
208
+ self.assertIn(
209
+ "Invalid public name, it can only contain lowercase letters, numbers, periods (.), dashes (-), and underscores (_). Please remove any other characters.",
210
+ str(exception.exception),
211
+ f"The expected error about invalid publicName was not returned when autopublish is {'enabled' if auto_publish else 'disabled'}"
212
+ )
213
+
214
+
215
+ def test_create_tool_duplicated_public_name(self):
216
+ test_params = [ True, False ]
217
+
218
+ # Set the scope as public and assign a public name
219
+ self.new_tool.access_scope = "public"
220
+ self.new_tool.public_name=f"public_{self.new_tool.name}"
221
+ self.created_tool = self.__create_tool()
222
+
223
+ for auto_publish in test_params:
224
+ with self.subTest(input=auto_publish):
225
+
226
+ # Create a new with the same public name of created_tool
227
+ duplicated_pn_tool = self.__load_tool()
228
+ duplicated_pn_tool.access_scope = "public"
229
+ duplicated_pn_tool.public_name = self.created_tool.public_name
230
+
231
+ with self.assertRaises(APIResponseError) as exception:
232
+ self.__create_tool(tool=duplicated_pn_tool, automatic_publish=auto_publish)
233
+ self.assertIn(
234
+ f"Tool already exists [publicName={self.created_tool.public_name}].",
235
+ str(exception.exception),
236
+ f"Expected an error about the duplicated public name when autopublish is {'enabled' if auto_publish else 'disabled'}"
237
+ )
238
+
239
+
240
+ def test_create_tool_api_scope_with_no_open_api(self):
241
+ self.new_tool.scope = "api"
242
+ with self.assertRaises(ValueError) as exception:
243
+ self.new_tool.openApi = ""
244
+ self.assertIn(
245
+ '"Tool" object has no field "openApi"',
246
+ str(exception.exception),
247
+ "Expected a validation error when openApi is not provided for api scope"
248
+ )
249
+
250
+
251
+ def test_create_tool_api_scope_with_no_open_api_json(self):
252
+ self.new_tool.scope = "api"
253
+ with self.assertRaises(ValueError) as exception:
254
+ self.new_tool.openApiJson = ""
255
+
256
+ self.assertIn(
257
+ '"Tool" object has no field "openApiJson"',
258
+ str(exception.exception),
259
+ "Expected a validation error when openApiJson is not provided for api scope"
260
+ )
261
+
262
+
263
+ def test_create_tool_invalid_scope(self):
264
+ test_params = [ True, False ]
265
+
266
+ for auto_publish in test_params:
267
+ with self.subTest(input=auto_publish):
268
+
269
+ with self.assertRaises(ValueError) as exception:
270
+ self.new_tool.scope = "source"
271
+ self.__create_tool()
272
+ self.assertIn(
273
+ 'Scope must be one of builtin, external, api, proxied',
274
+ str(exception.exception),
275
+ "Expected a validation error about allowed values for instructions"
276
+ )
277
+
278
+
279
+ def test_create_tool_autopublish(self):
280
+ self.created_tool = self.__create_tool(automatic_publish=True)
281
+ self.assertFalse(self.created_tool.is_draft, "Expected the tool to be published automatically")
282
+
283
+
284
+ def test_create_tool_autopublish_private_scope(self):
285
+ self.new_tool.access_scope = "private"
286
+
287
+ self.created_tool = self.__create_tool(automatic_publish=True)
288
+ self.assertFalse(self.created_tool.is_draft, "Expected the tool to be published automatically even with private scope")
@@ -0,0 +1,87 @@
1
+ from unittest import TestCase
2
+ import uuid
3
+ from pygeai.lab.managers import AILabManager
4
+ from pygeai.lab.models import Tool
5
+ from pygeai.core.common.exceptions import APIResponseError, MissingRequirementException, InvalidAPIResponseException
6
+
7
+ ai_lab_manager: AILabManager
8
+
9
+ class TestAILabDeleteToolIntegration(TestCase):
10
+
11
+ def setUp(self):
12
+ self.ai_lab_manager = AILabManager()
13
+
14
+
15
+ def __create_tool(self):
16
+ """
17
+ Helper to create a tool
18
+ """
19
+ tool = Tool(
20
+ name=str(uuid.uuid4()),
21
+ description="Agent that translates from any language to english.",
22
+ scope="builtin"
23
+ )
24
+
25
+
26
+ return self.ai_lab_manager.create_tool(
27
+ tool=tool
28
+ )
29
+
30
+ def __delete_tool(self, tool_id: str = None, tool_name: str = None):
31
+ return self.ai_lab_manager.delete_tool(tool_id=tool_id, tool_name=tool_name)
32
+
33
+
34
+ def test_delete_tool_by_id(self):
35
+ created_tool = self.__create_tool()
36
+ deleted_tool = self.__delete_tool(tool_id=created_tool.id)
37
+
38
+ self.assertEqual(
39
+ deleted_tool.content,
40
+ "Tool deleted successfully",
41
+ "Expected confirmation message after deletion"
42
+ )
43
+
44
+
45
+ def test_delete_tool_by_name(self):
46
+ created_tool = self.__create_tool()
47
+ deleted_tool = self.__delete_tool(tool_name=created_tool.name)
48
+
49
+ self.assertEqual(
50
+ deleted_tool.content,
51
+ "Tool deleted successfully",
52
+ "Expected confirmation message after deletion"
53
+ )
54
+
55
+
56
+ def test_delete_tool_no_id_nor_name(self):
57
+ with self.assertRaises(MissingRequirementException) as exception:
58
+ self.__delete_tool()
59
+ self.assertIn(
60
+ "Either tool_id or tool_name must be provided",
61
+ str(exception.exception),
62
+ "Expected error message when neither tool_id nor tool_name is provided"
63
+ )
64
+
65
+
66
+ def test_delete_tool_invalid_id_valid_name(self):
67
+ invalid_id = "0026e53d-ea78-4cac-af9f-12650invalid"
68
+ created_tool = self.__create_tool()
69
+ with self.assertRaises(APIResponseError) as exception:
70
+ self.__delete_tool(tool_name=created_tool.name, tool_id=invalid_id)
71
+
72
+ self.assertIn(
73
+ f"Tool not found [IdOrName= {invalid_id}].",
74
+ str(exception.exception),
75
+ "Expected error message for valid tool name and invalid tool id"
76
+ )
77
+
78
+
79
+ def test_delete_tool_invalid_name_valid_id(self):
80
+ created_tool = self.__create_tool()
81
+ deleted_tool = self.__delete_tool(tool_id=created_tool.id, tool_name="toolName")
82
+
83
+ self.assertEqual(
84
+ deleted_tool.content,
85
+ "Tool deleted successfully",
86
+ "Expected confirmation message after deletion"
87
+ )