kumoai 2.11.0.dev202510161830__py3-none-any.whl → 2.13.0.dev202511211730__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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/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
@@ -405,15 +404,15 @@ class Trainer:
405
404
  pred_table_data_path = prediction_table.table_data_uri
406
405
 
407
406
  api = global_state.client.batch_prediction_job_api
408
-
409
- from kumoai.pquery.predictive_query import PredictiveQuery
410
- pquery = PredictiveQuery.load_from_training_job(training_job_id)
411
- if pquery.get_task_type() == TaskType.BINARY_CLASSIFICATION:
412
- if binary_classification_threshold is None:
413
- logger.warning("No binary classification threshold provided. "
414
- "Using default threshold of 0.5.")
415
- binary_classification_threshold = 0.5
416
-
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
417
416
  job_id, response = api.maybe_create(
418
417
  BatchPredictionRequest(
419
418
  dict(custom_tags),
@@ -103,10 +103,13 @@ class InteractiveProgressLogger(ProgressLogger):
103
103
  self._progress.update(self._task, advance=1) # type: ignore
104
104
 
105
105
  def __enter__(self) -> Self:
106
+ from kumoai import in_notebook
107
+
106
108
  super().__enter__()
107
109
 
108
- sys.stdout.write("\x1b]9;4;3\x07")
109
- sys.stdout.flush()
110
+ if not in_notebook(): # Render progress bar in TUI.
111
+ sys.stdout.write("\x1b]9;4;3\x07")
112
+ sys.stdout.flush()
110
113
 
111
114
  if self.verbose:
112
115
  self._live = Live(
@@ -119,6 +122,8 @@ class InteractiveProgressLogger(ProgressLogger):
119
122
  return self
120
123
 
121
124
  def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
125
+ from kumoai import in_notebook
126
+
122
127
  super().__exit__(exc_type, exc_val, exc_tb)
123
128
 
124
129
  if exc_type is not None:
@@ -134,8 +139,9 @@ class InteractiveProgressLogger(ProgressLogger):
134
139
  self._live.stop()
135
140
  self._live = None
136
141
 
137
- sys.stdout.write("\x1b]9;4;0\x07")
138
- sys.stdout.flush()
142
+ if not in_notebook():
143
+ sys.stdout.write("\x1b]9;4;0\x07")
144
+ sys.stdout.flush()
139
145
 
140
146
  def __rich_console__(
141
147
  self,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kumoai
3
- Version: 2.11.0.dev202510161830
3
+ Version: 2.13.0.dev202511211730
4
4
  Summary: AI on the Modern Data Stack
5
5
  Author-email: "Kumo.AI" <hello@kumo.ai>
6
6
  License-Expression: MIT
@@ -23,11 +23,13 @@ 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.38.0
26
+ Requires-Dist: kumo-api==0.46.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
30
30
  Requires-Dist: rich>=9.0.0
31
+ Requires-Dist: mypy-boto3-sagemaker-runtime
32
+ Requires-Dist: boto3
31
33
  Provides-Extra: doc
32
34
  Requires-Dist: sphinx; extra == "doc"
33
35
  Requires-Dist: sphinx-book-theme; extra == "doc"
@@ -38,6 +40,13 @@ Provides-Extra: test
38
40
  Requires-Dist: pytest; extra == "test"
39
41
  Requires-Dist: pytest-mock; extra == "test"
40
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"
41
50
  Dynamic: license-file
42
51
  Dynamic: requires-dist
43
52
 
@@ -1,26 +1,26 @@
1
- kumoai/__init__.py,sha256=x3DjDsWBgWSNwo7mDwb3XAoRm2NuSO09yvhQTL9tBT8,10673
1
+ kumoai/__init__.py,sha256=L3yOOtpSdwe3PYQlJBLkiQd3Ypp8iB5ChXkzprk3Si4,10546
2
2
  kumoai/_logging.py,sha256=U2_5ROdyk92P4xO4H2WJV8EC7dr6YxmmnM-b7QX9M7I,886
3
3
  kumoai/_singleton.py,sha256=UTwrbDkoZSGB8ZelorvprPDDv9uZkUi1q_SrmsyngpQ,836
4
- kumoai/_version.py,sha256=PzfT12lcaP7nnPRxQtxhsoIZbGMxk-_NVKfyxjWKw6g,39
4
+ kumoai/_version.py,sha256=SG9nFVn5zQGjYC2bJHf14ClhCtvj0GzhN9puMBHh-sE,39
5
5
  kumoai/databricks.py,sha256=e6E4lOFvZHXFwh4CO1kXU1zzDU3AapLQYMxjiHPC-HQ,476
6
6
  kumoai/exceptions.py,sha256=b-_sdbAKOg50uaJZ65GmBLdTo4HANdjl8_R0sJpwaN0,833
7
7
  kumoai/formatting.py,sha256=jA_rLDCGKZI8WWCha-vtuLenVKTZvli99Tqpurz1H84,953
8
8
  kumoai/futures.py,sha256=oJFIfdCM_3nWIqQteBKYMY4fPhoYlYWE_JA2o6tx-ng,3737
9
9
  kumoai/jobs.py,sha256=NrdLEFNo7oeCYSy-kj2nAvCFrz9BZ_xrhkqHFHk5ksY,2496
10
10
  kumoai/mixin.py,sha256=MP413xzuCqWhxAPUHmloLA3j4ZyF1tEtfi516b_hOXQ,812
11
- kumoai/spcs.py,sha256=N4ddeoHAc4I3bKrDitsb91lUx5VKvCyPyMT3zWiuCcY,4275
11
+ kumoai/spcs.py,sha256=N31d7rLa-bgYh8e2J4YzX1ScxGLqiVXrqJnCl1y4Mts,4139
12
12
  kumoai/artifact_export/__init__.py,sha256=BsfDrc3mCHpO9-BqvqKm8qrXDIwfdaoH5UIoG4eQkc4,238
13
13
  kumoai/artifact_export/config.py,sha256=jOPDduduxv0uuB-7xVlDiZglfpmFF5lzQhhH1SMkGvw,8024
14
14
  kumoai/artifact_export/job.py,sha256=GEisSwvcjK_35RgOfsLXGgxMTXIWm765B_BW_Kgs-V0,3275
15
15
  kumoai/client/__init__.py,sha256=MkyOuMaHQ2c8GPxjBDQSVFhfRE2d2_6CXQ6rxj4ps4w,64
16
- kumoai/client/client.py,sha256=S1OfGDwTzoyf40fhg111xGQGNfEP-OnoXqFV6X9iMEc,8580
16
+ kumoai/client/client.py,sha256=Jda8V9yiu3LbhxlcgRWPeYi7eF6jzCKcq8-B_vEd1ik,8514
17
17
  kumoai/client/connector.py,sha256=x3i2aBTJTEMZvYRcWkY-UfWVOANZjqAso4GBbcshFjw,3920
18
- kumoai/client/endpoints.py,sha256=0VPeWgy2AEA1BD4zFB6DQaP4N2Ln2lPEnBIs_9fM1y4,5315
18
+ kumoai/client/endpoints.py,sha256=iF2ZD25AJCIVbmBJ8tTZ8y1Ch0m6nTp18ydN7h4WiTk,5382
19
19
  kumoai/client/graph.py,sha256=zvLEDExLT_RVbUMHqVl0m6tO6s2gXmYSoWmPF6YMlnA,3831
20
20
  kumoai/client/jobs.py,sha256=iu_Wrta6BQMlV6ZtzSnmhjwNPKDMQDXOsqVVIyWodqw,17074
21
21
  kumoai/client/online.py,sha256=pkBBh_DEC3GAnPcNw6bopNRlGe7EUbIFe7_seQqZRaw,2720
22
22
  kumoai/client/pquery.py,sha256=R2hc-M8vPoyIDH0ywLwFVxCznVAqpZz3w2HszjdNW-o,6891
23
- kumoai/client/rfm.py,sha256=15Wt_45mf7WJyCKylxF6_biHis9R_qmplPk9cwR9JeU,2918
23
+ kumoai/client/rfm.py,sha256=NxKk8mH2A-B58rSXhDWaph4KeiSyJYDq-RO-vAHh7es,3726
24
24
  kumoai/client/source_table.py,sha256=VCsCcM7KYcnjGP7HLTb-AOSEGEVsJTWjk8bMg1JdgPU,2101
25
25
  kumoai/client/table.py,sha256=cQG-RPm-e91idEgse1IPJDvBmzddIDGDkuyrR1rq4wU,3235
26
26
  kumoai/client/utils.py,sha256=lz1NubwMDHCwzQRowRXm7mjAoYRd5UjRQIwXdtWAl90,3849
@@ -52,23 +52,24 @@ kumoai/connector/source_table.py,sha256=QLT8bEYaxeMwy-b168url0VfnkTrs5K6VKLbxTI4
52
52
  kumoai/connector/utils.py,sha256=PUjunLpfqMZsrPDo2EmnyJRBl_mt-E6ugv2kNkf5Rn8,64011
53
53
  kumoai/encoder/__init__.py,sha256=VPGs4miBC_WfwWeOXeHhFomOUocERFavhKf5fqITcds,182
54
54
  kumoai/experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
- kumoai/experimental/rfm/__init__.py,sha256=F1aUOCLDN2yrIRDAiOlogDfXKUkUQgp8Mt0pVX9rLX8,1641
55
+ kumoai/experimental/rfm/__init__.py,sha256=wKfMKTxfuJNH1GCWGZ7-288HXil0tsCuXqg-BAFctZE,6812
56
56
  kumoai/experimental/rfm/authenticate.py,sha256=FiuHMvP7V3zBZUlHMDMbNLhc-UgDZgz4hjVSTuQ7DRw,18888
57
57
  kumoai/experimental/rfm/local_graph.py,sha256=2iJDlsGVzqCe1bD_puXWlhwGkn7YnQyJ4p4C-fwCZNE,30076
58
- kumoai/experimental/rfm/local_graph_sampler.py,sha256=o60_sdMa_fr60DrdmCIaE6lKQAD2msp1t-GGubFNt-o,6738
58
+ kumoai/experimental/rfm/local_graph_sampler.py,sha256=5DbhL9h0usFKSJfnx7HjLMPcG54qwJ48M2tmONqxXyY,6672
59
59
  kumoai/experimental/rfm/local_graph_store.py,sha256=8BqonuaMftAAsjgZpB369i5AeNd1PkisMbbEqc0cKBo,13847
60
- kumoai/experimental/rfm/local_pquery_driver.py,sha256=xqAQ9fJfkqM1axknFpg0NLQbIYmExh-s7vGdUyDEkwA,18600
60
+ kumoai/experimental/rfm/local_pquery_driver.py,sha256=aO7Jfwx9gxGKYvpqxZx1LLWdI1MhuZQOPtAITxoOQO0,26162
61
61
  kumoai/experimental/rfm/local_table.py,sha256=r8xZ33Mjs6JD8ud6h23tZ99Dag2DvZ4h6tWjmGrKQg4,19605
62
- kumoai/experimental/rfm/rfm.py,sha256=K5c8pmWe3lCO1J4EMZBZPgJQPcdsvBAyvmvrLsa1tVU,45519
62
+ kumoai/experimental/rfm/rfm.py,sha256=8SvGWfMuRYJgiz5OTplu7m47mDrHAjQ2mRZtRASnSCk,48136
63
+ kumoai/experimental/rfm/sagemaker.py,sha256=e0rRQ28WcgAk_ALqUyU20d193c8_68rCkSengZIHu3Y,4823
63
64
  kumoai/experimental/rfm/utils.py,sha256=3IiBvT_aLBkkcJh3H11_50yt_XlEzHR0cm9Kprrtl8k,11123
64
65
  kumoai/experimental/rfm/infer/__init__.py,sha256=xQ8_SuejIzXyn2J7bIKX3pXumFtRuEfBtE5oEDUDJjI,293
65
66
  kumoai/experimental/rfm/infer/categorical.py,sha256=VwNaKwKbRYkTxEJ1R6gziffC8dGsEThcDEfbi-KqW5c,853
66
67
  kumoai/experimental/rfm/infer/id.py,sha256=ZIO0DWIoiEoS_8MVc5lkqBfkTWWQ0yGCgjkwLdaYa_Q,908
67
68
  kumoai/experimental/rfm/infer/multicategorical.py,sha256=0-cLpDnGryhr76QhZNO-klKokJ6MUSfxXcGdQ61oykY,1102
68
69
  kumoai/experimental/rfm/infer/timestamp.py,sha256=vM9--7eStzaGG13Y-oLYlpNJyhL6f9dp17HDXwtl_DM,1094
69
- kumoai/experimental/rfm/pquery/__init__.py,sha256=bsNcdn7DnPw9kpSQ_bQVmQX1RmXzPQhzfA1y6G-n7I8,146
70
- kumoai/experimental/rfm/pquery/backend.py,sha256=6wtB0yFpxQUraBSA2TbKMVSIMD0dcLwYV5P4SQx2g_k,3287
71
- kumoai/experimental/rfm/pquery/pandas_backend.py,sha256=pgHCErSo6U-KJMhgIYijYt96uubtFB2WtsrTdLU7NYc,15396
70
+ kumoai/experimental/rfm/pquery/__init__.py,sha256=X0O3EIq5SMfBEE-ii5Cq6iDhR3s3XMXB52Cx5htoePw,152
71
+ kumoai/experimental/rfm/pquery/executor.py,sha256=f7-pJhL0BgFU9E4o4gQpQyArOvyrZtwxFmks34-QOAE,2741
72
+ kumoai/experimental/rfm/pquery/pandas_executor.py,sha256=kiBJq7uVGbasG7TiqsubEl6ey3UYzZiM4bwxILqp_54,18487
72
73
  kumoai/graph/__init__.py,sha256=n8X4X8luox4hPBHTRC9R-3JzvYYMoR8n7lF1H4w4Hzc,228
73
74
  kumoai/graph/column.py,sha256=t7wBmcx0VYKXjIoESU9Nq-AisiJOdlqd80t8zby1R8Y,4189
74
75
  kumoai/graph/graph.py,sha256=iyp4klPIMn2ttuEqMJvsrxKb_tmz_DTnvziIhCegduM,38291
@@ -84,14 +85,14 @@ kumoai/trainer/baseline_trainer.py,sha256=LlfViNOmswNv4c6zJJLsyv0pC2mM2WKMGYx06o
84
85
  kumoai/trainer/config.py,sha256=-2RfK10AsVVThSyfWtlyfH4Fc4EwTdu0V3yrDRtIOjk,98
85
86
  kumoai/trainer/job.py,sha256=Wk69nzFhbvuA3nEvtCstI04z5CxkgvQ6tHnGchE0Lkg,44938
86
87
  kumoai/trainer/online_serving.py,sha256=9cddb5paeZaCgbUeceQdAOxysCtV5XP-KcsgFz_XR5w,9566
87
- kumoai/trainer/trainer.py,sha256=nPeZMMp17TtRFd4lKbF-TlMPnhYR4_VyPDPI0T9W9PU,20094
88
+ kumoai/trainer/trainer.py,sha256=hBXO7gwpo3t59zKFTeIkK65B8QRmWCwO33sbDuEAPlY,20133
88
89
  kumoai/trainer/util.py,sha256=bDPGkMF9KOy4HgtA-OwhXP17z9cbrfMnZGtyGuUq_Eo,4062
89
90
  kumoai/utils/__init__.py,sha256=wGDC_31XJ-7ipm6eawjLAJaP4EfmtNOH8BHzaetQ9Ko,268
90
91
  kumoai/utils/datasets.py,sha256=ptKIUoBONVD55pTVNdRCkQT3NWdN_r9UAUu4xewPa3U,2928
91
92
  kumoai/utils/forecasting.py,sha256=-nDS6ucKNfQhTQOfebjefj0wwWH3-KYNslIomxwwMBM,7415
92
- kumoai/utils/progress_logger.py,sha256=jHAS_iDD008VSa_P_XzJsRS6TVIXviK017KE5ict-4M,4875
93
- kumoai-2.11.0.dev202510161830.dist-info/licenses/LICENSE,sha256=TbWlyqRmhq9PEzCaTI0H0nWLQCCOywQM8wYH8MbjfLo,1102
94
- kumoai-2.11.0.dev202510161830.dist-info/METADATA,sha256=46Ezb1DiZ0YHZTstKbuVOcZTgabzscokKOsOqSE9Uho,2052
95
- kumoai-2.11.0.dev202510161830.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
96
- kumoai-2.11.0.dev202510161830.dist-info/top_level.txt,sha256=YjU6UcmomoDx30vEXLsOU784ED7VztQOsFApk1SFwvs,7
97
- kumoai-2.11.0.dev202510161830.dist-info/RECORD,,
93
+ kumoai/utils/progress_logger.py,sha256=pngEGzMHkiOUKOa6fbzxCEc2xlA4SJKV4TDTVVoqObM,5062
94
+ kumoai-2.13.0.dev202511211730.dist-info/licenses/LICENSE,sha256=TbWlyqRmhq9PEzCaTI0H0nWLQCCOywQM8wYH8MbjfLo,1102
95
+ kumoai-2.13.0.dev202511211730.dist-info/METADATA,sha256=S4KjjwNYqtLxfkX6vqdiOoo-iUPcfoXnKGJif23K9jU,2475
96
+ kumoai-2.13.0.dev202511211730.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
97
+ kumoai-2.13.0.dev202511211730.dist-info/top_level.txt,sha256=YjU6UcmomoDx30vEXLsOU784ED7VztQOsFApk1SFwvs,7
98
+ kumoai-2.13.0.dev202511211730.dist-info/RECORD,,