mage-ai 0.9.75__py3-none-any.whl → 0.9.76__py3-none-any.whl

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

Potentially problematic release.


This version of mage-ai might be problematic. Click here for more details.

Files changed (202) hide show
  1. mage_ai/api/policies/PipelineSchedulePolicy.py +1 -0
  2. mage_ai/api/presenters/PipelineSchedulePresenter.py +11 -2
  3. mage_ai/api/resources/PipelineScheduleResource.py +11 -3
  4. mage_ai/api/resources/PipelineTriggerResource.py +3 -1
  5. mage_ai/api/resources/SessionResource.py +2 -2
  6. mage_ai/api/resources/SyncResource.py +1 -1
  7. mage_ai/api/resources/UserResource.py +1 -1
  8. mage_ai/data_integrations/destinations/constants.py +2 -0
  9. mage_ai/data_integrations/sources/constants.py +2 -0
  10. mage_ai/data_preparation/models/block/__init__.py +0 -1
  11. mage_ai/data_preparation/models/block/dbt/dbt_adapter.py +20 -8
  12. mage_ai/data_preparation/models/block/dynamic/constants.py +0 -1
  13. mage_ai/data_preparation/models/block/dynamic/counter.py +1 -3
  14. mage_ai/data_preparation/models/block/r/__init__.py +16 -5
  15. mage_ai/data_preparation/models/block/sql/__init__.py +2 -0
  16. mage_ai/data_preparation/models/block/sql/mssql.py +8 -0
  17. mage_ai/data_preparation/models/block/sql/utils/shared.py +6 -2
  18. mage_ai/data_preparation/models/constants.py +1 -0
  19. mage_ai/data_preparation/models/pipeline.py +1 -1
  20. mage_ai/data_preparation/templates/constants.py +7 -0
  21. mage_ai/data_preparation/templates/data_loaders/airtable.py +28 -0
  22. mage_ai/data_preparation/templates/repo/io_config.yaml +2 -0
  23. mage_ai/io/airtable.py +104 -0
  24. mage_ai/io/base.py +1 -0
  25. mage_ai/io/bigquery.py +36 -0
  26. mage_ai/io/config.py +5 -0
  27. mage_ai/io/mssql.py +5 -0
  28. mage_ai/io/mysql.py +6 -1
  29. mage_ai/io/redshift.py +13 -0
  30. mage_ai/io/sql.py +1 -0
  31. mage_ai/orchestration/db/__init__.py +20 -0
  32. mage_ai/orchestration/db/models/schedules.py +2 -5
  33. mage_ai/orchestration/db/models/secrets.py +11 -1
  34. mage_ai/orchestration/metrics/pipeline_run.py +1 -1
  35. mage_ai/orchestration/pipeline_scheduler_original.py +4 -5
  36. mage_ai/orchestration/pipeline_scheduler_project_platform.py +4 -5
  37. mage_ai/orchestration/utils/distributed_lock.py +8 -1
  38. mage_ai/server/api/triggers.py +9 -0
  39. mage_ai/server/constants.py +1 -1
  40. mage_ai/server/frontend_dist/404.html +2 -2
  41. mage_ai/server/frontend_dist/_next/static/chunks/449-5e2253c6aba42557.js +1 -0
  42. mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-782dd4a6b13e1c42.js +2 -0
  43. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users-5db54821a3059c69.js +1 -0
  44. mage_ai/server/frontend_dist/_next/static/chunks/pages/overview-f65416f6dbe30ad3.js +1 -0
  45. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-03d9bca3bc5e6088.js +1 -0
  46. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-d25d07db166cbb04.js +1 -0
  47. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users-fa61dc6c1370e6a5.js +1 -0
  48. mage_ai/server/frontend_dist/_next/static/chunks/{webpack-0bc44da590c7cf85.js → webpack-b9a067f3bd0a3a05.js} +1 -1
  49. mage_ai/server/frontend_dist/_next/static/{38-PtskJFUTYUpRhT1qF_ → qR0jauUABqPaFMjUsYeoG}/_buildManifest.js +1 -1
  50. mage_ai/server/frontend_dist/block-layout.html +2 -2
  51. mage_ai/server/frontend_dist/compute.html +2 -2
  52. mage_ai/server/frontend_dist/files.html +2 -2
  53. mage_ai/server/frontend_dist/global-data-products/[...slug].html +2 -2
  54. mage_ai/server/frontend_dist/global-data-products.html +2 -2
  55. mage_ai/server/frontend_dist/global-hooks/[...slug].html +2 -2
  56. mage_ai/server/frontend_dist/global-hooks.html +2 -2
  57. mage_ai/server/frontend_dist/index.html +2 -2
  58. mage_ai/server/frontend_dist/manage/files.html +2 -2
  59. mage_ai/server/frontend_dist/manage/overview.html +2 -2
  60. mage_ai/server/frontend_dist/manage/pipeline-runs.html +2 -2
  61. mage_ai/server/frontend_dist/manage/settings.html +2 -2
  62. mage_ai/server/frontend_dist/manage/users/[user].html +2 -2
  63. mage_ai/server/frontend_dist/manage/users/new.html +2 -2
  64. mage_ai/server/frontend_dist/manage/users.html +2 -2
  65. mage_ai/server/frontend_dist/manage.html +2 -2
  66. mage_ai/server/frontend_dist/oauth.html +3 -3
  67. mage_ai/server/frontend_dist/overview.html +2 -2
  68. mage_ai/server/frontend_dist/pipeline-runs.html +2 -2
  69. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills/[...slug].html +2 -2
  70. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills.html +2 -2
  71. mage_ai/server/frontend_dist/pipelines/[pipeline]/dashboard.html +2 -2
  72. mage_ai/server/frontend_dist/pipelines/[pipeline]/edit.html +2 -2
  73. mage_ai/server/frontend_dist/pipelines/[pipeline]/logs.html +2 -2
  74. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runs.html +2 -2
  75. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runtime.html +2 -2
  76. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors.html +2 -2
  77. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs/[run].html +2 -2
  78. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs.html +2 -2
  79. mage_ai/server/frontend_dist/pipelines/[pipeline]/settings.html +2 -2
  80. mage_ai/server/frontend_dist/pipelines/[pipeline]/syncs.html +2 -2
  81. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers/[...slug].html +2 -2
  82. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers.html +2 -2
  83. mage_ai/server/frontend_dist/pipelines/[pipeline].html +2 -2
  84. mage_ai/server/frontend_dist/pipelines.html +2 -2
  85. mage_ai/server/frontend_dist/platform/global-hooks/[...slug].html +2 -2
  86. mage_ai/server/frontend_dist/platform/global-hooks.html +2 -2
  87. mage_ai/server/frontend_dist/settings/account/profile.html +2 -2
  88. mage_ai/server/frontend_dist/settings/platform/preferences.html +2 -2
  89. mage_ai/server/frontend_dist/settings/platform/settings.html +2 -2
  90. mage_ai/server/frontend_dist/settings/workspace/permissions/[...slug].html +2 -2
  91. mage_ai/server/frontend_dist/settings/workspace/permissions.html +2 -2
  92. mage_ai/server/frontend_dist/settings/workspace/preferences.html +2 -2
  93. mage_ai/server/frontend_dist/settings/workspace/roles/[...slug].html +2 -2
  94. mage_ai/server/frontend_dist/settings/workspace/roles.html +2 -2
  95. mage_ai/server/frontend_dist/settings/workspace/sync-data.html +2 -2
  96. mage_ai/server/frontend_dist/settings/workspace/users/[...slug].html +2 -2
  97. mage_ai/server/frontend_dist/settings/workspace/users.html +2 -2
  98. mage_ai/server/frontend_dist/settings.html +2 -2
  99. mage_ai/server/frontend_dist/sign-in.html +5 -5
  100. mage_ai/server/frontend_dist/templates/[...slug].html +2 -2
  101. mage_ai/server/frontend_dist/templates.html +2 -2
  102. mage_ai/server/frontend_dist/terminal.html +2 -2
  103. mage_ai/server/frontend_dist/test.html +2 -2
  104. mage_ai/server/frontend_dist/triggers.html +2 -2
  105. mage_ai/server/frontend_dist/v2/canvas.html +2 -2
  106. mage_ai/server/frontend_dist/v2.html +2 -2
  107. mage_ai/server/frontend_dist/version-control.html +2 -2
  108. mage_ai/server/frontend_dist_base_path_template/404.html +2 -2
  109. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/449-5e2253c6aba42557.js +1 -0
  110. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-ee5e328aaf51c698.js +2 -0
  111. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users-5db54821a3059c69.js +1 -0
  112. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/overview-f65416f6dbe30ad3.js +1 -0
  113. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-03d9bca3bc5e6088.js +1 -0
  114. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-d25d07db166cbb04.js +1 -0
  115. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/users-fa61dc6c1370e6a5.js +1 -0
  116. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{webpack-12ad70eb5c31aa92.js → webpack-5f4be622608d9267.js} +1 -1
  117. mage_ai/server/frontend_dist_base_path_template/_next/static/{dxnSzgIvSG4Ke5LM-tPQX → iCySon3_GCldnbC5U7C-s}/_buildManifest.js +1 -1
  118. mage_ai/server/frontend_dist_base_path_template/block-layout.html +2 -2
  119. mage_ai/server/frontend_dist_base_path_template/compute.html +2 -2
  120. mage_ai/server/frontend_dist_base_path_template/files.html +2 -2
  121. mage_ai/server/frontend_dist_base_path_template/global-data-products/[...slug].html +2 -2
  122. mage_ai/server/frontend_dist_base_path_template/global-data-products.html +2 -2
  123. mage_ai/server/frontend_dist_base_path_template/global-hooks/[...slug].html +2 -2
  124. mage_ai/server/frontend_dist_base_path_template/global-hooks.html +2 -2
  125. mage_ai/server/frontend_dist_base_path_template/index.html +2 -2
  126. mage_ai/server/frontend_dist_base_path_template/manage/files.html +2 -2
  127. mage_ai/server/frontend_dist_base_path_template/manage/overview.html +2 -2
  128. mage_ai/server/frontend_dist_base_path_template/manage/pipeline-runs.html +2 -2
  129. mage_ai/server/frontend_dist_base_path_template/manage/settings.html +2 -2
  130. mage_ai/server/frontend_dist_base_path_template/manage/users/[user].html +2 -2
  131. mage_ai/server/frontend_dist_base_path_template/manage/users/new.html +2 -2
  132. mage_ai/server/frontend_dist_base_path_template/manage/users.html +2 -2
  133. mage_ai/server/frontend_dist_base_path_template/manage.html +2 -2
  134. mage_ai/server/frontend_dist_base_path_template/oauth.html +3 -3
  135. mage_ai/server/frontend_dist_base_path_template/overview.html +2 -2
  136. mage_ai/server/frontend_dist_base_path_template/pipeline-runs.html +2 -2
  137. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills/[...slug].html +2 -2
  138. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills.html +2 -2
  139. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/dashboard.html +2 -2
  140. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/edit.html +2 -2
  141. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/logs.html +2 -2
  142. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runs.html +2 -2
  143. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runtime.html +2 -2
  144. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors.html +2 -2
  145. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs/[run].html +2 -2
  146. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs.html +2 -2
  147. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/settings.html +2 -2
  148. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/syncs.html +2 -2
  149. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers/[...slug].html +2 -2
  150. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers.html +2 -2
  151. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline].html +2 -2
  152. mage_ai/server/frontend_dist_base_path_template/pipelines.html +2 -2
  153. mage_ai/server/frontend_dist_base_path_template/platform/global-hooks/[...slug].html +2 -2
  154. mage_ai/server/frontend_dist_base_path_template/platform/global-hooks.html +2 -2
  155. mage_ai/server/frontend_dist_base_path_template/settings/account/profile.html +2 -2
  156. mage_ai/server/frontend_dist_base_path_template/settings/platform/preferences.html +2 -2
  157. mage_ai/server/frontend_dist_base_path_template/settings/platform/settings.html +2 -2
  158. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions/[...slug].html +2 -2
  159. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions.html +2 -2
  160. mage_ai/server/frontend_dist_base_path_template/settings/workspace/preferences.html +2 -2
  161. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles/[...slug].html +2 -2
  162. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles.html +2 -2
  163. mage_ai/server/frontend_dist_base_path_template/settings/workspace/sync-data.html +2 -2
  164. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users/[...slug].html +2 -2
  165. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users.html +2 -2
  166. mage_ai/server/frontend_dist_base_path_template/settings.html +2 -2
  167. mage_ai/server/frontend_dist_base_path_template/sign-in.html +5 -5
  168. mage_ai/server/frontend_dist_base_path_template/templates/[...slug].html +2 -2
  169. mage_ai/server/frontend_dist_base_path_template/templates.html +2 -2
  170. mage_ai/server/frontend_dist_base_path_template/terminal.html +2 -2
  171. mage_ai/server/frontend_dist_base_path_template/test.html +2 -2
  172. mage_ai/server/frontend_dist_base_path_template/triggers.html +2 -2
  173. mage_ai/server/frontend_dist_base_path_template/v2/canvas.html +2 -2
  174. mage_ai/server/frontend_dist_base_path_template/v2.html +2 -2
  175. mage_ai/server/frontend_dist_base_path_template/version-control.html +2 -2
  176. mage_ai/settings/server.py +2 -0
  177. mage_ai/tests/data_preparation/models/block/dynamic/test_counter.py +1 -3
  178. mage_ai/usage_statistics/logger.py +99 -15
  179. {mage_ai-0.9.75.dist-info → mage_ai-0.9.76.dist-info}/METADATA +119 -103
  180. {mage_ai-0.9.75.dist-info → mage_ai-0.9.76.dist-info}/RECORD +188 -186
  181. {mage_ai-0.9.75.dist-info → mage_ai-0.9.76.dist-info}/WHEEL +1 -1
  182. mage_ai/server/frontend_dist/_next/static/chunks/449-f689774546860ca4.js +0 -1
  183. mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-13bf3b7dcef50c29.js +0 -2
  184. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users-b99379d0aa6a8c25.js +0 -1
  185. mage_ai/server/frontend_dist/_next/static/chunks/pages/overview-e51cd04bd4d1fffe.js +0 -1
  186. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-0abf8a1b7243f93b.js +0 -1
  187. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-38187954b6ec4b40.js +0 -1
  188. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users-3ee783f5139c76a1.js +0 -1
  189. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/449-f689774546860ca4.js +0 -1
  190. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-0392ef723ea2c6f8.js +0 -2
  191. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users-b99379d0aa6a8c25.js +0 -1
  192. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/overview-e51cd04bd4d1fffe.js +0 -1
  193. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-0abf8a1b7243f93b.js +0 -1
  194. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-38187954b6ec4b40.js +0 -1
  195. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/users-3ee783f5139c76a1.js +0 -1
  196. /mage_ai/server/frontend_dist/_next/static/chunks/pages/{_app-13bf3b7dcef50c29.js.LICENSE.txt → _app-782dd4a6b13e1c42.js.LICENSE.txt} +0 -0
  197. /mage_ai/server/frontend_dist/_next/static/{38-PtskJFUTYUpRhT1qF_ → qR0jauUABqPaFMjUsYeoG}/_ssgManifest.js +0 -0
  198. /mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{_app-0392ef723ea2c6f8.js.LICENSE.txt → _app-ee5e328aaf51c698.js.LICENSE.txt} +0 -0
  199. /mage_ai/server/frontend_dist_base_path_template/_next/static/{dxnSzgIvSG4Ke5LM-tPQX → iCySon3_GCldnbC5U7C-s}/_ssgManifest.js +0 -0
  200. {mage_ai-0.9.75.dist-info → mage_ai-0.9.76.dist-info}/entry_points.txt +0 -0
  201. {mage_ai-0.9.75.dist-info → mage_ai-0.9.76.dist-info/licenses}/LICENSE +0 -0
  202. {mage_ai-0.9.75.dist-info → mage_ai-0.9.76.dist-info}/top_level.txt +0 -0
