pygeai 0.2.7b51__tar.gz → 0.2.7b52__tar.gz

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 (497) hide show
  1. {pygeai-0.2.7b51/pygeai.egg-info → pygeai-0.2.7b52}/PKG-INFO +1 -1
  2. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/chat/clients.py +47 -1
  3. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/chat/endpoints.py +1 -0
  4. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/chat.py +95 -1
  5. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/configuration.py +26 -1
  6. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/lab/ai_lab.py +191 -0
  7. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/common/config.py +11 -0
  8. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/agents/clients.py +80 -1
  9. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/agents/endpoints.py +2 -0
  10. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/models.py +4 -0
  11. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/tools/clients.py +42 -2
  12. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/tools/endpoints.py +1 -0
  13. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/proxy/servers.py +1 -0
  14. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/proxy/tool.py +6 -3
  15. pygeai-0.2.7b52/pygeai/tests/proxy/__init__.py +1 -0
  16. pygeai-0.2.7b52/pygeai/tests/proxy/test_clients.py +395 -0
  17. pygeai-0.2.7b52/pygeai/tests/proxy/test_config.py +171 -0
  18. pygeai-0.2.7b52/pygeai/tests/proxy/test_integration.py +304 -0
  19. pygeai-0.2.7b52/pygeai/tests/proxy/test_managers.py +312 -0
  20. pygeai-0.2.7b52/pygeai/tests/proxy/test_servers.py +387 -0
  21. pygeai-0.2.7b52/pygeai/tests/proxy/test_tool.py +176 -0
  22. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/tools/create_tool.py +1 -2
  23. {pygeai-0.2.7b51 → pygeai-0.2.7b52/pygeai.egg-info}/PKG-INFO +1 -1
  24. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai.egg-info/SOURCES.txt +7 -0
  25. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pyproject.toml +1 -1
  26. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/LICENSE +0 -0
  27. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/MANIFEST.in +0 -0
  28. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/README.md +0 -0
  29. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/docs/geai-proxy/README.md +0 -0
  30. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/__init__.py +0 -0
  31. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/admin/__init__.py +0 -0
  32. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/admin/clients.py +0 -0
  33. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/admin/endpoints.py +0 -0
  34. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/assistant/__init__.py +0 -0
  35. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/assistant/clients.py +0 -0
  36. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/assistant/data/__init__.py +0 -0
  37. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/assistant/data/clients.py +0 -0
  38. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/assistant/data_analyst/__init__.py +0 -0
  39. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/assistant/data_analyst/clients.py +0 -0
  40. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/assistant/data_analyst/endpoints.py +0 -0
  41. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/assistant/endpoints.py +0 -0
  42. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/assistant/managers.py +0 -0
  43. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/assistant/mappers.py +0 -0
  44. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/assistant/rag/__init__.py +0 -0
  45. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/assistant/rag/clients.py +0 -0
  46. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/assistant/rag/endpoints.py +0 -0
  47. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/assistant/rag/mappers.py +0 -0
  48. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/assistant/rag/models.py +0 -0
  49. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/assistant/rag/responses.py +0 -0
  50. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/chat/__init__.py +0 -0
  51. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/chat/iris.py +0 -0
  52. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/chat/managers.py +0 -0
  53. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/chat/session.py +0 -0
  54. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/chat/settings.py +0 -0
  55. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/chat/ui.py +0 -0
  56. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/__init__.py +0 -0
  57. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/__main__.py +0 -0
  58. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/__init__.py +0 -0
  59. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/admin.py +0 -0
  60. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/assistant.py +0 -0
  61. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/base.py +0 -0
  62. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/builders.py +0 -0
  63. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/common.py +0 -0
  64. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/embeddings.py +0 -0
  65. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/evaluation.py +0 -0
  66. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/feedback.py +0 -0
  67. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/files.py +0 -0
  68. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/flows/__init__.py +0 -0
  69. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/gam.py +0 -0
  70. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/lab/__init__.py +0 -0
  71. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/lab/common.py +0 -0
  72. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/lab/spec.py +0 -0
  73. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/llm.py +0 -0
  74. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/migrate.py +0 -0
  75. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/options.py +0 -0
  76. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/organization.py +0 -0
  77. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/rag.py +0 -0
  78. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/rerank.py +0 -0
  79. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/secrets.py +0 -0
  80. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/usage_limits.py +0 -0
  81. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/validators.py +0 -0
  82. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/commands/version.py +0 -0
  83. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/geai.py +0 -0
  84. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/geai_proxy.py +0 -0
  85. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/install_man.py +0 -0
  86. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/parsers.py +0 -0
  87. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/texts/__init__.py +0 -0
  88. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/cli/texts/help.py +0 -0
  89. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/__init__.py +0 -0
  90. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/base/__init__.py +0 -0
  91. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/base/clients.py +0 -0
  92. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/base/mappers.py +0 -0
  93. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/base/models.py +0 -0
  94. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/base/responses.py +0 -0
  95. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/base/session.py +0 -0
  96. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/common/__init__.py +0 -0
  97. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/common/decorators.py +0 -0
  98. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/common/exceptions.py +0 -0
  99. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/embeddings/__init__.py +0 -0
  100. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/embeddings/clients.py +0 -0
  101. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/embeddings/endpoints.py +0 -0
  102. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/embeddings/managers.py +0 -0
  103. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/embeddings/mappers.py +0 -0
  104. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/embeddings/models.py +0 -0
  105. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/embeddings/responses.py +0 -0
  106. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/feedback/__init__.py +0 -0
  107. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/feedback/clients.py +0 -0
  108. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/feedback/endpoints.py +0 -0
  109. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/feedback/models.py +0 -0
  110. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/files/__init__.py +0 -0
  111. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/files/clients.py +0 -0
  112. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/files/endpoints.py +0 -0
  113. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/files/managers.py +0 -0
  114. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/files/mappers.py +0 -0
  115. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/files/models.py +0 -0
  116. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/files/responses.py +0 -0
  117. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/handlers.py +0 -0
  118. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/llm/__init__.py +0 -0
  119. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/llm/clients.py +0 -0
  120. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/llm/endpoints.py +0 -0
  121. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/models.py +0 -0
  122. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/plugins/__init__.py +0 -0
  123. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/plugins/clients.py +0 -0
  124. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/plugins/endpoints.py +0 -0
  125. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/plugins/models.py +0 -0
  126. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/rerank/__init__.py +0 -0
  127. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/rerank/clients.py +0 -0
  128. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/rerank/endpoints.py +0 -0
  129. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/rerank/managers.py +0 -0
  130. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/rerank/mappers.py +0 -0
  131. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/rerank/models.py +0 -0
  132. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/responses.py +0 -0
  133. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/secrets/__init__.py +0 -0
  134. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/secrets/clients.py +0 -0
  135. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/secrets/endpoints.py +0 -0
  136. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/services/__init__.py +0 -0
  137. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/services/llm/__init__.py +0 -0
  138. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/services/llm/model.py +0 -0
  139. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/services/llm/providers.py +0 -0
  140. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/services/response.py +0 -0
  141. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/services/rest.py +0 -0
  142. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/singleton.py +0 -0
  143. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/utils/__init__.py +0 -0
  144. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/core/utils/console.py +0 -0
  145. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/dbg/__init__.py +0 -0
  146. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/dbg/debugger.py +0 -0
  147. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/evaluation/__init__.py +0 -0
  148. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/evaluation/clients.py +0 -0
  149. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/evaluation/dataset/__init__.py +0 -0
  150. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/evaluation/dataset/clients.py +0 -0
  151. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/evaluation/dataset/endpoints.py +0 -0
  152. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/evaluation/plan/__init__.py +0 -0
  153. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/evaluation/plan/clients.py +0 -0
  154. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/evaluation/plan/endpoints.py +0 -0
  155. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/evaluation/result/__init__.py +0 -0
  156. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/evaluation/result/clients.py +0 -0
  157. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/evaluation/result/endpoints.py +0 -0
  158. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/flows/__init__.py +0 -0
  159. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/flows/endpoints.py +0 -0
  160. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/flows/models.py +0 -0
  161. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/gam/__init__.py +0 -0
  162. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/gam/clients.py +0 -0
  163. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/gam/endpoints.py +0 -0
  164. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/health/__init__.py +0 -0
  165. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/health/clients.py +0 -0
  166. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/health/endpoints.py +0 -0
  167. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/__init__.py +0 -0
  168. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/agents/__init__.py +0 -0
  169. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/agents/mappers.py +0 -0
  170. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/constants.py +0 -0
  171. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/managers.py +0 -0
  172. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/processes/__init__.py +0 -0
  173. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/processes/clients.py +0 -0
  174. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/processes/endpoints.py +0 -0
  175. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/processes/mappers.py +0 -0
  176. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/runners.py +0 -0
  177. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/spec/__init__.py +0 -0
  178. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/spec/loader.py +0 -0
  179. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/spec/parsers.py +0 -0
  180. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/strategies/__init__.py +0 -0
  181. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/strategies/clients.py +0 -0
  182. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/strategies/endpoints.py +0 -0
  183. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/strategies/mappers.py +0 -0
  184. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/tools/__init__.py +0 -0
  185. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/lab/tools/mappers.py +0 -0
  186. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/man/__init__.py +0 -0
  187. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/man/man1/__init__.py +0 -0
  188. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/man/man1/geai-proxy.1 +0 -0
  189. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/man/man1/geai.1 +0 -0
  190. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/migration/__init__.py +0 -0
  191. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/migration/strategies.py +0 -0
  192. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/migration/tools.py +0 -0
  193. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/organization/__init__.py +0 -0
  194. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/organization/clients.py +0 -0
  195. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/organization/endpoints.py +0 -0
  196. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/organization/limits/__init__.py +0 -0
  197. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/organization/limits/clients.py +0 -0
  198. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/organization/limits/endpoints.py +0 -0
  199. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/organization/limits/managers.py +0 -0
  200. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/organization/limits/mappers.py +0 -0
  201. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/organization/managers.py +0 -0
  202. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/organization/mappers.py +0 -0
  203. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/organization/responses.py +0 -0
  204. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/proxy/__init__.py +0 -0
  205. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/proxy/clients.py +0 -0
  206. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/proxy/config.py +0 -0
  207. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/proxy/managers.py +0 -0
  208. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/__init__.py +0 -0
  209. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/admin/__init__.py +0 -0
  210. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/admin/test_clients.py +0 -0
  211. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/assistants/__init__.py +0 -0
  212. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/assistants/rag/__init__.py +0 -0
  213. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/assistants/rag/test_clients.py +0 -0
  214. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/assistants/rag/test_mappers.py +0 -0
  215. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/assistants/rag/test_models.py +0 -0
  216. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/assistants/test_clients.py +0 -0
  217. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/assistants/test_managers.py +0 -0
  218. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/assistants/test_mappers.py +0 -0
  219. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/chat/__init__.py +0 -0
  220. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/chat/test_clients.py +0 -0
  221. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/chat/test_iris.py +0 -0
  222. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/chat/test_session.py +0 -0
  223. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/chat/test_ui.py +0 -0
  224. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/__init__.py +0 -0
  225. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/__init__.py +0 -0
  226. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/lab/__init__.py +0 -0
  227. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/lab/test_ai_lab.py +0 -0
  228. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/lab/test_common.py +0 -0
  229. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/lab/test_spec.py +0 -0
  230. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/test_assistant.py +0 -0
  231. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/test_chat.py +0 -0
  232. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/test_common.py +0 -0
  233. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/test_embeddings.py +0 -0
  234. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/test_feedback.py +0 -0
  235. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/test_files.py +0 -0
  236. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/test_gam.py +0 -0
  237. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/test_llm.py +0 -0
  238. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/test_migrate.py +0 -0
  239. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/test_organization.py +0 -0
  240. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/test_rag.py +0 -0
  241. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/test_rerank.py +0 -0
  242. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/test_show_help.py +0 -0
  243. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/test_usage_limits.py +0 -0
  244. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/test_validators.py +0 -0
  245. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/commands/test_version.py +0 -0
  246. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/cli/test_parsers.py +0 -0
  247. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/__init__.py +0 -0
  248. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/base/__init__.py +0 -0
  249. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/base/data/__init__.py +0 -0
  250. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/base/data/mappers.py +0 -0
  251. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/base/data/models.py +0 -0
  252. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/base/test_mappers.py +0 -0
  253. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/base/test_models.py +0 -0
  254. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/common/__init__.py +0 -0
  255. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/common/data/__init__.py +0 -0
  256. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/common/test_config.py +0 -0
  257. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/common/test_decorators.py +0 -0
  258. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/embeddings/__init__.py +0 -0
  259. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/embeddings/test_clients.py +0 -0
  260. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/feedback/__init__.py +0 -0
  261. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/feedback/test_clients.py +0 -0
  262. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/files/__init__.py +0 -0
  263. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/files/test_clients.py +0 -0
  264. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/files/test_managers.py +0 -0
  265. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/files/test_models.py +0 -0
  266. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/files/test_responses.py +0 -0
  267. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/llm/__init__.py +0 -0
  268. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/llm/test_clients.py +0 -0
  269. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/rerank/__init__.py +0 -0
  270. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/rerank/test_clients.py +0 -0
  271. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/rerank/test_managers.py +0 -0
  272. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/rerank/test_mappers.py +0 -0
  273. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/secrets/__init__.py +0 -0
  274. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/secrets/test_clients.py +0 -0
  275. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/services/__init__.py +0 -0
  276. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/services/test_rest.py +0 -0
  277. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/test_handlers.py +0 -0
  278. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/utils/__init__.py +0 -0
  279. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/core/utils/test_console.py +0 -0
  280. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/dbg/__init__.py +0 -0
  281. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/dbg/test_debugger.py +0 -0
  282. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/gam/__init__.py +0 -0
  283. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/gam/test_clients.py +0 -0
  284. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/health/__init__.py +0 -0
  285. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/health/test_clients.py +0 -0
  286. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/integration/__init__.py +0 -0
  287. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/integration/lab/__init__.py +0 -0
  288. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/integration/lab/agents/__init__.py +0 -0
  289. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/integration/lab/agents/test_agents_list.py +0 -0
  290. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/integration/lab/agents/test_create_agent.py +0 -0
  291. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/integration/lab/agents/test_create_sharing_link.py +0 -0
  292. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/integration/lab/agents/test_delete_agent.py +0 -0
  293. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/integration/lab/agents/test_get_agent.py +0 -0
  294. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +0 -0
  295. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/integration/lab/agents/test_update_agent.py +0 -0
  296. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/lab/__init__.py +0 -0
  297. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/lab/agents/__init__.py +0 -0
  298. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/lab/agents/test_clients.py +0 -0
  299. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/lab/agents/test_mappers.py +0 -0
  300. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/lab/processes/__init__.py +0 -0
  301. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/lab/processes/test_clients.py +0 -0
  302. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/lab/processes/test_mappers.py +0 -0
  303. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/lab/spec/__init__.py +0 -0
  304. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/lab/spec/test_loader.py +0 -0
  305. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/lab/spec/test_parsers.py +0 -0
  306. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/lab/strategies/__init__.py +0 -0
  307. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/lab/strategies/test_clients.py +0 -0
  308. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/lab/strategies/test_mappers.py +0 -0
  309. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/lab/test_managers.py +0 -0
  310. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/lab/test_mappers.py +0 -0
  311. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/lab/test_models.py +0 -0
  312. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/lab/tools/__init__.py +0 -0
  313. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/lab/tools/test_clients.py +0 -0
  314. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/lab/tools/test_mappers.py +0 -0
  315. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/migration/__init__.py +0 -0
  316. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/migration/test_strategies.py +0 -0
  317. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/migration/test_tools.py +0 -0
  318. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/organization/__init__.py +0 -0
  319. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/organization/limits/__init__.py +0 -0
  320. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/organization/limits/test_clients.py +0 -0
  321. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/organization/limits/test_managers.py +0 -0
  322. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/organization/test_clients.py +0 -0
  323. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/organization/test_managers.py +0 -0
  324. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/organization/test_mappers.py +0 -0
  325. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/__init__.py +0 -0
  326. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/__init__.py +0 -0
  327. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/create_chat_assistant.py +0 -0
  328. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/create_text_assistant.py +0 -0
  329. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/data_analyst/__init__.py +0 -0
  330. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/data_analyst/extend_and_check.py +0 -0
  331. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/data_analyst/extend_dataset.py +0 -0
  332. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/data_analyst/get_status.py +0 -0
  333. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/file_summarizer_assistant.py +0 -0
  334. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/get_assistant_data.py +0 -0
  335. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/get_assistant_list.py +0 -0
  336. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/rag/__init__.py +0 -0
  337. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/rag/create_rag_assistant.py +0 -0
  338. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/rag/delete_al_documents.py +0 -0
  339. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/rag/delete_document.py +0 -0
  340. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/rag/delete_rag_assistant.py +0 -0
  341. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/rag/get_document.py +0 -0
  342. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/rag/get_documents.py +0 -0
  343. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/rag/get_rag_assistant_data.py +0 -0
  344. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/rag/update_rag_assistant.py +0 -0
  345. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/rag/upload_document.py +0 -0
  346. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/send_feedback.py +0 -0
  347. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/assistants/update_chat_assistant.py +0 -0
  348. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/chat/__init__.py +0 -0
  349. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/chat/cancel_request.py +0 -0
  350. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/chat/chat_completion.py +0 -0
  351. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/chat/chat_completion_1.py +0 -0
  352. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/chat/chat_completion_2.py +0 -0
  353. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/chat/chat_completion_3.py +0 -0
  354. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/chat/chat_completion_4.py +0 -0
  355. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/chat/chat_completion_streaming.py +0 -0
  356. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/chat/get_request_status.py +0 -0
  357. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/chat/send_chat_request.py +0 -0
  358. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/embeddings/__init__.py +0 -0
  359. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/embeddings/generate_embeddings.py +0 -0
  360. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/evaluation/__init__.py +0 -0
  361. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/files/__init__.py +0 -0
  362. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/files/delete_file.py +0 -0
  363. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/files/get_file_content.py +0 -0
  364. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/files/get_file_data.py +0 -0
  365. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/files/get_file_list.py +0 -0
  366. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/files/upload_file.py +0 -0
  367. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/gam/__init__.py +0 -0
  368. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/gam/gam_access_token.py +0 -0
  369. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/__init__.py +0 -0
  370. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/agentic_flow_example_1.py +0 -0
  371. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/agentic_flow_example_2.py +0 -0
  372. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/agentic_flow_example_3.py +0 -0
  373. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/agentic_flow_example_4.py +0 -0
  374. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/agents/__init__.py +0 -0
  375. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/agents/create_agent.py +0 -0
  376. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/agents/create_agent_2.py +0 -0
  377. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/agents/delete_agent.py +0 -0
  378. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/agents/get_agent.py +0 -0
  379. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/agents/get_sharing_link.py +0 -0
  380. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/agents/list_agents.py +0 -0
  381. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/agents/publish_agent_revision.py +0 -0
  382. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/agents/update_agent.py +0 -0
  383. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/assistant_to_agent.py +0 -0
  384. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/crud_ui.py +0 -0
  385. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/processes/__init__.py +0 -0
  386. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/processes/create_process.py +0 -0
  387. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/processes/create_task.py +0 -0
  388. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/processes/jobs/__init__.py +0 -0
  389. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +0 -0
  390. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/processes/kbs/__init__.py +0 -0
  391. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/processes/kbs/create_kb.py +0 -0
  392. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/processes/kbs/get_kb.py +0 -0
  393. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +0 -0
  394. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/processes/kbs/try_all.py +0 -0
  395. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/processes/list_processes.py +0 -0
  396. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/runner_1.py +0 -0
  397. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/samples/__init__.py +0 -0
  398. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/samples/summarize_files.py +0 -0
  399. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/strategies/__init__.py +0 -0
  400. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +0 -0
  401. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +0 -0
  402. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +0 -0
  403. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +0 -0
  404. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/tools/__init__.py +0 -0
  405. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/tools/delete_tool.py +0 -0
  406. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/tools/get_parameter.py +0 -0
  407. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/tools/get_tool.py +0 -0
  408. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/tools/list_tools.py +0 -0
  409. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/tools/publish_tool_revision.py +0 -0
  410. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/tools/set_parameters.py +0 -0
  411. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/tools/update_tool.py +0 -0
  412. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
  413. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/use_cases/c_code_fixer_agent_flow.py +0 -0
  414. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +0 -0
  415. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +0 -0
  416. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +0 -0
  417. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/use_cases/create_web_designer.py +0 -0
  418. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/use_cases/create_web_reader.py +0 -0
  419. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/use_cases/file_summarizer_example.py +0 -0
  420. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/use_cases/file_summarizer_example_2.py +0 -0
  421. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +0 -0
  422. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +0 -0
  423. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/use_cases/update_web_designer.py +0 -0
  424. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/use_cases/update_web_reader.py +0 -0
  425. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +0 -0
  426. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/migrate/__init__.py +0 -0
  427. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/organization/__init__.py +0 -0
  428. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/organization/create_project.py +0 -0
  429. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/organization/delete_project.py +0 -0
  430. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/organization/export_request_data.py +0 -0
  431. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/organization/get_project_data.py +0 -0
  432. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/organization/get_project_list.py +0 -0
  433. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/organization/get_project_tokens.py +0 -0
  434. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/organization/update_project.py +0 -0
  435. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/rerank/__init__.py +0 -0
  436. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/rerank/rerank_chunks.py +0 -0
  437. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/secrets/__init__.py +0 -0
  438. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/usage_limit/__init__.py +0 -0
  439. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/usage_limit/delete_usage_limit.py +0 -0
  440. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/usage_limit/get_all_usage_limit_from_organization.py +0 -0
  441. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/usage_limit/get_usage_limit_from_organization.py +0 -0
  442. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/usage_limit/get_usage_limit_from_project.py +0 -0
  443. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/usage_limit/set_usage_limit_organization.py +0 -0
  444. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/usage_limit/set_usage_limit_project.py +0 -0
  445. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/usage_limit/update_usage_limit_organization.py +0 -0
  446. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/tests/snippets/usage_limit/update_usage_limit_project.py +0 -0
  447. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/__init__.py +0 -0
  448. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/auth/__init__.py +0 -0
  449. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/auth/user.py +0 -0
  450. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/client/__init__.py +0 -0
  451. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/client/client.py +0 -0
  452. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/client/errors.py +0 -0
  453. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/client/helpers.py +0 -0
  454. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/py.typed +0 -0
  455. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/__init__.py +0 -0
  456. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/agent_execution/__init__.py +0 -0
  457. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/agent_execution/agent_executor.py +0 -0
  458. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/agent_execution/context.py +0 -0
  459. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +0 -0
  460. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +0 -0
  461. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/apps/__init__.py +0 -0
  462. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +0 -0
  463. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +0 -0
  464. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +0 -0
  465. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +0 -0
  466. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/context.py +0 -0
  467. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/events/__init__.py +0 -0
  468. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/events/event_consumer.py +0 -0
  469. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/events/event_queue.py +0 -0
  470. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +0 -0
  471. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/events/queue_manager.py +0 -0
  472. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/request_handlers/__init__.py +0 -0
  473. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +0 -0
  474. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +0 -0
  475. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/request_handlers/request_handler.py +0 -0
  476. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/request_handlers/response_helpers.py +0 -0
  477. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/tasks/__init__.py +0 -0
  478. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +0 -0
  479. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +0 -0
  480. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/tasks/push_notifier.py +0 -0
  481. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/tasks/result_aggregator.py +0 -0
  482. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/tasks/task_manager.py +0 -0
  483. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/tasks/task_store.py +0 -0
  484. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/server/tasks/task_updater.py +0 -0
  485. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/types.py +0 -0
  486. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/utils/__init__.py +0 -0
  487. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/utils/artifact.py +0 -0
  488. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/utils/errors.py +0 -0
  489. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/utils/helpers.py +0 -0
  490. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/utils/message.py +0 -0
  491. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/utils/task.py +0 -0
  492. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai/vendor/a2a/utils/telemetry.py +0 -0
  493. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai.egg-info/dependency_links.txt +0 -0
  494. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai.egg-info/entry_points.txt +0 -0
  495. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai.egg-info/requires.txt +0 -0
  496. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/pygeai.egg-info/top_level.txt +0 -0
  497. {pygeai-0.2.7b51 → pygeai-0.2.7b52}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pygeai
