[object Object]

← back to Exo

refactor: Fix UUID implementation

8596d5c5b1c1d9ec8bcf4af627efa7cb611b5fd5 · 2025-07-02 11:04:52 +0100 · Arbion Halili

Files touched

Diff

commit 8596d5c5b1c1d9ec8bcf4af627efa7cb611b5fd5
Author: Arbion Halili <99731180+ToxicPine@users.noreply.github.com>
Date:   Wed Jul 2 11:04:52 2025 +0100

    refactor: Fix UUID implementation
---
 master/idempotency.py            |  6 +++++-
 shared/types/common.py           | 21 ++++++++++++++-------
 shared/types/events/common.py    | 16 ++++++++--------
 shared/types/events/events.py    | 19 +++++++++----------
 shared/types/models/common.py    | 16 ++++++----------
 shared/types/networking/edges.py | 12 +++++-------
 shared/types/tasks/common.py     | 13 ++++++-------
 shared/types/worker/common.py    | 17 +++++++----------
 8 files changed, 60 insertions(+), 60 deletions(-)

diff --git a/master/idempotency.py b/master/idempotency.py
index d96be620..a761d2ab 100644
--- a/master/idempotency.py
+++ b/master/idempotency.py
@@ -1,5 +1,6 @@
 from hashlib import sha3_224 as hasher
 from typing import Sequence, TypeVar
+from uuid import UUID
 
 from shared.types.events.common import EventId, EventTypes, IdemKeyGenerator, State
 
@@ -18,7 +19,10 @@ def get_idem_tag_generator(base: str) -> IdemKeyGenerator[EventTypeT]:
             if n == 0:
                 return []
             next_hash = hasher(last).digest()
-            return (EventId(next_hash.hex()), *recurse(n - 1, next_hash))
+            return (
+                EventId(UUID(bytes=next_hash, version=4)),
+                *recurse(n - 1, next_hash),
+            )
 
         initial_bytes = state.sequence_number.to_bytes(8, byteorder="big", signed=False)
         return recurse(num_keys, initial_bytes)
diff --git a/shared/types/common.py b/shared/types/common.py
index c0fc38ff..2c1b77ab 100644
--- a/shared/types/common.py
+++ b/shared/types/common.py
@@ -1,9 +1,16 @@
-from typing import Annotated
-from uuid import UUID
+from uuid import uuid4
 
-from pydantic import TypeAdapter
-from pydantic.types import UuidVersion
+from pydantic import UUID4, Field
+from pydantic.dataclasses import dataclass
 
-_NodeId = Annotated[UUID, UuidVersion(4)]
-NodeId = type("NodeId", (UUID,), {})
-NodeIdParser: TypeAdapter[NodeId] = TypeAdapter(_NodeId)
+
+@dataclass(frozen=True)
+class NewUUID:
+    uuid: UUID4 = Field(default_factory=lambda: uuid4())
+
+    def __hash__(self) -> int:
+        return hash(self.uuid)
+
+
+class NodeId(NewUUID):
+    pass
diff --git a/shared/types/events/common.py b/shared/types/events/common.py
index 13ba7fe6..f3d995a9 100644
--- a/shared/types/events/common.py
+++ b/shared/types/events/common.py
@@ -10,14 +10,14 @@ from typing import (
     Union,
     get_args,
 )
-from uuid import UUID
 
 from pydantic import BaseModel, Field, TypeAdapter
-from pydantic.types import UuidVersion
 
-_EventId = Annotated[UUID, UuidVersion(4)]
-EventId = type("EventId", (UUID,), {})
-EventIdParser: TypeAdapter[EventId] = TypeAdapter(_EventId)
+from shared.types.common import NewUUID
+
+
+class EventId(NewUUID):
+    pass
 
 
 class MLXEventTypes(str, Enum):
