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,23 +1,34 @@
1
1
  import json
2
+ import platform
3
+ import os
4
+ import subprocess
2
5
  import sys
6
+ from importlib import resources
7
+ from pathlib import Path
3
8
 
9
+ from pygeai import logger
4
10
  from pygeai.chat.clients import ChatClient
5
11
  from pygeai.chat.iris import Iris
12
+ from pygeai.chat.session import AgentChatSession
6
13
  from pygeai.cli.commands import Command, Option, ArgumentsEnum
7
14
  from pygeai.cli.commands.builders import build_help_text
8
15
  from pygeai.cli.commands.common import get_messages, get_boolean_value, get_penalty_float_value
16
+ from pygeai.cli.commands.lab.utils import get_project_id
9
17
  from pygeai.cli.texts.help import CHAT_HELP_TEXT
10
- from pygeai.core.common.exceptions import MissingRequirementException, WrongArgumentError
18
+ from pygeai.core.common.exceptions import MissingRequirementException, WrongArgumentError, InvalidAgentException
11
19
  from prompt_toolkit import PromptSession
12
20
  from prompt_toolkit.history import InMemoryHistory
13
21
 
22
+ from pygeai.core.utils.console import Console
23
+ from pygeai.lab.agents.clients import AgentClient
24
+
14
25
 
15
26
  def show_help():
16
27
  """
17
28
  Displays help text in stdout
18
29
  """
19
30
  help_text = build_help_text(chat_commands, CHAT_HELP_TEXT)
20
- sys.stdout.write(help_text)
31
+ Console.write_stdout(help_text)
21
32
 
22
33
 
23
34
  def get_chat_completion(option_list: list):
@@ -41,6 +52,7 @@ def get_chat_completion(option_list: list):
41
52
  store = None
42
53
  metadata = None
43
54
  user = None
55
+ reasoning_effort = None
44
56
 
45
57
  for option_flag, option_arg in option_list:
46
58
  if option_flag.name == "model":
@@ -113,6 +125,8 @@ def get_chat_completion(option_list: list):
113
125
  raise WrongArgumentError("metadata must be a valid JSON object")
114
126
  if option_flag.name == "user":
115
127
  user = option_arg
128
+ if option_flag.name == "reasoning_effort":
129
+ reasoning_effort = option_arg
116
130
 
117
131
  messages = get_messages(message_list)
118
132
 
@@ -140,16 +154,17 @@ def get_chat_completion(option_list: list):
140
154
  stream_options=stream_options,
141
155
  store=store,
142
156
  metadata=metadata,
143
- user=user
157
+ user=user,
158
+ reasoning_effort=reasoning_effort
144
159
  )
145
160
  if stream:
146
- sys.stdout.write("Streaming chat completion:\n")
161
+ Console.write_stdout("Streaming chat completion:")
147
162
  for chunk in result:
148
- sys.stdout.write(f"{chunk}")
163
+ Console.write_stdout(f"{chunk}", end="")
149
164
  sys.stdout.flush()
150
- sys.stdout.write("\n")
165
+ Console.write_stdout()
151
166
  else:
152
- sys.stdout.write(f"Chat completion detail: \n{result}\n")
167
+ Console.write_stdout(f"Chat completion detail: \n{result}\n")
153
168
 
154
169
 
155
170
  chat_completion_options = [
@@ -284,6 +299,14 @@ chat_completion_options = [
284
299
  "Optional string identifier for the end-user to monitor abuse.",
285
300
  True
286
301
  ),
302
+ Option(
303
+ "reasoning_effort",
304
+ ["--reasoning-effort"],
305
+ "Optional string to control the depth of reasoning applied by supported models. "
306
+ "Possible values: 'low', 'medium', 'high'. Supported by OpenAI models from version 5, "
307
+ "Claude models from version 4.1, and Gemini models from version 2.0.",
308
+ True
309
+ ),
287
310
  ]
288
311
 
289
312
 
@@ -294,15 +317,15 @@ def chat_with_iris():
294
317
  history = InMemoryHistory()
295
318
  session = PromptSession(">> Ask Iris: ", history=history)
296
319
 