@@ -27,7 +27,7 @@
27
27
  };
28
28
  }
29
29
  })();
30
- </script><link rel="preload" href="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/css/18782af6d2c4e826.css" as="style"/><link rel="stylesheet" href="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/css/18782af6d2c4e826.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script><script src="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/chunks/webpack-12ad70eb5c31aa92.js" defer=""></script><script src="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/chunks/framework-ea07653270784974.js" defer=""></script><script src="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/chunks/main-342bedfde9cd81cf.js" defer=""></script><script src="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/chunks/pages/_app-0392ef723ea2c6f8.js" defer=""></script><script src="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/chunks/449-f689774546860ca4.js" defer=""></script><script src="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/chunks/pages/version-control-573f0225d7a703ed.js" defer=""></script><script src="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/dxnSzgIvSG4Ke5LM-tPQX/_buildManifest.js" defer=""></script><script src="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/dxnSzgIvSG4Ke5LM-tPQX/_ssgManifest.js" defer=""></script><style data-styled="" data-styled-version="5.3.11">html{-webkit-box-sizing:border-box;box-sizing:border-box;-ms-overflow-style:scrollbar;}/*!sc*/
30
+ </script><link rel="preload" href="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/css/18782af6d2c4e826.css" as="style"/><link rel="stylesheet" href="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/css/18782af6d2c4e826.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script><script src="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/chunks/webpack-5f4be622608d9267.js" defer=""></script><script src="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/chunks/framework-ea07653270784974.js" defer=""></script><script src="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/chunks/main-342bedfde9cd81cf.js" defer=""></script><script src="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/chunks/pages/_app-ee5e328aaf51c698.js" defer=""></script><script src="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/chunks/449-5e2253c6aba42557.js" defer=""></script><script src="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/chunks/pages/version-control-573f0225d7a703ed.js" defer=""></script><script src="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/iCySon3_GCldnbC5U7C-s/_buildManifest.js" defer=""></script><script src="/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_/_next/static/iCySon3_GCldnbC5U7C-s/_ssgManifest.js" defer=""></script><style data-styled="" data-styled-version="5.3.11">html{-webkit-box-sizing:border-box;box-sizing:border-box;-ms-overflow-style:scrollbar;}/*!sc*/
31
31
  *,*::before,*::after{-webkit-box-sizing:inherit;box-sizing:inherit;}/*!sc*/
