flowyml 1.7.2__py3-none-any.whl → 1.8.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.
- flowyml/assets/base.py +15 -0
- flowyml/assets/metrics.py +5 -0
- flowyml/cli/main.py +709 -0
- flowyml/cli/stack_cli.py +138 -25
- flowyml/core/__init__.py +17 -0
- flowyml/core/executor.py +161 -26
- flowyml/core/image_builder.py +129 -0
- flowyml/core/log_streamer.py +227 -0
- flowyml/core/orchestrator.py +22 -2
- flowyml/core/pipeline.py +34 -10
- flowyml/core/routing.py +558 -0
- flowyml/core/step.py +9 -1
- flowyml/core/step_grouping.py +49 -35
- flowyml/core/types.py +407 -0
- flowyml/monitoring/alerts.py +10 -0
- flowyml/monitoring/notifications.py +104 -25
- flowyml/monitoring/slack_blocks.py +323 -0
- flowyml/plugins/__init__.py +251 -0
- flowyml/plugins/alerters/__init__.py +1 -0
- flowyml/plugins/alerters/slack.py +168 -0
- flowyml/plugins/base.py +752 -0
- flowyml/plugins/config.py +478 -0
- flowyml/plugins/deployers/__init__.py +22 -0
- flowyml/plugins/deployers/gcp_cloud_run.py +200 -0
- flowyml/plugins/deployers/sagemaker.py +306 -0
- flowyml/plugins/deployers/vertex.py +290 -0
- flowyml/plugins/integration.py +369 -0
- flowyml/plugins/manager.py +510 -0
- flowyml/plugins/model_registries/__init__.py +22 -0
- flowyml/plugins/model_registries/mlflow.py +159 -0
- flowyml/plugins/model_registries/sagemaker.py +489 -0
- flowyml/plugins/model_registries/vertex.py +386 -0
- flowyml/plugins/orchestrators/__init__.py +13 -0
- flowyml/plugins/orchestrators/sagemaker.py +443 -0
- flowyml/plugins/orchestrators/vertex_ai.py +461 -0
- flowyml/plugins/registries/__init__.py +13 -0
- flowyml/plugins/registries/ecr.py +321 -0
- flowyml/plugins/registries/gcr.py +313 -0
- flowyml/plugins/registry.py +454 -0
- flowyml/plugins/stack.py +494 -0
- flowyml/plugins/stack_config.py +537 -0
- flowyml/plugins/stores/__init__.py +13 -0
- flowyml/plugins/stores/gcs.py +460 -0
- flowyml/plugins/stores/s3.py +453 -0
- flowyml/plugins/trackers/__init__.py +11 -0
- flowyml/plugins/trackers/mlflow.py +316 -0
- flowyml/plugins/validators/__init__.py +3 -0
- flowyml/plugins/validators/deepchecks.py +119 -0
- flowyml/registry/__init__.py +2 -1
- flowyml/registry/model_environment.py +109 -0
- flowyml/registry/model_registry.py +241 -96
- flowyml/serving/__init__.py +17 -0
- flowyml/serving/model_server.py +628 -0
- flowyml/stacks/__init__.py +60 -0
- flowyml/stacks/aws.py +93 -0
- flowyml/stacks/base.py +62 -0
- flowyml/stacks/components.py +12 -0
- flowyml/stacks/gcp.py +44 -9
- flowyml/stacks/plugins.py +115 -0
- flowyml/stacks/registry.py +2 -1
- flowyml/storage/sql.py +401 -12
- flowyml/tracking/experiment.py +8 -5
- flowyml/ui/backend/Dockerfile +87 -16
- flowyml/ui/backend/auth.py +12 -2
- flowyml/ui/backend/main.py +149 -5
- flowyml/ui/backend/routers/ai_context.py +226 -0
- flowyml/ui/backend/routers/assets.py +23 -4
- flowyml/ui/backend/routers/auth.py +96 -0
- flowyml/ui/backend/routers/deployments.py +660 -0
- flowyml/ui/backend/routers/model_explorer.py +597 -0
- flowyml/ui/backend/routers/plugins.py +103 -51
- flowyml/ui/backend/routers/projects.py +91 -8
- flowyml/ui/backend/routers/runs.py +20 -1
- flowyml/ui/backend/routers/schedules.py +22 -17
- flowyml/ui/backend/routers/templates.py +319 -0
- flowyml/ui/backend/routers/websocket.py +2 -2
- flowyml/ui/frontend/Dockerfile +55 -6
- flowyml/ui/frontend/dist/assets/index-B5AsPTSz.css +1 -0
- flowyml/ui/frontend/dist/assets/index-dFbZ8wD8.js +753 -0
- flowyml/ui/frontend/dist/index.html +2 -2
- flowyml/ui/frontend/dist/logo.png +0 -0
- flowyml/ui/frontend/nginx.conf +65 -4
- flowyml/ui/frontend/package-lock.json +1404 -74
- flowyml/ui/frontend/package.json +3 -0
- flowyml/ui/frontend/public/logo.png +0 -0
- flowyml/ui/frontend/src/App.jsx +10 -7
- flowyml/ui/frontend/src/app/auth/Login.jsx +90 -0
- flowyml/ui/frontend/src/app/dashboard/page.jsx +8 -8
- flowyml/ui/frontend/src/app/deployments/page.jsx +786 -0
- flowyml/ui/frontend/src/app/model-explorer/page.jsx +1031 -0
- flowyml/ui/frontend/src/app/pipelines/page.jsx +12 -2
- flowyml/ui/frontend/src/app/projects/[projectId]/_components/ProjectExperimentsList.jsx +19 -6
- flowyml/ui/frontend/src/app/runs/[runId]/page.jsx +36 -24
- flowyml/ui/frontend/src/app/runs/page.jsx +8 -2
- flowyml/ui/frontend/src/app/settings/page.jsx +267 -253
- flowyml/ui/frontend/src/components/AssetDetailsPanel.jsx +29 -7
- flowyml/ui/frontend/src/components/Layout.jsx +6 -0
- flowyml/ui/frontend/src/components/PipelineGraph.jsx +79 -29
- flowyml/ui/frontend/src/components/RunDetailsPanel.jsx +36 -6
- flowyml/ui/frontend/src/components/RunMetaPanel.jsx +113 -0
- flowyml/ui/frontend/src/components/ai/AIAssistantButton.jsx +71 -0
- flowyml/ui/frontend/src/components/ai/AIAssistantPanel.jsx +420 -0
- flowyml/ui/frontend/src/components/header/Header.jsx +22 -0
- flowyml/ui/frontend/src/components/plugins/PluginManager.jsx +4 -4
- flowyml/ui/frontend/src/components/plugins/{ZenMLIntegration.jsx → StackImport.jsx} +38 -12
- flowyml/ui/frontend/src/components/sidebar/Sidebar.jsx +36 -13
- flowyml/ui/frontend/src/contexts/AIAssistantContext.jsx +245 -0
- flowyml/ui/frontend/src/contexts/AuthContext.jsx +108 -0
- flowyml/ui/frontend/src/hooks/useAIContext.js +156 -0
- flowyml/ui/frontend/src/hooks/useWebGPU.js +54 -0
- flowyml/ui/frontend/src/layouts/MainLayout.jsx +6 -0
- flowyml/ui/frontend/src/router/index.jsx +47 -20
- flowyml/ui/frontend/src/services/pluginService.js +3 -1
- flowyml/ui/server_manager.py +5 -5
- flowyml/ui/utils.py +157 -39
- flowyml/utils/config.py +37 -15
- flowyml/utils/model_introspection.py +123 -0
- flowyml/utils/observability.py +30 -0
- flowyml-1.8.0.dist-info/METADATA +174 -0
- {flowyml-1.7.2.dist-info → flowyml-1.8.0.dist-info}/RECORD +123 -65
- {flowyml-1.7.2.dist-info → flowyml-1.8.0.dist-info}/WHEEL +1 -1
- flowyml/ui/frontend/dist/assets/index-B40RsQDq.css +0 -1
- flowyml/ui/frontend/dist/assets/index-CjI0zKCn.js +0 -685
- flowyml-1.7.2.dist-info/METADATA +0 -477
- {flowyml-1.7.2.dist-info → flowyml-1.8.0.dist-info}/entry_points.txt +0 -0
- {flowyml-1.7.2.dist-info → flowyml-1.8.0.dist-info}/licenses/LICENSE +0 -0
flowyml/ui/frontend/package.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"dependencies": {
|
|
3
|
+
"@mlc-ai/web-llm": "^0.2.80",
|
|
3
4
|
"clsx": "^2.1.1",
|
|
4
5
|
"dagre": "^0.8.5",
|
|
5
6
|
"date-fns": "^4.1.0",
|
|
@@ -7,11 +8,13 @@
|
|
|
7
8
|
"lucide-react": "^0.344.0",
|
|
8
9
|
"react": "^18.2.0",
|
|
9
10
|
"react-dom": "^18.2.0",
|
|
11
|
+
"react-markdown": "^10.1.0",
|
|
10
12
|
"react-resizable-panels": "^3.0.6",
|
|
11
13
|
"react-router-dom": "^6.22.0",
|
|
12
14
|
"react-syntax-highlighter": "^16.1.0",
|
|
13
15
|
"reactflow": "^11.11.4",
|
|
14
16
|
"recharts": "^2.12.0",
|
|
17
|
+
"remark-gfm": "^4.0.1",
|
|
15
18
|
"tailwind-merge": "^2.6.0"
|
|
16
19
|
},
|
|
17
20
|
"devDependencies": {
|
|
Binary file
|
flowyml/ui/frontend/src/App.jsx
CHANGED
|
@@ -5,17 +5,20 @@ import { RouterProvider } from 'react-router-dom';
|
|
|
5
5
|
import { ThemeProvider } from './contexts/ThemeContext';
|
|
6
6
|
import { ProjectProvider } from './contexts/ProjectContext';
|
|
7
7
|
import { ToastProvider } from './contexts/ToastContext';
|
|
8
|
+
import { AIAssistantProvider } from './contexts/AIAssistantContext';
|
|
8
9
|
import { router } from './router';
|
|
9
10
|
|
|
10
11
|
function App() {
|
|
11
12
|
return (
|
|
12
|
-
<
|
|
13
|
-
<
|
|
14
|
-
<
|
|
15
|
-
<
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
<AIAssistantProvider>
|
|
14
|
+
<ThemeProvider>
|
|
15
|
+
<ProjectProvider>
|
|
16
|
+
<ToastProvider>
|
|
17
|
+
<RouterProvider router={router} />
|
|
18
|
+
</ToastProvider>
|
|
19
|
+
</ProjectProvider>
|
|
20
|
+
</ThemeProvider>
|
|
21
|
+
</AIAssistantProvider>
|
|
19
22
|
);
|
|
20
23
|
}
|
|
21
24
|
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { useAuth } from '../../contexts/AuthContext';
|
|
3
|
+
|
|
4
|
+
export const Login = () => {
|
|
5
|
+
const [username, setUsername] = useState('');
|
|
6
|
+
const [password, setPassword] = useState('');
|
|
7
|
+
const [error, setError] = useState('');
|
|
8
|
+
const { login } = useAuth();
|
|
9
|
+
const [submitting, setSubmitting] = useState(false);
|
|
10
|
+
|
|
11
|
+
const handleSubmit = async (e) => {
|
|
12
|
+
e.preventDefault();
|
|
13
|
+
setError('');
|
|
14
|
+
setSubmitting(true);
|
|
15
|
+
const result = await login(username, password);
|
|
16
|
+
if (!result.success) {
|
|
17
|
+
setError(result.error);
|
|
18
|
+
}
|
|
19
|
+
setSubmitting(false);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<div className="min-h-screen flex items-center justify-center bg-gray-900 px-4 sm:px-6 lg:px-8">
|
|
24
|
+
<div className="max-w-md w-full space-y-8">
|
|
25
|
+
<div>
|
|
26
|
+
<h2 className="mt-6 text-center text-3xl font-extrabold text-white">
|
|
27
|
+
FlowyML
|
|
28
|
+
</h2>
|
|
29
|
+
<p className="mt-2 text-center text-sm text-gray-400">
|
|
30
|
+
Sign in to your account
|
|
31
|
+
</p>
|
|
32
|
+
</div>
|
|
33
|
+
<form className="mt-8 space-y-6" onSubmit={handleSubmit}>
|
|
34
|
+
<input type="hidden" name="remember" defaultValue="true" />
|
|
35
|
+
<div className="rounded-md shadow-sm -space-y-px">
|
|
36
|
+
<div>
|
|
37
|
+
<label htmlFor="username-address" className="sr-only">
|
|
38
|
+
Username
|
|
39
|
+
</label>
|
|
40
|
+
<input
|
|
41
|
+
id="username-address"
|
|
42
|
+
name="username"
|
|
43
|
+
type="text"
|
|
44
|
+
autoComplete="username"
|
|
45
|
+
required
|
|
46
|
+
className="appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-700 placeholder-gray-500 text-white bg-gray-800 rounded-t-md focus:outline-none focus:ring-primary-500 focus:border-primary-500 focus:z-10 sm:text-sm"
|
|
47
|
+
placeholder="Username (default: admin)"
|
|
48
|
+
value={username}
|
|
49
|
+
onChange={(e) => setUsername(e.target.value)}
|
|
50
|
+
/>
|
|
51
|
+
</div>
|
|
52
|
+
<div>
|
|
53
|
+
<label htmlFor="password" className="sr-only">
|
|
54
|
+
Password
|
|
55
|
+
</label>
|
|
56
|
+
<input
|
|
57
|
+
id="password"
|
|
58
|
+
name="password"
|
|
59
|
+
type="password"
|
|
60
|
+
autoComplete="current-password"
|
|
61
|
+
required
|
|
62
|
+
className="appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-700 placeholder-gray-500 text-white bg-gray-800 rounded-b-md focus:outline-none focus:ring-primary-500 focus:border-primary-500 focus:z-10 sm:text-sm"
|
|
63
|
+
placeholder="Password"
|
|
64
|
+
value={password}
|
|
65
|
+
onChange={(e) => setPassword(e.target.value)}
|
|
66
|
+
/>
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
|
|
70
|
+
{error && (
|
|
71
|
+
<div className="text-red-500 text-sm text-center">
|
|
72
|
+
{error}
|
|
73
|
+
</div>
|
|
74
|
+
)}
|
|
75
|
+
|
|
76
|
+
<div>
|
|
77
|
+
<button
|
|
78
|
+
type="submit"
|
|
79
|
+
disabled={submitting}
|
|
80
|
+
className={`group relative w-full flex justify-center py-2 px-4 border border-transparent text-sm font-medium rounded-md text-white ${submitting ? 'bg-primary-700' : 'bg-primary-600 hover:bg-primary-700'
|
|
81
|
+
} focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500`}
|
|
82
|
+
>
|
|
83
|
+
{submitting ? 'Signing in...' : 'Sign in'}
|
|
84
|
+
</button>
|
|
85
|
+
</div>
|
|
86
|
+
</form>
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
);
|
|
90
|
+
};
|
|
@@ -103,26 +103,26 @@ export function Dashboard() {
|
|
|
103
103
|
className="space-y-8"
|
|
104
104
|
>
|
|
105
105
|
{/* Welcome Header */}
|
|
106
|
-
<motion.div variants={item} className="relative overflow-hidden bg-gradient-to-br from-primary-
|
|
107
|
-
<div className="absolute top-0 right-0 w-64 h-64 bg-white/
|
|
108
|
-
<div className="absolute bottom-0 left-0 w-48 h-48 bg-white/
|
|
106
|
+
<motion.div variants={item} className="relative overflow-hidden bg-gradient-to-br from-primary-600 via-primary-700 to-purple-700 rounded-2xl p-8 text-white shadow-xl">
|
|
107
|
+
<div className="absolute top-0 right-0 w-64 h-64 bg-white/5 rounded-full -mr-32 -mt-32" />
|
|
108
|
+
<div className="absolute bottom-0 left-0 w-48 h-48 bg-white/5 rounded-full -ml-24 -mb-24" />
|
|
109
109
|
|
|
110
110
|
<div className="relative z-10">
|
|
111
111
|
<div className="flex items-center gap-3 mb-3">
|
|
112
|
-
<Zap size={32} className="text-yellow-300" />
|
|
113
|
-
<h1 className="text-4xl font-bold">Welcome to flowyml</h1>
|
|
112
|
+
<Zap size={32} className="text-yellow-300 drop-shadow-lg" />
|
|
113
|
+
<h1 className="text-4xl font-bold drop-shadow-md">Welcome to flowyml</h1>
|
|
114
114
|
</div>
|
|
115
|
-
<p className="text-
|
|
115
|
+
<p className="text-white/90 text-lg max-w-2xl drop-shadow-sm">
|
|
116
116
|
Your lightweight, artifact-centric ML orchestration platform. Build, run, and track your ML pipelines with ease.
|
|
117
117
|
</p>
|
|
118
118
|
<div className="mt-6 flex gap-3">
|
|
119
119
|
<Link to="/pipelines">
|
|
120
|
-
<button className="px-6 py-2.5 bg-white text-primary-
|
|
120
|
+
<button className="px-6 py-2.5 bg-white text-primary-700 rounded-lg font-semibold hover:bg-primary-50 transition-colors shadow-lg">
|
|
121
121
|
View Pipelines
|
|
122
122
|
</button>
|
|
123
123
|
</Link>
|
|
124
124
|
<Link to="/runs">
|
|
125
|
-
<button className="px-6 py-2.5 bg-
|
|
125
|
+
<button className="px-6 py-2.5 bg-white/10 backdrop-blur-sm text-white rounded-lg font-semibold hover:bg-white/20 transition-colors border border-white/30 shadow-lg">
|
|
126
126
|
Recent Runs
|
|
127
127
|
</button>
|
|
128
128
|
</Link>
|