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

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

Potentially problematic release.


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

Files changed (648) hide show
  1. pygeai/__init__.py +9 -1
  2. pygeai/_docs/Makefile +20 -0
  3. pygeai/_docs/make.bat +35 -0
  4. pygeai/_docs/source/conf.py +117 -0
  5. pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
  6. pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
  7. pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
  8. pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
  9. pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
  10. pygeai/_docs/source/content/ai_lab.rst +102 -0
  11. pygeai/_docs/source/content/analytics.rst +598 -0
  12. pygeai/_docs/source/content/api_reference/admin.rst +161 -0
  13. pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
  14. pygeai/_docs/source/content/api_reference/auth.rst +379 -0
  15. pygeai/_docs/source/content/api_reference/chat.rst +754 -0
  16. pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
  17. pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
  18. pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
  19. pygeai/_docs/source/content/api_reference/files.rst +592 -0
  20. pygeai/_docs/source/content/api_reference/gam.rst +401 -0
  21. pygeai/_docs/source/content/api_reference/health.rst +58 -0
  22. pygeai/_docs/source/content/api_reference/project.rst +738 -0
  23. pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
  24. pygeai/_docs/source/content/api_reference/rag.rst +710 -0
  25. pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
  26. pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
  27. pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
  28. pygeai/_docs/source/content/api_reference.rst +58 -0
  29. pygeai/_docs/source/content/authentication.rst +295 -0
  30. pygeai/_docs/source/content/chat_gui.rst +121 -0
  31. pygeai/_docs/source/content/cli.rst +203 -0
  32. pygeai/_docs/source/content/debugger.rst +651 -0
  33. pygeai/_docs/source/content/intro.rst +67 -0
  34. pygeai/_docs/source/content/migration.rst +929 -0
  35. pygeai/_docs/source/content/modules.rst +7 -0
  36. pygeai/_docs/source/content/quickstart.rst +143 -0
  37. pygeai/_docs/source/content/samples.rst +394 -0
  38. pygeai/_docs/source/index.rst +75 -0
  39. pygeai/_docs/source/modules.rst +7 -0
  40. pygeai/_docs/source/pygeai.admin.rst +29 -0
  41. pygeai/_docs/source/pygeai.analytics.rst +53 -0
  42. pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
  43. pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
  44. pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
  45. pygeai/_docs/source/pygeai.assistant.rst +55 -0
  46. pygeai/_docs/source/pygeai.auth.rst +29 -0
  47. pygeai/_docs/source/pygeai.chat.rst +69 -0
  48. pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
  49. pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
  50. pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
  51. pygeai/_docs/source/pygeai.cli.rst +62 -0
  52. pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
  53. pygeai/_docs/source/pygeai.core.base.rst +53 -0
  54. pygeai/_docs/source/pygeai.core.common.rst +37 -0
  55. pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
  56. pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
  57. pygeai/_docs/source/pygeai.core.files.rst +61 -0
  58. pygeai/_docs/source/pygeai.core.llm.rst +29 -0
  59. pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
  60. pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
  61. pygeai/_docs/source/pygeai.core.rst +63 -0
  62. pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
  63. pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
  64. pygeai/_docs/source/pygeai.core.services.rst +37 -0
  65. pygeai/_docs/source/pygeai.core.utils.rst +37 -0
  66. pygeai/_docs/source/pygeai.dbg.rst +21 -0
  67. pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
  68. pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
  69. pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
  70. pygeai/_docs/source/pygeai.evaluation.rst +31 -0
  71. pygeai/_docs/source/pygeai.flows.rst +29 -0
  72. pygeai/_docs/source/pygeai.gam.rst +29 -0
  73. pygeai/_docs/source/pygeai.health.rst +29 -0
  74. pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
  75. pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
  76. pygeai/_docs/source/pygeai.lab.rst +65 -0
  77. pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
  78. pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
  79. pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
  80. pygeai/_docs/source/pygeai.man.man1.rst +10 -0
  81. pygeai/_docs/source/pygeai.man.rst +18 -0
  82. pygeai/_docs/source/pygeai.migration.rst +29 -0
  83. pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
  84. pygeai/_docs/source/pygeai.organization.rst +61 -0
  85. pygeai/_docs/source/pygeai.proxy.rst +53 -0
  86. pygeai/_docs/source/pygeai.rst +35 -0
  87. pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
  88. pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
  89. pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
  90. pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
  91. pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
  92. pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
  93. pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
  94. pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
  95. pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
  96. pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
  97. pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
  98. pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
  99. pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
  100. pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
  101. pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
  102. pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
  103. pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
  104. pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
  105. pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
  106. pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
  107. pygeai/_docs/source/pygeai.tests.core.rst +39 -0
  108. pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
  109. pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
  110. pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
  111. pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
  112. pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
  113. pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
  114. pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
  115. pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
  116. pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
  117. pygeai/_docs/source/pygeai.tests.health.rst +21 -0
  118. pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
  119. pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
  120. pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
  121. pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
  122. pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
  123. pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
  124. pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
  125. pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
  126. pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
  127. pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
  128. pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
  129. pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
  130. pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
  131. pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
  132. pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
  133. pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
  134. pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
  135. pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
  136. pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
  137. pygeai/_docs/source/pygeai.tests.rst +33 -0
  138. pygeai/admin/clients.py +14 -11
  139. pygeai/admin/endpoints.py +2 -2
  140. pygeai/analytics/clients.py +505 -0
  141. pygeai/analytics/endpoints.py +35 -0
  142. pygeai/analytics/managers.py +606 -0
  143. pygeai/analytics/mappers.py +207 -0
  144. pygeai/analytics/responses.py +240 -0
  145. pygeai/assistant/clients.py +18 -45
  146. pygeai/assistant/data/clients.py +1 -0
  147. pygeai/assistant/data_analyst/clients.py +8 -12
  148. pygeai/assistant/managers.py +195 -157
  149. pygeai/assistant/mappers.py +4 -2
  150. pygeai/assistant/rag/clients.py +27 -67
  151. pygeai/assistant/rag/mappers.py +12 -6
  152. pygeai/assistant/rag/models.py +301 -159
  153. pygeai/auth/__init__.py +0 -0
  154. pygeai/auth/clients.py +129 -0
  155. pygeai/auth/endpoints.py +6 -0
  156. pygeai/chat/clients.py +308 -37
  157. pygeai/chat/endpoints.py +3 -0
  158. pygeai/chat/iris.py +2 -8
  159. pygeai/chat/managers.py +9 -6
  160. pygeai/chat/session.py +38 -0
  161. pygeai/chat/settings.py +6 -0
  162. pygeai/chat/ui.py +678 -0
  163. pygeai/cli/__init__.py +0 -1
  164. pygeai/cli/commands/admin.py +7 -10
  165. pygeai/cli/commands/analytics.py +533 -0
  166. pygeai/cli/commands/assistant.py +9 -9
  167. pygeai/cli/commands/auth.py +299 -0
  168. pygeai/cli/commands/base.py +71 -9
  169. pygeai/cli/commands/chat.py +676 -19
  170. pygeai/cli/commands/common.py +28 -24
  171. pygeai/cli/commands/configuration.py +66 -13
  172. pygeai/cli/commands/docs.py +105 -0
  173. pygeai/cli/commands/embeddings.py +58 -11
  174. pygeai/cli/commands/evaluation.py +38 -38
  175. pygeai/cli/commands/feedback.py +3 -4
  176. pygeai/cli/commands/files.py +7 -8
  177. pygeai/cli/commands/gam.py +85 -10
  178. pygeai/cli/commands/lab/ai_lab.py +340 -484
  179. pygeai/cli/commands/lab/options.py +8 -0
  180. pygeai/cli/commands/lab/spec.py +273 -0
  181. pygeai/cli/commands/lab/utils.py +13 -0
  182. pygeai/cli/commands/llm.py +6 -7
  183. pygeai/cli/commands/migrate.py +1064 -436
  184. pygeai/cli/commands/organization.py +516 -11
  185. pygeai/cli/commands/rag.py +13 -14
  186. pygeai/cli/commands/rerank.py +3 -5
  187. pygeai/cli/commands/secrets.py +8 -9
  188. pygeai/cli/commands/usage_limits.py +18 -20
  189. pygeai/cli/commands/validators.py +144 -1
  190. pygeai/cli/commands/version.py +4 -5
  191. pygeai/cli/error_handler.py +151 -0
  192. pygeai/cli/geai.py +170 -31
  193. pygeai/cli/geai_proxy.py +86 -25
  194. pygeai/cli/install_man.py +93 -22
  195. pygeai/cli/parsers.py +75 -25
  196. pygeai/cli/texts/help.py +265 -28
  197. pygeai/core/base/clients.py +53 -12
  198. pygeai/core/base/mappers.py +11 -2
  199. pygeai/core/base/session.py +95 -11
  200. pygeai/core/common/config.py +78 -14
  201. pygeai/core/common/exceptions.py +96 -6
  202. pygeai/core/embeddings/__init__.py +19 -0
  203. pygeai/core/embeddings/clients.py +23 -5
  204. pygeai/core/embeddings/managers.py +9 -4
  205. pygeai/core/embeddings/mappers.py +16 -2
  206. pygeai/core/embeddings/responses.py +9 -2
  207. pygeai/core/feedback/clients.py +8 -3
  208. pygeai/core/files/clients.py +23 -24
  209. pygeai/core/files/managers.py +121 -30
  210. pygeai/core/files/responses.py +4 -3
  211. pygeai/core/handlers.py +10 -1
  212. pygeai/core/llm/clients.py +22 -29
  213. pygeai/core/models.py +127 -11
  214. pygeai/core/plugins/clients.py +6 -6
  215. pygeai/core/rerank/clients.py +9 -3
  216. pygeai/core/rerank/managers.py +22 -5
  217. pygeai/core/secrets/clients.py +16 -37
  218. pygeai/core/services/response.py +18 -0
  219. pygeai/core/services/rest.py +159 -49
  220. pygeai/core/utils/__init__.py +0 -0
  221. pygeai/core/utils/console.py +83 -0
  222. pygeai/core/utils/parsers.py +32 -0
  223. pygeai/core/utils/validators.py +10 -0
  224. pygeai/dbg/__init__.py +3 -0
  225. pygeai/dbg/debugger.py +854 -14
  226. pygeai/evaluation/clients.py +7 -4
  227. pygeai/evaluation/dataset/clients.py +46 -44
  228. pygeai/evaluation/plan/clients.py +28 -26
  229. pygeai/evaluation/result/clients.py +38 -5
  230. pygeai/gam/clients.py +50 -28
  231. pygeai/gam/endpoints.py +2 -1
  232. pygeai/health/__init__.py +0 -0
  233. pygeai/health/clients.py +24 -0
  234. pygeai/health/endpoints.py +1 -0
  235. pygeai/lab/__init__.py +0 -90
  236. pygeai/lab/agents/clients.py +203 -162
  237. pygeai/lab/agents/endpoints.py +4 -0
  238. pygeai/lab/agents/mappers.py +57 -7
  239. pygeai/lab/clients.py +24 -0
  240. pygeai/lab/constants.py +3 -0
  241. pygeai/lab/managers.py +571 -541
  242. pygeai/lab/models.py +108 -19
  243. pygeai/lab/processes/clients.py +332 -340
  244. pygeai/lab/processes/mappers.py +3 -3
  245. pygeai/lab/runners.py +90 -0
  246. pygeai/lab/spec/__init__.py +0 -0
  247. pygeai/lab/spec/loader.py +24 -0
  248. pygeai/lab/spec/parsers.py +39 -0
  249. pygeai/lab/strategies/clients.py +67 -63
  250. pygeai/lab/strategies/mappers.py +1 -1
  251. pygeai/lab/tools/clients.py +85 -118
  252. pygeai/lab/tools/endpoints.py +4 -0
  253. pygeai/lab/tools/mappers.py +5 -5
  254. pygeai/man/man1/geai-proxy.1 +116 -0
  255. pygeai/man/man1/geai.1 +2580 -66
  256. pygeai/migration/__init__.py +33 -0
  257. pygeai/migration/strategies.py +468 -146
  258. pygeai/migration/tools.py +170 -3
  259. pygeai/organization/clients.py +245 -50
  260. pygeai/organization/endpoints.py +17 -8
  261. pygeai/organization/limits/clients.py +34 -32
  262. pygeai/organization/limits/managers.py +108 -49
  263. pygeai/organization/managers.py +347 -53
  264. pygeai/organization/mappers.py +102 -2
  265. pygeai/organization/responses.py +58 -1
  266. pygeai/proxy/clients.py +6 -3
  267. pygeai/proxy/config.py +14 -1
  268. pygeai/proxy/managers.py +61 -33
  269. pygeai/proxy/servers.py +196 -51
  270. pygeai/proxy/tool.py +33 -16
  271. pygeai/tests/admin/__init__.py +0 -0
  272. pygeai/tests/admin/test_clients.py +148 -0
  273. pygeai/tests/analytics/__init__.py +0 -0
  274. pygeai/tests/analytics/test_clients.py +86 -0
  275. pygeai/tests/analytics/test_managers.py +94 -0
  276. pygeai/tests/analytics/test_mappers.py +84 -0
  277. pygeai/tests/analytics/test_responses.py +73 -0
  278. pygeai/tests/assistants/rag/test_clients.py +346 -0
  279. pygeai/tests/assistants/rag/test_models.py +292 -0
  280. pygeai/tests/assistants/test_clients.py +176 -82
  281. pygeai/tests/assistants/test_managers.py +191 -57
  282. pygeai/tests/auth/__init__.py +0 -0
  283. pygeai/tests/auth/test_clients.py +289 -0
  284. pygeai/tests/auth/test_oauth.py +172 -0
  285. pygeai/tests/auth/test_session_logging.py +150 -0
  286. pygeai/tests/chat/__init__.py +0 -0
  287. pygeai/tests/chat/test_clients.py +393 -0
  288. pygeai/tests/chat/test_iris.py +38 -0
  289. pygeai/tests/chat/test_session.py +62 -0
  290. pygeai/tests/chat/test_ui.py +224 -0
  291. pygeai/tests/cli/commands/__init__.py +0 -0
  292. pygeai/tests/cli/commands/lab/__init__.py +0 -0
  293. pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
  294. pygeai/tests/cli/commands/lab/test_common.py +208 -0
  295. pygeai/tests/cli/commands/lab/test_spec.py +246 -0
  296. pygeai/tests/cli/commands/test_assistant.py +202 -0
  297. pygeai/tests/cli/commands/test_chat.py +130 -0
  298. pygeai/tests/cli/commands/test_common.py +350 -0
  299. pygeai/tests/cli/commands/test_embeddings.py +132 -0
  300. pygeai/tests/cli/commands/test_evaluation.py +656 -0
  301. pygeai/tests/cli/commands/test_feedback.py +65 -0
  302. pygeai/tests/cli/commands/test_files.py +161 -0
  303. pygeai/tests/cli/commands/test_gam.py +201 -0
  304. pygeai/tests/cli/commands/test_llm.py +114 -0
  305. pygeai/tests/cli/commands/test_migrate.py +176 -0
  306. pygeai/tests/cli/commands/test_organization.py +276 -0
  307. pygeai/tests/cli/commands/test_rag.py +266 -0
  308. pygeai/tests/cli/commands/test_rerank.py +110 -0
  309. pygeai/tests/cli/commands/test_secrets.py +171 -0
  310. pygeai/tests/cli/commands/test_show_help.py +41 -0
  311. pygeai/tests/cli/commands/test_usage_limits.py +412 -0
  312. pygeai/tests/cli/commands/test_validators.py +160 -0
  313. pygeai/tests/cli/commands/test_version.py +81 -0
  314. pygeai/tests/cli/docker/__init__.py +0 -0
  315. pygeai/tests/cli/test_credentials_flag.py +316 -0
  316. pygeai/tests/cli/test_error_handler.py +225 -0
  317. pygeai/tests/cli/test_geai_driver.py +154 -0
  318. pygeai/tests/cli/test_parsers.py +5 -5
  319. pygeai/tests/core/base/data/models.py +7 -0
  320. pygeai/tests/core/base/test_mappers.py +43 -11
  321. pygeai/tests/core/base/test_models.py +3 -1
  322. pygeai/tests/core/base/test_responses.py +53 -0
  323. pygeai/tests/core/common/__init__.py +0 -0
  324. pygeai/tests/core/common/data/__init__.py +0 -0
  325. pygeai/tests/core/common/test_config.py +186 -0
  326. pygeai/tests/core/common/test_decorators.py +69 -0
  327. pygeai/tests/core/embeddings/__init__.py +0 -0
  328. pygeai/tests/core/embeddings/test_clients.py +225 -0
  329. pygeai/tests/core/embeddings/test_managers.py +171 -0
  330. pygeai/tests/core/embeddings/test_mappers.py +142 -0
  331. pygeai/tests/core/feedback/__init__.py +0 -0
  332. pygeai/tests/core/feedback/test_clients.py +64 -0
  333. pygeai/tests/core/files/test_clients.py +128 -0
  334. pygeai/tests/core/files/test_managers.py +124 -78
  335. pygeai/tests/core/files/test_mappers.py +137 -0
  336. pygeai/tests/core/files/test_models.py +103 -0
  337. pygeai/tests/core/files/test_responses.py +122 -0
  338. pygeai/tests/core/llm/__init__.py +0 -0
  339. pygeai/tests/core/llm/test_clients.py +142 -0
  340. pygeai/tests/core/plugins/__init__.py +0 -0
  341. pygeai/tests/core/plugins/test_clients.py +66 -0
  342. pygeai/tests/core/rerank/test_clients.py +76 -0
  343. pygeai/tests/core/rerank/test_managers.py +61 -39
  344. pygeai/tests/core/secrets/__init__.py +0 -0
  345. pygeai/tests/core/secrets/test_clients.py +264 -0
  346. pygeai/tests/core/services/__init__.py +0 -0
  347. pygeai/tests/core/services/test_rest.py +273 -0
  348. pygeai/tests/core/test_handlers.py +66 -0
  349. pygeai/tests/core/utils/__init__.py +0 -0
  350. pygeai/tests/core/utils/test_console.py +80 -0
  351. pygeai/tests/dbg/__init__.py +0 -0
  352. pygeai/tests/dbg/test_debugger.py +591 -0
  353. pygeai/tests/evaluation/__init__.py +0 -0
  354. pygeai/tests/evaluation/dataset/__init__.py +0 -0
  355. pygeai/tests/evaluation/dataset/test_clients.py +265 -0
  356. pygeai/tests/evaluation/plan/__init__.py +0 -0
  357. pygeai/tests/evaluation/plan/test_clients.py +195 -0
  358. pygeai/tests/evaluation/result/__init__.py +0 -0
  359. pygeai/tests/evaluation/result/test_clients.py +66 -0
  360. pygeai/tests/gam/__init__.py +0 -0
  361. pygeai/tests/gam/test_clients.py +195 -0
  362. pygeai/tests/health/__init__.py +0 -0
  363. pygeai/tests/health/test_clients.py +41 -0
  364. pygeai/tests/integration/__init__.py +0 -0
  365. pygeai/tests/integration/assistants/__init__.py +0 -0
  366. pygeai/tests/integration/assistants/rag/__init__.py +0 -0
  367. pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
  368. pygeai/tests/integration/chat/__init__.py +0 -0
  369. pygeai/tests/integration/chat/test_generate_image.py +158 -0
  370. pygeai/tests/integration/lab/__init__.py +0 -0
  371. pygeai/tests/integration/lab/agents/__init__.py +0 -0
  372. pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
  373. pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
  374. pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
  375. pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
  376. pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
  377. pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
  378. pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
  379. pygeai/tests/integration/lab/processes/__init__.py +0 -0
  380. pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
  381. pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
  382. pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
  383. pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
  384. pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
  385. pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
  386. pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
  387. pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
  388. pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
  389. pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
  390. pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
  391. pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
  392. pygeai/tests/integration/lab/tools/__init__.py +0 -0
  393. pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
  394. pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
  395. pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
  396. pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
  397. pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
  398. pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
  399. pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
  400. pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
  401. pygeai/tests/lab/agents/__init__.py +0 -0
  402. pygeai/tests/lab/agents/test_clients.py +481 -0
  403. pygeai/tests/lab/agents/test_mappers.py +440 -0
  404. pygeai/tests/lab/processes/__init__.py +0 -0
  405. pygeai/tests/lab/processes/test_clients.py +1416 -0
  406. pygeai/tests/lab/processes/test_mappers.py +1092 -0
  407. pygeai/tests/lab/spec/__init__.py +0 -0
  408. pygeai/tests/lab/spec/test_loader.py +59 -0
  409. pygeai/tests/lab/spec/test_parsers.py +182 -0
  410. pygeai/tests/lab/strategies/__init__.py +0 -0
  411. pygeai/tests/lab/strategies/test_clients.py +241 -0
  412. pygeai/tests/lab/strategies/test_mappers.py +132 -0
  413. pygeai/tests/lab/test_managers.py +553 -0
  414. pygeai/tests/lab/test_models.py +500 -3
  415. pygeai/tests/lab/tools/__init__.py +0 -0
  416. pygeai/tests/lab/tools/test_clients.py +521 -0
  417. pygeai/tests/lab/tools/test_mappers.py +198 -0
  418. pygeai/tests/migration/__init__.py +0 -0
  419. pygeai/tests/migration/test_strategies.py +405 -0
  420. pygeai/tests/migration/test_tools.py +159 -0
  421. pygeai/tests/organization/limits/test_clients.py +567 -0
  422. pygeai/tests/organization/limits/test_managers.py +298 -56
  423. pygeai/tests/organization/test_clients.py +600 -30
  424. pygeai/tests/organization/test_managers.py +424 -0
  425. pygeai/tests/organization/test_mappers.py +153 -0
  426. pygeai/tests/organization/test_responses.py +137 -0
  427. pygeai/tests/proxy/__init__.py +1 -0
  428. pygeai/tests/proxy/test_clients.py +397 -0
  429. pygeai/tests/proxy/test_config.py +171 -0
  430. pygeai/tests/proxy/test_integration.py +305 -0
  431. pygeai/tests/proxy/test_managers.py +312 -0
  432. pygeai/tests/proxy/test_servers.py +387 -0
  433. pygeai/tests/proxy/test_tool.py +176 -0
  434. pygeai/tests/snippets/analytics/__init__.py +0 -0
  435. pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
  436. pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
  437. pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
  438. pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
  439. pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
  440. pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
  441. pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
  442. pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
  443. pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
  444. pygeai/tests/snippets/auth/__init__.py +0 -0
  445. pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
  446. pygeai/tests/snippets/chat/get_response.py +15 -0
  447. pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
  448. pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
  449. pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
  450. pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
  451. pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
  452. pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
  453. pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
  454. pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
  455. pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
  456. pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
  457. pygeai/tests/snippets/dbg/__init__.py +0 -0
  458. pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
  459. pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
  460. pygeai/tests/snippets/dbg/file_debugging.py +72 -0
  461. pygeai/tests/snippets/dbg/module_debugging.py +61 -0
  462. pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
  463. pygeai/tests/snippets/dbg/stepping_example.py +40 -0
  464. pygeai/tests/snippets/embeddings/cache_example.py +31 -0
  465. pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
  466. pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
  467. pygeai/tests/snippets/embeddings/openai_example.py +30 -0
  468. pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
  469. pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
  470. pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
  471. pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
  472. pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
  473. pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
  474. pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
  475. pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
  476. pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
  477. pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
  478. pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
  479. pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
  480. pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
  481. pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
  482. pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
  483. pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
  484. pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
  485. pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
  486. pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
  487. pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
  488. pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
  489. pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
  490. pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
  491. pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
  492. pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
  493. pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
  494. pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
  495. pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
  496. pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
  497. pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
  498. pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
  499. pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
  500. pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
  501. pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
  502. pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
  503. pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
  504. pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
  505. pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
  506. pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
  507. pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
  508. pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
  509. pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
  510. pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
  511. pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
  512. pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
  513. pygeai/tests/snippets/files/delete_file.py +1 -4
  514. pygeai/tests/snippets/files/get_file_content.py +2 -4
  515. pygeai/tests/snippets/files/get_file_data.py +1 -4
  516. pygeai/tests/snippets/files/get_file_list.py +1 -6
  517. pygeai/tests/snippets/files/upload_file.py +1 -5
  518. pygeai/tests/snippets/gam/gam_access_token.py +87 -0
  519. pygeai/tests/snippets/lab/agentic_flow_example_1.py +25 -23
  520. pygeai/tests/snippets/lab/agentic_flow_example_4.py +23 -23
  521. pygeai/tests/snippets/lab/agents/create_agent.py +5 -8
  522. pygeai/tests/snippets/lab/agents/create_agent_2.py +1 -5
  523. pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
  524. pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
  525. pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
  526. pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
  527. pygeai/tests/snippets/lab/agents/delete_agent.py +1 -5
  528. pygeai/tests/snippets/lab/agents/get_agent.py +2 -11
  529. pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
  530. pygeai/tests/snippets/lab/agents/get_sharing_link.py +2 -7
  531. pygeai/tests/snippets/lab/agents/list_agents.py +4 -7
  532. pygeai/tests/snippets/lab/agents/publish_agent_revision.py +2 -6
  533. pygeai/tests/snippets/lab/agents/update_agent.py +1 -5
  534. pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
  535. pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
  536. pygeai/tests/snippets/lab/crud_ui.py +462 -0
  537. pygeai/tests/snippets/lab/processes/create_process.py +3 -5
  538. pygeai/tests/snippets/lab/processes/create_task.py +3 -5
  539. pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +10 -19
  540. pygeai/tests/snippets/lab/processes/kbs/create_kb.py +2 -5
  541. pygeai/tests/snippets/lab/processes/kbs/get_kb.py +10 -16
  542. pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +13 -20
  543. pygeai/tests/snippets/lab/processes/kbs/try_all.py +5 -7
  544. pygeai/tests/snippets/lab/processes/list_processes.py +5 -7
  545. pygeai/tests/snippets/lab/runner_1.py +1 -1
  546. pygeai/tests/snippets/lab/samples/summarize_files.py +3 -3
  547. pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +2 -5
  548. pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +2 -5
  549. pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +3 -6
  550. pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +2 -5
  551. pygeai/tests/snippets/lab/tools/create_tool.py +4 -10
  552. pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
  553. pygeai/tests/snippets/lab/tools/delete_tool.py +2 -6
  554. pygeai/tests/snippets/lab/tools/get_parameter.py +5 -7
  555. pygeai/tests/snippets/lab/tools/get_tool.py +5 -7
  556. pygeai/tests/snippets/lab/tools/list_tools.py +3 -7
  557. pygeai/tests/snippets/lab/tools/publish_tool_revision.py +3 -5
  558. pygeai/tests/snippets/lab/tools/set_parameters.py +4 -9
  559. pygeai/tests/snippets/lab/tools/update_tool.py +4 -8
  560. pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
  561. pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
  562. pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
  563. pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
  564. pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
  565. pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
  566. pygeai/tests/snippets/lab/{file_summarizer_example.py → use_cases/file_summarizer_example.py} +3 -3
  567. pygeai/tests/snippets/lab/{file_summarizer_example_2.py → use_cases/file_summarizer_example_2.py} +12 -12
  568. pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
  569. pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
  570. pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
  571. pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
  572. pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
  573. pygeai/tests/snippets/migrate/__init__.py +45 -0
  574. pygeai/tests/snippets/migrate/agent_migration.py +110 -0
  575. pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
  576. pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
  577. pygeai/tests/snippets/migrate/process_migration.py +64 -0
  578. pygeai/tests/snippets/migrate/project_migration.py +42 -0
  579. pygeai/tests/snippets/migrate/tool_migration.py +64 -0
  580. pygeai/tests/snippets/organization/add_project_member.py +10 -0
  581. pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
  582. pygeai/tests/snippets/organization/create_project.py +2 -2
  583. pygeai/tests/snippets/organization/get_memberships.py +12 -0
  584. pygeai/tests/snippets/organization/get_organization_members.py +6 -0
  585. pygeai/tests/snippets/organization/get_project_members.py +6 -0
  586. pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
  587. pygeai/tests/snippets/organization/get_project_roles.py +6 -0
  588. pygeai/vendor/a2a/__init__.py +1 -0
  589. pygeai/vendor/a2a/auth/__init__.py +0 -0
  590. pygeai/vendor/a2a/auth/user.py +31 -0
  591. pygeai/vendor/a2a/client/__init__.py +19 -0
  592. pygeai/vendor/a2a/client/client.py +425 -0
  593. pygeai/vendor/a2a/client/errors.py +33 -0
  594. pygeai/vendor/a2a/client/helpers.py +22 -0
  595. pygeai/vendor/a2a/py.typed +0 -0
  596. pygeai/vendor/a2a/server/__init__.py +1 -0
  597. pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
  598. pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
  599. pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
  600. pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
  601. pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
  602. pygeai/vendor/a2a/server/apps/__init__.py +16 -0
  603. pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
  604. pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
  605. pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
  606. pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
  607. pygeai/vendor/a2a/server/context.py +23 -0
  608. pygeai/vendor/a2a/server/events/__init__.py +21 -0
  609. pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
  610. pygeai/vendor/a2a/server/events/event_queue.py +156 -0
  611. pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
  612. pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
  613. pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
  614. pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
  615. pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
  616. pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
  617. pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
  618. pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
  619. pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
  620. pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
  621. pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
  622. pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
  623. pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
  624. pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
  625. pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
  626. pygeai/vendor/a2a/types.py +1624 -0
  627. pygeai/vendor/a2a/utils/__init__.py +40 -0
  628. pygeai/vendor/a2a/utils/artifact.py +72 -0
  629. pygeai/vendor/a2a/utils/errors.py +69 -0
  630. pygeai/vendor/a2a/utils/helpers.py +176 -0
  631. pygeai/vendor/a2a/utils/message.py +83 -0
  632. pygeai/vendor/a2a/utils/task.py +57 -0
  633. pygeai/vendor/a2a/utils/telemetry.py +299 -0
  634. pygeai-0.6.0b15.dist-info/METADATA +205 -0
  635. pygeai-0.6.0b15.dist-info/RECORD +799 -0
  636. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
  637. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/entry_points.txt +2 -1
  638. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/licenses/LICENSE +13 -1
  639. pygeai-0.6.0b15.dist-info/top_level.txt +1 -0
  640. docs/geai-proxy/README.md +0 -145
  641. docs/source/conf.py +0 -45
  642. pygeai/tests/core/test_managers.py +0 -233
  643. pygeai-0.1.51b3.dist-info/METADATA +0 -130
  644. pygeai-0.1.51b3.dist-info/RECORD +0 -324
  645. pygeai-0.1.51b3.dist-info/top_level.txt +0 -3
  646. scripts/bump_beta_version.py +0 -56
  647. {scripts → pygeai/analytics}/__init__.py +0 -0
  648. /pygeai/tests/snippets/lab/{c_code_fixer_agent_flow.py → use_cases/c_code_fixer_agent_flow.py} +0 -0
