pixeltable 0.3.12__py3-none-any.whl → 0.3.13__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.
Potentially problematic release.
This version of pixeltable might be problematic. Click here for more details.
- pixeltable/__init__.py +1 -26
- pixeltable/__version__.py +2 -2
- pixeltable/catalog/insertable_table.py +11 -0
- pixeltable/catalog/table.py +20 -35
- pixeltable/catalog/view.py +31 -0
- pixeltable/dataframe.py +2 -2
- pixeltable/exceptions.py +20 -2
- pixeltable/exec/expr_eval/evaluators.py +0 -4
- pixeltable/exec/expr_eval/expr_eval_node.py +0 -1
- pixeltable/exec/sql_node.py +3 -2
- pixeltable/func/udf.py +1 -1
- pixeltable/functions/__init__.py +1 -0
- pixeltable/functions/anthropic.py +1 -1
- pixeltable/functions/bedrock.py +130 -0
- pixeltable/functions/huggingface.py +7 -6
- pixeltable/functions/image.py +15 -16
- pixeltable/functions/mistralai.py +3 -2
- pixeltable/functions/openai.py +9 -8
- pixeltable/functions/together.py +4 -3
- pixeltable/io/datarows.py +4 -3
- pixeltable/io/label_studio.py +17 -17
- pixeltable/io/pandas.py +13 -12
- pixeltable/io/table_data_conduit.py +8 -2
- pixeltable/metadata/converters/convert_19.py +2 -2
- pixeltable/share/packager.py +1 -1
- {pixeltable-0.3.12.dist-info → pixeltable-0.3.13.dist-info}/METADATA +1 -1
- {pixeltable-0.3.12.dist-info → pixeltable-0.3.13.dist-info}/RECORD +30 -29
- {pixeltable-0.3.12.dist-info → pixeltable-0.3.13.dist-info}/WHEEL +1 -1
- {pixeltable-0.3.12.dist-info → pixeltable-0.3.13.dist-info}/LICENSE +0 -0
- {pixeltable-0.3.12.dist-info → pixeltable-0.3.13.dist-info}/entry_points.txt +0 -0
pixeltable/__init__.py
CHANGED
|
@@ -24,32 +24,7 @@ from .globals import (
|
|
|
24
24
|
tool,
|
|
25
25
|
tools,
|
|
26
26
|
)
|
|
27
|
-
from .type_system import
|
|
28
|
-
Array,
|
|
29
|
-
ArrayType,
|
|
30
|
-
Audio,
|
|
31
|
-
AudioType,
|
|
32
|
-
Bool,
|
|
33
|
-
BoolType,
|
|
34
|
-
ColumnType,
|
|
35
|
-
Document,
|
|
36
|
-
DocumentType,
|
|
37
|
-
Float,
|
|
38
|
-
FloatType,
|
|
39
|
-
Image,
|
|
40
|
-
ImageType,
|
|
41
|
-
Int,
|
|
42
|
-
IntType,
|
|
43
|
-
Json,
|
|
44
|
-
JsonType,
|
|
45
|
-
Required,
|
|
46
|
-
String,
|
|
47
|
-
StringType,
|
|
48
|
-
Timestamp,
|
|
49
|
-
TimestampType,
|
|
50
|
-
Video,
|
|
51
|
-
VideoType,
|
|
52
|
-
)
|
|
27
|
+
from .type_system import Array, Audio, Bool, Document, Float, Image, Int, Json, Required, String, Timestamp, Video
|
|
53
28
|
|
|
54
29
|
# This import must go last to avoid circular imports.
|
|
55
30
|
from . import ext, functions, io, iterators # isort: skip
|
pixeltable/__version__.py
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
# These version placeholders will be replaced during build.
|
|
2
|
-
__version__ = '0.3.
|
|
3
|
-
__version_tuple__ = (0, 3,
|
|
2
|
+
__version__ = '0.3.13'
|
|
3
|
+
__version_tuple__ = (0, 3, 13)
|
|
@@ -228,3 +228,14 @@ class InsertableTable(Table):
|
|
|
228
228
|
"""
|
|
229
229
|
with Env.get().begin_xact():
|
|
230
230
|
return self._tbl_version.get().delete(where=where)
|
|
231
|
+
|
|
232
|
+
@property
|
|
233
|
+
def _base_table(self) -> Optional['Table']:
|
|
234
|
+
return None
|
|
235
|
+
|
|
236
|
+
@property
|
|
237
|
+
def _effective_base_versions(self) -> list[Optional[int]]:
|
|
238
|
+
return []
|
|
239
|
+
|
|
240
|
+
def _table_descriptor(self) -> str:
|
|
241
|
+
return f'Table {self._path()!r}'
|
pixeltable/catalog/table.py
CHANGED
|
@@ -109,7 +109,7 @@ class Table(SchemaObject):
|
|
|
109
109
|
self._check_is_dropped()
|
|
110
110
|
with env.Env.get().begin_xact():
|
|
111
111
|
md = super().get_metadata()
|
|
112
|
-
md['base'] = self.
|
|
112
|
+
md['base'] = self._base_table._path() if self._base_table is not None else None
|
|
113
113
|
md['schema'] = self._schema
|
|
114
114
|
md['is_replica'] = self._tbl_version.get().is_replica
|
|
115
115
|
md['version'] = self._version
|
|
@@ -255,28 +255,27 @@ class Table(SchemaObject):
|
|
|
255
255
|
return {c.name: c.col_type for c in self._tbl_version_path.columns()}
|
|
256
256
|
|
|
257
257
|
@property
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
The base
|
|
261
|
-
|
|
262
|
-
"""
|
|
263
|
-
if self._tbl_version_path.base is None:
|
|
264
|
-
return None
|
|
265
|
-
base_id = self._tbl_version_path.base.tbl_version.id
|
|
266
|
-
return catalog.Catalog.get().get_table_by_id(base_id)
|
|
258
|
+
@abc.abstractmethod
|
|
259
|
+
def _base_table(self) -> Optional['Table']:
|
|
260
|
+
"""The base's Table instance"""
|
|
261
|
+
...
|
|
267
262
|
|
|
268
263
|
@property
|
|
269
|
-
def
|
|
270
|
-
"""
|
|
271
|
-
The ancestor list of bases of this table, starting with its immediate base.
|
|
272
|
-
"""
|
|
264
|
+
def _base_tables(self) -> list['Table']:
|
|
265
|
+
"""The ancestor list of bases of this table, starting with its immediate base."""
|
|
273
266
|
bases = []
|
|
274
|
-
base = self.
|
|
267
|
+
base = self._base_table
|
|
275
268
|
while base is not None:
|
|
276
269
|
bases.append(base)
|
|
277
|
-
base = base.
|
|
270
|
+
base = base._base_table
|
|
278
271
|
return bases
|
|
279
272
|
|
|
273
|
+
@property
|
|
274
|
+
@abc.abstractmethod
|
|
275
|
+
def _effective_base_versions(self) -> list[Optional[int]]:
|
|
276
|
+
"""The effective versions of the ancestor bases, starting with its immediate base."""
|
|
277
|
+
...
|
|
278
|
+
|
|
280
279
|
@property
|
|
281
280
|
def _comment(self) -> str:
|
|
282
281
|
return self._tbl_version.get().comment
|
|
@@ -300,7 +299,7 @@ class Table(SchemaObject):
|
|
|
300
299
|
Constructs a list of descriptors for this table that can be pretty-printed.
|
|
301
300
|
"""
|
|
302
301
|
helper = DescriptionHelper()
|
|
303
|
-
helper.append(self.
|
|
302
|
+
helper.append(self._table_descriptor())
|
|
304
303
|
helper.append(self._col_descriptor())
|
|
305
304
|
idxs = self._index_descriptor()
|
|
306
305
|
if not idxs.empty:
|
|
@@ -312,14 +311,8 @@ class Table(SchemaObject):
|
|
|
312
311
|
helper.append(f'COMMENT: {self._comment}')
|
|
313
312
|
return helper
|
|
314
313
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
if self._base is None:
|
|
318
|
-
title = f'Table\n{self._path()!r}'
|
|
319
|
-
else:
|
|
320
|
-
title = f'View\n{self._path()!r}'
|
|
321
|
-
title += f'\n(of {self.__bases_to_desc()})'
|
|
322
|
-
return title
|
|
314
|
+
@abc.abstractmethod
|
|
315
|
+
def _table_descriptor(self) -> str: ...
|
|
323
316
|
|
|
324
317
|
def _col_descriptor(self, columns: Optional[list[str]] = None) -> pd.DataFrame:
|
|
325
318
|
return pd.DataFrame(
|
|
@@ -332,14 +325,6 @@ class Table(SchemaObject):
|
|
|
332
325
|
if columns is None or col.name in columns
|
|
333
326
|
)
|
|
334
327
|
|
|
335
|
-
def __bases_to_desc(self) -> str:
|
|
336
|
-
bases = self._bases
|
|
337
|
-
assert len(bases) >= 1
|
|
338
|
-
if len(bases) <= 2:
|
|
339
|
-
return ', '.join(repr(b._path()) for b in bases)
|
|
340
|
-
else:
|
|
341
|
-
return f'{bases[0]._path()!r}, ..., {bases[-1]._path()!r}'
|
|
342
|
-
|
|
343
328
|
def _index_descriptor(self, columns: Optional[list[str]] = None) -> pd.DataFrame:
|
|
344
329
|
from pixeltable import index
|
|
345
330
|
|
|
@@ -373,9 +358,9 @@ class Table(SchemaObject):
|
|
|
373
358
|
"""
|
|
374
359
|
self._check_is_dropped()
|
|
375
360
|
if getattr(builtins, '__IPYTHON__', False):
|
|
376
|
-
from IPython.display import display
|
|
361
|
+
from IPython.display import Markdown, display
|
|
377
362
|
|
|
378
|
-
display(self._repr_html_())
|
|
363
|
+
display(Markdown(self._repr_html_()))
|
|
379
364
|
else:
|
|
380
365
|
print(repr(self))
|
|
381
366
|
|
pixeltable/catalog/view.py
CHANGED
|
@@ -267,3 +267,34 @@ class View(Table):
|
|
|
267
267
|
|
|
268
268
|
def delete(self, where: Optional[exprs.Expr] = None) -> UpdateStatus:
|
|
269
269
|
raise excs.Error(f'{self._display_name()} {self._name!r}: cannot delete from view')
|
|
270
|
+
|
|
271
|
+
@property
|
|
272
|
+
def _base_table(self) -> Optional['Table']:
|
|
273
|
+
# if this is a pure snapshot, our tbl_version_path only reflects the base (there is no TableVersion instance
|
|
274
|
+
# for the snapshot itself)
|
|
275
|
+
base_id = self._tbl_version.id if self._snapshot_only else self._tbl_version_path.base.tbl_version.id
|
|
276
|
+
return catalog.Catalog.get().get_table_by_id(base_id)
|
|
277
|
+
|
|
278
|
+
@property
|
|
279
|
+
def _effective_base_versions(self) -> list[Optional[int]]:
|
|
280
|
+
effective_versions = [tv.effective_version for tv in self._tbl_version_path.get_tbl_versions()]
|
|
281
|
+
if self._snapshot_only:
|
|
282
|
+
return effective_versions
|
|
283
|
+
else:
|
|
284
|
+
return effective_versions[1:]
|
|
285
|
+
|
|
286
|
+
def _table_descriptor(self) -> str:
|
|
287
|
+
display_name = 'Snapshot' if self._snapshot_only else 'View'
|
|
288
|
+
result = [f'{display_name} {self._path()!r}']
|
|
289
|
+
bases_descrs: list[str] = []
|
|
290
|
+
for base, effective_version in zip(self._base_tables, self._effective_base_versions):
|
|
291
|
+
if effective_version is None:
|
|
292
|
+
bases_descrs.append(f'{base._path()!r}')
|
|
293
|
+
else:
|
|
294
|
+
base_descr = f'{base._path()}:{effective_version}'
|
|
295
|
+
bases_descrs.append(f'{base_descr!r}')
|
|
296
|
+
result.append(f' (of {", ".join(bases_descrs)})')
|
|
297
|
+
|
|
298
|
+
if self._tbl_version.get().predicate is not None:
|
|
299
|
+
result.append(f'\nWhere: {self._tbl_version.get().predicate!s}')
|
|
300
|
+
return ''.join(result)
|
pixeltable/dataframe.py
CHANGED
|
@@ -513,9 +513,9 @@ class DataFrame:
|
|
|
513
513
|
(select list, where clause, ...) vertically.
|
|
514
514
|
"""
|
|
515
515
|
if getattr(builtins, '__IPYTHON__', False):
|
|
516
|
-
from IPython.display import display
|
|
516
|
+
from IPython.display import Markdown, display
|
|
517
517
|
|
|
518
|
-
display(self._repr_html_())
|
|
518
|
+
display(Markdown(self._repr_html_()))
|
|
519
519
|
else:
|
|
520
520
|
print(repr(self))
|
|
521
521
|
|
pixeltable/exceptions.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
1
|
from types import TracebackType
|
|
3
2
|
from typing import TYPE_CHECKING, Any
|
|
4
3
|
|
|
@@ -10,7 +9,6 @@ class Error(Exception):
|
|
|
10
9
|
pass
|
|
11
10
|
|
|
12
11
|
|
|
13
|
-
@dataclass
|
|
14
12
|
class ExprEvalError(Exception):
|
|
15
13
|
expr: 'exprs.Expr'
|
|
16
14
|
expr_msg: str
|
|
@@ -19,6 +17,26 @@ class ExprEvalError(Exception):
|
|
|
19
17
|
input_vals: list[Any]
|
|
20
18
|
row_num: int
|
|
21
19
|
|
|
20
|
+
def __init__(
|
|
21
|
+
self,
|
|
22
|
+
expr: 'exprs.Expr',
|
|
23
|
+
expr_msg: str,
|
|
24
|
+
exc: Exception,
|
|
25
|
+
exc_tb: TracebackType,
|
|
26
|
+
input_vals: list[Any],
|
|
27
|
+
row_num: int,
|
|
28
|
+
) -> None:
|
|
29
|
+
exct = type(exc)
|
|
30
|
+
super().__init__(
|
|
31
|
+
f'Expression evaluation failed with an error of type `{exct.__module__}.{exct.__qualname__}`:\n{expr}'
|
|
32
|
+
)
|
|
33
|
+
self.expr = expr
|
|
34
|
+
self.expr_msg = expr_msg
|
|
35
|
+
self.exc = exc
|
|
36
|
+
self.exc_tb = exc_tb
|
|
37
|
+
self.input_vals = input_vals
|
|
38
|
+
self.row_num = row_num
|
|
39
|
+
|
|
22
40
|
|
|
23
41
|
class PixeltableWarning(Warning):
|
|
24
42
|
pass
|
|
@@ -208,10 +208,6 @@ class FnCallEvaluator(Evaluator):
|
|
|
208
208
|
_logger.debug(f'Evaluated slot {self.fn_call.slot_idx} in {end_ts - start_ts}')
|
|
209
209
|
self.dispatcher.dispatch([call_args.row], self.exec_ctx)
|
|
210
210
|
except Exception as exc:
|
|
211
|
-
import anthropic
|
|
212
|
-
|
|
213
|
-
if isinstance(exc, anthropic.RateLimitError):
|
|
214
|
-
_logger.debug(f'RateLimitError: {exc}')
|
|
215
211
|
_, _, exc_tb = sys.exc_info()
|
|
216
212
|
call_args.row.set_exc(self.fn_call.slot_idx, exc)
|
|
217
213
|
self.dispatcher.dispatch_exc(call_args.rows, self.fn_call.slot_idx, exc_tb, self.exec_ctx)
|
|
@@ -282,7 +282,6 @@ class ExprEvalNode(ExecNode):
|
|
|
282
282
|
|
|
283
283
|
if self.exc_event.is_set():
|
|
284
284
|
# we got an exception that we need to propagate through __iter__()
|
|
285
|
-
_logger.debug(f'Propagating exception {self.error}')
|
|
286
285
|
if isinstance(self.error, excs.ExprEvalError):
|
|
287
286
|
raise self.error from self.error.exc
|
|
288
287
|
else:
|
pixeltable/exec/sql_node.py
CHANGED
|
@@ -424,6 +424,7 @@ class SqlAggregationNode(SqlNode):
|
|
|
424
424
|
"""
|
|
425
425
|
|
|
426
426
|
group_by_items: Optional[list[exprs.Expr]]
|
|
427
|
+
input_cte: Optional[sql.CTE]
|
|
427
428
|
|
|
428
429
|
def __init__(
|
|
429
430
|
self,
|
|
@@ -440,13 +441,13 @@ class SqlAggregationNode(SqlNode):
|
|
|
440
441
|
group_by_items: list of expressions to group by
|
|
441
442
|
limit: max number of rows to return: None = no limit
|
|
442
443
|
"""
|
|
443
|
-
|
|
444
|
+
self.input_cte, input_col_map = input.to_cte()
|
|
444
445
|
sql_elements = exprs.SqlElementCache(input_col_map)
|
|
445
446
|
super().__init__(None, row_builder, select_list, sql_elements)
|
|
446
447
|
self.group_by_items = group_by_items
|
|
447
448
|
|
|
448
449
|
def _create_stmt(self) -> sql.Select:
|
|
449
|
-
stmt = super()._create_stmt()
|
|
450
|
+
stmt = super()._create_stmt().select_from(self.input_cte)
|
|
450
451
|
if self.group_by_items is not None:
|
|
451
452
|
sql_group_by_items = [self.sql_elements.get(e) for e in self.group_by_items]
|
|
452
453
|
assert all(e is not None for e in sql_group_by_items)
|
pixeltable/func/udf.py
CHANGED
|
@@ -262,7 +262,7 @@ def from_table(
|
|
|
262
262
|
"""
|
|
263
263
|
from pixeltable import exprs
|
|
264
264
|
|
|
265
|
-
ancestors = [tbl, *tbl.
|
|
265
|
+
ancestors = [tbl, *tbl._base_tables]
|
|
266
266
|
ancestors.reverse() # We must traverse the ancestors in order from base to derived
|
|
267
267
|
|
|
268
268
|
subst: dict[exprs.Expr, exprs.Expr] = {}
|
pixeltable/functions/__init__.py
CHANGED
|
@@ -112,7 +112,7 @@ async def messages(
|
|
|
112
112
|
to an existing Pixeltable column `tbl.prompt` of the table `tbl`:
|
|
113
113
|
|
|
114
114
|
>>> msgs = [{'role': 'user', 'content': tbl.prompt}]
|
|
115
|
-
... tbl.add_computed_column(response=
|
|
115
|
+
... tbl.add_computed_column(response=messages(msgs, model='claude-3-haiku-20240307'))
|
|
116
116
|
"""
|
|
117
117
|
|
|
118
118
|
# it doesn't look like count_tokens() actually exists in the current version of the library
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
3
|
+
|
|
4
|
+
import pixeltable as pxt
|
|
5
|
+
from pixeltable import env, exprs
|
|
6
|
+
from pixeltable.func import Tools
|
|
7
|
+
from pixeltable.utils.code import local_public_names
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from botocore.client import BaseClient
|
|
11
|
+
|
|
12
|
+
_logger = logging.getLogger('pixeltable')
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@env.register_client('bedrock')
|
|
16
|
+
def _() -> 'BaseClient':
|
|
17
|
+
import boto3
|
|
18
|
+
|
|
19
|
+
return boto3.client(service_name='bedrock-runtime')
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# boto3 typing is weird; type information is dynamically defined, so the best we can do for the static checker is `Any`
|
|
23
|
+
def _bedrock_client() -> Any:
|
|
24
|
+
return env.Env.get().get_client('bedrock')
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@pxt.udf
|
|
28
|
+
def converse(
|
|
29
|
+
messages: list[dict[str, Any]],
|
|
30
|
+
*,
|
|
31
|
+
model_id: str,
|
|
32
|
+
system: Optional[list[dict[str, Any]]] = None,
|
|
33
|
+
inference_config: Optional[dict] = None,
|
|
34
|
+
additional_model_request_fields: Optional[dict] = None,
|
|
35
|
+
tool_config: Optional[list[dict]] = None,
|
|
36
|
+
) -> dict:
|
|
37
|
+
"""
|
|
38
|
+
Generate a conversation response.
|
|
39
|
+
|
|
40
|
+
Equivalent to the AWS Bedrock `converse` API endpoint.
|
|
41
|
+
For additional details, see: <https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html>
|
|
42
|
+
|
|
43
|
+
__Requirements:__
|
|
44
|
+
|
|
45
|
+
- `pip install boto3`
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
messages: Input messages.
|
|
49
|
+
model_id: The model that will complete your prompt.
|
|
50
|
+
system: An optional system prompt.
|
|
51
|
+
inference_config: Base inference parameters to use.
|
|
52
|
+
additional_model_request_fields: Additional inference parameters to use.
|
|
53
|
+
|
|
54
|
+
For details on the optional parameters, see:
|
|
55
|
+
<https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html>
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
A dictionary containing the response and other metadata.
|
|
59
|
+
|
|
60
|
+
Examples:
|
|
61
|
+
Add a computed column that applies the model `anthropic.claude-3-haiku-20240307-v1:0`
|
|
62
|
+
to an existing Pixeltable column `tbl.prompt` of the table `tbl`:
|
|
63
|
+
|
|
64
|
+
>>> msgs = [{'role': 'user', 'content': [{'text': tbl.prompt}]}]
|
|
65
|
+
... tbl.add_computed_column(response=messages(msgs, model_id='anthropic.claude-3-haiku-20240307-v1:0'))
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
kwargs: dict[str, Any] = {'messages': messages, 'modelId': model_id}
|
|
69
|
+
|
|
70
|
+
if system is not None:
|
|
71
|
+
kwargs['system'] = system
|
|
72
|
+
if inference_config is not None:
|
|
73
|
+
kwargs['inferenceConfig'] = inference_config
|
|
74
|
+
if additional_model_request_fields is not None:
|
|
75
|
+
kwargs['additionalModelRequestFields'] = additional_model_request_fields
|
|
76
|
+
|
|
77
|
+
if tool_config is not None:
|
|
78
|
+
tool_config_ = {
|
|
79
|
+
'tools': [
|
|
80
|
+
{
|
|
81
|
+
'toolSpec': {
|
|
82
|
+
'name': tool['name'],
|
|
83
|
+
'description': tool['description'],
|
|
84
|
+
'inputSchema': {
|
|
85
|
+
'json': {
|
|
86
|
+
'type': 'object',
|
|
87
|
+
'properties': tool['parameters']['properties'],
|
|
88
|
+
'required': tool['required'],
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
for tool in tool_config
|
|
94
|
+
]
|
|
95
|
+
}
|
|
96
|
+
kwargs['toolConfig'] = tool_config_
|
|
97
|
+
|
|
98
|
+
return _bedrock_client().converse(**kwargs)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def invoke_tools(tools: Tools, response: exprs.Expr) -> exprs.InlineDict:
|
|
102
|
+
"""Converts an Anthropic response dict to Pixeltable tool invocation format and calls `tools._invoke()`."""
|
|
103
|
+
return tools._invoke(_bedrock_response_to_pxt_tool_calls(response))
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@pxt.udf
|
|
107
|
+
def _bedrock_response_to_pxt_tool_calls(response: dict) -> Optional[dict]:
|
|
108
|
+
if response.get('stopReason') != 'tool_use':
|
|
109
|
+
return None
|
|
110
|
+
|
|
111
|
+
pxt_tool_calls: dict[str, list[dict[str, Any]]] = {}
|
|
112
|
+
for message in response['output']['message']['content']:
|
|
113
|
+
if 'toolUse' in message:
|
|
114
|
+
tool_call = message['toolUse']
|
|
115
|
+
tool_name = tool_call['name']
|
|
116
|
+
if tool_name not in pxt_tool_calls:
|
|
117
|
+
pxt_tool_calls[tool_name] = []
|
|
118
|
+
pxt_tool_calls[tool_name].append({'args': tool_call['input']})
|
|
119
|
+
|
|
120
|
+
if len(pxt_tool_calls) == 0:
|
|
121
|
+
return None
|
|
122
|
+
|
|
123
|
+
return pxt_tool_calls
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
__all__ = local_public_names(__name__)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def __dir__() -> list[str]:
|
|
130
|
+
return __all__
|
|
@@ -13,6 +13,7 @@ import PIL.Image
|
|
|
13
13
|
|
|
14
14
|
import pixeltable as pxt
|
|
15
15
|
import pixeltable.exceptions as excs
|
|
16
|
+
import pixeltable.type_system as ts
|
|
16
17
|
from pixeltable import env
|
|
17
18
|
from pixeltable.func import Batch
|
|
18
19
|
from pixeltable.functions.util import normalize_image_mode, resolve_torch_device
|
|
@@ -61,14 +62,14 @@ def sentence_transformer(
|
|
|
61
62
|
|
|
62
63
|
|
|
63
64
|
@sentence_transformer.conditional_return_type
|
|
64
|
-
def _(model_id: str) ->
|
|
65
|
+
def _(model_id: str) -> ts.ArrayType:
|
|
65
66
|
try:
|
|
66
67
|
from sentence_transformers import SentenceTransformer
|
|
67
68
|
|
|
68
69
|
model = _lookup_model(model_id, SentenceTransformer)
|
|
69
|
-
return
|
|
70
|
+
return ts.ArrayType((model.get_sentence_embedding_dimension(),), dtype=ts.FloatType(), nullable=False)
|
|
70
71
|
except ImportError:
|
|
71
|
-
return
|
|
72
|
+
return ts.ArrayType((None,), dtype=ts.FloatType(), nullable=False)
|
|
72
73
|
|
|
73
74
|
|
|
74
75
|
@pxt.udf
|
|
@@ -199,14 +200,14 @@ def _(image: Batch[PIL.Image.Image], *, model_id: str) -> Batch[pxt.Array[(None,
|
|
|
199
200
|
|
|
200
201
|
|
|
201
202
|
@clip.conditional_return_type
|
|
202
|
-
def _(model_id: str) ->
|
|
203
|
+
def _(model_id: str) -> ts.ArrayType:
|
|
203
204
|
try:
|
|
204
205
|
from transformers import CLIPModel
|
|
205
206
|
|
|
206
207
|
model = _lookup_model(model_id, CLIPModel.from_pretrained)
|
|
207
|
-
return
|
|
208
|
+
return ts.ArrayType((model.config.projection_dim,), dtype=ts.FloatType(), nullable=False)
|
|
208
209
|
except ImportError:
|
|
209
|
-
return
|
|
210
|
+
return ts.ArrayType((None,), dtype=ts.FloatType(), nullable=False)
|
|
210
211
|
|
|
211
212
|
|
|
212
213
|
@pxt.udf(batch_size=4)
|
pixeltable/functions/image.py
CHANGED
|
@@ -16,6 +16,7 @@ from typing import Optional
|
|
|
16
16
|
import PIL.Image
|
|
17
17
|
|
|
18
18
|
import pixeltable as pxt
|
|
19
|
+
import pixeltable.type_system as ts
|
|
19
20
|
from pixeltable.exprs import Expr
|
|
20
21
|
from pixeltable.utils.code import local_public_names
|
|
21
22
|
|
|
@@ -88,10 +89,10 @@ def convert(self: PIL.Image.Image, mode: str) -> PIL.Image.Image:
|
|
|
88
89
|
|
|
89
90
|
|
|
90
91
|
@convert.conditional_return_type
|
|
91
|
-
def _(self: Expr, mode: str) ->
|
|
92
|
+
def _(self: Expr, mode: str) -> ts.ColumnType:
|
|
92
93
|
input_type = self.col_type
|
|
93
|
-
assert isinstance(input_type,
|
|
94
|
-
return
|
|
94
|
+
assert isinstance(input_type, ts.ImageType)
|
|
95
|
+
return ts.ImageType(size=input_type.size, mode=mode, nullable=input_type.nullable)
|
|
95
96
|
|
|
96
97
|
|
|
97
98
|
# Image.crop()
|
|
@@ -108,14 +109,12 @@ def crop(self: PIL.Image.Image, box: tuple[int, int, int, int]) -> PIL.Image.Ima
|
|
|
108
109
|
|
|
109
110
|
|
|
110
111
|
@crop.conditional_return_type
|
|
111
|
-
def _(self: Expr, box: tuple[int, int, int, int]) ->
|
|
112
|
+
def _(self: Expr, box: tuple[int, int, int, int]) -> ts.ColumnType:
|
|
112
113
|
input_type = self.col_type
|
|
113
|
-
assert isinstance(input_type,
|
|
114
|
+
assert isinstance(input_type, ts.ImageType)
|
|
114
115
|
if (isinstance(box, (list, tuple))) and len(box) == 4 and all(isinstance(x, int) for x in box):
|
|
115
|
-
return
|
|
116
|
-
|
|
117
|
-
)
|
|
118
|
-
return pxt.ImageType(mode=input_type.mode, nullable=input_type.nullable) # we can't compute the size statically
|
|
116
|
+
return ts.ImageType(size=(box[2] - box[0], box[3] - box[1]), mode=input_type.mode, nullable=input_type.nullable)
|
|
117
|
+
return ts.ImageType(mode=input_type.mode, nullable=input_type.nullable) # we can't compute the size statically
|
|
119
118
|
|
|
120
119
|
|
|
121
120
|
# Image.getchannel()
|
|
@@ -134,10 +133,10 @@ def getchannel(self: PIL.Image.Image, channel: int) -> PIL.Image.Image:
|
|
|
134
133
|
|
|
135
134
|
|
|
136
135
|
@getchannel.conditional_return_type
|
|
137
|
-
def _(self: Expr) ->
|
|
136
|
+
def _(self: Expr) -> ts.ColumnType:
|
|
138
137
|
input_type = self.col_type
|
|
139
|
-
assert isinstance(input_type,
|
|
140
|
-
return
|
|
138
|
+
assert isinstance(input_type, ts.ImageType)
|
|
139
|
+
return ts.ImageType(size=input_type.size, mode='L', nullable=input_type.nullable)
|
|
141
140
|
|
|
142
141
|
|
|
143
142
|
@pxt.udf(is_method=True)
|
|
@@ -183,10 +182,10 @@ def resize(self: PIL.Image.Image, size: tuple[int, int]) -> PIL.Image.Image:
|
|
|
183
182
|
|
|
184
183
|
|
|
185
184
|
@resize.conditional_return_type
|
|
186
|
-
def _(self: Expr, size: tuple[int, int]) ->
|
|
185
|
+
def _(self: Expr, size: tuple[int, int]) -> ts.ColumnType:
|
|
187
186
|
input_type = self.col_type
|
|
188
|
-
assert isinstance(input_type,
|
|
189
|
-
return
|
|
187
|
+
assert isinstance(input_type, ts.ImageType)
|
|
188
|
+
return ts.ImageType(size=size, mode=input_type.mode, nullable=input_type.nullable)
|
|
190
189
|
|
|
191
190
|
|
|
192
191
|
# Image.rotate()
|
|
@@ -237,7 +236,7 @@ def transpose(self: PIL.Image.Image, method: int) -> PIL.Image.Image:
|
|
|
237
236
|
@rotate.conditional_return_type
|
|
238
237
|
@effect_spread.conditional_return_type
|
|
239
238
|
@transpose.conditional_return_type
|
|
240
|
-
def _(self: Expr) ->
|
|
239
|
+
def _(self: Expr) -> ts.ColumnType:
|
|
241
240
|
return self.col_type
|
|
242
241
|
|
|
243
242
|
|
|
@@ -10,6 +10,7 @@ from typing import TYPE_CHECKING, Optional, TypeVar, Union
|
|
|
10
10
|
import numpy as np
|
|
11
11
|
|
|
12
12
|
import pixeltable as pxt
|
|
13
|
+
import pixeltable.type_system as ts
|
|
13
14
|
from pixeltable.env import Env, register_client
|
|
14
15
|
from pixeltable.func.signature import Batch
|
|
15
16
|
from pixeltable.utils.code import local_public_names
|
|
@@ -176,9 +177,9 @@ async def embeddings(input: Batch[str], *, model: str) -> Batch[pxt.Array[(None,
|
|
|
176
177
|
|
|
177
178
|
|
|
178
179
|
@embeddings.conditional_return_type
|
|
179
|
-
def _(model: str) ->
|
|
180
|
+
def _(model: str) -> ts.ArrayType:
|
|
180
181
|
dimensions = _embedding_dimensions_cache.get(model) # `None` if unknown model
|
|
181
|
-
return
|
|
182
|
+
return ts.ArrayType((dimensions,), dtype=ts.FloatType())
|
|
182
183
|
|
|
183
184
|
|
|
184
185
|
_T = TypeVar('_T')
|
pixeltable/functions/openai.py
CHANGED
|
@@ -21,6 +21,7 @@ import numpy as np
|
|
|
21
21
|
import PIL
|
|
22
22
|
|
|
23
23
|
import pixeltable as pxt
|
|
24
|
+
import pixeltable.type_system as ts
|
|
24
25
|
from pixeltable import env, exprs
|
|
25
26
|
from pixeltable.func import Batch, Tools
|
|
26
27
|
from pixeltable.utils.code import local_public_names
|
|
@@ -666,13 +667,13 @@ async def embeddings(
|
|
|
666
667
|
|
|
667
668
|
|
|
668
669
|
@embeddings.conditional_return_type
|
|
669
|
-
def _(model: str, dimensions: Optional[int] = None) ->
|
|
670
|
+
def _(model: str, dimensions: Optional[int] = None) -> ts.ArrayType:
|
|
670
671
|
if dimensions is None:
|
|
671
672
|
if model not in _embedding_dimensions_cache:
|
|
672
673
|
# TODO: find some other way to retrieve a sample
|
|
673
|
-
return
|
|
674
|
+
return ts.ArrayType((None,), dtype=ts.FloatType(), nullable=False)
|
|
674
675
|
dimensions = _embedding_dimensions_cache.get(model)
|
|
675
|
-
return
|
|
676
|
+
return ts.ArrayType((dimensions,), dtype=ts.FloatType(), nullable=False)
|
|
676
677
|
|
|
677
678
|
|
|
678
679
|
#####################################
|
|
@@ -738,17 +739,17 @@ async def image_generations(
|
|
|
738
739
|
|
|
739
740
|
|
|
740
741
|
@image_generations.conditional_return_type
|
|
741
|
-
def _(size: Optional[str] = None) ->
|
|
742
|
+
def _(size: Optional[str] = None) -> ts.ImageType:
|
|
742
743
|
if size is None:
|
|
743
|
-
return
|
|
744
|
+
return ts.ImageType(size=(1024, 1024))
|
|
744
745
|
x_pos = size.find('x')
|
|
745
746
|
if x_pos == -1:
|
|
746
|
-
return
|
|
747
|
+
return ts.ImageType()
|
|
747
748
|
try:
|
|
748
749
|
width, height = int(size[:x_pos]), int(size[x_pos + 1 :])
|
|
749
750
|
except ValueError:
|
|
750
|
-
return
|
|
751
|
-
return
|
|
751
|
+
return ts.ImageType()
|
|
752
|
+
return ts.ImageType(size=(width, height))
|
|
752
753
|
|
|
753
754
|
|
|
754
755
|
#####################################
|
pixeltable/functions/together.py
CHANGED
|
@@ -16,6 +16,7 @@ import tenacity
|
|
|
16
16
|
|
|
17
17
|
import pixeltable as pxt
|
|
18
18
|
import pixeltable.exceptions as excs
|
|
19
|
+
import pixeltable.type_system as ts
|
|
19
20
|
from pixeltable import env
|
|
20
21
|
from pixeltable.func import Batch
|
|
21
22
|
from pixeltable.utils.code import local_public_names
|
|
@@ -225,12 +226,12 @@ async def embeddings(input: Batch[str], *, model: str) -> Batch[pxt.Array[(None,
|
|
|
225
226
|
|
|
226
227
|
|
|
227
228
|
@embeddings.conditional_return_type
|
|
228
|
-
def _(model: str) ->
|
|
229
|
+
def _(model: str) -> ts.ArrayType:
|
|
229
230
|
if model not in _embedding_dimensions_cache:
|
|
230
231
|
# TODO: find some other way to retrieve a sample
|
|
231
|
-
return
|
|
232
|
+
return ts.ArrayType((None,), dtype=ts.FloatType())
|
|
232
233
|
dimensions = _embedding_dimensions_cache[model]
|
|
233
|
-
return
|
|
234
|
+
return ts.ArrayType((dimensions,), dtype=ts.FloatType())
|
|
234
235
|
|
|
235
236
|
|
|
236
237
|
@pxt.udf(resource_pool='request-rate:together:images')
|
pixeltable/io/datarows.py
CHANGED
|
@@ -3,13 +3,14 @@ from __future__ import annotations
|
|
|
3
3
|
from typing import Any, Iterable, Optional, Union
|
|
4
4
|
|
|
5
5
|
import pixeltable as pxt
|
|
6
|
+
import pixeltable.type_system as ts
|
|
6
7
|
from pixeltable import exceptions as excs
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
def _infer_schema_from_rows(
|
|
10
11
|
rows: Iterable[dict[str, Any]], schema_overrides: dict[str, Any], primary_key: list[str]
|
|
11
|
-
) -> dict[str,
|
|
12
|
-
schema: dict[str,
|
|
12
|
+
) -> dict[str, ts.ColumnType]:
|
|
13
|
+
schema: dict[str, ts.ColumnType] = {}
|
|
13
14
|
cols_with_nones: set[str] = set()
|
|
14
15
|
|
|
15
16
|
for n, row in enumerate(rows):
|
|
@@ -23,7 +24,7 @@ def _infer_schema_from_rows(
|
|
|
23
24
|
elif value is not None:
|
|
24
25
|
# If `key` is not in `schema_overrides`, then we infer its type from the data.
|
|
25
26
|
# The column type will always be nullable by default.
|
|
26
|
-
col_type =
|
|
27
|
+
col_type = ts.ColumnType.infer_literal_type(value, nullable=col_name not in primary_key)
|
|
27
28
|
if col_type is None:
|
|
28
29
|
raise excs.Error(
|
|
29
30
|
f'Could not infer type for column `{col_name}`; the value in row {n} '
|
pixeltable/io/label_studio.py
CHANGED
|
@@ -11,7 +11,7 @@ import label_studio_sdk # type: ignore[import-untyped]
|
|
|
11
11
|
import PIL.Image
|
|
12
12
|
from requests.exceptions import HTTPError
|
|
13
13
|
|
|
14
|
-
import pixeltable as
|
|
14
|
+
import pixeltable.type_system as ts
|
|
15
15
|
from pixeltable import Column, Table, env, exceptions as excs
|
|
16
16
|
from pixeltable.config import Config
|
|
17
17
|
from pixeltable.exprs import ColumnRef, DataRow, Expr
|
|
@@ -89,21 +89,21 @@ class LabelStudioProject(Project):
|
|
|
89
89
|
def __project_config(self) -> '_LabelStudioConfig':
|
|
90
90
|
return self.__parse_project_config(self.project_params['label_config'])
|
|
91
91
|
|
|
92
|
-
def get_export_columns(self) -> dict[str,
|
|
92
|
+
def get_export_columns(self) -> dict[str, ts.ColumnType]:
|
|
93
93
|
"""
|
|
94
94
|
The data keys and preannotation fields specified in this Label Studio project.
|
|
95
95
|
"""
|
|
96
96
|
return self.__project_config.export_columns
|
|
97
97
|
|
|
98
|
-
def get_import_columns(self) -> dict[str,
|
|
98
|
+
def get_import_columns(self) -> dict[str, ts.ColumnType]:
|
|
99
99
|
"""
|
|
100
100
|
Always contains a single entry:
|
|
101
101
|
|
|
102
102
|
```
|
|
103
|
-
{"annotations":
|
|
103
|
+
{"annotations": ts.JsonType(nullable=True)}
|
|
104
104
|
```
|
|
105
105
|
"""
|
|
106
|
-
return {ANNOTATIONS_COLUMN:
|
|
106
|
+
return {ANNOTATIONS_COLUMN: ts.JsonType(nullable=True)}
|
|
107
107
|
|
|
108
108
|
def sync(self, t: Table, export_data: bool, import_data: bool) -> SyncStatus:
|
|
109
109
|
_logger.info(
|
|
@@ -412,8 +412,8 @@ class LabelStudioProject(Project):
|
|
|
412
412
|
# TODO(aaron-siegel): Simplify this once propagation is properly implemented in batch_update
|
|
413
413
|
ancestor = t
|
|
414
414
|
while local_annotations_col not in ancestor._tbl_version.get().cols:
|
|
415
|
-
assert ancestor.
|
|
416
|
-
ancestor = ancestor.
|
|
415
|
+
assert ancestor._base_table is not None
|
|
416
|
+
ancestor = ancestor._base_table
|
|
417
417
|
update_status = ancestor.batch_update(updates)
|
|
418
418
|
env.Env.get().console_logger.info(f'Updated annotation(s) from {len(updates)} task(s) in {self}.')
|
|
419
419
|
return SyncStatus(pxt_rows_updated=update_status.num_rows, num_excs=update_status.num_excs)
|
|
@@ -577,10 +577,10 @@ class LabelStudioProject(Project):
|
|
|
577
577
|
else:
|
|
578
578
|
local_annotations_column = next(k for k, v in col_mapping.items() if v == ANNOTATIONS_COLUMN)
|
|
579
579
|
if local_annotations_column not in t._schema:
|
|
580
|
-
t.add_columns({local_annotations_column:
|
|
580
|
+
t.add_columns({local_annotations_column: ts.JsonType(nullable=True)})
|
|
581
581
|
|
|
582
582
|
resolved_col_mapping = cls.validate_columns(
|
|
583
|
-
t, config.export_columns, {ANNOTATIONS_COLUMN:
|
|
583
|
+
t, config.export_columns, {ANNOTATIONS_COLUMN: ts.JsonType(nullable=True)}, col_mapping
|
|
584
584
|
)
|
|
585
585
|
|
|
586
586
|
# Perform some additional validation
|
|
@@ -649,7 +649,7 @@ class LabelStudioProject(Project):
|
|
|
649
649
|
@dataclass(frozen=True)
|
|
650
650
|
class _DataKey:
|
|
651
651
|
name: Optional[str] # The 'name' attribute of the data key; may differ from the field name
|
|
652
|
-
column_type:
|
|
652
|
+
column_type: ts.ColumnType
|
|
653
653
|
|
|
654
654
|
|
|
655
655
|
@dataclass(frozen=True)
|
|
@@ -673,18 +673,18 @@ class _LabelStudioConfig:
|
|
|
673
673
|
)
|
|
674
674
|
|
|
675
675
|
@property
|
|
676
|
-
def export_columns(self) -> dict[str,
|
|
676
|
+
def export_columns(self) -> dict[str, ts.ColumnType]:
|
|
677
677
|
data_key_cols = {key_id: key_info.column_type for key_id, key_info in self.data_keys.items()}
|
|
678
|
-
rl_cols = {name:
|
|
678
|
+
rl_cols = {name: ts.JsonType() for name in self.rectangle_labels}
|
|
679
679
|
return {**data_key_cols, **rl_cols}
|
|
680
680
|
|
|
681
681
|
|
|
682
682
|
ANNOTATIONS_COLUMN = 'annotations'
|
|
683
683
|
_PAGE_SIZE = 100 # This is the default used in the LS SDK
|
|
684
684
|
_LS_TAG_MAP = {
|
|
685
|
-
'header':
|
|
686
|
-
'text':
|
|
687
|
-
'image':
|
|
688
|
-
'video':
|
|
689
|
-
'audio':
|
|
685
|
+
'header': ts.StringType(),
|
|
686
|
+
'text': ts.StringType(),
|
|
687
|
+
'image': ts.ImageType(),
|
|
688
|
+
'video': ts.VideoType(),
|
|
689
|
+
'audio': ts.AudioType(),
|
|
690
690
|
}
|
pixeltable/io/pandas.py
CHANGED
|
@@ -8,6 +8,7 @@ from pandas.api.types import is_datetime64_any_dtype, is_extension_array_dtype
|
|
|
8
8
|
|
|
9
9
|
import pixeltable as pxt
|
|
10
10
|
import pixeltable.exceptions as excs
|
|
11
|
+
import pixeltable.type_system as ts
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
def import_pandas(
|
|
@@ -119,15 +120,15 @@ def _df_check_primary_key_values(df: pd.DataFrame, primary_key: list[str]) -> No
|
|
|
119
120
|
|
|
120
121
|
|
|
121
122
|
def df_infer_schema(
|
|
122
|
-
df: pd.DataFrame, schema_overrides: dict[str,
|
|
123
|
-
) -> dict[str,
|
|
123
|
+
df: pd.DataFrame, schema_overrides: dict[str, ts.ColumnType], primary_key: list[str]
|
|
124
|
+
) -> dict[str, ts.ColumnType]:
|
|
124
125
|
"""
|
|
125
126
|
Infers a Pixeltable schema from a Pandas DataFrame.
|
|
126
127
|
|
|
127
128
|
Returns:
|
|
128
129
|
A tuple containing a Pixeltable schema and a list of primary key column names.
|
|
129
130
|
"""
|
|
130
|
-
pd_schema: dict[str,
|
|
131
|
+
pd_schema: dict[str, ts.ColumnType] = {}
|
|
131
132
|
for pd_name, pd_dtype in zip(df.columns, df.dtypes):
|
|
132
133
|
if pd_name in schema_overrides:
|
|
133
134
|
pxt_type = schema_overrides[pd_name]
|
|
@@ -138,7 +139,7 @@ def df_infer_schema(
|
|
|
138
139
|
return pd_schema
|
|
139
140
|
|
|
140
141
|
|
|
141
|
-
def __pd_dtype_to_pxt_type(pd_dtype: DtypeObj, nullable: bool) -> Optional[
|
|
142
|
+
def __pd_dtype_to_pxt_type(pd_dtype: DtypeObj, nullable: bool) -> Optional[ts.ColumnType]:
|
|
142
143
|
"""
|
|
143
144
|
Determines a pixeltable ColumnType from a pandas dtype
|
|
144
145
|
|
|
@@ -146,21 +147,21 @@ def __pd_dtype_to_pxt_type(pd_dtype: DtypeObj, nullable: bool) -> Optional[pxt.C
|
|
|
146
147
|
pd_dtype: A pandas dtype object
|
|
147
148
|
|
|
148
149
|
Returns:
|
|
149
|
-
|
|
150
|
+
ts.ColumnType: A pixeltable ColumnType
|
|
150
151
|
"""
|
|
151
152
|
# Pandas extension arrays / types (Int64, boolean, string[pyarrow], etc.) are not directly
|
|
152
153
|
# compatible with NumPy dtypes
|
|
153
154
|
# The timezone-aware datetime64[ns, tz=] dtype is a pandas extension dtype
|
|
154
155
|
if is_datetime64_any_dtype(pd_dtype):
|
|
155
|
-
return
|
|
156
|
+
return ts.TimestampType(nullable=nullable)
|
|
156
157
|
if is_extension_array_dtype(pd_dtype):
|
|
157
158
|
return None
|
|
158
159
|
# Most other pandas dtypes are directly NumPy compatible
|
|
159
160
|
assert isinstance(pd_dtype, np.dtype)
|
|
160
|
-
return
|
|
161
|
+
return ts.ArrayType.from_np_dtype(pd_dtype, nullable)
|
|
161
162
|
|
|
162
163
|
|
|
163
|
-
def __pd_coltype_to_pxt_type(pd_dtype: DtypeObj, data_col: pd.Series, nullable: bool) ->
|
|
164
|
+
def __pd_coltype_to_pxt_type(pd_dtype: DtypeObj, data_col: pd.Series, nullable: bool) -> ts.ColumnType:
|
|
164
165
|
"""
|
|
165
166
|
Infers a Pixeltable type based on a pandas dtype.
|
|
166
167
|
"""
|
|
@@ -176,12 +177,12 @@ def __pd_coltype_to_pxt_type(pd_dtype: DtypeObj, data_col: pd.Series, nullable:
|
|
|
176
177
|
|
|
177
178
|
if len(data_col) == 0:
|
|
178
179
|
# No non-null values; default to FloatType (the Pandas type of an all-NaN column)
|
|
179
|
-
return
|
|
180
|
+
return ts.FloatType(nullable=nullable)
|
|
180
181
|
|
|
181
|
-
inferred_type =
|
|
182
|
+
inferred_type = ts.ColumnType.infer_common_literal_type(data_col)
|
|
182
183
|
if inferred_type is None:
|
|
183
184
|
# Fallback on StringType if everything else fails
|
|
184
|
-
return
|
|
185
|
+
return ts.StringType(nullable=nullable)
|
|
185
186
|
else:
|
|
186
187
|
return inferred_type.copy(nullable=nullable)
|
|
187
188
|
|
|
@@ -189,7 +190,7 @@ def __pd_coltype_to_pxt_type(pd_dtype: DtypeObj, data_col: pd.Series, nullable:
|
|
|
189
190
|
|
|
190
191
|
|
|
191
192
|
def _df_row_to_pxt_row(
|
|
192
|
-
row: tuple[Any, ...], schema: dict[str,
|
|
193
|
+
row: tuple[Any, ...], schema: dict[str, ts.ColumnType], col_mapping: Optional[dict[str, str]]
|
|
193
194
|
) -> dict[str, Any]:
|
|
194
195
|
"""Convert a row to insertable format"""
|
|
195
196
|
pxt_row: dict[str, Any] = {}
|
|
@@ -15,6 +15,7 @@ from pyarrow.parquet import ParquetDataset
|
|
|
15
15
|
|
|
16
16
|
import pixeltable as pxt
|
|
17
17
|
import pixeltable.exceptions as excs
|
|
18
|
+
import pixeltable.type_system as ts
|
|
18
19
|
from pixeltable.io.pandas import _df_check_primary_key_values, _df_row_to_pxt_row, df_infer_schema
|
|
19
20
|
from pixeltable.utils import parse_local_file_path
|
|
20
21
|
|
|
@@ -72,6 +73,11 @@ class TableDataConduit:
|
|
|
72
73
|
def check_source_format(self) -> None:
|
|
73
74
|
assert self.source_format is None or TableDataConduitFormat.is_valid(self.source_format)
|
|
74
75
|
|
|
76
|
+
def __post_init__(self) -> None:
|
|
77
|
+
"""If no extra_fields were provided, initialize to empty dict"""
|
|
78
|
+
if self.extra_fields is None:
|
|
79
|
+
self.extra_fields = {}
|
|
80
|
+
|
|
75
81
|
@classmethod
|
|
76
82
|
def is_rowdata_structure(cls, d: TableDataSource) -> bool:
|
|
77
83
|
if not isinstance(d, list) or len(d) == 0:
|
|
@@ -83,7 +89,7 @@ class TableDataConduit:
|
|
|
83
89
|
|
|
84
90
|
def normalize_pxt_schema_types(self) -> None:
|
|
85
91
|
for name, coltype in self.pxt_schema.items():
|
|
86
|
-
self.pxt_schema[name] =
|
|
92
|
+
self.pxt_schema[name] = ts.ColumnType.normalize_type(coltype)
|
|
87
93
|
|
|
88
94
|
def infer_schema(self) -> dict[str, Any]:
|
|
89
95
|
raise NotImplementedError
|
|
@@ -393,7 +399,7 @@ class HFTableDataConduit(TableDataConduit):
|
|
|
393
399
|
f'Column name `{self.column_name_for_split}` already exists in dataset schema;'
|
|
394
400
|
f'provide a different `column_name_for_split`'
|
|
395
401
|
)
|
|
396
|
-
self.src_schema[self.column_name_for_split] =
|
|
402
|
+
self.src_schema[self.column_name_for_split] = ts.StringType(nullable=True)
|
|
397
403
|
|
|
398
404
|
inferred_schema, inferred_pk, self.source_column_map = normalize_schema_names(
|
|
399
405
|
self.src_schema, self.src_pk, self.src_schema_overrides, True
|
|
@@ -3,7 +3,7 @@ from typing import Any, Optional
|
|
|
3
3
|
|
|
4
4
|
import sqlalchemy as sql
|
|
5
5
|
|
|
6
|
-
import pixeltable as
|
|
6
|
+
import pixeltable.type_system as ts
|
|
7
7
|
from pixeltable.metadata import register_converter, schema
|
|
8
8
|
from pixeltable.metadata.converters.util import convert_table_md
|
|
9
9
|
|
|
@@ -34,7 +34,7 @@ def __update_timestamp_literals(k: Any, v: Any) -> Optional[tuple[Any, Any]]:
|
|
|
34
34
|
# timestamp literal, which (in version 19) is stored in the DB as a naive datetime.
|
|
35
35
|
# We convert it to an aware datetime, stored in UTC.
|
|
36
36
|
assert v['_classname'] == 'Literal'
|
|
37
|
-
assert v['val_t'] ==
|
|
37
|
+
assert v['val_t'] == ts.ColumnType.Type.TIMESTAMP.name
|
|
38
38
|
assert isinstance(v['val'], str)
|
|
39
39
|
dt = datetime.datetime.fromisoformat(v['val'])
|
|
40
40
|
assert dt.tzinfo is None # In version 19 all timestamps are naive
|
pixeltable/share/packager.py
CHANGED
|
@@ -78,7 +78,7 @@ class TablePackager:
|
|
|
78
78
|
json.dump(self.md, fp)
|
|
79
79
|
self.iceberg_catalog = sqlite_catalog(self.tmp_dir / 'warehouse')
|
|
80
80
|
with Env.get().begin_xact():
|
|
81
|
-
ancestors = (self.table, *self.table.
|
|
81
|
+
ancestors = (self.table, *self.table._base_tables)
|
|
82
82
|
for t in ancestors:
|
|
83
83
|
_logger.info(f"Exporting table '{t._path}'.")
|
|
84
84
|
self.__export_table(t)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: pixeltable
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.13
|
|
4
4
|
Summary: AI Data Infrastructure: Declarative, Multimodal, and Incremental
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Keywords: data-science,machine-learning,database,ai,computer-vision,chatbot,ml,artificial-intelligence,feature-engineering,multimodal,mlops,feature-store,vector-database,llm,genai
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
pixeltable/__init__.py,sha256=
|
|
2
|
-
pixeltable/__version__.py,sha256=
|
|
1
|
+
pixeltable/__init__.py,sha256=TYbL_db8k7i-xQ3G6BhywWJujwl0SyZ_i3rtO_ETtgU,1435
|
|
2
|
+
pixeltable/__version__.py,sha256=PktX7ox0r5NrPEx5hjV3DTlFGMm-MthCIgxmYxRRvTQ,114
|
|
3
3
|
pixeltable/catalog/__init__.py,sha256=rQmjveID4bk6NI4Ql09lGsZ0K0HVE2l1yqKAveipHzc,558
|
|
4
4
|
pixeltable/catalog/catalog.py,sha256=7aS-p3Y1ArYqi2gvD57bF-VC0eGvOkeZ4HCKFUNQK7Y,48756
|
|
5
5
|
pixeltable/catalog/column.py,sha256=i_KJVRvjR9Dh4tPrdf9Fg7IBGcKLYiOJKngSVBLgMCA,10800
|
|
6
6
|
pixeltable/catalog/dir.py,sha256=HFemOf67Nfw13EOpQsR_UgzP2L1w4LDfw2009DrSK0Y,2063
|
|
7
7
|
pixeltable/catalog/globals.py,sha256=7fNUs67D18PZ1ZajcGz7KQOV6tuXEcYLSrePzgmDkRw,4036
|
|
8
|
-
pixeltable/catalog/insertable_table.py,sha256=
|
|
8
|
+
pixeltable/catalog/insertable_table.py,sha256=JVDeUWH9HsqAUYjweennhfrfgS5iBnEniCX_Ft7b8Is,8843
|
|
9
9
|
pixeltable/catalog/named_function.py,sha256=vZ-j7P4HugWh9OmUzBMwyRYvO3tQn9jWyJz_1stPavU,1210
|
|
10
10
|
pixeltable/catalog/path.py,sha256=gk8TIlO_7Jpji5mAN0dUNvHmvU0uneTHeB_qCTWnszQ,2529
|
|
11
11
|
pixeltable/catalog/schema_object.py,sha256=6OxJTfT1NOivL1sbg8opf4DTGvGCLqqkuuS4Xo8ESJU,1806
|
|
12
|
-
pixeltable/catalog/table.py,sha256=
|
|
12
|
+
pixeltable/catalog/table.py,sha256=CsNPB13gpLD2ap4leM-Jc0NZLJWB7yjFHs_AY0_zJ7A,64920
|
|
13
13
|
pixeltable/catalog/table_version.py,sha256=iVZnJ0CfNk4i2oiGppb2ZqShStG509_nFkyrR3jOLwo,61490
|
|
14
14
|
pixeltable/catalog/table_version_handle.py,sha256=LYJFTdRssPu4uOBPbP93wKqXygJXr3Gwdc9wHzzZRag,1654
|
|
15
15
|
pixeltable/catalog/table_version_path.py,sha256=_g9knGenpMOlhaK8DZa8iLz5CorsMcbnFqTLnvaUkYM,6653
|
|
16
|
-
pixeltable/catalog/view.py,sha256=
|
|
16
|
+
pixeltable/catalog/view.py,sha256=ZtfNoAMeqcKB7MoPfzPPRQJvniCIrYxQjqs5KI3xXog,13033
|
|
17
17
|
pixeltable/config.py,sha256=gnRI4G9GE7mQJDcMcn8JsEzYk8oKVfHB-BwoLRWnRDo,3971
|
|
18
|
-
pixeltable/dataframe.py,sha256=
|
|
18
|
+
pixeltable/dataframe.py,sha256=dAR4-iLkcu8AllvP85_17u5PankzBOdm2Zanp6JR0iY,49605
|
|
19
19
|
pixeltable/env.py,sha256=uQ8LZG-KU96Jhgs0wAUOn0rrj1ouAeliavnJPgvDx_Q,36250
|
|
20
|
-
pixeltable/exceptions.py,sha256=
|
|
20
|
+
pixeltable/exceptions.py,sha256=eI2f4oXqv678_fDOxeYOTPE_EF1CMX3pwCqtJvN8i7s,926
|
|
21
21
|
pixeltable/exec/__init__.py,sha256=m4AF2kzFtsTRUevupgWs8er0oJQisCR9ROW7ZJlL3dw,509
|
|
22
22
|
pixeltable/exec/aggregation_node.py,sha256=C6gdQqCwg2Cio0bFbtGBhvjMMc4ADBjljnLwMVwdrLQ,4090
|
|
23
23
|
pixeltable/exec/cache_prefetch_node.py,sha256=j8ThRGNAeP47A02MgMF0ViZdD6ZYJgTY8dbNubxQbW0,12135
|
|
@@ -26,14 +26,14 @@ pixeltable/exec/data_row_batch.py,sha256=EAB15JRhXbWIe91x1J5N5lFiMXzjB8NGTFjZsBD
|
|
|
26
26
|
pixeltable/exec/exec_context.py,sha256=jKeLStfkjwCKKAooC-7a7qZUnZU5O0_JQhanhVerV9c,984
|
|
27
27
|
pixeltable/exec/exec_node.py,sha256=WIN1sBEBNS7TlBk5QpHsDUCZUUdcvs6Os_Bxq2HoWdo,4077
|
|
28
28
|
pixeltable/exec/expr_eval/__init__.py,sha256=sQThSEByK_DLfB-_-18RFhpARx49cSXYEkpCDyi0vQI,61
|
|
29
|
-
pixeltable/exec/expr_eval/evaluators.py,sha256=
|
|
30
|
-
pixeltable/exec/expr_eval/expr_eval_node.py,sha256=
|
|
29
|
+
pixeltable/exec/expr_eval/evaluators.py,sha256=AJkuleKhEz_8W6F3dcjTbWyKfv4IzpTh3cvQ3--OkRg,16865
|
|
30
|
+
pixeltable/exec/expr_eval/expr_eval_node.py,sha256=bPPrOQhCbjuWsZCEEKvi-tehF2rz54os6TfXcjj8W1Q,18977
|
|
31
31
|
pixeltable/exec/expr_eval/globals.py,sha256=fFrj2O53TgHDfVF8dgnyn1fPLi4ZHQuylewf5aHMwYk,7752
|
|
32
32
|
pixeltable/exec/expr_eval/row_buffer.py,sha256=YY0thdlMNNReEOTyPp36xKPeMeXSZ0VrI9bJsXgo7sU,2744
|
|
33
33
|
pixeltable/exec/expr_eval/schedulers.py,sha256=tAvCQKa1q0x7y7cdnGcTGbeku8QcoKH1GkgSm8ktOnM,17000
|
|
34
34
|
pixeltable/exec/in_memory_data_node.py,sha256=csw_4qyOKsvqgIiqX6IMDw6wi2pqnHwLgoE_77j7Pck,3594
|
|
35
35
|
pixeltable/exec/row_update_node.py,sha256=zU0eSyn81-vRrjAMOadRqU8luTshnPUtIbS7npyLBKY,2798
|
|
36
|
-
pixeltable/exec/sql_node.py,sha256=
|
|
36
|
+
pixeltable/exec/sql_node.py,sha256=HxCJlzkJSYbmMVskZJihoaP2GYIZsiFUvFXxNm6MZLs,19826
|
|
37
37
|
pixeltable/exprs/__init__.py,sha256=AxSMjKNavCT9F6vBaNR-nwX2iupAI5hbMb5hEj65Tfk,1096
|
|
38
38
|
pixeltable/exprs/arithmetic_expr.py,sha256=sZPao0qdFWbrDx0eiAVxw1wGHJXZ5ZoCpQaScysBldE,7333
|
|
39
39
|
pixeltable/exprs/array_slice.py,sha256=8Zv0E2RghdJi1Mbk0kKtOz2ccGQuXwLLb6R9v1jk7hA,2180
|
|
@@ -76,26 +76,27 @@ pixeltable/func/globals.py,sha256=5Wo4GPxYgHRRk5nvV0h_lAthKSalxKvj5n1p-uMPR0U,15
|
|
|
76
76
|
pixeltable/func/query_template_function.py,sha256=QN_HGyBErDwdwpsI63caohsjo9usoN6WTEERG6NDtP4,7913
|
|
77
77
|
pixeltable/func/signature.py,sha256=0PI6xdhLgwy9-GMkzkm7GlsBnsNMiS9aoNI9LWXwvN0,13700
|
|
78
78
|
pixeltable/func/tools.py,sha256=DIfkOEj9Bp797Ew014_4YJePoUW40fQ6mvbCeg0FBR0,5721
|
|
79
|
-
pixeltable/func/udf.py,sha256=
|
|
80
|
-
pixeltable/functions/__init__.py,sha256=
|
|
81
|
-
pixeltable/functions/anthropic.py,sha256
|
|
79
|
+
pixeltable/func/udf.py,sha256=qQfaX1O3ZhUvSgiNnitW7nRKnZFJ5yu_Fj9ioqQgjqg,13219
|
|
80
|
+
pixeltable/functions/__init__.py,sha256=3RZbfHlaOx6NkSMZU6wTZ3dsqErxmUJUFF0X4EbxQvY,568
|
|
81
|
+
pixeltable/functions/anthropic.py,sha256=oTiXMfy3MupBInGRFEVkp-pHu06gF1ezJjEM2ypyvXw,9323
|
|
82
82
|
pixeltable/functions/audio.py,sha256=7bsm4igQEW7RYSrSevwqaUOqyEnvBbPbJ8c-VknDl1E,657
|
|
83
|
+
pixeltable/functions/bedrock.py,sha256=lTCFHjYunF3minBGWcjXR90yJ8resFjXr4niyKhfxms,4217
|
|
83
84
|
pixeltable/functions/deepseek.py,sha256=KYIa-UJJUTOt9cCfmP6k6nM4MpKm1MBU8F-jWk3CycY,3827
|
|
84
85
|
pixeltable/functions/fireworks.py,sha256=k0vUXxeeNYWfL_tdLgF9c-vOilr0g2tTeLkAL9SJ6ws,4972
|
|
85
86
|
pixeltable/functions/gemini.py,sha256=vr1mBZDcDI1GNLp8pKVcQmUEbV9P0L0HRInE78rA4Ok,2952
|
|
86
87
|
pixeltable/functions/globals.py,sha256=_u4A2aOWJGEzlA2Q2qr5p-ubA9paiCnkmC_oP908Qt0,5374
|
|
87
|
-
pixeltable/functions/huggingface.py,sha256=
|
|
88
|
-
pixeltable/functions/image.py,sha256=
|
|
88
|
+
pixeltable/functions/huggingface.py,sha256=KM1OH0Jt6XWF2jfpHb6rGhi1mV-AQNYAsHAyQfzW4qw,20560
|
|
89
|
+
pixeltable/functions/image.py,sha256=IKXljMma-uU88efptC3F4aywau7DYcD-Nqd3YpmRNRw,13971
|
|
89
90
|
pixeltable/functions/json.py,sha256=Pkqkhf_1ot6RL2JB9Kw6NQAj0-nVn1eSfeHpdq5vr1M,770
|
|
90
91
|
pixeltable/functions/llama_cpp.py,sha256=uf7WSZIhKDa492snnQv5ojGVLNdBWvuw0Ou3Mch1c_I,3874
|
|
91
92
|
pixeltable/functions/math.py,sha256=SnAdjL7FIyEju2k3gEpk2ywn5zMmk7yGzD48JtTCX_0,1554
|
|
92
|
-
pixeltable/functions/mistralai.py,sha256=
|
|
93
|
+
pixeltable/functions/mistralai.py,sha256=yZge5T385RoiFGXEZ6OhwWHj0JnsZ8tN8Jb3VkfDmXc,6274
|
|
93
94
|
pixeltable/functions/ollama.py,sha256=AmkP532HwWeTyWkTnHm_hIk0CFjzV5MwCCPnM9Kb7KM,4231
|
|
94
|
-
pixeltable/functions/openai.py,sha256=
|
|
95
|
+
pixeltable/functions/openai.py,sha256=aDh1L2mBbSlrM8c1Rbh2QsCnmBESItLqzZ-frdgb05k,29259
|
|
95
96
|
pixeltable/functions/replicate.py,sha256=SLMPNi44QMa16TVTImZRkNMXXyRZ0mmpnK6P5uXQE0k,2467
|
|
96
97
|
pixeltable/functions/string.py,sha256=ToLodCr1MRVaLhzaUe5NbGNYHR9ENNpmKztSstkz5O4,20201
|
|
97
98
|
pixeltable/functions/timestamp.py,sha256=0zp4urJagCcNLfJE0ltTCft-J9qs2C716TmRngKYaa0,9171
|
|
98
|
-
pixeltable/functions/together.py,sha256=
|
|
99
|
+
pixeltable/functions/together.py,sha256=ufg0RehEoQEqBy9EHSKY4N3ZNT5O__cwDS0Ll467eLk,10014
|
|
99
100
|
pixeltable/functions/util.py,sha256=lVya13gcao8T34OGX7zy1cglQPNwaBbSBw57bVPyHNs,745
|
|
100
101
|
pixeltable/functions/video.py,sha256=rrKYGCEm-oJVQnjiNbEjDykusAtaQDLrYFNqv8Twwcw,6948
|
|
101
102
|
pixeltable/functions/vision.py,sha256=_a0wY3akkVhWnnxlq__1VzSLylytlNadpNOOPOwSfLk,15393
|
|
@@ -106,15 +107,15 @@ pixeltable/index/base.py,sha256=jrE2Sack14_o_oFWkQf_qdDCSQ85SCZLcJX4GhU_JaY,1527
|
|
|
106
107
|
pixeltable/index/btree.py,sha256=m4eUk8jVG5h2VW_IcsmWG4GN-FFk0uFHyDF6FSw_gbM,2299
|
|
107
108
|
pixeltable/index/embedding_index.py,sha256=W-PO-ytmh1UTSZHDIGMJiVInwQUR5WGouEvFwVF39e4,11552
|
|
108
109
|
pixeltable/io/__init__.py,sha256=Yjq13pBCBoaZv-OkIY2XSusVOC5b6cB5C6NbgJq5H1g,620
|
|
109
|
-
pixeltable/io/datarows.py,sha256=
|
|
110
|
+
pixeltable/io/datarows.py,sha256=p1UGxQOTjqI6kgQNAa3aj8TkylcNDtaGBTorOg_Pk84,6088
|
|
110
111
|
pixeltable/io/external_store.py,sha256=5gHSHLi-pPWHJ4OtVtY2vxrcbLG899hNMEcLvBfvYqI,16719
|
|
111
112
|
pixeltable/io/fiftyone.py,sha256=v0r28bIk2I0TRP5DfVHtBIUa4DpIJDK5sgExxOmHZ_w,6882
|
|
112
113
|
pixeltable/io/globals.py,sha256=Z8ww-Pcm59ql1tvame8z0Mu1thIy5BPbW-TswGRXt4s,11368
|
|
113
114
|
pixeltable/io/hf_datasets.py,sha256=VbQvRaUqmiKiIUeek_yf3-uAXlPRxpB62bUUQRQ_A_c,5356
|
|
114
|
-
pixeltable/io/label_studio.py,sha256=
|
|
115
|
-
pixeltable/io/pandas.py,sha256=
|
|
115
|
+
pixeltable/io/label_studio.py,sha256=uB-LReXf1l2OMuzJEENxJP-0C14r14VEmsIulK8Yr3s,31261
|
|
116
|
+
pixeltable/io/pandas.py,sha256=IoY73ohdW3wMyxx8PpWYa9YJML6RqFpXCAR1-ceI64E,8477
|
|
116
117
|
pixeltable/io/parquet.py,sha256=ezWHy5XnErEt4EmYDYQHrmIQLXrYChA26qVwiPoBfRQ,7672
|
|
117
|
-
pixeltable/io/table_data_conduit.py,sha256=
|
|
118
|
+
pixeltable/io/table_data_conduit.py,sha256=gdjr82HxJpDfH55xmbIUCX5V-Hkaj6Kmo25NESKChtk,23205
|
|
118
119
|
pixeltable/io/utils.py,sha256=YMfhpqMitWz1PhXJGkCNOgNtEM1AZ55S0zXVhljC5kY,4260
|
|
119
120
|
pixeltable/iterators/__init__.py,sha256=bU4EmbX85J1URmRw6G71f2I77b1ctqngEOwDmRB3T0w,455
|
|
120
121
|
pixeltable/iterators/audio.py,sha256=wSVGdL5GeO3uY_lU-pNlY49E5dExIaJWY6oaXm-MnSU,9150
|
|
@@ -132,7 +133,7 @@ pixeltable/metadata/converters/convert_15.py,sha256=wKTdBt8p9GlUM3yBZFX-37J0c0_x
|
|
|
132
133
|
pixeltable/metadata/converters/convert_16.py,sha256=9sRigN4h3UHEurV1zAwO8AwE_ERkvxNVTUPFiV9h4MU,493
|
|
133
134
|
pixeltable/metadata/converters/convert_17.py,sha256=LmE8uAk2yPRN5Ddk8I_KOZjUGBKSUe-s-PoJl9ltWEE,878
|
|
134
135
|
pixeltable/metadata/converters/convert_18.py,sha256=SylkXMoBPXwKEmUV72ah_5xSGNNLPWwib3km0tUE-68,1461
|
|
135
|
-
pixeltable/metadata/converters/convert_19.py,sha256=
|
|
136
|
+
pixeltable/metadata/converters/convert_19.py,sha256=NfU9Z6svr-x0UwVhjj1NTIZxV0QaDttGv9SIB4v_j0U,2036
|
|
136
137
|
pixeltable/metadata/converters/convert_20.py,sha256=M6w3FuJypRsqUUX3K1b5sTKaQcOug6asosMfnhbUv_c,2746
|
|
137
138
|
pixeltable/metadata/converters/convert_21.py,sha256=w35qzY6EfxBap3r_WEdXKTmtczsGV9KKfBOR18Ivl84,1095
|
|
138
139
|
pixeltable/metadata/converters/convert_22.py,sha256=rQu4kCyCI0UguU2D4fJK8YqS-01DnOTs6H0Puzu_TV8,591
|
|
@@ -153,7 +154,7 @@ pixeltable/metadata/schema.py,sha256=EKmx29vfQo3eGD2uCJW_lPalPialSb2oUSBGTyewduE
|
|
|
153
154
|
pixeltable/plan.py,sha256=s2wS4DIBzr19QlGCJNdPVZ_Od1FVJpTGEb7opNbHtHM,43260
|
|
154
155
|
pixeltable/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
155
156
|
pixeltable/share/__init__.py,sha256=zTJtLn0F7-5DgSIpxUvFQPO2LP7AOw9xjEaD30RH62U,58
|
|
156
|
-
pixeltable/share/packager.py,sha256=
|
|
157
|
+
pixeltable/share/packager.py,sha256=OZzrsnzfTUqkF4t1-ZMIsXmutqCCMFRlG4MDwRcP9Ik,11116
|
|
157
158
|
pixeltable/share/publish.py,sha256=pnldL8_k71Ta9Mn_KDothhizB83Nm8Q3IsESmr9gg3k,4643
|
|
158
159
|
pixeltable/store.py,sha256=G1kCi4rEFg__driaB0fGRQ8dip2YPO83bZtwXqhwoOg,22668
|
|
159
160
|
pixeltable/type_system.py,sha256=xGRgz6tQzmBDZ3Lvzq7vTfD1WDJg-pa7UUMw1vv0PeE,52378
|
|
@@ -176,8 +177,8 @@ pixeltable/utils/pytorch.py,sha256=rrqXn6KVXmABEPGLjjq3qYINfCCv9SbpfPFmSx9KyGQ,3
|
|
|
176
177
|
pixeltable/utils/s3.py,sha256=pxip2MlCqd2Qon2dzJXzfxvwtZyc-BAsjAnLL4J_OXY,587
|
|
177
178
|
pixeltable/utils/sql.py,sha256=Sa4Lh-VGe8GToU5W7DRiWf2lMl9B6saPqemiT0ZdHEc,806
|
|
178
179
|
pixeltable/utils/transactional_directory.py,sha256=OFKmu90oP7KwBAljwjnzP_w8euGdAXob3y4Nx9SCNHA,1357
|
|
179
|
-
pixeltable-0.3.
|
|
180
|
-
pixeltable-0.3.
|
|
181
|
-
pixeltable-0.3.
|
|
182
|
-
pixeltable-0.3.
|
|
183
|
-
pixeltable-0.3.
|
|
180
|
+
pixeltable-0.3.13.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
181
|
+
pixeltable-0.3.13.dist-info/METADATA,sha256=B0_JugfJxEKMaDJk0vcOEvczsCkEkQWWib78X11zazE,20629
|
|
182
|
+
pixeltable-0.3.13.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
183
|
+
pixeltable-0.3.13.dist-info/entry_points.txt,sha256=ToOd-pRgG7AitEBgYoBCRRB4-KVDQ0pj_9T4a1LgwA4,97
|
|
184
|
+
pixeltable-0.3.13.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|