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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (648) hide show
  1. pygeai/__init__.py +9 -1
  2. pygeai/_docs/Makefile +20 -0
  3. pygeai/_docs/make.bat +35 -0
  4. pygeai/_docs/source/conf.py +117 -0
  5. pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
  6. pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
  7. pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
  8. pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
  9. pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
  10. pygeai/_docs/source/content/ai_lab.rst +102 -0
  11. pygeai/_docs/source/content/analytics.rst +598 -0
  12. pygeai/_docs/source/content/api_reference/admin.rst +161 -0
  13. pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
  14. pygeai/_docs/source/content/api_reference/auth.rst +379 -0
  15. pygeai/_docs/source/content/api_reference/chat.rst +754 -0
  16. pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
  17. pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
  18. pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
  19. pygeai/_docs/source/content/api_reference/files.rst +592 -0
  20. pygeai/_docs/source/content/api_reference/gam.rst +401 -0
  21. pygeai/_docs/source/content/api_reference/health.rst +58 -0
  22. pygeai/_docs/source/content/api_reference/project.rst +738 -0
  23. pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
  24. pygeai/_docs/source/content/api_reference/rag.rst +710 -0
  25. pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
  26. pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
  27. pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
  28. pygeai/_docs/source/content/api_reference.rst +58 -0
  29. pygeai/_docs/source/content/authentication.rst +295 -0
  30. pygeai/_docs/source/content/chat_gui.rst +121 -0
  31. pygeai/_docs/source/content/cli.rst +203 -0
  32. pygeai/_docs/source/content/debugger.rst +651 -0
  33. pygeai/_docs/source/content/intro.rst +67 -0
  34. pygeai/_docs/source/content/migration.rst +929 -0
  35. pygeai/_docs/source/content/modules.rst +7 -0
  36. pygeai/_docs/source/content/quickstart.rst +143 -0
  37. pygeai/_docs/source/content/samples.rst +394 -0
  38. pygeai/_docs/source/index.rst +75 -0
  39. pygeai/_docs/source/modules.rst +7 -0
  40. pygeai/_docs/source/pygeai.admin.rst +29 -0
  41. pygeai/_docs/source/pygeai.analytics.rst +53 -0
  42. pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
  43. pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
  44. pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
  45. pygeai/_docs/source/pygeai.assistant.rst +55 -0
  46. pygeai/_docs/source/pygeai.auth.rst +29 -0
  47. pygeai/_docs/source/pygeai.chat.rst +69 -0
  48. pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
  49. pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
  50. pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
  51. pygeai/_docs/source/pygeai.cli.rst +62 -0
  52. pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
  53. pygeai/_docs/source/pygeai.core.base.rst +53 -0
  54. pygeai/_docs/source/pygeai.core.common.rst +37 -0
  55. pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
  56. pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
  57. pygeai/_docs/source/pygeai.core.files.rst +61 -0
  58. pygeai/_docs/source/pygeai.core.llm.rst +29 -0
  59. pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
  60. pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
  61. pygeai/_docs/source/pygeai.core.rst +63 -0
  62. pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
  63. pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
  64. pygeai/_docs/source/pygeai.core.services.rst +37 -0
  65. pygeai/_docs/source/pygeai.core.utils.rst +37 -0
  66. pygeai/_docs/source/pygeai.dbg.rst +21 -0
  67. pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
  68. pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
  69. pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
  70. pygeai/_docs/source/pygeai.evaluation.rst +31 -0
  71. pygeai/_docs/source/pygeai.flows.rst +29 -0
  72. pygeai/_docs/source/pygeai.gam.rst +29 -0
  73. pygeai/_docs/source/pygeai.health.rst +29 -0
  74. pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
  75. pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
  76. pygeai/_docs/source/pygeai.lab.rst +65 -0
  77. pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
  78. pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
  79. pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
  80. pygeai/_docs/source/pygeai.man.man1.rst +10 -0
  81. pygeai/_docs/source/pygeai.man.rst +18 -0
  82. pygeai/_docs/source/pygeai.migration.rst +29 -0
  83. pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
  84. pygeai/_docs/source/pygeai.organization.rst +61 -0
  85. pygeai/_docs/source/pygeai.proxy.rst +53 -0
  86. pygeai/_docs/source/pygeai.rst +35 -0
  87. pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
  88. pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
  89. pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
  90. pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
  91. pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
  92. pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
  93. pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
  94. pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
  95. pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
  96. pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
  97. pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
  98. pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
  99. pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
  100. pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
  101. pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
  102. pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
  103. pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
  104. pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
  105. pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
  106. pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
  107. pygeai/_docs/source/pygeai.tests.core.rst +39 -0
  108. pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
  109. pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
  110. pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
  111. pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
  112. pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
  113. pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
  114. pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
  115. pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
  116. pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
  117. pygeai/_docs/source/pygeai.tests.health.rst +21 -0
  118. pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
  119. pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
  120. pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
  121. pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
  122. pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
  123. pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
  124. pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
  125. pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
  126. pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
  127. pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
  128. pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
  129. pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
  130. pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
  131. pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
  132. pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
  133. pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
  134. pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
  135. pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
  136. pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
  137. pygeai/_docs/source/pygeai.tests.rst +33 -0
  138. pygeai/admin/clients.py +14 -11
  139. pygeai/admin/endpoints.py +2 -2
  140. pygeai/analytics/clients.py +505 -0
  141. pygeai/analytics/endpoints.py +35 -0
  142. pygeai/analytics/managers.py +606 -0
  143. pygeai/analytics/mappers.py +207 -0
  144. pygeai/analytics/responses.py +240 -0
  145. pygeai/assistant/clients.py +18 -45
  146. pygeai/assistant/data/clients.py +1 -0
  147. pygeai/assistant/data_analyst/clients.py +8 -12
  148. pygeai/assistant/managers.py +195 -157
  149. pygeai/assistant/mappers.py +4 -2
  150. pygeai/assistant/rag/clients.py +27 -67
  151. pygeai/assistant/rag/mappers.py +12 -6
  152. pygeai/assistant/rag/models.py +301 -159
  153. pygeai/auth/__init__.py +0 -0
  154. pygeai/auth/clients.py +129 -0
  155. pygeai/auth/endpoints.py +6 -0
  156. pygeai/chat/clients.py +308 -37
  157. pygeai/chat/endpoints.py +3 -0
  158. pygeai/chat/iris.py +2 -8
  159. pygeai/chat/managers.py +9 -6
  160. pygeai/chat/session.py +38 -0
  161. pygeai/chat/settings.py +6 -0
  162. pygeai/chat/ui.py +678 -0
  163. pygeai/cli/__init__.py +0 -1
  164. pygeai/cli/commands/admin.py +7 -10
  165. pygeai/cli/commands/analytics.py +533 -0
  166. pygeai/cli/commands/assistant.py +9 -9
  167. pygeai/cli/commands/auth.py +299 -0
  168. pygeai/cli/commands/base.py +71 -9
  169. pygeai/cli/commands/chat.py +676 -19
  170. pygeai/cli/commands/common.py +28 -24
  171. pygeai/cli/commands/configuration.py +66 -13
  172. pygeai/cli/commands/docs.py +105 -0
  173. pygeai/cli/commands/embeddings.py +58 -11
  174. pygeai/cli/commands/evaluation.py +38 -38
  175. pygeai/cli/commands/feedback.py +3 -4
  176. pygeai/cli/commands/files.py +7 -8
  177. pygeai/cli/commands/gam.py +85 -10
  178. pygeai/cli/commands/lab/ai_lab.py +340 -484
  179. pygeai/cli/commands/lab/options.py +8 -0
  180. pygeai/cli/commands/lab/spec.py +273 -0
  181. pygeai/cli/commands/lab/utils.py +13 -0
  182. pygeai/cli/commands/llm.py +6 -7
  183. pygeai/cli/commands/migrate.py +1064 -436
  184. pygeai/cli/commands/organization.py +516 -11
  185. pygeai/cli/commands/rag.py +13 -14
  186. pygeai/cli/commands/rerank.py +3 -5
  187. pygeai/cli/commands/secrets.py +8 -9
  188. pygeai/cli/commands/usage_limits.py +18 -20
  189. pygeai/cli/commands/validators.py +144 -1
  190. pygeai/cli/commands/version.py +4 -5
  191. pygeai/cli/error_handler.py +151 -0
  192. pygeai/cli/geai.py +170 -31
  193. pygeai/cli/geai_proxy.py +86 -25
  194. pygeai/cli/install_man.py +93 -22
  195. pygeai/cli/parsers.py +75 -25
  196. pygeai/cli/texts/help.py +265 -28
  197. pygeai/core/base/clients.py +53 -12
  198. pygeai/core/base/mappers.py +11 -2
  199. pygeai/core/base/session.py +95 -11
  200. pygeai/core/common/config.py +78 -14
  201. pygeai/core/common/exceptions.py +96 -6
  202. pygeai/core/embeddings/__init__.py +19 -0
  203. pygeai/core/embeddings/clients.py +23 -5
  204. pygeai/core/embeddings/managers.py +9 -4
  205. pygeai/core/embeddings/mappers.py +16 -2
  206. pygeai/core/embeddings/responses.py +9 -2
  207. pygeai/core/feedback/clients.py +8 -3
  208. pygeai/core/files/clients.py +23 -24
  209. pygeai/core/files/managers.py +121 -30
  210. pygeai/core/files/responses.py +4 -3
  211. pygeai/core/handlers.py +10 -1
  212. pygeai/core/llm/clients.py +22 -29
  213. pygeai/core/models.py +127 -11
  214. pygeai/core/plugins/clients.py +6 -6
  215. pygeai/core/rerank/clients.py +9 -3
  216. pygeai/core/rerank/managers.py +22 -5
  217. pygeai/core/secrets/clients.py +16 -37
  218. pygeai/core/services/response.py +18 -0
  219. pygeai/core/services/rest.py +159 -49
  220. pygeai/core/utils/__init__.py +0 -0
  221. pygeai/core/utils/console.py +83 -0
  222. pygeai/core/utils/parsers.py +32 -0
  223. pygeai/core/utils/validators.py +10 -0
  224. pygeai/dbg/__init__.py +3 -0
  225. pygeai/dbg/debugger.py +854 -14
  226. pygeai/evaluation/clients.py +7 -4
  227. pygeai/evaluation/dataset/clients.py +46 -44
  228. pygeai/evaluation/plan/clients.py +28 -26
  229. pygeai/evaluation/result/clients.py +38 -5
  230. pygeai/gam/clients.py +50 -28
  231. pygeai/gam/endpoints.py +2 -1
  232. pygeai/health/__init__.py +0 -0
  233. pygeai/health/clients.py +24 -0
  234. pygeai/health/endpoints.py +1 -0
  235. pygeai/lab/__init__.py +0 -90
  236. pygeai/lab/agents/clients.py +203 -162
  237. pygeai/lab/agents/endpoints.py +4 -0
  238. pygeai/lab/agents/mappers.py +57 -7
  239. pygeai/lab/clients.py +24 -0
  240. pygeai/lab/constants.py +3 -0
  241. pygeai/lab/managers.py +571 -541
  242. pygeai/lab/models.py +108 -19
  243. pygeai/lab/processes/clients.py +332 -340
  244. pygeai/lab/processes/mappers.py +3 -3
  245. pygeai/lab/runners.py +90 -0
  246. pygeai/lab/spec/__init__.py +0 -0
  247. pygeai/lab/spec/loader.py +24 -0
  248. pygeai/lab/spec/parsers.py +39 -0
  249. pygeai/lab/strategies/clients.py +67 -63
  250. pygeai/lab/strategies/mappers.py +1 -1
  251. pygeai/lab/tools/clients.py +85 -118
  252. pygeai/lab/tools/endpoints.py +4 -0
  253. pygeai/lab/tools/mappers.py +5 -5
  254. pygeai/man/man1/geai-proxy.1 +116 -0
  255. pygeai/man/man1/geai.1 +2580 -66
  256. pygeai/migration/__init__.py +33 -0
  257. pygeai/migration/strategies.py +468 -146
  258. pygeai/migration/tools.py +170 -3
  259. pygeai/organization/clients.py +245 -50
  260. pygeai/organization/endpoints.py +17 -8
  261. pygeai/organization/limits/clients.py +34 -32
  262. pygeai/organization/limits/managers.py +108 -49
  263. pygeai/organization/managers.py +347 -53
  264. pygeai/organization/mappers.py +102 -2
  265. pygeai/organization/responses.py +58 -1
  266. pygeai/proxy/clients.py +6 -3
  267. pygeai/proxy/config.py +14 -1
  268. pygeai/proxy/managers.py +61 -33
  269. pygeai/proxy/servers.py +196 -51
  270. pygeai/proxy/tool.py +33 -16
  271. pygeai/tests/admin/__init__.py +0 -0
  272. pygeai/tests/admin/test_clients.py +148 -0
  273. pygeai/tests/analytics/__init__.py +0 -0
  274. pygeai/tests/analytics/test_clients.py +86 -0
  275. pygeai/tests/analytics/test_managers.py +94 -0
  276. pygeai/tests/analytics/test_mappers.py +84 -0
  277. pygeai/tests/analytics/test_responses.py +73 -0
  278. pygeai/tests/assistants/rag/test_clients.py +346 -0
  279. pygeai/tests/assistants/rag/test_models.py +292 -0
  280. pygeai/tests/assistants/test_clients.py +176 -82
  281. pygeai/tests/assistants/test_managers.py +191 -57
  282. pygeai/tests/auth/__init__.py +0 -0
  283. pygeai/tests/auth/test_clients.py +289 -0
  284. pygeai/tests/auth/test_oauth.py +172 -0
  285. pygeai/tests/auth/test_session_logging.py +150 -0
  286. pygeai/tests/chat/__init__.py +0 -0
  287. pygeai/tests/chat/test_clients.py +393 -0
  288. pygeai/tests/chat/test_iris.py +38 -0
  289. pygeai/tests/chat/test_session.py +62 -0
  290. pygeai/tests/chat/test_ui.py +224 -0
  291. pygeai/tests/cli/commands/__init__.py +0 -0
  292. pygeai/tests/cli/commands/lab/__init__.py +0 -0
  293. pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
  294. pygeai/tests/cli/commands/lab/test_common.py +208 -0
  295. pygeai/tests/cli/commands/lab/test_spec.py +246 -0
  296. pygeai/tests/cli/commands/test_assistant.py +202 -0
  297. pygeai/tests/cli/commands/test_chat.py +130 -0
  298. pygeai/tests/cli/commands/test_common.py +350 -0
  299. pygeai/tests/cli/commands/test_embeddings.py +132 -0
  300. pygeai/tests/cli/commands/test_evaluation.py +656 -0
  301. pygeai/tests/cli/commands/test_feedback.py +65 -0
  302. pygeai/tests/cli/commands/test_files.py +161 -0
  303. pygeai/tests/cli/commands/test_gam.py +201 -0
  304. pygeai/tests/cli/commands/test_llm.py +114 -0
  305. pygeai/tests/cli/commands/test_migrate.py +176 -0
  306. pygeai/tests/cli/commands/test_organization.py +276 -0
  307. pygeai/tests/cli/commands/test_rag.py +266 -0
  308. pygeai/tests/cli/commands/test_rerank.py +110 -0
  309. pygeai/tests/cli/commands/test_secrets.py +171 -0
  310. pygeai/tests/cli/commands/test_show_help.py +41 -0
  311. pygeai/tests/cli/commands/test_usage_limits.py +412 -0
  312. pygeai/tests/cli/commands/test_validators.py +160 -0
  313. pygeai/tests/cli/commands/test_version.py +81 -0
  314. pygeai/tests/cli/docker/__init__.py +0 -0
  315. pygeai/tests/cli/test_credentials_flag.py +316 -0
  316. pygeai/tests/cli/test_error_handler.py +225 -0
  317. pygeai/tests/cli/test_geai_driver.py +154 -0
  318. pygeai/tests/cli/test_parsers.py +5 -5
  319. pygeai/tests/core/base/data/models.py +7 -0
  320. pygeai/tests/core/base/test_mappers.py +43 -11
  321. pygeai/tests/core/base/test_models.py +3 -1
  322. pygeai/tests/core/base/test_responses.py +53 -0
  323. pygeai/tests/core/common/__init__.py +0 -0
  324. pygeai/tests/core/common/data/__init__.py +0 -0
  325. pygeai/tests/core/common/test_config.py +186 -0
  326. pygeai/tests/core/common/test_decorators.py +69 -0
  327. pygeai/tests/core/embeddings/__init__.py +0 -0
  328. pygeai/tests/core/embeddings/test_clients.py +225 -0
  329. pygeai/tests/core/embeddings/test_managers.py +171 -0
  330. pygeai/tests/core/embeddings/test_mappers.py +142 -0
  331. pygeai/tests/core/feedback/__init__.py +0 -0
  332. pygeai/tests/core/feedback/test_clients.py +64 -0
  333. pygeai/tests/core/files/test_clients.py +128 -0
  334. pygeai/tests/core/files/test_managers.py +124 -78
  335. pygeai/tests/core/files/test_mappers.py +137 -0
  336. pygeai/tests/core/files/test_models.py +103 -0
  337. pygeai/tests/core/files/test_responses.py +122 -0
  338. pygeai/tests/core/llm/__init__.py +0 -0
  339. pygeai/tests/core/llm/test_clients.py +142 -0
  340. pygeai/tests/core/plugins/__init__.py +0 -0
  341. pygeai/tests/core/plugins/test_clients.py +66 -0
  342. pygeai/tests/core/rerank/test_clients.py +76 -0
  343. pygeai/tests/core/rerank/test_managers.py +61 -39
  344. pygeai/tests/core/secrets/__init__.py +0 -0
  345. pygeai/tests/core/secrets/test_clients.py +264 -0
  346. pygeai/tests/core/services/__init__.py +0 -0
  347. pygeai/tests/core/services/test_rest.py +273 -0
  348. pygeai/tests/core/test_handlers.py +66 -0
  349. pygeai/tests/core/utils/__init__.py +0 -0
  350. pygeai/tests/core/utils/test_console.py +80 -0
  351. pygeai/tests/dbg/__init__.py +0 -0
  352. pygeai/tests/dbg/test_debugger.py +591 -0
  353. pygeai/tests/evaluation/__init__.py +0 -0
  354. pygeai/tests/evaluation/dataset/__init__.py +0 -0
  355. pygeai/tests/evaluation/dataset/test_clients.py +265 -0
  356. pygeai/tests/evaluation/plan/__init__.py +0 -0
  357. pygeai/tests/evaluation/plan/test_clients.py +195 -0
  358. pygeai/tests/evaluation/result/__init__.py +0 -0
  359. pygeai/tests/evaluation/result/test_clients.py +66 -0
  360. pygeai/tests/gam/__init__.py +0 -0
  361. pygeai/tests/gam/test_clients.py +195 -0
  362. pygeai/tests/health/__init__.py +0 -0
  363. pygeai/tests/health/test_clients.py +41 -0
  364. pygeai/tests/integration/__init__.py +0 -0
  365. pygeai/tests/integration/assistants/__init__.py +0 -0
  366. pygeai/tests/integration/assistants/rag/__init__.py +0 -0
  367. pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
  368. pygeai/tests/integration/chat/__init__.py +0 -0
  369. pygeai/tests/integration/chat/test_generate_image.py +158 -0
  370. pygeai/tests/integration/lab/__init__.py +0 -0
  371. pygeai/tests/integration/lab/agents/__init__.py +0 -0
  372. pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
  373. pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
  374. pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
  375. pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
  376. pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
  377. pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
  378. pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
  379. pygeai/tests/integration/lab/processes/__init__.py +0 -0
  380. pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
  381. pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
  382. pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
  383. pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
  384. pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
  385. pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
  386. pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
  387. pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
  388. pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
  389. pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
  390. pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
  391. pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
  392. pygeai/tests/integration/lab/tools/__init__.py +0 -0
  393. pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
  394. pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
  395. pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
  396. pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
  397. pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
  398. pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
  399. pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
  400. pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
  401. pygeai/tests/lab/agents/__init__.py +0 -0
  402. pygeai/tests/lab/agents/test_clients.py +481 -0
  403. pygeai/tests/lab/agents/test_mappers.py +440 -0
  404. pygeai/tests/lab/processes/__init__.py +0 -0
  405. pygeai/tests/lab/processes/test_clients.py +1416 -0
  406. pygeai/tests/lab/processes/test_mappers.py +1092 -0
  407. pygeai/tests/lab/spec/__init__.py +0 -0
  408. pygeai/tests/lab/spec/test_loader.py +59 -0
  409. pygeai/tests/lab/spec/test_parsers.py +182 -0
  410. pygeai/tests/lab/strategies/__init__.py +0 -0
  411. pygeai/tests/lab/strategies/test_clients.py +241 -0
  412. pygeai/tests/lab/strategies/test_mappers.py +132 -0
  413. pygeai/tests/lab/test_managers.py +553 -0
  414. pygeai/tests/lab/test_models.py +500 -3
  415. pygeai/tests/lab/tools/__init__.py +0 -0
  416. pygeai/tests/lab/tools/test_clients.py +521 -0
  417. pygeai/tests/lab/tools/test_mappers.py +198 -0
  418. pygeai/tests/migration/__init__.py +0 -0
  419. pygeai/tests/migration/test_strategies.py +405 -0
  420. pygeai/tests/migration/test_tools.py +159 -0
  421. pygeai/tests/organization/limits/test_clients.py +567 -0
  422. pygeai/tests/organization/limits/test_managers.py +298 -56
  423. pygeai/tests/organization/test_clients.py +600 -30
  424. pygeai/tests/organization/test_managers.py +424 -0
  425. pygeai/tests/organization/test_mappers.py +153 -0
  426. pygeai/tests/organization/test_responses.py +137 -0
  427. pygeai/tests/proxy/__init__.py +1 -0
  428. pygeai/tests/proxy/test_clients.py +397 -0
  429. pygeai/tests/proxy/test_config.py +171 -0
  430. pygeai/tests/proxy/test_integration.py +305 -0
  431. pygeai/tests/proxy/test_managers.py +312 -0
  432. pygeai/tests/proxy/test_servers.py +387 -0
  433. pygeai/tests/proxy/test_tool.py +176 -0
  434. pygeai/tests/snippets/analytics/__init__.py +0 -0
  435. pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
  436. pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
  437. pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
  438. pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
  439. pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
  440. pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
  441. pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
  442. pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
  443. pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
  444. pygeai/tests/snippets/auth/__init__.py +0 -0
  445. pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
  446. pygeai/tests/snippets/chat/get_response.py +15 -0
  447. pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
  448. pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
  449. pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
  450. pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
  451. pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
  452. pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
  453. pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
  454. pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
  455. pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
  456. pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
  457. pygeai/tests/snippets/dbg/__init__.py +0 -0
  458. pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
  459. pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
  460. pygeai/tests/snippets/dbg/file_debugging.py +72 -0
  461. pygeai/tests/snippets/dbg/module_debugging.py +61 -0
  462. pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
  463. pygeai/tests/snippets/dbg/stepping_example.py +40 -0
  464. pygeai/tests/snippets/embeddings/cache_example.py +31 -0
  465. pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
  466. pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
  467. pygeai/tests/snippets/embeddings/openai_example.py +30 -0
  468. pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
  469. pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
  470. pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
  471. pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
  472. pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
  473. pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
  474. pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
  475. pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
  476. pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
  477. pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
  478. pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
  479. pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
  480. pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
  481. pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
  482. pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
  483. pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
  484. pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
  485. pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
  486. pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
  487. pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
  488. pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
  489. pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
  490. pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
  491. pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
  492. pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
  493. pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
  494. pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
  495. pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
  496. pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
  497. pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
  498. pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
  499. pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
  500. pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
  501. pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
  502. pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
  503. pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
  504. pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
  505. pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
  506. pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
  507. pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
  508. pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
  509. pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
  510. pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
  511. pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
  512. pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
  513. pygeai/tests/snippets/files/delete_file.py +1 -4
  514. pygeai/tests/snippets/files/get_file_content.py +2 -4
  515. pygeai/tests/snippets/files/get_file_data.py +1 -4
  516. pygeai/tests/snippets/files/get_file_list.py +1 -6
  517. pygeai/tests/snippets/files/upload_file.py +1 -5
  518. pygeai/tests/snippets/gam/gam_access_token.py +87 -0
  519. pygeai/tests/snippets/lab/agentic_flow_example_1.py +25 -23
  520. pygeai/tests/snippets/lab/agentic_flow_example_4.py +23 -23
  521. pygeai/tests/snippets/lab/agents/create_agent.py +5 -8
  522. pygeai/tests/snippets/lab/agents/create_agent_2.py +1 -5
  523. pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
  524. pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
  525. pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
  526. pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
  527. pygeai/tests/snippets/lab/agents/delete_agent.py +1 -5
  528. pygeai/tests/snippets/lab/agents/get_agent.py +2 -11
  529. pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
  530. pygeai/tests/snippets/lab/agents/get_sharing_link.py +2 -7
  531. pygeai/tests/snippets/lab/agents/list_agents.py +4 -7
  532. pygeai/tests/snippets/lab/agents/publish_agent_revision.py +2 -6
  533. pygeai/tests/snippets/lab/agents/update_agent.py +1 -5
  534. pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
  535. pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
  536. pygeai/tests/snippets/lab/crud_ui.py +462 -0
  537. pygeai/tests/snippets/lab/processes/create_process.py +3 -5
  538. pygeai/tests/snippets/lab/processes/create_task.py +3 -5
  539. pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +10 -19
  540. pygeai/tests/snippets/lab/processes/kbs/create_kb.py +2 -5
  541. pygeai/tests/snippets/lab/processes/kbs/get_kb.py +10 -16
  542. pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +13 -20
  543. pygeai/tests/snippets/lab/processes/kbs/try_all.py +5 -7
  544. pygeai/tests/snippets/lab/processes/list_processes.py +5 -7
  545. pygeai/tests/snippets/lab/runner_1.py +1 -1
  546. pygeai/tests/snippets/lab/samples/summarize_files.py +3 -3
  547. pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +2 -5
  548. pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +2 -5
  549. pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +3 -6
  550. pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +2 -5
  551. pygeai/tests/snippets/lab/tools/create_tool.py +4 -10
  552. pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
  553. pygeai/tests/snippets/lab/tools/delete_tool.py +2 -6
  554. pygeai/tests/snippets/lab/tools/get_parameter.py +5 -7
  555. pygeai/tests/snippets/lab/tools/get_tool.py +5 -7
  556. pygeai/tests/snippets/lab/tools/list_tools.py +3 -7
  557. pygeai/tests/snippets/lab/tools/publish_tool_revision.py +3 -5
  558. pygeai/tests/snippets/lab/tools/set_parameters.py +4 -9
  559. pygeai/tests/snippets/lab/tools/update_tool.py +4 -8
  560. pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
  561. pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
  562. pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
  563. pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
  564. pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
  565. pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
  566. pygeai/tests/snippets/lab/{file_summarizer_example.py → use_cases/file_summarizer_example.py} +3 -3
  567. pygeai/tests/snippets/lab/{file_summarizer_example_2.py → use_cases/file_summarizer_example_2.py} +12 -12
  568. pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
  569. pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
  570. pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
  571. pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
  572. pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
  573. pygeai/tests/snippets/migrate/__init__.py +45 -0
  574. pygeai/tests/snippets/migrate/agent_migration.py +110 -0
  575. pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
  576. pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
  577. pygeai/tests/snippets/migrate/process_migration.py +64 -0
  578. pygeai/tests/snippets/migrate/project_migration.py +42 -0
  579. pygeai/tests/snippets/migrate/tool_migration.py +64 -0
  580. pygeai/tests/snippets/organization/add_project_member.py +10 -0
  581. pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
  582. pygeai/tests/snippets/organization/create_project.py +2 -2
  583. pygeai/tests/snippets/organization/get_memberships.py +12 -0
  584. pygeai/tests/snippets/organization/get_organization_members.py +6 -0
  585. pygeai/tests/snippets/organization/get_project_members.py +6 -0
  586. pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
  587. pygeai/tests/snippets/organization/get_project_roles.py +6 -0
  588. pygeai/vendor/a2a/__init__.py +1 -0
  589. pygeai/vendor/a2a/auth/__init__.py +0 -0
  590. pygeai/vendor/a2a/auth/user.py +31 -0
  591. pygeai/vendor/a2a/client/__init__.py +19 -0
  592. pygeai/vendor/a2a/client/client.py +425 -0
  593. pygeai/vendor/a2a/client/errors.py +33 -0
  594. pygeai/vendor/a2a/client/helpers.py +22 -0
  595. pygeai/vendor/a2a/py.typed +0 -0
  596. pygeai/vendor/a2a/server/__init__.py +1 -0
  597. pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
  598. pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
  599. pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
  600. pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
  601. pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
  602. pygeai/vendor/a2a/server/apps/__init__.py +16 -0
  603. pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
  604. pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
  605. pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
  606. pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
  607. pygeai/vendor/a2a/server/context.py +23 -0
  608. pygeai/vendor/a2a/server/events/__init__.py +21 -0
  609. pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
  610. pygeai/vendor/a2a/server/events/event_queue.py +156 -0
  611. pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
  612. pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
  613. pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
  614. pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
  615. pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
  616. pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
  617. pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
  618. pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
  619. pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
  620. pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
  621. pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
  622. pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
  623. pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
  624. pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
  625. pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
  626. pygeai/vendor/a2a/types.py +1624 -0
  627. pygeai/vendor/a2a/utils/__init__.py +40 -0
  628. pygeai/vendor/a2a/utils/artifact.py +72 -0
  629. pygeai/vendor/a2a/utils/errors.py +69 -0
  630. pygeai/vendor/a2a/utils/helpers.py +176 -0
  631. pygeai/vendor/a2a/utils/message.py +83 -0
  632. pygeai/vendor/a2a/utils/task.py +57 -0
  633. pygeai/vendor/a2a/utils/telemetry.py +299 -0
  634. pygeai-0.6.0b15.dist-info/METADATA +205 -0
  635. pygeai-0.6.0b15.dist-info/RECORD +799 -0
  636. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
  637. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/entry_points.txt +2 -1
  638. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/licenses/LICENSE +13 -1
  639. pygeai-0.6.0b15.dist-info/top_level.txt +1 -0
  640. docs/geai-proxy/README.md +0 -145
  641. docs/source/conf.py +0 -45
  642. pygeai/tests/core/test_managers.py +0 -233
  643. pygeai-0.1.51b3.dist-info/METADATA +0 -130
  644. pygeai-0.1.51b3.dist-info/RECORD +0 -324
  645. pygeai-0.1.51b3.dist-info/top_level.txt +0 -3
  646. scripts/bump_beta_version.py +0 -56
  647. {scripts → pygeai/analytics}/__init__.py +0 -0
  648. /pygeai/tests/snippets/lab/{c_code_fixer_agent_flow.py → use_cases/c_code_fixer_agent_flow.py} +0 -0
