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,12 @@
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.secrets.endpoints import LIST_SECRETS_V1, GET_SECRET_V1, CREATE_SECRET_V1, UPDATE_SECRET_V1, \
6
7
  SET_SECRET_ACCESSES_V1, GET_SECRET_ACCESSES_V1
8
+ from pygeai.core.utils.validators import validate_status_code
9
+ from pygeai.core.utils.parsers import parse_json_response
7
10
 
8
11
 
9
12
  class SecretClient(BaseClient):
@@ -42,12 +45,8 @@ class SecretClient(BaseClient):
42
45
  endpoint=LIST_SECRETS_V1,
43
46
  params=params
44
47
  )
45
- try:
46
- result = response.json()
47
- except JSONDecodeError:
48
- result = response.text
49
-
50
- return result
48
+ validate_status_code(response)
49
+ return parse_json_response(response, "list secrets with params")
51
50
 
52
51
  def get_secret(self, secret_id: str) -> dict:
53
52
  """
@@ -67,12 +66,8 @@ class SecretClient(BaseClient):
67
66
  response = self.api_service.get(
68
67
  endpoint=endpoint
69
68
  )
70
- try:
71
- result = response.json()
72
- except JSONDecodeError:
73
- result = response.text
74
-
75
- return result
69
+ validate_status_code(response)
70
+ return parse_json_response(response, "get secret with ID", secret_id=secret_id)
76
71
 
77
72
  def create_secret(
78
73
  self,
@@ -109,12 +104,8 @@ class SecretClient(BaseClient):
109
104
  endpoint=CREATE_SECRET_V1,
110
105
  data=data
111
106
  )
112
- try:
113
- result = response.json()
114
- except JSONDecodeError:
115
- result = response.text
116
-
117
- return result
107
+ validate_status_code(response)
108
+ return parse_json_response(response, "create secret with name", name=name)
118
109
 
119
110
  def update_secret(
120
111
  self,
@@ -155,12 +146,8 @@ class SecretClient(BaseClient):
155
146
  endpoint=endpoint,
156
147
  data=data
157
148
  )
158
- try:
159
- result = response.json()
160
- except JSONDecodeError:
161
- result = response.text
162
-
163
- return result
149
+ validate_status_code(response)
150
+ return parse_json_response(response, "update secret with ID", secret_id=secret_id)
164
151
 
165
152
  def set_secret_accesses(
166
153
  self,
@@ -200,12 +187,8 @@ class SecretClient(BaseClient):
200
187
  endpoint=endpoint,
201
188
  data=data
202
189
  )
203
- try:
204
- result = response.json()
205
- except JSONDecodeError:
206
- result = response.text
207
-
208
- return result
190
+ validate_status_code(response)
191
+ return parse_json_response(response, "set accesses for secret with ID", secret_id=secret_id)
209
192
 
210
193
  def get_secret_accesses(self, secret_id: str) -> dict:
211
194
  """
@@ -225,9 +208,5 @@ class SecretClient(BaseClient):
225
208
  response = self.api_service.get(
226
209
  endpoint=endpoint
227
210
  )
228
- try:
229
- result = response.json()
230
- except JSONDecodeError:
231
- result = response.text
232
-
233
- return result
211
+ validate_status_code(response)
212
+ return parse_json_response(response, "get accesses for secret with ID", secret_id=secret_id)
@@ -0,0 +1,18 @@
1
+ from typing import Optional
2
+ import requests as req
3
+ import json
4
+
5
+
6
+ class ResponseMock:
7
+ def __init__(self, status_code: int, content: str, url: Optional[str], reason: str):
8
+ self.status_code = status_code
9
+ self.content = content
10
+ self.url = url
11
+ self.reason = reason
12
+
13
+ def raise_for_status(self):
14
+ if self.status_code >= 400:
15
+ raise req.exceptions.HTTPError(f"{self.status_code} {self.reason}")
16
+
17
+ def json(self):
18
+ return json.loads(self.content)
@@ -1,26 +1,36 @@
1
+ import json
1
2
  from typing import Optional, List, Dict
2
-
3
3
  import requests as req
4
- import logging
4
+ from pygeai import logger
5
+ from pygeai.core.common.exceptions import InvalidResponseException
6
+ from pygeai.core.services.response import ResponseMock
5
7
 
