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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (648) hide show
  1. pygeai/__init__.py +9 -1
  2. pygeai/_docs/Makefile +20 -0
  3. pygeai/_docs/make.bat +35 -0
  4. pygeai/_docs/source/conf.py +117 -0
  5. pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
  6. pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
  7. pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
  8. pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
  9. pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
  10. pygeai/_docs/source/content/ai_lab.rst +102 -0
  11. pygeai/_docs/source/content/analytics.rst +598 -0
  12. pygeai/_docs/source/content/api_reference/admin.rst +161 -0
  13. pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
  14. pygeai/_docs/source/content/api_reference/auth.rst +379 -0
  15. pygeai/_docs/source/content/api_reference/chat.rst +754 -0
  16. pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
  17. pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
  18. pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
  19. pygeai/_docs/source/content/api_reference/files.rst +592 -0
  20. pygeai/_docs/source/content/api_reference/gam.rst +401 -0
  21. pygeai/_docs/source/content/api_reference/health.rst +58 -0
  22. pygeai/_docs/source/content/api_reference/project.rst +738 -0
  23. pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
  24. pygeai/_docs/source/content/api_reference/rag.rst +710 -0
  25. pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
  26. pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
  27. pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
  28. pygeai/_docs/source/content/api_reference.rst +58 -0
  29. pygeai/_docs/source/content/authentication.rst +295 -0
  30. pygeai/_docs/source/content/chat_gui.rst +121 -0
  31. pygeai/_docs/source/content/cli.rst +203 -0
  32. pygeai/_docs/source/content/debugger.rst +651 -0
  33. pygeai/_docs/source/content/intro.rst +67 -0
  34. pygeai/_docs/source/content/migration.rst +929 -0
  35. pygeai/_docs/source/content/modules.rst +7 -0
  36. pygeai/_docs/source/content/quickstart.rst +143 -0
  37. pygeai/_docs/source/content/samples.rst +394 -0
  38. pygeai/_docs/source/index.rst +75 -0
  39. pygeai/_docs/source/modules.rst +7 -0
  40. pygeai/_docs/source/pygeai.admin.rst +29 -0
  41. pygeai/_docs/source/pygeai.analytics.rst +53 -0
  42. pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
  43. pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
  44. pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
  45. pygeai/_docs/source/pygeai.assistant.rst +55 -0
  46. pygeai/_docs/source/pygeai.auth.rst +29 -0
  47. pygeai/_docs/source/pygeai.chat.rst +69 -0
  48. pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
  49. pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
  50. pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
  51. pygeai/_docs/source/pygeai.cli.rst +62 -0
  52. pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
  53. pygeai/_docs/source/pygeai.core.base.rst +53 -0
  54. pygeai/_docs/source/pygeai.core.common.rst +37 -0
  55. pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
  56. pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
  57. pygeai/_docs/source/pygeai.core.files.rst +61 -0
  58. pygeai/_docs/source/pygeai.core.llm.rst +29 -0
  59. pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
  60. pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
  61. pygeai/_docs/source/pygeai.core.rst +63 -0
  62. pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
  63. pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
  64. pygeai/_docs/source/pygeai.core.services.rst +37 -0
  65. pygeai/_docs/source/pygeai.core.utils.rst +37 -0
  66. pygeai/_docs/source/pygeai.dbg.rst +21 -0
  67. pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
  68. pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
  69. pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
  70. pygeai/_docs/source/pygeai.evaluation.rst +31 -0
  71. pygeai/_docs/source/pygeai.flows.rst +29 -0
  72. pygeai/_docs/source/pygeai.gam.rst +29 -0
  73. pygeai/_docs/source/pygeai.health.rst +29 -0
  74. pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
  75. pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
  76. pygeai/_docs/source/pygeai.lab.rst +65 -0
  77. pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
  78. pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
  79. pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
  80. pygeai/_docs/source/pygeai.man.man1.rst +10 -0
  81. pygeai/_docs/source/pygeai.man.rst +18 -0
  82. pygeai/_docs/source/pygeai.migration.rst +29 -0
  83. pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
  84. pygeai/_docs/source/pygeai.organization.rst +61 -0
  85. pygeai/_docs/source/pygeai.proxy.rst +53 -0
  86. pygeai/_docs/source/pygeai.rst +35 -0
  87. pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
  88. pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
  89. pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
  90. pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
  91. pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
  92. pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
  93. pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
  94. pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
  95. pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
  96. pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
  97. pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
  98. pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
  99. pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
  100. pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
  101. pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
  102. pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
  103. pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
  104. pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
  105. pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
  106. pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
  107. pygeai/_docs/source/pygeai.tests.core.rst +39 -0
  108. pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
  109. pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
  110. pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
  111. pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
  112. pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
  113. pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
  114. pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
  115. pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
  116. pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
  117. pygeai/_docs/source/pygeai.tests.health.rst +21 -0
  118. pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
  119. pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
  120. pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
  121. pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
  122. pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
  123. pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
  124. pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
  125. pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
  126. pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
  127. pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
  128. pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
  129. pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
  130. pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
  131. pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
  132. pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
  133. pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
  134. pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
  135. pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
  136. pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
  137. pygeai/_docs/source/pygeai.tests.rst +33 -0
  138. pygeai/admin/clients.py +14 -11
  139. pygeai/admin/endpoints.py +2 -2
  140. pygeai/analytics/clients.py +505 -0
  141. pygeai/analytics/endpoints.py +35 -0
  142. pygeai/analytics/managers.py +606 -0
  143. pygeai/analytics/mappers.py +207 -0
  144. pygeai/analytics/responses.py +240 -0
  145. pygeai/assistant/clients.py +18 -45
  146. pygeai/assistant/data/clients.py +1 -0
  147. pygeai/assistant/data_analyst/clients.py +8 -12
  148. pygeai/assistant/managers.py +195 -157
  149. pygeai/assistant/mappers.py +4 -2
  150. pygeai/assistant/rag/clients.py +27 -67
  151. pygeai/assistant/rag/mappers.py +12 -6
  152. pygeai/assistant/rag/models.py +301 -159
  153. pygeai/auth/__init__.py +0 -0
  154. pygeai/auth/clients.py +129 -0
  155. pygeai/auth/endpoints.py +6 -0
  156. pygeai/chat/clients.py +308 -37
  157. pygeai/chat/endpoints.py +3 -0
  158. pygeai/chat/iris.py +2 -8
  159. pygeai/chat/managers.py +9 -6
  160. pygeai/chat/session.py +38 -0
  161. pygeai/chat/settings.py +6 -0
  162. pygeai/chat/ui.py +678 -0
  163. pygeai/cli/__init__.py +0 -1
  164. pygeai/cli/commands/admin.py +7 -10
  165. pygeai/cli/commands/analytics.py +533 -0
  166. pygeai/cli/commands/assistant.py +9 -9
  167. pygeai/cli/commands/auth.py +299 -0
  168. pygeai/cli/commands/base.py +71 -9
  169. pygeai/cli/commands/chat.py +676 -19
  170. pygeai/cli/commands/common.py +28 -24
  171. pygeai/cli/commands/configuration.py +66 -13
  172. pygeai/cli/commands/docs.py +105 -0
  173. pygeai/cli/commands/embeddings.py +58 -11
  174. pygeai/cli/commands/evaluation.py +38 -38
  175. pygeai/cli/commands/feedback.py +3 -4
  176. pygeai/cli/commands/files.py +7 -8
  177. pygeai/cli/commands/gam.py +85 -10
  178. pygeai/cli/commands/lab/ai_lab.py +340 -484
  179. pygeai/cli/commands/lab/options.py +8 -0
  180. pygeai/cli/commands/lab/spec.py +273 -0
  181. pygeai/cli/commands/lab/utils.py +13 -0
  182. pygeai/cli/commands/llm.py +6 -7
  183. pygeai/cli/commands/migrate.py +1064 -436
  184. pygeai/cli/commands/organization.py +516 -11
  185. pygeai/cli/commands/rag.py +13 -14
  186. pygeai/cli/commands/rerank.py +3 -5
  187. pygeai/cli/commands/secrets.py +8 -9
  188. pygeai/cli/commands/usage_limits.py +18 -20
  189. pygeai/cli/commands/validators.py +144 -1
  190. pygeai/cli/commands/version.py +4 -5
  191. pygeai/cli/error_handler.py +151 -0
  192. pygeai/cli/geai.py +170 -31
  193. pygeai/cli/geai_proxy.py +86 -25
  194. pygeai/cli/install_man.py +93 -22
  195. pygeai/cli/parsers.py +75 -25
  196. pygeai/cli/texts/help.py +265 -28
  197. pygeai/core/base/clients.py +53 -12
  198. pygeai/core/base/mappers.py +11 -2
  199. pygeai/core/base/session.py +95 -11
  200. pygeai/core/common/config.py +78 -14
  201. pygeai/core/common/exceptions.py +96 -6
  202. pygeai/core/embeddings/__init__.py +19 -0
  203. pygeai/core/embeddings/clients.py +23 -5
  204. pygeai/core/embeddings/managers.py +9 -4
  205. pygeai/core/embeddings/mappers.py +16 -2
  206. pygeai/core/embeddings/responses.py +9 -2
  207. pygeai/core/feedback/clients.py +8 -3
  208. pygeai/core/files/clients.py +23 -24
  209. pygeai/core/files/managers.py +121 -30
  210. pygeai/core/files/responses.py +4 -3
  211. pygeai/core/handlers.py +10 -1
  212. pygeai/core/llm/clients.py +22 -29
  213. pygeai/core/models.py +127 -11
  214. pygeai/core/plugins/clients.py +6 -6
  215. pygeai/core/rerank/clients.py +9 -3
  216. pygeai/core/rerank/managers.py +22 -5
  217. pygeai/core/secrets/clients.py +16 -37
  218. pygeai/core/services/response.py +18 -0
  219. pygeai/core/services/rest.py +159 -49
  220. pygeai/core/utils/__init__.py +0 -0
  221. pygeai/core/utils/console.py +83 -0
  222. pygeai/core/utils/parsers.py +32 -0
  223. pygeai/core/utils/validators.py +10 -0
  224. pygeai/dbg/__init__.py +3 -0
  225. pygeai/dbg/debugger.py +854 -14
  226. pygeai/evaluation/clients.py +7 -4
  227. pygeai/evaluation/dataset/clients.py +46 -44
  228. pygeai/evaluation/plan/clients.py +28 -26
  229. pygeai/evaluation/result/clients.py +38 -5
  230. pygeai/gam/clients.py +50 -28
  231. pygeai/gam/endpoints.py +2 -1
  232. pygeai/health/__init__.py +0 -0
  233. pygeai/health/clients.py +24 -0
  234. pygeai/health/endpoints.py +1 -0
  235. pygeai/lab/__init__.py +0 -90
  236. pygeai/lab/agents/clients.py +203 -162
  237. pygeai/lab/agents/endpoints.py +4 -0
  238. pygeai/lab/agents/mappers.py +57 -7
  239. pygeai/lab/clients.py +24 -0
  240. pygeai/lab/constants.py +3 -0
  241. pygeai/lab/managers.py +571 -541
  242. pygeai/lab/models.py +108 -19
  243. pygeai/lab/processes/clients.py +332 -340
  244. pygeai/lab/processes/mappers.py +3 -3
  245. pygeai/lab/runners.py +90 -0
  246. pygeai/lab/spec/__init__.py +0 -0
  247. pygeai/lab/spec/loader.py +24 -0
  248. pygeai/lab/spec/parsers.py +39 -0
  249. pygeai/lab/strategies/clients.py +67 -63
  250. pygeai/lab/strategies/mappers.py +1 -1
  251. pygeai/lab/tools/clients.py +85 -118
  252. pygeai/lab/tools/endpoints.py +4 -0
  253. pygeai/lab/tools/mappers.py +5 -5
  254. pygeai/man/man1/geai-proxy.1 +116 -0
  255. pygeai/man/man1/geai.1 +2580 -66
  256. pygeai/migration/__init__.py +33 -0
  257. pygeai/migration/strategies.py +468 -146
  258. pygeai/migration/tools.py +170 -3
  259. pygeai/organization/clients.py +245 -50
  260. pygeai/organization/endpoints.py +17 -8
  261. pygeai/organization/limits/clients.py +34 -32
  262. pygeai/organization/limits/managers.py +108 -49
  263. pygeai/organization/managers.py +347 -53
  264. pygeai/organization/mappers.py +102 -2
  265. pygeai/organization/responses.py +58 -1
  266. pygeai/proxy/clients.py +6 -3
  267. pygeai/proxy/config.py +14 -1
  268. pygeai/proxy/managers.py +61 -33
  269. pygeai/proxy/servers.py +196 -51
  270. pygeai/proxy/tool.py +33 -16
  271. pygeai/tests/admin/__init__.py +0 -0
  272. pygeai/tests/admin/test_clients.py +148 -0
  273. pygeai/tests/analytics/__init__.py +0 -0
  274. pygeai/tests/analytics/test_clients.py +86 -0
  275. pygeai/tests/analytics/test_managers.py +94 -0
  276. pygeai/tests/analytics/test_mappers.py +84 -0
  277. pygeai/tests/analytics/test_responses.py +73 -0
  278. pygeai/tests/assistants/rag/test_clients.py +346 -0
  279. pygeai/tests/assistants/rag/test_models.py +292 -0
  280. pygeai/tests/assistants/test_clients.py +176 -82
  281. pygeai/tests/assistants/test_managers.py +191 -57
  282. pygeai/tests/auth/__init__.py +0 -0
  283. pygeai/tests/auth/test_clients.py +289 -0
  284. pygeai/tests/auth/test_oauth.py +172 -0
  285. pygeai/tests/auth/test_session_logging.py +150 -0
  286. pygeai/tests/chat/__init__.py +0 -0
  287. pygeai/tests/chat/test_clients.py +393 -0
  288. pygeai/tests/chat/test_iris.py +38 -0
  289. pygeai/tests/chat/test_session.py +62 -0
  290. pygeai/tests/chat/test_ui.py +224 -0
  291. pygeai/tests/cli/commands/__init__.py +0 -0
  292. pygeai/tests/cli/commands/lab/__init__.py +0 -0
  293. pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
  294. pygeai/tests/cli/commands/lab/test_common.py +208 -0
  295. pygeai/tests/cli/commands/lab/test_spec.py +246 -0
  296. pygeai/tests/cli/commands/test_assistant.py +202 -0
  297. pygeai/tests/cli/commands/test_chat.py +130 -0
  298. pygeai/tests/cli/commands/test_common.py +350 -0
  299. pygeai/tests/cli/commands/test_embeddings.py +132 -0
  300. pygeai/tests/cli/commands/test_evaluation.py +656 -0
  301. pygeai/tests/cli/commands/test_feedback.py +65 -0
  302. pygeai/tests/cli/commands/test_files.py +161 -0
  303. pygeai/tests/cli/commands/test_gam.py +201 -0
  304. pygeai/tests/cli/commands/test_llm.py +114 -0
  305. pygeai/tests/cli/commands/test_migrate.py +176 -0
  306. pygeai/tests/cli/commands/test_organization.py +276 -0
  307. pygeai/tests/cli/commands/test_rag.py +266 -0
  308. pygeai/tests/cli/commands/test_rerank.py +110 -0
  309. pygeai/tests/cli/commands/test_secrets.py +171 -0
  310. pygeai/tests/cli/commands/test_show_help.py +41 -0
  311. pygeai/tests/cli/commands/test_usage_limits.py +412 -0
  312. pygeai/tests/cli/commands/test_validators.py +160 -0
  313. pygeai/tests/cli/commands/test_version.py +81 -0
  314. pygeai/tests/cli/docker/__init__.py +0 -0
  315. pygeai/tests/cli/test_credentials_flag.py +316 -0
  316. pygeai/tests/cli/test_error_handler.py +225 -0
  317. pygeai/tests/cli/test_geai_driver.py +154 -0
  318. pygeai/tests/cli/test_parsers.py +5 -5
  319. pygeai/tests/core/base/data/models.py +7 -0
  320. pygeai/tests/core/base/test_mappers.py +43 -11
  321. pygeai/tests/core/base/test_models.py +3 -1
  322. pygeai/tests/core/base/test_responses.py +53 -0
  323. pygeai/tests/core/common/__init__.py +0 -0
  324. pygeai/tests/core/common/data/__init__.py +0 -0
  325. pygeai/tests/core/common/test_config.py +186 -0
  326. pygeai/tests/core/common/test_decorators.py +69 -0
  327. pygeai/tests/core/embeddings/__init__.py +0 -0
  328. pygeai/tests/core/embeddings/test_clients.py +225 -0
  329. pygeai/tests/core/embeddings/test_managers.py +171 -0
  330. pygeai/tests/core/embeddings/test_mappers.py +142 -0
  331. pygeai/tests/core/feedback/__init__.py +0 -0
  332. pygeai/tests/core/feedback/test_clients.py +64 -0
  333. pygeai/tests/core/files/test_clients.py +128 -0
  334. pygeai/tests/core/files/test_managers.py +124 -78
  335. pygeai/tests/core/files/test_mappers.py +137 -0
  336. pygeai/tests/core/files/test_models.py +103 -0
  337. pygeai/tests/core/files/test_responses.py +122 -0
  338. pygeai/tests/core/llm/__init__.py +0 -0
  339. pygeai/tests/core/llm/test_clients.py +142 -0
  340. pygeai/tests/core/plugins/__init__.py +0 -0
  341. pygeai/tests/core/plugins/test_clients.py +66 -0
  342. pygeai/tests/core/rerank/test_clients.py +76 -0
  343. pygeai/tests/core/rerank/test_managers.py +61 -39
  344. pygeai/tests/core/secrets/__init__.py +0 -0
  345. pygeai/tests/core/secrets/test_clients.py +264 -0
  346. pygeai/tests/core/services/__init__.py +0 -0
  347. pygeai/tests/core/services/test_rest.py +273 -0
  348. pygeai/tests/core/test_handlers.py +66 -0
  349. pygeai/tests/core/utils/__init__.py +0 -0
  350. pygeai/tests/core/utils/test_console.py +80 -0
  351. pygeai/tests/dbg/__init__.py +0 -0
  352. pygeai/tests/dbg/test_debugger.py +591 -0
  353. pygeai/tests/evaluation/__init__.py +0 -0
  354. pygeai/tests/evaluation/dataset/__init__.py +0 -0
  355. pygeai/tests/evaluation/dataset/test_clients.py +265 -0
  356. pygeai/tests/evaluation/plan/__init__.py +0 -0
  357. pygeai/tests/evaluation/plan/test_clients.py +195 -0
  358. pygeai/tests/evaluation/result/__init__.py +0 -0
  359. pygeai/tests/evaluation/result/test_clients.py +66 -0
  360. pygeai/tests/gam/__init__.py +0 -0
  361. pygeai/tests/gam/test_clients.py +195 -0
  362. pygeai/tests/health/__init__.py +0 -0
  363. pygeai/tests/health/test_clients.py +41 -0
  364. pygeai/tests/integration/__init__.py +0 -0
  365. pygeai/tests/integration/assistants/__init__.py +0 -0
  366. pygeai/tests/integration/assistants/rag/__init__.py +0 -0
  367. pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
  368. pygeai/tests/integration/chat/__init__.py +0 -0
  369. pygeai/tests/integration/chat/test_generate_image.py +158 -0
  370. pygeai/tests/integration/lab/__init__.py +0 -0
  371. pygeai/tests/integration/lab/agents/__init__.py +0 -0
  372. pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
  373. pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
  374. pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
  375. pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
  376. pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
  377. pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
  378. pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
  379. pygeai/tests/integration/lab/processes/__init__.py +0 -0
  380. pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
  381. pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
  382. pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
  383. pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
  384. pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
  385. pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
  386. pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
  387. pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
  388. pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
  389. pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
  390. pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
  391. pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
  392. pygeai/tests/integration/lab/tools/__init__.py +0 -0
  393. pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
  394. pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
  395. pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
  396. pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
  397. pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
  398. pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
  399. pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
  400. pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
  401. pygeai/tests/lab/agents/__init__.py +0 -0
  402. pygeai/tests/lab/agents/test_clients.py +481 -0
  403. pygeai/tests/lab/agents/test_mappers.py +440 -0
  404. pygeai/tests/lab/processes/__init__.py +0 -0
  405. pygeai/tests/lab/processes/test_clients.py +1416 -0
  406. pygeai/tests/lab/processes/test_mappers.py +1092 -0
  407. pygeai/tests/lab/spec/__init__.py +0 -0
  408. pygeai/tests/lab/spec/test_loader.py +59 -0
  409. pygeai/tests/lab/spec/test_parsers.py +182 -0
  410. pygeai/tests/lab/strategies/__init__.py +0 -0
  411. pygeai/tests/lab/strategies/test_clients.py +241 -0
  412. pygeai/tests/lab/strategies/test_mappers.py +132 -0
  413. pygeai/tests/lab/test_managers.py +553 -0
  414. pygeai/tests/lab/test_models.py +500 -3
  415. pygeai/tests/lab/tools/__init__.py +0 -0
  416. pygeai/tests/lab/tools/test_clients.py +521 -0
  417. pygeai/tests/lab/tools/test_mappers.py +198 -0
  418. pygeai/tests/migration/__init__.py +0 -0
  419. pygeai/tests/migration/test_strategies.py +405 -0
  420. pygeai/tests/migration/test_tools.py +159 -0
  421. pygeai/tests/organization/limits/test_clients.py +567 -0
  422. pygeai/tests/organization/limits/test_managers.py +298 -56
  423. pygeai/tests/organization/test_clients.py +600 -30
  424. pygeai/tests/organization/test_managers.py +424 -0
  425. pygeai/tests/organization/test_mappers.py +153 -0
  426. pygeai/tests/organization/test_responses.py +137 -0
  427. pygeai/tests/proxy/__init__.py +1 -0
  428. pygeai/tests/proxy/test_clients.py +397 -0
  429. pygeai/tests/proxy/test_config.py +171 -0
  430. pygeai/tests/proxy/test_integration.py +305 -0
  431. pygeai/tests/proxy/test_managers.py +312 -0
  432. pygeai/tests/proxy/test_servers.py +387 -0
  433. pygeai/tests/proxy/test_tool.py +176 -0
  434. pygeai/tests/snippets/analytics/__init__.py +0 -0
  435. pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
  436. pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
  437. pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
  438. pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
  439. pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
  440. pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
  441. pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
  442. pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
  443. pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
  444. pygeai/tests/snippets/auth/__init__.py +0 -0
  445. pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
  446. pygeai/tests/snippets/chat/get_response.py +15 -0
  447. pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
  448. pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
  449. pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
  450. pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
  451. pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
  452. pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
  453. pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
  454. pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
  455. pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
  456. pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
  457. pygeai/tests/snippets/dbg/__init__.py +0 -0
  458. pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
  459. pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
  460. pygeai/tests/snippets/dbg/file_debugging.py +72 -0
  461. pygeai/tests/snippets/dbg/module_debugging.py +61 -0
  462. pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
  463. pygeai/tests/snippets/dbg/stepping_example.py +40 -0
  464. pygeai/tests/snippets/embeddings/cache_example.py +31 -0
  465. pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
  466. pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
  467. pygeai/tests/snippets/embeddings/openai_example.py +30 -0
  468. pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
  469. pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
  470. pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
  471. pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
  472. pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
  473. pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
  474. pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
  475. pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
  476. pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
  477. pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
  478. pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
  479. pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
  480. pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
  481. pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
  482. pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
  483. pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
  484. pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
  485. pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
  486. pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
  487. pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
  488. pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
  489. pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
  490. pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
  491. pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
  492. pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
  493. pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
  494. pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
  495. pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
  496. pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
  497. pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
  498. pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
  499. pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
  500. pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
  501. pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
  502. pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
  503. pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
  504. pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
  505. pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
  506. pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
  507. pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
  508. pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
  509. pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
  510. pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
  511. pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
  512. pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
  513. pygeai/tests/snippets/files/delete_file.py +1 -4
  514. pygeai/tests/snippets/files/get_file_content.py +2 -4
  515. pygeai/tests/snippets/files/get_file_data.py +1 -4
  516. pygeai/tests/snippets/files/get_file_list.py +1 -6
  517. pygeai/tests/snippets/files/upload_file.py +1 -5
  518. pygeai/tests/snippets/gam/gam_access_token.py +87 -0
  519. pygeai/tests/snippets/lab/agentic_flow_example_1.py +25 -23
  520. pygeai/tests/snippets/lab/agentic_flow_example_4.py +23 -23
  521. pygeai/tests/snippets/lab/agents/create_agent.py +5 -8
  522. pygeai/tests/snippets/lab/agents/create_agent_2.py +1 -5
  523. pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
  524. pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
  525. pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
  526. pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
  527. pygeai/tests/snippets/lab/agents/delete_agent.py +1 -5
  528. pygeai/tests/snippets/lab/agents/get_agent.py +2 -11
  529. pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
  530. pygeai/tests/snippets/lab/agents/get_sharing_link.py +2 -7
  531. pygeai/tests/snippets/lab/agents/list_agents.py +4 -7
  532. pygeai/tests/snippets/lab/agents/publish_agent_revision.py +2 -6
  533. pygeai/tests/snippets/lab/agents/update_agent.py +1 -5
  534. pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
  535. pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
  536. pygeai/tests/snippets/lab/crud_ui.py +462 -0
  537. pygeai/tests/snippets/lab/processes/create_process.py +3 -5
  538. pygeai/tests/snippets/lab/processes/create_task.py +3 -5
  539. pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +10 -19
  540. pygeai/tests/snippets/lab/processes/kbs/create_kb.py +2 -5
  541. pygeai/tests/snippets/lab/processes/kbs/get_kb.py +10 -16
  542. pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +13 -20
  543. pygeai/tests/snippets/lab/processes/kbs/try_all.py +5 -7
  544. pygeai/tests/snippets/lab/processes/list_processes.py +5 -7
  545. pygeai/tests/snippets/lab/runner_1.py +1 -1
  546. pygeai/tests/snippets/lab/samples/summarize_files.py +3 -3
  547. pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +2 -5
  548. pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +2 -5
  549. pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +3 -6
  550. pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +2 -5
  551. pygeai/tests/snippets/lab/tools/create_tool.py +4 -10
  552. pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
  553. pygeai/tests/snippets/lab/tools/delete_tool.py +2 -6
  554. pygeai/tests/snippets/lab/tools/get_parameter.py +5 -7
  555. pygeai/tests/snippets/lab/tools/get_tool.py +5 -7
  556. pygeai/tests/snippets/lab/tools/list_tools.py +3 -7
  557. pygeai/tests/snippets/lab/tools/publish_tool_revision.py +3 -5
  558. pygeai/tests/snippets/lab/tools/set_parameters.py +4 -9
  559. pygeai/tests/snippets/lab/tools/update_tool.py +4 -8
  560. pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
  561. pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
  562. pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
  563. pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
  564. pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
  565. pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
  566. pygeai/tests/snippets/lab/{file_summarizer_example.py → use_cases/file_summarizer_example.py} +3 -3
  567. pygeai/tests/snippets/lab/{file_summarizer_example_2.py → use_cases/file_summarizer_example_2.py} +12 -12
  568. pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
  569. pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
  570. pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
  571. pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
  572. pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
  573. pygeai/tests/snippets/migrate/__init__.py +45 -0
  574. pygeai/tests/snippets/migrate/agent_migration.py +110 -0
  575. pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
  576. pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
  577. pygeai/tests/snippets/migrate/process_migration.py +64 -0
  578. pygeai/tests/snippets/migrate/project_migration.py +42 -0
  579. pygeai/tests/snippets/migrate/tool_migration.py +64 -0
  580. pygeai/tests/snippets/organization/add_project_member.py +10 -0
  581. pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
  582. pygeai/tests/snippets/organization/create_project.py +2 -2
  583. pygeai/tests/snippets/organization/get_memberships.py +12 -0
  584. pygeai/tests/snippets/organization/get_organization_members.py +6 -0
  585. pygeai/tests/snippets/organization/get_project_members.py +6 -0
  586. pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
  587. pygeai/tests/snippets/organization/get_project_roles.py +6 -0
  588. pygeai/vendor/a2a/__init__.py +1 -0
  589. pygeai/vendor/a2a/auth/__init__.py +0 -0
  590. pygeai/vendor/a2a/auth/user.py +31 -0
  591. pygeai/vendor/a2a/client/__init__.py +19 -0
  592. pygeai/vendor/a2a/client/client.py +425 -0
  593. pygeai/vendor/a2a/client/errors.py +33 -0
  594. pygeai/vendor/a2a/client/helpers.py +22 -0
  595. pygeai/vendor/a2a/py.typed +0 -0
  596. pygeai/vendor/a2a/server/__init__.py +1 -0
  597. pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
  598. pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
  599. pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
  600. pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
  601. pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
  602. pygeai/vendor/a2a/server/apps/__init__.py +16 -0
  603. pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
  604. pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
  605. pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
  606. pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
  607. pygeai/vendor/a2a/server/context.py +23 -0
  608. pygeai/vendor/a2a/server/events/__init__.py +21 -0
  609. pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
  610. pygeai/vendor/a2a/server/events/event_queue.py +156 -0
  611. pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
  612. pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
  613. pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
  614. pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
  615. pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
  616. pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
  617. pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
  618. pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
  619. pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
  620. pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
  621. pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
  622. pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
  623. pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
  624. pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
  625. pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
  626. pygeai/vendor/a2a/types.py +1624 -0
  627. pygeai/vendor/a2a/utils/__init__.py +40 -0
  628. pygeai/vendor/a2a/utils/artifact.py +72 -0
  629. pygeai/vendor/a2a/utils/errors.py +69 -0
  630. pygeai/vendor/a2a/utils/helpers.py +176 -0
  631. pygeai/vendor/a2a/utils/message.py +83 -0
  632. pygeai/vendor/a2a/utils/task.py +57 -0
  633. pygeai/vendor/a2a/utils/telemetry.py +299 -0
  634. pygeai-0.6.0b15.dist-info/METADATA +205 -0
  635. pygeai-0.6.0b15.dist-info/RECORD +799 -0
  636. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
  637. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/entry_points.txt +2 -1
  638. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/licenses/LICENSE +13 -1
  639. pygeai-0.6.0b15.dist-info/top_level.txt +1 -0
  640. docs/geai-proxy/README.md +0 -145
  641. docs/source/conf.py +0 -45
  642. pygeai/tests/core/test_managers.py +0 -233
  643. pygeai-0.1.51b3.dist-info/METADATA +0 -130
  644. pygeai-0.1.51b3.dist-info/RECORD +0 -324
  645. pygeai-0.1.51b3.dist-info/top_level.txt +0 -3
  646. scripts/bump_beta_version.py +0 -56
  647. {scripts → pygeai/analytics}/__init__.py +0 -0
  648. /pygeai/tests/snippets/lab/{c_code_fixer_agent_flow.py → use_cases/c_code_fixer_agent_flow.py} +0 -0