pygeai/auth/clients.py ADDED
@@ -0,0 +1,129 @@
1
+ from pygeai import logger
2
+ from pygeai.auth.endpoints import GET_USER_PROFILE_INFO, GET_OAUTH2_ACCESS_TOKEN, \
3
+ CREATE_PROJECT_API_TOKEN_V2, DELETE_PROJECT_API_TOKEN_V2, UPDATE_PROJECT_API_TOKEN_V2, GET_PROJECT_API_TOKEN_V2
4
+ from pygeai.core.base.clients import BaseClient
5
+ from pygeai.core.common.exceptions import InvalidAPIResponseException, APIResponseError
6
+ from pygeai.core.utils.validators import validate_status_code
7
+ from pygeai.core.utils.parsers import parse_json_response
8
+
9
+
10
+ class AuthClient(BaseClient):
11
+
12
+ def get_oauth2_access_token(
13
+ self,
14
+ client_id: str,
15
+ username: str,
16
+ password: str,
17
+ scope: str = "gam_user_data gam_user_roles"
18
+ ) -> dict:
19
+ """
20
+ Retrieves the list of projects that the user is authorized to access within a specific organization.
21
+
22
+ :param client_id: str - The client identifier provided by Globant
23
+ :param username: str - Username for authentication
24
+ :param password: str - Password for authentication
25
+ :param scope: str - Space-separated list of requested scopes
26
+ :return: dict - The API response containing the list of authorized projects in JSON format.
27
+ """
28
+ response = self.api_service.get(
29
+ endpoint=GET_OAUTH2_ACCESS_TOKEN,
30
+ params={
31
+ "client_id": client_id,
32
+ "scope": scope,
33
+ "username": username,
34
+ "password": password
35
+ }
36
+ )
37
+ validate_status_code(response)
38
+ return parse_json_response(response, "obtain Oauth2 access token")
39
+
40
+ def get_user_profile_information(self, access_token: str) -> dict:
41
+ """
42
+ Get user profile information
43
+
44
+ :param access_token: str - Token obtained in the POST to /oauth/access_token
45
+ :return: dict - The API response containing the user profile information
46
+ """
47
+ self.api_service.token = access_token
48
+ response = self.api_service.get(endpoint=GET_USER_PROFILE_INFO)
49
+ validate_status_code(response)
50
+ return parse_json_response(response, "retrieve user profile information")
51
+
52
+ def create_project_api_token(
53
+ self,
54
+ project_id: str,
55
+ name: str,
56
+ description: str = None
57
+ ) -> dict:
58
+ """
59
+ Creates a new API token for a project.
60
+
61
+ :param project_id: str - The project identifier (required). Will be sent as header.
62
+ :param name: str - The name of the API token (required).
63
+ :param description: str - A description of the API token (optional).
64
+ :return: dict - The API response containing the created API token details in JSON format.
65
+ """
66
+ headers = {"project-id": project_id}
67
+ data = {"name": name}
68
+ if description:
69
+ data["description"] = description
70
+
71
+ response = self.api_service.post(
72
+ endpoint=CREATE_PROJECT_API_TOKEN_V2,
73
+ data=data,
74
+ headers=headers
75
+ )
76
+ validate_status_code(response)
77
+ return parse_json_response(response, "create project API token")
78
+
79
+ def delete_project_api_token(self, api_token_id: str) -> dict:
80
+ """
81
+ Revokes an API token by setting its status to "revoked".
82
+
83
+ :param api_token_id: str - The unique identifier of the API token to delete (required).
84
+ :return: dict - The API response confirming the deletion, in JSON format.
85
+ """
86
+ endpoint = DELETE_PROJECT_API_TOKEN_V2.format(id=api_token_id)
87
+ response = self.api_service.delete(endpoint=endpoint)
88
+ validate_status_code(response)
89
+ return parse_json_response(response, "delete project API token", api_token_id=api_token_id)
90
+
91
+ def update_project_api_token(
92
+ self,
93
+ api_token_id: str,
94
+ description: str = None,
95
+ status: str = None
96
+ ) -> dict:
97
+ """
98
+ Updates an existing API token's description and/or status.
99
+
100
+ :param api_token_id: str - The unique identifier of the API token to update (required).
101
+ :param description: str - A new description for the API token (optional).
102
+ :param status: str - The new status for the API token: 'active' or 'blocked' (optional).
103
+ :return: dict - The API response containing the update result messages in JSON format.
104
+ """
105
+ endpoint = UPDATE_PROJECT_API_TOKEN_V2.format(id=api_token_id)
106
+ data = {}
107
+ if description is not None:
108
+ data["description"] = description
109
+ if status is not None:
110
+ data["status"] = status
111
+
112
+ response = self.api_service.put(
113
+ endpoint=endpoint,
114
+ data=data
115
+ )
116
+ validate_status_code(response)
117
+ return parse_json_response(response, "update project API token", api_token_id=api_token_id)
118
+
119
+ def get_project_api_token(self, api_token_id: str) -> dict:
120
+ """
121
+ Retrieves data for a specific project API token.
122
+
123
+ :param api_token_id: str - The unique identifier of the API token (required).
124
+ :return: dict - The API response containing the API token details in JSON format.
125
+ """
126
+ endpoint = GET_PROJECT_API_TOKEN_V2.format(id=api_token_id)
127
+ response = self.api_service.get(endpoint=endpoint)
128
+ validate_status_code(response)
129
+ return parse_json_response(response, "get project API token", api_token_id=api_token_id)
@@ -0,0 +1,6 @@
1
+ GET_OAUTH2_ACCESS_TOKEN = "/oauth/access_token" # POST -> Obtain an OAuth 2.0 access token
2
+ GET_USER_PROFILE_INFO = "/openid/userinfo" # GET -> Retrieve user profile information
3
+ CREATE_PROJECT_API_TOKEN_V2 = "v2/projects/tokens" # POST -> Create a new API token for a project
4
+ DELETE_PROJECT_API_TOKEN_V2 = "v2/projects/tokens/{id}" # DELETE -> Revoke an API token
5
+ UPDATE_PROJECT_API_TOKEN_V2 = "v2/projects/tokens/{id}" # PUT -> Update an API token
6
+ GET_PROJECT_API_TOKEN_V2 = "v2/projects/tokens/{id}" # GET -> Get data of a specific project API token
pygeai/chat/clients.py CHANGED
@@ -1,9 +1,14 @@
1
1
  import json
