pygeai 0.1.6__py3-none-any.whl → 0.6.0b15__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pygeai might be problematic. Click here for more details.

Files changed (788) hide show
  1. pygeai/__init__.py +11 -2
  2. pygeai/_docs/Makefile +20 -0
  3. pygeai/_docs/make.bat +35 -0
  4. pygeai/_docs/source/conf.py +117 -0
  5. pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
  6. pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
  7. pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
  8. pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
  9. pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
  10. pygeai/_docs/source/content/ai_lab.rst +102 -0
  11. pygeai/_docs/source/content/analytics.rst +598 -0
  12. pygeai/_docs/source/content/api_reference/admin.rst +161 -0
  13. pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
  14. pygeai/_docs/source/content/api_reference/auth.rst +379 -0
  15. pygeai/_docs/source/content/api_reference/chat.rst +754 -0
  16. pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
  17. pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
  18. pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
  19. pygeai/_docs/source/content/api_reference/files.rst +592 -0
  20. pygeai/_docs/source/content/api_reference/gam.rst +401 -0
  21. pygeai/_docs/source/content/api_reference/health.rst +58 -0
  22. pygeai/_docs/source/content/api_reference/project.rst +738 -0
  23. pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
  24. pygeai/_docs/source/content/api_reference/rag.rst +710 -0
  25. pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
  26. pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
  27. pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
  28. pygeai/_docs/source/content/api_reference.rst +58 -0
  29. pygeai/_docs/source/content/authentication.rst +295 -0
  30. pygeai/_docs/source/content/chat_gui.rst +121 -0
  31. pygeai/_docs/source/content/cli.rst +203 -0
  32. pygeai/_docs/source/content/debugger.rst +651 -0
  33. pygeai/_docs/source/content/intro.rst +67 -0
  34. pygeai/_docs/source/content/migration.rst +929 -0
  35. pygeai/_docs/source/content/modules.rst +7 -0
  36. pygeai/_docs/source/content/quickstart.rst +143 -0
  37. pygeai/_docs/source/content/samples.rst +394 -0
  38. pygeai/_docs/source/index.rst +75 -0
  39. pygeai/_docs/source/modules.rst +7 -0
  40. pygeai/_docs/source/pygeai.admin.rst +29 -0
  41. pygeai/_docs/source/pygeai.analytics.rst +53 -0
  42. pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
  43. pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
  44. pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
  45. pygeai/_docs/source/pygeai.assistant.rst +55 -0
  46. pygeai/_docs/source/pygeai.auth.rst +29 -0
  47. pygeai/_docs/source/pygeai.chat.rst +69 -0
  48. pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
  49. pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
  50. pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
  51. pygeai/_docs/source/pygeai.cli.rst +62 -0
  52. pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
  53. pygeai/_docs/source/pygeai.core.base.rst +53 -0
  54. pygeai/_docs/source/pygeai.core.common.rst +37 -0
  55. pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
  56. pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
  57. pygeai/_docs/source/pygeai.core.files.rst +61 -0
  58. pygeai/_docs/source/pygeai.core.llm.rst +29 -0
  59. pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
  60. pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
  61. pygeai/_docs/source/pygeai.core.rst +63 -0
  62. pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
  63. pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
  64. pygeai/_docs/source/pygeai.core.services.rst +37 -0
  65. pygeai/_docs/source/pygeai.core.utils.rst +37 -0
  66. pygeai/_docs/source/pygeai.dbg.rst +21 -0
  67. pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
  68. pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
  69. pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
  70. pygeai/_docs/source/pygeai.evaluation.rst +31 -0
  71. pygeai/_docs/source/pygeai.flows.rst +29 -0
  72. pygeai/_docs/source/pygeai.gam.rst +29 -0
  73. pygeai/_docs/source/pygeai.health.rst +29 -0
  74. pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
  75. pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
  76. pygeai/_docs/source/pygeai.lab.rst +65 -0
  77. pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
  78. pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
  79. pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
  80. pygeai/_docs/source/pygeai.man.man1.rst +10 -0
  81. pygeai/_docs/source/pygeai.man.rst +18 -0
  82. pygeai/_docs/source/pygeai.migration.rst +29 -0
  83. pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
  84. pygeai/_docs/source/pygeai.organization.rst +61 -0
  85. pygeai/_docs/source/pygeai.proxy.rst +53 -0
  86. pygeai/_docs/source/pygeai.rst +35 -0
  87. pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
  88. pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
  89. pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
  90. pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
  91. pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
  92. pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
  93. pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
  94. pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
  95. pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
  96. pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
  97. pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
  98. pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
  99. pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
  100. pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
  101. pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
  102. pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
  103. pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
  104. pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
  105. pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
  106. pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
  107. pygeai/_docs/source/pygeai.tests.core.rst +39 -0
  108. pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
  109. pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
  110. pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
  111. pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
  112. pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
  113. pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
  114. pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
  115. pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
  116. pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
  117. pygeai/_docs/source/pygeai.tests.health.rst +21 -0
  118. pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
  119. pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
  120. pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
  121. pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
  122. pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
  123. pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
  124. pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
  125. pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
  126. pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
  127. pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
  128. pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
  129. pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
  130. pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
  131. pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
  132. pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
  133. pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
  134. pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
  135. pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
  136. pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
  137. pygeai/_docs/source/pygeai.tests.rst +33 -0
  138. pygeai/admin/clients.py +14 -11
  139. pygeai/admin/endpoints.py +2 -2
  140. pygeai/analytics/clients.py +505 -0
  141. pygeai/analytics/endpoints.py +35 -0
  142. pygeai/analytics/managers.py +606 -0
  143. pygeai/analytics/mappers.py +207 -0
  144. pygeai/analytics/responses.py +240 -0
  145. pygeai/assistant/clients.py +48 -57
  146. pygeai/assistant/data/__init__.py +0 -0
  147. pygeai/assistant/data/clients.py +15 -0
  148. pygeai/assistant/data_analyst/__init__.py +0 -0
  149. pygeai/assistant/data_analyst/clients.py +75 -0
  150. pygeai/assistant/data_analyst/endpoints.py +2 -0
  151. pygeai/assistant/endpoints.py +0 -2
  152. pygeai/assistant/managers.py +738 -0
  153. pygeai/assistant/mappers.py +153 -0
  154. pygeai/assistant/rag/clients.py +132 -21
  155. pygeai/assistant/rag/mappers.py +228 -0
  156. pygeai/assistant/rag/models.py +396 -0
  157. pygeai/assistant/rag/responses.py +10 -0
  158. pygeai/auth/__init__.py +0 -0
  159. pygeai/auth/clients.py +129 -0
  160. pygeai/auth/endpoints.py +6 -0
  161. pygeai/chat/clients.py +406 -31
  162. pygeai/chat/endpoints.py +3 -0
  163. pygeai/chat/iris.py +17 -0
  164. pygeai/chat/managers.py +64 -0
  165. pygeai/chat/session.py +38 -0
  166. pygeai/chat/settings.py +6 -0
  167. pygeai/chat/ui.py +678 -0
  168. pygeai/cli/__init__.py +0 -1
  169. pygeai/cli/commands/admin.py +9 -12
  170. pygeai/cli/commands/analytics.py +533 -0
  171. pygeai/cli/commands/assistant.py +11 -11
  172. pygeai/cli/commands/auth.py +299 -0
  173. pygeai/cli/commands/base.py +201 -7
  174. pygeai/cli/commands/chat.py +875 -14
  175. pygeai/cli/commands/common.py +30 -26
  176. pygeai/cli/commands/configuration.py +84 -9
  177. pygeai/cli/commands/docs.py +105 -0
  178. pygeai/cli/commands/embeddings.py +187 -0
  179. pygeai/cli/commands/evaluation.py +2069 -0
  180. pygeai/cli/commands/feedback.py +93 -0
  181. pygeai/cli/commands/files.py +312 -0
  182. pygeai/cli/commands/flows/__init__.py +0 -0
  183. pygeai/cli/commands/gam.py +349 -0
  184. pygeai/cli/commands/lab/__init__.py +0 -0
  185. pygeai/cli/commands/lab/ai_lab.py +4110 -0
  186. pygeai/cli/commands/lab/common.py +135 -0
  187. pygeai/cli/commands/lab/options.py +8 -0
  188. pygeai/cli/commands/lab/spec.py +273 -0
  189. pygeai/cli/commands/lab/utils.py +13 -0
  190. pygeai/cli/commands/llm.py +164 -0
  191. pygeai/cli/commands/migrate.py +1198 -0
  192. pygeai/cli/commands/options.py +86 -0
  193. pygeai/cli/commands/organization.py +560 -98
  194. pygeai/cli/commands/rag.py +306 -10
  195. pygeai/cli/commands/rerank.py +108 -0
  196. pygeai/cli/commands/secrets.py +357 -0
  197. pygeai/cli/commands/usage_limits.py +583 -0
  198. pygeai/cli/commands/validators.py +209 -0
  199. pygeai/cli/commands/version.py +44 -0
  200. pygeai/cli/error_handler.py +151 -0
  201. pygeai/cli/geai.py +171 -30
  202. pygeai/cli/geai_proxy.py +318 -0
  203. pygeai/cli/install_man.py +107 -0
  204. pygeai/cli/parsers.py +78 -25
  205. pygeai/cli/texts/help.py +712 -55
  206. pygeai/core/__init__.py +9 -1
  207. pygeai/core/base/clients.py +61 -10
  208. pygeai/core/base/mappers.py +208 -30
  209. pygeai/core/base/models.py +8 -308
  210. pygeai/core/base/responses.py +18 -1
  211. pygeai/core/base/session.py +110 -17
  212. pygeai/core/common/config.py +98 -16
  213. pygeai/core/common/decorators.py +44 -0
  214. pygeai/core/common/exceptions.py +104 -4
  215. pygeai/core/embeddings/__init__.py +19 -0
  216. pygeai/core/embeddings/clients.py +93 -0
  217. pygeai/core/embeddings/endpoints.py +1 -0
  218. pygeai/core/embeddings/managers.py +62 -0
  219. pygeai/core/embeddings/mappers.py +52 -0
  220. pygeai/core/embeddings/models.py +14 -0
  221. pygeai/core/embeddings/responses.py +31 -0
  222. pygeai/core/feedback/__init__.py +0 -0
  223. pygeai/core/feedback/clients.py +50 -0
  224. pygeai/core/feedback/endpoints.py +1 -0
  225. pygeai/core/feedback/models.py +10 -0
  226. pygeai/core/files/__init__.py +0 -0
  227. pygeai/core/files/clients.py +156 -0
  228. pygeai/core/files/endpoints.py +5 -0
  229. pygeai/core/files/managers.py +224 -0
  230. pygeai/core/files/mappers.py +44 -0
  231. pygeai/core/files/models.py +24 -0
  232. pygeai/core/files/responses.py +19 -0
  233. pygeai/core/handlers.py +32 -0
  234. pygeai/core/llm/__init__.py +0 -0
  235. pygeai/core/llm/clients.py +53 -0
  236. pygeai/core/llm/endpoints.py +4 -0
  237. pygeai/core/models.py +799 -0
  238. pygeai/core/plugins/__init__.py +0 -0
  239. pygeai/core/plugins/clients.py +32 -0
  240. pygeai/core/plugins/endpoints.py +1 -0
  241. pygeai/core/plugins/models.py +86 -0
  242. pygeai/core/rerank/__init__.py +0 -0
  243. pygeai/core/rerank/clients.py +35 -0
  244. pygeai/core/rerank/endpoints.py +1 -0
  245. pygeai/core/rerank/managers.py +47 -0
  246. pygeai/core/rerank/mappers.py +23 -0
  247. pygeai/core/rerank/models.py +27 -0
  248. pygeai/core/responses.py +104 -0
  249. pygeai/core/secrets/__init__.py +0 -0
  250. pygeai/core/secrets/clients.py +212 -0
  251. pygeai/core/secrets/endpoints.py +7 -0
  252. pygeai/core/services/llm/__init__.py +0 -0
  253. pygeai/core/services/llm/model.py +186 -0
  254. pygeai/core/services/llm/providers.py +15 -0
  255. pygeai/core/services/response.py +18 -0
  256. pygeai/core/services/rest.py +311 -89
  257. pygeai/core/utils/__init__.py +0 -0
  258. pygeai/core/utils/console.py +83 -0
  259. pygeai/core/utils/parsers.py +32 -0
  260. pygeai/core/utils/validators.py +10 -0
  261. pygeai/dbg/__init__.py +3 -0
  262. pygeai/dbg/debugger.py +870 -0
  263. pygeai/evaluation/__init__.py +0 -0
  264. pygeai/evaluation/clients.py +19 -0
  265. pygeai/evaluation/dataset/__init__.py +0 -0
  266. pygeai/evaluation/dataset/clients.py +514 -0
  267. pygeai/evaluation/dataset/endpoints.py +26 -0
  268. pygeai/evaluation/plan/__init__.py +0 -0
  269. pygeai/evaluation/plan/clients.py +302 -0
  270. pygeai/evaluation/plan/endpoints.py +16 -0
  271. pygeai/evaluation/result/__init__.py +0 -0
  272. pygeai/evaluation/result/clients.py +70 -0
  273. pygeai/evaluation/result/endpoints.py +2 -0
  274. pygeai/flows/__init__.py +0 -0
  275. pygeai/flows/endpoints.py +362 -0
  276. pygeai/flows/models.py +1304 -0
  277. pygeai/gam/__init__.py +0 -0
  278. pygeai/gam/clients.py +178 -0
  279. pygeai/gam/endpoints.py +4 -0
  280. pygeai/health/__init__.py +0 -0
  281. pygeai/health/clients.py +24 -0
  282. pygeai/health/endpoints.py +1 -0
  283. pygeai/lab/__init__.py +0 -0
  284. pygeai/lab/agents/__init__.py +0 -0
  285. pygeai/lab/agents/clients.py +426 -0
  286. pygeai/lab/agents/endpoints.py +12 -0
  287. pygeai/lab/agents/mappers.py +319 -0
  288. pygeai/lab/clients.py +24 -0
  289. pygeai/lab/constants.py +3 -0
  290. pygeai/lab/managers.py +1558 -0
  291. pygeai/lab/models.py +1719 -0
  292. pygeai/lab/processes/__init__.py +0 -0
  293. pygeai/lab/processes/clients.py +1051 -0
  294. pygeai/lab/processes/endpoints.py +26 -0
  295. pygeai/lab/processes/mappers.py +395 -0
  296. pygeai/lab/runners.py +90 -0
  297. pygeai/lab/spec/__init__.py +0 -0
  298. pygeai/lab/spec/loader.py +24 -0
  299. pygeai/lab/spec/parsers.py +39 -0
  300. pygeai/lab/strategies/__init__.py +0 -0
  301. pygeai/lab/strategies/clients.py +212 -0
  302. pygeai/lab/strategies/endpoints.py +5 -0
  303. pygeai/lab/strategies/mappers.py +58 -0
  304. pygeai/lab/tools/__init__.py +0 -0
  305. pygeai/lab/tools/clients.py +465 -0
  306. pygeai/lab/tools/endpoints.py +13 -0
  307. pygeai/lab/tools/mappers.py +131 -0
  308. pygeai/man/__init__.py +1 -0
  309. pygeai/man/man1/__init__.py +1 -0
  310. pygeai/man/man1/geai-proxy.1 +246 -0
  311. pygeai/man/man1/geai.1 +2615 -0
  312. pygeai/migration/__init__.py +33 -0
  313. pygeai/migration/strategies.py +603 -0
  314. pygeai/migration/tools.py +180 -0
  315. pygeai/organization/clients.py +246 -18
  316. pygeai/organization/endpoints.py +17 -8
  317. pygeai/organization/limits/__init__.py +0 -0
  318. pygeai/organization/limits/clients.py +281 -0
  319. pygeai/organization/limits/endpoints.py +15 -0
  320. pygeai/organization/limits/managers.py +331 -0
  321. pygeai/organization/limits/mappers.py +21 -0
  322. pygeai/organization/managers.py +537 -0
  323. pygeai/organization/mappers.py +111 -46
  324. pygeai/organization/responses.py +61 -11
  325. pygeai/proxy/__init__.py +0 -0
  326. pygeai/proxy/clients.py +216 -0
  327. pygeai/proxy/config.py +128 -0
  328. pygeai/proxy/managers.py +232 -0
  329. pygeai/proxy/servers.py +304 -0
  330. pygeai/proxy/tool.py +69 -0
  331. pygeai/tests/admin/__init__.py +0 -0
  332. pygeai/tests/admin/test_clients.py +148 -0
  333. pygeai/tests/analytics/__init__.py +0 -0
  334. pygeai/tests/analytics/test_clients.py +86 -0
  335. pygeai/tests/analytics/test_managers.py +94 -0
  336. pygeai/tests/analytics/test_mappers.py +84 -0
  337. pygeai/tests/analytics/test_responses.py +73 -0
  338. pygeai/tests/assistants/rag/__init__.py +0 -0
  339. pygeai/tests/assistants/rag/test_clients.py +346 -0
  340. pygeai/tests/assistants/rag/test_mappers.py +189 -0
  341. pygeai/tests/assistants/rag/test_models.py +292 -0
  342. pygeai/tests/assistants/test_clients.py +176 -80
  343. pygeai/tests/assistants/test_managers.py +198 -0
  344. pygeai/tests/assistants/test_mappers.py +111 -0
  345. pygeai/tests/auth/__init__.py +0 -0
  346. pygeai/tests/auth/test_clients.py +289 -0
  347. pygeai/tests/auth/test_oauth.py +172 -0
  348. pygeai/tests/auth/test_session_logging.py +150 -0
  349. pygeai/tests/chat/__init__.py +0 -0
  350. pygeai/tests/chat/test_clients.py +393 -0
  351. pygeai/tests/chat/test_iris.py +38 -0
  352. pygeai/tests/chat/test_session.py +62 -0
  353. pygeai/tests/chat/test_ui.py +224 -0
  354. pygeai/tests/cli/__init__.py +0 -0
  355. pygeai/tests/cli/commands/__init__.py +0 -0
  356. pygeai/tests/cli/commands/lab/__init__.py +0 -0
  357. pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
  358. pygeai/tests/cli/commands/lab/test_common.py +208 -0
  359. pygeai/tests/cli/commands/lab/test_spec.py +246 -0
  360. pygeai/tests/cli/commands/test_assistant.py +202 -0
  361. pygeai/tests/cli/commands/test_chat.py +130 -0
  362. pygeai/tests/cli/commands/test_common.py +350 -0
  363. pygeai/tests/cli/commands/test_embeddings.py +132 -0
  364. pygeai/tests/cli/commands/test_evaluation.py +656 -0
  365. pygeai/tests/cli/commands/test_feedback.py +65 -0
  366. pygeai/tests/cli/commands/test_files.py +161 -0
  367. pygeai/tests/cli/commands/test_gam.py +201 -0
  368. pygeai/tests/cli/commands/test_llm.py +114 -0
  369. pygeai/tests/cli/commands/test_migrate.py +176 -0
  370. pygeai/tests/cli/commands/test_organization.py +276 -0
  371. pygeai/tests/cli/commands/test_rag.py +266 -0
  372. pygeai/tests/cli/commands/test_rerank.py +110 -0
  373. pygeai/tests/cli/commands/test_secrets.py +171 -0
  374. pygeai/tests/cli/commands/test_show_help.py +41 -0
  375. pygeai/tests/cli/commands/test_usage_limits.py +412 -0
  376. pygeai/tests/cli/commands/test_validators.py +160 -0
  377. pygeai/tests/cli/commands/test_version.py +81 -0
  378. pygeai/tests/cli/docker/__init__.py +0 -0
  379. pygeai/tests/cli/test_credentials_flag.py +316 -0
  380. pygeai/tests/cli/test_error_handler.py +225 -0
  381. pygeai/tests/cli/test_geai_driver.py +154 -0
  382. pygeai/tests/cli/test_parsers.py +154 -0
  383. pygeai/tests/core/base/__init__.py +0 -0
  384. pygeai/tests/core/base/data/__init__.py +0 -0
  385. pygeai/tests/core/base/data/mappers.py +117 -0
  386. pygeai/tests/core/base/data/models.py +312 -0
  387. pygeai/tests/core/base/test_mappers.py +569 -0
  388. pygeai/tests/core/base/test_models.py +261 -0
  389. pygeai/tests/core/base/test_responses.py +53 -0
  390. pygeai/tests/core/common/__init__.py +0 -0
  391. pygeai/tests/core/common/data/__init__.py +0 -0
  392. pygeai/tests/core/common/test_config.py +186 -0
  393. pygeai/tests/core/common/test_decorators.py +69 -0
  394. pygeai/tests/core/embeddings/__init__.py +0 -0
  395. pygeai/tests/core/embeddings/test_clients.py +225 -0
  396. pygeai/tests/core/embeddings/test_managers.py +171 -0
  397. pygeai/tests/core/embeddings/test_mappers.py +142 -0
  398. pygeai/tests/core/feedback/__init__.py +0 -0
  399. pygeai/tests/core/feedback/test_clients.py +64 -0
  400. pygeai/tests/core/files/__init__.py +0 -0
  401. pygeai/tests/core/files/test_clients.py +128 -0
  402. pygeai/tests/core/files/test_managers.py +219 -0
  403. pygeai/tests/core/files/test_mappers.py +137 -0
  404. pygeai/tests/core/files/test_models.py +103 -0
  405. pygeai/tests/core/files/test_responses.py +122 -0
  406. pygeai/tests/core/llm/__init__.py +0 -0
  407. pygeai/tests/core/llm/test_clients.py +142 -0
  408. pygeai/tests/core/plugins/__init__.py +0 -0
  409. pygeai/tests/core/plugins/test_clients.py +66 -0
  410. pygeai/tests/core/rerank/__init__.py +0 -0
  411. pygeai/tests/core/rerank/test_clients.py +76 -0
  412. pygeai/tests/core/rerank/test_managers.py +99 -0
  413. pygeai/tests/core/rerank/test_mappers.py +54 -0
  414. pygeai/tests/core/secrets/__init__.py +0 -0
  415. pygeai/tests/core/secrets/test_clients.py +264 -0
  416. pygeai/tests/core/services/__init__.py +0 -0
  417. pygeai/tests/core/services/test_rest.py +273 -0
  418. pygeai/tests/core/test_handlers.py +66 -0
  419. pygeai/tests/core/utils/__init__.py +0 -0
  420. pygeai/tests/core/utils/test_console.py +80 -0
  421. pygeai/tests/dbg/__init__.py +0 -0
  422. pygeai/tests/dbg/test_debugger.py +591 -0
  423. pygeai/tests/evaluation/__init__.py +0 -0
  424. pygeai/tests/evaluation/dataset/__init__.py +0 -0
  425. pygeai/tests/evaluation/dataset/test_clients.py +265 -0
  426. pygeai/tests/evaluation/plan/__init__.py +0 -0
  427. pygeai/tests/evaluation/plan/test_clients.py +195 -0
  428. pygeai/tests/evaluation/result/__init__.py +0 -0
  429. pygeai/tests/evaluation/result/test_clients.py +66 -0
  430. pygeai/tests/gam/__init__.py +0 -0
  431. pygeai/tests/gam/test_clients.py +195 -0
  432. pygeai/tests/health/__init__.py +0 -0
  433. pygeai/tests/health/test_clients.py +41 -0
  434. pygeai/tests/integration/__init__.py +0 -0
  435. pygeai/tests/integration/assistants/__init__.py +0 -0
  436. pygeai/tests/integration/assistants/rag/__init__.py +0 -0
  437. pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
  438. pygeai/tests/integration/chat/__init__.py +0 -0
  439. pygeai/tests/integration/chat/test_generate_image.py +158 -0
  440. pygeai/tests/integration/lab/__init__.py +0 -0
  441. pygeai/tests/integration/lab/agents/__init__.py +0 -0
  442. pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
  443. pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
  444. pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
  445. pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
  446. pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
  447. pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
  448. pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
  449. pygeai/tests/integration/lab/processes/__init__.py +0 -0
  450. pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
  451. pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
  452. pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
  453. pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
  454. pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
  455. pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
  456. pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
  457. pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
  458. pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
  459. pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
  460. pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
  461. pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
  462. pygeai/tests/integration/lab/tools/__init__.py +0 -0
  463. pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
  464. pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
  465. pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
  466. pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
  467. pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
  468. pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
  469. pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
  470. pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
  471. pygeai/tests/lab/__init__.py +0 -0
  472. pygeai/tests/lab/agents/__init__.py +0 -0
  473. pygeai/tests/lab/agents/test_clients.py +481 -0
  474. pygeai/tests/lab/agents/test_mappers.py +440 -0
  475. pygeai/tests/lab/processes/__init__.py +0 -0
  476. pygeai/tests/lab/processes/test_clients.py +1416 -0
  477. pygeai/tests/lab/processes/test_mappers.py +1092 -0
  478. pygeai/tests/lab/spec/__init__.py +0 -0
  479. pygeai/tests/lab/spec/test_loader.py +59 -0
  480. pygeai/tests/lab/spec/test_parsers.py +182 -0
  481. pygeai/tests/lab/strategies/__init__.py +0 -0
  482. pygeai/tests/lab/strategies/test_clients.py +241 -0
  483. pygeai/tests/lab/strategies/test_mappers.py +132 -0
  484. pygeai/tests/lab/test_managers.py +553 -0
  485. pygeai/tests/lab/test_mappers.py +245 -0
  486. pygeai/tests/lab/test_models.py +1154 -0
  487. pygeai/tests/lab/tools/__init__.py +0 -0
  488. pygeai/tests/lab/tools/test_clients.py +521 -0
  489. pygeai/tests/lab/tools/test_mappers.py +198 -0
  490. pygeai/tests/migration/__init__.py +0 -0
  491. pygeai/tests/migration/test_strategies.py +405 -0
  492. pygeai/tests/migration/test_tools.py +159 -0
  493. pygeai/tests/organization/limits/__init__.py +0 -0
  494. pygeai/tests/organization/limits/test_clients.py +567 -0
  495. pygeai/tests/organization/limits/test_managers.py +402 -0
  496. pygeai/tests/organization/test_clients.py +615 -64
  497. pygeai/tests/organization/test_managers.py +424 -0
  498. pygeai/tests/organization/test_mappers.py +153 -0
  499. pygeai/tests/organization/test_responses.py +137 -0
  500. pygeai/tests/proxy/__init__.py +1 -0
  501. pygeai/tests/proxy/test_clients.py +397 -0
  502. pygeai/tests/proxy/test_config.py +171 -0
  503. pygeai/tests/proxy/test_integration.py +305 -0
  504. pygeai/tests/proxy/test_managers.py +312 -0
  505. pygeai/tests/proxy/test_servers.py +387 -0
  506. pygeai/tests/proxy/test_tool.py +176 -0
  507. pygeai/tests/snippets/__init__.py +0 -0
  508. pygeai/tests/snippets/analytics/__init__.py +0 -0
  509. pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
  510. pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
  511. pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
  512. pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
  513. pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
  514. pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
  515. pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
  516. pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
  517. pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
  518. pygeai/tests/snippets/assistants/__init__.py +0 -0
  519. pygeai/tests/snippets/assistants/create_chat_assistant.py +54 -0
  520. pygeai/tests/snippets/assistants/create_text_assistant.py +51 -0
  521. pygeai/tests/snippets/assistants/data_analyst/__init__.py +0 -0
  522. pygeai/tests/snippets/assistants/data_analyst/extend_and_check.py +100 -0
  523. pygeai/tests/snippets/assistants/data_analyst/extend_dataset.py +9 -0
  524. pygeai/tests/snippets/assistants/data_analyst/get_status.py +9 -0
  525. pygeai/tests/snippets/assistants/file_summarizer_assistant.py +149 -0
  526. pygeai/tests/snippets/assistants/get_assistant_data.py +8 -0
  527. pygeai/tests/snippets/assistants/get_assistant_list.py +7 -0
  528. pygeai/tests/snippets/assistants/rag/__init__.py +0 -0
  529. pygeai/tests/snippets/assistants/rag/create_rag_assistant.py +65 -0
  530. pygeai/tests/snippets/assistants/rag/delete_al_documents.py +7 -0
  531. pygeai/tests/snippets/assistants/rag/delete_document.py +10 -0
  532. pygeai/tests/snippets/assistants/rag/delete_rag_assistant.py +8 -0
  533. pygeai/tests/snippets/assistants/rag/get_document.py +10 -0
  534. pygeai/tests/snippets/assistants/rag/get_documents.py +7 -0
  535. pygeai/tests/snippets/assistants/rag/get_rag_assistant_data.py +8 -0
  536. pygeai/tests/snippets/assistants/rag/update_rag_assistant.py +48 -0
  537. pygeai/tests/snippets/assistants/rag/upload_document.py +19 -0
  538. pygeai/tests/snippets/assistants/send_feedback.py +14 -0
  539. pygeai/tests/snippets/assistants/update_chat_assistant.py +63 -0
  540. pygeai/tests/snippets/auth/__init__.py +0 -0
  541. pygeai/tests/snippets/chat/__init__.py +0 -0
  542. pygeai/tests/snippets/chat/cancel_request.py +7 -0
  543. pygeai/tests/snippets/chat/chat_completion.py +28 -0
  544. pygeai/tests/snippets/chat/chat_completion_1.py +40 -0
  545. pygeai/tests/snippets/chat/chat_completion_2.py +60 -0
  546. pygeai/tests/snippets/chat/chat_completion_3.py +27 -0
  547. pygeai/tests/snippets/chat/chat_completion_4.py +67 -0
  548. pygeai/tests/snippets/chat/chat_completion_streaming.py +63 -0
  549. pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
  550. pygeai/tests/snippets/chat/get_request_status.py +7 -0
  551. pygeai/tests/snippets/chat/get_response.py +15 -0
  552. pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
  553. pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
  554. pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
  555. pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
  556. pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
  557. pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
  558. pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
  559. pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
  560. pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
  561. pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
  562. pygeai/tests/snippets/chat/send_chat_request.py +33 -0
  563. pygeai/tests/snippets/dbg/__init__.py +0 -0
  564. pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
  565. pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
  566. pygeai/tests/snippets/dbg/file_debugging.py +72 -0
  567. pygeai/tests/snippets/dbg/module_debugging.py +61 -0
  568. pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
  569. pygeai/tests/snippets/dbg/stepping_example.py +40 -0
  570. pygeai/tests/snippets/embeddings/__init__.py +0 -0
  571. pygeai/tests/snippets/embeddings/cache_example.py +31 -0
  572. pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
  573. pygeai/tests/snippets/embeddings/generate_embeddings.py +26 -0
  574. pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
  575. pygeai/tests/snippets/embeddings/openai_example.py +30 -0
  576. pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
  577. pygeai/tests/snippets/evaluation/__init__.py +0 -0
  578. pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
  579. pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
  580. pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
  581. pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
  582. pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
  583. pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
  584. pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
  585. pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
  586. pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
  587. pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
  588. pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
  589. pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
  590. pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
  591. pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
  592. pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
  593. pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
  594. pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
  595. pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
  596. pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
  597. pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
  598. pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
  599. pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
  600. pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
  601. pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
  602. pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
  603. pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
  604. pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
  605. pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
  606. pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
  607. pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
  608. pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
  609. pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
  610. pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
  611. pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
  612. pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
  613. pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
  614. pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
  615. pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
  616. pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
  617. pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
  618. pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
  619. pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
  620. pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
  621. pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
  622. pygeai/tests/snippets/files/__init__.py +0 -0
  623. pygeai/tests/snippets/files/delete_file.py +9 -0
  624. pygeai/tests/snippets/files/get_file_content.py +10 -0
  625. pygeai/tests/snippets/files/get_file_data.py +9 -0
  626. pygeai/tests/snippets/files/get_file_list.py +6 -0
  627. pygeai/tests/snippets/files/upload_file.py +13 -0
  628. pygeai/tests/snippets/gam/__init__.py +0 -0
  629. pygeai/tests/snippets/gam/gam_access_token.py +87 -0
  630. pygeai/tests/snippets/lab/__init__.py +0 -0
  631. pygeai/tests/snippets/lab/agentic_flow_example_1.py +326 -0
  632. pygeai/tests/snippets/lab/agentic_flow_example_2.py +206 -0
  633. pygeai/tests/snippets/lab/agentic_flow_example_3.py +486 -0
  634. pygeai/tests/snippets/lab/agentic_flow_example_4.py +446 -0
  635. pygeai/tests/snippets/lab/agents/__init__.py +0 -0
  636. pygeai/tests/snippets/lab/agents/create_agent.py +48 -0
  637. pygeai/tests/snippets/lab/agents/create_agent_2.py +48 -0
  638. pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
  639. pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
  640. pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
  641. pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
  642. pygeai/tests/snippets/lab/agents/delete_agent.py +12 -0
  643. pygeai/tests/snippets/lab/agents/get_agent.py +24 -0
  644. pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
  645. pygeai/tests/snippets/lab/agents/get_sharing_link.py +13 -0
  646. pygeai/tests/snippets/lab/agents/list_agents.py +18 -0
  647. pygeai/tests/snippets/lab/agents/publish_agent_revision.py +12 -0
  648. pygeai/tests/snippets/lab/agents/update_agent.py +50 -0
  649. pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
  650. pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
  651. pygeai/tests/snippets/lab/crud_ui.py +462 -0
  652. pygeai/tests/snippets/lab/processes/__init__.py +0 -0
  653. pygeai/tests/snippets/lab/processes/create_process.py +24 -0
  654. pygeai/tests/snippets/lab/processes/create_task.py +8 -0
  655. pygeai/tests/snippets/lab/processes/jobs/__init__.py +0 -0
  656. pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +21 -0
  657. pygeai/tests/snippets/lab/processes/kbs/__init__.py +0 -0
  658. pygeai/tests/snippets/lab/processes/kbs/create_kb.py +18 -0
  659. pygeai/tests/snippets/lab/processes/kbs/get_kb.py +26 -0
  660. pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +30 -0
  661. pygeai/tests/snippets/lab/processes/kbs/try_all.py +73 -0
  662. pygeai/tests/snippets/lab/processes/list_processes.py +10 -0
  663. pygeai/tests/snippets/lab/runner_1.py +212 -0
  664. pygeai/tests/snippets/lab/samples/__init__.py +0 -0
  665. pygeai/tests/snippets/lab/samples/summarize_files.py +162 -0
  666. pygeai/tests/snippets/lab/strategies/__init__.py +0 -0
  667. pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +22 -0
  668. pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +10 -0
  669. pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +16 -0
  670. pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +26 -0
  671. pygeai/tests/snippets/lab/tools/__init__.py +0 -0
  672. pygeai/tests/snippets/lab/tools/create_tool.py +48 -0
  673. pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
  674. pygeai/tests/snippets/lab/tools/delete_tool.py +21 -0
  675. pygeai/tests/snippets/lab/tools/get_parameter.py +21 -0
  676. pygeai/tests/snippets/lab/tools/get_tool.py +22 -0
  677. pygeai/tests/snippets/lab/tools/list_tools.py +23 -0
  678. pygeai/tests/snippets/lab/tools/publish_tool_revision.py +13 -0
  679. pygeai/tests/snippets/lab/tools/set_parameters.py +33 -0
  680. pygeai/tests/snippets/lab/tools/update_tool.py +52 -0
  681. pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
  682. pygeai/tests/snippets/lab/use_cases/c_code_fixer_agent_flow.py +238 -0
  683. pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
  684. pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
  685. pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
  686. pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
  687. pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
  688. pygeai/tests/snippets/lab/use_cases/file_summarizer_example.py +157 -0
  689. pygeai/tests/snippets/lab/use_cases/file_summarizer_example_2.py +157 -0
  690. pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
  691. pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
  692. pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
  693. pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
  694. pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
  695. pygeai/tests/snippets/migrate/__init__.py +45 -0
  696. pygeai/tests/snippets/migrate/agent_migration.py +110 -0
  697. pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
  698. pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
  699. pygeai/tests/snippets/migrate/process_migration.py +64 -0
  700. pygeai/tests/snippets/migrate/project_migration.py +42 -0
  701. pygeai/tests/snippets/migrate/tool_migration.py +64 -0
  702. pygeai/tests/snippets/organization/__init__.py +0 -0
  703. pygeai/tests/snippets/organization/add_project_member.py +10 -0
  704. pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
  705. pygeai/tests/snippets/organization/create_project.py +23 -0
  706. pygeai/tests/snippets/organization/delete_project.py +7 -0
  707. pygeai/tests/snippets/organization/export_request_data.py +7 -0
  708. pygeai/tests/snippets/organization/get_memberships.py +12 -0
  709. pygeai/tests/snippets/organization/get_organization_members.py +6 -0
  710. pygeai/tests/snippets/organization/get_project_data.py +7 -0
  711. pygeai/tests/snippets/organization/get_project_list.py +8 -0
  712. pygeai/tests/snippets/organization/get_project_members.py +6 -0
  713. pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
  714. pygeai/tests/snippets/organization/get_project_roles.py +6 -0
  715. pygeai/tests/snippets/organization/get_project_tokens.py +7 -0
  716. pygeai/tests/snippets/organization/update_project.py +14 -0
  717. pygeai/tests/snippets/rerank/__init__.py +0 -0
  718. pygeai/tests/snippets/rerank/rerank_chunks.py +19 -0
  719. pygeai/tests/snippets/secrets/__init__.py +0 -0
  720. pygeai/tests/snippets/usage_limit/__init__.py +0 -0
  721. pygeai/tests/snippets/usage_limit/delete_usage_limit.py +16 -0
  722. pygeai/tests/snippets/usage_limit/get_all_usage_limit_from_organization.py +12 -0
  723. pygeai/tests/snippets/usage_limit/get_usage_limit_from_organization.py +11 -0
  724. pygeai/tests/snippets/usage_limit/get_usage_limit_from_project.py +13 -0
  725. pygeai/tests/snippets/usage_limit/set_usage_limit_organization.py +22 -0
  726. pygeai/tests/snippets/usage_limit/set_usage_limit_project.py +23 -0
  727. pygeai/tests/snippets/usage_limit/update_usage_limit_organization.py +23 -0
  728. pygeai/tests/snippets/usage_limit/update_usage_limit_project.py +24 -0
  729. pygeai/vendor/a2a/__init__.py +1 -0
  730. pygeai/vendor/a2a/auth/__init__.py +0 -0
  731. pygeai/vendor/a2a/auth/user.py +31 -0
  732. pygeai/vendor/a2a/client/__init__.py +19 -0
  733. pygeai/vendor/a2a/client/client.py +425 -0
  734. pygeai/vendor/a2a/client/errors.py +33 -0
  735. pygeai/vendor/a2a/client/helpers.py +22 -0
  736. pygeai/vendor/a2a/py.typed +0 -0
  737. pygeai/vendor/a2a/server/__init__.py +1 -0
  738. pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
  739. pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
  740. pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
  741. pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
  742. pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
  743. pygeai/vendor/a2a/server/apps/__init__.py +16 -0
  744. pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
  745. pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
  746. pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
  747. pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
  748. pygeai/vendor/a2a/server/context.py +23 -0
  749. pygeai/vendor/a2a/server/events/__init__.py +21 -0
  750. pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
  751. pygeai/vendor/a2a/server/events/event_queue.py +156 -0
  752. pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
  753. pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
  754. pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
  755. pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
  756. pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
  757. pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
  758. pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
  759. pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
  760. pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
  761. pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
  762. pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
  763. pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
  764. pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
  765. pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
  766. pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
  767. pygeai/vendor/a2a/types.py +1624 -0
  768. pygeai/vendor/a2a/utils/__init__.py +40 -0
  769. pygeai/vendor/a2a/utils/artifact.py +72 -0
  770. pygeai/vendor/a2a/utils/errors.py +69 -0
  771. pygeai/vendor/a2a/utils/helpers.py +176 -0
  772. pygeai/vendor/a2a/utils/message.py +83 -0
  773. pygeai/vendor/a2a/utils/task.py +57 -0
  774. pygeai/vendor/a2a/utils/telemetry.py +299 -0
  775. pygeai-0.6.0b15.dist-info/METADATA +205 -0
  776. pygeai-0.6.0b15.dist-info/RECORD +799 -0
  777. {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
  778. pygeai-0.6.0b15.dist-info/entry_points.txt +5 -0
  779. {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info/licenses}/LICENSE +13 -1
  780. {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info}/top_level.txt +0 -1
  781. docs/source/conf.py +0 -45
  782. pygeai/core/clients.py +0 -240
  783. pygeai/tests/core/test_clients.py +0 -49
  784. pygeai-0.1.6.dist-info/METADATA +0 -92
  785. pygeai-0.1.6.dist-info/RECORD +0 -65
  786. pygeai-0.1.6.dist-info/SOURCES.sync-conflict-20241223-145950-3QD4F42.txt +0 -41
  787. pygeai-0.1.6.dist-info/entry_points.txt +0 -2
  788. /pygeai/{agent → analytics}/__init__.py +0 -0
pygeai/gam/__init__.py ADDED
File without changes
pygeai/gam/clients.py ADDED
@@ -0,0 +1,178 @@
1
+
2
+ from pygeai import logger
3
+ from pygeai.core.base.clients import BaseClient
4
+ from pygeai.core.common.exceptions import MissingRequirementException, InvalidAPIResponseException
5
+ from pygeai.core.utils.validators import validate_status_code
6
+ from pygeai.core.utils.parsers import parse_json_response
7
+ from pygeai.gam.endpoints import GET_ACCESS_TOKEN_V2, GET_USER_INFO_V2, IDP_SIGNIN_V1
8
+
9
+
10
+ class GAMClient(BaseClient):
11
+
12
+ def generate_signing_url(
13
+ self,
14
+ client_id: str = None,
15
+ redirect_uri: str = None,
16
+ scope: str = "gam_user_data",
17
+ state: str = None,
18
+ response_type: str = "code"
19
+ ):
20
+ """
21
+ Generates the URL for the GAM OAuth 2.0 signin endpoint to initiate user authentication.
22
+ This method does not perform the signin itself but provides the URL for redirection in a browser-based flow.
23
+
24
+ :param client_id: str - Client ID of the application. Required.
25
+ :param redirect_uri: str - Callback URL configured in the application. Required.
26
+ :param scope: str - Scope of the user account to access (e.g., "gam_user_data").
27
+ Defaults to "gam_user_data".
28
+ :param state: str - Random string to store the status before the request. Required.
29
+ :param response_type: str - Response type for the signin request. Defaults to "code".
30
+ :return: str - The URL to redirect to for user authentication in a browser.
31
+ :raises MissingRequirementException: If required parameters are missing.
32
+ """
33
+ if not all([client_id, redirect_uri, state]):
34
+ raise MissingRequirementException("client_id, redirect_uri, and state are required.")
35
+
36
+ params = {
37
+ "response_type": response_type,
38
+ "client_id": client_id,
39
+ "redirect_uri": redirect_uri,
40
+ "state": state
41
+ }
42
+ if scope:
43
+ params["scope"] = scope
44
+
45
+ endpoint = f"{self.api_service.base_url}{IDP_SIGNIN_V1}"
46
+ redirect_url = f"{endpoint}?{'&'.join(f'{k}={v}' for k, v in params.items())}"
47
+ return redirect_url
48
+
49
+ def get_access_token(
50
+ self,
51
+ client_id: str = None,
52
+ client_secret: str = None,
53
+ grant_type: str = "password",
54
+ authentication_type_name: str = "local",
55
+ scope: str = "gam_user_data",
56
+ username: str = None,
57
+ password: str = None,
58
+ initial_properties: dict = None,
59
+ repository: str = None,
60
+ request_token_type: str = "OAuth"
61
+ ):
62
+ """
63
+ Retrieves an access token by sending a POST request to the GAM OAuth 2.0 access token endpoint.
64
+
65
+ :param client_id: str - Application Client ID. Required.
66
+ :param client_secret: str - Application Client Secret. Required.
67
+ :param grant_type: str - Grant type for authentication. Must be "password". Defaults to "password".
68
+ :param authentication_type_name: str - Authentication type name. Defaults to "local".
69
+ :param scope: str - Scope of the user account to access (e.g., "gam_user_data+gam_user_roles").
70
+ Defaults to "gam_user_data".
71
+ :param username: str - Username of the user to be authenticated. Required.
72
+ :param password: str - Password of the user to be authenticated. Required.
73
+ :param initial_properties: dict - User custom properties array (e.g., [{"Id":"Company","Value":"GeneXus"}]). Optional.
74
+ :param repository: str - Repository identifier, used only if IDP is multitenant. Optional.
75
+ :param request_token_type: str - Determines the token type to return and security policy.
76
+ Options are "OAuth" or "Web". Defaults to "OAuth".
77
+ :return: dict or str - Access token response containing access_token, token_type, expires_in,
78
+ refresh_token, scope, and user_guid; returns raw text if JSON parsing fails.
79
+ """
80
+ data = {
81
+ "grant_type": grant_type,
82
+ "authentication_type_name": authentication_type_name,
83
+ "scope": scope,
84
+ "request_token_type": request_token_type
85
+ }
86
+ if client_id is not None:
87
+ data["client_id"] = client_id
88
+ if client_secret is not None:
89
+ data["client_secret"] = client_secret
90
+ if username is not None:
91
+ data["username"] = username
92
+ if password is not None:
93
+ data["password"] = password
94
+ if initial_properties is not None:
95
+ data["initial_properties"] = initial_properties
96
+ if repository is not None:
97
+ data["repository"] = repository
98
+
99
+ headers = {
100
+ "Content-Type": "application/x-www-form-urlencoded"
101
+ }
102
+ response = self.api_service.post(
103
+ endpoint=GET_ACCESS_TOKEN_V2,
104
+ data=data,
105
+ headers=headers,
106
+ form=True
107
+ )
108
+ validate_status_code(response)
109
+ return parse_json_response(response, "get access token")
110
+
111
+ def get_user_info(
112
+ self,
113
+ access_token: str
114
+ ):
115
+ """
116
+ Retrieves user information by sending a GET request to the GAM OAuth 2.0 userinfo endpoint.
117
+
118
+ :param access_token: str - Access token obtained from the access_token endpoint. Required.
119
+ :return: dict or str - User information response containing guid, username, email, and other user
120
+ details based on requested scopes; returns raw text if JSON parsing fails.
121
+ """
122
+ headers = {
123
+ "Authorization": access_token,
124
+ "Content-Type": "application/x-www-form-urlencoded"
125
+ }
126
+ response = self.api_service.get(
127
+ endpoint=GET_USER_INFO_V2,
128
+ headers=headers
129
+ )
130
+ validate_status_code(response)
131
+ return parse_json_response(response, "get user info")
132
+
133
+ def refresh_access_token(
134
+ self,
135
+ client_id: str = None,
136
+ client_secret: str = None,
137
+ grant_type: str = "refresh_token",
138
+ refresh_token: str = None
139
+ ):
140
+ """
141
+ Refreshes an access token by sending a GET request to the GAM OAuth 2.0 access token endpoint.
142
+
143
+ :param client_id: str - Application Client ID. Required.
144
+ :param client_secret: str - Application Client Secret. Required.
145
+ :param grant_type: str - Grant type for authentication. Must be "refresh_token". Defaults to "refresh_token".
146
+ :param refresh_token: str - Refresh token obtained from a previous access token response. Required.
147
+ :return: dict or str - New access token response containing access_token, token_type, expires_in,
148
+ refresh_token, scope, and user_guid; returns raw text if JSON parsing fails.
149
+ """
150
+ data = {
151
+ "grant_type": grant_type,
152
+ }
153
+ if client_id is not None:
154
+ data["client_id"] = client_id
155
+ if client_secret is not None:
156
+ data["client_secret"] = client_secret
157
+ if refresh_token is not None:
158
+ data["refresh_token"] = refresh_token
159
+
160
+ headers = {
161
+ "Content-Type": "application/x-www-form-urlencoded"
162
+ }
163
+ response = self.api_service.post(
164
+ endpoint=GET_ACCESS_TOKEN_V2,
165
+ data=data,
166
+ headers=headers,
167
+ form=True
168
+ )
169
+ validate_status_code(response)
170
+ return parse_json_response(response, "refresh access token")
171
+
172
+ def get_authentication_types(self):
173
+ response = self.api_service.get(
174
+ endpoint=GET_ACCESS_TOKEN_V2,
175
+ params={},
176
+ )
177
+ validate_status_code(response)
178
+ return parse_json_response(response, "get authentication types")
@@ -0,0 +1,4 @@
1
+ GET_ACCESS_TOKEN_V2 = "oauth/gam/v2.0/access_token" # POST -> Sends the user credentials to get a new Token
2
+ GET_USER_INFO_V2 = "oauth/gam/v2.0/userinfo" # GET -> Send the access_token obtained in the previous request and get the user info depending on the scopes you have indicated.
3
+ GET_AUTHENTICATION_TYPES_V1 = "v1/gam/authentication-types" # GET -> Get authentication types
4
+ IDP_SIGNIN_V1 = "/oauth/gam/signin" # NO METHOD -> Just generates URL for authentication in browser
File without changes
@@ -0,0 +1,24 @@
1
+
2
+ from pygeai import logger
3
+ from pygeai.core.base.clients import BaseClient
4
+ from pygeai.core.common.exceptions import InvalidAPIResponseException
5
+ from pygeai.core.utils.validators import validate_status_code
6
+ from pygeai.core.utils.parsers import parse_json_response
7
+ from pygeai.health.endpoints import STATUS_CHECK_V1
8
+
9
+
10
+ class HealthClient(BaseClient):
11
+
12
+ def check_api_status(self) -> dict:
13
+ """
14
+ Checks the status of the API.
15
+
16
+ :return: dict - The API response as a JSON object containing details about the API status.
17
+ If the response cannot be parsed as JSON, returns the raw response text.
18
+ """
19
+ endpoint = STATUS_CHECK_V1
20
+ response = self.api_service.get(
21
+ endpoint=endpoint
22
+ )
23
+ validate_status_code(response)
24
+ return parse_json_response(response, "check API status")
@@ -0,0 +1 @@
1
+ STATUS_CHECK_V1 = "/v1/system/status" # GET -> Health Check SAIA APIs
pygeai/lab/__init__.py ADDED
File without changes
File without changes
@@ -0,0 +1,426 @@
1
+ from typing import Optional, List, Dict
2
+
3
+ from pygeai import logger
4
+ from pygeai.core.common.exceptions import MissingRequirementException, InvalidAPIResponseException
5
+ from pygeai.core.utils.validators import validate_status_code
6
+ from pygeai.core.utils.parsers import parse_json_response
7
+ from pygeai.lab.agents.endpoints import CREATE_AGENT_V2, LIST_AGENTS_V2, GET_AGENT_V2, CREATE_SHARING_LINK_V2, \
8
+ PUBLISH_AGENT_REVISION_V2, DELETE_AGENT_V2, UPDATE_AGENT_V2, UPSERT_AGENT_V2, EXPORT_AGENT_V2, IMPORT_AGENT_V2
9
+ from pygeai.lab.constants import VALID_ACCESS_SCOPES
10
+ from pygeai.lab.clients import AILabClient
11
+
12
+
13
+ class AgentClient(AILabClient):
14
+
15
+ def list_agents(
16
+ self,
17
+ status: str = "",
18
+ start: int = "",
19
+ count: int = "",
20
+ access_scope: str = "public",
21
+ allow_drafts: bool = True,
22
+ allow_external: bool = False
23
+ ) -> dict:
24
+ """
25
+ Retrieves a list of agents associated with the specified project.
26
+
27
+ :param status: str, optional - Filter agents by status (e.g., "active", "draft"). Defaults to "" (no filtering).
28
+ :param start: int, optional - Starting index for pagination. Defaults to "" (no offset).
29
+ :param count: int, optional - Maximum number of agents to retrieve. Defaults to "" (no limit).
30
+ :param access_scope: str, optional - Filter agents by access scope ("public" or "private"). Defaults to "public".
31
+ :param allow_drafts: bool, optional - Include draft agents in the results. Defaults to True.
32
+ :param allow_external: bool, optional - Include external agents in the results. Defaults to False.
33
+ :return: dict - JSON response containing the list of agents.
34
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
35
+ """
36
+ endpoint = LIST_AGENTS_V2
37
+ headers = {
38
+ "Authorization": self.api_service.token,
39
+ "ProjectId": self.project_id
40
+ }
41
+
42
+ logger.debug(f"Listing agents for project with ID {self.project_id}")
43
+
44
+ response = self.api_service.get(
45
+ endpoint=endpoint,
46
+ headers=headers,
47
+ params={
48
+ "status": status,
49
+ "start": start,
50
+ "count": count,
51
+ "accessScope": access_scope,
52
+ "allowDrafts": allow_drafts,
53
+ "allowExternal": allow_external
54
+ }
55
+ )
56
+ validate_status_code(response)
57
+ return parse_json_response(response, f"list agents for project {self.project_id}")
58
+
59
+ def create_agent(
60
+ self,
61
+ name: str,
62
+ access_scope: str,
63
+ public_name: str,
64
+ job_description: str,
65
+ avatar_image: str,
66
+ description: str,
67
+ agent_data_prompt: dict,
68
+ agent_data_llm_config: dict,
69
+ agent_data_strategy_name: str,
70
+ agent_data_models: list,
71
+ agent_data_resource_pools: Optional[List[Dict]] = None,
72
+ automatic_publish: bool = False
73
+ ) -> dict:
74
+ """
75
+ Creates a new agent in the specified project.
76
+
77
+ :param name: str - Name of the agent (must be unique within the project, non-empty, and exclude ':' or '/').
78
+ :param access_scope: str - Access scope of the agent ("public" or "private").
79
+ :param public_name: str - Public name for the agent, required if access_scope is "public" (must follow domain/library convention, e.g., 'com.example.my-agent').
80
+ :param job_description: str - Description of the agent's role (optional).
81
+ :param avatar_image: str - URL for the agent's avatar image (optional).
82
+ :param description: str - Detailed description of the agent’s purpose (optional).
83
+ :param agent_data_prompt: dict - Prompt configuration, including 'context', 'instructions', and optional 'examples' (e.g., {'context': str, 'instructions': str, 'examples': [{'inputData': str, 'output': str}]}).
84
+ :param agent_data_llm_config: dict - LLM configuration (e.g., {'maxTokens': int, 'timeout': int, 'sampling': {'temperature': float}}).
85
+ :param agent_data_strategy_name: str - Strategy name to be used.
86
+ :param agent_data_models: list - List of models the agent can use (e.g., [{'name': 'gpt-4o', 'llmConfig': dict}]).
87
+ :param agent_data_resource_pools: Optional[List[Dict]] - Resource pools for tools and helper agents (e.g., [{'name': str, 'tools': [{'name': str, 'revision': int}], 'agents': [{'name': str, 'revision': int}]}]).
88
+ :param automatic_publish: bool - Automatically publish the agent after creation (default: False).
89
+ :return: dict - JSON response containing the created agent details.
90
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
91
+ :raises ValueError: If access_scope is invalid.
92
+ """
93
+ if access_scope is not None and access_scope not in VALID_ACCESS_SCOPES:
94
+ raise ValueError(f"Access scope must be one of {', '.join(VALID_ACCESS_SCOPES)}.")
95
+
96
+ data = {
97
+ "agentDefinition": {
98
+ "name": name,
99
+ "accessScope": access_scope,
100
+ "publicName": public_name,
101
+ "jobDescription": job_description,
102
+ "avatarImage": avatar_image,
103
+ "description": description,
104
+ }
105
+ }
106
+ if (
107
+ agent_data_prompt or agent_data_strategy_name or agent_data_prompt or agent_data_resource_pools or
108
+ agent_data_llm_config or agent_data_models
109
+ ):
110
+ data["agentDefinition"]["agentData"] = {}
111
+ if agent_data_resource_pools is not None:
112
+ data["agentDefinition"]["agentData"]["resourcePools"] = agent_data_resource_pools
113
+ if agent_data_prompt is not None:
114
+ data["agentDefinition"]["agentData"]["prompt"] = agent_data_prompt
115
+ if agent_data_llm_config is not None:
116
+ data["agentDefinition"]["agentData"]["llmConfig"] = agent_data_llm_config
117
+ if agent_data_strategy_name is not None:
118
+ data["agentDefinition"]["agentData"]["strategyName"] = agent_data_strategy_name
119
+ if agent_data_models is not None:
120
+ data["agentDefinition"]["agentData"]["models"] = agent_data_models
121
+ logger.debug(f"Creating agent with data: {data}")
122
+
123
+ endpoint = CREATE_AGENT_V2
124
+ if automatic_publish:
125
+ endpoint = f"{endpoint}?automaticPublish=true"
126
+
127
+ headers = {
128
+ "Authorization": self.api_service.token,
129
+ "ProjectId": self.project_id
130
+ }
131
+
132
+ response = self.api_service.post(
133
+ endpoint=endpoint,
134
+ headers=headers,
135
+ data=data
136
+ )
137
+
138
+ validate_status_code(response)
139
+ return parse_json_response(response, f"create agent for project {self.project_id}")
140
+
141
+
142
+ def get_agent(
143
+ self,
144
+ agent_id: str,
145
+ revision: str = 0,
146
+ version: int = 0,
147
+ allow_drafts: bool = True
148
+ ) -> dict:
149
+ """
150
+ Retrieves details of a specific agent from the specified project.
151
+
152
+ :param agent_id: str - Unique identifier of the agent to retrieve.
153
+ :param revision: str, optional - Specific revision of the agent to retrieve (default: 0, latest revision).
154
+ :param version: int, optional - Specific version of the agent to retrieve (default: 0, latest version).
155
+ :param allow_drafts: bool, optional - Include draft agents in the results (default: True).
156
+ :return: dict - JSON response containing the agent details.
157
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
158
+ :raises MissingRequirementException: If project_id or agent_id is not provided.
159
+ """
160
+ if not agent_id:
161
+ raise MissingRequirementException("agent_id must be specified in order to retrieve the agent")
162
+
163
+ endpoint = GET_AGENT_V2.format(agentId=agent_id)
164
+ headers = {
165
+ "Authorization": self.api_service.token,
166
+ "ProjectId": self.project_id
167
+ }
168
+
169
+ logger.debug(f"Retrieving agent detail with ID {agent_id}")
170
+
171
+ response = self.api_service.get(
172
+ endpoint=endpoint,
173
+ headers=headers,
174
+ params={
175
+ "revision": revision,
176
+ "version": version,
177
+ "allowDrafts": allow_drafts,
178
+ }
179
+ )
180
+ validate_status_code(response)
181
+ return parse_json_response(response, f"retrieve agent {agent_id} for project {self.project_id}")
182
+
183
+
184
+ def create_sharing_link(
185
+ self,
186
+ agent_id: str,
187
+ ) -> dict:
188
+ """
189
+ Creates a sharing link for a specific agent in the specified project.
190
+
191
+ :param agent_id: str - Unique identifier of the agent for which to create a sharing link.
192
+ :return: dict - JSON response containing the sharing link details.
193
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
194
+ :raises MissingRequirementException: If project_id or agent_id is not provided.
195
+ """
196
+ if not agent_id:
197
+ raise MissingRequirementException("agent_id must be specified in order to create sharing link")
198
+
199
+ endpoint = CREATE_SHARING_LINK_V2.format(agentId=agent_id)
200
+ headers = {
201
+ "Authorization": self.api_service.token,
202
+ "ProjectId": self.project_id
203
+ }
204
+
205
+ logger.debug(f"Creating sharing link for agent with ID {agent_id}")
206
+
207
+ response = self.api_service.get(
208
+ endpoint=endpoint,
209
+ headers=headers,
210
+ params={}
211
+ )
212
+ validate_status_code(response)
213
+ return parse_json_response(response, f"create sharing link for agent {agent_id} in project {self.project_id}")
214
+
215
+
216
+ def publish_agent_revision(
217
+ self,
218
+ agent_id: str,
219
+ revision: str
220
+ ) -> dict:
221
+ """
222
+ Publishes a specific revision of an agent in the specified project.
223
+
224
+ :param agent_id: str - Unique identifier of the agent to publish.
225
+ :param revision: str - Revision of the agent to publish.
226
+ :return: dict - JSON response containing the result of the publish operation.
227
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
228
+ """
229
+ endpoint = PUBLISH_AGENT_REVISION_V2.format(agentId=agent_id)
230
+ headers = {
231
+ "Authorization": self.api_service.token,
232
+ "ProjectId": self.project_id
233
+ }
234
+
235
+ logger.debug(f"Publishing revision {revision} for agent with ID {agent_id}")
236
+
237
+ response = self.api_service.post(
238
+ endpoint=endpoint,
239
+ headers=headers,
240
+ data={
241
+ "revision": revision,
242
+ }
243
+ )
244
+ validate_status_code(response)
245
+ return parse_json_response(response, f"publish revision {revision} for agent {agent_id} in project {self.project_id}")
246
+
247
+
248
+ def delete_agent(
249
+ self,
250
+ agent_id: str,
251
+ ) -> dict:
252
+ """
253
+ Deletes a specific agent from the specified project.
254
+
255
+ :param agent_id: str - Unique identifier of the agent to delete.
256
+ :return: dict - JSON response confirming the deletion.
257
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
258
+ """
259
+ endpoint = DELETE_AGENT_V2.format(agentId=agent_id)
260
+ headers = {
261
+ "Authorization": self.api_service.token,
262
+ "ProjectId": self.project_id
263
+ }
264
+
265
+ logger.debug(f"Deleting agent with ID {agent_id}")
266
+
267
+ response = self.api_service.delete(
268
+ endpoint=endpoint,
269
+ headers=headers,
270
+ data={}
271
+ )
272
+ if response.status_code != 204:
273
+ logger.error(f"Unable to delete agent {agent_id} from project {self.project_id}: JSON parsing error (status {response.status_code}). Response: {response.text}")
274
+ raise InvalidAPIResponseException(f"Unable to delete agent {agent_id} from project {self.project_id}: {response.text}")
275
+ else:
276
+ return {}
277
+
278
+ def update_agent(
279
+ self,
280
+ agent_id: str,
281
+ name: str,
282
+ access_scope: str,
283
+ public_name: str,
284
+ job_description: str,
285
+ avatar_image: str,
286
+ description: str,
287
+ agent_data_prompt: dict,
288
+ agent_data_llm_config: dict,
289
+ agent_data_strategy_name: dict,
290
+ agent_data_models: list,
291
+ agent_data_resource_pools: Optional[List[Dict]] = None,
292
+ automatic_publish: bool = False,
293
+ upsert: bool = False
294
+ ) -> dict:
295
+ """
296
+ Updates an existing agent in the specified project or upserts it if specified.
297
+
298
+ :param agent_id: str - Unique identifier of the agent to update (required for updates).
299
+ :param name: str - Updated name of the agent (must be unique, non-empty, exclude ':' or '/'; optional).
300
+ :param access_scope: str - Updated access scope ("public" or "private").
301
+ :param public_name: str - Updated public name, required if access_scope is "public" (must follow domain/library convention).
302
+ :param job_description: str - Updated role description (optional).
303
+ :param avatar_image: str - Updated avatar image URL (optional).
304
+ :param description: str - Updated purpose description (optional).
305
+ :param agent_data_prompt: dict - Updated prompt configuration (e.g., {'context': str, 'instructions': str, 'examples': [{'inputData': str, 'output': str}]}).
306
+ :param agent_data_llm_config: dict - Updated LLM configuration (e.g., {'maxTokens': int, 'timeout': int, 'sampling': {'temperature': float}}).
307
+ :param agent_data_strategy_name: str - Updated StrategyName configuration.
308
+ :param agent_data_models: list - Updated model list (e.g., [{'name': 'gpt-4o', 'llmConfig': dict}]).
309
+ :param agent_data_resource_pools: Optional[List[Dict]] - Updated resource pools (e.g., [{'name': str, 'tools': [{'name': str, 'revision': int}], 'agents': [{'name': str, 'revision': int}]}]).
310
+ :param automatic_publish: bool - Automatically publish the agent after updating (default: False).
311
+ :param upsert: bool - Create the agent if it does not exist (default: False).
312
+ :return: dict - JSON response containing the updated or created agent details.
313
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
314
+ :raises ValueError: If access_scope is invalid.
315
+ """
316
+ if access_scope is not None and access_scope not in VALID_ACCESS_SCOPES:
317
+ raise ValueError(f"Access scope must be one of {', '.join(VALID_ACCESS_SCOPES)}.")
318
+
319
+ data = {
320
+ "agentDefinition": {
321
+ "name": name,
322
+ "accessScope": access_scope,
323
+ "publicName": public_name,
324
+ "jobDescription": job_description,
325
+ "avatarImage": avatar_image,
326
+ "description": description,
327
+ }
328
+ }
329
+ if (
330
+ agent_data_prompt or agent_data_strategy_name or agent_data_prompt or agent_data_resource_pools or
331
+ agent_data_llm_config or agent_data_models
332
+ ):
333
+ data["agentDefinition"]["agentData"] = {}
334
+ if agent_data_resource_pools is not None:
335
+ data["agentDefinition"]["agentData"]["resourcePools"] = agent_data_resource_pools
336
+ if agent_data_prompt is not None:
337
+ data["agentDefinition"]["agentData"]["prompt"] = agent_data_prompt
338
+ if agent_data_llm_config is not None:
339
+ data["agentDefinition"]["agentData"]["llmConfig"] = agent_data_llm_config
340
+ if agent_data_strategy_name is not None:
341
+ data["agentDefinition"]["agentData"]["strategyName"] = agent_data_strategy_name
342
+ if agent_data_models is not None:
343
+ data["agentDefinition"]["agentData"]["models"] = agent_data_models
344
+
345
+ logger.debug(f"Updating agent with ID {agent_id} with data: {data}")
346
+
347
+ endpoint = UPSERT_AGENT_V2 if upsert else UPDATE_AGENT_V2
348
+ endpoint = endpoint.format(agentId=agent_id) if agent_id else endpoint.format(agentId=name)
349
+
350
+ if automatic_publish:
351
+ endpoint = f"{endpoint}?automaticPublish=true"
352
+
353
+ headers = {
354
+ "Authorization": self.api_service.token,
355
+ "ProjectId": self.project_id
356
+ }
357
+
358
+ response = self.api_service.put(
359
+ endpoint=endpoint,
360
+ headers=headers,
361
+ data=data
362
+ )
363
+
364
+ validate_status_code(response)
365
+ return parse_json_response(response, f"update agent {agent_id} in project {self.project_id}")
366
+
367
+
368
+ def export_agent(
369
+ self,
370
+ agent_id: str,
371
+ ) -> dict:
372
+ """
373
+ Retrieves details of a specific agent from the specified project.
374
+
375
+ :param agent_id: str - Unique identifier of the agent to retrieve.
376
+ :return: dict - JSON response containing the agent details.
377
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
378
+ :raises MissingRequirementException: If project_id or agent_id is not provided.
379
+ """
380
+ if not agent_id:
381
+ raise MissingRequirementException("agent_id must be specified in order to export the agent")
382
+
383
+ endpoint = EXPORT_AGENT_V2.format(agentId=agent_id)
384
+ headers = {
385
+ "Authorization": self.api_service.token,
386
+ "ProjectId": self.project_id
387
+ }
388
+
389
+ logger.debug(f"Exporting agent with ID {agent_id}")
390
+
391
+ response = self.api_service.get(
392
+ endpoint=endpoint,
393
+ headers=headers,
394
+ )
395
+ validate_status_code(response)
396
+ return parse_json_response(response, f"export agent {agent_id} for project {self.project_id}")
397
+
398
+ def import_agent(
399
+ self,
400
+ data: dict,
401
+ ) -> dict:
402
+ """
403
+ Retrieves details of a specific agent from the specified project.
404
+
405
+ :param data: dict - Agent specification to import
406
+ :return: dict - JSON response containing the agent details.
407
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
408
+ :raises MissingRequirementException: If project_id or agent_id is not provided.
409
+ """
410
+ if not data:
411
+ raise MissingRequirementException("data for spec must be specified in order to import the agent")
412
+
413
+ endpoint = IMPORT_AGENT_V2
414
+ headers = {
415
+ "Authorization": self.api_service.token,
416
+ "ProjectId": self.project_id
417
+ }
418
+
419
+ response = self.api_service.post(
420
+ endpoint=endpoint,
421
+ headers=headers,
422
+ data=data
423
+ )
424
+ validate_status_code(response)
425
+ return parse_json_response(response, f"import agent for project {self.project_id}")
426
+
@@ -0,0 +1,12 @@
1
+ CREATE_AGENT_V2 = "v2/agents" # POST -> Create agent
2
+ LIST_AGENTS_V2 = "v2/agents" # GET -> List agents
3
+ GET_AGENT_V2 = "v2/agents/{agentId}" # GET -> Get agent data
4
+ CREATE_SHARING_LINK_V2 = "v2/agents/{agentId}/sharing-token" # GET -> Create sharing link
5
+ PUBLISH_AGENT_REVISION_V2 = "v2/agents/{agentId}/publish-revision" # POST -> Publish Agent revision
6
+ DELETE_AGENT_V2 = "v2/agents/{agentId}" # DEL -> Delete agent
7
+ UPDATE_AGENT_V2 = "v2/agents/{agentId}" # PUT -> Update agent
8
+ UPSERT_AGENT_V2 = "v2/agents/{agentId}/upsert" # PUT -> Update or Insert agent
9
+ EXPORT_AGENT_V2 = "v2/agents/{agentId}/export" # GET -> Export agent
10
+ IMPORT_AGENT_V2 = "v2/agents/import" # POST -> Import agent
11
+ # EXPORT_AGENT_V4 = "v4/agents/{agentId}/export" # GET -> Export agent
12
+ # IMPORT_AGENT_V4 = "v4/agents/import" # POST -> Import agent