297
- sys.stdout.write(f"#==============================#\n")
298
- sys.stdout.write(f"#------------- IRIS -----------#\n")
299
- sys.stdout.write(f"#==============================#\n")
300
- sys.stdout.write(f"# This is the start of your conversation with Iris. Type 'exit' or press Ctrl+C to close the chat.\n\n")
301
- sys.stdout.write("""- Iris: Hello! I'm Iris. I'll guide you step by step to create your agent.
302
- First, we need to define some key details for your agent. You can specify its role and purpose or give it a name, and I'll help you set up the rest. Once we have that, we'll refine its knowledge and behavior.\n""")
320
+ Console.write_stdout(f"#=================================================#")
321
+ Console.write_stdout(f"#--------------------- IRIS ----------------------#")
322
+ Console.write_stdout(f"#=================================================#")
323
+ Console.write_stdout(f"# This is the start of your conversation with Iris. Type 'exit' or press Ctrl+C to close the chat.\n")
324
+ Console.write_stdout("""- Iris: Hello! I'm Iris. I'll guide you step by step to create your agent.
325
+ First, we need to define some key details for your agent. You can specify its role and purpose or give it a name, and I'll help you set up the rest. Once we have that, we'll refine its knowledge and behavior.""")
303
326
  try:
304
327
  while (user_input := session.prompt()) != "exit":