6
- logger = logging.getLogger(__name__)
8
+ FAILED_REQUEST_RESPONSE = ResponseMock(
9
+ status_code=0,
10
+ content=json.dumps({"error": "Unknown error occurred"}),
11
+ url=None,
12
+ reason="Unknown Error"
13
+ )
7
14
 
8
15
 
9
16
  class ApiService:
10
17
  """
11
- Generic service for interacting with RESTful APIs.
18
+ Generic service for interacting with REST APIs.
12
19
 
13
20
  :param base_url: str - The base URL of the API.
14
- :param username: str - Optional username for authentication.
15
- :param password: str - Optional password for authentication.
16
- :param token: str - Optional token for authentication.
21
+ :param username: str - Username for basic authentication (optional).
22
+ :param password: str - Password for basic authentication (optional).
23
+ :param token: str - Bearer token for authentication (optional).
24
+ :param project_id: str - Project ID for OAuth authentication (optional, keyword-only).
17
25
  """
18
26
 
19
- def __init__(self, base_url, username: str = None, password: str = None, token: str = None):
27
+ def __init__(self, base_url, username: str = None, password: str = None, token: str = None, *,
28
+ project_id: str = None):
20
29
  self._base_url = base_url
21
30
  self._username = username
22
31
  self._password = password
23
32
  self._token = token
33
+ self._project_id = project_id
24
34
 
25
35
  @property
26
36
  def base_url(self):
@@ -38,18 +48,36 @@ class ApiService:
38
48
  def token(self):
39
49
  return self._token
40
50
 
51
+ @token.setter
52
+ def token(self, token: str):
53
+ self._token = token
54
+
55
+ @property
56
+ def project_id(self):
57
+ return self._project_id
58
+
59
+ @project_id.setter
60
+ def project_id(self, project_id: str):
61
+ self._project_id = project_id
62
+
41
63
  def get(self, endpoint: str, params: dict = None, headers: dict = None, verify: bool = True):
42
64
  """
43
65
  Sends a GET request to the specified API endpoint.
44
66
 
45
- :param endpoint: str - The API endpoint to send the request to.
46
- :param params: dict - Optional query parameters for the request.
47
- :param headers: dict - Optional headers for the request.
48
- :param verify: bool - Optional verification of the connection.
49
- :return: Response object from the GET request.
67
+ This method constructs the full URL by appending the endpoint to the base URL and sends a GET request
68
+ using the provided query parameters and headers. Authentication is applied if username/password or token
69
+ is provided.
70
+
71
+ :param endpoint: str - The API endpoint to send the request to (relative to the base URL).
72
+ :param params: dict, optional - Query parameters to include in the request.
73
+ :param headers: dict, optional - Additional headers to include in the request.
74
+ :param verify: bool - Whether to verify SSL certificates (default: True).
75
+ :return: Response - The response object from the GET request.
76
+ :raises InvalidResponseException: If an error occurs during the request execution.
50
77
  """
78
+ response = FAILED_REQUEST_RESPONSE
51
79
  try:
52
- url = f"{self.base_url}/{endpoint}"
80
+ url = self._add_endpoint_to_url(endpoint)
53
81
 
54
82
  with req.Session() as session:
55
83
  if self.username and self.password:
@@ -69,22 +97,31 @@ class ApiService:
69
97
  )
70
98
  except Exception as e:
71
99
  logger.error(f"Error sending GET request: {e}")
100
+ raise InvalidResponseException(f"Error sending GET request: {e}")
72
101
  else:
73
- return response
102
+ logger.debug(f"GET request to URL: {response.url}")
103
+
104
+ return response
74
105
 
75
106
  def post(self, endpoint: str, data: dict, headers: dict = None, verify: bool = True, form: bool = False):
