flowyml 1.3.0__py3-none-any.whl → 1.4.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.
@@ -71,16 +71,13 @@ async def create_schedule(schedule: ScheduleRequest):
71
71
  else:
72
72
  # Check if it's a historical pipeline (in metadata but not registry)
73
73
  # This means we can't run it because we don't have the code loaded
74
- from flowyml.storage.metadata import SQLiteMetadataStore
74
+ from flowyml.ui.backend.dependencies import get_store
75
75
 
76
- store = SQLiteMetadataStore()
76
+ store = get_store()
77
77
  pipelines = store.list_pipelines()
78
78
 
79
79
  if schedule.pipeline_name in pipelines:
80
80
  # Try to load pipeline definition
81
- from flowyml.storage.metadata import SQLiteMetadataStore
82
-
83
- store = SQLiteMetadataStore()
84
81
  pipeline_def = store.get_pipeline_definition(schedule.pipeline_name)
85
82
 
86
83
  if pipeline_def:
@@ -188,7 +185,6 @@ async def get_schedule_history(schedule_name: str, limit: int = 50):
188
185
  async def list_registered_pipelines(project: str = None):
189
186
  """List all pipelines available for scheduling."""
190
187
  from flowyml.core.templates import list_templates
191
- from flowyml.storage.metadata import SQLiteMetadataStore
192
188
 
193
189
  registered = pipeline_registry.list_pipelines()
194
190
  templates = list_templates()
@@ -196,22 +192,10 @@ async def list_registered_pipelines(project: str = None):
196
192
  # Also get pipelines from metadata store (historical runs)
197
193
  metadata_pipelines = []
198
194
  try:
199
- store = SQLiteMetadataStore()
200
- import sqlite3
201
-
202
- conn = sqlite3.connect(store.db_path)
203
- cursor = conn.cursor()
204
-
205
- if project:
206
- cursor.execute(
207
- "SELECT DISTINCT pipeline_name FROM runs WHERE project = ? ORDER BY pipeline_name",
208
- (project,),
209
- )
210
- else:
211
- cursor.execute("SELECT DISTINCT pipeline_name FROM runs ORDER BY pipeline_name")
195
+ from flowyml.ui.backend.dependencies import get_store
212
196
 
213
- metadata_pipelines = [row[0] for row in cursor.fetchall()]
214
- conn.close()
197
+ store = get_store()
198
+ metadata_pipelines = store.list_pipelines(project=project)
215
199
  except Exception as e:
216
200
  print(f"Failed to fetch pipelines from metadata store: {e}")
217
201
 
@@ -0,0 +1,14 @@
1
+ from fastapi import APIRouter, HTTPException
2
+ from flowyml.ui.backend.dependencies import get_store
3
+
4
+ router = APIRouter()
5
+
6
+
7
+ @router.get("/")
8
+ async def get_global_stats():
9
+ """Get global statistics."""
10
+ try:
11
+ store = get_store()
12
+ return store.get_statistics()
13
+ except Exception as e:
14
+ raise HTTPException(status_code=500, detail=str(e))
@@ -1,7 +1,6 @@
1
1
  from fastapi import APIRouter, HTTPException
2
- from flowyml.storage.metadata import SQLiteMetadataStore
3
- import contextlib
4
- import builtins
2
+ from pydantic import BaseModel
3
+ from flowyml.ui.backend.dependencies import get_store
5
4
 
6
5
  router = APIRouter()
7
6
 
@@ -14,61 +13,14 @@ async def list_traces(
14
13
  project: str | None = None,
15
14
  ):
16
15
  """List traces, optionally filtered by project."""
