pygeai 0.1.51b3__py3-none-any.whl → 0.6.0b15__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (648) hide show
  1. pygeai/__init__.py +9 -1
  2. pygeai/_docs/Makefile +20 -0
  3. pygeai/_docs/make.bat +35 -0
  4. pygeai/_docs/source/conf.py +117 -0
  5. pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
  6. pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
  7. pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
  8. pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
  9. pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
  10. pygeai/_docs/source/content/ai_lab.rst +102 -0
  11. pygeai/_docs/source/content/analytics.rst +598 -0
  12. pygeai/_docs/source/content/api_reference/admin.rst +161 -0
  13. pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
  14. pygeai/_docs/source/content/api_reference/auth.rst +379 -0
  15. pygeai/_docs/source/content/api_reference/chat.rst +754 -0
  16. pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
  17. pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
  18. pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
  19. pygeai/_docs/source/content/api_reference/files.rst +592 -0
  20. pygeai/_docs/source/content/api_reference/gam.rst +401 -0
  21. pygeai/_docs/source/content/api_reference/health.rst +58 -0
  22. pygeai/_docs/source/content/api_reference/project.rst +738 -0
  23. pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
  24. pygeai/_docs/source/content/api_reference/rag.rst +710 -0
  25. pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
  26. pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
  27. pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
  28. pygeai/_docs/source/content/api_reference.rst +58 -0
  29. pygeai/_docs/source/content/authentication.rst +295 -0
  30. pygeai/_docs/source/content/chat_gui.rst +121 -0
  31. pygeai/_docs/source/content/cli.rst +203 -0
  32. pygeai/_docs/source/content/debugger.rst +651 -0
  33. pygeai/_docs/source/content/intro.rst +67 -0
  34. pygeai/_docs/source/content/migration.rst +929 -0
  35. pygeai/_docs/source/content/modules.rst +7 -0
  36. pygeai/_docs/source/content/quickstart.rst +143 -0
  37. pygeai/_docs/source/content/samples.rst +394 -0
  38. pygeai/_docs/source/index.rst +75 -0
  39. pygeai/_docs/source/modules.rst +7 -0
  40. pygeai/_docs/source/pygeai.admin.rst +29 -0
  41. pygeai/_docs/source/pygeai.analytics.rst +53 -0
  42. pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
  43. pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
  44. pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
  45. pygeai/_docs/source/pygeai.assistant.rst +55 -0
  46. pygeai/_docs/source/pygeai.auth.rst +29 -0
  47. pygeai/_docs/source/pygeai.chat.rst +69 -0
  48. pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
  49. pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
  50. pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
  51. pygeai/_docs/source/pygeai.cli.rst +62 -0
  52. pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
  53. pygeai/_docs/source/pygeai.core.base.rst +53 -0
  54. pygeai/_docs/source/pygeai.core.common.rst +37 -0
  55. pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
  56. pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
  57. pygeai/_docs/source/pygeai.core.files.rst +61 -0
  58. pygeai/_docs/source/pygeai.core.llm.rst +29 -0
  59. pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
  60. pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
  61. pygeai/_docs/source/pygeai.core.rst +63 -0
  62. pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
  63. pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
  64. pygeai/_docs/source/pygeai.core.services.rst +37 -0
  65. pygeai/_docs/source/pygeai.core.utils.rst +37 -0
  66. pygeai/_docs/source/pygeai.dbg.rst +21 -0
  67. pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
  68. pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
  69. pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
  70. pygeai/_docs/source/pygeai.evaluation.rst +31 -0
  71. pygeai/_docs/source/pygeai.flows.rst +29 -0
  72. pygeai/_docs/source/pygeai.gam.rst +29 -0
  73. pygeai/_docs/source/pygeai.health.rst +29 -0
  74. pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
  75. pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
  76. pygeai/_docs/source/pygeai.lab.rst +65 -0
  77. pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
  78. pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
  79. pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
  80. pygeai/_docs/source/pygeai.man.man1.rst +10 -0
  81. pygeai/_docs/source/pygeai.man.rst +18 -0
  82. pygeai/_docs/source/pygeai.migration.rst +29 -0
  83. pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
  84. pygeai/_docs/source/pygeai.organization.rst +61 -0
  85. pygeai/_docs/source/pygeai.proxy.rst +53 -0
  86. pygeai/_docs/source/pygeai.rst +35 -0
  87. pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
  88. pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
  89. pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
  90. pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
  91. pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
  92. pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
  93. pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
  94. pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
  95. pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
  96. pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
  97. pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
  98. pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
  99. pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
  100. pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
  101. pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
  102. pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
  103. pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
  104. pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
  105. pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
  106. pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
  107. pygeai/_docs/source/pygeai.tests.core.rst +39 -0
  108. pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
  109. pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
  110. pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
  111. pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
  112. pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
  113. pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
  114. pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
  115. pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
  116. pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
  117. pygeai/_docs/source/pygeai.tests.health.rst +21 -0
  118. pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
  119. pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
  120. pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
  121. pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
  122. pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
  123. pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
  124. pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
  125. pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
  126. pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
  127. pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
  128. pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
  129. pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
  130. pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
  131. pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
  132. pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
  133. pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
  134. pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
  135. pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
  136. pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
  137. pygeai/_docs/source/pygeai.tests.rst +33 -0
  138. pygeai/admin/clients.py +14 -11
  139. pygeai/admin/endpoints.py +2 -2
  140. pygeai/analytics/clients.py +505 -0
  141. pygeai/analytics/endpoints.py +35 -0
  142. pygeai/analytics/managers.py +606 -0
  143. pygeai/analytics/mappers.py +207 -0
  144. pygeai/analytics/responses.py +240 -0
  145. pygeai/assistant/clients.py +18 -45
  146. pygeai/assistant/data/clients.py +1 -0
  147. pygeai/assistant/data_analyst/clients.py +8 -12
  148. pygeai/assistant/managers.py +195 -157
  149. pygeai/assistant/mappers.py +4 -2
  150. pygeai/assistant/rag/clients.py +27 -67
  151. pygeai/assistant/rag/mappers.py +12 -6
  152. pygeai/assistant/rag/models.py +301 -159
  153. pygeai/auth/__init__.py +0 -0
  154. pygeai/auth/clients.py +129 -0
  155. pygeai/auth/endpoints.py +6 -0
  156. pygeai/chat/clients.py +308 -37
  157. pygeai/chat/endpoints.py +3 -0
  158. pygeai/chat/iris.py +2 -8
  159. pygeai/chat/managers.py +9 -6
  160. pygeai/chat/session.py +38 -0
  161. pygeai/chat/settings.py +6 -0
  162. pygeai/chat/ui.py +678 -0
  163. pygeai/cli/__init__.py +0 -1
  164. pygeai/cli/commands/admin.py +7 -10
  165. pygeai/cli/commands/analytics.py +533 -0
  166. pygeai/cli/commands/assistant.py +9 -9
  167. pygeai/cli/commands/auth.py +299 -0
  168. pygeai/cli/commands/base.py +71 -9
  169. pygeai/cli/commands/chat.py +676 -19
  170. pygeai/cli/commands/common.py +28 -24
  171. pygeai/cli/commands/configuration.py +66 -13
  172. pygeai/cli/commands/docs.py +105 -0
  173. pygeai/cli/commands/embeddings.py +58 -11
  174. pygeai/cli/commands/evaluation.py +38 -38
  175. pygeai/cli/commands/feedback.py +3 -4
  176. pygeai/cli/commands/files.py +7 -8
  177. pygeai/cli/commands/gam.py +85 -10
  178. pygeai/cli/commands/lab/ai_lab.py +340 -484
  179. pygeai/cli/commands/lab/options.py +8 -0
  180. pygeai/cli/commands/lab/spec.py +273 -0
  181. pygeai/cli/commands/lab/utils.py +13 -0
  182. pygeai/cli/commands/llm.py +6 -7
  183. pygeai/cli/commands/migrate.py +1064 -436
  184. pygeai/cli/commands/organization.py +516 -11
  185. pygeai/cli/commands/rag.py +13 -14
  186. pygeai/cli/commands/rerank.py +3 -5
  187. pygeai/cli/commands/secrets.py +8 -9
  188. pygeai/cli/commands/usage_limits.py +18 -20
  189. pygeai/cli/commands/validators.py +144 -1
  190. pygeai/cli/commands/version.py +4 -5
  191. pygeai/cli/error_handler.py +151 -0
  192. pygeai/cli/geai.py +170 -31
  193. pygeai/cli/geai_proxy.py +86 -25
  194. pygeai/cli/install_man.py +93 -22
  195. pygeai/cli/parsers.py +75 -25
  196. pygeai/cli/texts/help.py +265 -28
  197. pygeai/core/base/clients.py +53 -12
  198. pygeai/core/base/mappers.py +11 -2
  199. pygeai/core/base/session.py +95 -11
  200. pygeai/core/common/config.py +78 -14
  201. pygeai/core/common/exceptions.py +96 -6
  202. pygeai/core/embeddings/__init__.py +19 -0
  203. pygeai/core/embeddings/clients.py +23 -5
  204. pygeai/core/embeddings/managers.py +9 -4
  205. pygeai/core/embeddings/mappers.py +16 -2
  206. pygeai/core/embeddings/responses.py +9 -2
  207. pygeai/core/feedback/clients.py +8 -3
  208. pygeai/core/files/clients.py +23 -24
  209. pygeai/core/files/managers.py +121 -30
  210. pygeai/core/files/responses.py +4 -3
  211. pygeai/core/handlers.py +10 -1
  212. pygeai/core/llm/clients.py +22 -29
  213. pygeai/core/models.py +127 -11
  214. pygeai/core/plugins/clients.py +6 -6
  215. pygeai/core/rerank/clients.py +9 -3
  216. pygeai/core/rerank/managers.py +22 -5
  217. pygeai/core/secrets/clients.py +16 -37
  218. pygeai/core/services/response.py +18 -0
  219. pygeai/core/services/rest.py +159 -49
  220. pygeai/core/utils/__init__.py +0 -0
  221. pygeai/core/utils/console.py +83 -0
  222. pygeai/core/utils/parsers.py +32 -0
  223. pygeai/core/utils/validators.py +10 -0
  224. pygeai/dbg/__init__.py +3 -0
  225. pygeai/dbg/debugger.py +854 -14
  226. pygeai/evaluation/clients.py +7 -4
  227. pygeai/evaluation/dataset/clients.py +46 -44
  228. pygeai/evaluation/plan/clients.py +28 -26
  229. pygeai/evaluation/result/clients.py +38 -5
  230. pygeai/gam/clients.py +50 -28
  231. pygeai/gam/endpoints.py +2 -1
  232. pygeai/health/__init__.py +0 -0
  233. pygeai/health/clients.py +24 -0
  234. pygeai/health/endpoints.py +1 -0
  235. pygeai/lab/__init__.py +0 -90
  236. pygeai/lab/agents/clients.py +203 -162
  237. pygeai/lab/agents/endpoints.py +4 -0
  238. pygeai/lab/agents/mappers.py +57 -7
  239. pygeai/lab/clients.py +24 -0
  240. pygeai/lab/constants.py +3 -0
  241. pygeai/lab/managers.py +571 -541
  242. pygeai/lab/models.py +108 -19
  243. pygeai/lab/processes/clients.py +332 -340
  244. pygeai/lab/processes/mappers.py +3 -3
  245. pygeai/lab/runners.py +90 -0
  246. pygeai/lab/spec/__init__.py +0 -0
  247. pygeai/lab/spec/loader.py +24 -0
  248. pygeai/lab/spec/parsers.py +39 -0
  249. pygeai/lab/strategies/clients.py +67 -63
  250. pygeai/lab/strategies/mappers.py +1 -1
  251. pygeai/lab/tools/clients.py +85 -118
  252. pygeai/lab/tools/endpoints.py +4 -0
  253. pygeai/lab/tools/mappers.py +5 -5
  254. pygeai/man/man1/geai-proxy.1 +116 -0
  255. pygeai/man/man1/geai.1 +2580 -66
  256. pygeai/migration/__init__.py +33 -0
  257. pygeai/migration/strategies.py +468 -146
  258. pygeai/migration/tools.py +170 -3
  259. pygeai/organization/clients.py +245 -50
  260. pygeai/organization/endpoints.py +17 -8
  261. pygeai/organization/limits/clients.py +34 -32
  262. pygeai/organization/limits/managers.py +108 -49
  263. pygeai/organization/managers.py +347 -53
  264. pygeai/organization/mappers.py +102 -2
  265. pygeai/organization/responses.py +58 -1
  266. pygeai/proxy/clients.py +6 -3
  267. pygeai/proxy/config.py +14 -1
  268. pygeai/proxy/managers.py +61 -33
  269. pygeai/proxy/servers.py +196 -51
  270. pygeai/proxy/tool.py +33 -16
  271. pygeai/tests/admin/__init__.py +0 -0
  272. pygeai/tests/admin/test_clients.py +148 -0
  273. pygeai/tests/analytics/__init__.py +0 -0
  274. pygeai/tests/analytics/test_clients.py +86 -0
  275. pygeai/tests/analytics/test_managers.py +94 -0
  276. pygeai/tests/analytics/test_mappers.py +84 -0
  277. pygeai/tests/analytics/test_responses.py +73 -0
  278. pygeai/tests/assistants/rag/test_clients.py +346 -0
  279. pygeai/tests/assistants/rag/test_models.py +292 -0
  280. pygeai/tests/assistants/test_clients.py +176 -82
  281. pygeai/tests/assistants/test_managers.py +191 -57
  282. pygeai/tests/auth/__init__.py +0 -0
  283. pygeai/tests/auth/test_clients.py +289 -0
  284. pygeai/tests/auth/test_oauth.py +172 -0
  285. pygeai/tests/auth/test_session_logging.py +150 -0
  286. pygeai/tests/chat/__init__.py +0 -0
  287. pygeai/tests/chat/test_clients.py +393 -0
  288. pygeai/tests/chat/test_iris.py +38 -0
  289. pygeai/tests/chat/test_session.py +62 -0
  290. pygeai/tests/chat/test_ui.py +224 -0
  291. pygeai/tests/cli/commands/__init__.py +0 -0
  292. pygeai/tests/cli/commands/lab/__init__.py +0 -0
  293. pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
  294. pygeai/tests/cli/commands/lab/test_common.py +208 -0
  295. pygeai/tests/cli/commands/lab/test_spec.py +246 -0
  296. pygeai/tests/cli/commands/test_assistant.py +202 -0
  297. pygeai/tests/cli/commands/test_chat.py +130 -0
  298. pygeai/tests/cli/commands/test_common.py +350 -0
  299. pygeai/tests/cli/commands/test_embeddings.py +132 -0
  300. pygeai/tests/cli/commands/test_evaluation.py +656 -0
  301. pygeai/tests/cli/commands/test_feedback.py +65 -0
  302. pygeai/tests/cli/commands/test_files.py +161 -0
  303. pygeai/tests/cli/commands/test_gam.py +201 -0
  304. pygeai/tests/cli/commands/test_llm.py +114 -0
  305. pygeai/tests/cli/commands/test_migrate.py +176 -0
  306. pygeai/tests/cli/commands/test_organization.py +276 -0
  307. pygeai/tests/cli/commands/test_rag.py +266 -0
  308. pygeai/tests/cli/commands/test_rerank.py +110 -0
  309. pygeai/tests/cli/commands/test_secrets.py +171 -0
  310. pygeai/tests/cli/commands/test_show_help.py +41 -0
  311. pygeai/tests/cli/commands/test_usage_limits.py +412 -0
  312. pygeai/tests/cli/commands/test_validators.py +160 -0
  313. pygeai/tests/cli/commands/test_version.py +81 -0
  314. pygeai/tests/cli/docker/__init__.py +0 -0
  315. pygeai/tests/cli/test_credentials_flag.py +316 -0
  316. pygeai/tests/cli/test_error_handler.py +225 -0
  317. pygeai/tests/cli/test_geai_driver.py +154 -0
  318. pygeai/tests/cli/test_parsers.py +5 -5
  319. pygeai/tests/core/base/data/models.py +7 -0
  320. pygeai/tests/core/base/test_mappers.py +43 -11
  321. pygeai/tests/core/base/test_models.py +3 -1
  322. pygeai/tests/core/base/test_responses.py +53 -0
  323. pygeai/tests/core/common/__init__.py +0 -0
  324. pygeai/tests/core/common/data/__init__.py +0 -0
  325. pygeai/tests/core/common/test_config.py +186 -0
  326. pygeai/tests/core/common/test_decorators.py +69 -0
  327. pygeai/tests/core/embeddings/__init__.py +0 -0
  328. pygeai/tests/core/embeddings/test_clients.py +225 -0
  329. pygeai/tests/core/embeddings/test_managers.py +171 -0
  330. pygeai/tests/core/embeddings/test_mappers.py +142 -0
  331. pygeai/tests/core/feedback/__init__.py +0 -0
  332. pygeai/tests/core/feedback/test_clients.py +64 -0
  333. pygeai/tests/core/files/test_clients.py +128 -0
  334. pygeai/tests/core/files/test_managers.py +124 -78
  335. pygeai/tests/core/files/test_mappers.py +137 -0
  336. pygeai/tests/core/files/test_models.py +103 -0
  337. pygeai/tests/core/files/test_responses.py +122 -0
  338. pygeai/tests/core/llm/__init__.py +0 -0
  339. pygeai/tests/core/llm/test_clients.py +142 -0
  340. pygeai/tests/core/plugins/__init__.py +0 -0
  341. pygeai/tests/core/plugins/test_clients.py +66 -0
  342. pygeai/tests/core/rerank/test_clients.py +76 -0
  343. pygeai/tests/core/rerank/test_managers.py +61 -39
  344. pygeai/tests/core/secrets/__init__.py +0 -0
  345. pygeai/tests/core/secrets/test_clients.py +264 -0
  346. pygeai/tests/core/services/__init__.py +0 -0
  347. pygeai/tests/core/services/test_rest.py +273 -0
  348. pygeai/tests/core/test_handlers.py +66 -0
  349. pygeai/tests/core/utils/__init__.py +0 -0
  350. pygeai/tests/core/utils/test_console.py +80 -0
  351. pygeai/tests/dbg/__init__.py +0 -0
  352. pygeai/tests/dbg/test_debugger.py +591 -0
  353. pygeai/tests/evaluation/__init__.py +0 -0
  354. pygeai/tests/evaluation/dataset/__init__.py +0 -0
  355. pygeai/tests/evaluation/dataset/test_clients.py +265 -0
  356. pygeai/tests/evaluation/plan/__init__.py +0 -0
  357. pygeai/tests/evaluation/plan/test_clients.py +195 -0
  358. pygeai/tests/evaluation/result/__init__.py +0 -0
  359. pygeai/tests/evaluation/result/test_clients.py +66 -0
  360. pygeai/tests/gam/__init__.py +0 -0
  361. pygeai/tests/gam/test_clients.py +195 -0
  362. pygeai/tests/health/__init__.py +0 -0
  363. pygeai/tests/health/test_clients.py +41 -0
  364. pygeai/tests/integration/__init__.py +0 -0
  365. pygeai/tests/integration/assistants/__init__.py +0 -0
  366. pygeai/tests/integration/assistants/rag/__init__.py +0 -0
  367. pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
  368. pygeai/tests/integration/chat/__init__.py +0 -0
  369. pygeai/tests/integration/chat/test_generate_image.py +158 -0
  370. pygeai/tests/integration/lab/__init__.py +0 -0
  371. pygeai/tests/integration/lab/agents/__init__.py +0 -0
  372. pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
  373. pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
  374. pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
  375. pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
  376. pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
  377. pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
  378. pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
  379. pygeai/tests/integration/lab/processes/__init__.py +0 -0
  380. pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
  381. pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
  382. pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
  383. pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
  384. pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
  385. pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
  386. pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
  387. pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
  388. pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
  389. pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
  390. pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
  391. pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
  392. pygeai/tests/integration/lab/tools/__init__.py +0 -0
  393. pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
  394. pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
  395. pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
  396. pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
  397. pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
  398. pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
  399. pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
  400. pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
  401. pygeai/tests/lab/agents/__init__.py +0 -0
  402. pygeai/tests/lab/agents/test_clients.py +481 -0
  403. pygeai/tests/lab/agents/test_mappers.py +440 -0
  404. pygeai/tests/lab/processes/__init__.py +0 -0
  405. pygeai/tests/lab/processes/test_clients.py +1416 -0
  406. pygeai/tests/lab/processes/test_mappers.py +1092 -0
  407. pygeai/tests/lab/spec/__init__.py +0 -0
  408. pygeai/tests/lab/spec/test_loader.py +59 -0
  409. pygeai/tests/lab/spec/test_parsers.py +182 -0
  410. pygeai/tests/lab/strategies/__init__.py +0 -0
  411. pygeai/tests/lab/strategies/test_clients.py +241 -0
  412. pygeai/tests/lab/strategies/test_mappers.py +132 -0
  413. pygeai/tests/lab/test_managers.py +553 -0
  414. pygeai/tests/lab/test_models.py +500 -3
  415. pygeai/tests/lab/tools/__init__.py +0 -0
  416. pygeai/tests/lab/tools/test_clients.py +521 -0
  417. pygeai/tests/lab/tools/test_mappers.py +198 -0
  418. pygeai/tests/migration/__init__.py +0 -0
  419. pygeai/tests/migration/test_strategies.py +405 -0
  420. pygeai/tests/migration/test_tools.py +159 -0
  421. pygeai/tests/organization/limits/test_clients.py +567 -0
  422. pygeai/tests/organization/limits/test_managers.py +298 -56
  423. pygeai/tests/organization/test_clients.py +600 -30
  424. pygeai/tests/organization/test_managers.py +424 -0
  425. pygeai/tests/organization/test_mappers.py +153 -0
  426. pygeai/tests/organization/test_responses.py +137 -0
  427. pygeai/tests/proxy/__init__.py +1 -0
  428. pygeai/tests/proxy/test_clients.py +397 -0
  429. pygeai/tests/proxy/test_config.py +171 -0
  430. pygeai/tests/proxy/test_integration.py +305 -0
  431. pygeai/tests/proxy/test_managers.py +312 -0
  432. pygeai/tests/proxy/test_servers.py +387 -0
  433. pygeai/tests/proxy/test_tool.py +176 -0
  434. pygeai/tests/snippets/analytics/__init__.py +0 -0
  435. pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
  436. pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
  437. pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
  438. pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
  439. pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
  440. pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
  441. pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
  442. pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
  443. pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
  444. pygeai/tests/snippets/auth/__init__.py +0 -0
  445. pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
  446. pygeai/tests/snippets/chat/get_response.py +15 -0
  447. pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
  448. pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
  449. pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
  450. pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
  451. pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
  452. pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
  453. pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
  454. pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
  455. pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
  456. pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
  457. pygeai/tests/snippets/dbg/__init__.py +0 -0
  458. pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
  459. pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
  460. pygeai/tests/snippets/dbg/file_debugging.py +72 -0
  461. pygeai/tests/snippets/dbg/module_debugging.py +61 -0
  462. pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
  463. pygeai/tests/snippets/dbg/stepping_example.py +40 -0
  464. pygeai/tests/snippets/embeddings/cache_example.py +31 -0
  465. pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
  466. pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
  467. pygeai/tests/snippets/embeddings/openai_example.py +30 -0
  468. pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
  469. pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
  470. pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
  471. pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
  472. pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
  473. pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
  474. pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
  475. pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
  476. pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
  477. pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
  478. pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
  479. pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
  480. pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
  481. pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
  482. pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
  483. pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
  484. pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
  485. pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
  486. pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
  487. pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
  488. pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
  489. pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
  490. pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
  491. pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
  492. pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
  493. pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
  494. pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
  495. pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
  496. pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
  497. pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
  498. pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
  499. pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
  500. pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
  501. pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
  502. pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
  503. pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
  504. pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
  505. pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
  506. pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
  507. pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
  508. pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
  509. pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
  510. pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
  511. pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
  512. pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
  513. pygeai/tests/snippets/files/delete_file.py +1 -4
  514. pygeai/tests/snippets/files/get_file_content.py +2 -4
  515. pygeai/tests/snippets/files/get_file_data.py +1 -4
  516. pygeai/tests/snippets/files/get_file_list.py +1 -6
  517. pygeai/tests/snippets/files/upload_file.py +1 -5
  518. pygeai/tests/snippets/gam/gam_access_token.py +87 -0
  519. pygeai/tests/snippets/lab/agentic_flow_example_1.py +25 -23
  520. pygeai/tests/snippets/lab/agentic_flow_example_4.py +23 -23
  521. pygeai/tests/snippets/lab/agents/create_agent.py +5 -8
  522. pygeai/tests/snippets/lab/agents/create_agent_2.py +1 -5
  523. pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
  524. pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
  525. pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
  526. pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
  527. pygeai/tests/snippets/lab/agents/delete_agent.py +1 -5
  528. pygeai/tests/snippets/lab/agents/get_agent.py +2 -11
  529. pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
  530. pygeai/tests/snippets/lab/agents/get_sharing_link.py +2 -7
  531. pygeai/tests/snippets/lab/agents/list_agents.py +4 -7
  532. pygeai/tests/snippets/lab/agents/publish_agent_revision.py +2 -6
  533. pygeai/tests/snippets/lab/agents/update_agent.py +1 -5
  534. pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
  535. pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
  536. pygeai/tests/snippets/lab/crud_ui.py +462 -0
  537. pygeai/tests/snippets/lab/processes/create_process.py +3 -5
  538. pygeai/tests/snippets/lab/processes/create_task.py +3 -5
  539. pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +10 -19
  540. pygeai/tests/snippets/lab/processes/kbs/create_kb.py +2 -5
  541. pygeai/tests/snippets/lab/processes/kbs/get_kb.py +10 -16
  542. pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +13 -20
  543. pygeai/tests/snippets/lab/processes/kbs/try_all.py +5 -7
  544. pygeai/tests/snippets/lab/processes/list_processes.py +5 -7
  545. pygeai/tests/snippets/lab/runner_1.py +1 -1
  546. pygeai/tests/snippets/lab/samples/summarize_files.py +3 -3
  547. pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +2 -5
  548. pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +2 -5
  549. pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +3 -6
  550. pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +2 -5
  551. pygeai/tests/snippets/lab/tools/create_tool.py +4 -10
  552. pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
  553. pygeai/tests/snippets/lab/tools/delete_tool.py +2 -6
  554. pygeai/tests/snippets/lab/tools/get_parameter.py +5 -7
  555. pygeai/tests/snippets/lab/tools/get_tool.py +5 -7
  556. pygeai/tests/snippets/lab/tools/list_tools.py +3 -7
  557. pygeai/tests/snippets/lab/tools/publish_tool_revision.py +3 -5
  558. pygeai/tests/snippets/lab/tools/set_parameters.py +4 -9
  559. pygeai/tests/snippets/lab/tools/update_tool.py +4 -8
  560. pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
  561. pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
  562. pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
  563. pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
  564. pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
  565. pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
  566. pygeai/tests/snippets/lab/{file_summarizer_example.py → use_cases/file_summarizer_example.py} +3 -3
  567. pygeai/tests/snippets/lab/{file_summarizer_example_2.py → use_cases/file_summarizer_example_2.py} +12 -12
  568. pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
  569. pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
  570. pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
  571. pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
  572. pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
  573. pygeai/tests/snippets/migrate/__init__.py +45 -0
  574. pygeai/tests/snippets/migrate/agent_migration.py +110 -0
  575. pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
  576. pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
  577. pygeai/tests/snippets/migrate/process_migration.py +64 -0
  578. pygeai/tests/snippets/migrate/project_migration.py +42 -0
  579. pygeai/tests/snippets/migrate/tool_migration.py +64 -0
  580. pygeai/tests/snippets/organization/add_project_member.py +10 -0
  581. pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
  582. pygeai/tests/snippets/organization/create_project.py +2 -2
  583. pygeai/tests/snippets/organization/get_memberships.py +12 -0
  584. pygeai/tests/snippets/organization/get_organization_members.py +6 -0
  585. pygeai/tests/snippets/organization/get_project_members.py +6 -0
  586. pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
  587. pygeai/tests/snippets/organization/get_project_roles.py +6 -0
  588. pygeai/vendor/a2a/__init__.py +1 -0
  589. pygeai/vendor/a2a/auth/__init__.py +0 -0
  590. pygeai/vendor/a2a/auth/user.py +31 -0
  591. pygeai/vendor/a2a/client/__init__.py +19 -0
  592. pygeai/vendor/a2a/client/client.py +425 -0
  593. pygeai/vendor/a2a/client/errors.py +33 -0
  594. pygeai/vendor/a2a/client/helpers.py +22 -0
  595. pygeai/vendor/a2a/py.typed +0 -0
  596. pygeai/vendor/a2a/server/__init__.py +1 -0
  597. pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
  598. pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
  599. pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
  600. pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
  601. pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
  602. pygeai/vendor/a2a/server/apps/__init__.py +16 -0
  603. pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
  604. pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
  605. pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
  606. pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
  607. pygeai/vendor/a2a/server/context.py +23 -0
  608. pygeai/vendor/a2a/server/events/__init__.py +21 -0
  609. pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
  610. pygeai/vendor/a2a/server/events/event_queue.py +156 -0
  611. pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
  612. pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
  613. pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
  614. pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
  615. pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
  616. pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
  617. pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
  618. pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
  619. pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
  620. pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
  621. pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
  622. pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
  623. pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
  624. pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
  625. pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
  626. pygeai/vendor/a2a/types.py +1624 -0
  627. pygeai/vendor/a2a/utils/__init__.py +40 -0
  628. pygeai/vendor/a2a/utils/artifact.py +72 -0
  629. pygeai/vendor/a2a/utils/errors.py +69 -0
  630. pygeai/vendor/a2a/utils/helpers.py +176 -0
  631. pygeai/vendor/a2a/utils/message.py +83 -0
  632. pygeai/vendor/a2a/utils/task.py +57 -0
  633. pygeai/vendor/a2a/utils/telemetry.py +299 -0
  634. pygeai-0.6.0b15.dist-info/METADATA +205 -0
  635. pygeai-0.6.0b15.dist-info/RECORD +799 -0
  636. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
  637. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/entry_points.txt +2 -1
  638. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/licenses/LICENSE +13 -1
  639. pygeai-0.6.0b15.dist-info/top_level.txt +1 -0
  640. docs/geai-proxy/README.md +0 -145
  641. docs/source/conf.py +0 -45
  642. pygeai/tests/core/test_managers.py +0 -233
  643. pygeai-0.1.51b3.dist-info/METADATA +0 -130
  644. pygeai-0.1.51b3.dist-info/RECORD +0 -324
  645. pygeai-0.1.51b3.dist-info/top_level.txt +0 -3
  646. scripts/bump_beta_version.py +0 -56
  647. {scripts → pygeai/analytics}/__init__.py +0 -0
  648. /pygeai/tests/snippets/lab/{c_code_fixer_agent_flow.py → use_cases/c_code_fixer_agent_flow.py} +0 -0