76
107
  """
77
108
  Sends a POST request to the specified API endpoint.
78
109
 
79
- :param endpoint: str - The API endpoint to send the request to.
110
+ This method constructs the full URL by appending the endpoint to the base URL and sends a POST request
111
+ with the provided data, either as JSON or form data. Authentication is applied if username/password or token
112
+ is provided.
113
+
114
+ :param endpoint: str - The API endpoint to send the request to (relative to the base URL).
80
115
  :param data: dict - The payload to include in the POST request.
81
- :param headers: dict - Optional headers for the request.
82
- :param verify: bool - Whether to verify SSL certificates. Defaults to True.
83
- :param form: bool - Whether to send data in json format or in form. Defaults to False (JSON).
84
- :return: Response object from the POST request.
116
+ :param headers: dict, optional - Additional headers to include in the request.
117
+ :param verify: bool - Whether to verify SSL certificates (default: True).
118
+ :param form: bool - Whether to send data as form data instead of JSON (default: False).
119
+ :return: Response - The response object from the POST request.
120
+ :raises InvalidResponseException: If an error occurs during the request execution.
85
121
  """
122
+ response = FAILED_REQUEST_RESPONSE
86
123
  try:
87
- url = f"{self.base_url}/{endpoint}"
124
+ url = self._add_endpoint_to_url(endpoint)
88
125
 
89
126
  with req.Session() as session:
90
127
  if self.username and self.password:
@@ -111,8 +148,11 @@ class ApiService:
111
148
  )
112
149
  except Exception as e:
113
150
  logger.error(f"Error sending POST request: {e}")
151
+ raise InvalidResponseException(f"Error sending POST request: {e}")
114
152
  else:
115
- return response
153
+ logger.debug(f"POST request to URL: {response.url}")
154
+
155
+ return response
116
156
 
117
157
  def stream_post(
118
158
  self,
@@ -125,15 +165,20 @@ class ApiService:
125
165
  """
126
166
  Sends a streaming POST request to the specified API endpoint.
127
167
 
128
- :param endpoint: str - The API endpoint to send the request to.
168
+ This method constructs the full URL by appending the endpoint to the base URL and sends a streaming POST
169
+ request with the provided data, either as JSON or form data. It yields chunks of the response as they are
170
+ received. Authentication is applied if username/password or token is provided.
171
+
172
+ :param endpoint: str - The API endpoint to send the request to (relative to the base URL).
129
173
  :param data: dict - The payload to include in the POST request.
130
- :param headers: dict - Optional headers for the request.
131
- :param verify: bool - Whether to verify SSL certificates. Defaults to True.
132
- :param form: bool - Whether to send data in form format instead of JSON. Defaults to False (JSON).
133
- :return: Generator yielding chunks of the streaming response.
174
+ :param headers: dict, optional - Additional headers to include in the request.
175
+ :param verify: bool - Whether to verify SSL certificates (default: True).
176
+ :param form: bool - Whether to send data as form data instead of JSON (default: False).
177
+ :return: Generator[str] - Yields chunks of the streaming response as strings.
178
+ :raises InvalidResponseException: If an error occurs during the request execution or streaming.
134
179
  """
135
180
  try:
136
- url = f"{self.base_url}/{endpoint}"
181
+ url = self._add_endpoint_to_url(endpoint)
137
182
 
138
183
  with req.Session() as session:
139
184
  if self.username and self.password:
@@ -159,14 +204,14 @@ class ApiService:
159
204
  )
160
205
 
161
206
  response.raise_for_status()
162
-
207
+ logger.debug(f"Streaming POST request to URL {response.url}")
163
208
  for line in response.iter_lines(decode_unicode=True):
164
209
  if line:
165
210
  yield line
166
211
 
167
212
  except Exception as e:
168
213
  logger.error(f"Error sending streaming POST request: {e}")
169
- raise
214
+ raise InvalidResponseException(f"Error sending streaming POST request: {e}")
170
215
 
171
216
  def post_file_binary(
172
217
  self,
@@ -175,8 +220,22 @@ class ApiService:
175
220
  verify: bool = True,
176
221
  file=None
177
222
  ):
223
+ """
224
+ Sends a POST request with a binary file to the specified API endpoint.
225
+
226
+ This method constructs the full URL by appending the endpoint to the base URL and sends a POST request
227
+ with the provided binary file data. Authentication is applied if username/password or token is provided.
228
+
229
+ :param endpoint: str - The API endpoint to send the request to (relative to the base URL).
230
+ :param headers: dict, optional - Additional headers to include in the request.
231
+ :param verify: bool - Whether to verify SSL certificates (default: True).
232
+ :param file: Binary file data to include in the request.
233
+ :return: Response - The response object from the POST request.
234
+ :raises InvalidResponseException: If an error occurs during the request execution.
235
+ """
236
+ response = FAILED_REQUEST_RESPONSE
178
237
  try:
179
- url = f"{self.base_url}/{endpoint}"
238
+ url = self._add_endpoint_to_url(endpoint)
180
239
 
181
240
  with req.Session() as session:
182
241
  if self.username and self.password:
@@ -196,8 +255,11 @@ class ApiService:
196
255
  )
197
256
  except Exception as e:
198
257
  logger.error(f"Error sending POST request with binary file: {e}")
258
+ raise InvalidResponseException(f"Error sending POST request with binary file: {e}")
199
259
  else:
200
- return response
260
+ logger.debug(f"POST request with binary file to URL: {response.url}")
261
+
262
+ return response
201
263
 
202
264
  def post_files_multipart(
203
265
  self,
@@ -207,8 +269,24 @@ class ApiService:
207
269
  verify: bool = True,
208
270
  files: Optional[Dict[str, str]] = None,
209
271
  ):
272
+ """
273
+ Sends a POST request with multipart files to the specified API endpoint.
274
+
275
+ This method constructs the full URL by appending the endpoint to the base URL and sends a POST request
276
+ with multipart form data, including files and optional additional data. Authentication is applied if
277
+ username/password or token is provided.
278
+
279
+ :param endpoint: str - The API endpoint to send the request to (relative to the base URL).
280
+ :param data: dict, optional - Additional form data to include in the request.
281
+ :param headers: dict, optional - Additional headers to include in the request.
282
+ :param verify: bool - Whether to verify SSL certificates (default: True).
283
+ :param files: Dict[str, str], optional - Dictionary of file names and their corresponding file paths or file-like objects.
284
+ :return: Response - The response object from the POST request.
285
+ :raises InvalidResponseException: If an error occurs during the request execution.
286
+ """
287
+ response = FAILED_REQUEST_RESPONSE
210
288
  try:
211
- url = f"{self.base_url}/{endpoint}"
289
+ url = self._add_endpoint_to_url(endpoint)
212
290
 
213
291
  with req.Session() as session:
214
292
  if self.username and self.password:
@@ -231,22 +309,29 @@ class ApiService:
231
309
  )
232
310
  except Exception as e:
233
311
  logger.error(f"Error sending POST request with files multipart: {e}")
312
+ raise InvalidResponseException(f"Error sending POST request with files multipart request: {e}")
234
313
  else:
235
- return response
314
+ logger.debug(f"POST request with multipart files to URL: {response.url}")
315
+
316
+ return response
236
317
 
237
318
  def put(self, endpoint: str, data: dict, headers: dict = None, verify: bool = True):
238
319
  """
239
320
  Sends a PUT request to the specified API endpoint.
240
321
 
241
- :param endpoint: str - The API endpoint to send the request to.
242
- :param data: dict - The payload to include in the PUT request.
243
- :param headers: dict - Optional headers for the request.
244
- :param verify: bool - Whether to verify SSL certificates. Defaults to True.
245
- :return: Response object from the PUT request.
322
+ This method constructs the full URL by appending the endpoint to the base URL and sends a PUT request
323
+ with the provided JSON data. Authentication is applied if username/password or token is provided.
324
+
325
+ :param endpoint: str - The API endpoint to send the request to (relative to the base URL).
326
+ :param data: dict - The payload to include in the PUT request (sent as JSON).
327
+ :param headers: dict, optional - Additional headers to include in the request.
328
+ :param verify: bool - Whether to verify SSL certificates (default: True).
329
+ :return: Response - The response object from the PUT request.
330
+ :raises InvalidResponseException: If an error occurs during the request execution.
246
331
  """
332
+ response = FAILED_REQUEST_RESPONSE
247
333
  try:
248
-
249
- url = f"{self.base_url}/{endpoint}"
334
+ url = self._add_endpoint_to_url(endpoint)
250
335
 
251
336
  with req.Session() as session:
252
337
  if self.username and self.password:
@@ -268,21 +353,29 @@ class ApiService:
268
353
  )
269
354
  except Exception as e:
270
355
  logger.error(f"Error sending PUT request: {e}")
