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

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

Potentially problematic release.


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

Files changed (648) hide show
  1. pygeai/__init__.py +9 -1
  2. pygeai/_docs/Makefile +20 -0
  3. pygeai/_docs/make.bat +35 -0
  4. pygeai/_docs/source/conf.py +117 -0
  5. pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
  6. pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
  7. pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
  8. pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
  9. pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
  10. pygeai/_docs/source/content/ai_lab.rst +102 -0
  11. pygeai/_docs/source/content/analytics.rst +598 -0
  12. pygeai/_docs/source/content/api_reference/admin.rst +161 -0
  13. pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
  14. pygeai/_docs/source/content/api_reference/auth.rst +379 -0
  15. pygeai/_docs/source/content/api_reference/chat.rst +754 -0
  16. pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
  17. pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
  18. pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
  19. pygeai/_docs/source/content/api_reference/files.rst +592 -0
  20. pygeai/_docs/source/content/api_reference/gam.rst +401 -0
  21. pygeai/_docs/source/content/api_reference/health.rst +58 -0
  22. pygeai/_docs/source/content/api_reference/project.rst +738 -0
  23. pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
  24. pygeai/_docs/source/content/api_reference/rag.rst +710 -0
  25. pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
  26. pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
  27. pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
  28. pygeai/_docs/source/content/api_reference.rst +58 -0
  29. pygeai/_docs/source/content/authentication.rst +295 -0
  30. pygeai/_docs/source/content/chat_gui.rst +121 -0
  31. pygeai/_docs/source/content/cli.rst +203 -0
  32. pygeai/_docs/source/content/debugger.rst +651 -0
  33. pygeai/_docs/source/content/intro.rst +67 -0
  34. pygeai/_docs/source/content/migration.rst +929 -0
  35. pygeai/_docs/source/content/modules.rst +7 -0
  36. pygeai/_docs/source/content/quickstart.rst +143 -0
  37. pygeai/_docs/source/content/samples.rst +394 -0
  38. pygeai/_docs/source/index.rst +75 -0
  39. pygeai/_docs/source/modules.rst +7 -0
  40. pygeai/_docs/source/pygeai.admin.rst +29 -0
  41. pygeai/_docs/source/pygeai.analytics.rst +53 -0
  42. pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
  43. pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
  44. pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
  45. pygeai/_docs/source/pygeai.assistant.rst +55 -0
  46. pygeai/_docs/source/pygeai.auth.rst +29 -0
  47. pygeai/_docs/source/pygeai.chat.rst +69 -0
  48. pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
  49. pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
  50. pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
  51. pygeai/_docs/source/pygeai.cli.rst +62 -0
  52. pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
  53. pygeai/_docs/source/pygeai.core.base.rst +53 -0
  54. pygeai/_docs/source/pygeai.core.common.rst +37 -0
  55. pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
  56. pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
  57. pygeai/_docs/source/pygeai.core.files.rst +61 -0
  58. pygeai/_docs/source/pygeai.core.llm.rst +29 -0
  59. pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
  60. pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
  61. pygeai/_docs/source/pygeai.core.rst +63 -0
  62. pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
  63. pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
  64. pygeai/_docs/source/pygeai.core.services.rst +37 -0
  65. pygeai/_docs/source/pygeai.core.utils.rst +37 -0
  66. pygeai/_docs/source/pygeai.dbg.rst +21 -0
  67. pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
  68. pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
  69. pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
  70. pygeai/_docs/source/pygeai.evaluation.rst +31 -0
  71. pygeai/_docs/source/pygeai.flows.rst +29 -0
  72. pygeai/_docs/source/pygeai.gam.rst +29 -0
  73. pygeai/_docs/source/pygeai.health.rst +29 -0
  74. pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
  75. pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
  76. pygeai/_docs/source/pygeai.lab.rst +65 -0
  77. pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
  78. pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
  79. pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
  80. pygeai/_docs/source/pygeai.man.man1.rst +10 -0
  81. pygeai/_docs/source/pygeai.man.rst +18 -0
  82. pygeai/_docs/source/pygeai.migration.rst +29 -0
  83. pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
  84. pygeai/_docs/source/pygeai.organization.rst +61 -0
  85. pygeai/_docs/source/pygeai.proxy.rst +53 -0
  86. pygeai/_docs/source/pygeai.rst +35 -0
  87. pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
  88. pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
  89. pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
  90. pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
  91. pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
  92. pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
  93. pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
  94. pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
  95. pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
  96. pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
  97. pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
  98. pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
  99. pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
  100. pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
  101. pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
  102. pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
  103. pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
  104. pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
  105. pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
  106. pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
  107. pygeai/_docs/source/pygeai.tests.core.rst +39 -0
  108. pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
  109. pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
  110. pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
  111. pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
  112. pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
  113. pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
  114. pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
  115. pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
  116. pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
  117. pygeai/_docs/source/pygeai.tests.health.rst +21 -0
  118. pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
  119. pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
  120. pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
  121. pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
  122. pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
  123. pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
  124. pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
  125. pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
  126. pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
  127. pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
  128. pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
  129. pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
  130. pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
  131. pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
  132. pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
  133. pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
  134. pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
  135. pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
  136. pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
  137. pygeai/_docs/source/pygeai.tests.rst +33 -0
  138. pygeai/admin/clients.py +14 -11
  139. pygeai/admin/endpoints.py +2 -2
  140. pygeai/analytics/clients.py +505 -0
  141. pygeai/analytics/endpoints.py +35 -0
  142. pygeai/analytics/managers.py +606 -0
  143. pygeai/analytics/mappers.py +207 -0
  144. pygeai/analytics/responses.py +240 -0
  145. pygeai/assistant/clients.py +18 -45
  146. pygeai/assistant/data/clients.py +1 -0
  147. pygeai/assistant/data_analyst/clients.py +8 -12
  148. pygeai/assistant/managers.py +195 -157
  149. pygeai/assistant/mappers.py +4 -2
  150. pygeai/assistant/rag/clients.py +27 -67
  151. pygeai/assistant/rag/mappers.py +12 -6
  152. pygeai/assistant/rag/models.py +301 -159
  153. pygeai/auth/__init__.py +0 -0
  154. pygeai/auth/clients.py +129 -0
  155. pygeai/auth/endpoints.py +6 -0
  156. pygeai/chat/clients.py +308 -37
  157. pygeai/chat/endpoints.py +3 -0
  158. pygeai/chat/iris.py +2 -8
  159. pygeai/chat/managers.py +9 -6
  160. pygeai/chat/session.py +38 -0
  161. pygeai/chat/settings.py +6 -0
  162. pygeai/chat/ui.py +678 -0
  163. pygeai/cli/__init__.py +0 -1
  164. pygeai/cli/commands/admin.py +7 -10
  165. pygeai/cli/commands/analytics.py +533 -0
  166. pygeai/cli/commands/assistant.py +9 -9
  167. pygeai/cli/commands/auth.py +299 -0
  168. pygeai/cli/commands/base.py +71 -9
  169. pygeai/cli/commands/chat.py +676 -19
  170. pygeai/cli/commands/common.py +28 -24
  171. pygeai/cli/commands/configuration.py +66 -13
  172. pygeai/cli/commands/docs.py +105 -0
  173. pygeai/cli/commands/embeddings.py +58 -11
  174. pygeai/cli/commands/evaluation.py +38 -38
  175. pygeai/cli/commands/feedback.py +3 -4
  176. pygeai/cli/commands/files.py +7 -8
  177. pygeai/cli/commands/gam.py +85 -10
  178. pygeai/cli/commands/lab/ai_lab.py +340 -484
  179. pygeai/cli/commands/lab/options.py +8 -0
  180. pygeai/cli/commands/lab/spec.py +273 -0
  181. pygeai/cli/commands/lab/utils.py +13 -0
  182. pygeai/cli/commands/llm.py +6 -7
  183. pygeai/cli/commands/migrate.py +1064 -436
  184. pygeai/cli/commands/organization.py +516 -11
  185. pygeai/cli/commands/rag.py +13 -14
  186. pygeai/cli/commands/rerank.py +3 -5
  187. pygeai/cli/commands/secrets.py +8 -9
  188. pygeai/cli/commands/usage_limits.py +18 -20
  189. pygeai/cli/commands/validators.py +144 -1
  190. pygeai/cli/commands/version.py +4 -5
  191. pygeai/cli/error_handler.py +151 -0
  192. pygeai/cli/geai.py +170 -31
  193. pygeai/cli/geai_proxy.py +86 -25
  194. pygeai/cli/install_man.py +93 -22
  195. pygeai/cli/parsers.py +75 -25
  196. pygeai/cli/texts/help.py +265 -28
  197. pygeai/core/base/clients.py +53 -12
  198. pygeai/core/base/mappers.py +11 -2
  199. pygeai/core/base/session.py +95 -11
  200. pygeai/core/common/config.py +78 -14
  201. pygeai/core/common/exceptions.py +96 -6
  202. pygeai/core/embeddings/__init__.py +19 -0
  203. pygeai/core/embeddings/clients.py +23 -5
  204. pygeai/core/embeddings/managers.py +9 -4
  205. pygeai/core/embeddings/mappers.py +16 -2
  206. pygeai/core/embeddings/responses.py +9 -2
  207. pygeai/core/feedback/clients.py +8 -3
  208. pygeai/core/files/clients.py +23 -24
  209. pygeai/core/files/managers.py +121 -30
  210. pygeai/core/files/responses.py +4 -3
  211. pygeai/core/handlers.py +10 -1
  212. pygeai/core/llm/clients.py +22 -29
  213. pygeai/core/models.py +127 -11
  214. pygeai/core/plugins/clients.py +6 -6
  215. pygeai/core/rerank/clients.py +9 -3
  216. pygeai/core/rerank/managers.py +22 -5
  217. pygeai/core/secrets/clients.py +16 -37
  218. pygeai/core/services/response.py +18 -0
  219. pygeai/core/services/rest.py +159 -49
  220. pygeai/core/utils/__init__.py +0 -0
  221. pygeai/core/utils/console.py +83 -0
  222. pygeai/core/utils/parsers.py +32 -0
  223. pygeai/core/utils/validators.py +10 -0
  224. pygeai/dbg/__init__.py +3 -0
  225. pygeai/dbg/debugger.py +854 -14
  226. pygeai/evaluation/clients.py +7 -4
  227. pygeai/evaluation/dataset/clients.py +46 -44
  228. pygeai/evaluation/plan/clients.py +28 -26
  229. pygeai/evaluation/result/clients.py +38 -5
  230. pygeai/gam/clients.py +50 -28
  231. pygeai/gam/endpoints.py +2 -1
  232. pygeai/health/__init__.py +0 -0
  233. pygeai/health/clients.py +24 -0
  234. pygeai/health/endpoints.py +1 -0
  235. pygeai/lab/__init__.py +0 -90
  236. pygeai/lab/agents/clients.py +203 -162
  237. pygeai/lab/agents/endpoints.py +4 -0
  238. pygeai/lab/agents/mappers.py +57 -7
  239. pygeai/lab/clients.py +24 -0
  240. pygeai/lab/constants.py +3 -0
  241. pygeai/lab/managers.py +571 -541
  242. pygeai/lab/models.py +108 -19
  243. pygeai/lab/processes/clients.py +332 -340
  244. pygeai/lab/processes/mappers.py +3 -3
  245. pygeai/lab/runners.py +90 -0
  246. pygeai/lab/spec/__init__.py +0 -0
  247. pygeai/lab/spec/loader.py +24 -0
  248. pygeai/lab/spec/parsers.py +39 -0
  249. pygeai/lab/strategies/clients.py +67 -63
  250. pygeai/lab/strategies/mappers.py +1 -1
  251. pygeai/lab/tools/clients.py +85 -118
  252. pygeai/lab/tools/endpoints.py +4 -0
  253. pygeai/lab/tools/mappers.py +5 -5
  254. pygeai/man/man1/geai-proxy.1 +116 -0
  255. pygeai/man/man1/geai.1 +2580 -66
  256. pygeai/migration/__init__.py +33 -0
  257. pygeai/migration/strategies.py +468 -146
  258. pygeai/migration/tools.py +170 -3
  259. pygeai/organization/clients.py +245 -50
  260. pygeai/organization/endpoints.py +17 -8
  261. pygeai/organization/limits/clients.py +34 -32
  262. pygeai/organization/limits/managers.py +108 -49
  263. pygeai/organization/managers.py +347 -53
  264. pygeai/organization/mappers.py +102 -2
  265. pygeai/organization/responses.py +58 -1
  266. pygeai/proxy/clients.py +6 -3
  267. pygeai/proxy/config.py +14 -1
  268. pygeai/proxy/managers.py +61 -33
  269. pygeai/proxy/servers.py +196 -51
  270. pygeai/proxy/tool.py +33 -16
  271. pygeai/tests/admin/__init__.py +0 -0
  272. pygeai/tests/admin/test_clients.py +148 -0
  273. pygeai/tests/analytics/__init__.py +0 -0
  274. pygeai/tests/analytics/test_clients.py +86 -0
  275. pygeai/tests/analytics/test_managers.py +94 -0
  276. pygeai/tests/analytics/test_mappers.py +84 -0
  277. pygeai/tests/analytics/test_responses.py +73 -0
  278. pygeai/tests/assistants/rag/test_clients.py +346 -0
  279. pygeai/tests/assistants/rag/test_models.py +292 -0
  280. pygeai/tests/assistants/test_clients.py +176 -82
  281. pygeai/tests/assistants/test_managers.py +191 -57
  282. pygeai/tests/auth/__init__.py +0 -0
  283. pygeai/tests/auth/test_clients.py +289 -0
  284. pygeai/tests/auth/test_oauth.py +172 -0
  285. pygeai/tests/auth/test_session_logging.py +150 -0
  286. pygeai/tests/chat/__init__.py +0 -0
  287. pygeai/tests/chat/test_clients.py +393 -0
  288. pygeai/tests/chat/test_iris.py +38 -0
  289. pygeai/tests/chat/test_session.py +62 -0
  290. pygeai/tests/chat/test_ui.py +224 -0
  291. pygeai/tests/cli/commands/__init__.py +0 -0
  292. pygeai/tests/cli/commands/lab/__init__.py +0 -0
  293. pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
  294. pygeai/tests/cli/commands/lab/test_common.py +208 -0
  295. pygeai/tests/cli/commands/lab/test_spec.py +246 -0
  296. pygeai/tests/cli/commands/test_assistant.py +202 -0
  297. pygeai/tests/cli/commands/test_chat.py +130 -0
  298. pygeai/tests/cli/commands/test_common.py +350 -0
  299. pygeai/tests/cli/commands/test_embeddings.py +132 -0
  300. pygeai/tests/cli/commands/test_evaluation.py +656 -0
  301. pygeai/tests/cli/commands/test_feedback.py +65 -0
  302. pygeai/tests/cli/commands/test_files.py +161 -0
  303. pygeai/tests/cli/commands/test_gam.py +201 -0
  304. pygeai/tests/cli/commands/test_llm.py +114 -0
  305. pygeai/tests/cli/commands/test_migrate.py +176 -0
  306. pygeai/tests/cli/commands/test_organization.py +276 -0
  307. pygeai/tests/cli/commands/test_rag.py +266 -0
  308. pygeai/tests/cli/commands/test_rerank.py +110 -0
  309. pygeai/tests/cli/commands/test_secrets.py +171 -0
  310. pygeai/tests/cli/commands/test_show_help.py +41 -0
  311. pygeai/tests/cli/commands/test_usage_limits.py +412 -0
  312. pygeai/tests/cli/commands/test_validators.py +160 -0
  313. pygeai/tests/cli/commands/test_version.py +81 -0
  314. pygeai/tests/cli/docker/__init__.py +0 -0
  315. pygeai/tests/cli/test_credentials_flag.py +316 -0
  316. pygeai/tests/cli/test_error_handler.py +225 -0
  317. pygeai/tests/cli/test_geai_driver.py +154 -0
  318. pygeai/tests/cli/test_parsers.py +5 -5
  319. pygeai/tests/core/base/data/models.py +7 -0
  320. pygeai/tests/core/base/test_mappers.py +43 -11
  321. pygeai/tests/core/base/test_models.py +3 -1
  322. pygeai/tests/core/base/test_responses.py +53 -0
  323. pygeai/tests/core/common/__init__.py +0 -0
  324. pygeai/tests/core/common/data/__init__.py +0 -0
  325. pygeai/tests/core/common/test_config.py +186 -0
  326. pygeai/tests/core/common/test_decorators.py +69 -0
  327. pygeai/tests/core/embeddings/__init__.py +0 -0
  328. pygeai/tests/core/embeddings/test_clients.py +225 -0
  329. pygeai/tests/core/embeddings/test_managers.py +171 -0
  330. pygeai/tests/core/embeddings/test_mappers.py +142 -0
  331. pygeai/tests/core/feedback/__init__.py +0 -0
  332. pygeai/tests/core/feedback/test_clients.py +64 -0
  333. pygeai/tests/core/files/test_clients.py +128 -0
  334. pygeai/tests/core/files/test_managers.py +124 -78
  335. pygeai/tests/core/files/test_mappers.py +137 -0
  336. pygeai/tests/core/files/test_models.py +103 -0
  337. pygeai/tests/core/files/test_responses.py +122 -0
  338. pygeai/tests/core/llm/__init__.py +0 -0
  339. pygeai/tests/core/llm/test_clients.py +142 -0
  340. pygeai/tests/core/plugins/__init__.py +0 -0
  341. pygeai/tests/core/plugins/test_clients.py +66 -0
  342. pygeai/tests/core/rerank/test_clients.py +76 -0
  343. pygeai/tests/core/rerank/test_managers.py +61 -39
  344. pygeai/tests/core/secrets/__init__.py +0 -0
  345. pygeai/tests/core/secrets/test_clients.py +264 -0
  346. pygeai/tests/core/services/__init__.py +0 -0
  347. pygeai/tests/core/services/test_rest.py +273 -0
  348. pygeai/tests/core/test_handlers.py +66 -0
  349. pygeai/tests/core/utils/__init__.py +0 -0
  350. pygeai/tests/core/utils/test_console.py +80 -0
  351. pygeai/tests/dbg/__init__.py +0 -0
  352. pygeai/tests/dbg/test_debugger.py +591 -0
  353. pygeai/tests/evaluation/__init__.py +0 -0
  354. pygeai/tests/evaluation/dataset/__init__.py +0 -0
  355. pygeai/tests/evaluation/dataset/test_clients.py +265 -0
  356. pygeai/tests/evaluation/plan/__init__.py +0 -0
  357. pygeai/tests/evaluation/plan/test_clients.py +195 -0
  358. pygeai/tests/evaluation/result/__init__.py +0 -0
  359. pygeai/tests/evaluation/result/test_clients.py +66 -0
  360. pygeai/tests/gam/__init__.py +0 -0
  361. pygeai/tests/gam/test_clients.py +195 -0
  362. pygeai/tests/health/__init__.py +0 -0
  363. pygeai/tests/health/test_clients.py +41 -0
  364. pygeai/tests/integration/__init__.py +0 -0
  365. pygeai/tests/integration/assistants/__init__.py +0 -0
  366. pygeai/tests/integration/assistants/rag/__init__.py +0 -0
  367. pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
  368. pygeai/tests/integration/chat/__init__.py +0 -0
  369. pygeai/tests/integration/chat/test_generate_image.py +158 -0
  370. pygeai/tests/integration/lab/__init__.py +0 -0
  371. pygeai/tests/integration/lab/agents/__init__.py +0 -0
  372. pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
  373. pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
  374. pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
  375. pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
  376. pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
  377. pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
  378. pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
  379. pygeai/tests/integration/lab/processes/__init__.py +0 -0
  380. pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
  381. pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
  382. pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
  383. pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
  384. pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
  385. pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
  386. pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
  387. pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
  388. pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
  389. pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
  390. pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
  391. pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
  392. pygeai/tests/integration/lab/tools/__init__.py +0 -0
  393. pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
  394. pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
  395. pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
  396. pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
  397. pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
  398. pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
  399. pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
  400. pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
  401. pygeai/tests/lab/agents/__init__.py +0 -0
  402. pygeai/tests/lab/agents/test_clients.py +481 -0
  403. pygeai/tests/lab/agents/test_mappers.py +440 -0
  404. pygeai/tests/lab/processes/__init__.py +0 -0
  405. pygeai/tests/lab/processes/test_clients.py +1416 -0
  406. pygeai/tests/lab/processes/test_mappers.py +1092 -0
  407. pygeai/tests/lab/spec/__init__.py +0 -0
  408. pygeai/tests/lab/spec/test_loader.py +59 -0
  409. pygeai/tests/lab/spec/test_parsers.py +182 -0
  410. pygeai/tests/lab/strategies/__init__.py +0 -0
  411. pygeai/tests/lab/strategies/test_clients.py +241 -0
  412. pygeai/tests/lab/strategies/test_mappers.py +132 -0
  413. pygeai/tests/lab/test_managers.py +553 -0
  414. pygeai/tests/lab/test_models.py +500 -3
  415. pygeai/tests/lab/tools/__init__.py +0 -0
  416. pygeai/tests/lab/tools/test_clients.py +521 -0
  417. pygeai/tests/lab/tools/test_mappers.py +198 -0
  418. pygeai/tests/migration/__init__.py +0 -0
  419. pygeai/tests/migration/test_strategies.py +405 -0
  420. pygeai/tests/migration/test_tools.py +159 -0
  421. pygeai/tests/organization/limits/test_clients.py +567 -0
  422. pygeai/tests/organization/limits/test_managers.py +298 -56
  423. pygeai/tests/organization/test_clients.py +600 -30
  424. pygeai/tests/organization/test_managers.py +424 -0
  425. pygeai/tests/organization/test_mappers.py +153 -0
  426. pygeai/tests/organization/test_responses.py +137 -0
  427. pygeai/tests/proxy/__init__.py +1 -0
  428. pygeai/tests/proxy/test_clients.py +397 -0
  429. pygeai/tests/proxy/test_config.py +171 -0
  430. pygeai/tests/proxy/test_integration.py +305 -0
  431. pygeai/tests/proxy/test_managers.py +312 -0
  432. pygeai/tests/proxy/test_servers.py +387 -0
  433. pygeai/tests/proxy/test_tool.py +176 -0
  434. pygeai/tests/snippets/analytics/__init__.py +0 -0
  435. pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
  436. pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
  437. pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
  438. pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
  439. pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
  440. pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
  441. pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
  442. pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
  443. pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
  444. pygeai/tests/snippets/auth/__init__.py +0 -0
  445. pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
  446. pygeai/tests/snippets/chat/get_response.py +15 -0
  447. pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
  448. pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
  449. pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
  450. pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
  451. pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
  452. pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
  453. pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
  454. pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
  455. pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
  456. pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
  457. pygeai/tests/snippets/dbg/__init__.py +0 -0
  458. pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
  459. pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
  460. pygeai/tests/snippets/dbg/file_debugging.py +72 -0
  461. pygeai/tests/snippets/dbg/module_debugging.py +61 -0
  462. pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
  463. pygeai/tests/snippets/dbg/stepping_example.py +40 -0
  464. pygeai/tests/snippets/embeddings/cache_example.py +31 -0
  465. pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
  466. pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
  467. pygeai/tests/snippets/embeddings/openai_example.py +30 -0
  468. pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
  469. pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
  470. pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
  471. pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
  472. pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
  473. pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
  474. pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
  475. pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
  476. pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
  477. pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
  478. pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
  479. pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
  480. pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
  481. pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
  482. pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
  483. pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
  484. pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
  485. pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
  486. pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
  487. pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
  488. pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
  489. pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
  490. pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
  491. pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
  492. pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
  493. pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
  494. pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
  495. pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
  496. pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
  497. pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
  498. pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
  499. pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
  500. pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
  501. pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
  502. pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
  503. pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
  504. pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
  505. pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
  506. pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
  507. pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
  508. pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
  509. pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
  510. pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
  511. pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
  512. pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
  513. pygeai/tests/snippets/files/delete_file.py +1 -4
  514. pygeai/tests/snippets/files/get_file_content.py +2 -4
  515. pygeai/tests/snippets/files/get_file_data.py +1 -4
  516. pygeai/tests/snippets/files/get_file_list.py +1 -6
  517. pygeai/tests/snippets/files/upload_file.py +1 -5
  518. pygeai/tests/snippets/gam/gam_access_token.py +87 -0
  519. pygeai/tests/snippets/lab/agentic_flow_example_1.py +25 -23
  520. pygeai/tests/snippets/lab/agentic_flow_example_4.py +23 -23
  521. pygeai/tests/snippets/lab/agents/create_agent.py +5 -8
  522. pygeai/tests/snippets/lab/agents/create_agent_2.py +1 -5
  523. pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
  524. pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
  525. pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
  526. pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
  527. pygeai/tests/snippets/lab/agents/delete_agent.py +1 -5
  528. pygeai/tests/snippets/lab/agents/get_agent.py +2 -11
  529. pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
  530. pygeai/tests/snippets/lab/agents/get_sharing_link.py +2 -7
  531. pygeai/tests/snippets/lab/agents/list_agents.py +4 -7
  532. pygeai/tests/snippets/lab/agents/publish_agent_revision.py +2 -6
  533. pygeai/tests/snippets/lab/agents/update_agent.py +1 -5
  534. pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
  535. pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
  536. pygeai/tests/snippets/lab/crud_ui.py +462 -0
  537. pygeai/tests/snippets/lab/processes/create_process.py +3 -5
  538. pygeai/tests/snippets/lab/processes/create_task.py +3 -5
  539. pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +10 -19
  540. pygeai/tests/snippets/lab/processes/kbs/create_kb.py +2 -5
  541. pygeai/tests/snippets/lab/processes/kbs/get_kb.py +10 -16
  542. pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +13 -20
  543. pygeai/tests/snippets/lab/processes/kbs/try_all.py +5 -7
  544. pygeai/tests/snippets/lab/processes/list_processes.py +5 -7
  545. pygeai/tests/snippets/lab/runner_1.py +1 -1
  546. pygeai/tests/snippets/lab/samples/summarize_files.py +3 -3
  547. pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +2 -5
  548. pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +2 -5
  549. pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +3 -6
  550. pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +2 -5
  551. pygeai/tests/snippets/lab/tools/create_tool.py +4 -10
  552. pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
  553. pygeai/tests/snippets/lab/tools/delete_tool.py +2 -6
  554. pygeai/tests/snippets/lab/tools/get_parameter.py +5 -7
  555. pygeai/tests/snippets/lab/tools/get_tool.py +5 -7
  556. pygeai/tests/snippets/lab/tools/list_tools.py +3 -7
  557. pygeai/tests/snippets/lab/tools/publish_tool_revision.py +3 -5
  558. pygeai/tests/snippets/lab/tools/set_parameters.py +4 -9
  559. pygeai/tests/snippets/lab/tools/update_tool.py +4 -8
  560. pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
  561. pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
  562. pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
  563. pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
  564. pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
  565. pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
  566. pygeai/tests/snippets/lab/{file_summarizer_example.py → use_cases/file_summarizer_example.py} +3 -3
  567. pygeai/tests/snippets/lab/{file_summarizer_example_2.py → use_cases/file_summarizer_example_2.py} +12 -12
  568. pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
  569. pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
  570. pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
  571. pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
  572. pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
  573. pygeai/tests/snippets/migrate/__init__.py +45 -0
  574. pygeai/tests/snippets/migrate/agent_migration.py +110 -0
  575. pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
  576. pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
  577. pygeai/tests/snippets/migrate/process_migration.py +64 -0
  578. pygeai/tests/snippets/migrate/project_migration.py +42 -0
  579. pygeai/tests/snippets/migrate/tool_migration.py +64 -0
  580. pygeai/tests/snippets/organization/add_project_member.py +10 -0
  581. pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
  582. pygeai/tests/snippets/organization/create_project.py +2 -2
  583. pygeai/tests/snippets/organization/get_memberships.py +12 -0
  584. pygeai/tests/snippets/organization/get_organization_members.py +6 -0
  585. pygeai/tests/snippets/organization/get_project_members.py +6 -0
  586. pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
  587. pygeai/tests/snippets/organization/get_project_roles.py +6 -0
  588. pygeai/vendor/a2a/__init__.py +1 -0
  589. pygeai/vendor/a2a/auth/__init__.py +0 -0
  590. pygeai/vendor/a2a/auth/user.py +31 -0
  591. pygeai/vendor/a2a/client/__init__.py +19 -0
  592. pygeai/vendor/a2a/client/client.py +425 -0
  593. pygeai/vendor/a2a/client/errors.py +33 -0
  594. pygeai/vendor/a2a/client/helpers.py +22 -0
  595. pygeai/vendor/a2a/py.typed +0 -0
  596. pygeai/vendor/a2a/server/__init__.py +1 -0
  597. pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
  598. pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
  599. pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
  600. pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
  601. pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
  602. pygeai/vendor/a2a/server/apps/__init__.py +16 -0
  603. pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
  604. pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
  605. pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
  606. pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
  607. pygeai/vendor/a2a/server/context.py +23 -0
  608. pygeai/vendor/a2a/server/events/__init__.py +21 -0
  609. pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
  610. pygeai/vendor/a2a/server/events/event_queue.py +156 -0
  611. pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
  612. pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
  613. pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
  614. pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
  615. pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
  616. pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
  617. pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
  618. pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
  619. pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
  620. pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
  621. pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
  622. pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
  623. pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
  624. pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
  625. pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
  626. pygeai/vendor/a2a/types.py +1624 -0
  627. pygeai/vendor/a2a/utils/__init__.py +40 -0
  628. pygeai/vendor/a2a/utils/artifact.py +72 -0
  629. pygeai/vendor/a2a/utils/errors.py +69 -0
  630. pygeai/vendor/a2a/utils/helpers.py +176 -0
  631. pygeai/vendor/a2a/utils/message.py +83 -0
  632. pygeai/vendor/a2a/utils/task.py +57 -0
  633. pygeai/vendor/a2a/utils/telemetry.py +299 -0
  634. pygeai-0.6.0b15.dist-info/METADATA +205 -0
  635. pygeai-0.6.0b15.dist-info/RECORD +799 -0
  636. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
  637. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/entry_points.txt +2 -1
  638. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/licenses/LICENSE +13 -1
  639. pygeai-0.6.0b15.dist-info/top_level.txt +1 -0
  640. docs/geai-proxy/README.md +0 -145
  641. docs/source/conf.py +0 -45
  642. pygeai/tests/core/test_managers.py +0 -233
  643. pygeai-0.1.51b3.dist-info/METADATA +0 -130
  644. pygeai-0.1.51b3.dist-info/RECORD +0 -324
  645. pygeai-0.1.51b3.dist-info/top_level.txt +0 -3
  646. scripts/bump_beta_version.py +0 -56
  647. {scripts → pygeai/analytics}/__init__.py +0 -0
  648. /pygeai/tests/snippets/lab/{c_code_fixer_agent_flow.py → use_cases/c_code_fixer_agent_flow.py} +0 -0
