From e2d689a84c72fc5cc9063ae3b4720b48423b2c23 Mon Sep 17 00:00:00 2001 From: Christoph Eder Date: Sat, 13 Dec 2025 11:53:30 +0100 Subject: [PATCH 1/6] Changes in enums.py Added generalised ModelName --- anansyTypes/enums.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/anansyTypes/enums.py b/anansyTypes/enums.py index d5693b1..d288713 100644 --- a/anansyTypes/enums.py +++ b/anansyTypes/enums.py @@ -1,21 +1,33 @@ from enum import Enum +from typing import Union + + class ModelType(Enum): EMBEDDING = "embedding" TRANSCRIPTION = "transcription" RESPONSE = "response" - + + class EmbeddingModelName(Enum): NB_BERT = "nb_bert" + class TranscriptionModelName(Enum): WHISPER_SMALL = "whisper_small" + class ResponseModelName(Enum): - GENERIC = "generic" - + GENERIC = "generic" + + +ModelName= Union[EmbeddingModelName, TranscriptionModelName, ResponseModelName] + + class PreprocessorType(Enum): NORWEGIAN = "norwegian" DEFAULT = "norwegian" + + class SymbolProvider(Enum): TOBII_DYNAVOX = "tobii_dynavox" @@ -24,4 +36,3 @@ class Language(Enum): NORWEGIAN = "norwegian" ENGLISH = "english" DEFAULT = "norwegian" - From c1dcf4b055f3b499b375fc592832efdc50a2db7d Mon Sep 17 00:00:00 2001 From: Christoph Eder Date: Sat, 13 Dec 2025 11:56:40 +0100 Subject: [PATCH 2/6] Changes in schemas.py Might have fixed symbol issue --- anansyTypes/schemas.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/anansyTypes/schemas.py b/anansyTypes/schemas.py index b288816..3f7b021 100644 --- a/anansyTypes/schemas.py +++ b/anansyTypes/schemas.py @@ -25,7 +25,7 @@ class ModifiedBaseModel(PydanticBaseModel): return { 'id': v.id, 'label': v.label, - 'image': v.image.tolist() + 'image': v.image.tolist() if hasattr(v.image, 'tolist') else v.image } if isinstance(v, Embedding): return {'data': v.data.tolist()} From 67e10c6df4fb644690beda310899d465ed923e19 Mon Sep 17 00:00:00 2001 From: Christoph Eder Date: Sat, 13 Dec 2025 11:59:18 +0100 Subject: [PATCH 3/6] Changes in symbol.py Trying to properly serialise array --- anansyTypes/structures/symbol.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/anansyTypes/structures/symbol.py b/anansyTypes/structures/symbol.py index 6bd109c..78dfc05 100644 --- a/anansyTypes/structures/symbol.py +++ b/anansyTypes/structures/symbol.py @@ -45,8 +45,8 @@ class Symbol: lambda x: { 'id': x.id, 'label': x.label, - 'image': x.image + 'image': x.image.tolist() if hasattr(x.image, 'tolist') else list(x.image) }, when_used='json', - ), + ) ) From 95cd59fa2c121fb53dd8d986e08e49a251a9bbd0 Mon Sep 17 00:00:00 2001 From: Christoph Eder Date: Sat, 13 Dec 2025 12:09:29 +0100 Subject: [PATCH 4/6] Changes in schema.py and symbol.py Trying base64 encoding instead --- anansyTypes/schemas.py | 8 +---- anansyTypes/structures/symbol.py | 51 ++++++++++++++++++++++---------- 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/anansyTypes/schemas.py b/anansyTypes/schemas.py index 3f7b021..0b53f87 100644 --- a/anansyTypes/schemas.py +++ b/anansyTypes/schemas.py @@ -21,12 +21,6 @@ class ModifiedBaseModel(PydanticBaseModel): 'content': v.content, 'embedding': {'data': v.embedding.data.tolist()} } - if isinstance(v, Symbol): - return { - 'id': v.id, - 'label': v.label, - 'image': v.image.tolist() if hasattr(v.image, 'tolist') else v.image - } if isinstance(v, Embedding): return {'data': v.data.tolist()} if isinstance(v, list): @@ -56,7 +50,7 @@ class GetSymbolRequest(ModifiedBaseModel): lexeme_id: int class GetSymbolResponse(ModifiedBaseModel): - symbol: dict + symbol: Union[dict, None] class GetWordRequest(ModifiedBaseModel): word_text: str diff --git a/anansyTypes/structures/symbol.py b/anansyTypes/structures/symbol.py index 78dfc05..8af1f4b 100644 --- a/anansyTypes/structures/symbol.py +++ b/anansyTypes/structures/symbol.py @@ -4,6 +4,7 @@ import numpy as np from pydantic_tensor import Tensor from typing import Any, Literal from pydantic_core import core_schema +import base64 @dataclass @@ -13,17 +14,25 @@ class Symbol: image: Tensor[np.ndarray[Any, Any], tuple, Literal["int32", "int64"]] @classmethod - def from_dict(cls, data: dict) -> 'Symbol': + def from_dict(cls, data: dict) -> "Symbol": + if isinstance(data["image"], str): + # Decode from base64 + image_bytes = base64.b64decode(data["image"]) + image_array = np.frombuffer(image_bytes, dtype=np.int32) + else: + # From list/array + image_array = np.array(data["image"], dtype=np.int32) + return cls( - id=data['id'], - label=data['label'], - image=np.array(data['image'], dtype=np.int32) + id=data["id"], + label=data["label"], + image=image_array, ) @classmethod def __get_pydantic_core_schema__(cls, source_type: Any, handler): from pydantic_core import core_schema - + return core_schema.no_info_after_validator_function( cls, core_schema.dataclass_schema( @@ -31,22 +40,34 @@ class Symbol: schema=core_schema.dataclass_args_schema( cls.__name__, [ - core_schema.dataclass_field(name='id', schema=handler.generate_schema(int)), - core_schema.dataclass_field(name='label', schema=handler.generate_schema(str)), core_schema.dataclass_field( - name='image', - schema=handler.generate_schema(Tensor[np.ndarray[Any, Any], tuple, Literal["int32", "int64"]]) + name="id", schema=handler.generate_schema(int) + ), + core_schema.dataclass_field( + name="label", schema=handler.generate_schema(str) + ), + core_schema.dataclass_field( + name="image", + schema=handler.generate_schema( + Tensor[ + np.ndarray[Any, Any], + tuple, + Literal["int32", "int64"], + ] + ), ), ], ), - fields=['id', 'label', 'image'], + fields=["id", "label", "image"], ), serialization=core_schema.plain_serializer_function_ser_schema( lambda x: { - 'id': x.id, - 'label': x.label, - 'image': x.image.tolist() if hasattr(x.image, 'tolist') else list(x.image) + "id": x.id, + "label": x.label, + "image": base64.b64encode(np.array(x.image).tobytes()).decode( + "utf-8" + ), }, - when_used='json', - ) + when_used="json", + ), ) From fd7432f5d7bd01b513e360eec3505d003cd56f51 Mon Sep 17 00:00:00 2001 From: Christoph Eder Date: Sat, 13 Dec 2025 12:11:22 +0100 Subject: [PATCH 5/6] Changes in schemas.py Trying to send actual symbols --- anansyTypes/schemas.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/anansyTypes/schemas.py b/anansyTypes/schemas.py index 0b53f87..6d8efbf 100644 --- a/anansyTypes/schemas.py +++ b/anansyTypes/schemas.py @@ -50,7 +50,7 @@ class GetSymbolRequest(ModifiedBaseModel): lexeme_id: int class GetSymbolResponse(ModifiedBaseModel): - symbol: Union[dict, None] + symbol: Union[Symbol, None] class GetWordRequest(ModifiedBaseModel): word_text: str From b2db2efd9350660cff1cd8df665ea13cab8fb71f Mon Sep 17 00:00:00 2001 From: Christoph Eder Date: Sat, 13 Dec 2025 12:14:48 +0100 Subject: [PATCH 6/6] Changes in symbol.py Another try of serialisation --- anansyTypes/structures/symbol.py | 36 ++++++++------------------------ 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/anansyTypes/structures/symbol.py b/anansyTypes/structures/symbol.py index 8af1f4b..c412b52 100644 --- a/anansyTypes/structures/symbol.py +++ b/anansyTypes/structures/symbol.py @@ -33,33 +33,15 @@ class Symbol: def __get_pydantic_core_schema__(cls, source_type: Any, handler): from pydantic_core import core_schema - return core_schema.no_info_after_validator_function( - cls, - core_schema.dataclass_schema( - cls=cls, - schema=core_schema.dataclass_args_schema( - cls.__name__, - [ - core_schema.dataclass_field( - name="id", schema=handler.generate_schema(int) - ), - core_schema.dataclass_field( - name="label", schema=handler.generate_schema(str) - ), - core_schema.dataclass_field( - name="image", - schema=handler.generate_schema( - Tensor[ - np.ndarray[Any, Any], - tuple, - Literal["int32", "int64"], - ] - ), - ), - ], - ), - fields=["id", "label", "image"], - ), + def validate_symbol(value): + if isinstance(value, cls): + return value + if isinstance(value, dict): + return cls.from_dict(value) + raise ValueError(f"Cannot convert {type(value)} to Symbol") + + return core_schema.with_info_plain_validator_function( + lambda value, _: validate_symbol(value), serialization=core_schema.plain_serializer_function_ser_schema( lambda x: { "id": x.id,