3
- Version: 0.2.7b51
3
+ Version: 0.2.7b52
4
4
  Summary: Software Development Kit to interact with Globant Enterprise AI.
5
5
  Author-email: Globant <geai-sdk@globant.com>
6
6
  License-Expression: MIT
@@ -3,7 +3,7 @@ from json import JSONDecodeError
3
3
  from typing import List, Dict, Optional, Union, Generator
4
4
 
5
5
  from pygeai import logger
6
- from pygeai.chat.endpoints import CHAT_V1
6
+ from pygeai.chat.endpoints import CHAT_V1, GENERATE_IMAGE_V1
7
7
  from pygeai.core.base.clients import BaseClient
8
8
  from pygeai.core.common.exceptions import InvalidAPIResponseException
9
9
 
@@ -193,3 +193,49 @@ class ChatClient(BaseClient):
193
193
  continue
194
194
  except Exception as e:
195
195
  raise InvalidAPIResponseException(f"Unable to process streaming chat response: {e}")
196
+
197
+ def generate_image(
198
+ self,
199
+ model: str,
200
+ prompt: str,
201
+ n: int,
202
+ quality: str,
203
+ size: str,
204
+ aspect_ratio: Optional[str] = None
205
+ ) -> dict:
206
+ """
207
+ Generates an image based on the provided parameters.
208
+
209
+ :param model: str - The model specification for image generation, e.g., "openai/gpt-image-1". (Required)
210
+ :param prompt: str - Description of the desired image. (Required)
211
+ :param n: int - Number of images to generate (1-10, depending on the model). (Required)
212
+ :param quality: str - Rendering quality, e.g., "high". (Required)
213
+ :param size: str - Image dimensions, e.g., "1024x1024". (Required)
214
+ :param aspect_ratio: Optional[str] - Relationship between image’s width and height, e.g., "1:1", "9:16", "16:9", "3:4", "4:3". (Optional)
215
+ :return: dict - The API response containing the generated image data.
216
+ :raises InvalidAPIResponseException: If the API response cannot be processed.
217
+ """
218
+ data = {
219
+ 'model': model,
220
+ 'prompt': prompt,
221
+ 'n': n,
222
+ 'quality': quality,
223
+ 'size': size
224
+ }
225
+
226
+ if aspect_ratio:
227
+ data['aspect_ratio'] = aspect_ratio
228
+
229
+ logger.debug(f"Generating image with data: {data}")
230
+
231
+ response = self.api_service.post(
232
+ endpoint=GENERATE_IMAGE_V1,
233
+ data=data
234
+ )
235
+
236
+ try:
237
+ result = response.json()
238
+ logger.debug(f"Image generation result: {result}")
239
+ return result
240
+ except JSONDecodeError as e:
241
+ raise InvalidAPIResponseException(f"Unable to process image generation request: {response.text}")
@@ -1,2 +1,3 @@
1
1
  CHAT_V1 = "/chat" # POST Chat endpoint
