flowyml 1.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. flowyml/__init__.py +207 -0
  2. flowyml/assets/__init__.py +22 -0
  3. flowyml/assets/artifact.py +40 -0
  4. flowyml/assets/base.py +209 -0
  5. flowyml/assets/dataset.py +100 -0
  6. flowyml/assets/featureset.py +301 -0
  7. flowyml/assets/metrics.py +104 -0
  8. flowyml/assets/model.py +82 -0
  9. flowyml/assets/registry.py +157 -0
  10. flowyml/assets/report.py +315 -0
  11. flowyml/cli/__init__.py +5 -0
  12. flowyml/cli/experiment.py +232 -0
  13. flowyml/cli/init.py +256 -0
  14. flowyml/cli/main.py +327 -0
  15. flowyml/cli/run.py +75 -0
  16. flowyml/cli/stack_cli.py +532 -0
  17. flowyml/cli/ui.py +33 -0
  18. flowyml/core/__init__.py +68 -0
  19. flowyml/core/advanced_cache.py +274 -0
  20. flowyml/core/approval.py +64 -0
  21. flowyml/core/cache.py +203 -0
  22. flowyml/core/checkpoint.py +148 -0
  23. flowyml/core/conditional.py +373 -0
  24. flowyml/core/context.py +155 -0
  25. flowyml/core/error_handling.py +419 -0
  26. flowyml/core/executor.py +354 -0
  27. flowyml/core/graph.py +185 -0
  28. flowyml/core/parallel.py +452 -0
  29. flowyml/core/pipeline.py +764 -0
  30. flowyml/core/project.py +253 -0
  31. flowyml/core/resources.py +424 -0
  32. flowyml/core/scheduler.py +630 -0
  33. flowyml/core/scheduler_config.py +32 -0
  34. flowyml/core/step.py +201 -0
  35. flowyml/core/step_grouping.py +292 -0
  36. flowyml/core/templates.py +226 -0
  37. flowyml/core/versioning.py +217 -0
  38. flowyml/integrations/__init__.py +1 -0
  39. flowyml/integrations/keras.py +134 -0
  40. flowyml/monitoring/__init__.py +1 -0
  41. flowyml/monitoring/alerts.py +57 -0
  42. flowyml/monitoring/data.py +102 -0
  43. flowyml/monitoring/llm.py +160 -0
  44. flowyml/monitoring/monitor.py +57 -0
  45. flowyml/monitoring/notifications.py +246 -0
  46. flowyml/registry/__init__.py +5 -0
  47. flowyml/registry/model_registry.py +491 -0
  48. flowyml/registry/pipeline_registry.py +55 -0
  49. flowyml/stacks/__init__.py +27 -0
  50. flowyml/stacks/base.py +77 -0
  51. flowyml/stacks/bridge.py +288 -0
  52. flowyml/stacks/components.py +155 -0
  53. flowyml/stacks/gcp.py +499 -0
  54. flowyml/stacks/local.py +112 -0
  55. flowyml/stacks/migration.py +97 -0
  56. flowyml/stacks/plugin_config.py +78 -0
  57. flowyml/stacks/plugins.py +401 -0
  58. flowyml/stacks/registry.py +226 -0
  59. flowyml/storage/__init__.py +26 -0
  60. flowyml/storage/artifacts.py +246 -0
  61. flowyml/storage/materializers/__init__.py +20 -0
  62. flowyml/storage/materializers/base.py +133 -0
  63. flowyml/storage/materializers/keras.py +185 -0
  64. flowyml/storage/materializers/numpy.py +94 -0
  65. flowyml/storage/materializers/pandas.py +142 -0
  66. flowyml/storage/materializers/pytorch.py +135 -0
  67. flowyml/storage/materializers/sklearn.py +110 -0
  68. flowyml/storage/materializers/tensorflow.py +152 -0
  69. flowyml/storage/metadata.py +931 -0
  70. flowyml/tracking/__init__.py +1 -0
  71. flowyml/tracking/experiment.py +211 -0
  72. flowyml/tracking/leaderboard.py +191 -0
  73. flowyml/tracking/runs.py +145 -0
  74. flowyml/ui/__init__.py +15 -0
  75. flowyml/ui/backend/Dockerfile +31 -0
  76. flowyml/ui/backend/__init__.py +0 -0
  77. flowyml/ui/backend/auth.py +163 -0
  78. flowyml/ui/backend/main.py +187 -0
  79. flowyml/ui/backend/routers/__init__.py +0 -0
  80. flowyml/ui/backend/routers/assets.py +45 -0
  81. flowyml/ui/backend/routers/execution.py +179 -0
  82. flowyml/ui/backend/routers/experiments.py +49 -0
  83. flowyml/ui/backend/routers/leaderboard.py +118 -0
  84. flowyml/ui/backend/routers/notifications.py +72 -0
  85. flowyml/ui/backend/routers/pipelines.py +110 -0
  86. flowyml/ui/backend/routers/plugins.py +192 -0
  87. flowyml/ui/backend/routers/projects.py +85 -0
  88. flowyml/ui/backend/routers/runs.py +66 -0
  89. flowyml/ui/backend/routers/schedules.py +222 -0
  90. flowyml/ui/backend/routers/traces.py +84 -0
  91. flowyml/ui/frontend/Dockerfile +20 -0
  92. flowyml/ui/frontend/README.md +315 -0
  93. flowyml/ui/frontend/dist/assets/index-DFNQnrUj.js +448 -0
  94. flowyml/ui/frontend/dist/assets/index-pWI271rZ.css +1 -0
  95. flowyml/ui/frontend/dist/index.html +16 -0
  96. flowyml/ui/frontend/index.html +15 -0
  97. flowyml/ui/frontend/nginx.conf +26 -0
  98. flowyml/ui/frontend/package-lock.json +3545 -0
  99. flowyml/ui/frontend/package.json +33 -0
  100. flowyml/ui/frontend/postcss.config.js +6 -0
  101. flowyml/ui/frontend/src/App.jsx +21 -0
  102. flowyml/ui/frontend/src/app/assets/page.jsx +397 -0
  103. flowyml/ui/frontend/src/app/dashboard/page.jsx +295 -0
  104. flowyml/ui/frontend/src/app/experiments/[experimentId]/page.jsx +255 -0
  105. flowyml/ui/frontend/src/app/experiments/page.jsx +360 -0
  106. flowyml/ui/frontend/src/app/leaderboard/page.jsx +133 -0
  107. flowyml/ui/frontend/src/app/pipelines/page.jsx +454 -0
  108. flowyml/ui/frontend/src/app/plugins/page.jsx +48 -0
  109. flowyml/ui/frontend/src/app/projects/page.jsx +292 -0
  110. flowyml/ui/frontend/src/app/runs/[runId]/page.jsx +682 -0
  111. flowyml/ui/frontend/src/app/runs/page.jsx +470 -0
  112. flowyml/ui/frontend/src/app/schedules/page.jsx +585 -0
  113. flowyml/ui/frontend/src/app/settings/page.jsx +314 -0
  114. flowyml/ui/frontend/src/app/tokens/page.jsx +456 -0
  115. flowyml/ui/frontend/src/app/traces/page.jsx +246 -0
  116. flowyml/ui/frontend/src/components/Layout.jsx +108 -0
  117. flowyml/ui/frontend/src/components/PipelineGraph.jsx +295 -0
  118. flowyml/ui/frontend/src/components/header/Header.jsx +72 -0
  119. flowyml/ui/frontend/src/components/plugins/AddPluginDialog.jsx +121 -0
  120. flowyml/ui/frontend/src/components/plugins/InstalledPlugins.jsx +124 -0
  121. flowyml/ui/frontend/src/components/plugins/PluginBrowser.jsx +167 -0
  122. flowyml/ui/frontend/src/components/plugins/PluginManager.jsx +60 -0
  123. flowyml/ui/frontend/src/components/sidebar/Sidebar.jsx +145 -0
  124. flowyml/ui/frontend/src/components/ui/Badge.jsx +26 -0
  125. flowyml/ui/frontend/src/components/ui/Button.jsx +34 -0
  126. flowyml/ui/frontend/src/components/ui/Card.jsx +44 -0
  127. flowyml/ui/frontend/src/components/ui/CodeSnippet.jsx +38 -0
  128. flowyml/ui/frontend/src/components/ui/CollapsibleCard.jsx +53 -0
  129. flowyml/ui/frontend/src/components/ui/DataView.jsx +175 -0
  130. flowyml/ui/frontend/src/components/ui/EmptyState.jsx +49 -0
  131. flowyml/ui/frontend/src/components/ui/ExecutionStatus.jsx +122 -0
  132. flowyml/ui/frontend/src/components/ui/KeyValue.jsx +25 -0
  133. flowyml/ui/frontend/src/components/ui/ProjectSelector.jsx +134 -0
  134. flowyml/ui/frontend/src/contexts/ProjectContext.jsx +79 -0
  135. flowyml/ui/frontend/src/contexts/ThemeContext.jsx +54 -0
  136. flowyml/ui/frontend/src/index.css +11 -0
  137. flowyml/ui/frontend/src/layouts/MainLayout.jsx +23 -0
  138. flowyml/ui/frontend/src/main.jsx +10 -0
  139. flowyml/ui/frontend/src/router/index.jsx +39 -0
  140. flowyml/ui/frontend/src/services/pluginService.js +90 -0
  141. flowyml/ui/frontend/src/utils/api.js +47 -0
  142. flowyml/ui/frontend/src/utils/cn.js +6 -0
  143. flowyml/ui/frontend/tailwind.config.js +31 -0
  144. flowyml/ui/frontend/vite.config.js +21 -0
  145. flowyml/ui/utils.py +77 -0
  146. flowyml/utils/__init__.py +67 -0
  147. flowyml/utils/config.py +308 -0
  148. flowyml/utils/debug.py +240 -0
  149. flowyml/utils/environment.py +346 -0
  150. flowyml/utils/git.py +319 -0
  151. flowyml/utils/logging.py +61 -0
  152. flowyml/utils/performance.py +314 -0
  153. flowyml/utils/stack_config.py +296 -0
  154. flowyml/utils/validation.py +270 -0
  155. flowyml-1.1.0.dist-info/METADATA +372 -0
  156. flowyml-1.1.0.dist-info/RECORD +159 -0
  157. flowyml-1.1.0.dist-info/WHEEL +4 -0
  158. flowyml-1.1.0.dist-info/entry_points.txt +3 -0
  159. flowyml-1.1.0.dist-info/licenses/LICENSE +17 -0