@@ -1,3 +1,9 @@
1
+ import tempfile
2
+ from pathlib import Path
3
+ from typing import Optional
4
+
5
+ from pygeai import logger
6
+ from pygeai.admin.clients import AdminClient
1
7
  from pygeai.core.base.mappers import ErrorMapper, ResponseMapper
2
8
  from pygeai.core.base.responses import EmptyResponse
3
9
  from pygeai.core.files.clients import FileClient
@@ -5,6 +11,7 @@ from pygeai.core.files.models import UploadFile, File, FileList
5
11
  from pygeai.core.files.mappers import FileResponseMapper
6
12
  from pygeai.core.files.responses import UploadFileResponse
7
13
  from pygeai.core.handlers import ErrorHandler
14
+ from pygeai.core.common.exceptions import APIError
8
15
 
9
16
 
10
17
  class FileManager:
@@ -17,7 +24,7 @@ class FileManager:
17
24
  self,
18
25
  api_key: str = None,
19
26
  base_url: str = None,
20
- alias: str = "default",
27
+ alias: str = None,
21
28
  organization_id: str = None,
22
29
  project_id: str = None
23
30
  ):
@@ -26,8 +33,26 @@ class FileManager:
26
33
  base_url,
27
34
  alias
28
35
  )
29
- self.__organization_id = organization_id
30
- self.__project_id = project_id
36
+ self.organization_id = self.__get_organization_id() if not organization_id else organization_id
37
+ self.project_id = self.__get_project_id() if not project_id else project_id
38
+
39
+ def __get_organization_id(self):
40
+ response = None
41
+ try:
42
+ response = AdminClient().validate_api_token()
43
+ return response.get("organizationId")
44
+ except Exception as e:
45
+ logger.error(f"Error retrieving organization_id from GEAI. Response: {response}: {e}")
46
+ raise APIError(f"Error retrieving organization_id from GEAI: {e}")
47
+
48
+ def __get_project_id(self):
49
+ response = None
50
+ try:
51
+ response = AdminClient().validate_api_token()
52
+ return response.get("projectId")
53
+ except Exception as e:
54
+ logger.error(f"Error retrieving project_id from GEAI. Response: {response}: {e}")
55
+ raise APIError(f"Error retrieving project_id from GEAI: {e}")
31
56
 
