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,327 @@
1
+ import logging
2
+
3
+ from collections.abc import AsyncIterable
4
+
5
+ from a2a.server.context import ServerCallContext
6
+ from a2a.server.request_handlers.request_handler import RequestHandler
7
+ from a2a.server.request_handlers.response_helpers import prepare_response_object
8
+ from a2a.types import (
9
+ AgentCard,
10
+ CancelTaskRequest,
11
+ CancelTaskResponse,
12
+ CancelTaskSuccessResponse,
13
+ GetTaskPushNotificationConfigRequest,
14
+ GetTaskPushNotificationConfigResponse,
15
+ GetTaskPushNotificationConfigSuccessResponse,
16
+ GetTaskRequest,
17
+ GetTaskResponse,
18
+ GetTaskSuccessResponse,
19
+ InternalError,
20
+ JSONRPCErrorResponse,
21
+ Message,
22
+ SendMessageRequest,
23
+ SendMessageResponse,
24
+ SendMessageSuccessResponse,
25
+ SendStreamingMessageRequest,
26
+ SendStreamingMessageResponse,
27
+ SendStreamingMessageSuccessResponse,
28
+ SetTaskPushNotificationConfigRequest,
29
+ SetTaskPushNotificationConfigResponse,
30
+ SetTaskPushNotificationConfigSuccessResponse,
31
+ Task,
32
+ TaskArtifactUpdateEvent,
33
+ TaskNotFoundError,
34
+ TaskPushNotificationConfig,
35
+ TaskResubscriptionRequest,
36
+ TaskStatusUpdateEvent,
37
+ )
38
+ from a2a.utils.errors import ServerError
39
+ from a2a.utils.helpers import validate
40
+ from a2a.utils.telemetry import SpanKind, trace_class
41
+
42
+
43
+ logger = logging.getLogger(__name__)
44
+
45
+
46
+ @trace_class(kind=SpanKind.SERVER)
47
+ class JSONRPCHandler:
48
+ """Maps incoming JSON-RPC requests to the appropriate request handler method and formats responses."""
49
+
50
+ def __init__(
51
+ self,
52
+ agent_card: AgentCard,
53
+ request_handler: RequestHandler,
54
+ ):
55
+ """Initializes the JSONRPCHandler.
56
+
57
+ Args:
58
+ agent_card: The AgentCard describing the agent's capabilities.
59
+ request_handler: The underlying `RequestHandler` instance to delegate requests to.
60
+ """
61
+ self.agent_card = agent_card
62
+ self.request_handler = request_handler
63
+
64
+ async def on_message_send(
65
+ self,
66
+ request: SendMessageRequest,
67
+ context: ServerCallContext | None = None,
68
+ ) -> SendMessageResponse:
69
+ """Handles the 'message/send' JSON-RPC method.
70
+
71
+ Args:
72
+ request: The incoming `SendMessageRequest` object.
73
+ context: Context provided by the server.
74
+
75
+ Returns:
76
+ A `SendMessageResponse` object containing the result (Task or Message)
77
+ or a JSON-RPC error response if a `ServerError` is raised by the handler.
78
+ """
79
+ # TODO: Wrap in error handler to return error states
80
+ try:
81
+ task_or_message = await self.request_handler.on_message_send(
82
+ request.params, context
83
+ )
84
+ return prepare_response_object(
85
+ request.id,
86
+ task_or_message,
87
+ (Task, Message),
88
+ SendMessageSuccessResponse,
89
+ SendMessageResponse,
90
+ )
91
+ except ServerError as e:
92
+ return SendMessageResponse(
93
+ root=JSONRPCErrorResponse(
94
+ id=request.id, error=e.error if e.error else InternalError()
95
+ )
96
+ )
97
+
98
+ @validate(
99
+ lambda self: self.agent_card.capabilities.streaming,
100
+ 'Streaming is not supported by the agent',
101
+ )
102
+ async def on_message_send_stream(
103
+ self,
104
+ request: SendStreamingMessageRequest,
105
+ context: ServerCallContext | None = None,
106
+ ) -> AsyncIterable[SendStreamingMessageResponse]:
107
+ """Handles the 'message/stream' JSON-RPC method.
108
+
109
+ Yields response objects as they are produced by the underlying handler's stream.
110
+
111
+ Args:
112
+ request: The incoming `SendStreamingMessageRequest` object.
113
+ context: Context provided by the server.
114
+
115
+ Yields:
116
+ `SendStreamingMessageResponse` objects containing streaming events
117
+ (Task, Message, TaskStatusUpdateEvent, TaskArtifactUpdateEvent)
118
+ or JSON-RPC error responses if a `ServerError` is raised.
119
+ """
120
+ try:
121
+ async for event in self.request_handler.on_message_send_stream(
122
+ request.params, context
123
+ ):
124
+ yield prepare_response_object(
125
+ request.id,
126
+ event,
127
+ (
128
+ Task,
129
+ Message,
130
+ TaskArtifactUpdateEvent,
131
+ TaskStatusUpdateEvent,
132
+ ),
133
+ SendStreamingMessageSuccessResponse,
134
+ SendStreamingMessageResponse,
135
+ )
136
+ except ServerError as e:
137
+ yield SendStreamingMessageResponse(
138
+ root=JSONRPCErrorResponse(
139
+ id=request.id, error=e.error if e.error else InternalError()
140
+ )
141
+ )
142
+
143
+ async def on_cancel_task(
144
+ self,
145
+ request: CancelTaskRequest,
146
+ context: ServerCallContext | None = None,
147
+ ) -> CancelTaskResponse:
148
+ """Handles the 'tasks/cancel' JSON-RPC method.
149
+
150
+ Args:
151
+ request: The incoming `CancelTaskRequest` object.
152
+ context: Context provided by the server.
153
+
154
+ Returns:
155
+ A `CancelTaskResponse` object containing the updated Task or a JSON-RPC error.
156
+ """
157
+ try:
158
+ task = await self.request_handler.on_cancel_task(
159
+ request.params, context
160
+ )
161
+ if task:
162
+ return prepare_response_object(
163
+ request.id,
164
+ task,
165
+ (Task,),
166
+ CancelTaskSuccessResponse,
167
+ CancelTaskResponse,
168
+ )
169
+ raise ServerError(error=TaskNotFoundError())
170
+ except ServerError as e:
171
+ return CancelTaskResponse(
172
+ root=JSONRPCErrorResponse(
173
+ id=request.id, error=e.error if e.error else InternalError()
174
+ )
175
+ )
176
+
177
+ async def on_resubscribe_to_task(
178
+ self,
179
+ request: TaskResubscriptionRequest,
180
+ context: ServerCallContext | None = None,
181
+ ) -> AsyncIterable[SendStreamingMessageResponse]:
182
+ """Handles the 'tasks/resubscribe' JSON-RPC method.
183
+
184
+ Yields response objects as they are produced by the underlying handler's stream.
185
+
186
+ Args:
187
+ request: The incoming `TaskResubscriptionRequest` object.
188
+ context: Context provided by the server.
189
+
190
+ Yields:
191
+ `SendStreamingMessageResponse` objects containing streaming events
192
+ or JSON-RPC error responses if a `ServerError` is raised.
193
+ """
194
+ try:
195
+ async for event in self.request_handler.on_resubscribe_to_task(
196
+ request.params, context
197
+ ):
198
+ yield prepare_response_object(
199
+ request.id,
200
+ event,
201
+ (
202
+ Task,
203
+ Message,
204
+ TaskArtifactUpdateEvent,
205
+ TaskStatusUpdateEvent,
206
+ ),
207
+ SendStreamingMessageSuccessResponse,
208
+ SendStreamingMessageResponse,
209
+ )
210
+ except ServerError as e:
211
+ yield SendStreamingMessageResponse(
212
+ root=JSONRPCErrorResponse(
213
+ id=request.id, error=e.error if e.error else InternalError()
214
+ )
215
+ )
216
+
217
+ async def get_push_notification(
218
+ self,
219
+ request: GetTaskPushNotificationConfigRequest,
220
+ context: ServerCallContext | None = None,
221
+ ) -> GetTaskPushNotificationConfigResponse:
222
+ """Handles the 'tasks/pushNotificationConfig/get' JSON-RPC method.
223
+
224
+ Args:
225
+ request: The incoming `GetTaskPushNotificationConfigRequest` object.
226
+ context: Context provided by the server.
227
+
228
+ Returns:
229
+ A `GetTaskPushNotificationConfigResponse` object containing the config or a JSON-RPC error.
230
+ """
231
+ try:
232
+ config = (
233
+ await self.request_handler.on_get_task_push_notification_config(
234
+ request.params, context
235
+ )
236
+ )
237
+ return prepare_response_object(
238
+ request.id,
239
+ config,
240
+ (TaskPushNotificationConfig,),
241
+ GetTaskPushNotificationConfigSuccessResponse,
242
+ GetTaskPushNotificationConfigResponse,
243
+ )
244
+ except ServerError as e:
245
+ return GetTaskPushNotificationConfigResponse(
246
+ root=JSONRPCErrorResponse(
247
+ id=request.id, error=e.error if e.error else InternalError()
248
+ )
249
+ )
250
+
251
+ @validate(
252
+ lambda self: self.agent_card.capabilities.pushNotifications,
253
+ 'Push notifications are not supported by the agent',
254
+ )
255
+ async def set_push_notification(
256
+ self,
257
+ request: SetTaskPushNotificationConfigRequest,
258
+ context: ServerCallContext | None = None,
259
+ ) -> SetTaskPushNotificationConfigResponse:
260
+ """Handles the 'tasks/pushNotificationConfig/set' JSON-RPC method.
261
+
262
+ Requires the agent to support push notifications.
263
+
264
+ Args:
265
+ request: The incoming `SetTaskPushNotificationConfigRequest` object.
266
+ context: Context provided by the server.
267
+
268
+ Returns:
269
+ A `SetTaskPushNotificationConfigResponse` object containing the config or a JSON-RPC error.
270
+
271
+ Raises:
272
+ ServerError: If push notifications are not supported by the agent
273
+ (due to the `@validate` decorator).
274
+ """
275
+ try:
276
+ config = (
277
+ await self.request_handler.on_set_task_push_notification_config(
278
+ request.params, context
279
+ )
280
+ )
281
+ return prepare_response_object(
282
+ request.id,
283
+ config,
284
+ (TaskPushNotificationConfig,),
285
+ SetTaskPushNotificationConfigSuccessResponse,
286
+ SetTaskPushNotificationConfigResponse,
287
+ )
288
+ except ServerError as e:
289
+ return SetTaskPushNotificationConfigResponse(
290
+ root=JSONRPCErrorResponse(
291
+ id=request.id, error=e.error if e.error else InternalError()
292
+ )
293
+ )
294
+
295
+ async def on_get_task(
296
+ self,
297
+ request: GetTaskRequest,
298
+ context: ServerCallContext | None = None,
299
+ ) -> GetTaskResponse:
300
+ """Handles the 'tasks/get' JSON-RPC method.
301
+
302
+ Args:
303
+ request: The incoming `GetTaskRequest` object.
304
+ context: Context provided by the server.
305
+
306
+ Returns:
307
+ A `GetTaskResponse` object containing the Task or a JSON-RPC error.
308
+ """
309
+ try:
310
+ task = await self.request_handler.on_get_task(
311
+ request.params, context
312
+ )
313
+ if task:
314
+ return prepare_response_object(
315
+ request.id,
316
+ task,
317
+ (Task,),
318
+ GetTaskSuccessResponse,
319
+ GetTaskResponse,
320
+ )
321
+ raise ServerError(error=TaskNotFoundError())
322
+ except ServerError as e:
323
+ return GetTaskResponse(
324
+ root=JSONRPCErrorResponse(
325
+ id=request.id, error=e.error if e.error else InternalError()
326
+ )
327
+ )
@@ -0,0 +1,161 @@
1
+ from abc import ABC, abstractmethod
2
+ from collections.abc import AsyncGenerator
3
+
4
+ from a2a.server.context import ServerCallContext
5
+ from a2a.server.events.event_queue import Event
6
+ from a2a.types import (
7
+ Message,
8
+ MessageSendParams,
9
+ Task,
10
+ TaskIdParams,
11
+ TaskPushNotificationConfig,
12
+ TaskQueryParams,
13
+ UnsupportedOperationError,
14
+ )
15
+ from a2a.utils.errors import ServerError
16
+
17
+
18
+ class RequestHandler(ABC):
19
+ """A2A request handler interface.
20
+
21
+ This interface defines the methods that an A2A server implementation must
22
+ provide to handle incoming JSON-RPC requests.
23
+ """
24
+
25
+ @abstractmethod
26
+ async def on_get_task(
27
+ self,
28
+ params: TaskQueryParams,
29
+ context: ServerCallContext | None = None,
30
+ ) -> Task | None:
31
+ """Handles the 'tasks/get' method.
32
+
33
+ Retrieves the state and history of a specific task.
34
+
35
+ Args:
36
+ params: Parameters specifying the task ID and optionally history length.
37
+ context: Context provided by the server.
38
+
39
+ Returns:
40
+ The `Task` object if found, otherwise `None`.
41
+ """
42
+
43
+ @abstractmethod
44
+ async def on_cancel_task(
45
+ self,
46
+ params: TaskIdParams,
47
+ context: ServerCallContext | None = None,
48
+ ) -> Task | None:
49
+ """Handles the 'tasks/cancel' method.
50
+
51
+ Requests the agent to cancel an ongoing task.
52
+
53
+ Args:
54
+ params: Parameters specifying the task ID.
55
+ context: Context provided by the server.
56
+
57
+ Returns:
58
+ The `Task` object with its status updated to canceled, or `None` if the task was not found.
59
+ """
60
+
61
+ @abstractmethod
62
+ async def on_message_send(
63
+ self,
64
+ params: MessageSendParams,
65
+ context: ServerCallContext | None = None,
66
+ ) -> Task | Message:
67
+ """Handles the 'message/send' method (non-streaming).
68
+
69
+ Sends a message to the agent to create, continue, or restart a task,
70
+ and waits for the final result (Task or Message).
71
+
72
+ Args:
73
+ params: Parameters including the message and configuration.
74
+ context: Context provided by the server.
75
+
76
+ Returns:
77
+ The final `Task` object or a final `Message` object.
78
+ """
79
+
80
+ @abstractmethod
81
+ async def on_message_send_stream(
82
+ self,
83
+ params: MessageSendParams,
84
+ context: ServerCallContext | None = None,
85
+ ) -> AsyncGenerator[Event]:
86
+ """Handles the 'message/stream' method (streaming).
87
+
88
+ Sends a message to the agent and yields stream events as they are
89
+ produced (Task updates, Message chunks, Artifact updates).
90
+
91
+ Args:
92
+ params: Parameters including the message and configuration.
93
+ context: Context provided by the server.
94
+
95
+ Yields:
96
+ `Event` objects from the agent's execution.
97
+
98
+ Raises:
99
+ ServerError(UnsupportedOperationError): By default, if not implemented.
100
+ """
101
+ raise ServerError(error=UnsupportedOperationError())
102
+ yield
103
+
104
+ @abstractmethod
105
+ async def on_set_task_push_notification_config(
106
+ self,
107
+ params: TaskPushNotificationConfig,
108
+ context: ServerCallContext | None = None,
109
+ ) -> TaskPushNotificationConfig:
110
+ """Handles the 'tasks/pushNotificationConfig/set' method.
111
+
112
+ Sets or updates the push notification configuration for a task.
113
+
114
+ Args:
115
+ params: Parameters including the task ID and push notification configuration.
116
+ context: Context provided by the server.
117
+
118
+ Returns:
119
+ The provided `TaskPushNotificationConfig` upon success.
120
+ """
121
+
122
+ @abstractmethod
123
+ async def on_get_task_push_notification_config(
124
+ self,
125
+ params: TaskIdParams,
126
+ context: ServerCallContext | None = None,
127
+ ) -> TaskPushNotificationConfig:
128
+ """Handles the 'tasks/pushNotificationConfig/get' method.
129
+
130
+ Retrieves the current push notification configuration for a task.
131
+
132
+ Args:
133
+ params: Parameters including the task ID.
134
+ context: Context provided by the server.
135
+
136
+ Returns:
137
+ The `TaskPushNotificationConfig` for the task.
138
+ """
139
+
140
+ @abstractmethod
141
+ async def on_resubscribe_to_task(
142
+ self,
143
+ params: TaskIdParams,
144
+ context: ServerCallContext | None = None,
145
+ ) -> AsyncGenerator[Event]:
146
+ """Handles the 'tasks/resubscribe' method.
147
+
148
+ Allows a client to re-subscribe to a running streaming task's event stream.
149
+
150
+ Args:
151
+ params: Parameters including the task ID.
152
+ context: Context provided by the server.
153
+
154
+ Yields:
155
+ `Event` objects from the agent's ongoing execution for the specified task.
156
+
157
+ Raises:
158
+ ServerError(UnsupportedOperationError): By default, if not implemented.
159
+ """
160
+ raise ServerError(error=UnsupportedOperationError())
161
+ yield
@@ -0,0 +1,133 @@
1
+ """Helper functions for building A2A JSON-RPC responses."""
2
+
3
+ # response types
4
+ from typing import TypeVar
5
+
6
+ from a2a.types import (
7
+ A2AError,
8
+ CancelTaskResponse,
9
+ CancelTaskSuccessResponse,
10
+ GetTaskPushNotificationConfigResponse,
11
+ GetTaskPushNotificationConfigSuccessResponse,
12
+ GetTaskResponse,
13
+ GetTaskSuccessResponse,
14
+ InvalidAgentResponseError,
15
+ JSONRPCError,
16
+ JSONRPCErrorResponse,
17
+ Message,
18
+ SendMessageResponse,
19
+ SendMessageSuccessResponse,
20
+ SendStreamingMessageResponse,
21
+ SendStreamingMessageSuccessResponse,
22
+ SetTaskPushNotificationConfigResponse,
23
+ SetTaskPushNotificationConfigSuccessResponse,
24
+ Task,
25
+ TaskArtifactUpdateEvent,
26
+ TaskPushNotificationConfig,
27
+ TaskStatusUpdateEvent,
28
+ )
29
+
30
+
31
+ RT = TypeVar(
32
+ 'RT',
33
+ GetTaskResponse,
34
+ CancelTaskResponse,
35
+ SendMessageResponse,
36
+ SetTaskPushNotificationConfigResponse,
37
+ GetTaskPushNotificationConfigResponse,
38
+ SendStreamingMessageResponse,
39
+ )
40
+ """Type variable for RootModel response types."""
41
+
42
+ # success types
43
+ SPT = TypeVar(
44
+ 'SPT',
45
+ GetTaskSuccessResponse,
46
+ CancelTaskSuccessResponse,
47
+ SendMessageSuccessResponse,
48
+ SetTaskPushNotificationConfigSuccessResponse,
49
+ GetTaskPushNotificationConfigSuccessResponse,
50
+ SendStreamingMessageSuccessResponse,
51
+ )
52
+ """Type variable for SuccessResponse types."""
53
+
54
+ # result types
55
+ EventTypes = (
56
+ Task
57
+ | Message
58
+ | TaskArtifactUpdateEvent
59
+ | TaskStatusUpdateEvent
60
+ | TaskPushNotificationConfig
61
+ | A2AError
62
+ | JSONRPCError
63
+ )
64
+ """Type alias for possible event types produced by handlers."""
65
+
66
+
67
+ def build_error_response(
68
+ request_id: str | int | None,
69
+ error: A2AError | JSONRPCError,
70
+ response_wrapper_type: type[RT],
71
+ ) -> RT:
72
+ """Helper method to build a JSONRPCErrorResponse wrapped in the appropriate response type.
73
+
74
+ Args:
75
+ request_id: The ID of the request that caused the error.
76
+ error: The A2AError or JSONRPCError object.
77
+ response_wrapper_type: The Pydantic RootModel type that wraps the response
78
+ for the specific RPC method (e.g., `SendMessageResponse`).
79
+
80
+ Returns:
81
+ A Pydantic model representing the JSON-RPC error response,
82
+ wrapped in the specified response type.
83
+ """
84
+ return response_wrapper_type(
85
+ JSONRPCErrorResponse(
86
+ id=request_id,
87
+ error=error.root if isinstance(error, A2AError) else error,
88
+ )
89
+ )
90
+
91
+
92
+ def prepare_response_object(
93
+ request_id: str | int | None,
94
+ response: EventTypes,
95
+ success_response_types: tuple[type, ...],
96
+ success_payload_type: type[SPT],
97
+ response_type: type[RT],
98
+ ) -> RT:
99
+ """Helper method to build appropriate JSONRPCResponse object for RPC methods.
100
+
101
+ Based on the type of the `response` object received from the handler,
102
+ it constructs either a success response wrapped in the appropriate payload type
103
+ or an error response.
104
+
105
+ Args:
106
+ request_id: The ID of the request.
107
+ response: The object received from the request handler.
108
+ success_response_types: A tuple of expected Pydantic model types for a successful result.
109
+ success_payload_type: The Pydantic model type for the success payload
110
+ (e.g., `SendMessageSuccessResponse`).
111
+ response_type: The Pydantic RootModel type that wraps the final response
112
+ (e.g., `SendMessageResponse`).
113
+
114
+ Returns:
115
+ A Pydantic model representing the final JSON-RPC response (success or error).
116
+ """
117
+ if isinstance(response, success_response_types):
118
+ return response_type(
119
+ root=success_payload_type(id=request_id, result=response) # type:ignore
120
+ )
121
+
122
+ if isinstance(response, A2AError | JSONRPCError):
123
+ return build_error_response(request_id, response, response_type)
124
+
125
+ # If consumer_data is not an expected success type and not an error,
126
+ # it's an invalid type of response from the agent for this specific method.
127
+ response = A2AError(
128
+ root=InvalidAgentResponseError(
129
+ message='Agent returned invalid type response for this method'
130
+ )
131
+ )
132
+
133
+ return build_error_response(request_id, response, response_type)
@@ -0,0 +1,20 @@
1
+ """Components for managing tasks within the A2A server."""
2
+
3
+ from a2a.server.tasks.inmemory_push_notifier import InMemoryPushNotifier
4
+ from a2a.server.tasks.inmemory_task_store import InMemoryTaskStore
5
+ from a2a.server.tasks.push_notifier import PushNotifier
6
+ from a2a.server.tasks.result_aggregator import ResultAggregator
7
+ from a2a.server.tasks.task_manager import TaskManager
8
+ from a2a.server.tasks.task_store import TaskStore
9
+ from a2a.server.tasks.task_updater import TaskUpdater
10
+
11
+
12
+ __all__ = [
13
+ 'InMemoryPushNotifier',
14
+ 'InMemoryTaskStore',
15
+ 'PushNotifier',
16
+ 'ResultAggregator',
17
+ 'TaskManager',
18
+ 'TaskStore',
19
+ 'TaskUpdater',
20
+ ]
@@ -0,0 +1,62 @@
1
+ import asyncio
2
+ import logging
3
+
4
+ import httpx
5
+
6
+ from a2a.server.tasks.push_notifier import PushNotifier
7
+ from a2a.types import PushNotificationConfig, Task
8
+
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ class InMemoryPushNotifier(PushNotifier):
14
+ """In-memory implementation of PushNotifier interface.
15
+
16
+ Stores push notification configurations in memory and uses an httpx client
17
+ to send notifications.
18
+ """
19
+
20
+ def __init__(self, httpx_client: httpx.AsyncClient) -> None:
21
+ """Initializes the InMemoryPushNotifier.
22
+
23
+ Args:
24
+ httpx_client: An async HTTP client instance to send notifications.
25
+ """
26
+ self._client = httpx_client
27
+ self.lock = asyncio.Lock()
28
+ self._push_notification_infos: dict[str, PushNotificationConfig] = {}
29
+
30
+ async def set_info(
31
+ self, task_id: str, notification_config: PushNotificationConfig
32
+ ) -> None:
33
+ """Sets or updates the push notification configuration for a task in memory."""
34
+ async with self.lock:
35
+ self._push_notification_infos[task_id] = notification_config
36
+
37
+ async def get_info(self, task_id: str) -> PushNotificationConfig | None:
38
+ """Retrieves the push notification configuration for a task from memory."""
39
+ async with self.lock:
40
+ return self._push_notification_infos.get(task_id)
41
+
42
+ async def delete_info(self, task_id: str) -> None:
43
+ """Deletes the push notification configuration for a task from memory."""
44
+ async with self.lock:
45
+ if task_id in self._push_notification_infos:
46
+ del self._push_notification_infos[task_id]
47
+
48
+ async def send_notification(self, task: Task) -> None:
49
+ """Sends a push notification for a task if configuration exists."""
50
+ push_info = await self.get_info(task.id)
51
+ if not push_info:
52
+ return
53
+ url = push_info.url
54
+
55
+ try:
56
+ response = await self._client.post(
57
+ url, json=task.model_dump(mode='json', exclude_none=True)
58
+ )
59
+ response.raise_for_status()
60
+ logger.info(f'Push-notification sent for URL: {url}')
61
+ except Exception as e:
62
+ logger.error(f'Error sending push-notification: {e}')