@@ -1,9 +1,10 @@
1
1
  import os
2
2
  import sys
3
- from functools import lru_cache
4
3
  from pathlib import Path
5
4
  import configparser
6
5
 
6
+ from pygeai import logger
7
+
7
8
  HOME_DIR = Path.home()
8
9
  SETTINGS_DIR = HOME_DIR / ".geai"
9
10
  SETTINGS_DIR.mkdir(parents=True, exist_ok=True)
@@ -19,9 +20,13 @@ class SettingsManager:
19
20
  GEAI_SETTINGS_DIR = str(SETTINGS_DIR)
20
21
  GEAI_CREDS_FILE = SETTINGS_DIR / "credentials"
21
22
 
22
- def __init__(self):
23
+ def __init__(self, credentials_file: str = None):
23
24
  self.config = configparser.ConfigParser()
24
-
25
+
26
+ if credentials_file:
27
+ self.GEAI_CREDS_FILE = Path(credentials_file)
28
+ logger.debug(f"Using custom credentials file: {self.GEAI_CREDS_FILE}")
29
+
25
30
  if self.GEAI_CREDS_FILE.exists():
26
31
  self.config.read(self.GEAI_CREDS_FILE)
27
32
  else:
@@ -35,13 +40,18 @@ class SettingsManager:
35
40
  def get_setting_value(self, setting_key: str, alias: str):