17
- store = SQLiteMetadataStore()
18
-
19
- # We need to implement list_traces in metadata store or query manually
20
- # For now, let's query manually via sqlite
21
- import sqlite3
22
-
23
- conn = sqlite3.connect(store.db_path)
24
- cursor = conn.cursor()
25
-
26
- query = "SELECT * FROM traces"
27
- params = []
28
- conditions = []
29
-
30
- if trace_id:
31
- conditions.append("trace_id = ?")
32
- params.append(trace_id)
33
-
34
- if event_type:
35
- conditions.append("event_type = ?")
36
- params.append(event_type)
37
-
38
- if project:
39
- conditions.append("project = ?")
40
- params.append(project)
41
-
42
- if conditions:
43
- query += " WHERE " + " AND ".join(conditions)
44
-
45
- query += " ORDER BY start_time DESC LIMIT ?"
46
- params.append(limit)
47
-
48
- cursor.execute(query, params)
49
- columns = [description[0] for description in cursor.description]
50
- rows = cursor.fetchall()
51
-
52
- traces = []
53
- import json
54
-
55
- for row in rows:
56
- trace = dict(zip(columns, row, strict=False))
57
- # Parse JSON fields
58
- for field in ["inputs", "outputs", "metadata"]:
59
- if trace[field]:
60
- with contextlib.suppress(builtins.BaseException):
61
- trace[field] = json.loads(trace[field])
62
- traces.append(trace)
63
-
64
- conn.close()
65
- return traces
16
+ store = get_store()
17
+ return store.list_traces(limit=limit, trace_id=trace_id, event_type=event_type, project=project)
66
18
 
67
19
 
68
20
  @router.get("/{trace_id}")
69
21
  async def get_trace(trace_id: str):
70
22
  """Get a specific trace tree."""
71
- store = SQLiteMetadataStore()
23
+ store = get_store()
72
24
  events = store.get_trace(trace_id)
73
25
  if not events:
74
26
  raise HTTPException(status_code=404, detail="Trace not found")
@@ -82,3 +34,35 @@ async def get_trace(trace_id: str):
82
34
  return event
83
35
 
84
36
  return [build_tree(root) for root in root_events]
37
+
38
+
39
+ class TraceEventCreate(BaseModel):
40
+ event_id: str
41
+ trace_id: str
42
+ parent_id: str | None = None
43
+ event_type: str
44
+ name: str
45
+ inputs: dict | None = None
46
+ outputs: dict | None = None
47
+ start_time: float | None = None
48
+ end_time: float | None = None
49
+ duration: float | None = None
50
+ status: str | None = None
51
+ error: str | None = None
52
+ metadata: dict | None = None
53
+ prompt_tokens: int | None = None
54
+ completion_tokens: int | None = None
55
+ total_tokens: int | None = None
56
+ cost: float | None = None
57
+ model: str | None = None
58
+
59
+
60
+ @router.post("/")
61
+ async def create_trace_event(event: TraceEventCreate):
62
+ """Create or update a trace event."""
63
+ try:
64
+ store = get_store()
65
+ store.save_trace_event(event.dict())
66
+ return {"status": "success", "event_id": event.event_id}
67
+ except Exception as e:
68
+ raise HTTPException(status_code=500, detail=str(e))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flowyml
3
- Version: 1.3.0
3
+ Version: 1.4.0
4
4
  Summary: Next-Generation ML Pipeline Framework
5
5
  License: Apache-2.0
6
6
  License-File: LICENSE
@@ -36,11 +36,13 @@ Requires-Dist: httpx (>=0.24,<0.28)
36
36
  Requires-Dist: loguru (>=0.7.3,<0.8.0)
37
37
  Requires-Dist: numpy (>=1.20.0)
38
38
  Requires-Dist: pandas (>=1.3.0)
39
+ Requires-Dist: psycopg2-binary (>=2.9.0)
39
40
  Requires-Dist: pydantic (>=2.0.0)
40
41
  Requires-Dist: python-multipart (>=0.0.6) ; extra == "ui" or extra == "all"
41
42
  Requires-Dist: pytz (>=2024.1,<2025.0)
42
43
  Requires-Dist: pyyaml (>=6.0)
43
44
  Requires-Dist: scikit-learn (>=1.0.0) ; extra == "sklearn" or extra == "all"
45
+ Requires-Dist: sqlalchemy (>=2.0.0)
44
46
  Requires-Dist: tensorflow (>=2.12.0) ; extra == "tensorflow" or extra == "all"
45
47
  Requires-Dist: toml (>=0.10.2)
46
48
  Requires-Dist: torch (>=2.0.0) ; extra == "pytorch" or extra == "all"
@@ -27,19 +27,19 @@ flowyml/core/execution_status.py,sha256=gKLyWbJHo2mfjcsAhORCRqu14E2XEO0NaqTE9wfM
27
27
  flowyml/core/executor.py,sha256=oXVUsh-W1oC357usZvU6qrlYx1NhIN03Ux5FTMQonf4,12328
28
28
  flowyml/core/graph.py,sha256=drVezsgYwva-b8X5FsjExtaW-7NsjYMkchTIPYyb5HQ,6065