32
32
  data-styled.g4[id="sc-global-czSCUT1"]{content:"sc-global-czSCUT1,"}/*!sc*/
33
33
  .esCWvc{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}/*!sc*/
@@ -50,4 +50,4 @@ data-styled.g242[id="indexstyle__VerticalNavigationStyleComponent-sc-ecogjt-1"]{
50
50
  .dionUf .Toastify__toast--success{background:#00A81A !important;color:#FFFFFF !important;}/*!sc*/
51
51
  .dionUf .Toastify__toast--warning{background:#DD9900 !important;color:#FFFFFF !important;}/*!sc*/
52
52
  data-styled.g279[id="ToastWrapper-sc-1a33ph1-0"]{content:"dionUf,"}/*!sc*/
53
- </style></head><body><div id="__next"><div class="" style="position:fixed;top:0;left:0;height:2px;background:transparent;z-index:99999999999;width:100%"><div class="" style="height:100%;background:#FF144D;transition:all 500ms ease;width:0%"><div style="box-shadow:0 0 10px #FF144D, 0 0 10px #FF144D;width:5%;opacity:1;position:absolute;height:100%;transition:all 500ms ease;transform:rotate(3deg) translate(0px, -4px);left:-10rem"></div></div></div><div class="indexstyle__HeaderStyle-sc-1bk8irg-0 bVoYMS"></div><div class="indexstyle__ContainerStyle-sc-ecogjt-0 jrjFfx"><div class="indexstyle__VerticalNavigationStyleComponent-sc-ecogjt-1 drmgmw"><div class="Spacing__SpacingStyle-sc-1mpmtgj-0 kgseVY"></div></div><div class="Flex-sc-sgfnl9-0 esCWvc"></div></div><div id="command-center-root"></div><div></div><div></div><div></div><div class="ToastWrapper-sc-1a33ph1-0 dionUf"><div class="Toastify"></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"auth":{"decodedToken":{"expires":0,"token":null}}},"currentTheme":{"accent":{"alert":"#F6540B","blue":"#4877FF","blueLight":"rgba(72, 119, 255, 0.5)","contentDefaultTransparent":"rgba(174, 174, 174, 0.5)","cyan":"#65E3FF","cyanLight":"rgba(101, 227, 255, 0.3)","cyanTransparent":"rgba(101, 227, 255, 0.12)","dbt":"#fc6949","dbtDark":"rgba(252, 105, 73, 0.3)","dbtLight":"rgba(252, 105, 73, 0.5)","info":"#00ABFF","infoTransparent":"rgba(0, 171, 255, 0.5)","negative":"#FF1E59","negativeTransparent":"rgba(255, 30, 89, 0.3)","pink":"#FF4FF8","pinkLight":"rgb(255, 79, 248, 0.5)","positive":"#00A81A","primaryTransparent":"rgba(155, 108, 167, 0.5)","purple":"#7D55EC","purpleLight":"rgba(125, 85, 236, 0.5)","rose":"#D1A2AB","roseLight":"rgba(209, 162, 171, 0.5)","sky":"#6AA1E0","skyLight":"rgba(106, 161, 224, 0.5)","teal":"#00B4CC","tealLight":"rgba(0, 180, 204, 0.5)","warning":"#DD9900","warningTransparent":"rgba(221, 153, 0, 0.5)","yellow":"#FFCC19","yellowLight":"rgba(255, 204, 25, 0.5)"},"background":{"blackTransparent":"rgba(0, 0, 0, 0.6)","blackTransparentDark":"rgba(0, 0, 0, 0.8)","chartBlock":"#2E3036","codeArea":"#1E1F24","codeTextarea":"#000000","content":"#1B1C20","danger":"#FFD0DB","dark":"#B1B8C3","dashboard":"#18181C","dashboardTransparent":"rgba(24, 24, 28, 0.1)","header":"#1B1B1B","menu":"#0F4CFF","muted":"#F9FAFC","navigation":"#EDEDED","output":"#2E3036","page":"#1E1F24","panel":"#232429","panelTransparent":"rgba(35, 36, 41, 0.7)","popup":"#27292E","row":"#2C2C2C","row2":"#51535C","scrollbarThumb":"rgba(100, 100, 100, 0.5)","scrollbarThumbHover":"rgba(255, 255, 255, 0.3)","scrollbarTrack":"#2E3036","success":"#8ADE00","successLight":"rgb(138, 222, 0, 0.3)","table":"#292A2F","tag":"#3A4550"},"borders":{"button":"#454850","contrast":"#FFFFFF","danger":"#FF144D","dark":"#000000","darkLight":"#2E3036","info":"#FFCC19","light":"#2F3034","medium":"#1C1C1C","medium2":"#141414","success":"#2FCB52"},"brand":{"earth100":"#C6EEDB","earth200":"#9DDFBF","earth300":"#6BBF96","earth400":"#37A46F","earth400Transparent":"rgba(55, 164, 111, 0.4)","earth500":"#00954C","energy100":"#FFF4BA","energy200":"#FFED92","energy300":"#FFE662","energy400":"#FFDA19","energy400Transparent":"rgba(255, 218, 25, 0.04)","energy500":"#F6C000","fire100":"#FFD7E0","fire200":"#FFA3B9","fire300":"#FF547D","fire400":"#FF144D","fire400Transparent":"rgba(255, 20, 77, 0.4)","fire500":"#EB0032","stone100":"#F3E6D7","stone200":"#E3D4C2","stone400":"#BFA78B","stone500":"#AF8859","water100":"#BDCEFF","water200":"#81A1FF","water300":"#517DFF","water400":"#2A60FE","water400Transparent":"rgba(42, 96, 254, 0.4)","water500":"#0F4CFF","wind100":"#EEEAFF","wind200":"#CCC1F4","wind300":"#A698DD","wind400":"#6B50D7","wind400SuperTransparent":"rgba(107, 80, 215, 0.12)","wind400Transparent":"rgba(107, 80, 215, 0.4)","wind500":"#4E32BC"},"chart":{"backgroundPrimary":"#7D55EC","backgroundSecondary":"#FF144D","backgroundTertiary":"#86E2FF","button1":"#4877FF","button2":"#FFCC19","button3":"#8ADE00","button4":"#FF4FF8","button5":"#B98D95","lines":"#9B6CA7","primary":"#6B50D7","secondary":"#FF144D","tertiary":"#2A60FE"},"content":{"active":"#FFFFFF","default":"#AEAEAE","disabled":"rgba(255, 255, 255, 0.3)","inverted":"#2C2C2C","muted":"#787A85"},"elevation":{"visualizationAccent":"#996CFF","visualizationAccentAlt":"#C1ACF7"},"feature":{"active":"rgba(250, 248, 254, 0.14)","disabled":"rgba(201, 206, 218, 0.12)"},"icons":{"neutral":"#787878"},"interactive":{"activeBorder":"#060606","blackBackgroundTransparent":"rgba(0, 0, 0, 0.5)","checked":"#060606","dangerBorder":"#FF144D","defaultBackground":"#36383F","defaultBackgroundTransparent":"rgba(54, 56, 63, 0.5)","defaultBorder":"#ffffff1a","disabledBorder":"#B1B8C3","focusBackground":"#B1B8C3","focusBorder":"#86E2FF","hoverBackground":"#4E4E4E","hoverBackgroundTransparent":"rgba(78, 78, 78, 0.5)","hoverBlackBackgroundTransparent":"rgba(0, 0, 0, 0.7)","hoverBorder":"#B9BFCA","hoverOverlay":"rgba(255, 255, 255, 0.1)","linkPrimary":"#1752FF","linkPrimaryHover":"#4877FF","linkPrimaryLight":"#5982ff","linkSecondary":"#6B50D7","linkSecondaryDisabled":"#C4B9EF","linkText":"#6AA1E0","linkTextLight":"#9ECBFF","purple":"#885EFF","rowHoverBackground":"rgba(0, 0, 0, 0.1)","transparent":"rgba(255, 255, 255, 0)"},"loader":{"color":"#EB0032","colorInverted":"#8ADE00"},"logo":{"color":"#FFFFFF"},"monotone":{"black":"#060606","blackTransparent":"rgba(0, 0, 0, 0.6)","gray":"#B1B8C3","grey100":"#F2F2F2","grey200":"#D5D7DC","grey300":"#B4B8C0","grey400":"#70747C","grey500":"#51535C","purple":"#6B50D7","white":"#FFFFFF","whiteTransparent":"rgba(255, 255, 255, 0.6)"},"neutral":{"n100":"#E7E8EA","n200":"#D8DADE","n300":"#CBCCD0","n400":"#BCBEC4","n500":"#AEB0B6"},"progress":{"negative":"#FF144D","positive":"#6B50D7"},"shadow":{"base":"12px 40px 120px rgba(0, 0, 0, 0.3)","frame":"0px 10px 40px rgba(0, 0, 0, 0.26)","menu":"4px 10px 20px rgba(6, 6, 6, 0.12)","popup":"10px 20px 40px rgba(0, 0, 0, 0.2)","small":"0px, 4px, rgba(0, 0, 0, 0.25)","window":"0px 10px 60px rgba(0, 0, 0, 0.7)"},"status":{"negative":"#FF144D","positive":"#24B400"},"text":{"fileBrowser":"#787A85"}}},"page":"/version-control","query":{},"buildId":"dxnSzgIvSG4Ke5LM-tPQX","assetPrefix":"/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_","nextExport":true,"isFallback":false,"gip":true,"appGip":true,"scriptLoader":[]}</script></body></html>
53
+ </style></head><body><div id="__next"><div class="" style="position:fixed;top:0;left:0;height:2px;background:transparent;z-index:99999999999;width:100%"><div class="" style="height:100%;background:#FF144D;transition:all 500ms ease;width:0%"><div style="box-shadow:0 0 10px #FF144D, 0 0 10px #FF144D;width:5%;opacity:1;position:absolute;height:100%;transition:all 500ms ease;transform:rotate(3deg) translate(0px, -4px);left:-10rem"></div></div></div><div class="indexstyle__HeaderStyle-sc-1bk8irg-0 bVoYMS"></div><div class="indexstyle__ContainerStyle-sc-ecogjt-0 jrjFfx"><div class="indexstyle__VerticalNavigationStyleComponent-sc-ecogjt-1 drmgmw"><div class="Spacing__SpacingStyle-sc-1mpmtgj-0 kgseVY"></div></div><div class="Flex-sc-sgfnl9-0 esCWvc"></div></div><div id="command-center-root"></div><div></div><div></div><div></div><div class="ToastWrapper-sc-1a33ph1-0 dionUf"><div class="Toastify"></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"auth":{"decodedToken":{"expires":0,"token":null}}},"currentTheme":{"accent":{"alert":"#F6540B","blue":"#4877FF","blueLight":"rgba(72, 119, 255, 0.5)","contentDefaultTransparent":"rgba(174, 174, 174, 0.5)","cyan":"#65E3FF","cyanLight":"rgba(101, 227, 255, 0.3)","cyanTransparent":"rgba(101, 227, 255, 0.12)","dbt":"#fc6949","dbtDark":"rgba(252, 105, 73, 0.3)","dbtLight":"rgba(252, 105, 73, 0.5)","info":"#00ABFF","infoTransparent":"rgba(0, 171, 255, 0.5)","negative":"#FF1E59","negativeTransparent":"rgba(255, 30, 89, 0.3)","pink":"#FF4FF8","pinkLight":"rgb(255, 79, 248, 0.5)","positive":"#00A81A","primaryTransparent":"rgba(155, 108, 167, 0.5)","purple":"#7D55EC","purpleLight":"rgba(125, 85, 236, 0.5)","rose":"#D1A2AB","roseLight":"rgba(209, 162, 171, 0.5)","sky":"#6AA1E0","skyLight":"rgba(106, 161, 224, 0.5)","teal":"#00B4CC","tealLight":"rgba(0, 180, 204, 0.5)","warning":"#DD9900","warningTransparent":"rgba(221, 153, 0, 0.5)","yellow":"#FFCC19","yellowLight":"rgba(255, 204, 25, 0.5)"},"background":{"blackTransparent":"rgba(0, 0, 0, 0.6)","blackTransparentDark":"rgba(0, 0, 0, 0.8)","chartBlock":"#2E3036","codeArea":"#1E1F24","codeTextarea":"#000000","content":"#1B1C20","danger":"#FFD0DB","dark":"#B1B8C3","dashboard":"#18181C","dashboardTransparent":"rgba(24, 24, 28, 0.1)","header":"#1B1B1B","menu":"#0F4CFF","muted":"#F9FAFC","navigation":"#EDEDED","output":"#2E3036","page":"#1E1F24","panel":"#232429","panelTransparent":"rgba(35, 36, 41, 0.7)","popup":"#27292E","row":"#2C2C2C","row2":"#51535C","scrollbarThumb":"rgba(100, 100, 100, 0.5)","scrollbarThumbHover":"rgba(255, 255, 255, 0.3)","scrollbarTrack":"#2E3036","success":"#8ADE00","successLight":"rgb(138, 222, 0, 0.3)","table":"#292A2F","tag":"#3A4550"},"borders":{"button":"#454850","contrast":"#FFFFFF","danger":"#FF144D","dark":"#000000","darkLight":"#2E3036","info":"#FFCC19","light":"#2F3034","medium":"#1C1C1C","medium2":"#141414","success":"#2FCB52"},"brand":{"earth100":"#C6EEDB","earth200":"#9DDFBF","earth300":"#6BBF96","earth400":"#37A46F","earth400Transparent":"rgba(55, 164, 111, 0.4)","earth500":"#00954C","energy100":"#FFF4BA","energy200":"#FFED92","energy300":"#FFE662","energy400":"#FFDA19","energy400Transparent":"rgba(255, 218, 25, 0.04)","energy500":"#F6C000","fire100":"#FFD7E0","fire200":"#FFA3B9","fire300":"#FF547D","fire400":"#FF144D","fire400Transparent":"rgba(255, 20, 77, 0.4)","fire500":"#EB0032","stone100":"#F3E6D7","stone200":"#E3D4C2","stone400":"#BFA78B","stone500":"#AF8859","water100":"#BDCEFF","water200":"#81A1FF","water300":"#517DFF","water400":"#2A60FE","water400Transparent":"rgba(42, 96, 254, 0.4)","water500":"#0F4CFF","wind100":"#EEEAFF","wind200":"#CCC1F4","wind300":"#A698DD","wind400":"#6B50D7","wind400SuperTransparent":"rgba(107, 80, 215, 0.12)","wind400Transparent":"rgba(107, 80, 215, 0.4)","wind500":"#4E32BC"},"chart":{"backgroundPrimary":"#7D55EC","backgroundSecondary":"#FF144D","backgroundTertiary":"#86E2FF","button1":"#4877FF","button2":"#FFCC19","button3":"#8ADE00","button4":"#FF4FF8","button5":"#B98D95","lines":"#9B6CA7","primary":"#6B50D7","secondary":"#FF144D","tertiary":"#2A60FE"},"content":{"active":"#FFFFFF","default":"#AEAEAE","disabled":"rgba(255, 255, 255, 0.3)","inverted":"#2C2C2C","muted":"#787A85"},"elevation":{"visualizationAccent":"#996CFF","visualizationAccentAlt":"#C1ACF7"},"feature":{"active":"rgba(250, 248, 254, 0.14)","disabled":"rgba(201, 206, 218, 0.12)"},"icons":{"neutral":"#787878"},"interactive":{"activeBorder":"#060606","blackBackgroundTransparent":"rgba(0, 0, 0, 0.5)","checked":"#060606","dangerBorder":"#FF144D","defaultBackground":"#36383F","defaultBackgroundTransparent":"rgba(54, 56, 63, 0.5)","defaultBorder":"#ffffff1a","disabledBorder":"#B1B8C3","focusBackground":"#B1B8C3","focusBorder":"#86E2FF","hoverBackground":"#4E4E4E","hoverBackgroundTransparent":"rgba(78, 78, 78, 0.5)","hoverBlackBackgroundTransparent":"rgba(0, 0, 0, 0.7)","hoverBorder":"#B9BFCA","hoverOverlay":"rgba(255, 255, 255, 0.1)","linkPrimary":"#1752FF","linkPrimaryHover":"#4877FF","linkPrimaryLight":"#5982ff","linkSecondary":"#6B50D7","linkSecondaryDisabled":"#C4B9EF","linkText":"#6AA1E0","linkTextLight":"#9ECBFF","purple":"#885EFF","rowHoverBackground":"rgba(0, 0, 0, 0.1)","transparent":"rgba(255, 255, 255, 0)"},"loader":{"color":"#EB0032","colorInverted":"#8ADE00"},"logo":{"color":"#FFFFFF"},"monotone":{"black":"#060606","blackTransparent":"rgba(0, 0, 0, 0.6)","gray":"#B1B8C3","grey100":"#F2F2F2","grey200":"#D5D7DC","grey300":"#B4B8C0","grey400":"#70747C","grey500":"#51535C","purple":"#6B50D7","white":"#FFFFFF","whiteTransparent":"rgba(255, 255, 255, 0.6)"},"neutral":{"n100":"#E7E8EA","n200":"#D8DADE","n300":"#CBCCD0","n400":"#BCBEC4","n500":"#AEB0B6"},"progress":{"negative":"#FF144D","positive":"#6B50D7"},"shadow":{"base":"12px 40px 120px rgba(0, 0, 0, 0.3)","frame":"0px 10px 40px rgba(0, 0, 0, 0.26)","menu":"4px 10px 20px rgba(6, 6, 6, 0.12)","popup":"10px 20px 40px rgba(0, 0, 0, 0.2)","small":"0px, 4px, rgba(0, 0, 0, 0.25)","window":"0px 10px 60px rgba(0, 0, 0, 0.7)"},"status":{"negative":"#FF144D","positive":"#24B400"},"text":{"fileBrowser":"#787A85"}}},"page":"/version-control","query":{},"buildId":"iCySon3_GCldnbC5U7C-s","assetPrefix":"/CLOUD_NOTEBOOK_BASE_PATH_PLACEHOLDER_","nextExport":true,"isFallback":false,"gip":true,"appGip":true,"scriptLoader":[]}</script></body></html>
@@ -121,6 +121,8 @@ CONCURRENCY_CONFIG_PIPELINE_RUN_LIMIT = get_int_value(
121
121
  )
