flowyml 1.7.2__tar.gz → 1.8.0__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 (284) hide show
  1. flowyml-1.8.0/PKG-INFO +174 -0
  2. flowyml-1.8.0/README.md +108 -0
  3. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/assets/base.py +15 -0
  4. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/assets/metrics.py +5 -0
  5. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/cli/main.py +709 -0
  6. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/cli/stack_cli.py +138 -25
  7. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/__init__.py +17 -0
  8. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/executor.py +161 -26
  9. flowyml-1.8.0/flowyml/core/image_builder.py +129 -0
  10. flowyml-1.8.0/flowyml/core/log_streamer.py +227 -0
  11. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/orchestrator.py +22 -2
  12. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/pipeline.py +34 -10
  13. flowyml-1.8.0/flowyml/core/routing.py +558 -0
  14. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/step.py +9 -1
  15. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/step_grouping.py +49 -35
  16. flowyml-1.8.0/flowyml/core/types.py +407 -0
  17. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/monitoring/alerts.py +10 -0
  18. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/monitoring/notifications.py +104 -25
  19. flowyml-1.8.0/flowyml/monitoring/slack_blocks.py +323 -0
  20. flowyml-1.8.0/flowyml/plugins/__init__.py +251 -0
  21. flowyml-1.8.0/flowyml/plugins/alerters/__init__.py +1 -0
  22. flowyml-1.8.0/flowyml/plugins/alerters/slack.py +168 -0
  23. flowyml-1.8.0/flowyml/plugins/base.py +752 -0
  24. flowyml-1.8.0/flowyml/plugins/config.py +478 -0
  25. flowyml-1.8.0/flowyml/plugins/deployers/__init__.py +22 -0
  26. flowyml-1.8.0/flowyml/plugins/deployers/gcp_cloud_run.py +200 -0
  27. flowyml-1.8.0/flowyml/plugins/deployers/sagemaker.py +306 -0
  28. flowyml-1.8.0/flowyml/plugins/deployers/vertex.py +290 -0
  29. flowyml-1.8.0/flowyml/plugins/integration.py +369 -0
  30. flowyml-1.8.0/flowyml/plugins/manager.py +510 -0
  31. flowyml-1.8.0/flowyml/plugins/model_registries/__init__.py +22 -0
  32. flowyml-1.8.0/flowyml/plugins/model_registries/mlflow.py +159 -0
  33. flowyml-1.8.0/flowyml/plugins/model_registries/sagemaker.py +489 -0
  34. flowyml-1.8.0/flowyml/plugins/model_registries/vertex.py +386 -0
  35. flowyml-1.8.0/flowyml/plugins/orchestrators/__init__.py +13 -0
  36. flowyml-1.8.0/flowyml/plugins/orchestrators/sagemaker.py +443 -0
  37. flowyml-1.8.0/flowyml/plugins/orchestrators/vertex_ai.py +461 -0
  38. flowyml-1.8.0/flowyml/plugins/registries/__init__.py +13 -0
  39. flowyml-1.8.0/flowyml/plugins/registries/ecr.py +321 -0
  40. flowyml-1.8.0/flowyml/plugins/registries/gcr.py +313 -0
  41. flowyml-1.8.0/flowyml/plugins/registry.py +454 -0
  42. flowyml-1.8.0/flowyml/plugins/stack.py +494 -0
  43. flowyml-1.8.0/flowyml/plugins/stack_config.py +537 -0
  44. flowyml-1.8.0/flowyml/plugins/stores/__init__.py +13 -0
  45. flowyml-1.8.0/flowyml/plugins/stores/gcs.py +460 -0
  46. flowyml-1.8.0/flowyml/plugins/stores/s3.py +453 -0
  47. flowyml-1.8.0/flowyml/plugins/trackers/__init__.py +11 -0
  48. flowyml-1.8.0/flowyml/plugins/trackers/mlflow.py +316 -0
  49. flowyml-1.8.0/flowyml/plugins/validators/__init__.py +3 -0
  50. flowyml-1.8.0/flowyml/plugins/validators/deepchecks.py +119 -0
  51. flowyml-1.8.0/flowyml/registry/__init__.py +6 -0
  52. flowyml-1.8.0/flowyml/registry/model_environment.py +109 -0
  53. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/registry/model_registry.py +241 -96
  54. flowyml-1.8.0/flowyml/serving/__init__.py +17 -0
  55. flowyml-1.8.0/flowyml/serving/model_server.py +628 -0
  56. flowyml-1.8.0/flowyml/stacks/__init__.py +102 -0
  57. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/stacks/aws.py +93 -0
  58. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/stacks/base.py +62 -0
  59. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/stacks/components.py +12 -0
  60. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/stacks/gcp.py +44 -9
  61. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/stacks/plugins.py +115 -0
  62. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/stacks/registry.py +2 -1
  63. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/storage/sql.py +401 -12
  64. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/tracking/experiment.py +8 -5
  65. flowyml-1.8.0/flowyml/ui/backend/Dockerfile +102 -0
  66. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/backend/auth.py +12 -2
  67. flowyml-1.8.0/flowyml/ui/backend/main.py +296 -0
  68. flowyml-1.8.0/flowyml/ui/backend/routers/ai_context.py +226 -0
  69. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/backend/routers/assets.py +23 -4
  70. flowyml-1.8.0/flowyml/ui/backend/routers/auth.py +96 -0
  71. flowyml-1.8.0/flowyml/ui/backend/routers/deployments.py +660 -0
  72. flowyml-1.8.0/flowyml/ui/backend/routers/model_explorer.py +597 -0
  73. flowyml-1.8.0/flowyml/ui/backend/routers/plugins.py +244 -0
  74. flowyml-1.8.0/flowyml/ui/backend/routers/projects.py +194 -0
  75. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/backend/routers/runs.py +20 -1
  76. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/backend/routers/schedules.py +22 -17
  77. flowyml-1.8.0/flowyml/ui/backend/routers/templates.py +319 -0
  78. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/backend/routers/websocket.py +2 -2
  79. flowyml-1.8.0/flowyml/ui/frontend/Dockerfile +69 -0
  80. flowyml-1.8.0/flowyml/ui/frontend/dist/assets/index-B5AsPTSz.css +1 -0
  81. flowyml-1.8.0/flowyml/ui/frontend/dist/assets/index-dFbZ8wD8.js +753 -0
  82. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/dist/index.html +2 -2
  83. flowyml-1.8.0/flowyml/ui/frontend/dist/logo.png +0 -0
  84. flowyml-1.8.0/flowyml/ui/frontend/nginx.conf +87 -0
  85. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/package-lock.json +1404 -74
  86. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/package.json +3 -0
  87. flowyml-1.8.0/flowyml/ui/frontend/public/logo.png +0 -0
  88. flowyml-1.8.0/flowyml/ui/frontend/src/App.jsx +27 -0
  89. flowyml-1.8.0/flowyml/ui/frontend/src/app/auth/Login.jsx +90 -0
  90. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/dashboard/page.jsx +8 -8
  91. flowyml-1.8.0/flowyml/ui/frontend/src/app/deployments/page.jsx +786 -0
  92. flowyml-1.8.0/flowyml/ui/frontend/src/app/model-explorer/page.jsx +1031 -0
  93. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/pipelines/page.jsx +12 -2
  94. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/projects/[projectId]/_components/ProjectExperimentsList.jsx +19 -6
  95. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/runs/[runId]/page.jsx +36 -24
  96. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/runs/page.jsx +8 -2
  97. flowyml-1.8.0/flowyml/ui/frontend/src/app/settings/page.jsx +329 -0
  98. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/AssetDetailsPanel.jsx +29 -7
  99. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/Layout.jsx +6 -0
  100. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/PipelineGraph.jsx +79 -29
  101. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/RunDetailsPanel.jsx +36 -6
  102. flowyml-1.8.0/flowyml/ui/frontend/src/components/RunMetaPanel.jsx +113 -0
  103. flowyml-1.8.0/flowyml/ui/frontend/src/components/ai/AIAssistantButton.jsx +71 -0
  104. flowyml-1.8.0/flowyml/ui/frontend/src/components/ai/AIAssistantPanel.jsx +420 -0
  105. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/header/Header.jsx +22 -0
  106. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/plugins/PluginManager.jsx +4 -4
  107. flowyml-1.7.2/flowyml/ui/frontend/src/components/plugins/ZenMLIntegration.jsx → flowyml-1.8.0/flowyml/ui/frontend/src/components/plugins/StackImport.jsx +38 -12
  108. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/sidebar/Sidebar.jsx +36 -13
  109. flowyml-1.8.0/flowyml/ui/frontend/src/contexts/AIAssistantContext.jsx +245 -0
  110. flowyml-1.8.0/flowyml/ui/frontend/src/contexts/AuthContext.jsx +108 -0
  111. flowyml-1.8.0/flowyml/ui/frontend/src/hooks/useAIContext.js +156 -0
  112. flowyml-1.8.0/flowyml/ui/frontend/src/hooks/useWebGPU.js +54 -0
  113. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/layouts/MainLayout.jsx +6 -0
  114. flowyml-1.8.0/flowyml/ui/frontend/src/router/index.jsx +74 -0
  115. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/services/pluginService.js +3 -1
  116. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/server_manager.py +5 -5
  117. flowyml-1.8.0/flowyml/ui/utils.py +259 -0
  118. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/utils/config.py +37 -15
  119. flowyml-1.8.0/flowyml/utils/model_introspection.py +123 -0
  120. flowyml-1.8.0/flowyml/utils/observability.py +30 -0
  121. {flowyml-1.7.2 → flowyml-1.8.0}/pyproject.toml +17 -4
  122. flowyml-1.7.2/PKG-INFO +0 -477
  123. flowyml-1.7.2/README.md +0 -419
  124. flowyml-1.7.2/flowyml/registry/__init__.py +0 -5
  125. flowyml-1.7.2/flowyml/stacks/__init__.py +0 -42
  126. flowyml-1.7.2/flowyml/ui/backend/Dockerfile +0 -31
  127. flowyml-1.7.2/flowyml/ui/backend/main.py +0 -152
  128. flowyml-1.7.2/flowyml/ui/backend/routers/plugins.py +0 -192
  129. flowyml-1.7.2/flowyml/ui/backend/routers/projects.py +0 -111
  130. flowyml-1.7.2/flowyml/ui/frontend/Dockerfile +0 -20
  131. flowyml-1.7.2/flowyml/ui/frontend/dist/assets/index-B40RsQDq.css +0 -1
  132. flowyml-1.7.2/flowyml/ui/frontend/dist/assets/index-CjI0zKCn.js +0 -685
  133. flowyml-1.7.2/flowyml/ui/frontend/nginx.conf +0 -26
  134. flowyml-1.7.2/flowyml/ui/frontend/src/App.jsx +0 -24
  135. flowyml-1.7.2/flowyml/ui/frontend/src/app/settings/page.jsx +0 -315
  136. flowyml-1.7.2/flowyml/ui/frontend/src/router/index.jsx +0 -47
  137. flowyml-1.7.2/flowyml/ui/utils.py +0 -141
  138. {flowyml-1.7.2 → flowyml-1.8.0}/LICENSE +0 -0
  139. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/__init__.py +0 -0
  140. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/assets/__init__.py +0 -0
  141. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/assets/artifact.py +0 -0
  142. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/assets/dataset.py +0 -0
  143. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/assets/featureset.py +0 -0
  144. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/assets/model.py +0 -0
  145. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/assets/registry.py +0 -0
  146. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/assets/report.py +0 -0
  147. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/cli/__init__.py +0 -0
  148. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/cli/experiment.py +0 -0
  149. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/cli/init.py +0 -0
  150. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/cli/models.py +0 -0
  151. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/cli/rich_utils.py +0 -0
  152. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/cli/run.py +0 -0
  153. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/cli/ui.py +0 -0
  154. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/advanced_cache.py +0 -0
  155. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/approval.py +0 -0
  156. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/cache.py +0 -0
  157. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/checkpoint.py +0 -0
  158. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/conditional.py +0 -0
  159. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/context.py +0 -0
  160. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/display.py +0 -0
  161. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/error_handling.py +0 -0
  162. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/execution_status.py +0 -0
  163. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/graph.py +0 -0
  164. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/hooks.py +0 -0
  165. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/observability.py +0 -0
  166. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/parallel.py +0 -0
  167. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/project.py +0 -0
  168. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/remote_orchestrator.py +0 -0
  169. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/resources.py +0 -0
  170. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/retry_policy.py +0 -0
  171. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/scheduler.py +0 -0
  172. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/scheduler_config.py +0 -0
  173. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/submission_result.py +0 -0
  174. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/templates.py +0 -0
  175. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/core/versioning.py +0 -0
  176. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/integrations/__init__.py +0 -0
  177. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/integrations/keras.py +0 -0
  178. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/monitoring/__init__.py +0 -0
  179. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/monitoring/data.py +0 -0
  180. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/monitoring/llm.py +0 -0
  181. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/monitoring/monitor.py +0 -0
  182. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/registry/pipeline_registry.py +0 -0
  183. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/stacks/azure.py +0 -0
  184. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/stacks/bridge.py +0 -0
  185. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/stacks/local.py +0 -0
  186. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/stacks/migration.py +0 -0
  187. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/stacks/plugin_config.py +0 -0
  188. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/storage/__init__.py +0 -0
  189. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/storage/artifacts.py +0 -0
  190. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/storage/materializers/__init__.py +0 -0
  191. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/storage/materializers/base.py +0 -0
  192. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/storage/materializers/cloudpickle.py +0 -0
  193. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/storage/materializers/keras.py +0 -0
  194. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/storage/materializers/numpy.py +0 -0
  195. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/storage/materializers/pandas.py +0 -0
  196. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/storage/materializers/pytorch.py +0 -0
  197. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/storage/materializers/sklearn.py +0 -0
  198. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/storage/materializers/tensorflow.py +0 -0
  199. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/storage/metadata.py +0 -0
  200. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/storage/remote.py +0 -0
  201. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/tracking/__init__.py +0 -0
  202. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/tracking/leaderboard.py +0 -0
  203. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/tracking/runs.py +0 -0
  204. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/__init__.py +0 -0
  205. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/backend/__init__.py +0 -0
  206. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/backend/dependencies.py +0 -0
  207. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/backend/routers/__init__.py +0 -0
  208. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/backend/routers/client.py +0 -0
  209. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/backend/routers/execution.py +0 -0
  210. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/backend/routers/experiments.py +0 -0
  211. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/backend/routers/leaderboard.py +0 -0
  212. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/backend/routers/metrics.py +0 -0
  213. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/backend/routers/notifications.py +0 -0
  214. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/backend/routers/pipelines.py +0 -0
  215. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/backend/routers/stats.py +0 -0
  216. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/backend/routers/traces.py +0 -0
  217. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/README.md +0 -0
  218. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/index.html +0 -0
  219. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/postcss.config.js +0 -0
  220. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/assets/page.jsx +0 -0
  221. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/compare/page.jsx +0 -0
  222. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/experiments/[experimentId]/page.jsx +0 -0
  223. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/experiments/compare/page.jsx +0 -0
  224. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/experiments/page.jsx +0 -0
  225. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/leaderboard/page.jsx +0 -0
  226. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/observability/page.jsx +0 -0
  227. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/plugins/page.jsx +0 -0
  228. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/projects/[projectId]/_components/ProjectArtifactsList.jsx +0 -0
  229. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/projects/[projectId]/_components/ProjectHeader.jsx +0 -0
  230. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/projects/[projectId]/_components/ProjectHierarchy.jsx +0 -0
  231. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/projects/[projectId]/_components/ProjectMetricsPanel.jsx +0 -0
  232. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/projects/[projectId]/_components/ProjectPipelinesList.jsx +0 -0
  233. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/projects/[projectId]/_components/ProjectRelations.jsx +0 -0
  234. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/projects/[projectId]/_components/ProjectRunsList.jsx +0 -0
  235. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/projects/[projectId]/_components/ProjectTabs.jsx +0 -0
  236. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/projects/[projectId]/page.jsx +0 -0
  237. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/projects/page.jsx +0 -0
  238. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/schedules/page.jsx +0 -0
  239. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/tokens/page.jsx +0 -0
  240. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/app/traces/page.jsx +0 -0
  241. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/ArtifactViewer.jsx +0 -0
  242. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/AssetLineageGraph.jsx +0 -0
  243. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/AssetStatsDashboard.jsx +0 -0
  244. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/AssetTreeHierarchy.jsx +0 -0
  245. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/DatasetViewer.jsx +0 -0
  246. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/ExperimentDetailsPanel.jsx +0 -0
  247. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/NavigationTree.jsx +0 -0
  248. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/PipelineDetailsPanel.jsx +0 -0
  249. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/ProjectSelector.jsx +0 -0
  250. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/TrainingHistoryChart.jsx +0 -0
  251. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/TrainingMetricsPanel.jsx +0 -0
  252. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/plugins/AddPluginDialog.jsx +0 -0
  253. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/plugins/InstalledPlugins.jsx +0 -0
  254. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/plugins/PluginBrowser.jsx +0 -0
  255. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/ui/Badge.jsx +0 -0
  256. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/ui/Button.jsx +0 -0
  257. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/ui/Card.jsx +0 -0
  258. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/ui/CodeSnippet.jsx +0 -0
  259. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/ui/CollapsibleCard.jsx +0 -0
  260. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/ui/DataView.jsx +0 -0
  261. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/ui/EmptyState.jsx +0 -0
  262. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/ui/ErrorBoundary.jsx +0 -0
  263. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/ui/ExecutionStatus.jsx +0 -0
  264. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/ui/KeyValue.jsx +0 -0
  265. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/components/ui/ProjectSelector.jsx +0 -0
  266. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/contexts/ProjectContext.jsx +0 -0
  267. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/contexts/ThemeContext.jsx +0 -0
  268. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/contexts/ToastContext.jsx +0 -0
  269. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/index.css +0 -0
  270. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/main.jsx +0 -0
  271. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/utils/api.js +0 -0
  272. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/utils/cn.js +0 -0
  273. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/utils/date.js +0 -0
  274. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/src/utils/downloads.js +0 -0
  275. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/tailwind.config.js +0 -0
  276. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/ui/frontend/vite.config.js +0 -0
  277. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/utils/__init__.py +0 -0
  278. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/utils/debug.py +0 -0
  279. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/utils/environment.py +0 -0
  280. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/utils/git.py +0 -0
  281. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/utils/logging.py +0 -0
  282. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/utils/performance.py +0 -0
  283. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/utils/stack_config.py +0 -0
  284. {flowyml-1.7.2 → flowyml-1.8.0}/flowyml/utils/validation.py +0 -0