32
57
  def upload_file(
33
58
  self,
@@ -36,20 +61,26 @@ class FileManager:
36
61
  """
37
62
  Uploads a file to the specified organization and project.
38
63
 
64
+ This method sends a request to the file client to upload a file based on the provided
65
+ `UploadFile` object.
66
+
39
67
  :param file: UploadFile - The file object containing file path, name, and folder details.
40
68
  :return: UploadFileResponse - The response object containing the uploaded file details.
69
+ :raises APIError: If the API returns errors.
41
70
  """
42
71
  response_data = self.__client.upload_file(
43
72
  file_path=file.path,
44
- organization_id=self.__organization_id,
45
- project_id=self.__project_id,
73
+ organization_id=self.organization_id,
74
+ project_id=self.project_id,
46
75
  folder=file.folder,
47
76
  file_name=file.name,
48
77
  )
49
78
  if ErrorHandler.has_errors(response_data):
50
- result = ErrorHandler.extract_error(response_data)
51
- else:
52
- result = FileResponseMapper.map_to_upload_file_response(response_data)
79
+ error = ErrorHandler.extract_error(response_data)
80
+ logger.error(f"Error received while uploading file: {error}")
81
+ raise APIError(f"Error received while uploading file: {error}")
82
+
83
+ result = FileResponseMapper.map_to_upload_file_response(response_data)
53
84
  return result
54
85
 
55
86
  def get_file_data(
@@ -59,18 +90,24 @@ class FileManager:
59
90
  """
60
91
  Retrieves metadata of a specific file by its ID.
61
92
 
93
+ This method sends a request to the file client to retrieve metadata for a file
94
+ identified by `file_id`.
95
+
62
96
  :param file_id: str - The unique identifier of the file.
63
97
  :return: File - A file object containing metadata about the requested file.
98
+ :raises APIError: If the API returns errors.
64
99
  """
65
100
  response_data = self.__client.get_file(
66
- organization=self.__organization_id,
67
- project=self.__project_id,
101
+ organization=self.organization_id,
102
+ project=self.project_id,
68
103
  file_id=file_id
69
104
  )
70
105
  if ErrorHandler.has_errors(response_data):
71
- result = ErrorHandler.extract_error(response_data)
72
- else:
73
- result = FileResponseMapper.map_to_file(response_data)
106
+ error = ErrorHandler.extract_error(response_data)
107
+ logger.error(f"Error received while retrieving file data: {error}")
108
+ raise APIError(f"Error received while retrieving file data: {error}")
109
+
110
+ result = FileResponseMapper.map_to_file(response_data)
74
111
  return result
75
112
 
76
113
  def delete_file(
@@ -80,18 +117,23 @@ class FileManager:
80
117
  """
81
118
  Deletes a file from the specified organization and project.
82
119
 
120
+ This method sends a request to the file client to delete a file identified by `file_id`.
121
+
83
122
  :param file_id: str - The unique identifier of the file to be deleted.
84
- :return: EmptyResponse - Response indicating the success or failure of the operation.
123
+ :return: EmptyResponse - Response indicating the success of the operation.
124
+ :raises APIError: If the API returns errors.
85
125
  """
86
126
  response_data = self.__client.delete_file(
87
- organization=self.__organization_id,
88
- project=self.__project_id,
127
+ organization=self.organization_id,
128
+ project=self.project_id,
89
129
  file_id=file_id
90
130
  )
91
131
  if ErrorHandler.has_errors(response_data):
92
- result = ErrorHandler.extract_error(response_data)
93
- else:
94
- result = ResponseMapper.map_to_empty_response(response_data)
132
+ error = ErrorHandler.extract_error(response_data)
133
+ logger.error(f"Error received while deleting file: {error}")
134
+ raise APIError(f"Error received while deleting file: {error}")
135
+
136
+ result = ResponseMapper.map_to_empty_response(response_data or "File deleted successfully")
95
137
  return result
96
138
 
97
139
  def get_file_content(
@@ -101,33 +143,82 @@ class FileManager:
101
143
  """
102
144
  Retrieves the raw content of a specific file.
103
145
 
146
+ This method sends a request to the file client to retrieve the binary content of a file
147
+ identified by `file_id`.
148
+
104
149
  :param file_id: str - The unique identifier of the file.
105
150
  :return: bytes - The binary content of the file.
151
+ :raises APIError: If the API returns errors.
106
152
  """
107
153
  response_data = self.__client.get_file_content(
108
- organization=self.__organization_id,
109
- project=self.__project_id,
154
+ organization=self.organization_id,
155
+ project=self.project_id,
110
156
  file_id=file_id
111
157
  )
112
158
  if isinstance(response_data, dict) and "errors" in response_data:
113
- result = ErrorMapper.map_to_error_list_response(response_data)
114
- else:
115
- result = response_data
159
+ error = ErrorHandler.extract_error(response_data)
160
+ logger.error(f"Error received while retrieving file content: {error}")
161
+ raise APIError(f"Error received while retrieving file content: {error}")
162
+
163
+ result = response_data
116
164
  return result
117
165
 
118
166
  def get_file_list(self) -> FileList:
119
167
  """
120
- Retrieves a list of all files associated with a given organization and project.
168
+ Retrieves a list of all files associated with a given organization and project.
169
+
170
+ This method queries the file client to fetch a list of files for the specified
171
+ organization and project.
121
172
 
122
173
  :return: FileList - A list of file objects associated with the organization and project.
174
+ :raises APIError: If the API returns errors.
123
175
  """
124
176
  response_data = self.__client.get_file_list(
125
- organization=self.__organization_id,
126
- project=self.__project_id
177
+ organization=self.organization_id,
178
+ project=self.project_id
127
179
  )
128
180
  if ErrorHandler.has_errors(response_data):
129
- result = ErrorHandler.extract_error(response_data)
130
- else:
131
- result = FileResponseMapper.map_to_file_list_response(response_data)
181
+ error = ErrorHandler.extract_error(response_data)
182
+ logger.error(f"Error received while retrieving file list: {error}")
183
+ raise APIError(f"Error received while retrieving file list: {error}")
184
+
185
+ result = FileResponseMapper.map_to_file_list_response(response_data)
132
186
  return result
133
187
 
188
+ def upload_file_from_content(
189
+ self,
190
+ file_name: str,
191
+ content: bytes,
192
+ folder: Optional[str] = None
193
+ ) -> UploadFileResponse:
194
+ """
195
+ Uploads a file from binary content to the specified organization and project.
196
+
197
+ This method creates a temporary file from the provided content, uploads it,
198
+ and then cleans up the temporary file.
199
+
200
+ :param file_name: str - The name for the uploaded file.
201
+ :param content: bytes - The binary content of the file.
202
+ :param folder: str, optional - Destination folder (default is None, which means temporary storage).
203
+ :return: UploadFileResponse - The response object containing the uploaded file details.
204
+ :raises APIError: If the API returns errors.
205
+ """
206
+ temp_file = None
207
+ try:
208
+ suffix = Path(file_name).suffix or ""
209
+ with tempfile.NamedTemporaryFile(mode='wb', suffix=suffix, delete=False) as temp_file:
210
+ temp_file.write(content)
211
+ temp_file_path = temp_file.name
212
+
213
+ upload_file = UploadFile(
214
+ path=temp_file_path,
215
+ name=file_name,
216
+ folder=folder
217
+ )
218
+ return self.upload_file(upload_file)
219
+ finally:
220
+ if temp_file:
221
+ try:
222
+ Path(temp_file_path).unlink(missing_ok=True)
223
+ except Exception as e:
224
+ logger.warning(f"Failed to delete temporary file {temp_file_path}: {e}")
@@ -1,10 +1,11 @@
1
+ from typing import Optional
1
2
  from pydantic.main import BaseModel
2
3
 
3
4
 
4
5
  class UploadFileResponse(BaseModel):
5
- id: str
6
- url: str
7
- success: bool
6
+ id: Optional[str] = None
7
+ url: Optional[str] = None
8
+ success: Optional[bool] = None
8
9
 
9
10
  def to_dict(self):
10
11
  return {
pygeai/core/handlers.py CHANGED
@@ -6,7 +6,16 @@ class ErrorHandler:
6
6
  @classmethod
7
7
  def has_errors(cls, response):
8
8
  error_found = False
9
- if "errors" in response or "error" in response:
9
+ if (
10
+ "errors" in response or
11
+ "error" in response or
12
+ (
13
+ "message" in response and
14
+ isinstance(response.get("message"), list) and
15
+ len(response.get("message")) > 0 and
16
+ response.get("message")[0].get("type") == "error"
17
+ )
18
+ ):
10
19
  error_found = True
11
20
 
12
21
  return error_found
@@ -1,41 +1,38 @@
1
- import json
2
- from json import JSONDecodeError
3
1
 
2
+ from pygeai import logger
4
3
  from pygeai.core.base.clients import BaseClient
4
+ from pygeai.core.common.exceptions import InvalidAPIResponseException
5
5
  from pygeai.core.llm.endpoints import GET_PROVIDER_LIST_V2, GET_PROVIDER_DATA_V2, GET_PROVIDER_MODELS_V2, \
6
6
  GET_MODEL_DATA_V2
7
+ from pygeai.core.utils.validators import validate_status_code
8
+ from pygeai.core.utils.parsers import parse_json_response
7
9
 
8
10
 
9
11
  class LlmClient(BaseClient):
10
12
 
11
13
  def get_provider_list(self) -> dict:
14
+ logger.debug("Obtaining provider list")
12
15
  response = self.api_service.get(endpoint=GET_PROVIDER_LIST_V2)
13
- try:
14
- result = response.json()
15
- except JSONDecodeError as e:
16
- result = response.text
17
-
18
- return result
16
+ validate_status_code(response)
17
+ return parse_json_response(response, "obtain provider list")
19
18
 
20
19
  def get_provider_data(self, provider_name: str) -> dict:
21
20
  endpoint = GET_PROVIDER_DATA_V2.format(providerName=provider_name)
22
- response = self.api_service.get(endpoint=endpoint)
23
- try:
24
- result = response.json()
25
- except JSONDecodeError as e:
26
- result = response.text
27
21
 
28
- return result
22
+ logger.debug(f"Obtaining provider data for {provider_name}")
23
+
24
+ response = self.api_service.get(endpoint=endpoint)
25
+ validate_status_code(response)
26
+ return parse_json_response(response, "obtain provider data", provider_name=provider_name)
29
27
 
30
28
  def get_provider_models(self, provider_name: str) -> dict:
31
29
  endpoint = GET_PROVIDER_MODELS_V2.format(providerName=provider_name)
32
- response = self.api_service.get(endpoint=endpoint)
33
- try:
34
- result = response.json()
35
- except JSONDecodeError as e:
36
- result = response.text
37
30
 
38
- return result
31
+ logger.debug(f"Obtaining provider models for {provider_name}")
32
+
33
+ response = self.api_service.get(endpoint=endpoint)
34
+ validate_status_code(response)
35
+ return parse_json_response(response, "obtain provider models", provider_name=provider_name)
39
36
 
40
37
  def get_model_data(
41
38
  self,
@@ -47,14 +44,10 @@ class LlmClient(BaseClient):
47
44
  providerName=provider_name,
48
45
  modelNameOrId=model_name or model_id
49
46
  )
50
- response = self.api_service.get(endpoint=endpoint)
51
- try:
52
- result = response.json()
53
- except JSONDecodeError as e:
54
- result = response.text
55
-
56
- return result
57
-
58
-
59
47
 
48
+ logger.debug(f"Obtaining model data for {provider_name}/{model_name or model_id}")
60
49
 
50
+ response = self.api_service.get(endpoint=endpoint)
51
+ model_identifier = model_name or model_id
52
+ validate_status_code(response)
53
+ return parse_json_response(response, f"obtain model data for {provider_name}/{model_identifier}")
pygeai/core/models.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from datetime import datetime
2
2
 
3
- from pydantic import Field, field_validator
3
+ from pydantic import Field, field_validator, model_validator
4
4
  from typing import Optional, Literal, Any, List, Union, Iterator
5
5
 
6
6
  from pygeai.core import CustomBaseModel
@@ -247,23 +247,32 @@ class Project(CustomBaseModel):
247
247
 
248
248
  class RequestItem(CustomBaseModel):
249
249
  """
250
- {
251
- "assistant": "string",
252
- "intent": "string",
253
- "timestamp": "string",
254
- "prompt": "string",
255
- "output": "string",
256
- "inputText": "string",
257
- "status": "string"
258
- }
250
+ Represents a request item with metadata about an API interaction.
251
+ Follows a JSON schema with camelCase aliases for external compatibility.
259
252
  """
253
+ api_token: str = Field(..., alias="apiToken")
260
254
  assistant: str = Field(..., alias="assistant")
255
+ cost: float = Field(..., alias="cost")
256
+ elapsed_time_ms: int = Field(..., alias="elapsedTimeMs")
257
+ end_timestamp: datetime = Field(..., alias="endTimestamp")
258
+ feedback: Optional[str] = Field(None, alias="feedback")
261
259
  intent: Optional[str] = Field(None, alias="intent")
262
- timestamp: str = Field(..., alias="timestamp")
260
+ module: str = Field(..., alias="module")
263
261
  prompt: Optional[str] = Field(None, alias="prompt")
264
262
  output: Optional[str] = Field(None, alias="output")
265
263
  input_text: Optional[str] = Field(None, alias="inputText")
264
+ rag_sources_consulted: Optional[str] = Field(None, alias="ragSourcesConsulted")
265
+ session_id: str = Field(..., alias="sessionId")
266
+ start_timestamp: datetime = Field(..., alias="startTimestamp")
266
267
  status: str = Field(..., alias="status")
268
+ timestamp: datetime = Field(..., alias="timestamp")
269
+
270
+ @model_validator(mode="after")
271
+ def validate_status(self):
272
+ valid_statuses = {"succeeded", "failed", "pending"}
273
+ if self.status not in valid_statuses:
274
+ raise ValueError(f"Status must be one of {valid_statuses}")
275
+ return self
267
276
 
268
277
  def to_dict(self):
269
278
  return self.model_dump(by_alias=True, exclude_none=True)
@@ -681,3 +690,110 @@ class DataAnalystAssistant(Assistant):
681
690
 
682
691
  class ChatWithDataAssistant(Assistant):
683
692
  type: Literal["ChatWithData"] = "ChatWithData"
693
+
694
+
695
+ class Role(CustomBaseModel):
696
+ """
697
+ {
698
+ "id": "string",
699
+ "name": "string",
700
+ "externalId": "string",
701
+ "type": "string",
702
+ "origin": "string"
703
+ }
704
+ """
705
+ id: str = Field(..., alias="id")
706
+ name: str = Field(..., alias="name")
707
+ external_id: Optional[str] = Field(None, alias="externalId")
708
+ type: Optional[str] = Field(None, alias="type")
709
+ origin: Optional[str] = Field(None, alias="origin")
710
+
711
+ def to_dict(self):
712
+ return self.model_dump(by_alias=True, exclude_none=True)
713
+
714
+ def __str__(self):
715
+ return str(self.to_dict())
716
+
717
+
718
+ class Member(CustomBaseModel):
719
+ """
720
+ {
721
+ "email": "string",
722
+ "roles": [...]
723
+ }
724
+ """
725
+ email: str = Field(..., alias="email")
726
+ roles: Optional[List[Role]] = Field(default_factory=list, alias="roles")
727
+
728
+ @field_validator("roles", mode="before")
729
+ @classmethod
730
+ def normalize_roles(cls, value):
731
+ if isinstance(value, list):
732
+ return [Role.model_validate(item) if isinstance(item, dict) else item for item in value]
733
+ return value
734
+
735
+ def to_dict(self):
736
+ return self.model_dump(by_alias=True, exclude_none=True)
737
+
738
+ def __str__(self):
739
+ return str(self.to_dict())
740
+
741
+
742
+ class ProjectMembership(CustomBaseModel):
743
+ """
744
+ {
745
+ "organizationId": "string",
746
+ "organizationName": "string",
747
+ "projectDescription": "string",
748
+ "projectId": "string",
749
+ "projectName": "string",
750
+ "roles": [...]
751
+ }
752
+ """
753
+ organization_id: Optional[str] = Field(None, alias="organizationId")
754
+ organization_name: Optional[str] = Field(None, alias="organizationName")
755
+ project_description: Optional[str] = Field(None, alias="projectDescription")
756
+ project_id: str = Field(..., alias="projectId")
757
+ project_name: str = Field(..., alias="projectName")
758
+ roles: Optional[List[Role]] = Field(default_factory=list, alias="roles")
759
+
760
+ @field_validator("roles", mode="before")
761
+ @classmethod
762
+ def normalize_roles(cls, value):
763
+ if isinstance(value, list):
764
+ return [Role.model_validate(item) if isinstance(item, dict) else item for item in value]
765
+ return value
766
+
767
+ def to_dict(self):
768
+ return self.model_dump(by_alias=True, exclude_none=True)
769
+
770
+ def __str__(self):
771
+ return str(self.to_dict())
772
+
773
+
774
+ class OrganizationMembership(CustomBaseModel):
775
+ """
776
+ {
777
+ "isStationAvailable": true,
778
+ "organizationId": "string",
779
+ "organizationName": "string",
780
+ "projects": [...]
781
+ }
782
+ """
783
+ is_station_available: Optional[bool] = Field(None, alias="isStationAvailable")
784
+ organization_id: str = Field(..., alias="organizationId")
785
+ organization_name: str = Field(..., alias="organizationName")
786
+ projects: Optional[List[ProjectMembership]] = Field(default_factory=list, alias="projects")
787
+
788
+ @field_validator("projects", mode="before")
789
+ @classmethod
790
+ def normalize_projects(cls, value):
791
+ if isinstance(value, list):
792
+ return [ProjectMembership.model_validate(item) if isinstance(item, dict) else item for item in value]
793
+ return value
794
+
795
+ def to_dict(self):
796
+ return self.model_dump(by_alias=True, exclude_none=True)
797
+
798
+ def __str__(self):
799
+ return str(self.to_dict())
@@ -1,8 +1,11 @@
1
- from json import JSONDecodeError
2
1
  from typing import Optional, List, Dict
3
2
 
3
+ from pygeai import logger
4
4
  from pygeai.core.base.clients import BaseClient
5
+ from pygeai.core.common.exceptions import InvalidAPIResponseException
5
6
  from pygeai.core.plugins.endpoints import LIST_ASSISTANTS_PLUGINS_V1
7
+ from pygeai.core.utils.validators import validate_status_code
8
+ from pygeai.core.utils.parsers import parse_json_response
6
9
 
7
10
 
8
11
  class PluginClient(BaseClient):
@@ -24,9 +27,6 @@ class PluginClient(BaseClient):
24
27
  endpoint=LIST_ASSISTANTS_PLUGINS_V1,
25
28
  params=params
26
29
  )
27
- try:
28
- result = response.json()
29
- except JSONDecodeError:
30
- result = response.text
30
+ validate_status_code(response)
31
+ return parse_json_response(response, f"list assistants for organization {organization_id} and project {project_id}")
31
32
 
32
- return result
@@ -1,8 +1,11 @@
1
- import json
2
1
  from typing import Any, Union
3
2
 
3
+ from pygeai import logger
4
4
  from pygeai.core.base.clients import BaseClient
5
+ from pygeai.core.common.exceptions import InvalidAPIResponseException
5
6
  from pygeai.core.rerank.endpoints import RERANK_V1
7
+ from pygeai.core.utils.validators import validate_status_code
8
+ from pygeai.core.utils.parsers import parse_json_response
6
9
 
7
10
 
8
11
  class RerankClient(BaseClient):
@@ -20,10 +23,13 @@ class RerankClient(BaseClient):
20
23
  "documents": documents,
21
24
  "top_n": top_n
22
25
  }
26
+
27
+ logger.debug(f"Generating rerank with data: {data}")
28
+
23
29
  response = self.api_service.post(
24
30
  endpoint=RERANK_V1,
25
31
  data=data
26
32
  )
27
- result = response.json()
28
- return result
33
+ validate_status_code(response)
34
+ return parse_json_response(response, "rerank chunks for query with model", query=query, model=model)
29
35
 
@@ -1,4 +1,5 @@
1
- from pygeai.core.base.mappers import ErrorMapper
1
+ from pygeai import logger
2
+ from pygeai.core.common.exceptions import APIError
2
3
  from pygeai.core.handlers import ErrorHandler
3
4
  from pygeai.core.rerank.clients import RerankClient
4
5
  from pygeai.core.rerank.mappers import RerankResponseMapper
@@ -7,7 +8,7 @@ from pygeai.core.rerank.models import RerankResponse
7
8
 
8
9
  class RerankManager:
9
10
 
10
- def __init__(self, api_key: str = None, base_url: str = None, alias: str = "default"):
11
+ def __init__(self, api_key: str = None, base_url: str = None, alias: str = None):
11
12
  self.__client = RerankClient(api_key, base_url, alias)
12
13
 
13
14
  def rerank_chunks(
@@ -17,6 +18,20 @@ class RerankManager:
17
18
  documents: list[str],
18
19
  top_n: int = 3
19
20
  ) -> RerankResponse:
21
+ """
22
+ Reranks a list of documents based on their relevance to the given query.
23
+
24
+ This method sends a rerank request to the RerankClient using the specified
25
+ model, query, and list of documents. It processes the API response by
26
+ checking for errors and mapping the result into a structured RerankResponse.
27
+
28
+ :param query: str - The query string used to evaluate document relevance.
29
+ :param model: str - The identifier of the reranking model to use.
30
+ :param documents: list[str] - A list of document strings to be evaluated and reranked.
31
+ :param top_n: int, optional - The number of top-ranked documents to return. Defaults to 3.
32
+ :return: RerankResponse - The structured reranking response containing the top documents and scores.
33
+ :raises APIError: If the API returns errors.
34
+ """
20
35
  response_data = self.__client.rerank_chunks(
21
36
  query=query,
22
37
  model=model,
@@ -24,7 +39,9 @@ class RerankManager:
24
39
  top_n=top_n
25
40
  )
26
41
  if ErrorHandler.has_errors(response_data):
27
- result = ErrorHandler.extract_error(response_data)
28
- else:
29
- result = RerankResponseMapper.map_to_rerank_response(response_data)
42
+ error = ErrorHandler.extract_error(response_data)
43
+ logger.error(f"Error received while reranking chunks: {error}")
44
+ raise APIError(f"Error received while reranking chunks: {error}")
45
+
46
+ result = RerankResponseMapper.map_to_rerank_response(response_data)
30
47
  return result