122
122
  DISABLE_AUTO_BROWSER_OPEN = get_bool_value(os.getenv('DISABLE_AUTO_BROWSER_OPEN', 'False'))
123
123
  DISABLE_AUTORELOAD = get_bool_value(os.getenv('DISABLE_AUTORELOAD', 'False'))
124
+ HIDE_API_TRIGGER_TOKEN = get_bool_value(os.getenv('HIDE_API_TRIGGER_TOKEN', 'False'))
125
+
124
126
  # The hostname in Kubernetes or AWS ECS
125
127
  HOSTNAME = os.getenv('HOSTNAME')
126
128
  INITIAL_METADATA = os.getenv('INITIAL_METADATA')
@@ -1,14 +1,12 @@
1
1
  import os
2
2
  from unittest.mock import patch
3
3
 
4
- from mage_ai.data_preparation.models.block.dynamic.constants import (
5
- CHILD_DATA_VARIABLE_UUID,
6
- )
7
4
  from mage_ai.data_preparation.models.block.dynamic.counter import (
8
5
  DynamicBlockItemCounter,
9
6
  DynamicChildItemCounter,
10
7
  DynamicDuoItemCounter,
11
8
  )
9
+ from mage_ai.data_preparation.models.constants import CHILD_DATA_VARIABLE_UUID
12
10
  from mage_ai.data_preparation.models.variables.constants import (
13
11
  VariableAggregateDataTypeFilename,
14
12
  )
