kumoai 2.13.0.dev202511161731__cp312-cp312-macosx_11_0_arm64.whl → 2.13.0.dev202512011731__cp312-cp312-macosx_11_0_arm64.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.
@@ -6,7 +6,7 @@ import pandas as pd
6
6
  from kumoapi.rfm.context import Subgraph
7
7
  from kumoapi.typing import Stype
8
8
 
9
- from kumoai.experimental.rfm import LocalGraph
9
+ from kumoai.experimental.rfm import Graph, LocalTable
10
10
  from kumoai.experimental.rfm.utils import normalize_text
11
11
  from kumoai.utils import InteractiveProgressLogger, ProgressLogger
12
12
 
@@ -20,7 +20,7 @@ except ImportError:
20
20
  class LocalGraphStore:
21
21
  def __init__(
22
22
  self,
23
- graph: LocalGraph,
23
+ graph: Graph,
24
24
  preprocess: bool = False,
25
25
  verbose: Union[bool, ProgressLogger] = True,
26
26
  ) -> None:
@@ -105,7 +105,7 @@ class LocalGraphStore:
105
105
 
106
106
  def sanitize(
107
107
  self,
108
- graph: LocalGraph,
108
+ graph: Graph,
109
109
  preprocess: bool = False,
110
110
  ) -> Tuple[Dict[str, pd.DataFrame], Dict[str, np.ndarray]]:
111
111
  r"""Sanitizes raw data according to table schema definition:
@@ -120,10 +120,11 @@ class LocalGraphStore:
120
120
  data for faster model processing. In particular, it:
121
121
  * tokenizes any text column that is not a foreign key
122
122
  """
123
- df_dict: Dict[str, pd.DataFrame] = {
124
- table_name: table._data.copy(deep=False).reset_index(drop=True)
125
- for table_name, table in graph.tables.items()
126
- }
123
+ df_dict: Dict[str, pd.DataFrame] = {}
124
+ for table_name, table in graph.tables.items():
125
+ assert isinstance(table, LocalTable)
126
+ df = table._data
127
+ df_dict[table_name] = df.copy(deep=False).reset_index(drop=True)
127
128
 
128
129
  foreign_keys = {(edge.src_table, edge.fkey) for edge in graph.edges}
129
130
 
@@ -165,7 +166,7 @@ class LocalGraphStore:
165
166
 
166
167
  return df_dict, mask_dict
167
168
 
168
- def get_stype_dict(self, graph: LocalGraph) -> Dict[str, Dict[str, Stype]]:
169
+ def get_stype_dict(self, graph: Graph) -> Dict[str, Dict[str, Stype]]:
169
170
  stype_dict: Dict[str, Dict[str, Stype]] = {}
170
171
  foreign_keys = {(edge.src_table, edge.fkey) for edge in graph.edges}
171
172
  for table in graph.tables.values():
@@ -180,7 +181,7 @@ class LocalGraphStore:
180
181
 
