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.
Files changed (126) hide show
  1. flowyml/assets/base.py +15 -0
  2. flowyml/assets/metrics.py +5 -0
  3. flowyml/cli/main.py +709 -0
  4. flowyml/cli/stack_cli.py +138 -25
  5. flowyml/core/__init__.py +17 -0
  6. flowyml/core/executor.py +161 -26
  7. flowyml/core/image_builder.py +129 -0
  8. flowyml/core/log_streamer.py +227 -0
  9. flowyml/core/orchestrator.py +22 -2
  10. flowyml/core/pipeline.py +34 -10
  11. flowyml/core/routing.py +558 -0
  12. flowyml/core/step.py +9 -1
  13. flowyml/core/step_grouping.py +49 -35
  14. flowyml/core/types.py +407 -0
  15. flowyml/monitoring/alerts.py +10 -0
  16. flowyml/monitoring/notifications.py +104 -25
  17. flowyml/monitoring/slack_blocks.py +323 -0
  18. flowyml/plugins/__init__.py +251 -0
  19. flowyml/plugins/alerters/__init__.py +1 -0
  20. flowyml/plugins/alerters/slack.py +168 -0
  21. flowyml/plugins/base.py +752 -0
  22. flowyml/plugins/config.py +478 -0
  23. flowyml/plugins/deployers/__init__.py +22 -0
  24. flowyml/plugins/deployers/gcp_cloud_run.py +200 -0
  25. flowyml/plugins/deployers/sagemaker.py +306 -0
  26. flowyml/plugins/deployers/vertex.py +290 -0
  27. flowyml/plugins/integration.py +369 -0
  28. flowyml/plugins/manager.py +510 -0
  29. flowyml/plugins/model_registries/__init__.py +22 -0
  30. flowyml/plugins/model_registries/mlflow.py +159 -0
  31. flowyml/plugins/model_registries/sagemaker.py +489 -0
  32. flowyml/plugins/model_registries/vertex.py +386 -0
  33. flowyml/plugins/orchestrators/__init__.py +13 -0
  34. flowyml/plugins/orchestrators/sagemaker.py +443 -0
  35. flowyml/plugins/orchestrators/vertex_ai.py +461 -0
  36. flowyml/plugins/registries/__init__.py +13 -0
  37. flowyml/plugins/registries/ecr.py +321 -0
  38. flowyml/plugins/registries/gcr.py +313 -0
  39. flowyml/plugins/registry.py +454 -0
  40. flowyml/plugins/stack.py +494 -0
  41. flowyml/plugins/stack_config.py +537 -0
  42. flowyml/plugins/stores/__init__.py +13 -0
  43. flowyml/plugins/stores/gcs.py +460 -0
  44. flowyml/plugins/stores/s3.py +453 -0
  45. flowyml/plugins/trackers/__init__.py +11 -0
  46. flowyml/plugins/trackers/mlflow.py +316 -0
  47. flowyml/plugins/validators/__init__.py +3 -0
  48. flowyml/plugins/validators/deepchecks.py +119 -0
  49. flowyml/registry/__init__.py +2 -1
  50. flowyml/registry/model_environment.py +109 -0
  51. flowyml/registry/model_registry.py +241 -96
  52. flowyml/serving/__init__.py +17 -0
  53. flowyml/serving/model_server.py +628 -0
  54. flowyml/stacks/__init__.py +60 -0
  55. flowyml/stacks/aws.py +93 -0
  56. flowyml/stacks/base.py +62 -0
  57. flowyml/stacks/components.py +12 -0
  58. flowyml/stacks/gcp.py +44 -9
  59. flowyml/stacks/plugins.py +115 -0
  60. flowyml/stacks/registry.py +2 -1
  61. flowyml/storage/sql.py +401 -12
  62. flowyml/tracking/experiment.py +8 -5
  63. flowyml/ui/backend/Dockerfile +87 -16
  64. flowyml/ui/backend/auth.py +12 -2
  65. flowyml/ui/backend/main.py +149 -5
  66. flowyml/ui/backend/routers/ai_context.py +226 -0
  67. flowyml/ui/backend/routers/assets.py +23 -4
  68. flowyml/ui/backend/routers/auth.py +96 -0
  69. flowyml/ui/backend/routers/deployments.py +660 -0
  70. flowyml/ui/backend/routers/model_explorer.py +597 -0
  71. flowyml/ui/backend/routers/plugins.py +103 -51
  72. flowyml/ui/backend/routers/projects.py +91 -8
  73. flowyml/ui/backend/routers/runs.py +20 -1
  74. flowyml/ui/backend/routers/schedules.py +22 -17
  75. flowyml/ui/backend/routers/templates.py +319 -0
  76. flowyml/ui/backend/routers/websocket.py +2 -2
  77. flowyml/ui/frontend/Dockerfile +55 -6
  78. flowyml/ui/frontend/dist/assets/index-B5AsPTSz.css +1 -0
  79. flowyml/ui/frontend/dist/assets/index-dFbZ8wD8.js +753 -0
  80. flowyml/ui/frontend/dist/index.html +2 -2
  81. flowyml/ui/frontend/dist/logo.png +0 -0
  82. flowyml/ui/frontend/nginx.conf +65 -4
  83. flowyml/ui/frontend/package-lock.json +1404 -74
  84. flowyml/ui/frontend/package.json +3 -0
  85. flowyml/ui/frontend/public/logo.png +0 -0
  86. flowyml/ui/frontend/src/App.jsx +10 -7
  87. flowyml/ui/frontend/src/app/auth/Login.jsx +90 -0
  88. flowyml/ui/frontend/src/app/dashboard/page.jsx +8 -8
  89. flowyml/ui/frontend/src/app/deployments/page.jsx +786 -0
  90. flowyml/ui/frontend/src/app/model-explorer/page.jsx +1031 -0
  91. flowyml/ui/frontend/src/app/pipelines/page.jsx +12 -2
  92. flowyml/ui/frontend/src/app/projects/[projectId]/_components/ProjectExperimentsList.jsx +19 -6
  93. flowyml/ui/frontend/src/app/runs/[runId]/page.jsx +36 -24
  94. flowyml/ui/frontend/src/app/runs/page.jsx +8 -2
  95. flowyml/ui/frontend/src/app/settings/page.jsx +267 -253
  96. flowyml/ui/frontend/src/components/AssetDetailsPanel.jsx +29 -7
  97. flowyml/ui/frontend/src/components/Layout.jsx +6 -0
  98. flowyml/ui/frontend/src/components/PipelineGraph.jsx +79 -29
  99. flowyml/ui/frontend/src/components/RunDetailsPanel.jsx +36 -6
  100. flowyml/ui/frontend/src/components/RunMetaPanel.jsx +113 -0
  101. flowyml/ui/frontend/src/components/ai/AIAssistantButton.jsx +71 -0
  102. flowyml/ui/frontend/src/components/ai/AIAssistantPanel.jsx +420 -0
  103. flowyml/ui/frontend/src/components/header/Header.jsx +22 -0
  104. flowyml/ui/frontend/src/components/plugins/PluginManager.jsx +4 -4
  105. flowyml/ui/frontend/src/components/plugins/{ZenMLIntegration.jsx → StackImport.jsx} +38 -12
  106. flowyml/ui/frontend/src/components/sidebar/Sidebar.jsx +36 -13
  107. flowyml/ui/frontend/src/contexts/AIAssistantContext.jsx +245 -0
  108. flowyml/ui/frontend/src/contexts/AuthContext.jsx +108 -0
  109. flowyml/ui/frontend/src/hooks/useAIContext.js +156 -0
  110. flowyml/ui/frontend/src/hooks/useWebGPU.js +54 -0
  111. flowyml/ui/frontend/src/layouts/MainLayout.jsx +6 -0
  112. flowyml/ui/frontend/src/router/index.jsx +47 -20
  113. flowyml/ui/frontend/src/services/pluginService.js +3 -1
  114. flowyml/ui/server_manager.py +5 -5
  115. flowyml/ui/utils.py +157 -39
  116. flowyml/utils/config.py +37 -15
  117. flowyml/utils/model_introspection.py +123 -0
  118. flowyml/utils/observability.py +30 -0
  119. flowyml-1.8.0.dist-info/METADATA +174 -0
  120. {flowyml-1.7.2.dist-info → flowyml-1.8.0.dist-info}/RECORD +123 -65
  121. {flowyml-1.7.2.dist-info → flowyml-1.8.0.dist-info}/WHEEL +1 -1
  122. flowyml/ui/frontend/dist/assets/index-B40RsQDq.css +0 -1
  123. flowyml/ui/frontend/dist/assets/index-CjI0zKCn.js +0 -685
  124. flowyml-1.7.2.dist-info/METADATA +0 -477
  125. {flowyml-1.7.2.dist-info → flowyml-1.8.0.dist-info}/entry_points.txt +0 -0
  126. {flowyml-1.7.2.dist-info → flowyml-1.8.0.dist-info}/licenses/LICENSE +0 -0
@@ -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
@@ -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
- <ThemeProvider>
13
- <ProjectProvider>
14
- <ToastProvider>
15
- <RouterProvider router={router} />
16
- </ToastProvider>
17
- </ProjectProvider>
18
- </ThemeProvider>
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-500 via-primary-600 to-purple-600 rounded-2xl p-8 text-white shadow-xl">
107
- <div className="absolute top-0 right-0 w-64 h-64 bg-white/10 rounded-full -mr-32 -mt-32" />
108
- <div className="absolute bottom-0 left-0 w-48 h-48 bg-white/10 rounded-full -ml-24 -mb-24" />
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-primary-100 text-lg max-w-2xl">
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-600 rounded-lg font-semibold hover:bg-primary-50 transition-colors shadow-lg">
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-primary-700/50 backdrop-blur-sm text-white rounded-lg font-semibold hover:bg-primary-700/70 transition-colors border border-white/20">
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>