2
2
  from json import JSONDecodeError
3
+ from pathlib import Path
3
4
  from typing import List, Dict, Optional, Union, Generator
4
5
 
5
- from pygeai.chat.endpoints import CHAT_V1, CHAT_COMPLETION_V1
6
+ from pygeai import logger
7
+ from pygeai.chat.endpoints import CHAT_V1, GENERATE_IMAGE_V1, EDIT_IMAGE_V1, RESPONSES_V1
6
8
  from pygeai.core.base.clients import BaseClient
9
+ from pygeai.core.common.exceptions import InvalidAPIResponseException
10
+ from pygeai.core.utils.validators import validate_status_code
11
+ from pygeai.core.utils.parsers import parse_json_response
7
12
 
8
13
 
9
14
  class ChatClient(BaseClient):
@@ -12,8 +17,8 @@ class ChatClient(BaseClient):
12
17
  response = self.api_service.post(
13
18
  endpoint=CHAT_V1
14
19
  )
15
- result = response.json()
16
- return result
20
+ validate_status_code(response)
21
+ return parse_json_response(response, "chat")
17
22
 
18
23
  def chat_completion(
19
24
  self,
@@ -37,7 +42,8 @@ class ChatClient(BaseClient):
37
42
  stream_options: Optional[Dict] = None,
38
43
  store: Optional[bool] = None,
39
44
  metadata: Optional[Dict] = None,
40
- user: Optional[str] = None
45
+ user: Optional[str] = None,
46
+ reasoning_effort: Optional[str] = None
41
47
  ) -> Union[dict, str, Generator[str, None, None]]:
