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,21 +1,25 @@
1
+ from pygeai import logger
1
2
  from pygeai.core.base.mappers import ErrorMapper, ResponseMapper
2
3
  from pygeai.core.handlers import ErrorHandler
3
- from pygeai.core.models import Project
4
+ from pygeai.core.models import Project, Organization
4
5
  from pygeai.core.base.responses import EmptyResponse
5
6
  from pygeai.organization.clients import OrganizationClient
6
7
  from pygeai.organization.mappers import OrganizationResponseMapper
7
8
  from pygeai.organization.responses import AssistantListResponse, ProjectListResponse, ProjectDataResponse, \
8
- ProjectTokensResponse, ProjectItemListResponse
9
+ ProjectTokensResponse, ProjectItemListResponse, MembershipsResponse, ProjectMembershipsResponse, \
10
+ ProjectRolesResponse, ProjectMembersResponse, OrganizationMembersResponse, OrganizationListResponse, \
11
+ OrganizationDataResponse
12
+ from pygeai.core.common.exceptions import APIError
9
13
 
10
14
 
11
15
  class OrganizationManager:
12
16
  """
13
17
  Manager that operates as an abstraction level over the clients, designed to handle calls receiving and
14
18
  returning objects when appropriate.
15
- If errors are found in the response, they are processed using `ErrorMapper` to return a list of Errors.
19
+ If errors are found in the response, they are processed to raise an APIError.
16
20
  """
17
21
 
18
- def __init__(self, api_key: str = None, base_url: str = None, alias: str = "default"):
22
+ def __init__(self, api_key: str = None, base_url: str = None, alias: str = None):
19
23
  self.__organization_client = OrganizationClient(api_key=api_key, base_url=base_url, alias=alias)
20
24
 