29
29
  flowyml/core/hooks.py,sha256=UOqrNY1m3lmVql1FRls6AXDNAV3dxxZl-zO6ijEeRW8,4022
30
- flowyml/core/observability.py,sha256=vu327Qi0hCuwOY_S_bqRM6oRV9rDlqDnxGbKJYb0Y2E,7039
30
+ flowyml/core/observability.py,sha256=NW05m8zki1TwKeRBBCtAP1UwguMcJasGz8HHgMVbjAU,7011
31
31
  flowyml/core/orchestrator.py,sha256=S3dwRykDAOoqBMsHCrgJcNmTemKCWN20Ohp_eWHm-NA,10807
32
32
  flowyml/core/parallel.py,sha256=KGstDu32i9FFKZV0bBRrm1kl3bKjcHmL2js48dVjWlk,12492
33
33
  flowyml/core/pipeline.py,sha256=ZA1WrdYAJXyBajntDoy-2lf0OQTTQjFME4CfHiJNoMw,27417
34
34
  flowyml/core/project.py,sha256=e6DVQYvNpOy0zfWVYzzUOQM60LH6rh-bui5Xpf5mqqA,8879
35
35
  flowyml/core/remote_orchestrator.py,sha256=LpHlNQslq14OliNZogBGf0fpu6c5n9T7f3BpftahM8Q,3527
36
- flowyml/core/resources.py,sha256=CE1XrAMf6hzV_AO0CRAaq0rZqL84LdMXsIXDBnTclGs,14445
37
- flowyml/core/retry_policy.py,sha256=yNvFlrIypXAObN2zH3eCnVq50wtk-Bq4eHDi2ZvE690,2371
38
- flowyml/core/scheduler.py,sha256=af3xKs48uX8SjJItjbfINZc3Cv8U711KTgSRTmZhRQI,22115
39
- flowyml/core/scheduler_config.py,sha256=4VF_AKKU_AcHXURZjE77ff8Uhm2eO7v_nWbs1bq7Z38,1237
36
+ flowyml/core/resources.py,sha256=5TimjjSOEedALgNVVjRrvU-cHujKebyFjU4YxImvqZE,14402
37
+ flowyml/core/retry_policy.py,sha256=OKiazbSfGm01BMAhVrjYrGbGZdceTgckGZjbcDeKK1c,2358
38
+ flowyml/core/scheduler.py,sha256=EPMBzHacVCCslVJ7azlHr0MyfGAjQKyRFZad0Guk_7A,22081
39
+ flowyml/core/scheduler_config.py,sha256=bMlt9a7ap_-kKImiRbEAhuGkzvvpJiQPu8NXIfdwhEA,1203
40
40
  flowyml/core/step.py,sha256=h_y4Yx_uJSL6D8jaL1vhAjtYFUjt-64RGsJHapJxCss,7871
41
41
  flowyml/core/step_grouping.py,sha256=wBMZbOLZW5ghN8n8J3CmzKFKTaytRzrLkHJ-AwCuP5E,9941
42
- flowyml/core/submission_result.py,sha256=P-Gxm1OoY6cJs0rtaX6vhgTcWV8jecU4KeUmOCHBVHI,1711
42
+ flowyml/core/submission_result.py,sha256=bPPCC9pxqCZTTV0CdK1znJi4Rhw8QRCqQVwuVFr0b20,1692
43
43
  flowyml/core/templates.py,sha256=r7WbxZv8-BV3_3oX27ACGSitIsmNbNd4VeitpI2uJeg,6359
44
44
  flowyml/core/versioning.py,sha256=kpYLJ7YBTfGduZmy45-qcnJLOIFqsIcc6WIisObVKYE,7080
45
45
  flowyml/integrations/__init__.py,sha256=SQWPFwFs_1gLGlJ6TDo2bcFKwBrv1PkwhZvEiELV1ok,28
@@ -57,18 +57,18 @@ flowyml/stacks/__init__.py,sha256=5FOapdb-qoXtZz0wa1_I1OZT5SBITarJjNy4WT_OyPU,12
57
57
  flowyml/stacks/aws.py,sha256=8u2TcKT-Z-PFfgaswjW87UrFi_VpA7JmK4Ev3NEYtHY,20958
58
58
  flowyml/stacks/azure.py,sha256=UdEoA0bhAF3g3zbiTaNi5ldptVAm_CRYWovC3w8tsEA,10587