42
48
  """
43
49
  Generates a chat completion response using the specified model and parameters.
@@ -47,8 +53,8 @@ class ChatClient(BaseClient):
47
53
  :param messages: List[Dict[str, str]] - A list of messages to include in the chat completion. Each message should be a dictionary with
48
54
  the following structure:
49
55
  {
50
- "role": "string", # Possible values: "user", "system", "assistant", or others supported by the model
51
- "content": "string" # The content of the message
56
+ "role": "string",
57
+ "content": "string"
52
58
  } (Required)
53
59
  :param stream: bool - Whether the response should be streamed. Possible values:
54
60
  - False: Returns the complete response as a dictionary or string (default).
@@ -75,6 +81,9 @@ class ChatClient(BaseClient):
75
81
  :param store: Optional[bool] - Whether to store the output for model distillation or evals. (Optional)
76
82
  :param metadata: Optional[Dict] - Up to 16 key-value pairs to attach to the object. (Optional)
77
83
  :param user: Optional[str] - A unique identifier for the end-user to monitor abuse. (Optional)
84
+ :param reasoning_effort: Optional[str] - Controls the depth of reasoning applied by supported models.
85
+ Possible values: "low", "medium", "high". Supported by OpenAI models from version 5,
86
+ Claude models from version 4.1, and Gemini models from version 2.0. (Optional)
78
87
  :return: Union[dict, str, Generator[str, None, None]] - For non-streaming (stream=False), returns a dictionary containing the chat completion
79
88
  result or a string if JSON decoding fails. For streaming (stream=True), returns a generator yielding content strings extracted from the
80
89
  streaming response chunks.
@@ -84,19 +93,16 @@ class ChatClient(BaseClient):
84
93
  'messages': messages,
85
94
  'stream': stream
86
95
  }
87
- if temperature:
96
+ if temperature is not None:
88
97
  data['temperature'] = temperature
89
98
 
90
99
  if max_tokens:
91
100
  data['max_completion_tokens'] = max_tokens
92
101
 
93
- if thread_id:
94
- data['threadId'] = thread_id
95
-
96
- if frequency_penalty:
102
+ if frequency_penalty is not None:
97
103
  data['frequency_penalty'] = frequency_penalty
98
104
 
99
- if presence_penalty:
105
+ if presence_penalty is not None:
100
106
  data['presence_penalty'] = presence_penalty
101
107
 
102
108
  if variables is not None and any(variables):
@@ -138,21 +144,33 @@ class ChatClient(BaseClient):
138
144
  if user is not None:
139
145
  data['user'] = user
140
146
 
147
+ if reasoning_effort is not None:
148
+ data['reasoning_effort'] = reasoning_effort
149
+
150
+ headers = {}
151
+ if thread_id:
152
+ headers["saia-conversation-id"] = thread_id
153
+
154
+ logger.debug(f"Generating chat completion with data: {data}")
155
+
141
156
  if stream:
142
157
  response = self.api_service.stream_post(
143
- endpoint=CHAT_COMPLETION_V1,
144
- data=data
158
+ endpoint=CHAT_V1,
159
+ data=data,
160
+ headers=headers
145
161
  )
146
162
  return self.stream_chat_generator(response)
147
163
  else:
148
164
  response = self.api_service.post(
149
- endpoint=CHAT_COMPLETION_V1,
150
- data=data
165
+ endpoint=CHAT_V1,
166
+ data=data,
167
+ headers=headers
151
168
  )
152
- try:
153
- result = response.json()
154
- except JSONDecodeError as e:
155
- result = response.text
169
+ validate_status_code(response)
170
+
171
+ result = parse_json_response(response, "process chat request")
172
+
173
+ logger.debug(f"Chat completion result: {result}")
156
174
 
157
175
  return result
158
176
 
@@ -163,20 +181,273 @@ class ChatClient(BaseClient):
163
181
  :param response: The streaming response from the API.
164
182
  :return: Generator[str, None, None] - Yields content strings extracted from streaming chunks.
165
183
  """