21
25
  def get_assistant_list(
@@ -32,13 +36,16 @@ class OrganizationManager:
32
36
  - "summary": Provides a summarized list of assistants. (Default)
33
37
  - "full": Provides a detailed list of assistants. (Optional)
34
38
  :return: AssistantListResponse - The mapped response containing the list of assistants.
39
+ :raises APIError: If the API returns errors.
35
40
  """
36
41
  response_data = self.__organization_client.get_assistant_list(detail=detail)
37
42
  if ErrorHandler.has_errors(response_data):
38
- result = ErrorHandler.extract_error(response_data)
39
- else:
40
- result = OrganizationResponseMapper.map_to_assistant_list_response(response_data)
41
- # TODO -> Add assistant list from plugins API
43
+ error = ErrorHandler.extract_error(response_data)
44
+ logger.error(f"Error received while retrieving assistant list: {error}")
45
+ raise APIError(f"Error received while retrieving assistant list: {error}")
46
+
47
+ result = OrganizationResponseMapper.map_to_assistant_list_response(response_data)
48
+ # TODO -> Add assistant list from plugins API
42
49
  return result
43
50
 
44
51
  def get_project_list(
@@ -56,16 +63,19 @@ class OrganizationManager:
56
63
  - "summary": Provides a summarized list of projects. (Default)
57
64
  - "full": Provides a detailed list of projects. (Optional)
58
65
  :param name: str, optional - Filters projects by name. If not provided, all projects are returned.
59
- :return: ProjectListResponse - The mapped response containing the list of projects or an error list.
66
+ :return: ProjectListResponse - The mapped response containing the list of projects.
67
+ :raises APIError: If the API returns errors.
60
68
  """
61
69
  response_data = self.__organization_client.get_project_list(
62
70
  detail=detail,
63
71
  name=name
64
72
  )
65
73
  if ErrorHandler.has_errors(response_data):
66
- result = ErrorHandler.extract_error(response_data)
67
- else:
68
- result = OrganizationResponseMapper.map_to_project_list_response(response_data)
74
+ error = ErrorHandler.extract_error(response_data)
75
+ logger.error(f"Error received while retrieving project list: {error}")
76
+ raise APIError(f"Error received while retrieving project list: {error}")
77
+
78
+ result = OrganizationResponseMapper.map_to_project_list_response(response_data)
69
79
  return result
70
80
 
71
81
  def get_project_data(
@@ -78,37 +88,34 @@ class OrganizationManager:
78
88
  This method calls `OrganizationClient.get_project_data` to fetch project details
79
89
  and maps the response using `OrganizationResponseMapper` into a `ProjectDataResponse` object.
80
90
 
81
- If the response contains errors, they are processed using `ErrorMapper` to return an `ErrorListResponse`.
82
-
83
91
  :param project_id: str - The unique identifier of the project to retrieve.
84
- :return: ProjectDataResponse - The mapped response containing project details or an error list.
92
+ :return: ProjectDataResponse - The mapped response containing project details.
93
+ :raises APIError: If the API returns errors.
85
94
  """
86
95
  response_data = self.__organization_client.get_project_data(
87
96
  project_id=project_id
88
97
  )
89
98
  if ErrorHandler.has_errors(response_data):
90
- result = ErrorHandler.extract_error(response_data)
91
- else:
92
- result = OrganizationResponseMapper.map_to_project_data(response_data)
99
+ error = ErrorHandler.extract_error(response_data)
100
+ logger.error(f"Error received while retrieving project data: {error}")
101
+ raise APIError(f"Error received while retrieving project data: {error}")
102
+
103
+ result = OrganizationResponseMapper.map_to_project_data(response_data)
93
104
  return result
94
105
 
95
106
  def create_project(
96
107
  self,
97
108
  project: Project
98
-
99
- ):
109
+ ) -> ProjectDataResponse:
100
110
  """
101
111
  Creates a new project with the given details and optional usage limit settings.
102
112
 
103
113
  This method calls `OrganizationClient.create_project` to create a new project and maps the response
104
114
  using `OrganizationResponseMapper` into a `ProjectDataResponse` object.
105
115
 
106
- If the response contains errors, they are processed using `ErrorMapper` to return an `ErrorListResponse`.
107
-
108
116
  :param project: Project - The project object containing details such as name, email, and description.
109
- :param usage_limit: UsageLimit, optional - Defines usage limits for the project, including subscription type,
110
- unit, soft and hard limits, and renewal status. Defaults to None.
111
- :return: ProjectDataResponse - The mapped response containing the created project details or an error list.
117
+ :return: ProjectDataResponse - The mapped response containing the created project details.
118
+ :raises APIError: If the API returns errors.
112
119
  """
113
120
  response_data = self.__organization_client.create_project(
114
121
  name=project.name,
@@ -124,26 +131,26 @@ class OrganizationManager:
124
131
  )
125
132
 
126
133
  if ErrorHandler.has_errors(response_data):
127
- result = ErrorHandler.extract_error(response_data)
128
- else:
129
- result = OrganizationResponseMapper.map_to_project_data(response_data)
134
+ error = ErrorHandler.extract_error(response_data)
135
+ logger.error(f"Error received while creating project: {error}")
136
+ raise APIError(f"Error received while creating project: {error}")
130
137
 
138
+ result = OrganizationResponseMapper.map_to_project_data(response_data)
131
139
  return result
132
140
 
133
141
  def update_project(
134
142
  self,
135
143
  project: Project
136
- ):
144
+ ) -> ProjectDataResponse:
137
145
  """
138
146
  Updates an existing project with the provided details.
139
147
 
140
148
  This method calls `OrganizationClient.update_project` to update project information and maps the response
141
149
  using `OrganizationResponseMapper` into a `ProjectDataResponse` object.
142
150
 
143
- If the response contains errors, they are processed using `ErrorMapper` to return an `ErrorListResponse`.
144
-
145
151
  :param project: Project - The project object containing updated details such as project ID, name, and description.
146
- :return: ProjectDataResponse - The mapped response containing the updated project details or an error list.
152
+ :return: ProjectDataResponse - The mapped response containing the updated project details.
153
+ :raises APIError: If the API returns errors.
147
154
  """
148
155
  response_data = self.__organization_client.update_project(
149
156
  project_id=project.id,
@@ -151,10 +158,11 @@ class OrganizationManager:
151
158
  description=project.description
152
159
  )
153
160
  if ErrorHandler.has_errors(response_data):
154
- result = ErrorHandler.extract_error(response_data)
155
- else:
156
- result = OrganizationResponseMapper.map_to_project_data(response_data)
161
+ error = ErrorHandler.extract_error(response_data)
162
+ logger.error(f"Error received while updating project: {error}")
163
+ raise APIError(f"Error received while updating project: {error}")
157
164
 
165
+ result = OrganizationResponseMapper.map_to_project_data(response_data)
158
166
  return result
159
167
 
160
168
  def delete_project(
@@ -167,19 +175,19 @@ class OrganizationManager:
167
175
  This method calls `OrganizationClient.delete_project` to remove a project and maps the response
168
176
  using `ResponseMapper.map_to_empty_response`.
169
177
 
170
- If the response contains errors, they are processed using `ErrorMapper` to return an `ErrorListResponse`.
171
-
172
178
  :param project_id: str - The unique identifier of the project to be deleted.
173
- :return: EmptyResponse - An empty response indicating successful deletion or an error list if the request fails.
179
+ :return: EmptyResponse - An empty response indicating successful deletion.
180
+ :raises APIError: If the API returns errors.
174
181
  """
175
182
  response_data = self.__organization_client.delete_project(
176
183
  project_id=project_id
177
184
  )
178
185
  if ErrorHandler.has_errors(response_data):
179
- result = ErrorHandler.extract_error(response_data)
180
- else:
181
- result = ResponseMapper.map_to_empty_response(response_data)
186
+ error = ErrorHandler.extract_error(response_data)
187
+ logger.error(f"Error received while deleting project: {error}")
188
+ raise APIError(f"Error received while deleting project: {error}")
182
189
 
190
+ result = ResponseMapper.map_to_empty_response(response_data or "Project deleted successfully")
183
191
  return result
184
192
 
185
193
  def get_project_tokens(
@@ -192,19 +200,19 @@ class OrganizationManager:
192
200
  This method calls `OrganizationClient.get_project_tokens` to fetch token data and maps the response
193
201
  using `OrganizationResponseMapper.map_to_token_list_response`.
194
202
 
195
- If the response contains errors, they are processed using `ErrorMapper` to return an `ErrorListResponse`.
196
-
197
203
  :param project_id: str - The unique identifier of the project whose tokens are to be retrieved.
198
- :return: ProjectTokensResponse - The mapped response containing the list of project tokens or an error list.
204
+ :return: ProjectTokensResponse - The mapped response containing the list of project tokens.
205
+ :raises APIError: If the API returns errors.
199
206
  """
200
207
  response_data = self.__organization_client.get_project_tokens(
201
208
  project_id=project_id
202
209
  )
203
210
  if ErrorHandler.has_errors(response_data):
204
- result = ErrorHandler.extract_error(response_data)
205
- else:
206
- result = OrganizationResponseMapper.map_to_token_list_response(response_data)
211
+ error = ErrorHandler.extract_error(response_data)
212
+ logger.error(f"Error received while retrieving project tokens: {error}")
213
+ raise APIError(f"Error received while retrieving project tokens: {error}")
207
214
 
215
+ result = OrganizationResponseMapper.map_to_token_list_response(response_data)
208
216
  return result
209
217
 
210
218
  def export_request_data(
@@ -221,13 +229,12 @@ class OrganizationManager:
221
229
  filtered by assistant name, status, and pagination parameters. The response is mapped
222
230
  using `OrganizationResponseMapper.map_to_item_list_response`.
223
231
 
224
- If the response contains errors, they are processed using `ErrorMapper` to return an `ErrorListResponse`.
225
-
226
232
  :param assistant_name: str, optional - Filters requests by assistant name. If not provided, all assistants are included.
227
233
  :param status: str, optional - Filters requests by status. If not provided, all statuses are included.
228
234
  :param skip: int, optional - The number of records to skip for pagination. Default is 0.
229
235
  :param count: int, optional - The number of records to retrieve. Default is 0 (no limit).
230
- :return: ProjectItemListResponse - The mapped response containing the exported request data or an error list.
236
+ :return: ProjectItemListResponse - The mapped response containing the exported request data.
237
+ :raises APIError: If the API returns errors.
231
238
  """
232
239
  response_data = self.__organization_client.export_request_data(
233
240
  assistant_name=assistant_name,
@@ -236,8 +243,295 @@ class OrganizationManager:
236
243
  count=count
237
244
  )
238
245
  if ErrorHandler.has_errors(response_data):
239
- result = ErrorHandler.extract_error(response_data)
240
- else:
241
- result = OrganizationResponseMapper.map_to_item_list_response(response_data)
246
+ error = ErrorHandler.extract_error(response_data)
247
+ logger.error(f"Error received while exporting request data: {error}")
248
+ raise APIError(f"Error received while exporting request data: {error}")
249
+
250
+ result = OrganizationResponseMapper.map_to_item_list_response(response_data)
251
+ return result
252
+
253
+ def get_memberships(
254
+ self,
255
+ email: str = None,
256
+ start_page: int = 1,
257
+ page_size: int = 20,
258
+ order_key: str = None,
259
+ order_direction: str = "desc",
260
+ role_types: str = None
261
+ ) -> MembershipsResponse:
262
+ """
263
+ Retrieves a list of Organizations and Projects a user belongs to with their Roles.
264
+
265
+ This method calls `OrganizationClient.get_memberships` to fetch membership data
266
+ and maps the response using `OrganizationResponseMapper.map_to_memberships_response`.
267
+
268
+ :param email: str, optional - The email address of the user to search for (case-insensitive).
269
+ :param start_page: int - The page number for pagination (default is 1).
270
+ :param page_size: int - The number of items per page (default is 20).
271
+ :param order_key: str, optional - Field for sorting. Only 'organizationName' is supported.
272
+ :param order_direction: str - Sort direction: 'asc' or 'desc' (default is 'desc').
273
+ :param role_types: str, optional - Comma-separated list of role types: 'backend', 'frontend' (case-insensitive).
274
+ :return: MembershipsResponse - The mapped response containing organizations and projects with roles.
275
+ :raises APIError: If the API returns errors.
276
+ """
277
+ response_data = self.__organization_client.get_memberships(
278
+ email=email,
279
+ start_page=start_page,
280
+ page_size=page_size,
281
+ order_key=order_key,
282
+ order_direction=order_direction,
283
+ role_types=role_types
284
+ )
285
+ if ErrorHandler.has_errors(response_data):
286
+ error = ErrorHandler.extract_error(response_data)
287
+ logger.error(f"Error received while retrieving memberships: {error}")
288
+ raise APIError(f"Error received while retrieving memberships: {error}")
289
+
290
+ result = OrganizationResponseMapper.map_to_memberships_response(response_data)
291
+ return result
292
+
293
+ def get_project_memberships(
294
+ self,
295
+ email: str = None,
296
+ start_page: int = 1,
297
+ page_size: int = 20,
298
+ order_key: str = None,
299
+ order_direction: str = "desc",
300
+ role_types: str = None
301
+ ) -> ProjectMembershipsResponse:
302
+ """
303
+ Retrieves a list of Projects and Roles for a user within a specific Organization.
304
+
305
+ This method calls `OrganizationClient.get_project_memberships` to fetch project membership data
306
+ and maps the response using `OrganizationResponseMapper.map_to_project_memberships_response`.
307
+
308
+ :param email: str, optional - The email address of the user to search for (case-insensitive).
309
+ :param start_page: int - The page number for pagination (default is 1).
310
+ :param page_size: int - The number of items per page (default is 20).
311
+ :param order_key: str, optional - Field for sorting. Only 'projectName' is supported.
312
+ :param order_direction: str - Sort direction: 'asc' or 'desc' (default is 'desc').
313
+ :param role_types: str, optional - Comma-separated list of role types: 'backend', 'frontend' (case-insensitive).
314
+ :return: ProjectMembershipsResponse - The mapped response containing projects with roles.
315
+ :raises APIError: If the API returns errors.
316
+ """
317
+ response_data = self.__organization_client.get_project_memberships(
318
+ email=email,
319
+ start_page=start_page,
320
+ page_size=page_size,
321
+ order_key=order_key,
322
+ order_direction=order_direction,
323
+ role_types=role_types
324
+ )
325
+ if ErrorHandler.has_errors(response_data):
326
+ error = ErrorHandler.extract_error(response_data)
327
+ logger.error(f"Error received while retrieving project memberships: {error}")
328
+ raise APIError(f"Error received while retrieving project memberships: {error}")
329
+
330
+ result = OrganizationResponseMapper.map_to_project_memberships_response(response_data)
331
+ return result
332
+
333
+ def get_project_roles(
334
+ self,
335
+ project_id: str
336
+ ) -> ProjectRolesResponse:
337
+ """
338
+ Retrieves all Roles supported by a specific Project.
339
+
340
+ This method calls `OrganizationClient.get_project_roles` to fetch project roles
341
+ and maps the response using `OrganizationResponseMapper.map_to_project_roles_response`.
342
+
343
+ :param project_id: str - The unique identifier of the project.
344
+ :return: ProjectRolesResponse - The mapped response containing the list of roles.
345
+ :raises APIError: If the API returns errors.
346
+ """
347
+ response_data = self.__organization_client.get_project_roles(
348
+ project_id=project_id
349
+ )
350
+ if ErrorHandler.has_errors(response_data):
351
+ error = ErrorHandler.extract_error(response_data)
352
+ logger.error(f"Error received while retrieving project roles: {error}")
353
+ raise APIError(f"Error received while retrieving project roles: {error}")
354
+
355
+ result = OrganizationResponseMapper.map_to_project_roles_response(response_data)
356
+ return result
357
+
358
+ def get_project_members(
359
+ self,
360
+ project_id: str
361
+ ) -> ProjectMembersResponse:
362
+ """
363
+ Retrieves all members and their Roles for a specific Project.
364
+
365
+ This method calls `OrganizationClient.get_project_members` to fetch project members
366
+ and maps the response using `OrganizationResponseMapper.map_to_project_members_response`.
367
+
368
+ :param project_id: str - The unique identifier of the project.
369
+ :return: ProjectMembersResponse - The mapped response containing members with their roles.
370
+ :raises APIError: If the API returns errors.
371
+ """
372
+ response_data = self.__organization_client.get_project_members(
373
+ project_id=project_id
374
+ )
375
+ if ErrorHandler.has_errors(response_data):
376
+ error = ErrorHandler.extract_error(response_data)
377
+ logger.error(f"Error received while retrieving project members: {error}")
378
+ raise APIError(f"Error received while retrieving project members: {error}")
379
+
380
+ result = OrganizationResponseMapper.map_to_project_members_response(response_data)
381
+ return result
382
+
383
+ def get_organization_members(
384
+ self,
385
+ organization_id: str
386
+ ) -> OrganizationMembersResponse:
387
+ """
388
+ Retrieves all members and their Roles for a specific Organization.
389
+
390
+ This method calls `OrganizationClient.get_organization_members` to fetch organization members
391
+ and maps the response using `OrganizationResponseMapper.map_to_organization_members_response`.
392
+
393
+ :param organization_id: str - The unique identifier of the organization.
394
+ :return: OrganizationMembersResponse - The mapped response containing members with their roles.
395
+ :raises APIError: If the API returns errors.
396
+ """
397
+ response_data = self.__organization_client.get_organization_members(
398
+ organization_id=organization_id
399
+ )
400
+ if ErrorHandler.has_errors(response_data):
401
+ error = ErrorHandler.extract_error(response_data)
402
+ logger.error(f"Error received while retrieving organization members: {error}")
403
+ raise APIError(f"Error received while retrieving organization members: {error}")
404
+
405
+ result = OrganizationResponseMapper.map_to_organization_members_response(response_data)
406
+ return result
407
+
408
+ def add_project_member(
409
+ self,
410
+ project_id: str,
411
+ user_email: str,
412
+ roles: list
413
+ ) -> EmptyResponse:
414
+ """
415
+ Adds a user to a project by sending an invitation with the specified roles.
416
+
417
+ This method calls `OrganizationClient.add_project_member` to invite a user to the project
418
+ and maps the response to an `EmptyResponse`.
419
+
420
+ :param project_id: str - The unique identifier of the project.
421
+ :param user_email: str - The email address of the user to invite.
422
+ :param roles: list - A list of role names or GUIDs to assign to the user.
423
+ :return: EmptyResponse - An empty response indicating successful invitation.
424
+ :raises APIError: If the API returns errors.
425
+ """
426
+ response_data = self.__organization_client.add_project_member(
427
+ project_id=project_id,
428
+ user_email=user_email,
429
+ roles=roles
430
+ )
431
+ if ErrorHandler.has_errors(response_data):
432
+ error = ErrorHandler.extract_error(response_data)
433
+ logger.error(f"Error received while adding project member: {error}")
434
+ raise APIError(f"Error received while adding project member: {error}")
435
+
436
+ result = ResponseMapper.map_to_empty_response(response_data or "Invitation sent successfully")
437
+ return result
438
+
439
+ def create_organization(
440
+ self,
441
+ name: str,
442
+ administrator_user_email: str
443
+ ) -> OrganizationDataResponse:
444
+ """
445
+ Creates a new organization with the given details.
446
+
447
+ This endpoint requires an OAuth access token from the System Administrator role.
448
+
449
+ This method calls `OrganizationClient.create_organization` to create a new organization and maps the response
450
+ using `OrganizationResponseMapper` into an `OrganizationDataResponse` object.
451
+
452
+ :param name: str - The name of the new organization (required).
453
+ :param administrator_user_email: str - The email address of the organization administrator (required).
454
+ :return: OrganizationDataResponse - The mapped response containing the created organization details.
455
+ :raises APIError: If the API returns errors.
456
+ """
457
+ response_data = self.__organization_client.create_organization(
458
+ name=name,
459
+ administrator_user_email=administrator_user_email
460
+ )
461
+
462
+ if ErrorHandler.has_errors(response_data):
463
+ error = ErrorHandler.extract_error(response_data)
464
+ logger.error(f"Error received while creating organization: {error}")
465
+ raise APIError(f"Error received while creating organization: {error}")
466
+
467
+ result = OrganizationResponseMapper.map_to_organization_data_response(response_data)
468
+ return result
469
+
470
+ def get_organization_list(
471
+ self,
472
+ start_page: int = None,
473
+ page_size: int = None,
474
+ order_key: str = None,
475
+ order_direction: str = "desc",
476
+ filter_key: str = None,
477
+ filter_value: str = None
478
+ ) -> OrganizationListResponse:
479
+ """
480
+ Retrieves a list of organizations based on the specified search criteria.
481
+
482
+ This endpoint requires an OAuth access token from the System Administrator role.
483
+
484
+ This method calls `OrganizationClient.get_organization_list` to fetch organization data
485
+ and maps the response using `OrganizationResponseMapper` into an `OrganizationListResponse` object.
486
+
487
+ :param start_page: int, optional - The page number for pagination.
488
+ :param page_size: int, optional - The number of items per page.
489
+ :param order_key: str, optional - Field for sorting. Only 'name' is supported.
490
+ :param order_direction: str - Sort direction: 'asc' or 'desc' (default is 'desc').
491
+ :param filter_key: str, optional - Field for filtering. Only 'name' is supported.
492
+ :param filter_value: str, optional - Value to filter by.
493
+ :return: OrganizationListResponse - The mapped response containing the list of organizations.
494
+ :raises APIError: If the API returns errors.
495
+ """
496
+ response_data = self.__organization_client.get_organization_list(
497
+ start_page=start_page,
498
+ page_size=page_size,
499
+ order_key=order_key,
500
+ order_direction=order_direction,
501
+ filter_key=filter_key,
502
+ filter_value=filter_value
503
+ )
504
+ if ErrorHandler.has_errors(response_data):
505
+ error = ErrorHandler.extract_error(response_data)
506
+ logger.error(f"Error received while retrieving organization list: {error}")
507
+ raise APIError(f"Error received while retrieving organization list: {error}")
508
+
509
+ result = OrganizationResponseMapper.map_to_organization_list_response(response_data)
510
+ return result
511
+
512
+ def delete_organization(
513
+ self,
514
+ organization_id: str
515
+ ) -> EmptyResponse:
516
+ """
517
+ Deletes an organization by its unique identifier.
518
+
519
+ This endpoint requires an OAuth access token from the System Administrator role.
520
+
521
+ This method calls `OrganizationClient.delete_organization` to remove an organization and maps the response
522
+ using `ResponseMapper.map_to_empty_response`.
523
+
524
+ :param organization_id: str - The unique identifier of the organization to be deleted.
525
+ :return: EmptyResponse - An empty response indicating successful deletion.
526
+ :raises APIError: If the API returns errors.
527
+ """
528
+ response_data = self.__organization_client.delete_organization(
529
+ organization_id=organization_id
530
+ )
531
+ if ErrorHandler.has_errors(response_data):
532
+ error = ErrorHandler.extract_error(response_data)
533
+ logger.error(f"Error received while deleting organization: {error}")
534
+ raise APIError(f"Error received while deleting organization: {error}")
242
535
 
536
+ result = ResponseMapper.map_to_empty_response(response_data or "Organization deleted successfully")
243
537
  return result
@@ -1,7 +1,9 @@
1
1
  from pygeai.core.base.mappers import ModelMapper
2
- from pygeai.core.models import Assistant, Project
2
+ from pygeai.core.models import Assistant, Project, Role, Member, OrganizationMembership, ProjectMembership, Organization
3
3
  from pygeai.organization.responses import AssistantListResponse, ProjectListResponse, ProjectDataResponse, \
4
- ProjectTokensResponse, ProjectItemListResponse
4
+ ProjectTokensResponse, ProjectItemListResponse, MembershipsResponse, ProjectMembershipsResponse, \
5
+ ProjectRolesResponse, ProjectMembersResponse, OrganizationMembersResponse, OrganizationListResponse, \
6
+ OrganizationDataResponse
5
7
 
6
8
 
7
9
  class OrganizationResponseMapper:
@@ -76,3 +78,101 @@ class OrganizationResponseMapper:
76
78
  items=item_list
77
79
  )
78
80
 
81
+ @classmethod
82
+ def map_to_memberships_response(cls, data: dict) -> MembershipsResponse:
83
+ count = data.get("count", 0)
84
+ pages = data.get("pages", 0)
85
+ organizations_data = data.get("organizations", [])
86
+ organizations = []
87
+
88
+ for org_data in organizations_data:
89
+ org = OrganizationMembership.model_validate(org_data)
90
+ organizations.append(org)
91
+
92
+ return MembershipsResponse(
93
+ count=count,
94
+ pages=pages,
95
+ organizations=organizations
96
+ )
97
+
98
+ @classmethod
99
+ def map_to_project_memberships_response(cls, data: dict) -> ProjectMembershipsResponse:
100
+ count = data.get("count", 0)
101
+ pages = data.get("pages", 0)
102
+ projects_data = data.get("projects", [])
103
+ projects = []
104
+
105
+ for project_data in projects_data:
106
+ project = ProjectMembership.model_validate(project_data)
107
+ projects.append(project)
108
+
109
+ return ProjectMembershipsResponse(
110
+ count=count,
111
+ pages=pages,
112
+ projects=projects
113
+ )
114
+
115
+ @classmethod
116
+ def map_to_project_roles_response(cls, data: dict) -> ProjectRolesResponse:
117
+ roles_data = data.get("roles", [])
118
+ roles = []
119
+
120
+ for role_data in roles_data:
121
+ role = Role.model_validate(role_data)
122
+ roles.append(role)
123
+
124
+ return ProjectRolesResponse(
125
+ roles=roles
126
+ )
127
+
128
+ @classmethod
129
+ def map_to_project_members_response(cls, data: dict) -> ProjectMembersResponse:
130
+ members_data = data.get("members", [])
131
+ members = []
132
+
133
+ for member_data in members_data:
134
+ member = Member.model_validate(member_data)
135
+ members.append(member)
136
+
137
+ return ProjectMembersResponse(
138
+ members=members
139
+ )
140
+
141
+ @classmethod
142
+ def map_to_organization_members_response(cls, data: dict) -> OrganizationMembersResponse:
143
+ members_data = data.get("members", [])
144
+ members = []
145
+
146
+ for member_data in members_data:
147
+ member = Member.model_validate(member_data)
148
+ members.append(member)
149
+
150
+ return OrganizationMembersResponse(
151
+ members=members
152
+ )
153
+
154
+ @classmethod
155
+ def map_to_organization_list_response(cls, data: dict) -> OrganizationListResponse:
156
+ count = data.get("count", 0)
157
+ pages = data.get("pages", 0)
158
+ organizations_data = data.get("organizations", [])
159
+ organizations = []
160
+
161
+ for org_data in organizations_data:
162
+ organization = Organization.model_validate(org_data)
163
+ organizations.append(organization)
164
+
165
+ return OrganizationListResponse(
166
+ count=count,
167
+ pages=pages,
168
+ organizations=organizations
169
+ )
170
+
171
+ @classmethod
172
+ def map_to_organization_data_response(cls, data: dict) -> OrganizationDataResponse:
173
+ organization = Organization.model_validate(data)
174
+
175
+ return OrganizationDataResponse(
176
+ organization=organization
177
+ )
178
+