356
+ raise InvalidResponseException(f"Error sending PUT request: {e}")
271
357
  else:
272
- return response
358
+ logger.debug(f"PUT request to URL: {response.url}")
359
+
360
+ return response
273
361
 
274
362
  def delete(self, endpoint: str, headers: dict = None, data: dict = None, verify: bool = True):
275
363
  """
276
364
  Sends a DELETE request to the specified API endpoint.
277
365
 
278
- :param endpoint: str - The API endpoint to send the request to.
279
- :param headers: dict - Optional headers for the request.
280
- :param data: dict - Optional data for the request.
281
- :param verify: bool - Whether to verify SSL certificates. Defaults to True.
282
- :return: Response object from the DELETE request.
366
+ This method constructs the full URL by appending the endpoint to the base URL and sends a DELETE request
367
+ with optional query parameters and headers. Authentication is applied if username/password or token is provided.
368
+
369
+ :param endpoint: str - The API endpoint to send the request to (relative to the base URL).
370
+ :param headers: dict, optional - Additional headers to include in the request.
371
+ :param data: dict, optional - Query parameters to include in the request.
372
+ :param verify: bool - Whether to verify SSL certificates (default: True).
373
+ :return: Response - The response object from the DELETE request.
374
+ :raises InvalidResponseException: If an error occurs during the request execution.
283
375
  """
376
+ response = FAILED_REQUEST_RESPONSE
284
377
  try:
285
- url = f"{self.base_url}/{endpoint}"
378
+ url = self._add_endpoint_to_url(endpoint)
286
379
 
287
380
  with req.Session() as session:
288
381
  if self.username and self.password:
@@ -302,8 +395,19 @@ class ApiService:
302
395
  )
303
396
  except Exception as e:
304
397
  logger.error(f"Error sending DELETE request: {e}")
398
+ raise InvalidResponseException(f"Error sending DELETE request: {e}")
305
399
  else:
306
- return response
400
+ logger.debug(f"DELETE request to URL: {response.url}")
401
+
402
+ return response
403
+
404
+ def _add_endpoint_to_url(self, endpoint: str):
405
+ clean_base_url = self.base_url.rstrip('/')
406
+ url = f"{clean_base_url}/{endpoint.lstrip('/')}" if self._has_valid_protocol(clean_base_url) else f"https://{clean_base_url}/{endpoint}"
407
+ return url
408
+
409
+ def _has_valid_protocol(self, url: str):
410
+ return url.startswith(('http://', 'https://'))
307
411
 
308
412
  def _add_token_to_headers(self, headers: dict = None):
309
413
  if not headers:
@@ -314,4 +418,10 @@ class ApiService:
314
418
  if "Authorization" not in headers:
315
419
  headers["Authorization"] = f"Bearer {self.token}"
316
420
 
421
+ if self.project_id and "ProjectId" not in headers:
422
+ headers["ProjectId"] = self.project_id
423
+ logger.debug(f"Added Authorization header with ProjectId: {self.project_id}")
424
+ else:
425
+ logger.debug("Added Authorization header")
426
+
317
427
  return headers