@@ -1,41 +1,46 @@
1
- from json import JSONDecodeError
2
1
  from typing import Optional, List, Dict
3
2
 
4
- from pygeai.core.base.clients import BaseClient
3
+ from pygeai import logger
4
+ from pygeai.core.common.exceptions import MissingRequirementException, InvalidAPIResponseException
5
+ from pygeai.core.utils.validators import validate_status_code
6
+ from pygeai.core.utils.parsers import parse_json_response
5
7
  from pygeai.lab.agents.endpoints import CREATE_AGENT_V2, LIST_AGENTS_V2, GET_AGENT_V2, CREATE_SHARING_LINK_V2, \
6
- PUBLISH_AGENT_REVISION_V2, DELETE_AGENT_V2, UPDATE_AGENT_V2, UPSERT_AGENT_V2
8
+ PUBLISH_AGENT_REVISION_V2, DELETE_AGENT_V2, UPDATE_AGENT_V2, UPSERT_AGENT_V2, EXPORT_AGENT_V2, IMPORT_AGENT_V2
9
+ from pygeai.lab.constants import VALID_ACCESS_SCOPES
10
+ from pygeai.lab.clients import AILabClient
7
11
 
8
12
 
9
- class AgentClient(BaseClient):
13
+ class AgentClient(AILabClient):
10
14
 