181
182
  def get_pkey_data(
182
183
  self,
183
- graph: LocalGraph,
184
+ graph: Graph,
184
185
  ) -> Tuple[
185
186
  Dict[str, str],
186
187
  Dict[str, pd.DataFrame],
@@ -218,7 +219,7 @@ class LocalGraphStore:
218
219
 
219
220
  def get_time_data(
220
221
  self,
221
- graph: LocalGraph,
222
+ graph: Graph,
222
223
  ) -> Tuple[
223
224
  Dict[str, str],
224
225
  Dict[str, str],
@@ -259,7 +260,7 @@ class LocalGraphStore:
259
260
 
260
261
  def get_csc(
261
262
  self,
262
- graph: LocalGraph,
263
+ graph: Graph,
263
264
  ) -> Tuple[
264
265
  Dict[Tuple[str, str, str], np.ndarray],
265
266
  Dict[Tuple[str, str, str], np.ndarray],
@@ -30,9 +30,9 @@ from kumoapi.rfm import (
30
30
  )
31
31
  from kumoapi.task import TaskType
32
32
 
33
- from kumoai import global_state
33
+ from kumoai.client.rfm import RFMAPI
34
34
  from kumoai.exceptions import HTTPException
35
- from kumoai.experimental.rfm import LocalGraph
35
+ from kumoai.experimental.rfm import Graph
36
36
  from kumoai.experimental.rfm.local_graph_sampler import LocalGraphSampler
37
37
  from kumoai.experimental.rfm.local_graph_store import LocalGraphStore
38
38
  from kumoai.experimental.rfm.local_pquery_driver import (
@@ -123,17 +123,17 @@ class KumoRFM:
123
123
  :class:`KumoRFM` is a foundation model to generate predictions for any
124
124
  relational dataset without training.
125
125
  The model is pre-trained and the class provides an interface to query the
126
- model from a :class:`LocalGraph` object.
126
+ model from a :class:`Graph` object.
127
127
 
128
128
  .. code-block:: python
129
129
 
130
- from kumoai.experimental.rfm import LocalGraph, KumoRFM
130
+ from kumoai.experimental.rfm import Graph, KumoRFM
131
131
 
132
132
  df_users = pd.DataFrame(...)
133
133
  df_items = pd.DataFrame(...)
134
134
  df_orders = pd.DataFrame(...)
135
135
 
136
- graph = LocalGraph.from_data({
136
+ graph = Graph.from_data({
137
137
  'users': df_users,
138
138
  'items': df_items,
139
139
  'orders': df_orders,
@@ -141,9 +141,9 @@ class KumoRFM:
141
141
 
142
142
  rfm = KumoRFM(graph)
143
143
 
144
- query = ("PREDICT COUNT(transactions.*, 0, 30, days)>0 "
145
- "FOR users.user_id=0")
146
- result = rfm.query(query)
144
+ query = ("PREDICT COUNT(orders.*, 0, 30, days)>0 "
145
+ "FOR users.user_id=1")
146
+ result = rfm.predict(query)
147
147
 
148
148
  print(result) # user_id COUNT(transactions.*, 0, 30, days) > 0
149
149
  # 1 0.85
@@ -163,7 +163,7 @@ class KumoRFM:
163
163
  """
164
164
  def __init__(
165
165
  self,
166
- graph: LocalGraph,
166
+ graph: Graph,
167
167
  preprocess: bool = False,
168
168
  verbose: Union[bool, ProgressLogger] = True,
169
169
  ) -> None:
@@ -172,9 +172,20 @@ class KumoRFM:
172
172
  self._graph_store = LocalGraphStore(graph, preprocess, verbose)
173
173
  self._graph_sampler = LocalGraphSampler(self._graph_store)
174
174
 
175
+ self._client: Optional[RFMAPI] = None
176
+
175
177
  self._batch_size: Optional[int | Literal['max']] = None
176
178
  self.num_retries: int = 0
177
179
 
180
+ @property
181
+ def _api_client(self) -> RFMAPI:
182
+ if self._client is not None:
183
+ return self._client
184
+
185
+ from kumoai.experimental.rfm import global_state
186
+ self._client = RFMAPI(global_state.client)
187
+ return self._client
188
+
178
189
  def __repr__(self) -> str:
179
190
  return f'{self.__class__.__name__}()'
180
191
 
@@ -420,14 +431,14 @@ class KumoRFM:
420
431
  for attempt in range(self.num_retries + 1):
421
432
  try:
422
433
  if explain_config is not None:
423
- resp = global_state.client.rfm_api.explain(
434
+ resp = self._api_client.explain(
424
435
  request=_bytes,
425
436
  skip_summary=explain_config.skip_summary,
426
437
  )
427
438
  summary = resp.summary
428
439
  details = resp.details
429
440
  else:
430
- resp = global_state.client.rfm_api.predict(_bytes)
441
+ resp = self._api_client.predict(_bytes)
431
442
  df = pd.DataFrame(**resp.prediction)
432
443
 
433
444
  # Cast 'ENTITY' to correct data type:
@@ -633,7 +644,7 @@ class KumoRFM:
633
644
  raise ValueError(_SIZE_LIMIT_MSG.format(stats=stats_msg))
634
645
 
635
646
  try:
636
- resp = global_state.client.rfm_api.evaluate(request_bytes)
647
+ resp = self._api_client.evaluate(request_bytes)
637
648
  except HTTPException as e:
638
649
  try:
639
650
  msg = json.loads(e.detail)['detail']
@@ -731,7 +742,8 @@ class KumoRFM:
731
742
  graph_definition=self._graph_def,
732
743
  )
733
744
 
734
- resp = global_state.client.rfm_api.parse_query(request)
745
+ resp = self._api_client.parse_query(request)
746
+
735
747
  # TODO Expose validation warnings.
736
748
 
737
749
  if len(resp.validation_response.warnings) > 0:
@@ -1035,7 +1047,6 @@ class KumoRFM:
1035
1047
  train_time.astype('datetime64[ns]').astype(int).to_numpy(),
1036
1048
  test_time.astype('datetime64[ns]').astype(int).to_numpy(),
1037
1049
  ]),
1038
- run_mode=run_mode,
1039
1050
  num_neighbors=num_neighbors,
1040
1051
  exclude_cols_dict=exclude_cols_dict,
1041
1052
  )
@@ -0,0 +1,138 @@
1
+ import base64
2
+ import json
3
+ from typing import Any, Dict, List, Tuple
4
+
5
+ import requests
6
+
7
+ from kumoai.client import KumoClient
8
+ from kumoai.client.endpoints import Endpoint, HTTPMethod
9
+ from kumoai.exceptions import HTTPException
10
+
11
+ try:
12
+ # isort: off
13
+ from mypy_boto3_sagemaker_runtime.client import SageMakerRuntimeClient
14
+ from mypy_boto3_sagemaker_runtime.type_defs import (
15
+ InvokeEndpointOutputTypeDef, )
16
+ # isort: on
17
+ except ImportError:
18
+ SageMakerRuntimeClient = Any
19
+ InvokeEndpointOutputTypeDef = Any
20
+
21
+
22
+ class SageMakerResponseAdapter(requests.Response):
23
+ def __init__(self, sm_response: InvokeEndpointOutputTypeDef):
24
+ super().__init__()
25
+ # Read the body bytes
26
+ self._content = sm_response['Body'].read()
27
+ self.status_code = 200
28
+ self.headers['Content-Type'] = sm_response.get('ContentType',
29
+ 'application/json')
30
+ # Optionally, you can store original sm_response for debugging
31
+ self.sm_response = sm_response
32
+
33
+ @property
34
+ def text(self) -> str:
35
+ assert isinstance(self._content, bytes)
36
+ return self._content.decode('utf-8')
37
+
38
+ def json(self, **kwargs) -> dict[str, Any]: # type: ignore
39
+ return json.loads(self.text, **kwargs)
40
+
41
+
42
+ class KumoClient_SageMakerAdapter(KumoClient):
43
+ def __init__(self, region: str, endpoint_name: str):
44
+ import boto3
45
+ self._client: SageMakerRuntimeClient = boto3.client(
46
+ service_name="sagemaker-runtime", region_name=region)
47
+ self._endpoint_name = endpoint_name
48
+
49
+ # Recording buffers.
50
+ self._recording_active = False
51
+ self._recorded_reqs: List[Dict[str, Any]] = []
52
+ self._recorded_resps: List[Dict[str, Any]] = []
53
+
54
+ def authenticate(self) -> None:
55
+ # TODO(siyang): call /ping to verify?
56
+ pass
57
+
58
+ def _request(self, endpoint: Endpoint, **kwargs: Any) -> requests.Response:
59
+ assert endpoint.method == HTTPMethod.POST
60
+ if 'json' in kwargs:
61
+ payload = json.dumps(kwargs.pop('json'))
62
+ elif 'data' in kwargs:
63
+ raw_payload = kwargs.pop('data')
64
+ assert isinstance(raw_payload, bytes)
65
+ payload = base64.b64encode(raw_payload).decode()
66
+ else:
67
+ raise HTTPException(400, 'Unable to send data to KumoRFM.')
68
+
69
+ request = {
70
+ 'method': endpoint.get_path().rsplit('/')[-1],
71
+ 'payload': payload,
72
+ }
73
+ response: InvokeEndpointOutputTypeDef = self._client.invoke_endpoint(
74
+ EndpointName=self._endpoint_name,
75
+ ContentType="application/json",
76
+ Body=json.dumps(request),
77
+ )
78
+
79
+ adapted_response = SageMakerResponseAdapter(response)
80
+
81
+ # If validation is active, store input/output
82
+ if self._recording_active:
83
+ self._recorded_reqs.append(request)
84
+ self._recorded_resps.append(adapted_response.json())
85
+
86
+ return adapted_response
87
+
88
+ def start_recording(self) -> None:
89
+ """Start recording requests/responses to/from sagemaker endpoint."""
90
+ assert not self._recording_active
91
+ self._recording_active = True
92
+ self._recorded_reqs.clear()
93
+ self._recorded_resps.clear()
94
+
95
+ def end_recording(self) -> List[Tuple[Dict[str, Any], Dict[str, Any]]]:
96
+ """Stop recording and return recorded requests/responses."""
97
+ assert self._recording_active
98
+ self._recording_active = False
99
+ recorded = list(zip(self._recorded_reqs, self._recorded_resps))
100
+ self._recorded_reqs.clear()
101
+ self._recorded_resps.clear()
102
+ return recorded
103
+
104
+
105
+ class KumoClient_SageMakerProxy_Local(KumoClient):
106
+ def __init__(self, url: str):
107
+ self._client = KumoClient(url, api_key=None)
108
+ self._client._api_url = self._client._url
109
+ self._endpoint = Endpoint('/invocations', HTTPMethod.POST)
110
+
111
+ def authenticate(self) -> None:
112
+ try:
113
+ self._client._session.get(
114
+ self._url + '/ping',
115
+ verify=self._verify_ssl).raise_for_status()
116
+ except Exception:
117
+ raise ValueError(
118
+ "Client authentication failed. Please check if you "
119
+ "have a valid API key/credentials.")
120
+
121
+ def _request(self, endpoint: Endpoint, **kwargs: Any) -> requests.Response:
122
+ assert endpoint.method == HTTPMethod.POST
123
+ if 'json' in kwargs:
124
+ payload = json.dumps(kwargs.pop('json'))
125
+ elif 'data' in kwargs:
126
+ raw_payload = kwargs.pop('data')
127
+ assert isinstance(raw_payload, bytes)
128
+ payload = base64.b64encode(raw_payload).decode()
129
+ else:
130
+ raise HTTPException(400, 'Unable to send data to KumoRFM.')
131
+ return self._client._request(
132
+ self._endpoint,
133
+ json={
134
+ 'method': endpoint.get_path().rsplit('/')[-1],
135
+ 'payload': payload,
136
+ },
137
+ **kwargs,
138
+ )
kumoai/spcs.py CHANGED
@@ -54,9 +54,7 @@ def _refresh_spcs_token() -> None:
54
54
  api_key=global_state._api_key,
55
55
  spcs_token=spcs_token,
56
56
  )
57
- if not client.authenticate():
58
- raise ValueError("Client authentication failed. Please check if you "
59
- "have a valid API key.")
57
+ client.authenticate()
60
58
 
61
59
  # Update state:
62
60
  global_state.set_spcs_token(spcs_token)
@@ -25,7 +25,7 @@ def onlyFullTest(func: Callable) -> Callable:
25
25
  def has_package(package: str) -> bool:
26
26
  r"""Returns ``True`` in case ``package`` is installed."""
27
27
  req = Requirement(package)
28
- if importlib.util.find_spec(req.name) is None:
28
+ if importlib.util.find_spec(req.name) is None: # type: ignore
29
29
  return False
30
30
 
31
31
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kumoai
3
- Version: 2.13.0.dev202511161731
3
+ Version: 2.13.0.dev202512011731
4
4
  Summary: AI on the Modern Data Stack
5
5
  Author-email: "Kumo.AI" <hello@kumo.ai>
6
6
  License-Expression: MIT
@@ -23,7 +23,7 @@ Requires-Dist: requests>=2.28.2
23
23
  Requires-Dist: urllib3
24
24
  Requires-Dist: plotly
25
25
  Requires-Dist: typing_extensions>=4.5.0
26
- Requires-Dist: kumo-api==0.45.0
26
+ Requires-Dist: kumo-api==0.48.0
27
27
  Requires-Dist: tqdm>=4.66.0
28
28
  Requires-Dist: aiohttp>=3.10.0
29
29
  Requires-Dist: pydantic>=1.10.21
@@ -38,6 +38,13 @@ Provides-Extra: test
38
38
  Requires-Dist: pytest; extra == "test"
39
39
  Requires-Dist: pytest-mock; extra == "test"
40
40
  Requires-Dist: requests-mock; extra == "test"
41
+ Provides-Extra: sqlite
42
+ Requires-Dist: adbc_driver_sqlite; extra == "sqlite"
43
+ Provides-Extra: sagemaker
44
+ Requires-Dist: boto3<2.0,>=1.30.0; extra == "sagemaker"
45
+ Requires-Dist: mypy-boto3-sagemaker-runtime<2.0,>=1.34.0; extra == "sagemaker"
46
+ Provides-Extra: test-sagemaker
47
+ Requires-Dist: sagemaker<3.0; extra == "test-sagemaker"
41
48
  Dynamic: license-file
42
49
  Dynamic: requires-dist
43
50
 
@@ -1,25 +1,30 @@
1
1
  kumoai/_logging.py,sha256=U2_5ROdyk92P4xO4H2WJV8EC7dr6YxmmnM-b7QX9M7I,886
2
2
  kumoai/mixin.py,sha256=MP413xzuCqWhxAPUHmloLA3j4ZyF1tEtfi516b_hOXQ,812
3
- kumoai/_version.py,sha256=ZJwnjTF2EK7dxXu4_ryrxiXCF6I3X1XNDSF3n5JfkOc,39
3
+ kumoai/_version.py,sha256=q8Zwyfwa6Ha3rL-zZFmN3WuqlLR8mLt6YklIO3ZtJg8,39
4
4
  kumoai/kumolib.cpython-312-darwin.so,sha256=xQvdWHx9xmQ11y3F3ywxJv6A0sDk6D3-2fQbxSdM1z4,232576
5
- kumoai/__init__.py,sha256=LU1zmKYc0KV5hy2VGKUuXgSvbJwj2rSRQ_R_bpHyl1o,10708
5
+ kumoai/__init__.py,sha256=L3yOOtpSdwe3PYQlJBLkiQd3Ypp8iB5ChXkzprk3Si4,10546
6
6
  kumoai/formatting.py,sha256=jA_rLDCGKZI8WWCha-vtuLenVKTZvli99Tqpurz1H84,953
7
7
  kumoai/futures.py,sha256=oJFIfdCM_3nWIqQteBKYMY4fPhoYlYWE_JA2o6tx-ng,3737
8
8
  kumoai/jobs.py,sha256=NrdLEFNo7oeCYSy-kj2nAvCFrz9BZ_xrhkqHFHk5ksY,2496
9
9
  kumoai/exceptions.py,sha256=b-_sdbAKOg50uaJZ65GmBLdTo4HANdjl8_R0sJpwaN0,833
10
10
  kumoai/databricks.py,sha256=e6E4lOFvZHXFwh4CO1kXU1zzDU3AapLQYMxjiHPC-HQ,476
11
- kumoai/spcs.py,sha256=N4ddeoHAc4I3bKrDitsb91lUx5VKvCyPyMT3zWiuCcY,4275
11
+ kumoai/spcs.py,sha256=N31d7rLa-bgYh8e2J4YzX1ScxGLqiVXrqJnCl1y4Mts,4139
12
12
  kumoai/_singleton.py,sha256=UTwrbDkoZSGB8ZelorvprPDDv9uZkUi1q_SrmsyngpQ,836
13
13
  kumoai/experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- kumoai/experimental/rfm/local_graph_sampler.py,sha256=o60_sdMa_fr60DrdmCIaE6lKQAD2msp1t-GGubFNt-o,6738
15
- kumoai/experimental/rfm/local_graph.py,sha256=2iJDlsGVzqCe1bD_puXWlhwGkn7YnQyJ4p4C-fwCZNE,30076
14
+ kumoai/experimental/rfm/local_graph_sampler.py,sha256=5DbhL9h0usFKSJfnx7HjLMPcG54qwJ48M2tmONqxXyY,6672
16
15
  kumoai/experimental/rfm/local_pquery_driver.py,sha256=aO7Jfwx9gxGKYvpqxZx1LLWdI1MhuZQOPtAITxoOQO0,26162
17
- kumoai/experimental/rfm/__init__.py,sha256=ornmi2x947jkQLptMn7ZLvTf2Sw-RMcVW73AnjVsWAo,1709
16
+ kumoai/experimental/rfm/graph.py,sha256=Ff_9-rOJRSDd4bnx73CkfQjAxU4fqzzQ3CIkZOYjR8c,30729
17
+ kumoai/experimental/rfm/__init__.py,sha256=slliYcrh80xPtQQ_nnsp3ny9IbmHCyirmdZUfKTdME4,6064
18
18
  kumoai/experimental/rfm/utils.py,sha256=3IiBvT_aLBkkcJh3H11_50yt_XlEzHR0cm9Kprrtl8k,11123
19
- kumoai/experimental/rfm/local_table.py,sha256=r8xZ33Mjs6JD8ud6h23tZ99Dag2DvZ4h6tWjmGrKQg4,19605
20
- kumoai/experimental/rfm/rfm.py,sha256=OHE6xpVREfm5GtZ4LXPY71FKzjNc94LWiBTPrmE6Xzc,48097
21
- kumoai/experimental/rfm/local_graph_store.py,sha256=8BqonuaMftAAsjgZpB369i5AeNd1PkisMbbEqc0cKBo,13847
19
+ kumoai/experimental/rfm/sagemaker.py,sha256=_hTrFg4qfXe7uzwqSEG_wze-IFkwn7qde9OpUodCpbc,4982
20
+ kumoai/experimental/rfm/rfm.py,sha256=0i6UA6Ds72midVq4ngaP4y5cnxs_GrwBF93Y0pFCX5k,48304
21
+ kumoai/experimental/rfm/local_graph_store.py,sha256=2ehCC7bttSp8cKLe5_6GaMUdF4fbYaTR0rYPVQb6rEQ,13891
22
22
  kumoai/experimental/rfm/authenticate.py,sha256=FiuHMvP7V3zBZUlHMDMbNLhc-UgDZgz4hjVSTuQ7DRw,18888
23
+ kumoai/experimental/rfm/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ kumoai/experimental/rfm/backend/sqlite/__init__.py,sha256=wQSH6esLny3EJID-fl__fxpiiG5J5Pj2EgIfbD0gx5I,604
25
+ kumoai/experimental/rfm/backend/sqlite/table.py,sha256=WAUOEDDNNAMPlbN6W3ZsSfd8OLhrUT5yRa0ypde0iRs,4627
26
+ kumoai/experimental/rfm/backend/local/__init__.py,sha256=9rupbsPadaOqrEInv2nh9KEQ9mK8dSkbteMXwZmsGbU,896
27
+ kumoai/experimental/rfm/backend/local/table.py,sha256=wxYmWCy_F3j2TQ5trN7Cn2hAkVDgIcSWMJa-uFkl8G0,5140
23
28
  kumoai/experimental/rfm/pquery/__init__.py,sha256=X0O3EIq5SMfBEE-ii5Cq6iDhR3s3XMXB52Cx5htoePw,152
24
29
  kumoai/experimental/rfm/pquery/pandas_executor.py,sha256=kiBJq7uVGbasG7TiqsubEl6ey3UYzZiM4bwxILqp_54,18487
25
30
  kumoai/experimental/rfm/pquery/executor.py,sha256=f7-pJhL0BgFU9E4o4gQpQyArOvyrZtwxFmks34-QOAE,2741
@@ -28,6 +33,9 @@ kumoai/experimental/rfm/infer/categorical.py,sha256=VwNaKwKbRYkTxEJ1R6gziffC8dGs
28
33
  kumoai/experimental/rfm/infer/id.py,sha256=ZIO0DWIoiEoS_8MVc5lkqBfkTWWQ0yGCgjkwLdaYa_Q,908
29
34
  kumoai/experimental/rfm/infer/__init__.py,sha256=xQ8_SuejIzXyn2J7bIKX3pXumFtRuEfBtE5oEDUDJjI,293
30
35
  kumoai/experimental/rfm/infer/timestamp.py,sha256=vM9--7eStzaGG13Y-oLYlpNJyhL6f9dp17HDXwtl_DM,1094
36
+ kumoai/experimental/rfm/base/__init__.py,sha256=TlK19Ge4xTeuEMsZvSTA3uR2S0xnlYcJxXwWos-N4lw,94
37
+ kumoai/experimental/rfm/base/table.py,sha256=YSjnsyn-5sX3IcCUgwed7JON7OaDH6n76PlX5GIgtVI,16946
38
+ kumoai/experimental/rfm/base/column.py,sha256=izCJmufJcd1RSi-ptFMfrue-JYag38MJxizka7ya0-A,2319
31
39
  kumoai/encoder/__init__.py,sha256=VPGs4miBC_WfwWeOXeHhFomOUocERFavhKf5fqITcds,182
32
40
  kumoai/graph/graph.py,sha256=iyp4klPIMn2ttuEqMJvsrxKb_tmz_DTnvziIhCegduM,38291
33
41
  kumoai/graph/__init__.py,sha256=n8X4X8luox4hPBHTRC9R-3JzvYYMoR8n7lF1H4w4Hzc,228
@@ -57,7 +65,7 @@ kumoai/codegen/handlers/utils.py,sha256=58b2GCgaTBUp2aId7BLMXMV0ENrusbNbfw7mlyXA
57
65
  kumoai/codegen/handlers/connector.py,sha256=afGf_GreyQ9y6qF3QTgSiM416qtUcP298SatNqUFhvQ,3828
58
66
  kumoai/codegen/handlers/table.py,sha256=POHpA-GFYFGTSuerGmtigYablk-Wq1L3EBvsOI-iFMQ,3956
59
67
  kumoai/testing/__init__.py,sha256=goHIIo3JE7uHV7njo4_aTd89mVVR74BEAZ2uyBaOR0w,170
60
- kumoai/testing/decorators.py,sha256=RiFrJcP-ym-mB1BYSGC26bBiryxoR9-GwL1G4EHc2sc,1591
68
+ kumoai/testing/decorators.py,sha256=83tMifuPTpUqX7zHxMttkj1TDdB62EBtAP-Fjj72Zdo,1607
61
69
  kumoai/connector/glue_connector.py,sha256=HivT0QYQ8-XeB4QLgWvghiqXuq7jyBK9G2R1py_NnE4,4697
62
70
  kumoai/connector/databricks_connector.py,sha256=YQy203XHZGzNJ8bPUjUOnrVt2KlpgMdVuTHpc6sVCcs,7574
63
71
  kumoai/connector/snowflake_connector.py,sha256=K0s-H9tW3rve8g2x1PbyxvzSpkROfGQZz-Qa4PoT4UE,9022
@@ -65,7 +73,7 @@ kumoai/connector/bigquery_connector.py,sha256=IkyRqvF8Cg96kApUuuz86eYnl-BqBmDX1f
65
73
  kumoai/connector/source_table.py,sha256=QLT8bEYaxeMwy-b168url0VfnkTrs5K6VKLbxTI4hEY,17539
66
74
  kumoai/connector/__init__.py,sha256=9g6oNJ0qHWFlL5enTSoK4_SSH_5hP74xUDZx-9SggC4,842
67
75
  kumoai/connector/file_upload_connector.py,sha256=swp03HgChOvmNPJetuujBSAqADe7NRmS_T0F3o9it4w,7008
68
- kumoai/connector/utils.py,sha256=PUjunLpfqMZsrPDo2EmnyJRBl_mt-E6ugv2kNkf5Rn8,64011
76
+ kumoai/connector/utils.py,sha256=wlqQxMmPvnFNoCcczGkKYjSu05h8OhWh4fhTzQm_2bQ,64694
69
77
  kumoai/connector/s3_connector.py,sha256=3kbv-h7DwD8O260Q0h1GPm5wwQpLt-Tb3d_CBSaie44,10155
70
78
  kumoai/connector/base.py,sha256=cujXSZF3zAfuxNuEw54DSL1T7XCuR4t0shSMDuPUagQ,5291
71
79
  kumoai/pquery/__init__.py,sha256=uTXr7t1eXcVfM-ETaM_1ImfEqhrmaj8BjiIvy1YZTL8,533
@@ -73,7 +81,7 @@ kumoai/pquery/predictive_query.py,sha256=oUqwdOWLLkPM-G4PhpUk_6mwSJGBtaD3t37Wp5O
73
81
  kumoai/pquery/prediction_table.py,sha256=QPDH22X1UB0NIufY7qGuV2XW7brG3Pv--FbjNezzM2g,10776
74
82
  kumoai/pquery/training_table.py,sha256=elmPDZx11kPiC_dkOhJcBUGtHKgL32GCBvZ9k6U0pMg,15809
75
83
  kumoai/client/pquery.py,sha256=R2hc-M8vPoyIDH0ywLwFVxCznVAqpZz3w2HszjdNW-o,6891
76
- kumoai/client/client.py,sha256=S1OfGDwTzoyf40fhg111xGQGNfEP-OnoXqFV6X9iMEc,8580
84
+ kumoai/client/client.py,sha256=Jda8V9yiu3LbhxlcgRWPeYi7eF6jzCKcq8-B_vEd1ik,8514
77
85
  kumoai/client/graph.py,sha256=zvLEDExLT_RVbUMHqVl0m6tO6s2gXmYSoWmPF6YMlnA,3831
78
86
  kumoai/client/online.py,sha256=pkBBh_DEC3GAnPcNw6bopNRlGe7EUbIFe7_seQqZRaw,2720
79
87
  kumoai/client/source_table.py,sha256=VCsCcM7KYcnjGP7HLTb-AOSEGEVsJTWjk8bMg1JdgPU,2101
@@ -91,8 +99,8 @@ kumoai/trainer/baseline_trainer.py,sha256=LlfViNOmswNv4c6zJJLsyv0pC2mM2WKMGYx06o
91
99
  kumoai/trainer/__init__.py,sha256=zUdFl-f-sBWmm2x8R-rdVzPBeU2FaMzUY5mkcgoTa1k,939
92
100
  kumoai/trainer/online_serving.py,sha256=9cddb5paeZaCgbUeceQdAOxysCtV5XP-KcsgFz_XR5w,9566
93
101
  kumoai/trainer/trainer.py,sha256=hBXO7gwpo3t59zKFTeIkK65B8QRmWCwO33sbDuEAPlY,20133
94
- kumoai-2.13.0.dev202511161731.dist-info/RECORD,,
95
- kumoai-2.13.0.dev202511161731.dist-info/WHEEL,sha256=V1loQ6TpxABu1APUg0MoTRBOzSKT5xVc3skizX-ovCU,136
96
- kumoai-2.13.0.dev202511161731.dist-info/top_level.txt,sha256=YjU6UcmomoDx30vEXLsOU784ED7VztQOsFApk1SFwvs,7
97
- kumoai-2.13.0.dev202511161731.dist-info/METADATA,sha256=eFRuDnF3kJMN67DFzm2JhldvbXqUmNpDDkGc725Y4ak,2052
98
- kumoai-2.13.0.dev202511161731.dist-info/licenses/LICENSE,sha256=TbWlyqRmhq9PEzCaTI0H0nWLQCCOywQM8wYH8MbjfLo,1102
102
+ kumoai-2.13.0.dev202512011731.dist-info/RECORD,,
103
+ kumoai-2.13.0.dev202512011731.dist-info/WHEEL,sha256=V1loQ6TpxABu1APUg0MoTRBOzSKT5xVc3skizX-ovCU,136
104
+ kumoai-2.13.0.dev202512011731.dist-info/top_level.txt,sha256=YjU6UcmomoDx30vEXLsOU784ED7VztQOsFApk1SFwvs,7
105
+ kumoai-2.13.0.dev202512011731.dist-info/METADATA,sha256=q3ILcIOLhew8MHoXzkQ_z59UwQouGD6mk7U8jEpNGSQ,2376
106
+ kumoai-2.13.0.dev202512011731.dist-info/licenses/LICENSE,sha256=TbWlyqRmhq9PEzCaTI0H0nWLQCCOywQM8wYH8MbjfLo,1102