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
@@ -0,0 +1,133 @@
1
+ from pygeai.lab.managers import AILabManager
2
+
3
+ import uuid
4
+
5
+ from pygeai.lab.models import Tool
6
+
7
+ # Define the tool
8
+ tool_id = str(uuid.uuid4())
9
+
10
+ open_api_json = {
11
+ "openapi": "3.0.1",
12
+ "info": {
13
+ "title": "Headless Browser Web Scraper",
14
+ "description": "A tool for scraping web pages with JavaScript execution and headless browser emulation.",
15
+ "version": "1.0.0"
16
+ },
17
+ "paths": {
18
+ "/web_scraper/headless_browser": {
19
+ "post": {
20
+ "summary": "Scrape a web page with JavaScript execution",
21
+ "description": "This endpoint allows you to scrape web pages, including dynamically loaded content, using a headless browser.",
22
+ "operationId": "scrapeWebPage",
23
+ "requestBody": {
24
+ "required": True,
25
+ "content": {
26
+ "application/json": {
27
+ "schema": {
28
+ "type": "object",
29
+ "properties": {
30
+ "url": {
31
+ "type": "string",
32
+ "description": "The URL of the web page to scrape.",
33
+ "example": "https://example.com"
34
+ },
35
+ "waitForSelector": {
36
+ "type": "string",
37
+ "description": "A CSS selector to wait for before scraping the page.",
38
+ "example": "#content"
39
+ },
40
+ "timeout": {
41
+ "type": "integer",
42
+ "description": "Maximum time to wait for the page to load (in milliseconds).",
43
+ "example": 10000
44
+ },
45
+ "actions": {
46
+ "type": "array",
47
+ "description": "A list of actions to perform on the page.",
48
+ "items": {
49
+ "type": "object",
50
+ "properties": {
51
+ "actionType": {
52
+ "type": "string",
53
+ "description": "The type of action to perform (e.g., click, type).",
54
+ "example": "click"
55
+ },
56
+ "selector": {
57
+ "type": "string",
58
+ "description": "The CSS selector for the element to interact with.",
59
+ "example": "#submit-button"
60
+ },
61
+ "value": {
62
+ "type": "string",
63
+ "description": "The value to use for the action (e.g., text to type).",
64
+ "example": "Hello World"
65
+ }
66
+ }
67
+ }
68
+ }
69
+ },
70
+ "required": ["url"]
71
+ }
72
+ }
73
+ }
74
+ },
75
+ "responses": {
76
+ "200": {
77
+ "description": "Successfully scraped the web page.",
78
+ "content": {
79
+ "application/json": {
80
+ "schema": {
81
+ "type": "object",
82
+ "properties": {
83
+ "html": {
84
+ "type": "string",
85
+ "description": "The HTML content of the scraped page."
86
+ },
87
+ "screenshot": {
88
+ "type": "string",
89
+ "description": "A base64-encoded screenshot of the page."
90
+ },
91
+ "data": {
92
+ "type": "object",
93
+ "description": "Extracted data from the page."
94
+ }
95
+ }
96
+ }
97
+ }
98
+ }
99
+ },
100
+ "400": {
101
+ "description": "Invalid request parameters."
102
+ },
103
+ "500": {
104
+ "description": "Internal server error."
105
+ }
106
+ }
107
+ }
108
+ }
109
+ }
110
+ }
111
+
112
+ tool = Tool(
113
+ id=tool_id,
114
+ status="active",
115
+ name="HeadlessBrowserWebScrapper",
116
+ access_scope="private",
117
+ public_name="com.globant.web.scraper.headless",
118
+ description="Scrapes web pages, including dynamically loaded content, using headless browser emulation.",
119
+ scope="api",
120
+ open_api_json=open_api_json
121
+ )
122
+
123
+ # Create the tool
124
+ manager = AILabManager()
125
+ result = manager.create_tool(
126
+ project_id="2ca6883f-6778-40bb-bcc1-85451fb11107",
127
+ tool=tool
128
+ )
129
+
130
+ if isinstance(result, Tool):
131
+ print(f"Tool created successfully: {tool.to_dict()}")
132
+ else:
133
+ print("Errors:", result.errors if hasattr(result, 'errors') else "Unknown error occurred")
@@ -0,0 +1,189 @@
1
+ from pygeai.lab.managers import AILabManager
2
+ from pygeai.lab.models import Agent, AgentData, Prompt, LlmConfig, Model, Sampling, PromptExample, PromptOutput, ResourcePool, ResourcePoolTool, ResourcePoolList, ModelList
3
+ import uuid
4
+ import json
5
+
6
+ WEB_DESIGN_GUIDE = """
7
+ Web Design Analysis Documentation:
8
+ - **HTML**:
9
+ - Standards: HTML5, semantic elements (e.g., <header>, <nav>, <main>).
10
+ - Accessibility: WCAG 2.1 (e.g., alt text, ARIA roles, keyboard navigability).
11
+ - Common issues: Missing <title>, unclosed tags, excessive div nesting.
12
+ - **CSS**:
13
+ - Standards: CSS3, flexbox, grid, media queries for responsiveness.
14
+ - Best practices: Avoid !important, use relative units (rem, vw), optimize selectors.
15
+ - Common issues: High specificity, unused styles, missing fallbacks for older browsers.
16
+ - **JavaScript**:
17
+ - Standards: ES6+, async/await, DOM manipulation.
18
+ - Best practices: Minimize global variables, use event delegation, avoid inline scripts.
19
+ - Common issues: Unhandled errors, large script files, deprecated APIs (e.g., document.all).
20
+ - **Analysis Types**:
21
+ - Accessibility: Check alt attributes, ARIA labels, focusable elements (e.g., <a> with href).
22
+ - Performance: Assess image sizes (>1MB), CSS/JS minification, DOM depth (>10 levels).
23
+ - SEO: Verify meta tags (description, keywords), h1-h6 hierarchy, canonical URLs.
24
+ - Responsive Design: Check media queries, viewport meta tag, mobile-first CSS.
25
+ - Code Quality: Evaluate HTML semantics, CSS modularity (e.g., BEM), JS error handling.
26
+ - UX: Analyze navigation structure, button visibility, content spacing (>10px).
27
+ - Security: Ensure HTTPS, check secure headers (e.g., Content-Security-Policy), avoid eval() in JS.
28
+ - Cross-Browser Compatibility: Identify missing vendor prefixes, test for IE/Edge issues.
29
+ - Content: Assess font readability (e.g., >14px), content length, visual hierarchy.
30
+ - Design Trends: Compare to 2025 trends (e.g., dark mode, micro-animations, neumorphism).
31
+ - **Tools**:
32
+ - get_search_api_v1_web_search__get_get: Performs web searches to find design resources or examples.
33
+ - Input: Query string (e.g., 'modern web design trends 2025').
34
+ - Output: JSON with results (e.g., {'results': [{'url': 'string', 'title': 'string', 'snippet': 'string'}]}).
35
+ - Errors: 400 (invalid query), 429 (rate limit).
36
+ - tool_web_scrap_httpx_post: Scrapes a website’s content.
37
+ - Input: URL (required), selectors (optional, e.g., '.main-content').
38
+ - Output: JSON with html (raw HTML), css (styles), js (scripts).
39
+ - Errors: 400 (invalid URL), 403 (access denied), 429 (rate limit).
40
+ - **Metadata**:
41
+ - Search Results: {'results': [{'url': 'string', 'title': 'string', 'snippet': 'string'}]}
42
+ - Scraped Data: {'html': 'string', 'css': 'string', 'js': 'string'}
43
+ """
44
+
45
+ # Define the agent
46
+ agent_id = str(uuid.uuid4())
47
+
48
+ agent = Agent(
49
+ id=agent_id,
50
+ status="active",
51
+ name="WebDesigner",
52
+ access_scope="private",
53
+ public_name="com.globant.web.designer",
54
+ job_description="Analyzes web pages and provides web design recommendations using HTML, CSS, and JavaScript expertise",
55
+ avatar_image="https://www.shareicon.net/data/128x128/2016/06/30/788672_design_512x512.png",
56
+ description="Expert agent for web design analysis, using web search and scraping tools to provide insights on accessibility, performance, SEO, and modern design trends.",
57
+ is_draft=False,
58
+ is_readonly=False,
59
+ revision=1,
60
+ version=None,
61
+ agent_data=AgentData(
62
+ prompt=Prompt(
63
+ instructions=f"""\
64
+ You are WebDesigner, a version 1.0 assistant specializing in web design analysis, proficient in HTML, CSS, and JavaScript. Your role is to answer queries about web design, search for relevant web resources, and analyze web pages using provided tools. Use the get_search_api_v1_web_search__get_get tool for web searches and the tool_web_scrap_httpx_post tool for scraping website content. Follow these steps:
65
+
66
+ 1. **Classify Query Type**:
67
+ - **Conversation**: Answer directly using WEB_DESIGN_GUIDE if the query doesn't require data retrieval (e.g., explaining HTML semantics, CSS best practices, or supported analysis types).
68
+ - **Search**: Use get_search_api_v1_web_search__get_get when the query requires finding web resources (e.g., 'find examples of modern web design').
69
+ - **Analysis**: Use tool_web_scrap_httpx_post to scrape a website when analyzing a specific webpage (e.g., accessibility, SEO).
70
+
71
+ 2. **For Conversation Queries**:
72
+ - Provide a concise answer based on WEB_DESIGN_GUIDE.
73
+ - Use the 'style' input (formal or informal) to tailor the tone.
74
+ - If the query is unclear, ask for clarification.
75
+ - If the query is out of scope (unrelated to web design), respond with: "I'm sorry, but that question is out of scope. I can answer questions about web design, including accessibility, performance, SEO, and more."
76
+ - If asked about supported analysis types, list examples from WEB_DESIGN_GUIDE.
77
+
78
+ 3. **For Search Queries**:
79
+ - Use get_search_api_v1_web_search__get_get with the query string to find relevant websites or resources.
80
+ - Summarize the search results, highlighting URLs, titles, and snippets relevant to the query.
81
+ - Return the raw JSON response from the search tool.
82
+ - Provide a brief analysis of the results, focusing on their relevance to web design.
83
+
84
+ 4. **For Analysis Queries**:
85
+ - Use tool_web_scrap_httpx_post to fetch the website’s HTML, CSS, and JavaScript, specifying the provided URL and optional selectors.
86
+ - Analyze the scraped content based on the requested analysis type (e.g., accessibility, performance).
87
+ - Perform checks using WEB_DESIGN_GUIDE (e.g., alt attributes for accessibility, media queries for responsiveness).
88
+ - Provide detailed recommendations for improvement, referencing specific HTML elements, CSS rules, or JavaScript functions.
89
+ - Consider the current date (May 27, 2025, 12:05 PM -03) for trends (e.g., outdated design practices like skeuomorphism).
90
+ - If no content is returned (e.g., 403 error), return an empty response ({{"html": "", "css": "", "js": ""}}).
91
+ - Return the raw JSON response from the scraping tool.
92
+ - Include a detailed analysis of the scraped content, focusing on design quality, usability, and business impact (e.g., improved SEO for better traffic).
93
+ - Match the language and style of the initial response.
94
+
95
+ 5. **Supported Analysis Types**:
96
+ - Accessibility, Performance Optimization, SEO, Responsive Design, Code Quality, User Experience (UX), Security Best Practices, Cross-Browser Compatibility, Content Analysis, Design Trends.
97
+ - Refer to WEB_DESIGN_GUIDE for specific checks and recommendations.
98
+
99
+ 6. **General**:
100
+ - Base responses on WEB_DESIGN_GUIDE and the output of the search or scraping tools.
101
+ - Tailor tone based on 'style' (formal or informal).
102
+ - Handle errors (e.g., 400, 403, 429) with explanations and solutions (e.g., '403: Ensure the URL is publicly accessible').
103
+ - Return the raw JSON response from the tools for search and analysis queries.
104
+ - Use 'history' to interpret context from previous queries.
105
+ - Respond in the specified 'language'.
106
+
107
+ WEB_DESIGN_GUIDE:
108
+ {WEB_DESIGN_GUIDE}
109
+ """,
110
+ inputs=["query", "style", "history", "language"],
111
+ outputs=[
112
+ PromptOutput(
113
+ key="response",
114
+ description="Raw JSON response from the search or scraping tool, or a conversation answer in plain text."
115
+ )
116
+ ],
117
+ examples=[
118
+ PromptExample(
119
+ input_data="What is semantic HTML? [informal] [] en",
120
+ output="Semantic HTML uses tags like <header>, <nav>, and <article> to describe content meaning, making your site easier to understand for browsers and screen readers."
121
+ ),
122
+ PromptExample(
123
+ input_data="Find examples of modern web design trends [formal] [] en",
124
+ output=json.dumps({
125
+ "results": [
126
+ {"url": "https://designsite1.com", "title": "2025 Web Design Trends", "snippet": "Explore minimalism and micro-animations..."},
127
+ {"url": "https://designsite2.com", "title": "Modern UI Patterns", "snippet": "Dark mode and neumorphism in 2025..."}
128
+ ]
129
+ })
130
+ ),
131
+ PromptExample(
132
+ input_data="Analyze accessibility for https://example.com [formal] [] en",
133
+ output=json.dumps({
134
+ "html": "<html><body><img src='logo.png'><a href='#'>Link</a></body></html>",
135
+ "css": "body { font-size: 16px; }",
136
+ "js": ""
137
+ })
138
+ ),
139
+ PromptExample(
140
+ input_data="Check SEO for https://example.com [formal] [] en",
141
+ output=json.dumps({
142
+ "html": "<html><head><title>Example</title><meta name='description' content='Sample site'></head><body><h1>Welcome</h1></body></html>",
143
+ "css": "",
144
+ "js": ""
145
+ })
146
+ ),
147
+ PromptExample(
148
+ input_data="Evaluate responsive design for https://example.com [formal] [] en",
149
+ output=json.dumps({
150
+ "html": "<html><head><meta name='viewport' content='width=device-width'></head><body><div class='container'></div></body></html>",
151
+ "css": "@media (max-width: 600px) { .container { width: 100%; } }",
152
+ "js": ""
153
+ })
154
+ )
155
+ ]
156
+ ),
157
+ llm_config=LlmConfig(
158
+ max_tokens=5000,
159
+ timeout=0,
160
+ sampling=Sampling(temperature=0.7, top_k=50, top_p=1.0)
161
+ ),
162
+ models=ModelList(models=[Model(name="openai/gpt-4.1")]),
163
+ resource_pools=ResourcePoolList(
164
+ resource_pools=[
165
+ ResourcePool(
166
+ name="WebDesignTools",
167
+ tools=[
168
+ ResourcePoolTool(name="get_search_api_v1_web_search__get_get", revision=None),
169
+ ResourcePoolTool(name="tool_web_scrap_httpx_post", revision=None)
170
+ ],
171
+ agents=[]
172
+ )
173
+ ]
174
+ )
175
+ )
176
+ )
177
+
178
+ # Create the agent
179
+ manager = AILabManager()
180
+ result = manager.create_agent(
181
+ project_id="2ca6883f-6778-40bb-bcc1-85451fb11107",
182
+ agent=agent,
183
+ automatic_publish=False
184
+ )
185
+
186
+ if isinstance(result, Agent):
187
+ print(f"Agent created successfully: {agent.to_dict()}")
188
+ else:
189
+ print("Errors:", result.errors if hasattr(result, 'errors') else "Unknown error occurred")
@@ -0,0 +1,185 @@
1
+ from pygeai.lab.managers import AILabManager
2
+ from pygeai.lab.models import Agent, AgentData, Prompt, LlmConfig, Model, Sampling, PromptExample, PromptOutput, ResourcePool, ResourcePoolTool, ResourcePoolList, ModelList
3
+ import uuid
4
+ import json
5
+
6
+ WEB_READING_GUIDE = """
7
+ Web Content Reading Documentation:
8
+ - **Content Types**:
9
+ - News Articles: Typically include headlines, bylines, publication dates, and body text. Focus on key events, who/what/when/where/why.
10
+ - Blog Articles: Often have a conversational tone, with opinions or insights. Identify main arguments, supporting points, and conclusions.
11
+ - General Web Content: Includes informational pages, about pages, or product descriptions. Summarize purpose and key messages.
12
+ - **Summarization**:
13
+ - News: Limit to 2-3 sentences, capturing the main event and impact (e.g., "Company X launched a new product, aiming to compete in Y market.").
14
+ - Blogs: Summarize in 3-4 sentences, highlighting the thesis and key takeaways.
15
+ - Explanations: Provide a 1-2 sentence overview of the page’s purpose and content.
16
+ - Extract key elements: Headlines (<h1>, <h2>), body text (<p>, <article>), metadata (e.g., <meta name='description'>).
17
+ - **Question Answering**:
18
+ - Use scraped content to answer specific questions (e.g., "What’s the article’s stance on X?").
19
+ - If the answer isn’t in the content, state: "The content does not provide information on this question."
20
+ - **Credibility**:
21
+ - Check for author bylines, publication dates, and reputable domains (e.g., .edu, .gov).
22
+ - Flag potential bias (e.g., overly sensational headlines, lack of sources).
23
+ - **Tools**:
24
+ - get_search_api_v1_web_search__get_get: Performs web searches to find news, blogs, or websites.
25
+ - Input: Query string (e.g., 'recent tech news 2025').
26
+ - Output: JSON with results (e.g., {'results': [{{'url': 'string', 'title': 'string', 'snippet': 'string'}}]}).
27
+ - Errors: 400 (invalid query), 429 (rate limit).
28
+ - tool_web_scrap_httpx_post: Scrapes a website’s content.
29
+ - Input: URL (required), selectors (optional, e.g., 'article, .content').
30
+ - Output: JSON with html (raw HTML), css (styles), js (scripts).
31
+ - Errors: 400 (invalid URL), 403 (access denied), 429 (rate limit).
32
+ - **Metadata**:
33
+ - Search Results: {'results': [{'url': 'string', 'title': 'string', 'snippet': 'string'}]}
34
+ - Scraped Data: {'html': 'string', 'css': 'string', 'js': 'string'}
35
+ """
36
+
37
+ # Define the agent
38
+ agent_id = str(uuid.uuid4())
39
+
40
+ agent = Agent(
41
+ id=agent_id,
42
+ status="active",
43
+ name="WebReader",
44
+ access_scope="public",
45
+ public_name="com.globant.web.reader",
46
+ job_description="Reads and summarizes website content, including news, blogs, and general pages, and answers questions about the content",
47
+ avatar_image="https://www.shareicon.net/data/128x128/2016/06/30/788675_book_512x512.png",
48
+ description="Expert agent for reading website content, using web search and scraping tools to summarize news, blog articles, explain web content, and answer user questions.",
49
+ is_draft=False,
50
+ is_readonly=False,
51
+ revision=1,
52
+ version=None,
53
+ agent_data=AgentData(
54
+ prompt=Prompt(
55
+ instructions=f"""\
56
+ You are WebReader, a version 1.0 assistant specializing in reading and interpreting website content. Your role is to summarize news articles, blog posts, explain web content, and answer user questions about specific websites using the get_search_api_v1_web_search__get_get and tool_web_scrap_httpx_post tools. Focus on extracting and analyzing textual content from the HTML. Follow these steps:
57
+
58
+ 1. **Classify Query Type**:
59
+ - **Conversation**: Answer directly using WEB_READING_GUIDE if the query doesn't require data retrieval (e.g., explaining how to identify credible news, summarization techniques).
60
+ - **Search**: Use get_search_api_v1_web_search__get_get when the query requires finding news, blogs, or websites (e.g., 'find recent tech news').
61
+ - **Analysis**: Use tool_web_scrap_httpx_post to scrape a website when summarizing or answering questions about a specific page (e.g., summarize an article).
62
+
63
+ 2. **For Conversation Queries**:
64
+ - Provide a concise answer based on WEB_READING_GUIDE.
65
+ - Use the 'style' input (formal or informal) to tailor the tone.
66
+ - If the query is unclear, ask for clarification.
67
+ - If the query is out of scope (unrelated to reading web content), respond with: "I'm sorry, but that question is out of scope. I can summarize news, blogs, explain web content, or answer questions about specific websites."
68
+ - If asked about supported capabilities, list summarization, explanations, and question answering from WEB_READING_GUIDE.
69
+
70
+ 3. **For Search Queries**:
71
+ - Use get_search_api_v1_web_search__get_get with the query string to find relevant news, blogs, or websites.
72
+ - Summarize the search results, listing URLs, titles, and snippets relevant to the query.
73
+ - Return the raw JSON response from the search tool.
74
+ - Provide a brief analysis of the results, focusing on their relevance to the user’s request (e.g., recent news articles).
75
+
76
+ 4. **For Analysis Queries**:
77
+ - Use tool_web_scrap_httpx_post to fetch the website’s HTML, specifying the provided URL and optional selectors (e.g., 'article, .content').
78
+ - Extract textual content from the HTML (e.g., <h1>, <p>, <article>), ignoring CSS and JS unless relevant to the query.
79
+ - For summarization:
80
+ - News: Provide a 2-3 sentence summary of key events or impacts.
81
+ - Blogs: Summarize in 3-4 sentences, capturing the main argument and takeaways.
82
+ - Explanations: Give a 1-2 sentence overview of the page’s purpose and content.
83
+ - For question answering: Use the scraped content to answer specific questions, or state if the information is unavailable.
84
+ - Check credibility using WEB_READING_GUIDE (e.g., bylines, publication dates).
85
+ - Consider the current date (May 27, 2025, 01:11 PM -03) for recency (e.g., flag outdated articles).
86
+ - If no content is returned (e.g., 403 error), return an empty response ({{"html": "", "css": "", "js": ""}}).
87
+ - Return the raw JSON response from the scraping tool.
88
+ - Include a detailed analysis of the content, focusing on key points, credibility, and relevance to the user’s query.
89
+ - Match the language and style of the initial response.
90
+
91
+ 5. **Supported Capabilities**:
92
+ - Summarize news articles, blog posts, explain web content, answer questions about specific websites.
93
+ - Refer to WEB_READING_GUIDE for guidelines on summarization and credibility.
94
+
95
+ 6. **General**:
96
+ - Base responses on WEB_READING_GUIDE and the output of the search or scraping tools.
97
+ - Tailor tone based on 'style' (formal or informal).
98
+ - Handle errors (e.g., 400, 403, 429) with explanations (e.g., '403: The website may restrict scraping; try a different URL').
99
+ - Return the raw JSON response from the tools for search and analysis queries.
100
+ - Use 'history' to interpret context from previous queries.
101
+ - Respond in the specified 'language'.
102
+
103
+ WEB_READING_GUIDE:
104
+ {WEB_READING_GUIDE}
105
+ """,
106
+ inputs=["query", "style", "history", "language"],
107
+ outputs=[
108
+ PromptOutput(
109
+ key="response",
110
+ description="Raw JSON response from the search or scraping tool, or a conversation answer in plain text."
111
+ )
112
+ ],
113
+ examples=[
114
+ PromptExample(
115
+ input_data="How do I identify credible news sources? [informal] [] en",
116
+ output="Look for bylines, recent publication dates, and reputable domains like .edu or .gov. Avoid sites with sensational headlines or no clear author."
117
+ ),
118
+ PromptExample(
119
+ input_data="Find recent tech news [formal] [] en",
120
+ output=json.dumps({
121
+ "results": [
122
+ {"url": "https://techsite1.com", "title": "AI Breakthrough in 2025", "snippet": "New AI model achieves record accuracy..."},
123
+ {"url": "https://techsite2.com", "title": "Quantum Computing Update", "snippet": "Advancements in quantum tech..."}
124
+ ]
125
+ })
126
+ ),
127
+ PromptExample(
128
+ input_data="Summarize the news article at https://example.com/news [formal] [] en",
129
+ output=json.dumps({
130
+ "html": "<html><body><h1>New Product Launch</h1><p>Company X unveiled a new gadget on May 25, 2025, targeting the Y market...</p></body></html>",
131
+ "css": "",
132
+ "js": ""
133
+ })
134
+ ),
135
+ PromptExample(
136
+ input_data="What’s the main point of https://example.com/blog [formal] [] en",
137
+ output=json.dumps({
138
+ "html": "<html><body><article><h1>Why UX Matters</h1><p>User experience drives engagement and retention...</p></article></body></html>",
139
+ "css": "",
140
+ "js": ""
141
+ })
142
+ ),
143
+ PromptExample(
144
+ input_data="Explain the content of https://example.com [formal] [] en",
145
+ output=json.dumps({
146
+ "html": "<html><body><h1>Welcome to Example</h1><p>This site showcases our products and services...</p></body></html>",
147
+ "css": "",
148
+ "js": ""
149
+ })
150
+ )
151
+ ]
152
+ ),
153
+ llm_config=LlmConfig(
154
+ max_tokens=5000,
155
+ timeout=0,
156
+ sampling=Sampling(temperature=0.7, top_k=50, top_p=1.0)
157
+ ),
158
+ models=ModelList(models=[Model(name="openai/gpt-4.1")]),
159
+ resource_pools=ResourcePoolList(
160
+ resource_pools=[
161
+ ResourcePool(
162
+ name="WebReadingTools",
163
+ tools=[
164
+ ResourcePoolTool(name="get_search_api_v1_web_search__get_get", revision=None),
165
+ ResourcePoolTool(name="tool_web_scrap_httpx_post", revision=None)
166
+ ],
167
+ agents=[]
168
+ )
169
+ ]
170
+ )
171
+ )
172
+ )
173
+
174
+ # Create the agent
175
+ manager = AILabManager()
176
+ result = manager.create_agent(
177
+ project_id="2ca6883f-6778-40bb-bcc1-85451fb11107",
178
+ agent=agent,
179
+ automatic_publish=False
180
+ )
181
+
182
+ if isinstance(result, Agent):
183
+ print(f"Agent created successfully: {agent.to_dict()}")
184
+ else:
185
+ print("Errors:", result.errors if hasattr(result, 'errors') else "Unknown error occurred")
@@ -0,0 +1,157 @@
1
+ from uuid import uuid4
2
+
3
+ from pygeai.chat.managers import ChatManager
4
+ from pygeai.core.files.responses import UploadFileResponse
5
+ from pygeai.lab.managers import AILabManager
6
+ from pygeai.core.files.managers import FileManager
7
+ from pygeai.core.files.models import UploadFile
8
+ from pygeai.core.models import ChatMessageList, ChatMessage, LlmSettings
9
+ from pygeai.lab.models import Agent, AgentData, Prompt, PromptExample, PromptOutput, LlmConfig, Sampling, Model, ModelList
10
+
11
+ project_id = "2ca6883f-6778-40bb-bcc1-85451fb11107"
12
+
13
+ lab_manager = AILabManager()
14
+ file_manager = FileManager(
15
+ organization_id="4aa15b61-d3c7-4a5c-99b8-052d18a04ff2",
16
+ project_id=project_id
17
+ )
18
+ chat_manager = ChatManager()
19
+
20
+ created_entities = {
21
+ "agent_id": None,
22
+ "file_id": None
23
+ }
24
+
25
+
26
+ def rollback():
27
+ print("\n=== Initiating Rollback ===")
28
+ if created_entities["agent_id"]:
29
+ print(f"Deleting agent {created_entities['agent_id']}...")
30
+ result = lab_manager.delete_agent(agent_id=created_entities["agent_id"])
31
+ print(f"Rollback: {result}")
32
+ if created_entities["file_id"]:
33
+ print(f"Deleting file {created_entities['file_id']}...")
34
+ result = file_manager.delete_file(file_id=created_entities["file_id"])
35
+ print(f"Rollback: {result}")
36
+ print("Rollback complete.")
37
+
38
+
39
+ def main():
40
+ # File Upload Flow
41
+ print("\n=== File Upload Flow ===")
42
+ print("Uploading file 'test.txt'...")
43
+ file_to_upload = UploadFile(
44
+ name="test.txt",
45
+ path="./test.txt",
46
+ folder="summaries"
47
+ )
48
+ upload_result = file_manager.upload_file(file=file_to_upload)
49
+ if isinstance(upload_result, UploadFileResponse) and upload_result.success:
50
+ print(f"Success: Uploaded File: test.txt, ID: {upload_result.id}")
51
+ created_entities["file_id"] = upload_result.id
52
+ else:
53
+ print("Error: File upload failed:", upload_result)
54
+ rollback()
55
+ exit()
56
+
57
+ # Retrieve File Metadata
58
+ print("Retrieving file metadata...")
59
+ file_data = file_manager.get_file_data(file_id=created_entities["file_id"])
60
+ if hasattr(file_data, "name"):
61
+ file_name = file_data.name
62
+ print(f"Success: Retrieved File Name: {file_name}")
63
+ else:
64
+ print("Error: File retrieval failed:", file_data)
65
+ rollback()
66
+ exit()
67
+
68
+ # Agent Flow
69
+ print("\n=== Agent Flow ===")
70
+ print("Creating agent 'FileSummaryAgent' as draft...")
71
+ agent_id = str(uuid4())
72
+ agent = Agent(
73
+ id=agent_id,
74
+ name="FileSummaryAgent",
75
+ access_scope="private",
76
+ job_description="Reads and summarizes content from text files",
77
+ description="An agent designed to process and summarize file content",
78
+ agent_data=AgentData(
79
+ prompt=Prompt(
80
+ instructions="Read the provided text file by its ID and generate a concise summary.",
81
+ inputs=["file_id"],
82
+ outputs=[
83
+ PromptOutput(key="summary", description="Summary of the file content")
84
+ ],
85
+ examples=[
86
+ PromptExample(
87
+ input_data=f"File ID: {created_entities['file_id']}",
88
+ output='{"summary": "Summary of test.txt content."}'
89
+ )
90
+ ]
91
+ ),
92
+ llm_config=LlmConfig(
93
+ max_tokens=2000,
94
+ timeout=60,
95
+ sampling=Sampling(temperature=0.8)
96
+ ),
97
+ models=ModelList(models=[
98
+ Model(name="gpt-4-turbo")
99
+ ])
100
+ ),
101
+ is_draft=True,
102
+ revision=1,
103
+ status="pending"
104
+ )
105
+ create_agent_result = lab_manager.create_agent(agent=agent, automatic_publish=False)
106
+ if isinstance(create_agent_result, Agent):
107
+ print(f"Success: Created Agent: {create_agent_result.name}, ID: {create_agent_result.id}")
108
+ created_entities["agent_id"] = create_agent_result.id
109
+ else:
110
+ print("Error: Agent creation failed:", create_agent_result)
111
+ rollback()
112
+ exit()
113
+
114
+ print("Publishing agent revision '1'...")
115
+ publish_agent_result = lab_manager.publish_agent_revision(agent_id=created_entities["agent_id"], revision="1")
116
+ if isinstance(publish_agent_result, Agent):
117
+ print(f"Success: Published Agent Revision: {publish_agent_result.name}")
118
+ else:
119
+ print("Error: Agent publish failed:", publish_agent_result)
120
+ rollback()
121
+ exit()
122
+
123
+ # Chat Completion Flow
124
+ print("\n=== Chat Completion Flow ===")
125
+ print(f"Asking agent about the uploaded file '{file_name}'...")
126
+ messages = ChatMessageList(messages=[
127
+ ChatMessage(
128
+ role="user",
129
+ content=f"Please summarize the content of the {{file:{file_name}}} ({file_name}) in 50 words or less."
130
+ )
131
+ ])
132
+ llm_settings = LlmSettings(
133
+ temperature=0.7,
134
+ max_tokens=500
135
+ )
136
+ chat_response = chat_manager.chat_completion(
137
+ model=f"saia:agent:{agent.name}",
138
+ messages=messages,
139
+ llm_settings=llm_settings
140
+ )
141
+ if hasattr(chat_response, "choices") and chat_response.choices:
142
+ print(f"Success: Chat Response: {chat_response.choices[0].message.content}")
143
+ else:
144
+ print("Error: Chat completion failed:", chat_response)
145
+ rollback()
146
+ exit()
147
+
148
+ print("\n=== Process Completed Successfully ===")
149
+
150
+
151
+ if __name__ == "__main__":
152
+ try:
153
+ main()
154
+ rollback()
155
+ except Exception as e:
156
+ rollback()
157
+ print(f"\n# Critical error: {e}")