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 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.12'
3
- __version_tuple__ = (0, 3, 12)
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}'
@@ -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._base._path() if self._base is not None else None
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
- def _base(self) -> Optional['Table']:
259
- """
260
- The base table of this `Table`. If this table is a view, returns the `Table`
261
- from which it was derived. Otherwise, returns `None`.
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 _bases(self) -> list['Table']:
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._base
267
+ base = self._base_table
275
268
  while base is not None:
276
269
  bases.append(base)
277
- base = 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._title_descriptor())
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
- def _title_descriptor(self) -> str:
316
- title: str
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
 
@@ -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:
@@ -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
- _, input_col_map = input.to_cte()
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._bases]
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] = {}
@@ -5,6 +5,7 @@ from pixeltable.utils.code import local_public_names
5
5
  from . import (
6
6
  anthropic,
7
7
  audio,
8
+ bedrock,
8
9
  deepseek,
9
10
  fireworks,
10
11
  gemini,
@@ -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= messages(msgs, model='claude-3-haiku-20240307'))
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) -> pxt.ArrayType:
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 pxt.ArrayType((model.get_sentence_embedding_dimension(),), dtype=pxt.FloatType(), nullable=False)
70
+ return ts.ArrayType((model.get_sentence_embedding_dimension(),), dtype=ts.FloatType(), nullable=False)
70
71
  except ImportError:
71
- return pxt.ArrayType((None,), dtype=pxt.FloatType(), nullable=False)
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) -> pxt.ArrayType:
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 pxt.ArrayType((model.config.projection_dim,), dtype=pxt.FloatType(), nullable=False)
208
+ return ts.ArrayType((model.config.projection_dim,), dtype=ts.FloatType(), nullable=False)
208
209
  except ImportError:
209
- return pxt.ArrayType((None,), dtype=pxt.FloatType(), nullable=False)
210
+ return ts.ArrayType((None,), dtype=ts.FloatType(), nullable=False)
210
211
 
211
212
 
212
213
  @pxt.udf(batch_size=4)
@@ -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) -> pxt.ColumnType:
92
+ def _(self: Expr, mode: str) -> ts.ColumnType:
92
93
  input_type = self.col_type
93
- assert isinstance(input_type, pxt.ImageType)
94
- return pxt.ImageType(size=input_type.size, mode=mode, nullable=input_type.nullable)
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]) -> pxt.ColumnType:
112
+ def _(self: Expr, box: tuple[int, int, int, int]) -> ts.ColumnType:
112
113
  input_type = self.col_type
113
- assert isinstance(input_type, pxt.ImageType)
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 pxt.ImageType(
116
- size=(box[2] - box[0], box[3] - box[1]), mode=input_type.mode, nullable=input_type.nullable
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) -> pxt.ColumnType:
136
+ def _(self: Expr) -> ts.ColumnType:
138
137
  input_type = self.col_type
139
- assert isinstance(input_type, pxt.ImageType)
140
- return pxt.ImageType(size=input_type.size, mode='L', nullable=input_type.nullable)
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]) -> pxt.ColumnType:
185
+ def _(self: Expr, size: tuple[int, int]) -> ts.ColumnType:
187
186
  input_type = self.col_type
188
- assert isinstance(input_type, pxt.ImageType)
189
- return pxt.ImageType(size=size, mode=input_type.mode, nullable=input_type.nullable)
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) -> pxt.ColumnType:
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) -> pxt.ArrayType:
180
+ def _(model: str) -> ts.ArrayType:
180
181
  dimensions = _embedding_dimensions_cache.get(model) # `None` if unknown model
181
- return pxt.ArrayType((dimensions,), dtype=pxt.FloatType())
182
+ return ts.ArrayType((dimensions,), dtype=ts.FloatType())
182
183
 
183
184
 
184
185
  _T = TypeVar('_T')
@@ -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) -> pxt.ArrayType:
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 pxt.ArrayType((None,), dtype=pxt.FloatType(), nullable=False)
674
+ return ts.ArrayType((None,), dtype=ts.FloatType(), nullable=False)
674
675
  dimensions = _embedding_dimensions_cache.get(model)
675
- return pxt.ArrayType((dimensions,), dtype=pxt.FloatType(), nullable=False)
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) -> pxt.ImageType:
742
+ def _(size: Optional[str] = None) -> ts.ImageType:
742
743
  if size is None:
743
- return pxt.ImageType(size=(1024, 1024))
744
+ return ts.ImageType(size=(1024, 1024))
744
745
  x_pos = size.find('x')
745
746
  if x_pos == -1:
746
- return pxt.ImageType()
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 pxt.ImageType()
751
- return pxt.ImageType(size=(width, height))
751
+ return ts.ImageType()
752
+ return ts.ImageType(size=(width, height))
752
753
 
753
754
 
754
755
  #####################################
@@ -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) -> pxt.ArrayType:
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 pxt.ArrayType((None,), dtype=pxt.FloatType())
232
+ return ts.ArrayType((None,), dtype=ts.FloatType())
232
233
  dimensions = _embedding_dimensions_cache[model]
233
- return pxt.ArrayType((dimensions,), dtype=pxt.FloatType())
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, pxt.ColumnType]:
12
- schema: dict[str, pxt.ColumnType] = {}
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 = pxt.ColumnType.infer_literal_type(value, nullable=col_name not in primary_key)
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} '
@@ -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 pxt
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, pxt.ColumnType]:
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, pxt.ColumnType]:
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": pxt.JsonType(nullable=True)}
103
+ {"annotations": ts.JsonType(nullable=True)}
104
104
  ```
105
105
  """
