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
@@ -1,6 +1,6 @@
1
1
  import json
2
- import sys
3
2
 
3
+ from pygeai import logger
4
4
  from pygeai.cli.commands import Command, Option, ArgumentsEnum
5
5
  from pygeai.cli.commands.builders import build_help_text
6
6
  from pygeai.cli.commands.common import get_boolean_value
@@ -8,10 +8,13 @@ from pygeai.cli.commands.lab.common import get_agent_data_prompt_inputs, get_age
8
8
  get_agent_data_prompt_examples, get_tool_parameters
9
9
  from pygeai.cli.texts.help import AI_LAB_HELP_TEXT
10
10
  from pygeai.core.common.exceptions import MissingRequirementException, WrongArgumentError
11
+ from pygeai.core.utils.console import Console
12
+ from pygeai.cli.commands.lab.options import PROJECT_ID_OPTION
11
13
  from pygeai.lab.agents.clients import AgentClient
12
14
  from pygeai.lab.processes.clients import AgenticProcessClient
13
15
  from pygeai.lab.strategies.clients import ReasoningStrategyClient
14
- from pygeai.lab.tools.clients import ToolClient, VALID_SCOPES
16
+ from pygeai.lab.tools.clients import ToolClient
17
+ from pygeai.lab.constants import VALID_SCOPES
15
18
 
16
19
 
17
20
  def show_help():
@@ -19,7 +22,7 @@ def show_help():
19
22
  Displays help text in stdout