@@ -0,0 +1,372 @@
1
+ Metadata-Version: 2.4
2
+ Name: flowyml
3
+ Version: 1.1.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 :: 3 - Alpha
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: gcp
23
+ Provides-Extra: pytorch
24
+ Provides-Extra: sklearn
25
+ Provides-Extra: tensorflow
26
+ Provides-Extra: ui
27
+ Requires-Dist: click (>=8.0.0)
28
+ Requires-Dist: croniter (>=2.0.1,<3.0.0)
29
+ Requires-Dist: fastapi (>=0.122.0,<0.123.0) ; extra == "ui"
30
+ Requires-Dist: google-cloud-aiplatform (>=1.35.0) ; extra == "gcp" or extra == "all"
31
+ Requires-Dist: google-cloud-storage (>=2.10.0) ; extra == "gcp" or extra == "all"
32
+ Requires-Dist: loguru (>=0.7.3,<0.8.0)
33
+ Requires-Dist: numpy (>=1.20.0)
34
+ Requires-Dist: pandas (>=1.3.0)
35
+ Requires-Dist: pydantic (>=2.0.0)
36
+ Requires-Dist: python-multipart (>=0.0.6) ; extra == "ui" or extra == "all"
37
+ Requires-Dist: pytz (>=2024.1,<2025.0)
38
+ Requires-Dist: pyyaml (>=6.0)
39
+ Requires-Dist: scikit-learn (>=1.0.0) ; extra == "sklearn" or extra == "all"
40
+ Requires-Dist: tensorflow (>=2.12.0) ; extra == "tensorflow" or extra == "all"
41
+ Requires-Dist: toml (>=0.10.2)
42
+ Requires-Dist: torch (>=2.0.0) ; extra == "pytorch" or extra == "all"
43
+ Requires-Dist: uvicorn[standard] (>=0.23.0) ; extra == "ui" or extra == "all"
44
+ Requires-Dist: websockets (>=11.0) ; extra == "ui" or extra == "all"
45
+ Project-URL: Documentation, https://unicolab.github.io/FlowyML/latest
46
+ Project-URL: Homepage, https://github.com/UnicoLab/FlowyML
47
+ Project-URL: Repository, https://github.com/UnicoLab/FlowyML
48
+ Description-Content-Type: text/markdown
49
+
50
+ # 🌊 flowyml
51
+
52
+ <p align="center">
53
+ <img src="docs/logo.png" width="350" alt="flowyml Logo"/>
54
+ <br>
55
+ <em>The Enterprise-Grade ML Pipeline Framework for Humans</em>
56
+ <br>
57
+ <br>
58
+ <p align="center">
59
+ <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>
60
+ <a href="https://pypi.org/project/flowyml/"><img src="https://img.shields.io/pypi/v/flowyml" alt="PyPI Version"></a>
61
+ <a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.10+-blue.svg" alt="Python 3.10+"></a>
62
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-blue.svg" alt="License"></a>
63
+ <a href="https://unicolab.ai"><img src="https://img.shields.io/badge/UnicoLab-ai-red.svg" alt="UnicoLab"></a>
64
+ </p>
65
+ </p>
66
+
67
+ ---
68
+
69
+ **flowyml** is the comprehensive ML pipeline framework that combines the **simplicity of a Python script** with the **power of an enterprise MLOps platform**.
70
+
71
+ ## 🚀 Why flowyml?
72
+
73
+ | Feature | flowyml | Traditional Orchestrators |
74
+ |---------|---------|---------------------------|
75
+ | **Developer Experience** | 🐍 **Native Python** - No DSLs, no YAML hell. | 📜 Complex YAML or rigid DSLs. |
76
+ | **Context Awareness** | 🧠 **Auto-Injection** - Params are just function args. | 🔌 Manual wiring of every parameter. |
77
+ | **Caching** | ⚡ **Multi-Level** - Smart content-hashing & memoization. | 🐢 Basic file-timestamp checking. |
78
+ | **Asset Management** | 📦 **First-Class Assets** - Models & Datasets with lineage. | 📁 Generic file paths only. |
79
+ | **Architecture** | 🏗️ **Modular Stacks** - Local, Cloud, Hybrid. | 🔒 Vendor lock-in or complex setup. |
80
+
81
+ ## 🚀 Feature Showcase
82
+
83
+ flowyml is a complete toolkit for building, debugging, and deploying ML applications.
84
+
85
+ ### 1. Zero-Boilerplate Orchestration
86
+ Write pipelines as standard Python functions. No YAML, no DSLs.
87
+
88
+ ```python
89
+ @step(outputs=["data"])
90
+ def load(): return [1, 2, 3]
91
+
92
+ @step(inputs=["data"], outputs=["model"])
93
+ def train(data): return Model.train(data)
94
+
95
+ # It's just Python!
96
+ pipeline = Pipeline("simple").add_step(load).add_step(train)
97
+ pipeline.run()
98
+ ```
99
+
100
+ ### 2. 🧠 Intelligent Caching
101
+ Don't waste time re-running successful steps.
102
+ - **Code Hash**: Re-runs only when code changes.
103
+ - **Input Hash**: Re-runs only when data changes.
104
+
105
+ ```python
106
+ # Only re-runs if 'data' changes, ignoring code changes
107
+ @step(cache="input_hash", outputs=["processed"])
108
+ def expensive_processing(data):
109
+ return process(data)
110
+ ```
111
+
112
+ ### 3. 🤖 LLM & GenAI Ready
113
+ Trace token usage, latency, and costs automatically.
114
+
115
+ ```python
116
+ @step
117
+ @trace_llm(model="gpt-4", tags=["production"])
118
+ def generate_summary(text: str):
119
+ # flowyml automatically tracks tokens, cost, and latency
120
+ return openai.ChatCompletion.create(...)
121
+ ```
122
+
123
+ ### 4. ⚡ Efficient Step Grouping
124
+ Group related steps to run in the same container - reduce overhead, maintain clarity.
125
+
126
+ ```python
127
+ # Run preprocessing steps in same container (shares resources)
128
+ @step(outputs=["raw"], execution_group="preprocessing")
129
+ def load(): return fetch_data()
130
+
131
+ @step(inputs=["raw"], outputs=["clean"], execution_group="preprocessing")
132
+ def clean(raw): return preprocess(raw)
133
+
134
+ # flowyml automatically aggregates resources (max CPU, memory, best GPU)
135
+ # and executes consecutively in same environment
136
+ ```
137
+
138
+ ### 5. 🔀 Dynamic Workflows
139
+ Build adaptive workflows with conditional logic.
140
+
141
+ ```python
142
+ # Run 'deploy' only if model accuracy > 0.9
143
+ pipeline.add_step(
144
+ If(condition=lambda ctx: ctx["accuracy"] > 0.9)
145
+ .then(deploy_model)
146
+ .else_(notify_team)
147
+ )
148
+ ```
149
+
150
+ ### 6. 🧩 Universal Plugin System
151
+ Extend flowyml with any tool - even wrap ZenML components!
152
+
153
+ ```python
154
+ from flowyml.stacks.plugins import load_component
155
+
156
+ # Use any ZenML orchestrator, artifact store, or integration
157
+ k8s_orch = load_component("zenml:zenml.integrations.kubernetes.orchestrators.KubernetesOrchestrator")
158
+ mlflow = load_component("zenml:zenml.integrations.mlflow.MLflowExperimentTracker")
159
+ ```
160
+
161
+ ### 7. 👤 Human-in-the-Loop
162
+ Pause pipelines for manual approval or review.
163
+
164
+ ```python
165
+ from flowyml import approval
166
+
167
+ approval_step = approval(
168
+ name="approve_deployment",
169
+ approver="ml-team",
170
+ timeout_seconds=3600
171
+ )
172
+ ```
173
+
174
+ ### 8. 📊 Built-in Experiment Tracking
175
+ No external tools needed - tracking is built-in.
176
+
177
+ ```python
178
+ from flowyml.tracking import Experiment
179
+
180
+ exp = Experiment("baseline_training")
181
+ exp.log_run(run_id="run_001", metrics={"accuracy": 0.95}, parameters={"lr": 0.01})
182
+ best = exp.get_best_run("accuracy", maximize=True)
183
+ ```
184
+
185
+ ### 9. 🏆 Model Leaderboard & Registry
186
+ Track, compare, and version your models.
187
+
188
+ ```python
189
+ from flowyml import ModelLeaderboard
190
+ from flowyml.core import Model
191
+
192
+ # Track performance
193
+ leaderboard = ModelLeaderboard(metric="accuracy")
194
+ leaderboard.add_score(model_name="bert-base", score=0.92)
195
+
196
+ # Register models with stages
197
+ model = Model.create(artifact={...})
198
+ model.register(name="text_classifier", stage="production")
199
+ ```
200
+
201
+ ### 10. 📅 Built-in Scheduling
202
+ Schedule recurring jobs without external orchestrators.
203
+
204
+ ```python
205
+ from flowyml import PipelineScheduler
206
+
207
+ scheduler = PipelineScheduler()
208
+ scheduler.schedule_daily(
209
+ name="daily_training",
210
+ pipeline_func=lambda: pipeline.run(),
211
+ hour=2, minute=0
212
+ )
213
+ scheduler.start()
214
+ ```
215
+
216
+ ### 11. 🔔 Smart Notifications
217
+ Slack, Email, and custom alerts built-in.
218
+
219
+ ```python
220
+ from flowyml import configure_notifications
221
+
222
+ configure_notifications(
223
+ slack_webhook="https://hooks.slack.com/...",
224
+ email_config={...}
225
+ )
226
+ # Automatic notifications on pipeline success/failure
227
+ ```
228
+
229
+ ### 12. 🎯 Step-Level Debugging
230
+ Set breakpoints and inspect state mid-pipeline.
231
+
232
+ ```python
233
+ from flowyml import StepDebugger
234
+
235
+ debugger = StepDebugger()
236
+ debugger.set_breakpoint("train_model")
237
+ pipeline.run(debug=True) # Pauses at breakpoint
238
+ ```
239
+
240
+ ### 13. 📦 First-Class Assets
241
+ Specialized types for ML workflows.
242
+
243
+ ```python
244
+ from flowyml.core import Dataset, Model, Metrics, FeatureSet
245
+
246
+ dataset = Dataset.create(data=df, name="training_data")
247
+ model = Model.create(artifact=trained_model, score=0.95)
248
+ metrics = Metrics.create(values={"accuracy": 0.95})
249
+ ```
250
+
251
+ ### 14. 🔄 Smart Retries & Circuit Breakers
252
+ Handle failures gracefully.
253
+
254
+ ```python
255
+ @step(retry=3, timeout=300)
256
+ def flaky_api_call():
257
+ return external_api.fetch()
258
+
259
+ # Circuit breakers prevent cascading failures
260
+ ```
261
+
262
+ ### 15. 📈 Data Drift Detection
263
+ Monitor distribution shifts automatically.
264
+
265
+ ```python
266
+ from flowyml import detect_drift
267
+
268
+ drift = detect_drift(
269
+ reference_data=train_feature,
270
+ current_data=prod_feature,
271
+ threshold=0.1
272
+ )
273
+ if drift['drift_detected']:
274
+ trigger_retraining()
275
+ ```
276
+
277
+ ### 16. 🔍 Interactive Debugging
278
+ - **StepDebugger**: Set breakpoints in your pipeline.
279
+ - **Artifact Inspection**: View intermediate data in the UI.
280
+ - **Local Execution**: Run the exact same code locally as in production.
281
+
282
+ ### 17. 🏭 Enterprise Production Features
283
+ - **🔄 Automatic Retries**: Handle transient failures.
284
+ - **⏰ Scheduling**: Built-in cron scheduler.
285
+ - **🔔 Notifications**: Slack/Email alerts.
286
+ - **🛡️ Circuit Breakers**: Stop cascading failures.
287
+
288
+ ### 18. 🔌 Universal Integrations
289
+ - **ML Frameworks**: PyTorch, TensorFlow, Keras, Scikit-learn, HuggingFace.
290
+ - **Cloud Providers**: AWS, GCP, Azure (via plugins).
291
+ - **Tools**: MLflow, Weights & Biases, Great Expectations.
292
+
293
+ ## 📦 Installation
294
+
295
+ ```bash
296
+ # Install core
297
+ pip install flowyml
298
+
299
+ # Install with UI support
300
+ pip install "flowyml[ui]"
301
+
302
+ # Install with all features (recommended for dev)
303
+ pip install "flowyml[all]"
304
+ ```
305
+
306
+ ## ⚡ Quick Start
307
+
308
+ ```python
309
+ from flowyml import Pipeline, step, context, Dataset, Model
310
+
311
+ # 1. Define your configuration (Auto-injected!)
312
+ ctx = context(
313
+ learning_rate=0.01,
314
+ batch_size=32,
315
+ epochs=10
316
+ )
317
+
318
+ # 2. Define your steps (Pure Python)
319
+ @step(outputs=["dataset"])
320
+ def load_data(batch_size: int):
321
+ # 'batch_size' is automatically injected from context!
322
+ print(f"Loading data with batch size: {batch_size}")
323
+ return Dataset.create(data=[1, 2, 3], name="mnist")
324
+
325
+ @step(inputs=["dataset"], outputs=["model"])
326
+ def train(dataset: Dataset, learning_rate: float, epochs: int):
327
+ print(f"Training on {dataset.name} with lr={learning_rate}")
328
+ # Simulate training...
329
+ return Model.create(artifact={"weights": "..."}, score=0.98)
330
+
331
+ # 3. Run it!
332
+ pipeline = Pipeline("mnist_training", context=ctx)
333
+ pipeline.add_step(load_data)
334
+ pipeline.add_step(train)
335
+
336
+ result = pipeline.run()
337
+
338
+ print(f"Run ID: {result.run_id}")
339
+ print(f"Model Score: {result.outputs['model'].score}")
340
+ ```
341
+
342
+ ## 🖥️ The flowyml UI
343
+
344
+ Visualize your workflows, inspect artifacts, and monitor runs in real-time.
345
+
346
+ ```bash
347
+ # Start the UI server
348
+ flowyml ui start --open-browser
349
+ ```
350
+
351
+ Visit **http://localhost:8080** to access the dashboard.
352
+
353
+ ## 📚 Documentation
354
+
355
+ - **[Getting Started](docs/getting-started.md)**: Your first 5 minutes with flowyml.
356
+ - **[Core Concepts](docs/core/pipelines.md)**: Deep dive into Pipelines, Steps, and Context.
357
+ - **[Advanced Features](docs/advanced/caching.md)**: Learn about Caching, Parallelism, and Conditional Execution.
358
+ - **[API Reference](docs/api/core.md)**: Detailed class and function documentation.
359
+
360
+ ## 🤝 Contributing
361
+
362
+ We love contributions! Check out our [Contributing Guide](CONTRIBUTING.md) to get started.
363
+
364
+ ## 📝 License
365
+
366
+ Apache 2.0 - See [LICENSE](LICENSE) for details.
367
+
368
+ ---
369
+ <p align="center">
370
+ <strong>Built with ❤️ by <a href="https://unicolab.ai">UnicoLab</a></strong>
371
+ </p>
372
+
@@ -0,0 +1,159 @@
1
+ flowyml/__init__.py,sha256=Pm6obA4XJwDQ-GZTZN_K8kf2PJ0BqTxOivdw8NwDj7A,5238
2
+ flowyml/assets/__init__.py,sha256=bbuzbW_PckrdekZEhcbJAwxhx0VWt8V4UeLLIute244,570
3
+ flowyml/assets/artifact.py,sha256=UTcNhjCvA7AmOlIVeMAo7kkKDZUbn5meUXz7CzWRy0c,1171
4
+ flowyml/assets/base.py,sha256=i88liUlHA1JuaGmPx81DC9mR0Sj0bxY0z1Mn_XtD7wU,6135
5
+ flowyml/assets/dataset.py,sha256=tjxcT0FGmC_0vajOWAKJCIRm1O77AeALIELHHuiyTjA,3003
6
+ flowyml/assets/featureset.py,sha256=idp0FrdlVIJwTmk5PqEYUYgIlbZ_wjVIiz1thhodHV4,10314
7
+ flowyml/assets/metrics.py,sha256=YpoUj7-bET_65DpJVDD0HP4B7dsjBw9FtPbfSHW9WPM,3060
8
+ flowyml/assets/model.py,sha256=Fa7Lw5AfrkLM_L16tNPCy7vSButMWE_W3wixC-pVANk,2649
9
+ flowyml/assets/registry.py,sha256=aYZOeRFGERgLCtUyVAtW7MbFlSofAN1sBSfO2FNj4ls,4830
10
+ flowyml/assets/report.py,sha256=CR1aI_08GereO-qsVwvy4JdG5_Du5rMcTfoqJ_1jmu8,9207
11
+ flowyml/cli/__init__.py,sha256=bMA7grr-wiy3LeAjGFSeSG2WQwlXDnQKIeFP7X4-HhM,83
12
+ flowyml/cli/experiment.py,sha256=ryPzfOlPKtCksjW9E7umJEVmE_5lNjAZqacbYX-azos,6284
13
+ flowyml/cli/init.py,sha256=FAlk_xhiCYYI_HoiVBqPfiZVC4mGJmDWxqY7R77E7UY,6204
14
+ flowyml/cli/main.py,sha256=S7Uo6PgSvPQYsfISHVMcjd2lcrNtIfDipa5068KhegE,10542
15
+ flowyml/cli/run.py,sha256=O70runTFPNyO9T2rpOboSI9Ay5Fw5DGXgy4BrCb_LwI,2188
16
+ flowyml/cli/stack_cli.py,sha256=XrJnOVq9_p6gjurxIV1a-20kAFZutEN58Vdzi2hpm74,16822
17
+ flowyml/cli/ui.py,sha256=0_R6-YdmtSTWPVZJWjdYV-4FEjSzuOqtlHwz4RmirkA,874
18
+ flowyml/core/__init__.py,sha256=zvRAQQ8ySPrDXfjLb2wmg9kibbCfGPs69Fi86xkuv2A,1494
19
+ flowyml/core/advanced_cache.py,sha256=Rs9z81nNA-j8ShodKHR52veSaEPLVU0Jsg-L-fM4Z7Y,8342
20
+ flowyml/core/approval.py,sha256=kHyHcKtrPp9xxa1gFOGpd5LXAKtBoHjLwMCqNz_uUGs,2288
21
+ flowyml/core/cache.py,sha256=rIzIQ-GX2sVO7qAckpZMfmxDLKQU34XJKJp38zywIpk,6197
22
+ flowyml/core/checkpoint.py,sha256=aR9iFqKq0kQxanfT9D4nZrBMfdpD1dSlS2E53S18muM,4616
23
+ flowyml/core/conditional.py,sha256=m9ekYqLwVfB8WjAiS7Y4a3AcWSBFzTJh2lx-ZWFyumU,9168
24
+ flowyml/core/context.py,sha256=M0_K_REzIByJlF-2INCgHqDWFDKXmNQb-2HSmPt_WIY,4816
25
+ flowyml/core/error_handling.py,sha256=TovzbOFzQYBHMMM8NjsR8WcbmbdtVjXuW8_fsdbgsPA,11952
26
+ flowyml/core/executor.py,sha256=oXVUsh-W1oC357usZvU6qrlYx1NhIN03Ux5FTMQonf4,12328
27
+ flowyml/core/graph.py,sha256=drVezsgYwva-b8X5FsjExtaW-7NsjYMkchTIPYyb5HQ,6065
28
+ flowyml/core/parallel.py,sha256=KGstDu32i9FFKZV0bBRrm1kl3bKjcHmL2js48dVjWlk,12492
29
+ flowyml/core/pipeline.py,sha256=Ahv4If8oTq893Z2D2zVB3PKeaQ5o_NGFbiMSvthDcuc,30277
30
+ flowyml/core/project.py,sha256=F5_SAzw82EUE1PsqdeDEgnlh8g15IbjPGy8Y_OjRtIA,7923
31
+ flowyml/core/resources.py,sha256=vfF07jJdrIvei0G3LJVuSYzyTPPquY12Xt-ltKpwl1s,13822
32
+ flowyml/core/scheduler.py,sha256=af3xKs48uX8SjJItjbfINZc3Cv8U711KTgSRTmZhRQI,22115
33
+ flowyml/core/scheduler_config.py,sha256=4VF_AKKU_AcHXURZjE77ff8Uhm2eO7v_nWbs1bq7Z38,1237
34
+ flowyml/core/step.py,sha256=LOec72XuuHpMuRcz9gc_3JjWlcfYBWz-fVEuLXBiHqA,6822
35
+ flowyml/core/step_grouping.py,sha256=wBMZbOLZW5ghN8n8J3CmzKFKTaytRzrLkHJ-AwCuP5E,9941
36
+ flowyml/core/templates.py,sha256=r7WbxZv8-BV3_3oX27ACGSitIsmNbNd4VeitpI2uJeg,6359
37
+ flowyml/core/versioning.py,sha256=DvN3teqPR6N2h1nGX3fmfxv9Q62Mh9JpGES39gmnGlw,7074
38
+ flowyml/integrations/__init__.py,sha256=SQWPFwFs_1gLGlJ6TDo2bcFKwBrv1PkwhZvEiELV1ok,28
39
+ flowyml/integrations/keras.py,sha256=k8U77ti44lGVx5GbTp0bmS_3Ex-8bSRqZQYIJyBDe6M,4507
40
+ flowyml/monitoring/__init__.py,sha256=nkqmfdvLGMd44NfrIvH2vwVZBJGDVUn-qpei192WJp4,33
41
+ flowyml/monitoring/alerts.py,sha256=gVYOGtPt1FUJU_9yDmcEUvsFF7z8i0RqVDOrapLwLS4,1571
42
+ flowyml/monitoring/data.py,sha256=wCMXftt-MSgY2uYWiJzcHcn9jMXl8PkRwn7RD5Umeeg,2863
43
+ flowyml/monitoring/llm.py,sha256=ULq4rmsQ_BY_QoekztG-NwqMuj4UkQnP1AuzhRfjmq4,4801
44
+ flowyml/monitoring/monitor.py,sha256=rdhUUVYUSyGNm3fQPRc3qS8Z7fr3S_d-lOxJQdwNA8o,1448
45
+ flowyml/monitoring/notifications.py,sha256=Z0pzuUL5cI_9oKy3mEcyYFsv5GgK7HHXtYy_dow-vEE,7484
46
+ flowyml/registry/__init__.py,sha256=fClcK1W1hxBvjaHvXZYK9-VIW7R7Oc1hWf_rqnpnzPw,196
47
+ flowyml/registry/model_registry.py,sha256=-P4DpYikuk92NSFBvFIHrjv09U70f1zLh9GR6VONSU4,14230
48
+ flowyml/registry/pipeline_registry.py,sha256=fEJvN5sQW-Nt-lZg5LfjMyRSKNskiOBlpPxfFq30--s,1552
49
+ flowyml/stacks/__init__.py,sha256=uSDmL0oFikDQhsyr8p2OJcBwVMBzGgUzz8Y2ngNuh5w,634
50
+ flowyml/stacks/base.py,sha256=0C0s9um6mstRUfkOEYXlunn9F3H4u9XPRp8lnGSj-G4,2537
51
+ flowyml/stacks/bridge.py,sha256=EA1ABE9mOvpZsOcH_zJwEifQCttjv3G6v9yrvhtqp-0,10919
52
+ flowyml/stacks/components.py,sha256=1iTiwhRLJezJWetZN9xrzdgwsMBqfOMlTUJOFQzptRw,4298
53
+ flowyml/stacks/gcp.py,sha256=H6Nm4SiPc8J2FBq2n3dqdxNzIiJFBuuDVtMWTuRhMsM,15282
54
+ flowyml/stacks/local.py,sha256=BlH7HC5AG7dCNL2g6iTm4Mru--Qbu_VzoZq8FVTSwuU,3710
55
+ flowyml/stacks/migration.py,sha256=dWSOVkDWY6Y-yobmTNS0JZ1aKJw6xkRXndRN5vH8aFM,3523
56
+ flowyml/stacks/plugin_config.py,sha256=16ggYUj7w1qYM-cwDRrpf9ydpj7C5CZytIgNDZbVdSY,2483
57
+ flowyml/stacks/plugins.py,sha256=PRrIo_6waYyT6l73bKlfbI6_zWzGkR3I7m_5W0-GDpU,15273
58
+ flowyml/stacks/registry.py,sha256=mAH88cuDSZ9PGNSdp8dTd_uwWJm8u2yNM4b4_n6QvK4,6329
59
+ flowyml/storage/__init__.py,sha256=d03pJ5Q-iTMRRQNJi5dI9vYqwY3QMlUDiEIZ4AZ0o8Y,984
60
+ flowyml/storage/artifacts.py,sha256=jYtFrDBoY90W1Jzzx2Hok30a0xFgqVrez5qMb6661E4,7150
61
+ flowyml/storage/materializers/__init__.py,sha256=l1LQzHgWx06nQJTIfQyC4owd4eT0-2GZXVyVG7kX96k,790
62
+ flowyml/storage/materializers/base.py,sha256=cY6Rd5r5nvOGM2AkGmREf77d0WvYtTN4HpIJsEDPTMs,3791
63
+ flowyml/storage/materializers/keras.py,sha256=PnNVWO_VoUJRJfWyugBYdNMeuzQQT94-AAdHEvEigmc,6682
64
+ flowyml/storage/materializers/numpy.py,sha256=lsBvouvoXuNSvqyFaHEAQldMP9G_82D1gKSJEe4EfQE,2815
65
+ flowyml/storage/materializers/pandas.py,sha256=MTqvWNbDSvmVkXlz5cAisC790c-xiu7rgW3GGPR5fsQ,5002
66
+ flowyml/storage/materializers/pytorch.py,sha256=MeP14hP-2Kb2ZTVKxwQCJvJtOddXzfGxm4BKhrmUUac,4382
67
+ flowyml/storage/materializers/sklearn.py,sha256=JuszJrCQJW2CXJsO6b0ZMZyoKknM5XPMUoQDQ75X990,3672
68
+ flowyml/storage/materializers/tensorflow.py,sha256=YvKFVCTl75tnUysdhj6TzqZEzlpNMB-8XDnXh6-ewmI,5087
69
+ flowyml/storage/metadata.py,sha256=uECjMvp7FKdHPZVczrZZ-pMrYG776kUrw1-xXmHp69s,28885
70
+ flowyml/tracking/__init__.py,sha256=H-ESGjwPN9fq1R4ptj0U1iVM5nXIYrMk9gPMRmY6Xh8,46
71
+ flowyml/tracking/experiment.py,sha256=Q9VDoCg7yRhgO2O6TLr4L2Jbyr3J_2JecR6lkqgJRE8,6004
72
+ flowyml/tracking/leaderboard.py,sha256=s6gXxvws4hIZLiLO5V_nO7iokpCq4czZGIO3MhW23do,5404
73
+ flowyml/tracking/runs.py,sha256=vgzTqYc_s2IrcpT5ZeFeaGp_C_VkY3f-klfGkhwAiFU,4382
74
+ flowyml/ui/__init__.py,sha256=heh1-LhRO3qCEzPZZL4ezt4eT219y6OQbsyq7qB2mVs,269
75
+ flowyml/ui/backend/Dockerfile,sha256=hO2GU_PvbzbcIhxJ2TWI8UZwBzK_MHrCyKRk_CzqAUE,700
76
+ flowyml/ui/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
+ flowyml/ui/backend/auth.py,sha256=ivM0tKR1KUm9AZg1iht9rKpndrtjf4ojLLaTw_-HHyE,4616
78
+ flowyml/ui/backend/main.py,sha256=We3BFkO8sa_GmqUUeIsCjyL-mzVa1FPheERv8HPZJ68,6513
79
+ flowyml/ui/backend/routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
+ flowyml/ui/backend/routers/assets.py,sha256=-wXLOrcHZ4CssBLu7oBZzqVOmphphdjh6NhGrJV37CY,1356
81
+ flowyml/ui/backend/routers/execution.py,sha256=r9K0xj3BScah0-wofqB_0dGe6WyOnhQC0dJxjYaTRPU,5473
82
+ flowyml/ui/backend/routers/experiments.py,sha256=j9AWZKzxKzl6kvlGtT_KXWKRmyUadoDFnkM3dkGcAfA,1530
83
+ flowyml/ui/backend/routers/leaderboard.py,sha256=T5mhZwjBusF6JGjaRO5tSmsDTles1Dkn99ki-pRzhEU,4111
84
+ flowyml/ui/backend/routers/notifications.py,sha256=IQhRlaBM8kdqxbe_U_Kw9f1qXGDBOjYk8GCR5MAIWHA,2068
85
+ flowyml/ui/backend/routers/pipelines.py,sha256=I2PTW5ixH-yvtfQaAuLxpRzcVuZ5PVgQeYh9f_Mu1P4,3830
86
+ flowyml/ui/backend/routers/plugins.py,sha256=OT2rAstPMRDlU5wdz_Jy3v5C8IjXTPMz7lDC0ZOWUbg,5894
87
+ flowyml/ui/backend/routers/projects.py,sha256=ZDRCM7jylfUunhq6BQccR2cQKY33wSIiT3uEBBy65vQ,2316
88
+ flowyml/ui/backend/routers/runs.py,sha256=Ev24rkJxBWKIfPVaxqWcZsHZzlHE9Fr2LFwbsGfvqDs,1807
89
+ flowyml/ui/backend/routers/schedules.py,sha256=hrtpfp4NXQLGtV1jxiEuB61LDC1Y3MgikU_QCu5lWAg,8078
90
+ flowyml/ui/backend/routers/traces.py,sha256=kFY5L_Z3kw9qrIfXp0_rHMG8DPxlqB5uUQTGjdJRhbA,2272
91
+ flowyml/ui/frontend/Dockerfile,sha256=BJWOdU5mnk4e2H6rARiGOO6TF-YCRxN7mOIWPv0EIAM,314
92
+ flowyml/ui/frontend/README.md,sha256=M5il2PEdNVCSm1zo1rZAXqQ0nTj5frCNXmi5-d1ZKIM,7099
93
+ flowyml/ui/frontend/dist/assets/index-DFNQnrUj.js,sha256=qeQxNaQdoEykRhJKdM6fHr1yym6Xbd_Ru5xpeMGZkAg,795216
94
+ flowyml/ui/frontend/dist/assets/index-pWI271rZ.css,sha256=X44fCErMyT9IJsj9T95NcFq-vhgCpYFHspEF6r55ebw,61073
95
+ flowyml/ui/frontend/dist/index.html,sha256=CD7nVbQbJXLcSnI9M0HJvmvD1GmaerT6zwm97HqZN6g,375
96
+ flowyml/ui/frontend/index.html,sha256=Y_Xm2LhORPIkzwz4VADHCmfDSuTkuT_gGVLRWpDOtis,279
97
+ flowyml/ui/frontend/nginx.conf,sha256=MdOpD7y2SJzpxwlHgjMVadTvlXTtZaRXfWO-WHmtuls,637
98
+ flowyml/ui/frontend/package-lock.json,sha256=jjMc3PyfVRly36IUuAex5IknFctCnj40jblvAqbkJQQ,123800
99
+ flowyml/ui/frontend/package.json,sha256=5ZRw0GLqkApO2a1dxV32BoBD_Ro5mcFf4T9q5IABaAg,760
100
+ flowyml/ui/frontend/postcss.config.js,sha256=YyT4lFBNiH_kipziy5I2ifedcoyTEY-7jAPL9chAzzM,92
101
+ flowyml/ui/frontend/src/App.jsx,sha256=KXmNs86JZGFmIFxvtGyGaxHI-8p2LonOB00mZXnwlyE,456
102
+ flowyml/ui/frontend/src/app/assets/page.jsx,sha256=O5jDNOm3544RUeXL4cEm0Oe_ppoZxyUteKDYCYYlP6c,18126
103
+ flowyml/ui/frontend/src/app/dashboard/page.jsx,sha256=BtspIYeDXxSc3d4MBlzLtsWC5xcsajdmbBAHhtkvMxA,12682
104
+ flowyml/ui/frontend/src/app/experiments/[experimentId]/page.jsx,sha256=dnZ6OgiB-3T7n96JkAO_Z-iulm4yD2taXDkjRQlJRg8,12112
105
+ flowyml/ui/frontend/src/app/experiments/page.jsx,sha256=YhLYIKlzbaD6vqOptT-s6CjkcxgZQYg2NETDCiTN-oc,16423
106
+ flowyml/ui/frontend/src/app/leaderboard/page.jsx,sha256=dQNOLrsgZ-JGrp74BRkMQIH1YBduzFo7JkC89PMoYZo,7630
107
+ flowyml/ui/frontend/src/app/pipelines/page.jsx,sha256=rYLFLXTyUGHw_8n19L5LgKUSHi0Uo1Az5CmFC7A373g,20201
108
+ flowyml/ui/frontend/src/app/plugins/page.jsx,sha256=eQR_uW2Imt4HldDb8eVvu4rkQ6SLMv5FCbr-gc6bYIg,1577
109
+ flowyml/ui/frontend/src/app/projects/page.jsx,sha256=g6erCEC0vCxU2yNhmmyaljNqO1TkWwShkCosVd99owE,13956
110
+ flowyml/ui/frontend/src/app/runs/[runId]/page.jsx,sha256=dpUKICkmUhae-DTjFiVmgE48jEvC5nNTRzldvQoNNPE,34966
111
+ flowyml/ui/frontend/src/app/runs/page.jsx,sha256=WAa96D_m6itc8G782CNoHFFwWloYcqXoT9MGEuJ0K2Q,19102
112
+ flowyml/ui/frontend/src/app/schedules/page.jsx,sha256=Ka_AmrgdVTA0AMbTdi5fc7U6XZESrFB9q2RRmCFGHBs,31347
113
+ flowyml/ui/frontend/src/app/settings/page.jsx,sha256=yLWF54go6t7J_FH8GPovbx4Qzki_DMZnH-eI4nMqKA0,16342
114
+ flowyml/ui/frontend/src/app/tokens/page.jsx,sha256=yZAdzliGmZqpCwv9V1z72q06jtUAgU9EX3U1c_UKaBk,20477
115
+ flowyml/ui/frontend/src/app/traces/page.jsx,sha256=j4WdFVvmaJ-5IwufbnPJEavQISse-8iwDnBIkeMKyFM,8767
116
+ flowyml/ui/frontend/src/components/Layout.jsx,sha256=CsoaFrWe-5iRyAsVyu2rmJqhoC2ltckEzhVscsXlmsI,5423
117
+ flowyml/ui/frontend/src/components/PipelineGraph.jsx,sha256=6I9FwT0PjbPnhVN2yVE2KP4skODxgmGajJvALly7COA,10779
118
+ flowyml/ui/frontend/src/components/header/Header.jsx,sha256=p9IUWTsCZMrUZPCgZJmVXeYoqSr7VA1KXxB3WaQA5ls,3366
119
+ flowyml/ui/frontend/src/components/plugins/AddPluginDialog.jsx,sha256=bazhcAEgqdGGpuz8_VWmEN0BLbcAvC9rDyB9iJdQHbM,5837
120
+ flowyml/ui/frontend/src/components/plugins/InstalledPlugins.jsx,sha256=v9IWCRT6951X26cgybZpsBLpfMbkz12TIVYjQJrvRtM,4719
121
+ flowyml/ui/frontend/src/components/plugins/PluginBrowser.jsx,sha256=ZwP2klJlrd7gv8me-zCaKCLQyH3OT47ugW0In2y3oLE,7420
122
+ flowyml/ui/frontend/src/components/plugins/PluginManager.jsx,sha256=q5abQ6_tw0lYxt4Nw6WFSaR6qOWfZVR2EFd_401zWrY,2795
123
+ flowyml/ui/frontend/src/components/sidebar/Sidebar.jsx,sha256=7yE19S3B97XTPqwTG20w9g9sQhYZ1AMIk6YtYBE0Kcw,6626
124
+ flowyml/ui/frontend/src/components/ui/Badge.jsx,sha256=Wpx1A7-9tatujKmhHIMJtD-qno9HzPmVijUVg6okqXg,885
125
+ flowyml/ui/frontend/src/components/ui/Button.jsx,sha256=Gcg89JegyvJThTm0Kuf4enYBpzUEInHQDB9Az8qUNpo,1200
126
+ flowyml/ui/frontend/src/components/ui/Card.jsx,sha256=zFEHL0CK-GfxJCK1OVHmEICKP5X46WDIj3Yot0mPn9s,1311
127
+ flowyml/ui/frontend/src/components/ui/CodeSnippet.jsx,sha256=dXGWC5vnPPLOhNMWzNUQfd1srCISTDUMjOrayF8SpCg,1739
128
+ flowyml/ui/frontend/src/components/ui/CollapsibleCard.jsx,sha256=61AsWla3bT3Ia9bYBlRJiQEf0ykCYI9k1ykkRNbDicI,2097
129
+ flowyml/ui/frontend/src/components/ui/DataView.jsx,sha256=ZamkHvc5BPbXfsS2Rcvy5EzjO1udvJ90-oY0HTfb_5s,9065
130
+ flowyml/ui/frontend/src/components/ui/EmptyState.jsx,sha256=e300lieHAZa_lft0T42UdNQL0p0ivMTZclZ-8m-qCnM,1525
131
+ flowyml/ui/frontend/src/components/ui/ExecutionStatus.jsx,sha256=F3JiDwM43n8G359vtcEbK7B0VVPgz0ypealM_TEXiRI,3840
132
+ flowyml/ui/frontend/src/components/ui/KeyValue.jsx,sha256=Va0V3EMXcIL9E-px5YzTStyMwJKN3UDMrf7U3UHAOig,1042
133
+ flowyml/ui/frontend/src/components/ui/ProjectSelector.jsx,sha256=5kaptfAApb1p06G2zEHk32DLVA7bJXat0ZsD4t2PcMk,7287
134
+ flowyml/ui/frontend/src/contexts/ProjectContext.jsx,sha256=2lHzXajxt48RbnqaW9uxU3NuNZ9T4MtvX6JuUc40GbU,2232
135
+ flowyml/ui/frontend/src/contexts/ThemeContext.jsx,sha256=SEm0u8B0Fl3j_rDrY1V9nn9ewPFWa_RGDhGGFE4UThE,1746
136
+ flowyml/ui/frontend/src/index.css,sha256=qlzwgNU6rMFcV76mGt0sirFlTn0UcuZLCOQsSG4j8xU,188
137
+ flowyml/ui/frontend/src/layouts/MainLayout.jsx,sha256=umGlzkBamVIvH7XQQfdEpCFmRPuqvZs4iJfumya59yc,869
138
+ flowyml/ui/frontend/src/main.jsx,sha256=En69d1okPsU0j6X-IBBMG-dQpZhzjVOjfJTC_WJXoFk,243
139
+ flowyml/ui/frontend/src/router/index.jsx,sha256=7K--JJpp8wmSHB6XGNds_rY4QrUZhtqbD2a7Txugnlc,1805
140
+ flowyml/ui/frontend/src/services/pluginService.js,sha256=RnHn1-Y1OIzdHaxqVcs8P9XnkuOPQXji3g2iX2K_yoc,2837
141
+ flowyml/ui/frontend/src/utils/api.js,sha256=IKCxa9lOkuVpYiLreCL7A8ci7m2us6UjZLsgvoiKbuU,1153
142
+ flowyml/ui/frontend/src/utils/cn.js,sha256=yCQ-NYzf5FaTdChAmCMsYDZnRat5G1pWQLZbVxJWaaw,137
143
+ flowyml/ui/frontend/tailwind.config.js,sha256=__nxDJC93bzcg8Ro9uxt4c2DiErpUCJfi4B-zNRooYg,813
144
+ flowyml/ui/frontend/vite.config.js,sha256=b4JAsNo2yU4wRdTKf7ppBKsaw6WW447LrS0V4AbXkbk,401
145
+ flowyml/ui/utils.py,sha256=8wePhBrcak-7DXxRIIIHSfiyY4zghf-ziRkD20tXesE,2328
146
+ flowyml/utils/__init__.py,sha256=eA_YZEZCnCvWRdcqH8IzwWIO-LSUI5-8sbA9mU6xBto,1490
147
+ flowyml/utils/config.py,sha256=MpQ5vSowkFumZFZzSnK89O37wmRg9eseAOkkr60ISPc,9464
148
+ flowyml/utils/debug.py,sha256=zcHZxGLbuSImLdcfn1V7CwfaDzc3SunXdV-pWR_UW90,6536
149
+ flowyml/utils/environment.py,sha256=3vqyHBldrCdENrMYtYH0rsE7bPJ2IkLulzWWwWzMCmE,9166
150
+ flowyml/utils/git.py,sha256=TFbHPgt8xpwHE5qg8bhq369IM4yQFU53MfvsZs0auNw,7745
151
+ flowyml/utils/logging.py,sha256=PBJDFlGdp1mePS6A3g08dnGAB-v8jTlcNxEsYs9WSBo,1371
152
+ flowyml/utils/performance.py,sha256=-ne9v9ddEltiKRPk-AerM1R3Gwwd_oCRKtNyHARWd4k,8655
153
+ flowyml/utils/stack_config.py,sha256=54vN_Ipa4ZUNIWt-D1j1Qeh85VHjfBE5fkaQMRj7-cI,9147
154
+ flowyml/utils/validation.py,sha256=mClumVro0bl_XXxT1zWPlRI6M_iZa3z2SZ0QUdmTOqs,10199
155
+ flowyml-1.1.0.dist-info/METADATA,sha256=UBMkojleimegVvusrrtF85DklSRO6jLnMZKN5JuFJ9c,11656
156
+ flowyml-1.1.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
157
+ flowyml-1.1.0.dist-info/entry_points.txt,sha256=yuF-dOC4rbyJ2Aqi4CMRBxFhqIRoKO6Mhh6jfiQEVjI,48
158
+ flowyml-1.1.0.dist-info/licenses/LICENSE,sha256=5mUUSQiCx-qiHXxla6s0tL-b1ZbDPNQ1Cw13oUPANsU,625
159
+ flowyml-1.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: poetry-core 2.2.1
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ flowyml=flowyml.cli.main:cli
3
+
@@ -0,0 +1,17 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ Copyright 2024 Flowy Team
6
+
7
+ Licensed under the Apache License, Version 2.0 (the "License");
8
+ you may not use this file except in compliance with the License.
9
+ You may obtain a copy of the License at
10
+
11
+ http://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ Unless required by applicable law or agreed to in writing, software
14
+ distributed under the License is distributed on an "AS IS" BASIS,
15
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ See the License for the specific language governing permissions and
17
+ limitations under the License.