11
15
  def list_agents(
12
16
  self,
13
- project_id: str,
14
17
  status: str = "",
15
18
  start: int = "",
16
19
  count: int = "",
17
20
  access_scope: str = "public",
18
21
  allow_drafts: bool = True,
19
22
  allow_external: bool = False
20
- ):
23
+ ) -> dict:
21
24
  """
22
25
  Retrieves a list of agents associated with the specified project.
23
26
 
24
- :param project_id: str - Unique identifier of the project.
25
- :param status: str - Status of the agents to filter by. Defaults to "" (no filtering).
26
- :param start: int - Starting index for pagination. Defaults to "" (no offset).
27
- :param count: int - Number of agents to retrieve. Defaults to "" (no limit).
28
- :param access_scope: str - Access scope of the agents, either "public" or "private". Defaults to "public".
29
- :param allow_drafts: bool - Whether to include draft agents. Defaults to True.
30
- :param allow_external: bool - Whether to include external agents. Defaults to False.
31
- :return: dict or str - JSON response containing the list of agents if successful, otherwise the raw response text.
27
+ :param status: str, optional - Filter agents by status (e.g., "active", "draft"). Defaults to "" (no filtering).
28
+ :param start: int, optional - Starting index for pagination. Defaults to "" (no offset).
29
+ :param count: int, optional - Maximum number of agents to retrieve. Defaults to "" (no limit).
30
+ :param access_scope: str, optional - Filter agents by access scope ("public" or "private"). Defaults to "public".
31
+ :param allow_drafts: bool, optional - Include draft agents in the results. Defaults to True.
32
+ :param allow_external: bool, optional - Include external agents in the results. Defaults to False.
33
+ :return: dict - JSON response containing the list of agents.
34
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
32
35
  """
33
36
  endpoint = LIST_AGENTS_V2
34
37
  headers = {
35
38
  "Authorization": self.api_service.token,
36
- "ProjectId": project_id
39
+ "ProjectId": self.project_id
37
40
  }
38
41
 
42
+ logger.debug(f"Listing agents for project with ID {self.project_id}")
43
+
39
44
  response = self.api_service.get(
40
45
  endpoint=endpoint,
41
46
  headers=headers,
@@ -48,16 +53,11 @@ class AgentClient(BaseClient):
48
53
  "allowExternal": allow_external
49
54
  }
50
55
  )
51
- try:
52
- result = response.json()
53
- except JSONDecodeError as e:
54
- result = response.text
55
-
56
- return result
56
+ validate_status_code(response)
57
+ return parse_json_response(response, f"list agents for project {self.project_id}")
57
58
 
58
59
  def create_agent(
59
60
  self,
60
- project_id: str,
61
61
  name: str,
62
62
  access_scope: str,
63
63
  public_name: str,
@@ -66,6 +66,7 @@ class AgentClient(BaseClient):
66
66
  description: str,
67
67
  agent_data_prompt: dict,
68
68
  agent_data_llm_config: dict,
69
+ agent_data_strategy_name: str,
69
70
  agent_data_models: list,
70
71
  agent_data_resource_pools: Optional[List[Dict]] = None,
71
72
  automatic_publish: bool = False
@@ -73,42 +74,25 @@ class AgentClient(BaseClient):
73
74
  """
74
75
  Creates a new agent in the specified project.
75
76
 
76
- :param project_id: str - Unique identifier of the project where the agent will be created.
77
- :param name: str - Name of the agent. Must be non-empty, unique within the project, and exclude ':' or '/'.
78
- :param access_scope: str - Access scope of the agent. Must be either 'public' or 'private'. Defaults to 'private'.
79
- :param public_name: str - Public name of the agent, required if access_scope is 'public'. Must be unique within the installation and follow a domain/library convention (e.g., 'com.example.my-agent'). Only alphanumeric characters, periods, dashes, and underscores are allowed. Optional if access_scope is 'private'.
80
- :param job_description: str - Description of the agent's role. Optional.
81
- :param avatar_image: str - URL from which the agent's avatar image will be loaded. Optional.
82
- :param description: str - Detailed description of the agent’s purpose. Optional.
83
- :param agent_data_prompt: dict - Configuration for the agent's prompt. Must include at least 'context' or 'instructions' for publication. Optional fields include 'examples' with 'inputData' and 'output' pairs. Example structure:
84
- {
85
- 'context': str,
86
- 'instructions': str,
87
- 'examples': [{'inputData': str, 'output': str}, ...]
88
- }
89
- :param agent_data_llm_config: dict - Default LLM configuration for the agent. Optional. Example structure:
90
- {
91
- 'maxTokens': int, # Maximum tokens for generation
92
- 'timeout': int, # Timeout in seconds
93
- 'sampling': {
94
- 'temperature': float # Controls randomness (0.0 to 1.0)
95
- }
96
- }
97
- :param agent_data_models: list - List of models the agent can use, in order of preference. At least one valid model is required for publication. Each model is a dict with 'name' (e.g., 'gpt-4o' or 'openai/gpt-4o') and optional 'llmConfig' to override defaults. Example:
98
- [{'name': str, 'llmConfig': dict}, ...]
99
- :param agent_data_resource_pools: Optional[List[Dict]] - List of resource pools organizing tools and helper agents. Optional. Each pool is a dict with 'name' (required), and optional 'tools' and 'agents' lists. Example structure:
100
- [
101
- {
102
- 'name': str,
103
- 'tools': [{'name': str, 'revision': int}, ...],
104
- 'agents': [{'name': str, 'revision': int}, ...]
105
- },
106
- ...
107
- ]
108
- :param automatic_publish: bool - If True, automatically publishes the agent after creation. Defaults to False.
109
- :return: dict - JSON response containing the created agent details if successful, otherwise the raw response text.
110
- :raises JSONDecodeError: If the response cannot be parsed as JSON.
77
+ :param name: str - Name of the agent (must be unique within the project, non-empty, and exclude ':' or '/').
78
+ :param access_scope: str - Access scope of the agent ("public" or "private").
79
+ :param public_name: str - Public name for the agent, required if access_scope is "public" (must follow domain/library convention, e.g., 'com.example.my-agent').
80
+ :param job_description: str - Description of the agent's role (optional).
81
+ :param avatar_image: str - URL for the agent's avatar image (optional).
82
+ :param description: str - Detailed description of the agents purpose (optional).
83
+ :param agent_data_prompt: dict - Prompt configuration, including 'context', 'instructions', and optional 'examples' (e.g., {'context': str, 'instructions': str, 'examples': [{'inputData': str, 'output': str}]}).
84
+ :param agent_data_llm_config: dict - LLM configuration (e.g., {'maxTokens': int, 'timeout': int, 'sampling': {'temperature': float}}).
85
+ :param agent_data_strategy_name: str - Strategy name to be used.
86
+ :param agent_data_models: list - List of models the agent can use (e.g., [{'name': 'gpt-4o', 'llmConfig': dict}]).
87
+ :param agent_data_resource_pools: Optional[List[Dict]] - Resource pools for tools and helper agents (e.g., [{'name': str, 'tools': [{'name': str, 'revision': int}], 'agents': [{'name': str, 'revision': int}]}]).
88
+ :param automatic_publish: bool - Automatically publish the agent after creation (default: False).
89
+ :return: dict - JSON response containing the created agent details.
90
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
91
+ :raises ValueError: If access_scope is invalid.
111
92
  """
93
+ if access_scope is not None and access_scope not in VALID_ACCESS_SCOPES:
94
+ raise ValueError(f"Access scope must be one of {', '.join(VALID_ACCESS_SCOPES)}.")
95
+
112
96
  data = {
113
97
  "agentDefinition": {
114
98
  "name": name,
@@ -117,16 +101,24 @@ class AgentClient(BaseClient):
117
101
  "jobDescription": job_description,
118
102
  "avatarImage": avatar_image,
119
103
  "description": description,
120
- "agentData": {
121
- "prompt": agent_data_prompt,
122
- "llmConfig": agent_data_llm_config,
123
- "models": agent_data_models
124
- }
125
104
  }
126
105
  }
127
-
106
+ if (
107
+ agent_data_prompt or agent_data_strategy_name or agent_data_prompt or agent_data_resource_pools or
108
+ agent_data_llm_config or agent_data_models
109
+ ):
110
+ data["agentDefinition"]["agentData"] = {}
128
111
  if agent_data_resource_pools is not None:
129
112
  data["agentDefinition"]["agentData"]["resourcePools"] = agent_data_resource_pools
113
+ if agent_data_prompt is not None:
114
+ data["agentDefinition"]["agentData"]["prompt"] = agent_data_prompt
115
+ if agent_data_llm_config is not None:
116
+ data["agentDefinition"]["agentData"]["llmConfig"] = agent_data_llm_config
117
+ if agent_data_strategy_name is not None:
118
+ data["agentDefinition"]["agentData"]["strategyName"] = agent_data_strategy_name
119
+ if agent_data_models is not None:
120
+ data["agentDefinition"]["agentData"]["models"] = agent_data_models
121
+ logger.debug(f"Creating agent with data: {data}")
130
122
 
131
123
  endpoint = CREATE_AGENT_V2
132
124
  if automatic_publish:
@@ -134,7 +126,7 @@ class AgentClient(BaseClient):
134
126
 
135
127
  headers = {
136
128
  "Authorization": self.api_service.token,
137
- "ProjectId": project_id
129
+ "ProjectId": self.project_id
138
130
  }
139
131
 
140
132
  response = self.api_service.post(
@@ -143,37 +135,39 @@ class AgentClient(BaseClient):
143
135
  data=data
144
136
  )
145
137
 
146
- try:
147
- result = response.json()
148
- except JSONDecodeError as e:
149
- result = response.text
138
+ validate_status_code(response)
139
+ return parse_json_response(response, f"create agent for project {self.project_id}")
150
140
 
151
- return result
152
141
 
153
142
  def get_agent(
154
143
  self,
155
- project_id: str,
156
144
  agent_id: str,
157
145
  revision: str = 0,
158
146
  version: int = 0,
159
147
  allow_drafts: bool = True
160
- ):
148
+ ) -> dict:
161
149
  """
162
150
  Retrieves details of a specific agent from the specified project.
163
151
 
164
- :param project_id: str - Unique identifier of the project.
165
152
  :param agent_id: str - Unique identifier of the agent to retrieve.
166
- :param revision: str - Revision of the agent to retrieve. Defaults to 0 (latest revision).
167
- :param version: int - Version of the agent to retrieve. Defaults to 0 (latest version).
168
- :param allow_drafts: bool - Whether to include draft agents in the retrieval. Defaults to True.
169
- :return: dict or str - JSON response containing the agent details if successful, otherwise the raw response text.
153
+ :param revision: str, optional - Specific revision of the agent to retrieve (default: 0, latest revision).
154
+ :param version: int, optional - Specific version of the agent to retrieve (default: 0, latest version).
155
+ :param allow_drafts: bool, optional - Include draft agents in the results (default: True).
156
+ :return: dict - JSON response containing the agent details.
157
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
158
+ :raises MissingRequirementException: If project_id or agent_id is not provided.
170
159
  """
160
+ if not agent_id:
161
+ raise MissingRequirementException("agent_id must be specified in order to retrieve the agent")
162
+
171
163
  endpoint = GET_AGENT_V2.format(agentId=agent_id)
172
164
  headers = {
173
165
  "Authorization": self.api_service.token,
174
- "ProjectId": project_id
166
+ "ProjectId": self.project_id
175
167
  }
176
168
 
169
+ logger.debug(f"Retrieving agent detail with ID {agent_id}")
170
+
177
171
  response = self.api_service.get(
178
172
  endpoint=endpoint,
179
173
  headers=headers,
@@ -183,63 +177,63 @@ class AgentClient(BaseClient):
183
177
  "allowDrafts": allow_drafts,
184
178
  }
185
179
  )
186
- try:
187
- result = response.json()
188
- except JSONDecodeError as e:
189
- result = response.text
180
+ validate_status_code(response)
181
+ return parse_json_response(response, f"retrieve agent {agent_id} for project {self.project_id}")
190
182
 
191
- return result
192
183
 
193
184
  def create_sharing_link(
194
185
  self,
195
- project_id: str,
196
186
  agent_id: str,
197
- ):
187
+ ) -> dict:
198
188
  """
199
189
  Creates a sharing link for a specific agent in the specified project.
200
190
 
201
- :param project_id: str - Unique identifier of the project.
202
191
  :param agent_id: str - Unique identifier of the agent for which to create a sharing link.
203
- :return: dict or str - JSON response containing the sharing link details if successful, otherwise the raw response text.
192
+ :return: dict - JSON response containing the sharing link details.
193
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
194
+ :raises MissingRequirementException: If project_id or agent_id is not provided.
204
195
  """