@@ -7,6 +7,7 @@ from typing import Callable, Dict, List, Union
7
7
 
8
8
  import aiohttp
9
9
  import pytz
10
+ import requests
10
11
 
11
12
  from mage_ai.api.operations.constants import OperationType
12
13
  from mage_ai.cache.block_action_object.constants import (
@@ -43,6 +44,8 @@ from mage_ai.usage_statistics.constants import (
43
44
  )
44
45
  from mage_ai.usage_statistics.utils import build_event_data_for_chart
45
46
 
47
+ AMPLITUDE_API_KEY = 'KwnbpKJNe6gOjC2X5ilxafFvxbNppiIfGejB2hlY'
48
+
46
49
 
47
50
  class UsageStatisticLogger():
48
51
  def __init__(
@@ -229,6 +232,17 @@ class UsageStatisticLogger():
229
232
  ),
230
233
  )
231
234
 
235
+ def pipeline_runs_impression_sync(self, count_func: Callable) -> bool:
236
+ if not self.help_improve_mage:
237
+ return False
238
+ return self.__send_message_sync(
239
+ dict(
240
+ object=EventObjectType.PIPELINE_RUN,
241
+ action=EventActionType.IMPRESSION,
242
+ pipeline_runs=count_func(),
243
+ ),
244
+ )
245
+
232
246
  @safe_db_query
233
247
  async def pipeline_runs_impression(self, count_func: Callable) -> bool:
234
248
  if not self.help_improve_mage:
@@ -301,19 +315,7 @@ class UsageStatisticLogger():
301
315
  )
302
316
 
303
317
  @safe_db_query
304
- async def pipeline_run_ended(self, pipeline_run: PipelineRun) -> bool:
305
- """
306
- Write "pipeline_run_ended" event to Amplitude for the given PipelineRun.
307
-
308
- Args:
309
- pipeline_run (PipelineRun): pipeline run to use to populate the event
310
-
311
- Returns:
312
- bool: True if event was successfully uploaded
313
- """
314
- if not self.help_improve_mage:
315
- return False
316
-
318
+ def pipeline_run_ended_data(self, pipeline_run: PipelineRun):
317
319
  pipeline = pipeline_run.pipeline
318
320
 
319
321
  if pipeline.type == PipelineType.INTEGRATION:
@@ -333,7 +335,7 @@ class UsageStatisticLogger():
333
335
 
334
336
  encoded_pipeline_uuid = pipeline.uuid.encode('utf-8')
335
337
  pipeline_schedule = pipeline_run.pipeline_schedule