166
- for line in response:
167
- if line.startswith("data:"):
168
- chunk = line[5:].strip()
169
- if chunk == "[DONE]":
170
- break
171
- try:
172
- json_data = json.loads(chunk)
173
- if (
174
- json_data.get("choices")
175
- and len(json_data["choices"]) > 0
176
- and "delta" in json_data["choices"][0]
177
- and "content" in json_data["choices"][0]["delta"]
178
- ):
179
- content = json_data["choices"][0]["delta"]["content"]
180
- yield content
181
- except JSONDecodeError as e:
182
- continue
184
+ try:
185
+ for line in response:
186
+ if line.startswith("data:"):
187
+ chunk = line[5:].strip()
188
+ if chunk == "[DONE]":
189
+ break
190
+ try:
191
+ json_data = json.loads(chunk)
192
+ if (
193
+ json_data.get("choices")
194
+ and len(json_data["choices"]) > 0
195
+ and "delta" in json_data["choices"][0]
196
+ and "content" in json_data["choices"][0]["delta"]
197
+ ):
198
+ content = json_data["choices"][0]["delta"]["content"]
199
+ yield content
200
+ except JSONDecodeError as e:
201
+ continue
202
+ except Exception as e:
203
+ raise InvalidAPIResponseException(f"Unable to process streaming chat response: {e}")
204
+
205
+ def stream_response_generator(self, response) -> Generator[str, None, None]:
206
+ """
207
+ Processes a streaming response from the Responses API and yields content strings.
208
+
209
+ :param response: The streaming response from the API.
210
+ :return: Generator[str, None, None] - Yields content strings extracted from streaming chunks.
211
+ """
212
+ try:
213
+ for line in response:
214
+ if line.startswith("data:"):
215
+ chunk = line[5:].strip()
216
+ if chunk == "[DONE]":
217
+ break
218
+ try:
219
+ json_data = json.loads(chunk)
220
+ if (
221
+ json_data.get("choices")
222
+ and len(json_data["choices"]) > 0
223
+ and "delta" in json_data["choices"][0]
224
+ and "content" in json_data["choices"][0]["delta"]
225
+ ):
226
+ content = json_data["choices"][0]["delta"]["content"]
227
+ yield content
228
+ except JSONDecodeError as e:
229
+ continue
230
+ except Exception as e:
231
+ raise InvalidAPIResponseException(f"Unable to process streaming response: {e}")
232
+
233
+ def generate_image(
234
+ self,
235
+ model: str,
236
+ prompt: str,
237
+ n: int,
238
+ quality: str,
239
+ size: str,
240
+ aspect_ratio: Optional[str] = None
241
+ ) -> dict:
242
+ """
243
+ Generates an image based on the provided parameters.
244
+
245
+ :param model: str - The model specification for image generation, e.g., "openai/gpt-image-1". (Required)
246
+ :param prompt: str - Description of the desired image. (Required)
247
+ :param n: int - Number of images to generate (1-10, depending on the model). (Required)
248
+ :param quality: str - Rendering quality, e.g., "high". (Required)
249
+ :param size: str - Image dimensions, e.g., "1024x1024". (Required)
250
+ :param aspect_ratio: Optional[str] - Relationship between image's width and height, e.g., "1:1", "9:16", "16:9", "3:4", "4:3". (Optional)
251
+ :return: dict - The API response containing the generated image data.
252
+ :raises InvalidAPIResponseException: If the API response cannot be processed.
253
+ """
254
+ data = {
255
+ 'model': model,
256
+ 'prompt': prompt,
257
+ 'n': n,
258
+ 'quality': quality,
259
+ 'size': size
260
+ }
261
+
262
+ if aspect_ratio:
263
+ data['aspect_ratio'] = aspect_ratio
264
+
265
+ logger.debug(f"Generating image with data: {data}")
266
+
267
+ response = self.api_service.post(
268
+ endpoint=GENERATE_IMAGE_V1,
269
+ data=data
270
+ )
271
+
272
+ validate_status_code(response)
273
+
274
+ result = parse_json_response(response, "generate image")
275
+ logger.debug(f"Image generation result: {result}")
276
+ return result
277
+
278
+ def edit_image(
279
+ self,
280
+ model: str,
281
+ prompt: str,
282
+ image: str,
283
+ size: str,
284
+ n: int = 1,
285
+ quality: Optional[str] = None
286
+ ) -> dict:
287
+ """
288
+ Edits an existing image based on the provided parameters.
289
+
290
+ :param model: str - The model specification for image editing, e.g., "openai/gpt-image-1". (Required)
291
+ :param prompt: str - Description of the desired edit, e.g., "remove background people". (Required)
292
+ :param image: str - URL of the image to be edited, e.g., "https://example.com/image.jpg". (Required)
293
+ :param size: str - Desired dimensions of the output image in pixels, e.g., "1024x1024". (Required)
294
+ :param n: int - Number of edited images to generate (1-10, depending on the model). Default is 1. (Optional)
295
+ :param quality: Optional[str] - Rendering quality, e.g., "high", "medium", "low". (Optional)
296
+ :return: dict - The API response containing the edited image data.
297
+ :raises InvalidAPIResponseException: If the API response cannot be processed.
298
+ """
299
+ data = {
300
+ 'model': model,
301
+ 'prompt': prompt,
302
+ 'image': image,
303
+ 'size': size,
304
+ 'n': n
305
+ }
306
+
307
+ if quality:
308
+ data['quality'] = quality
309
+
310
+ logger.debug(f"Editing image with data: {data}")
311
+
312
+ response = self.api_service.post(
313
+ endpoint=EDIT_IMAGE_V1,
314
+ data=data
315
+ )
316
+
317
+ validate_status_code(response)
318
+
319
+ result = parse_json_response(response, "edit image")
320
+ logger.debug(f"Image editing result: {result}")
321
+ return result
322
+
323
+ def get_response(
324
+ self,
325
+ model: str,
326
+ input: str,
327
+ files: Optional[List[str]] = None,
328
+ tools: Optional[List[Dict]] = None,
329
+ tool_choice: Optional[Union[str, Dict]] = None,
330
+ temperature: Optional[float] = None,
331
+ max_output_tokens: Optional[int] = None,
332
+ top_p: Optional[float] = None,
333
+ metadata: Optional[Dict] = None,
334
+ user: Optional[str] = None,
335
+ instructions: Optional[str] = None,
336
+ reasoning: Optional[Dict] = None,
337
+ truncation: Optional[str] = None,
338
+ parallel_tool_calls: Optional[bool] = None,
339
+ store: Optional[bool] = None,
340
+ stream: bool = False
341
+ ) -> Union[dict, str, Generator[str, None, None]]:
342
+ """
343
+ Generates a response using the Responses API with support for images and PDF files.
344
+
345
+ :param model: str - The model specification, e.g., "openai/o1-pro". (Required)
346
+ :param input: str - The user input text. (Required)
347
+ :param files: Optional[List[str]] - List of file paths (images or PDFs) to include in the request. (Optional)
348
+ :param tools: Optional[List[Dict]] - A list of tools (e.g., functions) the model may call. (Optional)
349
+ :param tool_choice: Optional[Union[str, Dict]] - Controls which tool is called (e.g., "none", "auto", or specific tool). (Optional)
350
+ :param temperature: Optional[float] - Controls the randomness of the response. (Optional)
351
+ :param max_output_tokens: Optional[int] - The maximum number of tokens to generate in the response. (Optional)
352
+ :param top_p: Optional[float] - Nucleus sampling parameter. (Optional)
353
+ :param metadata: Optional[Dict] - Up to 16 key-value pairs to attach to the object. (Optional)
354
+ :param user: Optional[str] - A unique identifier for the end-user. (Optional)
355
+ :param instructions: Optional[str] - Additional instructions for the model. (Optional)
356
+ :param reasoning: Optional[Dict] - Reasoning configuration, e.g., {"effort": "medium"}. (Optional)
357
+ :param truncation: Optional[str] - Truncation strategy, e.g., "disabled". (Optional)
358
+ :param parallel_tool_calls: Optional[bool] - Whether to enable parallel tool calls. (Optional)
359
+ :param store: Optional[bool] - Whether to store the output. (Optional)
360
+ :param stream: bool - Whether the response should be streamed. Possible values:
361
+ - False: Returns the complete response as a dictionary or string (default).
362
+ - True: Returns a generator yielding content strings as they are received. (Optional)
363
+ :return: Union[dict, str, Generator[str, None, None]] - For non-streaming (stream=False), returns a dictionary containing the response
364
+ result or a string if JSON decoding fails. For streaming (stream=True), returns a generator yielding content strings extracted from the
365
+ streaming response chunks.
366
+ :raises InvalidAPIResponseException: If the API response cannot be processed.
367
+ """
368
+ data = {
369
+ 'model': model,
370
+ 'input': input,
371
+ 'stream': stream
372
+ }
373
+
374
+ if temperature is not None:
375
+ data['temperature'] = temperature
376
+
377
+ if max_output_tokens is not None:
378
+ data['max_output_tokens'] = max_output_tokens
379
+
380
+ if top_p is not None:
381
+ data['top_p'] = top_p
382
+
383
+ if tools is not None:
384
+ data['tools'] = tools
385
+
386
+ if tool_choice is not None:
387
+ data['tool_choice'] = tool_choice
388
+
389
+ if metadata is not None:
390
+ data['metadata'] = metadata
391
+
392
+ if user is not None:
393
+ data['user'] = user
394
+
395
+ if instructions is not None:
396
+ data['instructions'] = instructions
397
+
398
+ if reasoning is not None:
399
+ data['reasoning'] = reasoning
400
+
401
+ if truncation is not None:
402
+ data['truncation'] = truncation
403
+
404
+ if parallel_tool_calls is not None:
405
+ data['parallel_tool_calls'] = parallel_tool_calls
406
+
407
+ if store is not None:
408
+ data['store'] = store
409
+
410
+ logger.debug(f"Generating response with data: {data}")
411
+
412
+ if files:
413
+ if stream:
414
+ raise InvalidAPIResponseException("Streaming is not supported when uploading files")
415
+
416
+ file_handles = []
417
+ try:
418
+ files_dict = {}
419
+ for idx, file_path in enumerate(files):
420
+ path = Path(file_path)
421
+ if not path.is_file():
422
+ raise FileNotFoundError(f"File not found: {file_path}")
423
+
424
+ file_handle = path.open("rb")
425
+ file_handles.append(file_handle)
426
+ files_dict[f"file{idx}"] = file_handle
427
+
428
+ response = self.api_service.post_files_multipart(
429
+ endpoint=RESPONSES_V1,
430
+ data=data,
431
+ files=files_dict
432
+ )
433
+ finally:
434
+ for fh in file_handles:
435
+ fh.close()
436
+ else:
437
+ if stream:
438
+ response = self.api_service.stream_post(
439
+ endpoint=RESPONSES_V1,
440
+ data=data
441
+ )
442
+ return self.stream_response_generator(response)
443
+ else:
444
+ response = self.api_service.post(
445
+ endpoint=RESPONSES_V1,
446
+ data=data
447
+ )
448
+
449
+ validate_status_code(response)
450
+ result = parse_json_response(response, "get response")
451
+ logger.debug(f"Response result: {result}")
452
+
453
+ return result
pygeai/chat/endpoints.py CHANGED
@@ -1,2 +1,5 @@
1
1
  CHAT_V1 = "/chat" # POST Chat endpoint