196
+ if not agent_id:
197
+ raise MissingRequirementException("agent_id must be specified in order to create sharing link")
198
+
205
199
  endpoint = CREATE_SHARING_LINK_V2.format(agentId=agent_id)
206
200
  headers = {
207
201
  "Authorization": self.api_service.token,
208
- "ProjectId": project_id
202
+ "ProjectId": self.project_id
209
203
  }
210
204
 
205
+ logger.debug(f"Creating sharing link for agent with ID {agent_id}")
206
+
211
207
  response = self.api_service.get(
212
208
  endpoint=endpoint,
213
209
  headers=headers,
214
210
  params={}
215
211
  )
216
- try:
217
- result = response.json()
218
- except JSONDecodeError as e:
219
- result = response.text
212
+ validate_status_code(response)
213
+ return parse_json_response(response, f"create sharing link for agent {agent_id} in project {self.project_id}")
220
214
 
221
- return result
222
215
 
223
216
  def publish_agent_revision(
224
217
  self,
225
- project_id: str,
226
218
  agent_id: str,
227
219
  revision: str
228
- ):
220
+ ) -> dict:
229
221
  """
230
222
  Publishes a specific revision of an agent in the specified project.
231
223
 
232
- :param project_id: str - Unique identifier of the project.
233
224
  :param agent_id: str - Unique identifier of the agent to publish.
234
225
  :param revision: str - Revision of the agent to publish.
235
- :return: dict or str - JSON response containing the result of the publish operation if successful, otherwise the raw response text.
226
+ :return: dict - JSON response containing the result of the publish operation.
227
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
236
228
  """