336
- data = dict(
338
+ return dict(
337
339
  landing_time_enabled=1 if pipeline_schedule.landing_time_enabled() else 0,
338
340
  num_pipeline_blocks=len(block_configs),
339
341
  pipeline_run_uuid=pipeline_run.id,
@@ -346,11 +348,48 @@ class UsageStatisticLogger():
346
348
  unique_languages=list(set([b.get('language') for b in block_configs])),
347
349
  )
348
350
 
351
+ @safe_db_query
352
+ async def pipeline_run_ended(self, pipeline_run: PipelineRun) -> bool:
353
+ """
354
+ Write "pipeline_run_ended" event to Amplitude for the given PipelineRun.
355
+
356
+ Args:
357
+ pipeline_run (PipelineRun): pipeline run to use to populate the event
358
+
359
+ Returns:
360
+ bool: True if event was successfully uploaded
361
+ """
362
+ if not self.help_improve_mage:
363
+ return False
364
+
365
+ data = self.pipeline_run_ended_data(pipeline_run)
366
+
349
367
  return await self.__send_message(
350
368
  data,
351
369
  event_name=EventNameType.PIPELINE_RUN_ENDED,
352
370
  )
353
371
 
372
+ @safe_db_query
373
+ def pipeline_run_ended_sync(self, pipeline_run: PipelineRun) -> bool:
374
+ """
375
+ Write "pipeline_run_ended" event to Amplitude for the given PipelineRun.
376
+
377
+ Args:
378
+ pipeline_run (PipelineRun): pipeline run to use to populate the event
379
+
380
+ Returns:
381
+ bool: True if event was successfully uploaded
382
+ """
383
+ if not self.help_improve_mage:
384
+ return False
385
+
386
+ data = self.pipeline_run_ended_data(pipeline_run)
387
+
388
+ return self.__send_message_sync(
389
+ data,
390
+ event_name=EventNameType.PIPELINE_RUN_ENDED,
391
+ )
392
+
354
393
  @safe_db_query
355
394
  async def block_run_ended(self, block_run: BlockRun) -> bool:
356
395
  if not self.help_improve_mage:
@@ -452,7 +491,7 @@ class UsageStatisticLogger():
452
491
  async with session.post(
453
492
  API_ENDPOINT,
454
493
  json=dict(
455
- api_key='KwnbpKJNe6gOjC2X5ilxafFvxbNppiIfGejB2hlY',
494
+ api_key=AMPLITUDE_API_KEY,
456
495
  event_name=event_name,
457
496
  usage_statistics=data_to_send,
458
497
  ),
@@ -467,6 +506,51 @@ class UsageStatisticLogger():
467
506
  print(f'[Statistics] Message: {err}')
468
507
  return False
469
508
 
509
+ def __send_message_sync(
510
+ self,
511
+ data: Dict,
512
+ event_name: EventNameType = EventNameType.USAGE_STATISTIC_CREATE,
513
+ override_validation: bool = False,
514
+ project_uuid: str = None,
515
+ ) -> bool:
516
+ if not override_validation:
517
+ if is_test():
518
+ return False
519
+
520
+ if not self.help_improve_mage:
521
+ return False
522
+
523
+ if data is None:
524
+ data = {}
525
+
526
+ data_to_send = merge_dict(
527
+ self.__shared_metadata(),
528
+ data,
529
+ )
530
+
531
+ if project_uuid and not data_to_send.get('project_uuid'):
532
+ data_to_send['project_uuid'] = project_uuid
533
+
534
+ try:
535
+ response = requests.post(
536
+ API_ENDPOINT,
537
+ json={
538
+ 'api_key': AMPLITUDE_API_KEY,
539
+ 'event_name': event_name,
540
+ 'usage_statistics': data_to_send,
541
+ },
542
+ timeout=3
543
+ )
544
+ response.raise_for_status()
545
+ response_json = response.json()
546
+ if response_json.get('success'):
547
+ if is_debug():
548
+ print(json.dumps(data_to_send, indent=2))
549
+ return True
550
+ except Exception as err:
551
+ print(f'[Statistics] Message: {err}')
552
+ return False
553
+
470
554
  def __shared_metadata(self) -> Dict:
471
555
  return dict(
472
556
  environment=get_env(),
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: mage-ai
3
- Version: 0.9.75
3
+ Version: 0.9.76
4
4
  Summary: Mage is a tool for building and deploying data pipelines.
5
5
  Home-page: https://github.com/mage-ai/mage-ai
6
6
  Author: Mage
@@ -8,7 +8,7 @@ Author-email: eng@mage.ai
8
8
  Classifier: Programming Language :: Python :: 3
9
9
  Classifier: License :: OSI Approved :: Apache Software License
10
10
  Classifier: Operating System :: OS Independent
11
- Requires-Python: >=3.7
11
+ Requires-Python: >=3.9
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
14
  Requires-Dist: cachetools
@@ -23,27 +23,28 @@ Requires-Dist: aiohttp==3.10.0
23
23
  Requires-Dist: alembic>=1.7.5
24
24
  Requires-Dist: bcrypt==4.0.1
25
25
  Requires-Dist: croniter==1.3.7
26
- Requires-Dist: cryptography==42.0.0
26
+ Requires-Dist: cryptography==42.0.4
27
27
  Requires-Dist: dask>=2022.2.0
28
28
  Requires-Dist: datadog==0.44.0
29
29
  Requires-Dist: freezegun==1.2.2
30
30
  Requires-Dist: great-expectations==0.18.12
31
- Requires-Dist: httpx==0.23.1
31
+ Requires-Dist: httpx==0.25.0
32
32
  Requires-Dist: inflection==0.5.1
33
33
  Requires-Dist: ipykernel==6.15.0
34
34
  Requires-Dist: ipython==8.10.0
35
35
  Requires-Dist: itsdangerous~=1.1.0
36
36
  Requires-Dist: joblib>=1.1.0
37
37
  Requires-Dist: jupyter-server==2.14.1
38
- Requires-Dist: jupyter-client==7.4.4
38
+ Requires-Dist: jupyter_client==7.4.4
39
39
  Requires-Dist: ldap3==2.9.1
40
- Requires-Dist: memory-profiler
40
+ Requires-Dist: memory_profiler
41
41
  Requires-Dist: newrelic==8.8.0
42
42
  Requires-Dist: numpy>=1.22.0
43
43
  Requires-Dist: pandas>=1.3.0
44
44
  Requires-Dist: polars<0.19.2,>=0.18.0
45
- Requires-Dist: protobuf~=4.21.12
45
+ Requires-Dist: protobuf>=4.25.0
46
46
  Requires-Dist: psutil==5.9.8
47
+ Requires-Dist: pyairtable>=2.3.3
47
48
  Requires-Dist: pyarrow>=14.0.1
48
49
  Requires-Dist: python-dateutil==2.8.2
49
50
  Requires-Dist: pytz>=2022.2.1
@@ -60,88 +61,18 @@ Requires-Dist: sqlalchemy<2.0.0,>=1.4.20
60
61
  Requires-Dist: sqlglot[rs]
61
62
  Requires-Dist: terminado==0.17.1
62
63
  Requires-Dist: thefuzz[speedup]==0.19.0
63
- Requires-Dist: tornado==6.3.3
64
+ Requires-Dist: tornado==6.4.2
64
65
  Requires-Dist: typer[all]==0.9.0
65
- Requires-Dist: typing-extensions==4.10.0
66
+ Requires-Dist: typing_extensions==4.10.0
66
67
  Requires-Dist: watchdog==4.0.0
67
68
  Requires-Dist: Werkzeug==3.0.3
68
69
  Provides-Extra: ai
69
70
  Requires-Dist: astor>=0.8.1; extra == "ai"
70
71
  Requires-Dist: langchain==0.1.6; extra == "ai"
71
- Requires-Dist: langchain-community<0.0.20; extra == "ai"
72
- Requires-Dist: openai==1.39.0; extra == "ai"
73
- Provides-Extra: all
74
- Requires-Dist: PyGithub==1.59.0; extra == "all"
75
- Requires-Dist: astor>=0.8.1; extra == "all"
76
- Requires-Dist: aws-secretsmanager-caching==1.1.1.5; extra == "all"
77
- Requires-Dist: azure-eventhub==5.11.2; extra == "all"
78
- Requires-Dist: azure-identity==1.12.0; extra == "all"
79
- Requires-Dist: azure-keyvault-certificates==4.6.0; extra == "all"
80
- Requires-Dist: azure-keyvault-secrets==4.6.0; extra == "all"
81
- Requires-Dist: azure-mgmt-containerinstance==10.1.0; extra == "all"
82
- Requires-Dist: azure-storage-blob==12.14.1; extra == "all"
83
- Requires-Dist: boto3==1.26.60; extra == "all"
84
- Requires-Dist: botocore==1.29.60; extra == "all"
85
- Requires-Dist: clickhouse-connect~=0.6.23; extra == "all"
86
- Requires-Dist: confluent-avro~=1.8.0; extra == "all"
87
- Requires-Dist: db-dtypes==1.0.5; extra == "all"
88
- Requires-Dist: dbt-bigquery==1.7.2; extra == "all"
89
- Requires-Dist: dbt-clickhouse==1.7.1; extra == "all"
90
- Requires-Dist: dbt-core==1.7.4; extra == "all"
91
- Requires-Dist: dbt-duckdb==1.7.0; extra == "all"
92
- Requires-Dist: dbt-postgres==1.7.4; extra == "all"
93
- Requires-Dist: dbt-redshift==1.7.1; extra == "all"
94
- Requires-Dist: dbt-snowflake==1.7.1; extra == "all"
95
- Requires-Dist: dbt-spark==1.7.1; extra == "all"
96
- Requires-Dist: dbt-sqlserver==1.7.4; extra == "all"
97
- Requires-Dist: dbt-trino==1.7.1; extra == "all"
98
- Requires-Dist: duckdb==1.0.0; extra == "all"
99
- Requires-Dist: elasticsearch==8.15.1; extra == "all"
100
- Requires-Dist: google-api-core~=2.15.0; extra == "all"
101
- Requires-Dist: google-api-python-client~=2.70.0; extra == "all"
102
- Requires-Dist: google-cloud-bigquery~=3.14.1; extra == "all"
103
- Requires-Dist: google-cloud-iam~=2.13.0; extra == "all"
104
- Requires-Dist: google-cloud-pubsub~=2.19.0; extra == "all"
105
- Requires-Dist: google-cloud-run~=0.10.1; extra == "all"
106
- Requires-Dist: google-cloud-storage~=2.5.0; extra == "all"
107
- Requires-Dist: great-expectations==0.18.12; extra == "all"
108
- Requires-Dist: gspread==5.7.2; extra == "all"
109
- Requires-Dist: influxdb-client==1.36.1; extra == "all"
110
- Requires-Dist: kafka-python==2.0.2; extra == "all"
111
- Requires-Dist: kubernetes>=28.1.0; extra == "all"
112
- Requires-Dist: langchain==0.1.6; extra == "all"
113
- Requires-Dist: langchain-community<0.0.20; extra == "all"
114
- Requires-Dist: ldap3==2.9.1; extra == "all"
115
- Requires-Dist: nats-py==2.6.0; extra == "all"
116
- Requires-Dist: openai==1.39.0; extra == "all"
117
- Requires-Dist: opensearch-py==2.0.0; extra == "all"
118
- Requires-Dist: opentelemetry-api==1.22.0; extra == "all"
119
- Requires-Dist: opentelemetry-exporter-prometheus==0.43b0; extra == "all"
120
- Requires-Dist: opentelemetry-instrumentation-tornado==0.43b0; extra == "all"
121
- Requires-Dist: opentelemetry-exporter-otlp==1.22.0; extra == "all"
122
- Requires-Dist: opentelemetry-instrumentation-sqlalchemy==0.43b0; extra == "all"
123
- Requires-Dist: oracledb==1.3.1; extra == "all"
124
- Requires-Dist: pika==1.3.1; extra == "all"
125
- Requires-Dist: pinotdb==5.1.0; extra == "all"
126
- Requires-Dist: prometheus-client>=0.18.0; extra == "all"
127
- Requires-Dist: protobuf~=4.21.12; extra == "all"
128
- Requires-Dist: psycopg2-binary==2.9.3; extra == "all"
129
- Requires-Dist: psycopg2==2.9.3; extra == "all"
130
- Requires-Dist: pyairtable==2.3.3; extra == "all"
131
- Requires-Dist: pydruid==0.6.5; extra == "all"
132
- Requires-Dist: pymongo==4.3.3; extra == "all"
133
- Requires-Dist: redshift-connector==2.0.915; extra == "all"
134
- Requires-Dist: lxml==4.9.4; extra == "all"
135
- Requires-Dist: requests-aws4auth==1.1.2; extra == "all"
136
- Requires-Dist: snowflake-connector-python==3.7.1; extra == "all"
137
- Requires-Dist: sshtunnel==0.4.0; extra == "all"
138
- Requires-Dist: stomp.py==8.1.0; extra == "all"
139
- Requires-Dist: thefuzz[speedup]==0.19.0; extra == "all"
140
- Requires-Dist: trino~=0.326; extra == "all"
141
- Requires-Dist: nkeys~=0.1.0; python_version < "3.12" and extra == "all"
142
- Requires-Dist: pyodbc==4.0.35; python_version < "3.12" and extra == "all"
143
- Requires-Dist: nkeys~=0.2.0; python_version >= "3.12" and extra == "all"
144
- Requires-Dist: pyodbc==5.0.1; python_version >= "3.12" and extra == "all"
72
+ Requires-Dist: langchain_community<0.0.20; extra == "ai"
73
+ Requires-Dist: openai>=1.0.0; extra == "ai"
74
+ Provides-Extra: airtable
75
+ Requires-Dist: pyairtable>=2.3.3; extra == "airtable"
145
76
  Provides-Extra: azure
146
77
  Requires-Dist: azure-eventhub==5.11.2; extra == "azure"
147
78
  Requires-Dist: azure-identity==1.12.0; extra == "azure"
@@ -157,16 +88,18 @@ Requires-Dist: chromadb>=0.4.17; extra == "chroma"
157
88
  Provides-Extra: clickhouse
158
89
  Requires-Dist: clickhouse-connect~=0.6.23; extra == "clickhouse"
159
90
  Provides-Extra: dbt
160
- Requires-Dist: dbt-bigquery==1.7.2; extra == "dbt"
161
- Requires-Dist: dbt-clickhouse==1.7.1; extra == "dbt"
162
- Requires-Dist: dbt-core==1.7.4; extra == "dbt"
163
- Requires-Dist: dbt-duckdb==1.7.0; extra == "dbt"
164
- Requires-Dist: dbt-postgres==1.7.4; extra == "dbt"
165
- Requires-Dist: dbt-redshift==1.7.1; extra == "dbt"
166
- Requires-Dist: dbt-snowflake==1.7.1; extra == "dbt"
167
- Requires-Dist: dbt-spark==1.7.1; extra == "dbt"
168
- Requires-Dist: dbt-sqlserver==1.7.4; extra == "dbt"
169
- Requires-Dist: dbt-trino==1.7.1; extra == "dbt"
91
+ Requires-Dist: dbt-adapters==1.8.0; extra == "dbt"
92
+ Requires-Dist: dbt-bigquery==1.8.3; extra == "dbt"
93
+ Requires-Dist: dbt-clickhouse==1.8.5; extra == "dbt"
94
+ Requires-Dist: dbt-core==1.8.7; extra == "dbt"
95
+ Requires-Dist: dbt-duckdb==1.8.4; extra == "dbt"
96
+ Requires-Dist: dbt-postgres==1.8.2; extra == "dbt"
97
+ Requires-Dist: dbt-redshift==1.8.1; extra == "dbt"
98
+ Requires-Dist: dbt-snowflake==1.8.4; extra == "dbt"
99
+ Requires-Dist: dbt-spark==1.8.0; extra == "dbt"
100
+ Requires-Dist: dbt-sqlserver==1.8.4; extra == "dbt"
101
+ Requires-Dist: dbt-synapse==1.8.2; extra == "dbt"
102
+ Requires-Dist: dbt-trino==1.8.4; extra == "dbt"
170
103
  Requires-Dist: trino~=0.326; extra == "dbt"
171
104
  Provides-Extra: google-cloud-storage
172
105
  Requires-Dist: google-cloud-storage==2.5.0; extra == "google-cloud-storage"
@@ -175,7 +108,7 @@ Provides-Extra: hdf5
175
108
  Requires-Dist: tables==3.7.0; python_version < "3.11" and extra == "hdf5"
176
109
  Requires-Dist: tables==3.10.1; python_version >= "3.11" and extra == "hdf5"
177
110
  Provides-Extra: mysql
178
- Requires-Dist: mysql-connector-python~=8.2.0; python_version < "3.11" and extra == "mysql"
111
+ Requires-Dist: mysql-connector-python~=8.4.0; python_version < "3.11" and extra == "mysql"
179
112
  Requires-Dist: mysql-connector-python~=9.0.0; python_version >= "3.11" and extra == "mysql"
180
113
  Provides-Extra: oracle
181
114
  Requires-Dist: oracledb==1.3.1; python_version < "3.12" and extra == "oracle"
@@ -202,16 +135,99 @@ Requires-Dist: botocore==1.29.60; extra == "spark"
202
135
  Provides-Extra: streaming
203
136
  Requires-Dist: confluent-avro~=1.8.0; extra == "streaming"
204
137
  Requires-Dist: elasticsearch==8.15.1; extra == "streaming"
205
- Requires-Dist: influxdb-client==1.36.1; extra == "streaming"
138
+ Requires-Dist: influxdb_client==1.36.1; extra == "streaming"
206
139
  Requires-Dist: kafka-python==2.0.2; extra == "streaming"
207
140
  Requires-Dist: nats-py==2.6.0; extra == "streaming"
141
+ Requires-Dist: nkeys~=0.2.0; extra == "streaming"
208
142
  Requires-Dist: opensearch-py==2.0.0; extra == "streaming"
209
143
  Requires-Dist: pika==1.3.1; extra == "streaming"
210
144
  Requires-Dist: pymongo==4.3.3; extra == "streaming"
211
- Requires-Dist: requests-aws4auth==1.1.2; extra == "streaming"
145
+ Requires-Dist: requests_aws4auth==1.1.2; extra == "streaming"
212
146
  Requires-Dist: stomp.py==8.1.0; extra == "streaming"
213
- Requires-Dist: nkeys~=0.1.0; python_version < "3.12" and extra == "streaming"
214
- Requires-Dist: nkeys~=0.2.0; python_version >= "3.12" and extra == "streaming"
147
+ Provides-Extra: all
148
+ Requires-Dist: PyGithub==1.59.0; extra == "all"
149
+ Requires-Dist: astor>=0.8.1; extra == "all"
150
+ Requires-Dist: aws-secretsmanager-caching==1.1.1.5; extra == "all"
151
+ Requires-Dist: azure-eventhub==5.11.2; extra == "all"
152
+ Requires-Dist: azure-identity==1.12.0; extra == "all"
153
+ Requires-Dist: azure-keyvault-certificates==4.6.0; extra == "all"
154
+ Requires-Dist: azure-keyvault-secrets==4.6.0; extra == "all"
155
+ Requires-Dist: azure-mgmt-containerinstance==10.1.0; extra == "all"
156
+ Requires-Dist: azure-storage-blob==12.14.1; extra == "all"
157
+ Requires-Dist: boto3==1.26.60; extra == "all"
158
+ Requires-Dist: botocore==1.29.60; extra == "all"
159
+ Requires-Dist: clickhouse-connect~=0.6.23; extra == "all"
160
+ Requires-Dist: confluent-avro~=1.8.0; extra == "all"
161
+ Requires-Dist: db-dtypes==1.0.5; extra == "all"
162
+ Requires-Dist: dbt-adapters==1.8.0; extra == "all"
163
+ Requires-Dist: dbt-bigquery==1.8.3; extra == "all"
164
+ Requires-Dist: dbt-clickhouse==1.8.5; extra == "all"
165
+ Requires-Dist: dbt-core==1.8.7; extra == "all"
166
+ Requires-Dist: dbt-duckdb==1.8.4; extra == "all"
167
+ Requires-Dist: dbt-postgres==1.8.2; extra == "all"
168
+ Requires-Dist: dbt-redshift==1.8.1; extra == "all"
169
+ Requires-Dist: dbt-snowflake==1.8.4; extra == "all"
170
+ Requires-Dist: dbt-spark==1.8.0; extra == "all"
171
+ Requires-Dist: dbt-sqlserver==1.8.4; extra == "all"
172
+ Requires-Dist: dbt-synapse==1.8.2; extra == "all"
173
+ Requires-Dist: dbt-trino==1.8.4; extra == "all"
174
+ Requires-Dist: duckdb==1.0.0; extra == "all"
175
+ Requires-Dist: elasticsearch==8.15.1; extra == "all"
176
+ Requires-Dist: google-api-core~=2.15.0; extra == "all"
177
+ Requires-Dist: google-api-python-client~=2.70.0; extra == "all"
178
+ Requires-Dist: google-cloud-bigquery~=3.14.1; extra == "all"
179
+ Requires-Dist: google-cloud-iam~=2.13.0; extra == "all"
180
+ Requires-Dist: google-cloud-pubsub~=2.19.0; extra == "all"
181
+ Requires-Dist: google-cloud-run~=0.10.1; extra == "all"
182
+ Requires-Dist: google-cloud-storage~=2.5.0; extra == "all"
183
+ Requires-Dist: great-expectations==0.18.12; extra == "all"
184
+ Requires-Dist: gspread==5.7.2; extra == "all"
185
+ Requires-Dist: influxdb_client==1.36.1; extra == "all"
186
+ Requires-Dist: kafka-python==2.0.2; extra == "all"
187
+ Requires-Dist: kubernetes>=28.1.0; extra == "all"
188
+ Requires-Dist: langchain==0.1.6; extra == "all"
189
+ Requires-Dist: langchain_community<0.0.20; extra == "all"
190
+ Requires-Dist: ldap3==2.9.1; extra == "all"
191
+ Requires-Dist: nats-py==2.6.0; extra == "all"
192
+ Requires-Dist: nkeys~=0.2.0; extra == "all"
193
+ Requires-Dist: openai>=1.0.0; extra == "all"
194
+ Requires-Dist: opensearch-py==2.0.0; extra == "all"
195
+ Requires-Dist: opentelemetry-api==1.22.0; extra == "all"
196
+ Requires-Dist: opentelemetry-exporter-prometheus==0.43b0; extra == "all"
197
+ Requires-Dist: opentelemetry-instrumentation-tornado==0.43b0; extra == "all"
198
+ Requires-Dist: opentelemetry-exporter-otlp==1.22.0; extra == "all"
199
+ Requires-Dist: opentelemetry-instrumentation-sqlalchemy==0.43b0; extra == "all"
200
+ Requires-Dist: oracledb==1.3.1; extra == "all"
201
+ Requires-Dist: pika==1.3.1; extra == "all"
202
+ Requires-Dist: pinotdb==5.6.0; extra == "all"
203
+ Requires-Dist: prometheus_client>=0.18.0; extra == "all"
204
+ Requires-Dist: protobuf>=4.25.0; extra == "all"
205
+ Requires-Dist: psycopg2-binary==2.9.3; extra == "all"
206
+ Requires-Dist: psycopg2==2.9.3; extra == "all"
207
+ Requires-Dist: pyairtable==2.3.3; extra == "all"
208
+ Requires-Dist: pydruid==0.6.5; extra == "all"
209
+ Requires-Dist: pymongo==4.3.3; extra == "all"
210
+ Requires-Dist: pyodbc==4.0.35; python_version < "3.12" and extra == "all"
211
+ Requires-Dist: pyodbc==5.0.1; python_version >= "3.12" and extra == "all"
212
+ Requires-Dist: redshift-connector==2.0.915; extra == "all"
213
+ Requires-Dist: lxml==4.9.4; extra == "all"
214
+ Requires-Dist: requests_aws4auth==1.1.2; extra == "all"
215
+ Requires-Dist: snowflake-connector-python==3.7.1; extra == "all"
216
+ Requires-Dist: sshtunnel==0.4.0; extra == "all"
217
+ Requires-Dist: stomp.py==8.1.0; extra == "all"
218
+ Requires-Dist: thefuzz[speedup]==0.19.0; extra == "all"
219
+ Requires-Dist: trino~=0.326; extra == "all"
220
+ Dynamic: author
221
+ Dynamic: author-email
222
+ Dynamic: classifier
223
+ Dynamic: description
224
+ Dynamic: description-content-type
225
+ Dynamic: home-page
226
+ Dynamic: license-file
227
+ Dynamic: provides-extra
228
+ Dynamic: requires-dist
229
+ Dynamic: requires-python
230
+ Dynamic: summary
215
231
 
216
232
  <div align="left">
217
233
  <h1>Mage AI</h1>
@@ -227,7 +243,7 @@ Requires-Dist: nkeys~=0.2.0; python_version >= "3.12" and extra == "streaming"
227
243
 
228
244
  <br />
229
245
 
230
- <a href="https://mage.ai/pro">
246
+ <a href="https://cloud.mage.ai/sign-up">
231
247
  <picture>
232
248
  <source media="(prefers-color-scheme: dark)" srcset="https://github.com/mage-ai/assets/blob/main/oss/hero.png?raw=true">
233
249
  <img alt="Mage AI hero" src="https://github.com/mage-ai/assets/blob/main/oss/hero.png?raw=true" />
@@ -259,7 +275,7 @@ Plus hundreds of enterprise-class features, infrastructure innovations, and magi
259
275
  <table style="width: 100%; border: none;" cellspacing="0" cellpadding="0" border="0">
260
276
  <tr>
261
277
  <td rowspan="2">
262
- <a href="https://mage.ai/pro">
278
+ <a href="https://cloud.mage.ai/sign-up">
263
279
  <img alt="Mage Pro" width="124" align="left" src="https://github.com/mage-ai/assets/blob/main/oss/card-pro.png?raw=true" />
264
280
  </a>
265
281
  <b>For teams.</b> Fully managed platform
@@ -277,7 +293,7 @@ Plus hundreds of enterprise-class features, infrastructure innovations, and magi
277
293
 
278
294
  <br />
279
295
 
280
- <a href="https://mage.ai/pro">
296
+ <a href="https://cloud.mage.ai/sign-up">
281
297
  <img alt="Try out Mage Pro" src="https://img.shields.io/badge/try%20it%20out%20now-black.svg?style=for-the-badge&logo=artifacthub&labelColor=6A35FF&logoColor=FFFFFF&label=mage%20pro&color=6A35FF">
282
298
  </a>
283
299
 
@@ -289,7 +305,7 @@ Plus hundreds of enterprise-class features, infrastructure innovations, and magi
289
305
  # It’s magic.
290
306
 
291
307
  <p align="left">
292
- For documentation on getting started, how to develop, and how to deploy to production check out the live
308
+ For documentation on getting started, how to develop, and how to deploy to production check out the live
293
309
  <br />
294
310
  <a
295
311
  href="https://docs.mage.ai?source=github"