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.
Files changed (648) hide show
  1. pygeai/__init__.py +9 -1
  2. pygeai/_docs/Makefile +20 -0
  3. pygeai/_docs/make.bat +35 -0
  4. pygeai/_docs/source/conf.py +117 -0
  5. pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
  6. pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
  7. pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
  8. pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
  9. pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
  10. pygeai/_docs/source/content/ai_lab.rst +102 -0
  11. pygeai/_docs/source/content/analytics.rst +598 -0
  12. pygeai/_docs/source/content/api_reference/admin.rst +161 -0
  13. pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
  14. pygeai/_docs/source/content/api_reference/auth.rst +379 -0
  15. pygeai/_docs/source/content/api_reference/chat.rst +754 -0
  16. pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
  17. pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
  18. pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
  19. pygeai/_docs/source/content/api_reference/files.rst +592 -0
  20. pygeai/_docs/source/content/api_reference/gam.rst +401 -0
  21. pygeai/_docs/source/content/api_reference/health.rst +58 -0
  22. pygeai/_docs/source/content/api_reference/project.rst +738 -0
  23. pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
  24. pygeai/_docs/source/content/api_reference/rag.rst +710 -0
  25. pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
  26. pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
  27. pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
  28. pygeai/_docs/source/content/api_reference.rst +58 -0
  29. pygeai/_docs/source/content/authentication.rst +295 -0
  30. pygeai/_docs/source/content/chat_gui.rst +121 -0
  31. pygeai/_docs/source/content/cli.rst +203 -0
  32. pygeai/_docs/source/content/debugger.rst +651 -0
  33. pygeai/_docs/source/content/intro.rst +67 -0
  34. pygeai/_docs/source/content/migration.rst +929 -0
  35. pygeai/_docs/source/content/modules.rst +7 -0
  36. pygeai/_docs/source/content/quickstart.rst +143 -0
  37. pygeai/_docs/source/content/samples.rst +394 -0
  38. pygeai/_docs/source/index.rst +75 -0
  39. pygeai/_docs/source/modules.rst +7 -0
  40. pygeai/_docs/source/pygeai.admin.rst +29 -0
  41. pygeai/_docs/source/pygeai.analytics.rst +53 -0
  42. pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
  43. pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
  44. pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
  45. pygeai/_docs/source/pygeai.assistant.rst +55 -0
  46. pygeai/_docs/source/pygeai.auth.rst +29 -0
  47. pygeai/_docs/source/pygeai.chat.rst +69 -0
  48. pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
  49. pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
  50. pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
  51. pygeai/_docs/source/pygeai.cli.rst +62 -0
  52. pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
  53. pygeai/_docs/source/pygeai.core.base.rst +53 -0
  54. pygeai/_docs/source/pygeai.core.common.rst +37 -0
  55. pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
  56. pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
  57. pygeai/_docs/source/pygeai.core.files.rst +61 -0
  58. pygeai/_docs/source/pygeai.core.llm.rst +29 -0
  59. pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
  60. pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
  61. pygeai/_docs/source/pygeai.core.rst +63 -0
  62. pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
  63. pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
  64. pygeai/_docs/source/pygeai.core.services.rst +37 -0
  65. pygeai/_docs/source/pygeai.core.utils.rst +37 -0
  66. pygeai/_docs/source/pygeai.dbg.rst +21 -0
  67. pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
  68. pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
  69. pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
  70. pygeai/_docs/source/pygeai.evaluation.rst +31 -0
  71. pygeai/_docs/source/pygeai.flows.rst +29 -0
  72. pygeai/_docs/source/pygeai.gam.rst +29 -0
  73. pygeai/_docs/source/pygeai.health.rst +29 -0
  74. pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
  75. pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
  76. pygeai/_docs/source/pygeai.lab.rst +65 -0
  77. pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
  78. pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
  79. pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
  80. pygeai/_docs/source/pygeai.man.man1.rst +10 -0
  81. pygeai/_docs/source/pygeai.man.rst +18 -0
  82. pygeai/_docs/source/pygeai.migration.rst +29 -0
  83. pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
  84. pygeai/_docs/source/pygeai.organization.rst +61 -0
  85. pygeai/_docs/source/pygeai.proxy.rst +53 -0
  86. pygeai/_docs/source/pygeai.rst +35 -0
  87. pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
  88. pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
  89. pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
  90. pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
  91. pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
  92. pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
  93. pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
  94. pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
  95. pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
  96. pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
  97. pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
  98. pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
  99. pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
  100. pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
  101. pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
  102. pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
  103. pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
  104. pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
  105. pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
  106. pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
  107. pygeai/_docs/source/pygeai.tests.core.rst +39 -0
  108. pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
  109. pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
  110. pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
  111. pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
  112. pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
  113. pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
  114. pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
  115. pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
  116. pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
  117. pygeai/_docs/source/pygeai.tests.health.rst +21 -0
  118. pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
  119. pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
  120. pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
  121. pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
  122. pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
  123. pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
  124. pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
  125. pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
  126. pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
  127. pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
  128. pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
  129. pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
  130. pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
  131. pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
  132. pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
  133. pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
  134. pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
  135. pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
  136. pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
  137. pygeai/_docs/source/pygeai.tests.rst +33 -0
  138. pygeai/admin/clients.py +14 -11
  139. pygeai/admin/endpoints.py +2 -2
  140. pygeai/analytics/clients.py +505 -0
  141. pygeai/analytics/endpoints.py +35 -0
  142. pygeai/analytics/managers.py +606 -0
  143. pygeai/analytics/mappers.py +207 -0
  144. pygeai/analytics/responses.py +240 -0
  145. pygeai/assistant/clients.py +18 -45
  146. pygeai/assistant/data/clients.py +1 -0
  147. pygeai/assistant/data_analyst/clients.py +8 -12
  148. pygeai/assistant/managers.py +195 -157
  149. pygeai/assistant/mappers.py +4 -2
  150. pygeai/assistant/rag/clients.py +27 -67
  151. pygeai/assistant/rag/mappers.py +12 -6
  152. pygeai/assistant/rag/models.py +301 -159
  153. pygeai/auth/__init__.py +0 -0
  154. pygeai/auth/clients.py +129 -0
  155. pygeai/auth/endpoints.py +6 -0
  156. pygeai/chat/clients.py +308 -37
  157. pygeai/chat/endpoints.py +3 -0
  158. pygeai/chat/iris.py +2 -8
  159. pygeai/chat/managers.py +9 -6
  160. pygeai/chat/session.py +38 -0
  161. pygeai/chat/settings.py +6 -0
  162. pygeai/chat/ui.py +678 -0
  163. pygeai/cli/__init__.py +0 -1
  164. pygeai/cli/commands/admin.py +7 -10
  165. pygeai/cli/commands/analytics.py +533 -0
  166. pygeai/cli/commands/assistant.py +9 -9
  167. pygeai/cli/commands/auth.py +299 -0
  168. pygeai/cli/commands/base.py +71 -9
  169. pygeai/cli/commands/chat.py +676 -19
  170. pygeai/cli/commands/common.py +28 -24
  171. pygeai/cli/commands/configuration.py +66 -13
  172. pygeai/cli/commands/docs.py +105 -0
  173. pygeai/cli/commands/embeddings.py +58 -11
  174. pygeai/cli/commands/evaluation.py +38 -38
  175. pygeai/cli/commands/feedback.py +3 -4
  176. pygeai/cli/commands/files.py +7 -8
  177. pygeai/cli/commands/gam.py +85 -10
  178. pygeai/cli/commands/lab/ai_lab.py +340 -484
  179. pygeai/cli/commands/lab/options.py +8 -0
  180. pygeai/cli/commands/lab/spec.py +273 -0
  181. pygeai/cli/commands/lab/utils.py +13 -0
  182. pygeai/cli/commands/llm.py +6 -7
  183. pygeai/cli/commands/migrate.py +1064 -436
  184. pygeai/cli/commands/organization.py +516 -11
  185. pygeai/cli/commands/rag.py +13 -14
  186. pygeai/cli/commands/rerank.py +3 -5
  187. pygeai/cli/commands/secrets.py +8 -9
  188. pygeai/cli/commands/usage_limits.py +18 -20
  189. pygeai/cli/commands/validators.py +144 -1
  190. pygeai/cli/commands/version.py +4 -5
  191. pygeai/cli/error_handler.py +151 -0
  192. pygeai/cli/geai.py +170 -31
  193. pygeai/cli/geai_proxy.py +86 -25
  194. pygeai/cli/install_man.py +93 -22
  195. pygeai/cli/parsers.py +75 -25
  196. pygeai/cli/texts/help.py +265 -28
  197. pygeai/core/base/clients.py +53 -12
  198. pygeai/core/base/mappers.py +11 -2
  199. pygeai/core/base/session.py +95 -11
  200. pygeai/core/common/config.py +78 -14
  201. pygeai/core/common/exceptions.py +96 -6
  202. pygeai/core/embeddings/__init__.py +19 -0
  203. pygeai/core/embeddings/clients.py +23 -5
  204. pygeai/core/embeddings/managers.py +9 -4
  205. pygeai/core/embeddings/mappers.py +16 -2
  206. pygeai/core/embeddings/responses.py +9 -2
  207. pygeai/core/feedback/clients.py +8 -3
  208. pygeai/core/files/clients.py +23 -24
  209. pygeai/core/files/managers.py +121 -30
  210. pygeai/core/files/responses.py +4 -3
  211. pygeai/core/handlers.py +10 -1
  212. pygeai/core/llm/clients.py +22 -29
  213. pygeai/core/models.py +127 -11
  214. pygeai/core/plugins/clients.py +6 -6
  215. pygeai/core/rerank/clients.py +9 -3
  216. pygeai/core/rerank/managers.py +22 -5
  217. pygeai/core/secrets/clients.py +16 -37
  218. pygeai/core/services/response.py +18 -0
  219. pygeai/core/services/rest.py +159 -49
  220. pygeai/core/utils/__init__.py +0 -0
  221. pygeai/core/utils/console.py +83 -0
  222. pygeai/core/utils/parsers.py +32 -0
  223. pygeai/core/utils/validators.py +10 -0
  224. pygeai/dbg/__init__.py +3 -0
  225. pygeai/dbg/debugger.py +854 -14
  226. pygeai/evaluation/clients.py +7 -4
  227. pygeai/evaluation/dataset/clients.py +46 -44
  228. pygeai/evaluation/plan/clients.py +28 -26
  229. pygeai/evaluation/result/clients.py +38 -5
  230. pygeai/gam/clients.py +50 -28
  231. pygeai/gam/endpoints.py +2 -1
  232. pygeai/health/__init__.py +0 -0
  233. pygeai/health/clients.py +24 -0
  234. pygeai/health/endpoints.py +1 -0
  235. pygeai/lab/__init__.py +0 -90
  236. pygeai/lab/agents/clients.py +203 -162
  237. pygeai/lab/agents/endpoints.py +4 -0
  238. pygeai/lab/agents/mappers.py +57 -7
  239. pygeai/lab/clients.py +24 -0
  240. pygeai/lab/constants.py +3 -0
  241. pygeai/lab/managers.py +571 -541
  242. pygeai/lab/models.py +108 -19
  243. pygeai/lab/processes/clients.py +332 -340
  244. pygeai/lab/processes/mappers.py +3 -3
  245. pygeai/lab/runners.py +90 -0
  246. pygeai/lab/spec/__init__.py +0 -0
  247. pygeai/lab/spec/loader.py +24 -0
  248. pygeai/lab/spec/parsers.py +39 -0
  249. pygeai/lab/strategies/clients.py +67 -63
  250. pygeai/lab/strategies/mappers.py +1 -1
  251. pygeai/lab/tools/clients.py +85 -118
  252. pygeai/lab/tools/endpoints.py +4 -0
  253. pygeai/lab/tools/mappers.py +5 -5
  254. pygeai/man/man1/geai-proxy.1 +116 -0
  255. pygeai/man/man1/geai.1 +2580 -66
  256. pygeai/migration/__init__.py +33 -0
  257. pygeai/migration/strategies.py +468 -146
  258. pygeai/migration/tools.py +170 -3
  259. pygeai/organization/clients.py +245 -50
  260. pygeai/organization/endpoints.py +17 -8
  261. pygeai/organization/limits/clients.py +34 -32
  262. pygeai/organization/limits/managers.py +108 -49
  263. pygeai/organization/managers.py +347 -53
  264. pygeai/organization/mappers.py +102 -2
  265. pygeai/organization/responses.py +58 -1
  266. pygeai/proxy/clients.py +6 -3
  267. pygeai/proxy/config.py +14 -1
  268. pygeai/proxy/managers.py +61 -33
  269. pygeai/proxy/servers.py +196 -51
  270. pygeai/proxy/tool.py +33 -16
  271. pygeai/tests/admin/__init__.py +0 -0
  272. pygeai/tests/admin/test_clients.py +148 -0
  273. pygeai/tests/analytics/__init__.py +0 -0
  274. pygeai/tests/analytics/test_clients.py +86 -0
  275. pygeai/tests/analytics/test_managers.py +94 -0
  276. pygeai/tests/analytics/test_mappers.py +84 -0
  277. pygeai/tests/analytics/test_responses.py +73 -0
  278. pygeai/tests/assistants/rag/test_clients.py +346 -0
  279. pygeai/tests/assistants/rag/test_models.py +292 -0
  280. pygeai/tests/assistants/test_clients.py +176 -82
  281. pygeai/tests/assistants/test_managers.py +191 -57
  282. pygeai/tests/auth/__init__.py +0 -0
  283. pygeai/tests/auth/test_clients.py +289 -0
  284. pygeai/tests/auth/test_oauth.py +172 -0
  285. pygeai/tests/auth/test_session_logging.py +150 -0
  286. pygeai/tests/chat/__init__.py +0 -0
  287. pygeai/tests/chat/test_clients.py +393 -0
  288. pygeai/tests/chat/test_iris.py +38 -0
  289. pygeai/tests/chat/test_session.py +62 -0
  290. pygeai/tests/chat/test_ui.py +224 -0
  291. pygeai/tests/cli/commands/__init__.py +0 -0
  292. pygeai/tests/cli/commands/lab/__init__.py +0 -0
  293. pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
  294. pygeai/tests/cli/commands/lab/test_common.py +208 -0
  295. pygeai/tests/cli/commands/lab/test_spec.py +246 -0
  296. pygeai/tests/cli/commands/test_assistant.py +202 -0
  297. pygeai/tests/cli/commands/test_chat.py +130 -0
  298. pygeai/tests/cli/commands/test_common.py +350 -0
  299. pygeai/tests/cli/commands/test_embeddings.py +132 -0
  300. pygeai/tests/cli/commands/test_evaluation.py +656 -0
  301. pygeai/tests/cli/commands/test_feedback.py +65 -0
  302. pygeai/tests/cli/commands/test_files.py +161 -0
  303. pygeai/tests/cli/commands/test_gam.py +201 -0
  304. pygeai/tests/cli/commands/test_llm.py +114 -0
  305. pygeai/tests/cli/commands/test_migrate.py +176 -0
  306. pygeai/tests/cli/commands/test_organization.py +276 -0
  307. pygeai/tests/cli/commands/test_rag.py +266 -0
  308. pygeai/tests/cli/commands/test_rerank.py +110 -0
  309. pygeai/tests/cli/commands/test_secrets.py +171 -0
  310. pygeai/tests/cli/commands/test_show_help.py +41 -0
  311. pygeai/tests/cli/commands/test_usage_limits.py +412 -0
  312. pygeai/tests/cli/commands/test_validators.py +160 -0
  313. pygeai/tests/cli/commands/test_version.py +81 -0
  314. pygeai/tests/cli/docker/__init__.py +0 -0
  315. pygeai/tests/cli/test_credentials_flag.py +316 -0
  316. pygeai/tests/cli/test_error_handler.py +225 -0
  317. pygeai/tests/cli/test_geai_driver.py +154 -0
  318. pygeai/tests/cli/test_parsers.py +5 -5
  319. pygeai/tests/core/base/data/models.py +7 -0
  320. pygeai/tests/core/base/test_mappers.py +43 -11
  321. pygeai/tests/core/base/test_models.py +3 -1
  322. pygeai/tests/core/base/test_responses.py +53 -0
  323. pygeai/tests/core/common/__init__.py +0 -0
  324. pygeai/tests/core/common/data/__init__.py +0 -0
  325. pygeai/tests/core/common/test_config.py +186 -0
  326. pygeai/tests/core/common/test_decorators.py +69 -0
  327. pygeai/tests/core/embeddings/__init__.py +0 -0
  328. pygeai/tests/core/embeddings/test_clients.py +225 -0
  329. pygeai/tests/core/embeddings/test_managers.py +171 -0
  330. pygeai/tests/core/embeddings/test_mappers.py +142 -0
  331. pygeai/tests/core/feedback/__init__.py +0 -0
  332. pygeai/tests/core/feedback/test_clients.py +64 -0
  333. pygeai/tests/core/files/test_clients.py +128 -0
  334. pygeai/tests/core/files/test_managers.py +124 -78
  335. pygeai/tests/core/files/test_mappers.py +137 -0
  336. pygeai/tests/core/files/test_models.py +103 -0
  337. pygeai/tests/core/files/test_responses.py +122 -0
  338. pygeai/tests/core/llm/__init__.py +0 -0
  339. pygeai/tests/core/llm/test_clients.py +142 -0
  340. pygeai/tests/core/plugins/__init__.py +0 -0
  341. pygeai/tests/core/plugins/test_clients.py +66 -0
  342. pygeai/tests/core/rerank/test_clients.py +76 -0
  343. pygeai/tests/core/rerank/test_managers.py +61 -39
  344. pygeai/tests/core/secrets/__init__.py +0 -0
  345. pygeai/tests/core/secrets/test_clients.py +264 -0
  346. pygeai/tests/core/services/__init__.py +0 -0
  347. pygeai/tests/core/services/test_rest.py +273 -0
  348. pygeai/tests/core/test_handlers.py +66 -0
  349. pygeai/tests/core/utils/__init__.py +0 -0
  350. pygeai/tests/core/utils/test_console.py +80 -0
  351. pygeai/tests/dbg/__init__.py +0 -0
  352. pygeai/tests/dbg/test_debugger.py +591 -0
  353. pygeai/tests/evaluation/__init__.py +0 -0
  354. pygeai/tests/evaluation/dataset/__init__.py +0 -0
  355. pygeai/tests/evaluation/dataset/test_clients.py +265 -0
  356. pygeai/tests/evaluation/plan/__init__.py +0 -0
  357. pygeai/tests/evaluation/plan/test_clients.py +195 -0
  358. pygeai/tests/evaluation/result/__init__.py +0 -0
  359. pygeai/tests/evaluation/result/test_clients.py +66 -0
  360. pygeai/tests/gam/__init__.py +0 -0
  361. pygeai/tests/gam/test_clients.py +195 -0
  362. pygeai/tests/health/__init__.py +0 -0
  363. pygeai/tests/health/test_clients.py +41 -0
  364. pygeai/tests/integration/__init__.py +0 -0
  365. pygeai/tests/integration/assistants/__init__.py +0 -0
  366. pygeai/tests/integration/assistants/rag/__init__.py +0 -0
  367. pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
  368. pygeai/tests/integration/chat/__init__.py +0 -0
  369. pygeai/tests/integration/chat/test_generate_image.py +158 -0
  370. pygeai/tests/integration/lab/__init__.py +0 -0
  371. pygeai/tests/integration/lab/agents/__init__.py +0 -0
  372. pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
  373. pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
  374. pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
  375. pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
  376. pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
  377. pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
  378. pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
  379. pygeai/tests/integration/lab/processes/__init__.py +0 -0
  380. pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
  381. pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
  382. pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
  383. pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
  384. pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
  385. pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
  386. pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
  387. pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
  388. pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
  389. pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
  390. pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
  391. pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
  392. pygeai/tests/integration/lab/tools/__init__.py +0 -0
  393. pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
  394. pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
  395. pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
  396. pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
  397. pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
  398. pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
  399. pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
  400. pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
  401. pygeai/tests/lab/agents/__init__.py +0 -0
  402. pygeai/tests/lab/agents/test_clients.py +481 -0
  403. pygeai/tests/lab/agents/test_mappers.py +440 -0
  404. pygeai/tests/lab/processes/__init__.py +0 -0
  405. pygeai/tests/lab/processes/test_clients.py +1416 -0
  406. pygeai/tests/lab/processes/test_mappers.py +1092 -0
  407. pygeai/tests/lab/spec/__init__.py +0 -0
  408. pygeai/tests/lab/spec/test_loader.py +59 -0
  409. pygeai/tests/lab/spec/test_parsers.py +182 -0
  410. pygeai/tests/lab/strategies/__init__.py +0 -0
  411. pygeai/tests/lab/strategies/test_clients.py +241 -0
  412. pygeai/tests/lab/strategies/test_mappers.py +132 -0
  413. pygeai/tests/lab/test_managers.py +553 -0
  414. pygeai/tests/lab/test_models.py +500 -3
  415. pygeai/tests/lab/tools/__init__.py +0 -0
  416. pygeai/tests/lab/tools/test_clients.py +521 -0
  417. pygeai/tests/lab/tools/test_mappers.py +198 -0
  418. pygeai/tests/migration/__init__.py +0 -0
  419. pygeai/tests/migration/test_strategies.py +405 -0
  420. pygeai/tests/migration/test_tools.py +159 -0
  421. pygeai/tests/organization/limits/test_clients.py +567 -0
  422. pygeai/tests/organization/limits/test_managers.py +298 -56
  423. pygeai/tests/organization/test_clients.py +600 -30
  424. pygeai/tests/organization/test_managers.py +424 -0
  425. pygeai/tests/organization/test_mappers.py +153 -0
  426. pygeai/tests/organization/test_responses.py +137 -0
  427. pygeai/tests/proxy/__init__.py +1 -0
  428. pygeai/tests/proxy/test_clients.py +397 -0
  429. pygeai/tests/proxy/test_config.py +171 -0
  430. pygeai/tests/proxy/test_integration.py +305 -0
  431. pygeai/tests/proxy/test_managers.py +312 -0
  432. pygeai/tests/proxy/test_servers.py +387 -0
  433. pygeai/tests/proxy/test_tool.py +176 -0
  434. pygeai/tests/snippets/analytics/__init__.py +0 -0
  435. pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
  436. pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
  437. pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
  438. pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
  439. pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
  440. pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
  441. pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
  442. pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
  443. pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
  444. pygeai/tests/snippets/auth/__init__.py +0 -0
  445. pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
  446. pygeai/tests/snippets/chat/get_response.py +15 -0
  447. pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
  448. pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
  449. pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
  450. pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
  451. pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
  452. pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
  453. pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
  454. pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
  455. pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
  456. pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
  457. pygeai/tests/snippets/dbg/__init__.py +0 -0
  458. pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
  459. pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
  460. pygeai/tests/snippets/dbg/file_debugging.py +72 -0
  461. pygeai/tests/snippets/dbg/module_debugging.py +61 -0
  462. pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
  463. pygeai/tests/snippets/dbg/stepping_example.py +40 -0
  464. pygeai/tests/snippets/embeddings/cache_example.py +31 -0
  465. pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
  466. pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
  467. pygeai/tests/snippets/embeddings/openai_example.py +30 -0
  468. pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
  469. pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
  470. pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
  471. pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
  472. pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
  473. pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
  474. pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
  475. pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
  476. pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
  477. pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
  478. pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
  479. pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
  480. pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
  481. pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
  482. pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
  483. pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
  484. pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
  485. pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
  486. pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
  487. pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
  488. pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
  489. pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
  490. pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
  491. pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
  492. pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
  493. pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
  494. pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
  495. pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
  496. pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
  497. pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
  498. pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
  499. pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
  500. pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
  501. pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
  502. pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
  503. pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
  504. pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
  505. pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
  506. pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
  507. pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
  508. pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
  509. pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
  510. pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
  511. pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
  512. pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
  513. pygeai/tests/snippets/files/delete_file.py +1 -4
  514. pygeai/tests/snippets/files/get_file_content.py +2 -4
  515. pygeai/tests/snippets/files/get_file_data.py +1 -4
  516. pygeai/tests/snippets/files/get_file_list.py +1 -6
  517. pygeai/tests/snippets/files/upload_file.py +1 -5
  518. pygeai/tests/snippets/gam/gam_access_token.py +87 -0
  519. pygeai/tests/snippets/lab/agentic_flow_example_1.py +25 -23
  520. pygeai/tests/snippets/lab/agentic_flow_example_4.py +23 -23
  521. pygeai/tests/snippets/lab/agents/create_agent.py +5 -8
  522. pygeai/tests/snippets/lab/agents/create_agent_2.py +1 -5
  523. pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
  524. pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
  525. pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
  526. pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
  527. pygeai/tests/snippets/lab/agents/delete_agent.py +1 -5
  528. pygeai/tests/snippets/lab/agents/get_agent.py +2 -11
  529. pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
  530. pygeai/tests/snippets/lab/agents/get_sharing_link.py +2 -7
  531. pygeai/tests/snippets/lab/agents/list_agents.py +4 -7
  532. pygeai/tests/snippets/lab/agents/publish_agent_revision.py +2 -6
  533. pygeai/tests/snippets/lab/agents/update_agent.py +1 -5
  534. pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
  535. pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
  536. pygeai/tests/snippets/lab/crud_ui.py +462 -0
  537. pygeai/tests/snippets/lab/processes/create_process.py +3 -5
  538. pygeai/tests/snippets/lab/processes/create_task.py +3 -5
  539. pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +10 -19
  540. pygeai/tests/snippets/lab/processes/kbs/create_kb.py +2 -5
  541. pygeai/tests/snippets/lab/processes/kbs/get_kb.py +10 -16
  542. pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +13 -20
  543. pygeai/tests/snippets/lab/processes/kbs/try_all.py +5 -7
  544. pygeai/tests/snippets/lab/processes/list_processes.py +5 -7
  545. pygeai/tests/snippets/lab/runner_1.py +1 -1
  546. pygeai/tests/snippets/lab/samples/summarize_files.py +3 -3
  547. pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +2 -5
  548. pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +2 -5
  549. pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +3 -6
  550. pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +2 -5
  551. pygeai/tests/snippets/lab/tools/create_tool.py +4 -10
  552. pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
  553. pygeai/tests/snippets/lab/tools/delete_tool.py +2 -6
  554. pygeai/tests/snippets/lab/tools/get_parameter.py +5 -7
  555. pygeai/tests/snippets/lab/tools/get_tool.py +5 -7
  556. pygeai/tests/snippets/lab/tools/list_tools.py +3 -7
  557. pygeai/tests/snippets/lab/tools/publish_tool_revision.py +3 -5
  558. pygeai/tests/snippets/lab/tools/set_parameters.py +4 -9
  559. pygeai/tests/snippets/lab/tools/update_tool.py +4 -8
  560. pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
  561. pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
  562. pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
  563. pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
  564. pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
  565. pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
  566. pygeai/tests/snippets/lab/{file_summarizer_example.py → use_cases/file_summarizer_example.py} +3 -3
  567. pygeai/tests/snippets/lab/{file_summarizer_example_2.py → use_cases/file_summarizer_example_2.py} +12 -12
  568. pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
  569. pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
  570. pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
  571. pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
  572. pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
  573. pygeai/tests/snippets/migrate/__init__.py +45 -0
  574. pygeai/tests/snippets/migrate/agent_migration.py +110 -0
  575. pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
  576. pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
  577. pygeai/tests/snippets/migrate/process_migration.py +64 -0
  578. pygeai/tests/snippets/migrate/project_migration.py +42 -0
  579. pygeai/tests/snippets/migrate/tool_migration.py +64 -0
  580. pygeai/tests/snippets/organization/add_project_member.py +10 -0
  581. pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
  582. pygeai/tests/snippets/organization/create_project.py +2 -2
  583. pygeai/tests/snippets/organization/get_memberships.py +12 -0
  584. pygeai/tests/snippets/organization/get_organization_members.py +6 -0
  585. pygeai/tests/snippets/organization/get_project_members.py +6 -0
  586. pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
  587. pygeai/tests/snippets/organization/get_project_roles.py +6 -0
  588. pygeai/vendor/a2a/__init__.py +1 -0
  589. pygeai/vendor/a2a/auth/__init__.py +0 -0
  590. pygeai/vendor/a2a/auth/user.py +31 -0
  591. pygeai/vendor/a2a/client/__init__.py +19 -0
  592. pygeai/vendor/a2a/client/client.py +425 -0
  593. pygeai/vendor/a2a/client/errors.py +33 -0
  594. pygeai/vendor/a2a/client/helpers.py +22 -0
  595. pygeai/vendor/a2a/py.typed +0 -0
  596. pygeai/vendor/a2a/server/__init__.py +1 -0
  597. pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
  598. pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
  599. pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
  600. pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
  601. pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
  602. pygeai/vendor/a2a/server/apps/__init__.py +16 -0
  603. pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
  604. pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
  605. pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
  606. pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
  607. pygeai/vendor/a2a/server/context.py +23 -0
  608. pygeai/vendor/a2a/server/events/__init__.py +21 -0
  609. pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
  610. pygeai/vendor/a2a/server/events/event_queue.py +156 -0
  611. pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
  612. pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
  613. pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
  614. pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
  615. pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
  616. pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
  617. pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
  618. pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
  619. pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
  620. pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
  621. pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
  622. pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
  623. pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
  624. pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
  625. pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
  626. pygeai/vendor/a2a/types.py +1624 -0
  627. pygeai/vendor/a2a/utils/__init__.py +40 -0
  628. pygeai/vendor/a2a/utils/artifact.py +72 -0
  629. pygeai/vendor/a2a/utils/errors.py +69 -0
  630. pygeai/vendor/a2a/utils/helpers.py +176 -0
  631. pygeai/vendor/a2a/utils/message.py +83 -0
  632. pygeai/vendor/a2a/utils/task.py +57 -0
  633. pygeai/vendor/a2a/utils/telemetry.py +299 -0
  634. pygeai-0.6.0b15.dist-info/METADATA +205 -0
  635. pygeai-0.6.0b15.dist-info/RECORD +799 -0
  636. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
  637. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/entry_points.txt +2 -1
  638. {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/licenses/LICENSE +13 -1
  639. pygeai-0.6.0b15.dist-info/top_level.txt +1 -0
  640. docs/geai-proxy/README.md +0 -145
  641. docs/source/conf.py +0 -45
  642. pygeai/tests/core/test_managers.py +0 -233
  643. pygeai-0.1.51b3.dist-info/METADATA +0 -130
  644. pygeai-0.1.51b3.dist-info/RECORD +0 -324
  645. pygeai-0.1.51b3.dist-info/top_level.txt +0 -3
  646. scripts/bump_beta_version.py +0 -56
  647. {scripts → pygeai/analytics}/__init__.py +0 -0
  648. /pygeai/tests/snippets/lab/{c_code_fixer_agent_flow.py → use_cases/c_code_fixer_agent_flow.py} +0 -0
@@ -1,254 +1,396 @@
1
1
  from datetime import datetime
2
2
  from typing import Optional, Literal, Dict, List
3
3
 
4
- from pydantic import BaseModel
4
+ from pydantic import Field, field_validator
5
5
 
6
+ from pygeai.core import CustomBaseModel
6
7
  from pygeai.core.models import ChatVariableList, Assistant, LlmSettings
7
8
 
8
9
 
9
- class DocumentMetadata(BaseModel):
10
+ class DocumentMetadata(CustomBaseModel):
10
11
  """
11
- {
12
- "key": "string",
13
- "value": "string"
14
- }
12
+ Represents metadata for a document in key-value format.
15
13
  """
16
- key: str
17
- value: str
14
+ key: str = Field(..., alias="key", description="The key of the metadata")
15
+ value: str = Field(..., alias="value", description="The value of the metadata")
18
16
 
19
17
  def to_dict(self):
20
- return {
21
- "key": self.key,
22
- "value": self.value
23
- }
18
+ return self.model_dump(by_alias=True, exclude_none=True)
24
19
 
25
20
  def __str__(self):
26
- metadata = self.to_dict()
27
- return str(metadata)
21
+ return str(self.to_dict())
28
22
 
29
23
 
30
- class Document(BaseModel):
31
- id: str
32
- chunks: str
33
- name: Optional[str] = None
34
- extension: str
35
- index_status: str
36
- metadata: Optional[List[DocumentMetadata]] = []
37
- timestamp: Optional[datetime] = None
38
- url: str
24
+ class Document(CustomBaseModel):
25
+ """
26
+ Represents a document with associated metadata and properties.
27
+ """
28
+ id: str = Field(..., alias="id", description="Unique identifier of the document")
29
+ chunks: str = Field(..., alias="chunks", description="Content chunks of the document")
30
+ name: Optional[str] = Field(None, alias="name", description="Name of the document")
31
+ extension: str = Field(..., alias="extension", description="File extension of the document")
32
+ index_status: str = Field(..., alias="indexStatus", description="Indexing status of the document")
33
+ metadata: Optional[List[DocumentMetadata]] = Field([], alias="metadata", description="List of metadata associated with the document")
34
+ timestamp: Optional[datetime] = Field(None, alias="timestamp", description="Timestamp of the document")
35
+ url: str = Field(..., alias="url", description="URL of the document")
36
+
37
+ @field_validator("metadata", mode="before")
38
+ @classmethod
39
+ def normalize_metadata(cls, value):
40
+ if isinstance(value, list):
41
+ return [DocumentMetadata.model_validate(item) if isinstance(item, dict) else item for item in value]
42
+ return value
39
43
 
40
44
  def to_dict(self):
41
- document = {
45
+ result = {
42
46
  "id": self.id,
43
47
  "chunks": self.chunks,
48
+ "name": self.name,
44
49
  "extension": self.extension,
45
50
  "indexStatus": self.index_status,
46
- "metadata": self.metadata,
51
+ "metadata": [meta.to_dict() for meta in self.metadata] if self.metadata else None,
47
52
  "timestamp": self.timestamp,
48
53
  "url": self.url
49
54
  }
50
- return document
55
+ return {k: v for k, v in result.items() if v is not None}
51
56
 
52
57
  def __str__(self):
53
- document = self.to_dict()
54
- return str(document)
58
+ return str(self.to_dict())
55
59
 
56
60
 
57
- class Search(BaseModel):
58
- k: int
59
- type: Literal["similarity", "mmr"] = "similarity"
60
- fetch_k: Optional[float] = None # Valid when using mmr type
61
- lambda_: Optional[float] = None # Valid when using mmr type
62
- prompt: str
63
- return_source_documents: bool
64
- score_threshold: float
65
- template: str
61
+ class Search(CustomBaseModel):
62
+ """
63
+ Represents search configuration for querying documents.
64
+ """
65
+ k: int = Field(..., alias="k", description="Number of results to return")
66
+ type: Literal["similarity", "mmr"] = Field("similarity", alias="type", description="Type of search algorithm to use")
67
+ fetch_k: Optional[float] = Field(None, alias="fetchK", description="Number of documents to fetch for MMR search")
68
+ lambda_: Optional[float] = Field(None, alias="lambda", description="Lambda parameter for MMR search")
69
+ prompt: str = Field(..., alias="prompt", description="Search prompt or query")
70
+ return_source_documents: bool = Field(..., alias="returnSourceDocuments", description="Whether to return source documents")
71
+ score_threshold: float = Field(..., alias="scoreThreshold", description="Score threshold for search results")
72
+ template: str = Field(..., alias="template", description="Template for formatting search results")
66
73
 
67
74
  def to_dict(self):
68
- search = {
75
+ result = {
69
76
  "k": self.k,
70
- 'type': self.type,
71
- 'prompt': self.prompt,
72
- 'returnSourceDocuments': self.return_source_documents,
73
- 'scoreThreshold': self.score_threshold,
74
- 'template': self.template
77
+ "type": self.type,
78
+ "fetchK": self.fetch_k,
79
+ "lambda": self.lambda_,
80
+ "prompt": self.prompt,
81
+ "returnSourceDocuments": self.return_source_documents,
82
+ "scoreThreshold": self.score_threshold,
83
+ "template": self.template
75
84
  }
76
- if self.fetch_k is not None:
77
- search['fetchK'] = self.fetch_k
85
+ return {k: v for k, v in result.items() if v is not None}
78
86
 
79
- if self.lambda_ is not None:
80
- search['lambda'] = self.lambda_
81
-
82
- return search
87
+ def __str__(self):
88
+ return str(self.to_dict())
83
89
 
84
90
 
85
- class RetrieverOptions(BaseModel):
86
- type: Literal["vectorStore", "multiQuery", "selfQuery", "hyde", "contextualCompression"]
87
- search_type: Optional[str] = "similarity" # Azure AISearch specific, defaults to similarity
88
- step: Optional[Literal["all", "documents"]] = "all"
89
- prompt: Optional[str] = None # Not needed when using vectorStore
91
+ class RetrieverOptions(CustomBaseModel):
92
+ """
93
+ Represents options for the retriever used in search.
94
+ """
95
+ type: Literal["vectorStore", "multiQuery", "selfQuery", "hyde", "contextualCompression"] = Field(..., alias="type", description="Type of retriever to use")
96
+ search_type: Optional[str] = Field("similarity", alias="searchType", description="Search type for Azure AISearch")
97
+ step: Optional[Literal["all", "documents"]] = Field("all", alias="step", description="Step for retrieval process")
98
+ prompt: Optional[str] = Field(None, alias="prompt", description="Custom prompt for retriever, if applicable")
90
99
 
91
100
  def to_dict(self):
92
- options = {
93
- 'type': self.type,
94
- 'step': self.step,
101
+ result = {
102
+ "type": self.type,
103
+ "searchType": self.search_type,
104
+ "step": self.step,
105
+ "prompt": self.prompt
95
106
  }
96
- if self.search_type is not None:
97
- options['searchType'] = self.search_type
107
+ return {k: v for k, v in result.items() if v is not None}
98
108
 
99
- if self.prompt is not None:
100
- options['prompt'] = self.prompt
109
+ def __str__(self):
110
+ return str(self.to_dict())
101
111
 
102
- return options
103
112
 
113
+ class ChainOptions(CustomBaseModel):
114
+ """
115
+ Represents options for the processing chain.
116
+ """
117
+ type: str = Field(..., alias="type", description="Type of processing chain")
104
118
 
105
- class ChainOptions(BaseModel):
106
- type: str
119
+ def to_dict(self):
120
+ return {"type": self.type}
107
121
 
122
+ def __str__(self):
123
+ return str(self.to_dict())
108
124
 
109
- class EmbeddingsOptions(BaseModel):
110
- dimensions: int
111
- model_name: str
112
- provider: str
113
- use_proxy: bool
114
125
 
115
- class Config:
116
- protected_namespaces = ()
126
+ class EmbeddingsOptions(CustomBaseModel):
127
+ """
128
+ Represents configuration for embeddings.
129
+ """
130
+ dimensions: int = Field(..., alias="dimensions", description="Number of dimensions for embeddings")
131
+ model_name: str = Field(..., alias="modelName", description="Name of the embedding model")
132
+ provider: str = Field(..., alias="provider", description="Provider of the embedding model")
133
+ use_proxy: Optional[bool] = Field(False, alias="useProxy", description="Whether to use a proxy for embedding requests")
117
134
 
135
+ def to_dict(self):
136
+ result = {
137
+ "dimensions": self.dimensions,
138
+ "modelName": self.model_name,
139
+ "provider": self.provider,
140
+ "useProxy": self.use_proxy
141
+ }
142
+ return {k: v for k, v in result.items() if v is not None}
118
143
 
119
- class IngestionOptions(BaseModel):
120
- geai_options: Dict
121
- llama_parse_options: Dict
122
- provider: str
144
+ def __str__(self):
145
+ return str(self.to_dict())
123
146
 
124
147
 
125
- class SearchOptions(BaseModel):
126
- history_count: int
127
- llm: LlmSettings
128
- search: Search
129
- retriever: RetrieverOptions
130
- chain: Optional[ChainOptions] = None
131
- embeddings: Optional[EmbeddingsOptions] = None
132
- ingestion: Optional[IngestionOptions] = None
133
- options: Optional[Dict] = None
134
- rerank: Optional[Dict] = None
135
- variables: Optional[ChatVariableList] = None
136
- vector_store: Optional[Dict] = None
148
+ class IngestionOptions(CustomBaseModel):
149
+ """
150
+ Represents configuration for document ingestion.
151
+ """
152
+ geai_options: Dict = Field(..., alias="geaiOptions", description="GEAI-specific ingestion options")
153
+ llama_parse_options: Dict = Field(..., alias="llamaParseOptions", description="LlamaParse-specific ingestion options")
154
+ provider: str = Field(..., alias="provider", description="Provider for ingestion")
137
155
 
138
156
  def to_dict(self):
139
- options = {
140
- 'historyCount': self.history_count,
141
- 'llm': self.llm.to_dict() if self.llm else None,
142
- 'search': self.search.to_dict() if self.search else None,
143
- 'retriever': self.retriever.to_dict() if self.retriever else None
157
+ result = {
158
+ "geaiOptions": self.geai_options,
159
+ "llamaParseOptions": self.llama_parse_options,
160
+ "provider": self.provider
144
161
  }
162
+ return {k: v for k, v in result.items() if v is not None}
145
163
 
146
- if self.chain is not None:
147
- options['chain'] = self.chain
148
-
149
- if self.embeddings is not None:
150
- options['embeddings'] = self.embeddings
151
-
152
- if self.ingestion is not None:
153
- options['ingestion'] = self.ingestion
154
-
155
- if self.options is not None:
156
- options['options'] = self.options
164
+ def __str__(self):
165
+ return str(self.to_dict())
157
166
 
158
- if self.rerank is not None:
159
- options['rerank'] = self.rerank
160
167
 
161
- if self.variables is not None:
162
- options['variables'] = self.variables
168
+ class SearchOptions(CustomBaseModel):
169
+ """
170
+ Represents comprehensive search options for RAG.
171
+ """
172
+ history_count: int = Field(..., alias="historyCount", description="Number of history items to consider")
173
+ llm: LlmSettings = Field(..., alias="llm", description="LLM settings for search")
174
+ search: Search = Field(..., alias="search", description="Search configuration")
175
+ retriever: RetrieverOptions = Field(..., alias="retriever", description="Retriever configuration")
176
+ chain: Optional[ChainOptions] = Field(None, alias="chain", description="Chain configuration")
177
+ embeddings: Optional[EmbeddingsOptions] = Field(None, alias="embeddings", description="Embeddings configuration")
178
+ ingestion: Optional[IngestionOptions] = Field(None, alias="ingestion", description="Ingestion configuration")
179
+ options: Optional[Dict] = Field(None, alias="options", description="Additional options")
180
+ rerank: Optional[Dict] = Field(None, alias="rerank", description="Rerank configuration")
181
+ variables: Optional[ChatVariableList] = Field(None, alias="variables", description="Variables for search")
182
+ vector_store: Optional[Dict] = Field(None, alias="vectorStore", description="Vector store configuration")
183
+
184
+ @field_validator("search", mode="before")
185
+ @classmethod
186
+ def normalize_search(cls, value):
187
+ if isinstance(value, dict):
188
+ return Search.model_validate(value)
189
+ return value
190
+
191
+ @field_validator("retriever", mode="before")
192
+ @classmethod
193
+ def normalize_retriever(cls, value):
194
+ if isinstance(value, dict):
195
+ return RetrieverOptions.model_validate(value)
196
+ return value
197
+
198
+ @field_validator("chain", mode="before")
199
+ @classmethod
200
+ def normalize_chain(cls, value):
201
+ if isinstance(value, dict):
202
+ return ChainOptions.model_validate(value)
203
+ return value
204
+
205
+ @field_validator("embeddings", mode="before")
206
+ @classmethod
207
+ def normalize_embeddings(cls, value):
208
+ if isinstance(value, dict):
209
+ return EmbeddingsOptions.model_validate(value)
210
+ return value
211
+
212
+ @field_validator("ingestion", mode="before")
213
+ @classmethod
214
+ def normalize_ingestion(cls, value):
215
+ if isinstance(value, dict):
216
+ return IngestionOptions.model_validate(value)
217
+ return value
163
218
 
164
- if self.vector_store is not None:
165
- options['vectorStore'] = self.vector_store
219
+ def to_dict(self):
220
+ result = {
221
+ "historyCount": self.history_count,
222
+ "llm": self.llm.to_dict() if self.llm else None,
223
+ "search": self.search.to_dict() if self.search else None,
224
+ "retriever": self.retriever.to_dict() if self.retriever else None,
225
+ "chain": self.chain.to_dict() if self.chain else None,
226
+ "embeddings": self.embeddings.to_dict() if self.embeddings else None,
227
+ "ingestion": self.ingestion.to_dict() if self.ingestion else None,
228
+ "options": self.options,
229
+ "rerank": self.rerank,
230
+ "variables": self.variables.to_list() if self.variables else None,
231
+ "vectorStore": self.vector_store
232
+ }
233
+ return {k: v for k, v in result.items() if v is not None}
166
234
 
167
- return options
235
+ def __str__(self):
236
+ return str(self.to_dict())
168
237
 
169
238
 
170
- class ChildOptions(BaseModel):
171
- chunk_size: float
172
- chunk_overlap: float
173
- content_processing: Optional[Literal["", "clean"]] = ""
239
+ class ChildOptions(CustomBaseModel):
240
+ """
241
+ Represents options for child document processing.
242
+ """
243
+ chunk_size: float = Field(..., alias="chunkSize", description="Size of chunks for child documents")
244
+ chunk_overlap: float = Field(..., alias="chunkOverlap", description="Overlap between chunks for child documents")
245
+ content_processing: Optional[Literal["", "clean"]] = Field("", alias="contentProcessing", description="Content processing mode for child documents")
174
246
 
175
247
  def to_dict(self):
176
- options = {
177
- 'chunkSize': self.chunk_size,
178
- 'chunkOverlap': self.chunk_overlap,
248
+ result = {
249
+ "chunkSize": self.chunk_size,
250
+ "chunkOverlap": self.chunk_overlap,
251
+ "contentProcessing": self.content_processing
179
252
  }
180
- if self.content_processing is not None:
181
- options['contentProcessing'] = self.content_processing
253
+ return {k: v for k, v in result.items() if v is not None}
254
+
255
+ def __str__(self):
256
+ return str(self.to_dict())
182
257
 
183
- return options
184
258
 
259
+ class ChildDocumentOptions(CustomBaseModel):
260
+ """
261
+ Represents options for child document retrieval.
262
+ """
263
+ child_k: float = Field(..., alias="childK", description="Number of child documents to retrieve")
264
+ child: ChildOptions = Field(..., alias="child", description="Child document processing options")
185
265
 
186
- class ChildDocumentOptions(BaseModel):
187
- child_k: float
188
- child: ChildOptions
266
+ @field_validator("child", mode="before")
267
+ @classmethod
268
+ def normalize_child(cls, value):
269
+ if isinstance(value, dict):
270
+ return ChildOptions.model_validate(value)
271
+ return value
189
272
 
190
273
  def to_dict(self):
191
- return {
192
- 'childK': self.child_k,
193
- 'child': self.child.to_dict() if self.child else None
274
+ result = {
275
+ "childK": self.child_k,
276
+ "child": self.child.to_dict() if self.child else None
194
277
  }
278
+ return {k: v for k, v in result.items() if v is not None}
279
+
280
+ def __str__(self):
281
+ return str(self.to_dict())
195
282
 
196
283
 
197
- class ChunkOptions(BaseModel):
198
- chunk_overlap: int
199
- chunk_size: int
284
+ class ChunkOptions(CustomBaseModel):
285
+ """
286
+ Represents chunking options for document processing.
287
+ """
288
+ chunk_overlap: int = Field(..., alias="chunkOverlap", description="Overlap between chunks")
289
+ chunk_size: int = Field(..., alias="chunkSize", description="Size of each chunk")
200
290
 
201
291
  def to_dict(self):
202
- return {
203
- 'chunkOverlap': self.chunk_overlap,
204
- 'chunkSize': self.chunk_size
292
+ result = {
293
+ "chunkOverlap": self.chunk_overlap,
294
+ "chunkSize": self.chunk_size
205
295
  }
296
+ return {k: v for k, v in result.items() if v is not None}
206
297
 
298
+ def __str__(self):
299
+ return str(self.to_dict())
207
300
 
208
- class IndexOptions(BaseModel):
209
- chunks: ChunkOptions
210
- use_parent_document: Optional[bool] = False
211
- child_document: Optional[ChildDocumentOptions] = None # Valid if use_parent_document is true
301
+
302
+ class IndexOptions(CustomBaseModel):
303
+ """
304
+ Represents indexing options for documents.
305
+ """
306
+ chunks: ChunkOptions = Field(..., alias="chunks", description="Chunking configuration for indexing")
307
+ use_parent_document: Optional[bool] = Field(False, alias="useParentDocument", description="Whether to use parent document for indexing")
308
+ child_document: Optional[ChildDocumentOptions] = Field(None, alias="childDocument", description="Child document options if use_parent_document is True")
309
+
310
+ @field_validator("chunks", mode="before")
311
+ @classmethod
312
+ def normalize_chunks(cls, value):
313
+ if isinstance(value, dict):
314
+ return ChunkOptions.model_validate(value)
315
+ return value
316
+
317
+ @field_validator("child_document", mode="before")
318
+ @classmethod
319
+ def normalize_child_document(cls, value):
320
+ if isinstance(value, dict):
321
+ return ChildDocumentOptions.model_validate(value)
322
+ return value
212
323
 
213
324
  def to_dict(self):
214
- options = {
215
- 'chunks': self.chunks.to_dict(),
325
+ result = {
326
+ "chunks": self.chunks.to_dict() if self.chunks else None,
327
+ "useParentDocument": self.use_parent_document,
328
+ "childDocument": self.child_document.to_dict() if self.child_document else None
216
329
  }
217
- if self.use_parent_document is not None:
218
- options['useParentDocument'] = self.use_parent_document
219
-
220
- if self.child_document is not None:
221
- options['childDocument'] = self.child_document.to_dict()
330
+ return {k: v for k, v in result.items() if v is not None}
222
331
 
223
- return options
332
+ def __str__(self):
333
+ return str(self.to_dict())
224
334
 
225
335
 
226
336
  class RAGAssistant(Assistant):
227
- template: Optional[str] = None
228
- search_options: Optional[SearchOptions] = None
229
- index_options: Optional[IndexOptions] = None
337
+ """
338
+ Represents a RAG (Retrieval-Augmented Generation) assistant configuration.
339
+ """
340
+ template: Optional[str] = Field(None, alias="template", description="Template for RAG assistant responses")
341
+ search_options: Optional[SearchOptions] = Field(None, alias="searchOptions", description="Search options for RAG")
342
+ index_options: Optional[IndexOptions] = Field(None, alias="indexOptions", description="Indexing options for RAG")
343
+
344
+ @field_validator("search_options", mode="before")
345
+ @classmethod
346
+ def normalize_search_options(cls, value):
347
+ if isinstance(value, dict):
348
+ return SearchOptions.model_validate(value)
349
+ return value
350
+
351
+ @field_validator("index_options", mode="before")
352
+ @classmethod
353
+ def normalize_index_options(cls, value):
354
+ if isinstance(value, dict):
355
+ return IndexOptions.model_validate(value)
356
+ return value
230
357
 
231
358
  def to_dict(self):
232
359
  assistant = super().to_dict()
233
- assistant.update({
360
+ result = {
234
361
  "template": self.template,
235
- "searchOptions": self.search_options.to_dict(),
236
- "indexOptions": self.index_options.to_dict(),
237
- })
362
+ "searchOptions": self.search_options.to_dict() if self.search_options else None,
363
+ "indexOptions": self.index_options.to_dict() if self.index_options else None
364
+ }
365
+ assistant.update({k: v for k, v in result.items() if v is not None})
238
366
  return assistant
239
367
 
240
368
  def __str__(self):
241
- assistant = self.to_dict()
242
- return str(assistant)
369
+ return str(self.to_dict())
370
+
243
371
 
372
+ class UploadDocument(CustomBaseModel):
373
+ """
374
+ Represents a document to be uploaded.
375
+ """
376
+ path: str = Field(..., alias="path", description="Path to the document file")
377
+ upload_type: Literal["binary", "multipart"] = Field("multipart", alias="uploadType", description="Type of upload method")
378
+ metadata: Optional[dict] = Field(None, alias="metadata", description="Metadata associated with the document")
379
+ content_type: str = Field(..., alias="contentType", description="Content type of the document")
244
380
 
245
- class UploadDocument(BaseModel):
246
- path: str
247
- upload_type: Literal["binary", "multipart"] = "multipart"
248
- metadata: Optional[dict] = None
249
- content_type: str
381
+ def to_dict(self):
382
+ result = {
383
+ "path": self.path,
384
+ "uploadType": self.upload_type,
385
+ "metadata": self.metadata,
386
+ "contentType": self.content_type
387
+ }
388
+ return {k: v for k, v in result.items() if v is not None}
389
+
390
+ def __str__(self):
391
+ return str(self.to_dict())
250
392
 
251
393
 
252
394
  class UploadType:
253
395
  BINARY = "binary"
254
- MULTIPART = "multipart"
396
+ MULTIPART = "multipart"
File without changes