pygeai 0.1.51b3__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 (648) hide show
  1. pygeai/__init__.py +9 -1
  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 +18 -45
  146. pygeai/assistant/data/clients.py +1 -0
  147. pygeai/assistant/data_analyst/clients.py +8 -12
  148. pygeai/assistant/managers.py +195 -157
  149. pygeai/assistant/mappers.py +4 -2
  150. pygeai/assistant/rag/clients.py +27 -67
  151. pygeai/assistant/rag/mappers.py +12 -6
  152. pygeai/assistant/rag/models.py +301 -159
  153. pygeai/auth/__init__.py +0 -0
  154. pygeai/auth/clients.py +129 -0
  155. pygeai/auth/endpoints.py +6 -0
  156. pygeai/chat/clients.py +308 -37
  157. pygeai/chat/endpoints.py +3 -0
  158. pygeai/chat/iris.py +2 -8
  159. pygeai/chat/managers.py +9 -6
  160. pygeai/chat/session.py +38 -0
  161. pygeai/chat/settings.py +6 -0
  162. pygeai/chat/ui.py +678 -0
  163. pygeai/cli/__init__.py +0 -1
  164. pygeai/cli/commands/admin.py +7 -10
  165. pygeai/cli/commands/analytics.py +533 -0
  166. pygeai/cli/commands/assistant.py +9 -9
  167. pygeai/cli/commands/auth.py +299 -0
  168. pygeai/cli/commands/base.py +71 -9
  169. pygeai/cli/commands/chat.py +676 -19
  170. pygeai/cli/commands/common.py +28 -24
  171. pygeai/cli/commands/configuration.py +66 -13
  172. pygeai/cli/commands/docs.py +105 -0
  173. pygeai/cli/commands/embeddings.py +58 -11
  174. pygeai/cli/commands/evaluation.py +38 -38
  175. pygeai/cli/commands/feedback.py +3 -4
  176. pygeai/cli/commands/files.py +7 -8
  177. pygeai/cli/commands/gam.py +85 -10
  178. pygeai/cli/commands/lab/ai_lab.py +340 -484
  179. pygeai/cli/commands/lab/options.py +8 -0
  180. pygeai/cli/commands/lab/spec.py +273 -0
  181. pygeai/cli/commands/lab/utils.py +13 -0
  182. pygeai/cli/commands/llm.py +6 -7
  183. pygeai/cli/commands/migrate.py +1064 -436
  184. pygeai/cli/commands/organization.py +516 -11
  185. pygeai/cli/commands/rag.py +13 -14
  186. pygeai/cli/commands/rerank.py +3 -5
  187. pygeai/cli/commands/secrets.py +8 -9
  188. pygeai/cli/commands/usage_limits.py +18 -20
  189. pygeai/cli/commands/validators.py +144 -1
  190. pygeai/cli/commands/version.py +4 -5
  191. pygeai/cli/error_handler.py +151 -0
  192. pygeai/cli/geai.py +170 -31
  193. pygeai/cli/geai_proxy.py +86 -25
  194. pygeai/cli/install_man.py +93 -22
  195. pygeai/cli/parsers.py +75 -25
  196. pygeai/cli/texts/help.py +265 -28
  197. pygeai/core/base/clients.py +53 -12
  198. pygeai/core/base/mappers.py +11 -2
  199. pygeai/core/base/session.py +95 -11
  200. pygeai/core/common/config.py +78 -14
  201. pygeai/core/common/exceptions.py +96 -6
  202. pygeai/core/embeddings/__init__.py +19 -0
  203. pygeai/core/embeddings/clients.py +23 -5
  204. pygeai/core/embeddings/managers.py +9 -4
  205. pygeai/core/embeddings/mappers.py +16 -2
  206. pygeai/core/embeddings/responses.py +9 -2
  207. pygeai/core/feedback/clients.py +8 -3
  208. pygeai/core/files/clients.py +23 -24
  209. pygeai/core/files/managers.py +121 -30
  210. pygeai/core/files/responses.py +4 -3
  211. pygeai/core/handlers.py +10 -1
  212. pygeai/core/llm/clients.py +22 -29
  213. pygeai/core/models.py +127 -11
  214. pygeai/core/plugins/clients.py +6 -6
  215. pygeai/core/rerank/clients.py +9 -3
  216. pygeai/core/rerank/managers.py +22 -5
  217. pygeai/core/secrets/clients.py +16 -37
  218. pygeai/core/services/response.py +18 -0
  219. pygeai/core/services/rest.py +159 -49
  220. pygeai/core/utils/__init__.py +0 -0
  221. pygeai/core/utils/console.py +83 -0
  222. pygeai/core/utils/parsers.py +32 -0
  223. pygeai/core/utils/validators.py +10 -0
  224. pygeai/dbg/__init__.py +3 -0
  225. pygeai/dbg/debugger.py +854 -14
  226. pygeai/evaluation/clients.py +7 -4
  227. pygeai/evaluation/dataset/clients.py +46 -44
  228. pygeai/evaluation/plan/clients.py +28 -26
  229. pygeai/evaluation/result/clients.py +38 -5
  230. pygeai/gam/clients.py +50 -28
  231. pygeai/gam/endpoints.py +2 -1
  232. pygeai/health/__init__.py +0 -0
  233. pygeai/health/clients.py +24 -0
  234. pygeai/health/endpoints.py +1 -0
  235. pygeai/lab/__init__.py +0 -90
  236. pygeai/lab/agents/clients.py +203 -162
  237. pygeai/lab/agents/endpoints.py +4 -0
  238. pygeai/lab/agents/mappers.py +57 -7
  239. pygeai/lab/clients.py +24 -0
  240. pygeai/lab/constants.py +3 -0
  241. pygeai/lab/managers.py +571 -541
  242. pygeai/lab/models.py +108 -19
  243. pygeai/lab/processes/clients.py +332 -340
  244. pygeai/lab/processes/mappers.py +3 -3
  245. pygeai/lab/runners.py +90 -0
  246. pygeai/lab/spec/__init__.py +0 -0
  247. pygeai/lab/spec/loader.py +24 -0
  248. pygeai/lab/spec/parsers.py +39 -0
  249. pygeai/lab/strategies/clients.py +67 -63
  250. pygeai/lab/strategies/mappers.py +1 -1
  251. pygeai/lab/tools/clients.py +85 -118
  252. pygeai/lab/tools/endpoints.py +4 -0
  253. pygeai/lab/tools/mappers.py +5 -5
  254. pygeai/man/man1/geai-proxy.1 +116 -0
  255. pygeai/man/man1/geai.1 +2580 -66
  256. pygeai/migration/__init__.py +33 -0
  257. pygeai/migration/strategies.py +468 -146
  258. pygeai/migration/tools.py +170 -3
  259. pygeai/organization/clients.py +245 -50
  260. pygeai/organization/endpoints.py +17 -8
  261. pygeai/organization/limits/clients.py +34 -32
  262. pygeai/organization/limits/managers.py +108 -49
  263. pygeai/organization/managers.py +347 -53
  264. pygeai/organization/mappers.py +102 -2
  265. pygeai/organization/responses.py +58 -1
  266. pygeai/proxy/clients.py +6 -3
  267. pygeai/proxy/config.py +14 -1
  268. pygeai/proxy/managers.py +61 -33
  269. pygeai/proxy/servers.py +196 -51
  270. pygeai/proxy/tool.py +33 -16
  271. pygeai/tests/admin/__init__.py +0 -0
  272. pygeai/tests/admin/test_clients.py +148 -0
  273. pygeai/tests/analytics/__init__.py +0 -0
  274. pygeai/tests/analytics/test_clients.py +86 -0
  275. pygeai/tests/analytics/test_managers.py +94 -0
  276. pygeai/tests/analytics/test_mappers.py +84 -0
  277. pygeai/tests/analytics/test_responses.py +73 -0
  278. pygeai/tests/assistants/rag/test_clients.py +346 -0
  279. pygeai/tests/assistants/rag/test_models.py +292 -0
  280. pygeai/tests/assistants/test_clients.py +176 -82
  281. pygeai/tests/assistants/test_managers.py +191 -57
  282. pygeai/tests/auth/__init__.py +0 -0
  283. pygeai/tests/auth/test_clients.py +289 -0
  284. pygeai/tests/auth/test_oauth.py +172 -0
  285. pygeai/tests/auth/test_session_logging.py +150 -0
  286. pygeai/tests/chat/__init__.py +0 -0
  287. pygeai/tests/chat/test_clients.py +393 -0
  288. pygeai/tests/chat/test_iris.py +38 -0
  289. pygeai/tests/chat/test_session.py +62 -0
  290. pygeai/tests/chat/test_ui.py +224 -0
  291. pygeai/tests/cli/commands/__init__.py +0 -0
  292. pygeai/tests/cli/commands/lab/__init__.py +0 -0
  293. pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
  294. pygeai/tests/cli/commands/lab/test_common.py +208 -0
  295. pygeai/tests/cli/commands/lab/test_spec.py +246 -0
  296. pygeai/tests/cli/commands/test_assistant.py +202 -0
  297. pygeai/tests/cli/commands/test_chat.py +130 -0
  298. pygeai/tests/cli/commands/test_common.py +350 -0
  299. pygeai/tests/cli/commands/test_embeddings.py +132 -0
  300. pygeai/tests/cli/commands/test_evaluation.py +656 -0
  301. pygeai/tests/cli/commands/test_feedback.py +65 -0
  302. pygeai/tests/cli/commands/test_files.py +161 -0
  303. pygeai/tests/cli/commands/test_gam.py +201 -0
  304. pygeai/tests/cli/commands/test_llm.py +114 -0
  305. pygeai/tests/cli/commands/test_migrate.py +176 -0
  306. pygeai/tests/cli/commands/test_organization.py +276 -0
  307. pygeai/tests/cli/commands/test_rag.py +266 -0
  308. pygeai/tests/cli/commands/test_rerank.py +110 -0
  309. pygeai/tests/cli/commands/test_secrets.py +171 -0
  310. pygeai/tests/cli/commands/test_show_help.py +41 -0
  311. pygeai/tests/cli/commands/test_usage_limits.py +412 -0
  312. pygeai/tests/cli/commands/test_validators.py +160 -0
  313. pygeai/tests/cli/commands/test_version.py +81 -0
  314. pygeai/tests/cli/docker/__init__.py +0 -0
  315. pygeai/tests/cli/test_credentials_flag.py +316 -0
  316. pygeai/tests/cli/test_error_handler.py +225 -0
  317. pygeai/tests/cli/test_geai_driver.py +154 -0
  318. pygeai/tests/cli/test_parsers.py +5 -5
  319. pygeai/tests/core/base/data/models.py +7 -0
  320. pygeai/tests/core/base/test_mappers.py +43 -11
  321. pygeai/tests/core/base/test_models.py +3 -1
  322. pygeai/tests/core/base/test_responses.py +53 -0
  323. pygeai/tests/core/common/__init__.py +0 -0
  324. pygeai/tests/core/common/data/__init__.py +0 -0
  325. pygeai/tests/core/common/test_config.py +186 -0
  326. pygeai/tests/core/common/test_decorators.py +69 -0
  327. pygeai/tests/core/embeddings/__init__.py +0 -0
  328. pygeai/tests/core/embeddings/test_clients.py +225 -0
  329. pygeai/tests/core/embeddings/test_managers.py +171 -0
  330. pygeai/tests/core/embeddings/test_mappers.py +142 -0
  331. pygeai/tests/core/feedback/__init__.py +0 -0
  332. pygeai/tests/core/feedback/test_clients.py +64 -0
  333. pygeai/tests/core/files/test_clients.py +128 -0
  334. pygeai/tests/core/files/test_managers.py +124 -78
  335. pygeai/tests/core/files/test_mappers.py +137 -0
  336. pygeai/tests/core/files/test_models.py +103 -0
  337. pygeai/tests/core/files/test_responses.py +122 -0
  338. pygeai/tests/core/llm/__init__.py +0 -0
  339. pygeai/tests/core/llm/test_clients.py +142 -0
  340. pygeai/tests/core/plugins/__init__.py +0 -0
  341. pygeai/tests/core/plugins/test_clients.py +66 -0
  342. pygeai/tests/core/rerank/test_clients.py +76 -0
  343. pygeai/tests/core/rerank/test_managers.py +61 -39
  344. pygeai/tests/core/secrets/__init__.py +0 -0
  345. pygeai/tests/core/secrets/test_clients.py +264 -0
  346. pygeai/tests/core/services/__init__.py +0 -0
  347. pygeai/tests/core/services/test_rest.py +273 -0
  348. pygeai/tests/core/test_handlers.py +66 -0
  349. pygeai/tests/core/utils/__init__.py +0 -0
  350. pygeai/tests/core/utils/test_console.py +80 -0
  351. pygeai/tests/dbg/__init__.py +0 -0
  352. pygeai/tests/dbg/test_debugger.py +591 -0
  353. pygeai/tests/evaluation/__init__.py +0 -0
  354. pygeai/tests/evaluation/dataset/__init__.py +0 -0
  355. pygeai/tests/evaluation/dataset/test_clients.py +265 -0
  356. pygeai/tests/evaluation/plan/__init__.py +0 -0
  357. pygeai/tests/evaluation/plan/test_clients.py +195 -0
  358. pygeai/tests/evaluation/result/__init__.py +0 -0
  359. pygeai/tests/evaluation/result/test_clients.py +66 -0
  360. pygeai/tests/gam/__init__.py +0 -0
  361. pygeai/tests/gam/test_clients.py +195 -0
  362. pygeai/tests/health/__init__.py +0 -0
  363. pygeai/tests/health/test_clients.py +41 -0
  364. pygeai/tests/integration/__init__.py +0 -0
  365. pygeai/tests/integration/assistants/__init__.py +0 -0
  366. pygeai/tests/integration/assistants/rag/__init__.py +0 -0
  367. pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
  368. pygeai/tests/integration/chat/__init__.py +0 -0
  369. pygeai/tests/integration/chat/test_generate_image.py +158 -0
  370. pygeai/tests/integration/lab/__init__.py +0 -0
  371. pygeai/tests/integration/lab/agents/__init__.py +0 -0
  372. pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
  373. pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
  374. pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
  375. pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
  376. pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
  377. pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
  378. pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
  379. pygeai/tests/integration/lab/processes/__init__.py +0 -0
  380. pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
  381. pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
  382. pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
  383. pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
  384. pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
  385. pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
  386. pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
  387. pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
  388. pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
  389. pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
  390. pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
  391. pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
  392. pygeai/tests/integration/lab/tools/__init__.py +0 -0
  393. pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
  394. pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
  395. pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
  396. pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
  397. pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
  398. pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
  399. pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
  400. pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
  401. pygeai/tests/lab/agents/__init__.py +0 -0
  402. pygeai/tests/lab/agents/test_clients.py +481 -0
  403. pygeai/tests/lab/agents/test_mappers.py +440 -0
  404. pygeai/tests/lab/processes/__init__.py +0 -0
  405. pygeai/tests/lab/processes/test_clients.py +1416 -0
  406. pygeai/tests/lab/processes/test_mappers.py +1092 -0
  407. pygeai/tests/lab/spec/__init__.py +0 -0
  408. pygeai/tests/lab/spec/test_loader.py +59 -0
  409. pygeai/tests/lab/spec/test_parsers.py +182 -0
  410. pygeai/tests/lab/strategies/__init__.py +0 -0
  411. pygeai/tests/lab/strategies/test_clients.py +241 -0
  412. pygeai/tests/lab/strategies/test_mappers.py +132 -0
  413. pygeai/tests/lab/test_managers.py +553 -0
  414. pygeai/tests/lab/test_models.py +500 -3
  415. pygeai/tests/lab/tools/__init__.py +0 -0
  416. pygeai/tests/lab/tools/test_clients.py +521 -0
  417. pygeai/tests/lab/tools/test_mappers.py +198 -0
  418. pygeai/tests/migration/__init__.py +0 -0
  419. pygeai/tests/migration/test_strategies.py +405 -0
  420. pygeai/tests/migration/test_tools.py +159 -0
  421. pygeai/tests/organization/limits/test_clients.py +567 -0
  422. pygeai/tests/organization/limits/test_managers.py +298 -56
  423. pygeai/tests/organization/test_clients.py +600 -30
  424. pygeai/tests/organization/test_managers.py +424 -0
  425. pygeai/tests/organization/test_mappers.py +153 -0
  426. pygeai/tests/organization/test_responses.py +137 -0
  427. pygeai/tests/proxy/__init__.py +1 -0
  428. pygeai/tests/proxy/test_clients.py +397 -0
  429. pygeai/tests/proxy/test_config.py +171 -0
  430. pygeai/tests/proxy/test_integration.py +305 -0
  431. pygeai/tests/proxy/test_managers.py +312 -0
  432. pygeai/tests/proxy/test_servers.py +387 -0
  433. pygeai/tests/proxy/test_tool.py +176 -0
  434. pygeai/tests/snippets/analytics/__init__.py +0 -0
  435. pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
  436. pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
  437. pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
  438. pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
  439. pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
  440. pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
  441. pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
  442. pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
  443. pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
  444. pygeai/tests/snippets/auth/__init__.py +0 -0
  445. pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
  446. pygeai/tests/snippets/chat/get_response.py +15 -0
  447. pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
  448. pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
  449. pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
  450. pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
  451. pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
  452. pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
  453. pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
  454. pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
  455. pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
  456. pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
  457. pygeai/tests/snippets/dbg/__init__.py +0 -0
  458. pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
  459. pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
  460. pygeai/tests/snippets/dbg/file_debugging.py +72 -0
  461. pygeai/tests/snippets/dbg/module_debugging.py +61 -0
  462. pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
  463. pygeai/tests/snippets/dbg/stepping_example.py +40 -0
  464. pygeai/tests/snippets/embeddings/cache_example.py +31 -0
  465. pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
  466. pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
  467. pygeai/tests/snippets/embeddings/openai_example.py +30 -0
  468. pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
  469. pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
  470. pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
  471. pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
  472. pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
  473. pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
  474. pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
  475. pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
  476. pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
  477. pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
  478. pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
  479. pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
  480. pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
  481. pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
  482. pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
  483. pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
  484. pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
  485. pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
  486. pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
  487. pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
  488. pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
  489. pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
  490. pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
  491. pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
  492. pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
  493. pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
  494. pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
  495. pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
  496. pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
  497. pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
  498. pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
  499. pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
  500. pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
  501. pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
  502. pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
  503. pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
  504. pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
  505. pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
  506. pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
  507. pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
  508. pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
  509. pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
  510. pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
  511. pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
  512. pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
  513. pygeai/tests/snippets/files/delete_file.py +1 -4
  514. pygeai/tests/snippets/files/get_file_content.py +2 -4
  515. pygeai/tests/snippets/files/get_file_data.py +1 -4
  516. pygeai/tests/snippets/files/get_file_list.py +1 -6
  517. pygeai/tests/snippets/files/upload_file.py +1 -5
  518. pygeai/tests/snippets/gam/gam_access_token.py +87 -0
  519. pygeai/tests/snippets/lab/agentic_flow_example_1.py +25 -23
  520. pygeai/tests/snippets/lab/agentic_flow_example_4.py +23 -23
  521. pygeai/tests/snippets/lab/agents/create_agent.py +5 -8
  522. pygeai/tests/snippets/lab/agents/create_agent_2.py +1 -5
  523. pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
  524. pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
  525. pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
  526. pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
  527. pygeai/tests/snippets/lab/agents/delete_agent.py +1 -5
  528. pygeai/tests/snippets/lab/agents/get_agent.py +2 -11
  529. pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
  530. pygeai/tests/snippets/lab/agents/get_sharing_link.py +2 -7
  531. pygeai/tests/snippets/lab/agents/list_agents.py +4 -7
  532. pygeai/tests/snippets/lab/agents/publish_agent_revision.py +2 -6
  533. pygeai/tests/snippets/lab/agents/update_agent.py +1 -5
  534. pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
  535. pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
  536. pygeai/tests/snippets/lab/crud_ui.py +462 -0
  537. pygeai/tests/snippets/lab/processes/create_process.py +3 -5
  538. pygeai/tests/snippets/lab/processes/create_task.py +3 -5
  539. pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +10 -19
  540. pygeai/tests/snippets/lab/processes/kbs/create_kb.py +2 -5
  541. pygeai/tests/snippets/lab/processes/kbs/get_kb.py +10 -16
  542. pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +13 -20
  543. pygeai/tests/snippets/lab/processes/kbs/try_all.py +5 -7
  544. pygeai/tests/snippets/lab/processes/list_processes.py +5 -7
  545. pygeai/tests/snippets/lab/runner_1.py +1 -1
  546. pygeai/tests/snippets/lab/samples/summarize_files.py +3 -3
  547. pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +2 -5
  548. pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +2 -5
  549. pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +3 -6
  550. pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +2 -5
  551. pygeai/tests/snippets/lab/tools/create_tool.py +4 -10
  552. pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
  553. pygeai/tests/snippets/lab/tools/delete_tool.py +2 -6
  554. pygeai/tests/snippets/lab/tools/get_parameter.py +5 -7
  555. pygeai/tests/snippets/lab/tools/get_tool.py +5 -7
  556. pygeai/tests/snippets/lab/tools/list_tools.py +3 -7
  557. pygeai/tests/snippets/lab/tools/publish_tool_revision.py +3 -5
  558. pygeai/tests/snippets/lab/tools/set_parameters.py +4 -9
  559. pygeai/tests/snippets/lab/tools/update_tool.py +4 -8
  560. pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
  561. pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
  562. pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
  563. pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
  564. pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
  565. pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
  566. pygeai/tests/snippets/lab/{file_summarizer_example.py → use_cases/file_summarizer_example.py} +3 -3
  567. pygeai/tests/snippets/lab/{file_summarizer_example_2.py → use_cases/file_summarizer_example_2.py} +12 -12
  568. pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
  569. pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
  570. pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
  571. pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
  572. pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
  573. pygeai/tests/snippets/migrate/__init__.py +45 -0
  574. pygeai/tests/snippets/migrate/agent_migration.py +110 -0
  575. pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
  576. pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
  577. pygeai/tests/snippets/migrate/process_migration.py +64 -0
  578. pygeai/tests/snippets/migrate/project_migration.py +42 -0
  579. pygeai/tests/snippets/migrate/tool_migration.py +64 -0
  580. pygeai/tests/snippets/organization/add_project_member.py +10 -0
  581. pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
  582. pygeai/tests/snippets/organization/create_project.py +2 -2
  583. pygeai/tests/snippets/organization/get_memberships.py +12 -0
  584. pygeai/tests/snippets/organization/get_organization_members.py +6 -0
  585. pygeai/tests/snippets/organization/get_project_members.py +6 -0
  586. pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
  587. pygeai/tests/snippets/organization/get_project_roles.py +6 -0
  588. pygeai/vendor/a2a/__init__.py +1 -0
  589. pygeai/vendor/a2a/auth/__init__.py +0 -0
  590. pygeai/vendor/a2a/auth/user.py +31 -0
  591. pygeai/vendor/a2a/client/__init__.py +19 -0
  592. pygeai/vendor/a2a/client/client.py +425 -0
  593. pygeai/vendor/a2a/client/errors.py +33 -0
  594. pygeai/vendor/a2a/client/helpers.py +22 -0
  595. pygeai/vendor/a2a/py.typed +0 -0
  596. pygeai/vendor/a2a/server/__init__.py +1 -0
  597. pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
  598. pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
  599. pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
  600. pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
  601. pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
  602. pygeai/vendor/a2a/server/apps/__init__.py +16 -0
  603. pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
  604. pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
  605. pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
  606. pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
  607. pygeai/vendor/a2a/server/context.py +23 -0
  608. pygeai/vendor/a2a/server/events/__init__.py +21 -0
  609. pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
  610. pygeai/vendor/a2a/server/events/event_queue.py +156 -0
  611. pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
  612. pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
  613. pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
  614. pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
  615. pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
  616. pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
  617. pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
  618. pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
  619. pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
  620. pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
  621. pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
  622. pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
  623. pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
  624. pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
  625. pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
  626. pygeai/vendor/a2a/types.py +1624 -0
  627. pygeai/vendor/a2a/utils/__init__.py +40 -0
  628. pygeai/vendor/a2a/utils/artifact.py +72 -0
  629. pygeai/vendor/a2a/utils/errors.py +69 -0
  630. pygeai/vendor/a2a/utils/helpers.py +176 -0
  631. pygeai/vendor/a2a/utils/message.py +83 -0
  632. pygeai/vendor/a2a/utils/task.py +57 -0
  633. pygeai/vendor/a2a/utils/telemetry.py +299 -0
  634. pygeai-0.6.0b15.dist-info/METADATA +205 -0
  635. pygeai-0.6.0b15.dist-info/RECORD +799 -0
  636. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
  637. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/entry_points.txt +2 -1
  638. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/licenses/LICENSE +13 -1
  639. pygeai-0.6.0b15.dist-info/top_level.txt +1 -0
  640. docs/geai-proxy/README.md +0 -145
  641. docs/source/conf.py +0 -45
  642. pygeai/tests/core/test_managers.py +0 -233
  643. pygeai-0.1.51b3.dist-info/METADATA +0 -130
  644. pygeai-0.1.51b3.dist-info/RECORD +0 -324
  645. pygeai-0.1.51b3.dist-info/top_level.txt +0 -3
  646. scripts/bump_beta_version.py +0 -56
  647. {scripts → pygeai/analytics}/__init__.py +0 -0
  648. /pygeai/tests/snippets/lab/{c_code_fixer_agent_flow.py → use_cases/c_code_fixer_agent_flow.py} +0 -0