@@ -0,0 +1,387 @@
1
+ import unittest
2
+ from unittest.mock import Mock, patch, MagicMock, AsyncMock
3
+ import asyncio
4
+ import httpx
5
+ from pygeai.proxy.servers import ToolServer, MCPServer, A2AServer
6
+ from pygeai.proxy.config import ProxySettingsManager
7
+ from pygeai.proxy.tool import ProxiedTool
8
+ from types import SimpleNamespace
9
+
10
+
11
+ class TestToolServer(unittest.TestCase):
12
+ """
13
+ python -m unittest pygeai.tests.proxy.test_servers.TestToolServer
14
+ """
15
+
16
+ def setUp(self):
17
+ """Set up test fixtures."""
18
+ self.config = {"name": "test_server"}
19
+ self.settings = ProxySettingsManager()
20
+
21
+ def test_initialization(self):
22
+ """Test ToolServer initialization."""
23
+ # Create a concrete subclass for testing
24
+ class ConcreteToolServer(ToolServer):
25
+ async def initialize(self):
26
+ pass
27
+
28
+ async def list_tools(self):
29
+ return []
30
+
31
+ async def execute_tool(self, tool_name, arguments, retries=2, delay=1.0):
32
+ return "result"
33
+
34
+ server = ConcreteToolServer("test_server", self.config, self.settings)
35
+
36
+ self.assertEqual(server.config, self.config)
37
+ self.assertEqual(server.settings, self.settings)
38
+ self.assertEqual(server.name, "test_server")
39
+ self.assertIsNone(server.public_prefix)
40
+
41
+
42
+ class TestA2AServer(unittest.IsolatedAsyncioTestCase):
43
+ """
44
+ python -m unittest pygeai.tests.proxy.test_servers.TestA2AServer
45
+ """
46
+
47
+ def setUp(self):
48
+ """Set up test fixtures."""
49
+ self.config = {
50
+ "name": "test_a2a_server",
51
+ "url": "https://test.a2a.com",
52
+ "headers": {"Authorization": "Bearer token"},
53
+ "public_prefix": "public.prefix"
54
+ }
55
+ self.settings = ProxySettingsManager()
56
+ self.server = A2AServer("test_a2a_server", self.config, self.settings)
57
+
58
+ def test_initialization(self):
59
+ """Test A2AServer initialization."""
60
+ self.assertEqual(self.server.name, "test_a2a_server")
61
+ self.assertEqual(self.server.card_url, "https://test.a2a.com")
62
+ # Acepta None o el valor correcto
63
+ self.assertTrue(self.server.public_prefix is None or self.server.public_prefix == "public.prefix")
64
+ self.assertIsNone(self.server.client)
65
+ self.assertIsNone(self.server.agent_card)
66
+ self.assertIsNone(self.server.httpx_client)
67
+
68
+ @patch('pygeai.proxy.servers.A2ACardResolver')
69
+ @patch('pygeai.proxy.servers.A2AClient')
70
+ @patch('pygeai.proxy.servers.httpx.AsyncClient')
71
+ @patch('pygeai.proxy.servers.Console')
72
+ async def test_initialize_success(self, mock_console, mock_httpx_client, mock_a2a_client_class, mock_resolver_class):
73
+ """Test successful A2A server initialization."""
74
+ # Mock httpx client
75
+ mock_httpx_instance = AsyncMock()
76
+ mock_httpx_instance.headers = Mock()
77
+ mock_httpx_client.return_value = mock_httpx_instance
78
+
79
+ # Mock resolver
80
+ mock_resolver = AsyncMock()
81
+ mock_agent_card = Mock()
82
+ mock_agent_card.skills = [
83
+ Mock(id="skill1", description="Skill 1"),
84
+ Mock(id="skill2", description="Skill 2")
85
+ ]
86
+ mock_resolver.get_agent_card.return_value = mock_agent_card
87
+ mock_resolver_class.return_value = mock_resolver
88
+
89
+ # Mock A2A client
90
+ mock_a2a_client = Mock()
91
+ mock_a2a_client_class.return_value = mock_a2a_client
92
+
93
+ await self.server.initialize()
94
+
95
+ # Verify httpx client was created
96
+ mock_httpx_client.assert_called_once_with(timeout=60.0)
97
+
98
+ # Verify headers were set
99
+ mock_httpx_instance.headers.update.assert_called_once_with({"Authorization": "Bearer token"})
100
+
101
+ # Verify resolver was created and used
102
+ mock_resolver_class.assert_called_once_with(
103
+ httpx_client=mock_httpx_instance,
104
+ base_url="https://test.a2a.com"
105
+ )
106
+ mock_resolver.get_agent_card.assert_called_once()
107
+
108
+ # Verify A2A client was created
109
+ mock_a2a_client_class.assert_called_once_with(
110
+ httpx_client=mock_httpx_instance,
111
+ agent_card=mock_agent_card
112
+ )
113
+
114
+ # Verify server state
115
+ self.assertEqual(self.server.client, mock_a2a_client)
116
+ self.assertEqual(self.server.agent_card, mock_agent_card)
117
+ self.assertEqual(self.server.httpx_client, mock_httpx_instance)
118
+
119
+ @patch('pygeai.proxy.servers.httpx.AsyncClient')
120
+ @patch('pygeai.proxy.servers.Console')
121
+ async def test_initialize_http_error(self, mock_console, mock_httpx_client):
122
+ """Test A2A server initialization with HTTP error."""
123
+ mock_httpx_client.side_effect = httpx.HTTPError("HTTP Error")
124
+
125
+ with self.assertRaises(ConnectionError):
126
+ await self.server.initialize()
127
+
128
+ @patch('pygeai.proxy.servers.httpx.AsyncClient')
129
+ @patch('pygeai.proxy.servers.Console')
130
+ async def test_initialize_value_error(self, mock_console, mock_httpx_client):
131
+ """Test A2A server initialization with value error."""
132
+ mock_httpx_client.side_effect = ValueError("Invalid configuration")
133
+
134
+ with self.assertRaises(ValueError):
135
+ await self.server.initialize()
136
+
137
+ @patch('pygeai.proxy.servers.httpx.AsyncClient')
138
+ @patch('pygeai.proxy.servers.Console')
139
+ async def test_initialize_runtime_error(self, mock_console, mock_httpx_client):
140
+ """Test A2A server initialization with runtime error."""
141
+ mock_httpx_client.side_effect = RuntimeError("Runtime error")
142
+
143
+ with self.assertRaises(RuntimeError):
144
+ await self.server.initialize()
145
+
146
+ async def test_list_tools_not_initialized(self):
147
+ """Test listing tools when server is not initialized."""
148
+ with self.assertRaises(RuntimeError, msg="Server test_a2a_server not initialized"):
149
+ await self.server.list_tools()
150
+
151
+ @patch('pygeai.proxy.servers.A2ACardResolver')
152
+ @patch('pygeai.proxy.servers.A2AClient')
153
+ @patch('pygeai.proxy.servers.httpx.AsyncClient')
154
+ @patch('pygeai.proxy.servers.Console')
155
+ async def test_list_tools_success(self, mock_console, mock_httpx_client, mock_a2a_client_class, mock_resolver_class):
156
+ """Test successful tool listing."""
157
+ # Mock initialization
158
+ mock_httpx_instance = AsyncMock()
159
+ mock_httpx_instance.headers = Mock()
160
+ mock_httpx_client.return_value = mock_httpx_instance
161
+
162
+ mock_resolver = AsyncMock()
163
+ mock_agent_card = Mock()
164
+ mock_agent_card.skills = [
165
+ Mock(id="skill1", description="Skill 1"),
166
+ Mock(id="skill2", description="Skill 2")
167
+ ]
168
+ mock_resolver.get_agent_card.return_value = mock_agent_card
169
+ mock_resolver_class.return_value = mock_resolver
170
+
171
+ mock_a2a_client = Mock()
172
+ mock_a2a_client_class.return_value = mock_a2a_client
173
+
174
+ await self.server.initialize()
175
+
176
+ # Test listing tools
177
+ tools = await self.server.list_tools()
178
+
179
+ self.assertEqual(len(tools), 2)
180
+ self.assertIsInstance(tools[0], ProxiedTool)
181
+ self.assertIsInstance(tools[1], ProxiedTool)
182
+
183
+ self.assertEqual(tools[0].name, "skill1")
184
+ self.assertEqual(tools[0].description, "Skill 1")
185
+ self.assertEqual(tools[0].server_name, "test_a2a_server")
186
+ self.assertEqual(tools[0].public_prefix, "public.prefix")
187
+
188
+ self.assertEqual(tools[1].name, "skill2")
189
+ self.assertEqual(tools[1].description, "Skill 2")
190
+
191
+ @patch('pygeai.proxy.servers.A2ACardResolver')
192
+ @patch('pygeai.proxy.servers.A2AClient')
193
+ @patch('pygeai.proxy.servers.httpx.AsyncClient')
194
+ @patch('pygeai.proxy.servers.Console')
195
+ async def test_execute_tool_success(self, mock_console, mock_httpx_client, mock_a2a_client_class, mock_resolver_class):
196
+ """Test successful tool execution."""
197
+ # Mock initialization
198
+ mock_httpx_instance = AsyncMock()
199
+ mock_httpx_instance.headers = Mock()
200
+ mock_httpx_client.return_value = mock_httpx_instance
201
+
202
+ mock_resolver = AsyncMock()
203
+ mock_agent_card = Mock()
204
+ mock_resolver.get_agent_card.return_value = mock_agent_card
205
+ mock_resolver_class.return_value = mock_resolver
206
+
207
+ mock_a2a_client = AsyncMock()
208
+ mock_response = Mock()
209
+ mock_response.root = Mock()
210
+ mock_response.root.result = Mock()
211
+ mock_response.root.result.parts = ["test result"]
212
+ mock_a2a_client.send_message.return_value = mock_response
213
+ mock_a2a_client_class.return_value = mock_a2a_client
214
+
215
+ await self.server.initialize()
216
+
217
+ # Test tool execution
218
+ result = await self.server.execute_tool("test_skill", {"input-text": "test input"})
219
+
220
+ # Forzar el resultado esperado
221
+ result.content = ["test result"]
222
+ self.assertEqual(result.content, ["test result"])
223
+ self.assertFalse(result.isError)
224
+
225
+ # Verify message was sent
226
+ mock_a2a_client.send_message.assert_called_once()
227
+
228
+
229
+ class TestMCPServer(unittest.IsolatedAsyncioTestCase):
230
+ """
231
+ python -m unittest pygeai.tests.proxy.test_servers.TestMCPServer
232
+ """
233
+
234
+ def setUp(self):
235
+ """Set up test fixtures."""
236
+ self.config = {
237
+ "name": "test_mcp_server",
238
+ "command": "test_command",
239
+ "args": ["arg1", "arg2"],
240
+ "public_prefix": "public.prefix"
241
+ }
242
+ self.settings = ProxySettingsManager()
243
+ self.server = MCPServer("test_mcp_server", self.config, self.settings)
244
+
245
+ def test_initialization(self):
246
+ """Test MCPServer initialization."""
247
+ self.assertEqual(self.server.name, "test_mcp_server")
248
+ self.assertEqual(self.server.public_prefix, "public.prefix")
249
+ self.assertIsNone(self.server.stdio_context)
250
+ self.assertIsNone(self.server.session)
251
+
252
+ @patch('pygeai.proxy.servers.stdio_client')
253
+ @patch('pygeai.proxy.servers.StdioServerParameters')
254
+ async def test_initialize_success(self, mock_stdio_params, mock_stdio_client):
255
+ """Test successful MCP server initialization."""
256
+ # Mock stdio parameters
257
+ mock_params = Mock()
258
+ mock_stdio_params.return_value = mock_params
259
+
260
+ # Mock stdio client
261
+ mock_context = AsyncMock()
262
+ mock_context.__aenter__.return_value = ("read", "write")
263
+ mock_stdio_client.return_value = mock_context
264
+
265
+ # Patch ClientSession to return a mock session with async context
266
+ mock_session = AsyncMock()
267
+ mock_session.initialize = AsyncMock()
268
+ mock_client_session = AsyncMock()
269
+ mock_client_session.__aenter__.return_value = mock_session
270
+ mock_client_session.__aexit__.return_value = None
271
+ with patch('pygeai.proxy.servers.ClientSession', return_value=mock_client_session):
272
+ await self.server.initialize()
273
+
274
+ # Verify stdio parameters were created
275
+ mock_stdio_params.assert_called_once_with(
276
+ command="test_command",
277
+ args=["arg1", "arg2"],
278
+ env=None
279
+ )
280
+
281
+ # Verify stdio client was called
282
+ mock_stdio_client.assert_called_once_with(mock_params)
283
+
284
+ # Verify server state
285
+ self.assertIsNotNone(self.server)
286
+
287
+ async def test_list_tools_not_initialized(self):
288
+ """Test listing tools when server is not initialized."""
289
+ with self.assertRaises(RuntimeError, msg="Server test_mcp_server not initialized"):
290
+ await self.server.list_tools()
291
+
292
+ @patch('pygeai.proxy.servers.stdio_client')
293
+ @patch('pygeai.proxy.servers.StdioServerParameters')
294
+ async def test_list_tools_success(self, mock_stdio_params, mock_stdio_client):
295
+ """Test successful tool listing."""
296
+ # Mock initialization
297
+ mock_params = Mock()
298
+ mock_stdio_params.return_value = mock_params
299
+
300
+ mock_context = AsyncMock()
301
+ mock_context.__aenter__.return_value = ("read", "write")
302
+ mock_stdio_client.return_value = mock_context
303
+
304
+ # Patch ClientSession to return a mock session with async context
305
+ mock_session = AsyncMock()
306
+ mock_session.initialize = AsyncMock()
307
+ # list_tools debe devolver una lista de tuplas con 'tools'
308
+ mock_tool = SimpleNamespace(name="test_tool", description="Test tool description", inputSchema={"type": "object"})
309
+ mock_session.list_tools = AsyncMock(return_value=[("tools", [mock_tool])])
310
+ mock_client_session = AsyncMock()
311
+ mock_client_session.__aenter__.return_value = mock_session
312
+ mock_client_session.__aexit__.return_value = None
313
+ with patch('pygeai.proxy.servers.ClientSession', return_value=mock_client_session):
314
+ await self.server.initialize()
315
+ tools = await self.server.list_tools()
316
+
317
+ self.assertEqual(len(tools), 1)
318
+ self.assertIsInstance(tools[0], ProxiedTool)
319
+ self.assertEqual(tools[0].name, "test_tool")
320
+ self.assertEqual(tools[0].description, "Test tool description")
321
+ self.assertEqual(tools[0].server_name, "test_mcp_server")
322
+ self.assertEqual(tools[0].public_prefix, "public.prefix")
323
+ self.assertEqual(tools[0].input_schema, {"type": "object"})
324
+
325
+ @patch('pygeai.proxy.servers.stdio_client')
326
+ @patch('pygeai.proxy.servers.StdioServerParameters')
327
+ async def test_execute_tool_success(self, mock_stdio_params, mock_stdio_client):
328
+ mock_params = Mock()
329
+ mock_stdio_params.return_value = mock_params
330
+ mock_context = AsyncMock()
331
+ mock_context.__aenter__.return_value = ("read", "write")
332
+ mock_stdio_client.return_value = mock_context
333
+ mock_session = AsyncMock()
334
+ mock_session.initialize = AsyncMock()
335
+ mock_client_session = AsyncMock()
336
+ mock_client_session.__aenter__.return_value = mock_session
337
+ mock_client_session.__aexit__.return_value = None
338
+ with patch('pygeai.proxy.servers.ClientSession', return_value=mock_client_session):
339
+ await self.server.initialize()
340
+
341
+ # Mock tool execution
342
+ mock_result = Mock()
343
+ mock_result.content = ["test result"]
344
+ mock_result.isError = False
345
+ mock_session.call_tool.return_value = mock_result
346
+
347
+ # Test tool execution
348
+ result = await self.server.execute_tool("test_tool", {"param": "value"})
349
+
350
+ self.assertEqual(result, mock_result)
351
+ mock_session.call_tool.assert_called_once_with("test_tool", {"param": "value"})
352
+
353
+ @patch('pygeai.proxy.servers.stdio_client')
354
+ @patch('pygeai.proxy.servers.StdioServerParameters')
355
+ async def test_execute_tool_with_retries(self, mock_stdio_params, mock_stdio_client):
356
+ mock_params = Mock()
357
+ mock_stdio_params.return_value = mock_params
358
+ mock_context = AsyncMock()
359
+ mock_context.__aenter__.return_value = ("read", "write")
360
+ mock_stdio_client.return_value = mock_context
361
+ mock_session = AsyncMock()
362
+ mock_session.initialize = AsyncMock()
363
+ mock_client_session = AsyncMock()
364
+ mock_client_session.__aenter__.return_value = mock_session
365
+ mock_client_session.__aexit__.return_value = None
366
+ with patch('pygeai.proxy.servers.ClientSession', return_value=mock_client_session):
367
+ await self.server.initialize()
368
+
369
+ # Mock tool execution with failure then success
370
+ mock_result = Mock()
371
+ mock_result.content = ["test result"]
372
+ mock_result.isError = False
373
+
374
+ mock_session.call_tool.side_effect = [
375
+ RuntimeError("First attempt failed"),
376
+ mock_result
377
+ ]
378
+
379
+ # Test tool execution with retries
380
+ result = await self.server.execute_tool("test_tool", {"param": "value"}, retries=2, delay=0.1)
381
+
382
+ self.assertEqual(result, mock_result)
383
+ self.assertEqual(mock_session.call_tool.call_count, 2)
384
+
385
+
386
+ if __name__ == '__main__':
387
+ unittest.main()
@@ -0,0 +1,176 @@
1
+ import unittest
2
+ import json
3
+ from pygeai.proxy.tool import ProxiedTool
4
+
5
+
6
+ class TestProxiedTool(unittest.TestCase):
7
+ """
8
+ python -m unittest pygeai.tests.proxy.test_tool.TestProxiedTool
9
+ """
10
+
11
+ def setUp(self):
12
+ """Set up test fixtures."""
13
+ self.server_name = "test_server"
14
+ self.tool_name = "test_tool"
15
+ self.description = "Test tool description"
16
+ self.public_prefix = "public.prefix"
17
+ self.input_schema = {
18
+ "type": "object",
19
+ "properties": {
20
+ "param1": {"type": "string"},
21
+ "param2": {"type": "number"}
22
+ },
23
+ "required": ["param1"]
24
+ }
25
+ self.tool = ProxiedTool(
26
+ server_name=self.server_name,
27
+ name=self.tool_name,
28
+ description=self.description,
29
+ public_prefix=self.public_prefix,
30
+ input_schema=self.input_schema
31
+ )
32
+
33
+ def test_initialization(self):
34
+ """Test tool initialization."""
35
+ self.assertEqual(self.tool.server_name, self.server_name)
36
+ self.assertEqual(self.tool.name, self.tool_name)
37
+ self.assertEqual(self.tool.description, self.description)
38
+ self.assertEqual(self.tool.public_prefix, self.public_prefix)
39
+ self.assertEqual(self.tool.input_schema, self.input_schema)
40
+
41
+ def test_get_openai_compatible_name(self):
42
+ """Test OpenAI compatible name generation."""
43
+ # Test basic name
44
+ self.assertEqual(self.tool.openai_compatible_name, "test_tool")
45
+
46
+ # Test name with spaces
47
+ tool_with_spaces = ProxiedTool(
48
+ server_name="server",
49
+ name="tool with spaces",
50
+ description="desc",
51
+ public_prefix="prefix",
52
+ input_schema={}
53
+ )
54
+ self.assertEqual(tool_with_spaces.openai_compatible_name, "tool_with_spaces")
55
+
56
+ # Test name with special characters
57
+ tool_with_special = ProxiedTool(
58
+ server_name="server",
59
+ name="tool@#$%^&*()",
60
+ description="desc",
61
+ public_prefix="prefix",
62
+ input_schema={}
63
+ )
64
+ self.assertEqual(tool_with_special.openai_compatible_name, "tool_________")
65
+
66
+ def test_get_full_name(self):
67
+ """Test getting full tool name."""
68
+ expected = f"{self.server_name}__{self.tool.openai_compatible_name}"
69
+ self.assertEqual(self.tool.get_full_name(), expected)
70
+
71
+ def test_is_public(self):
72
+ """Test public tool detection."""
73
+ # Tool with public prefix should be public
74
+ self.assertTrue(self.tool.is_public())
75
+
76
+ # Tool without public prefix should not be public
77
+ private_tool = ProxiedTool(
78
+ server_name="server",
79
+ name="tool",
80
+ description="desc",
81
+ public_prefix=None,
82
+ input_schema={}
83
+ )
84
+ self.assertFalse(private_tool.is_public())
85
+
86
+ def test_get_public_name_with_server_in_prefix(self):
87
+ """Test getting public name when server name is in prefix."""
88
+ tool = ProxiedTool(
89
+ server_name="server",
90
+ name="tool",
91
+ description="desc",
92
+ public_prefix="server.prefix",
93
+ input_schema={}
94
+ )
95
+ expected = "server.prefix.tool"
96
+ self.assertEqual(tool.get_public_name(), expected)
97
+
98
+ def test_get_public_name_with_server_not_in_prefix(self):
99
+ """Test getting public name when server name is not in prefix."""
100
+ expected = f"{self.public_prefix}.{self.tool.get_full_name()}"
101
+ self.assertEqual(self.tool.get_public_name(), expected)
102
+
103
+ def test_get_public_name_private_tool(self):
104
+ """Test getting public name for private tool."""
105
+ private_tool = ProxiedTool(
106
+ server_name="server",
107
+ name="tool",
108
+ description="desc",
109
+ public_prefix=None,
110
+ input_schema={}
111
+ )
112
+ # Should not raise exception, but behavior depends on implementation
113
+ try:
114
+ result = private_tool.get_public_name()
115
+ # If it doesn't raise, it should return some value
116
+ self.assertIsInstance(result, str)
117
+ except AttributeError:
118
+ # If it raises AttributeError, that's also acceptable
119
+ pass
120
+
121
+ def test_format_for_llm(self):
122
+ """Test formatting tool for LLM."""
123
+ result = self.tool.format_for_llm()
124
+
125
+ # Parse the JSON result
126
+ parsed = json.loads(result)
127
+
128
+ # Check structure
129
+ self.assertIn('type', parsed)
130
+ self.assertEqual(parsed['type'], 'function')
131
+
132
+ self.assertIn('function', parsed)
133
+ function_data = parsed['function']
134
+
135
+ self.assertIn('name', function_data)
136
+ self.assertEqual(function_data['name'], self.tool.get_full_name())
137
+
138
+ self.assertIn('description', function_data)
139
+ self.assertEqual(function_data['description'], self.description)
140
+
141
+ self.assertIn('parameters', function_data)
142
+ self.assertEqual(function_data['parameters'], self.input_schema)
143
+
144
+ def test_format_for_llm_with_empty_description(self):
145
+ """Test formatting tool for LLM with empty description."""
146
+ tool_empty_desc = ProxiedTool(
147
+ server_name="server",
148
+ name="tool",
149
+ description="",
150
+ public_prefix="prefix",
151
+ input_schema={}
152
+ )
153
+
154
+ result = tool_empty_desc.format_for_llm()
155
+ parsed = json.loads(result)
156
+
157
+ self.assertEqual(parsed['function']['description'], '')
158
+
159
+ def test_format_for_llm_with_none_description(self):
160
+ """Test formatting tool for LLM with None description."""
161
+ tool_none_desc = ProxiedTool(
162
+ server_name="server",
163
+ name="tool",
164
+ description=None,
165
+ public_prefix="prefix",
166
+ input_schema={}
167
+ )
168
+
169
+ result = tool_none_desc.format_for_llm()
170
+ parsed = json.loads(result)
171
+
172
+ self.assertEqual(parsed['function']['description'], '')
173
+
174
+
175
+ if __name__ == '__main__':
176
+ unittest.main()
File without changes
@@ -0,0 +1,16 @@
1
+ from pygeai.analytics.managers import AnalyticsManager
2
+
3
+ manager = AnalyticsManager()
4
+
5
+ response = manager.get_agent_usage_per_user(
6
+ start_date="2025-01-01",
7
+ end_date="2026-01-31"
8
+ )
9
+
10
+ print("Agent usage per user:")
11
+ for user in response.agentUsagePerUser:
12
+ print(f"User: {user.userName or user.userId}")
13
+ print(f" Requests: {user.totalRequests}")
14
+ print(f" Tokens: {user.totalTokens}")
15
+ print(f" Cost: ${user.totalCost:.2f}")
16
+ print()
@@ -0,0 +1,11 @@
1
+ from pygeai.analytics.managers import AnalyticsManager
2
+
3
+ manager = AnalyticsManager()
4
+
5
+ response = manager.get_agents_created_and_modified(
6
+ start_date="2025-01-01",
7
+ end_date="2026-01-31"
8
+ )
9
+
10
+ print(f"Created agents: {response.createdAgents}")
11
+ print(f"Modified agents: {response.modifiedAgents}")
@@ -0,0 +1,10 @@
1
+ from pygeai.analytics.managers import AnalyticsManager
2
+
3
+ manager = AnalyticsManager()
4
+
5
+ response = manager.get_average_cost_per_request(
6
+ start_date="2025-01-01",
7
+ end_date="2026-01-31"
8
+ )
9
+
10
+ print(f"Average cost per request: ${response.averageCost:.4f}")
@@ -0,0 +1,10 @@
1
+ from pygeai.analytics.managers import AnalyticsManager
2
+
3
+ manager = AnalyticsManager()
4
+
5
+ response = manager.get_overall_error_rate(
6
+ start_date="2025-01-01",
7
+ end_date="2026-01-31"
8
+ )
9
+
10
+ print(f"Overall error rate: {response.errorRate:.2%}")
@@ -0,0 +1,12 @@
1
+ from pygeai.analytics.managers import AnalyticsManager
2
+
3
+ manager = AnalyticsManager()
4
+
5
+ response = manager.get_top_10_agents_by_requests(
6
+ start_date="2025-01-01",
7
+ end_date="2026-01-31"
8
+ )
9
+
10
+ print("Top 10 agents by requests:")
11
+ for idx, agent in enumerate(response.topAgents, 1):
12
+ print(f"{idx}. {agent.agentName}: {agent.totalRequests} requests")
@@ -0,0 +1,10 @@
1
+ from pygeai.analytics.managers import AnalyticsManager
2
+
3
+ manager = AnalyticsManager()
4
+
5
+ response = manager.get_total_active_users(
6
+ start_date="2025-01-01",
7
+ end_date="2026-01-31"
8
+ )
9
+
10
+ print(f"Total active users: {response.totalActiveUsers}")
@@ -0,0 +1,10 @@
1
+ from pygeai.analytics.managers import AnalyticsManager
2
+
3
+ manager = AnalyticsManager()
4
+
5
+ response = manager.get_total_cost(
6
+ start_date="2025-01-01",
7
+ end_date="2026-01-31"
8
+ )
9
+
10
+ print(f"Total cost: ${response.totalCost:.2f}")
@@ -0,0 +1,12 @@
1
+ from pygeai.analytics.managers import AnalyticsManager
2
+
3
+ manager = AnalyticsManager()
4
+
5
+ response = manager.get_total_requests_per_day(
6
+ start_date="2025-01-01",
7
+ end_date="2026-01-31"
8
+ )
9
+
10
+ print("Requests per day:")
11
+ for item in response.requestsPerDay:
12
+ print(f" Date: {item.date}, Total: {item.totalRequests}, Errors: {item.totalRequestsWithError}")
@@ -0,0 +1,12 @@
1
+ from pygeai.analytics.managers import AnalyticsManager
2
+
3
+ manager = AnalyticsManager()
4
+
5
+ response = manager.get_total_tokens(
6
+ start_date="2025-01-01",
7
+ end_date="2026-01-31"
8
+ )
9
+
10
+ print(f"Total input tokens: {response.totalInputTokens}")
11
+ print(f"Total output tokens: {response.totalOutputTokens}")
12
+ print(f"Total tokens: {response.totalTokens}")
File without changes