59
59
  flowyml/stacks/base.py,sha256=0C0s9um6mstRUfkOEYXlunn9F3H4u9XPRp8lnGSj-G4,2537
60
- flowyml/stacks/bridge.py,sha256=EA1ABE9mOvpZsOcH_zJwEifQCttjv3G6v9yrvhtqp-0,10919
60
+ flowyml/stacks/bridge.py,sha256=spDWDqAiph6TedPavS-_HhLns0wCMz2R59IchLfUWh4,10885
61
61
  flowyml/stacks/components.py,sha256=fxTSJLqyH1--hyF1Nqx4HG4fGbMmPJIOfZ6az0WCggY,4929
62
62
  flowyml/stacks/gcp.py,sha256=u8b4rddca1pPSHYTiZ0riK4vdCHyv160o5Oi4B_NZrw,20436
63
63
  flowyml/stacks/local.py,sha256=FjxmCdH9gd3Qq8tbwW4WSsA3QwsgWCJrZJwtDmcKRsg,3858
64
64
  flowyml/stacks/migration.py,sha256=dWSOVkDWY6Y-yobmTNS0JZ1aKJw6xkRXndRN5vH8aFM,3523
65
65
  flowyml/stacks/plugin_config.py,sha256=16ggYUj7w1qYM-cwDRrpf9ydpj7C5CZytIgNDZbVdSY,2483
66
- flowyml/stacks/plugins.py,sha256=PRrIo_6waYyT6l73bKlfbI6_zWzGkR3I7m_5W0-GDpU,15273
67
- flowyml/stacks/registry.py,sha256=mAH88cuDSZ9PGNSdp8dTd_uwWJm8u2yNM4b4_n6QvK4,6329
66
+ flowyml/stacks/plugins.py,sha256=tR1wcKlhgguKhqrQpIlqqNBMiRbys6A_59ItS9fNhBo,15260
67
+ flowyml/stacks/registry.py,sha256=_n7EtI7s4BXMbF_tRT7KDC_FNntyb1146mtE0dNT3mw,7152
68
68
  flowyml/storage/__init__.py,sha256=d03pJ5Q-iTMRRQNJi5dI9vYqwY3QMlUDiEIZ4AZ0o8Y,984
69
69
  flowyml/storage/artifacts.py,sha256=JCLLkDSglPdDsr-YluX70N3T61noob9-BKCbEnjcf-4,7498
70
70
  flowyml/storage/materializers/__init__.py,sha256=_uqy_2lf5eHKxjjEMWaluqAHi3KLPf11cV6FYbHRAk8,899
71
- flowyml/storage/materializers/base.py,sha256=cY6Rd5r5nvOGM2AkGmREf77d0WvYtTN4HpIJsEDPTMs,3791
71
+ flowyml/storage/materializers/base.py,sha256=r_ZoNXenTxGOoWgCXqMj0r5He4-vUNHuSwKue_-rdWY,4917
72
72
  flowyml/storage/materializers/cloudpickle.py,sha256=lQ5IT-TYTi93cQ46SWJ9uNvJZKWmuHHDVZsvWTFeqwE,2285
73
73
  flowyml/storage/materializers/keras.py,sha256=PnNVWO_VoUJRJfWyugBYdNMeuzQQT94-AAdHEvEigmc,6682
74
74
  flowyml/storage/materializers/numpy.py,sha256=lsBvouvoXuNSvqyFaHEAQldMP9G_82D1gKSJEe4EfQE,2815
@@ -76,7 +76,9 @@ flowyml/storage/materializers/pandas.py,sha256=MTqvWNbDSvmVkXlz5cAisC790c-xiu7rg
76
76
  flowyml/storage/materializers/pytorch.py,sha256=MeP14hP-2Kb2ZTVKxwQCJvJtOddXzfGxm4BKhrmUUac,4382
77
77
  flowyml/storage/materializers/sklearn.py,sha256=JuszJrCQJW2CXJsO6b0ZMZyoKknM5XPMUoQDQ75X990,3672
78
78
  flowyml/storage/materializers/tensorflow.py,sha256=YvKFVCTl75tnUysdhj6TzqZEzlpNMB-8XDnXh6-ewmI,5087
