kumoai 2.13.0.dev202512040252__cp310-cp310-win_amd64.whl → 2.13.0.dev202512041731__cp310-cp310-win_amd64.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.
kumoai/__init__.py CHANGED
@@ -280,7 +280,19 @@ __all__ = [
280
280
  ]
281
281
 
282
282
 
283
+ def in_snowflake_notebook() -> bool:
284
+ try:
285
+ from snowflake.snowpark.context import get_active_session
286
+ import streamlit # noqa: F401
287
+ get_active_session()
288
+ return True
289
+ except Exception:
290
+ return False
291
+
292
+
283
293
  def in_notebook() -> bool:
294
+ if in_snowflake_notebook():
295
+ return True
284
296
  try:
285
297
  from IPython import get_ipython
286
298
  shell = get_ipython()
kumoai/_version.py CHANGED
@@ -1 +1 @@
1
- __version__ = '2.13.0.dev202512040252'
1
+ __version__ = '2.13.0.dev202512041731'
@@ -4,7 +4,7 @@ from typing import List, Optional, Sequence
4
4
  import pandas as pd
5
5
  from kumoapi.typing import Dtype
6
6
 
7
- from kumoai.experimental.rfm.backend.sqlite import Connection
7
+ from kumoai.experimental.rfm.backend.snow import Connection
8
8
  from kumoai.experimental.rfm.base import SourceColumn, SourceForeignKey, Table
9
9
 
10
10
 
@@ -14,6 +14,8 @@ class SnowTable(Table):
14
14
  Args:
15
15
  connection: The connection to a :class:`snowflake` database.
16
16
  name: The name of this table.
17
+ database: The database.
18
+ schema: The schema.
17
19
  columns: The selected columns of this table.
18
20
  primary_key: The name of the primary key of this table, if it exists.
19
21
  time_column: The name of the time column of this table, if it exists.
@@ -1,10 +1,12 @@
1
1
  from .source import SourceColumn, SourceForeignKey
2
2
  from .column import Column
3
3
  from .table import Table
4
+ from .sampler import Sampler
4
5
 
5
6
  __all__ = [
6
7
  'SourceColumn',
7
8
  'SourceForeignKey',
8
9
  'Column',
9
10
  'Table',
11
+ 'Sampler',
10
12
  ]
@@ -0,0 +1,134 @@
1
+ import copy
2
+ from abc import ABC, abstractmethod
3
+ from dataclasses import dataclass
4
+ from typing import TYPE_CHECKING
5
+
6
+ import numpy as np
7
+ import pandas as pd
8
+ from kumoapi.rfm.context import Subgraph
9
+ from kumoapi.typing import Stype
10
+
11
+ if TYPE_CHECKING:
12
+ from kumoai.experimental.rfm import Graph
13
+
14
+
15
+ @dataclass
16
+ class EdgeSpec:
17
+ num_neighbors: int | None = None
18
+ time_offsets: tuple[
19
+ pd.DateOffset | None,
20
+ pd.DateOffset,
21
+ ] | None = None
22
+
23
+ def __post_init__(self) -> None:
24
+ if (self.num_neighbors is None) == (self.time_offsets is None):
25
+ raise ValueError("Only one of 'num_neighbors' and 'time_offsets' "
26
+ "must be provided")
27
+
28
+
29
+ @dataclass
30
+ class SamplerOutput:
31
+ df_dict: dict[str, pd.DataFrame]
32
+ batch_dict: dict[str, pd.DataFrame]
33
+ num_sampled_nodes_dict: dict[str, list[int]]
34
+ edge_index_dict: dict[tuple[str, str, str], np.ndarray] | None = None
35
+ num_sampled_edges_dict: dict[tuple[str, str, str], list[int]] | None = None
36
+
37
+
38
+ class Sampler(ABC):
39
+ def __init__(self, graph: 'Graph') -> None:
40
+ self._edge_types: list[tuple[str, str, str]] = []
41
+ for edge in graph.edges:
42
+ edge_type = (edge.src_table, edge.fkey, edge.dst_table)
43
+ self._edge_types.append(edge_type)
44
+ self._edge_types.append(Subgraph.rev_edge_type(edge_type))
45
+
46
+ self._primary_key_dict: dict[str, str] = {
47
+ table.name: table._primary_key
48
+ for table in graph.tables.values()
49
+ if table._primary_key is not None
50
+ }
51
+
52
+ self._time_column_dict: dict[str, str] = {
53
+ table.name: table._time_column
54
+ for table in graph.tables.values()
55
+ if table._time_column is not None
56
+ }
57
+
58
+ foreign_keys = {(edge.src_table, edge.fkey) for edge in graph.edges}
59
+ self._stype_dict: dict[str, dict[str, Stype]] = {}
60
+ for table in graph.tables.values():
61
+ self._stype_dict[table.name] = {}
62
+ for column in table.columns:
63
+ if column == table.primary_key:
64
+ continue
65
+ if (table.name, column.name) in foreign_keys:
66
+ continue
67
+ self._stype_dict[table.name][column.name] = column.stype
68
+
69
+ @property
70
+ def edge_types(self) -> list[tuple[str, str, str]]:
71
+ return self._edge_types
72
+
73
+ @property
74
+ def primary_key_dict(self) -> dict[str, str]:
75
+ return self._primary_key_dict
76
+
77
+ @property
78
+ def time_column_dict(self) -> dict[str, str]:
79
+ return self._time_column_dict
80
+
81
+ @property
82
+ def stype_dict(self) -> dict[str, dict[str, Stype]]:
83
+ return self._stype_dict
84
+
85
+ def sample_subgraph(
86
+ self,
87
+ entity_table_names: tuple[str, ...],
88
+ entity_pkey: pd.Series,
89
+ anchor_time: pd.Series,
90
+ num_neighbors: list[int],
91
+ exclude_cols_dict: dict[str, list[str]] | None = None,
92
+ ) -> Subgraph:
93
+
94
+ edge_spec: dict[tuple[str, str, str], list[EdgeSpec]] = {
95
+ edge_type: [EdgeSpec(value) for value in num_neighbors]
96
+ for edge_type in self.edge_types
97
+ }
98
+
99
+ stype_dict: dict[str, dict[str, Stype]] = self._stype_dict
100
+ if exclude_cols_dict is not None:
101
+ stype_dict = copy.deepcopy(stype_dict)
102
+ for table_name, exclude_cols in exclude_cols_dict.items():
103
+ for column_name in exclude_cols:
104
+ del stype_dict[table_name][column_name]
105
+
106
+ column_spec: dict[str, list[str]] = {
107
+ table_name: list(stypes.keys())
108
+ for table_name, stypes in stype_dict.items()
109
+ }
110
+ for table_name in entity_table_names:
111
+ column_spec[table_name].append(self.primary_key_dict[table_name])
112
+
113
+ return self._sample(
114
+ entity_table_name=entity_table_names[0],
115
+ entity_pkey=entity_pkey,
116
+ anchor_time=anchor_time,
117
+ column_spec=column_spec,
118
+ edge_spec=edge_spec,
119
+ return_edges=True,
120
+ )
121
+
122
+ # Abstract Methods ########################################################
123
+
124
+ @abstractmethod
125
+ def _sample(
126
+ self,
127
+ entity_table_name: str,
128
+ entity_pkey: pd.Series,
129
+ anchor_time: pd.Series,
130
+ column_spec: dict[str, list[str]],
131
+ edge_spec: dict[tuple[str, str, str], list[EdgeSpec]],
132
+ return_edges: bool = False,
133
+ ) -> SamplerOutput:
134
+ pass
@@ -10,7 +10,7 @@ from kumoapi.table import TableDefinition
10
10
  from kumoapi.typing import Stype
11
11
  from typing_extensions import Self
12
12
 
13
- from kumoai import in_notebook
13
+ from kumoai import in_notebook, in_snowflake_notebook
14
14
  from kumoai.experimental.rfm.base import Column, SourceColumn, SourceForeignKey
15
15
  from kumoai.experimental.rfm.infer import (
16
16
  contains_categorical,
@@ -384,7 +384,12 @@ class Table(ABC):
384
384
  if self._num_rows is not None:
385
385
  num_rows_repr = ' ({self._num_rows:,} rows)'
386
386
 
387
- if in_notebook():
387
+ if in_snowflake_notebook():
388
+ import streamlit as st
389
+ md_repr = f"### 🏷️ Metadata of Table `{self.name}`{num_rows_repr}"
390
+ st.markdown(md_repr)
391
+ st.dataframe(self.metadata, hide_index=True)
392
+ elif in_notebook():
388
393
  from IPython.display import Markdown, display
389
394
  md_repr = f"### 🏷️ Metadata of Table `{self.name}`{num_rows_repr}"
390
395
  display(Markdown(md_repr))
@@ -496,7 +501,7 @@ class Table(ABC):
496
501
  f' end_time_column={self._end_time_column},\n'
497
502
  f')')
498
503
 
499
- # Abstract method #########################################################
504
+ # Abstract Methods ########################################################
500
505
 
501
506
  @cached_property
502
507
  def _source_column_dict(self) -> Dict[str, SourceColumn]:
@@ -3,7 +3,6 @@ import io
3
3
  import warnings
4
4
  from collections import defaultdict
5
5
  from dataclasses import dataclass, field
6
- from importlib.util import find_spec
7
6
  from pathlib import Path
8
7
  from typing import TYPE_CHECKING, Any, Dict, List, Optional, Sequence, Union
9
8
 
@@ -13,7 +12,7 @@ from kumoapi.table import TableDefinition
13
12
  from kumoapi.typing import Stype
14
13
  from typing_extensions import Self
15
14
 
16
- from kumoai import in_notebook
15
+ from kumoai import in_notebook, in_snowflake_notebook
17
16
  from kumoai.experimental.rfm import Table
18
17
  from kumoai.graph import Edge
19
18
  from kumoai.mixin import CastMixin
@@ -251,6 +250,8 @@ class Graph:
251
250
  def from_snowflake(
252
251
  cls,
253
252
  connection: Union['SnowflakeConnection', Dict[str, Any], None] = None,
253
+ database: Optional[str] = None,
254
+ schema: Optional[str] = None,
254
255
  table_names: Optional[Sequence[str]] = None,
255
256
  edges: Optional[Sequence[Edge]] = None,
256
257
  infer_metadata: bool = True,
@@ -267,7 +268,7 @@ class Graph:
267
268
  >>> import kumoai.experimental.rfm as rfm
268
269
 
269
270
  >>> # Create a graph directly in a Snowflake notebook:
270
- >>> graph = rfm.Graph.from_snowflake()
271
+ >>> graph = rfm.Graph.from_snowflake(schema='my_schema')
271
272
 
272
273
  Args:
273
274
  connection: An open connection from
@@ -276,6 +277,8 @@ class Graph:
276
277
  connection. If ``None``, will re-use an active session in case
277
278
  it exists, or create a new connection from credentials stored
278
279
  in environment variables.
280
+ database: The database.
281
+ schema: The schema.
279
282
  table_names: Set of table names to include. If ``None``, will add
280
283
  all tables present in the database.
281
284
  edges: An optional list of :class:`~kumoai.graph.Edge` objects to
@@ -297,17 +300,27 @@ class Graph:
297
300
 
298
301
  if table_names is None:
299
302
  with connection.cursor() as cursor:
300
- cursor.execute("SELECT CURRENT_DATABASE(), CURRENT_SCHEMA()")
301
- database, schema = cursor.fetchone()
302
- query = f"""
303
+ if database is None and schema is None:
304
+ cursor.execute("SELECT CURRENT_DATABASE(), "
305
+ "CURRENT_SCHEMA()")
306
+ result = cursor.fetchone()
307
+ database = database or result[0]
308
+ schema = schema or result[1]
309
+ cursor.execute(f"""
303
310
  SELECT TABLE_NAME
304
311
  FROM {database}.INFORMATION_SCHEMA.TABLES
305
312
  WHERE TABLE_SCHEMA = '{schema}'
306
- """
307
- cursor.execute(query)
313
+ """)
308
314
  table_names = [row[0] for row in cursor.fetchall()]
309
315
 
310
- tables = [SnowTable(connection, name) for name in table_names]
316
+ tables = [
317
+ SnowTable(
318
+ connection,
319
+ name=table_name,
320
+ database=database,
321
+ schema=schema,
322
+ ) for table_name in table_names
323
+ ]
311
324
 
312
325
  graph = cls(tables, edges=edges or [])
313
326
 
@@ -488,9 +501,13 @@ class Graph:
488
501
 
489
502
  def print_metadata(self) -> None:
490
503
  r"""Prints the :meth:`~Graph.metadata` of the graph."""
491
- if in_notebook():
504
+ if in_snowflake_notebook():
505
+ import streamlit as st
506
+ st.markdown("### 🗂️ Graph Metadata")
507
+ st.dataframe(self.metadata, hide_index=True)
508
+ elif in_notebook():
492
509
  from IPython.display import Markdown, display
493
- display(Markdown('### 🗂️ Graph Metadata'))
510
+ display(Markdown("### 🗂️ Graph Metadata"))
494
511
  df = self.metadata
495
512
  try:
496
513
  if hasattr(df.style, 'hide'):
@@ -534,26 +551,36 @@ class Graph:
534
551
  edge.src_table, edge.fkey) for edge in self.edges]
535
552
  edges = sorted(edges)
536
553
 
537
- if in_notebook():
554
+ if in_snowflake_notebook():
555
+ import streamlit as st
556
+ st.markdown("### 🕸️ Graph Links (FK ↔️ PK)")
557
+ if len(edges) > 0:
558
+ st.markdown('\n'.join([
559
+ f"- `{edge[2]}.{edge[3]}` ↔️ `{edge[0]}.{edge[1]}`"
560
+ for edge in edges
561
+ ]))
562
+ else:
563
+ st.markdown("*No links registered*")
564
+ elif in_notebook():
538
565
  from IPython.display import Markdown, display
539
- display(Markdown('### 🕸️ Graph Links (FK ↔️ PK)'))
566
+ display(Markdown("### 🕸️ Graph Links (FK ↔️ PK)"))
540
567
  if len(edges) > 0:
541
568
  display(
542
569
  Markdown('\n'.join([
543
- f'- `{edge[2]}.{edge[3]}` ↔️ `{edge[0]}.{edge[1]}`'
570
+ f"- `{edge[2]}.{edge[3]}` ↔️ `{edge[0]}.{edge[1]}`"
544
571
  for edge in edges
545
572
  ])))
546
573
  else:
547
- display(Markdown('*No links registered*'))
574
+ display(Markdown("*No links registered*"))
548
575
  else:
549
576
  print("🕸️ Graph Links (FK ↔️ PK):")
550
577
  if len(edges) > 0:
551
578
  print('\n'.join([
552
- f'• {edge[2]}.{edge[3]} ↔️ {edge[0]}.{edge[1]}'
579
+ f"• {edge[2]}.{edge[3]} ↔️ {edge[0]}.{edge[1]}"
553
580
  for edge in edges
554
581
  ]))
555
582
  else:
556
- print('No links registered')
583
+ print("No links registered")
557
584
 