2
2
  CHAT_COMPLETION_V1 = "/chat/completion" # POST Chat completion endpoint
3
+ GENERATE_IMAGE_V1 = "/images" # POST Generate image
4
+ EDIT_IMAGE_V1 = "/images/edits" # POST Edit image
5
+ RESPONSES_V1 = "/responses" # POST Responses API endpoint
pygeai/chat/iris.py CHANGED
@@ -1,11 +1,5 @@
1
1
  from pygeai.chat.clients import ChatClient
2
-
3
- llm_settings = {
4
- "temperature": 0.6,
5
- "max_tokens": 800,
6
- "frequency_penalty": 0.1,
7
- "presence_penalty": 0.2
8
- }
2
+ from pygeai.chat.settings import LLM_SETTINGS
9
3
 
10
4
 
11
5
  class Iris:
@@ -17,7 +11,7 @@ class Iris:
17
11
  model="saia:agent:com.globant.iris",
18
12
  messages=messages,
19
13
  stream=True,
20
- **llm_settings
14
+ **LLM_SETTINGS
21
15
  )
22
16
  return result
23
17
 
pygeai/chat/managers.py CHANGED
@@ -1,3 +1,5 @@
1
+ from pygeai import logger
2
+ from pygeai.core.common.exceptions import APIError
1
3
  from pygeai.core.handlers import ErrorHandler
