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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pygeai might be problematic. Click here for more details.

Files changed (648) hide show
  1. pygeai/__init__.py +9 -1
  2. pygeai/_docs/Makefile +20 -0
  3. pygeai/_docs/make.bat +35 -0
  4. pygeai/_docs/source/conf.py +117 -0
  5. pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
  6. pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
  7. pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
  8. pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
  9. pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
  10. pygeai/_docs/source/content/ai_lab.rst +102 -0
  11. pygeai/_docs/source/content/analytics.rst +598 -0
  12. pygeai/_docs/source/content/api_reference/admin.rst +161 -0
  13. pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
  14. pygeai/_docs/source/content/api_reference/auth.rst +379 -0
  15. pygeai/_docs/source/content/api_reference/chat.rst +754 -0
  16. pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
  17. pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
  18. pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
  19. pygeai/_docs/source/content/api_reference/files.rst +592 -0
  20. pygeai/_docs/source/content/api_reference/gam.rst +401 -0
  21. pygeai/_docs/source/content/api_reference/health.rst +58 -0
  22. pygeai/_docs/source/content/api_reference/project.rst +738 -0
  23. pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
  24. pygeai/_docs/source/content/api_reference/rag.rst +710 -0
  25. pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
  26. pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
  27. pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
  28. pygeai/_docs/source/content/api_reference.rst +58 -0
  29. pygeai/_docs/source/content/authentication.rst +295 -0
  30. pygeai/_docs/source/content/chat_gui.rst +121 -0
  31. pygeai/_docs/source/content/cli.rst +203 -0
  32. pygeai/_docs/source/content/debugger.rst +651 -0
  33. pygeai/_docs/source/content/intro.rst +67 -0
  34. pygeai/_docs/source/content/migration.rst +929 -0
  35. pygeai/_docs/source/content/modules.rst +7 -0
  36. pygeai/_docs/source/content/quickstart.rst +143 -0
  37. pygeai/_docs/source/content/samples.rst +394 -0
  38. pygeai/_docs/source/index.rst +75 -0
  39. pygeai/_docs/source/modules.rst +7 -0
  40. pygeai/_docs/source/pygeai.admin.rst +29 -0
  41. pygeai/_docs/source/pygeai.analytics.rst +53 -0
  42. pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
  43. pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
  44. pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
  45. pygeai/_docs/source/pygeai.assistant.rst +55 -0
  46. pygeai/_docs/source/pygeai.auth.rst +29 -0
  47. pygeai/_docs/source/pygeai.chat.rst +69 -0
  48. pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
  49. pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
  50. pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
  51. pygeai/_docs/source/pygeai.cli.rst +62 -0
  52. pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
  53. pygeai/_docs/source/pygeai.core.base.rst +53 -0
  54. pygeai/_docs/source/pygeai.core.common.rst +37 -0
  55. pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
  56. pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
  57. pygeai/_docs/source/pygeai.core.files.rst +61 -0
  58. pygeai/_docs/source/pygeai.core.llm.rst +29 -0
  59. pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
  60. pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
  61. pygeai/_docs/source/pygeai.core.rst +63 -0
  62. pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
  63. pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
  64. pygeai/_docs/source/pygeai.core.services.rst +37 -0
  65. pygeai/_docs/source/pygeai.core.utils.rst +37 -0
  66. pygeai/_docs/source/pygeai.dbg.rst +21 -0
  67. pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
  68. pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
  69. pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
  70. pygeai/_docs/source/pygeai.evaluation.rst +31 -0
  71. pygeai/_docs/source/pygeai.flows.rst +29 -0
  72. pygeai/_docs/source/pygeai.gam.rst +29 -0
  73. pygeai/_docs/source/pygeai.health.rst +29 -0
  74. pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
  75. pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
  76. pygeai/_docs/source/pygeai.lab.rst +65 -0
  77. pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
  78. pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
  79. pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
  80. pygeai/_docs/source/pygeai.man.man1.rst +10 -0
  81. pygeai/_docs/source/pygeai.man.rst +18 -0
  82. pygeai/_docs/source/pygeai.migration.rst +29 -0
  83. pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
  84. pygeai/_docs/source/pygeai.organization.rst +61 -0
  85. pygeai/_docs/source/pygeai.proxy.rst +53 -0
  86. pygeai/_docs/source/pygeai.rst +35 -0
  87. pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
  88. pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
  89. pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
  90. pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
  91. pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
  92. pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
  93. pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
  94. pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
  95. pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
  96. pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
  97. pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
  98. pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
  99. pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
  100. pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
  101. pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
  102. pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
  103. pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
  104. pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
  105. pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
  106. pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
  107. pygeai/_docs/source/pygeai.tests.core.rst +39 -0
  108. pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
  109. pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
  110. pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
  111. pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
  112. pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
  113. pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
  114. pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
  115. pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
  116. pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
  117. pygeai/_docs/source/pygeai.tests.health.rst +21 -0
  118. pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
  119. pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
  120. pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
  121. pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
  122. pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
  123. pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
  124. pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
  125. pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
  126. pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
  127. pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
  128. pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
  129. pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
  130. pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
  131. pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
  132. pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
  133. pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
  134. pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
  135. pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
  136. pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
  137. pygeai/_docs/source/pygeai.tests.rst +33 -0
  138. pygeai/admin/clients.py +14 -11
  139. pygeai/admin/endpoints.py +2 -2
  140. pygeai/analytics/clients.py +505 -0
  141. pygeai/analytics/endpoints.py +35 -0
  142. pygeai/analytics/managers.py +606 -0
  143. pygeai/analytics/mappers.py +207 -0
  144. pygeai/analytics/responses.py +240 -0
  145. pygeai/assistant/clients.py +18 -45
  146. pygeai/assistant/data/clients.py +1 -0
  147. pygeai/assistant/data_analyst/clients.py +8 -12
  148. pygeai/assistant/managers.py +195 -157
  149. pygeai/assistant/mappers.py +4 -2
  150. pygeai/assistant/rag/clients.py +27 -67
  151. pygeai/assistant/rag/mappers.py +12 -6
  152. pygeai/assistant/rag/models.py +301 -159
  153. pygeai/auth/__init__.py +0 -0
  154. pygeai/auth/clients.py +129 -0
  155. pygeai/auth/endpoints.py +6 -0
  156. pygeai/chat/clients.py +308 -37
  157. pygeai/chat/endpoints.py +3 -0
  158. pygeai/chat/iris.py +2 -8
  159. pygeai/chat/managers.py +9 -6
  160. pygeai/chat/session.py +38 -0
  161. pygeai/chat/settings.py +6 -0
  162. pygeai/chat/ui.py +678 -0
  163. pygeai/cli/__init__.py +0 -1
  164. pygeai/cli/commands/admin.py +7 -10
  165. pygeai/cli/commands/analytics.py +533 -0
  166. pygeai/cli/commands/assistant.py +9 -9
  167. pygeai/cli/commands/auth.py +299 -0
  168. pygeai/cli/commands/base.py +71 -9
  169. pygeai/cli/commands/chat.py +676 -19
  170. pygeai/cli/commands/common.py +28 -24
  171. pygeai/cli/commands/configuration.py +66 -13
  172. pygeai/cli/commands/docs.py +105 -0
  173. pygeai/cli/commands/embeddings.py +58 -11
  174. pygeai/cli/commands/evaluation.py +38 -38
  175. pygeai/cli/commands/feedback.py +3 -4
  176. pygeai/cli/commands/files.py +7 -8
  177. pygeai/cli/commands/gam.py +85 -10
  178. pygeai/cli/commands/lab/ai_lab.py +340 -484
  179. pygeai/cli/commands/lab/options.py +8 -0
  180. pygeai/cli/commands/lab/spec.py +273 -0
  181. pygeai/cli/commands/lab/utils.py +13 -0
  182. pygeai/cli/commands/llm.py +6 -7
  183. pygeai/cli/commands/migrate.py +1064 -436
  184. pygeai/cli/commands/organization.py +516 -11
  185. pygeai/cli/commands/rag.py +13 -14
  186. pygeai/cli/commands/rerank.py +3 -5
  187. pygeai/cli/commands/secrets.py +8 -9
  188. pygeai/cli/commands/usage_limits.py +18 -20
  189. pygeai/cli/commands/validators.py +144 -1
  190. pygeai/cli/commands/version.py +4 -5
  191. pygeai/cli/error_handler.py +151 -0
  192. pygeai/cli/geai.py +170 -31
  193. pygeai/cli/geai_proxy.py +86 -25
  194. pygeai/cli/install_man.py +93 -22
  195. pygeai/cli/parsers.py +75 -25
  196. pygeai/cli/texts/help.py +265 -28
  197. pygeai/core/base/clients.py +53 -12
  198. pygeai/core/base/mappers.py +11 -2
  199. pygeai/core/base/session.py +95 -11
  200. pygeai/core/common/config.py +78 -14
  201. pygeai/core/common/exceptions.py +96 -6
  202. pygeai/core/embeddings/__init__.py +19 -0
  203. pygeai/core/embeddings/clients.py +23 -5
  204. pygeai/core/embeddings/managers.py +9 -4
  205. pygeai/core/embeddings/mappers.py +16 -2
  206. pygeai/core/embeddings/responses.py +9 -2
  207. pygeai/core/feedback/clients.py +8 -3
  208. pygeai/core/files/clients.py +23 -24
  209. pygeai/core/files/managers.py +121 -30
  210. pygeai/core/files/responses.py +4 -3
  211. pygeai/core/handlers.py +10 -1
  212. pygeai/core/llm/clients.py +22 -29
  213. pygeai/core/models.py +127 -11
  214. pygeai/core/plugins/clients.py +6 -6
  215. pygeai/core/rerank/clients.py +9 -3
  216. pygeai/core/rerank/managers.py +22 -5
  217. pygeai/core/secrets/clients.py +16 -37
  218. pygeai/core/services/response.py +18 -0
  219. pygeai/core/services/rest.py +159 -49
  220. pygeai/core/utils/__init__.py +0 -0
  221. pygeai/core/utils/console.py +83 -0
  222. pygeai/core/utils/parsers.py +32 -0
  223. pygeai/core/utils/validators.py +10 -0
  224. pygeai/dbg/__init__.py +3 -0
  225. pygeai/dbg/debugger.py +854 -14
  226. pygeai/evaluation/clients.py +7 -4
  227. pygeai/evaluation/dataset/clients.py +46 -44
  228. pygeai/evaluation/plan/clients.py +28 -26
  229. pygeai/evaluation/result/clients.py +38 -5
  230. pygeai/gam/clients.py +50 -28
  231. pygeai/gam/endpoints.py +2 -1
  232. pygeai/health/__init__.py +0 -0
  233. pygeai/health/clients.py +24 -0
  234. pygeai/health/endpoints.py +1 -0
  235. pygeai/lab/__init__.py +0 -90
  236. pygeai/lab/agents/clients.py +203 -162
  237. pygeai/lab/agents/endpoints.py +4 -0
  238. pygeai/lab/agents/mappers.py +57 -7
  239. pygeai/lab/clients.py +24 -0
  240. pygeai/lab/constants.py +3 -0
  241. pygeai/lab/managers.py +571 -541
  242. pygeai/lab/models.py +108 -19
  243. pygeai/lab/processes/clients.py +332 -340
  244. pygeai/lab/processes/mappers.py +3 -3
  245. pygeai/lab/runners.py +90 -0
  246. pygeai/lab/spec/__init__.py +0 -0
  247. pygeai/lab/spec/loader.py +24 -0
  248. pygeai/lab/spec/parsers.py +39 -0
  249. pygeai/lab/strategies/clients.py +67 -63
  250. pygeai/lab/strategies/mappers.py +1 -1
  251. pygeai/lab/tools/clients.py +85 -118
  252. pygeai/lab/tools/endpoints.py +4 -0
  253. pygeai/lab/tools/mappers.py +5 -5
  254. pygeai/man/man1/geai-proxy.1 +116 -0
  255. pygeai/man/man1/geai.1 +2580 -66
  256. pygeai/migration/__init__.py +33 -0
  257. pygeai/migration/strategies.py +468 -146
  258. pygeai/migration/tools.py +170 -3
  259. pygeai/organization/clients.py +245 -50
  260. pygeai/organization/endpoints.py +17 -8
  261. pygeai/organization/limits/clients.py +34 -32
  262. pygeai/organization/limits/managers.py +108 -49
  263. pygeai/organization/managers.py +347 -53
  264. pygeai/organization/mappers.py +102 -2
  265. pygeai/organization/responses.py +58 -1
  266. pygeai/proxy/clients.py +6 -3
  267. pygeai/proxy/config.py +14 -1
  268. pygeai/proxy/managers.py +61 -33
  269. pygeai/proxy/servers.py +196 -51
  270. pygeai/proxy/tool.py +33 -16
  271. pygeai/tests/admin/__init__.py +0 -0
  272. pygeai/tests/admin/test_clients.py +148 -0
  273. pygeai/tests/analytics/__init__.py +0 -0
  274. pygeai/tests/analytics/test_clients.py +86 -0
  275. pygeai/tests/analytics/test_managers.py +94 -0
  276. pygeai/tests/analytics/test_mappers.py +84 -0
  277. pygeai/tests/analytics/test_responses.py +73 -0
  278. pygeai/tests/assistants/rag/test_clients.py +346 -0
  279. pygeai/tests/assistants/rag/test_models.py +292 -0
  280. pygeai/tests/assistants/test_clients.py +176 -82
  281. pygeai/tests/assistants/test_managers.py +191 -57
  282. pygeai/tests/auth/__init__.py +0 -0
  283. pygeai/tests/auth/test_clients.py +289 -0
  284. pygeai/tests/auth/test_oauth.py +172 -0
  285. pygeai/tests/auth/test_session_logging.py +150 -0
  286. pygeai/tests/chat/__init__.py +0 -0
  287. pygeai/tests/chat/test_clients.py +393 -0
  288. pygeai/tests/chat/test_iris.py +38 -0
  289. pygeai/tests/chat/test_session.py +62 -0
  290. pygeai/tests/chat/test_ui.py +224 -0
  291. pygeai/tests/cli/commands/__init__.py +0 -0
  292. pygeai/tests/cli/commands/lab/__init__.py +0 -0
  293. pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
  294. pygeai/tests/cli/commands/lab/test_common.py +208 -0
  295. pygeai/tests/cli/commands/lab/test_spec.py +246 -0
  296. pygeai/tests/cli/commands/test_assistant.py +202 -0
  297. pygeai/tests/cli/commands/test_chat.py +130 -0
  298. pygeai/tests/cli/commands/test_common.py +350 -0
  299. pygeai/tests/cli/commands/test_embeddings.py +132 -0
  300. pygeai/tests/cli/commands/test_evaluation.py +656 -0
  301. pygeai/tests/cli/commands/test_feedback.py +65 -0
  302. pygeai/tests/cli/commands/test_files.py +161 -0
  303. pygeai/tests/cli/commands/test_gam.py +201 -0
  304. pygeai/tests/cli/commands/test_llm.py +114 -0
  305. pygeai/tests/cli/commands/test_migrate.py +176 -0
  306. pygeai/tests/cli/commands/test_organization.py +276 -0
  307. pygeai/tests/cli/commands/test_rag.py +266 -0
  308. pygeai/tests/cli/commands/test_rerank.py +110 -0
  309. pygeai/tests/cli/commands/test_secrets.py +171 -0
  310. pygeai/tests/cli/commands/test_show_help.py +41 -0
  311. pygeai/tests/cli/commands/test_usage_limits.py +412 -0
  312. pygeai/tests/cli/commands/test_validators.py +160 -0
  313. pygeai/tests/cli/commands/test_version.py +81 -0
  314. pygeai/tests/cli/docker/__init__.py +0 -0
  315. pygeai/tests/cli/test_credentials_flag.py +316 -0
  316. pygeai/tests/cli/test_error_handler.py +225 -0
  317. pygeai/tests/cli/test_geai_driver.py +154 -0
  318. pygeai/tests/cli/test_parsers.py +5 -5
  319. pygeai/tests/core/base/data/models.py +7 -0
  320. pygeai/tests/core/base/test_mappers.py +43 -11
  321. pygeai/tests/core/base/test_models.py +3 -1
  322. pygeai/tests/core/base/test_responses.py +53 -0
  323. pygeai/tests/core/common/__init__.py +0 -0
  324. pygeai/tests/core/common/data/__init__.py +0 -0
  325. pygeai/tests/core/common/test_config.py +186 -0
  326. pygeai/tests/core/common/test_decorators.py +69 -0
  327. pygeai/tests/core/embeddings/__init__.py +0 -0
  328. pygeai/tests/core/embeddings/test_clients.py +225 -0
  329. pygeai/tests/core/embeddings/test_managers.py +171 -0
  330. pygeai/tests/core/embeddings/test_mappers.py +142 -0
  331. pygeai/tests/core/feedback/__init__.py +0 -0
  332. pygeai/tests/core/feedback/test_clients.py +64 -0
  333. pygeai/tests/core/files/test_clients.py +128 -0
  334. pygeai/tests/core/files/test_managers.py +124 -78
  335. pygeai/tests/core/files/test_mappers.py +137 -0
  336. pygeai/tests/core/files/test_models.py +103 -0
  337. pygeai/tests/core/files/test_responses.py +122 -0
  338. pygeai/tests/core/llm/__init__.py +0 -0
  339. pygeai/tests/core/llm/test_clients.py +142 -0
  340. pygeai/tests/core/plugins/__init__.py +0 -0
  341. pygeai/tests/core/plugins/test_clients.py +66 -0
  342. pygeai/tests/core/rerank/test_clients.py +76 -0
  343. pygeai/tests/core/rerank/test_managers.py +61 -39
  344. pygeai/tests/core/secrets/__init__.py +0 -0
  345. pygeai/tests/core/secrets/test_clients.py +264 -0
  346. pygeai/tests/core/services/__init__.py +0 -0
  347. pygeai/tests/core/services/test_rest.py +273 -0
  348. pygeai/tests/core/test_handlers.py +66 -0
  349. pygeai/tests/core/utils/__init__.py +0 -0
  350. pygeai/tests/core/utils/test_console.py +80 -0
  351. pygeai/tests/dbg/__init__.py +0 -0
  352. pygeai/tests/dbg/test_debugger.py +591 -0
  353. pygeai/tests/evaluation/__init__.py +0 -0
  354. pygeai/tests/evaluation/dataset/__init__.py +0 -0
  355. pygeai/tests/evaluation/dataset/test_clients.py +265 -0
  356. pygeai/tests/evaluation/plan/__init__.py +0 -0
  357. pygeai/tests/evaluation/plan/test_clients.py +195 -0
  358. pygeai/tests/evaluation/result/__init__.py +0 -0
  359. pygeai/tests/evaluation/result/test_clients.py +66 -0
  360. pygeai/tests/gam/__init__.py +0 -0
  361. pygeai/tests/gam/test_clients.py +195 -0
  362. pygeai/tests/health/__init__.py +0 -0
  363. pygeai/tests/health/test_clients.py +41 -0
  364. pygeai/tests/integration/__init__.py +0 -0
  365. pygeai/tests/integration/assistants/__init__.py +0 -0
  366. pygeai/tests/integration/assistants/rag/__init__.py +0 -0
  367. pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
  368. pygeai/tests/integration/chat/__init__.py +0 -0
  369. pygeai/tests/integration/chat/test_generate_image.py +158 -0
  370. pygeai/tests/integration/lab/__init__.py +0 -0
  371. pygeai/tests/integration/lab/agents/__init__.py +0 -0
  372. pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
  373. pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
  374. pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
  375. pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
  376. pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
  377. pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
  378. pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
  379. pygeai/tests/integration/lab/processes/__init__.py +0 -0
  380. pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
  381. pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
  382. pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
  383. pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
  384. pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
  385. pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
  386. pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
  387. pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
  388. pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
  389. pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
  390. pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
  391. pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
  392. pygeai/tests/integration/lab/tools/__init__.py +0 -0
  393. pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
  394. pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
  395. pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
  396. pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
  397. pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
  398. pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
  399. pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
  400. pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
  401. pygeai/tests/lab/agents/__init__.py +0 -0
  402. pygeai/tests/lab/agents/test_clients.py +481 -0
  403. pygeai/tests/lab/agents/test_mappers.py +440 -0
  404. pygeai/tests/lab/processes/__init__.py +0 -0
  405. pygeai/tests/lab/processes/test_clients.py +1416 -0
  406. pygeai/tests/lab/processes/test_mappers.py +1092 -0
  407. pygeai/tests/lab/spec/__init__.py +0 -0
  408. pygeai/tests/lab/spec/test_loader.py +59 -0
  409. pygeai/tests/lab/spec/test_parsers.py +182 -0
  410. pygeai/tests/lab/strategies/__init__.py +0 -0
  411. pygeai/tests/lab/strategies/test_clients.py +241 -0
  412. pygeai/tests/lab/strategies/test_mappers.py +132 -0
  413. pygeai/tests/lab/test_managers.py +553 -0
  414. pygeai/tests/lab/test_models.py +500 -3
  415. pygeai/tests/lab/tools/__init__.py +0 -0
  416. pygeai/tests/lab/tools/test_clients.py +521 -0
  417. pygeai/tests/lab/tools/test_mappers.py +198 -0
  418. pygeai/tests/migration/__init__.py +0 -0
  419. pygeai/tests/migration/test_strategies.py +405 -0
  420. pygeai/tests/migration/test_tools.py +159 -0
  421. pygeai/tests/organization/limits/test_clients.py +567 -0
  422. pygeai/tests/organization/limits/test_managers.py +298 -56
  423. pygeai/tests/organization/test_clients.py +600 -30
  424. pygeai/tests/organization/test_managers.py +424 -0
  425. pygeai/tests/organization/test_mappers.py +153 -0
  426. pygeai/tests/organization/test_responses.py +137 -0
  427. pygeai/tests/proxy/__init__.py +1 -0
  428. pygeai/tests/proxy/test_clients.py +397 -0
  429. pygeai/tests/proxy/test_config.py +171 -0
  430. pygeai/tests/proxy/test_integration.py +305 -0
  431. pygeai/tests/proxy/test_managers.py +312 -0
  432. pygeai/tests/proxy/test_servers.py +387 -0
  433. pygeai/tests/proxy/test_tool.py +176 -0
  434. pygeai/tests/snippets/analytics/__init__.py +0 -0
  435. pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
  436. pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
  437. pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
  438. pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
  439. pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
  440. pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
  441. pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
  442. pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
  443. pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
  444. pygeai/tests/snippets/auth/__init__.py +0 -0
  445. pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
  446. pygeai/tests/snippets/chat/get_response.py +15 -0
  447. pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
  448. pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
  449. pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
  450. pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
  451. pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
  452. pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
  453. pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
  454. pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
  455. pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
  456. pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
  457. pygeai/tests/snippets/dbg/__init__.py +0 -0
  458. pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
  459. pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
  460. pygeai/tests/snippets/dbg/file_debugging.py +72 -0
  461. pygeai/tests/snippets/dbg/module_debugging.py +61 -0
  462. pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
  463. pygeai/tests/snippets/dbg/stepping_example.py +40 -0
  464. pygeai/tests/snippets/embeddings/cache_example.py +31 -0
  465. pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
  466. pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
  467. pygeai/tests/snippets/embeddings/openai_example.py +30 -0
  468. pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
  469. pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
  470. pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
  471. pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
  472. pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
  473. pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
  474. pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
  475. pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
  476. pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
  477. pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
  478. pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
  479. pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
  480. pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
  481. pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
  482. pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
  483. pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
  484. pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
  485. pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
  486. pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
  487. pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
  488. pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
  489. pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
  490. pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
  491. pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
  492. pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
  493. pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
  494. pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
  495. pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
  496. pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
  497. pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
  498. pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
  499. pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
  500. pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
  501. pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
  502. pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
  503. pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
  504. pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
  505. pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
  506. pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
  507. pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
  508. pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
  509. pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
  510. pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
  511. pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
  512. pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
  513. pygeai/tests/snippets/files/delete_file.py +1 -4
  514. pygeai/tests/snippets/files/get_file_content.py +2 -4
  515. pygeai/tests/snippets/files/get_file_data.py +1 -4
  516. pygeai/tests/snippets/files/get_file_list.py +1 -6
  517. pygeai/tests/snippets/files/upload_file.py +1 -5
  518. pygeai/tests/snippets/gam/gam_access_token.py +87 -0
  519. pygeai/tests/snippets/lab/agentic_flow_example_1.py +25 -23
  520. pygeai/tests/snippets/lab/agentic_flow_example_4.py +23 -23
  521. pygeai/tests/snippets/lab/agents/create_agent.py +5 -8
  522. pygeai/tests/snippets/lab/agents/create_agent_2.py +1 -5
  523. pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
  524. pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
  525. pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
  526. pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
  527. pygeai/tests/snippets/lab/agents/delete_agent.py +1 -5
  528. pygeai/tests/snippets/lab/agents/get_agent.py +2 -11
  529. pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
  530. pygeai/tests/snippets/lab/agents/get_sharing_link.py +2 -7
  531. pygeai/tests/snippets/lab/agents/list_agents.py +4 -7
  532. pygeai/tests/snippets/lab/agents/publish_agent_revision.py +2 -6
  533. pygeai/tests/snippets/lab/agents/update_agent.py +1 -5
  534. pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
  535. pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
  536. pygeai/tests/snippets/lab/crud_ui.py +462 -0
  537. pygeai/tests/snippets/lab/processes/create_process.py +3 -5
  538. pygeai/tests/snippets/lab/processes/create_task.py +3 -5
  539. pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +10 -19
  540. pygeai/tests/snippets/lab/processes/kbs/create_kb.py +2 -5
  541. pygeai/tests/snippets/lab/processes/kbs/get_kb.py +10 -16
  542. pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +13 -20
  543. pygeai/tests/snippets/lab/processes/kbs/try_all.py +5 -7
  544. pygeai/tests/snippets/lab/processes/list_processes.py +5 -7
  545. pygeai/tests/snippets/lab/runner_1.py +1 -1
  546. pygeai/tests/snippets/lab/samples/summarize_files.py +3 -3
  547. pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +2 -5
  548. pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +2 -5
  549. pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +3 -6
  550. pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +2 -5
  551. pygeai/tests/snippets/lab/tools/create_tool.py +4 -10
  552. pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
  553. pygeai/tests/snippets/lab/tools/delete_tool.py +2 -6
  554. pygeai/tests/snippets/lab/tools/get_parameter.py +5 -7
  555. pygeai/tests/snippets/lab/tools/get_tool.py +5 -7
  556. pygeai/tests/snippets/lab/tools/list_tools.py +3 -7
  557. pygeai/tests/snippets/lab/tools/publish_tool_revision.py +3 -5
  558. pygeai/tests/snippets/lab/tools/set_parameters.py +4 -9
  559. pygeai/tests/snippets/lab/tools/update_tool.py +4 -8
  560. pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
  561. pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
  562. pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
  563. pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
  564. pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
  565. pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
  566. pygeai/tests/snippets/lab/{file_summarizer_example.py → use_cases/file_summarizer_example.py} +3 -3
  567. pygeai/tests/snippets/lab/{file_summarizer_example_2.py → use_cases/file_summarizer_example_2.py} +12 -12
  568. pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
  569. pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
  570. pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
  571. pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
  572. pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
  573. pygeai/tests/snippets/migrate/__init__.py +45 -0
  574. pygeai/tests/snippets/migrate/agent_migration.py +110 -0
  575. pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
  576. pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
  577. pygeai/tests/snippets/migrate/process_migration.py +64 -0
  578. pygeai/tests/snippets/migrate/project_migration.py +42 -0
  579. pygeai/tests/snippets/migrate/tool_migration.py +64 -0
  580. pygeai/tests/snippets/organization/add_project_member.py +10 -0
  581. pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
  582. pygeai/tests/snippets/organization/create_project.py +2 -2
  583. pygeai/tests/snippets/organization/get_memberships.py +12 -0
  584. pygeai/tests/snippets/organization/get_organization_members.py +6 -0
  585. pygeai/tests/snippets/organization/get_project_members.py +6 -0
  586. pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
  587. pygeai/tests/snippets/organization/get_project_roles.py +6 -0
  588. pygeai/vendor/a2a/__init__.py +1 -0
  589. pygeai/vendor/a2a/auth/__init__.py +0 -0
  590. pygeai/vendor/a2a/auth/user.py +31 -0
  591. pygeai/vendor/a2a/client/__init__.py +19 -0
  592. pygeai/vendor/a2a/client/client.py +425 -0
  593. pygeai/vendor/a2a/client/errors.py +33 -0
  594. pygeai/vendor/a2a/client/helpers.py +22 -0
  595. pygeai/vendor/a2a/py.typed +0 -0
  596. pygeai/vendor/a2a/server/__init__.py +1 -0
  597. pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
  598. pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
  599. pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
  600. pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
  601. pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
  602. pygeai/vendor/a2a/server/apps/__init__.py +16 -0
  603. pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
  604. pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
  605. pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
  606. pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
  607. pygeai/vendor/a2a/server/context.py +23 -0
  608. pygeai/vendor/a2a/server/events/__init__.py +21 -0
  609. pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
  610. pygeai/vendor/a2a/server/events/event_queue.py +156 -0
  611. pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
  612. pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
  613. pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
  614. pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
  615. pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
  616. pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
  617. pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
  618. pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
  619. pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
  620. pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
  621. pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
  622. pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
  623. pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
  624. pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
  625. pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
  626. pygeai/vendor/a2a/types.py +1624 -0
  627. pygeai/vendor/a2a/utils/__init__.py +40 -0
  628. pygeai/vendor/a2a/utils/artifact.py +72 -0
  629. pygeai/vendor/a2a/utils/errors.py +69 -0
  630. pygeai/vendor/a2a/utils/helpers.py +176 -0
  631. pygeai/vendor/a2a/utils/message.py +83 -0
  632. pygeai/vendor/a2a/utils/task.py +57 -0
  633. pygeai/vendor/a2a/utils/telemetry.py +299 -0
  634. pygeai-0.6.0b15.dist-info/METADATA +205 -0
  635. pygeai-0.6.0b15.dist-info/RECORD +799 -0
  636. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
  637. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/entry_points.txt +2 -1
  638. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/licenses/LICENSE +13 -1
  639. pygeai-0.6.0b15.dist-info/top_level.txt +1 -0
  640. docs/geai-proxy/README.md +0 -145
  641. docs/source/conf.py +0 -45
  642. pygeai/tests/core/test_managers.py +0 -233
  643. pygeai-0.1.51b3.dist-info/METADATA +0 -130
  644. pygeai-0.1.51b3.dist-info/RECORD +0 -324
  645. pygeai-0.1.51b3.dist-info/top_level.txt +0 -3
  646. scripts/bump_beta_version.py +0 -56
  647. {scripts → pygeai/analytics}/__init__.py +0 -0
  648. /pygeai/tests/snippets/lab/{c_code_fixer_agent_flow.py → use_cases/c_code_fixer_agent_flow.py} +0 -0
