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

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

Potentially problematic release.


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

Files changed (788) hide show
  1. pygeai/__init__.py +11 -2
  2. pygeai/_docs/Makefile +20 -0
  3. pygeai/_docs/make.bat +35 -0
  4. pygeai/_docs/source/conf.py +117 -0
  5. pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
  6. pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
  7. pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
  8. pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
  9. pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
  10. pygeai/_docs/source/content/ai_lab.rst +102 -0
  11. pygeai/_docs/source/content/analytics.rst +598 -0
  12. pygeai/_docs/source/content/api_reference/admin.rst +161 -0
  13. pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
  14. pygeai/_docs/source/content/api_reference/auth.rst +379 -0
  15. pygeai/_docs/source/content/api_reference/chat.rst +754 -0
  16. pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
  17. pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
  18. pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
  19. pygeai/_docs/source/content/api_reference/files.rst +592 -0
  20. pygeai/_docs/source/content/api_reference/gam.rst +401 -0
  21. pygeai/_docs/source/content/api_reference/health.rst +58 -0
  22. pygeai/_docs/source/content/api_reference/project.rst +738 -0
  23. pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
  24. pygeai/_docs/source/content/api_reference/rag.rst +710 -0
  25. pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
  26. pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
  27. pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
  28. pygeai/_docs/source/content/api_reference.rst +58 -0
  29. pygeai/_docs/source/content/authentication.rst +295 -0
  30. pygeai/_docs/source/content/chat_gui.rst +121 -0
  31. pygeai/_docs/source/content/cli.rst +203 -0
  32. pygeai/_docs/source/content/debugger.rst +651 -0
  33. pygeai/_docs/source/content/intro.rst +67 -0
  34. pygeai/_docs/source/content/migration.rst +929 -0
  35. pygeai/_docs/source/content/modules.rst +7 -0
  36. pygeai/_docs/source/content/quickstart.rst +143 -0
  37. pygeai/_docs/source/content/samples.rst +394 -0
  38. pygeai/_docs/source/index.rst +75 -0
  39. pygeai/_docs/source/modules.rst +7 -0
  40. pygeai/_docs/source/pygeai.admin.rst +29 -0
  41. pygeai/_docs/source/pygeai.analytics.rst +53 -0
  42. pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
  43. pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
  44. pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
  45. pygeai/_docs/source/pygeai.assistant.rst +55 -0
  46. pygeai/_docs/source/pygeai.auth.rst +29 -0
  47. pygeai/_docs/source/pygeai.chat.rst +69 -0
  48. pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
  49. pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
  50. pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
  51. pygeai/_docs/source/pygeai.cli.rst +62 -0
  52. pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
  53. pygeai/_docs/source/pygeai.core.base.rst +53 -0
  54. pygeai/_docs/source/pygeai.core.common.rst +37 -0
  55. pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
  56. pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
  57. pygeai/_docs/source/pygeai.core.files.rst +61 -0
  58. pygeai/_docs/source/pygeai.core.llm.rst +29 -0
  59. pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
  60. pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
  61. pygeai/_docs/source/pygeai.core.rst +63 -0
  62. pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
  63. pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
  64. pygeai/_docs/source/pygeai.core.services.rst +37 -0
  65. pygeai/_docs/source/pygeai.core.utils.rst +37 -0
  66. pygeai/_docs/source/pygeai.dbg.rst +21 -0
  67. pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
  68. pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
  69. pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
  70. pygeai/_docs/source/pygeai.evaluation.rst +31 -0
  71. pygeai/_docs/source/pygeai.flows.rst +29 -0
  72. pygeai/_docs/source/pygeai.gam.rst +29 -0
  73. pygeai/_docs/source/pygeai.health.rst +29 -0
  74. pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
  75. pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
  76. pygeai/_docs/source/pygeai.lab.rst +65 -0
  77. pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
  78. pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
  79. pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
  80. pygeai/_docs/source/pygeai.man.man1.rst +10 -0
  81. pygeai/_docs/source/pygeai.man.rst +18 -0
  82. pygeai/_docs/source/pygeai.migration.rst +29 -0
  83. pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
  84. pygeai/_docs/source/pygeai.organization.rst +61 -0
  85. pygeai/_docs/source/pygeai.proxy.rst +53 -0
  86. pygeai/_docs/source/pygeai.rst +35 -0
  87. pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
  88. pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
  89. pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
  90. pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
  91. pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
  92. pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
  93. pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
  94. pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
  95. pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
  96. pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
  97. pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
  98. pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
  99. pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
  100. pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
  101. pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
  102. pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
  103. pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
  104. pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
  105. pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
  106. pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
  107. pygeai/_docs/source/pygeai.tests.core.rst +39 -0
  108. pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
  109. pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
  110. pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
  111. pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
  112. pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
  113. pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
  114. pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
  115. pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
  116. pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
  117. pygeai/_docs/source/pygeai.tests.health.rst +21 -0
  118. pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
  119. pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
  120. pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
  121. pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
  122. pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
  123. pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
  124. pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
  125. pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
  126. pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
  127. pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
  128. pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
  129. pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
  130. pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
  131. pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
  132. pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
  133. pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
  134. pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
  135. pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
  136. pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
  137. pygeai/_docs/source/pygeai.tests.rst +33 -0
  138. pygeai/admin/clients.py +14 -11
  139. pygeai/admin/endpoints.py +2 -2
  140. pygeai/analytics/clients.py +505 -0
  141. pygeai/analytics/endpoints.py +35 -0
  142. pygeai/analytics/managers.py +606 -0
  143. pygeai/analytics/mappers.py +207 -0
  144. pygeai/analytics/responses.py +240 -0
  145. pygeai/assistant/clients.py +48 -57
  146. pygeai/assistant/data/__init__.py +0 -0
  147. pygeai/assistant/data/clients.py +15 -0
  148. pygeai/assistant/data_analyst/__init__.py +0 -0
  149. pygeai/assistant/data_analyst/clients.py +75 -0
  150. pygeai/assistant/data_analyst/endpoints.py +2 -0
  151. pygeai/assistant/endpoints.py +0 -2
  152. pygeai/assistant/managers.py +738 -0
  153. pygeai/assistant/mappers.py +153 -0
  154. pygeai/assistant/rag/clients.py +132 -21
  155. pygeai/assistant/rag/mappers.py +228 -0
  156. pygeai/assistant/rag/models.py +396 -0
  157. pygeai/assistant/rag/responses.py +10 -0
  158. pygeai/auth/__init__.py +0 -0
  159. pygeai/auth/clients.py +129 -0
  160. pygeai/auth/endpoints.py +6 -0
  161. pygeai/chat/clients.py +406 -31
  162. pygeai/chat/endpoints.py +3 -0
  163. pygeai/chat/iris.py +17 -0
  164. pygeai/chat/managers.py +64 -0
  165. pygeai/chat/session.py +38 -0
  166. pygeai/chat/settings.py +6 -0
  167. pygeai/chat/ui.py +678 -0
  168. pygeai/cli/__init__.py +0 -1
  169. pygeai/cli/commands/admin.py +9 -12
  170. pygeai/cli/commands/analytics.py +533 -0
  171. pygeai/cli/commands/assistant.py +11 -11
  172. pygeai/cli/commands/auth.py +299 -0
  173. pygeai/cli/commands/base.py +201 -7
  174. pygeai/cli/commands/chat.py +875 -14
  175. pygeai/cli/commands/common.py +30 -26
  176. pygeai/cli/commands/configuration.py +84 -9
  177. pygeai/cli/commands/docs.py +105 -0
  178. pygeai/cli/commands/embeddings.py +187 -0
  179. pygeai/cli/commands/evaluation.py +2069 -0
  180. pygeai/cli/commands/feedback.py +93 -0
  181. pygeai/cli/commands/files.py +312 -0
  182. pygeai/cli/commands/flows/__init__.py +0 -0
  183. pygeai/cli/commands/gam.py +349 -0
  184. pygeai/cli/commands/lab/__init__.py +0 -0
  185. pygeai/cli/commands/lab/ai_lab.py +4110 -0
  186. pygeai/cli/commands/lab/common.py +135 -0
  187. pygeai/cli/commands/lab/options.py +8 -0
  188. pygeai/cli/commands/lab/spec.py +273 -0
  189. pygeai/cli/commands/lab/utils.py +13 -0
  190. pygeai/cli/commands/llm.py +164 -0
  191. pygeai/cli/commands/migrate.py +1198 -0
  192. pygeai/cli/commands/options.py +86 -0
  193. pygeai/cli/commands/organization.py +560 -98
  194. pygeai/cli/commands/rag.py +306 -10
  195. pygeai/cli/commands/rerank.py +108 -0
  196. pygeai/cli/commands/secrets.py +357 -0
  197. pygeai/cli/commands/usage_limits.py +583 -0
  198. pygeai/cli/commands/validators.py +209 -0
  199. pygeai/cli/commands/version.py +44 -0
  200. pygeai/cli/error_handler.py +151 -0
  201. pygeai/cli/geai.py +171 -30
  202. pygeai/cli/geai_proxy.py +318 -0
  203. pygeai/cli/install_man.py +107 -0
  204. pygeai/cli/parsers.py +78 -25
  205. pygeai/cli/texts/help.py +712 -55
  206. pygeai/core/__init__.py +9 -1
  207. pygeai/core/base/clients.py +61 -10
  208. pygeai/core/base/mappers.py +208 -30
  209. pygeai/core/base/models.py +8 -308
  210. pygeai/core/base/responses.py +18 -1
  211. pygeai/core/base/session.py +110 -17
  212. pygeai/core/common/config.py +98 -16
  213. pygeai/core/common/decorators.py +44 -0
  214. pygeai/core/common/exceptions.py +104 -4
  215. pygeai/core/embeddings/__init__.py +19 -0
  216. pygeai/core/embeddings/clients.py +93 -0
  217. pygeai/core/embeddings/endpoints.py +1 -0
  218. pygeai/core/embeddings/managers.py +62 -0
  219. pygeai/core/embeddings/mappers.py +52 -0
  220. pygeai/core/embeddings/models.py +14 -0
  221. pygeai/core/embeddings/responses.py +31 -0
  222. pygeai/core/feedback/__init__.py +0 -0
  223. pygeai/core/feedback/clients.py +50 -0
  224. pygeai/core/feedback/endpoints.py +1 -0
  225. pygeai/core/feedback/models.py +10 -0
  226. pygeai/core/files/__init__.py +0 -0
  227. pygeai/core/files/clients.py +156 -0
  228. pygeai/core/files/endpoints.py +5 -0
  229. pygeai/core/files/managers.py +224 -0
  230. pygeai/core/files/mappers.py +44 -0
  231. pygeai/core/files/models.py +24 -0
  232. pygeai/core/files/responses.py +19 -0
  233. pygeai/core/handlers.py +32 -0
  234. pygeai/core/llm/__init__.py +0 -0
  235. pygeai/core/llm/clients.py +53 -0
  236. pygeai/core/llm/endpoints.py +4 -0
  237. pygeai/core/models.py +799 -0
  238. pygeai/core/plugins/__init__.py +0 -0
  239. pygeai/core/plugins/clients.py +32 -0
  240. pygeai/core/plugins/endpoints.py +1 -0
  241. pygeai/core/plugins/models.py +86 -0
  242. pygeai/core/rerank/__init__.py +0 -0
  243. pygeai/core/rerank/clients.py +35 -0
  244. pygeai/core/rerank/endpoints.py +1 -0
  245. pygeai/core/rerank/managers.py +47 -0
  246. pygeai/core/rerank/mappers.py +23 -0
  247. pygeai/core/rerank/models.py +27 -0
  248. pygeai/core/responses.py +104 -0
  249. pygeai/core/secrets/__init__.py +0 -0
  250. pygeai/core/secrets/clients.py +212 -0
  251. pygeai/core/secrets/endpoints.py +7 -0
  252. pygeai/core/services/llm/__init__.py +0 -0
  253. pygeai/core/services/llm/model.py +186 -0
  254. pygeai/core/services/llm/providers.py +15 -0
  255. pygeai/core/services/response.py +18 -0
  256. pygeai/core/services/rest.py +311 -89
  257. pygeai/core/utils/__init__.py +0 -0
  258. pygeai/core/utils/console.py +83 -0
  259. pygeai/core/utils/parsers.py +32 -0
  260. pygeai/core/utils/validators.py +10 -0
  261. pygeai/dbg/__init__.py +3 -0
  262. pygeai/dbg/debugger.py +870 -0
  263. pygeai/evaluation/__init__.py +0 -0
  264. pygeai/evaluation/clients.py +19 -0
  265. pygeai/evaluation/dataset/__init__.py +0 -0
  266. pygeai/evaluation/dataset/clients.py +514 -0
  267. pygeai/evaluation/dataset/endpoints.py +26 -0
  268. pygeai/evaluation/plan/__init__.py +0 -0
  269. pygeai/evaluation/plan/clients.py +302 -0
  270. pygeai/evaluation/plan/endpoints.py +16 -0
  271. pygeai/evaluation/result/__init__.py +0 -0
  272. pygeai/evaluation/result/clients.py +70 -0
  273. pygeai/evaluation/result/endpoints.py +2 -0
  274. pygeai/flows/__init__.py +0 -0
  275. pygeai/flows/endpoints.py +362 -0
  276. pygeai/flows/models.py +1304 -0
  277. pygeai/gam/__init__.py +0 -0
  278. pygeai/gam/clients.py +178 -0
  279. pygeai/gam/endpoints.py +4 -0
  280. pygeai/health/__init__.py +0 -0
  281. pygeai/health/clients.py +24 -0
  282. pygeai/health/endpoints.py +1 -0
  283. pygeai/lab/__init__.py +0 -0
  284. pygeai/lab/agents/__init__.py +0 -0
  285. pygeai/lab/agents/clients.py +426 -0
  286. pygeai/lab/agents/endpoints.py +12 -0
  287. pygeai/lab/agents/mappers.py +319 -0
  288. pygeai/lab/clients.py +24 -0
  289. pygeai/lab/constants.py +3 -0
  290. pygeai/lab/managers.py +1558 -0
  291. pygeai/lab/models.py +1719 -0
  292. pygeai/lab/processes/__init__.py +0 -0
  293. pygeai/lab/processes/clients.py +1051 -0
  294. pygeai/lab/processes/endpoints.py +26 -0
  295. pygeai/lab/processes/mappers.py +395 -0
  296. pygeai/lab/runners.py +90 -0
  297. pygeai/lab/spec/__init__.py +0 -0
  298. pygeai/lab/spec/loader.py +24 -0
  299. pygeai/lab/spec/parsers.py +39 -0
  300. pygeai/lab/strategies/__init__.py +0 -0
  301. pygeai/lab/strategies/clients.py +212 -0
  302. pygeai/lab/strategies/endpoints.py +5 -0
  303. pygeai/lab/strategies/mappers.py +58 -0
  304. pygeai/lab/tools/__init__.py +0 -0
  305. pygeai/lab/tools/clients.py +465 -0
  306. pygeai/lab/tools/endpoints.py +13 -0
  307. pygeai/lab/tools/mappers.py +131 -0
  308. pygeai/man/__init__.py +1 -0
  309. pygeai/man/man1/__init__.py +1 -0
  310. pygeai/man/man1/geai-proxy.1 +246 -0
  311. pygeai/man/man1/geai.1 +2615 -0
  312. pygeai/migration/__init__.py +33 -0
  313. pygeai/migration/strategies.py +603 -0
  314. pygeai/migration/tools.py +180 -0
  315. pygeai/organization/clients.py +246 -18
  316. pygeai/organization/endpoints.py +17 -8
  317. pygeai/organization/limits/__init__.py +0 -0
  318. pygeai/organization/limits/clients.py +281 -0
  319. pygeai/organization/limits/endpoints.py +15 -0
  320. pygeai/organization/limits/managers.py +331 -0
  321. pygeai/organization/limits/mappers.py +21 -0
  322. pygeai/organization/managers.py +537 -0
  323. pygeai/organization/mappers.py +111 -46
  324. pygeai/organization/responses.py +61 -11
  325. pygeai/proxy/__init__.py +0 -0
  326. pygeai/proxy/clients.py +216 -0
  327. pygeai/proxy/config.py +128 -0
  328. pygeai/proxy/managers.py +232 -0
  329. pygeai/proxy/servers.py +304 -0
  330. pygeai/proxy/tool.py +69 -0
  331. pygeai/tests/admin/__init__.py +0 -0
  332. pygeai/tests/admin/test_clients.py +148 -0
  333. pygeai/tests/analytics/__init__.py +0 -0
  334. pygeai/tests/analytics/test_clients.py +86 -0
  335. pygeai/tests/analytics/test_managers.py +94 -0
  336. pygeai/tests/analytics/test_mappers.py +84 -0
  337. pygeai/tests/analytics/test_responses.py +73 -0
  338. pygeai/tests/assistants/rag/__init__.py +0 -0
  339. pygeai/tests/assistants/rag/test_clients.py +346 -0
  340. pygeai/tests/assistants/rag/test_mappers.py +189 -0
  341. pygeai/tests/assistants/rag/test_models.py +292 -0
  342. pygeai/tests/assistants/test_clients.py +176 -80
  343. pygeai/tests/assistants/test_managers.py +198 -0
  344. pygeai/tests/assistants/test_mappers.py +111 -0
  345. pygeai/tests/auth/__init__.py +0 -0
  346. pygeai/tests/auth/test_clients.py +289 -0
  347. pygeai/tests/auth/test_oauth.py +172 -0
  348. pygeai/tests/auth/test_session_logging.py +150 -0
  349. pygeai/tests/chat/__init__.py +0 -0
  350. pygeai/tests/chat/test_clients.py +393 -0
  351. pygeai/tests/chat/test_iris.py +38 -0
  352. pygeai/tests/chat/test_session.py +62 -0
  353. pygeai/tests/chat/test_ui.py +224 -0
  354. pygeai/tests/cli/__init__.py +0 -0
  355. pygeai/tests/cli/commands/__init__.py +0 -0
  356. pygeai/tests/cli/commands/lab/__init__.py +0 -0
  357. pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
  358. pygeai/tests/cli/commands/lab/test_common.py +208 -0
  359. pygeai/tests/cli/commands/lab/test_spec.py +246 -0
  360. pygeai/tests/cli/commands/test_assistant.py +202 -0
  361. pygeai/tests/cli/commands/test_chat.py +130 -0
  362. pygeai/tests/cli/commands/test_common.py +350 -0
  363. pygeai/tests/cli/commands/test_embeddings.py +132 -0
  364. pygeai/tests/cli/commands/test_evaluation.py +656 -0
  365. pygeai/tests/cli/commands/test_feedback.py +65 -0
  366. pygeai/tests/cli/commands/test_files.py +161 -0
  367. pygeai/tests/cli/commands/test_gam.py +201 -0
  368. pygeai/tests/cli/commands/test_llm.py +114 -0
  369. pygeai/tests/cli/commands/test_migrate.py +176 -0
  370. pygeai/tests/cli/commands/test_organization.py +276 -0
  371. pygeai/tests/cli/commands/test_rag.py +266 -0
  372. pygeai/tests/cli/commands/test_rerank.py +110 -0
  373. pygeai/tests/cli/commands/test_secrets.py +171 -0
  374. pygeai/tests/cli/commands/test_show_help.py +41 -0
  375. pygeai/tests/cli/commands/test_usage_limits.py +412 -0
  376. pygeai/tests/cli/commands/test_validators.py +160 -0
  377. pygeai/tests/cli/commands/test_version.py +81 -0
  378. pygeai/tests/cli/docker/__init__.py +0 -0
  379. pygeai/tests/cli/test_credentials_flag.py +316 -0
  380. pygeai/tests/cli/test_error_handler.py +225 -0
  381. pygeai/tests/cli/test_geai_driver.py +154 -0
  382. pygeai/tests/cli/test_parsers.py +154 -0
  383. pygeai/tests/core/base/__init__.py +0 -0
  384. pygeai/tests/core/base/data/__init__.py +0 -0
  385. pygeai/tests/core/base/data/mappers.py +117 -0
  386. pygeai/tests/core/base/data/models.py +312 -0
  387. pygeai/tests/core/base/test_mappers.py +569 -0
  388. pygeai/tests/core/base/test_models.py +261 -0
  389. pygeai/tests/core/base/test_responses.py +53 -0
  390. pygeai/tests/core/common/__init__.py +0 -0
  391. pygeai/tests/core/common/data/__init__.py +0 -0
  392. pygeai/tests/core/common/test_config.py +186 -0
  393. pygeai/tests/core/common/test_decorators.py +69 -0
  394. pygeai/tests/core/embeddings/__init__.py +0 -0
  395. pygeai/tests/core/embeddings/test_clients.py +225 -0
  396. pygeai/tests/core/embeddings/test_managers.py +171 -0
  397. pygeai/tests/core/embeddings/test_mappers.py +142 -0
  398. pygeai/tests/core/feedback/__init__.py +0 -0
  399. pygeai/tests/core/feedback/test_clients.py +64 -0
  400. pygeai/tests/core/files/__init__.py +0 -0
  401. pygeai/tests/core/files/test_clients.py +128 -0
  402. pygeai/tests/core/files/test_managers.py +219 -0
  403. pygeai/tests/core/files/test_mappers.py +137 -0
  404. pygeai/tests/core/files/test_models.py +103 -0
  405. pygeai/tests/core/files/test_responses.py +122 -0
  406. pygeai/tests/core/llm/__init__.py +0 -0
  407. pygeai/tests/core/llm/test_clients.py +142 -0
  408. pygeai/tests/core/plugins/__init__.py +0 -0
  409. pygeai/tests/core/plugins/test_clients.py +66 -0
  410. pygeai/tests/core/rerank/__init__.py +0 -0
  411. pygeai/tests/core/rerank/test_clients.py +76 -0
  412. pygeai/tests/core/rerank/test_managers.py +99 -0
  413. pygeai/tests/core/rerank/test_mappers.py +54 -0
  414. pygeai/tests/core/secrets/__init__.py +0 -0
  415. pygeai/tests/core/secrets/test_clients.py +264 -0
  416. pygeai/tests/core/services/__init__.py +0 -0
  417. pygeai/tests/core/services/test_rest.py +273 -0
  418. pygeai/tests/core/test_handlers.py +66 -0
  419. pygeai/tests/core/utils/__init__.py +0 -0
  420. pygeai/tests/core/utils/test_console.py +80 -0
  421. pygeai/tests/dbg/__init__.py +0 -0
  422. pygeai/tests/dbg/test_debugger.py +591 -0
  423. pygeai/tests/evaluation/__init__.py +0 -0
  424. pygeai/tests/evaluation/dataset/__init__.py +0 -0
  425. pygeai/tests/evaluation/dataset/test_clients.py +265 -0
  426. pygeai/tests/evaluation/plan/__init__.py +0 -0
  427. pygeai/tests/evaluation/plan/test_clients.py +195 -0
  428. pygeai/tests/evaluation/result/__init__.py +0 -0
  429. pygeai/tests/evaluation/result/test_clients.py +66 -0
  430. pygeai/tests/gam/__init__.py +0 -0
  431. pygeai/tests/gam/test_clients.py +195 -0
  432. pygeai/tests/health/__init__.py +0 -0
  433. pygeai/tests/health/test_clients.py +41 -0
  434. pygeai/tests/integration/__init__.py +0 -0
  435. pygeai/tests/integration/assistants/__init__.py +0 -0
  436. pygeai/tests/integration/assistants/rag/__init__.py +0 -0
  437. pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
  438. pygeai/tests/integration/chat/__init__.py +0 -0
  439. pygeai/tests/integration/chat/test_generate_image.py +158 -0
  440. pygeai/tests/integration/lab/__init__.py +0 -0
  441. pygeai/tests/integration/lab/agents/__init__.py +0 -0
  442. pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
  443. pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
  444. pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
  445. pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
  446. pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
  447. pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
  448. pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
  449. pygeai/tests/integration/lab/processes/__init__.py +0 -0
  450. pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
  451. pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
  452. pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
  453. pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
  454. pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
  455. pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
  456. pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
  457. pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
  458. pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
  459. pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
  460. pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
  461. pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
  462. pygeai/tests/integration/lab/tools/__init__.py +0 -0
  463. pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
  464. pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
  465. pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
  466. pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
  467. pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
  468. pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
  469. pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
  470. pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
  471. pygeai/tests/lab/__init__.py +0 -0
  472. pygeai/tests/lab/agents/__init__.py +0 -0
  473. pygeai/tests/lab/agents/test_clients.py +481 -0
  474. pygeai/tests/lab/agents/test_mappers.py +440 -0
  475. pygeai/tests/lab/processes/__init__.py +0 -0
  476. pygeai/tests/lab/processes/test_clients.py +1416 -0
  477. pygeai/tests/lab/processes/test_mappers.py +1092 -0
  478. pygeai/tests/lab/spec/__init__.py +0 -0
  479. pygeai/tests/lab/spec/test_loader.py +59 -0
  480. pygeai/tests/lab/spec/test_parsers.py +182 -0
  481. pygeai/tests/lab/strategies/__init__.py +0 -0
  482. pygeai/tests/lab/strategies/test_clients.py +241 -0
  483. pygeai/tests/lab/strategies/test_mappers.py +132 -0
  484. pygeai/tests/lab/test_managers.py +553 -0
  485. pygeai/tests/lab/test_mappers.py +245 -0
  486. pygeai/tests/lab/test_models.py +1154 -0
  487. pygeai/tests/lab/tools/__init__.py +0 -0
  488. pygeai/tests/lab/tools/test_clients.py +521 -0
  489. pygeai/tests/lab/tools/test_mappers.py +198 -0
  490. pygeai/tests/migration/__init__.py +0 -0
  491. pygeai/tests/migration/test_strategies.py +405 -0
  492. pygeai/tests/migration/test_tools.py +159 -0
  493. pygeai/tests/organization/limits/__init__.py +0 -0
  494. pygeai/tests/organization/limits/test_clients.py +567 -0
  495. pygeai/tests/organization/limits/test_managers.py +402 -0
  496. pygeai/tests/organization/test_clients.py +615 -64
  497. pygeai/tests/organization/test_managers.py +424 -0
  498. pygeai/tests/organization/test_mappers.py +153 -0
  499. pygeai/tests/organization/test_responses.py +137 -0
  500. pygeai/tests/proxy/__init__.py +1 -0
  501. pygeai/tests/proxy/test_clients.py +397 -0
  502. pygeai/tests/proxy/test_config.py +171 -0
  503. pygeai/tests/proxy/test_integration.py +305 -0
  504. pygeai/tests/proxy/test_managers.py +312 -0
  505. pygeai/tests/proxy/test_servers.py +387 -0
  506. pygeai/tests/proxy/test_tool.py +176 -0
  507. pygeai/tests/snippets/__init__.py +0 -0
  508. pygeai/tests/snippets/analytics/__init__.py +0 -0
  509. pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
  510. pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
  511. pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
  512. pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
  513. pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
  514. pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
  515. pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
  516. pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
  517. pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
  518. pygeai/tests/snippets/assistants/__init__.py +0 -0
  519. pygeai/tests/snippets/assistants/create_chat_assistant.py +54 -0
  520. pygeai/tests/snippets/assistants/create_text_assistant.py +51 -0
  521. pygeai/tests/snippets/assistants/data_analyst/__init__.py +0 -0
  522. pygeai/tests/snippets/assistants/data_analyst/extend_and_check.py +100 -0
  523. pygeai/tests/snippets/assistants/data_analyst/extend_dataset.py +9 -0
  524. pygeai/tests/snippets/assistants/data_analyst/get_status.py +9 -0
  525. pygeai/tests/snippets/assistants/file_summarizer_assistant.py +149 -0
  526. pygeai/tests/snippets/assistants/get_assistant_data.py +8 -0
  527. pygeai/tests/snippets/assistants/get_assistant_list.py +7 -0
  528. pygeai/tests/snippets/assistants/rag/__init__.py +0 -0
  529. pygeai/tests/snippets/assistants/rag/create_rag_assistant.py +65 -0
  530. pygeai/tests/snippets/assistants/rag/delete_al_documents.py +7 -0
  531. pygeai/tests/snippets/assistants/rag/delete_document.py +10 -0
  532. pygeai/tests/snippets/assistants/rag/delete_rag_assistant.py +8 -0
  533. pygeai/tests/snippets/assistants/rag/get_document.py +10 -0
  534. pygeai/tests/snippets/assistants/rag/get_documents.py +7 -0
  535. pygeai/tests/snippets/assistants/rag/get_rag_assistant_data.py +8 -0
  536. pygeai/tests/snippets/assistants/rag/update_rag_assistant.py +48 -0
  537. pygeai/tests/snippets/assistants/rag/upload_document.py +19 -0
  538. pygeai/tests/snippets/assistants/send_feedback.py +14 -0
  539. pygeai/tests/snippets/assistants/update_chat_assistant.py +63 -0
  540. pygeai/tests/snippets/auth/__init__.py +0 -0
  541. pygeai/tests/snippets/chat/__init__.py +0 -0
  542. pygeai/tests/snippets/chat/cancel_request.py +7 -0
  543. pygeai/tests/snippets/chat/chat_completion.py +28 -0
  544. pygeai/tests/snippets/chat/chat_completion_1.py +40 -0
  545. pygeai/tests/snippets/chat/chat_completion_2.py +60 -0
  546. pygeai/tests/snippets/chat/chat_completion_3.py +27 -0
  547. pygeai/tests/snippets/chat/chat_completion_4.py +67 -0
  548. pygeai/tests/snippets/chat/chat_completion_streaming.py +63 -0
  549. pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
  550. pygeai/tests/snippets/chat/get_request_status.py +7 -0
  551. pygeai/tests/snippets/chat/get_response.py +15 -0
  552. pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
  553. pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
  554. pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
  555. pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
  556. pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
  557. pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
  558. pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
  559. pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
  560. pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
  561. pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
  562. pygeai/tests/snippets/chat/send_chat_request.py +33 -0
  563. pygeai/tests/snippets/dbg/__init__.py +0 -0
  564. pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
  565. pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
  566. pygeai/tests/snippets/dbg/file_debugging.py +72 -0
  567. pygeai/tests/snippets/dbg/module_debugging.py +61 -0
  568. pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
  569. pygeai/tests/snippets/dbg/stepping_example.py +40 -0
  570. pygeai/tests/snippets/embeddings/__init__.py +0 -0
  571. pygeai/tests/snippets/embeddings/cache_example.py +31 -0
  572. pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
  573. pygeai/tests/snippets/embeddings/generate_embeddings.py +26 -0
  574. pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
  575. pygeai/tests/snippets/embeddings/openai_example.py +30 -0
  576. pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
  577. pygeai/tests/snippets/evaluation/__init__.py +0 -0
  578. pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
  579. pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
  580. pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
  581. pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
  582. pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
  583. pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
  584. pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
  585. pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
  586. pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
  587. pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
  588. pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
  589. pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
  590. pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
  591. pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
  592. pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
  593. pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
  594. pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
  595. pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
  596. pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
  597. pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
  598. pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
  599. pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
  600. pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
  601. pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
  602. pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
  603. pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
  604. pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
  605. pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
  606. pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
  607. pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
  608. pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
  609. pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
  610. pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
  611. pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
  612. pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
  613. pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
  614. pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
  615. pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
  616. pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
  617. pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
  618. pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
  619. pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
  620. pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
  621. pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
  622. pygeai/tests/snippets/files/__init__.py +0 -0
  623. pygeai/tests/snippets/files/delete_file.py +9 -0
  624. pygeai/tests/snippets/files/get_file_content.py +10 -0
  625. pygeai/tests/snippets/files/get_file_data.py +9 -0
  626. pygeai/tests/snippets/files/get_file_list.py +6 -0
  627. pygeai/tests/snippets/files/upload_file.py +13 -0
  628. pygeai/tests/snippets/gam/__init__.py +0 -0
  629. pygeai/tests/snippets/gam/gam_access_token.py +87 -0
  630. pygeai/tests/snippets/lab/__init__.py +0 -0
  631. pygeai/tests/snippets/lab/agentic_flow_example_1.py +326 -0
  632. pygeai/tests/snippets/lab/agentic_flow_example_2.py +206 -0
  633. pygeai/tests/snippets/lab/agentic_flow_example_3.py +486 -0
  634. pygeai/tests/snippets/lab/agentic_flow_example_4.py +446 -0
  635. pygeai/tests/snippets/lab/agents/__init__.py +0 -0
  636. pygeai/tests/snippets/lab/agents/create_agent.py +48 -0
  637. pygeai/tests/snippets/lab/agents/create_agent_2.py +48 -0
  638. pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
  639. pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
  640. pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
  641. pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
  642. pygeai/tests/snippets/lab/agents/delete_agent.py +12 -0
  643. pygeai/tests/snippets/lab/agents/get_agent.py +24 -0
  644. pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
  645. pygeai/tests/snippets/lab/agents/get_sharing_link.py +13 -0
  646. pygeai/tests/snippets/lab/agents/list_agents.py +18 -0
  647. pygeai/tests/snippets/lab/agents/publish_agent_revision.py +12 -0
  648. pygeai/tests/snippets/lab/agents/update_agent.py +50 -0
  649. pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
  650. pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
  651. pygeai/tests/snippets/lab/crud_ui.py +462 -0
  652. pygeai/tests/snippets/lab/processes/__init__.py +0 -0
  653. pygeai/tests/snippets/lab/processes/create_process.py +24 -0
  654. pygeai/tests/snippets/lab/processes/create_task.py +8 -0
  655. pygeai/tests/snippets/lab/processes/jobs/__init__.py +0 -0
  656. pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +21 -0
  657. pygeai/tests/snippets/lab/processes/kbs/__init__.py +0 -0
  658. pygeai/tests/snippets/lab/processes/kbs/create_kb.py +18 -0
  659. pygeai/tests/snippets/lab/processes/kbs/get_kb.py +26 -0
  660. pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +30 -0
  661. pygeai/tests/snippets/lab/processes/kbs/try_all.py +73 -0
  662. pygeai/tests/snippets/lab/processes/list_processes.py +10 -0
  663. pygeai/tests/snippets/lab/runner_1.py +212 -0
  664. pygeai/tests/snippets/lab/samples/__init__.py +0 -0
  665. pygeai/tests/snippets/lab/samples/summarize_files.py +162 -0
  666. pygeai/tests/snippets/lab/strategies/__init__.py +0 -0
  667. pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +22 -0
  668. pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +10 -0
  669. pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +16 -0
  670. pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +26 -0
  671. pygeai/tests/snippets/lab/tools/__init__.py +0 -0
  672. pygeai/tests/snippets/lab/tools/create_tool.py +48 -0
  673. pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
  674. pygeai/tests/snippets/lab/tools/delete_tool.py +21 -0
  675. pygeai/tests/snippets/lab/tools/get_parameter.py +21 -0
  676. pygeai/tests/snippets/lab/tools/get_tool.py +22 -0
  677. pygeai/tests/snippets/lab/tools/list_tools.py +23 -0
  678. pygeai/tests/snippets/lab/tools/publish_tool_revision.py +13 -0
  679. pygeai/tests/snippets/lab/tools/set_parameters.py +33 -0
  680. pygeai/tests/snippets/lab/tools/update_tool.py +52 -0
  681. pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
  682. pygeai/tests/snippets/lab/use_cases/c_code_fixer_agent_flow.py +238 -0
  683. pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
  684. pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
  685. pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
  686. pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
  687. pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
  688. pygeai/tests/snippets/lab/use_cases/file_summarizer_example.py +157 -0
  689. pygeai/tests/snippets/lab/use_cases/file_summarizer_example_2.py +157 -0
  690. pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
  691. pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
  692. pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
  693. pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
  694. pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
  695. pygeai/tests/snippets/migrate/__init__.py +45 -0
  696. pygeai/tests/snippets/migrate/agent_migration.py +110 -0
  697. pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
  698. pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
  699. pygeai/tests/snippets/migrate/process_migration.py +64 -0
  700. pygeai/tests/snippets/migrate/project_migration.py +42 -0
  701. pygeai/tests/snippets/migrate/tool_migration.py +64 -0
  702. pygeai/tests/snippets/organization/__init__.py +0 -0
  703. pygeai/tests/snippets/organization/add_project_member.py +10 -0
  704. pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
  705. pygeai/tests/snippets/organization/create_project.py +23 -0
  706. pygeai/tests/snippets/organization/delete_project.py +7 -0
  707. pygeai/tests/snippets/organization/export_request_data.py +7 -0
  708. pygeai/tests/snippets/organization/get_memberships.py +12 -0
  709. pygeai/tests/snippets/organization/get_organization_members.py +6 -0
  710. pygeai/tests/snippets/organization/get_project_data.py +7 -0
  711. pygeai/tests/snippets/organization/get_project_list.py +8 -0
  712. pygeai/tests/snippets/organization/get_project_members.py +6 -0
  713. pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
  714. pygeai/tests/snippets/organization/get_project_roles.py +6 -0
  715. pygeai/tests/snippets/organization/get_project_tokens.py +7 -0
  716. pygeai/tests/snippets/organization/update_project.py +14 -0
  717. pygeai/tests/snippets/rerank/__init__.py +0 -0
  718. pygeai/tests/snippets/rerank/rerank_chunks.py +19 -0
  719. pygeai/tests/snippets/secrets/__init__.py +0 -0
  720. pygeai/tests/snippets/usage_limit/__init__.py +0 -0
  721. pygeai/tests/snippets/usage_limit/delete_usage_limit.py +16 -0
  722. pygeai/tests/snippets/usage_limit/get_all_usage_limit_from_organization.py +12 -0
  723. pygeai/tests/snippets/usage_limit/get_usage_limit_from_organization.py +11 -0
  724. pygeai/tests/snippets/usage_limit/get_usage_limit_from_project.py +13 -0
  725. pygeai/tests/snippets/usage_limit/set_usage_limit_organization.py +22 -0
  726. pygeai/tests/snippets/usage_limit/set_usage_limit_project.py +23 -0
  727. pygeai/tests/snippets/usage_limit/update_usage_limit_organization.py +23 -0
  728. pygeai/tests/snippets/usage_limit/update_usage_limit_project.py +24 -0
  729. pygeai/vendor/a2a/__init__.py +1 -0
  730. pygeai/vendor/a2a/auth/__init__.py +0 -0
  731. pygeai/vendor/a2a/auth/user.py +31 -0
  732. pygeai/vendor/a2a/client/__init__.py +19 -0
  733. pygeai/vendor/a2a/client/client.py +425 -0
  734. pygeai/vendor/a2a/client/errors.py +33 -0
  735. pygeai/vendor/a2a/client/helpers.py +22 -0
  736. pygeai/vendor/a2a/py.typed +0 -0
  737. pygeai/vendor/a2a/server/__init__.py +1 -0
  738. pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
  739. pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
  740. pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
  741. pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
  742. pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
  743. pygeai/vendor/a2a/server/apps/__init__.py +16 -0
  744. pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
  745. pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
  746. pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
  747. pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
  748. pygeai/vendor/a2a/server/context.py +23 -0
  749. pygeai/vendor/a2a/server/events/__init__.py +21 -0
  750. pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
  751. pygeai/vendor/a2a/server/events/event_queue.py +156 -0
  752. pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
  753. pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
  754. pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
  755. pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
  756. pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
  757. pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
  758. pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
  759. pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
  760. pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
  761. pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
  762. pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
  763. pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
  764. pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
  765. pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
  766. pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
  767. pygeai/vendor/a2a/types.py +1624 -0
  768. pygeai/vendor/a2a/utils/__init__.py +40 -0
  769. pygeai/vendor/a2a/utils/artifact.py +72 -0
  770. pygeai/vendor/a2a/utils/errors.py +69 -0
  771. pygeai/vendor/a2a/utils/helpers.py +176 -0
  772. pygeai/vendor/a2a/utils/message.py +83 -0
  773. pygeai/vendor/a2a/utils/task.py +57 -0
  774. pygeai/vendor/a2a/utils/telemetry.py +299 -0
  775. pygeai-0.6.0b15.dist-info/METADATA +205 -0
  776. pygeai-0.6.0b15.dist-info/RECORD +799 -0
  777. {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
  778. pygeai-0.6.0b15.dist-info/entry_points.txt +5 -0
  779. {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info/licenses}/LICENSE +13 -1
  780. {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info}/top_level.txt +0 -1
  781. docs/source/conf.py +0 -45
  782. pygeai/core/clients.py +0 -240
  783. pygeai/tests/core/test_clients.py +0 -49
  784. pygeai-0.1.6.dist-info/METADATA +0 -92
  785. pygeai-0.1.6.dist-info/RECORD +0 -65
  786. pygeai-0.1.6.dist-info/SOURCES.sync-conflict-20241223-145950-3QD4F42.txt +0 -41
  787. pygeai-0.1.6.dist-info/entry_points.txt +0 -2
  788. /pygeai/{agent → analytics}/__init__.py +0 -0
@@ -0,0 +1,281 @@
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.organization.limits.endpoints import SET_ORGANIZATION_USAGE_LIMIT_V2, GET_ORGANIZATION_LATEST_USAGE_LIMIT_V2, \
8
+ GET_ALL_ORGANIZATION_USAGE_LIMITS_V2, DELETE_ORGANIZATION_USAGE_LIMIT_V2, SET_ORGANIZATION_HARD_LIMIT_V2, \
9
+ SET_ORGANIZATION_SOFT_LIMIT_V2, SET_ORGANIZATION_RENEWAL_STATUS_V2, SET_PROJECT_USAGE_LIMIT_V2, \
10
+ GET_ALL_PROJECT_USAGE_LIMIT_V2, GET_LATEST_PROJECT_USAGE_LIMIT_V2, GET_PROJECT_ACTIVE_USAGE_LIMIT_V2, \
11
+ DELETE_PROJECT_USAGE_LIMIT_V2, SET_PROJECT_HARD_LIMIT_V2, SET_PROJECT_SOFT_LIMIT_V2, \
12
+ SET_PROJECT_RENEWAL_STATUS_V2
13
+
14
+
15
+ class UsageLimitClient(BaseClient):
16
+
17
+ def set_organization_usage_limit(self, organization: str, usage_limit: dict) -> dict:
18
+ """
19
+ Defines a new usage limit for an organization.
20
+
21
+ :param organization: str - The unique identifier of the organization. (Required)
22
+ :param usage_limit: dict - A dictionary containing the usage limit configuration. Example structure:
23
+ {
24
+ "subscriptionType": "Freemium" | "Daily" | "Weekly" | "Monthly",
25
+ "usageUnit": "Requests" | "Cost",
26
+ "softLimit": number,
27
+ "hardLimit": number, # Must be greater than or equal to softLimit
28
+ "renewalStatus": "Renewable" | "NonRenewable"
29
+ } (Required)
30
+ :return: dict - The API response as a JSON object containing details about the created usage limit.
31
+ """
32
+ endpoint = SET_ORGANIZATION_USAGE_LIMIT_V2.format(organization=organization)
33
+ response = self.api_service.post(
34
+ endpoint=endpoint,
35
+ data=usage_limit
36
+ )
37
+ validate_status_code(response)
38
+ return parse_json_response(response, f"set usage limit for organization", organization=organization)
39
+
40
+ def get_organization_latest_usage_limit(self, organization: str) -> dict:
41
+ """
42
+ Retrieves the latest usage limit defined for a given organization.
43
+
44
+ :param organization: str - The unique identifier of the organization. (Required)
45
+ :return: dict - The API response as a JSON object containing details of the latest usage limit.
46
+ """
47
+ endpoint = GET_ORGANIZATION_LATEST_USAGE_LIMIT_V2.format(organization=organization)
48
+ response = self.api_service.get(endpoint=endpoint)
49
+ validate_status_code(response)
50
+ return parse_json_response(response, f"get latest usage limit for organization", organization=organization)
51
+
52
+ def get_all_usage_limits_from_organization(self, organization: str) -> dict:
53
+ """
54
+ Retrieves all usage limits defined for a given organization.
55
+
56
+ :param organization: str - The unique identifier of the organization. (Required)
57
+ :return: dict - The API response as a JSON object containing a list of all usage limits.
58
+ """
59
+ endpoint = GET_ALL_ORGANIZATION_USAGE_LIMITS_V2.format(organization=organization)
60
+ response = self.api_service.get(endpoint=endpoint)
61
+ validate_status_code(response)
62
+ return parse_json_response(response, f"get all usage limits for organization", organization=organization)
63
+
64
+ def delete_usage_limit_from_organization(self, organization: str, limit_id: str) -> dict:
65
+ """
66
+ Deletes a specific usage limit from an organization.
67
+
68
+ :param organization: str - The unique identifier of the organization. (Required)
69
+ :param limit_id: str - The unique identifier of the usage limit to be deleted. (Required)
70
+ :return: dict - The API response as a JSON object indicating the result of the delete operation.
71
+ """
72
+ endpoint = DELETE_ORGANIZATION_USAGE_LIMIT_V2.format(organization=organization, id=limit_id)
73
+ response = self.api_service.delete(endpoint=endpoint)
74
+ validate_status_code(response)
75
+ return parse_json_response(response, f"delete usage limit with ID '{limit_id}' from organization", organization=organization)
76
+
77
+ def set_organization_hard_limit(self, organization: str, limit_id: str, hard_limit: float) -> dict:
78
+ """
79
+ Updates the hard limit for a specific usage limit in an organization.
80
+
81
+ :param organization: str - The unique identifier of the organization. (Required)
82
+ :param limit_id: str - The unique identifier of the usage limit to be updated. (Required)
83
+ :param hard_limit: float - The new hard limit value. Must be greater than or equal to the soft limit. (Required)
84
+ :return: dict - The API response as a JSON object confirming the update.
85
+ """
86
+ endpoint = SET_ORGANIZATION_HARD_LIMIT_V2.format(organization=organization, id=limit_id)
87
+ response = self.api_service.put(
88
+ endpoint=endpoint,
89
+ data={
90
+ "hardLimit": hard_limit
91
+ }
92
+ )
93
+ validate_status_code(response)
94
+ return parse_json_response(response, f"set hard limit for usage limit ID '{limit_id}' in organization", organization=organization)
95
+
96
+ def set_organization_soft_limit(self, organization: str, limit_id: str, soft_limit: float) -> dict:
97
+ """
98
+ Updates the soft limit for a specific usage limit in an organization.
99
+
100
+ :param organization: str - The unique identifier of the organization. (Required)
101
+ :param limit_id: str - The unique identifier of the usage limit to be updated. (Required)
102
+ :param soft_limit: float - The new soft limit value. Must be less than or equal to the hard limit. (Required)
103
+ :return: dict - The API response as a JSON object confirming the update.
104
+ """
105
+ endpoint = SET_ORGANIZATION_SOFT_LIMIT_V2.format(organization=organization, id=limit_id)
106
+ response = self.api_service.put(
107
+ endpoint=endpoint,
108
+ data={
109
+ "softLimit": soft_limit
110
+ }
111
+ )
112
+ validate_status_code(response)
113
+ return parse_json_response(response, f"set soft limit for usage limit ID '{limit_id}' in organization", organization=organization)
114
+
115
+ def set_organization_renewal_status(self, organization: str, limit_id: str, renewal_status: str) -> dict:
116
+ """
117
+ Updates the renewal status for a specific usage limit in an organization.
118
+
119
+ :param organization: str - The unique identifier of the organization. (Required)
120
+ :param limit_id: str - The unique identifier of the usage limit to be updated. (Required)
121
+ :param renewal_status: str - The new renewal status. Must be either "Renewable" or "NonRenewable". (Required)
122
+ :return: dict - The API response as a JSON object confirming the update.
123
+ """
124
+ endpoint = SET_ORGANIZATION_RENEWAL_STATUS_V2.format(organization=organization, id=limit_id)
125
+ response = self.api_service.put(
126
+ endpoint=endpoint,
127
+ data={
128
+ "renewalStatus": renewal_status
129
+ }
130
+ )
131
+ validate_status_code(response)
132
+ return parse_json_response(response, f"set renewal status for usage limit ID '{limit_id}' in organization", organization=organization)
133
+
134
+ def set_project_usage_limit(self, organization: str, project: str, usage_limit: dict) -> dict:
135
+ """
136
+ Defines a new usage limit for a specific project within an organization.
137
+
138
+ :param organization: str - The unique identifier of the organization. (Required)
139
+ :param project: str - The unique identifier of the project. (Required)
140
+ :param usage_limit: dict - A dictionary containing usage limit details. Example structure:
141
+ {
142
+ "subscriptionType": "Freemium" | "Daily" | "Weekly" | "Monthly",
143
+ "usageUnit": "Requests" | "Cost",
144
+ "softLimit": float,
145
+ "hardLimit": float,
146
+ "renewalStatus": "Renewable" | "NonRenewable"
147
+ } (Required)
148
+ :return: dict - The API response as a JSON object containing details about the created project usage limit.
149
+ """
150
+ endpoint = SET_PROJECT_USAGE_LIMIT_V2.format(organization=organization, project=project)
151
+ response = self.api_service.post(
152
+ endpoint=endpoint,
153
+ data=usage_limit
154
+ )
155
+ validate_status_code(response)
156
+ return parse_json_response(response, f"set usage limit for project '{project}' in organization", organization=organization)
157
+
158
+ def get_all_usage_limits_from_project(self, organization: str, project: str) -> dict:
159
+ """
160
+ Retrieves all usage limits associated with a specific project within an organization.
161
+
162
+ :param organization: str - The unique identifier of the organization. (Required)
163
+ :param project: str - The unique identifier of the project. (Required)
164
+ :return: dict - A JSON object containing details of all usage limits set for the specified project.
165
+ """
166
+ endpoint = GET_ALL_PROJECT_USAGE_LIMIT_V2.format(organization=organization, project=project)
167
+ response = self.api_service.get(endpoint=endpoint)
168
+ validate_status_code(response)
169
+ return parse_json_response(response, f"get all usage limits for project '{project}' in organization", organization=organization)
170
+
171
+ def get_latest_usage_limit_from_project(self, organization: str, project: str) -> dict:
172
+ """
173
+ Retrieves the most recent usage limit configured for a specific project within an organization.
174
+
175
+ :param organization: str - The unique identifier of the organization. (Required)
176
+ :param project: str - The unique identifier of the project. (Required)
177
+ :return: dict - A JSON object containing details of the latest usage limit for the specified project.
178
+ """
179
+ endpoint = GET_LATEST_PROJECT_USAGE_LIMIT_V2.format(organization=organization, project=project)
180
+ response = self.api_service.get(endpoint=endpoint)
181
+ validate_status_code(response)
182
+ return parse_json_response(response, f"get latest usage limit for project '{project}' in organization", organization=organization)
183
+
184
+ def get_active_usage_limit_from_project(self, organization: str, project: str) -> dict:
185
+ """
186
+ Retrieves the currently active usage limit for a specific project within an organization.
187
+
188
+ :param organization: str - The unique identifier of the organization. (Required)
189
+ :param project: str - The unique identifier of the project. (Required)
190
+ :return: dict - A JSON object containing details of the active usage limit for the specified project.
191
+ """
192
+ endpoint = GET_PROJECT_ACTIVE_USAGE_LIMIT_V2.format(organization=organization, project=project)
193
+ response = self.api_service.get(endpoint=endpoint)
194
+ validate_status_code(response)
195
+ return parse_json_response(response, f"get active usage limit for project '{project}' in organization", organization=organization)
196
+
197
+ def delete_usage_limit_from_project(self, organization: str, project: str, limit_id: str) -> dict:
198
+ """
199
+ Deletes a specific usage limit for a given project within an organization.
200
+
201
+ :param organization: str - The unique identifier of the organization. (Required)
202
+ :param project: str - The unique identifier of the project. (Required)
203
+ :param limit_id: str - The unique identifier of the usage limit to be deleted. (Required)
204
+ :return: dict - A JSON object containing the response of the delete operation.
205
+ """
206
+ endpoint = DELETE_PROJECT_USAGE_LIMIT_V2.format(organization=organization, project=project, id=limit_id)
207
+ response = self.api_service.delete(endpoint=endpoint)
208
+ validate_status_code(response)
209
+ return parse_json_response(response, f"delete usage limit with ID '{limit_id}' for project '{project}' in organization", organization=organization)
210
+
211
+ def set_hard_limit_for_active_usage_limit_from_project(
212
+ self,
213
+ organization: str,
214
+ project: str,
215
+ limit_id: str,
216
+ hard_limit: float
217
+ ) -> dict:
218
+ """
219
+ Sets the hard limit for an active usage limit of a project within an organization.
220
+
221
+ :param organization: str - The unique identifier of the organization. (Required)
222
+ :param project: str - The unique identifier of the project. (Required)
223
+ :param limit_id: str - The unique identifier of the usage limit. (Required)
224
+ :param hard_limit: float - The new hard limit value to be set. (Required)
225
+ :return: dict - A JSON object containing the response of the update operation.
226
+ """
227
+ endpoint = SET_PROJECT_HARD_LIMIT_V2.format(organization=organization, project=project, id=limit_id)
228
+ response = self.api_service.put(
229
+ endpoint=endpoint,
230
+ data={
231
+ "hardLimit": hard_limit
232
+ }
233
+ )
234
+ validate_status_code(response)
235
+ return parse_json_response(response, f"set hard limit for usage limit ID '{limit_id}' for project '{project}' in organization", organization=organization)
236
+
237
+ def set_soft_limit_for_active_usage_limit_from_project(
238
+ self,
239
+ organization: str,
240
+ project: str,
241
+ limit_id: str,
242
+ soft_limit: float
243
+ ) -> dict:
244
+ """
245
+ Sets the soft limit for an active usage limit of a project within an organization.
246
+
247
+ :param organization: str - The unique identifier of the organization. (Required)
248
+ :param project: str - The unique identifier of the project. (Required)
249
+ :param limit_id: str - The unique identifier of the usage limit. (Required)
250
+ :param soft_limit: float - The new soft limit value to be set. (Required)
251
+ :return: dict - A JSON object containing the response of the update operation.
252
+ """
253
+ endpoint = SET_PROJECT_SOFT_LIMIT_V2.format(organization=organization, project=project, id=limit_id)
254
+ response = self.api_service.put(
255
+ endpoint=endpoint,
256
+ data={
257
+ "softLimit": soft_limit
258
+ }
259
+ )
260
+ validate_status_code(response)
261
+ return parse_json_response(response, f"set soft limit for usage limit ID '{limit_id}' for project '{project}' in organization", organization=organization)
262
+
263
+ def set_project_renewal_status(self, organization: str, project: str, limit_id: str, renewal_status: str) -> dict:
264
+ """
265
+ Updates the renewal status of a project's usage limit within an organization.
266
+
267
+ :param organization: str - The unique identifier of the organization. (Required)
268
+ :param project: str - The unique identifier of the project. (Required)
269
+ :param limit_id: str - The unique identifier of the usage limit. (Required)
270
+ :param renewal_status: str - The new renewal status to be set. Options: "Renewable", "NonRenewable". (Required)
271
+ :return: dict - A JSON object containing the response of the update operation.
272
+ """
273
+ endpoint = SET_PROJECT_RENEWAL_STATUS_V2.format(organization=organization, project=project, id=limit_id)
274
+ response = self.api_service.put(
275
+ endpoint=endpoint,
276
+ data={
277
+ "renewalStatus": renewal_status
278
+ }
279
+ )
280
+ validate_status_code(response)
281
+ return parse_json_response(response, f"set renewal status for usage limit ID '{limit_id}' for project '{project}' in organization", organization=organization)
@@ -0,0 +1,15 @@
1
+ SET_ORGANIZATION_USAGE_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/limits" # POST -> Defines a new usage limit for an organization
2
+ GET_ORGANIZATION_LATEST_USAGE_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/limits/latest" # GET -> Retrieves the latest usage limit defined for the organization
3
+ GET_ALL_ORGANIZATION_USAGE_LIMITS_V2 = "v2/usageLimits/organizations/{organization}/limits" # GET -> Retrieves all usage limits defined for the organization
4
+ DELETE_ORGANIZATION_USAGE_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/limits/{id}" # DELETE -> Deletes a usage limit for the organization
5
+ SET_ORGANIZATION_HARD_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/limits/{id}/hardLimit" # PUT -> Modifies the hardLimit of an active usage limit for the organization
6
+ SET_ORGANIZATION_SOFT_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/limits/{id}/softLimit" # PUT -> Modifies the softLimit of an active usage limit for the organization
7
+ SET_ORGANIZATION_RENEWAL_STATUS_V2 = "v2/usageLimits/organizations/{organization}/limits/{id}/renewalStatus" # PUT -> Modifies the renewalStatus of an active usage limit for the organization
8
+ SET_PROJECT_USAGE_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/projects/{project}/limits" # POST -> Defines a new usage limit for a project
9
+ GET_ALL_PROJECT_USAGE_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/projects/{project}/limits" # GET -> Retrieves all usage limits for a project
10
+ GET_LATEST_PROJECT_USAGE_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/projects/{project}/limits/latest" # GET -> Retrieves the latest usage limit defined for a project
11
+ GET_PROJECT_ACTIVE_USAGE_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/projects/{project}/limits/active" # GET -> Retrieves the active usage limit for a project
12
+ DELETE_PROJECT_USAGE_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/projects/{project}/limits/{id}" # DELETE -> Deletes an active usage limit for a project
13
+ SET_PROJECT_HARD_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/projects/{project}/limits/{id}/hardLimit" # PUT -> Modifies the hardLimit for an active usage limit for a project
14
+ SET_PROJECT_SOFT_LIMIT_V2 = "v2/usageLimits/organizations/{organization}/projects/{project}/limits/{id}/softLimit" # PUT -> Modifies the softLimit for an active usage limit for a project
15
+ SET_PROJECT_RENEWAL_STATUS_V2 = "v2/usageLimits/organizations/{organization}/projects/{project}/limits/{id}/renewalStatus" # PUT -> Modifies the renewalStatus for an active usage limit for a project
@@ -0,0 +1,331 @@
1
+ from pygeai import logger
2
+ from pygeai.core.base.mappers import ErrorMapper, ModelMapper
3
+ from pygeai.core.models import UsageLimit
4
+ from pygeai.organization.limits.clients import UsageLimitClient
5
+ from pygeai.core.handlers import ErrorHandler
6
+ from pygeai.core.common.exceptions import APIError
7
+ import logging
8
+
9
+
10
+
11
+
12
+ class UsageLimitManager:
13
+ """
14
+ Manages usage limits for an organization and its projects.
15
+
16
+ This class provides methods to set, retrieve, update, and delete usage limits
17
+ at both the organization and project levels. It interacts with the `UsageLimitClient`
18
+ to perform API operations.
19
+
20
+ Attributes:
21
+ __client (UsageLimitClient): Client for making API requests.
22
+ __organization_id (str): The organization ID for which usage limits are managed.
23
+ """
24
+
25
+ def __init__(
26
+ self,
27
+ api_key: str = None,
28
+ base_url: str = None,
29
+ alias: str = None,
30
+ organization_id: str = None
31
+ ):
32
+ self.__client = UsageLimitClient(api_key, base_url, alias)
33
+ self.__organization_id = organization_id
34
+
35
+ def set_organization_usage_limit(self, usage_limit: UsageLimit) -> UsageLimit:
36
+ """
37
+ Sets a new usage limit for the organization.
38
+
39
+ This method sends a request to the usage limit client to set a new usage limit
40
+ for the specified organization.
41
+
42
+ :param usage_limit: UsageLimit object containing the limit details.
43
+ :return: UsageLimit object with the created usage limit details.
44
+ :raises APIError: If the API returns errors.
45
+ """
46
+ response_data = self.__client.set_organization_usage_limit(
47
+ organization=self.__organization_id,
48
+ usage_limit=usage_limit.to_dict()
49
+ )
50
+
51
+ if ErrorHandler.has_errors(response_data):
52
+ error = ErrorHandler.extract_error(response_data)
53
+ logger.error(f"Error received while setting organization usage limit: {error}")
54
+ raise APIError(f"Error received while setting organization usage limit: {error}")
55
+
56
+ result = ModelMapper.map_to_usage_limit(response_data)
57
+ return result
58
+
59
+ def get_latest_usage_limit_from_organization(self) -> UsageLimit:
60
+ """
61
+ Retrieves the latest usage limit set for the organization.
62
+
63
+ This method queries the usage limit client to fetch the latest usage limit
64
+ for the specified organization.
65
+
66
+ :return: UsageLimit object containing the latest usage limit details.
67
+ :raises APIError: If the API returns errors.
68
+ """
69
+ response_data = self.__client.get_organization_latest_usage_limit(
70
+ organization=self.__organization_id
71
+ )
72
+
73
+ if ErrorHandler.has_errors(response_data):
74
+ error = ErrorHandler.extract_error(response_data)
75
+ logger.error(f"Error received while retrieving latest organization usage limit: {error}")
76
+ raise APIError(f"Error received while retrieving latest organization usage limit: {error}")
77
+
78
+ result = ModelMapper.map_to_usage_limit(response_data)
79
+ return result
80
+
81
+ def get_all_usage_limits_from_organization(self) -> list[UsageLimit]:
82
+ """
83
+ Retrieves all usage limits associated with the organization.
84
+
85
+ This method queries the usage limit client to fetch all usage limits
86
+ for the specified organization.
87
+
88
+ :return: list[UsageLimit] - A list of UsageLimit objects containing all usage limits for the organization.
89
+ :raises APIError: If the API returns errors.
90
+ """
91
+ response_data = self.__client.get_all_usage_limits_from_organization(
92
+ organization=self.__organization_id
93
+ )
94
+
95
+ if ErrorHandler.has_errors(response_data):
96
+ error = ErrorHandler.extract_error(response_data)
97
+ logger.error(f"Error received while retrieving all organization usage limits: {error}")
98
+ raise APIError(f"Error received while retrieving all organization usage limits: {error}")
99
+
100
+ result = ModelMapper.map_to_usage_limit_list(response_data)
101
+ return result
102
+
103
+ def update_organization_usage_limit(self, usage_limit: UsageLimit) -> UsageLimit:
104
+ """
105
+ Updates the usage limits for an organization, including hard limit, soft limit, and renewal status.
106
+
107
+ This method sends requests to the usage limit client to update specific attributes
108
+ of the usage limit for the specified organization.
109
+
110
+ :param usage_limit: UsageLimit object containing the updated limit values.
111
+ :return: UsageLimit object with updated usage limit details.
112
+ :raises APIError: If the API returns errors.
113
+ """
114
+ response_data = {}
115
+ if usage_limit.hard_limit:
116
+ response_data = self.__client.set_organization_hard_limit(
117
+ organization=self.__organization_id,
118
+ limit_id=usage_limit.id,
119
+ hard_limit=usage_limit.hard_limit
120
+ )
121
+ if usage_limit.soft_limit:
122
+ response_data = self.__client.set_organization_soft_limit(
123
+ organization=self.__organization_id,
124
+ limit_id=usage_limit.id,
125
+ soft_limit=usage_limit.soft_limit
126
+ )
127
+ if usage_limit.renewal_status:
128
+ response_data = self.__client.set_organization_renewal_status(
129
+ organization=self.__organization_id,
130
+ limit_id=usage_limit.id,
131
+ renewal_status=usage_limit.renewal_status
132
+ )
133
+
134
+ if ErrorHandler.has_errors(response_data):
135
+ error = ErrorHandler.extract_error(response_data)
136
+ logger.error(f"Error received while updating organization usage limit: {error}")
137
+ raise APIError(f"Error received while updating organization usage limit: {error}")
138
+
139
+ result = ModelMapper.map_to_usage_limit(response_data)
140
+ return result
141
+
142
+ def delete_usage_limit_from_organization(self, limit_id: str) -> UsageLimit:
143
+ """
144
+ Deletes a usage limit from the organization.
145
+
146
+ This method sends a request to the usage limit client to delete a usage limit
147
+ identified by `limit_id` for the specified organization.
148
+
149
+ :param limit_id: The ID of the usage limit to be deleted.
150
+ :return: UsageLimit object representing the deleted limit details.
151
+ :raises APIError: If the API returns errors.
152
+ """
153
+ response_data = self.__client.delete_usage_limit_from_organization(
154
+ organization=self.__organization_id,
155
+ limit_id=limit_id,
156
+ )
157
+
158
+ if ErrorHandler.has_errors(response_data):
159
+ error = ErrorHandler.extract_error(response_data)
160
+ logger.error(f"Error received while deleting organization usage limit: {error}")
161
+ raise APIError(f"Error received while deleting organization usage limit: {error}")
162
+
163
+ result = ModelMapper.map_to_usage_limit(response_data)
164
+ return result
165
+
166
+ def set_project_usage_limit(self, project_id: str, usage_limit: UsageLimit) -> UsageLimit:
167
+ """
168
+ Sets a new usage limit for a specific project within the organization.
169
+
170
+ This method sends a request to the usage limit client to set a new usage limit
171
+ for the specified project.
172
+
173
+ :param project_id: The unique identifier of the project.
174
+ :param usage_limit: UsageLimit object containing the limit details.
175
+ :return: UsageLimit object with the created project usage limit details.
176
+ :raises APIError: If the API returns errors.
177
+ """
178
+ response_data = self.__client.set_project_usage_limit(
179
+ organization=self.__organization_id,
180
+ project=project_id,
181
+ usage_limit=usage_limit.to_dict()
182
+ )
183
+
184
+ if ErrorHandler.has_errors(response_data):
185
+ error = ErrorHandler.extract_error(response_data)
186
+ logger.error(f"Error received while setting project usage limit: {error}")
187
+ raise APIError(f"Error received while setting project usage limit: {error}")
188
+
189
+ result = ModelMapper.map_to_usage_limit(response_data)
190
+ return result
191
+
192
+ def get_all_usage_limits_from_project(self, project_id: str) -> UsageLimit:
193
+ """
194
+ Retrieves all usage limits associated with a specific project.
195
+
196
+ This method queries the usage limit client to fetch all usage limits
197
+ for the specified project.
198
+
199
+ :param project_id: The unique identifier of the project.
200
+ :return: UsageLimit object containing all usage limits for the project.
201
+ :raises APIError: If the API returns errors.
202
+ """
203
+ response_data = self.__client.get_all_usage_limits_from_project(
204
+ organization=self.__organization_id,
205
+ project=project_id,
206
+ )
207
+
208
+ if ErrorHandler.has_errors(response_data):
209
+ error = ErrorHandler.extract_error(response_data)
210
+ logger.error(f"Error received while retrieving all project usage limits: {error}")
211
+ raise APIError(f"Error received while retrieving all project usage limits: {error}")
212
+
213
+ result = ModelMapper.map_to_usage_limit(response_data)
214
+ return result
215
+
216
+ def get_latest_usage_limit_from_project(self, project_id: str) -> UsageLimit:
217
+ """
218
+ Retrieves the latest usage limit set for a specific project.
219
+
220
+ This method queries the usage limit client to fetch the latest usage limit
221
+ for the specified project.
222
+
223
+ :param project_id: The unique identifier of the project.
224
+ :return: UsageLimit object containing the latest usage limit details.
225
+ :raises APIError: If the API returns errors.
226
+ """
227
+ response_data = self.__client.get_latest_usage_limit_from_project(
228
+ organization=self.__organization_id,
229
+ project=project_id,
230
+ )
231
+
232
+ if ErrorHandler.has_errors(response_data):
233
+ error = ErrorHandler.extract_error(response_data)
234
+ logger.error(f"Error received while retrieving latest project usage limit: {error}")
235
+ raise APIError(f"Error received while retrieving latest project usage limit: {error}")
236
+
237
+ result = ModelMapper.map_to_usage_limit(response_data)
238
+ return result
239
+
240
+ def get_active_usage_limit_from_project(self, project_id: str) -> UsageLimit:
241
+ """
242
+ Retrieves the currently active usage limit for a specific project.
243
+
244
+ This method queries the usage limit client to fetch the active usage limit
245
+ for the specified project.
246
+
247
+ :param project_id: The unique identifier of the project.
248
+ :return: UsageLimit object containing the active usage limit details.
249
+ :raises APIError: If the API returns errors.
250
+ """
251
+ response_data = self.__client.get_active_usage_limit_from_project(
252
+ organization=self.__organization_id,
253
+ project=project_id,
254
+ )
255
+
256
+ if ErrorHandler.has_errors(response_data):
257
+ error = ErrorHandler.extract_error(response_data)
258
+ logger.error(f"Error received while retrieving active project usage limit: {error}")
259
+ raise APIError(f"Error received while retrieving active project usage limit: {error}")
260
+
261
+ result = ModelMapper.map_to_usage_limit(response_data)
262
+ return result
263
+
264
+ def delete_usage_limit_from_project(self, project_id: str, usage_limit: UsageLimit) -> UsageLimit:
265
+ """
266
+ Deletes a specified usage limit from a project.
267
+
268
+ This method sends a request to the usage limit client to delete a usage limit
269
+ identified by `usage_limit.id` for the specified project.
270
+
271
+ :param project_id: The unique identifier of the project.
272
+ :param usage_limit: The UsageLimit object representing the limit to be deleted.
273
+ :return: UsageLimit object representing the deleted usage limit details.
274
+ :raises APIError: If the API returns errors.
275
+ """
276
+ response_data = self.__client.delete_usage_limit_from_project(
277
+ organization=self.__organization_id,
278
+ project=project_id,
279
+ limit_id=usage_limit.id
280
+ )
281
+
282
+ if ErrorHandler.has_errors(response_data):
283
+ error = ErrorHandler.extract_error(response_data)
284
+ logger.error(f"Error received while deleting project usage limit: {error}")
285
+ raise APIError(f"Error received while deleting project usage limit: {error}")
286
+
287
+ result = ModelMapper.map_to_usage_limit(response_data)
288
+ return result
289
+
290
+ def update_project_usage_limit(self, project_id: str, usage_limit: UsageLimit) -> UsageLimit:
291
+ """
292
+ Updates the usage limits for a specific project, including hard limit, soft limit, and renewal status.
293
+
294
+ This method sends requests to the usage limit client to update specific attributes
295
+ of the usage limit for the specified project.
296
+
297
+ :param project_id: The unique identifier of the project.
298
+ :param usage_limit: UsageLimit object containing the updated limit values.
299
+ :return: UsageLimit object with updated usage limit details.
300
+ :raises APIError: If the API returns errors.
301
+ """
302
+ response_data = {}
303
+ if usage_limit.hard_limit:
304
+ response_data = self.__client.set_hard_limit_for_active_usage_limit_from_project(
305
+ organization=self.__organization_id,
306
+ project=project_id,
307
+ limit_id=usage_limit.id,
308
+ hard_limit=usage_limit.hard_limit
309
+ )
310
+ if usage_limit.soft_limit:
311
+ response_data = self.__client.set_soft_limit_for_active_usage_limit_from_project(
312
+ organization=self.__organization_id,
313
+ project=project_id,
314
+ limit_id=usage_limit.id,
315
+ soft_limit=usage_limit.soft_limit
316
+ )
317
+ if usage_limit.renewal_status:
318
+ response_data = self.__client.set_project_renewal_status(
319
+ organization=self.__organization_id,
320
+ project=project_id,
321
+ limit_id=usage_limit.id,
322
+ renewal_status=usage_limit.renewal_status
323
+ )
324
+
325
+ if ErrorHandler.has_errors(response_data):
326
+ error = ErrorHandler.extract_error(response_data)
327
+ logger.error(f"Error received while updating project usage limit: {error}")
328
+ raise APIError(f"Error received while updating project usage limit: {error}")
329
+
330
+ result = ModelMapper.map_to_usage_limit(response_data)
331
+ return result
@@ -0,0 +1,21 @@
1
+ from pygeai.core.models import UsageLimit
2
+
3
+
4
+ class UsageLimitMapper:
5
+
6
+ @classmethod
7
+ def map_to_usage_limit(cls, data: dict) -> UsageLimit:
8
+ return UsageLimit(
9
+ hard_limit=data.get('hardLimit'),
10
+ usage_limit_id=data.get('id'),
11
+ related_entity_name=data.get('relatedEntityName'),
12
+ remaining_usage=data.get('remainingUsage'),
13
+ renewal_status=data.get('renewalStatus'),
14
+ soft_limit=data.get('softLimit'),
15
+ status=data.get('status'),
16
+ subscription_type=data.get('subscriptionType'),
17
+ usage_unit=data.get('usageUnit'),
18
+ used_amount=data.get('usedAmount'),
19
+ valid_from=data.get('validFrom'),
20
+ valid_until=data.get('validUntil'),
21
+ )