305
- sys.stdout.write(f"- User: {user_input}\n")
328
+ Console.write_stdout(f"- User: {user_input}")
306
329
  new_message = {
307
330
  "role": "user",
308
331
  "content": user_input
@@ -311,15 +334,15 @@ First, we need to define some key details for your agent. You can specify its ro
311
334
 
312
335
  result = iris.stream_answer(messages)
313
336
  answer = ""
314
- sys.stdout.write("- Iris: ")
337
+ Console.write_stdout("- Iris: ")
315
338
  for chunk in result:
316
339
  answer += chunk
317
- sys.stdout.write(f"{chunk}")
340
+ Console.write_stdout(f"{chunk}", end="")
318
341
  sys.stdout.flush()
319
- sys.stdout.write("\n")
342
+ Console.write_stdout()
320
343
 
321
344
  new_answer = {
322
- "role": "agent",
345
+ "role": "assistant",
323
346
  "content": answer
324
347
  }
325
348
  messages.append(new_answer)
@@ -328,9 +351,607 @@ First, we need to define some key details for your agent. You can specify its ro
328
351
  sys.exit(0)
329
352
 
330
353
  except Exception as e:
331
- sys.stderr.write("An unexpected error has occurred. Please contact the developers.")
354
+ logger.error(f"Error chatting with Iris: {e}")
355
+ Console.write_stderr("An unexpected error has occurred. Please contact the developers.")
356
+
357
+
358
+ def chat_with_agent(option_list: list):
359
+ agent_name = None
360
+ use_gui = False
361
+ save_session_file = None
362
+ restore_session_file = None
363
+ for option_flag, option_arg in option_list:
364
+ if option_flag.name == "agent_name":
365
+ agent_name = option_arg
366
+ if option_flag.name == "gui":
367
+ use_gui = True
368
+ if option_flag.name == "save_session":
369
+ save_session_file = option_arg
370
+ if option_flag.name == "restore_session":
371
+ restore_session_file = option_arg
372
+
373
+ if not agent_name:
374
+ raise MissingRequirementException(f"Agent name must be specified.")
375
+
376
+ project_id = get_project_id()
377
+ agent_data = AgentClient(project_id=project_id).get_agent(agent_id=agent_name)
378
+ if 'errors' in agent_data:
379
+ raise InvalidAgentException(f"There is no agent with that name: {agent_data.get('errors')}")
380
+
381
+ if use_gui:
382
+ try:
383
+ import streamlit
384
+ except ImportError:
385
+ logger.error("Streamlit not installed")
386
+ Console.write_stderr("Streamlit is required for GUI mode. Install it with 'pip install streamlit'.")
387
+ sys.exit(1)
388
+
389
+ try:
390
+ ui_path = resources.files("pygeai.chat").joinpath("ui.py")
391
+ ui_file_path = str(ui_path)
392
+
393
+ # Add the top-level project root to PYTHONPATH
394
+ package_root = str(Path(ui_file_path).resolve().parents[2])
395
+ env = os.environ.copy()
396
+ env["PYTHONPATH"] = package_root + os.pathsep + env.get("PYTHONPATH", "")
397
+
398
+ streamlit_cmd = [
399
+ sys.executable, "-m", "streamlit", "run", ui_file_path,
400
+ "--server.address", "127.0.0.1",
401
+ "--", "--agent-name", agent_name
402
+ ]
403
+
404
+ if platform.system() == "Linux":
405
+ streamlit_cmd.insert(5, "--server.headless=true")
406
+
407
+ process = subprocess.Popen(
408
+ streamlit_cmd,
409
+ stdout=subprocess.PIPE,
410
+ stderr=subprocess.PIPE,
411
+ text=True
412
+ )
413
+
414
+ url = "http://localhost:8501"
415
+ if platform.system() == "Linux":
416
+ Console.write_stdout(f"Open Streamlit app at {url} (or next port like 8502 if 8501 is taken)")
417
+
418
+ try:
419
+ stdout, stderr = process.communicate()
420
+ if stderr:
421
+ logger.error(f"Streamlit stderr:\n{stderr}")
422
+ Console.write_stderr(f"Streamlit error:\n{stderr}")
423
+ except KeyboardInterrupt:
424
+ process.terminate()
425
+ Console.write_stdout("Streamlit stopped.")
426
+ sys.exit(0)
427
+
428
+ except FileNotFoundError:
429
+ logger.error("Could not locate pygeai/chat/ui.py")
430
+ Console.write_stderr("Streamlit UI file not found. Ensure pygeai is installed correctly.")
431
+ sys.exit(1)
432
+ except Exception as e:
433
+ logger.error(f"Streamlit error: {e}")
434
+ Console.write_stderr(
435
+ f"Failed to launch Streamlit. Check port with 'lsof -i :8501' and kill any process, or try {url}.")
436
+ sys.exit(1)
437
+ else:
438
+ chat_session = AgentChatSession(agent_name)
439
+ messages = list()
440
+
441
+ # Restore session if specified
442
+ if restore_session_file:
443
+ try:
444
+ with open(restore_session_file, 'r') as f:
445
+ restored_data = json.load(f)
446
+ if isinstance(restored_data, list):
447
+ messages = restored_data
448
+ Console.write_stdout(f"Restored conversation from {restore_session_file}")
449
+ # Display restored conversation history
450
+ Console.write_stdout(f"#=================================================#")
451
+ Console.write_stdout(f"# CHAT SESSION WITH {agent_name} ")
452
+ Console.write_stdout(f"#=================================================#")
453
+ for msg in messages:
454
+ role = msg.get("role", "unknown")
455
+ content = msg.get("content", "")
456
+ if role == "assistant":
457
+ Console.write_stdout(f"- Agent: {content}")
458
+ elif role == "user":
459
+ Console.write_stdout(f"- User: {content}")
460
+ else:
461
+ raise WrongArgumentError("Session file must contain a list of messages in JSON format.")
462
+ except FileNotFoundError:
463
+ logger.error(f"Session file {restore_session_file} not found.")
464
+ Console.write_stderr(f"Session file {restore_session_file} not found. Starting a new conversation.")
465
+ except json.JSONDecodeError:
466
+ logger.error(f"Invalid JSON format in {restore_session_file}.")
467
+ Console.write_stderr(f"Invalid JSON format in {restore_session_file}. Starting a new conversation.")
468
+ except Exception as e:
469
+ logger.error(f"Error restoring session: {e}")
470
+ Console.write_stderr(f"Error restoring session from {restore_session_file}. Starting a new conversation.")
471
+
472
+ # If no session was restored or messages are empty, get the agent's introduction
473
+ if not messages:
474
+ introduction_message = chat_session.get_answer(
475
+ ["You're about to speak to a user. Introduce yourself in a clear and concise manner, "
476
+ "stating who you are and what you do. Nothing else."]
477
+ )
478
+
479
+ if "Agent not found" in str(introduction_message):
480
+ raise WrongArgumentError(
481
+ "The specified agent doesn't seem to exist. Please review the name and try again.")
482
+
483
+ Console.write_stdout(f"#=================================================#")
484
+ Console.write_stdout(f"# CHAT SESSION WITH {agent_name} ")
485
+ Console.write_stdout(f"#=================================================#")
486
+ Console.write_stdout(introduction_message)
487
+ messages.append({"role": "assistant", "content": introduction_message})
488
+
489
+ history = InMemoryHistory()
490
+ session = PromptSession(f">> Ask {agent_name}: ", history=history)
491
+
492
+ # Save session function
493
+ def save_session(messages, file_path):
494
+ try:
495
+ with open(file_path, 'w') as f:
496
+ json.dump(messages, f, indent=2)
497
+ logger.info(f"Session saved to {file_path}")
498
+ except Exception as e:
499
+ logger.error(f"Error saving session to {file_path}: {e}")
500
+ Console.write_stderr(f"Failed to save session to {file_path}: {e}")
501
+
502
+ try:
503
+ while (user_input := session.prompt()) != "exit":
504
+ Console.write_stdout(f"- User: {user_input}")
505
+ new_message = {
506
+ "role": "user",
507
+ "content": user_input
508
+ }
509
+ messages.append(new_message)
510
+
511
+ # Save session after user input if specified
512
+ if save_session_file:
513
+ save_session(messages, save_session_file)
514
+
515
+ result = chat_session.stream_answer(messages)
516
+ answer = ""
517
+ Console.write_stdout("- Agent: ")
518
+ for chunk in result:
519
+ answer += chunk
520
+ Console.write_stdout(f"{chunk}", end="")
521
+ sys.stdout.flush()
522
+ Console.write_stdout()
523
+
524
+ new_answer = {
525
+ "role": "assistant",
526
+ "content": answer
527
+ }
528
+ messages.append(new_answer)
529
+
530
+ # Save session after agent response if specified
531
+ if save_session_file:
532
+ save_session(messages, save_session_file)
533
+
534
+ except KeyboardInterrupt:
535
+ print("\nExiting chat...")
536
+ # Final save before exit if specified
537
+ if save_session_file:
538
+ save_session(messages, save_session_file)
539
+ sys.exit(0)
540
+ except WrongArgumentError as e:
541
+ Console.write_stderr(f"There was an error: {e}")
542
+ except Exception as e:
543
+ logger.error(f"Error chatting with Agent: {e}")
544
+ Console.write_stderr("An unexpected error has occurred. Please contact the developers.")
545
+ # Save session on error if specified
546
+ if save_session_file:
547
+ save_session(messages, save_session_file)
548
+
549
+
550
+ chat_with_agent_options = [
551
+ Option(
552
+ "agent_name",
553
+ ["--agent-name", "--name", "-n"],
554
+ "You can use the internal name, public name and agent id in order to chat interactively with any agent",
555
+ True
556
+ ),
557
+ Option(
558
+ "gui",
559
+ ["--gui", "-g"],
560
+ "Launch a Streamlit GUI chat interface. No need to specify argument next to the option",
561
+ False
562
+ ),
563
+ Option(
564
+ "save_session",
565
+ ["--save-session", "--ss"],
566
+ "Save the conversation to a JSON file. Provide the file path as the argument.",
567
+ True
568
+ ),
569
+ Option(
570
+ "restore_session",
571
+ ["--restore-session", "--rs"],
572
+ "Restore a conversation from a JSON file. Provide the file path as the argument.",
573
+ True
574
+ ),
575
+ ]
576
+
577
+
578
+ def get_generate_image(option_list: list):
579
+ model = None
580
+ prompt = None
581
+ n = None
582
+ quality = None
583
+ size = None
584
+ aspect_ratio = None
585
+
586
+ for option_flag, option_arg in option_list:
587
+ if option_flag.name == "model":
588
+ model = option_arg
589
+ if option_flag.name == "prompt":
590
+ prompt = option_arg
591
+ if option_flag.name == "n":
592
+ try:
593
+ n = int(option_arg)
594
+ if n < 1 or n > 10:
595
+ raise WrongArgumentError("n must be an integer between 1 and 10.")
596
+ except ValueError:
597
+ raise WrongArgumentError("n must be a valid integer.")
598
+ if option_flag.name == "quality":
599
+ quality = option_arg
600
+ if option_flag.name == "size":
601
+ size = option_arg
602
+ if option_flag.name == "aspect_ratio":
603
+ aspect_ratio = option_arg
604
+
605
+ if not (model and prompt and n is not None and quality and size):
606
+ raise MissingRequirementException("Cannot generate image without specifying model, prompt, n, quality, and size.")
607
+
608
+ client = ChatClient()
609
+ try:
610
+ result = client.generate_image(
611
+ model=model,
612
+ prompt=prompt,
613
+ n=n,
614
+ quality=quality,
615
+ size=size,
616
+ aspect_ratio=aspect_ratio
617
+ )
618
+ Console.write_stdout(f"Image generation result: \n{result}\n")
619
+ except Exception as e:
620
+ logger.error(f"Error generating image: {e}")
621
+ Console.write_stderr(f"Failed to generate image: {e}")
622
+
623
+
624
+ generate_image_options = [
625
+ Option(
626
+ "model",
627
+ ["--model", "-m"],
628
+ "The model specification for image generation, e.g., 'openai/gpt-image-1'.",
629
+ True
630
+ ),
631
+ Option(
632
+ "prompt",
633
+ ["--prompt", "-p"],
634
+ "Description of the desired image.",
635
+ True
636
+ ),
637
+ Option(
638
+ "n",
639
+ ["--n"],
640
+ "Number of images to generate (1-10, depending on the model).",
641
+ True
642
+ ),
643
+ Option(
644
+ "quality",
645
+ ["--quality", "-q"],
646
+ "Rendering quality, e.g., 'high'.",
647
+ True
648
+ ),
649
+ Option(
650
+ "size",
651
+ ["--size", "-s"],
652
+ "Image dimensions, e.g., '1024x1024'.",
653
+ True
654
+ ),
655
+ Option(
656
+ "aspect_ratio",
657
+ ["--aspect-ratio", "-ar"],
658
+ "Relationship between image’s width and height, e.g., '1:1', '9:16', '16:9', '3:4', '4:3'.",
659
+ True
660
+ ),
661
+ ]
662
+
663
+
664
+ def get_edit_image(option_list: list):
665
+ model = None
666
+ prompt = None
667
+ image = None
668
+ size = None
669
+ n = 1
670
+ quality = None
671
+
672
+ for option_flag, option_arg in option_list:
673
+ if option_flag.name == "model":
674
+ model = option_arg
675
+ if option_flag.name == "prompt":
676
+ prompt = option_arg
677
+ if option_flag.name == "image":
678
+ image = option_arg
679
+ if option_flag.name == "size":
680
+ size = option_arg
681
+ if option_flag.name == "n":
682
+ try:
683
+ n = int(option_arg)
684
+ if n < 1 or n > 10:
685
+ raise WrongArgumentError("n must be an integer between 1 and 10.")
686
+ except ValueError:
687
+ raise WrongArgumentError("n must be a valid integer.")
688
+ if option_flag.name == "quality":
689
+ quality = option_arg
690
+
691
+ if not (model and prompt and image and size):
692
+ raise MissingRequirementException("Cannot edit image without specifying model, prompt, image, and size.")
693
+
694
+ client = ChatClient()
695
+ try:
696
+ result = client.edit_image(
697
+ model=model,
698
+ prompt=prompt,
699
+ image=image,
700
+ size=size,
701
+ n=n,
702
+ quality=quality
703
+ )
704
+ Console.write_stdout(f"Image editing result: \n{result}\n")
705
+ except Exception as e:
706
+ logger.error(f"Error editing image: {e}")
707
+ Console.write_stderr(f"Failed to edit image: {e}")
332
708
 
333
709
 
710
+ edit_image_options = [
711
+ Option(
712
+ "model",
713
+ ["--model", "-m"],
714
+ "The model specification for image editing, e.g., 'openai/gpt-image-1'.",
715
+ True
716
+ ),
717
+ Option(
718
+ "prompt",
719
+ ["--prompt", "-p"],
720
+ "Description of the desired edit, e.g., 'remove the ball'.",
721
+ True
722
+ ),
723
+ Option(
724
+ "image",
725
+ ["--image", "-img"],
726
+ "URL of the image to be edited, e.g., 'https://example.com/image.jpg'.",
727
+ True
728
+ ),
729
+ Option(
730
+ "size",
731
+ ["--size", "-s"],
732
+ "Desired dimensions of the output image in pixels, e.g., '1024x1024'.",
733
+ True
734
+ ),
735
+ Option(
736
+ "n",
737
+ ["--n"],
738
+ "Number of edited images to generate (1-10, depending on the model). Default is 1.",
739
+ True
740
+ ),
741
+ Option(
742
+ "quality",
743
+ ["--quality", "-q"],
744
+ "Rendering quality, e.g., 'high', 'medium', 'low'.",
745
+ True
746
+ ),
747
+ ]
748
+
749
+
750
+ def get_response(option_list: list):
751
+ model = None
752
+ input_text = None
753
+ files = None
754
+ tools = None
755
+ tool_choice = None
756
+ temperature = None
757
+ max_output_tokens = None
758
+ top_p = None
759
+ metadata = None
760
+ user = None
761
+ instructions = None
762
+ reasoning = None
763
+ truncation = None
764
+ parallel_tool_calls = None
765
+ store = None
766
+ stream = False
767
+
768
+ for option_flag, option_arg in option_list:
769
+ if option_flag.name == "model":
770
+ model = option_arg
771
+ if option_flag.name == "input":
772
+ input_text = option_arg
773
+ if option_flag.name == "files":
774
+ try:
775
+ files = json.loads(option_arg) if option_arg else None
776
+ if files and not isinstance(files, list):
777
+ raise WrongArgumentError("files must be a JSON array of file paths")
778
+ except json.JSONDecodeError:
779
+ raise WrongArgumentError("files must be a valid JSON array")
780
+ if option_flag.name == "tools":
781
+ try:
782
+ tools = json.loads(option_arg) if option_arg else None
783
+ except json.JSONDecodeError:
784
+ raise WrongArgumentError("tools must be a valid JSON array")
785
+ if option_flag.name == "tool_choice":
786
+ try:
787
+ tool_choice = json.loads(option_arg) if option_arg else None
788
+ except json.JSONDecodeError:
789
+ tool_choice = option_arg
790
+ if option_flag.name == "temperature":
791
+ temperature = float(option_arg) if option_arg is not None else None
792
+ if option_flag.name == "max_output_tokens":
793
+ max_output_tokens = int(option_arg) if option_arg is not None else None
794
+ if option_flag.name == "top_p":
795
+ top_p = float(option_arg) if option_arg else None
796
+ if option_flag.name == "metadata":
797
+ try:
798
+ metadata = json.loads(option_arg) if option_arg else None
799
+ except json.JSONDecodeError:
800
+ raise WrongArgumentError("metadata must be a valid JSON object")
801
+ if option_flag.name == "user":
802
+ user = option_arg
803
+ if option_flag.name == "instructions":
804
+ instructions = option_arg
805
+ if option_flag.name == "reasoning":
806
+ try:
807
+ reasoning = json.loads(option_arg) if option_arg else None
808
+ except json.JSONDecodeError:
809
+ raise WrongArgumentError("reasoning must be a valid JSON object")
810
+ if option_flag.name == "truncation":
811
+ truncation = option_arg
812
+ if option_flag.name == "parallel_tool_calls":
813
+ parallel_tool_calls = get_boolean_value(option_arg) if option_arg else None
814
+ if option_flag.name == "store":
815
+ store = get_boolean_value(option_arg) if option_arg else None
816
+ if option_flag.name == "stream":
817
+ if option_arg:
818
+ stream = get_boolean_value(option_arg)
819
+
820
+ if not (model and input_text):
821
+ raise MissingRequirementException("Cannot get response without specifying model and input")
822
+
823
+ client = ChatClient()
824
+ try:
825
+ result = client.get_response(
826
+ model=model,
827
+ input=input_text,
828
+ files=files,
829
+ tools=tools,
830
+ tool_choice=tool_choice,
831
+ temperature=temperature,
832
+ max_output_tokens=max_output_tokens,
833
+ top_p=top_p,
834
+ metadata=metadata,
835
+ user=user,
836
+ instructions=instructions,
837
+ reasoning=reasoning,
838
+ truncation=truncation,
839
+ parallel_tool_calls=parallel_tool_calls,
840
+ store=store,
841
+ stream=stream
842
+ )
843
+ if stream:
844
+ Console.write_stdout("Streaming response:")
845
+ for chunk in result:
846
+ Console.write_stdout(f"{chunk}", end="")
847
+ sys.stdout.flush()
848
+ Console.write_stdout()
849
+ else:
850
+ Console.write_stdout(f"Response result: \n{json.dumps(result, indent=2)}\n")
851
+ except Exception as e:
852
+ logger.error(f"Error getting response: {e}")
853
+ Console.write_stderr(f"Failed to get response: {e}")
854
+
855
+
856
+ response_options = [
857
+ Option(
858
+ "model",
859
+ ["--model", "-m"],
860
+ "The model specification, e.g., 'openai/o1-pro'.",
861
+ True
862
+ ),
863
+ Option(
864
+ "input",
865
+ ["--input", "-i"],
866
+ "The user input text.",
867
+ True
868
+ ),
869
+ Option(
870
+ "files",
871
+ ["--files", "-f"],
872
+ "JSON array of file paths (images or PDFs) to include in the request, e.g., '[\"image.jpg\", \"doc.pdf\"]'.",
873
+ True
874
+ ),
875
+ Option(
876
+ "tools",
877
+ ["--tools"],
878
+ "Optional JSON array of tools (e.g., functions) the model may call.",
879
+ True
880
+ ),
881
+ Option(
882
+ "tool_choice",
883
+ ["--tool-choice"],
884
+ "Optional string (e.g., \"none\", \"auto\") or JSON object to control which tool is called.",
885
+ True
886
+ ),
887
+ Option(
888
+ "temperature",
889
+ ["--temperature", "--temp"],
890
+ "Float value to set randomness of the response (between 0 and 2).",
891
+ True
892
+ ),
893
+ Option(
894
+ "max_output_tokens",
895
+ ["--max-output-tokens"],
896
+ "Integer value to set max tokens in the output.",
897
+ True
898
+ ),
899
+ Option(
900
+ "top_p",
901
+ ["--top-p"],
902
+ "Optional float value for nucleus sampling (between 0 and 1).",
903
+ True
904
+ ),
905
+ Option(
906
+ "metadata",
907
+ ["--metadata"],
908
+ "Optional JSON object with up to 16 key-value pairs to attach to the object.",
909
+ True
910
+ ),
911
+ Option(
912
+ "user",
913
+ ["--user"],
914
+ "Optional string identifier for the end-user.",
915
+ True
916
+ ),
917
+ Option(
918
+ "instructions",
919
+ ["--instructions"],
920
+ "Optional additional instructions for the model.",
921
+ True
922
+ ),
923
+ Option(
924
+ "reasoning",
925
+ ["--reasoning"],
926
+ "Optional JSON object for reasoning configuration, e.g., {\"effort\": \"medium\"}.",
927
+ True
928
+ ),
929
+ Option(
930
+ "truncation",
931
+ ["--truncation"],
932
+ "Optional truncation strategy, e.g., \"disabled\".",
933
+ True
934
+ ),
935
+ Option(
936
+ "parallel_tool_calls",
937
+ ["--parallel-tool-calls"],
938
+ "Optional boolean to enable parallel tool calls. Possible values: 0: OFF; 1: ON",
939
+ True
940
+ ),
941
+ Option(
942
+ "store",
943
+ ["--store"],
944
+ "Optional boolean to store the output. Possible values: 0: OFF; 1: ON",
945
+ True
946
+ ),
947
+ Option(
948
+ "stream",
949
+ ["--stream"],
950
+ "Whether to stream the response. Possible values: 0: OFF; 1: ON",
951
+ True
952
+ ),
953
+ ]
954
+
334
955
  chat_commands = [
335
956
  Command(
336
957
  "help",
@@ -359,5 +980,41 @@ chat_commands = [
359
980
  [],
360
981
  []
361
982
  ),
983
+ Command(
984
+ "agent",
985
+ ["agent"],
986
+ "Interactive chat with Agent",
987
+ chat_with_agent,
988
+ ArgumentsEnum.REQUIRED,
989
+ [],
990
+ chat_with_agent_options
991
+ ),
992
+ Command(
993
+ "generate_image",
994
+ ["generate-image", "gen-img"],
995
+ "Generate an image using the specified model and parameters",
996
+ get_generate_image,
997
+ ArgumentsEnum.REQUIRED,
998
+ [],
999
+ generate_image_options
1000
+ ),
1001
+ Command(
1002
+ "edit_image",
1003
+ ["edit-image", "edit-img"],
1004
+ "Edit an existing image using the specified model and parameters",
1005
+ get_edit_image,
1006
+ ArgumentsEnum.REQUIRED,
1007
+ [],
1008
+ edit_image_options
1009
+ ),
1010
+ Command(
1011
+ "response",
1012
+ ["response", "resp"],
1013
+ "Get a response using the Responses API with support for images and PDFs",
1014
+ get_response,
1015
+ ArgumentsEnum.REQUIRED,
1016
+ [],
1017
+ response_options
1018
+ ),
362
1019
 
363
1020
  ]