@@ -0,0 +1,1092 @@
1
+ import unittest
2
+ from json import JSONDecodeError
3
+ from unittest.mock import MagicMock
4
+
5
+ from pygeai.lab.processes.clients import AgenticProcessClient
6
+ from pygeai.lab.processes.mappers import AgenticProcessMapper, TaskMapper, ProcessInstanceMapper, KnowledgeBaseMapper, JobMapper
7
+ from pygeai.lab.models import AgenticProcess, Task, ProcessInstance, KnowledgeBase, Job, VariableList
8
+ from pygeai.core.common.exceptions import InvalidAPIResponseException
9
+
10
+
11
+ class TestAgenticProcessMapper(unittest.TestCase):
12
+ """
13
+ python -m unittest pygeai.tests.lab.processes.test_mappers.TestAgenticProcessMapper
14
+ """
15
+
16
+ def setUp(self):
17
+ self.project_id = "test-project-id"
18
+ self.client = AgenticProcessClient(api_key="test_key", base_url="https://test.url", project_id=self.project_id)
19
+ self.client.api_service = MagicMock()
20
+ self.process_id = "test-process-id"
21
+ self.process_name = "test-process-name"
22
+ self.task_id = "test-task-id"
23
+ self.instance_id = "test-instance-id"
24
+ self.thread_id = "test-thread-id"
25
+ self.kb_id = "test-kb-id"
26
+ self.revision = "1"
27
+ self.mock_response = MagicMock()
28
+ self.mock_response.json.return_value = {"status": "success"}
29
+ self.mock_response.status_code = 200
30
+ self.mock_response.text = "success text"
31
+
32
+ def test_map_to_agentic_process_full_data(self):
33
+ data = {
34
+ "processDefinition": {
35
+ "key": "proc1",
36
+ "name": "Test Process",
37
+ "description": "A test process",
38
+ "kb": {"name": "Test KB", "artifactTypeName": ["type1"], "id": "kb1"},
39
+ "agenticActivities": [{"key": "act1", "name": "Activity 1", "taskName": "Task1", "agentName": "Agent1", "agentRevisionId": 1}],
40
+ "artifactSignals": [{"key": "sig1", "name": "Signal 1", "handlingType": "C", "artifactTypeName": ["type1"]}],
41
+ "userSignals": [{"key": "usig1", "name": "User Signal 1"}],
42
+ "startEvent": {"key": "start1", "name": "Start Event"},
43
+ "endEvent": {"key": "end1", "name": "End Event"},
44
+ "sequenceFlows": [{"key": "flow1", "sourceKey": "start1", "targetKey": "act1"}],
45
+ "variables": [{"key": "var1", "value": "value1"}],
46
+ "id": "proc-id1",
47
+ "status": "active",
48
+ "versionId": 1,
49
+ "isDraft": False,
50
+ "revision": 2
51
+ }
52
+ }
53
+
54
+ result = AgenticProcessMapper.map_to_agentic_process(data)
55
+
56
+ self.assertIsInstance(result, AgenticProcess)
57
+ self.assertEqual(result.key, "proc1")
58
+ self.assertEqual(result.name, "Test Process")
59
+ self.assertEqual(result.description, "A test process")
60
+ self.assertEqual(result.kb.name, "Test KB")
61
+ self.assertEqual(len(result.agentic_activities), 1)
62
+ self.assertEqual(result.agentic_activities[0].key, "act1")
63
+ self.assertEqual(len(result.artifact_signals), 1)
64
+ self.assertEqual(result.artifact_signals[0].key, "sig1")
65
+ self.assertEqual(len(result.user_signals), 1)
66
+ self.assertEqual(result.user_signals[0].key, "usig1")
67
+ self.assertEqual(result.start_event.key, "start1")
68
+ self.assertEqual(result.end_event.key, "end1")
69
+ self.assertEqual(len(result.sequence_flows), 1)
70
+ self.assertEqual(result.sequence_flows[0].key, "flow1")
71
+ self.assertEqual(len(result.variables.variables), 1)
72
+ self.assertEqual(result.variables.variables[0].key, "var1")
73
+ self.assertEqual(result.id, "proc-id1")
74
+ self.assertEqual(result.status, "active")
75
+ self.assertEqual(result.version_id, 1)
76
+ self.assertFalse(result.is_draft)
77
+ self.assertEqual(result.revision, 2)
78
+
79
+ def test_map_to_agentic_process_minimal_data(self):
80
+ data = {
81
+ "processDefinition": {
82
+ "key": "proc2",
83
+ "name": "Minimal Process"
84
+ }
85
+ }
86
+
87
+ result = AgenticProcessMapper.map_to_agentic_process(data)
88
+
89
+ self.assertIsInstance(result, AgenticProcess)
90
+ self.assertEqual(result.key, "proc2")
91
+ self.assertEqual(result.name, "Minimal Process")
92
+ self.assertIsNone(result.description)
93
+ self.assertIsNone(result.kb)
94
+ self.assertIsNone(result.agentic_activities)
95
+ self.assertIsNone(result.artifact_signals)
96
+ self.assertIsNone(result.user_signals)
97
+ self.assertIsNone(result.start_event)
98
+ self.assertIsNone(result.end_event)
99
+ self.assertIsNone(result.sequence_flows)
100
+ self.assertIsInstance(result.variables, VariableList)
101
+ self.assertEqual(len(result.variables.variables), 0)
102
+
103
+ def test_map_to_agentic_process_list_empty(self):
104
+ data = {"processes": []}
105
+
106
+ result = AgenticProcessMapper.map_to_agentic_process_list(data)
107
+
108
+ self.assertEqual(len(result.processes), 0)
109
+
110
+ def test_map_to_agentic_process_list_with_data(self):
111
+ data = {
112
+ "processes": [
113
+ {"processDefinition": {"key": "proc1", "name": "Process 1"}},
114
+ {"processDefinition": {"key": "proc2", "name": "Process 2"}}
115
+ ]
116
+ }
117
+
118
+ result = AgenticProcessMapper.map_to_agentic_process_list(data)
119
+
120
+ self.assertEqual(len(result.processes), 2)
121
+ self.assertEqual(result.processes[0].name, "Process 1")
122
+ self.assertEqual(result.processes[1].name, "Process 2")
123
+
124
+ def test_update_process_success_with_name(self):
125
+ self.client.api_service.put.return_value = self.mock_response
126
+ self.client.api_service.get.return_value = self.mock_response
127
+
128
+ result = self.client.update_process(
129
+ name="Test Process",
130
+ key="updated-key",
131
+ automatic_publish=False,
132
+ upsert=False
133
+ )
134
+
135
+ self.client.api_service.put.assert_called_once()
136
+ self.assertEqual(result, {"status": "success"})
137
+
138
+ def test_update_process_with_upsert(self):
139
+ self.client.api_service.put.return_value = self.mock_response
140
+
141
+ result = self.client.update_process(
142
+ process_id=self.process_id,
143
+ name="Upserted Process",
144
+ automatic_publish=True,
145
+ upsert=True
146
+ )
147
+
148
+ self.client.api_service.put.assert_called_once()
149
+ endpoint = self.client.api_service.put.call_args[1]['endpoint']
150
+ self.assertIn("upsert", endpoint)
151
+ self.assertEqual(result, {"status": "success"})
152
+
153
+ def test_update_process_json_decode_error(self):
154
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
155
+ self.client.api_service.put.return_value = self.mock_response
156
+ self.client.api_service.get.return_value = self.mock_response
157
+
158
+ try:
159
+ result = self.client.update_process(
160
+ process_id=self.process_id,
161
+ name="Updated Process"
162
+ )
163
+ except InvalidAPIResponseException as e:
164
+ result = self.mock_response.text
165
+
166
+ self.assertEqual(result, "success text")
167
+
168
+ def test_get_process_success_with_name(self):
169
+ self.client.api_service.get.return_value = self.mock_response
170
+
171
+ result = self.client.get_process(
172
+ process_name="Test Process",
173
+ revision="1",
174
+ version=1,
175
+ allow_drafts=False
176
+ )
177
+
178
+ self.client.api_service.get.assert_called_once()
179
+ self.assertEqual(result, {"status": "success"})
180
+
181
+ def test_get_process_json_decode_error(self):
182
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
183
+ self.client.api_service.get.return_value = self.mock_response
184
+
185
+ try:
186
+ result = self.client.get_process(
187
+ process_id=self.process_id
188
+ )
189
+ except InvalidAPIResponseException as e:
190
+ result = self.mock_response.text
191
+
192
+ self.assertEqual(result, "success text")
193
+
194
+ def test_list_processes_json_decode_error(self):
195
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
196
+ self.client.api_service.get.return_value = self.mock_response
197
+
198
+ try:
199
+ result = self.client.list_processes()
200
+ except InvalidAPIResponseException as e:
201
+ result = self.mock_response.text
202
+
203
+ self.assertEqual(result, "success text")
204
+
205
+ def test_list_process_instances_success(self):
206
+ self.client.api_service.get.return_value = self.mock_response
207
+
208
+ result = self.client.list_process_instances(
209
+ process_id=self.process_id,
210
+ is_active=False,
211
+ start="5",
212
+ count="20"
213
+ )
214
+
215
+ self.client.api_service.get.assert_called_once()
216
+ self.assertEqual(result, {"status": "success"})
217
+
218
+ def test_list_process_instances_json_decode_error(self):
219
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
220
+ self.client.api_service.get.return_value = self.mock_response
221
+
222
+ try:
223
+ result = self.client.list_process_instances(
224
+ process_id=self.process_id
225
+ )
226
+ except InvalidAPIResponseException as e:
227
+ result = self.mock_response.text
228
+
229
+ self.assertEqual(result, "success text")
230
+
231
+ def test_delete_process_success_with_name(self):
232
+ self.mock_response.status_code = 204
233
+ self.client.api_service.delete.return_value = self.mock_response
234
+
235
+ result = self.client.delete_process(
236
+ process_name="Test Process"
237
+ )
238
+
239
+ self.client.api_service.delete.assert_called_once()
240
+ self.assertEqual(result, {})
241
+
242
+ def test_delete_process_json_decode_error(self):
243
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
244
+ self.client.api_service.delete.return_value = self.mock_response
245
+
246
+ try:
247
+ result = self.client.delete_process(
248
+ process_id=self.process_id
249
+ )
250
+ except InvalidAPIResponseException as e:
251
+ result = self.mock_response.text
252
+
253
+ self.assertEqual(result, "success text")
254
+
255
+ def test_publish_process_revision_success_with_name(self):
256
+ self.client.api_service.post.return_value = self.mock_response
257
+
258
+ result = self.client.publish_process_revision(
259
+ process_name="Test Process",
260
+ revision="2"
261
+ )
262
+
263
+ self.client.api_service.post.assert_called_once()
264
+ self.assertEqual(result, {"status": "success"})
265
+
266
+ def test_publish_process_revision_missing_identifier(self):
267
+ with self.assertRaises(ValueError) as context:
268
+ self.client.publish_process_revision(
269
+ revision="2"
270
+ )
271
+
272
+ self.assertEqual(str(context.exception), "Either process_id or process_name must be provided.")
273
+
274
+ def test_publish_process_revision_json_decode_error(self):
275
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
276
+ self.client.api_service.post.return_value = self.mock_response
277
+
278
+ try:
279
+ result = self.client.publish_process_revision(
280
+ process_id=self.process_id,
281
+ revision="2"
282
+ )
283
+ except InvalidAPIResponseException as e:
284
+ result = self.mock_response.text
285
+
286
+ self.assertEqual(result, "success text")
287
+
288
+ def test_create_task_json_decode_error(self):
289
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
290
+ self.client.api_service.post.return_value = self.mock_response
291
+
292
+ try:
293
+ result = self.client.create_task(
294
+ name="Test Task"
295
+ )
296
+ except InvalidAPIResponseException as e:
297
+ result = self.mock_response.text
298
+
299
+ self.assertEqual(result, "success text")
300
+
301
+ def test_create_task_with_full_data(self):
302
+ self.client.api_service.post.return_value = self.mock_response
303
+
304
+ result = self.client.create_task(
305
+ name="Test Task",
306
+ description="Task Description",
307
+ title_template="Task for {{issue}}",
308
+ id="task1",
309
+ prompt_data={"instructions": "Do this"},
310
+ artifact_types=[{"name": "art1", "description": "Artifact 1", "isRequired": True, "usageType": "input"}],
311
+ automatic_publish=True
312
+ )
313
+
314
+ self.client.api_service.post.assert_called_once()
315
+ self.assertEqual(result, {"status": "success"})
316
+
317
+ def test_get_task_success_with_name(self):
318
+ self.client.api_service.get.return_value = self.mock_response
319
+
320
+ result = self.client.get_task(
321
+ task_id="",
322
+ task_name="Test Task"
323
+ )
324
+
325
+ self.client.api_service.get.assert_called_once()
326
+ self.assertEqual(result, {"status": "success"})
327
+
328
+ def test_get_task_json_decode_error(self):
329
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
330
+ self.client.api_service.get.return_value = self.mock_response
331
+
332
+ try:
333
+ result = self.client.get_task(
334
+ task_id=self.task_id
335
+ )
336
+ except InvalidAPIResponseException as e:
337
+ result = self.mock_response.text
338
+
339
+ self.assertEqual(result, "success text")
340
+
341
+ def test_list_tasks_success(self):
342
+ self.client.api_service.get.return_value = self.mock_response
343
+
344
+ result = self.client.list_tasks(
345
+ id="task1",
346
+ start="10",
347
+ count="50",
348
+ allow_drafts=False
349
+ )
350
+
351
+ self.client.api_service.get.assert_called_once()
352
+ self.assertEqual(result, {"status": "success"})
353
+
354
+ def test_list_tasks_json_decode_error(self):
355
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
356
+ self.client.api_service.get.return_value = self.mock_response
357
+
358
+ try:
359
+ result = self.client.list_tasks()
360
+ except InvalidAPIResponseException as e:
361
+ result = self.mock_response.text
362
+
363
+ self.assertEqual(result, "success text")
364
+
365
+ def test_update_task_missing_id(self):
366
+ with self.assertRaises(ValueError) as context:
367
+ self.client.update_task(
368
+ task_id=""
369
+ )
370
+
371
+ self.assertEqual(str(context.exception), "Task ID must be provided.")
372
+
373
+ def test_update_task_success(self):
374
+ self.client.api_service.put.return_value = self.mock_response
375
+
376
+ result = self.client.update_task(
377
+ task_id=self.task_id,
378
+ name="Updated Task",
379
+ description="Updated Description",
380
+ automatic_publish=True,
381
+ upsert=False
382
+ )
383
+
384
+ self.client.api_service.put.assert_called_once()
385
+ self.assertEqual(result, {"status": "success"})
386
+
387
+ def test_update_task_with_upsert(self):
388
+ self.client.api_service.put.return_value = self.mock_response
389
+
390
+ result = self.client.update_task(
391
+ task_id=self.task_id,
392
+ name="Upserted Task",
393
+ upsert=True
394
+ )
395
+
396
+ self.client.api_service.put.assert_called_once()
397
+ endpoint = self.client.api_service.put.call_args[1]['endpoint']
398
+ self.assertIn("upsert", endpoint)
399
+ self.assertEqual(result, {"status": "success"})
400
+
401
+ def test_update_task_json_decode_error(self):
402
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
403
+ self.client.api_service.put.return_value = self.mock_response
404
+
405
+ try:
406
+ result = self.client.update_task(
407
+ task_id=self.task_id,
408
+ name="Updated Task"
409
+ )
410
+ except InvalidAPIResponseException as e:
411
+ result = self.mock_response.text
412
+
413
+ self.assertEqual(result, "success text")
414
+
415
+ def test_delete_task_success_with_name(self):
416
+ self.mock_response.status_code = 204
417
+ self.client.api_service.delete.return_value = self.mock_response
418
+
419
+ result = self.client.delete_task(
420
+ task_id="",
421
+ task_name="Test Task"
422
+ )
423
+
424
+ self.client.api_service.delete.assert_called_once()
425
+ self.assertEqual(result, {})
426
+
427
+ def test_delete_task_json_decode_error(self):
428
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
429
+ self.client.api_service.delete.return_value = self.mock_response
430
+
431
+ try:
432
+ result = self.client.delete_task(
433
+ task_id=self.task_id
434
+ )
435
+ except InvalidAPIResponseException as e:
436
+ result = self.mock_response.text
437
+
438
+ self.assertEqual(result, "success text")
439
+
440
+ def test_delete_task_missing_identifier(self):
441
+ with self.assertRaises(ValueError) as context:
442
+ self.client.delete_task(
443
+ task_id="",
444
+ task_name=""
445
+ )
446
+
447
+ self.assertEqual(str(context.exception), "Either task_id or task_name must be provided.")
448
+
449
+ def test_publish_task_revision_success_with_name(self):
450
+ self.client.api_service.post.return_value = self.mock_response
451
+
452
+ result = self.client.publish_task_revision(
453
+ task_id="",
454
+ task_name="Test Task",
455
+ revision="3"
456
+ )
457
+
458
+ self.client.api_service.post.assert_called_once()
459
+ self.assertEqual(result, {"status": "success"})
460
+
461
+ def test_publish_task_revision_missing_identifier(self):
462
+ with self.assertRaises(ValueError) as context:
463
+ self.client.publish_task_revision(
464
+ task_id="", # Explicitly empty to trigger the ValueError
465
+ task_name="", # Explicitly empty to trigger the ValueError
466
+ revision="3"
467
+ )
468
+
469
+ self.assertEqual(str(context.exception), "Either task_id or task_name must be provided.")
470
+
471
+ def test_publish_task_revision_missing_revision(self):
472
+ with self.assertRaises(ValueError) as context:
473
+ self.client.publish_task_revision(
474
+ task_id=self.task_id
475
+ )
476
+
477
+ self.assertEqual(str(context.exception), "Revision must be provided.")
478
+
479
+ def test_publish_task_revision_json_decode_error(self):
480
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
481
+ self.client.api_service.post.return_value = self.mock_response
482
+
483
+ try:
484
+ result = self.client.publish_task_revision(
485
+ task_id=self.task_id,
486
+ revision="3"
487
+ )
488
+ except InvalidAPIResponseException as e:
489
+ result = self.mock_response.text
490
+
491
+ self.assertEqual(result, "success text")
492
+
493
+ def test_start_instance_json_decode_error(self):
494
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
495
+ self.client.api_service.post.return_value = self.mock_response
496
+
497
+ try:
498
+ result = self.client.start_instance(
499
+ process_name="Test Process"
500
+ )
501
+ except InvalidAPIResponseException as e:
502
+ result = self.mock_response.text
503
+
504
+ self.assertEqual(result, "success text")
505
+
506
+ def test_start_instance_with_variables(self):
507
+ self.client.api_service.post.return_value = self.mock_response
508
+
509
+ result = self.client.start_instance(
510
+ process_name="Test Process",
511
+ subject="Test Subject",
512
+ variables=[{"key": "var1", "value": "value1"}]
513
+ )
514
+
515
+ self.client.api_service.post.assert_called_once()
516
+ data = self.client.api_service.post.call_args[1]['data']
517
+ self.assertIn("variables", data["instanceDefinition"])
518
+ self.assertEqual(result, {"status": "success"})
519
+
520
+ def test_abort_instance_success(self):
521
+ self.client.api_service.post.return_value = self.mock_response
522
+
523
+ result = self.client.abort_instance(
524
+ instance_id=self.instance_id
525
+ )
526
+
527
+ self.client.api_service.post.assert_called_once()
528
+ self.assertEqual(result, {"status": "success"})
529
+
530
+ def test_abort_instance_json_decode_error(self):
531
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
532
+ self.client.api_service.post.return_value = self.mock_response
533
+
534
+ try:
535
+ result = self.client.abort_instance(
536
+ instance_id=self.instance_id
537
+ )
538
+ except InvalidAPIResponseException as e:
539
+ result = self.mock_response.text
540
+
541
+ self.assertEqual(result, "success text")
542
+
543
+ def test_get_instance_success(self):
544
+ self.client.api_service.get.return_value = self.mock_response
545
+
546
+ result = self.client.get_instance(
547
+ instance_id=self.instance_id
548
+ )
549
+
550
+ self.client.api_service.get.assert_called_once()
551
+ self.assertEqual(result, {"status": "success"})
552
+
553
+ def test_get_instance_json_decode_error(self):
554
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
555
+ self.client.api_service.get.return_value = self.mock_response
556
+
557
+ try:
558
+ result = self.client.get_instance(
559
+ instance_id=self.instance_id
560
+ )
561
+ except InvalidAPIResponseException as e:
562
+ result = self.mock_response.text
563
+
564
+ self.assertEqual(result, "success text")
565
+
566
+ def test_get_instance_missing_id(self):
567
+ with self.assertRaises(ValueError) as context:
568
+ self.client.get_instance(
569
+ instance_id=""
570
+ )
571
+
572
+ self.assertEqual(str(context.exception), "Instance ID must be provided.")
573
+
574
+ def test_get_instance_history_success(self):
575
+ self.client.api_service.get.return_value = self.mock_response
576
+
577
+ result = self.client.get_instance_history(
578
+ instance_id=self.instance_id
579
+ )
580
+
581
+ self.client.api_service.get.assert_called_once()
582
+ self.assertEqual(result, {"status": "success"})
583
+
584
+ def test_get_instance_history_json_decode_error(self):
585
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
586
+ self.client.api_service.get.return_value = self.mock_response
587
+
588
+ try:
589
+ result = self.client.get_instance_history(
590
+ instance_id=self.instance_id
591
+ )
592
+ except InvalidAPIResponseException as e:
593
+ result = self.mock_response.text
594
+
595
+ self.assertEqual(result, "success text")
596
+
597
+ def test_get_instance_history_missing_id(self):
598
+ with self.assertRaises(ValueError) as context:
599
+ self.client.get_instance_history(
600
+ instance_id=""
601
+ )
602
+
603
+ self.assertEqual(str(context.exception), "Instance ID must be provided.")
604
+
605
+ def test_get_thread_information_success(self):
606
+ self.client.api_service.get.return_value = self.mock_response
607
+
608
+ result = self.client.get_thread_information(
609
+ thread_id=self.thread_id
610
+ )
611
+
612
+ self.client.api_service.get.assert_called_once()
613
+ self.assertEqual(result, {"status": "success"})
614
+
615
+ def test_get_thread_information_json_decode_error(self):
616
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
617
+ self.client.api_service.get.return_value = self.mock_response
618
+
619
+ try:
620
+ result = self.client.get_thread_information(
621
+ thread_id=self.thread_id
622
+ )
623
+ except InvalidAPIResponseException as e:
624
+ result = self.mock_response.text
625
+
626
+ self.assertEqual(result, "success text")
627
+
628
+ def test_get_thread_information_missing_id(self):
629
+ with self.assertRaises(ValueError) as context:
630
+ self.client.get_thread_information(
631
+ thread_id=""
632
+ )
633
+
634
+ self.assertEqual(str(context.exception), "Thread ID must be provided.")
635
+
636
+ def test_send_user_signal_success(self):
637
+ self.client.api_service.post.return_value = self.mock_response
638
+
639
+ result = self.client.send_user_signal(
640
+ instance_id=self.instance_id,
641
+ signal_name="approval"
642
+ )
643
+
644
+ self.client.api_service.post.assert_called_once()
645
+ self.assertEqual(result, {"status": "success"})
646
+
647
+ def test_send_user_signal_json_decode_error(self):
648
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
649
+ self.client.api_service.post.return_value = self.mock_response
650
+
651
+ try:
652
+ result = self.client.send_user_signal(
653
+ instance_id=self.instance_id,
654
+ signal_name="approval"
655
+ )
656
+ except InvalidAPIResponseException as e:
657
+ result = self.mock_response.text
658
+
659
+ self.assertEqual(result, "success text")
660
+
661
+ def test_send_user_signal_missing_instance_id(self):
662
+ with self.assertRaises(ValueError) as context:
663
+ self.client.send_user_signal(
664
+ instance_id="",
665
+ signal_name="approval"
666
+ )
667
+
668
+ self.assertEqual(str(context.exception), "Instance ID must be provided.")
669
+
670
+ def test_create_kb_json_decode_error(self):
671
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
672
+ self.client.api_service.post.return_value = self.mock_response
673
+
674
+ try:
675
+ result = self.client.create_kb(
676
+ name="Test KB"
677
+ )
678
+ except InvalidAPIResponseException as e:
679
+ result = self.mock_response.text
680
+
681
+ self.assertEqual(result, "success text")
682
+
683
+ def test_create_kb_with_full_data(self):
684
+ self.client.api_service.post.return_value = self.mock_response
685
+
686
+ result = self.client.create_kb(
687
+ name="Test KB",
688
+ artifacts=["art1", "art2"],
689
+ metadata=["meta1", "meta2"]
690
+ )
691
+
692
+ self.client.api_service.post.assert_called_once()
693
+ data = self.client.api_service.post.call_args[1]['data']
694
+ self.assertIn("artifacts", data["KBDefinition"])
695
+ self.assertIn("metadata", data["KBDefinition"])
696
+ self.assertEqual(result, {"status": "success"})
697
+
698
+ def test_get_kb_success_with_name(self):
699
+ self.client.api_service.get.return_value = self.mock_response
700
+
701
+ result = self.client.get_kb(
702
+ kb_id="",
703
+ kb_name="Test KB"
704
+ )
705
+
706
+ self.client.api_service.get.assert_called_once()
707
+ self.assertEqual(result, {"status": "success"})
708
+
709
+ def test_get_kb_json_decode_error(self):
710
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
711
+ self.client.api_service.get.return_value = self.mock_response
712
+
713
+ try:
714
+ result = self.client.get_kb(
715
+ kb_id=self.kb_id
716
+ )
717
+ except InvalidAPIResponseException as e:
718
+ result = self.mock_response.text
719
+
720
+ self.assertEqual(result, "success text")
721
+
722
+ def test_get_kb_missing_identifier(self):
723
+ with self.assertRaises(ValueError) as context:
724
+ self.client.get_kb(
725
+ kb_id="",
726
+ kb_name=""
727
+ )
728
+
729
+ self.assertEqual(str(context.exception), "Either kb_id or kb_name must be provided.")
730
+
731
+ def test_list_kbs_success(self):
732
+ self.client.api_service.get.return_value = self.mock_response
733
+
734
+ result = self.client.list_kbs(
735
+ name="Test KB",
736
+ start="5",
737
+ count="25"
738
+ )
739
+
740
+ self.client.api_service.get.assert_called_once()
741
+ self.assertEqual(result, {"status": "success"})
742
+
743
+ def test_list_kbs_json_decode_error(self):
744
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
745
+ self.client.api_service.get.return_value = self.mock_response
746
+
747
+ try:
748
+ result = self.client.list_kbs()
749
+ except InvalidAPIResponseException as e:
750
+ result = self.mock_response.text
751
+
752
+ self.assertEqual(result, "success text")
753
+
754
+ def test_delete_kb_success_with_name(self):
755
+ self.mock_response.status_code = 204
756
+ self.client.api_service.delete.return_value = self.mock_response
757
+
758
+ result = self.client.delete_kb(
759
+ kb_id="",
760
+ kb_name="Test KB"
761
+ )
762
+
763
+ self.client.api_service.delete.assert_called_once()
764
+ self.assertEqual(result, {})
765
+
766
+ def test_delete_kb_json_decode_error(self):
767
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
768
+ self.client.api_service.delete.return_value = self.mock_response
769
+
770
+ try:
771
+ result = self.client.delete_kb(
772
+ kb_id=self.kb_id
773
+ )
774
+ except InvalidAPIResponseException as e:
775
+ result = self.mock_response.text
776
+
777
+ self.assertEqual(result, "success text")
778
+
779
+ def test_delete_kb_missing_identifier(self):
780
+ with self.assertRaises(ValueError) as context:
781
+ self.client.delete_kb(
782
+ kb_id="",
783
+ kb_name=""
784
+ )
785
+
786
+ self.assertEqual(str(context.exception), "Either kb_id or kb_name must be provided.")
787
+
788
+ def test_list_jobs_json_decode_error(self):
789
+ self.mock_response.json.side_effect = JSONDecodeError("Invalid JSON", "", 0)
790
+ self.client.api_service.get.return_value = self.mock_response
791
+
792
+ try:
793
+ result = self.client.list_jobs()
794
+ except InvalidAPIResponseException as e:
795
+ result = self.mock_response.text
796
+
797
+ self.assertEqual(result, "success text")
798
+
799
+ def test_list_jobs_with_filters(self):
800
+ self.client.api_service.get.return_value = self.mock_response
801
+
802
+ result = self.client.list_jobs(
803
+ start="10",
804
+ count="30",
805
+ topic="test-topic",
806
+ token="test-token",
807
+ name="test-name"
808
+ )
809
+
810
+ self.client.api_service.get.assert_called_once()
811
+ params = self.client.api_service.get.call_args[1]['params']
812
+ self.assertEqual(params['topic'], "test-topic")
813
+ self.assertEqual(params['token'], "test-token")
814
+ self.assertEqual(params['name'], "test-name")
815
+ self.assertEqual(result, {"status": "success"})
816
+
817
+
818
+ class TestTaskMapper(unittest.TestCase):
819
+ """
820
+ python -m unittest pygeai.tests.lab.processes.test_mappers.TestTaskMapper
821
+ """
822
+
823
+ def test_map_to_task_full_data(self):
824
+ data = {
825
+ "taskDefinition": {
826
+ "name": "Test Task",
827
+ "description": "Task Description",
828
+ "titleTemplate": "Task for {{issue}}",
829
+ "id": "task1",
830
+ "promptData": {
831
+ "instructions": "Do this task",
832
+ "inputs": ["input1"],
833
+ "outputs": [{"key": "out1", "description": "Output 1"}],
834
+ "examples": [{"inputData": "example input", "output": "example output"}]
835
+ },
836
+ "artifactTypes": [{"name": "art1", "description": "Artifact 1", "isRequired": True, "usageType": "input", "artifactVariableKey": "var1"}],
837
+ "isDraft": True,
838
+ "revision": 1,
839
+ "status": "active"
840
+ }
841
+ }
842
+
843
+ result = TaskMapper.map_to_task(data)
844
+
845
+ self.assertIsInstance(result, Task)
846
+ self.assertEqual(result.name, "Test Task")
847
+ self.assertEqual(result.description, "Task Description")
848
+ self.assertEqual(result.title_template, "Task for {{issue}}")
849
+ self.assertEqual(result.id, "task1")
850
+ self.assertEqual(result.prompt_data.instructions, "Do this task")
851
+ self.assertEqual(len(result.prompt_data.outputs), 1)
852
+ self.assertEqual(result.prompt_data.outputs[0].key, "out1")
853
+ self.assertEqual(len(result.prompt_data.examples), 1)
854
+ self.assertEqual(result.prompt_data.examples[0].input_data, "example input")
855
+ self.assertEqual(len(result.artifact_types.artifact_types), 1)
856
+ self.assertEqual(result.artifact_types.artifact_types[0].name, "art1")
857
+ self.assertTrue(result.is_draft)
858
+ self.assertEqual(result.revision, 1)
859
+ self.assertEqual(result.status, "active")
860
+
861
+ def test_map_to_task_minimal_data(self):
862
+ data = {
863
+ "taskDefinition": {
864
+ "name": "Minimal Task"
865
+ }
866
+ }
867
+
868
+ result = TaskMapper.map_to_task(data)
869
+
870
+ self.assertIsInstance(result, Task)
871
+ self.assertEqual(result.name, "Minimal Task")
872
+ self.assertIsNone(result.description)
873
+ self.assertIsNone(result.title_template)
874
+ self.assertIsNone(result.id)
875
+ self.assertIsNone(result.prompt_data)
876
+ self.assertIsNone(result.artifact_types)
877
+ self.assertIsNone(result.is_draft)
878
+
879
+ def test_map_to_task_list_empty(self):
880
+ data = {"tasks": []}
881
+
882
+ result = TaskMapper.map_to_task_list(data)
883
+
884
+ self.assertEqual(len(result.tasks), 0)
885
+
886
+ def test_map_to_task_list_with_data(self):
887
+ data = {
888
+ "tasks": [
889
+ {"taskDefinition": {"name": "Task 1"}},
890
+ {"taskDefinition": {"name": "Task 2"}}
891
+ ]
892
+ }
893
+
894
+ result = TaskMapper.map_to_task_list(data)
895
+
896
+ self.assertEqual(len(result.tasks), 2)
897
+ self.assertEqual(result.tasks[0].name, "Task 1")
898
+ self.assertEqual(result.tasks[1].name, "Task 2")
899
+
900
+
901
+ class TestProcessInstanceMapper(unittest.TestCase):
902
+ """
903
+ python -m unittest pygeai.tests.lab.processes.test_mappers.TestProcessInstanceMapper
904
+ """
905
+
906
+ def test_map_to_process_instance_full_data(self):
907
+ data = {
908
+ "id": "inst1",
909
+ "process": {"id": "proc1", "name": "Test Process", "revision": 1, "version": 1, "isDraft": False},
910
+ "createdAt": "2023-01-01T00:00:00Z",
911
+ "subject": "Test Subject",
912
+ "variables": [{"key": "var1", "value": "value1"}],
913
+ "status": "active"
914
+ }
915
+
916
+ result = ProcessInstanceMapper.map_to_process_instance(data)
917
+
918
+ self.assertIsInstance(result, ProcessInstance)
919
+ self.assertEqual(result.id, "inst1")
920
+ self.assertEqual(result.process.name, "Test Process")
921
+ self.assertEqual(result.created_at, "2023-01-01T00:00:00Z")
922
+ self.assertEqual(result.subject, "Test Subject")
923
+ self.assertEqual(len(result.variables.variables), 1)
924
+ self.assertEqual(result.variables.variables[0].key, "var1")
925
+ self.assertEqual(result.status, "active")
926
+
927
+ def test_map_to_process_instance_minimal_data(self):
928
+ data = {
929
+ "subject": "Minimal Subject",
930
+ "process": {"name": "Minimal Process"}
931
+ }
932
+
933
+ result = ProcessInstanceMapper.map_to_process_instance(data)
934
+
935
+ self.assertIsInstance(result, ProcessInstance)
936
+ self.assertEqual(result.subject, "Minimal Subject")
937
+ self.assertEqual(result.process.name, "Minimal Process")
938
+ self.assertIsNone(result.id)
939
+ self.assertIsNone(result.created_at)
940
+ self.assertEqual(len(result.variables.variables), 0)
941
+ self.assertIsNone(result.status)
942
+
943
+ def test_map_to_process_instance_list_empty(self):
944
+ data = {"instances": []}
945
+
946
+ result = ProcessInstanceMapper.map_to_process_instance_list(data)
947
+
948
+ self.assertEqual(len(result.instances), 0)
949
+
950
+ def test_map_to_process_instance_list_with_data(self):
951
+ data = {
952
+ "instances": [
953
+ {"subject": "Subject 1", "process": {"name": "Process 1"}},
954
+ {"subject": "Subject 2", "process": {"name": "Process 2"}}
955
+ ]
956
+ }
957
+
958
+ result = ProcessInstanceMapper.map_to_process_instance_list(data)
959
+
960
+ self.assertEqual(len(result.instances), 2)
961
+ self.assertEqual(result.instances[0].subject, "Subject 1")
962
+ self.assertEqual(result.instances[1].subject, "Subject 2")
963
+
964
+
965
+ class TestKnowledgeBaseMapper(unittest.TestCase):
966
+ """
967
+ python -m unittest pygeai.tests.lab.processes.test_mappers.TestKnowledgeBaseMapper
968
+ """
969
+
970
+ def test_map_to_knowledge_base_full_data(self):
971
+ data = {
972
+ "name": "Test KB",
973
+ "artifactTypeName": ["type1", "type2"],
974
+ "id": "kb1",
975
+ "artifacts": ["art1", "art2"],
976
+ "metadata": ["meta1", "meta2"]
977
+ }
978
+
979
+ result = KnowledgeBaseMapper.map_to_knowledge_base(data)
980
+
981
+ self.assertIsInstance(result, KnowledgeBase)
982
+ self.assertEqual(result.name, "Test KB")
983
+ self.assertEqual(result.artifact_type_name, ["type1", "type2"])
984
+ self.assertEqual(result.id, "kb1")
985
+ self.assertEqual(result.artifacts, ["art1", "art2"])
986
+ self.assertEqual(result.metadata, ["meta1", "meta2"])
987
+
988
+ def test_map_to_knowledge_base_minimal_data(self):
989
+ data = {
990
+ "name": "Minimal KB"
991
+ }
992
+
993
+ result = KnowledgeBaseMapper.map_to_knowledge_base(data)
994
+
995
+ self.assertIsInstance(result, KnowledgeBase)
996
+ self.assertEqual(result.name, "Minimal KB")
997
+ self.assertIsNone(result.artifact_type_name)
998
+ self.assertIsNone(result.id)
999
+ self.assertIsNone(result.artifacts)
1000
+ self.assertIsNone(result.metadata)
1001
+
1002
+ def test_map_to_knowledge_base_list_empty(self):
1003
+ data = {"knowledgeBases": []}
1004
+
1005
+ result = KnowledgeBaseMapper.map_to_knowledge_base_list(data)
1006
+
1007
+ self.assertEqual(len(result.knowledge_bases), 0)
1008
+
1009
+ def test_map_to_knowledge_base_list_with_data(self):
1010
+ data = {
1011
+ "knowledgeBases": [
1012
+ {"name": "KB 1"},
1013
+ {"name": "KB 2"}
1014
+ ]
1015
+ }
1016
+
1017
+ result = KnowledgeBaseMapper.map_to_knowledge_base_list(data)
1018
+
1019
+ self.assertEqual(len(result.knowledge_bases), 2)
1020
+ self.assertEqual(result.knowledge_bases[0].name, "KB 1")
1021
+ self.assertEqual(result.knowledge_bases[1].name, "KB 2")
1022
+
1023
+
1024
+ class TestJobMapper(unittest.TestCase):
1025
+ """
1026
+ python -m unittest pygeai.tests.lab.processes.test_mappers.TestJobMapper
1027
+ """
1028
+
1029
+ def test_map_to_job_full_data(self):
1030
+ data = {
1031
+ "caption": "Job completed",
1032
+ "name": "execute_workitem_jobrunner",
1033
+ "parameters": [{"Name": "param1", "Value": "value1"}],
1034
+ "request": "2023-01-01T00:00:00Z",
1035
+ "token": "token123",
1036
+ "topic": "Default",
1037
+ "info": "Additional info"
1038
+ }
1039
+
1040
+ result = JobMapper.map_to_job(data)
1041
+
1042
+ self.assertIsInstance(result, Job)
1043
+ self.assertEqual(result.caption, "Job completed")
1044
+ self.assertEqual(result.name, "execute_workitem_jobrunner")
1045
+ self.assertEqual(len(result.parameters), 1)
1046
+ self.assertEqual(result.parameters[0].Name, "param1")
1047
+ self.assertEqual(result.request, "2023-01-01T00:00:00Z")
1048
+ self.assertEqual(result.token, "token123")
1049
+ self.assertEqual(result.topic, "Default")
1050
+ self.assertEqual(result.info, "Additional info")
1051
+
1052
+ def test_map_to_job_minimal_data(self):
1053
+ data = {
1054
+ "caption": "Job minimal",
1055
+ "name": "minimal_job",
1056
+ "parameters": [],
1057
+ "request": "2023-01-01T00:00:00Z",
1058
+ "token": "token456",
1059
+ "topic": "Event"
1060
+ }
1061
+
1062
+ result = JobMapper.map_to_job(data)
1063
+
1064
+ self.assertIsInstance(result, Job)
1065
+ self.assertEqual(result.caption, "Job minimal")
1066
+ self.assertEqual(result.name, "minimal_job")
1067
+ self.assertEqual(len(result.parameters), 0)
1068
+ self.assertEqual(result.request, "2023-01-01T00:00:00Z")
1069
+ self.assertEqual(result.token, "token456")
1070
+ self.assertEqual(result.topic, "Event")
1071
+ self.assertIsNone(result.info)
1072
+
1073
+ def test_map_to_job_list_empty(self):
1074
+ data = []
1075
+
1076
+ result = JobMapper.map_to_job_list(data)
1077
+
1078
+ self.assertEqual(len(result.jobs), 0)
1079
+
1080
+ def test_map_to_job_list_with_data(self):
1081
+ data = [
1082
+ {"caption": "Job 1", "name": "job1", "parameters": [], "request": "2023-01-01", "token": "t1",
1083
+ "topic": "Default"},
1084
+ {"caption": "Job 2", "name": "job2", "parameters": [], "request": "2023-01-02", "token": "t2",
1085
+ "topic": "Event"}
1086
+ ]
1087
+
1088
+ result = JobMapper.map_to_job_list(data)
1089
+
1090
+ self.assertEqual(len(result.jobs), 2)
1091
+ self.assertEqual(result.jobs[0].name, "job1")
1092
+ self.assertEqual(result.jobs[1].name, "job2")