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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (788) hide show
  1. pygeai/__init__.py +11 -2
  2. pygeai/_docs/Makefile +20 -0
  3. pygeai/_docs/make.bat +35 -0
  4. pygeai/_docs/source/conf.py +117 -0
  5. pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
  6. pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
  7. pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
  8. pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
  9. pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
  10. pygeai/_docs/source/content/ai_lab.rst +102 -0
  11. pygeai/_docs/source/content/analytics.rst +598 -0
  12. pygeai/_docs/source/content/api_reference/admin.rst +161 -0
  13. pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
  14. pygeai/_docs/source/content/api_reference/auth.rst +379 -0
  15. pygeai/_docs/source/content/api_reference/chat.rst +754 -0
  16. pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
  17. pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
  18. pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
  19. pygeai/_docs/source/content/api_reference/files.rst +592 -0
  20. pygeai/_docs/source/content/api_reference/gam.rst +401 -0
  21. pygeai/_docs/source/content/api_reference/health.rst +58 -0
  22. pygeai/_docs/source/content/api_reference/project.rst +738 -0
  23. pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
  24. pygeai/_docs/source/content/api_reference/rag.rst +710 -0
  25. pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
  26. pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
  27. pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
  28. pygeai/_docs/source/content/api_reference.rst +58 -0
  29. pygeai/_docs/source/content/authentication.rst +295 -0
  30. pygeai/_docs/source/content/chat_gui.rst +121 -0
  31. pygeai/_docs/source/content/cli.rst +203 -0
  32. pygeai/_docs/source/content/debugger.rst +651 -0
  33. pygeai/_docs/source/content/intro.rst +67 -0
  34. pygeai/_docs/source/content/migration.rst +929 -0
  35. pygeai/_docs/source/content/modules.rst +7 -0
  36. pygeai/_docs/source/content/quickstart.rst +143 -0
  37. pygeai/_docs/source/content/samples.rst +394 -0
  38. pygeai/_docs/source/index.rst +75 -0
  39. pygeai/_docs/source/modules.rst +7 -0
  40. pygeai/_docs/source/pygeai.admin.rst +29 -0
  41. pygeai/_docs/source/pygeai.analytics.rst +53 -0
  42. pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
  43. pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
  44. pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
  45. pygeai/_docs/source/pygeai.assistant.rst +55 -0
  46. pygeai/_docs/source/pygeai.auth.rst +29 -0
  47. pygeai/_docs/source/pygeai.chat.rst +69 -0
  48. pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
  49. pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
  50. pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
  51. pygeai/_docs/source/pygeai.cli.rst +62 -0
  52. pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
  53. pygeai/_docs/source/pygeai.core.base.rst +53 -0
  54. pygeai/_docs/source/pygeai.core.common.rst +37 -0
  55. pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
  56. pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
  57. pygeai/_docs/source/pygeai.core.files.rst +61 -0
  58. pygeai/_docs/source/pygeai.core.llm.rst +29 -0
  59. pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
  60. pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
  61. pygeai/_docs/source/pygeai.core.rst +63 -0
  62. pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
  63. pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
  64. pygeai/_docs/source/pygeai.core.services.rst +37 -0
  65. pygeai/_docs/source/pygeai.core.utils.rst +37 -0
  66. pygeai/_docs/source/pygeai.dbg.rst +21 -0
  67. pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
  68. pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
  69. pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
  70. pygeai/_docs/source/pygeai.evaluation.rst +31 -0
  71. pygeai/_docs/source/pygeai.flows.rst +29 -0
  72. pygeai/_docs/source/pygeai.gam.rst +29 -0
  73. pygeai/_docs/source/pygeai.health.rst +29 -0
  74. pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
  75. pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
  76. pygeai/_docs/source/pygeai.lab.rst +65 -0
  77. pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
  78. pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
  79. pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
  80. pygeai/_docs/source/pygeai.man.man1.rst +10 -0
  81. pygeai/_docs/source/pygeai.man.rst +18 -0
  82. pygeai/_docs/source/pygeai.migration.rst +29 -0
  83. pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
  84. pygeai/_docs/source/pygeai.organization.rst +61 -0
  85. pygeai/_docs/source/pygeai.proxy.rst +53 -0
  86. pygeai/_docs/source/pygeai.rst +35 -0
  87. pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
  88. pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
  89. pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
  90. pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
  91. pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
  92. pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
  93. pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
  94. pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
  95. pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
  96. pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
  97. pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
  98. pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
  99. pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
  100. pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
  101. pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
  102. pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
  103. pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
  104. pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
  105. pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
  106. pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
  107. pygeai/_docs/source/pygeai.tests.core.rst +39 -0
  108. pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
  109. pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
  110. pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
  111. pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
  112. pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
  113. pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
  114. pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
  115. pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
  116. pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
  117. pygeai/_docs/source/pygeai.tests.health.rst +21 -0
  118. pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
  119. pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
  120. pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
  121. pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
  122. pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
  123. pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
  124. pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
  125. pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
  126. pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
  127. pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
  128. pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
  129. pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
  130. pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
  131. pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
  132. pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
  133. pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
  134. pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
  135. pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
  136. pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
  137. pygeai/_docs/source/pygeai.tests.rst +33 -0
  138. pygeai/admin/clients.py +14 -11
  139. pygeai/admin/endpoints.py +2 -2
  140. pygeai/analytics/clients.py +505 -0
  141. pygeai/analytics/endpoints.py +35 -0
  142. pygeai/analytics/managers.py +606 -0
  143. pygeai/analytics/mappers.py +207 -0
  144. pygeai/analytics/responses.py +240 -0
  145. pygeai/assistant/clients.py +48 -57
  146. pygeai/assistant/data/__init__.py +0 -0
  147. pygeai/assistant/data/clients.py +15 -0
  148. pygeai/assistant/data_analyst/__init__.py +0 -0
  149. pygeai/assistant/data_analyst/clients.py +75 -0
  150. pygeai/assistant/data_analyst/endpoints.py +2 -0
  151. pygeai/assistant/endpoints.py +0 -2
  152. pygeai/assistant/managers.py +738 -0
  153. pygeai/assistant/mappers.py +153 -0
  154. pygeai/assistant/rag/clients.py +132 -21
  155. pygeai/assistant/rag/mappers.py +228 -0
  156. pygeai/assistant/rag/models.py +396 -0
  157. pygeai/assistant/rag/responses.py +10 -0
  158. pygeai/auth/__init__.py +0 -0
  159. pygeai/auth/clients.py +129 -0
  160. pygeai/auth/endpoints.py +6 -0
  161. pygeai/chat/clients.py +406 -31
  162. pygeai/chat/endpoints.py +3 -0
  163. pygeai/chat/iris.py +17 -0
  164. pygeai/chat/managers.py +64 -0
  165. pygeai/chat/session.py +38 -0
  166. pygeai/chat/settings.py +6 -0
  167. pygeai/chat/ui.py +678 -0
  168. pygeai/cli/__init__.py +0 -1
  169. pygeai/cli/commands/admin.py +9 -12
  170. pygeai/cli/commands/analytics.py +533 -0
  171. pygeai/cli/commands/assistant.py +11 -11
  172. pygeai/cli/commands/auth.py +299 -0
  173. pygeai/cli/commands/base.py +201 -7
  174. pygeai/cli/commands/chat.py +875 -14
  175. pygeai/cli/commands/common.py +30 -26
  176. pygeai/cli/commands/configuration.py +84 -9
  177. pygeai/cli/commands/docs.py +105 -0
  178. pygeai/cli/commands/embeddings.py +187 -0
  179. pygeai/cli/commands/evaluation.py +2069 -0
  180. pygeai/cli/commands/feedback.py +93 -0
  181. pygeai/cli/commands/files.py +312 -0
  182. pygeai/cli/commands/flows/__init__.py +0 -0
  183. pygeai/cli/commands/gam.py +349 -0
  184. pygeai/cli/commands/lab/__init__.py +0 -0
  185. pygeai/cli/commands/lab/ai_lab.py +4110 -0
  186. pygeai/cli/commands/lab/common.py +135 -0
  187. pygeai/cli/commands/lab/options.py +8 -0
  188. pygeai/cli/commands/lab/spec.py +273 -0
  189. pygeai/cli/commands/lab/utils.py +13 -0
  190. pygeai/cli/commands/llm.py +164 -0
  191. pygeai/cli/commands/migrate.py +1198 -0
  192. pygeai/cli/commands/options.py +86 -0
  193. pygeai/cli/commands/organization.py +560 -98
  194. pygeai/cli/commands/rag.py +306 -10
  195. pygeai/cli/commands/rerank.py +108 -0
  196. pygeai/cli/commands/secrets.py +357 -0
  197. pygeai/cli/commands/usage_limits.py +583 -0
  198. pygeai/cli/commands/validators.py +209 -0
  199. pygeai/cli/commands/version.py +44 -0
  200. pygeai/cli/error_handler.py +151 -0
  201. pygeai/cli/geai.py +171 -30
  202. pygeai/cli/geai_proxy.py +318 -0
  203. pygeai/cli/install_man.py +107 -0
  204. pygeai/cli/parsers.py +78 -25
  205. pygeai/cli/texts/help.py +712 -55
  206. pygeai/core/__init__.py +9 -1
  207. pygeai/core/base/clients.py +61 -10
  208. pygeai/core/base/mappers.py +208 -30
  209. pygeai/core/base/models.py +8 -308
  210. pygeai/core/base/responses.py +18 -1
  211. pygeai/core/base/session.py +110 -17
  212. pygeai/core/common/config.py +98 -16
  213. pygeai/core/common/decorators.py +44 -0
  214. pygeai/core/common/exceptions.py +104 -4
  215. pygeai/core/embeddings/__init__.py +19 -0
  216. pygeai/core/embeddings/clients.py +93 -0
  217. pygeai/core/embeddings/endpoints.py +1 -0
  218. pygeai/core/embeddings/managers.py +62 -0
  219. pygeai/core/embeddings/mappers.py +52 -0
  220. pygeai/core/embeddings/models.py +14 -0
  221. pygeai/core/embeddings/responses.py +31 -0
  222. pygeai/core/feedback/__init__.py +0 -0
  223. pygeai/core/feedback/clients.py +50 -0
  224. pygeai/core/feedback/endpoints.py +1 -0
  225. pygeai/core/feedback/models.py +10 -0
  226. pygeai/core/files/__init__.py +0 -0
  227. pygeai/core/files/clients.py +156 -0
  228. pygeai/core/files/endpoints.py +5 -0
  229. pygeai/core/files/managers.py +224 -0
  230. pygeai/core/files/mappers.py +44 -0
  231. pygeai/core/files/models.py +24 -0
  232. pygeai/core/files/responses.py +19 -0
  233. pygeai/core/handlers.py +32 -0
  234. pygeai/core/llm/__init__.py +0 -0
  235. pygeai/core/llm/clients.py +53 -0
  236. pygeai/core/llm/endpoints.py +4 -0
  237. pygeai/core/models.py +799 -0
  238. pygeai/core/plugins/__init__.py +0 -0
  239. pygeai/core/plugins/clients.py +32 -0
  240. pygeai/core/plugins/endpoints.py +1 -0
  241. pygeai/core/plugins/models.py +86 -0
  242. pygeai/core/rerank/__init__.py +0 -0
  243. pygeai/core/rerank/clients.py +35 -0
  244. pygeai/core/rerank/endpoints.py +1 -0
  245. pygeai/core/rerank/managers.py +47 -0
  246. pygeai/core/rerank/mappers.py +23 -0
  247. pygeai/core/rerank/models.py +27 -0
  248. pygeai/core/responses.py +104 -0
  249. pygeai/core/secrets/__init__.py +0 -0
  250. pygeai/core/secrets/clients.py +212 -0
  251. pygeai/core/secrets/endpoints.py +7 -0
  252. pygeai/core/services/llm/__init__.py +0 -0
  253. pygeai/core/services/llm/model.py +186 -0
  254. pygeai/core/services/llm/providers.py +15 -0
  255. pygeai/core/services/response.py +18 -0
  256. pygeai/core/services/rest.py +311 -89
  257. pygeai/core/utils/__init__.py +0 -0
  258. pygeai/core/utils/console.py +83 -0
  259. pygeai/core/utils/parsers.py +32 -0
  260. pygeai/core/utils/validators.py +10 -0
  261. pygeai/dbg/__init__.py +3 -0
  262. pygeai/dbg/debugger.py +870 -0
  263. pygeai/evaluation/__init__.py +0 -0
  264. pygeai/evaluation/clients.py +19 -0
  265. pygeai/evaluation/dataset/__init__.py +0 -0
  266. pygeai/evaluation/dataset/clients.py +514 -0
  267. pygeai/evaluation/dataset/endpoints.py +26 -0
  268. pygeai/evaluation/plan/__init__.py +0 -0
  269. pygeai/evaluation/plan/clients.py +302 -0
  270. pygeai/evaluation/plan/endpoints.py +16 -0
  271. pygeai/evaluation/result/__init__.py +0 -0
  272. pygeai/evaluation/result/clients.py +70 -0
  273. pygeai/evaluation/result/endpoints.py +2 -0
  274. pygeai/flows/__init__.py +0 -0
  275. pygeai/flows/endpoints.py +362 -0
  276. pygeai/flows/models.py +1304 -0
  277. pygeai/gam/__init__.py +0 -0
  278. pygeai/gam/clients.py +178 -0
  279. pygeai/gam/endpoints.py +4 -0
  280. pygeai/health/__init__.py +0 -0
  281. pygeai/health/clients.py +24 -0
  282. pygeai/health/endpoints.py +1 -0
  283. pygeai/lab/__init__.py +0 -0
  284. pygeai/lab/agents/__init__.py +0 -0
  285. pygeai/lab/agents/clients.py +426 -0
  286. pygeai/lab/agents/endpoints.py +12 -0
  287. pygeai/lab/agents/mappers.py +319 -0
  288. pygeai/lab/clients.py +24 -0
  289. pygeai/lab/constants.py +3 -0
  290. pygeai/lab/managers.py +1558 -0
  291. pygeai/lab/models.py +1719 -0
  292. pygeai/lab/processes/__init__.py +0 -0
  293. pygeai/lab/processes/clients.py +1051 -0
  294. pygeai/lab/processes/endpoints.py +26 -0
  295. pygeai/lab/processes/mappers.py +395 -0
  296. pygeai/lab/runners.py +90 -0
  297. pygeai/lab/spec/__init__.py +0 -0
  298. pygeai/lab/spec/loader.py +24 -0
  299. pygeai/lab/spec/parsers.py +39 -0
  300. pygeai/lab/strategies/__init__.py +0 -0
  301. pygeai/lab/strategies/clients.py +212 -0
  302. pygeai/lab/strategies/endpoints.py +5 -0
  303. pygeai/lab/strategies/mappers.py +58 -0
  304. pygeai/lab/tools/__init__.py +0 -0
  305. pygeai/lab/tools/clients.py +465 -0
  306. pygeai/lab/tools/endpoints.py +13 -0
  307. pygeai/lab/tools/mappers.py +131 -0
  308. pygeai/man/__init__.py +1 -0
  309. pygeai/man/man1/__init__.py +1 -0
  310. pygeai/man/man1/geai-proxy.1 +246 -0
  311. pygeai/man/man1/geai.1 +2615 -0
  312. pygeai/migration/__init__.py +33 -0
  313. pygeai/migration/strategies.py +603 -0
  314. pygeai/migration/tools.py +180 -0
  315. pygeai/organization/clients.py +246 -18
  316. pygeai/organization/endpoints.py +17 -8
  317. pygeai/organization/limits/__init__.py +0 -0
  318. pygeai/organization/limits/clients.py +281 -0
  319. pygeai/organization/limits/endpoints.py +15 -0
  320. pygeai/organization/limits/managers.py +331 -0
  321. pygeai/organization/limits/mappers.py +21 -0
  322. pygeai/organization/managers.py +537 -0
  323. pygeai/organization/mappers.py +111 -46
  324. pygeai/organization/responses.py +61 -11
  325. pygeai/proxy/__init__.py +0 -0
  326. pygeai/proxy/clients.py +216 -0
  327. pygeai/proxy/config.py +128 -0
  328. pygeai/proxy/managers.py +232 -0
  329. pygeai/proxy/servers.py +304 -0
  330. pygeai/proxy/tool.py +69 -0
  331. pygeai/tests/admin/__init__.py +0 -0
  332. pygeai/tests/admin/test_clients.py +148 -0
  333. pygeai/tests/analytics/__init__.py +0 -0
  334. pygeai/tests/analytics/test_clients.py +86 -0
  335. pygeai/tests/analytics/test_managers.py +94 -0
  336. pygeai/tests/analytics/test_mappers.py +84 -0
  337. pygeai/tests/analytics/test_responses.py +73 -0
  338. pygeai/tests/assistants/rag/__init__.py +0 -0
  339. pygeai/tests/assistants/rag/test_clients.py +346 -0
  340. pygeai/tests/assistants/rag/test_mappers.py +189 -0
  341. pygeai/tests/assistants/rag/test_models.py +292 -0
  342. pygeai/tests/assistants/test_clients.py +176 -80
  343. pygeai/tests/assistants/test_managers.py +198 -0
  344. pygeai/tests/assistants/test_mappers.py +111 -0
  345. pygeai/tests/auth/__init__.py +0 -0
  346. pygeai/tests/auth/test_clients.py +289 -0
  347. pygeai/tests/auth/test_oauth.py +172 -0
  348. pygeai/tests/auth/test_session_logging.py +150 -0
  349. pygeai/tests/chat/__init__.py +0 -0
  350. pygeai/tests/chat/test_clients.py +393 -0
  351. pygeai/tests/chat/test_iris.py +38 -0
  352. pygeai/tests/chat/test_session.py +62 -0
  353. pygeai/tests/chat/test_ui.py +224 -0
  354. pygeai/tests/cli/__init__.py +0 -0
  355. pygeai/tests/cli/commands/__init__.py +0 -0
  356. pygeai/tests/cli/commands/lab/__init__.py +0 -0
  357. pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
  358. pygeai/tests/cli/commands/lab/test_common.py +208 -0
  359. pygeai/tests/cli/commands/lab/test_spec.py +246 -0
  360. pygeai/tests/cli/commands/test_assistant.py +202 -0
  361. pygeai/tests/cli/commands/test_chat.py +130 -0
  362. pygeai/tests/cli/commands/test_common.py +350 -0
  363. pygeai/tests/cli/commands/test_embeddings.py +132 -0
  364. pygeai/tests/cli/commands/test_evaluation.py +656 -0
  365. pygeai/tests/cli/commands/test_feedback.py +65 -0
  366. pygeai/tests/cli/commands/test_files.py +161 -0
  367. pygeai/tests/cli/commands/test_gam.py +201 -0
  368. pygeai/tests/cli/commands/test_llm.py +114 -0
  369. pygeai/tests/cli/commands/test_migrate.py +176 -0
  370. pygeai/tests/cli/commands/test_organization.py +276 -0
  371. pygeai/tests/cli/commands/test_rag.py +266 -0
  372. pygeai/tests/cli/commands/test_rerank.py +110 -0
  373. pygeai/tests/cli/commands/test_secrets.py +171 -0
  374. pygeai/tests/cli/commands/test_show_help.py +41 -0
  375. pygeai/tests/cli/commands/test_usage_limits.py +412 -0
  376. pygeai/tests/cli/commands/test_validators.py +160 -0
  377. pygeai/tests/cli/commands/test_version.py +81 -0
  378. pygeai/tests/cli/docker/__init__.py +0 -0
  379. pygeai/tests/cli/test_credentials_flag.py +316 -0
  380. pygeai/tests/cli/test_error_handler.py +225 -0
  381. pygeai/tests/cli/test_geai_driver.py +154 -0
  382. pygeai/tests/cli/test_parsers.py +154 -0
  383. pygeai/tests/core/base/__init__.py +0 -0
  384. pygeai/tests/core/base/data/__init__.py +0 -0
  385. pygeai/tests/core/base/data/mappers.py +117 -0
  386. pygeai/tests/core/base/data/models.py +312 -0
  387. pygeai/tests/core/base/test_mappers.py +569 -0
  388. pygeai/tests/core/base/test_models.py +261 -0
  389. pygeai/tests/core/base/test_responses.py +53 -0
  390. pygeai/tests/core/common/__init__.py +0 -0
  391. pygeai/tests/core/common/data/__init__.py +0 -0
  392. pygeai/tests/core/common/test_config.py +186 -0
  393. pygeai/tests/core/common/test_decorators.py +69 -0
  394. pygeai/tests/core/embeddings/__init__.py +0 -0
  395. pygeai/tests/core/embeddings/test_clients.py +225 -0
  396. pygeai/tests/core/embeddings/test_managers.py +171 -0
  397. pygeai/tests/core/embeddings/test_mappers.py +142 -0
  398. pygeai/tests/core/feedback/__init__.py +0 -0
  399. pygeai/tests/core/feedback/test_clients.py +64 -0
  400. pygeai/tests/core/files/__init__.py +0 -0
  401. pygeai/tests/core/files/test_clients.py +128 -0
  402. pygeai/tests/core/files/test_managers.py +219 -0
  403. pygeai/tests/core/files/test_mappers.py +137 -0
  404. pygeai/tests/core/files/test_models.py +103 -0
  405. pygeai/tests/core/files/test_responses.py +122 -0
  406. pygeai/tests/core/llm/__init__.py +0 -0
  407. pygeai/tests/core/llm/test_clients.py +142 -0
  408. pygeai/tests/core/plugins/__init__.py +0 -0
  409. pygeai/tests/core/plugins/test_clients.py +66 -0
  410. pygeai/tests/core/rerank/__init__.py +0 -0
  411. pygeai/tests/core/rerank/test_clients.py +76 -0
  412. pygeai/tests/core/rerank/test_managers.py +99 -0
  413. pygeai/tests/core/rerank/test_mappers.py +54 -0
  414. pygeai/tests/core/secrets/__init__.py +0 -0
  415. pygeai/tests/core/secrets/test_clients.py +264 -0
  416. pygeai/tests/core/services/__init__.py +0 -0
  417. pygeai/tests/core/services/test_rest.py +273 -0
  418. pygeai/tests/core/test_handlers.py +66 -0
  419. pygeai/tests/core/utils/__init__.py +0 -0
  420. pygeai/tests/core/utils/test_console.py +80 -0
  421. pygeai/tests/dbg/__init__.py +0 -0
  422. pygeai/tests/dbg/test_debugger.py +591 -0
  423. pygeai/tests/evaluation/__init__.py +0 -0
  424. pygeai/tests/evaluation/dataset/__init__.py +0 -0
  425. pygeai/tests/evaluation/dataset/test_clients.py +265 -0
  426. pygeai/tests/evaluation/plan/__init__.py +0 -0
  427. pygeai/tests/evaluation/plan/test_clients.py +195 -0
  428. pygeai/tests/evaluation/result/__init__.py +0 -0
  429. pygeai/tests/evaluation/result/test_clients.py +66 -0
  430. pygeai/tests/gam/__init__.py +0 -0
  431. pygeai/tests/gam/test_clients.py +195 -0
  432. pygeai/tests/health/__init__.py +0 -0
  433. pygeai/tests/health/test_clients.py +41 -0
  434. pygeai/tests/integration/__init__.py +0 -0
  435. pygeai/tests/integration/assistants/__init__.py +0 -0
  436. pygeai/tests/integration/assistants/rag/__init__.py +0 -0
  437. pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
  438. pygeai/tests/integration/chat/__init__.py +0 -0
  439. pygeai/tests/integration/chat/test_generate_image.py +158 -0
  440. pygeai/tests/integration/lab/__init__.py +0 -0
  441. pygeai/tests/integration/lab/agents/__init__.py +0 -0
  442. pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
  443. pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
  444. pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
  445. pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
  446. pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
  447. pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
  448. pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
  449. pygeai/tests/integration/lab/processes/__init__.py +0 -0
  450. pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
  451. pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
  452. pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
  453. pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
  454. pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
  455. pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
  456. pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
  457. pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
  458. pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
  459. pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
  460. pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
  461. pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
  462. pygeai/tests/integration/lab/tools/__init__.py +0 -0
  463. pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
  464. pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
  465. pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
  466. pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
  467. pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
  468. pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
  469. pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
  470. pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
  471. pygeai/tests/lab/__init__.py +0 -0
  472. pygeai/tests/lab/agents/__init__.py +0 -0
  473. pygeai/tests/lab/agents/test_clients.py +481 -0
  474. pygeai/tests/lab/agents/test_mappers.py +440 -0
  475. pygeai/tests/lab/processes/__init__.py +0 -0
  476. pygeai/tests/lab/processes/test_clients.py +1416 -0
  477. pygeai/tests/lab/processes/test_mappers.py +1092 -0
  478. pygeai/tests/lab/spec/__init__.py +0 -0
  479. pygeai/tests/lab/spec/test_loader.py +59 -0
  480. pygeai/tests/lab/spec/test_parsers.py +182 -0
  481. pygeai/tests/lab/strategies/__init__.py +0 -0
  482. pygeai/tests/lab/strategies/test_clients.py +241 -0
  483. pygeai/tests/lab/strategies/test_mappers.py +132 -0
  484. pygeai/tests/lab/test_managers.py +553 -0
  485. pygeai/tests/lab/test_mappers.py +245 -0
  486. pygeai/tests/lab/test_models.py +1154 -0
  487. pygeai/tests/lab/tools/__init__.py +0 -0
  488. pygeai/tests/lab/tools/test_clients.py +521 -0
  489. pygeai/tests/lab/tools/test_mappers.py +198 -0
  490. pygeai/tests/migration/__init__.py +0 -0
  491. pygeai/tests/migration/test_strategies.py +405 -0
  492. pygeai/tests/migration/test_tools.py +159 -0
  493. pygeai/tests/organization/limits/__init__.py +0 -0
  494. pygeai/tests/organization/limits/test_clients.py +567 -0
  495. pygeai/tests/organization/limits/test_managers.py +402 -0
  496. pygeai/tests/organization/test_clients.py +615 -64
  497. pygeai/tests/organization/test_managers.py +424 -0
  498. pygeai/tests/organization/test_mappers.py +153 -0
  499. pygeai/tests/organization/test_responses.py +137 -0
  500. pygeai/tests/proxy/__init__.py +1 -0
  501. pygeai/tests/proxy/test_clients.py +397 -0
  502. pygeai/tests/proxy/test_config.py +171 -0
  503. pygeai/tests/proxy/test_integration.py +305 -0
  504. pygeai/tests/proxy/test_managers.py +312 -0
  505. pygeai/tests/proxy/test_servers.py +387 -0
  506. pygeai/tests/proxy/test_tool.py +176 -0
  507. pygeai/tests/snippets/__init__.py +0 -0
  508. pygeai/tests/snippets/analytics/__init__.py +0 -0
  509. pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
  510. pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
  511. pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
  512. pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
  513. pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
  514. pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
  515. pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
  516. pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
  517. pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
  518. pygeai/tests/snippets/assistants/__init__.py +0 -0
  519. pygeai/tests/snippets/assistants/create_chat_assistant.py +54 -0
  520. pygeai/tests/snippets/assistants/create_text_assistant.py +51 -0
  521. pygeai/tests/snippets/assistants/data_analyst/__init__.py +0 -0
  522. pygeai/tests/snippets/assistants/data_analyst/extend_and_check.py +100 -0
  523. pygeai/tests/snippets/assistants/data_analyst/extend_dataset.py +9 -0
  524. pygeai/tests/snippets/assistants/data_analyst/get_status.py +9 -0
  525. pygeai/tests/snippets/assistants/file_summarizer_assistant.py +149 -0
  526. pygeai/tests/snippets/assistants/get_assistant_data.py +8 -0
  527. pygeai/tests/snippets/assistants/get_assistant_list.py +7 -0
  528. pygeai/tests/snippets/assistants/rag/__init__.py +0 -0
  529. pygeai/tests/snippets/assistants/rag/create_rag_assistant.py +65 -0
  530. pygeai/tests/snippets/assistants/rag/delete_al_documents.py +7 -0
  531. pygeai/tests/snippets/assistants/rag/delete_document.py +10 -0
  532. pygeai/tests/snippets/assistants/rag/delete_rag_assistant.py +8 -0
  533. pygeai/tests/snippets/assistants/rag/get_document.py +10 -0
  534. pygeai/tests/snippets/assistants/rag/get_documents.py +7 -0
  535. pygeai/tests/snippets/assistants/rag/get_rag_assistant_data.py +8 -0
  536. pygeai/tests/snippets/assistants/rag/update_rag_assistant.py +48 -0
  537. pygeai/tests/snippets/assistants/rag/upload_document.py +19 -0
  538. pygeai/tests/snippets/assistants/send_feedback.py +14 -0
  539. pygeai/tests/snippets/assistants/update_chat_assistant.py +63 -0
  540. pygeai/tests/snippets/auth/__init__.py +0 -0
  541. pygeai/tests/snippets/chat/__init__.py +0 -0
  542. pygeai/tests/snippets/chat/cancel_request.py +7 -0
  543. pygeai/tests/snippets/chat/chat_completion.py +28 -0
  544. pygeai/tests/snippets/chat/chat_completion_1.py +40 -0
  545. pygeai/tests/snippets/chat/chat_completion_2.py +60 -0
  546. pygeai/tests/snippets/chat/chat_completion_3.py +27 -0
  547. pygeai/tests/snippets/chat/chat_completion_4.py +67 -0
  548. pygeai/tests/snippets/chat/chat_completion_streaming.py +63 -0
  549. pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
  550. pygeai/tests/snippets/chat/get_request_status.py +7 -0
  551. pygeai/tests/snippets/chat/get_response.py +15 -0
  552. pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
  553. pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
  554. pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
  555. pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
  556. pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
  557. pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
  558. pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
  559. pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
  560. pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
  561. pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
  562. pygeai/tests/snippets/chat/send_chat_request.py +33 -0
  563. pygeai/tests/snippets/dbg/__init__.py +0 -0
  564. pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
  565. pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
  566. pygeai/tests/snippets/dbg/file_debugging.py +72 -0
  567. pygeai/tests/snippets/dbg/module_debugging.py +61 -0
  568. pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
  569. pygeai/tests/snippets/dbg/stepping_example.py +40 -0
  570. pygeai/tests/snippets/embeddings/__init__.py +0 -0
  571. pygeai/tests/snippets/embeddings/cache_example.py +31 -0
  572. pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
  573. pygeai/tests/snippets/embeddings/generate_embeddings.py +26 -0
  574. pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
  575. pygeai/tests/snippets/embeddings/openai_example.py +30 -0
  576. pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
  577. pygeai/tests/snippets/evaluation/__init__.py +0 -0
  578. pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
  579. pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
  580. pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
  581. pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
  582. pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
  583. pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
  584. pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
  585. pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
  586. pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
  587. pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
  588. pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
  589. pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
  590. pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
  591. pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
  592. pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
  593. pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
  594. pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
  595. pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
  596. pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
  597. pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
  598. pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
  599. pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
  600. pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
  601. pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
  602. pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
  603. pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
  604. pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
  605. pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
  606. pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
  607. pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
  608. pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
  609. pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
  610. pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
  611. pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
  612. pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
  613. pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
  614. pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
  615. pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
  616. pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
  617. pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
  618. pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
  619. pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
  620. pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
  621. pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
  622. pygeai/tests/snippets/files/__init__.py +0 -0
  623. pygeai/tests/snippets/files/delete_file.py +9 -0
  624. pygeai/tests/snippets/files/get_file_content.py +10 -0
  625. pygeai/tests/snippets/files/get_file_data.py +9 -0
  626. pygeai/tests/snippets/files/get_file_list.py +6 -0
  627. pygeai/tests/snippets/files/upload_file.py +13 -0
  628. pygeai/tests/snippets/gam/__init__.py +0 -0
  629. pygeai/tests/snippets/gam/gam_access_token.py +87 -0
  630. pygeai/tests/snippets/lab/__init__.py +0 -0
  631. pygeai/tests/snippets/lab/agentic_flow_example_1.py +326 -0
  632. pygeai/tests/snippets/lab/agentic_flow_example_2.py +206 -0
  633. pygeai/tests/snippets/lab/agentic_flow_example_3.py +486 -0
  634. pygeai/tests/snippets/lab/agentic_flow_example_4.py +446 -0
  635. pygeai/tests/snippets/lab/agents/__init__.py +0 -0
  636. pygeai/tests/snippets/lab/agents/create_agent.py +48 -0
  637. pygeai/tests/snippets/lab/agents/create_agent_2.py +48 -0
  638. pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
  639. pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
  640. pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
  641. pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
  642. pygeai/tests/snippets/lab/agents/delete_agent.py +12 -0
  643. pygeai/tests/snippets/lab/agents/get_agent.py +24 -0
  644. pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
  645. pygeai/tests/snippets/lab/agents/get_sharing_link.py +13 -0
  646. pygeai/tests/snippets/lab/agents/list_agents.py +18 -0
  647. pygeai/tests/snippets/lab/agents/publish_agent_revision.py +12 -0
  648. pygeai/tests/snippets/lab/agents/update_agent.py +50 -0
  649. pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
  650. pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
  651. pygeai/tests/snippets/lab/crud_ui.py +462 -0
  652. pygeai/tests/snippets/lab/processes/__init__.py +0 -0
  653. pygeai/tests/snippets/lab/processes/create_process.py +24 -0
  654. pygeai/tests/snippets/lab/processes/create_task.py +8 -0
  655. pygeai/tests/snippets/lab/processes/jobs/__init__.py +0 -0
  656. pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +21 -0
  657. pygeai/tests/snippets/lab/processes/kbs/__init__.py +0 -0
  658. pygeai/tests/snippets/lab/processes/kbs/create_kb.py +18 -0
  659. pygeai/tests/snippets/lab/processes/kbs/get_kb.py +26 -0
  660. pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +30 -0
  661. pygeai/tests/snippets/lab/processes/kbs/try_all.py +73 -0
  662. pygeai/tests/snippets/lab/processes/list_processes.py +10 -0
  663. pygeai/tests/snippets/lab/runner_1.py +212 -0
  664. pygeai/tests/snippets/lab/samples/__init__.py +0 -0
  665. pygeai/tests/snippets/lab/samples/summarize_files.py +162 -0
  666. pygeai/tests/snippets/lab/strategies/__init__.py +0 -0
  667. pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +22 -0
  668. pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +10 -0
  669. pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +16 -0
  670. pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +26 -0
  671. pygeai/tests/snippets/lab/tools/__init__.py +0 -0
  672. pygeai/tests/snippets/lab/tools/create_tool.py +48 -0
  673. pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
  674. pygeai/tests/snippets/lab/tools/delete_tool.py +21 -0
  675. pygeai/tests/snippets/lab/tools/get_parameter.py +21 -0
  676. pygeai/tests/snippets/lab/tools/get_tool.py +22 -0
  677. pygeai/tests/snippets/lab/tools/list_tools.py +23 -0
  678. pygeai/tests/snippets/lab/tools/publish_tool_revision.py +13 -0
  679. pygeai/tests/snippets/lab/tools/set_parameters.py +33 -0
  680. pygeai/tests/snippets/lab/tools/update_tool.py +52 -0
  681. pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
  682. pygeai/tests/snippets/lab/use_cases/c_code_fixer_agent_flow.py +238 -0
  683. pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
  684. pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
  685. pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
  686. pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
  687. pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
  688. pygeai/tests/snippets/lab/use_cases/file_summarizer_example.py +157 -0
  689. pygeai/tests/snippets/lab/use_cases/file_summarizer_example_2.py +157 -0
  690. pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
  691. pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
  692. pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
  693. pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
  694. pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
  695. pygeai/tests/snippets/migrate/__init__.py +45 -0
  696. pygeai/tests/snippets/migrate/agent_migration.py +110 -0
  697. pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
  698. pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
  699. pygeai/tests/snippets/migrate/process_migration.py +64 -0
  700. pygeai/tests/snippets/migrate/project_migration.py +42 -0
  701. pygeai/tests/snippets/migrate/tool_migration.py +64 -0
  702. pygeai/tests/snippets/organization/__init__.py +0 -0
  703. pygeai/tests/snippets/organization/add_project_member.py +10 -0
  704. pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
  705. pygeai/tests/snippets/organization/create_project.py +23 -0
  706. pygeai/tests/snippets/organization/delete_project.py +7 -0
  707. pygeai/tests/snippets/organization/export_request_data.py +7 -0
  708. pygeai/tests/snippets/organization/get_memberships.py +12 -0
  709. pygeai/tests/snippets/organization/get_organization_members.py +6 -0
  710. pygeai/tests/snippets/organization/get_project_data.py +7 -0
  711. pygeai/tests/snippets/organization/get_project_list.py +8 -0
  712. pygeai/tests/snippets/organization/get_project_members.py +6 -0
  713. pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
  714. pygeai/tests/snippets/organization/get_project_roles.py +6 -0
  715. pygeai/tests/snippets/organization/get_project_tokens.py +7 -0
  716. pygeai/tests/snippets/organization/update_project.py +14 -0
  717. pygeai/tests/snippets/rerank/__init__.py +0 -0
  718. pygeai/tests/snippets/rerank/rerank_chunks.py +19 -0
  719. pygeai/tests/snippets/secrets/__init__.py +0 -0
  720. pygeai/tests/snippets/usage_limit/__init__.py +0 -0
  721. pygeai/tests/snippets/usage_limit/delete_usage_limit.py +16 -0
  722. pygeai/tests/snippets/usage_limit/get_all_usage_limit_from_organization.py +12 -0
  723. pygeai/tests/snippets/usage_limit/get_usage_limit_from_organization.py +11 -0
  724. pygeai/tests/snippets/usage_limit/get_usage_limit_from_project.py +13 -0
  725. pygeai/tests/snippets/usage_limit/set_usage_limit_organization.py +22 -0
  726. pygeai/tests/snippets/usage_limit/set_usage_limit_project.py +23 -0
  727. pygeai/tests/snippets/usage_limit/update_usage_limit_organization.py +23 -0
  728. pygeai/tests/snippets/usage_limit/update_usage_limit_project.py +24 -0
  729. pygeai/vendor/a2a/__init__.py +1 -0
  730. pygeai/vendor/a2a/auth/__init__.py +0 -0
  731. pygeai/vendor/a2a/auth/user.py +31 -0
  732. pygeai/vendor/a2a/client/__init__.py +19 -0
  733. pygeai/vendor/a2a/client/client.py +425 -0
  734. pygeai/vendor/a2a/client/errors.py +33 -0
  735. pygeai/vendor/a2a/client/helpers.py +22 -0
  736. pygeai/vendor/a2a/py.typed +0 -0
  737. pygeai/vendor/a2a/server/__init__.py +1 -0
  738. pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
  739. pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
  740. pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
  741. pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
  742. pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
  743. pygeai/vendor/a2a/server/apps/__init__.py +16 -0
  744. pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
  745. pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
  746. pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
  747. pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
  748. pygeai/vendor/a2a/server/context.py +23 -0
  749. pygeai/vendor/a2a/server/events/__init__.py +21 -0
  750. pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
  751. pygeai/vendor/a2a/server/events/event_queue.py +156 -0
  752. pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
  753. pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
  754. pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
  755. pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
  756. pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
  757. pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
  758. pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
  759. pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
  760. pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
  761. pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
  762. pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
  763. pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
  764. pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
  765. pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
  766. pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
  767. pygeai/vendor/a2a/types.py +1624 -0
  768. pygeai/vendor/a2a/utils/__init__.py +40 -0
  769. pygeai/vendor/a2a/utils/artifact.py +72 -0
  770. pygeai/vendor/a2a/utils/errors.py +69 -0
  771. pygeai/vendor/a2a/utils/helpers.py +176 -0
  772. pygeai/vendor/a2a/utils/message.py +83 -0
  773. pygeai/vendor/a2a/utils/task.py +57 -0
  774. pygeai/vendor/a2a/utils/telemetry.py +299 -0
  775. pygeai-0.6.0b15.dist-info/METADATA +205 -0
  776. pygeai-0.6.0b15.dist-info/RECORD +799 -0
  777. {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
  778. pygeai-0.6.0b15.dist-info/entry_points.txt +5 -0
  779. {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info/licenses}/LICENSE +13 -1
  780. {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info}/top_level.txt +0 -1
  781. docs/source/conf.py +0 -45
  782. pygeai/core/clients.py +0 -240
  783. pygeai/tests/core/test_clients.py +0 -49
  784. pygeai-0.1.6.dist-info/METADATA +0 -92
  785. pygeai-0.1.6.dist-info/RECORD +0 -65
  786. pygeai-0.1.6.dist-info/SOURCES.sync-conflict-20241223-145950-3QD4F42.txt +0 -41
  787. pygeai-0.1.6.dist-info/entry_points.txt +0 -2
  788. /pygeai/{agent → analytics}/__init__.py +0 -0
@@ -0,0 +1,738 @@
1
+ from typing import Any
2
+ from pygeai import logger
3
+ from pygeai.assistant.clients import AssistantClient
4
+ from pygeai.assistant.rag.clients import RAGAssistantClient
5
+ from pygeai.assistant.rag.mappers import RAGAssistantMapper
6
+ from pygeai.assistant.rag.responses import DocumentListResponse
7
+ from pygeai.core.base.mappers import ErrorMapper, ResponseMapper
8
+ from pygeai.core.handlers import ErrorHandler
9
+ from pygeai.core.models import Assistant, TextAssistant, ChatAssistant, ChatMessageList, AssistantRevision, \
10
+ ChatVariableList, LlmSettings, ChatWithDataAssistant, ChatToolList, ToolChoice
11
+ from pygeai.core.base.responses import EmptyResponse
12
+ from pygeai.assistant.mappers import AssistantResponseMapper
13
+ from pygeai.core.feedback.clients import FeedbackClient
14
+ from pygeai.core.feedback.models import FeedbackRequest
15
+ from pygeai.core.responses import NewAssistantResponse, ChatResponse
16
+ from pygeai.chat.clients import ChatClient
17
+ from pygeai.assistant.rag.models import RAGAssistant, Document, UploadDocument
18
+ from pygeai.core.common.exceptions import MissingRequirementException, APIError
19
+
20
+
21
+ class AssistantManager:
22
+
23
+ def __init__(self, api_key: str = None, base_url: str = None, alias: str = None):
24
+ self.__assistant_client = AssistantClient(api_key, base_url, alias)
25
+ self.__chat_client = ChatClient(api_key, base_url, alias)
26
+ self.__rag_client = RAGAssistantClient(api_key, base_url, alias)
27
+ self.__feedback_client = FeedbackClient(api_key, base_url, alias)
28
+
29
+ def get_assistant_data(
30
+ self,
31
+ assistant_id: str = None,
32
+ detail: str = "summary",
33
+ assistant_name: str = None
34
+ ) -> Assistant:
35
+ """
36
+ Retrieves assistant data using either an assistant ID or an assistant name. RAG Assistants are searched by name
37
+ and Text or Chat Assistants are searched by ID.
38
+
39
+ This method fetches assistant details by calling either `_get_assistant_data_by_id`
40
+ or `_get_assistant_data_by_name`, depending on the provided parameters.
41
+
42
+ - If `assistant_id` is provided, it retrieves the assistant using `_get_assistant_data_by_id`.
43
+ - If `assistant_name` is provided, it retrieves the assistant using `_get_assistant_data_by_name`.
44
+ - If neither parameter is provided, a `MissingRequirementException` is raised.
45
+
46
+ :param assistant_id: str, optional - The unique identifier of the assistant.
47
+ :param detail: str, optional - The level of detail for the response. Possible values:
48
+ - "summary": Provides a summarized response. (Default)
49
+ - "full": Provides detailed assistant data.
50
+ :param assistant_name: str, optional - The name of the assistant.
51
+ :raises MissingRequirementException: If neither `assistant_id` nor `assistant_name` is provided.
52
+ :return: Assistant - The assistant details retrieved based on the provided identifier.
53
+ """
54
+ if not (assistant_id or assistant_name):
55
+ raise MissingRequirementException("Either assistant_id or assistant_name must be defined to retrieve assistant data.")
56
+
57
+ if assistant_id:
58
+ return self._get_assistant_data_by_id(assistant_id=assistant_id, detail=detail)
59
+ elif assistant_name:
60
+ return self._get_assistant_data_by_name(assistant_name=assistant_name)
61
+
62
+ def _get_assistant_data_by_id(
63
+ self,
64
+ assistant_id: str,
65
+ detail: str = "summary"
66
+ ) -> Assistant:
67
+ """
68
+ Retrieves detailed data for a specific assistant.
69
+
70
+ This method calls `AssistantClient.get_assistant_data` to fetch assistant details
71
+ and maps the response using `AssistantResponseMapper.map_to_assistant_response`.
72
+
73
+ :param assistant_id: str - The unique identifier of the assistant to retrieve.
74
+ :param detail: str, optional - The level of detail to include in the response. Possible values:
75
+ - "summary": Provides a summarized response. (Default)
76
+ - "full": Provides detailed assistant data.
77
+ :return: Assistant - The mapped response containing assistant details.
78
+ :raises APIError: If the API returns errors.
79
+ """
80
+ response_data = self.__assistant_client.get_assistant_data(
81
+ assistant_id=assistant_id,
82
+ detail=detail
83
+ )
84
+ if ErrorHandler.has_errors(response_data):
85
+ error = ErrorHandler.extract_error(response_data)
86
+ logger.error(f"Error received while retrieving assistant data by ID: {error}")
87
+ raise APIError(f"Error received while retrieving assistant data by ID: {error}")
88
+
89
+ result = AssistantResponseMapper.map_to_assistant_response(response_data)
90
+ return result
91
+
92
+ def _get_assistant_data_by_name(self, assistant_name: str) -> RAGAssistant:
93
+ """
94
+ Retrieves detailed data for a specific assistant by name.
95
+
96
+ This method calls `RAGAssistantClient.get_assistant_data` to fetch assistant details
97
+ and maps the response using `RAGAssistantMapper.map_to_rag_assistant`.
98
+
99
+ :param assistant_name: str - The name of the assistant to retrieve.
100
+ :return: RAGAssistant - The mapped response containing assistant details.
101
+ :raises APIError: If the API returns errors.
102
+ """
103
+ response_data = self.__rag_client.get_assistant_data(
104
+ name=assistant_name
105
+ )
106
+ if ErrorHandler.has_errors(response_data):
107
+ error = ErrorHandler.extract_error(response_data)
108
+ logger.error(f"Error received while retrieving assistant data by name: {error}")
109
+ raise APIError(f"Error received while retrieving assistant data by name: {error}")
110
+
111
+ result = RAGAssistantMapper.map_to_rag_assistant(response_data)
112
+ return result
113
+
114
+ def create_assistant(
115
+ self,
116
+ assistant: Assistant
117
+ ):
118
+ """
119
+ Creates a new assistant instance.
120
+
121
+ This method checks if the provided assistant is an instance of `TextAssistant` or `ChatAssistant`.
122
+ If so, it delegates the creation process to `_create_assistant`.
123
+
124
+ :param assistant: Assistant - The assistant instance to be created.
125
+ :return: The response from `_create_assistant`, which contains details of the created assistant.
126
+ """
127
+ if isinstance(assistant, TextAssistant) or isinstance(assistant, ChatAssistant):
128
+ return self._create_chat_assistant(
129
+ assistant
130
+ )
131
+ elif isinstance(assistant, RAGAssistant):
132
+ return self._create_rag_assistant(
133
+ assistant
134
+ )
135
+ elif isinstance(assistant, ChatWithDataAssistant):
136
+ return self._create_chat_with_data_assistant(
137
+ assistant
138
+ )
139
+
140
+ def _create_chat_assistant(
141
+ self,
142
+ assistant: Assistant
143
+ ) -> NewAssistantResponse:
144
+ """
145
+ Creates a new chat assistant.
146
+
147
+ This method calls `AssistantClient.create_assistant` to create a new assistant
148
+ and maps the response using `AssistantResponseMapper.map_to_assistant_created_response`.
149
+
150
+ :param assistant: Assistant - The assistant instance to be created.
151
+ :return: NewAssistantResponse - The mapped response containing the created assistant details.
152
+ :raises APIError: If the API returns errors.
153
+ """
154
+ response_data = self.__assistant_client.create_assistant(
155
+ assistant_type=assistant.type,
156
+ name=assistant.name,
157
+ prompt=assistant.prompt,
158
+ description=assistant.description,
159
+ llm_settings=assistant.llm_settings.to_dict() if assistant.llm_settings else None,
160
+ welcome_data=assistant.welcome_data.to_dict() if assistant.welcome_data else None
161
+ )
162
+ if ErrorHandler.has_errors(response_data):
163
+ error = ErrorHandler.extract_error(response_data)
164
+ logger.error(f"Error received while creating chat assistant: {error}")
165
+ raise APIError(f"Error received while creating chat assistant: {error}")
166
+
167
+ result = AssistantResponseMapper.map_to_assistant_created_response(response_data)
168
+ return result
169
+
170
+ def _create_rag_assistant(
171
+ self,
172
+ assistant: RAGAssistant
173
+ ) -> RAGAssistant:
174
+ """
175
+ Creates a new RAG assistant.
176
+
177
+ This method calls `RAGAssistantClient.create_assistant` to create a new assistant
178
+ and maps the response using `RAGAssistantMapper.map_to_rag_assistant`.
179
+
180
+ :param assistant: RAGAssistant - The assistant instance to be created.
181
+ :return: RAGAssistant - The mapped response containing the created assistant details.
182
+ :raises APIError: If the API returns errors.
183
+ """
184
+ response_data = self.__rag_client.create_assistant(
185
+ name=assistant.name,
186
+ description=assistant.description,
187
+ template=assistant.template,
188
+ search_options=assistant.search_options.to_dict() if assistant.search_options else None,
189
+ index_options=assistant.index_options.to_dict() if assistant.index_options else None,
190
+ welcome_data=assistant.welcome_data.to_dict() if assistant.welcome_data else None
191
+ )
192
+ if ErrorHandler.has_errors(response_data):
193
+ error = ErrorHandler.extract_error(response_data)
194
+ logger.error(f"Error received while creating RAG assistant: {error}")
195
+ raise APIError(f"Error received while creating RAG assistant: {error}")
196
+
197
+ result = RAGAssistantMapper.map_to_rag_assistant(response_data)
198
+ return result
199
+
200
+ def _create_chat_with_data_assistant(
201
+ self,
202
+ assistant: ChatWithDataAssistant
203
+ ) -> NewAssistantResponse:
204
+ """
205
+ Creates a new chat with data assistant.
206
+
207
+ This method calls `AssistantClient.create_assistant` to create a new assistant
208
+ and maps the response using `AssistantResponseMapper.map_to_assistant_created_response`.
209
+
210
+ :param assistant: ChatWithDataAssistant - The assistant instance to be created.
211
+ :return: NewAssistantResponse - The mapped response containing the created assistant details.
212
+ :raises APIError: If the API returns errors.
213
+ """
214
+ response_data = self.__assistant_client.create_assistant(
215
+ assistant_type=assistant.type,
216
+ name=assistant.name,
217
+ prompt=assistant.prompt,
218
+ description=assistant.description,
219
+ llm_settings=assistant.llm_settings.to_dict(),
220
+ welcome_data=assistant.welcome_data.to_dict()
221
+ )
222
+ if ErrorHandler.has_errors(response_data):
223
+ error = ErrorHandler.extract_error(response_data)
224
+ logger.error(f"Error received while creating chat with data assistant: {error}")
225
+ raise APIError(f"Error received while creating chat with data assistant: {error}")
226
+
227
+ result = AssistantResponseMapper.map_to_assistant_created_response(response_data)
228
+ return result
229
+
230
+ def update_assistant(
231
+ self,
232
+ assistant: Assistant,
233
+ action: str = "saveNewRevision",
234
+ revision_id: str = None
235
+ ) -> Any:
236
+ """
237
+ Updates an assistant based on its type.
238
+
239
+ This method determines the assistant type and delegates the update process accordingly:
240
+ - Calls `_update_chat_assistant` for `TextAssistant` or `ChatAssistant`.
241
+ - Calls `_update_rag_assistant` for `RAGAssistant`.
242
+
243
+ :param assistant: Assistant - The assistant instance to be updated.
244
+ :param action: str, optional - The type of update action for chat-based assistants. Options:
245
+ - "save": Updates an existing revision (requires `revision_id`).
246
+ - "saveNewRevision" (default): Creates and saves a new revision.
247
+ - "savePublishNewRevision": Creates, saves, and publishes a new revision.
248
+ :param revision_id: str, optional - The ID of the existing revision to update.
249
+ Required if `action` is "save". Must be None for "saveNewRevision" or "savePublishNewRevision".
250
+ :return: Any - The updated assistant instance or an error response if the update fails.
251
+ :raises ValueError: If `action` is not a valid option.
252
+ :raises MissingRequirementException:
253
+ - If `action` is "save" and `revision_id` is not provided.
254
+ - If `revision_id` is provided for "saveNewRevision" or "savePublishNewRevision".
255
+ """
256
+ if isinstance(assistant, TextAssistant) or isinstance(assistant, ChatAssistant):
257
+ return self._update_chat_assistant(assistant=assistant, action=action, revision_id=revision_id)
258
+ elif isinstance(assistant, RAGAssistant):
259
+ return self._update_rag_assistant(assistant=assistant)
260
+
261
+ def _update_chat_assistant(
262
+ self,
263
+ assistant: Assistant,
264
+ action: str = "saveNewRevision",
265
+ revision_id: str = None
266
+ ) -> NewAssistantResponse:
267
+ """
268
+ Updates an assistant with a specified action.
269
+
270
+ This method calls `AssistantClient.update_assistant` to update the assistant
271
+ and maps the response using `AssistantResponseMapper.map_to_assistant_created_response`.
272
+
273
+ :param assistant: Assistant - The assistant instance containing updated details.
274
+ :param action: str - The type of update action. Options:
275
+ - "save": Updates an existing revision (requires `revision_id`).
276
+ - "saveNewRevision": Creates and saves a new revision.
277
+ - "savePublishNewRevision": Creates, saves, and publishes a new revision.
278
+ :param revision_id: str, optional - The ID of the existing revision to update.
279
+ Required if `action` is "save". Must be None for "saveNewRevision" or "savePublishNewRevision".
280
+ :return: NewAssistantResponse - A response object containing the updated assistant details.
281
+ :raises ValueError: If `action` is not one of the valid options.
282
+ :raises MissingRequirementException:
283
+ - If `action` is "save" and `revision_id` is not provided.
284
+ - If `revision_id` is provided for "saveNewRevision" or "savePublishNewRevision".
285
+ :raises APIError: If the API returns errors.
286
+ """
287
+ if action not in ["save", "saveNewRevision", "savePublishNewRevision"]:
288
+ raise ValueError("Valid actions are: 'save', 'saveNewRevision', 'savePublishNewRevision'")
289
+
290
+ if action == "save" and revision_id is None:
291
+ raise MissingRequirementException(
292
+ "revision_id is required if user needs to update an existent revision when action = save "
293
+ )
294
+
295
+ if revision_id is not None and (action == "saveNewRevision" or action == "savePublishNewRevision"):
296
+ raise MissingRequirementException(
297
+ "Assistant prompt is required if revisionId is specified or in case of actions saveNewRevision and savePublishNewRevision"
298
+ )
299
+
300
+ if not assistant.id:
301
+ raise MissingRequirementException(
302
+ "Assistant must have a valid ID in order to be able to be updated."
303
+ )
304
+
305
+ response_data = self.__assistant_client.update_assistant(
306
+ assistant_id=assistant.id,
307
+ status=assistant.status,
308
+ action=action,
309
+ revision_id=revision_id,
310
+ name=assistant.name,
311
+ prompt=assistant.prompt,
312
+ description=assistant.description,
313
+ llm_settings=assistant.llm_settings.to_dict() if assistant.llm_settings else None,
314
+ welcome_data=assistant.welcome_data.to_dict() if assistant.welcome_data else None
315
+ )
316
+
317
+ if ErrorHandler.has_errors(response_data):
318
+ error = ErrorHandler.extract_error(response_data)
319
+ logger.error(f"Error received while updating chat assistant: {error}")
320
+ raise APIError(f"Error received while updating chat assistant: {error}")
321
+
322
+ result = AssistantResponseMapper.map_to_assistant_created_response(response_data)
323
+ return result
324
+
325
+ def _update_rag_assistant(
326
+ self,
327
+ assistant: RAGAssistant
328
+ ) -> RAGAssistant:
329
+ """
330
+ Updates an existing RAGAssistant instance.
331
+
332
+ This method calls `RAGAssistantClient.update_assistant` to update the assistant details
333
+ and maps the response using `RAGAssistantMapper.map_to_rag_assistant`.
334
+
335
+ :param assistant: RAGAssistant - The assistant instance containing updated details.
336
+ :return: RAGAssistant - The updated RAGAssistant instance.
337
+ :raises APIError: If the API returns errors.
338
+ """
339
+ response_data = self.__rag_client.update_assistant(
340
+ name=assistant.name,
341
+ status=assistant.status,
342
+ description=assistant.description,
343
+ template=assistant.template,
344
+ search_options=assistant.search_options.to_dict() if assistant.search_options else None,
345
+ welcome_data=assistant.welcome_data.to_dict() if assistant.welcome_data else None
346
+ )
347
+ if ErrorHandler.has_errors(response_data):
348
+ error = ErrorHandler.extract_error(response_data)
349
+ logger.error(f"Error received while updating RAG assistant: {error}")
350
+ raise APIError(f"Error received while updating RAG assistant: {error}")
351
+
352
+ result = RAGAssistantMapper.map_to_rag_assistant(response_data)
353
+ return result
354
+
355
+ def delete_assistant(
356
+ self,
357
+ assistant_id: str = None,
358
+ assistant_name: str = None
359
+ ) -> EmptyResponse:
360
+ """
361
+ Deletes an assistant using either an assistant ID or an assistant name.
362
+
363
+ This method removes an assistant by calling either `_delete_assistant_by_id`
364
+ or `_delete_assistant_by_name`, depending on the provided parameters.
365
+
366
+ - If `assistant_id` is provided, it deletes the assistant using `_delete_assistant_by_id`.
367
+ - If `assistant_name` is provided, it deletes the assistant using `_delete_assistant_by_name`.
368
+ - If neither parameter is provided, a `MissingRequirementException` is raised.
369
+
370
+ :param assistant_id: str, optional - The unique identifier of the assistant to delete.
371
+ :param assistant_name: str, optional - The name of the assistant to delete.
372
+ :raises MissingRequirementException: If neither `assistant_id` nor `assistant_name` is provided.
373
+ :return: EmptyResponse - A response indicating success.
374
+ """
375
+ if not (assistant_id or assistant_name):
376
+ raise MissingRequirementException("Cannot delete assistant without either assistant_id or assistant_name")
377
+
378
+ if assistant_id:
379
+ return self._delete_assistant_by_id(assistant_id=assistant_id)
380
+ elif assistant_name:
381
+ return self._delete_assistant_by_name(assistant_name=assistant_name)
382
+
383
+ def _delete_assistant_by_id(
384
+ self,
385
+ assistant_id: str,
386
+ ) -> EmptyResponse:
387
+ """
388
+ Deletes an assistant by its unique identifier.
389
+
390
+ This method calls `AssistantClient.delete_assistant` to remove an assistant
391
+ and maps the response using `ResponseMapper.map_to_empty_response`.
392
+
393
+ :param assistant_id: str - The unique identifier of the assistant to be deleted.
394
+ :return: EmptyResponse - An empty response indicating successful deletion.
395
+ :raises APIError: If the API returns errors.
396
+ """
397
+ response_data = self.__assistant_client.delete_assistant(
398
+ assistant_id=assistant_id
399
+ )
400
+ if ErrorHandler.has_errors(response_data):
401
+ error = ErrorHandler.extract_error(response_data)
402
+ logger.error(f"Error received while deleting assistant by ID: {error}")
403
+ raise APIError(f"Error received while deleting assistant by ID: {error}")
404
+
405
+ result = ResponseMapper.map_to_empty_response(response_data or "Assistant deleted successfully")
406
+ return result
407
+
408
+ def _delete_assistant_by_name(
409
+ self,
410
+ assistant_name: str,
411
+ ) -> EmptyResponse:
412
+ """
413
+ Deletes an assistant by its name.
414
+
415
+ This method calls `RAGAssistantClient.delete_assistant` to remove the assistant
416
+ and maps the response using `ResponseMapper.map_to_empty_response`.
417
+
418
+ :param assistant_name: str - The name of the assistant to be deleted.
419
+ :return: EmptyResponse - A response indicating success.
420
+ :raises APIError: If the API returns errors.
421
+ """
422
+ response_data = self.__rag_client.delete_assistant(
423
+ name=assistant_name
424
+ )
425
+ if ErrorHandler.has_errors(response_data):
426
+ error = ErrorHandler.extract_error(response_data)
427
+ logger.error(f"Error received while deleting assistant by name: {error}")
428
+ raise APIError(f"Error received while deleting assistant by name: {error}")
429
+
430
+ result = ResponseMapper.map_to_empty_response(response_data or "Assistant deleted successfully")
431
+ return result
432
+
433
+ def send_chat_request(
434
+ self,
435
+ assistant: Assistant,
436
+ messages: ChatMessageList,
437
+ revision: AssistantRevision = None,
438
+ variables: ChatVariableList = None
439
+ ) -> ChatResponse:
440
+ """
441
+ Sends a chat request to the assistant and processes the response.
442
+
443
+ This method sends a conversation request to an AI assistant, including a list of chat messages,
444
+ an optional revision identifier, and optional chat variables.
445
+
446
+ :param assistant: Assistant - The assistant instance handling the request.
447
+ :param messages: ChatMessageList - The list of messages forming the chat history.
448
+ :param revision: AssistantRevision, optional - The assistant revision details (default: None).
449
+ :param variables: ChatVariableList, optional - Additional variables for the chat request (default: None).
450
+ :return: ChatResponse - The structured response from the assistant.
451
+ :raises APIError: If the API returns errors.
452
+ """
453
+ response_data = self.__assistant_client.send_chat_request(
454
+ assistant_name=assistant.name,
455
+ messages=messages.to_list(),
456
+ revision=revision.revision_id if revision is not None else None,
457
+ revision_name=revision.revision_name if revision is not None else None,
458
+ variables=variables.to_list() if variables else None
459
+ )
460
+ if ErrorHandler.has_errors(response_data):
461
+ error = ErrorHandler.extract_error(response_data)
462
+ logger.error(f"Error received while sending chat request: {error}")
463
+ raise APIError(f"Error received while sending chat request: {error}")
464
+
465
+ result = AssistantResponseMapper.map_to_chat_request_response(response_data)
466
+ return result
467
+
468
+ def get_request_status(self, request_id: str) -> ChatResponse:
469
+ """
470
+ Retrieves the status of a chat request using the provided request ID.
471
+
472
+ This method queries the assistant service to check the current status of a
473
+ previously sent chat request.
474
+
475
+ :param request_id: str - The unique identifier of the chat request.
476
+ :return: ChatResponse - The structured response containing the request status.
477
+ :raises APIError: If the API returns errors.
478
+ """
479
+ response_data = self.__assistant_client.get_request_status(
480
+ request_id=request_id
481
+ )
482
+ if ErrorHandler.has_errors(response_data):
483
+ error = ErrorHandler.extract_error(response_data)
484
+ logger.error(f"Error received while retrieving request status: {error}")
485
+ raise APIError(f"Error received while retrieving request status: {error}")
486
+
487
+ result = AssistantResponseMapper.map_to_chat_request_response(response_data)
488
+ return result
489
+
490
+ def cancel_request(self, request_id: str) -> ChatResponse:
491
+ """
492
+ Cancels an ongoing chat request using the provided request ID.
493
+
494
+ This method sends a cancellation request to the assistant service.
495
+
496
+ :param request_id: str - The unique identifier of the chat request to cancel.
497
+ :return: ChatResponse - The structured response confirming the cancellation.
498
+ :raises APIError: If the API returns errors.
499
+ """
500
+ response_data = self.__assistant_client.cancel_request(
501
+ request_id=request_id
502
+ )
503
+ if ErrorHandler.has_errors(response_data):
504
+ error = ErrorHandler.extract_error(response_data)
505
+ logger.error(f"Error received while canceling request: {error}")
506
+ raise APIError(f"Error received while canceling request: {error}")
507
+
508
+ result = AssistantResponseMapper.map_to_chat_request_response(response_data)
509
+ return result
510
+
511
+ def chat_completion(
512
+ self,
513
+ model: str,
514
+ messages: ChatMessageList,
515
+ llm_settings: LlmSettings,
516
+ thread_id: str = None,
517
+ variables: ChatVariableList = None,
518
+ tool_choice: ToolChoice = None,
519
+ tools: ChatToolList = None
520
+ ) -> ChatResponse:
521
+ """
522
+ Generates a chat completion response using the specified language model.
523
+
524
+ This method sends a chat completion request to the ChatClient with the provided
525
+ model, messages, and settings.
526
+
527
+ :param model: str - The identifier of the language model to use.
528
+ :param messages: ChatMessageList - A list of chat messages to provide context for the completion.
529
+ :param llm_settings: LlmSettings - Configuration settings for the language model,
530
+ including temperature, max tokens, and penalties.
531
+ :param thread_id: str, optional - An optional identifier for the conversation thread.
532
+ :param variables: ChatVariableList, optional - Additional variables to include in the request.
533
+ :param tool_choice: ToolChoice, optional - Indicates which tool to call.
534
+ :param tools: ChatToolList, optional - Additional tools the model may call
535
+ :return: ChatResponse - The structured chat response.
536
+ :raises APIError: If the API returns errors.
537
+ """
538
+ response_data = self.__chat_client.chat_completion(
539
+ model=model,
540
+ messages=messages.to_list(),
541
+ stream=False,
542
+ temperature=llm_settings.temperature,
543
+ max_tokens=llm_settings.max_tokens,
544
+ thread_id=thread_id,
545
+ frequency_penalty=llm_settings.frequency_penalty,
546
+ presence_penalty=llm_settings.presence_penalty,
547
+ variables=variables.to_list() if variables else None,
548
+ tool_choice=tool_choice.to_dict() if tool_choice else None,
549
+ tools=tools.to_list() if tools else None
550
+ )
551
+
552
+ if ErrorHandler.has_errors(response_data):
553
+ error = ErrorHandler.extract_error(response_data)
554
+ logger.error(f"Error received while generating chat completion: {error}")
555
+ raise APIError(f"Error received while generating chat completion: {error}")
556
+
557
+ result = AssistantResponseMapper.map_to_provider_response(response_data)
558
+ return result
559
+
560
+ def get_document_list(
561
+ self,
562
+ name: str,
563
+ skip: int = 0,
564
+ count: int = 10
565
+ ) -> DocumentListResponse:
566
+ """
567
+ Retrieves a list of documents associated with a specified RAG assistant.
568
+
569
+ This method queries the RAG client to fetch a list of documents for the given assistant name,
570
+ applying pagination parameters.
571
+
572
+ :param name: str - The name of the RAG assistant.
573
+ :param skip: int - The number of documents to skip (default: 0).
574
+ :param count: int - The number of documents to retrieve (default: 10).
575
+ :return: DocumentListResponse - A response object containing the retrieved documents.
576
+ :raises APIError: If the API returns errors.
577
+ """
578
+ response_data = self.__rag_client.get_documents(
579
+ name=name,
580
+ skip=skip,
581
+ count=count
582
+ )
583
+
584
+ if ErrorHandler.has_errors(response_data):
585
+ error = ErrorHandler.extract_error(response_data)
586
+ logger.error(f"Error received while retrieving document list: {error}")
587
+ raise APIError(f"Error received while retrieving document list: {error}")
588
+
589
+ result = RAGAssistantMapper.map_to_document_list_response(response_data)
590
+ return result
591
+
592
+ def delete_all_documents(
593
+ self,
594
+ name: str,
595
+ ) -> EmptyResponse:
596
+ """
597
+ Deletes all documents associated with a specified RAG assistant.
598
+
599
+ This method sends a request to the RAG client to delete all documents for the given assistant name.
600
+
601
+ :param name: str - The name of the RAG assistant whose documents should be deleted.
602
+ :return: EmptyResponse - A response object indicating the success of the operation.
603
+ :raises APIError: If the API returns errors.
604
+ """
605
+ response_data = self.__rag_client.delete_all_documents(
606
+ name=name
607
+ )
608
+
609
+ if ErrorHandler.has_errors(response_data):
610
+ error = ErrorHandler.extract_error(response_data)
611
+ logger.error(f"Error received while deleting all documents: {error}")
612
+ raise APIError(f"Error received while deleting all documents: {error}")
613
+
614
+ result = ResponseMapper.map_to_empty_response(response_data or "All documents deleted successfully")
615
+ return result
616
+
617
+ def get_document(
618
+ self,
619
+ name: str,
620
+ document_id: str
621
+ ) -> Document:
622
+ """
623
+ Retrieves a specific document associated with a RAG assistant.
624
+
625
+ This method sends a request to the RAG client to retrieve a document identified by its ID
626
+ for the given assistant name.
627
+
628
+ :param name: str - The name of the RAG assistant.
629
+ :param document_id: str - The unique identifier of the document to retrieve.
630
+ :return: Document - The retrieved document instance.
631
+ :raises APIError: If the API returns errors.
632
+ """
633
+ response_data = self.__rag_client.retrieve_document(
634
+ name=name,
635
+ document_id=document_id
636
+ )
637
+
638
+ if ErrorHandler.has_errors(response_data):
639
+ error = ErrorHandler.extract_error(response_data)
640
+ logger.error(f"Error received while retrieving document: {error}")
641
+ raise APIError(f"Error received while retrieving document: {error}")
642
+
643
+ result = RAGAssistantMapper.map_to_document(response_data)
644
+ return result
645
+
646
+ def upload_document(
647
+ self,
648
+ assistant: RAGAssistant,
649
+ document: UploadDocument
650
+ ) -> Document:
651
+ """
652
+ Uploads a document to the specified RAG assistant.
653
+
654
+ This method sends a request to the RAG client to upload a document for the given assistant.
655
+
656
+ :param assistant: RAGAssistant - The assistant to which the document will be uploaded.
657
+ :param document: UploadDocument - The document object containing:
658
+ - path (str): The file path of the document.
659
+ - upload_type (str): The type of upload (e.g., "multipart" or "binary").
660
+ - metadata (dict | str | None): Additional metadata, either as a dictionary or a file path.
661
+ - content_type (str): The MIME type of the document (e.g., "application/pdf", "text/plain").
662
+ :return: Document - The uploaded document instance.
663
+ :raises APIError: If the API returns errors.
664
+ """
665
+ response_data = self.__rag_client.upload_document(
666
+ name=assistant.name,
667
+ file_path=document.path,
668
+ upload_type=document.upload_type,
669
+ metadata=document.metadata,
670
+ content_type=document.content_type
671
+ )
672
+
673
+ if ErrorHandler.has_errors(response_data):
674
+ error = ErrorHandler.extract_error(response_data)
675
+ logger.error(f"Error received while uploading document: {error}")
676
+ raise APIError(f"Error received while uploading document: {error}")
677
+
678
+ result = RAGAssistantMapper.map_to_document(response_data)
679
+ return result
680
+
681
+ def delete_document(
682
+ self,
683
+ name: str,
684
+ document_id: str
685
+ ) -> EmptyResponse:
686
+ """
687
+ Deletes a specific document from the given RAG assistant.
688
+
689
+ This method sends a request to the RAG client to delete a document identified by its ID
690
+ for the given assistant name.
691
+
692
+ :param name: str - The name of the RAG assistant from which the document will be deleted.
693
+ :param document_id: str - The unique identifier of the document to be deleted.
694
+ :return: EmptyResponse - An empty response object indicating success.
695
+ :raises APIError: If the API returns errors.
696
+ """
697
+ response_data = self.__rag_client.delete_document(
698
+ name=name,
699
+ document_id=document_id
700
+ )
701
+
702
+ if ErrorHandler.has_errors(response_data):
703
+ error = ErrorHandler.extract_error(response_data)
704
+ logger.error(f"Error received while deleting document: {error}")
705
+ raise APIError(f"Error received while deleting document: {error}")
706
+
707
+ result = ResponseMapper.map_to_empty_response(response_data or "Document deleted successfully")
708
+ return result
709
+
710
+ def send_feedback(
711
+ self,
712
+ feedback_request: FeedbackRequest
713
+ ) -> EmptyResponse:
714
+ """
715
+ Sends feedback for an assistant's response.
716
+
717
+ This method submits user feedback to the Feedback API using the provided `FeedbackRequest` object.
718
+
719
+ :param feedback_request: FeedbackRequest - The feedback details, including request ID, origin,
720
+ answer score, and optional comments.
721
+ :return: EmptyResponse - The processed API response indicating success.
722
+ :raises APIError: If the API returns errors.
723
+ """
724
+ response_data = self.__feedback_client.send_feedback(
725
+ request_id=feedback_request.request_id,
726
+ origin=feedback_request.origin,
727
+ answer_score=feedback_request.answer_score,
728
+ comments=feedback_request.comments,
729
+ )
730
+
731
+ if ErrorHandler.has_errors(response_data):
732
+ error = ErrorHandler.extract_error(response_data)
733
+ logger.error(f"Error received while sending feedback: {error}")
734
+ raise APIError(f"Error received while sending feedback: {error}")
735
+
736
+ result = ResponseMapper.map_to_empty_response(response_data or "Feedback sent successfully")
737
+ return result
738
+