79
- flowyml/storage/metadata.py,sha256=FeL16ANxt_3zUMJ3LXwPX641Ertef3RoMt1KMPt8-gU,35240
79
+ flowyml/storage/metadata.py,sha256=MfWdKCHOu3gShOMinhmSvOXzNS5fF89-GRqQlTo2mJw,1357
80
+ flowyml/storage/remote.py,sha256=0Iyi6BqESe52mONVvGZ9EidqoooSnEl-QyOYfO7GOqU,22209
81
+ flowyml/storage/sql.py,sha256=CJ5fZMZh65swZpdpd5Q626CYA3c4fmIHQdg6j9uSl8c,34532
80
82
  flowyml/tracking/__init__.py,sha256=H-ESGjwPN9fq1R4ptj0U1iVM5nXIYrMk9gPMRmY6Xh8,46
81
83
  flowyml/tracking/experiment.py,sha256=Q9VDoCg7yRhgO2O6TLr4L2Jbyr3J_2JecR6lkqgJRE8,6004
82
84
  flowyml/tracking/leaderboard.py,sha256=s6gXxvws4hIZLiLO5V_nO7iokpCq4czZGIO3MhW23do,5404
@@ -85,21 +87,23 @@ flowyml/ui/__init__.py,sha256=heh1-LhRO3qCEzPZZL4ezt4eT219y6OQbsyq7qB2mVs,269
85
87
  flowyml/ui/backend/Dockerfile,sha256=hO2GU_PvbzbcIhxJ2TWI8UZwBzK_MHrCyKRk_CzqAUE,700
86
88
  flowyml/ui/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
89
  flowyml/ui/backend/auth.py,sha256=ivM0tKR1KUm9AZg1iht9rKpndrtjf4ojLLaTw_-HHyE,4616
88
- flowyml/ui/backend/main.py,sha256=1jF3sDxp0mjmD0a10zaW1XnYBWO3c1et6KgASHwn080,7854
90
+ flowyml/ui/backend/dependencies.py,sha256=ENGqEKEJuQvaZhRS6Ta47v-Q59TD9jsCT-a9p-OJGgE,772
91
+ flowyml/ui/backend/main.py,sha256=Hw_gnLNqDe7uqKtZ3KNI1QtXFNZR08M9zc5myjAIb2U,5251
89
92
  flowyml/ui/backend/routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
- flowyml/ui/backend/routers/assets.py,sha256=4j0aq73dUSX2uGXNw172SDyc1Hm0v4JHMlwHB-V8Clc,13835
91
- flowyml/ui/backend/routers/client.py,sha256=oVGPJiX0s8P6UeohDQFxY_X_LbTnKI0bf_hOGRq0BCg,1367
93
+ flowyml/ui/backend/routers/assets.py,sha256=l_61CC7K0oLLqwt49mEbCarsDZsuNCQil1y9aUHTzC8,18037
94
+ flowyml/ui/backend/routers/client.py,sha256=66TsMk8dCczgyLVhQryNQ3ahE2xtksPXJOMB3HlR-G4,1342
92
95
  flowyml/ui/backend/routers/execution.py,sha256=65TQIxCDtMnsBqNRzcm7f0NeQoKTF6k-axmT7r9wIRI,5909
93
- flowyml/ui/backend/routers/experiments.py,sha256=d5_wYhVnIAbyLE5mg1pe3MmbtVZYHPj41bJwbfn55uc,2856
96
+ flowyml/ui/backend/routers/experiments.py,sha256=e-Q3PPuCULobYKb45PbS5SOY-CCX3GYjiDUimJ-NL-c,4277
94
97
  flowyml/ui/backend/routers/leaderboard.py,sha256=T5mhZwjBusF6JGjaRO5tSmsDTles1Dkn99ki-pRzhEU,4111
95
- flowyml/ui/backend/routers/metrics.py,sha256=4kA1sqmfjozzejzXUKDtHA3BfoC1i9a8C0PcHKQOTCA,7107
98
+ flowyml/ui/backend/routers/metrics.py,sha256=NbLQKUqBMywl1cZrdopW29Y1J9oSnT4OleBTczZftTo,5643
96
99
  flowyml/ui/backend/routers/notifications.py,sha256=IQhRlaBM8kdqxbe_U_Kw9f1qXGDBOjYk8GCR5MAIWHA,2068
97
- flowyml/ui/backend/routers/pipelines.py,sha256=xvsRMReXDIzbY2remRfO1u7ohe90rEOe2WFn4M2uE90,5950
100
+ flowyml/ui/backend/routers/pipelines.py,sha256=wQjNX4L8oNTpagws8_lvgiMo-P_aMnqO89JrU65oNZo,6282
98
101
  flowyml/ui/backend/routers/plugins.py,sha256=OT2rAstPMRDlU5wdz_Jy3v5C8IjXTPMz7lDC0ZOWUbg,5894
99
102
  flowyml/ui/backend/routers/projects.py,sha256=1EMbh8ts_Dh_mgr1xMxvsj9nQuNtu409tgnFPSy7ojg,3446
100
- flowyml/ui/backend/routers/runs.py,sha256=vxMwGCP8yuwgMGFPt5td8IN20rbWg5EEklzjo0qwZBE,6579
101
- flowyml/ui/backend/routers/schedules.py,sha256=hrtpfp4NXQLGtV1jxiEuB61LDC1Y3MgikU_QCu5lWAg,8078
102
- flowyml/ui/backend/routers/traces.py,sha256=kFY5L_Z3kw9qrIfXp0_rHMG8DPxlqB5uUQTGjdJRhbA,2272
103
+ flowyml/ui/backend/routers/runs.py,sha256=6I6XhytehFTRbkSNt4equArAOvqVfwO2qUGDVRoWk1A,8756
104
+ flowyml/ui/backend/routers/schedules.py,sha256=U0NFNt1sXWsGxWRjh8FzblM15QMXjfU-Q1CQQ5JZjmE,7516
105
+ flowyml/ui/backend/routers/stats.py,sha256=AF2NsM6TQmG2f-G2w6jMqjSqCNbkxoQmfu31KK4BLgo,365
106
+ flowyml/ui/backend/routers/traces.py,sha256=xWxEuOe6TKDrZwWkZG5D3LuHEj_pmGnhJZ-563R2H_E,2012
103
107
  flowyml/ui/frontend/Dockerfile,sha256=BJWOdU5mnk4e2H6rARiGOO6TF-YCRxN7mOIWPv0EIAM,314
104
108
  flowyml/ui/frontend/README.md,sha256=M5il2PEdNVCSm1zo1rZAXqQ0nTj5frCNXmi5-d1ZKIM,7099
105
109
  flowyml/ui/frontend/dist/assets/index-DcYwrn2j.css,sha256=Ihl8TsPEyvhaBkwLySefUWbzKjdM45h99Jr6b1embmQ,72382
@@ -189,8 +193,8 @@ flowyml/utils/logging.py,sha256=PBJDFlGdp1mePS6A3g08dnGAB-v8jTlcNxEsYs9WSBo,1371
189
193
  flowyml/utils/performance.py,sha256=-ne9v9ddEltiKRPk-AerM1R3Gwwd_oCRKtNyHARWd4k,8655
190
194
  flowyml/utils/stack_config.py,sha256=STX1niArJzvu0YsqUQmrNJ0WTeMVW_setYNH36BlbVI,10826
191
195
  flowyml/utils/validation.py,sha256=mClumVro0bl_XXxT1zWPlRI6M_iZa3z2SZ0QUdmTOqs,10199
192
- flowyml-1.3.0.dist-info/METADATA,sha256=k-HjDHgGiSM3OaGLvJhH_8HEbeSGcJ7v3W7qfBBWrGU,15376
193
- flowyml-1.3.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
194
- flowyml-1.3.0.dist-info/entry_points.txt,sha256=yuF-dOC4rbyJ2Aqi4CMRBxFhqIRoKO6Mhh6jfiQEVjI,48
195
- flowyml-1.3.0.dist-info/licenses/LICENSE,sha256=DRBRWOEjKZQBvy1WZwxyvp2NmnC1whW9Ef7v0Oo-p_g,626
196
- flowyml-1.3.0.dist-info/RECORD,,
196
+ flowyml-1.4.0.dist-info/METADATA,sha256=pq8jIVwG2gEzg6UuoCh0D5HVbfxsJLL-xu52Zn_wfNg,15453
197
+ flowyml-1.4.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
198
+ flowyml-1.4.0.dist-info/entry_points.txt,sha256=yuF-dOC4rbyJ2Aqi4CMRBxFhqIRoKO6Mhh6jfiQEVjI,48
199
+ flowyml-1.4.0.dist-info/licenses/LICENSE,sha256=DRBRWOEjKZQBvy1WZwxyvp2NmnC1whW9Ef7v0Oo-p_g,626
200
+ flowyml-1.4.0.dist-info/RECORD,,