36
41
  """Reads a setting value for a specific alias from the credentials file."""
37
42
  if alias not in self.config:
38
- raise ValueError(f"Alias '{alias}' not found in the credentials file.")
39
-
43
+ logger.warning(f"Alias '{alias}' not found in the credentials file.")
44
+ return
45
+
40
46
  if setting_key not in self.config[alias]:
41
47
  sys.stdout.write(f"'{setting_key}' not found in alias '{alias}' in the credentials file. Adding empty value.\n")
42
- # SET ADDITIONAL URLS
48
+ # SET ADDITIONAL VARS
43
49
  if setting_key.lower() == "GEAI_API_EVAL_URL".lower():
44
50
  self.set_eval_url("", alias)
51
+ if setting_key.lower() == "GEAI_OAUTH_ACCESS_TOKEN".lower():
52
+ self.set_access_token("", alias)
53
+ if setting_key.lower() == "GEAI_PROJECT_ID".lower():
54
+ self.set_project_id("", alias)
45
55
 
46
56
  return self.config[alias].get(setting_key, "")
47
57
 
@@ -56,7 +66,7 @@ class SettingsManager:
56
66
  self.config.write(file)
57
67
 
58
68
  def get_api_key(self, alias: str = "default"):
59
- api_key = os.environ.get("GEAI_API_KEY") if alias == "default" else None
69
+ api_key = os.environ.get("GEAI_API_KEY") if not alias or alias == "default" else None
60
70
  if not api_key:
61
71
  api_key = self.get_setting_value("GEAI_API_KEY", alias)
62
72
 
@@ -66,7 +76,7 @@ class SettingsManager:
66
76
  self.set_setting_value("GEAI_API_KEY", api_key, alias)
67
77
 
68
78
  def get_base_url(self, alias: str = "default"):
69
- base_url = os.environ.get("GEAI_API_BASE_URL") if alias == "default" else None
79
+ base_url = os.environ.get("GEAI_API_BASE_URL") if not alias or alias == "default" else None
70
80
  if not base_url:
71
81
  base_url = self.get_setting_value("GEAI_API_BASE_URL", alias)
72
82
 
@@ -75,8 +85,28 @@ class SettingsManager:
75
85
  def set_base_url(self, base_url, alias: str = "default"):
76
86
  self.set_setting_value("GEAI_API_BASE_URL", base_url, alias)
77
87
 
88
+ def get_access_token(self, alias: str = "default"):
89
+ access_token = os.environ.get("GEAI_OAUTH_ACCESS_TOKEN") if not alias or alias == "default" else None
90
+ if not access_token:
91
+ access_token = self.get_setting_value("GEAI_OAUTH_ACCESS_TOKEN", alias)
92
+
93
+ return access_token
94
+
95
+ def set_access_token(self, access_token, alias: str = "default"):
96
+ self.set_setting_value("GEAI_OAUTH_ACCESS_TOKEN", access_token, alias)
97
+
98
+ def get_project_id(self, alias: str = "default"):
99
+ project_id = os.environ.get("GEAI_PROJECT_ID") if not alias or alias == "default" else None
100
+ if not project_id:
101
+ project_id = self.get_setting_value("GEAI_PROJECT_ID", alias)
102
+
103
+ return project_id
104
+
105
+ def set_project_id(self, project_id, alias: str = "default"):
106
+ self.set_setting_value("GEAI_PROJECT_ID", project_id, alias)
107
+
78
108
  def get_eval_url(self, alias: str = "default"):