@@ -0,0 +1,208 @@
1
+ import unittest
2
+ from unittest import TestCase
3
+ from pygeai.cli.commands.lab.common import (
4
+ get_agent_data_prompt_inputs,
5
+ get_agent_data_prompt_outputs,
6
+ get_agent_data_prompt_examples,
7
+ get_tool_parameters
8
+ )
9
+ from pygeai.core.common.exceptions import WrongArgumentError
10
+
11
+
12
+ class TestLabCommon(TestCase):
13
+ """
14
+ python -m unittest pygeai.tests.cli.commands.lab.test_common.TestLabCommon
15
+ """
16
+
17
+ def test_get_agent_data_prompt_inputs_valid(self):
18
+ input_list = ["input1", "input2"]
19
+ result = get_agent_data_prompt_inputs(input_list)
20
+ self.assertEqual(result, input_list)
21
+
22
+ def test_get_agent_data_prompt_inputs_invalid_non_string(self):
23
+ input_list = ["input1", 123] # Non-string element
24
+ with self.assertRaises(WrongArgumentError) as context:
25
+ get_agent_data_prompt_inputs(input_list)
26
+ self.assertIn("Inputs must be a list of strings", str(context.exception))
27
+
28
+ def test_get_agent_data_prompt_inputs_empty(self):
29
+ input_list = []
30
+ result = get_agent_data_prompt_inputs(input_list)
31
+ self.assertEqual(result, [])
32
+
33
+ def test_get_agent_data_prompt_outputs_valid(self):
34
+ output_list = [
35
+ {"key": "output1", "description": "Description for output1"},
36
+ {"key": "output2", "description": "Description for output2"}
37
+ ]
38
+ result = get_agent_data_prompt_outputs(output_list)
39
+ self.assertEqual(result, output_list)
40
+
41
+ def test_get_agent_data_prompt_outputs_invalid_missing_key(self):
42
+ output_list = [
43
+ {"description": "Description without key"} # Missing 'key'
44
+ ]
45
+ with self.assertRaises(WrongArgumentError) as context:
46
+ get_agent_data_prompt_outputs(output_list)
47
+ self.assertIn("Each output must be in JSON format", str(context.exception))
48
+
49
+ def test_get_agent_data_prompt_outputs_invalid_type(self):
50
+ output_list = [
51
+ "not a dict" # Not a dictionary
52
+ ]
53
+ with self.assertRaises(WrongArgumentError) as context:
54
+ get_agent_data_prompt_outputs(output_list)
55
+ self.assertIn("Each output must be in JSON format", str(context.exception))
56
+
57
+ def test_get_agent_data_prompt_outputs_empty(self):
58
+ output_list = []
59
+ result = get_agent_data_prompt_outputs(output_list)
60
+ self.assertEqual(result, [])
61
+
62
+ def test_get_agent_data_prompt_examples_valid(self):
63
+ example_list = [
64
+ {"inputData": "Input example 1", "output": '{"result": "Output 1"}'},
65
+ {"inputData": "Input example 2", "output": '{"result": "Output 2"}'}
66
+ ]
67
+ result = get_agent_data_prompt_examples(example_list)
68
+ self.assertEqual(result, example_list)
69
+
70
+ def test_get_agent_data_prompt_examples_invalid_missing_field(self):
71
+ example_list = [
72
+ {"inputData": "Input without output"} # Missing 'output'
73
+ ]
74
+ with self.assertRaises(WrongArgumentError) as context:
75
+ get_agent_data_prompt_examples(example_list)
76
+ self.assertIn("Each example must be in JSON format", str(context.exception))
77
+
78
+ def test_get_agent_data_prompt_examples_invalid_type(self):
79
+ example_list = [
80
+ "not a dict" # Not a dictionary
81
+ ]
82
+ with self.assertRaises(WrongArgumentError) as context:
83
+ get_agent_data_prompt_examples(example_list)
84
+ self.assertIn("Each example must be in JSON format", str(context.exception))
85
+
86
+ def test_get_agent_data_prompt_examples_empty(self):
87
+ example_list = []
88
+ result = get_agent_data_prompt_examples(example_list)
89
+ self.assertEqual(result, [])
90
+
91
+ def test_get_tool_parameters_valid_regular(self):
92
+ param_list = [
93
+ {"key": "param1", "dataType": "String", "description": "Param 1 description", "isRequired": True}
94
+ ]
95
+ result = get_tool_parameters(param_list)
96
+ self.assertEqual(result, param_list)
97
+
98
+ def test_get_tool_parameters_valid_config(self):
99
+ param_list = [
100
+ {
101
+ "key": "config1",
102
+ "dataType": "String",
103
+ "description": "Config 1 description",
104
+ "isRequired": True,
105
+ "type": "config",
106
+ "fromSecret": False,
107
+ "value": "config_value"
108
+ }
109
+ ]
110
+ result = get_tool_parameters(param_list)
111
+ self.assertEqual(result, param_list)
112
+
113
+ def test_get_tool_parameters_invalid_missing_field(self):
114
+ param_list = [
115
+ {"key": "param1", "dataType": "String", "isRequired": True} # Missing 'description'
116
+ ]
117
+ with self.assertRaises(WrongArgumentError) as context:
118
+ get_tool_parameters(param_list)
119
+ self.assertIn("Each parameter must contain 'key', 'dataType', 'description', and 'isRequired'", str(context.exception))
120
+
121
+ def test_get_tool_parameters_invalid_key_type(self):
122
+ param_list = [
123
+ {"key": 123, "dataType": "String", "description": "Param description", "isRequired": True} # 'key' not string
124
+ ]
125
+ with self.assertRaises(WrongArgumentError) as context:
126
+ get_tool_parameters(param_list)
127
+ self.assertIn("Parameter 'key' must be a string", str(context.exception))
128
+
129
+ def test_get_tool_parameters_invalid_data_type(self):
130
+ param_list = [
131
+ {"key": "param1", "dataType": 123, "description": "Param description", "isRequired": True} # 'dataType' not string
132
+ ]
133
+ with self.assertRaises(WrongArgumentError) as context:
134
+ get_tool_parameters(param_list)
135
+ self.assertIn("Parameter 'dataType' must be a string", str(context.exception))
136
+
137
+ def test_get_tool_parameters_invalid_description_type(self):
138
+ param_list = [
139
+ {"key": "param1", "dataType": "String", "description": 123, "isRequired": True} # 'description' not string
140
+ ]
141
+ with self.assertRaises(WrongArgumentError) as context:
142
+ get_tool_parameters(param_list)
143
+ self.assertIn("Parameter 'description' must be a string", str(context.exception))
144
+
145
+ def test_get_tool_parameters_invalid_is_required_type(self):
146
+ param_list = [
147
+ {"key": "param1", "dataType": "String", "description": "Param description", "isRequired": "True"} # 'isRequired' not bool
148
+ ]
149
+ with self.assertRaises(WrongArgumentError) as context:
150
+ get_tool_parameters(param_list)
151
+ self.assertIn("Parameter 'isRequired' must be a boolean", str(context.exception))
152
+
153
+ def test_get_tool_parameters_invalid_type_value(self):
154
+ param_list = [
155
+ {
156
+ "key": "param1",
157
+ "dataType": "String",
158
+ "description": "Param description",
159
+ "isRequired": True,
160
+ "type": "invalid" # 'type' not 'config'
161
+ }
162
+ ]
163
+ with self.assertRaises(WrongArgumentError) as context:
164
+ get_tool_parameters(param_list)
165
+ self.assertIn("Parameter 'type' must be 'config' if present", str(context.exception))
166
+
167
+ def test_get_tool_parameters_invalid_from_secret_type(self):
168
+ param_list = [
169
+ {
170
+ "key": "param1",
171
+ "dataType": "String",
172
+ "description": "Param description",
173
+ "isRequired": True,
174
+ "type": "config",
175
+ "fromSecret": "True" # 'fromSecret' not bool
176
+ }
177
+ ]
178
+ with self.assertRaises(WrongArgumentError) as context:
179
+ get_tool_parameters(param_list)
180
+ self.assertIn("Parameter 'fromSecret' must be a boolean if present", str(context.exception))
181
+
182
+ def test_get_tool_parameters_invalid_value_type(self):
183
+ param_list = [
184
+ {
185
+ "key": "param1",
186
+ "dataType": "String",
187
+ "description": "Param description",
188
+ "isRequired": True,
189
+ "type": "config",
190
+ "value": 123 # 'value' not string
191
+ }
192
+ ]
193
+ with self.assertRaises(WrongArgumentError) as context:
194
+ get_tool_parameters(param_list)
195
+ self.assertIn("Parameter 'value' must be a string if present", str(context.exception))
196
+
197
+ def test_get_tool_parameters_invalid_format(self):
198
+ param_list = [
199
+ "not a dict" # Not a dictionary
200
+ ]
201
+ with self.assertRaises(WrongArgumentError) as context:
202
+ get_tool_parameters(param_list)
203
+ self.assertIn("Each parameter must contain", str(context.exception))
204
+
205
+ def test_get_tool_parameters_empty(self):
206
+ param_list = []
207
+ result = get_tool_parameters(param_list)
208
+ self.assertEqual(result, [])
@@ -0,0 +1,246 @@
1
+ import unittest
2
+ from unittest.mock import patch, MagicMock
3
+ from pygeai.cli.commands.lab.spec import (
4
+ show_help,
5
+ load_agent,
6
+ create_agent,
7
+ load_tool,
8
+ create_tool,
9
+ load_task,
10
+ create_task,
11
+ load_agentic_process,
12
+ create_agentic_process
13
+ )
14
+ from pygeai.core.common.exceptions import MissingRequirementException
15
+ from pygeai.cli.commands import Option
16
+
17
+
18
+ class TestSpec(unittest.TestCase):
19
+ """
20
+ python -m unittest pygeai.tests.cli.commands.lab.test_spec.TestSpec
21
+ """
22
+
23
+ def test_show_help(self):
24
+ with patch('pygeai.cli.commands.lab.spec.Console.write_stdout') as mock_stdout:
25
+ show_help()
26
+ mock_stdout.assert_called_once()
27
+
28
+ def test_load_agent_missing_file(self):
29
+ option_list = []
30
+ with self.assertRaises(MissingRequirementException) as cm:
31
+ load_agent(option_list)
32
+ self.assertEqual(str(cm.exception), "Cannot load agent definition without specifying path to JSON file.")
33
+
34
+ def test_load_agent_single_dict(self):
35
+ option_list = [
36
+ (Option("file", ["--file"], "", True), "file.json"),
37
+ (Option("automatic_publish", ["--automatic-publish"], "", True), False)
38
+ ]
39
+ agent_data = {"key": "value"}
40
+ agent_mock = MagicMock()
41
+
42
+ with patch('pygeai.cli.commands.lab.spec.JSONLoader.load_data', return_value=agent_data), \
43
+ patch('pygeai.cli.commands.lab.spec.AgentParser.get_agent', return_value=agent_mock), \
44
+ patch('pygeai.cli.commands.lab.spec.create_agent') as mock_create:
45
+ load_agent(option_list)
46
+ mock_create.assert_called_once_with(agent_mock, False)
47
+
48
+ def test_load_agent_list(self):
49
+ option_list = [
50
+ (Option("file", ["--file"], "", True), "file.json"),
51
+ (Option("automatic_publish", ["--automatic-publish"], "", True), False)
52
+ ]
53
+ agent_data = [{"key1": "value1"}, {"key2": "value2"}]
54
+ agent_mock1, agent_mock2 = MagicMock(), MagicMock()
55
+
56
+ with patch('pygeai.cli.commands.lab.spec.JSONLoader.load_data', return_value=agent_data), \
57
+ patch('pygeai.cli.commands.lab.spec.AgentParser.get_agent', side_effect=[agent_mock1, agent_mock2]), \
58
+ patch('pygeai.cli.commands.lab.spec.create_agent') as mock_create:
59
+ load_agent(option_list)
60
+ self.assertEqual(mock_create.call_count, 2)
61
+ mock_create.assert_any_call(agent_mock1, False)
62
+ mock_create.assert_any_call(agent_mock2, False)
63
+
64
+ def test_create_agent_success(self):
65
+ agent_mock = MagicMock()
66
+ created_agent_mock = MagicMock()
67
+ with patch('pygeai.cli.commands.lab.spec.AILabManager') as mock_manager, \
68
+ patch('pygeai.cli.commands.lab.spec.Console.write_stdout') as mock_stdout:
69
+ mock_manager.return_value = MagicMock()
70
+ mock_manager.return_value.create_agent.return_value = created_agent_mock
71
+ create_agent(agent_mock, False)
72
+ mock_stdout.assert_called_once_with(f"Created agent detail: \n{created_agent_mock}")
73
+
74
+ def test_create_agent_failure(self):
75
+ agent_mock = MagicMock()
76
+ with patch('pygeai.cli.commands.lab.spec.AILabManager', side_effect=Exception("Error")), \
77
+ patch('pygeai.cli.commands.lab.spec.Console.write_stderr') as mock_stderr, \
78
+ patch('pygeai.cli.commands.lab.spec.logger.error') as mock_logger:
79
+ create_agent(agent_mock, False)
80
+ mock_stderr.assert_called_once_with(f"Error creating agent: \n{agent_mock}")
81
+ mock_logger.assert_called_once()
82
+
83
+ def test_load_tool_missing_file(self):
84
+ option_list = []
85
+ with self.assertRaises(MissingRequirementException) as cm:
86
+ load_tool(option_list)
87
+ self.assertEqual(str(cm.exception), "Cannot load tool definition without specifying path to JSON file.")
88
+
89
+ def test_load_tool_single_dict(self):
90
+ option_list = [
91
+ (Option("file", ["--file"], "", True), "file.json"),
92
+ (Option("automatic_publish", ["--automatic-publish"], "", True), False)
93
+ ]
94
+ tool_data = {"key": "value"}
95
+ tool_mock = MagicMock()
96
+
97
+ with patch('pygeai.cli.commands.lab.spec.JSONLoader.load_data', return_value=tool_data), \
98
+ patch('pygeai.cli.commands.lab.spec.ToolParser.get_tool', return_value=tool_mock), \
99
+ patch('pygeai.cli.commands.lab.spec.create_tool') as mock_create:
100
+ load_tool(option_list)
101
+ mock_create.assert_called_once_with(tool_mock, False)
102
+
103
+ def test_load_tool_list(self):
104
+ option_list = [
105
+ (Option("file", ["--file"], "", True), "file.json"),
106
+ (Option("automatic_publish", ["--automatic-publish"], "", True), False)
107
+ ]
108
+ tool_data = [{"key1": "value1"}, {"key2": "value2"}]
109
+ tool_mock1, tool_mock2 = MagicMock(), MagicMock()
110
+
111
+ with patch('pygeai.cli.commands.lab.spec.JSONLoader.load_data', return_value=tool_data), \
112
+ patch('pygeai.cli.commands.lab.spec.ToolParser.get_tool', side_effect=[tool_mock1, tool_mock2]), \
113
+ patch('pygeai.cli.commands.lab.spec.create_tool') as mock_create:
114
+ load_tool(option_list)
115
+ self.assertEqual(mock_create.call_count, 2)
116
+ mock_create.assert_any_call(tool_mock1, False)
117
+ mock_create.assert_any_call(tool_mock2, False)
118
+
119
+ def test_create_tool_success(self):
120
+ tool_mock = MagicMock()
121
+ created_tool_mock = MagicMock()
122
+ with patch('pygeai.cli.commands.lab.spec.AILabManager') as mock_manager, \
123
+ patch('pygeai.cli.commands.lab.spec.Console.write_stdout') as mock_stdout:
124
+ mock_manager.return_value = MagicMock()
125
+ mock_manager.return_value.create_tool.return_value = created_tool_mock
126
+ create_tool(tool_mock, False)
127
+ mock_stdout.assert_called_once_with(f"Created tool detail: \n{created_tool_mock}")
128
+
129
+ def test_create_tool_failure(self):
130
+ tool_mock = MagicMock()
131
+ with patch('pygeai.cli.commands.lab.spec.AILabManager', side_effect=Exception("Error")), \
132
+ patch('pygeai.cli.commands.lab.spec.Console.write_stderr') as mock_stderr, \
133
+ patch('pygeai.cli.commands.lab.spec.logger.error') as mock_logger:
134
+ create_tool(tool_mock, False)
135
+ mock_stderr.assert_called_once_with(f"Error creating tool: \n{tool_mock}")
136
+ mock_logger.assert_called_once()
137
+
138
+ def test_load_task_missing_file(self):
139
+ option_list = []
140
+ with self.assertRaises(MissingRequirementException) as cm:
141
+ load_task(option_list)
142
+ self.assertEqual(str(cm.exception), "Cannot load task definition without specifying path to JSON file.")
143
+
144
+ def test_load_task_single_dict(self):
145
+ option_list = [
146
+ (Option("file", ["--file"], "", True), "file.json"),
147
+ (Option("automatic_publish", ["--automatic-publish"], "", True), False)
148
+ ]
149
+ task_data = {"key": "value"}
150
+ task_mock = MagicMock()
151
+
152
+ with patch('pygeai.cli.commands.lab.spec.JSONLoader.load_data', return_value=task_data), \
153
+ patch('pygeai.cli.commands.lab.spec.TaskParser.get_task', return_value=task_mock), \
154
+ patch('pygeai.cli.commands.lab.spec.create_task') as mock_create:
155
+ load_task(option_list)
156
+ mock_create.assert_called_once_with(task_mock, False)
157
+
158
+ def test_load_task_list(self):
159
+ option_list = [
160
+ (Option("file", ["--file"], "", True), "file.json"),
161
+ (Option("automatic_publish", ["--automatic-publish"], "", True), False)
162
+ ]
163
+ task_data = [{"key1": "value1"}, {"key2": "value2"}]
164
+ task_mock1, task_mock2 = MagicMock(), MagicMock()
165
+
166
+ with patch('pygeai.cli.commands.lab.spec.JSONLoader.load_data', return_value=task_data), \
167
+ patch('pygeai.cli.commands.lab.spec.TaskParser.get_task', side_effect=[task_mock1, task_mock2]), \
168
+ patch('pygeai.cli.commands.lab.spec.create_task') as mock_create:
169
+ load_task(option_list)
170
+ self.assertEqual(mock_create.call_count, 2)
171
+ mock_create.assert_any_call(task_mock1, False)
172
+ mock_create.assert_any_call(task_mock2, False)
173
+
174
+ def test_create_task_success(self):
175
+ task_mock = MagicMock()
176
+ created_task_mock = MagicMock()
177
+ with patch('pygeai.cli.commands.lab.spec.AILabManager') as mock_manager, \
178
+ patch('pygeai.cli.commands.lab.spec.Console.write_stdout') as mock_stdout:
179
+ mock_manager.return_value = MagicMock()
180
+ mock_manager.return_value.create_task.return_value = created_task_mock
181
+ create_task(task_mock, False)
182
+ mock_stdout.assert_called_once_with(f"Created task detail: \n{created_task_mock}")
183
+
184
+ def test_create_task_failure(self):
185
+ task_mock = MagicMock()
186
+ with patch('pygeai.cli.commands.lab.spec.AILabManager', side_effect=Exception("Error")), \
187
+ patch('pygeai.cli.commands.lab.spec.Console.write_stderr') as mock_stderr, \
188
+ patch('pygeai.cli.commands.lab.spec.logger.error') as mock_logger:
189
+ create_task(task_mock, False)
190
+ mock_stderr.assert_called_once_with(f"Error creating task: \n{task_mock}")
191
+ mock_logger.assert_called_once()
192
+
193
+ def test_load_agentic_process_missing_file(self):
194
+ option_list = []
195
+ with self.assertRaises(MissingRequirementException) as cm:
196
+ load_agentic_process(option_list)
197
+ self.assertEqual(str(cm.exception), "Cannot load agentic process definition without specifying path to JSON file.")
198
+
199
+ def test_load_agentic_process_single_dict(self):
200
+ option_list = [
201
+ (Option("file", ["--file"], "", True), "file.json"),
202
+ (Option("automatic_publish", ["--automatic-publish"], "", True), False)
203
+ ]
204
+ process_data = {"key": "value"}
205
+ process_mock = MagicMock()
206
+
207
+ with patch('pygeai.cli.commands.lab.spec.JSONLoader.load_data', return_value=process_data), \
208
+ patch('pygeai.cli.commands.lab.spec.AgenticProcessParser.get_agentic_process', return_value=process_mock), \
209
+ patch('pygeai.cli.commands.lab.spec.create_agentic_process') as mock_create:
210
+ load_agentic_process(option_list)
211
+ mock_create.assert_called_once_with(process_mock, False)
212
+
213
+ def test_load_agentic_process_list(self):
214
+ option_list = [
215
+ (Option("file", ["--file"], "", True), "file.json"),
216
+ (Option("automatic_publish", ["--automatic-publish"], "", True), False)
217
+ ]
218
+ process_data = [{"key1": "value1"}, {"key2": "value2"}]
219
+ process_mock1, process_mock2 = MagicMock(), MagicMock()
220
+
221
+ with patch('pygeai.cli.commands.lab.spec.JSONLoader.load_data', return_value=process_data), \
222
+ patch('pygeai.cli.commands.lab.spec.AgenticProcessParser.get_agentic_process', side_effect=[process_mock1, process_mock2]), \
223
+ patch('pygeai.cli.commands.lab.spec.create_agentic_process') as mock_create:
224
+ load_agentic_process(option_list)
225
+ self.assertEqual(mock_create.call_count, 2)
226
+ mock_create.assert_any_call(process_mock1, False)
227
+ mock_create.assert_any_call(process_mock2, False)
228
+
229
+ def test_create_agentic_process_success(self):
230
+ process_mock = MagicMock()
231
+ created_process_mock = MagicMock()
232
+ with patch('pygeai.cli.commands.lab.spec.AILabManager') as mock_manager, \
233
+ patch('pygeai.cli.commands.lab.spec.Console.write_stdout') as mock_stdout:
234
+ mock_manager.return_value = MagicMock()
235
+ mock_manager.return_value.create_process.return_value = created_process_mock
236
+ create_agentic_process(process_mock, False)
237
+ mock_stdout.assert_called_once_with(f"Created agentic process detail: \n{created_process_mock}")
238
+
239
+ def test_create_agentic_process_failure(self):
240
+ process_mock = MagicMock()
241
+ with patch('pygeai.cli.commands.lab.spec.AILabManager', side_effect=Exception("Error")), \
242
+ patch('pygeai.cli.commands.lab.spec.Console.write_stderr') as mock_stderr, \
243
+ patch('pygeai.cli.commands.lab.spec.logger.error') as mock_logger:
244
+ create_agentic_process(process_mock, False)
245
+ mock_stderr.assert_called_once_with(f"Error creating agentic process: \n{process_mock}")
246
+ mock_logger.assert_called_once()
@@ -0,0 +1,202 @@
1
+ import unittest
2
+ from unittest.mock import patch, Mock
3
+
4
+ from pygeai.cli.commands.assistant import (
5
+ show_help,
6
+ get_assistant_detail,
7
+ create_assistant,
8
+ update_assistant,
9
+ delete_assistant,
10
+ send_chat_request,
11
+ get_request_status,
12
+ cancel_request
13
+ )
14
+ from pygeai.core.common.exceptions import MissingRequirementException, WrongArgumentError
15
+
16
+
17
+ class TestAssistant(unittest.TestCase):
18
+ """
19
+ python -m unittest pygeai.tests.cli.commands.test_assistant.TestAssistant
20
+ """
21
+ def test_show_help(self):
22
+ with patch('pygeai.core.utils.console.Console.write_stdout') as mock_stdout:
23
+ show_help()
24
+ mock_stdout.assert_called_once()
25
+
26
+ def test_get_assistant_detail_success(self):
27
+ option_list = [
28
+ (Mock(spec=['name'], name="detail"), "full"),
29
+ (Mock(spec=['name'], name="assistant_id"), "123")
30
+ ]
31
+ option_list[0][0].name = "detail"
32
+ option_list[1][0].name = "assistant_id"
33
+ with patch('pygeai.assistant.clients.AssistantClient.get_assistant_data', return_value="Assistant data"):
34
+ with patch('pygeai.core.utils.console.Console.write_stdout') as mock_stdout:
35
+ get_assistant_detail(option_list)
36
+ mock_stdout.assert_called_once_with("Assistant detail: \nAssistant data")
37
+
38
+ def test_get_assistant_detail_missing_id(self):
39
+ option_list = [(Mock(spec=['name'], name="detail"), "full")]
40
+ option_list[0][0].name = "detail"
41
+ with self.assertRaises(MissingRequirementException) as context:
42
+ get_assistant_detail(option_list)
43
+ self.assertEqual(str(context.exception), "Cannot retrieve assistant detail without assistant_id")
44
+
45
+ def test_create_assistant_success(self):
46
+ option_list = [
47
+ (Mock(spec=['name'], name="type"), "text"),
48
+ (Mock(spec=['name'], name="name"), "Test Assistant"),
49
+ (Mock(spec=['name'], name="prompt"), "Test prompt"),
50
+ (Mock(spec=['name'], name="description"), "Description"),
51
+ (Mock(spec=['name'], name="provider_name"), "provider"),
52
+ (Mock(spec=['name'], name="model_name"), "model"),
53
+ (Mock(spec=['name'], name="temperature"), "0.5"),
54
+ (Mock(spec=['name'], name="max_tokens"), "100"),
55
+ (Mock(spec=['name'], name="welcome_data_title"), "Welcome"),
56
+ (Mock(spec=['name'], name="welcome_data_description"), "Welcome description")
57
+ ]
58
+ for opt, _ in option_list:
59
+ opt.name = opt._mock_name
60
+ with patch('pygeai.assistant.clients.AssistantClient.create_assistant', return_value="Created assistant"):
61
+ with patch('pygeai.core.utils.console.Console.write_stdout') as mock_stdout:
62
+ with patch('pygeai.cli.commands.common.get_llm_settings', return_value={"provider": "provider"}):
63
+ with patch('pygeai.cli.commands.common.get_welcome_data', return_value={"title": "Welcome"}):
64
+ create_assistant(option_list)
65
+ mock_stdout.assert_called_once_with("New assistant detail: \nCreated assistant")
66
+
67
+ def test_create_assistant_missing_required(self):
68
+ option_list = [(Mock(spec=['name'], name="type"), "text")]
69
+ option_list[0][0].name = "type"
70
+ with self.assertRaises(MissingRequirementException) as context:
71
+ create_assistant(option_list)
72
+ self.assertEqual(str(context.exception), "Cannot create new assistant without 'type', 'name' and 'prompt'")
73
+
74
+ def test_create_assistant_invalid_temperature(self):
75
+ option_list = [
76
+ (Mock(spec=['name'], name="type"), "text"),
77
+ (Mock(spec=['name'], name="name"), "Test Assistant"),
78
+ (Mock(spec=['name'], name="prompt"), "Test prompt"),
79
+ (Mock(spec=['name'], name="temperature"), "invalid")
80
+ ]
81
+ for opt, _ in option_list:
82
+ opt.name = opt._mock_name
83
+ with self.assertRaises(WrongArgumentError) as context:
84
+ create_assistant(option_list)
85
+ self.assertEqual(str(context.exception), "When defined, temperature must be a decimal numer. Example: 0.5")
86
+
87
+ def test_update_assistant_success(self):
88
+ option_list = [
89
+ (Mock(spec=['name'], name="assistant_id"), "123"),
90
+ (Mock(spec=['name'], name="name"), "Updated Assistant"),
91
+ (Mock(spec=['name'], name="prompt"), "Updated prompt"),
92
+ (Mock(spec=['name'], name="action"), "saveNewRevision")
93
+ ]
94
+ for opt, _ in option_list:
95
+ opt.name = opt._mock_name
96
+ with patch('pygeai.assistant.clients.AssistantClient.update_assistant', return_value="Updated assistant"):
97
+ with patch('pygeai.core.utils.console.Console.write_stdout') as mock_stdout:
98
+ update_assistant(option_list)
99
+ mock_stdout.assert_called_once_with("Updated assistant detail: \nUpdated assistant")
100
+
101
+ def test_update_assistant_missing_id(self):
102
+ option_list = [(Mock(spec=['name'], name="name"), "Updated Assistant")]
103
+ option_list[0][0].name = "name"
104
+ with self.assertRaises(MissingRequirementException) as context:
105
+ update_assistant(option_list)
106
+ self.assertEqual(str(context.exception), "Cannot update existing assistant without 'assistant_id'")
107
+
108
+ def test_update_assistant_missing_revision_id_for_save(self):
109
+ option_list = [
110
+ (Mock(spec=['name'], name="assistant_id"), "123"),
111
+ (Mock(spec=['name'], name="action"), "save")
112
+ ]
113
+ for opt, _ in option_list:
114
+ opt.name = opt._mock_name
115
+ with self.assertRaises(MissingRequirementException) as context:
116
+ update_assistant(option_list)
117
+ self.assertEqual(str(context.exception), "A revision_id is necessary when updating an existing version.")
118
+
119
+ def test_update_assistant_missing_prompt_for_new_revision(self):
120
+ option_list = [
121
+ (Mock(spec=['name'], name="assistant_id"), "123"),
122
+ (Mock(spec=['name'], name="action"), "saveNewRevision")
123
+ ]
124
+ for opt, _ in option_list:
125
+ opt.name = opt._mock_name
126
+ with self.assertRaises(MissingRequirementException) as context:
127
+ update_assistant(option_list)
128
+ self.assertEqual(str(context.exception), "Prompt must be defined if revisionId is specified or in case of actions saveNewRevision and savePublishNewRevision.")
129
+
130
+ def test_delete_assistant_success(self):
131
+ option_list = [(Mock(spec=['name'], name="assistant_id"), "123")]
132
+ option_list[0][0].name = "assistant_id"
133
+ with patch('pygeai.assistant.clients.AssistantClient.delete_assistant', return_value="Deleted assistant"):
134
+ with patch('pygeai.core.utils.console.Console.write_stdout') as mock_stdout:
135
+ delete_assistant(option_list)
136
+ mock_stdout.assert_called_once_with("Deleted assistant: \nDeleted assistant")
137
+
138
+ def test_delete_assistant_missing_id(self):
139
+ option_list = []
140
+ with self.assertRaises(MissingRequirementException) as context:
141
+ delete_assistant(option_list)
142
+ self.assertEqual(str(context.exception), "Cannot delete assistant without 'assistant_id'")
143
+
144
+ def test_send_chat_request_success(self):
145
+ option_list = [
146
+ (Mock(spec=['name'], name="assistant_name"), "Test Assistant"),
147
+ (Mock(spec=['name'], name="messages"), '{"role": "user", "content": "Hello"}')
148
+ ]
149
+ for opt, _ in option_list:
150
+ opt.name = opt._mock_name
151
+ with patch('pygeai.assistant.clients.AssistantClient.send_chat_request', return_value="Chat response"):
152
+ with patch('pygeai.core.utils.console.Console.write_stdout') as mock_stdout:
153
+ with patch('pygeai.cli.commands.common.get_messages', return_value=[{"role": "user", "content": "Hello"}]):
154
+ send_chat_request(option_list)
155
+ mock_stdout.assert_called_once_with("Chat request response: \nChat response")
156
+
157
+ def test_send_chat_request_missing_name(self):
158
+ option_list = [(Mock(spec=['name'], name="messages"), '{"role": "user", "content": "Hello"}')]
159
+ option_list[0][0].name = "messages"
160
+ with self.assertRaises(MissingRequirementException) as context:
161
+ send_chat_request(option_list)
162
+ self.assertEqual(str(context.exception), "Cannot send chat request without specifying assistant name")
163
+
164
+ def test_send_chat_request_invalid_messages(self):
165
+ option_list = [
166
+ (Mock(spec=['name'], name="assistant_name"), "Test Assistant"),
167
+ (Mock(spec=['name'], name="messages"), "invalid_json")
168
+ ]
169
+ for opt, _ in option_list:
170
+ opt.name = opt._mock_name
171
+ with self.assertRaises(WrongArgumentError) as context:
172
+ send_chat_request(option_list)
173
+ self.assertIn("Each message must be in json format", str(context.exception))
174
+
175
+ def test_get_request_status_success(self):
176
+ option_list = [(Mock(spec=['name'], name="request_id"), "456")]
177
+ option_list[0][0].name = "request_id"
178
+ with patch('pygeai.assistant.clients.AssistantClient.get_request_status', return_value="Request status data"):
179
+ with patch('pygeai.core.utils.console.Console.write_stdout') as mock_stdout:
180
+ get_request_status(option_list)
181
+ mock_stdout.assert_called_once_with("Request status: \nRequest status data")
182
+
183
+ def test_get_request_status_missing_id(self):
184
+ option_list = []
185
+ with self.assertRaises(MissingRequirementException) as context:
186
+ get_request_status(option_list)
187
+ self.assertEqual(str(context.exception), "Cannot retrieve status of request without request_id.")
188
+
189
+ def test_cancel_request_success(self):
190
+ option_list = [(Mock(spec=['name'], name="request_id"), "456")]
191
+ option_list[0][0].name = "request_id"
192
+ with patch('pygeai.assistant.clients.AssistantClient.cancel_request', return_value="Request cancelled"):
193
+ with patch('pygeai.core.utils.console.Console.write_stdout') as mock_stdout:
194
+ cancel_request(option_list)
195
+ mock_stdout.assert_called_once_with("Cancel request detail: \nRequest cancelled")
196
+
197
+ def test_cancel_request_missing_id(self):
198
+ option_list = []
199
+ with self.assertRaises(MissingRequirementException) as context:
200
+ cancel_request(option_list)
201
+ self.assertEqual(str(context.exception), "Cannot cancel request without request_id.")
202
+