237
229
  endpoint = PUBLISH_AGENT_REVISION_V2.format(agentId=agent_id)
238
230
  headers = {
239
231
  "Authorization": self.api_service.token,
240
- "ProjectId": project_id
232
+ "ProjectId": self.project_id
241
233
  }
242
234
 
235
+ logger.debug(f"Publishing revision {revision} for agent with ID {agent_id}")
236
+
243
237
  response = self.api_service.post(
244
238
  endpoint=endpoint,
245
239
  headers=headers,
@@ -247,46 +241,42 @@ class AgentClient(BaseClient):
247
241
  "revision": revision,
248
242
  }
249
243
  )
250
- try:
251
- result = response.json()
252
- except JSONDecodeError as e:
253
- result = response.text
244
+ validate_status_code(response)
245
+ return parse_json_response(response, f"publish revision {revision} for agent {agent_id} in project {self.project_id}")
254
246
 
255
- return result
256
247
 
257
248
  def delete_agent(
258
249
  self,
259
- project_id: str,
260
250
  agent_id: str,
261
- ):
251
+ ) -> dict:
262
252
  """
263
253
  Deletes a specific agent from the specified project.
264
254
 
265
- :param project_id: str - Unique identifier of the project.
266
255
  :param agent_id: str - Unique identifier of the agent to delete.
267
- :return: dict or str - JSON response confirming the deletion if successful, otherwise the raw response text.
256
+ :return: dict - JSON response confirming the deletion.
257
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
268
258
  """
269
259
  endpoint = DELETE_AGENT_V2.format(agentId=agent_id)
270
260
  headers = {
271
261
  "Authorization": self.api_service.token,
272
- "ProjectId": project_id
262
+ "ProjectId": self.project_id
273
263
  }
274
264
 
265
+ logger.debug(f"Deleting agent with ID {agent_id}")
266
+
275
267
  response = self.api_service.delete(
276
268
  endpoint=endpoint,
277
269
  headers=headers,
278
270
  data={}
279
271
  )
280
- try:
281
- result = response.json()
282
- except JSONDecodeError as e:
283
- result = response.text
284
-
285
- return result
272
+ if response.status_code != 204:
273
+ logger.error(f"Unable to delete agent {agent_id} from project {self.project_id}: JSON parsing error (status {response.status_code}). Response: {response.text}")
274
+ raise InvalidAPIResponseException(f"Unable to delete agent {agent_id} from project {self.project_id}: {response.text}")
275
+ else:
276
+ return {}
286
277
 