106
- return {ANNOTATIONS_COLUMN: pxt.JsonType(nullable=True)}
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._base is not None
416
- ancestor = ancestor._base
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: pxt.JsonType(nullable=True)})
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: pxt.JsonType(nullable=True)}, col_mapping
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: pxt.ColumnType
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, pxt.ColumnType]:
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: pxt.JsonType() for name in self.rectangle_labels}
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': pxt.StringType(),
686
- 'text': pxt.StringType(),
687
- 'image': pxt.ImageType(),
688
- 'video': pxt.VideoType(),
689
- 'audio': pxt.AudioType(),
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, pxt.ColumnType], primary_key: list[str]
123
- ) -> dict[str, pxt.ColumnType]:
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, pxt.ColumnType] = {}
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[pxt.ColumnType]:
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
- pxt.ColumnType: A pixeltable ColumnType
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 pxt.TimestampType(nullable=nullable)
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 pxt.ArrayType.from_np_dtype(pd_dtype, nullable)
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) -> pxt.ColumnType:
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 pxt.FloatType(nullable=nullable)
180
+ return ts.FloatType(nullable=nullable)
180
181
 
181
- inferred_type = pxt.ColumnType.infer_common_literal_type(data_col)
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 pxt.StringType(nullable=nullable)
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, pxt.ColumnType], col_mapping: Optional[dict[str, 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] = pxt.ColumnType.normalize_type(coltype)
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] = pxt.StringType(nullable=True)
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 pxt
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'] == pxt.ColumnType.Type.TIMESTAMP.name
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
@@ -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._bases)
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.12
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=Z0MfZlFI062slLkXfKM-LBwnU5mzDXL1rH590cZGZmo,1673
2
- pixeltable/__version__.py,sha256=8uFR7F1FvhAJZVB_O7-LoYs_kNA6FS4Knmjr_gvBaUE,114
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=Ote3E1kcOQ5SJOKrwRSqiKsjEujht9Vi_KO3dwd_0k8,8582
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=pXKfC1fgLV8qdWK8zSRJSsr3-OQxPKZAPaO_rgO7wEc,65442
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=iwqj9E-AxPK52XqyCjltbEU14dnImhFbvWpRoysjXr0,11579
16
+ pixeltable/catalog/view.py,sha256=ZtfNoAMeqcKB7MoPfzPPRQJvniCIrYxQjqs5KI3xXog,13033
17
17
  pixeltable/config.py,sha256=gnRI4G9GE7mQJDcMcn8JsEzYk8oKVfHB-BwoLRWnRDo,3971