79
- eval_url = os.environ.get("GEAI_API_EVAL_URL") if alias == "default" else None
109
+ eval_url = os.environ.get("GEAI_API_EVAL_URL") if not alias or alias == "default" else None
80
110
  if not eval_url:
81
111
  eval_url = self.get_setting_value("GEAI_API_EVAL_URL", alias)
82
112
 
@@ -85,17 +115,51 @@ class SettingsManager:
85
115
  def set_eval_url(self, eval_url, alias: str = "default"):
86
116
  self.set_setting_value("GEAI_API_EVAL_URL", eval_url, alias)
87
117
 
118
+ def list_aliases(self):
119
+ """Returns a dict of all aliases and their base URLs."""
120
+ return {
121
+ section: self.config[section].get("GEAI_API_BASE_URL", "")
122
+ for section in self.config.sections()
123
+ }
124
+
125
+ def remove_alias(self, alias: str):
126
+ """Removes a specific alias and its settings from the credentials file."""
127
+ if alias in self.config:
128
+ self.config.remove_section(alias)
129
+ with self.GEAI_CREDS_FILE.open("w") as file:
130
+ self.config.write(file)
131
+ logger.info(f"Alias '{alias}' removed from the credentials file.")
132
+ else:
133
+ logger.warning(f"Alias '{alias}' not found in the credentials file.")
134
+
135
+
136
+ _settings_instance = None
137
+
138
+
139
+ def get_settings(credentials_file: str = None):
140
+ """
141
+ Get or create the SettingsManager instance.
142
+
143
+ :param credentials_file: Optional path to a custom credentials file.
144
+ If provided on first call, uses that file.
145
+ Subsequent calls ignore this parameter.
146
+ :return: SettingsManager instance
147
+ """
148
+ global _settings_instance
149
+ if _settings_instance is None:
150
+ _settings_instance = SettingsManager(credentials_file=credentials_file)
151
+ return _settings_instance
152
+
88
153
 