flowyml-1.8.0/PKG-INFO ADDED
@@ -0,0 +1,174 @@
1
+ Metadata-Version: 2.4
2
+ Name: flowyml
3
+ Version: 1.8.0
4
+ Summary: Next-Generation ML Pipeline Framework
5
+ License: Apache-2.0
6
+ License-File: LICENSE
7
+ Author: flowyml Team
8
+ Author-email: support@unicolab.ai
9
+ Requires-Python: >=3.10,<4.0
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Intended Audience :: Science/Research
13
+ Classifier: License :: OSI Approved :: Apache Software License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
20
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
21
+ Provides-Extra: all
22
+ Provides-Extra: aws
23
+ Provides-Extra: azure
24
+ Provides-Extra: gcp
25
+ Provides-Extra: pytorch
26
+ Provides-Extra: rich
27
+ Provides-Extra: sklearn
28
+ Provides-Extra: tensorflow
29
+ Provides-Extra: ui
30
+ Requires-Dist: alembic (>=1.13.0)
31
+ Requires-Dist: boto3 (>=1.28) ; extra == "aws" or extra == "all"
32
+ Requires-Dist: click (>=8.0.0)
33
+ Requires-Dist: cloudpickle (>=2.0.0)
34
+ Requires-Dist: croniter (>=2.0.1,<3.0.0)
35
+ Requires-Dist: fastapi (>=0.122.0,<0.123.0) ; extra == "ui" or extra == "all"
36
+ Requires-Dist: google-cloud-aiplatform (>=1.35.0) ; extra == "gcp" or extra == "all"
37
+ Requires-Dist: google-cloud-storage (>=2.10.0) ; extra == "gcp" or extra == "all"
38
+ Requires-Dist: httpx (>=0.24,<0.28)
39
+ Requires-Dist: loguru (>=0.7.3,<0.8.0)
40
+ Requires-Dist: numpy (>=1.20.0)
41
+ Requires-Dist: opentelemetry-api (>=1.39.1,<2.0.0)
42
+ Requires-Dist: opentelemetry-exporter-prometheus (>=0.60b1,<0.61)
43
+ Requires-Dist: opentelemetry-instrumentation-fastapi (>=0.60b1,<0.61)
44
+ Requires-Dist: opentelemetry-sdk (>=1.39.1,<2.0.0)
45
+ Requires-Dist: pandas (>=1.3.0)
46
+ Requires-Dist: psutil (>=7.2.2,<8.0.0)
47
+ Requires-Dist: psycopg2-binary (>=2.9.0)
48
+ Requires-Dist: pydantic (>=2.0.0)
49
+ Requires-Dist: python-multipart (>=0.0.9) ; extra == "ui" or extra == "all"
50
+ Requires-Dist: pytz (>=2024.1,<2025.0)
51
+ Requires-Dist: pyyaml (>=6.0)
52
+ Requires-Dist: requests (>=2.28.0)
53
+ Requires-Dist: rich (>=13.0.0) ; extra == "rich"
54
+ Requires-Dist: scikit-learn (>=1.0.0) ; extra == "sklearn" or extra == "all"
55
+ Requires-Dist: sqlalchemy (>=2.0.0)
56
+ Requires-Dist: tensorflow (>=2.12.0) ; extra == "tensorflow" or extra == "all"
57
+ Requires-Dist: toml (>=0.10.2)
58
+ Requires-Dist: torch (>=2.0.0) ; extra == "pytorch" or extra == "all"
59
+ Requires-Dist: uvicorn[standard] (>=0.23.0) ; extra == "ui" or extra == "all"
60
+ Requires-Dist: websockets (>=11.0) ; extra == "ui" or extra == "all"
61
+ Project-URL: Documentation, https://unicolab.github.io/FlowyML/latest
62
+ Project-URL: Homepage, https://github.com/UnicoLab/FlowyML
63
+ Project-URL: Repository, https://github.com/UnicoLab/FlowyML
64
+ Description-Content-Type: text/markdown
65
+
66
+ # 🌊 flowyml
67
+
68
+ <p align="center">
69
+ <img src="docs/logo.png" width="350" alt="flowyml Logo"/>
70
+ <br>
71
+ <em>The Enterprise-Grade ML Pipeline Framework for Humans</em>
72
+ <br>
73
+ <br>
74
+ <p align="center">
75
+ <a href="https://github.com/UnicoLab/FlowyML/actions"><img src="https://img.shields.io/github/actions/workflow/status/UnicoLab/FlowyML/ci.yml?branch=main" alt="CI Status"></a>
76
+ <a href="https://pypi.org/project/flowyml/"><img src="https://img.shields.io/pypi/v/flowyml" alt="PyPI Version"></a>
77
+ <a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.10+-blue.svg" alt="Python 3.10+"></a>
78
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-blue.svg" alt="License"></a>
79
+ <a href="https://unicolab.ai"><img src="https://img.shields.io/badge/UnicoLab-ai-red.svg" alt="UnicoLab"></a>
80
+ </p>
81
+ </p>
82
+
83
+ ---
84
+
85
+ **FlowyML** is a lightweight yet powerful ML pipeline orchestration framework. It bridges the gap between rapid experimentation and enterprise production by making assets first-class citizens. Write pipelines in pure Python, and scale them to production without changing a single line of code.
86
+
87
+ ## 🚀 Why FlowyML?
88
+
89
+ | Feature | FlowyML | Traditional Orchestrators |
90
+ |---------|---------|---------------------------|
91
+ | **Developer Experience** | 🐍 **Native Python** - No DSLs, no YAML hell. | 📜 Complex YAML or rigid DSLs. |
92
+ | **Type-Based Routing** | 🧠 **Auto-Routing** - Define WHAT, we handle WHERE. | 🔌 Manual wiring to cloud buckets. |
93
+ | **Smart Caching** | ⚡ **Multi-Level** - Smart content-hashing skips re-runs. | 🐢 Basic file-timestamp checking. |
94
+ | **Asset Management** | 📦 **First-Class Assets** - Models & Datasets with lineage. | 📁 Generic file paths only. |
95
+ | **Multi-Stack** | 🌍 **Abstract Infra** - Switch local/prod with one env var. | 🔒 Vendor lock-in or complex setup. |
96
+ | **GenAI Ready** | 🤖 **LLM Tracing** - Built-in token & cost tracking. | 🧩 Requires external tools. |
97
+
98
+ ---
99
+
100
+ ## ⚡️ Quick Start
101
+
102
+ This is a complete, multi-step ML pipeline with auto-injected context:
103
+
104
+ ```python
105
+ from flowyml import Pipeline, step, context
106
+
107
+ @step(outputs=["dataset"])
108
+ def load_data(batch_size: int = 32):
109
+ return [i for i in range(batch_size)]
110
+
111
+ @step(inputs=["dataset"], outputs=["model"])
112
+ def train_model(dataset, learning_rate: float = 0.01):
113
+ print(f"Training on {len(dataset)} items with lr={learning_rate}")
114
+ return "model_v1"
115
+
116
+ # Configure and Run
117
+ ctx = context(learning_rate=0.05, batch_size=64)
118
+ pipeline = Pipeline("quickstart", context=ctx)
119
+ pipeline.add_step(load_data).add_step(train_model)
120
+
121
+ pipeline.run()
122
+ ```
123
+
124
+ ---
125
+
126
+ ## 🌟 Key Features
127
+
128
+ ### 1. 🧠 Type-Based Artifact Routing (New in 1.8.0)
129
+ Define artifact types in code, and FlowyML automatically routes them to your cloud infrastructure.
130
+ ```python
131
+ @step
132
+ def train(...) -> Model:
133
+ # Auto-saved to GCS/S3 and registered to Vertex AI / SageMaker
134
+ return Model(obj, name="classifier")
135
+ ```
136
+
137
+ ### 2. 🌍 Multi-Stack Configuration
138
+ Manage local, staging, and production environments in a single `flowyml.yaml`.
139
+ ```bash
140
+ export FLOWYML_STACK=production
141
+ python pipeline.py # Now runs on Vertex AI with GCS storage
142
+ ```
143
+
144
+ ### 3. 🛡️ Intelligent Step Grouping
145
+ Group consecutive steps to run in the same container. Perfect for reducing overhead while maintaining clear step boundaries.
146
+
147
+ ### 4. 📊 Built-in Observability
148
+ Beautiful dark-mode dashboard to monitor pipelines, visualize DAGs, and inspect artifacts in real-time.
149
+
150
+ ---
151
+
152
+ ## 📦 Installation
153
+
154
+ ```bash
155
+ # Install core
156
+ pip install flowyml
157
+
158
+ # Install with everything (recommended)
159
+ pip install "flowyml[all]"
160
+ ```
161
+
162
+ ## 📚 Documentation
163
+
164
+ Visit [docs.flowyml.ai](https://docs.flowyml.ai) for:
165
+ - **[Getting Started](https://docs.flowyml.ai/getting-started)**
166
+ - **[Core Concepts](https://docs.flowyml.ai/core/pipelines)**
167
+ - **[Type-Based Routing](https://docs.flowyml.ai/plugins/type_routing)**
168
+ - **[API Reference](https://docs.flowyml.ai/api/core)**
169
+
170
+ ---
171
+ <p align="center">
172
+ <strong>Built with ❤️ by <a href="https://unicolab.ai">UnicoLab</a></strong>
173
+ </p>
174
+
@@ -0,0 +1,108 @@
1
+ # 🌊 flowyml
2
+
3
+ <p align="center">
4
+ <img src="docs/logo.png" width="350" alt="flowyml Logo"/>
5
+ <br>
6
+ <em>The Enterprise-Grade ML Pipeline Framework for Humans</em>
7
+ <br>
8
+ <br>
9
+ <p align="center">
10
+ <a href="https://github.com/UnicoLab/FlowyML/actions"><img src="https://img.shields.io/github/actions/workflow/status/UnicoLab/FlowyML/ci.yml?branch=main" alt="CI Status"></a>
11
+ <a href="https://pypi.org/project/flowyml/"><img src="https://img.shields.io/pypi/v/flowyml" alt="PyPI Version"></a>
12
+ <a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.10+-blue.svg" alt="Python 3.10+"></a>
13
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-blue.svg" alt="License"></a>
14
+ <a href="https://unicolab.ai"><img src="https://img.shields.io/badge/UnicoLab-ai-red.svg" alt="UnicoLab"></a>
15
+ </p>
16
+ </p>
17
+
18
+ ---
19
+
20
+ **FlowyML** is a lightweight yet powerful ML pipeline orchestration framework. It bridges the gap between rapid experimentation and enterprise production by making assets first-class citizens. Write pipelines in pure Python, and scale them to production without changing a single line of code.
21
+
22
+ ## 🚀 Why FlowyML?
23
+
24
+ | Feature | FlowyML | Traditional Orchestrators |
25
+ |---------|---------|---------------------------|
26
+ | **Developer Experience** | 🐍 **Native Python** - No DSLs, no YAML hell. | 📜 Complex YAML or rigid DSLs. |
27
+ | **Type-Based Routing** | 🧠 **Auto-Routing** - Define WHAT, we handle WHERE. | 🔌 Manual wiring to cloud buckets. |
28
+ | **Smart Caching** | ⚡ **Multi-Level** - Smart content-hashing skips re-runs. | 🐢 Basic file-timestamp checking. |
29
+ | **Asset Management** | 📦 **First-Class Assets** - Models & Datasets with lineage. | 📁 Generic file paths only. |
30
+ | **Multi-Stack** | 🌍 **Abstract Infra** - Switch local/prod with one env var. | 🔒 Vendor lock-in or complex setup. |
31
+ | **GenAI Ready** | 🤖 **LLM Tracing** - Built-in token & cost tracking. | 🧩 Requires external tools. |
32
+
33
+ ---
34
+
35
+ ## ⚡️ Quick Start
36
+
37
+ This is a complete, multi-step ML pipeline with auto-injected context:
38
+
39
+ ```python
40
+ from flowyml import Pipeline, step, context
41
+
42
+ @step(outputs=["dataset"])
43
+ def load_data(batch_size: int = 32):
44
+ return [i for i in range(batch_size)]
45
+
46
+ @step(inputs=["dataset"], outputs=["model"])
47
+ def train_model(dataset, learning_rate: float = 0.01):
48
+ print(f"Training on {len(dataset)} items with lr={learning_rate}")
49
+ return "model_v1"
50
+
51
+ # Configure and Run
52
+ ctx = context(learning_rate=0.05, batch_size=64)
53
+ pipeline = Pipeline("quickstart", context=ctx)
54
+ pipeline.add_step(load_data).add_step(train_model)
55
+
56
+ pipeline.run()
57
+ ```
58
+
59
+ ---
60
+
61
+ ## 🌟 Key Features
62
+
63
+ ### 1. 🧠 Type-Based Artifact Routing (New in 1.8.0)
64
+ Define artifact types in code, and FlowyML automatically routes them to your cloud infrastructure.
65
+ ```python
66
+ @step
67
+ def train(...) -> Model:
68
+ # Auto-saved to GCS/S3 and registered to Vertex AI / SageMaker
69
+ return Model(obj, name="classifier")
70
+ ```
71
+
72
+ ### 2. 🌍 Multi-Stack Configuration
73
+ Manage local, staging, and production environments in a single `flowyml.yaml`.
74
+ ```bash
75
+ export FLOWYML_STACK=production
76
+ python pipeline.py # Now runs on Vertex AI with GCS storage
77
+ ```
78
+
79
+ ### 3. 🛡️ Intelligent Step Grouping
80
+ Group consecutive steps to run in the same container. Perfect for reducing overhead while maintaining clear step boundaries.
81
+
82
+ ### 4. 📊 Built-in Observability
83
+ Beautiful dark-mode dashboard to monitor pipelines, visualize DAGs, and inspect artifacts in real-time.
84
+
85
+ ---
86
+
87
+ ## 📦 Installation
88
+
89
+ ```bash
90
+ # Install core
91
+ pip install flowyml
92
+
93
+ # Install with everything (recommended)
94
+ pip install "flowyml[all]"
95
+ ```
96
+
97
+ ## 📚 Documentation
98
+
99
+ Visit [docs.flowyml.ai](https://docs.flowyml.ai) for:
100
+ - **[Getting Started](https://docs.flowyml.ai/getting-started)**
101
+ - **[Core Concepts](https://docs.flowyml.ai/core/pipelines)**
102
+ - **[Type-Based Routing](https://docs.flowyml.ai/plugins/type_routing)**
103
+ - **[API Reference](https://docs.flowyml.ai/api/core)**
104
+
105
+ ---
106
+ <p align="center">
107
+ <strong>Built with ❤️ by <a href="https://unicolab.ai">UnicoLab</a></strong>
108
+ </p>
@@ -41,6 +41,16 @@ class Asset:
41
41
  """Base class for all ML assets (datasets, models, features, etc).
42
42
 
43
43
  Assets are first-class objects in flowyml pipelines with full lineage tracking.
44
+
45
+ Args:
46
+ name: Asset name
47
+ version: Asset version (default: v1.0.0)
48
+ data: The actual data/object
49
+ parent: Parent asset for lineage tracking
50
+ tags: Key-value tags for categorization
51
+ properties: Additional metadata properties
52
+ upload: Whether to upload this artifact to remote storage (default: False).
53
+ Set to True to enable remote artifact upload when using remote logging.
44
54
  """
45
55
 
46
56
  def __init__(
@@ -51,11 +61,13 @@ class Asset:
51
61
  parent: Optional["Asset"] = None,
52
62
  tags: dict[str, str] | None = None,
53
63
  properties: dict[str, Any] | None = None,
64
+ upload: bool = False,
54
65
  ):
55
66
  self.name = name
56
67
  self.version = version or "v1.0.0"
57
68
  self.data = data
58
69
  self.asset_id = str(uuid4())
70
+ self.upload = upload # Control whether to upload to remote storage
59
71
 
60
72
  # Metadata
61
73
  self.metadata = AssetMetadata(
@@ -94,6 +106,7 @@ class Asset:
94
106
  name: str | None = None,
95
107
  version: str | None = None,
96
108
  parent: Optional["Asset"] = None,
109
+ upload: bool = False,
97
110
  **kwargs: Any,
98
111
  ) -> "Asset":
99
112
  """Factory method to create an asset.
@@ -103,6 +116,7 @@ class Asset:
103
116
  name: Asset name
104
117
  version: Asset version
105
118
  parent: Parent asset for lineage
119
+ upload: Whether to upload this artifact to remote storage (default: False)
106
120
  **kwargs: Additional metadata
107
121
 
108
122
  Returns:
@@ -123,6 +137,7 @@ class Asset:
123
137
  parent=parent,
124
138
  tags=tags,
125
139
  properties=props,
140
+ upload=upload,
126
141
  )
127
142
 
128
143
  def get_hash(self) -> str:
@@ -37,6 +37,11 @@ class Metrics(Asset):
37
37
  # Store metrics in properties for easy access
38
38
  self.metadata.properties.update(all_metrics)
39
39
 
40
+ @property
41
+ def values(self) -> dict[str, Any]:
42
+ """Alias for data to support common usage patterns."""
43
+ return self.data or {}
44
+
40
45
  def get_metric(self, name: str, default: Any = None) -> Any:
41
46
  """Get a specific metric value."""
42
47
  if self.data and name in self.data: