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.
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,465 @@
1
+ import json
2
+
3
+ from pygeai import logger
4
+ from pygeai.core.common.exceptions import InvalidAPIResponseException, MissingRequirementException, APIResponseError
5
+ from pygeai.core.utils.validators import validate_status_code
6
+ from pygeai.core.utils.parsers import parse_json_response
7
+ from pygeai.lab.constants import VALID_SCOPES, VALID_ACCESS_SCOPES, VALID_REPORT_EVENTS
8
+ from pygeai.lab.tools.endpoints import CREATE_TOOL_V2, LIST_TOOLS_V2, GET_TOOL_V2, UPDATE_TOOL_V2, UPSERT_TOOL_V2, \
9
+ PUBLISH_TOOL_REVISION_V2, GET_PARAMETER_V2, SET_PARAMETER_V2, DELETE_TOOL_V2
10
+ from pygeai.lab.clients import AILabClient
11
+
12
+
13
+ class ToolClient(AILabClient):
14
+
15
+ def create_tool(
16
+ self,
17
+ name: str,
18
+ description: str = None,
19
+ scope: str = None,
20
+ access_scope: str = "private",
21
+ public_name: str = None,
22
+ icon: str = None,
23
+ open_api: str = None,
24
+ open_api_json: dict = None,
25
+ report_events: str = "None",
26
+ parameters: list = None,
27
+ automatic_publish: bool = False
28
+ ) -> dict:
29
+ """
30
+ Creates a new tool in the specified project.
31
+
32
+ :param name: str - Name of the tool. Must be non-empty, unique within the project, and exclude ':' or '/'.
33
+ :param description: str - Description of the tool's purpose, helping agents decide when to use it. Optional.
34
+ :param scope: str - Scope of the tool, either 'builtin', 'external', or 'api'. Optional.
35
+ :param access_scope: str - Access scope of the tool, either 'public' or 'private'. Defaults to 'private'.
36
+ :param public_name: str - Public name of the tool, required if access_scope is 'public'. Must be unique within the installation and follow a domain/library convention (e.g., 'com.globant.geai.web-search') with only alphanumeric characters, periods, dashes, or underscores. Optional if access_scope is 'private'.
37
+ :param icon: str - URL for the tool's icon or avatar image. Optional.
38
+ :param open_api: str - URL where the OpenAPI specification can be loaded. Required for 'api' scope tools if open_api_json is not provided. Optional otherwise.
39
+ :param open_api_json: dict - OpenAPI specification as a dictionary. Required for 'api' scope tools if open_api is not provided. Serialized to a JSON string in the request. Optional otherwise.
40
+ :param report_events: str - Event reporting mode for tool progress feedback, one of 'None', 'All', 'Start', 'Finish', 'Progress'. Defaults to 'None'.
41
+ :param parameters: list - List of parameter dictionaries defining tool inputs and configurations. Optional for 'api' scope tools (as parameters are in OpenAPI spec), required otherwise if parameters are needed. Each dictionary includes:
42
+ - key: str (unique identifier, case-sensitive, must match OpenAPI for 'api' tools)
43
+ - description: str (explains parameter usage)
44
+ - isRequired: bool (whether parameter is mandatory)
45
+ - type: str (one of 'config', 'app', 'context'; defaults to 'app')
46
+ - value: str (for 'config' type, the static value; for 'context' type, the context variable like 'USER_EMAIL')
47
+ - fromSecret: bool (for 'config' type, indicates if value is a secret name). Example:
48
+ [
49
+ {
50
+ 'key': 'api_key',
51
+ 'description': 'API key for service',
52
+ 'isRequired': True,
53
+ 'type': 'config',
54
+ 'value': 'my-secret-key',
55
+ 'fromSecret': True
56
+ },
57
+ {
58
+ 'key': 'query',
59
+ 'description': 'Search query',
60
+ 'isRequired': False,
61
+ 'type': 'app'
62
+ }
63
+ ]
64
+ :param automatic_publish: bool - If True, automatically publishes the tool after creation. Defaults to False.
65
+ :return: dict - JSON response containing the created tool details if successful, otherwise the raw response text.
66
+ :raises JSONDecodeError: If the response cannot be parsed as JSON.
67
+ """
68
+ if scope is not None and scope not in VALID_SCOPES:
69
+ raise ValueError(f"Scope must be one of {', '.join(VALID_SCOPES)}.")
70
+ if access_scope is not None and access_scope not in VALID_ACCESS_SCOPES:
71
+ raise ValueError(f"Access scope must be one of {', '.join(VALID_ACCESS_SCOPES)}.")
72
+ if report_events is not None and report_events not in VALID_REPORT_EVENTS:
73
+ raise ValueError(f"Report events must be one of {', '.join(VALID_REPORT_EVENTS)}.")
74
+
75
+ data = {
76
+ "tool": {
77
+ "reportEvents": report_events,
78
+ }
79
+ }
80
+ if name:
81
+ data["tool"]["name"] = name
82
+ if description:
83
+ data["tool"]["description"] = description
84
+ if scope:
85
+ data["tool"]["scope"] = scope
86
+ if access_scope:
87
+ data["tool"]["accessScope"] = access_scope
88
+ if public_name:
89
+ data["tool"]["publicName"] = public_name
90
+ if icon:
91
+ data["tool"]["icon"] = icon
92
+ if open_api:
93
+ data["tool"]["openApi"] = open_api
94
+ if open_api_json:
95
+ open_api_str = json.dumps(open_api_json, indent=2)
96
+ data["tool"]["openApiJson"] = open_api_str
97
+ if parameters:
98
+ data["tool"]["parameters"] = parameters
99
+
100
+ logger.debug(f"Creating new tool with data: {data}")
101
+
102
+ endpoint = CREATE_TOOL_V2
103
+ if automatic_publish:
104
+ endpoint = f"{endpoint}?automaticPublish=true"
105
+
106
+ response = self.api_service.post(
107
+ endpoint=endpoint,
108
+ data=data
109
+ )
110
+
111
+ validate_status_code(response)
112
+ return parse_json_response(response, f"create tool for project {self.project_id}")
113
+
114
+ def list_tools(
115
+ self,
116
+ id: str = "",
117
+ count: str = "100",
118
+ access_scope: str = "public",
119
+ allow_drafts: bool = True,
120
+ scope: str = "api",
121
+ allow_external: bool = True
122
+ ) -> dict | str:
123
+ """
124
+ Retrieves a list of tools associated with the specified project.
125
+
126
+ :param id: str - ID of the tool to filter by. Defaults to "" (no filtering).
127
+ :param count: str - Number of tools to retrieve. Defaults to "100".
128
+ :param access_scope: str - Access scope of the tools, either "public" or "private". Defaults to "public".
129
+ :param allow_drafts: bool - Whether to include draft tools. Defaults to True.
130
+ :param scope: str - Scope of the tools, must be "builtin", "external", or "api". Defaults to "api".
131
+ :param allow_external: bool - Whether to include external tools. Defaults to True.
132
+ :return: dict or str - JSON response containing the list of tools if successful, otherwise the raw response text.
133
+ """
134
+ endpoint = LIST_TOOLS_V2
135
+
136
+ if scope and scope not in VALID_SCOPES:
137
+ raise ValueError(f"Scope must be one of {', '.join(VALID_SCOPES)}.")
138
+
139
+ logger.debug(f"Listing tools available for the project with ID: {self.project_id}")
140
+
141
+ response = self.api_service.get(
142
+ endpoint=endpoint,
143
+ params={
144
+ "id": id,
145
+ "count": count,
146
+ "accessScope": access_scope,
147
+ "allowDrafts": allow_drafts,
148
+ "scope": scope,
149
+ "allowExternal": allow_external
150
+ }
151
+ )
152
+ validate_status_code(response)
153
+ return parse_json_response(response, f"list tools for project {self.project_id}")
154
+
155
+ def get_tool(
156
+ self,
157
+ tool_id: str,
158
+ revision: str = 0,
159
+ version: int = 0,
160
+ allow_drafts: bool = True
161
+ ):
162
+ """
163
+ Retrieves details of a specific tool from the specified project.
164
+
165
+ :param tool_id: str - Unique identifier of the tool to retrieve.
166
+ :param revision: str - Revision of the tool to retrieve. Defaults to 0 (latest revision).
167
+ :param version: int - Version of the tool to retrieve. Defaults to 0 (latest version).
168
+ :param allow_drafts: bool - Whether to include draft tool in the retrieval. Defaults to True.
169
+ :return: dict or str - JSON response containing the tool details if successful, otherwise the raw response text.
170
+ """
171
+ endpoint = GET_TOOL_V2.format(toolId=tool_id)
172
+ logger.debug(f"Retrieving detail of tool with ID: {tool_id}")
173
+
174
+ response = self.api_service.get(
175
+ endpoint=endpoint,
176
+ params={
177
+ "revision": revision,
178
+ "version": version,
179
+ "allowDrafts": allow_drafts,
180
+ }
181
+ )
182
+ validate_status_code(response)
183
+ return parse_json_response(response, f"retrieve tool {tool_id} for project {self.project_id}")
184
+
185
+
186
+ def delete_tool(
187
+ self,
188
+ tool_id: str = None,
189
+ tool_name: str = None
190
+ ) -> dict | str:
191
+ """
192
+ Deletes a specific tool from the specified project.
193
+
194
+ :param tool_id: str, optional - Unique identifier of the tool to delete. Defaults to None.
195
+ :param tool_name: str, optional - Name of the tool to delete. Defaults to None.
196
+ :return: dict or str - JSON response containing the result of the delete operation if successful,
197
+ otherwise the raw response text.
198
+ :raises ValueError: If neither tool_id nor tool_name is provided.
199
+ """
200
+ if not (tool_id or tool_name):
201
+ raise ValueError("Either tool_id or tool_name must be provided.")
202
+
203
+ endpoint = DELETE_TOOL_V2.format(toolId=tool_id if tool_id else tool_name)
204
+
205
+ if tool_id:
206
+ logger.debug(f"Deleting tool with ID {tool_id}")
207
+ else:
208
+ logger.debug(f"Deleting tool with name '{tool_name}'")
209
+
210
+ response = self.api_service.delete(
211
+ endpoint=endpoint,
212
+ )
213
+ validate_status_code(response)
214
+
215
+ if response.status_code != 204:
216
+ logger.error(f"Unable to delete tool {tool_id or tool_name} in project {self.project_id}: JSON parsing error (status {response.status_code}). Response: {response.text}")
217
+ raise InvalidAPIResponseException(f"Unable to delete tool {tool_id or tool_name} in project {self.project_id}: {response.text}")
218
+ else:
219
+ return {}
220
+
221
+ def update_tool(
222
+ self,
223
+ tool_id: str = None,
224
+ name: str = None,
225
+ description: str = None,
226
+ scope: str = None,
227
+ access_scope: str = None,
228
+ public_name: str = None,
229
+ icon: str = None,
230
+ open_api: str = None,
231
+ open_api_json: dict = None,
232
+ report_events: str = "None",
233
+ parameters: list = None,
234
+ automatic_publish: bool = False,
235
+ upsert: bool = False
236
+ ) -> dict | str:
237
+ """
238
+ Updates an existing tool in the specified project or upserts it if specified.
239
+
240
+ :param tool_id: str - Unique identifier of the tool to update. Required for update operations.
241
+ :param name: str - Updated name of the tool. Must be non-empty, unique within the project, and exclude ':' or '/' if provided. Optional.
242
+ :param description: str - Updated description of the tool's purpose, helping agents decide when to use it. Optional.
243
+ :param scope: str - Updated scope of the tool, one of 'builtin', 'external', or 'api'. Optional.
244
+ :param access_scope: str - Updated access scope of the tool, either 'public' or 'private'. Optional.
245
+ :param public_name: str - Updated public name of the tool, required if access_scope is set to 'public'. Must be unique within the installation and follow a domain/library convention (e.g., 'com.globant.geai.web-search') with only alphanumeric characters, periods, dashes, or underscores. Optional otherwise.
246
+ :param icon: str - Updated URL for the tool's icon or avatar image. Optional.
247
+ :param open_api: str - Updated URL where the OpenAPI specification can be loaded. Required for 'api' scope tools if open_api_json is not provided during upsert or if scope is changed to 'api'. Optional otherwise.
248
+ :param open_api_json: dict - Updated OpenAPI specification as a dictionary. Required for 'api' scope tools if open_api is not provided during upsert or if scope is changed to 'api'. Serialized to a JSON string in the request. Optional otherwise.
249
+ :param report_events: str - Updated event reporting mode for tool progress feedback, one of 'None', 'All', 'Start', 'Finish', 'Progress'. Optional.
250
+ :param parameters: list - Updated list of parameter dictionaries defining tool inputs and configurations. Optional for 'api' scope tools (as parameters are in OpenAPI spec). Each dictionary includes:
251
+ - key: str (unique identifier, case-sensitive, must match OpenAPI for 'api' tools)
252
+ - description: str (explains parameter usage)
253
+ - isRequired: bool (whether parameter is mandatory)
254
+ - type: str (one of 'config', 'app', 'context'; defaults to 'app')
255
+ - value: str (for 'config' type, the static value; for 'context' type, the context variable like 'USER_EMAIL')
256
+ - fromSecret: bool (for 'config' type, indicates if value is a secret name). Example:
257
+ [
258
+ {
259
+ 'key': 'api_key',
260
+ 'description': 'API key for service',
261
+ 'isRequired': True,
262
+ 'type': 'config',
263
+ 'value': 'my-secret-key',
264
+ 'fromSecret': True
265
+ },
266
+ {
267
+ 'key': 'query',
268
+ 'description': 'Search query',
269
+ 'isRequired': False,
270
+ 'type': 'app'
271
+ }
272
+ ]
273
+ :param automatic_publish: bool - If True, automatically publishes the tool after updating. Defaults to False.
274
+ :param upsert: bool - If True, creates the tool if it does not exist (upsert); otherwise, only updates an existing tool. Defaults to False.
275
+ :return: dict or str - JSON response containing the updated or created tool details if successful, otherwise the raw response text.
276
+ :raises ValueError: If scope is provided and not one of 'builtin', 'external', or 'api', or if access_scope is provided and not one of 'public' or 'private', or if report_events is provided and not one of 'None', 'All', 'Start', 'Finish', 'Progress'.
277
+ :raises JSONDecodeError: Caught internally if the response cannot be parsed as JSON; returns raw response text.
278
+ :raises Exception: May be raised by `api_service.put` for network issues, authentication errors, or server-side problems (not caught here).
279
+ """
280
+ if not (tool_id or name):
281
+ raise ValueError(f"Either tool ID or tool Name must be defined in order to update tool.")
282
+ if scope and scope not in VALID_SCOPES:
283
+ raise ValueError(f"Scope must be one of {', '.join(VALID_SCOPES)}.")
284
+ if access_scope and access_scope not in VALID_ACCESS_SCOPES:
285
+ raise ValueError(f"Access scope must be one of {', '.join(VALID_ACCESS_SCOPES)}.")
286
+ if report_events and report_events not in VALID_REPORT_EVENTS:
287
+ raise ValueError(f"Report events must be one of {', '.join(VALID_REPORT_EVENTS)}.")
288
+
289
+ data = {
290
+ "tool": {
291
+ "reportEvents": report_events,
292
+ }
293
+ }
294
+ if name:
295
+ data["tool"]["name"] = name
296
+ if description:
297
+ data["tool"]["description"] = description
298
+ if scope:
299
+ data["tool"]["scope"] = scope
300
+ if access_scope:
301
+ data["tool"]["accessScope"] = access_scope
302
+ if public_name:
303
+ data["tool"]["publicName"] = public_name
304
+ if icon:
305
+ data["tool"]["icon"] = icon
306
+ if open_api:
307
+ data["tool"]["openApi"] = open_api
308
+ if open_api_json:
309
+ open_api_str = json.dumps(open_api_json, indent=2)
310
+ data["tool"]["openApiJson"] = open_api_str
311
+ if parameters:
312
+ data["tool"]["parameters"] = parameters
313
+
314
+ logger.debug(f"Updating tool with ID {tool_id} with data: {data}")
315
+
316
+ endpoint = UPSERT_TOOL_V2 if upsert else UPDATE_TOOL_V2
317
+ endpoint = endpoint.format(toolId=tool_id) if tool_id else endpoint.format(toolId=name)
318
+
319
+ if automatic_publish:
320
+ endpoint = f"{endpoint}?automaticPublish=true"
321
+
322
+ response = self.api_service.put(
323
+ endpoint=endpoint,
324
+ data=data
325
+ )
326
+ validate_status_code(response)
327
+ return parse_json_response(response, f"update tool {tool_id} in project {self.project_id}")
328
+
329
+ def publish_tool_revision(
330
+ self,
331
+ tool_id: str,
332
+ revision: str
333
+ ):
334
+ """
335
+ Publishes a specific revision of a tool in the specified project.
336
+
337
+ :param tool_id: str - Unique identifier of the tool to publish.
338
+ :param revision: str - Revision of the tool to publish.
339
+ :return: dict or str - JSON response containing the result of the publish operation if successful, otherwise the raw response text.
340
+ """
341
+ endpoint = PUBLISH_TOOL_REVISION_V2.format(toolId=tool_id)
342
+ logger.debug(f"Publishing revision {revision} for tool with ID {tool_id}")
343
+
344
+ response = self.api_service.post(
345
+ endpoint=endpoint,
346
+ data={
347
+ "revision": revision,
348
+ }
349
+ )
350
+ validate_status_code(response)
351
+ return parse_json_response(response, f"publish revision {revision} for tool {tool_id} in project {self.project_id}")
352
+
353
+
354
+ def get_parameter(
355
+ self,
356
+ tool_id: str = None,
357
+ tool_public_name: str = None,
358
+ revision: str = 0,
359
+ version: int = 0,
360
+ allow_drafts: bool = True
361
+ ):
362
+ """
363
+ Retrieves details of parameters for a specific tool identified by either its ID or public name in the specified project.
364
+
365
+ :param tool_id: str, optional - Unique identifier of the tool whose parameters are to be retrieved. Defaults to None.
366
+ :param tool_public_name: str, optional - Public name of the tool whose parameters are to be retrieved. Defaults to None.
367
+ :param revision: str - Revision of the parameters to retrieve. Defaults to "0" (latest revision).
368
+ :param version: int - Version of the parameters to retrieve. Defaults to 0 (latest version).
369
+ :param allow_drafts: bool - Whether to include draft parameters in the retrieval. Defaults to True.
370
+ :return: dict or str - JSON response containing the parameter details if successful, otherwise the raw response text.
371
+ :raises ValueError: If neither tool_id nor tool_public_name is provided.
372
+ """
373
+ if not (tool_id or tool_public_name):
374
+ raise ValueError("Either tool_id or tool_public_name must be provided.")
375
+
376
+ if tool_id:
377
+ logger.debug(f"Retrieving parameter for tool with ID {tool_id}")
378
+ else:
379
+ logger.debug(f"Retrieving parameter for tool with name '{tool_public_name}'")
380
+
381
+ endpoint = GET_PARAMETER_V2.format(toolPublicName=tool_public_name) if tool_public_name else GET_PARAMETER_V2.format(toolPublicName=tool_id)
382
+ response = self.api_service.get(
383
+ endpoint=endpoint,
384
+ params={
385
+ "revision": revision,
386
+ "version": version,
387
+ "allowDrafts": allow_drafts,
388
+ }
389
+ )
390
+ validate_status_code(response)
391
+ tool_identifier = tool_id or tool_public_name
392
+ return parse_json_response(response, f"retrieve parameters for tool {tool_identifier} in project {self.project_id}")
393
+
394
+ def set_parameter(
395
+ self,
396
+ tool_id: str = None,
397
+ tool_public_name: str = None,
398
+ parameters: list = None
399
+ ):
400
+ """
401
+ Sets or updates parameters for a specific tool identified by either its ID or public name in the specified project.
402
+
403
+ :param tool_id: str, optional - Unique identifier of the tool whose parameters are to be set. Defaults to None.
404
+ :param tool_public_name: str, optional - Public name of the tool whose parameters are to be set. Defaults to None.
405
+ :param parameters: list - List of parameter dictionaries defining the tool's parameters.
406
+ Each dictionary must contain 'key', 'dataType', 'description', and 'isRequired'.
407
+ For config parameters, include 'type', 'fromSecret', and 'value'. Defaults to None.
408
+ :return: dict or str - JSON response containing the result of the set operation if successful, otherwise the raw response text.
409
+ :raises ValueError: If neither tool_id nor tool_public_name is provided, or if parameters is None or empty.
410
+ """
411
+ if not (tool_id or tool_public_name):
412
+ raise ValueError("Either tool_id or tool_public_name must be provided.")
413
+ if not parameters:
414
+ raise ValueError("Parameters list must be provided and non-empty.")
415
+
416
+ endpoint = SET_PARAMETER_V2.format(toolPublicName=tool_public_name) if tool_public_name else SET_PARAMETER_V2.format(toolPublicName=tool_id)
417
+
418
+ data = {
419
+ "parameterDefinition": {
420
+ "parameters": parameters
421
+ }
422
+ }
423
+
424
+ if tool_id:
425
+ logger.debug(f"Setting parameter for tool with ID {tool_id} with data: {data}")
426
+ else:
427
+ logger.debug(f"Setting parameter for tool with name '{tool_public_name}' with data: {data}")
428
+
429
+ response = self.api_service.post(
430
+ endpoint=endpoint,
431
+ data=data
432
+ )
433
+ if response.status_code != 204:
434
+ logger.error(f"Unable to set parameters for tool {tool_id or tool_public_name} in project {self.project_id}: JSON parsing error (status {response.status_code}). Response: {response.text}")
435
+ raise InvalidAPIResponseException(f"Unable to set parameters for tool {tool_id or tool_public_name} in project {self.project_id}: {response.text}")
436
+ else:
437
+ return {}
438
+
439
+ '''
440
+ def export_tool(
441
+ self,
442
+ tool_id: str,
443
+ ) -> dict:
444
+ """
445
+ Retrieves details of a specific tool from the specified project.
446
+
447
+ :param tool_id: str - Unique identifier of the tool to retrieve.
448
+ :return: dict - JSON response containing the tool details.
449
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
450
+ :raises MissingRequirementException: If project_id or tool_id is not provided.
451
+ """
452
+
453
+ if not tool_id:
454
+ raise MissingRequirementException("tool_id must be specified in order to retrieve the tool")
455
+
456
+ endpoint = EXPORT_TOOL_V4.format(toolId=tool_id)
457
+ logger.debug(f"Exporting tool with ID {tool_id}")
458
+
459
+ response = self.api_service.get(
460
+ endpoint=endpoint,
461
+ )
462
+ validate_status_code(response)
463
+ return parse_json_response(response, f"export tool {tool_id} for project {self.project_id}")
464
+
465
+ '''
@@ -0,0 +1,13 @@
1
+ CREATE_TOOL_V2 = "v2/tools" # POST -> Create tool
2
+ LIST_TOOLS_V2 = "v2/tools" # GET -> List tools
3
+ GET_TOOL_V2 = "v2/tools/{toolId}" # GET -> Get tool data
4
+ DELETE_TOOL_V2 = "v2/tools/{toolId}" # DELETE -> DELETE tool data
5
+ UPDATE_TOOL_V2 = "v2/tools/{toolId}" # PUT -> Update tool data
6
+ UPSERT_TOOL_V2 = "v2/tools/{toolId}/upsert" # PUT -> Update or insert tool data
7
+ PUBLISH_TOOL_REVISION_V2 = "v2/tools/{toolId}/publish-revision" # POST -> Publish Tool revision
8
+ GET_PARAMETER_V2 = "v2/tools/{toolPublicName}/config" # GET -> Get tool parameter
9
+ SET_PARAMETER_V2 = "v2/tools/{toolPublicName}/config" # POST -> Set tool parameter
10
+ EXPORT_TOOL_V2 = "v2/tools/{toolId}/export" # GET -> Export tool
11
+ IMPORT_TOOL_V2 = "v2/tools/import" # POST -> Import tool
12
+ EXPORT_TOOL_V4 = "v4/tools/{toolId}/export" # GET -> Export tool
13
+ IMPORT_TOOL_V4 = "v4/tools/import" # POST -> Import tool
@@ -0,0 +1,131 @@
1
+ import json
2
+ from json import JSONDecodeError
3
+ from typing import List
4
+
5
+ from pygeai.lab.models import Tool, ToolParameter, ToolMessage, ToolList
6
+
7
+
8
+ class ToolMapper:
9
+ @classmethod
10
+ def _map_parameters(cls, params_data: List[dict]) -> List[ToolParameter]:
11
+ """
12
+ Maps a list of parameter dictionaries to a list of ToolParameter objects.
13
+
14
+ :param params_data: List[dict] - List of raw parameter data.
15
+ :return: List[ToolParameter] - List of mapped ToolParameter objects.
16
+ """
17
+ return [
18
+ ToolParameter(
19
+ key=param.get("key"),
20
+ data_type=param.get("dataType"),
21
+ description=param.get("description"),
22
+ is_required=param.get("isRequired"),
23
+ type=param.get("type"),
24
+ from_secret=param.get("fromSecret"),
25
+ value=param.get("value")
26
+ )
27
+ for param in params_data
28
+ ]
29
+
30
+ @classmethod
31
+ def _map_messages(cls, messages_data: List[dict]) -> List[ToolMessage]:
32
+ """
33
+ Maps a list of message dictionaries to a list of ToolMessage objects.
34
+
35
+ :param messages_data: List[dict] - List of raw message data.
36
+ :return: List[ToolMessage] - List of mapped ToolMessage objects.
37
+ """
38
+ return [
39
+ ToolMessage(
40
+ description=msg.get("description"),
41
+ type=msg.get("type")
42
+ )
43
+ for msg in messages_data
44
+ ]
45
+
46
+ @classmethod
47
+ def map_to_tool(cls, data: dict) -> Tool:
48
+ """
49
+ Maps a dictionary to a Tool object with explicit field mapping.
50
+
51
+ :param data: dict - The raw data, either input (under 'tool' key) or output (flat structure).
52
+ Expected fields include name, description, scope, parameters, accessScope, publicName,
53
+ icon, openApi, openApiJson, reportEvents, id, isDraft, messages, revision, and status.
54
+ :return: Tool - A Tool object representing the tool configuration.
55
+ """
56
+ tool_data = data.get("tool", data)
57
+
58
+ name = tool_data.get("name")
59
+ description = tool_data.get("description")
60
+ scope = tool_data.get("scope")
61
+ parameter_data = tool_data.get("parameters")
62
+ parameters = cls._map_parameters(parameter_data) if parameter_data else None
63
+
64
+ access_scope = tool_data.get("accessScope")
65
+ public_name = tool_data.get("publicName")
66
+ icon = tool_data.get("icon")
67
+ open_api = tool_data.get("openApi")
68
+ open_api_json = tool_data.get("openApiJson")
69
+ if isinstance(open_api_json, str):
70
+ try:
71
+ open_api_json = json.loads(open_api_json)
72
+ except JSONDecodeError as e:
73
+ raise ValueError("open_api_json must be a valid JSON string or a dict")
74
+
75
+ report_events = tool_data.get("reportEvents", "None")
76
+ id = tool_data.get("id")
77
+ is_draft = tool_data.get("isDraft")
78
+ messages_data = tool_data.get("messages")
79
+ messages = cls._map_messages(messages_data) if messages_data else None
80
+ revision = tool_data.get("revision")
81
+ status = tool_data.get("status")
82
+
83
+ return Tool(
84
+ name=name,
85
+ description=description,
86
+ scope=scope,
87
+ parameters=parameters,
88
+ access_scope=access_scope,
89
+ public_name=public_name,
90
+ icon=icon,
91
+ open_api=open_api,
92
+ open_api_json=open_api_json,
93
+ report_events=report_events,
94
+ id=id,
95
+ is_draft=is_draft,
96
+ messages=messages,
97
+ revision=revision,
98
+ status=status
99
+ )
100
+
101
+ @classmethod
102
+ def map_to_tool_list(cls, data: dict) -> ToolList:
103
+ """
104
+ Maps an API response dictionary to a `ToolList` object.
105
+
106
+ This method extracts tools from the given data, converts them into a list of `Tool` objects,
107
+ and returns a `ToolList` containing the list.
108
+
109
+ :param data: dict - The dictionary containing tool response data, expected to have a 'tools' key or be a list.
110
+ :return: ToolList - A structured response containing a list of tools.
111
+ """
112
+ tool_list = []
113
+ tools = data if isinstance(data, list) else data.get("tools", [])
114
+ if tools and any(tools):
115
+ for tool_data in tools:
116
+ tool = cls.map_to_tool(tool_data)
117
+ tool_list.append(tool)
118
+
119
+ return ToolList(tools=tool_list)
120
+
121
+ @classmethod
122
+ def map_to_parameter_list(cls, data: dict) -> List[ToolParameter]:
123
+ """
124
+ Maps an API response dictionary to a list of ToolParameter objects.
125
+
126
+ :param data: dict - The dictionary containing parameter response data, expected to have a 'parameters' key or be a list.
127
+ :return: List[ToolParameter] - A list of ToolParameter objects.
128
+ """
129
+ params_data = data if isinstance(data, list) else data.get("parameters", [])
130
+ return cls._map_parameters(params_data)
131
+
pygeai/man/__init__.py ADDED
@@ -0,0 +1 @@
1
+ # This file makes the man directory a Python package
@@ -0,0 +1 @@
1
+ # This file makes the man1 directory a Python package