@@ -134,9 +134,9 @@ def get_effects_from_sagas(
 
 IdemKeyGenerator = Callable[[State[EventTypeT], int], Sequence[EventId]]
 
-_CommandId = Annotated[UUID, UuidVersion(4)]
-CommandId = type("CommandId", (UUID,), {})
-CommandIdParser: TypeAdapter[CommandId] = TypeAdapter(_CommandId)
+
+class CommandId(NewUUID):
+    pass
 
 
 class CommandTypes(str, Enum):
diff --git a/shared/types/events/events.py b/shared/types/events/events.py
index 8ebbf3ef..db5a3e32 100644
--- a/shared/types/events/events.py
+++ b/shared/types/events/events.py
@@ -1,11 +1,10 @@
 from __future__ import annotations
 
-from typing import Annotated, Any, Literal, Tuple
-from uuid import UUID
+from typing import Any, Literal, Tuple
 
-from pydantic import BaseModel, TypeAdapter, UuidVersion
+from pydantic import BaseModel
 
-from shared.types.common import NodeId
+from shared.types.common import NewUUID, NodeId
 from shared.types.events.common import (
     Event,
     InstanceEventTypes,
@@ -27,13 +26,13 @@ from shared.types.worker.common import InstanceId, NodeState
 from shared.types.worker.instances import InstanceData
 from shared.types.worker.runners import RunnerId, RunnerState, RunnerStateType
 
-_RequestId = Annotated[UUID, UuidVersion(4)]
-RequestId = type("RequestId", (UUID,), {})
-RequestIdParser: TypeAdapter[RequestId] = TypeAdapter(_RequestId)
 
-_TimerId = Annotated[UUID, UuidVersion(4)]
-TimerId = type("TimerId", (UUID,), {})
-TimerIdParser: TypeAdapter[TimerId] = TypeAdapter(_TimerId)
+class RequestId(NewUUID):
+    pass
+
+
+class TimerId(NewUUID):
+    pass
 
 
 class TimerData(BaseModel):
diff --git a/shared/types/models/common.py b/shared/types/models/common.py
index 5e2c1127..d4471eb3 100644
--- a/shared/types/models/common.py
+++ b/shared/types/models/common.py
@@ -1,15 +1,14 @@
-from typing import Annotated, Sequence, final
-from uuid import UUID
+from typing import Sequence, final
 
-from pydantic import BaseModel, TypeAdapter
-from pydantic.types import UuidVersion
+from pydantic import BaseModel
 
+from shared.types.common import NewUUID
 from shared.types.models.metadata import ModelMetadata
 from shared.types.models.sources import ModelSource
 
-_ModelId = Annotated[UUID, UuidVersion(4)]
-ModelId = type("ModelId", (UUID,), {})
-ModelIdParser: TypeAdapter[ModelId] = TypeAdapter(_ModelId)
+
+class ModelId(NewUUID):
+    pass
 
 
 @final
@@ -17,6 +16,3 @@ class Model(BaseModel):
     model_id: ModelId
     model_sources: Sequence[ModelSource]
     model_metadata: ModelMetadata
-
-
-ModelIdAdapter: TypeAdapter[ModelId] = TypeAdapter(_ModelId)
diff --git a/shared/types/networking/edges.py b/shared/types/networking/edges.py
index 87a05179..0977caf1 100644
--- a/shared/types/networking/edges.py
+++ b/shared/types/networking/edges.py
@@ -1,16 +1,14 @@
 from collections.abc import Mapping
 from enum import Enum
 from typing import Annotated, Generic, NamedTuple, TypeVar, final
-from uuid import UUID
 
-from pydantic import AfterValidator, BaseModel, IPvAnyAddress, TypeAdapter
-from pydantic.types import UuidVersion
+from pydantic import AfterValidator, BaseModel, IPvAnyAddress
 
-from shared.types.common import NodeId
+from shared.types.common import NewUUID, NodeId
 
-_EdgeId = Annotated[UUID, UuidVersion(4)]
-EdgeId = type("EdgeId", (UUID,), {})
-EdgeIdParser: TypeAdapter[EdgeId] = TypeAdapter(_EdgeId)
+
+class EdgeId(NewUUID):
+    pass
 
 
 class AddressingProtocol(str, Enum):
diff --git a/shared/types/tasks/common.py b/shared/types/tasks/common.py
index db4d9a3f..4baf87fb 100644
--- a/shared/types/tasks/common.py
+++ b/shared/types/tasks/common.py
@@ -1,17 +1,16 @@
 from collections.abc import Mapping
 from enum import Enum
-from typing import Annotated, Any, Generic, Literal, TypeVar, Union
-from uuid import UUID
+from typing import Any, Generic, Literal, TypeVar, Union
 
 import openai.types.chat as openai
-from pydantic import BaseModel, TypeAdapter
-from pydantic.types import UuidVersion
+from pydantic import BaseModel
 
+from shared.types.common import NewUUID
 from shared.types.worker.common import InstanceId, RunnerId
 
-_TaskId = Annotated[UUID, UuidVersion(4)]
-TaskId = type("TaskId", (UUID,), {})
-TaskIdParser: TypeAdapter[TaskId] = TypeAdapter(_TaskId)
+
+class TaskId(NewUUID):
+    pass
 
 
 class TaskType(str, Enum):
diff --git a/shared/types/worker/common.py b/shared/types/worker/common.py
index 79ac3ae7..0d53ddc5 100644
--- a/shared/types/worker/common.py
+++ b/shared/types/worker/common.py
@@ -1,17 +1,14 @@
 from enum import Enum
-from typing import Annotated
-from uuid import UUID
 
-from pydantic import TypeAdapter
-from pydantic.types import UuidVersion
+from shared.types.common import NewUUID
 
-_InstanceId = Annotated[UUID, UuidVersion(4)]
-InstanceId = type("InstanceId", (UUID,), {})
-InstanceIdParser: TypeAdapter[InstanceId] = TypeAdapter(_InstanceId)
 
-_RunnerId = Annotated[UUID, UuidVersion(4)]
-RunnerId = type("RunnerId", (UUID,), {})
-RunnerIdParser: TypeAdapter[RunnerId] = TypeAdapter(_RunnerId)
+class InstanceId(NewUUID):
+    pass
+
+
+class RunnerId(NewUUID):
+    pass
 
 
 class NodeState(str, Enum):

← 6de1f288 feat: Update Interfaces  ·  back to Exo  ·  refactor: Refactor most things 40793f1d →