558
585
  def link(
559
586
  self,
@@ -870,19 +897,19 @@ class Graph:
870
897
 
871
898
  return True
872
899
 
873
- # Check basic dependency:
874
- if not find_spec('graphviz'):
875
- raise ModuleNotFoundError("The 'graphviz' package is required for "
876
- "visualization")
877
- elif not has_graphviz_executables():
900
+ try: # Check basic dependency:
901
+ import graphviz
902
+ except ImportError as e:
903
+ raise ImportError("The 'graphviz' package is required for "
904
+ "visualization") from e
905
+
906
+ if not in_snowflake_notebook() and not has_graphviz_executables():
878
907
  raise RuntimeError("Could not visualize graph as 'graphviz' "
879
908
  "executables are not installed. These "
880
909
  "dependencies are required in addition to the "
881
910
  "'graphviz' Python package. Please install "
882
911
  "them as described at "
883
912
  "https://graphviz.org/download/.")
884
- else:
885
- import graphviz
886
913
 
887
914
  format: Optional[str] = None
888
915
  if isinstance(path, str):
@@ -966,6 +993,9 @@ class Graph:
966
993
  graph.render(path, cleanup=True)
967
994
  elif isinstance(path, io.BytesIO):
968
995
  path.write(graph.pipe())
996
+ elif in_snowflake_notebook():
997
+ import streamlit as st
998
+ st.graphviz_chart(graph)
969
999
  elif in_notebook():
970
1000
  from IPython.display import display
971
1001
  display(graph)
Binary file
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kumoai
3
- Version: 2.13.0.dev202512040252
3
+ Version: 2.13.0.dev202512041731
4
4
  Summary: AI on the Modern Data Stack
5
5
  Author-email: "Kumo.AI" <hello@kumo.ai>
6
6
  License-Expression: MIT
@@ -1,13 +1,13 @@
1
- kumoai/__init__.py,sha256=qu-qohU2cQlManX1aZIlzA3ivKl52m-cSQBPSW8urUU,10837
1
+ kumoai/__init__.py,sha256=aDhb7KGetDnOz54u1Fd45zfM2N8oAha6XT2CvJqOvgc,11146
2
2
  kumoai/_logging.py,sha256=qL4JbMQwKXri2f-SEJoFB8TY5ALG12S-nobGTNWxW-A,915
3
3
  kumoai/_singleton.py,sha256=i2BHWKpccNh5SJGDyU0IXsnYzJAYr8Xb0wz4c6LRbpo,861
4
- kumoai/_version.py,sha256=16u1rVm-N2IEE7QbyS9U5nn_hjp7P_wxBIQzzAKSnDA,39
4
+ kumoai/_version.py,sha256=nAPj2gzW1byjXavAIRphLnIsySItnJOq_dJijgrT4kk,39
5
5
  kumoai/databricks.py,sha256=ahwJz6DWLXMkndT0XwEDBxF-hoqhidFR8wBUQ4TLZ68,490
6
6
  kumoai/exceptions.py,sha256=7TMs0SC8xrU009_Pgd4QXtSF9lxJq8MtRbeX9pcQUy4,859
7
7
  kumoai/formatting.py,sha256=o3uCnLwXPhe1KI5WV9sBgRrcU7ed4rgu_pf89GL9Nc0,983
8
8
  kumoai/futures.py,sha256=J8rtZMEYFzdn5xF_x-LAiKJz3KGL6PT02f6rq_2bOJk,3836
9
9
  kumoai/jobs.py,sha256=dCi7BAdfm2tCnonYlGU4WJokJWbh3RzFfaOX2EYCIHU,2576
10
- kumoai/kumolib.cp310-win_amd64.pyd,sha256=3iE0thfrVDx0Yhh0I0li-BwZcIpQfRpaYxYMsSpYofc,194048
10
+ kumoai/kumolib.cp310-win_amd64.pyd,sha256=4fWOeR-nrmdLzThTLrD0wexcVo5F4KECAdbjPSHPydM,194048
11
11
  kumoai/mixin.py,sha256=IaiB8SAI0VqOoMVzzIaUlqMt53-QPUK6OB0HikG-V9E,840
12
12
  kumoai/spcs.py,sha256=KWfENrwSLruprlD-QPh63uU0N6npiNrwkeKfBk3EUyQ,4260
13
13
  kumoai/artifact_export/__init__.py,sha256=UXAQI5q92ChBzWAk8o3J6pElzYHudAzFZssQXd4o7i8,247
@@ -55,7 +55,7 @@ kumoai/encoder/__init__.py,sha256=8FeP6mUyCeXxr1b8kUIi5dxe5vEXQRft9tPoaV1CBqg,18
55
55
  kumoai/experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
56
  kumoai/experimental/rfm/__init__.py,sha256=EFZz6IvvskmeO85Vig6p1m_6jdimS_BkeREOndHuRsc,6247
57
57
  kumoai/experimental/rfm/authenticate.py,sha256=G89_4TMeUpr5fG_0VTzMF5sdNhaciitA1oc2loTlTmo,19321
58
- kumoai/experimental/rfm/graph.py,sha256=kSWve-Fn_9qERFjEpCDO5zDnngtd9T4MOhR_o46PI7s,39602
58
+ kumoai/experimental/rfm/graph.py,sha256=SL3-WinoLnkZC6VVjebYGLuQJJyEVFJdCm6h3FNE0e4,40816
59
59
  kumoai/experimental/rfm/local_graph_sampler.py,sha256=dQ3JnuozTNeZyUFRu2h8OTMNmV1RAoaCA0gvkpgOstg,8110
60
60
  kumoai/experimental/rfm/local_graph_store.py,sha256=6jY1ciVIlnBBhZCxWwBTl7SKX1fxRIDLszwrftD0Cdk,13485
61
61
  kumoai/experimental/rfm/local_pquery_driver.py,sha256=Yd_yHIrvuDj16IC1pvsqiQvZS41vvOOCRMiuDGtN6Fk,26851
@@ -65,13 +65,14 @@ kumoai/experimental/rfm/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
65
65
  kumoai/experimental/rfm/backend/local/__init__.py,sha256=usMh0fuDxKK-aOVT1sU30BQWFS0eSkfUrhUVILisQQI,934
66
66
  kumoai/experimental/rfm/backend/local/table.py,sha256=1PqNOROzlnK3SaZHNcU2hyzeifs0N4wssQAS3-Z0Myc,3674
67
67
  kumoai/experimental/rfm/backend/snow/__init__.py,sha256=viMeR9VWpB1kjRdSWCTNFMdM7a8Mj_Dtck1twJW8dV8,962
68
- kumoai/experimental/rfm/backend/snow/table.py,sha256=HVrPtCVvfsisFmq9jMovowsE5Wl5oti3O-kru7ruXlc,4312
68
+ kumoai/experimental/rfm/backend/snow/table.py,sha256=Rf4hUPOUtsjpaIc9vBKWPZ3yz20OOg6DZqCGeih4KC8,4372
69
69
  kumoai/experimental/rfm/backend/sqlite/__init__.py,sha256=xw5NNLrWSvUvRkD49X_9hZYjas5EuP1XDANPy0EEjOg,874
70
70
  kumoai/experimental/rfm/backend/sqlite/table.py,sha256=mBiZC21gQwfR4demFrP37GmawMHfIm-G82mLQeBqIZo,3901
71
- kumoai/experimental/rfm/base/__init__.py,sha256=oXPkeBemtuDxRUK61-0sOT84GZB_oQ6HvaZNU1KFNaw,199
71
+ kumoai/experimental/rfm/base/__init__.py,sha256=U4GMz-sHnagddIQEqhcfpY9JRhmOc0_Rs9c5_Zc9rqU,245
72
72
  kumoai/experimental/rfm/base/column.py,sha256=OE-PRQ8HO4uTq0e3_3eHJFfhp5nzw79zd-43g3iMh4g,2385
73
+ kumoai/experimental/rfm/base/sampler.py,sha256=E0CC5Rfyjd8SjyjK1bCKKYDesPGYYbIiY96yW6xOXww,4563
73
74
  kumoai/experimental/rfm/base/source.py,sha256=H5yN9xAwK3i_69EdqOV_x58muPGKQiI8ev5BhHQDZEo,290
74
- kumoai/experimental/rfm/base/table.py,sha256=glyAg4LCQdddM3lIRClJSA7qMyfoHUVAGBf1rEs6B8Y,20113
75
+ kumoai/experimental/rfm/base/table.py,sha256=6GlWUz3tAu2g1QqTA5idWGmfo2KEJoNApDFZRn8e0pg,20388
75
76
  kumoai/experimental/rfm/infer/__init__.py,sha256=qKg8or-SpgTApD6ePw1PJ4aUZPrOLTHLRCmBIJ92hrk,486
76
77
  kumoai/experimental/rfm/infer/categorical.py,sha256=bqmfrE5ZCBTcb35lA4SyAkCu3MgttAn29VBJYMBNhVg,893
77
78
  kumoai/experimental/rfm/infer/dtype.py,sha256=Hf_drluYNuN59lTSe-8GuXalg20Pv93kCktB6Hb9f74,2686
@@ -104,8 +105,8 @@ kumoai/utils/__init__.py,sha256=wAKgmwtMIGuiauW9D_GGKH95K-24Kgwmld27mm4nsro,278
104
105
  kumoai/utils/datasets.py,sha256=UyAII-oAn7x3ombuvpbSQ41aVF9SYKBjQthTD-vcT2A,3011
105
106
  kumoai/utils/forecasting.py,sha256=ZgKeUCbWLOot0giAkoigwU5du8LkrwAicFOi5hVn6wg,7624
106
107
  kumoai/utils/progress_logger.py,sha256=MZsWgHd4UZQKCXiJZgQeW-Emi_BmzlCKPLPXOL_HqBo,5239
107
- kumoai-2.13.0.dev202512040252.dist-info/licenses/LICENSE,sha256=ZUilBDp--4vbhsEr6f_Upw9rnIx09zQ3K9fXQ0rfd6w,1111
108
- kumoai-2.13.0.dev202512040252.dist-info/METADATA,sha256=T-O--qEm_2QPzB-dDkwR6Ei7r79H7v6qQBbR1e1J8gg,2580
109
- kumoai-2.13.0.dev202512040252.dist-info/WHEEL,sha256=KUuBC6lxAbHCKilKua8R9W_TM71_-9Sg5uEP3uDWcoU,101
110
- kumoai-2.13.0.dev202512040252.dist-info/top_level.txt,sha256=YjU6UcmomoDx30vEXLsOU784ED7VztQOsFApk1SFwvs,7
111
- kumoai-2.13.0.dev202512040252.dist-info/RECORD,,
108
+ kumoai-2.13.0.dev202512041731.dist-info/licenses/LICENSE,sha256=ZUilBDp--4vbhsEr6f_Upw9rnIx09zQ3K9fXQ0rfd6w,1111
109
+ kumoai-2.13.0.dev202512041731.dist-info/METADATA,sha256=H4PwggDYmXKPTArJoXK3Lxg4__QTOIUb0nZRR2heOpM,2580
110
+ kumoai-2.13.0.dev202512041731.dist-info/WHEEL,sha256=KUuBC6lxAbHCKilKua8R9W_TM71_-9Sg5uEP3uDWcoU,101
111
+ kumoai-2.13.0.dev202512041731.dist-info/top_level.txt,sha256=YjU6UcmomoDx30vEXLsOU784ED7VztQOsFApk1SFwvs,7
112
+ kumoai-2.13.0.dev202512041731.dist-info/RECORD,,