20
23
  """
21
24
  help_text = build_help_text(ai_lab_commands, AI_LAB_HELP_TEXT)
22
- sys.stdout.write(help_text)
25
+ Console.write_stdout(help_text)
23
26
 
24
27
 
25
28
  def list_agents(option_list: list):
@@ -47,12 +50,8 @@ def list_agents(option_list: list):
47
50
  if option_flag.name == "allow_external":
48
51
  allow_external = get_boolean_value(option_arg)
49
52
 
50
- if not project_id:
51
- raise MissingRequirementException("Project ID must be specified.")
52
-
53
- client = AgentClient()
53
+ client = AgentClient(project_id=project_id)
54
54
  result = client.list_agents(
55
- project_id=project_id,
56
55
  status=status,
57
56
  start=start,
58
57
  count=count,
@@ -60,16 +59,11 @@ def list_agents(option_list: list):
60
59
  allow_drafts=allow_drafts,
61
60
  allow_external=allow_external,
62
61
  )
63
- sys.stdout.write(f"Agent list: \n{result}\n")
62
+ Console.write_stdout(f"Agent list: \n{result}")
64
63
 
65
64
 
66
65
  list_agents_options = [
67
- Option(
68
- "project_id",
69
- ["--project-id", "--pid"],
70
- "ID of the project",
71
- True
72
- ),
66
+ PROJECT_ID_OPTION,
73
67
  Option(
74
68
  "status",
75
69
  ["--status"],
@@ -126,6 +120,7 @@ def create_agent(option_list: list):
126
120
  agent_data_llm_temperature = None
127
121
  agent_data_llm_top_k = None
128
122
  agent_data_llm_top_p = None
123
+ agent_data_strategy_name = None
129
124
  agent_data_model_name = None
130
125
  agent_data_resource_pools = None
131
126
  automatic_publish = False
@@ -200,6 +195,8 @@ def create_agent(option_list: list):
200
195
  agent_data_llm_top_k = option_arg
201
196
  if option_flag.name == "agent_data_llm_top_p":
202
197
  agent_data_llm_top_p = option_arg
198
+ if option_flag.name == "agent_data_strategy_name":
199
+ agent_data_strategy_name = option_arg
203
200
  if option_flag.name == "agent_data_model_name":
204
201
  agent_data_model_name = option_arg
205
202
  if option_flag.name == "agent_data_resource_pools":
@@ -216,10 +213,11 @@ def create_agent(option_list: list):
216
213
  if option_flag.name == "automatic_publish":
217
214
  automatic_publish = get_boolean_value(option_arg)
218
215
 
219
- if not project_id:
220
- raise MissingRequirementException("Project ID must be specified.")
221
- if not (name and access_scope and public_name):
222
- raise MissingRequirementException("Cannot create assistant without specifying name, access scope and public name")
216
+ if not name:
217
+ raise MissingRequirementException("Cannot create assistant without specifying name.")
218
+
219
+ if access_scope == 'public' and not public_name:
220
+ raise MissingRequirementException("If access scope is public, public name must be defined.")
223
221
 
224
222
  prompt_inputs = get_agent_data_prompt_inputs(agent_data_prompt_inputs)
225
223
  prompt_outputs = get_agent_data_prompt_outputs(agent_data_prompt_outputs)
@@ -244,9 +242,8 @@ def create_agent(option_list: list):
244
242
  {"name": agent_data_model_name}
245
243
  ]
246
244
 
247
- client = AgentClient()
245
+ client = AgentClient(project_id=project_id)
248
246
  result = client.create_agent(
249
- project_id=project_id,
250
247
  name=name,
251
248
  access_scope=access_scope,
252
249
  public_name=public_name,
@@ -255,20 +252,16 @@ def create_agent(option_list: list):
255
252
  description=description,
256
253
  agent_data_prompt=agent_data_prompt,
257
254
  agent_data_llm_config=agent_data_llm_config,
255
+ agent_data_strategy_name=agent_data_strategy_name,
258
256
  agent_data_models=agent_data_models,
259
257
  agent_data_resource_pools=agent_data_resource_pools,
260
258
  automatic_publish=automatic_publish
261
259
  )
262
- sys.stdout.write(f"New agent detail: \n{result}\n")
260
+ Console.write_stdout(f"New agent detail: \n{result}")
263
261
 
264
262
 
265
263
  create_agent_options = [
266
- Option(
267
- "project_id",
268
- ["--project-id", "--pid"],
269
- "Unique identifier of the project where the agent will be created",
270
- True
271
- ),
264
+ PROJECT_ID_OPTION,
272
265
  Option(
273
266
  "name",
274
267
  ["--name", "-n"],
@@ -360,6 +353,12 @@ create_agent_options = [
360
353
  "TopP sampling parameter for LLM (currently unused)",
361
354
  True
362
355
  ),
356
+ Option(
357
+ "agent_data_strategy_name",
358
+ ["--agent-data-strategy-name", "--strategy-name"],
359
+ "Name of the reasoning strategy to use",
360
+ True
361
+ ),
363
362
  Option(
364
363
  "agent_data_model_name",
365
364
  ["--agent-data-model-name", "--adm-name"],
@@ -401,27 +400,21 @@ def get_agent(option_list: list):
401
400
  if option_flag.name == "allow_drafts":
402
401
  allow_drafts = get_boolean_value(option_arg)
403
402
 
404
- if not (project_id and agent_id):
405
- raise MissingRequirementException("Project ID and Agent id must be specified.")
403
+ if not agent_id:
404
+ raise MissingRequirementException("Agent ID must be specified.")
406
405
 
407
- client = AgentClient()
406
+ client = AgentClient(project_id=project_id)
408
407
  result = client.get_agent(
409
- project_id=project_id,
410
408
  agent_id=agent_id,
411
409
  revision=revision,
412
410
  version=version,
413
411
  allow_drafts=allow_drafts,
414
412
  )
415
- sys.stdout.write(f"Agent detail: \n{result}\n")
413
+ Console.write_stdout(f"Agent detail: \n{result}")
416
414
 
417
415
 
418
416
  get_agent_options = [
419
- Option(
420
- "project_id",
421
- ["--project-id", "--pid"],
422
- "ID of the project",
423
- True
424
- ),
417
+ PROJECT_ID_OPTION,
425
418
  Option(
426
419
  "agent_id",
427
420
  ["--agent-id", "--aid"],
@@ -449,34 +442,119 @@ get_agent_options = [
449
442
  ]
450
443
 
451
444
 
452
- def create_sharing_link(option_list: list):
445
+ def export_agent(option_list: list):
453
446
  project_id = None
454
447
  agent_id = None
448
+ file = None
455
449
 
456
450
  for option_flag, option_arg in option_list:
457
451
  if option_flag.name == "project_id":
458
452
  project_id = option_arg
459
453
  if option_flag.name == "agent_id":
460
454
  agent_id = option_arg
455
+ if option_flag.name == "file":
456
+ file = option_arg
461
457
 
462
- if not (project_id and agent_id):
463
- raise MissingRequirementException("Project ID and Agent id must be specified.")
458
+ if not agent_id:
459
+ raise MissingRequirementException("Agent ID must be specified.")
464
460
 
465
- client = AgentClient()
466
- result = client.create_sharing_link(
467
- project_id=project_id,
461
+ client = AgentClient(project_id=project_id)
462
+ result = client.export_agent(
468
463
  agent_id=agent_id,
469
464
  )
470
- sys.stdout.write(f"Sharing token: \n{result}\n")
465
+ if file:
466
+ try:
467
+ data = json.loads(result) if isinstance(result, str) else result
468
+ with open(file, "w") as f:
469
+ json.dump(data, f, indent=4)
470
+ Console.write_stdout(f"Result from API saved to {file}.")
471
+ except json.JSONDecodeError as e:
472
+ logger.error(f"Result from API endpoint is not in JSON format: {e}")
473
+ Console.write_stderr(f"Result from API endpoint is not in JSON format.")
474
+ else:
475
+ Console.write_stdout(f"Agent spec: \n{result}")
476
+
477
+
478
+ export_agent_options = [
479
+ PROJECT_ID_OPTION,
480
+ Option(
481
+ "agent_id",
482
+ ["--agent-id", "--aid"],
483
+ "ID of the agent to retrieve",
484
+ True
485
+ ),
486
+ Option(
487
+ "file",
488
+ ["--file", "-f"],
489
+ "File path to save export specification for agent",
490
+ True
491
+ ),
492
+ ]
471
493
 
472
494
 
473
- create_sharing_link_options = [
495
+ def import_agent(option_list: list):
496
+ project_id = None
497
+ file = None
498
+
499
+ for option_flag, option_arg in option_list:
500
+ if option_flag.name == "project_id":
501
+ project_id = option_arg
502
+ if option_flag.name == "file":
503
+ file = option_arg
504
+
505
+
506
+ if not file:
507
+ raise MissingRequirementException("File path to spec must be specified.")
508
+
509
+ try:
510
+ with open(file, "r") as f:
511
+ agent_data = json.load(f)
512
+ except json.JSONDecodeError as e:
513
+ logger.error(f"File is not in JSON format: {e}")
514
+ Console.write_stderr(f"File is not in JSON format.")
515
+
516
+ client = AgentClient(project_id=project_id)
517
+ result = client.import_agent(
518
+ data=agent_data
519
+ )
520
+
521
+ Console.write_stdout(f"Agent import details: {result}")
522
+
523
+
524
+
525
+ import_agent_options = [
526
+ PROJECT_ID_OPTION,
474
527
  Option(
475
- "project_id",
476
- ["--project-id", "--pid"],
477
- "ID of the project",
528
+ "file",
529
+ ["--file", "-f"],
530
+ "File path to save export specification for agent",
478
531
  True
479
532
  ),
533
+ ]
534
+
535
+
536
+ def create_sharing_link(option_list: list):
537
+ project_id = None
538
+ agent_id = None
539
+
540
+ for option_flag, option_arg in option_list:
541
+ if option_flag.name == "project_id":
542
+ project_id = option_arg
543
+ if option_flag.name == "agent_id":
544
+ agent_id = option_arg
545
+
546
+ if not agent_id:
547
+ raise MissingRequirementException("Agent ID must be specified.")
548
+
549
+ client = AgentClient(project_id=project_id)
550
+ result = client.create_sharing_link(
551
+ agent_id=agent_id,
552
+ )
553
+ Console.write_stdout(f"Sharing token: \n{result}")
554
+
555
+
556
+ create_sharing_link_options = [
557
+ PROJECT_ID_OPTION,
480
558
  Option(
481
559
  "agent_id",
482
560
  ["--agent-id", "--aid"],
@@ -499,25 +577,19 @@ def publish_agent_revision(option_list: list):
499
577
  if option_flag.name == "revision":
500
578
  revision = option_arg
501
579
 
502
- if not (project_id and agent_id and revision):
503
- raise MissingRequirementException("Project ID, Agent ID and revision must be specified.")
580
+ if not (agent_id and revision):
581
+ raise MissingRequirementException("Agent ID and revision must be specified.")
504
582
 
505
- client = AgentClient()
583
+ client = AgentClient(project_id=project_id)
506
584
  result = client.publish_agent_revision(
507
- project_id=project_id,
508
585
  agent_id=agent_id,
509
586
  revision=revision
510
587
  )
511
- sys.stdout.write(f"Published revision detail: \n{result}\n")
588
+ Console.write_stdout(f"Published revision detail: \n{result}")
512
589
 
513
590
 
514
591
  publish_agent_revision_options = [
515
- Option(
516
- "project_id",
517
- ["--project-id", "--pid"],
518
- "ID of the project",
519
- True
520
- ),
592
+ PROJECT_ID_OPTION,
521
593
  Option(
522
594
  "agent_id",
523
595
  ["--agent-id", "--aid"],
@@ -543,24 +615,18 @@ def delete_agent(option_list: list):
543
615
  if option_flag.name == "agent_id":
544
616
  agent_id = option_arg
545
617
 
546
- if not (project_id and agent_id):
547
- raise MissingRequirementException("Project ID and Agent ID must be specified.")
618
+ if not agent_id:
619
+ raise MissingRequirementException("Agent ID must be specified.")
548
620
 
549
- client = AgentClient()
621
+ client = AgentClient(project_id=project_id)
550
622
  result = client.delete_agent(
551
- project_id=project_id,
552
623
  agent_id=agent_id,
553
624
  )
554
- sys.stdout.write(f"Deleted agent detail: \n{result}\n")
625
+ Console.write_stdout(f"Deleted agent detail: \n{result}")
555
626
 
556
627
 
557
628
  delete_agent_options = [
558
- Option(
559
- "project_id",
560
- ["--project-id", "--pid"],
561
- "ID of the project",
562
- True
563
- ),
629
+ PROJECT_ID_OPTION,
564
630
  Option(
565
631
  "agent_id",
566
632
  ["--agent-id", "--aid"],
@@ -588,6 +654,7 @@ def update_agent(option_list: list):
588
654
  agent_data_llm_temperature = None
589
655
  agent_data_llm_top_k = None
590
656
  agent_data_llm_top_p = None
657
+ agent_data_strategy_name = None
591
658
  agent_data_model_name = None
592
659
  agent_data_resource_pools = None
593
660
  automatic_publish = False
@@ -664,7 +731,9 @@ def update_agent(option_list: list):
664
731
  if option_flag.name == "agent_data_llm_top_k":
665
732
  agent_data_llm_top_k = option_arg
666
733
  if option_flag.name == "agent_data_llm_top_p":
667
- agent_data_llm_top_p = option_arg
734
+ agent_data_llm_top_k = option_arg
735
+ if option_flag.name == "agent_data_strategy_name":
736
+ agent_data_strategy_name = option_arg
668
737
  if option_flag.name == "agent_data_model_name":
669
738
  agent_data_model_name = option_arg
670
739
  if option_flag.name == "agent_data_resource_pools":
@@ -683,9 +752,6 @@ def update_agent(option_list: list):
683
752
  if option_flag.name == "upsert":
684
753
  upsert = get_boolean_value(option_arg)
685
754
 
686
- if not project_id:
687
- raise MissingRequirementException("Project ID must be specified.")
688
-
689
755
  if not (name and access_scope and public_name):
690
756
  raise MissingRequirementException("Cannot update assistant without specifying name, access scope and public name")
691
757
 
@@ -712,9 +778,8 @@ def update_agent(option_list: list):
712
778
  {"name": agent_data_model_name}
713
779
  ]
714
780
 
715
- client = AgentClient()
781
+ client = AgentClient(project_id=project_id)
716
782
  result = client.update_agent(
717
- project_id=project_id,
718
783
  agent_id=agent_id,
719
784
  name=name,
720
785
  access_scope=access_scope,
@@ -724,21 +789,17 @@ def update_agent(option_list: list):
724
789
  description=description,
725
790
  agent_data_prompt=agent_data_prompt,
726
791
  agent_data_llm_config=agent_data_llm_config,
792
+ agent_data_strategy_name=agent_data_strategy_name,
727
793
  agent_data_models=agent_data_models,
728
794
  agent_data_resource_pools=agent_data_resource_pools,
729
795
  automatic_publish=automatic_publish,
730
796
  upsert=upsert
731
797
  )
732
- sys.stdout.write(f"Updated agent detail: \n{result}\n")
798
+ Console.write_stdout(f"Updated agent detail: \n{result}")
733
799
 
734
800
 
735
801
  update_agent_options = [
736
- Option(
737
- "project_id",
738
- ["--project-id", "--pid"],
739
- "Unique identifier of the project where the agent will be created",
740
- True
741
- ),
802
+ PROJECT_ID_OPTION,
742
803
  Option(
743
804
  "agent_id",
744
805
  ["--agent-id", "--aid"],
@@ -836,6 +897,12 @@ update_agent_options = [
836
897
  "TopP sampling parameter for LLM (currently unused)",
837
898
  True
838
899
  ),
900
+ Option(
901
+ "agent_data_strategy_name",
902
+ ["--agent-data-strategy-name", "--strategy-name"],
903
+ "Name of the reasoning strategy to use",
904
+ True
905
+ ),
839
906
  Option(
840
907
  "agent_data_model_name",
841
908
  ["--agent-data-model-name", "--adm-name"],
@@ -923,8 +990,6 @@ def create_tool(option_list: list):
923
990
  if option_flag.name == "automatic_publish":
924
991
  automatic_publish = get_boolean_value(option_arg)
925
992
 
926
- if not project_id:
927
- raise MissingRequirementException("Project ID must be specified.")
928
993
  if not name:
929
994
  raise MissingRequirementException("Tool name must be specified.")
930
995
  if access_scope == "public" and not public_name:
@@ -936,9 +1001,8 @@ def create_tool(option_list: list):
936
1001
 
937
1002
  tool_parameters = get_tool_parameters(parameters)
938
1003
 
939
- client = ToolClient()
1004
+ client = ToolClient(project_id=project_id)
940
1005
  result = client.create_tool(
941
- project_id=project_id,
942
1006
  name=name,
943
1007
  description=description,
944
1008
  scope=scope,
@@ -951,16 +1015,11 @@ def create_tool(option_list: list):
951
1015
  parameters=tool_parameters,
952
1016
  automatic_publish=automatic_publish
953
1017
  )
954
- sys.stdout.write(f"New tool detail: \n{result}\n")
1018
+ Console.write_stdout(f"New tool detail: \n{result}")
955
1019
 
956
1020
 
957
1021
  create_tool_options = [
958
- Option(
959
- "project_id",
960
- ["--project-id", "--pid"],
961
- "Unique identifier of the project where the tool will be created",
962
- True
963
- ),
1022
+ PROJECT_ID_OPTION,
964
1023
  Option(
965
1024
  "name",
966
1025
  ["--name", "-n"],
@@ -1055,15 +1114,11 @@ def list_tools(option_list: list):
1055
1114
  if option_flag.name == "allow_external":
1056
1115
  allow_external = get_boolean_value(option_arg)
1057
1116
 
1058
- if not project_id:
1059
- raise MissingRequirementException("Project ID must be specified.")
1060
-
1061
1117
  if scope and scope not in VALID_SCOPES:
1062
1118
  raise ValueError(f"Scope must be one of {', '.join(VALID_SCOPES)}.")
1063
1119
 
1064
- client = ToolClient()
1120
+ client = ToolClient(project_id=project_id)
1065
1121
  result = client.list_tools(
1066
- project_id=project_id,
1067
1122
  id=id,
1068
1123
  count=count,
1069
1124
  access_scope=access_scope,
@@ -1071,16 +1126,11 @@ def list_tools(option_list: list):
1071
1126
  scope=scope,
1072
1127
  allow_external=allow_external,
1073
1128
  )
1074
- sys.stdout.write(f"Tool list: \n{result}\n")
1129
+ Console.write_stdout(f"Tool list: \n{result}")
1075
1130
 
1076
1131
 
1077
1132
  list_tools_options = [
1078
- Option(
1079
- "project_id",
1080
- ["--project-id", "--pid"],
1081
- "ID of the project",
1082
- True
1083
- ),
1133
+ PROJECT_ID_OPTION,
1084
1134
  Option(
1085
1135
  "id",
1086
1136
  ["--id"],
@@ -1139,27 +1189,21 @@ def get_tool(option_list: list):
1139
1189
  if option_flag.name == "allow_drafts":
1140
1190
  allow_drafts = get_boolean_value(option_arg)
1141
1191
 
1142
- if not (project_id and tool_id):
1143
- raise MissingRequirementException("Project ID and Tool id must be specified.")
1192
+ if not tool_id:
1193
+ raise MissingRequirementException("Tool ID must be specified.")
1144
1194
 
1145
- client = ToolClient()
1195
+ client = ToolClient(project_id=project_id)
1146
1196
  result = client.get_tool(
1147
- project_id=project_id,
1148
1197
  tool_id=tool_id,
1149
1198
  revision=revision,
1150
1199
  version=version,
1151
1200
  allow_drafts=allow_drafts,
1152
1201
  )
1153
- sys.stdout.write(f"Tool detail: \n{result}\n")
1202
+ Console.write_stdout(f"Tool detail: \n{result}")
1154
1203
 
1155
1204
 
1156
1205
  get_tool_options = [
1157
- Option(
1158
- "project_id",
1159
- ["--project-id", "--pid"],
1160
- "ID of the project",
1161
- True
1162
- ),
1206
+ PROJECT_ID_OPTION,
1163
1207
  Option(
1164
1208
  "tool_id",
1165
1209
  ["--tool-id", "--tid"],
@@ -1187,6 +1231,57 @@ get_tool_options = [
1187
1231
  ]
1188
1232
 
1189
1233
 
1234
+ def export_tool(option_list: list):
1235
+ project_id = None
1236
+ tool_id = None
1237
+ file = None
1238
+
1239
+ for option_flag, option_arg in option_list:
1240
+ if option_flag.name == "project_id":
1241
+ project_id = option_arg
1242
+ if option_flag.name == "tool_id":
1243
+ tool_id = option_arg
1244
+ if option_flag.name == "file":
1245
+ file = option_arg
1246
+
1247
+ if not tool_id:
1248
+ raise MissingRequirementException("Tool ID must be specified.")
1249
+
1250
+ client = ToolClient(project_id=project_id)
1251
+ result = client.export_tool(
1252
+ tool_id=tool_id,
1253
+ )
1254
+ Console.write_stdout(f"Tool spec: \n{result}")
1255
+ if file:
1256
+ try:
1257
+ data = json.loads(result) if isinstance(result, str) else result
1258
+ with open(file, "w") as f:
1259
+ json.dump(data, f, indent=4)
1260
+ Console.write_stdout(f"Result from API saved to {file}.")
1261
+ except json.JSONDecodeError as e:
1262
+ logger.error(f"Result from API endpoint is not in JSON format: {e}")
1263
+ Console.write_stderr(f"Result from API endpoint is not in JSON format.")
1264
+
1265
+
1266
+
1267
+ export_tool_options = [
1268
+ PROJECT_ID_OPTION,
1269
+ Option(
1270
+ "tool_id",
1271
+ ["--tool-id", "--tid"],
1272
+ "ID of the tool to retrieve",
1273
+ True
1274
+ ),
1275
+ Option(
1276
+ "file",
1277
+ ["--file", "-f"],
1278
+ "File path to save export specification for tool",
1279
+ True
1280
+ ),
1281
+ ]
1282
+
1283
+
1284
+
1190
1285
  def delete_tool(option_list: list):
1191
1286
  project_id = None
1192
1287
  tool_id = None
@@ -1195,30 +1290,24 @@ def delete_tool(option_list: list):
1195
1290
  for option_flag, option_arg in option_list:
1196
1291
  if option_flag.name == "project_id":
1197
1292
  project_id = option_arg
1198
- elif option_flag.name == "tool_id":
1293
+ if option_flag.name == "tool_id":
1199
1294
  tool_id = option_arg
1200
1295
  elif option_flag.name == "tool_name":
1201
1296
  tool_name = option_arg
1202
1297
 
1203
- if not project_id or not (tool_id or tool_name):
1204
- raise MissingRequirementException("Project ID and either Tool ID or Tool Name must be specified.")
1298
+ if not (tool_id or tool_name):
1299
+ raise MissingRequirementException("Either Tool ID or Tool Name must be specified.")
1205
1300
 
1206
- client = ToolClient()
1301
+ client = ToolClient(project_id=project_id)
1207
1302
  result = client.delete_tool(
1208
- project_id=project_id,
1209
1303
  tool_id=tool_id,
1210
1304
  tool_name=tool_name
1211
1305
  )
1212
- sys.stdout.write(f"Deleted tool detail: \n{result}\n")
1306
+ Console.write_stdout(f"Deleted tool detail: \n{result}")
1213
1307
 
1214
1308
 
1215
1309
  delete_tool_options = [
1216
- Option(
1217
- "project_id",
1218
- ["--project-id", "--pid"],
1219
- "ID of the project",
1220
- True
1221
- ),
1310
+ PROJECT_ID_OPTION,
1222
1311
  Option(
1223
1312
  "tool_id",
1224
1313
  ["--tool-id", "--tid"],
@@ -1298,8 +1387,6 @@ def update_tool(option_list: list):
1298
1387
  if option_flag.name == "upsert":
1299
1388
  upsert = get_boolean_value(option_arg)
1300
1389
 
1301
- if not project_id:
1302
- raise MissingRequirementException("Project ID must be specified.")
1303
1390
  if not tool_id:
1304
1391
  raise MissingRequirementException("Tool ID must be specified.")
1305
1392
  if access_scope == "public" and not public_name:
@@ -1311,9 +1398,8 @@ def update_tool(option_list: list):
1311
1398
 
1312
1399
  tool_parameters = get_tool_parameters(parameters)
1313
1400
 
1314
- client = ToolClient()
1401
+ client = ToolClient(project_id=project_id)
1315
1402
  result = client.update_tool(
1316
- project_id=project_id,
1317
1403
  tool_id=tool_id,
1318
1404
  name=name,
1319
1405
  description=description,
@@ -1328,16 +1414,11 @@ def update_tool(option_list: list):
1328
1414
  automatic_publish=automatic_publish,
1329
1415
  upsert=upsert
1330
1416
  )
1331
- sys.stdout.write(f"Updated tool detail: \n{result}\n")
1417
+ Console.write_stdout(f"Updated tool detail: \n{result}")
1332
1418
 
1333
1419
 
1334
1420
  update_tool_options = [
1335
- Option(
1336
- "project_id",
1337
- ["--project-id", "--pid"],
1338
- "Unique identifier of the project containing the tool",
1339
- True
1340
- ),
1421
+ PROJECT_ID_OPTION,
1341
1422
  Option(
1342
1423
  "tool_id",
1343
1424
  ["--tool-id", "--tid"],
@@ -1432,25 +1513,19 @@ def publish_tool_revision(option_list: list):
1432
1513
  if option_flag.name == "revision":
1433
1514
  revision = option_arg
1434
1515
 
1435
- if not (project_id and tool_id and revision):
1436
- raise MissingRequirementException("Project ID, Tool ID and revision must be specified.")
1516
+ if not (tool_id and revision):
1517
+ raise MissingRequirementException("Tool ID and revision must be specified.")
1437
1518
 
1438
- client = ToolClient()
1519
+ client = ToolClient(project_id=project_id)
1439
1520
  result = client.publish_tool_revision(
1440
- project_id=project_id,
1441
1521
  tool_id=tool_id,
1442
1522
  revision=revision
1443
1523
  )
1444
- sys.stdout.write(f"Published revision detail: \n{result}\n")
1524
+ Console.write_stdout(f"Published revision detail: \n{result}")
1445
1525
 
1446
1526
 
1447
1527
  publish_tool_revision_options = [
1448
- Option(
1449
- "project_id",
1450
- ["--project-id", "--pid"],
1451
- "ID of the project",
1452
- True
1453
- ),
1528
+ PROJECT_ID_OPTION,
1454
1529
  Option(
1455
1530
  "tool_id",
1456
1531
  ["--tool-id", "--tid"],
@@ -1488,28 +1563,22 @@ def get_parameter(option_list: list):
1488
1563
  if option_flag.name == "version":
1489
1564
  version = option_arg
1490
1565
 
1491
- if not (project_id and (tool_public_name or tool_id)):
1492
- raise MissingRequirementException("Project ID and Tool public name or ID must be specified.")
1566
+ if not (tool_public_name or tool_id):
1567
+ raise MissingRequirementException("Tool public name or ID must be specified.")
1493
1568
 
1494
- client = ToolClient()
1569
+ client = ToolClient(project_id=project_id)
1495
1570
  result = client.get_parameter(
1496
- project_id=project_id,
1497
1571
  tool_id=tool_id,
1498
1572
  tool_public_name=tool_public_name,
1499
1573
  revision=revision,
1500
1574
  version=version,
1501
1575
  allow_drafts=allow_drafts,
1502
1576
  )
1503
- sys.stdout.write(f"Parameter detail: \n{result}\n")
1577
+ Console.write_stdout(f"Parameter detail: \n{result}")
1504
1578
 
1505
1579
 
1506
1580
  get_parameter_options = [
1507
- Option(
1508
- "project_id",
1509
- ["--project-id", "--pid"],
1510
- "ID of the project",
1511
- True
1512
- ),
1581
+ PROJECT_ID_OPTION,
1513
1582
  Option(
1514
1583
  "tool_id",
1515
1584
  ["--tool-id", "--tid"],
@@ -1571,8 +1640,6 @@ def set_parameter(option_list: list):
1571
1640
  "\"isRequired\": true, \"type\": \"config\", \"fromSecret\": false, \"value\": \"config_value\"}'"
1572
1641
  )
1573
1642
 
1574
- if not project_id:
1575
- raise MissingRequirementException("Project ID must be specified.")
1576
1643
  if not (tool_public_name or tool_id):
1577
1644
  raise MissingRequirementException("Tool public name or ID must be specified.")
1578
1645
  if not parameters:
@@ -1580,23 +1647,17 @@ def set_parameter(option_list: list):
1580
1647
 
1581
1648
  tool_parameters = get_tool_parameters(parameters)
1582
1649
 
1583
- client = ToolClient()
1650
+ client = ToolClient(project_id=project_id)
1584
1651
  result = client.set_parameter(
1585
- project_id=project_id,
1586
1652
  tool_id=tool_id,
1587
1653
  tool_public_name=tool_public_name,
1588
1654
  parameters=tool_parameters
1589
1655
  )
1590
- sys.stdout.write(f"Set parameter detail: \n{result}\n")
1656
+ Console.write_stdout(f"Set parameter detail: \n{result}")
1591
1657
 
1592
1658
 
1593
1659
  set_parameter_options = [
1594
- Option(
1595
- "project_id",
1596
- ["--project-id", "--pid"],
1597
- "ID of the project",
1598
- True
1599
- ),
1660
+ PROJECT_ID_OPTION,
1600
1661
  Option(
1601
1662
  "tool_id",
1602
1663
  ["--tool-id", "--tid"],
@@ -1657,7 +1718,7 @@ def list_reasoning_strategies(option_list: list):
1657
1718
  allow_external=allow_external,
1658
1719
  access_scope=access_scope,
1659
1720
  )
1660
- sys.stdout.write(f"Reasoning strategies list: \n{result}\n")
1721
+ Console.write_stdout(f"Reasoning strategies list: \n{result}")
1661
1722
 
1662
1723
 
1663
1724
  list_reasoning_strategies_options = [
@@ -1695,7 +1756,6 @@ list_reasoning_strategies_options = [
1695
1756
 
1696
1757
 
1697
1758
  def create_reasoning_strategy(option_list: list):
1698
- project_id = None
1699
1759
  name = None
1700
1760
  system_prompt = None
1701
1761
  access_scope = "public"
@@ -1704,8 +1764,6 @@ def create_reasoning_strategy(option_list: list):
1704
1764
  automatic_publish = False
1705
1765
 
1706
1766
  for option_flag, option_arg in option_list:
1707
- if option_flag.name == "project_id":
1708
- project_id = option_arg
1709
1767
  if option_flag.name == "name":
1710
1768
  name = option_arg
1711
1769
  if option_flag.name == "system_prompt":
@@ -1728,8 +1786,6 @@ def create_reasoning_strategy(option_list: list):
1728
1786
  if option_flag.name == "automatic_publish":
1729
1787
  automatic_publish = get_boolean_value(option_arg)
1730
1788
 
1731
- if not project_id:
1732
- raise MissingRequirementException("Project ID must be specified.")
1733
1789
  if not name:
1734
1790
  raise MissingRequirementException("Name must be specified.")
1735
1791
  if not system_prompt:
@@ -1749,7 +1805,6 @@ def create_reasoning_strategy(option_list: list):
1749
1805
 
1750
1806
  client = ReasoningStrategyClient()
1751
1807
  result = client.create_reasoning_strategy(
1752
- project_id=project_id,
1753
1808
  name=name,
1754
1809
  system_prompt=system_prompt,
1755
1810
  access_scope=access_scope,
@@ -1757,16 +1812,10 @@ def create_reasoning_strategy(option_list: list):
1757
1812
  localized_descriptions=localized_descriptions,
1758
1813
  automatic_publish=automatic_publish
1759
1814
  )
1760
- sys.stdout.write(f"Created reasoning strategy detail: \n{result}\n")
1815
+ Console.write_stdout(f"Created reasoning strategy detail: \n{result}")
1761
1816
 
1762
1817
 
1763
1818
  create_reasoning_strategy_options = [
1764
- Option(
1765
- "project_id",
1766
- ["--project-id", "--pid"],
1767
- "ID of the project",
1768
- True
1769
- ),
1770
1819
  Option(
1771
1820
  "name",
1772
1821
  ["--name", "-n"],
@@ -1809,7 +1858,6 @@ create_reasoning_strategy_options = [
1809
1858
 
1810
1859
 
1811
1860
  def update_reasoning_strategy(option_list: list):
1812
- project_id = None
1813
1861
  reasoning_strategy_id = None
1814
1862
  name = None
1815
1863
  system_prompt = None
@@ -1820,8 +1868,6 @@ def update_reasoning_strategy(option_list: list):
1820
1868
  upsert = False
1821
1869
 
1822
1870
  for option_flag, option_arg in option_list:
1823
- if option_flag.name == "project_id":
1824
- project_id = option_arg
1825
1871
  if option_flag.name == "reasoning_strategy_id":
1826
1872
  reasoning_strategy_id = option_arg
1827
1873
  if option_flag.name == "name":
@@ -1847,10 +1893,8 @@ def update_reasoning_strategy(option_list: list):
1847
1893
  automatic_publish = get_boolean_value(option_arg)
1848
1894
  if option_flag.name == "upsert":
1849
1895
  # upsert = get_boolean_value(option_arg)
1850
- sys.stdout.write("Upsert is not yet supported for reasoning strategies. Coming soon.")
1896
+ Console.write_stdout("Upsert is not yet supported for reasoning strategies. Coming soon.")
1851
1897
 
1852
- if not project_id:
1853
- raise MissingRequirementException("Project ID must be specified.")
1854
1898
  if not reasoning_strategy_id:
1855
1899
  raise MissingRequirementException("Reasoning strategy ID must be specified.")
1856
1900
 
@@ -1870,7 +1914,6 @@ def update_reasoning_strategy(option_list: list):
1870
1914
 
1871
1915
  client = ReasoningStrategyClient()
1872
1916
  result = client.update_reasoning_strategy(
1873
- project_id=project_id,
1874
1917
  reasoning_strategy_id=reasoning_strategy_id,
1875
1918
  name=name,
1876
1919
  system_prompt=system_prompt,
@@ -1880,16 +1923,10 @@ def update_reasoning_strategy(option_list: list):
1880
1923
  automatic_publish=automatic_publish,
1881
1924
  upsert=upsert
1882
1925
  )
1883
- sys.stdout.write(f"Updated reasoning strategy detail: \n{result}\n")
1926
+ Console.write_stdout(f"Updated reasoning strategy detail: \n{result}")
1884
1927
 
1885
1928
 
1886
1929
  update_reasoning_strategy_options = [
1887
- Option(
1888
- "project_id",
1889
- ["--project-id", "--pid"],
1890
- "ID of the project",
1891
- True
1892
- ),
1893
1930
  Option(
1894
1931
  "reasoning_strategy_id",
1895
1932
  ["--reasoning-strategy-id", "--rsid"],
@@ -1944,39 +1981,27 @@ update_reasoning_strategy_options = [
1944
1981
 
1945
1982
 
1946
1983
  def get_reasoning_strategy(option_list: list):
1947
- project_id = None
1948
1984
  reasoning_strategy_id = None
1949
1985
  reasoning_strategy_name = None
1950
1986
 
1951
1987
  for option_flag, option_arg in option_list:
1952
- if option_flag.name == "project_id":
1953
- project_id = option_arg
1954
1988
  if option_flag.name == "reasoning_strategy_id":
1955
1989
  reasoning_strategy_id = option_arg
1956
1990
  if option_flag.name == "reasoning_strategy_name":
1957
1991
  reasoning_strategy_name = option_arg
1958
1992
 
1959
- if not project_id:
1960
- raise MissingRequirementException("Project ID must be specified.")
1961
1993
  if not (reasoning_strategy_id or reasoning_strategy_name):
1962
1994
  raise MissingRequirementException("Either reasoning strategy ID or name must be specified.")
1963
1995
 
1964
1996
  client = ReasoningStrategyClient()
1965
1997
  result = client.get_reasoning_strategy(
1966
- project_id=project_id,
1967
1998
  reasoning_strategy_id=reasoning_strategy_id,
1968
1999
  reasoning_strategy_name=reasoning_strategy_name
1969
2000
  )
1970
- sys.stdout.write(f"Reasoning strategy detail: \n{result}\n")
2001
+ Console.write_stdout(f"Reasoning strategy detail: \n{result}")
1971
2002
 
1972
2003
 
1973
2004
  get_reasoning_strategy_options = [
1974
- Option(
1975
- "project_id",
1976
- ["--project-id", "--pid"],
1977
- "ID of the project",
1978
- True
1979
- ),
1980
2005
  Option(
1981
2006
  "reasoning_strategy_id",
1982
2007
  ["--reasoning-strategy-id", "--rsid"],
@@ -2099,16 +2124,13 @@ def create_process(option_list: list):
2099
2124
  if option_flag.name == "automatic_publish":
2100
2125
  automatic_publish = get_boolean_value(option_arg)
2101
2126
 
2102
- if not project_id:
2103
- raise MissingRequirementException("Project ID must be specified.")
2104
2127
  if not key:
2105
2128
  raise MissingRequirementException("Key must be specified.")
2106
2129
  if not name:
2107
2130
  raise MissingRequirementException("Name must be specified.")
2108
2131
 
2109
- client = AgenticProcessClient()
2132
+ client = AgenticProcessClient(project_id=project_id)
2110
2133
  result = client.create_process(
2111
- project_id=project_id,
2112
2134
  key=key,
2113
2135
  name=name,
2114
2136
  description=description,
@@ -2121,16 +2143,11 @@ def create_process(option_list: list):
2121
2143
  sequence_flows=sequence_flows if sequence_flows else None,
2122
2144
  automatic_publish=automatic_publish
2123
2145
  )
2124
- sys.stdout.write(f"Created process detail: \n{result}\n")
2146
+ Console.write_stdout(f"Created process detail: \n{result}")
2125
2147
 
2126
2148
 
2127
2149
  create_process_options = [
2128
- Option(
2129
- "project_id",
2130
- ["--project-id", "--pid"],
2131
- "ID of the project",
2132
- True
2133
- ),
2150
+ PROJECT_ID_OPTION,
2134
2151
  Option(
2135
2152
  "key",
2136
2153
  ["--key", "-k"],
@@ -2324,14 +2341,11 @@ def update_process(option_list: list):
2324
2341
  if option_flag.name == "upsert":
2325
2342
  upsert = get_boolean_value(option_arg)
2326
2343
 
2327
- if not project_id:
2328
- raise MissingRequirementException("Project ID must be specified.")
2329
2344
  if not (process_id or name):
2330
2345
  raise MissingRequirementException("Either process ID or name must be specified.")
2331
2346
 
2332
- client = AgenticProcessClient()
2347
+ client = AgenticProcessClient(project_id=project_id)
2333
2348
  result = client.update_process(
2334
- project_id=project_id,
2335
2349
  process_id=process_id,
2336
2350
  name=name,
2337
2351
  key=key,
@@ -2346,16 +2360,11 @@ def update_process(option_list: list):
2346
2360
  automatic_publish=automatic_publish,
2347
2361
  upsert=upsert
2348
2362
  )
2349
- sys.stdout.write(f"Updated process detail: \n{result}\n")
2363
+ Console.write_stdout(f"Updated process detail: \n{result}")
2350
2364
 
2351
2365
 
2352
2366
  update_process_options = [
2353
- Option(
2354
- "project_id",
2355
- ["--project-id", "--pid"],
2356
- "ID of the project",
2357
- True
2358
- ),
2367
+ PROJECT_ID_OPTION,
2359
2368
  Option(
2360
2369
  "process_id",
2361
2370
  ["--process-id", "--pid"],
@@ -2473,30 +2482,22 @@ def get_process(option_list: list):
2473
2482
  if option_flag.name == "allow_drafts":
2474
2483
  allow_drafts = get_boolean_value(option_arg)
2475
2484
 
2476
- if not project_id:
2477
- raise MissingRequirementException("Project ID must be specified.")
2478
2485
  if not (process_id or process_name):
2479
2486
  raise MissingRequirementException("Either process ID or process name must be specified.")
2480
2487
 
2481
- client = AgenticProcessClient()
2488
+ client = AgenticProcessClient(project_id=project_id)
2482
2489
  result = client.get_process(
2483
- project_id=project_id,
2484
2490
  process_id=process_id,
2485
2491
  process_name=process_name,
2486
2492
  revision=revision,
2487
2493
  version=version,
2488
2494
  allow_drafts=allow_drafts
2489
2495
  )
2490
- sys.stdout.write(f"Process detail: \n{result}\n")
2496
+ Console.write_stdout(f"Process detail: \n{result}")
2491
2497
 
2492
2498
 
2493
2499
  get_process_options = [
2494
- Option(
2495
- "project_id",
2496
- ["--project-id", "--pid"],
2497
- "ID of the project",
2498
- True
2499
- ),
2500
+ PROJECT_ID_OPTION,
2500
2501
  Option(
2501
2502
  "process_id",
2502
2503
  ["--process-id", "--pid"],
@@ -2555,12 +2556,8 @@ def list_processes(option_list: list):
2555
2556
  if option_flag.name == "allow_draft":
2556
2557
  allow_draft = get_boolean_value(option_arg)
2557
2558
 
2558
- if not project_id:
2559
- raise MissingRequirementException("Project ID must be specified.")
2560
-
2561
- client = AgenticProcessClient()
2559
+ client = AgenticProcessClient(project_id=project_id)
2562
2560
  result = client.list_processes(
2563
- project_id=project_id,
2564
2561
  id=id,
2565
2562
  name=name,
2566
2563
  status=status,
@@ -2568,16 +2565,11 @@ def list_processes(option_list: list):
2568
2565
  count=count,
2569
2566
  allow_draft=allow_draft
2570
2567
  )
2571
- sys.stdout.write(f"Process list: \n{result}\n")
2568
+ Console.write_stdout(f"Process list: \n{result}")
2572
2569
 
2573
2570
 
2574
2571
  list_processes_options = [
2575
- Option(
2576
- "project_id",
2577
- ["--project-id", "--pid"],
2578
- "ID of the project",
2579
- True
2580
- ),
2572
+ PROJECT_ID_OPTION,
2581
2573
  Option(
2582
2574
  "id",
2583
2575
  ["--id"],
@@ -2636,29 +2628,21 @@ def list_processes_instances(option_list: list):
2636
2628
  if option_flag.name == "count":
2637
2629
  count = option_arg
2638
2630
 
2639
- if not project_id:
2640
- raise MissingRequirementException("Project ID must be specified.")
2641
2631
  if not process_id:
2642
2632
  raise MissingRequirementException("Process ID must be specified.")
2643
2633
 
2644
- client = AgenticProcessClient()
2634
+ client = AgenticProcessClient(project_id=project_id)
2645
2635
  result = client.list_process_instances(
2646
- project_id=project_id,
2647
2636
  process_id=process_id,
2648
2637
  is_active=is_active,
2649
2638
  start=start,
2650
2639
  count=count
2651
2640
  )
2652
- sys.stdout.write(f"Process instances list: \n{result}\n")
2641
+ Console.write_stdout(f"Process instances list: \n{result}")
2653
2642
 
2654
2643
 
2655
2644
  list_processes_instances_options = [
2656
- Option(
2657
- "project_id",
2658
- ["--project-id", "--pid"],
2659
- "ID of the project",
2660
- True
2661
- ),
2645
+ PROJECT_ID_OPTION,
2662
2646
  Option(
2663
2647
  "process_id",
2664
2648
  ["--process-id", "--pid"],
@@ -2699,27 +2683,19 @@ def delete_process(option_list: list):
2699
2683
  if option_flag.name == "process_name":
2700
2684
  process_name = option_arg
2701
2685
 
2702
- if not project_id:
2703
- raise MissingRequirementException("Project ID must be specified.")
2704
2686
  if not (process_id or process_name):
2705
2687
  raise MissingRequirementException("Either process ID or process name must be specified.")
2706
2688
 
2707
- client = AgenticProcessClient()
2689
+ client = AgenticProcessClient(project_id=project_id)
2708
2690
  result = client.delete_process(
2709
- project_id=project_id,
2710
2691
  process_id=process_id,
2711
2692
  process_name=process_name
2712
2693
  )
2713
- sys.stdout.write(f"Delete process result: \n{result}\n")
2694
+ Console.write_stdout(f"Delete process result: \n{result}")
2714
2695
 
2715
2696
 
2716
2697
  delete_process_options = [
2717
- Option(
2718
- "project_id",
2719
- ["--project-id", "--pid"],
2720
- "ID of the project",
2721
- True
2722
- ),
2698
+ PROJECT_ID_OPTION,
2723
2699
  Option(
2724
2700
  "process_id",
2725
2701
  ["--process-id", "--pid"],
@@ -2751,30 +2727,22 @@ def publish_process_revision(option_list: list):
2751
2727
  if option_flag.name == "revision":
2752
2728
  revision = option_arg
2753
2729
 
2754
- if not project_id:
2755
- raise MissingRequirementException("Project ID must be specified.")
2756
2730
  if not (process_id or process_name):
2757
2731
  raise MissingRequirementException("Either process ID or process name must be specified.")
2758
2732
  if not revision:
2759
2733
  raise MissingRequirementException("Revision must be specified.")
2760
2734
 
2761
- client = AgenticProcessClient()
2735
+ client = AgenticProcessClient(project_id=project_id)
2762
2736
  result = client.publish_process_revision(
2763
- project_id=project_id,
2764
2737
  process_id=process_id,
2765
2738
  process_name=process_name,
2766
2739
  revision=revision
2767
2740
  )
2768
- sys.stdout.write(f"Published process revision detail: \n{result}\n")
2741
+ Console.write_stdout(f"Published process revision detail: \n{result}")
2769
2742
 
2770
2743
 
2771
2744
  publish_process_revision_options = [
2772
- Option(
2773
- "project_id",
2774
- ["--project-id", "--pid"],
2775
- "ID of the project",
2776
- True
2777
- ),
2745
+ PROJECT_ID_OPTION,
2778
2746
  Option(
2779
2747
  "process_id",
2780
2748
  ["--process-id", "--pid"],
@@ -2837,14 +2805,11 @@ def create_task(option_list: list):
2837
2805
  if option_flag.name == "automatic_publish":
2838
2806
  automatic_publish = get_boolean_value(option_arg)
2839
2807
 
2840
- if not project_id:
2841
- raise MissingRequirementException("Project ID must be specified.")
2842
2808
  if not name:
2843
2809
  raise MissingRequirementException("Task name must be specified.")
2844
2810
 
2845
- client = AgenticProcessClient()
2811
+ client = AgenticProcessClient(project_id=project_id)
2846
2812
  result = client.create_task(
2847
- project_id=project_id,
2848
2813
  name=name,
2849
2814
  description=description,
2850
2815
  title_template=title_template,
@@ -2853,16 +2818,11 @@ def create_task(option_list: list):
2853
2818
  artifact_types=artifact_types,
2854
2819
  automatic_publish=automatic_publish
2855
2820
  )
2856
- sys.stdout.write(f"Created task detail: \n{result}\n")
2821
+ Console.write_stdout(f"Created task detail: \n{result}")
2857
2822
 
2858
2823
 
2859
2824
  create_task_options = [
2860
- Option(
2861
- "project_id",
2862
- ["--project-id", "--pid"],
2863
- "ID of the project",
2864
- True
2865
- ),
2825
+ PROJECT_ID_OPTION,
2866
2826
  Option(
2867
2827
  "name",
2868
2828
  ["--name", "-n"],
@@ -2921,27 +2881,19 @@ def get_task(option_list: list):
2921
2881
  if option_flag.name == "task_name":
2922
2882
  task_name = option_arg
2923
2883
 
2924
- if not project_id:
2925
- raise MissingRequirementException("Project ID must be specified.")
2926
2884
  if not (task_id or task_name):
2927
2885
  raise MissingRequirementException("Either task ID or task name must be specified.")
2928
2886
 
2929
- client = AgenticProcessClient()
2887
+ client = AgenticProcessClient(project_id=project_id)
2930
2888
  result = client.get_task(
2931
- project_id=project_id,
2932
2889
  task_id=task_id,
2933
2890
  task_name=task_name
2934
2891
  )
2935
- sys.stdout.write(f"Task detail: \n{result}\n")
2892
+ Console.write_stdout(f"Task detail: \n{result}")
2936
2893
 
2937
2894
 
2938
2895
  get_task_options = [
2939
- Option(
2940
- "project_id",
2941
- ["--project-id", "--pid"],
2942
- "ID of the project",
2943
- True
2944
- ),
2896
+ PROJECT_ID_OPTION,
2945
2897
  Option(
2946
2898
  "task_id",
2947
2899
  ["--task-id", "--tid"],
@@ -2976,27 +2928,18 @@ def list_tasks(option_list: list):
2976
2928
  if option_flag.name == "allow_drafts":
2977
2929
  allow_drafts = get_boolean_value(option_arg)
2978
2930
 
2979
- if not project_id:
2980
- raise MissingRequirementException("Project ID must be specified.")
2981
-
2982
- client = AgenticProcessClient()
2931
+ client = AgenticProcessClient(project_id=project_id)
2983
2932
  result = client.list_tasks(
2984
- project_id=project_id,
2985
2933
  id=id,
2986
2934
  start=start,
2987
2935
  count=count,
2988
2936
  allow_drafts=allow_drafts
2989
2937
  )
2990
- sys.stdout.write(f"Task list: \n{result}\n")
2938
+ Console.write_stdout(f"Task list: \n{result}")
2991
2939
 
2992
2940
 
2993
2941
  list_tasks_options = [
2994
- Option(
2995
- "project_id",
2996
- ["--project-id", "--pid"],
2997
- "ID of the project",
2998
- True
2999
- ),
2942
+ PROJECT_ID_OPTION,
3000
2943
  Option(
3001
2944
  "id",
3002
2945
  ["--id"],
@@ -3068,14 +3011,11 @@ def update_task(option_list: list):
3068
3011
  if option_flag.name == "upsert":
3069
3012
  upsert = get_boolean_value(option_arg)
3070
3013
 
3071
- if not project_id:
3072
- raise MissingRequirementException("Project ID must be specified.")
3073
3014
  if not (task_id or name):
3074
3015
  raise MissingRequirementException("Either task ID or name must be specified.")
3075
3016
 
3076
- client = AgenticProcessClient()
3017
+ client = AgenticProcessClient(project_id=project_id)
3077
3018
  result = client.update_task(
3078
- project_id=project_id,
3079
3019
  task_id=task_id,
3080
3020
  name=name,
3081
3021
  description=description,
@@ -3086,16 +3026,11 @@ def update_task(option_list: list):
3086
3026
  automatic_publish=automatic_publish,
3087
3027
  upsert=upsert
3088
3028
  )
3089
- sys.stdout.write(f"Updated task detail: \n{result}\n")
3029
+ Console.write_stdout(f"Updated task detail: \n{result}")
3090
3030
 
3091
3031
 
3092
3032
  update_task_options = [
3093
- Option(
3094
- "project_id",
3095
- ["--project-id", "--pid"],
3096
- "ID of the project",
3097
- True
3098
- ),
3033
+ PROJECT_ID_OPTION,
3099
3034
  Option(
3100
3035
  "task_id",
3101
3036
  ["--task-id", "--tid"],
@@ -3166,27 +3101,19 @@ def delete_task(option_list: list):
3166
3101
  if option_flag.name == "task_name":
3167
3102
  task_name = option_arg
3168
3103
 
3169
- if not project_id:
3170
- raise MissingRequirementException("Project ID must be specified.")
3171
3104
  if not (task_id or task_name):
3172
3105
  raise MissingRequirementException("Either task ID or task name must be specified.")
3173
3106
 
3174
- client = AgenticProcessClient()
3107
+ client = AgenticProcessClient(project_id=project_id)
3175
3108
  result = client.delete_task(
3176
- project_id=project_id,
3177
3109
  task_id=task_id,
3178
3110
  task_name = task_name
3179
3111
  )
3180
- sys.stdout.write(f"Delete task result: \n{result}\n")
3112
+ Console.write_stdout(f"Delete task result: \n{result}")
3181
3113
 
3182
3114
 
3183
3115
  delete_task_options = [
3184
- Option(
3185
- "project_id",
3186
- ["--project-id", "--pid"],
3187
- "ID of the project",
3188
- True
3189
- ),
3116
+ PROJECT_ID_OPTION,
3190
3117
  Option(
3191
3118
  "task_id",
3192
3119
  ["--task-id", "--tid"],
@@ -3218,30 +3145,22 @@ def publish_task_revision(option_list: list):
3218
3145
  if option_flag.name == "revision":
3219
3146
  revision = option_arg
3220
3147
 
3221
- if not project_id:
3222
- raise MissingRequirementException("Project ID must be specified.")
3223
3148
  if not (task_id or task_name):
3224
3149
  raise MissingRequirementException("Either task ID or task name must be specified.")
3225
3150
  if not revision:
3226
3151
  raise MissingRequirementException("Revision must be specified.")
3227
3152
 
3228
- client = AgenticProcessClient()
3153
+ client = AgenticProcessClient(project_id=project_id)
3229
3154
  result = client.publish_task_revision(
3230
- project_id=project_id,
3231
3155
  task_id=task_id,
3232
3156
  task_name=task_name,
3233
3157
  revision=revision
3234
3158
  )
3235
- sys.stdout.write(f"Published task revision detail: \n{result}\n")
3159
+ Console.write_stdout(f"Published task revision detail: \n{result}")
3236
3160
 
3237
3161
 
3238
3162
  publish_task_revision_options = [
3239
- Option(
3240
- "project_id",
3241
- ["--project-id", "--pid"],
3242
- "ID of the project",
3243
- True
3244
- ),
3163
+ PROJECT_ID_OPTION,
3245
3164
  Option(
3246
3165
  "task_id",
3247
3166
  ["--task-id", "--tid"],
@@ -3287,28 +3206,20 @@ def start_instance(option_list: list):
3287
3206
  "Variables must be a JSON list: '[{\"key\": \"location\", \"value\": \"Paris\"}]'"
3288
3207
  )
3289
3208
 
3290
- if not project_id:
3291
- raise MissingRequirementException("Project ID must be specified.")
3292
3209
  if not process_name:
3293
3210
  raise MissingRequirementException("Process name must be specified.")
3294
3211
 
3295
- client = AgenticProcessClient()
3212
+ client = AgenticProcessClient(project_id=project_id)
3296
3213
  result = client.start_instance(
3297
- project_id=project_id,
3298
3214
  process_name=process_name,
3299
3215
  subject=subject,
3300
3216
  variables=variables
3301
3217
  )
3302
- sys.stdout.write(f"Started instance detail: \n{result}\n")
3218
+ Console.write_stdout(f"Started instance detail: \n{result}")
3303
3219
 
3304
3220
 
3305
3221
  start_instance_options = [
3306
- Option(
3307
- "project_id",
3308
- ["--project-id", "--pid"],
3309
- "ID of the project",
3310
- True
3311
- ),
3222
+ PROJECT_ID_OPTION,
3312
3223
  Option(
3313
3224
  "process_name",
3314
3225
  ["--process-name", "--pn"],
@@ -3340,26 +3251,18 @@ def abort_instance(option_list: list):
3340
3251
  if option_flag.name == "instance_id":
3341
3252
  instance_id = option_arg
3342
3253
 
3343
- if not project_id:
3344
- raise MissingRequirementException("Project ID must be specified.")
3345
3254
  if not instance_id:
3346
3255
  raise MissingRequirementException("Instance ID must be specified.")
3347
3256
 
3348
- client = AgenticProcessClient()
3257
+ client = AgenticProcessClient(project_id=project_id)
3349
3258
  result = client.abort_instance(
3350
- project_id=project_id,
3351
3259
  instance_id=instance_id
3352
3260
  )
3353
- sys.stdout.write(f"Abort instance result: \n{result}\n")
3261
+ Console.write_stdout(f"Abort instance result: \n{result}")
3354
3262
 
3355
3263
 
3356
3264
  abort_instance_options = [
3357
- Option(
3358
- "project_id",
3359
- ["--project-id", "--pid"],
3360
- "ID of the project",
3361
- True
3362
- ),
3265
+ PROJECT_ID_OPTION,
3363
3266
  Option(
3364
3267
  "instance_id",
3365
3268
  ["--instance-id", "--iid"],
@@ -3379,26 +3282,18 @@ def get_instance(option_list: list):
3379
3282
  if option_flag.name == "instance_id":
3380
3283
  instance_id = option_arg
3381
3284
 
3382
- if not project_id:
3383
- raise MissingRequirementException("Project ID must be specified.")
3384
3285
  if not instance_id:
3385
3286
  raise MissingRequirementException("Instance ID must be specified.")
3386
3287
 
3387
- client = AgenticProcessClient()
3288
+ client = AgenticProcessClient(project_id=project_id)
3388
3289
  result = client.get_instance(
3389
- project_id=project_id,
3390
3290
  instance_id=instance_id
3391
3291
  )
3392
- sys.stdout.write(f"Instance detail: \n{result}\n")
3292
+ Console.write_stdout(f"Instance detail: \n{result}")
3393
3293
 
3394
3294
 
3395
3295
  get_instance_options = [
3396
- Option(
3397
- "project_id",
3398
- ["--project-id", "--pid"],
3399
- "ID of the project",
3400
- True
3401
- ),
3296
+ PROJECT_ID_OPTION,
3402
3297
  Option(
3403
3298
  "instance_id",
3404
3299
  ["--instance-id", "--iid"],
@@ -3418,26 +3313,18 @@ def get_instance_history(option_list: list):
3418
3313
  if option_flag.name == "instance_id":
3419
3314
  instance_id = option_arg
3420
3315
 
3421
- if not project_id:
3422
- raise MissingRequirementException("Project ID must be specified.")
3423
3316
  if not instance_id:
3424
3317
  raise MissingRequirementException("Instance ID must be specified.")
3425
3318
 
3426
- client = AgenticProcessClient()
3319
+ client = AgenticProcessClient(project_id=project_id)
3427
3320
  result = client.get_instance_history(
3428
- project_id=project_id,
3429
3321
  instance_id=instance_id
3430
3322
  )
3431
- sys.stdout.write(f"Instance history: \n{result}\n")
3323
+ Console.write_stdout(f"Instance history: \n{result}")
3432
3324
 
3433
3325
 
3434
3326
  get_instance_history_options = [
3435
- Option(
3436
- "project_id",
3437
- ["--project-id", "--pid"],
3438
- "ID of the project",
3439
- True
3440
- ),
3327
+ PROJECT_ID_OPTION,
3441
3328
  Option(
3442
3329
  "instance_id",
3443
3330
  ["--instance-id", "--iid"],
@@ -3456,26 +3343,18 @@ def get_thread_information(option_list: list):
3456
3343
  if option_flag.name == "thread_id":
3457
3344
  thread_id = option_arg
3458
3345
 
3459
- if not project_id:
3460
- raise MissingRequirementException("Project ID must be specified.")
3461
3346
  if not thread_id:
3462
3347
  raise MissingRequirementException("Thread ID must be specified.")
3463
3348
 
3464
- client = AgenticProcessClient()
3349
+ client = AgenticProcessClient(project_id=project_id)
3465
3350
  result = client.get_thread_information(
3466
- project_id=project_id,
3467
3351
  thread_id=thread_id
3468
3352
  )
3469
- sys.stdout.write(f"Thread information: \n{result}\n")
3353
+ Console.write_stdout(f"Thread information: \n{result}")
3470
3354
 
3471
3355
 
3472
3356
  get_thread_information_options = [
3473
- Option(
3474
- "project_id",
3475
- ["--project-id", "--pid"],
3476
- "ID of the project",
3477
- True
3478
- ),
3357
+ PROJECT_ID_OPTION,
3479
3358
  Option(
3480
3359
  "thread_id",
3481
3360
  ["--thread-id", "--tid"],
@@ -3498,29 +3377,21 @@ def send_user_signal(option_list: list):
3498
3377
  if option_flag.name == "signal_name":
3499
3378
  signal_name = option_arg
3500
3379
 
3501
- if not project_id:
3502
- raise MissingRequirementException("Project ID must be specified.")
3503
3380
  if not instance_id:
3504
3381
  raise MissingRequirementException("Instance ID must be specified.")
3505
3382
  if not signal_name:
3506
3383
  raise MissingRequirementException("Signal name must be specified.")
3507
3384
 
3508
- client = AgenticProcessClient()
3385
+ client = AgenticProcessClient(project_id=project_id)
3509
3386
  result = client.send_user_signal(
3510
- project_id=project_id,
3511
3387
  instance_id=instance_id,
3512
3388
  signal_name=signal_name
3513
3389
  )
3514
- sys.stdout.write(f"Send user signal result: \n{result}\n")
3390
+ Console.write_stdout(f"Send user signal result: \n{result}")
3515
3391
 
3516
3392
 
3517
3393
  send_user_signal_options = [
3518
- Option(
3519
- "project_id",
3520
- ["--project-id", "--pid"],
3521
- "ID of the project",
3522
- True
3523
- ),
3394
+ PROJECT_ID_OPTION,
3524
3395
  Option(
3525
3396
  "instance_id",
3526
3397
  ["--instance-id", "--iid"],
@@ -3568,28 +3439,20 @@ def create_kb(option_list: list):
3568
3439
  "Metadata must be a JSON list of strings: '[\"meta1\", \"meta2\"]'"
3569
3440
  )
3570
3441
 
3571
- if not project_id:
3572
- raise MissingRequirementException("Project ID must be specified.")
3573
3442
  if not name:
3574
3443
  raise MissingRequirementException("Name must be specified.")
3575
3444
 
3576
- client = AgenticProcessClient()
3445
+ client = AgenticProcessClient(project_id=project_id)
3577
3446
  result = client.create_kb(
3578
- project_id=project_id,
3579
3447
  name=name,
3580
3448
  artifacts=artifacts,
3581
3449
  metadata=metadata
3582
3450
  )
3583
- sys.stdout.write(f"Created knowledge base detail: \n{result}\n")
3451
+ Console.write_stdout(f"Created knowledge base detail: \n{result}")
3584
3452
 
3585
3453
 
3586
3454
  create_kb_options = [
3587
- Option(
3588
- "project_id",
3589
- ["--project-id", "--pid"],
3590
- "ID of the project",
3591
- True
3592
- ),
3455
+ PROJECT_ID_OPTION,
3593
3456
  Option(
3594
3457
  "name",
3595
3458
  ["--name", "-n"],
@@ -3624,27 +3487,19 @@ def get_kb(option_list: list):
3624
3487
  if option_flag.name == "kb_name":
3625
3488
  kb_name = option_arg
3626
3489
 
3627
- if not project_id:
3628
- raise MissingRequirementException("Project ID must be specified.")
3629
3490
  if not (kb_id or kb_name):
3630
3491
  raise MissingRequirementException("Either KB ID or KB name must be specified.")
3631
3492
 
3632
- client = AgenticProcessClient()
3493
+ client = AgenticProcessClient(project_id=project_id)
3633
3494
  result = client.get_kb(
3634
- project_id=project_id,
3635
3495
  kb_id=kb_id,
3636
3496
  kb_name=kb_name
3637
3497
  )
3638
- sys.stdout.write(f"Knowledge base detail: \n{result}\n")
3498
+ Console.write_stdout(f"Knowledge base detail: \n{result}")
3639
3499
 
3640
3500
 
3641
3501
  get_kb_options = [
3642
- Option(
3643
- "project_id",
3644
- ["--project-id", "--pid"],
3645
- "ID of the project",
3646
- True
3647
- ),
3502
+ PROJECT_ID_OPTION,
3648
3503
  Option(
3649
3504
  "kb_id",
3650
3505
  ["--kb-id", "--kid"],
@@ -3676,26 +3531,17 @@ def list_kbs(option_list: list):
3676
3531
  if option_flag.name == "count":
3677
3532
  count = option_arg
3678
3533
 
3679
- if not project_id:
3680
- raise MissingRequirementException("Project ID must be specified.")
3681
-
3682
- client = AgenticProcessClient()
3534
+ client = AgenticProcessClient(project_id=project_id)
3683
3535
  result = client.list_kbs(
3684
- project_id=project_id,
3685
3536
  name=name,
3686
3537
  start=start,
3687
3538
  count=count
3688
3539
  )
3689
- sys.stdout.write(f"Knowledge base list: \n{result}\n")
3540
+ Console.write_stdout(f"Knowledge base list: \n{result}")
3690
3541
 
3691
3542
 
3692
3543
  list_kbs_options = [
3693
- Option(
3694
- "project_id",
3695
- ["--project-id", "--pid"],
3696
- "ID of the project",
3697
- True
3698
- ),
3544
+ PROJECT_ID_OPTION,
3699
3545
  Option(
3700
3546
  "name",
3701
3547
  ["--name", "-n"],
@@ -3730,27 +3576,19 @@ def delete_kb(option_list: list):
3730
3576
  if option_flag.name == "kb_name":
3731
3577
  kb_name = option_arg
3732
3578
 
3733
- if not project_id:
3734
- raise MissingRequirementException("Project ID must be specified.")
3735
3579
  if not (kb_id or kb_name):
3736
3580
  raise MissingRequirementException("Either KB ID or KB name must be specified.")
3737
3581
 
3738
- client = AgenticProcessClient()
3582
+ client = AgenticProcessClient(project_id=project_id)
3739
3583
  result = client.delete_kb(
3740
- project_id=project_id,
3741
3584
  kb_id=kb_id,
3742
3585
  kb_name=kb_name
3743
3586
  )
3744
- sys.stdout.write(f"Delete knowledge base result: \n{result}\n")
3587
+ Console.write_stdout(f"Delete knowledge base result: \n{result}")
3745
3588
 
3746
3589
 
3747
3590
  delete_kb_options = [
3748
- Option(
3749
- "project_id",
3750
- ["--project-id", "--pid"],
3751
- "ID of the project",
3752
- True
3753
- ),
3591
+ PROJECT_ID_OPTION,
3754
3592
  Option(
3755
3593
  "kb_id",
3756
3594
  ["--kb-id", "--kid"],
@@ -3790,28 +3628,19 @@ def list_jobs(option_list: list):
3790
3628
  if option_flag.name == "name":
3791
3629
  name = option_arg
3792
3630
 
3793
- if not project_id:
3794
- raise MissingRequirementException("Project ID must be specified.")
3795
-
3796
- client = AgenticProcessClient()
3631
+ client = AgenticProcessClient(project_id=project_id)
3797
3632
  result = client.list_jobs(
3798
- project_id=project_id,
3799
3633
  start=start,
3800
3634
  count=count,
3801
3635
  topic=topic,
3802
3636
  token=token,
3803
3637
  name=name
3804
3638
  )
3805
- sys.stdout.write(f"Job list: \n{result}\n")
3639
+ Console.write_stdout(f"Job list: \n{result}")
3806
3640
 
3807
3641
 
3808
3642
  list_jobs_options = [
3809
- Option(
3810
- "project_id",
3811
- ["--project-id", "--pid"],
3812
- "ID of the project",
3813
- True
3814
- ),
3643
+ PROJECT_ID_OPTION,
3815
3644
  Option(
3816
3645
  "start",
3817
3646
  ["--start", "-s"],
@@ -3884,6 +3713,24 @@ ai_lab_commands = [
3884
3713
  [],
3885
3714
  get_agent_options
3886
3715
  ),
3716
+ Command(
3717
+ "export_agent",
3718
+ ["export-agent", "ea"],
3719
+ "Export agent",
3720
+ export_agent,
3721
+ ArgumentsEnum.REQUIRED,
3722
+ [],
3723
+ export_agent_options
3724
+ ),
3725
+ Command(
3726
+ "import_agent",
3727
+ ["import-agent", "ia"],
3728
+ "Import agent",
3729
+ import_agent,
3730
+ ArgumentsEnum.REQUIRED,
3731
+ [],
3732
+ import_agent_options
3733
+ ),
3887
3734
  Command(
3888
3735
  "create_sharing_link",
3889
3736
  ["create-sharing-link", "csl"],
@@ -3948,6 +3795,15 @@ ai_lab_commands = [
3948
3795
  [],
3949
3796
  get_tool_options
3950
3797
  ),
3798
+ #Command(
3799
+ # "export_tool",
3800
+ # ["export-tool", "et"],
3801
+ # "Export tool",
3802
+ # export_tool,
3803
+ # ArgumentsEnum.REQUIRED,
3804
+ # [],
3805
+ # export_tool_options
3806
+ #),
3951
3807
  Command(
3952
3808
  "delete_tool",
3953
3809
  ["delete-tool", "dt"],