pygeai 0.1.6__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 (788) hide show
  1. pygeai/__init__.py +11 -2
  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 +48 -57
  146. pygeai/assistant/data/__init__.py +0 -0
  147. pygeai/assistant/data/clients.py +15 -0
  148. pygeai/assistant/data_analyst/__init__.py +0 -0
  149. pygeai/assistant/data_analyst/clients.py +75 -0
  150. pygeai/assistant/data_analyst/endpoints.py +2 -0
  151. pygeai/assistant/endpoints.py +0 -2
  152. pygeai/assistant/managers.py +738 -0
  153. pygeai/assistant/mappers.py +153 -0
  154. pygeai/assistant/rag/clients.py +132 -21
  155. pygeai/assistant/rag/mappers.py +228 -0
  156. pygeai/assistant/rag/models.py +396 -0
  157. pygeai/assistant/rag/responses.py +10 -0
  158. pygeai/auth/__init__.py +0 -0
  159. pygeai/auth/clients.py +129 -0
  160. pygeai/auth/endpoints.py +6 -0
  161. pygeai/chat/clients.py +406 -31
  162. pygeai/chat/endpoints.py +3 -0
  163. pygeai/chat/iris.py +17 -0
  164. pygeai/chat/managers.py +64 -0
  165. pygeai/chat/session.py +38 -0
  166. pygeai/chat/settings.py +6 -0
  167. pygeai/chat/ui.py +678 -0
  168. pygeai/cli/__init__.py +0 -1
  169. pygeai/cli/commands/admin.py +9 -12
  170. pygeai/cli/commands/analytics.py +533 -0
  171. pygeai/cli/commands/assistant.py +11 -11
  172. pygeai/cli/commands/auth.py +299 -0
  173. pygeai/cli/commands/base.py +201 -7
  174. pygeai/cli/commands/chat.py +875 -14
  175. pygeai/cli/commands/common.py +30 -26
  176. pygeai/cli/commands/configuration.py +84 -9
  177. pygeai/cli/commands/docs.py +105 -0
  178. pygeai/cli/commands/embeddings.py +187 -0
  179. pygeai/cli/commands/evaluation.py +2069 -0
  180. pygeai/cli/commands/feedback.py +93 -0
  181. pygeai/cli/commands/files.py +312 -0
  182. pygeai/cli/commands/flows/__init__.py +0 -0
  183. pygeai/cli/commands/gam.py +349 -0
  184. pygeai/cli/commands/lab/__init__.py +0 -0
  185. pygeai/cli/commands/lab/ai_lab.py +4110 -0
  186. pygeai/cli/commands/lab/common.py +135 -0
  187. pygeai/cli/commands/lab/options.py +8 -0
  188. pygeai/cli/commands/lab/spec.py +273 -0
  189. pygeai/cli/commands/lab/utils.py +13 -0
  190. pygeai/cli/commands/llm.py +164 -0
  191. pygeai/cli/commands/migrate.py +1198 -0
  192. pygeai/cli/commands/options.py +86 -0
  193. pygeai/cli/commands/organization.py +560 -98
  194. pygeai/cli/commands/rag.py +306 -10
  195. pygeai/cli/commands/rerank.py +108 -0
  196. pygeai/cli/commands/secrets.py +357 -0
  197. pygeai/cli/commands/usage_limits.py +583 -0
  198. pygeai/cli/commands/validators.py +209 -0
  199. pygeai/cli/commands/version.py +44 -0
  200. pygeai/cli/error_handler.py +151 -0
  201. pygeai/cli/geai.py +171 -30
  202. pygeai/cli/geai_proxy.py +318 -0
  203. pygeai/cli/install_man.py +107 -0
  204. pygeai/cli/parsers.py +78 -25
  205. pygeai/cli/texts/help.py +712 -55
  206. pygeai/core/__init__.py +9 -1
  207. pygeai/core/base/clients.py +61 -10
  208. pygeai/core/base/mappers.py +208 -30
  209. pygeai/core/base/models.py +8 -308
  210. pygeai/core/base/responses.py +18 -1
  211. pygeai/core/base/session.py +110 -17
  212. pygeai/core/common/config.py +98 -16
  213. pygeai/core/common/decorators.py +44 -0
  214. pygeai/core/common/exceptions.py +104 -4
  215. pygeai/core/embeddings/__init__.py +19 -0
  216. pygeai/core/embeddings/clients.py +93 -0
  217. pygeai/core/embeddings/endpoints.py +1 -0
  218. pygeai/core/embeddings/managers.py +62 -0
  219. pygeai/core/embeddings/mappers.py +52 -0
  220. pygeai/core/embeddings/models.py +14 -0
  221. pygeai/core/embeddings/responses.py +31 -0
  222. pygeai/core/feedback/__init__.py +0 -0
  223. pygeai/core/feedback/clients.py +50 -0
  224. pygeai/core/feedback/endpoints.py +1 -0
  225. pygeai/core/feedback/models.py +10 -0
  226. pygeai/core/files/__init__.py +0 -0
  227. pygeai/core/files/clients.py +156 -0
  228. pygeai/core/files/endpoints.py +5 -0
  229. pygeai/core/files/managers.py +224 -0
  230. pygeai/core/files/mappers.py +44 -0
  231. pygeai/core/files/models.py +24 -0
  232. pygeai/core/files/responses.py +19 -0
  233. pygeai/core/handlers.py +32 -0
  234. pygeai/core/llm/__init__.py +0 -0
  235. pygeai/core/llm/clients.py +53 -0
  236. pygeai/core/llm/endpoints.py +4 -0
  237. pygeai/core/models.py +799 -0
  238. pygeai/core/plugins/__init__.py +0 -0
  239. pygeai/core/plugins/clients.py +32 -0
  240. pygeai/core/plugins/endpoints.py +1 -0
  241. pygeai/core/plugins/models.py +86 -0
  242. pygeai/core/rerank/__init__.py +0 -0
  243. pygeai/core/rerank/clients.py +35 -0
  244. pygeai/core/rerank/endpoints.py +1 -0
  245. pygeai/core/rerank/managers.py +47 -0
  246. pygeai/core/rerank/mappers.py +23 -0
  247. pygeai/core/rerank/models.py +27 -0
  248. pygeai/core/responses.py +104 -0
  249. pygeai/core/secrets/__init__.py +0 -0
  250. pygeai/core/secrets/clients.py +212 -0
  251. pygeai/core/secrets/endpoints.py +7 -0
  252. pygeai/core/services/llm/__init__.py +0 -0
  253. pygeai/core/services/llm/model.py +186 -0
  254. pygeai/core/services/llm/providers.py +15 -0
  255. pygeai/core/services/response.py +18 -0
  256. pygeai/core/services/rest.py +311 -89
  257. pygeai/core/utils/__init__.py +0 -0
  258. pygeai/core/utils/console.py +83 -0
  259. pygeai/core/utils/parsers.py +32 -0
  260. pygeai/core/utils/validators.py +10 -0
  261. pygeai/dbg/__init__.py +3 -0
  262. pygeai/dbg/debugger.py +870 -0
  263. pygeai/evaluation/__init__.py +0 -0
  264. pygeai/evaluation/clients.py +19 -0
  265. pygeai/evaluation/dataset/__init__.py +0 -0
  266. pygeai/evaluation/dataset/clients.py +514 -0
  267. pygeai/evaluation/dataset/endpoints.py +26 -0
  268. pygeai/evaluation/plan/__init__.py +0 -0
  269. pygeai/evaluation/plan/clients.py +302 -0
  270. pygeai/evaluation/plan/endpoints.py +16 -0
  271. pygeai/evaluation/result/__init__.py +0 -0
  272. pygeai/evaluation/result/clients.py +70 -0
  273. pygeai/evaluation/result/endpoints.py +2 -0
  274. pygeai/flows/__init__.py +0 -0
  275. pygeai/flows/endpoints.py +362 -0
  276. pygeai/flows/models.py +1304 -0
  277. pygeai/gam/__init__.py +0 -0
  278. pygeai/gam/clients.py +178 -0
  279. pygeai/gam/endpoints.py +4 -0
  280. pygeai/health/__init__.py +0 -0
  281. pygeai/health/clients.py +24 -0
  282. pygeai/health/endpoints.py +1 -0
  283. pygeai/lab/__init__.py +0 -0
  284. pygeai/lab/agents/__init__.py +0 -0
  285. pygeai/lab/agents/clients.py +426 -0
  286. pygeai/lab/agents/endpoints.py +12 -0
  287. pygeai/lab/agents/mappers.py +319 -0
  288. pygeai/lab/clients.py +24 -0
  289. pygeai/lab/constants.py +3 -0
  290. pygeai/lab/managers.py +1558 -0
  291. pygeai/lab/models.py +1719 -0
  292. pygeai/lab/processes/__init__.py +0 -0
  293. pygeai/lab/processes/clients.py +1051 -0
  294. pygeai/lab/processes/endpoints.py +26 -0
  295. pygeai/lab/processes/mappers.py +395 -0
  296. pygeai/lab/runners.py +90 -0
  297. pygeai/lab/spec/__init__.py +0 -0
  298. pygeai/lab/spec/loader.py +24 -0
  299. pygeai/lab/spec/parsers.py +39 -0
  300. pygeai/lab/strategies/__init__.py +0 -0
  301. pygeai/lab/strategies/clients.py +212 -0
  302. pygeai/lab/strategies/endpoints.py +5 -0
  303. pygeai/lab/strategies/mappers.py +58 -0
  304. pygeai/lab/tools/__init__.py +0 -0
  305. pygeai/lab/tools/clients.py +465 -0
  306. pygeai/lab/tools/endpoints.py +13 -0
  307. pygeai/lab/tools/mappers.py +131 -0
  308. pygeai/man/__init__.py +1 -0
  309. pygeai/man/man1/__init__.py +1 -0
  310. pygeai/man/man1/geai-proxy.1 +246 -0
  311. pygeai/man/man1/geai.1 +2615 -0
  312. pygeai/migration/__init__.py +33 -0
  313. pygeai/migration/strategies.py +603 -0
  314. pygeai/migration/tools.py +180 -0
  315. pygeai/organization/clients.py +246 -18
  316. pygeai/organization/endpoints.py +17 -8
  317. pygeai/organization/limits/__init__.py +0 -0
  318. pygeai/organization/limits/clients.py +281 -0
  319. pygeai/organization/limits/endpoints.py +15 -0
  320. pygeai/organization/limits/managers.py +331 -0
  321. pygeai/organization/limits/mappers.py +21 -0
  322. pygeai/organization/managers.py +537 -0
  323. pygeai/organization/mappers.py +111 -46
  324. pygeai/organization/responses.py +61 -11
  325. pygeai/proxy/__init__.py +0 -0
  326. pygeai/proxy/clients.py +216 -0
  327. pygeai/proxy/config.py +128 -0
  328. pygeai/proxy/managers.py +232 -0
  329. pygeai/proxy/servers.py +304 -0
  330. pygeai/proxy/tool.py +69 -0
  331. pygeai/tests/admin/__init__.py +0 -0
  332. pygeai/tests/admin/test_clients.py +148 -0
  333. pygeai/tests/analytics/__init__.py +0 -0
  334. pygeai/tests/analytics/test_clients.py +86 -0
  335. pygeai/tests/analytics/test_managers.py +94 -0
  336. pygeai/tests/analytics/test_mappers.py +84 -0
  337. pygeai/tests/analytics/test_responses.py +73 -0
  338. pygeai/tests/assistants/rag/__init__.py +0 -0
  339. pygeai/tests/assistants/rag/test_clients.py +346 -0
  340. pygeai/tests/assistants/rag/test_mappers.py +189 -0
  341. pygeai/tests/assistants/rag/test_models.py +292 -0
  342. pygeai/tests/assistants/test_clients.py +176 -80
  343. pygeai/tests/assistants/test_managers.py +198 -0
  344. pygeai/tests/assistants/test_mappers.py +111 -0
  345. pygeai/tests/auth/__init__.py +0 -0
  346. pygeai/tests/auth/test_clients.py +289 -0
  347. pygeai/tests/auth/test_oauth.py +172 -0
  348. pygeai/tests/auth/test_session_logging.py +150 -0
  349. pygeai/tests/chat/__init__.py +0 -0
  350. pygeai/tests/chat/test_clients.py +393 -0
  351. pygeai/tests/chat/test_iris.py +38 -0
  352. pygeai/tests/chat/test_session.py +62 -0
  353. pygeai/tests/chat/test_ui.py +224 -0
  354. pygeai/tests/cli/__init__.py +0 -0
  355. pygeai/tests/cli/commands/__init__.py +0 -0
  356. pygeai/tests/cli/commands/lab/__init__.py +0 -0
  357. pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
  358. pygeai/tests/cli/commands/lab/test_common.py +208 -0
  359. pygeai/tests/cli/commands/lab/test_spec.py +246 -0
  360. pygeai/tests/cli/commands/test_assistant.py +202 -0
  361. pygeai/tests/cli/commands/test_chat.py +130 -0
  362. pygeai/tests/cli/commands/test_common.py +350 -0
  363. pygeai/tests/cli/commands/test_embeddings.py +132 -0
  364. pygeai/tests/cli/commands/test_evaluation.py +656 -0
  365. pygeai/tests/cli/commands/test_feedback.py +65 -0
  366. pygeai/tests/cli/commands/test_files.py +161 -0
  367. pygeai/tests/cli/commands/test_gam.py +201 -0
  368. pygeai/tests/cli/commands/test_llm.py +114 -0
  369. pygeai/tests/cli/commands/test_migrate.py +176 -0
  370. pygeai/tests/cli/commands/test_organization.py +276 -0
  371. pygeai/tests/cli/commands/test_rag.py +266 -0
  372. pygeai/tests/cli/commands/test_rerank.py +110 -0
  373. pygeai/tests/cli/commands/test_secrets.py +171 -0
  374. pygeai/tests/cli/commands/test_show_help.py +41 -0
  375. pygeai/tests/cli/commands/test_usage_limits.py +412 -0
  376. pygeai/tests/cli/commands/test_validators.py +160 -0
  377. pygeai/tests/cli/commands/test_version.py +81 -0
  378. pygeai/tests/cli/docker/__init__.py +0 -0
  379. pygeai/tests/cli/test_credentials_flag.py +316 -0
  380. pygeai/tests/cli/test_error_handler.py +225 -0
  381. pygeai/tests/cli/test_geai_driver.py +154 -0
  382. pygeai/tests/cli/test_parsers.py +154 -0
  383. pygeai/tests/core/base/__init__.py +0 -0
  384. pygeai/tests/core/base/data/__init__.py +0 -0
  385. pygeai/tests/core/base/data/mappers.py +117 -0
  386. pygeai/tests/core/base/data/models.py +312 -0
  387. pygeai/tests/core/base/test_mappers.py +569 -0
  388. pygeai/tests/core/base/test_models.py +261 -0
  389. pygeai/tests/core/base/test_responses.py +53 -0
  390. pygeai/tests/core/common/__init__.py +0 -0
  391. pygeai/tests/core/common/data/__init__.py +0 -0
  392. pygeai/tests/core/common/test_config.py +186 -0
  393. pygeai/tests/core/common/test_decorators.py +69 -0
  394. pygeai/tests/core/embeddings/__init__.py +0 -0
  395. pygeai/tests/core/embeddings/test_clients.py +225 -0
  396. pygeai/tests/core/embeddings/test_managers.py +171 -0
  397. pygeai/tests/core/embeddings/test_mappers.py +142 -0
  398. pygeai/tests/core/feedback/__init__.py +0 -0
  399. pygeai/tests/core/feedback/test_clients.py +64 -0
  400. pygeai/tests/core/files/__init__.py +0 -0
  401. pygeai/tests/core/files/test_clients.py +128 -0
  402. pygeai/tests/core/files/test_managers.py +219 -0
  403. pygeai/tests/core/files/test_mappers.py +137 -0
  404. pygeai/tests/core/files/test_models.py +103 -0
  405. pygeai/tests/core/files/test_responses.py +122 -0
  406. pygeai/tests/core/llm/__init__.py +0 -0
  407. pygeai/tests/core/llm/test_clients.py +142 -0
  408. pygeai/tests/core/plugins/__init__.py +0 -0
  409. pygeai/tests/core/plugins/test_clients.py +66 -0
  410. pygeai/tests/core/rerank/__init__.py +0 -0
  411. pygeai/tests/core/rerank/test_clients.py +76 -0
  412. pygeai/tests/core/rerank/test_managers.py +99 -0
  413. pygeai/tests/core/rerank/test_mappers.py +54 -0
  414. pygeai/tests/core/secrets/__init__.py +0 -0
  415. pygeai/tests/core/secrets/test_clients.py +264 -0
  416. pygeai/tests/core/services/__init__.py +0 -0
  417. pygeai/tests/core/services/test_rest.py +273 -0
  418. pygeai/tests/core/test_handlers.py +66 -0
  419. pygeai/tests/core/utils/__init__.py +0 -0
  420. pygeai/tests/core/utils/test_console.py +80 -0
  421. pygeai/tests/dbg/__init__.py +0 -0
  422. pygeai/tests/dbg/test_debugger.py +591 -0
  423. pygeai/tests/evaluation/__init__.py +0 -0
  424. pygeai/tests/evaluation/dataset/__init__.py +0 -0
  425. pygeai/tests/evaluation/dataset/test_clients.py +265 -0
  426. pygeai/tests/evaluation/plan/__init__.py +0 -0
  427. pygeai/tests/evaluation/plan/test_clients.py +195 -0
  428. pygeai/tests/evaluation/result/__init__.py +0 -0
  429. pygeai/tests/evaluation/result/test_clients.py +66 -0
  430. pygeai/tests/gam/__init__.py +0 -0
  431. pygeai/tests/gam/test_clients.py +195 -0
  432. pygeai/tests/health/__init__.py +0 -0
  433. pygeai/tests/health/test_clients.py +41 -0
  434. pygeai/tests/integration/__init__.py +0 -0
  435. pygeai/tests/integration/assistants/__init__.py +0 -0
  436. pygeai/tests/integration/assistants/rag/__init__.py +0 -0
  437. pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
  438. pygeai/tests/integration/chat/__init__.py +0 -0
  439. pygeai/tests/integration/chat/test_generate_image.py +158 -0
  440. pygeai/tests/integration/lab/__init__.py +0 -0
  441. pygeai/tests/integration/lab/agents/__init__.py +0 -0
  442. pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
  443. pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
  444. pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
  445. pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
  446. pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
  447. pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
  448. pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
  449. pygeai/tests/integration/lab/processes/__init__.py +0 -0
  450. pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
  451. pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
  452. pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
  453. pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
  454. pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
  455. pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
  456. pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
  457. pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
  458. pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
  459. pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
  460. pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
  461. pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
  462. pygeai/tests/integration/lab/tools/__init__.py +0 -0
  463. pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
  464. pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
  465. pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
  466. pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
  467. pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
  468. pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
  469. pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
  470. pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
  471. pygeai/tests/lab/__init__.py +0 -0
  472. pygeai/tests/lab/agents/__init__.py +0 -0
  473. pygeai/tests/lab/agents/test_clients.py +481 -0
  474. pygeai/tests/lab/agents/test_mappers.py +440 -0
  475. pygeai/tests/lab/processes/__init__.py +0 -0
  476. pygeai/tests/lab/processes/test_clients.py +1416 -0
  477. pygeai/tests/lab/processes/test_mappers.py +1092 -0
  478. pygeai/tests/lab/spec/__init__.py +0 -0
  479. pygeai/tests/lab/spec/test_loader.py +59 -0
  480. pygeai/tests/lab/spec/test_parsers.py +182 -0
  481. pygeai/tests/lab/strategies/__init__.py +0 -0
  482. pygeai/tests/lab/strategies/test_clients.py +241 -0
  483. pygeai/tests/lab/strategies/test_mappers.py +132 -0
  484. pygeai/tests/lab/test_managers.py +553 -0
  485. pygeai/tests/lab/test_mappers.py +245 -0
  486. pygeai/tests/lab/test_models.py +1154 -0
  487. pygeai/tests/lab/tools/__init__.py +0 -0
  488. pygeai/tests/lab/tools/test_clients.py +521 -0
  489. pygeai/tests/lab/tools/test_mappers.py +198 -0
  490. pygeai/tests/migration/__init__.py +0 -0
  491. pygeai/tests/migration/test_strategies.py +405 -0
  492. pygeai/tests/migration/test_tools.py +159 -0
  493. pygeai/tests/organization/limits/__init__.py +0 -0
  494. pygeai/tests/organization/limits/test_clients.py +567 -0
  495. pygeai/tests/organization/limits/test_managers.py +402 -0
  496. pygeai/tests/organization/test_clients.py +615 -64
  497. pygeai/tests/organization/test_managers.py +424 -0
  498. pygeai/tests/organization/test_mappers.py +153 -0
  499. pygeai/tests/organization/test_responses.py +137 -0
  500. pygeai/tests/proxy/__init__.py +1 -0
  501. pygeai/tests/proxy/test_clients.py +397 -0
  502. pygeai/tests/proxy/test_config.py +171 -0
  503. pygeai/tests/proxy/test_integration.py +305 -0
  504. pygeai/tests/proxy/test_managers.py +312 -0
  505. pygeai/tests/proxy/test_servers.py +387 -0
  506. pygeai/tests/proxy/test_tool.py +176 -0
  507. pygeai/tests/snippets/__init__.py +0 -0
  508. pygeai/tests/snippets/analytics/__init__.py +0 -0
  509. pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
  510. pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
  511. pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
  512. pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
  513. pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
  514. pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
  515. pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
  516. pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
  517. pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
  518. pygeai/tests/snippets/assistants/__init__.py +0 -0
  519. pygeai/tests/snippets/assistants/create_chat_assistant.py +54 -0
  520. pygeai/tests/snippets/assistants/create_text_assistant.py +51 -0
  521. pygeai/tests/snippets/assistants/data_analyst/__init__.py +0 -0
  522. pygeai/tests/snippets/assistants/data_analyst/extend_and_check.py +100 -0
  523. pygeai/tests/snippets/assistants/data_analyst/extend_dataset.py +9 -0
  524. pygeai/tests/snippets/assistants/data_analyst/get_status.py +9 -0
  525. pygeai/tests/snippets/assistants/file_summarizer_assistant.py +149 -0
  526. pygeai/tests/snippets/assistants/get_assistant_data.py +8 -0
  527. pygeai/tests/snippets/assistants/get_assistant_list.py +7 -0
  528. pygeai/tests/snippets/assistants/rag/__init__.py +0 -0
  529. pygeai/tests/snippets/assistants/rag/create_rag_assistant.py +65 -0
  530. pygeai/tests/snippets/assistants/rag/delete_al_documents.py +7 -0
  531. pygeai/tests/snippets/assistants/rag/delete_document.py +10 -0
  532. pygeai/tests/snippets/assistants/rag/delete_rag_assistant.py +8 -0
  533. pygeai/tests/snippets/assistants/rag/get_document.py +10 -0
  534. pygeai/tests/snippets/assistants/rag/get_documents.py +7 -0
  535. pygeai/tests/snippets/assistants/rag/get_rag_assistant_data.py +8 -0
  536. pygeai/tests/snippets/assistants/rag/update_rag_assistant.py +48 -0
  537. pygeai/tests/snippets/assistants/rag/upload_document.py +19 -0
  538. pygeai/tests/snippets/assistants/send_feedback.py +14 -0
  539. pygeai/tests/snippets/assistants/update_chat_assistant.py +63 -0
  540. pygeai/tests/snippets/auth/__init__.py +0 -0
  541. pygeai/tests/snippets/chat/__init__.py +0 -0
  542. pygeai/tests/snippets/chat/cancel_request.py +7 -0
  543. pygeai/tests/snippets/chat/chat_completion.py +28 -0
  544. pygeai/tests/snippets/chat/chat_completion_1.py +40 -0
  545. pygeai/tests/snippets/chat/chat_completion_2.py +60 -0
  546. pygeai/tests/snippets/chat/chat_completion_3.py +27 -0
  547. pygeai/tests/snippets/chat/chat_completion_4.py +67 -0
  548. pygeai/tests/snippets/chat/chat_completion_streaming.py +63 -0
  549. pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
  550. pygeai/tests/snippets/chat/get_request_status.py +7 -0
  551. pygeai/tests/snippets/chat/get_response.py +15 -0
  552. pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
  553. pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
  554. pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
  555. pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
  556. pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
  557. pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
  558. pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
  559. pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
  560. pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
  561. pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
  562. pygeai/tests/snippets/chat/send_chat_request.py +33 -0
  563. pygeai/tests/snippets/dbg/__init__.py +0 -0
  564. pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
  565. pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
  566. pygeai/tests/snippets/dbg/file_debugging.py +72 -0
  567. pygeai/tests/snippets/dbg/module_debugging.py +61 -0
  568. pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
  569. pygeai/tests/snippets/dbg/stepping_example.py +40 -0
  570. pygeai/tests/snippets/embeddings/__init__.py +0 -0
  571. pygeai/tests/snippets/embeddings/cache_example.py +31 -0
  572. pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
  573. pygeai/tests/snippets/embeddings/generate_embeddings.py +26 -0
  574. pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
  575. pygeai/tests/snippets/embeddings/openai_example.py +30 -0
  576. pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
  577. pygeai/tests/snippets/evaluation/__init__.py +0 -0
  578. pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
  579. pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
  580. pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
  581. pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
  582. pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
  583. pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
  584. pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
  585. pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
  586. pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
  587. pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
  588. pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
  589. pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
  590. pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
  591. pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
  592. pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
  593. pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
  594. pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
  595. pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
  596. pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
  597. pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
  598. pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
  599. pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
  600. pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
  601. pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
  602. pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
  603. pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
  604. pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
  605. pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
  606. pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
  607. pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
  608. pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
  609. pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
  610. pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
  611. pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
  612. pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
  613. pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
  614. pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
  615. pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
  616. pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
  617. pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
  618. pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
  619. pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
  620. pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
  621. pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
  622. pygeai/tests/snippets/files/__init__.py +0 -0
  623. pygeai/tests/snippets/files/delete_file.py +9 -0
  624. pygeai/tests/snippets/files/get_file_content.py +10 -0
  625. pygeai/tests/snippets/files/get_file_data.py +9 -0
  626. pygeai/tests/snippets/files/get_file_list.py +6 -0
  627. pygeai/tests/snippets/files/upload_file.py +13 -0
  628. pygeai/tests/snippets/gam/__init__.py +0 -0
  629. pygeai/tests/snippets/gam/gam_access_token.py +87 -0
  630. pygeai/tests/snippets/lab/__init__.py +0 -0
  631. pygeai/tests/snippets/lab/agentic_flow_example_1.py +326 -0
  632. pygeai/tests/snippets/lab/agentic_flow_example_2.py +206 -0
  633. pygeai/tests/snippets/lab/agentic_flow_example_3.py +486 -0
  634. pygeai/tests/snippets/lab/agentic_flow_example_4.py +446 -0
  635. pygeai/tests/snippets/lab/agents/__init__.py +0 -0
  636. pygeai/tests/snippets/lab/agents/create_agent.py +48 -0
  637. pygeai/tests/snippets/lab/agents/create_agent_2.py +48 -0
  638. pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
  639. pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
  640. pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
  641. pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
  642. pygeai/tests/snippets/lab/agents/delete_agent.py +12 -0
  643. pygeai/tests/snippets/lab/agents/get_agent.py +24 -0
  644. pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
  645. pygeai/tests/snippets/lab/agents/get_sharing_link.py +13 -0
  646. pygeai/tests/snippets/lab/agents/list_agents.py +18 -0
  647. pygeai/tests/snippets/lab/agents/publish_agent_revision.py +12 -0
  648. pygeai/tests/snippets/lab/agents/update_agent.py +50 -0
  649. pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
  650. pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
  651. pygeai/tests/snippets/lab/crud_ui.py +462 -0
  652. pygeai/tests/snippets/lab/processes/__init__.py +0 -0
  653. pygeai/tests/snippets/lab/processes/create_process.py +24 -0
  654. pygeai/tests/snippets/lab/processes/create_task.py +8 -0
  655. pygeai/tests/snippets/lab/processes/jobs/__init__.py +0 -0
  656. pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +21 -0
  657. pygeai/tests/snippets/lab/processes/kbs/__init__.py +0 -0
  658. pygeai/tests/snippets/lab/processes/kbs/create_kb.py +18 -0
  659. pygeai/tests/snippets/lab/processes/kbs/get_kb.py +26 -0
  660. pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +30 -0
  661. pygeai/tests/snippets/lab/processes/kbs/try_all.py +73 -0
  662. pygeai/tests/snippets/lab/processes/list_processes.py +10 -0
  663. pygeai/tests/snippets/lab/runner_1.py +212 -0
  664. pygeai/tests/snippets/lab/samples/__init__.py +0 -0
  665. pygeai/tests/snippets/lab/samples/summarize_files.py +162 -0
  666. pygeai/tests/snippets/lab/strategies/__init__.py +0 -0
  667. pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +22 -0
  668. pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +10 -0
  669. pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +16 -0
  670. pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +26 -0
  671. pygeai/tests/snippets/lab/tools/__init__.py +0 -0
  672. pygeai/tests/snippets/lab/tools/create_tool.py +48 -0
  673. pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
  674. pygeai/tests/snippets/lab/tools/delete_tool.py +21 -0
  675. pygeai/tests/snippets/lab/tools/get_parameter.py +21 -0
  676. pygeai/tests/snippets/lab/tools/get_tool.py +22 -0
  677. pygeai/tests/snippets/lab/tools/list_tools.py +23 -0
  678. pygeai/tests/snippets/lab/tools/publish_tool_revision.py +13 -0
  679. pygeai/tests/snippets/lab/tools/set_parameters.py +33 -0
  680. pygeai/tests/snippets/lab/tools/update_tool.py +52 -0
  681. pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
  682. pygeai/tests/snippets/lab/use_cases/c_code_fixer_agent_flow.py +238 -0
  683. pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
  684. pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
  685. pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
  686. pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
  687. pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
  688. pygeai/tests/snippets/lab/use_cases/file_summarizer_example.py +157 -0
  689. pygeai/tests/snippets/lab/use_cases/file_summarizer_example_2.py +157 -0
  690. pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
  691. pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
  692. pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
  693. pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
  694. pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
  695. pygeai/tests/snippets/migrate/__init__.py +45 -0
  696. pygeai/tests/snippets/migrate/agent_migration.py +110 -0
  697. pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
  698. pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
  699. pygeai/tests/snippets/migrate/process_migration.py +64 -0
  700. pygeai/tests/snippets/migrate/project_migration.py +42 -0
  701. pygeai/tests/snippets/migrate/tool_migration.py +64 -0
  702. pygeai/tests/snippets/organization/__init__.py +0 -0
  703. pygeai/tests/snippets/organization/add_project_member.py +10 -0
  704. pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
  705. pygeai/tests/snippets/organization/create_project.py +23 -0
  706. pygeai/tests/snippets/organization/delete_project.py +7 -0
  707. pygeai/tests/snippets/organization/export_request_data.py +7 -0
  708. pygeai/tests/snippets/organization/get_memberships.py +12 -0
  709. pygeai/tests/snippets/organization/get_organization_members.py +6 -0
  710. pygeai/tests/snippets/organization/get_project_data.py +7 -0
  711. pygeai/tests/snippets/organization/get_project_list.py +8 -0
  712. pygeai/tests/snippets/organization/get_project_members.py +6 -0
  713. pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
  714. pygeai/tests/snippets/organization/get_project_roles.py +6 -0
  715. pygeai/tests/snippets/organization/get_project_tokens.py +7 -0
  716. pygeai/tests/snippets/organization/update_project.py +14 -0
  717. pygeai/tests/snippets/rerank/__init__.py +0 -0
  718. pygeai/tests/snippets/rerank/rerank_chunks.py +19 -0
  719. pygeai/tests/snippets/secrets/__init__.py +0 -0
  720. pygeai/tests/snippets/usage_limit/__init__.py +0 -0
  721. pygeai/tests/snippets/usage_limit/delete_usage_limit.py +16 -0
  722. pygeai/tests/snippets/usage_limit/get_all_usage_limit_from_organization.py +12 -0
  723. pygeai/tests/snippets/usage_limit/get_usage_limit_from_organization.py +11 -0
  724. pygeai/tests/snippets/usage_limit/get_usage_limit_from_project.py +13 -0
  725. pygeai/tests/snippets/usage_limit/set_usage_limit_organization.py +22 -0
  726. pygeai/tests/snippets/usage_limit/set_usage_limit_project.py +23 -0
  727. pygeai/tests/snippets/usage_limit/update_usage_limit_organization.py +23 -0
  728. pygeai/tests/snippets/usage_limit/update_usage_limit_project.py +24 -0
  729. pygeai/vendor/a2a/__init__.py +1 -0
  730. pygeai/vendor/a2a/auth/__init__.py +0 -0
  731. pygeai/vendor/a2a/auth/user.py +31 -0
  732. pygeai/vendor/a2a/client/__init__.py +19 -0
  733. pygeai/vendor/a2a/client/client.py +425 -0
  734. pygeai/vendor/a2a/client/errors.py +33 -0
  735. pygeai/vendor/a2a/client/helpers.py +22 -0
  736. pygeai/vendor/a2a/py.typed +0 -0
  737. pygeai/vendor/a2a/server/__init__.py +1 -0
  738. pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
  739. pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
  740. pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
  741. pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
  742. pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
  743. pygeai/vendor/a2a/server/apps/__init__.py +16 -0
  744. pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
  745. pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
  746. pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
  747. pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
  748. pygeai/vendor/a2a/server/context.py +23 -0
  749. pygeai/vendor/a2a/server/events/__init__.py +21 -0
  750. pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
  751. pygeai/vendor/a2a/server/events/event_queue.py +156 -0
  752. pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
  753. pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
  754. pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
  755. pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
  756. pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
  757. pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
  758. pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
  759. pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
  760. pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
  761. pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
  762. pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
  763. pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
  764. pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
  765. pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
  766. pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
  767. pygeai/vendor/a2a/types.py +1624 -0
  768. pygeai/vendor/a2a/utils/__init__.py +40 -0
  769. pygeai/vendor/a2a/utils/artifact.py +72 -0
  770. pygeai/vendor/a2a/utils/errors.py +69 -0
  771. pygeai/vendor/a2a/utils/helpers.py +176 -0
  772. pygeai/vendor/a2a/utils/message.py +83 -0
  773. pygeai/vendor/a2a/utils/task.py +57 -0
  774. pygeai/vendor/a2a/utils/telemetry.py +299 -0
  775. pygeai-0.6.0b15.dist-info/METADATA +205 -0
  776. pygeai-0.6.0b15.dist-info/RECORD +799 -0
  777. {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
  778. pygeai-0.6.0b15.dist-info/entry_points.txt +5 -0
  779. {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info/licenses}/LICENSE +13 -1
  780. {pygeai-0.1.6.dist-info → pygeai-0.6.0b15.dist-info}/top_level.txt +0 -1
  781. docs/source/conf.py +0 -45
  782. pygeai/core/clients.py +0 -240
  783. pygeai/tests/core/test_clients.py +0 -49
  784. pygeai-0.1.6.dist-info/METADATA +0 -92
  785. pygeai-0.1.6.dist-info/RECORD +0 -65
  786. pygeai-0.1.6.dist-info/SOURCES.sync-conflict-20241223-145950-3QD4F42.txt +0 -41
  787. pygeai-0.1.6.dist-info/entry_points.txt +0 -2
  788. /pygeai/{agent → analytics}/__init__.py +0 -0
@@ -1,20 +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
11
+ from pygeai.chat.iris import Iris
12
+ from pygeai.chat.session import AgentChatSession
5
13
  from pygeai.cli.commands import Command, Option, ArgumentsEnum
6
14
  from pygeai.cli.commands.builders import build_help_text
7
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
8
17
  from pygeai.cli.texts.help import CHAT_HELP_TEXT
9
- from pygeai.core.common.exceptions import MissingRequirementException, WrongArgumentError
18
+ from pygeai.core.common.exceptions import MissingRequirementException, WrongArgumentError, InvalidAgentException
19
+ from prompt_toolkit import PromptSession
20
+ from prompt_toolkit.history import InMemoryHistory
10
21
 
22
+ from pygeai.core.utils.console import Console
23
+ from pygeai.lab.agents.clients import AgentClient
11
24
 
12
- def show_assistant_help():
25
+
26
+ def show_help():
13
27
  """
14
28
  Displays help text in stdout
15
29
  """
16
30
  help_text = build_help_text(chat_commands, CHAT_HELP_TEXT)
17
- sys.stdout.write(help_text)
31
+ Console.write_stdout(help_text)
18
32
 
19
33
 
20
34
  def get_chat_completion(option_list: list):
@@ -26,6 +40,20 @@ def get_chat_completion(option_list: list):
26
40
  thread_id = None
27
41
  frequency_penalty = None
28
42
  presence_penalty = None
43
+ top_p = None
44
+ stop = None
45
+ response_format = None
46
+ tools = None
47
+ tool_choice = None
48
+ logprobs = None
49
+ top_logprobs = None
50
+ seed = None
51
+ stream_options = None
52
+ store = None
53
+ metadata = None
54
+ user = None
55
+ reasoning_effort = None
56
+
29
57
  for option_flag, option_arg in option_list:
30
58
  if option_flag.name == "model":
31
59
  model = option_arg
@@ -44,9 +72,9 @@ def get_chat_completion(option_list: list):
44
72
  if option_arg:
45
73
  stream = get_boolean_value(option_arg)
46
74
  if option_flag.name == "temperature":
47
- temperature = option_arg
75
+ temperature = float(option_arg) if option_arg is not None else None
48
76
  if option_flag.name == "max_tokens":
49
- max_tokens = option_arg
77
+ max_tokens = int(option_arg) if option_arg is not None else None
50
78
  if option_flag.name == "thread_id":
51
79
  thread_id = option_arg
52
80
  if option_flag.name == "frequency_penalty":
@@ -55,6 +83,50 @@ def get_chat_completion(option_list: list):
55
83
  if option_flag.name == "presence_penalty":
56
84
  if option_arg:
57
85
  presence_penalty = get_penalty_float_value(option_arg)
86
+ if option_flag.name == "top_p":
87
+ top_p = float(option_arg) if option_arg else None
88
+ if option_flag.name == "stop":
89
+ try:
90
+ stop = json.loads(option_arg) if option_arg else None
91
+ except json.JSONDecodeError:
92
+ stop = option_arg
93
+ if option_flag.name == "response_format":
94
+ try:
95
+ response_format = json.loads(option_arg) if option_arg else None
96
+ except json.JSONDecodeError:
97
+ raise WrongArgumentError("response_format must be a valid JSON object")
98
+ if option_flag.name == "tools":
99
+ try:
100
+ tools = json.loads(option_arg) if option_arg else None
101
+ except json.JSONDecodeError:
102
+ raise WrongArgumentError("tools must be a valid JSON array")
103
+ if option_flag.name == "tool_choice":
104
+ try:
105
+ tool_choice = json.loads(option_arg) if option_arg else None
106
+ except json.JSONDecodeError:
107
+ tool_choice = option_arg
108
+ if option_flag.name == "logprobs":
109
+ logprobs = get_boolean_value(option_arg) if option_arg else None
110
+ if option_flag.name == "top_logprobs":
111
+ top_logprobs = int(option_arg) if option_arg else None
112
+ if option_flag.name == "seed":
113
+ seed = int(option_arg) if option_arg else None
114
+ if option_flag.name == "stream_options":
115
+ try:
116
+ stream_options = json.loads(option_arg) if option_arg else None
117
+ except json.JSONDecodeError:
118
+ raise WrongArgumentError("stream_options must be a valid JSON object")
119
+ if option_flag.name == "store":
120
+ store = get_boolean_value(option_arg) if option_arg else None
121
+ if option_flag.name == "metadata":
122
+ try:
123
+ metadata = json.loads(option_arg) if option_arg else None
124
+ except json.JSONDecodeError:
125
+ raise WrongArgumentError("metadata must be a valid JSON object")
126
+ if option_flag.name == "user":
127
+ user = option_arg
128
+ if option_flag.name == "reasoning_effort":
129
+ reasoning_effort = option_arg
58
130
 
59
131
  messages = get_messages(message_list)
60
132
 
@@ -70,16 +142,36 @@ def get_chat_completion(option_list: list):
70
142
  max_tokens=max_tokens,
71
143
  thread_id=thread_id,
72
144
  frequency_penalty=frequency_penalty,
73
- presence_penalty=presence_penalty
145
+ presence_penalty=presence_penalty,
146
+ top_p=top_p,
147
+ stop=stop,
148
+ response_format=response_format,
149
+ tools=tools,
150
+ tool_choice=tool_choice,
151
+ logprobs=logprobs,
152
+ top_logprobs=top_logprobs,
153
+ seed=seed,
154
+ stream_options=stream_options,
155
+ store=store,
156
+ metadata=metadata,
157
+ user=user,
158
+ reasoning_effort=reasoning_effort
74
159
  )