287
278
  def update_agent(
288
279
  self,
289
- project_id: str,
290
280
  agent_id: str,
291
281
  name: str,
292
282
  access_scope: str,
@@ -296,6 +286,7 @@ class AgentClient(BaseClient):
296
286
  description: str,
297
287
  agent_data_prompt: dict,
298
288
  agent_data_llm_config: dict,
289
+ agent_data_strategy_name: dict,
299
290
  agent_data_models: list,
300
291
  agent_data_resource_pools: Optional[List[Dict]] = None,
301
292
  automatic_publish: bool = False,
@@ -304,44 +295,27 @@ class AgentClient(BaseClient):
304
295
  """
305
296
  Updates an existing agent in the specified project or upserts it if specified.
306
297
 
307
- :param project_id: str - Unique identifier of the project containing the agent.
308
- :param agent_id: str - Unique identifier of the agent to update. Required for update operations.
309
- :param name: str - Updated name of the agent. Must be non-empty, unique within the project, and exclude ':' or '/' if provided. Optional.
310
- :param access_scope: str - Updated access scope of the agent. Must be either 'public' or 'private'. Defaults to 'private'.
311
- :param public_name: str - Updated public name of the agent, required if access_scope is 'public'. Must be unique within the installation and follow a domain/library convention (e.g., 'com.example.my-agent'). Only alphanumeric characters, periods, dashes, and underscores are allowed. Optional if access_scope is 'private'.
312
- :param job_description: str - Updated description of the agent's role. Optional.
313
- :param avatar_image: str - Updated URL from which the agent's avatar image will be loaded. Optional.
314
- :param description: str - Updated detailed description of the agent’s purpose. Optional.
315
- :param agent_data_prompt: dict - Updated configuration for the agent's prompt. Must include at least 'context' or 'instructions' for publication. Optional fields include 'examples' with 'inputData' and 'output' pairs. Optional. Example structure:
316
- {
317
- 'context': str,
318
- 'instructions': str,
319
- 'examples': [{'inputData': str, 'output': str}, ...]
320
- }
321
- :param agent_data_llm_config: dict - Updated default LLM configuration for the agent. Optional. Example structure:
322
- {
323
- 'maxTokens': int, # Maximum tokens for generation
324
- 'timeout': int, # Timeout in seconds
325
- 'sampling': {
326
- 'temperature': float # Controls randomness (0.0 to 1.0)
327
- }
328
- }
329
- :param agent_data_models: list - Updated list of models the agent can use, in order of preference. At least one valid model is required for publication. Each model is a dict with 'name' (e.g., 'gpt-4o' or 'openai/gpt-4o') and optional 'llmConfig' to override defaults. Optional. Example:
330
- [{'name': str, 'llmConfig': dict}, ...]
331
- :param agent_data_resource_pools: Optional[List[Dict]] - Updated list of resource pools organizing tools and helper agents. Optional. Each pool is a dict with 'name' (required), and optional 'tools' and 'agents' lists. Example structure:
332
- [
333
- {
334
- 'name': str,
335
- 'tools': [{'name': str, 'revision': int}, ...],
336
- 'agents': [{'name': str, 'revision': int}, ...]
337
- },
338
- ...
339
- ]
340
- :param automatic_publish: bool - If True, automatically publishes the agent after updating. Defaults to False.
341
- :param upsert: bool - If True, creates the agent if it does not exist (upsert); otherwise, only updates an existing agent. Defaults to False.
342
- :return: dict - JSON response containing the updated or created agent details if successful, otherwise the raw response text.
343
- :raises JSONDecodeError: If the response cannot be parsed as JSON.
298
+ :param agent_id: str - Unique identifier of the agent to update (required for updates).
299
+ :param name: str - Updated name of the agent (must be unique, non-empty, exclude ':' or '/'; optional).
300
+ :param access_scope: str - Updated access scope ("public" or "private").
301
+ :param public_name: str - Updated public name, required if access_scope is "public" (must follow domain/library convention).
302
+ :param job_description: str - Updated role description (optional).
303
+ :param avatar_image: str - Updated avatar image URL (optional).
304
+ :param description: str - Updated purpose description (optional).
305
+ :param agent_data_prompt: dict - Updated prompt configuration (e.g., {'context': str, 'instructions': str, 'examples': [{'inputData': str, 'output': str}]}).
306
+ :param agent_data_llm_config: dict - Updated LLM configuration (e.g., {'maxTokens': int, 'timeout': int, 'sampling': {'temperature': float}}).
307
+ :param agent_data_strategy_name: str - Updated StrategyName configuration.
308
+ :param agent_data_models: list - Updated model list (e.g., [{'name': 'gpt-4o', 'llmConfig': dict}]).
309
+ :param agent_data_resource_pools: Optional[List[Dict]] - Updated resource pools (e.g., [{'name': str, 'tools': [{'name': str, 'revision': int}], 'agents': [{'name': str, 'revision': int}]}]).
310
+ :param automatic_publish: bool - Automatically publish the agent after updating (default: False).
311
+ :param upsert: bool - Create the agent if it does not exist (default: False).
312
+ :return: dict - JSON response containing the updated or created agent details.
313
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
314
+ :raises ValueError: If access_scope is invalid.
344
315
  """
316
+ if access_scope is not None and access_scope not in VALID_ACCESS_SCOPES:
317
+ raise ValueError(f"Access scope must be one of {', '.join(VALID_ACCESS_SCOPES)}.")
318
+
345
319
  data = {
346
320
  "agentDefinition": {
347
321
  "name": name,
@@ -350,15 +324,25 @@ class AgentClient(BaseClient):
350
324
  "jobDescription": job_description,
351
325
  "avatarImage": avatar_image,
352
326
  "description": description,
353
- "agentData": {
354
- "prompt": agent_data_prompt,
355
- "llmConfig": agent_data_llm_config,
356
- "models": agent_data_models
357
- }
358
327
  }
359
328
  }
329
+ if (
330
+ agent_data_prompt or agent_data_strategy_name or agent_data_prompt or agent_data_resource_pools or
331
+ agent_data_llm_config or agent_data_models
332
+ ):
333
+ data["agentDefinition"]["agentData"] = {}
360
334
  if agent_data_resource_pools is not None:
361
335
  data["agentDefinition"]["agentData"]["resourcePools"] = agent_data_resource_pools
336
+ if agent_data_prompt is not None:
337
+ data["agentDefinition"]["agentData"]["prompt"] = agent_data_prompt
338
+ if agent_data_llm_config is not None:
339
+ data["agentDefinition"]["agentData"]["llmConfig"] = agent_data_llm_config
340
+ if agent_data_strategy_name is not None:
341
+ data["agentDefinition"]["agentData"]["strategyName"] = agent_data_strategy_name
342
+ if agent_data_models is not None:
343
+ data["agentDefinition"]["agentData"]["models"] = agent_data_models
344
+
345
+ logger.debug(f"Updating agent with ID {agent_id} with data: {data}")
362
346
 
363
347
  endpoint = UPSERT_AGENT_V2 if upsert else UPDATE_AGENT_V2
364
348
  endpoint = endpoint.format(agentId=agent_id) if agent_id else endpoint.format(agentId=name)
@@ -368,7 +352,7 @@ class AgentClient(BaseClient):
368
352
 
369
353
  headers = {
370
354
  "Authorization": self.api_service.token,
371
- "ProjectId": project_id
355
+ "ProjectId": self.project_id
372
356
  }
373
357
 
374
358
  response = self.api_service.put(
@@ -377,9 +361,66 @@ class AgentClient(BaseClient):
377
361
  data=data
378
362
  )
379
363
 
380
- try:
381
- result = response.json()
382
- except JSONDecodeError as e:
383
- result = response.text
364
+ validate_status_code(response)
365
+ return parse_json_response(response, f"update agent {agent_id} in project {self.project_id}")
366
+
367
+
368
+ def export_agent(
369
+ self,
370
+ agent_id: str,
371
+ ) -> dict:
372
+ """
373
+ Retrieves details of a specific agent from the specified project.
374
+
375
+ :param agent_id: str - Unique identifier of the agent to retrieve.
376
+ :return: dict - JSON response containing the agent details.
377
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
378
+ :raises MissingRequirementException: If project_id or agent_id is not provided.
379
+ """
380
+ if not agent_id:
381
+ raise MissingRequirementException("agent_id must be specified in order to export the agent")
382
+
383
+ endpoint = EXPORT_AGENT_V2.format(agentId=agent_id)
384
+ headers = {
385
+ "Authorization": self.api_service.token,
386
+ "ProjectId": self.project_id
387
+ }
388
+
389
+ logger.debug(f"Exporting agent with ID {agent_id}")
390
+
391
+ response = self.api_service.get(
392
+ endpoint=endpoint,
393
+ headers=headers,
394
+ )
395
+ validate_status_code(response)
396
+ return parse_json_response(response, f"export agent {agent_id} for project {self.project_id}")
397
+
398
+ def import_agent(
399
+ self,
400
+ data: dict,
401
+ ) -> dict:
402
+ """
403
+ Retrieves details of a specific agent from the specified project.
404
+
405
+ :param data: dict - Agent specification to import
406
+ :return: dict - JSON response containing the agent details.
407
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
408
+ :raises MissingRequirementException: If project_id or agent_id is not provided.
409
+ """
410
+ if not data:
411
+ raise MissingRequirementException("data for spec must be specified in order to import the agent")
412
+
413
+ endpoint = IMPORT_AGENT_V2
414
+ headers = {
415
+ "Authorization": self.api_service.token,
416
+ "ProjectId": self.project_id
417
+ }
418
+
419
+ response = self.api_service.post(
420
+ endpoint=endpoint,
421
+ headers=headers,
422
+ data=data
423
+ )
424
+ validate_status_code(response)
425
+ return parse_json_response(response, f"import agent for project {self.project_id}")
384
426
 
385
- return result
@@ -6,3 +6,7 @@ PUBLISH_AGENT_REVISION_V2 = "v2/agents/{agentId}/publish-revision" # POST -> Pu
6
6
  DELETE_AGENT_V2 = "v2/agents/{agentId}" # DEL -> Delete agent
7
7
  UPDATE_AGENT_V2 = "v2/agents/{agentId}" # PUT -> Update agent
8
8
  UPSERT_AGENT_V2 = "v2/agents/{agentId}/upsert" # PUT -> Update or Insert agent
9
+ EXPORT_AGENT_V2 = "v2/agents/{agentId}/export" # GET -> Export agent
10
+ IMPORT_AGENT_V2 = "v2/agents/import" # POST -> Import agent
11
+ # EXPORT_AGENT_V4 = "v4/agents/{agentId}/export" # GET -> Export agent
12
+ # IMPORT_AGENT_V4 = "v4/agents/import" # POST -> Import agent