kumoai 2.9.0.dev202509081831__cp312-cp312-win_amd64.whl → 2.13.0.dev202511201731__cp312-cp312-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.
Files changed (30) hide show
  1. kumoai/__init__.py +10 -11
  2. kumoai/_version.py +1 -1
  3. kumoai/client/client.py +17 -16
  4. kumoai/client/endpoints.py +1 -0
  5. kumoai/client/rfm.py +37 -8
  6. kumoai/connector/file_upload_connector.py +71 -102
  7. kumoai/connector/utils.py +1367 -236
  8. kumoai/experimental/rfm/__init__.py +153 -10
  9. kumoai/experimental/rfm/authenticate.py +8 -5
  10. kumoai/experimental/rfm/infer/timestamp.py +7 -4
  11. kumoai/experimental/rfm/local_graph.py +90 -80
  12. kumoai/experimental/rfm/local_graph_sampler.py +16 -10
  13. kumoai/experimental/rfm/local_graph_store.py +22 -6
  14. kumoai/experimental/rfm/local_pquery_driver.py +336 -42
  15. kumoai/experimental/rfm/local_table.py +100 -22
  16. kumoai/experimental/rfm/pquery/__init__.py +4 -4
  17. kumoai/experimental/rfm/pquery/{backend.py → executor.py} +24 -58
  18. kumoai/experimental/rfm/pquery/{pandas_backend.py → pandas_executor.py} +278 -222
  19. kumoai/experimental/rfm/rfm.py +523 -124
  20. kumoai/experimental/rfm/sagemaker.py +130 -0
  21. kumoai/jobs.py +1 -0
  22. kumoai/kumolib.cp312-win_amd64.pyd +0 -0
  23. kumoai/spcs.py +1 -3
  24. kumoai/trainer/trainer.py +19 -10
  25. kumoai/utils/progress_logger.py +68 -0
  26. {kumoai-2.9.0.dev202509081831.dist-info → kumoai-2.13.0.dev202511201731.dist-info}/METADATA +13 -5
  27. {kumoai-2.9.0.dev202509081831.dist-info → kumoai-2.13.0.dev202511201731.dist-info}/RECORD +30 -29
  28. {kumoai-2.9.0.dev202509081831.dist-info → kumoai-2.13.0.dev202511201731.dist-info}/WHEEL +0 -0
  29. {kumoai-2.9.0.dev202509081831.dist-info → kumoai-2.13.0.dev202511201731.dist-info}/licenses/LICENSE +0 -0
  30. {kumoai-2.9.0.dev202509081831.dist-info → kumoai-2.13.0.dev202511201731.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,130 @@
1
+ import base64
2
+ import json
3
+ from typing import Any, Dict, List, Tuple
4
+
5
+ import boto3
6
+ import requests
7
+ from mypy_boto3_sagemaker_runtime.client import SageMakerRuntimeClient
8
+ from mypy_boto3_sagemaker_runtime.type_defs import InvokeEndpointOutputTypeDef
9
+
10
+ from kumoai.client import KumoClient
11
+ from kumoai.client.endpoints import Endpoint, HTTPMethod
12
+ from kumoai.exceptions import HTTPException
13
+
14
+
15
+ class SageMakerResponseAdapter(requests.Response):
16
+ def __init__(self, sm_response: InvokeEndpointOutputTypeDef):
17
+ super().__init__()
18
+ # Read the body bytes
19
+ self._content = sm_response['Body'].read()
20
+ self.status_code = 200
21
+ self.headers['Content-Type'] = sm_response.get('ContentType',
22
+ 'application/json')
23
+ # Optionally, you can store original sm_response for debugging
24
+ self.sm_response = sm_response
25
+
26
+ @property
27
+ def text(self) -> str:
28
+ assert isinstance(self._content, bytes)
29
+ return self._content.decode('utf-8')
30
+
31
+ def json(self, **kwargs) -> dict[str, Any]: # type: ignore
32
+ return json.loads(self.text, **kwargs)
33
+
34
+
35
+ class KumoClient_SageMakerAdapter(KumoClient):
36
+ def __init__(self, region: str, endpoint_name: str):
37
+ self._client: SageMakerRuntimeClient = boto3.client(
38
+ service_name="sagemaker-runtime", region_name=region)
39
+ self._endpoint_name = endpoint_name
40
+
41
+ # Recording buffers.
42
+ self._recording_active = False
43
+ self._recorded_reqs: List[Dict[str, Any]] = []
44
+ self._recorded_resps: List[Dict[str, Any]] = []
45
+
46
+ def authenticate(self) -> None:
47
+ # TODO(siyang): call /ping to verify?
48
+ pass
49
+
50
+ def _request(self, endpoint: Endpoint, **kwargs: Any) -> requests.Response:
51
+ assert endpoint.method == HTTPMethod.POST
52
+ if 'json' in kwargs:
53
+ payload = json.dumps(kwargs.pop('json'))
54
+ elif 'data' in kwargs:
55
+ raw_payload = kwargs.pop('data')
56
+ assert isinstance(raw_payload, bytes)
57
+ payload = base64.b64encode(raw_payload).decode()
58
+ else:
59
+ raise HTTPException(400, 'Unable to send data to KumoRFM.')
60
+
61
+ request = {
62
+ 'method': endpoint.get_path().rsplit('/')[-1],
63
+ 'payload': payload,
64
+ }
65
+ response: InvokeEndpointOutputTypeDef = self._client.invoke_endpoint(
66
+ EndpointName=self._endpoint_name,
67
+ ContentType="application/json",
68
+ Body=json.dumps(request),
69
+ )
70
+
71
+ adapted_response = SageMakerResponseAdapter(response)
72
+
73
+ # If validation is active, store input/output
74
+ if self._recording_active:
75
+ self._recorded_reqs.append(request)
76
+ self._recorded_resps.append(adapted_response.json())
77
+
78
+ return adapted_response
79
+
80
+ def start_recording(self) -> None:
81
+ """Start recording requests/responses to/from sagemaker endpoint."""
82
+ assert not self._recording_active
83
+ self._recording_active = True
84
+ self._recorded_reqs.clear()
85
+ self._recorded_resps.clear()
86
+
87
+ def end_recording(self) -> List[Tuple[Dict[str, Any], Dict[str, Any]]]:
88
+ """Stop recording and return recorded requests/responses."""
89
+ assert self._recording_active
90
+ self._recording_active = False
91
+ recorded = list(zip(self._recorded_reqs, self._recorded_resps))
92
+ self._recorded_reqs.clear()
93
+ self._recorded_resps.clear()
94
+ return recorded
95
+
96
+
97
+ class KumoClient_SageMakerProxy_Local(KumoClient):
98
+ def __init__(self, url: str):
99
+ self._client = KumoClient(url, api_key=None)
100
+ self._client._api_url = self._client._url
101
+ self._endpoint = Endpoint('/invocations', HTTPMethod.POST)
102
+
103
+ def authenticate(self) -> None:
104
+ try:
105
+ self._client._session.get(
106
+ self._url + '/ping',
107
+ verify=self._verify_ssl).raise_for_status()
108
+ except Exception:
109
+ raise ValueError(
110
+ "Client authentication failed. Please check if you "
111
+ "have a valid API key/credentials.")
112
+
113
+ def _request(self, endpoint: Endpoint, **kwargs: Any) -> requests.Response:
114
+ assert endpoint.method == HTTPMethod.POST
115
+ if 'json' in kwargs:
116
+ payload = json.dumps(kwargs.pop('json'))
117
+ elif 'data' in kwargs:
118
+ raw_payload = kwargs.pop('data')
119
+ assert isinstance(raw_payload, bytes)
120
+ payload = base64.b64encode(raw_payload).decode()
121
+ else:
122
+ raise HTTPException(400, 'Unable to send data to KumoRFM.')
123
+ return self._client._request(
124
+ self._endpoint,
125
+ json={
126
+ 'method': endpoint.get_path().rsplit('/')[-1],
127
+ 'payload': payload,
128
+ },
129
+ **kwargs,
130
+ )
kumoai/jobs.py CHANGED
@@ -26,6 +26,7 @@ class JobInterface(ABC, Generic[IDType, JobRequestType, JobResourceType]):
26
26
  limit (int): Max number of jobs to list, default 10.
27
27
 
28
28
  Example:
29
+ >>> # doctest: +SKIP
29
30
  >>> tags = {'pquery_name': 'my_pquery_name'}
30
31
  >>> jobs = BatchPredictionJob.search_by_tags(tags)
31
32
  Search limited to 10 results based on the `limit` parameter.
Binary file
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)
kumoai/trainer/trainer.py CHANGED
@@ -20,7 +20,6 @@ from kumoapi.jobs import (
20
20
  TrainingJobResource,
21
21
  )