89
- @lru_cache()
90
- def get_settings():
91
- return SettingsManager()
154
+ def reset_settings():
155
+ """Reset the settings instance. Useful for testing."""
156
+ global _settings_instance
157
+ _settings_instance = None
92
158
 
93
159
 
94
160
  if __name__ == "__main__":
95
161
  settings = get_settings()
96
- geai_api_key = settings.get_api_key()
97
162
  geai_base_url = settings.get_base_url()
98
163
  geai_eval_url = settings.get_eval_url()
99
- print(f"api_key: {geai_api_key}")
100
164
  print(f"base_url: {geai_base_url}")
101
165
  print(f"eval_url: {geai_eval_url}")
@@ -6,29 +6,119 @@ class GEAIException(Exception):
6
6
 
7
7
 
8
8
  class UnknownArgumentError(GEAIException):
9
- """Argument provided is not valid"""
10
- pass
9
+ """Raised when an unknown or invalid command/option is provided"""
10
+
11
+ def __init__(self, message: str, arg: str = None, available_commands=None, available_options=None):
12
+ """
13
+ Initialize an UnknownArgumentError with context.
14
+
15
+ :param message: str - The error message.
16
+ :param arg: str - The unknown argument that was provided.
17
+ :param available_commands: list - Available commands for suggestion.
18
+ :param available_options: list - Available options for suggestion.
19
+ """
20
+ super().__init__(message)
21
+ self.arg = arg
22
+ self.available_commands = available_commands
23
+ self.available_options = available_options
11
24
 
12
25
 
13
26
  class MissingRequirementException(GEAIException):
14
- """Requirement not available"""
27
+ """Raised when a required parameter or argument is missing"""
15
28
  pass
16
29
 
17
30
 
18
31
  class WrongArgumentError(GEAIException):
19
- """Wrongly formatted arguments"""
32
+ """Raised when arguments are incorrectly formatted or invalid"""
20
33
  pass
21
34
 
22
35
 
36
+ class ValidationError(WrongArgumentError):
37
+ """
38
+ Raised when input validation fails with detailed context.
39
+
40
+ Extends WrongArgumentError to provide structured validation errors
41
+ with field-specific information and examples.
42
+ """
43
+ def __init__(
44
+ self,
45
+ message: str,
46
+ field: str = None,
47
+ expected: str = None,
48
+ received: str = None,
49
+ example: str = None
50
+ ):
51
+ """
52
+ Initialize a ValidationError with detailed context.
53
+
54
+ :param message: str - The main error message.
55
+ :param field: str - Name of the field that failed validation.
56
+ :param expected: str - Description of what was expected.
57
+ :param received: str - Description of what was received.
58
+ :param example: str - Example of valid input.
59
+ """
60
+ super().__init__(message)
61
+ self.field = field
62
+ self.expected = expected
63
+ self.received = received
64
+ self.example = example
65
+
66
+ def __str__(self) -> str:
67
+ """
68
+ Format the error message with all available context.
69
+
70
+ :return: str - Formatted error message with field details.
71
+ """
72
+ parts = [super().__str__()]
73
+
74
+ if self.field:
75
+ parts.append(f" Field: {self.field}")
76
+ if self.expected:
77
+ parts.append(f" Expected: {self.expected}")
78
+ if self.received:
79
+ parts.append(f" Received: {self.received}")
80
+ if self.example:
81
+ parts.append(f" Example: {self.example}")
82
+
83
+ return "\n".join(parts)
84
+
85
+
23
86
  class ServerResponseError(GEAIException):