18
- pixeltable/dataframe.py,sha256=4RnQtRVJSWNzpJPQued9lyXSU3FW1Zeul502WCOxDQk,49585
18
+ pixeltable/dataframe.py,sha256=dAR4-iLkcu8AllvP85_17u5PankzBOdm2Zanp6JR0iY,49605
19
19
  pixeltable/env.py,sha256=uQ8LZG-KU96Jhgs0wAUOn0rrj1ouAeliavnJPgvDx_Q,36250
20
- pixeltable/exceptions.py,sha256=NuFY2WtkQpLfLHT_J70kOw9Tr0kEDkkgo-u7As4Gaq4,410
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=NiFhqAdKKXfWZC4qoaxUEfW8Dfa4XtbSXjSVuYwuAd4,17009
30
- pixeltable/exec/expr_eval/expr_eval_node.py,sha256=KJO-Z9jLVITc-m1oIlZ3Tf5wm02OPFHC4yQx49UfcHU,19050
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=4UmnUP50sCNRZ1eCtRauoKdosPL7tlJqnqXZI_w1u90,19752
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=anBoJUAjUa46_SbZuIVLRpRCmW_D9Ce1UeV0NyeWR3Y,13213
80
- pixeltable/functions/__init__.py,sha256=egLhhTusyiP9GkwImx8wT4nwO-eTxkmSPJ7NEn8TFmw,555
81
- pixeltable/functions/anthropic.py,sha256=-NYawpiNJkYrZLvF1MA6JxlQBId0sNTNKnuw-tF9XKY,9324
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=EDOR4ADKPI9vPYAxu2nE-n3DAfk97odAK1z2C9BwYLQ,20534
88
- pixeltable/functions/image.py,sha256=UgUzA8GWsYtA3yyq_Ypx8pyksQwAihZTflR8g6jgk20,13971
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=ZQeGNCFNRhh7KZ5d0C7mabY2hRl9c-vOQUH5zvunmDs,6241
93
+ pixeltable/functions/mistralai.py,sha256=yZge5T385RoiFGXEZ6OhwWHj0JnsZ8tN8Jb3VkfDmXc,6274
93
94
  pixeltable/functions/ollama.py,sha256=AmkP532HwWeTyWkTnHm_hIk0CFjzV5MwCCPnM9Kb7KM,4231
94
- pixeltable/functions/openai.py,sha256=1KLOwKrNGUFwJImMe1iDKnZg4Q3rB_eEnK3I73u-774,29233
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=GBQKJz2AUs-KDIU25-_Yyp76X5z-ZKXKq3geQbi1ebw,9983
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=6JGt5AqLvBx1fYwfMvRwVBRaOBsBLurXHhV6B22ZBPQ,6055
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=Q-SacWYox0g8lBVWl8IxVrZhYE6NeR29aB_Iwc6GDyg,31252
115
- pixeltable/io/pandas.py,sha256=IeIOb_HOhARFlG112u6SqoXp4xd8Z6QlG1ADGGZcyp4,8453
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=QUA94tsXAC2ak3axSoQEcxSGyNFR0VJz4gl9t43eFbQ,22987
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=9weimsB_U-rSWzALzKRCNdW_6fQ2mcq1IaiSDYSpn7k,2026
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=mDVfOkkkc2rWEfLX35vKBuUkYQenkTKT6MhkqqXNj6U,11110
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.12.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
180
- pixeltable-0.3.12.dist-info/METADATA,sha256=x0ONNIBctMVl4Ir9bnLJxwSYs-a9gCdNzYldkYGu4vU,20629
181
- pixeltable-0.3.12.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
182
- pixeltable-0.3.12.dist-info/entry_points.txt,sha256=ToOd-pRgG7AitEBgYoBCRRB4-KVDQ0pj_9T4a1LgwA4,97
183
- pixeltable-0.3.12.dist-info/RECORD,,
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,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.2
2
+ Generator: poetry-core 2.1.3
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any