2
2
  CHAT_COMPLETION_V1 = "/chat/completion" # POST Chat completion endpoint
3
+ GENERATE_IMAGE_V1 = "/images" # POST Generate image
@@ -565,6 +565,92 @@ chat_with_agent_options = [
565
565
  ]
566
566
 
567
567
 
568
+ def get_generate_image(option_list: list):
569
+ model = None
570
+ prompt = None
571
+ n = None
572
+ quality = None
573
+ size = None
574
+ aspect_ratio = None
575
+
576
+ for option_flag, option_arg in option_list:
577
+ if option_flag.name == "model":
578
+ model = option_arg
579
+ if option_flag.name == "prompt":
580
+ prompt = option_arg
581
+ if option_flag.name == "n":
582
+ try:
583
+ n = int(option_arg)
584
+ if n < 1 or n > 10:
585
+ raise WrongArgumentError("n must be an integer between 1 and 10.")
586
+ except ValueError:
587
+ raise WrongArgumentError("n must be a valid integer.")
588
+ if option_flag.name == "quality":
589
+ quality = option_arg
590
+ if option_flag.name == "size":
591
+ size = option_arg
592
+ if option_flag.name == "aspect_ratio":
593
+ aspect_ratio = option_arg
594
+
595
+ if not (model and prompt and n is not None and quality and size):
596
+ raise MissingRequirementException("Cannot generate image without specifying model, prompt, n, quality, and size.")
597
+
598
+ client = ChatClient()
599
+ try:
600
+ result = client.generate_image(
601
+ model=model,
602
+ prompt=prompt,
603
+ n=n,
604
+ quality=quality,
605
+ size=size,
606
+ aspect_ratio=aspect_ratio
607
+ )
608
+ Console.write_stdout(f"Image generation result: \n{result}\n")
609
+ except Exception as e:
610
+ logger.error(f"Error generating image: {e}")
611
+ Console.write_stderr(f"Failed to generate image: {e}")
612
+
613
+
614
+ generate_image_options = [
615
+ Option(
616
+ "model",
617
+ ["--model", "-m"],
618
+ "The model specification for image generation, e.g., 'openai/gpt-image-1'.",
619
+ True
620
+ ),
621
+ Option(
622
+ "prompt",
623
+ ["--prompt", "-p"],
624
+ "Description of the desired image.",
625
+ True
626
+ ),
627
+ Option(
628
+ "n",
629
+ ["--n"],
630
+ "Number of images to generate (1-10, depending on the model).",
631
+ True
632
+ ),
633
+ Option(
634
+ "quality",
635
+ ["--quality", "-q"],
636
+ "Rendering quality, e.g., 'high'.",
637
+ True
638
+ ),
639
+ Option(
640
+ "size",
641
+ ["--size", "-s"],
642
+ "Image dimensions, e.g., '1024x1024'.",
643
+ True
644
+ ),
645
+ Option(
646
+ "aspect_ratio",
647
+ ["--aspect-ratio", "-ar"],
648
+ "Relationship between image’s width and height, e.g., '1:1', '9:16', '16:9', '3:4', '4:3'.",
649
+ True
650
+ ),
651
+ ]
652
+
653
+
568
654
  chat_commands = [
569
655
  Command(
570
656
  "help",
@@ -602,6 +688,14 @@ chat_commands = [
602
688
  [],
603
689
  chat_with_agent_options
604
690
  ),
605
-
691
+ Command(
692
+ "generate_image",
693
+ ["generate-image", "gen-img"],
694
+ "Generate an image using the specified model and parameters",
695
+ get_generate_image,
696
+ ArgumentsEnum.REQUIRED,
697
+ [],
698
+ generate_image_options
699
+ ),
606
700
 
607
701
  ]
@@ -23,7 +23,8 @@ def configure(option_list: list[str, str] = None):
23
23
  configure_eval_url(eval_url, alias)
24
24
 
25
25
  else:
26
- list_alias = None
26
+ list_alias = False
27
+ remove_alias = False
27
28
  api_key = None
28
29
  base_url = None
29
30
  eval_url = None
@@ -40,9 +41,15 @@ def configure(option_list: list[str, str] = None):
40
41
  base_url = option_arg
41
42
  if option_flag.name == "eval_url":
42
43
  eval_url = option_arg
44
+ if option_flag.name == "remove_alias":
45
+ alias = option_arg
46
+ remove_alias = True
47
+
43
48
 
44
49
  if list_alias:
45
50
  display_alias_list()
51
+ elif remove_alias:
52
+ remove_alias_from_config(alias)
46
53
  else:
47
54
  if api_key:
48
55
  configure_api_key(api_key=api_key, alias=alias)
@@ -76,6 +83,17 @@ def display_alias_list():
76
83
  Console.write_stdout(f"Alias: {alias} -> Base URL: {url}")
77
84
 
78
85
 
86
+ def remove_alias_from_config(alias: str):
87
+ delete_confirmed = str(input(f"-> Are you sure you want to delete {alias} from config file? (y/N) "))
88
+ if delete_confirmed.lower() in ["yes", "y"]:
89
+ settings = get_settings()
90
+ settings.remove_alias(alias)
91
+ Console.write_stdout(f"Alias {alias} removed from configuration file.")
92
+ else:
93
+ Console.write_stdout(f"Alias {alias} kept in configuration file.")
94
+
95
+
96
+
79
97
  configuration_options = (
80
98
  Option(
81
99
  "api_key",
@@ -107,4 +125,11 @@ configuration_options = (
107
125
  "List available alias",
108
126
  False
109
127
  ),
128
+ Option(
129
+ "remove_alias",
130
+ ["--remove-alias", "--ra"],
131
+ "Remove selected alias",
132
+ True
133
+ ),
134
+
110
135
  )
@@ -1,5 +1,6 @@
1
1
  import json
2
2
 
3
+ from pygeai import logger
3
4
  from pygeai.cli.commands import Command, Option, ArgumentsEnum
4
5
  from pygeai.cli.commands.builders import build_help_text
5
6
  from pygeai.cli.commands.common import get_boolean_value
@@ -450,6 +451,111 @@ get_agent_options = [
450
451
  ]
451
452
 
452
453
 
454
+ def export_agent(option_list: list):
455
+ project_id = None
456
+ agent_id = None
457
+ file = None
458
+
459
+ for option_flag, option_arg in option_list:
460
+ if option_flag.name == "project_id":
461
+ project_id = option_arg
462
+ if option_flag.name == "agent_id":
463
+ agent_id = option_arg
464
+ if option_flag.name == "file":
465
+ file = option_arg
466
+
467
+
468
+ if not (project_id and agent_id):
469
+ raise MissingRequirementException("Project ID and Agent id must be specified.")
470
+
471
+ client = AgentClient()
472
+ result = client.export_agent(
473
+ project_id=project_id,
474
+ agent_id=agent_id,
475
+ )
476
+ if file:
477
+ try:
478
+ data = json.loads(result) if isinstance(result, str) else result
479
+ with open(file, "w") as f:
480
+ json.dump(data, f, indent=4)
481
+ Console.write_stdout(f"Result from API saved to {file}.")
482
+ except json.JSONDecodeError as e:
483
+ logger.error(f"Result from API endpoint is not in JSON format: {e}")
484
+ Console.write_stderr(f"Result from API endpoint is not in JSON format.")
485
+ else:
486
+ Console.write_stdout(f"Agent spec: \n{result}")
487
+
488
+
489
+
490
+ export_agent_options = [
491
+ Option(
492
+ "project_id",
493
+ ["--project-id", "--pid"],
494
+ "ID of the project",
495
+ True
496
+ ),
497
+ Option(
498
+ "agent_id",
499
+ ["--agent-id", "--aid"],
500
+ "ID of the agent to retrieve",
501
+ True
502
+ ),
503
+ Option(
504
+ "file",
505
+ ["--file", "-f"],
506
+ "File path to save export specification for agent",
507
+ True
508
+ ),
509
+ ]
510
+
511
+
512
+ def import_agent(option_list: list):
513
+ project_id = None
514
+ file = None
515
+
516
+ for option_flag, option_arg in option_list:
517
+ if option_flag.name == "project_id":
518
+ project_id = option_arg
519
+ if option_flag.name == "file":
520
+ file = option_arg
521
+
522
+
523
+ if not (project_id and file):
524
+ raise MissingRequirementException("Project ID and file path to spec must be specified.")
525
+
526
+ try:
527
+ with open(file, "r") as f:
528
+ agent_data = json.load(f)
529
+ except json.JSONDecodeError as e:
530
+ logger.error(f"File is not in JSON format: {e}")
531
+ Console.write_stderr(f"File is not in JSON format.")
532
+
533
+ client = AgentClient()
534
+ result = client.import_agent(
535
+ project_id=project_id,
536
+ data=agent_data
537
+ )
538
+
539
+ Console.write_stdout(f"Agent import details: {result}")
540
+
541
+
542
+
543
+ import_agent_options = [
544
+ Option(
545
+ "project_id",
546
+ ["--project-id", "--pid"],
547
+ "ID of the project",
548
+ True
549
+ ),
550
+ Option(
551
+ "file",
552
+ ["--file", "-f"],
553
+ "File path to save export specification for agent",
554
+ True
555
+ ),
556
+ ]
557
+
558
+
453
559
  def create_sharing_link(option_list: list):
454
560
  project_id = None
455
561
  agent_id = None
@@ -1188,6 +1294,64 @@ get_tool_options = [
1188
1294
  ]
1189
1295
 
1190
1296
 
1297
+ def export_tool(option_list: list):
1298
+ project_id = None
1299
+ tool_id = None
1300
+ file = None
1301
+
1302
+ for option_flag, option_arg in option_list:
1303
+ if option_flag.name == "project_id":
1304
+ project_id = option_arg
1305
+ if option_flag.name == "tool_id":
1306
+ tool_id = option_arg
1307
+ if option_flag.name == "file":
1308
+ file = option_arg
1309
+
1310
+
1311
+ if not (project_id and tool_id):
1312
+ raise MissingRequirementException("Project ID and Tool id must be specified.")
1313
+
1314
+ client = ToolClient()
1315
+ result = client.export_tool(
1316
+ project_id=project_id,
1317
+ tool_id=tool_id,
1318
+ )
1319
+ Console.write_stdout(f"Tool spec: \n{result}")
1320
+ if file:
1321
+ try:
1322
+ data = json.loads(result) if isinstance(result, str) else result
1323
+ with open(file, "w") as f:
1324
+ json.dump(data, f, indent=4)
1325
+ Console.write_stdout(f"Result from API saved to {file}.")
1326
+ except json.JSONDecodeError as e:
1327
+ logger.error(f"Result from API endpoint is not in JSON format: {e}")
1328
+ Console.write_stderr(f"Result from API endpoint is not in JSON format.")
1329
+
1330
+
1331
+
1332
+ export_tool_options = [
1333
+ Option(
1334
+ "project_id",
1335
+ ["--project-id", "--pid"],
1336
+ "ID of the project",
1337
+ True
1338
+ ),
1339
+ Option(
1340
+ "tool_id",
1341
+ ["--tool-id", "--tid"],
1342
+ "ID of the tool to retrieve",
1343
+ True
1344
+ ),
1345
+ Option(
1346
+ "file",
1347
+ ["--file", "-f"],
1348
+ "File path to save export specification for tool",
1349
+ True
1350
+ ),
1351
+ ]
1352
+
1353
+
1354
+
1191
1355
  def delete_tool(option_list: list):
1192
1356
  project_id = None
1193
1357
  tool_id = None
@@ -3885,6 +4049,24 @@ ai_lab_commands = [
3885
4049
  [],
3886
4050
  get_agent_options
3887
4051
  ),
4052
+ Command(
4053
+ "export_agent",
4054
+ ["export-agent", "ea"],
4055
+ "Export agent",
4056
+ export_agent,
4057
+ ArgumentsEnum.REQUIRED,
4058
+ [],
4059
+ export_agent_options
4060
+ ),
4061
+ Command(
4062
+ "import_agent",
4063
+ ["import-agent", "ia"],
4064
+ "Import agent",
4065
+ import_agent,
4066
+ ArgumentsEnum.REQUIRED,
4067
+ [],
4068
+ import_agent_options
4069
+ ),
3888
4070
  Command(
3889
4071
  "create_sharing_link",
3890
4072
  ["create-sharing-link", "csl"],
@@ -3949,6 +4131,15 @@ ai_lab_commands = [
3949
4131
  [],
3950
4132
  get_tool_options
3951
4133
  ),
4134
+ #Command(
4135
+ # "export_tool",
4136
+ # ["export-tool", "et"],
4137
+ # "Export tool",
4138
+ # export_tool,
4139
+ # ArgumentsEnum.REQUIRED,
4140
+ # [],
4141
+ # export_tool_options
4142
+ #),
3952
4143
  Command(
3953
4144
  "delete_tool",
3954
4145
  ["delete-tool", "dt"],
@@ -95,6 +95,17 @@ class SettingsManager:
95
95
  for section in self.config.sections()
96
96
  }
97
97
 
98
+ def remove_alias(self, alias: str):
99
+ """Removes a specific alias and its settings from the credentials file."""
100
+ if alias in self.config:
101
+ self.config.remove_section(alias)
102
+ with self.GEAI_CREDS_FILE.open("w") as file:
103
+ self.config.write(file)
104
+ logger.info(f"Alias '{alias}' removed from the credentials file.")
105
+ else:
106
+ logger.warning(f"Alias '{alias}' not found in the credentials file.")
107
+
108
+
98
109
 
99
110
  @lru_cache()
100
111
  def get_settings():
@@ -5,7 +5,7 @@ from pygeai import logger
5
5
  from pygeai.core.base.clients import BaseClient
6
6
  from pygeai.core.common.exceptions import MissingRequirementException, InvalidAPIResponseException
7
7
  from pygeai.lab.agents.endpoints import CREATE_AGENT_V2, LIST_AGENTS_V2, GET_AGENT_V2, CREATE_SHARING_LINK_V2, \
8
- PUBLISH_AGENT_REVISION_V2, DELETE_AGENT_V2, UPDATE_AGENT_V2, UPSERT_AGENT_V2
8
+ PUBLISH_AGENT_REVISION_V2, DELETE_AGENT_V2, UPDATE_AGENT_V2, UPSERT_AGENT_V2, EXPORT_AGENT_V2, IMPORT_AGENT_V2
9
9
  from pygeai.lab.constants import VALID_ACCESS_SCOPES
10
10
 
11
11
 
@@ -409,3 +409,82 @@ class AgentClient(BaseClient):
409
409
  raise InvalidAPIResponseException(f"Unable to update agent {agent_id} in project {project_id}: {response.text}")
410
410
 
411
411
  return result
412
+
413
+ def export_agent(
414
+ self,
415
+ project_id: str,
416
+ agent_id: str,
417
+ ) -> dict:
418
+ """
419
+ Retrieves details of a specific agent from the specified project.
420
+
421
+ :param project_id: str - Unique identifier of the project containing the agent.
422
+ :param agent_id: str - Unique identifier of the agent to retrieve.
423
+ :return: dict - JSON response containing the agent details.
424
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
425
+ :raises MissingRequirementException: If project_id or agent_id is not provided.
426
+ """
427
+ if not project_id:
428
+ raise MissingRequirementException("Cannot export agent without specifying project_id")
429
+
430
+ if not agent_id:
431
+ raise MissingRequirementException("agent_id must be specified in order to export the agent")
432
+
433
+ endpoint = EXPORT_AGENT_V2.format(agentId=agent_id)
434
+ headers = {
435
+ "Authorization": self.api_service.token,
436
+ "ProjectId": project_id
437
+ }
438
+
439
+ logger.debug(f"Exporting agent with ID {agent_id}")
440
+
441
+ response = self.api_service.get(
442
+ endpoint=endpoint,
443
+ headers=headers,
444
+ )
445
+ try:
446
+ result = response.json()
447
+ except JSONDecodeError as e:
448
+ logger.error(f"Unable to export agent {agent_id} for project {project_id}: JSON parsing error (status {response.status_code}): {e}. Response: {response.text}")
449
+ raise InvalidAPIResponseException(f"Unable to export agent {agent_id} for project {project_id}: {response.text}")
450
+
451
+ return result
452
+
453
+ def import_agent(
454
+ self,
455
+ project_id: str,
456
+ data: dict,
457
+ ) -> dict:
458
+ """
459
+ Retrieves details of a specific agent from the specified project.
460
+
461
+ :param project_id: str - Unique identifier of the project containing the agent.
462
+ :param data: dict - Agent specification to import
463
+ :return: dict - JSON response containing the agent details.
464
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
465
+ :raises MissingRequirementException: If project_id or agent_id is not provided.
466
+ """
467
+ if not project_id:
468
+ raise MissingRequirementException("Cannot import agent without specifying project_id")
469
+
470
+ if not data:
471
+ raise MissingRequirementException("data for spec must be specified in order to import the agent")
472
+
473
+ endpoint = IMPORT_AGENT_V2
474
+ headers = {
475
+ "Authorization": self.api_service.token,
476
+ "ProjectId": project_id
477
+ }
478
+
479
+ response = self.api_service.post(
480
+ endpoint=endpoint,
481
+ headers=headers,
482
+ data=data
483
+ )
484
+ try:
485
+ result = response.json()
486
+ except JSONDecodeError as e:
487
+ logger.error(f"Unable to import agent for project {project_id}: JSON parsing error (status {response.status_code}): {e}. Response: {response.text}")
488
+ raise InvalidAPIResponseException(f"Unable to import agent for project {project_id}: {response.text}")
489
+
490
+ return result
@@ -6,3 +6,5 @@ PUBLISH_AGENT_REVISION_V2 = "v2/agents/{agentId}/publish-revision" # POST -> Pu
6
6
  DELETE_AGENT_V2 = "v2/agents/{agentId}" # DEL -> Delete agent
7
7
  UPDATE_AGENT_V2 = "v2/agents/{agentId}" # PUT -> Update agent
8
8
  UPSERT_AGENT_V2 = "v2/agents/{agentId}/upsert" # PUT -> Update or Insert agent
9
+ EXPORT_AGENT_V2 = "v2/agents/{agentId}/export" # GET -> Export agent
10
+ IMPORT_AGENT_V2 = "v2/agents/import" # POST -> Import agent
@@ -1,3 +1,4 @@
1
+ import re
1
2
  from typing import Literal, Optional, List, Dict, Any, Union, Iterator
2
3
 
3
4
  from pydantic import model_validator, Field, field_validator
@@ -708,6 +709,9 @@ class Tool(CustomBaseModel):
708
709
  raise ValueError("name cannot be blank")
709
710
  if ":" in value or "/" in value:
710
711
  raise ValueError("name cannot contain ':' or '/'")
712
+ if not re.match(r'^[A-Za-z0-9_-]{1,64}$', value):
713
+ raise ValueError(
714
+ "name must contain only letters, numbers, underscores, or hyphens, and be 1-64 characters long")
711
715
  return value
712
716
 
713
717
  @field_validator("public_name")
@@ -3,10 +3,10 @@ from json import JSONDecodeError
3
3
 
4
4
  from pygeai import logger
5
5
  from pygeai.core.base.clients import BaseClient
6
- from pygeai.core.common.exceptions import InvalidAPIResponseException
6
+ from pygeai.core.common.exceptions import InvalidAPIResponseException, MissingRequirementException
7
7
  from pygeai.lab.constants import VALID_SCOPES, VALID_ACCESS_SCOPES, VALID_REPORT_EVENTS
8
8
  from pygeai.lab.tools.endpoints import CREATE_TOOL_V2, LIST_TOOLS_V2, GET_TOOL_V2, UPDATE_TOOL_V2, UPSERT_TOOL_V2, \
9
- PUBLISH_TOOL_REVISION_V2, GET_PARAMETER_V2, SET_PARAMETER_V2, DELETE_TOOL_V2
9
+ PUBLISH_TOOL_REVISION_V2, GET_PARAMETER_V2, SET_PARAMETER_V2, DELETE_TOOL_V2, EXPORT_TOOL_V2
10
10
 
11
11
 
12
12
  class ToolClient(BaseClient):
@@ -525,3 +525,43 @@ class ToolClient(BaseClient):
525
525
  raise InvalidAPIResponseException(f"Unable to set parameters for tool {tool_id or tool_public_name} in project {project_id}: {response.text}")
526
526
 
527
527
  return result
528
+
529
+ def export_tool(
530
+ self,
531
+ project_id: str,
532
+ tool_id: str,
533
+ ) -> dict:
534
+ """
535
+ Retrieves details of a specific tool from the specified project.
536
+
537
+ :param project_id: str - Unique identifier of the project containing the tool.
538
+ :param tool_id: str - Unique identifier of the tool to retrieve.
539
+ :return: dict - JSON response containing the tool details.
540
+ :raises InvalidAPIResponseException: If the response cannot be parsed as JSON or an error occurs.
541
+ :raises MissingRequirementException: If project_id or tool_id is not provided.
542
+ """
543
+ if not project_id:
544
+ raise MissingRequirementException("Cannot retrieve tool without specifying project_id")
545
+
546
+ if not tool_id:
547
+ raise MissingRequirementException("tool_id must be specified in order to retrieve the tool")
548
+
549
+ endpoint = EXPORT_TOOL_V2.format(toolId=tool_id)
550
+ headers = {
551
+ "Authorization": self.api_service.token,
552
+ "ProjectId": project_id
553
+ }
554
+
555
+ logger.debug(f"Exporting tool with ID {tool_id}")
556
+
557
+ response = self.api_service.get(
558
+ endpoint=endpoint,
559
+ headers=headers,
560
+ )
561
+ try:
562
+ result = response.json()
563
+ except JSONDecodeError as e:
564
+ logger.error(f"Unable to export tool {tool_id} for project {project_id}: JSON parsing error (status {response.status_code}): {e}. Response: {response.text}")
565
+ raise InvalidAPIResponseException(f"Unable to export tool {tool_id} for project {project_id}: {response.text}")
566
+
567
+ return result
@@ -7,3 +7,4 @@ UPSERT_TOOL_V2 = "v2/tools/{toolId}/upsert" # PUT -> Update or insert tool data
7
7
  PUBLISH_TOOL_REVISION_V2 = "v2/tools/{toolId}/publish-revision" # POST -> Publish Tool revision
8
8
  GET_PARAMETER_V2 = "v2/tools/{toolPublicName}/config" # GET -> Get tool parameter
9
9
  SET_PARAMETER_V2 = "v2/tools/{toolPublicName}/config" # POST -> Set tool parameter
10
+ EXPORT_TOOL_V2 = "v2/tools/{toolId}/export" # GET -> Export tool
@@ -193,6 +193,7 @@ class MCPServer(ToolServer):
193
193
  """
194
194
  def __init__(self, sever_name: str, config: Dict[str, Any], settings: ProxySettingsManager):
195
195
  super().__init__(sever_name, config, settings)
196
+ self.public_prefix = config.get("public_prefix")
196
197
  self.stdio_context: Any | None = None
197
198
  self.session: ClientSession | None = None
198
199
 
@@ -40,9 +40,12 @@ class ProxiedTool:
40
40
 
41
41
  def get_public_name(self) -> str:
42
42
  """Get the public name of the tool."""
43
- return (
44
- f"{self.public_prefix}.{self.name if self.server_name in self.public_prefix else self.get_full_name()}"
45
- )
43
+ if not self.public_prefix:
44
+ return ""
45
+ if self.server_name in self.public_prefix:
46
+ return f"{self.public_prefix}.{self.name}"
47
+ else:
48
+ return f"{self.public_prefix}.{self.get_full_name()}"
46
49
 
47
50
  def format_for_llm(self) -> str:
48
51
  """Format tool information for LLM.