flowyml 1.1.0__tar.gz → 1.2.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.
- {flowyml-1.1.0 → flowyml-1.2.0}/PKG-INFO +75 -12
- {flowyml-1.1.0 → flowyml-1.2.0}/README.md +74 -11
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/versioning.py +2 -2
- {flowyml-1.1.0 → flowyml-1.2.0}/pyproject.toml +5 -4
- {flowyml-1.1.0 → flowyml-1.2.0}/LICENSE +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/__init__.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/assets/__init__.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/assets/artifact.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/assets/base.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/assets/dataset.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/assets/featureset.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/assets/metrics.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/assets/model.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/assets/registry.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/assets/report.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/cli/__init__.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/cli/experiment.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/cli/init.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/cli/main.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/cli/run.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/cli/stack_cli.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/cli/ui.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/__init__.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/advanced_cache.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/approval.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/cache.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/checkpoint.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/conditional.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/context.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/error_handling.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/executor.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/graph.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/parallel.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/pipeline.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/project.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/resources.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/scheduler.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/scheduler_config.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/step.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/step_grouping.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/core/templates.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/integrations/__init__.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/integrations/keras.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/monitoring/__init__.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/monitoring/alerts.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/monitoring/data.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/monitoring/llm.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/monitoring/monitor.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/monitoring/notifications.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/registry/__init__.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/registry/model_registry.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/registry/pipeline_registry.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/stacks/__init__.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/stacks/base.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/stacks/bridge.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/stacks/components.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/stacks/gcp.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/stacks/local.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/stacks/migration.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/stacks/plugin_config.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/stacks/plugins.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/stacks/registry.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/storage/__init__.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/storage/artifacts.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/storage/materializers/__init__.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/storage/materializers/base.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/storage/materializers/keras.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/storage/materializers/numpy.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/storage/materializers/pandas.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/storage/materializers/pytorch.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/storage/materializers/sklearn.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/storage/materializers/tensorflow.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/storage/metadata.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/tracking/__init__.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/tracking/experiment.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/tracking/leaderboard.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/tracking/runs.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/__init__.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/backend/Dockerfile +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/backend/__init__.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/backend/auth.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/backend/main.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/backend/routers/__init__.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/backend/routers/assets.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/backend/routers/execution.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/backend/routers/experiments.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/backend/routers/leaderboard.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/backend/routers/notifications.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/backend/routers/pipelines.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/backend/routers/plugins.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/backend/routers/projects.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/backend/routers/runs.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/backend/routers/schedules.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/backend/routers/traces.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/Dockerfile +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/README.md +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/dist/assets/index-DFNQnrUj.js +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/dist/assets/index-pWI271rZ.css +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/dist/index.html +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/index.html +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/nginx.conf +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/package-lock.json +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/package.json +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/postcss.config.js +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/App.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/app/assets/page.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/app/dashboard/page.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/app/experiments/[experimentId]/page.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/app/experiments/page.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/app/leaderboard/page.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/app/pipelines/page.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/app/plugins/page.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/app/projects/page.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/app/runs/[runId]/page.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/app/runs/page.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/app/schedules/page.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/app/settings/page.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/app/tokens/page.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/app/traces/page.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/Layout.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/PipelineGraph.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/header/Header.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/plugins/AddPluginDialog.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/plugins/InstalledPlugins.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/plugins/PluginBrowser.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/plugins/PluginManager.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/sidebar/Sidebar.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/ui/Badge.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/ui/Button.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/ui/Card.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/ui/CodeSnippet.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/ui/CollapsibleCard.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/ui/DataView.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/ui/EmptyState.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/ui/ExecutionStatus.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/ui/KeyValue.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/ui/ProjectSelector.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/contexts/ProjectContext.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/contexts/ThemeContext.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/index.css +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/layouts/MainLayout.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/main.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/router/index.jsx +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/services/pluginService.js +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/utils/api.js +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/utils/cn.js +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/tailwind.config.js +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/vite.config.js +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/utils.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/utils/__init__.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/utils/config.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/utils/debug.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/utils/environment.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/utils/git.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/utils/logging.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/utils/performance.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/utils/stack_config.py +0 -0
- {flowyml-1.1.0 → flowyml-1.2.0}/flowyml/utils/validation.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flowyml
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.2.0
|
|
4
4
|
Summary: Next-Generation ML Pipeline Framework
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
License-File: LICENSE
|
|
@@ -66,21 +66,25 @@ Description-Content-Type: text/markdown
|
|
|
66
66
|
|
|
67
67
|
---
|
|
68
68
|
|
|
69
|
-
**
|
|
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
70
|
|
|
71
|
-
## 🚀 Why
|
|
71
|
+
## 🚀 Why FlowyML?
|
|
72
72
|
|
|
73
|
-
| Feature |
|
|
73
|
+
| Feature | FlowyML | Traditional Orchestrators |
|
|
74
74
|
|---------|---------|---------------------------|
|
|
75
75
|
| **Developer Experience** | 🐍 **Native Python** - No DSLs, no YAML hell. | 📜 Complex YAML or rigid DSLs. |
|
|
76
76
|
| **Context Awareness** | 🧠 **Auto-Injection** - Params are just function args. | 🔌 Manual wiring of every parameter. |
|
|
77
77
|
| **Caching** | ⚡ **Multi-Level** - Smart content-hashing & memoization. | 🐢 Basic file-timestamp checking. |
|
|
78
78
|
| **Asset Management** | 📦 **First-Class Assets** - Models & Datasets with lineage. | 📁 Generic file paths only. |
|
|
79
79
|
| **Architecture** | 🏗️ **Modular Stacks** - Local, Cloud, Hybrid. | 🔒 Vendor lock-in or complex setup. |
|
|
80
|
+
| **Deployment** | 🏢 **Local or Centralized** - Run locally or deploy as a company-wide hub. | 🧩 Fragmented or cloud-only. |
|
|
81
|
+
| **Flexibility** | 🔌 **Extensive Plugin Ecosystem** | Fixed integration with specific orchestrators or custom tools to be developed. |
|
|
82
|
+
| **Separation of Concerns** | **Steps Grouping, branching and conditions** | Handling only orchestrator logic and task execution oriented. |
|
|
83
|
+
| **Features Rich** | 🌟 **Built-in experiment tracking, model leaderboard, human-in-the-loop, notifications, scheduling** | Very limited or none extra features. |
|
|
80
84
|
|
|
81
85
|
## 🚀 Feature Showcase
|
|
82
86
|
|
|
83
|
-
|
|
87
|
+
FlowyML is a complete toolkit for building, debugging, and deploying ML applications.
|
|
84
88
|
|
|
85
89
|
### 1. Zero-Boilerplate Orchestration
|
|
86
90
|
Write pipelines as standard Python functions. No YAML, no DSLs.
|
|
@@ -110,18 +114,21 @@ def expensive_processing(data):
|
|
|
110
114
|
```
|
|
111
115
|
|
|
112
116
|
### 3. 🤖 LLM & GenAI Ready
|
|
113
|
-
Trace token usage, latency, and costs automatically.
|
|
117
|
+
Trace token usage, latency, and costs automatically with built-in observability.
|
|
114
118
|
|
|
115
119
|
```python
|
|
116
120
|
@step
|
|
117
121
|
@trace_llm(model="gpt-4", tags=["production"])
|
|
118
122
|
def generate_summary(text: str):
|
|
119
|
-
# flowyml automatically tracks
|
|
123
|
+
# flowyml automatically tracks:
|
|
124
|
+
# - Token usage (prompt/completion)
|
|
125
|
+
# - Cost estimation
|
|
126
|
+
# - Latency & Success/Failure rates
|
|
120
127
|
return openai.ChatCompletion.create(...)
|
|
121
128
|
```
|
|
122
129
|
|
|
123
|
-
### 4. ⚡ Efficient Step Grouping
|
|
124
|
-
Group related steps to run in the same container - reduce overhead, maintain clarity.
|
|
130
|
+
### 4. ⚡ Efficient Step Grouping & Separation of Concerns
|
|
131
|
+
Group related steps to run in the same container - reduce overhead, maintain clarity, and keep logic separate from configuration.
|
|
125
132
|
|
|
126
133
|
```python
|
|
127
134
|
# Run preprocessing steps in same container (shares resources)
|
|
@@ -238,12 +245,13 @@ pipeline.run(debug=True) # Pauses at breakpoint
|
|
|
238
245
|
```
|
|
239
246
|
|
|
240
247
|
### 13. 📦 First-Class Assets
|
|
241
|
-
|
|
248
|
+
Assets are not just files; they are first-class citizens with lineage, metadata, and versioning.
|
|
242
249
|
|
|
243
250
|
```python
|
|
244
251
|
from flowyml.core import Dataset, Model, Metrics, FeatureSet
|
|
245
252
|
|
|
246
|
-
|
|
253
|
+
# Assets track their producer, lineage, and metadata automatically
|
|
254
|
+
dataset = Dataset.create(data=df, name="training_data", metadata={"source": "s3"})
|
|
247
255
|
model = Model.create(artifact=trained_model, score=0.95)
|
|
248
256
|
metrics = Metrics.create(values={"accuracy": 0.95})
|
|
249
257
|
```
|
|
@@ -285,11 +293,46 @@ if drift['drift_detected']:
|
|
|
285
293
|
- **🔔 Notifications**: Slack/Email alerts.
|
|
286
294
|
- **🛡️ Circuit Breakers**: Stop cascading failures.
|
|
287
295
|
|
|
288
|
-
### 18.
|
|
296
|
+
### 18. 🏢 Centralized Hub & Docker
|
|
297
|
+
Ready for the enterprise. Run locally per project or deploy as a centralized entity for the company.
|
|
298
|
+
- **Docker Ready**: Backend and Frontend are fully dockerized.
|
|
299
|
+
- **Centralized Hub**: Share pipelines, artifacts, and experiments across the team.
|
|
300
|
+
- **Remote Execution**: Configure local clients to execute on the remote hub.
|
|
301
|
+
|
|
302
|
+
### 19. 🔌 Universal Integrations
|
|
289
303
|
- **ML Frameworks**: PyTorch, TensorFlow, Keras, Scikit-learn, HuggingFace.
|
|
290
304
|
- **Cloud Providers**: AWS, GCP, Azure (via plugins).
|
|
291
305
|
- **Tools**: MLflow, Weights & Biases, Great Expectations.
|
|
292
306
|
|
|
307
|
+
### 20. 📂 Project-Based Organization
|
|
308
|
+
Built-in multi-tenancy for managing multiple teams and initiatives.
|
|
309
|
+
|
|
310
|
+
```python
|
|
311
|
+
from flowyml import Project
|
|
312
|
+
|
|
313
|
+
project = Project("recommendation_system")
|
|
314
|
+
pipeline = project.create_pipeline("training")
|
|
315
|
+
|
|
316
|
+
# All runs, artifacts, and metadata are automatically scoped to the project
|
|
317
|
+
runs = project.list_runs()
|
|
318
|
+
stats = project.get_stats()
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### 21. 📝 Pipeline Templates
|
|
322
|
+
Stop reinventing the wheel. Use pre-built templates for common ML patterns.
|
|
323
|
+
|
|
324
|
+
```python
|
|
325
|
+
from flowyml.core.templates import create_from_template
|
|
326
|
+
|
|
327
|
+
# Create a standard training pipeline in one line
|
|
328
|
+
pipeline = create_from_template(
|
|
329
|
+
"ml_training",
|
|
330
|
+
data_loader=my_loader,
|
|
331
|
+
trainer=my_trainer,
|
|
332
|
+
evaluator=my_evaluator
|
|
333
|
+
)
|
|
334
|
+
```
|
|
335
|
+
|
|
293
336
|
## 📦 Installation
|
|
294
337
|
|
|
295
338
|
```bash
|
|
@@ -339,6 +382,26 @@ print(f"Run ID: {result.run_id}")
|
|
|
339
382
|
print(f"Model Score: {result.outputs['model'].score}")
|
|
340
383
|
```
|
|
341
384
|
|
|
385
|
+
### 16. 🌐 Pipeline Versioning
|
|
386
|
+
Git-like versioning for pipelines. Track changes, compare, rollback.
|
|
387
|
+
|
|
388
|
+
```python
|
|
389
|
+
from flowyml import VersionedPipeline
|
|
390
|
+
|
|
391
|
+
pipeline = VersionedPipeline("training", version="v1.0.0")
|
|
392
|
+
pipeline.add_step(load_data)
|
|
393
|
+
pipeline.save_version()
|
|
394
|
+
|
|
395
|
+
# ... make changes ...
|
|
396
|
+
pipeline.version = "v1.1.0"
|
|
397
|
+
pipeline.save_version()
|
|
398
|
+
|
|
399
|
+
# Compare versions to see exactly what changed (steps, code, context)
|
|
400
|
+
diff = pipeline.compare_with("v1.0.0")
|
|
401
|
+
print(diff["modified_steps"]) # ['train_model']
|
|
402
|
+
print(diff["context_changes"]) # {'learning_rate': {'old': 0.01, 'new': 0.001}}
|
|
403
|
+
```
|
|
404
|
+
|
|
342
405
|
## 🖥️ The flowyml UI
|
|
343
406
|
|
|
344
407
|
Visualize your workflows, inspect artifacts, and monitor runs in real-time.
|
|
@@ -17,21 +17,25 @@
|
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
**
|
|
20
|
+
**FlowyML** is the comprehensive ML pipeline framework that combines the **simplicity of a Python script** with the **power of an enterprise MLOps platform**.
|
|
21
21
|
|
|
22
|
-
## 🚀 Why
|
|
22
|
+
## 🚀 Why FlowyML?
|
|
23
23
|
|
|
24
|
-
| Feature |
|
|
24
|
+
| Feature | FlowyML | Traditional Orchestrators |
|
|
25
25
|
|---------|---------|---------------------------|
|
|
26
26
|
| **Developer Experience** | 🐍 **Native Python** - No DSLs, no YAML hell. | 📜 Complex YAML or rigid DSLs. |
|
|
27
27
|
| **Context Awareness** | 🧠 **Auto-Injection** - Params are just function args. | 🔌 Manual wiring of every parameter. |
|
|
28
28
|
| **Caching** | ⚡ **Multi-Level** - Smart content-hashing & memoization. | 🐢 Basic file-timestamp checking. |
|
|
29
29
|
| **Asset Management** | 📦 **First-Class Assets** - Models & Datasets with lineage. | 📁 Generic file paths only. |
|
|
30
30
|
| **Architecture** | 🏗️ **Modular Stacks** - Local, Cloud, Hybrid. | 🔒 Vendor lock-in or complex setup. |
|
|
31
|
+
| **Deployment** | 🏢 **Local or Centralized** - Run locally or deploy as a company-wide hub. | 🧩 Fragmented or cloud-only. |
|
|
32
|
+
| **Flexibility** | 🔌 **Extensive Plugin Ecosystem** | Fixed integration with specific orchestrators or custom tools to be developed. |
|
|
33
|
+
| **Separation of Concerns** | **Steps Grouping, branching and conditions** | Handling only orchestrator logic and task execution oriented. |
|
|
34
|
+
| **Features Rich** | 🌟 **Built-in experiment tracking, model leaderboard, human-in-the-loop, notifications, scheduling** | Very limited or none extra features. |
|
|
31
35
|
|
|
32
36
|
## 🚀 Feature Showcase
|
|
33
37
|
|
|
34
|
-
|
|
38
|
+
FlowyML is a complete toolkit for building, debugging, and deploying ML applications.
|
|
35
39
|
|
|
36
40
|
### 1. Zero-Boilerplate Orchestration
|
|
37
41
|
Write pipelines as standard Python functions. No YAML, no DSLs.
|
|
@@ -61,18 +65,21 @@ def expensive_processing(data):
|
|
|
61
65
|
```
|
|
62
66
|
|
|
63
67
|
### 3. 🤖 LLM & GenAI Ready
|
|
64
|
-
Trace token usage, latency, and costs automatically.
|
|
68
|
+
Trace token usage, latency, and costs automatically with built-in observability.
|
|
65
69
|
|
|
66
70
|
```python
|
|
67
71
|
@step
|
|
68
72
|
@trace_llm(model="gpt-4", tags=["production"])
|
|
69
73
|
def generate_summary(text: str):
|
|
70
|
-
# flowyml automatically tracks
|
|
74
|
+
# flowyml automatically tracks:
|
|
75
|
+
# - Token usage (prompt/completion)
|
|
76
|
+
# - Cost estimation
|
|
77
|
+
# - Latency & Success/Failure rates
|
|
71
78
|
return openai.ChatCompletion.create(...)
|
|
72
79
|
```
|
|
73
80
|
|
|
74
|
-
### 4. ⚡ Efficient Step Grouping
|
|
75
|
-
Group related steps to run in the same container - reduce overhead, maintain clarity.
|
|
81
|
+
### 4. ⚡ Efficient Step Grouping & Separation of Concerns
|
|
82
|
+
Group related steps to run in the same container - reduce overhead, maintain clarity, and keep logic separate from configuration.
|
|
76
83
|
|
|
77
84
|
```python
|
|
78
85
|
# Run preprocessing steps in same container (shares resources)
|
|
@@ -189,12 +196,13 @@ pipeline.run(debug=True) # Pauses at breakpoint
|
|
|
189
196
|
```
|
|
190
197
|
|
|
191
198
|
### 13. 📦 First-Class Assets
|
|
192
|
-
|
|
199
|
+
Assets are not just files; they are first-class citizens with lineage, metadata, and versioning.
|
|
193
200
|
|
|
194
201
|
```python
|
|
195
202
|
from flowyml.core import Dataset, Model, Metrics, FeatureSet
|
|
196
203
|
|
|
197
|
-
|
|
204
|
+
# Assets track their producer, lineage, and metadata automatically
|
|
205
|
+
dataset = Dataset.create(data=df, name="training_data", metadata={"source": "s3"})
|
|
198
206
|
model = Model.create(artifact=trained_model, score=0.95)
|
|
199
207
|
metrics = Metrics.create(values={"accuracy": 0.95})
|
|
200
208
|
```
|
|
@@ -236,11 +244,46 @@ if drift['drift_detected']:
|
|
|
236
244
|
- **🔔 Notifications**: Slack/Email alerts.
|
|
237
245
|
- **🛡️ Circuit Breakers**: Stop cascading failures.
|
|
238
246
|
|
|
239
|
-
### 18.
|
|
247
|
+
### 18. 🏢 Centralized Hub & Docker
|
|
248
|
+
Ready for the enterprise. Run locally per project or deploy as a centralized entity for the company.
|
|
249
|
+
- **Docker Ready**: Backend and Frontend are fully dockerized.
|
|
250
|
+
- **Centralized Hub**: Share pipelines, artifacts, and experiments across the team.
|
|
251
|
+
- **Remote Execution**: Configure local clients to execute on the remote hub.
|
|
252
|
+
|
|
253
|
+
### 19. 🔌 Universal Integrations
|
|
240
254
|
- **ML Frameworks**: PyTorch, TensorFlow, Keras, Scikit-learn, HuggingFace.
|
|
241
255
|
- **Cloud Providers**: AWS, GCP, Azure (via plugins).
|
|
242
256
|
- **Tools**: MLflow, Weights & Biases, Great Expectations.
|
|
243
257
|
|
|
258
|
+
### 20. 📂 Project-Based Organization
|
|
259
|
+
Built-in multi-tenancy for managing multiple teams and initiatives.
|
|
260
|
+
|
|
261
|
+
```python
|
|
262
|
+
from flowyml import Project
|
|
263
|
+
|
|
264
|
+
project = Project("recommendation_system")
|
|
265
|
+
pipeline = project.create_pipeline("training")
|
|
266
|
+
|
|
267
|
+
# All runs, artifacts, and metadata are automatically scoped to the project
|
|
268
|
+
runs = project.list_runs()
|
|
269
|
+
stats = project.get_stats()
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### 21. 📝 Pipeline Templates
|
|
273
|
+
Stop reinventing the wheel. Use pre-built templates for common ML patterns.
|
|
274
|
+
|
|
275
|
+
```python
|
|
276
|
+
from flowyml.core.templates import create_from_template
|
|
277
|
+
|
|
278
|
+
# Create a standard training pipeline in one line
|
|
279
|
+
pipeline = create_from_template(
|
|
280
|
+
"ml_training",
|
|
281
|
+
data_loader=my_loader,
|
|
282
|
+
trainer=my_trainer,
|
|
283
|
+
evaluator=my_evaluator
|
|
284
|
+
)
|
|
285
|
+
```
|
|
286
|
+
|
|
244
287
|
## 📦 Installation
|
|
245
288
|
|
|
246
289
|
```bash
|
|
@@ -290,6 +333,26 @@ print(f"Run ID: {result.run_id}")
|
|
|
290
333
|
print(f"Model Score: {result.outputs['model'].score}")
|
|
291
334
|
```
|
|
292
335
|
|
|
336
|
+
### 16. 🌐 Pipeline Versioning
|
|
337
|
+
Git-like versioning for pipelines. Track changes, compare, rollback.
|
|
338
|
+
|
|
339
|
+
```python
|
|
340
|
+
from flowyml import VersionedPipeline
|
|
341
|
+
|
|
342
|
+
pipeline = VersionedPipeline("training", version="v1.0.0")
|
|
343
|
+
pipeline.add_step(load_data)
|
|
344
|
+
pipeline.save_version()
|
|
345
|
+
|
|
346
|
+
# ... make changes ...
|
|
347
|
+
pipeline.version = "v1.1.0"
|
|
348
|
+
pipeline.save_version()
|
|
349
|
+
|
|
350
|
+
# Compare versions to see exactly what changed (steps, code, context)
|
|
351
|
+
diff = pipeline.compare_with("v1.0.0")
|
|
352
|
+
print(diff["modified_steps"]) # ['train_model']
|
|
353
|
+
print(diff["context_changes"]) # {'learning_rate': {'old': 0.01, 'new': 0.001}}
|
|
354
|
+
```
|
|
355
|
+
|
|
293
356
|
## 🖥️ The flowyml UI
|
|
294
357
|
|
|
295
358
|
Visualize your workflows, inspect artifacts, and monitor runs in real-time.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import json
|
|
4
4
|
import hashlib
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
from typing import Any,
|
|
6
|
+
from typing import Any, NoReturn
|
|
7
7
|
from datetime import datetime
|
|
8
8
|
from dataclasses import dataclass, asdict
|
|
9
9
|
|
|
@@ -204,7 +204,7 @@ class VersionedPipeline:
|
|
|
204
204
|
if changes["modified"]:
|
|
205
205
|
pass
|
|
206
206
|
|
|
207
|
-
def rollback(self, version: str) ->
|
|
207
|
+
def rollback(self, version: str) -> NoReturn:
|
|
208
208
|
"""Rollback to a previous version (not implemented - would need to reconstruct pipeline)."""
|
|
209
209
|
raise NotImplementedError("Rollback requires pipeline reconstruction from saved state")
|
|
210
210
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "flowyml"
|
|
3
|
-
version = "1.
|
|
3
|
+
version = "1.2.0"
|
|
4
4
|
description = "Next-Generation ML Pipeline Framework"
|
|
5
5
|
authors = ["flowyml Team <support@unicolab.ai>"]
|
|
6
6
|
license = "Apache-2.0"
|
|
@@ -19,6 +19,7 @@ classifiers = [
|
|
|
19
19
|
"Programming Language :: Python :: 3.12",
|
|
20
20
|
]
|
|
21
21
|
packages = [{include = "flowyml"}]
|
|
22
|
+
include = ["flowyml/ui/frontend/dist/**/*"]
|
|
22
23
|
|
|
23
24
|
[tool.poetry.dependencies]
|
|
24
25
|
python = ">=3.10,<4.0"
|
|
@@ -71,11 +72,11 @@ mkdocs = "^1.5.3"
|
|
|
71
72
|
mkdocs-material = "^9.5.3"
|
|
72
73
|
mkdocs-material-extensions = ">=1.3.1"
|
|
73
74
|
mkdocs-gen-files = "^0.5.0"
|
|
74
|
-
mkdocstrings-python = "^
|
|
75
|
-
mkdocstrings = {extras = ["python"], version = "^0.
|
|
75
|
+
mkdocstrings-python = "^1.12.0"
|
|
76
|
+
mkdocstrings = {extras = ["python"], version = "^0.28.0"}
|
|
76
77
|
mkdocs-redirects = "^1.2.2"
|
|
77
78
|
mike = ">=2.0.0"
|
|
78
|
-
griffe = "^
|
|
79
|
+
griffe = "^1.5.0"
|
|
79
80
|
mkdocs-include-markdown-plugin = "^7.2.0"
|
|
80
81
|
|
|
81
82
|
[tool.poetry.extras]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/app/experiments/[experimentId]/page.jsx
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/plugins/AddPluginDialog.jsx
RENAMED
|
File without changes
|
{flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/plugins/InstalledPlugins.jsx
RENAMED
|
File without changes
|
{flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/plugins/PluginBrowser.jsx
RENAMED
|
File without changes
|
{flowyml-1.1.0 → flowyml-1.2.0}/flowyml/ui/frontend/src/components/plugins/PluginManager.jsx
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|