22
22
  from kumoapi.model_plan import ModelPlan
23
- from kumoapi.task import TaskType
24
23
 
25
24
  from kumoai import global_state
26
25
  from kumoai.artifact_export.config import OutputConfig
@@ -190,6 +189,7 @@ class Trainer:
190
189
  *,
191
190
  non_blocking: bool = False,
192
191
  custom_tags: Mapping[str, str] = {},
192
+ warm_start_job_id: Optional[TrainingJobID] = None,
193
193
  ) -> Union[TrainingJob, TrainingJobResult]:
194
194
  r"""Fits a model to the specified graph and training table, with the
195
195
  strategy defined by this :class:`Trainer`'s :obj:`model_plan`.
@@ -207,6 +207,11 @@ class Trainer:
207
207
  custom_tags: Additional, customer defined k-v tags to be associated
208
208
  with the job to be launched. Job tags are useful for grouping
209
209
  and searching jobs.
210
+ warm_start_job_id: Optional job ID of a completed training job to
211
+ warm start from. Initializes the new model with the best
212
+ weights from the specified job, using its model
213
+ architecture, column processing, and neighbor sampling
214
+ configurations.
210
215
 
211
216
  Returns:
212
217
  Union[TrainingJobResult, TrainingJob]:
@@ -241,6 +246,7 @@ class Trainer:
241
246
  graph_snapshot_id=graph.snapshot(non_blocking=non_blocking),
242
247
  train_table_job_id=job_id,
243
248
  custom_train_table=custom_table,
249
+ warm_start_job_id=warm_start_job_id,
244
250
  ))
245
251
 
246
252
  out = TrainingJob(job_id=self._training_job_id)
@@ -353,6 +359,9 @@ class Trainer:
353
359
  'deprecated. Please use output_config to specify these '
354
360
  'parameters.')
355
361
  assert output_config is not None
362
+ # Be able to pass output_config as a dictionary
363
+ if isinstance(output_config, dict):
364
+ output_config = OutputConfig(**output_config)
356
365
  output_table_name = to_db_table_name(output_config.output_table_name)
357
366
  validate_output_arguments(
358
367
  output_config.output_types,
@@ -395,15 +404,15 @@ class Trainer:
395
404
  pred_table_data_path = prediction_table.table_data_uri
396
405
 
397
406
  api = global_state.client.batch_prediction_job_api
398
-
399
- from kumoai.pquery.predictive_query import PredictiveQuery
400
- pquery = PredictiveQuery.load_from_training_job(training_job_id)
401
- if pquery.get_task_type() == TaskType.BINARY_CLASSIFICATION:
402
- if binary_classification_threshold is None:
403
- logger.warning("No binary classification threshold provided. "
404
- "Using default threshold of 0.5.")
405
- binary_classification_threshold = 0.5
406
-
407
+ # Remove to resolve https://github.com/kumo-ai/kumo/issues/24250
408
+ # from kumoai.pquery.predictive_query import PredictiveQuery
409
+ # pquery = PredictiveQuery.load_from_training_job(training_job_id)
410
+ # if pquery.get_task_type() == TaskType.BINARY_CLASSIFICATION:
411
+ # if binary_classification_threshold is None:
412
+ # logger.warning(
413
+ # "No binary classification threshold provided. "
414
+ # "Using default threshold of 0.5.")
415
+ # binary_classification_threshold = 0.5
407
416
  job_id, response = api.maybe_create(
408
417
  BatchPredictionRequest(
409
418
  dict(custom_tags),
@@ -1,9 +1,18 @@
1
+ import sys
1
2
  import time
2
3
  from typing import Any, List, Optional, Union
3
4
 
4
5
  from rich.console import Console, ConsoleOptions, RenderResult
5
6
  from rich.live import Live
6
7
  from rich.padding import Padding
8
+ from rich.progress import (
9
+ BarColumn,
10
+ MofNCompleteColumn,
11
+ Progress,
12
+ Task,
13
+ TextColumn,
14
+ TimeRemainingColumn,
15
+ )
7
16
  from rich.spinner import Spinner
8
17
  from rich.table import Table
9
18
  from rich.text import Text
@@ -39,6 +48,24 @@ class ProgressLogger:
39
48
  return f'{self.__class__.__name__}({self.msg})'
40
49
 
41
50
 
51
+ class ColoredMofNCompleteColumn(MofNCompleteColumn):
52
+ def __init__(self, style: str = 'green') -> None:
53
+ super().__init__()
54
+ self.style = style
55
+
56
+ def render(self, task: Task) -> Text:
57
+ return Text(str(super().render(task)), style=self.style)
58
+
59
+
60
+ class ColoredTimeRemainingColumn(TimeRemainingColumn):
61
+ def __init__(self, style: str = 'cyan') -> None:
62
+ super().__init__()
63
+ self.style = style
64
+
65
+ def render(self, task: Task) -> Text:
66
+ return Text(str(super().render(task)), style=self.style)
67
+
68
+
42
69
  class InteractiveProgressLogger(ProgressLogger):
43
70
  def __init__(
44
71
  self,
@@ -51,12 +78,39 @@ class InteractiveProgressLogger(ProgressLogger):
51
78
  self.verbose = verbose
52
79
  self.refresh_per_second = refresh_per_second
53
80
 
81
+ self._progress: Optional[Progress] = None
82
+ self._task: Optional[int] = None
83
+
54
84
  self._live: Optional[Live] = None
55
85
  self._exception: bool = False
56
86
 
87
+ def init_progress(self, total: int, description: str) -> None:
88
+ assert self._progress is None
89
+ if self.verbose:
90
+ self._progress = Progress(
91
+ TextColumn(f' ↳ {description}', style='dim'),
92
+ BarColumn(bar_width=None),
93
+ ColoredMofNCompleteColumn(style='dim'),
94
+ TextColumn('•', style='dim'),
95
+ ColoredTimeRemainingColumn(style='dim'),
96
+ )
97
+ self._task = self._progress.add_task("Progress", total=total)
98
+
99
+ def step(self) -> None:
100
+ if self.verbose:
101
+ assert self._progress is not None
102
+ assert self._task is not None
103
+ self._progress.update(self._task, advance=1) # type: ignore
104
+
57
105
  def __enter__(self) -> Self:
106
+ from kumoai import in_notebook
107
+
58
108
  super().__enter__()
59
109
 
110
+ if not in_notebook(): # Render progress bar in TUI.
111
+ sys.stdout.write("\x1b]9;4;3\x07")
112
+ sys.stdout.flush()
113
+
60
114
  if self.verbose:
61
115
  self._live = Live(
62
116
  self,
@@ -68,16 +122,27 @@ class InteractiveProgressLogger(ProgressLogger):
68
122
  return self
69
123
 
70
124
  def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
125
+ from kumoai import in_notebook
126
+
71
127
  super().__exit__(exc_type, exc_val, exc_tb)
72
128
 
73
129
  if exc_type is not None:
74
130
  self._exception = True
75
131
 
132
+ if self._progress is not None:
133
+ self._progress.stop()
134
+ self._progress = None
135
+ self._task = None
136
+
76
137
  if self._live is not None:
77
138
  self._live.update(self, refresh=True)
78
139
  self._live.stop()
79
140
  self._live = None
80
141
 
142
+ if not in_notebook():
143
+ sys.stdout.write("\x1b]9;4;0\x07")
144
+ sys.stdout.flush()
145
+
81
146
  def __rich_console__(
82
147
  self,
83
148
  console: Console,
@@ -107,3 +172,6 @@ class InteractiveProgressLogger(ProgressLogger):
107
172
  table.add_row('', Text(f'↳ {log}', style='dim'))
108
173
 
109
174
  yield table
175
+
176
+ if self.verbose and self._progress is not None:
177
+ yield self._progress.get_renderable()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kumoai
3
- Version: 2.9.0.dev202509081831
3
+ Version: 2.13.0.dev202511201731
4
4
  Summary: AI on the Modern Data Stack
5
5
  Author-email: "Kumo.AI" <hello@kumo.ai>
6
6
  License-Expression: MIT
@@ -9,13 +9,12 @@ Project-URL: documentation, https://kumo.ai/docs
9
9
  Keywords: deep-learning,graph-neural-networks,cloud-data-warehouse
10
10
  Classifier: Development Status :: 5 - Production/Stable
11
11
  Classifier: Programming Language :: Python
12
- Classifier: Programming Language :: Python :: 3.9
13
12
  Classifier: Programming Language :: Python :: 3.10
14
13
  Classifier: Programming Language :: Python :: 3.11
15
14
  Classifier: Programming Language :: Python :: 3.12
16
15
  Classifier: Programming Language :: Python :: 3.13
17
16
  Classifier: Programming Language :: Python :: 3 :: Only
18
- Requires-Python: >=3.9
17
+ Requires-Python: >=3.10
19
18
  Description-Content-Type: text/markdown
20
19
  License-File: LICENSE
21
20
  Requires-Dist: pandas
@@ -24,11 +23,13 @@ Requires-Dist: requests>=2.28.2
24
23
  Requires-Dist: urllib3
25
24
  Requires-Dist: plotly
26
25
  Requires-Dist: typing_extensions>=4.5.0
27
- Requires-Dist: kumo-api==0.33.0
26
+ Requires-Dist: kumo-api==0.46.0
28
27
  Requires-Dist: tqdm>=4.66.0
29
28
  Requires-Dist: aiohttp>=3.10.0
30
29
  Requires-Dist: pydantic>=1.10.21
31
30
  Requires-Dist: rich>=9.0.0
31
+ Requires-Dist: mypy-boto3-sagemaker-runtime
32
+ Requires-Dist: boto3
32
33
  Provides-Extra: doc
33
34
  Requires-Dist: sphinx; extra == "doc"
34
35
  Requires-Dist: sphinx-book-theme; extra == "doc"
@@ -39,6 +40,13 @@ Provides-Extra: test
39
40
  Requires-Dist: pytest; extra == "test"
40
41
  Requires-Dist: pytest-mock; extra == "test"
41
42
  Requires-Dist: requests-mock; extra == "test"
43
+ Provides-Extra: test-sagemaker
44
+ Requires-Dist: sagemaker; extra == "test-sagemaker"
45
+ Requires-Dist: pandas==2.1.4; extra == "test-sagemaker"
46
+ Requires-Dist: pyarrow==12.0.1; extra == "test-sagemaker"
47
+ Provides-Extra: sagemaker
48
+ Requires-Dist: boto3<2.0,>=1.30.0; extra == "sagemaker"
49
+ Requires-Dist: mypy-boto3-sagemaker-runtime<2.0,>=1.34.0; extra == "sagemaker"
42
50
  Dynamic: license-file
43
51
  Dynamic: requires-dist
44
52
 
@@ -54,7 +62,7 @@ interact with the Kumo machine learning platform
54
62
 
55
63
  ## Installation
56
64
 
57
- The Kumo SDK is available for Python 3.9 to Python 3.13. To install, simply run
65
+ The Kumo SDK is available for Python 3.10 to Python 3.13. To install, simply run
58
66
 
59
67
  ```
60
68
  pip install kumoai
@@ -1,27 +1,27 @@
1
- kumoai/__init__.py,sha256=7YoN_aogTFbuPKHjwvu8Pr8DqkZGCSUTqXj-yofcUFM,10965
1
+ kumoai/__init__.py,sha256=qu-qohU2cQlManX1aZIlzA3ivKl52m-cSQBPSW8urUU,10837
2
2
  kumoai/_logging.py,sha256=qL4JbMQwKXri2f-SEJoFB8TY5ALG12S-nobGTNWxW-A,915
3
3
  kumoai/_singleton.py,sha256=i2BHWKpccNh5SJGDyU0IXsnYzJAYr8Xb0wz4c6LRbpo,861
4
- kumoai/_version.py,sha256=i0ZG8l0_1CD0GD9cOAn_N-GAayuQ_k4ooqREoN8Ngdc,38
4
+ kumoai/_version.py,sha256=CzHAzff5RPrReyLAkFa4nLCD0pOKzSsQM9wWXI1IVfY,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
- kumoai/jobs.py,sha256=guR9xi5XXHzkeCosE-_ErCfxYPHcErw230fqvFZt9VE,2542
10
- kumoai/kumolib.cp312-win_amd64.pyd,sha256=40vQmkuhrdmK53mDar2615knNeeJkZQMKCE3StSg6nM,198144
9
+ kumoai/jobs.py,sha256=dCi7BAdfm2tCnonYlGU4WJokJWbh3RzFfaOX2EYCIHU,2576
10
+ kumoai/kumolib.cp312-win_amd64.pyd,sha256=St9rYXG5WvpcjxAaP_DT3G2vvZnHygsODE6-8TnKVVw,198144
11
11
  kumoai/mixin.py,sha256=IaiB8SAI0VqOoMVzzIaUlqMt53-QPUK6OB0HikG-V9E,840
12
- kumoai/spcs.py,sha256=SWvfkeJvb_7sGkjSqyMBIuPbMTWCP6v0BC9HBXM1uSI,4398
12
+ kumoai/spcs.py,sha256=KWfENrwSLruprlD-QPh63uU0N6npiNrwkeKfBk3EUyQ,4260
13
13
  kumoai/artifact_export/__init__.py,sha256=UXAQI5q92ChBzWAk8o3J6pElzYHudAzFZssQXd4o7i8,247
14
14
  kumoai/artifact_export/config.py,sha256=PRoUByzu5l-nyBKFR4vnRlq19b53ExGVy8YDCD7zMuI,8233
15
15
  kumoai/artifact_export/job.py,sha256=lOFIdPCrvhwdfvvDhQ2yzW8J4qIdYQoHZO1Rz3kJky4,3383
16
16
  kumoai/client/__init__.py,sha256=v0ISO1QD8JJhIJS6IzWz5-SL3EhtNCPeX3j1b2HBY0s,69
17
- kumoai/client/client.py,sha256=5AI-m7MhXgZm68GdX_J4YBoaR0fdFlqgcmA8rq1eYDQ,8416
17
+ kumoai/client/client.py,sha256=T6Kw7-XWuAy5Dh7XU5graBl1-cTARiobycwtgxzaSE8,8731
18
18
  kumoai/client/connector.py,sha256=CO2LG5aDpCLxWNYYFRXGZs1AhYH3dRcbqBEUGwHQGzQ,4030
19
- kumoai/client/endpoints.py,sha256=gyVxVkdlO7FMR_UHof3RWsoTY-87JTD7y1lLIw1kh8A,5464
19
+ kumoai/client/endpoints.py,sha256=DpEKEQ1yvL15iHZadXZKO94t-qXrYLaeV1sknX4IuPg,5532
20
20
  kumoai/client/graph.py,sha256=6MFyPYxDPfGTWeAI_84RUgWx9rVvqbLnR0Ourtgj5rg,3951
21
21
  kumoai/client/jobs.py,sha256=Y8wKiTk1I5ywc-2cxR72LaBjfhPTCVOezSCTeDpTs8Q,17521
22
22
  kumoai/client/online.py,sha256=4s_8Sv8m_k_tty4CO7RuAt0e6BDMkGvsZZ3VX8zyDb8,2798
23
23
  kumoai/client/pquery.py,sha256=0pXgQLxjoaFWDif0XRAuC_P-X3OSnXNWsiVrXej9uMk,7094
24
- kumoai/client/rfm.py,sha256=wr2CXFdtvu5wGJz7iQ2OBzhQRu_EyMESH8KJZ0dsBMo,2965
24
+ kumoai/client/rfm.py,sha256=Gmt_dqoXekBCLiF0eQPgpoJ1cbnhnU8VbINF3U13qbQ,3838
25
25
  kumoai/client/source_table.py,sha256=mMHJtQ_yUHRI9LdHLVHxNGt83bbzmC1_d-NmXjbiTuI,2154
26
26
  kumoai/client/table.py,sha256=VhjLEMLQS1Z7zjcb2Yt3gZfiVqiD7b1gj-WNux_504A,3336
27
27
  kumoai/client/utils.py,sha256=RSD5Ia0lQQDR1drRFBJFdo2KVHfQqhJuk6m6du7Kl4E,3979
@@ -45,31 +45,32 @@ kumoai/connector/__init__.py,sha256=yPE3TVLCKdVKhsqPsYVSA290eIZCOTtHtylxm2I5U6Q,
45
45
  kumoai/connector/base.py,sha256=AYCtcYuncLyMl0FLLUMu5z4qFBWury5jhK2D9sZJIgA,5444
46
46
  kumoai/connector/bigquery_connector.py,sha256=KMgXEyN6PCM5RV5fvKx0ZPubucf43LEz7KvDtKCHXbM,7282
47
47
  kumoai/connector/databricks_connector.py,sha256=oJ2GHp_CFOeMWGPOHqpxmotquAobWV9iGZ-__Rpdr5o,7787
48
- kumoai/connector/file_upload_connector.py,sha256=v4P1Nqq3FBd7SqLp6T9BffM8QvtX-oDdV8RmRCeEn7M,8773
48
+ kumoai/connector/file_upload_connector.py,sha256=13dWWXd_RNosWNHmZYasHDsVfpDS9qVCIYeST-7zljA,7197
49
49
  kumoai/connector/glue_connector.py,sha256=kqT2q53Da7PeeaZrvLVzFXC186E7glh5eGitKL26lYY,4847
50
50
  kumoai/connector/s3_connector.py,sha256=AUzENbQ20bYXh3XOXEOsWRKlaGGkm3YrW9JfBLm-LqY,10433
51
51
  kumoai/connector/snowflake_connector.py,sha256=tQzIWxC4oDGqxFt0212w5eoIPT4QBP2nuF9SdKRNwNI,9274
52
52
  kumoai/connector/source_table.py,sha256=fnqwIKY6qYo4G0EsRzchb6FgZ-dQyU6aRaD9UAxsml0,18010
53
- kumoai/connector/utils.py,sha256=8zCLXNMQa45aInc0HZq-ADGGwSrzQPwn0CTBIanGIec,23017
53
+ kumoai/connector/utils.py,sha256=SlkjPJS_wqfwFzIaQOHZtENQnbOz5sgLbvvvPDXE1ww,65786
54
54
  kumoai/encoder/__init__.py,sha256=8FeP6mUyCeXxr1b8kUIi5dxe5vEXQRft9tPoaV1CBqg,186
55
55
  kumoai/experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
- kumoai/experimental/rfm/__init__.py,sha256=miVZCXdMdGxtjSgOcBSUZ79bNZ6CMM0z3LOcv5zlDXs,1706
57
- kumoai/experimental/rfm/authenticate.py,sha256=qDgy_k0LoW5gy46TquQDqHiJa7WOlH-trNCE-BkSYKA,19237
58
- kumoai/experimental/rfm/local_graph.py,sha256=z_YWN729px4Q4GYcMaG5ShDbGUQkb7pXiEOG4dRGE-E,30365
59
- kumoai/experimental/rfm/local_graph_sampler.py,sha256=fyAAf2L2WZnre8WQw148V2PZN1ASNIR3CPUVAO8MpOg,6371
60
- kumoai/experimental/rfm/local_graph_store.py,sha256=1s7G6MNtCOicEH0L_xFzk5P8u-0_UC9LHmtSAuw-1JU,13614
61
- kumoai/experimental/rfm/local_pquery_driver.py,sha256=Q3yhqRxvNs5rEnV1FPNJab-mlMq1wKtJ53bxE2MHC8c,15575
62
- kumoai/experimental/rfm/local_table.py,sha256=94st0F0-1J78cXoypZmMA80J6L6Uuujzr6BloAn7aGQ,16676
63
- kumoai/experimental/rfm/rfm.py,sha256=G5KWPt490bvRGLCHlLX8OwA_mubp1BhPv2sZCY2ajyU,32062
56
+ kumoai/experimental/rfm/__init__.py,sha256=gpjpeN8PT3ZESi6kUaeyZqYnoJnysRVXDaY9hrycJA4,7020
57
+ kumoai/experimental/rfm/authenticate.py,sha256=G89_4TMeUpr5fG_0VTzMF5sdNhaciitA1oc2loTlTmo,19321
58
+ kumoai/experimental/rfm/local_graph.py,sha256=nZ9hDfyWg1dHFLoTEKoLt0ZJPvf9MUA1MNyfTRzJThg,30886
59
+ kumoai/experimental/rfm/local_graph_sampler.py,sha256=3JNpktW__nwxVKZxP4cQBgsIin7J_LNXYS7YlV36xbU,6854
60
+ kumoai/experimental/rfm/local_graph_store.py,sha256=eUuIMFcdIRqN1kRxnqOdJpKEt-S_oyupAyHr7YuQoSU,14206
61
+ kumoai/experimental/rfm/local_pquery_driver.py,sha256=Yd_yHIrvuDj16IC1pvsqiQvZS41vvOOCRMiuDGtN6Fk,26851
62
+ kumoai/experimental/rfm/local_table.py,sha256=5H08657TIyH7n_QnpFKr2g4BtVqdXTymmrfhSGaDmkU,20150
63
+ kumoai/experimental/rfm/rfm.py,sha256=R48eqqCvHin7Knms6sptsmAQSpMm2v-PlyPD3dxj6wY,49268
64
+ kumoai/experimental/rfm/sagemaker.py,sha256=eebpZtASqiIGF2FpY53bbWLj6p-u5hkK4RLgBNAvEzg,4953
64
65
  kumoai/experimental/rfm/utils.py,sha256=dLx2wdyTWg7vZI_7R-I0z_lA-2aV5M8h9n3bnnLyylI,11467
65
66
  kumoai/experimental/rfm/infer/__init__.py,sha256=fPsdDr4D3hgC8snW0j3pAVpCyR-xrauuogMnTOMrfok,304
66
67
  kumoai/experimental/rfm/infer/categorical.py,sha256=bqmfrE5ZCBTcb35lA4SyAkCu3MgttAn29VBJYMBNhVg,893
67
68
  kumoai/experimental/rfm/infer/id.py,sha256=xaJBETLZa8ttzZCsDwFSwfyCi3VYsLc_kDWT_t_6Ih4,954
68
69
  kumoai/experimental/rfm/infer/multicategorical.py,sha256=D-1KwYRkOSkBrOJr4Xa3eTCoAF9O9hPGa7Vg67V5_HU,1150
69
- kumoai/experimental/rfm/infer/timestamp.py,sha256=36SKjRNhyjNnfYd4_9_7vbzFxSx4z7GIbEt5tKVWszQ,954
70
- kumoai/experimental/rfm/pquery/__init__.py,sha256=XMpRh6-fahTU8XMXSxn8zbJQvYD1HkELh2su_YJvSmU,153
71
- kumoai/experimental/rfm/pquery/backend.py,sha256=mGbRdDcZxRGhFGz55bDHCICkEzsYRO3Gyj95QkzxpKY,3423
72
- kumoai/experimental/rfm/pquery/pandas_backend.py,sha256=SBN4oUq2KrszxMrxKy5tOmY_UNJHUMg8PC0pnYp9a2s,15830
70
+ kumoai/experimental/rfm/infer/timestamp.py,sha256=L2VxjtYTSyUBYAo4M-L08xSQlPpqnHMAVF5_vxjh3Y0,1135
71
+ kumoai/experimental/rfm/pquery/__init__.py,sha256=RkTn0I74uXOUuOiBpa6S-_QEYctMutkUnBEfF9ztQzI,159
72
+ kumoai/experimental/rfm/pquery/executor.py,sha256=S8wwXbAkH-YSnmEVYB8d6wyJF4JJ003mH_0zFTvOp_I,2843
73
+ kumoai/experimental/rfm/pquery/pandas_executor.py,sha256=QQpOZ_ArH3eSAkenaY3J-gW1Wn5A7f85RiqZxaO5u1Q,19019
73
74
  kumoai/graph/__init__.py,sha256=QGk3OMwRzQJSGESdcc7hcQH6UDmNVJYTdqnRren4c7Q,240
74
75
  kumoai/graph/column.py,sha256=cQhioibTbIKIBZ-bf8-Bt4F4Iblhidps-CYWrkxRPnE,4295
75
76
  kumoai/graph/graph.py,sha256=Pq-dxi4MwoDtrrwm3xeyUB9Hl7ryNfHq4rMHuvyNB3c,39239
@@ -85,14 +86,14 @@ kumoai/trainer/baseline_trainer.py,sha256=oXweh8j1sar6KhQfr3A7gmQxcDq7SG0Bx3jIen
85
86
  kumoai/trainer/config.py,sha256=7_Jv1w1mqaokCQwQdJkqCSgVpmh8GqE3fL1Ky_vvttI,100
86
87
  kumoai/trainer/job.py,sha256=IBP2SeIk21XpRK1Um1NIs2dEKid319cHu6UkCjKO6jc,46130
87
88
  kumoai/trainer/online_serving.py,sha256=T1jicl-qXiiWGQWUCwlfQsyxWUODybj_975gx9yglH4,9824
88
- kumoai/trainer/trainer.py,sha256=J3PrMBqh5B1sarpJ0FXaC26hrAQWycmOfWwKmpPqkgI,19972
89
+ kumoai/trainer/trainer.py,sha256=AKumc3X2Vm3qxZSA85Dv_fSLC4JQ3rM7P0ixOWbEex0,20608
89
90
  kumoai/trainer/util.py,sha256=LCXkY5MNl6NbEVd2OZ0aVqF6fvr3KiCFh6pH0igAi_g,4165
90
91
  kumoai/utils/__init__.py,sha256=wAKgmwtMIGuiauW9D_GGKH95K-24Kgwmld27mm4nsro,278
91
92
  kumoai/utils/datasets.py,sha256=UyAII-oAn7x3ombuvpbSQ41aVF9SYKBjQthTD-vcT2A,3011
92
93
  kumoai/utils/forecasting.py,sha256=ZgKeUCbWLOot0giAkoigwU5du8LkrwAicFOi5hVn6wg,7624
93
- kumoai/utils/progress_logger.py,sha256=zuAld4fND-Swi4QMWI_I5hxygf6oTAHaMvq3kZcNNaI,3074
94
- kumoai-2.9.0.dev202509081831.dist-info/licenses/LICENSE,sha256=ZUilBDp--4vbhsEr6f_Upw9rnIx09zQ3K9fXQ0rfd6w,1111
95
- kumoai-2.9.0.dev202509081831.dist-info/METADATA,sha256=yraBRuws5vHqOC_dLGHKTpbETmPCU9tH2qXxQz6bRWI,2160
96
- kumoai-2.9.0.dev202509081831.dist-info/WHEEL,sha256=8UP9x9puWI0P1V_d7K2oMTBqfeLNm21CTzZ_Ptr0NXU,101
97
- kumoai-2.9.0.dev202509081831.dist-info/top_level.txt,sha256=YjU6UcmomoDx30vEXLsOU784ED7VztQOsFApk1SFwvs,7
98
- kumoai-2.9.0.dev202509081831.dist-info/RECORD,,
94
+ kumoai/utils/progress_logger.py,sha256=MZsWgHd4UZQKCXiJZgQeW-Emi_BmzlCKPLPXOL_HqBo,5239
95
+ kumoai-2.13.0.dev202511201731.dist-info/licenses/LICENSE,sha256=ZUilBDp--4vbhsEr6f_Upw9rnIx09zQ3K9fXQ0rfd6w,1111
96
+ kumoai-2.13.0.dev202511201731.dist-info/METADATA,sha256=c8hps_OyP34GN4NErG2wmhqzju6XfiMtpsrvahd5e9o,2544
97
+ kumoai-2.13.0.dev202511201731.dist-info/WHEEL,sha256=8UP9x9puWI0P1V_d7K2oMTBqfeLNm21CTzZ_Ptr0NXU,101
98
+ kumoai-2.13.0.dev202511201731.dist-info/top_level.txt,sha256=YjU6UcmomoDx30vEXLsOU784ED7VztQOsFApk1SFwvs,7
99
+ kumoai-2.13.0.dev202511201731.dist-info/RECORD,,