corvic-engine 0.3.0rc82__cp38-abi3-win_amd64.whl → 0.3.0rc84__cp38-abi3-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,26 +1,34 @@
1
1
  """Data modeling objects for creating corvic pipelines."""
2
2
 
3
- import corvic.model._feature_type as feature_type
4
- from corvic.model._base_model import (
5
- BaseModel,
6
- BelongsToOrgModel,
7
- BelongsToRoomModel,
8
- HasProtoSelf,
9
- UsesOrmID,
10
- non_empty_timestamp_to_datetime,
3
+ import corvic.emodel._feature_type as feature_type
4
+ from corvic import transfer
5
+ from corvic.emodel._base_model import (
6
+ BelongsToOrgModelMixin,
7
+ BelongsToRoomModelMixin,
8
+ HasIdOrmBackedModel,
9
+ NoIdModel,
10
+ OrgWideStandardModel,
11
+ OrmBelongsToRoomT,
12
+ OrmHasIdBelongsToOrgT,
13
+ OrmHasIdBelongsToRoomT,
14
+ ProtoBelongsToOrgT,
15
+ ProtoBelongsToRoomT,
16
+ ProtoHasIdBelongsToOrgT,
17
+ ProtoHasIdBelongsToRoomT,
18
+ StandardModel,
11
19
  )
12
- from corvic.model._completion_model import (
20
+ from corvic.emodel._completion_model import (
13
21
  CompletionModel,
14
22
  CompletionModelID,
15
23
  )
16
- from corvic.model._feature_view import (
24
+ from corvic.emodel._feature_view import (
17
25
  Column,
18
26
  DeepGnnCsvUrlMetadata,
19
27
  FeatureView,
20
28
  FeatureViewEdgeTableMetadata,
21
29
  FeatureViewRelationshipsMetadata,
22
30
  )
23
- from corvic.model._pipeline import (
31
+ from corvic.emodel._pipeline import (
24
32
  ChunkPdfsPipeline,
25
33
  OcrPdfsPipeline,
26
34
  Pipeline,
@@ -29,29 +37,22 @@ from corvic.model._pipeline import (
29
37
  SpecificPipeline,
30
38
  UnknownTransformationPipeline,
31
39
  )
32
- from corvic.model._proto_orm_convert import (
33
- UNCOMMITTED_ID_PREFIX,
34
- OrmBelongsToOrgObj,
35
- OrmBelongsToRoomObj,
36
- OrmObj,
37
- ProtoBelongsToOrgObj,
38
- ProtoBelongsToRoomObj,
39
- ProtoObj,
40
+ from corvic.emodel._proto_orm_convert import (
40
41
  add_orm_org_mixin_to_session,
41
42
  add_orm_room_mixin_to_session,
42
43
  space_orm_to_proto,
43
44
  timestamp_orm_to_proto,
44
45
  )
45
- from corvic.model._resource import (
46
+ from corvic.emodel._resource import (
46
47
  Resource,
47
48
  ResourceID,
48
49
  )
49
- from corvic.model._room import (
50
+ from corvic.emodel._room import (
50
51
  Room,
51
52
  RoomID,
52
53
  )
53
- from corvic.model._source import Source, SourceID
54
- from corvic.model._space import (
54
+ from corvic.emodel._source import Source, SourceID
55
+ from corvic.emodel._space import (
55
56
  ConcatAndEmbedParameters,
56
57
  EmbedAndConcatParameters,
57
58
  EmbedImageParameters,
@@ -71,11 +72,11 @@ from corvic.model._space import (
71
72
  )
72
73
 
73
74
  FeatureType = feature_type.FeatureType
75
+ OrmIdT = transfer.OrmIdT
74
76
 
75
77
  __all__ = [
76
- "BaseModel",
77
- "BelongsToOrgModel",
78
- "BelongsToRoomModel",
78
+ "BelongsToOrgModelMixin",
79
+ "BelongsToRoomModelMixin",
79
80
  "ChunkPdfsPipeline",
80
81
  "Column",
81
82
  "CompletionModel",
@@ -88,18 +89,22 @@ __all__ = [
88
89
  "FeatureView",
89
90
  "FeatureViewEdgeTableMetadata",
90
91
  "FeatureViewRelationshipsMetadata",
91
- "HasProtoSelf",
92
+ "HasIdOrmBackedModel",
92
93
  "ImageSpace",
94
+ "NoIdModel",
93
95
  "Node2VecParameters",
94
96
  "OcrPdfsPipeline",
95
- "OrmObj",
96
- "OrmBelongsToOrgObj",
97
- "OrmBelongsToRoomObj",
97
+ "OrgWideStandardModel",
98
+ "OrmBelongsToRoomT",
99
+ "OrmHasIdBelongsToOrgT",
100
+ "OrmHasIdBelongsToRoomT",
101
+ "OrmIdT",
98
102
  "Pipeline",
99
103
  "PipelineID",
100
- "ProtoObj",
101
- "ProtoBelongsToOrgObj",
102
- "ProtoBelongsToRoomObj",
104
+ "ProtoBelongsToOrgT",
105
+ "ProtoBelongsToRoomT",
106
+ "ProtoHasIdBelongsToOrgT",
107
+ "ProtoHasIdBelongsToRoomT",
103
108
  "RelationalSpace",
104
109
  "Resource",
105
110
  "ResourceID",
@@ -113,11 +118,10 @@ __all__ = [
113
118
  "SpecificPipeline",
114
119
  "SpecificSpace",
115
120
  "SpecificSpaceParameters",
121
+ "StandardModel",
116
122
  "TabularSpace",
117
- "UNCOMMITTED_ID_PREFIX",
118
- "UnknownTransformationPipeline",
119
123
  "UnknownSpace",
120
- "UsesOrmID",
124
+ "UnknownTransformationPipeline",
121
125
  "add_orm_org_mixin_to_session",
122
126
  "add_orm_room_mixin_to_session",
123
127
  "embedding_model_proto_to_name",
@@ -125,7 +129,6 @@ __all__ = [
125
129
  "image_model_can_embed_images",
126
130
  "image_model_can_embed_text",
127
131
  "image_model_proto_to_name",
128
- "non_empty_timestamp_to_datetime",
129
132
  "space_orm_to_proto",
130
133
  "timestamp_orm_to_proto",
131
134
  ]
@@ -0,0 +1,161 @@
1
+ import datetime
2
+ from collections.abc import Callable, Iterable
3
+ from typing import Generic
4
+
5
+ import sqlalchemy as sa
6
+ import sqlalchemy.orm as sa_orm
7
+
8
+ from corvic import eorm, system, transfer
9
+ from corvic.emodel._proto_orm_convert import (
10
+ OrmBelongsToRoomT,
11
+ OrmHasIdBelongsToOrgT,
12
+ OrmHasIdBelongsToRoomT,
13
+ ProtoBelongsToOrgT,
14
+ ProtoBelongsToRoomT,
15
+ ProtoHasIdBelongsToOrgT,
16
+ ProtoHasIdBelongsToRoomT,
17
+ )
18
+ from corvic.result import (
19
+ InvalidArgumentError,
20
+ NotFoundError,
21
+ Ok,
22
+ )
23
+
24
+
25
+ def _make_room_filter_query_transfrom(
26
+ room_id: eorm.RoomID | None,
27
+ existing_transform: Callable[
28
+ [sa.Select[tuple[transfer.OrmT]]], sa.Select[tuple[transfer.OrmT]]
29
+ ]
30
+ | None,
31
+ ):
32
+ def query_transform(
33
+ query: sa.Select[tuple[transfer.OrmT]],
34
+ ) -> sa.Select[tuple[transfer.OrmT]]:
35
+ if room_id:
36
+ query = query.filter_by(room_id=room_id)
37
+ if existing_transform:
38
+ query = existing_transform(query)
39
+ return query
40
+
41
+ if room_id:
42
+ return query_transform
43
+ return existing_transform
44
+
45
+
46
+ class OrmBackedModel(
47
+ Generic[transfer.ProtoT, transfer.OrmT],
48
+ transfer.OrmBackedProto[transfer.ProtoT, transfer.OrmT],
49
+ ):
50
+ @classmethod
51
+ def list_as_proto(
52
+ cls,
53
+ client: system.Client,
54
+ *,
55
+ limit: int | None = None,
56
+ room_id: eorm.RoomID | None = None,
57
+ created_before: datetime.datetime | None = None,
58
+ additional_query_transform: Callable[
59
+ [sa.Select[tuple[transfer.OrmT]]], sa.Select[tuple[transfer.OrmT]]
60
+ ]
61
+ | None = None,
62
+ existing_session: sa_orm.Session | None = None,
63
+ ) -> Ok[list[transfer.ProtoT]] | NotFoundError | InvalidArgumentError:
64
+ return super().list_as_proto(
65
+ client,
66
+ limit=limit,
67
+ created_before=created_before,
68
+ additional_query_transform=_make_room_filter_query_transfrom(
69
+ room_id, additional_query_transform
70
+ ),
71
+ existing_session=existing_session,
72
+ )
73
+
74
+
75
+ class HasIdOrmBackedModel(
76
+ Generic[transfer.OrmIdT, transfer.ProtoHasIdT, transfer.OrmHasIdT],
77
+ transfer.HasIdOrmBackedProto[
78
+ transfer.OrmIdT, transfer.ProtoHasIdT, transfer.OrmHasIdT
79
+ ],
80
+ ):
81
+ @classmethod
82
+ def list_as_proto(
83
+ cls,
84
+ client: system.Client,
85
+ *,
86
+ limit: int | None = None,
87
+ room_id: eorm.RoomID | None = None,
88
+ created_before: datetime.datetime | None = None,
89
+ ids: Iterable[transfer.OrmIdT] | None = None,
90
+ additional_query_transform: Callable[
91
+ [sa.Select[tuple[transfer.OrmHasIdT]]], sa.Select[tuple[transfer.OrmHasIdT]]
92
+ ]
93
+ | None = None,
94
+ existing_session: sa_orm.Session | None = None,
95
+ ) -> Ok[list[transfer.ProtoHasIdT]] | NotFoundError | InvalidArgumentError:
96
+ return super().list_as_proto(
97
+ client,
98
+ limit=limit,
99
+ created_before=created_before,
100
+ ids=ids,
101
+ additional_query_transform=_make_room_filter_query_transfrom(
102
+ room_id, additional_query_transform
103
+ ),
104
+ existing_session=existing_session,
105
+ )
106
+
107
+
108
+ class BelongsToOrgModelMixin(
109
+ Generic[ProtoBelongsToOrgT], transfer.HasProtoSelf[ProtoBelongsToOrgT]
110
+ ):
111
+ """Base for orm wrappers with org mixin providing a unified update mechanism."""
112
+
113
+ @property
114
+ def org_id(self) -> eorm.OrgID:
115
+ return eorm.OrgID().from_str(self.proto_self.org_id)
116
+
117
+
118
+ class BelongsToRoomModelMixin(
119
+ Generic[ProtoBelongsToRoomT], transfer.HasProtoSelf[ProtoBelongsToRoomT]
120
+ ):
121
+ """Base for orm wrappers with room mixin providing a unified update mechanism."""
122
+
123
+ @property
124
+ def room_id(self) -> eorm.RoomID:
125
+ return eorm.RoomID().from_str(self.proto_self.room_id)
126
+
127
+
128
+ class OrgWideStandardModel(
129
+ Generic[transfer.OrmIdT, ProtoHasIdBelongsToOrgT, OrmHasIdBelongsToOrgT],
130
+ BelongsToOrgModelMixin[ProtoHasIdBelongsToOrgT],
131
+ HasIdOrmBackedModel[
132
+ transfer.OrmIdT, ProtoHasIdBelongsToOrgT, OrmHasIdBelongsToOrgT
133
+ ],
134
+ ):
135
+ """Base for most models, though the lion's share are StandardModels.
136
+
137
+ Most models are typically referenced by an ID, and belong to an org.
138
+ """
139
+
140
+
141
+ class StandardModel(
142
+ Generic[transfer.OrmIdT, ProtoHasIdBelongsToRoomT, OrmHasIdBelongsToRoomT],
143
+ BelongsToRoomModelMixin[ProtoHasIdBelongsToRoomT],
144
+ OrgWideStandardModel[
145
+ transfer.OrmIdT, ProtoHasIdBelongsToRoomT, OrmHasIdBelongsToRoomT
146
+ ],
147
+ ):
148
+ """Base for most models.
149
+
150
+ Like OrgWideStandardModel, but more specific. The majority of models belong to a
151
+ room.
152
+ """
153
+
154
+
155
+ class NoIdModel(
156
+ Generic[ProtoBelongsToRoomT, OrmBelongsToRoomT],
157
+ BelongsToRoomModelMixin[ProtoBelongsToRoomT],
158
+ BelongsToOrgModelMixin[ProtoBelongsToRoomT],
159
+ transfer.OrmBackedProto[ProtoBelongsToRoomT, OrmBelongsToRoomT],
160
+ ):
161
+ """Like StandardModel, but for objects that are not usually referenced by ID."""
@@ -9,10 +9,10 @@ from typing import Literal, TypeAlias
9
9
 
10
10
  from sqlalchemy import orm as sa_orm
11
11
 
12
- from corvic import eorm, system
13
- from corvic.model._base_model import BelongsToOrgModel, non_empty_timestamp_to_datetime
14
- from corvic.model._defaults import Defaults
15
- from corvic.model._proto_orm_convert import (
12
+ from corvic import eorm, system, transfer
13
+ from corvic.emodel._base_model import OrgWideStandardModel
14
+ from corvic.emodel._defaults import Defaults
15
+ from corvic.emodel._proto_orm_convert import (
16
16
  completion_model_delete_orms,
17
17
  completion_model_orm_to_proto,
18
18
  completion_model_proto_to_orm,
@@ -26,9 +26,9 @@ OrgID: TypeAlias = eorm.OrgID
26
26
 
27
27
 
28
28
  class CompletionModel(
29
- BelongsToOrgModel[
29
+ OrgWideStandardModel[
30
30
  CompletionModelID, models_pb2.CompletionModel, eorm.CompletionModel
31
- ]
31
+ ],
32
32
  ):
33
33
  """Completion Models."""
34
34
 
@@ -112,11 +112,13 @@ class CompletionModel(
112
112
 
113
113
  @property
114
114
  def last_validation_time(self) -> datetime.datetime | None:
115
- return non_empty_timestamp_to_datetime(self.proto_self.last_validation_time)
115
+ return transfer.non_empty_timestamp_to_datetime(
116
+ self.proto_self.last_validation_time
117
+ )
116
118
 
117
119
  @property
118
120
  def last_successful_validation(self) -> datetime.datetime | None:
119
- return non_empty_timestamp_to_datetime(
121
+ return transfer.non_empty_timestamp_to_datetime(
120
122
  self.proto_self.last_successful_validation
121
123
  )
122
124
 
@@ -1,4 +1,4 @@
1
- import corvic.model._source as source
1
+ import corvic.emodel._source as source
2
2
  from corvic.op_graph import feature_type
3
3
 
4
4
  # types
@@ -16,15 +16,15 @@ from more_itertools import flatten
16
16
  from sqlalchemy import orm as sa_orm
17
17
  from sqlalchemy.orm.interfaces import LoaderOption
18
18
 
19
- from corvic import eorm, op_graph, system
20
- from corvic.model._base_model import BelongsToRoomModel, UsesOrmID
21
- from corvic.model._defaults import Defaults
22
- from corvic.model._proto_orm_convert import (
19
+ from corvic import eorm, op_graph, system, transfer
20
+ from corvic.emodel._base_model import StandardModel
21
+ from corvic.emodel._defaults import Defaults
22
+ from corvic.emodel._proto_orm_convert import (
23
23
  feature_view_delete_orms,
24
24
  feature_view_orm_to_proto,
25
25
  feature_view_proto_to_orm,
26
26
  )
27
- from corvic.model._source import Source, SourceID
27
+ from corvic.emodel._source import Source, SourceID
28
28
  from corvic.result import InvalidArgumentError, NotFoundError, Ok
29
29
  from corvic.table import (
30
30
  DataclassAsTypedMetadataMixin,
@@ -539,7 +539,9 @@ class RelationshipPath:
539
539
  return f"end-{uuid.uuid4()}"
540
540
 
541
541
 
542
- class FeatureViewSource(UsesOrmID[FeatureViewSourceID, models_pb2.FeatureViewSource]):
542
+ class FeatureViewSource(
543
+ transfer.UsesOrmID[FeatureViewSourceID, models_pb2.FeatureViewSource]
544
+ ):
543
545
  """A table from a source with some extra operations defined by a feature view."""
544
546
 
545
547
  @classmethod
@@ -642,7 +644,7 @@ class DeepGnnCsvUrlMetadata(DataclassAsTypedMetadataMixin):
642
644
 
643
645
 
644
646
  class FeatureView(
645
- BelongsToRoomModel[FeatureViewID, models_pb2.FeatureView, eorm.FeatureView]
647
+ StandardModel[FeatureViewID, models_pb2.FeatureView, eorm.FeatureView]
646
648
  ):
647
649
  """FeatureViews describe how Sources should be modeled to create a feature space.
648
650
 
@@ -14,14 +14,14 @@ from sqlalchemy.orm.interfaces import LoaderOption
14
14
 
15
15
  import corvic.table
16
16
  from corvic import eorm, op_graph, system
17
- from corvic.model._base_model import BelongsToRoomModel
18
- from corvic.model._defaults import Defaults
19
- from corvic.model._proto_orm_convert import (
17
+ from corvic.emodel._base_model import StandardModel
18
+ from corvic.emodel._defaults import Defaults
19
+ from corvic.emodel._proto_orm_convert import (
20
20
  pipeline_delete_orms,
21
21
  pipeline_orm_to_proto,
22
22
  pipeline_proto_to_orm,
23
23
  )
24
- from corvic.model._source import Source
24
+ from corvic.emodel._source import Source
25
25
  from corvic.result import InvalidArgumentError, NotFoundError, Ok, UnavailableError
26
26
  from corvic_generated.model.v1alpha import models_pb2
27
27
  from corvic_generated.orm.v1 import pipeline_pb2
@@ -30,7 +30,7 @@ PipelineID: TypeAlias = eorm.PipelineID
30
30
  RoomID: TypeAlias = eorm.RoomID
31
31
 
32
32
 
33
- class Pipeline(BelongsToRoomModel[PipelineID, models_pb2.Pipeline, eorm.Pipeline]):
33
+ class Pipeline(StandardModel[PipelineID, models_pb2.Pipeline, eorm.Pipeline]):
34
34
  """Pipelines map resources to sources."""
35
35
 
36
36
  @classmethod
@@ -6,22 +6,13 @@ import sqlalchemy as sa
6
6
  import sqlalchemy.orm as sa_orm
7
7
  from google.protobuf import timestamp_pb2
8
8
 
9
- from corvic import eorm, orm
9
+ from corvic import eorm, orm, transfer
10
10
  from corvic.result import InternalError, InvalidArgumentError, Ok
11
11
  from corvic_generated.model.v1alpha import models_pb2
12
12
  from corvic_generated.orm.v1 import feature_view_pb2
13
13
 
14
- UNCOMMITTED_ID_PREFIX = "__uncommitted_object-"
15
14
 
16
- IdType = TypeVar("IdType", bound=orm.BaseID[Any])
17
-
18
-
19
- class _ModelProto(Protocol):
20
- id: str
21
- created_at: timestamp_pb2.Timestamp
22
-
23
-
24
- class _ModelBelongsToOrgProto(_ModelProto, Protocol):
15
+ class _ModelBelongsToOrgProto(transfer.ProtoModel, Protocol):
25
16
  org_id: str
26
17
 
27
18
 
@@ -29,33 +20,56 @@ class _ModelBelongsToRoomProto(_ModelBelongsToOrgProto, Protocol):
29
20
  room_id: str
30
21
 
31
22
 
32
- ProtoObj = TypeVar("ProtoObj", bound=_ModelProto)
33
- ProtoBelongsToOrgObj = TypeVar("ProtoBelongsToOrgObj", bound=_ModelBelongsToOrgProto)
34
- ProtoBelongsToRoomObj = TypeVar("ProtoBelongsToRoomObj", bound=_ModelBelongsToRoomProto)
23
+ class _ModelHasIdBelongsToOrgProto(
24
+ transfer.ProtoHasIdModel, _ModelBelongsToOrgProto, Protocol
25
+ ):
26
+ pass
35
27
 
36
28
 
37
- class _OrmModel(Protocol[IdType]):
38
- id: sa_orm.Mapped[IdType | None]
29
+ class _ModelHasIdBelongsToRoomProto(
30
+ transfer.ProtoHasIdModel, _ModelBelongsToRoomProto, Protocol
31
+ ):
32
+ pass
39
33
 
40
- @sa.ext.hybrid.hybrid_property
41
- def created_at(self) -> datetime.datetime | None: ...
42
34
 
43
- @created_at.inplace.expression
44
- @classmethod
45
- def _created_at_expression(cls): ...
35
+ ProtoBelongsToOrgT = TypeVar("ProtoBelongsToOrgT", bound=_ModelBelongsToOrgProto)
36
+ ProtoBelongsToRoomT = TypeVar("ProtoBelongsToRoomT", bound=_ModelBelongsToRoomProto)
37
+ ProtoHasIdBelongsToOrgT = TypeVar(
38
+ "ProtoHasIdBelongsToOrgT", bound=_ModelHasIdBelongsToOrgProto
39
+ )
40
+ ProtoHasIdBelongsToRoomT = TypeVar(
41
+ "ProtoHasIdBelongsToRoomT", bound=_ModelHasIdBelongsToRoomProto
42
+ )
46
43
 
47
44
 
48
- class _OrmBelongsToOrgModel(_OrmModel[IdType], Protocol):
45
+ class _OrmBelongsToOrgModel(transfer.OrmModel, Protocol):
49
46
  org_id: sa_orm.Mapped[eorm.OrgID | None]
50
47
 
51
48
 
52
- class _OrmBelongsToRoomModel(_OrmBelongsToOrgModel[IdType], Protocol):
49
+ class _OrmBelongsToRoomModel(_OrmBelongsToOrgModel, Protocol):
53
50
  room_id: sa_orm.Mapped[eorm.RoomID | None]
54
51
 
55
52
 
56
- OrmObj = TypeVar("OrmObj", bound=_OrmModel[Any])
57
- OrmBelongsToOrgObj = TypeVar("OrmBelongsToOrgObj", bound=_OrmBelongsToOrgModel[Any])
58
- OrmBelongsToRoomObj = TypeVar("OrmBelongsToRoomObj", bound=_OrmBelongsToRoomModel[Any])
53
+ class _OrmHasIdBelongsToOrgModel(
54
+ transfer.OrmHasIdModel[transfer.OrmIdT], _OrmBelongsToOrgModel, Protocol
55
+ ):
56
+ pass
57
+
58
+
59
+ class _OrmHasIdBelongsToRoomModel(
60
+ _OrmHasIdBelongsToOrgModel[transfer.OrmIdT], _OrmBelongsToRoomModel, Protocol
61
+ ):
62
+ pass
63
+
64
+
65
+ OrmBelongsToOrgT = TypeVar("OrmBelongsToOrgT", bound=_OrmBelongsToOrgModel)
66
+ OrmBelongsToRoomT = TypeVar("OrmBelongsToRoomT", bound=_OrmBelongsToRoomModel)
67
+ OrmHasIdBelongsToOrgT = TypeVar(
68
+ "OrmHasIdBelongsToOrgT", bound=_OrmHasIdBelongsToOrgModel[Any]
69
+ )
70
+ OrmHasIdBelongsToRoomT = TypeVar(
71
+ "OrmHasIdBelongsToRoomT", bound=_OrmHasIdBelongsToRoomModel[Any]
72
+ )
59
73
 
60
74
 
61
75
  def _orm_id_to_str(id: eorm.ID | None):
@@ -64,19 +78,6 @@ def _orm_id_to_str(id: eorm.ID | None):
64
78
  return ""
65
79
 
66
80
 
67
- def _translate_orm_id(
68
- obj_id: str, id_class: type[IdType]
69
- ) -> Ok[IdType | None] | orm.InvalidORMIdentifierError:
70
- if obj_id.startswith(UNCOMMITTED_ID_PREFIX):
71
- return Ok(None)
72
- parsed_obj_id = id_class(obj_id)
73
- match parsed_obj_id.to_db():
74
- case orm.InvalidORMIdentifierError() as err:
75
- return err
76
- case Ok():
77
- return Ok(parsed_obj_id)
78
-
79
-
80
81
  def timestamp_orm_to_proto(
81
82
  timestamp_orm: datetime.datetime | None,
82
83
  ) -> timestamp_pb2.Timestamp | None:
@@ -227,12 +228,12 @@ def completion_model_orm_to_proto(
227
228
 
228
229
 
229
230
  def add_orm_org_mixin_to_session(
230
- orm_obj: OrmBelongsToOrgObj,
231
- proto_obj: _ModelBelongsToOrgProto,
232
- id_class: type[IdType],
231
+ orm_obj: OrmHasIdBelongsToOrgT,
232
+ proto_obj: _ModelHasIdBelongsToOrgProto,
233
+ id_class: type[transfer.OrmIdT],
233
234
  session: sa_orm.Session,
234
- ) -> Ok[OrmBelongsToOrgObj] | orm.InvalidORMIdentifierError:
235
- match _translate_orm_id(proto_obj.id, id_class):
235
+ ) -> Ok[OrmHasIdBelongsToOrgT] | orm.InvalidORMIdentifierError:
236
+ match transfer.translate_orm_id(proto_obj.id, id_class):
236
237
  case Ok(orm_id):
237
238
  orm_obj.id = orm_id
238
239
  case orm.InvalidORMIdentifierError() as err:
@@ -253,11 +254,11 @@ def add_orm_org_mixin_to_session(
253
254
 
254
255
 
255
256
  def add_orm_room_mixin_to_session(
256
- orm_obj: OrmBelongsToRoomObj,
257
- proto_obj: _ModelBelongsToRoomProto,
258
- id_class: type[IdType],
257
+ orm_obj: OrmHasIdBelongsToRoomT,
258
+ proto_obj: _ModelHasIdBelongsToRoomProto,
259
+ id_class: type[transfer.OrmIdT],
259
260
  session: sa_orm.Session,
260
- ) -> Ok[OrmBelongsToRoomObj] | orm.InvalidORMIdentifierError:
261
+ ) -> Ok[OrmHasIdBelongsToRoomT] | orm.InvalidORMIdentifierError:
261
262
  room_id = eorm.RoomID(proto_obj.room_id)
262
263
  match room_id.to_db():
263
264
  case Ok():
@@ -272,7 +273,7 @@ def _resource_pipeline_to_orm(
272
273
  proto_obj: models_pb2.Resource, orm_obj: eorm.Resource, session: sa_orm.Session
273
274
  ) -> Ok[None] | InvalidArgumentError:
274
275
  if proto_obj.pipeline_id:
275
- match _translate_orm_id(proto_obj.pipeline_id, eorm.PipelineID):
276
+ match transfer.translate_orm_id(proto_obj.pipeline_id, eorm.PipelineID):
276
277
  case orm.InvalidORMIdentifierError() as err:
277
278
  return err
278
279
  case Ok(pipeline_id):
@@ -318,14 +319,15 @@ def resource_proto_to_orm(
318
319
 
319
320
 
320
321
  def _ensure_id(
321
- proto_obj: ProtoObj,
322
+ proto_obj: transfer.ProtoHasIdT,
322
323
  proto_to_orm: Callable[
323
- [ProtoObj, sa_orm.Session], Ok[OrmObj] | InvalidArgumentError
324
+ [transfer.ProtoHasIdT, sa_orm.Session],
325
+ Ok[transfer.OrmHasIdT] | InvalidArgumentError,
324
326
  ],
325
- id_type: type[IdType],
327
+ id_type: type[transfer.OrmIdT],
326
328
  session: sa_orm.Session,
327
- ) -> Ok[IdType] | orm.InvalidORMIdentifierError | InvalidArgumentError:
328
- match _translate_orm_id(proto_obj.id, id_type):
329
+ ) -> Ok[transfer.OrmIdT] | orm.InvalidORMIdentifierError | InvalidArgumentError:
330
+ match transfer.translate_orm_id(proto_obj.id, id_type):
329
331
  case orm.InvalidORMIdentifierError() as err:
330
332
  return err
331
333
  case Ok(orm_id):
@@ -14,9 +14,9 @@ from sqlalchemy import orm as sa_orm
14
14
  from sqlalchemy.orm.interfaces import LoaderOption
15
15
 
16
16
  from corvic import eorm, system
17
- from corvic.model._base_model import BelongsToRoomModel
18
- from corvic.model._defaults import Defaults
19
- from corvic.model._proto_orm_convert import (
17
+ from corvic.emodel._base_model import StandardModel
18
+ from corvic.emodel._defaults import Defaults
19
+ from corvic.emodel._proto_orm_convert import (
20
20
  resource_delete_orms,
21
21
  resource_orm_to_proto,
22
22
  resource_proto_to_orm,
@@ -31,7 +31,7 @@ RoomID: TypeAlias = eorm.RoomID
31
31
  PipelineID: TypeAlias = eorm.PipelineID
32
32
 
33
33
 
34
- class Resource(BelongsToRoomModel[ResourceID, models_pb2.Resource, eorm.Resource]):
34
+ class Resource(StandardModel[ResourceID, models_pb2.Resource, eorm.Resource]):
35
35
  """Resources represent import data."""
36
36
 
37
37
  @classmethod
@@ -6,9 +6,9 @@ from collections.abc import Sequence
6
6
  from typing import TypeAlias
7
7
 
8
8
  from corvic import eorm, system
9
- from corvic.model._base_model import BelongsToOrgModel
10
- from corvic.model._defaults import Defaults
11
- from corvic.model._proto_orm_convert import (
9
+ from corvic.emodel._base_model import OrgWideStandardModel
10
+ from corvic.emodel._defaults import Defaults
11
+ from corvic.emodel._proto_orm_convert import (
12
12
  room_delete_orms,
13
13
  room_orm_to_proto,
14
14
  room_proto_to_orm,
@@ -21,7 +21,7 @@ RoomID: TypeAlias = eorm.RoomID
21
21
  FeatureViewID: TypeAlias = eorm.FeatureViewID
22
22
 
23
23
 
24
- class Room(BelongsToOrgModel[RoomID, models_pb2.Room, eorm.Room]):
24
+ class Room(OrgWideStandardModel[RoomID, models_pb2.Room, eorm.Room]):
25
25
  """Rooms contain conversations and tables."""
26
26
 
27
27
  @classmethod