75
- sys.stdout.write(f"Chat completion detail: \n{result}\n")
160
+ if stream:
161
+ Console.write_stdout("Streaming chat completion:")
162
+ for chunk in result:
163
+ Console.write_stdout(f"{chunk}", end="")
164
+ sys.stdout.flush()
165
+ Console.write_stdout()
166
+ else:
167
+ Console.write_stdout(f"Chat completion detail: \n{result}\n")
76
168
 
77
169
 
78
170
  chat_completion_options = [
79
171
  Option(
80
172
  "model",
81
173
  ["--model", "-m"],
82
- "The model needs to address the assistant type and name or bot_id, depending on the Type. Then, the parameters"
174
+ "The model needs to address the assistant type and name or bot_id, depending on the Type. Then, the parameters"
83
175
  " will vary depending on the type. Its format is as follows: \n"
84
176
  "\t\"model\": \"saia:<assistant_type>:<assistant_name>|<bot_id>\"",
85
177
  True
@@ -104,45 +196,768 @@ chat_completion_options = [
104
196
  Option(
105
197
  "temperature",
106
198
  ["--temperature", "--temp"],
107
- "integer value to set volatility of the assistant's answers",
199
+ "Float value to set volatility of the assistant's answers (between 0 and 2)",
108
200
  True
109
201
  ),
110
202
  Option(
111
203
  "max_tokens",
112
204
  ["--max-tokens"],
113
- "integer value to set max tokens to use",
205
+ "Integer value to set max tokens to use",
114
206
  True
115
207
  ),
116
208
  Option(
117
209
  "thread_id",
118
210
  ["--thread-id"],
119
- "optional uuid for conversation identifier",
211
+ "Optional UUID for conversation identifier",
120
212
  True
121
213
  ),
122
214
  Option(
123
215
  "frequency_penalty",
124
216
  ["--frequency-penalty"],
125
- "optional number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency "
217
+ "Optional number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency "
126
218
  "in the text so far, decreasing the model's likelihood to repeat the same line verbatim.",
127
219
  True
128
220
  ),
129
221
  Option(
130
222
  "presence_penalty",
131
223
  ["--presence-penalty"],
132
- "optional number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in "
224
+ "Optional number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in "
133
225
  "the text so far, increasing the model's likelihood to talk about new topics.",
134
226
  True
135
227
  ),
228
+ Option(
229
+ "top_p",
230
+ ["--top-p"],
231
+ "Optional float value for nucleus sampling, where the model considers tokens with top_p probability mass "
232
+ "(between 0 and 1). An alternative to temperature.",
233
+ True
234
+ ),
235
+ Option(
236
+ "stop",
237
+ ["--stop"],
238
+ "Optional string or JSON array of up to 4 sequences where the API will stop generating further tokens.",
239
+ True
240
+ ),
241
+ Option(
242
+ "response_format",
243
+ ["--response-format"],
244
+ "Optional JSON object specifying the output format, e.g., {\"type\": \"json_schema\", \"json_schema\": {...}} "
245
+ "for structured outputs.",
246
+ True
247
+ ),
248
+ Option(
249
+ "tools",
250
+ ["--tools"],
251
+ "Optional JSON array of tools (e.g., functions) the model may call.",
252
+ True
253
+ ),
254
+ Option(
255
+ "tool_choice",
256
+ ["--tool-choice"],
257
+ "Optional string (e.g., \"none\", \"auto\") or JSON object to control which tool is called.",
258
+ True
259
+ ),
260
+ Option(
261
+ "logprobs",
262
+ ["--logprobs"],
263
+ "Optional boolean to return log probabilities of output tokens. Possible values: 0: OFF; 1: ON",
264
+ True
265
+ ),
266
+ Option(
267
+ "top_logprobs",
268
+ ["--top-logprobs"],
269
+ "Optional integer (0-20) specifying the number of most likely tokens to return with log probabilities.",
270
+ True
271
+ ),
272
+ Option(
273
+ "seed",
274
+ ["--seed"],
275
+ "Optional integer for deterministic sampling (in Beta).",
276
+ True
277
+ ),
278
+ Option(
279
+ "stream_options",
280
+ ["--stream-options"],
281
+ "Optional JSON object for streaming options, e.g., {\"include_usage\": true}.",
282
+ True
283
+ ),
284
+ Option(
285
+ "store",
286
+ ["--store"],
287
+ "Optional boolean to store the output for model distillation or evals. Possible values: 0: OFF; 1: ON",
288
+ True
289
+ ),
290
+ Option(
291
+ "metadata",
292
+ ["--metadata"],
293
+ "Optional JSON object with up to 16 key-value pairs to attach to the object.",
294
+ True
295
+ ),
296
+ Option(
297
+ "user",
298
+ ["--user"],
299
+ "Optional string identifier for the end-user to monitor abuse.",
300
+ True
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
+ ),
310
+ ]
311
+
312
+
313
+ def chat_with_iris():
314
+ iris = Iris()
315
+ messages = list()
316
+
317
+ history = InMemoryHistory()
318
+ session = PromptSession(">> Ask Iris: ", history=history)
319
+
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.""")
326
+ try:
327
+ while (user_input := session.prompt()) != "exit":
328
+ Console.write_stdout(f"- User: {user_input}")
329
+ new_message = {
330
+ "role": "user",
331
+ "content": user_input
332
+ }
333
+ messages.append(new_message)
334
+
335
+ result = iris.stream_answer(messages)
336
+ answer = ""
337
+ Console.write_stdout("- Iris: ")
338
+ for chunk in result:
339
+ answer += chunk
340
+ Console.write_stdout(f"{chunk}", end="")
341
+ sys.stdout.flush()
342
+ Console.write_stdout()
343
+
344
+ new_answer = {
345
+ "role": "assistant",
346
+ "content": answer
347
+ }
348
+ messages.append(new_answer)
349
+ except KeyboardInterrupt:
350
+ print("\nExiting chat...")
351
+ sys.exit(0)
352
+
353
+ except Exception as e:
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
136
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}")
708
+
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
+ ),
137
747
  ]
138
748
 
139
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
+
140
955
  chat_commands = [
141
956
  Command(
142
957
  "help",
143
958
  ["help", "h"],
144
959
  "Display help text",
145
- show_assistant_help,
960
+ show_help,
146
961
  ArgumentsEnum.NOT_AVAILABLE,
147
962
  [],
148
963
  []
@@ -156,4 +971,50 @@ chat_commands = [
156
971
  [],
157
972
  chat_completion_options
158
973
  ),
974
+ Command(
975
+ "iris",
976
+ ["iris"],
977
+ "Interactive chat with Iris",
978
+ chat_with_iris,
979
+ ArgumentsEnum.NOT_AVAILABLE,
980
+ [],
981
+ []
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
+ ),
1019
+
159
1020
  ]