24
- """There was an error in the request to the server"""
87
+ """Raised when the server returns an error response"""
25
88
  pass
26
89
 
27
90
 
28
91
  class APIError(GEAIException):
29
- """There was an error in the request to the server"""
92
+ """Raised when an API request fails"""
93
+ pass
94
+
95
+
96
+ class InvalidPathException(GEAIException):
97
+ """Raised when a file or directory path is invalid or not found"""
98
+ pass
99
+
100
+
101
+ class InvalidJSONException(GEAIException):
102
+ """Raised when JSON data cannot be parsed or is malformed"""
30
103
  pass
31
104
 
32
105
 
106
+ class InvalidAPIResponseException(GEAIException):
107
+ """Raised when the API response format is unexpected or invalid"""
108
+ pass
109
+
110
+
111
+ class InvalidResponseException(GEAIException):
112
+ """Raised when a response cannot be retrieved or processed"""
113
+ pass
114
+
33
115
 
116
+ class InvalidAgentException(GEAIException):
117
+ """Raised when an agent cannot be retrieved, validated, or is misconfigured"""
118
+ pass
119
+
120
+
121
+ class APIResponseError(GEAIException):
122
+ """Raised when there is an error in the API response"""
123
+ pass
34
124
 
@@ -0,0 +1,19 @@
1
+ from pygeai.core.embeddings.clients import EmbeddingsClient
2
+ from pygeai.core.embeddings.managers import EmbeddingsManager
3
+ from pygeai.core.embeddings.models import EmbeddingConfiguration
4
+ from pygeai.core.embeddings.responses import (
5
+ EmbeddingResponse,
6
+ EmbeddingData,
7
+ UsageInfo,
8
+ TokenDetails
9
+ )
10
+
11
+ __all__ = [
12
+ 'EmbeddingsClient',
13
+ 'EmbeddingsManager',
14
+ 'EmbeddingConfiguration',
15
+ 'EmbeddingResponse',
16
+ 'EmbeddingData',
17
+ 'UsageInfo',
18
+ 'TokenDetails'
19
+ ]
@@ -1,8 +1,10 @@
1
- import json
2
- from typing import Any, Union
3
1
 
2
+ from pygeai import logger
4
3
  from pygeai.core.base.clients import BaseClient
4
+ from pygeai.core.common.exceptions import InvalidAPIResponseException, APIResponseError
5
5
  from pygeai.core.embeddings.endpoints import GENERATE_EMBEDDINGS
6
+ from pygeai.core.utils.validators import validate_status_code
7
+ from pygeai.core.utils.parsers import parse_json_response
6
8
 
7
9
 
8
10
  class EmbeddingsClient(BaseClient):
@@ -41,7 +43,21 @@ class EmbeddingsClient(BaseClient):
41
43
 
42
44
  :return: dict - A dictionary containing the embedding results, including the model used, the generated
43
45
  embedding vectors, and usage statistics.
46
+ :raises ValueError: If validation fails for input parameters.
44
47
  """
48
+ if not input_list or len(input_list) == 0:
49
+ raise ValueError("input_list cannot be empty")
50
+
51
+ for idx, inp in enumerate(input_list):
52
+ if not inp or (isinstance(inp, str) and inp.strip() == ""):
53
+ raise ValueError(f"Input at index {idx} cannot be empty")
54
+
55
+ if encoding_format is not None and encoding_format not in ['float', 'base64']:
56
+ raise ValueError("encoding_format must be either 'float' or 'base64'")
57
+
58
+ if dimensions is not None and dimensions <= 0:
59
+ raise ValueError("dimensions must be a positive integer")
60
+
45
61
  data = {
46
62
  'model': model,
47
63
  'input': input_list,
@@ -61,6 +77,8 @@ class EmbeddingsClient(BaseClient):
61
77
  if timeout is not None:
62
78
  data["timeout"] = timeout
63
79
 
80
+ logger.debug(f"Generating embeddings with data: {data}")
81
+
64
82
  headers = {}
65
83
  if cache:
66
84
  headers['X-Saia-Cache-Enabled'] = "true"
@@ -70,6 +88,6 @@ class EmbeddingsClient(BaseClient):
70
88
  data=data,
71
89
  headers=headers
72
90
  )
73
- result = response.json()
74
- return result
75
-
91
+ validate_status_code(response)
92
+ return parse_json_response(response, "generate embeddings")
93
+
@@ -1,4 +1,6 @@
1
+ from pygeai import logger
1
2
  from pygeai.core.base.mappers import ErrorMapper
3
+ from pygeai.core.common.exceptions import APIError
2
4
  from pygeai.core.embeddings.clients import EmbeddingsClient
3
5
  from pygeai.core.embeddings.mappers import EmbeddingsResponseMapper
4
6
  from pygeai.core.embeddings.models import EmbeddingConfiguration
@@ -8,7 +10,7 @@ from pygeai.core.handlers import ErrorHandler
8
10
 
9
11
  class EmbeddingsManager:
10
12
 
11
- def __init__(self, api_key: str = None, base_url: str = None, alias: str = "default"):
13
+ def __init__(self, api_key: str = None, base_url: str = None, alias: str = None):
12
14
  self.__client = EmbeddingsClient(api_key, base_url, alias)
13
15
 
14
16
  def generate_embeddings(
@@ -38,6 +40,7 @@ class EmbeddingsManager:
38
40
  - cache: bool, optional - Whether to enable caching for the embeddings. Defaults to False.
39
41
 
40
42
  :return: EmbeddingResponse - A response object containing the generated embeddings and usage information.
43
+ :raises APIError - If the API returns errors.
41
44
  """
42
45
  response_data = self.__client.generate_embeddings(
43
46
  input_list=configuration.inputs,
@@ -51,7 +54,9 @@ class EmbeddingsManager:
51
54
  )
52
55
 
53
56
  if ErrorHandler.has_errors(response_data):
54
- result = ErrorHandler.extract_error(response_data)
55
- else:
56
- result = EmbeddingsResponseMapper.map_to_embedding_response(response_data)
57
+ error = ErrorHandler.extract_error(response_data)
58
+ logger.error(f"Error received while generating embeddings: {error}")
59
+ raise APIError(f"Error received while generating embeddings: {error}")
60
+
61
+ result = EmbeddingsResponseMapper.map_to_embedding_response(response_data)
57
62
  return result
@@ -1,4 +1,4 @@
1
- from pygeai.core.embeddings.responses import EmbeddingResponse, EmbeddingData, UsageInfo
1
+ from pygeai.core.embeddings.responses import EmbeddingResponse, EmbeddingData, UsageInfo, TokenDetails
2
2
 
3
3
 
4
4
  class EmbeddingsResponseMapper:
@@ -29,10 +29,24 @@ class EmbeddingsResponseMapper:
29
29
 
30
30
  @classmethod