2
4
  from pygeai.core.models import ChatMessageList, \
3
5
  ChatVariableList, LlmSettings, ChatToolList, ToolChoice
@@ -8,7 +10,7 @@ from pygeai.core.responses import ChatResponse, ProviderResponse
8
10
 
9
11
  class ChatManager:
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.__chat_client = ChatClient(api_key, base_url, alias)
13
15
 
14
16
  def chat_completion(
@@ -36,8 +38,8 @@ class ChatManager:
36
38
  :param variables: ChatVariableList, optional - Additional variables to include in the request.
37
39
  :param tool_choice: ToolChoice, optional - Indicates which tool to call.
38
40
  :param tools: ChatToolList, optional - Additional tools the model may call
39
- :return: ProviderResponse - The structured chat response if successful,
40
- or an error list if an issue occurs.
41
+ :return: ProviderResponse - The structured chat response.
42
+ :raises APIError: If the API returns errors.
41
43
  """
42
44
  response_data = self.__chat_client.chat_completion(
43
45
  model=model,
@@ -54,8 +56,9 @@ class ChatManager:
54
56
  )
55
57
 
56
58
  if ErrorHandler.has_errors(response_data):
57
- result = ErrorHandler.extract_error(response_data)
58
- else:
59
- result = AssistantResponseMapper.map_to_provider_response(response_data)
59
+ error = ErrorHandler.extract_error(response_data)
60
+ logger.error(f"Error received while chatting while sending chat request: {error}")
61
+ raise APIError(f"Error received while chatting while sending chat request: {error}")
60
62
 
63
+ result = AssistantResponseMapper.map_to_provider_response(response_data)
61
64
  return result
pygeai/chat/session.py ADDED
@@ -0,0 +1,38 @@
1
+ from pygeai import logger
2
+ from pygeai.chat.clients import ChatClient
3
+
4
+ from pygeai.chat.settings import LLM_SETTINGS
5
+ from pygeai.core.common.exceptions import InvalidAPIResponseException
6
+
7
+
8
+ class AgentChatSession:
9
+
10
+ def __init__(self, agent_name: str):
11
+ self.client = ChatClient()
12
+ self.agent_name = agent_name
13
+
14
+ def stream_answer(self, messages):
15
+ result = self.client.chat_completion(
16
+ model=f"saia:agent:{self.agent_name}",
17
+ messages=messages,
18
+ stream=True,
19
+ **LLM_SETTINGS
20
+ )
21
+ return result
22
+
23
+ def get_answer(self, messages):
24
+ answer = ""
25
+ try:
26
+ result = self.client.chat_completion(
27
+ model=f"saia:agent:{self.agent_name}",
28
+ messages=messages,
29
+ stream=False,
30
+ **LLM_SETTINGS
31
+ )
32
+ answer = result['choices'][0]['message']['content']
33
+ except Exception as e:
34
+ logger.error(f"Unable to communicate with specified agent {self.agent_name}: {e}")
35
+ raise InvalidAPIResponseException(f"Unable to communicate with specified agent {self.agent_name}: {e}")
36
+
37
+ return answer
38
+
@@ -0,0 +1,6 @@
1
+ LLM_SETTINGS = {
2
+ "temperature": 0.6,
3
+ "max_tokens": 800,
4
+ "frequency_penalty": 0.1,
5
+ "presence_penalty": 0.2
6
+ }