File without changes
@@ -0,0 +1,83 @@
1
+ import sys
2
+ from abc import ABC, abstractmethod
3
+
4
+
5
+ class StreamWriter(ABC):
6
+ """
7
+ Abstract base class for custom stream writers.
8
+ """
9
+
10
+ @abstractmethod
11
+ def write_stdout(self, message: str = "", end: str = "\n"):
12
+ pass
13
+
14
+ @abstractmethod
15
+ def write_stderr(self, message: str = "", end: str = "\n"):
16
+ pass
17
+
18
+ class ConsoleMeta(type):
19
+ def __getattr__(cls, name):
20
+ writer = cls._writer
21
+ attr = getattr(writer, name, None)
22
+ if callable(attr):
23
+ return attr
24
+
25
+ def noop(*args, **kwargs):
26
+ pass
27
+ return noop
28
+
29
+ class Console(metaclass=ConsoleMeta):
30
+ """
31
+ A utility class for writing messages to standard output and standard error streams.
32
+
33
+ This class provides static methods to write messages to `sys.stdout` and `sys.stderr`
34
+ with customizable end characters. It serves as a simple abstraction for console output
35
+ operations, ensuring consistent handling of messages in command-line applications.
36
+
37
+ Additionally, it allows setting a custom stream writer to override the default behavior,
38
+ enabling redirection of output to alternative targets such as loggers, files, or testing sinks.
39
+ """
40
+ class DefaultStreamWriter(StreamWriter):
41
+ """
42
+ Default StreamWriter that writes to sys.stdout and sys.stderr.
43
+ """
44
+ def write_stdout(self, message: str = "", end: str = "\n"):
45
+ sys.stdout.write(f"{message}{end}")
46
+ sys.stdout.flush()
47
+
48
+ def write_stderr(self, message: str = "", end: str = "\n"):
49
+ sys.stderr.write(f"{message}{end}")
50
+ sys.stderr.flush()
51
+
52
+ _writer: StreamWriter = DefaultStreamWriter()
53
+
54
+ @staticmethod
55
+ def write_stdout(message: str = "", end: str = "\n"):
56
+ """
57
+ Writes a message to the standard output stream (sys.stdout).
58
+
59
+ :param message: str - The message to write. Defaults to an empty string.
60
+ :param end: str - The string to append after the message. Defaults to a newline ('\n').
61
+ :return: None - No return value; output is written to sys.stdout.
62
+ """
63
+ Console._writer.write_stdout(message, end)
64
+
65
+ @staticmethod
66
+ def write_stderr(message: str = "", end: str = "\n"):
67
+ """
68
+ Writes a message to the standard error stream (sys.stderr).
69
+
70
+ :param message: str - The message to write. Defaults to an empty string.
71
+ :param end: str - The string to append after the message. Defaults to a newline ('\n').
72
+ :return: None - No return value; output is written to sys.stderr.
73
+ """
74
+ Console._writer.write_stderr(message, end)
75
+
76
+ @staticmethod
77
+ def set_writer(writer: StreamWriter):
78
+ """
79
+ Sets a custom StreamWriter to handle console output.
80
+
81
+ :param writer: StreamWriter - Implementation of the StreamWriter interface.
82
+ """
83
+ Console._writer = writer
@@ -0,0 +1,32 @@
1
+ from json import JSONDecodeError
2
+
3
+ from pygeai import logger
4
+ from pygeai.core.common.exceptions import InvalidAPIResponseException
5
+
6
+
7
+ def parse_json_response(response, operation: str, **context):
8
+ """
9
+ Parse JSON response with standardized error handling.
10
+
11
+ :param response: HTTP response object
12
+ :param operation: Description of operation (e.g., "get project API token")
13
+ :param context: Additional context (e.g., api_token_id="123")
14
+ :return: Parsed JSON response
15
+ :raises InvalidAPIResponseException: If JSON parsing fails
16
+ """
17
+ try:
18
+ return response.json()
19
+ except JSONDecodeError as e:
20
+ full_msg = f"Unable to {operation}"
21
+ if context:
22
+ if len(context) == 1:
23
+ # Single context value: append as 'value'
24
+ value = list(context.values())[0]
25
+ full_msg += f" '{value}'"
26
+ else:
27
+ # Multiple context values: format as (key1='value1', key2='value2')
28
+ context_str = ", ".join([f"{k}='{v}'" for k, v in context.items()])
29
+ full_msg += f" ({context_str})"
30
+
31
+ logger.error(f"{full_msg}: JSON parsing error (status {response.status_code}): {e}. Response: {response.text}")
32
+ raise InvalidAPIResponseException(f"{full_msg}: {response.text}")
@@ -0,0 +1,10 @@
1
+ from pygeai import logger
2
+ from pygeai.core.common.exceptions import APIResponseError
3
+
4
+
5
+ def validate_status_code(response):
6
+ if response.status_code >= 300:
7
+ logger.error(f"Invalid status code returned from the API endpoint: {response.text}")
8
+ raise APIResponseError(f"API returned an error: {response.text}")
9
+
10
+
pygeai/dbg/__init__.py CHANGED
@@ -0,0 +1,3 @@
1
+ from pygeai.dbg.debugger import Debugger, Breakpoint, debug_file, debug_module
2
+
3
+ __all__ = ['Debugger', 'Breakpoint', 'debug_file', 'debug_module']