31
31
  def map_to_usage_info(cls, data: dict) -> UsageInfo:
32
+ completion_tokens_details_data = data.get('completion_tokens_details')
33
+ prompt_tokens_details_data = data.get('prompt_tokens_details')
34
+
32
35
  return UsageInfo(
33
36
  prompt_tokens=data.get('prompt_tokens', 0),
34
37
  total_cost=data.get('total_cost', 0.0),
35
38
  total_tokens=data.get('total_tokens', 0),
36
39
  currency=data.get('currency', ''),
37
- prompt_cost=data.get('prompt_cost', 0.0)
40
+ prompt_cost=data.get('prompt_cost', 0.0),
41
+ completion_tokens_details=cls._parse_token_details(completion_tokens_details_data),
42
+ prompt_tokens_details=cls._parse_token_details(prompt_tokens_details_data)
43
+ )
44
+
45
+ @classmethod
46
+ def _parse_token_details(cls, data: dict) -> TokenDetails | None:
47
+ if data is None:
48
+ return None
49
+ return TokenDetails(
50
+ reasoning_tokens=data.get('reasoning_tokens'),
51
+ cached_tokens=data.get('cached_tokens')
38
52
  )
@@ -1,11 +1,16 @@
1
- from typing import List
1
+ from typing import List, Union, Optional
2
2
 
3
3
  from pydantic.main import BaseModel
4
4
 
5
5
 
6
+ class TokenDetails(BaseModel):
7
+ reasoning_tokens: Optional[int] = None
8
+ cached_tokens: Optional[int] = None
9
+
10
+
6
11
  class EmbeddingData(BaseModel):
7
12
  index: int
8
- embedding: List[float]
13
+ embedding: Union[List[float], str]
9
14
  object: str
10
15
 
11
16
 
@@ -15,6 +20,8 @@ class UsageInfo(BaseModel):
15
20
  total_tokens: int
16
21
  currency: str
17
22
  prompt_cost: float
23
+ completion_tokens_details: Optional[TokenDetails] = None
24
+ prompt_tokens_details: Optional[TokenDetails] = None
18
25
 
19
26
 
20
27
  class EmbeddingResponse(BaseModel):
@@ -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.feedback.endpoints import SEND_FEEDBACK_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 FeedbackClient(BaseClient):
@@ -35,11 +38,13 @@ class FeedbackClient(BaseClient):
35
38
  if comments:
36
39
  data["comments"] = comments
37
40
 
41
+ logger.debug(f"Providing feedback with data: {data}")
42
+
38
43
  endpoint = SEND_FEEDBACK_V1.format(requestId=request_id)
39
44
  response = self.api_service.post(
40
45
  endpoint=endpoint,
41
46
  data=data
42
47
  )
43
- result = response.json()
44
- return result
48
+ validate_status_code(response)
49
+ return parse_json_response(response, "send feedback. JSON parsing error")
45
50
 
@@ -2,9 +2,13 @@ import json
2
2
  from json import JSONDecodeError
3
3
  from pathlib import Path
4
4
 
5
+ from pygeai import logger
5
6
  from pygeai.core.base.clients import BaseClient
7
+ from pygeai.core.common.exceptions import InvalidAPIResponseException
6
8
  from pygeai.core.files.endpoints import UPLOAD_FILE_V1, GET_FILE_V1, DELETE_FILE_V1, GET_FILE_CONTENT_V1, \
7
9
  GET_ALL_FILES_V1
10
+ from pygeai.core.utils.validators import validate_status_code
11
+ from pygeai.core.utils.parsers import parse_json_response
8
12
 
9
13
 
10
14
  class FileClient(BaseClient):
@@ -43,18 +47,17 @@ class FileClient(BaseClient):
43
47
 
44
48
  files = {"file": file_path.open("rb")}
45
49
 
50
+ logger.debug(f"Uploading file {file_name}")
51
+
46
52
  try:
47
53
  response = self.api_service.post_files_multipart(
48
54
  endpoint=UPLOAD_FILE_V1,
49
55
  headers=headers,
50
56
  files=files
51
57
  )
52
- try:
53
- result = response.json()
54
- except JSONDecodeError as e:
55
- result = response.text
58
+ validate_status_code(response)
59
+ return parse_json_response(response, "upload file in project", file_name=file_name, project_id=project_id)
56
60
 
57
- return result
58
61
  finally:
59
62
  files["file"].close()
60
63
 
@@ -75,13 +78,9 @@ class FileClient(BaseClient):
75
78
  "project": project
76
79
  }
77
80
  )
78
-
79
- try:
80
- result = response.json()
81
- except JSONDecodeError as e:
82
- result = response.text
83
-
84
- return result
81
+ logger.debug(f"Retrieving file details for id {file_id}")
82
+ validate_status_code(response)
83
+ return parse_json_response(response, "retrieve file details for id in project", file_id=file_id, project=project)
85
84
 
86
85
  def delete_file(self, organization: str, project: str, file_id: str) -> dict:
87
86
  """
@@ -96,6 +95,9 @@ class FileClient(BaseClient):
96
95
  headers = {
97
96
  "Accept": "application/json",
98
97
  }
98
+
99
+ logger.debug(f"Deleting file with id {file_id}")
100
+
99
101
  response = self.api_service.delete(
100
102
  endpoint=endpoint,
101
103
  headers=headers,
@@ -104,12 +106,8 @@ class FileClient(BaseClient):
104
106
  "project": project
105
107
  }
106
108
  )
107
- try:
108
- result = response.json()
109
- except JSONDecodeError as e:
110
- result = response.text
111
-
112
- return result
109
+ validate_status_code(response)
110
+ return parse_json_response(response, "delete file with id in project", file_id=file_id, project=project)
113
111
 
114
112
  def get_file_content(self, organization: str, project: str, file_id: str) -> bytes:
115
113
  """
@@ -121,6 +119,9 @@ class FileClient(BaseClient):
121
119
  :return: bytes - The file content in binary format.
122
120
  """
123
121
  endpoint = GET_FILE_CONTENT_V1.format(fileId=file_id)
122
+
123
+ logger.debug(f"Retrieving raw content of file with id {file_id}")
124
+
124
125
  response = self.api_service.get(
125
126
  endpoint=endpoint,
126
127
  params={
@@ -142,6 +143,8 @@ class FileClient(BaseClient):
142
143
  :param project: str - The ID of the project.
143
144
  :return: dict - A dictionary containing the list of files.
144
145
  """
146
+ logger.debug(f"Retrieving file list for project {project}")
147
+
145
148
  response = self.api_service.get(
146
149
  endpoint=GET_ALL_FILES_V1,
147
150
  params={
@@ -149,9 +152,5 @@ class FileClient(BaseClient):
149
152
  "project": project
150
153
  }
151
154
  )
152
- try:
153
- result = response.json()
154
- except JSONDecodeError as e:
155
- result = response.text
156
-
157
- return result
155
+ validate_status_code(response)
156
+ return parse_json_response(response, "retrieve file list for project", project=project)