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.
- kumoai/__init__.py +10 -11
- kumoai/_version.py +1 -1
- kumoai/client/client.py +17 -16
- kumoai/client/endpoints.py +1 -0
- kumoai/client/rfm.py +37 -8
- kumoai/connector/file_upload_connector.py +71 -102
- kumoai/connector/utils.py +1367 -236
- kumoai/experimental/rfm/__init__.py +153 -10
- kumoai/experimental/rfm/authenticate.py +8 -5
- kumoai/experimental/rfm/infer/timestamp.py +7 -4
- kumoai/experimental/rfm/local_graph.py +90 -80
- kumoai/experimental/rfm/local_graph_sampler.py +16 -10
- kumoai/experimental/rfm/local_graph_store.py +22 -6
- kumoai/experimental/rfm/local_pquery_driver.py +336 -42
- kumoai/experimental/rfm/local_table.py +100 -22
- kumoai/experimental/rfm/pquery/__init__.py +4 -4
- kumoai/experimental/rfm/pquery/{backend.py → executor.py} +24 -58
- kumoai/experimental/rfm/pquery/{pandas_backend.py → pandas_executor.py} +278 -222
- kumoai/experimental/rfm/rfm.py +523 -124
- kumoai/experimental/rfm/sagemaker.py +130 -0
- kumoai/jobs.py +1 -0
- kumoai/kumolib.cp312-win_amd64.pyd +0 -0
- kumoai/spcs.py +1 -3
- kumoai/trainer/trainer.py +19 -10
- kumoai/utils/progress_logger.py +68 -0
- {kumoai-2.9.0.dev202509081831.dist-info → kumoai-2.13.0.dev202511201731.dist-info}/METADATA +13 -5
- {kumoai-2.9.0.dev202509081831.dist-info → kumoai-2.13.0.dev202511201731.dist-info}/RECORD +30 -29
- {kumoai-2.9.0.dev202509081831.dist-info → kumoai-2.13.0.dev202511201731.dist-info}/WHEEL +0 -0
- {kumoai-2.9.0.dev202509081831.dist-info → kumoai-2.13.0.dev202511201731.dist-info}/licenses/LICENSE +0 -0
- {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
|
-
|
|
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
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
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),
|
kumoai/utils/progress_logger.py
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
10
|
-
kumoai/kumolib.cp312-win_amd64.pyd,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
57
|
-
kumoai/experimental/rfm/authenticate.py,sha256=
|
|
58
|
-
kumoai/experimental/rfm/local_graph.py,sha256=
|
|
59
|
-
kumoai/experimental/rfm/local_graph_sampler.py,sha256=
|
|
60
|
-
kumoai/experimental/rfm/local_graph_store.py,sha256=
|
|
61
|
-
kumoai/experimental/rfm/local_pquery_driver.py,sha256=
|
|
62
|
-
kumoai/experimental/rfm/local_table.py,sha256=
|
|
63
|
-
kumoai/experimental/rfm/rfm.py,sha256=
|
|
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=
|
|
70
|
-
kumoai/experimental/rfm/pquery/__init__.py,sha256=
|
|
71
|
-
kumoai/experimental/rfm/pquery/
|
|
72
|
-
kumoai/experimental/rfm/pquery/
|
|
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=
|
|
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=
|
|
94
|
-
kumoai-2.
|
|
95
|
-
kumoai-2.
|
|
96
|
-
kumoai-2.
|
|
97
|
-
kumoai-2.
|
|
98
|
-
kumoai-2.
|
|
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,,
|
|
File without changes
|
{kumoai-2.9.0.dev202509081831.dist-info → kumoai-2.13.0.dev202511201731.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
{kumoai-2.9.0.dev202509081831.dist-info → kumoai-2.13.0.dev202511201731.dist-info}/top_level.txt
RENAMED
|
File without changes
|