1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
"""Abstraction for a vector that can be stored in the system."""
from enum import Enum
from typing import Any
from uuid import UUID
class VectorType(Enum):
FIXED = "FIXED"
class Vector:
"""A vector with the option to fix the number of elements."""
def __init__(
self,
data: list[float],
type: VectorType = VectorType.FIXED,
length: int = -1,
):
self.data = data
self.type = type
self.length = length
if (
self.type == VectorType.FIXED
and length > 0
and len(data) != length
):
raise ValueError(f"Vector must be exactly {length} elements long.")
def __repr__(self) -> str:
return (
f"Vector(data={self.data}, type={self.type}, length={self.length})"
)
class VectorEntry:
"""A vector entry that can be stored directly in supported vector databases."""
def __init__(self, id: UUID, vector: Vector, metadata: dict[str, Any]):
"""Create a new VectorEntry object."""
self.vector = vector
self.id = id
self.metadata = metadata
def to_serializable(self) -> str:
"""Return a serializable representation of the VectorEntry."""
metadata = self.metadata
for key in metadata:
if isinstance(metadata[key], UUID):
metadata[key] = str(metadata[key])
return {
"id": str(self.id),
"vector": self.vector.data,
"metadata": metadata,
}
def __str__(self) -> str:
"""Return a string representation of the VectorEntry."""
return f"VectorEntry(id={self.id}, vector={self.vector}, metadata={self.metadata})"
def __repr__(self) -> str:
"""Return an unambiguous string representation of the VectorEntry."""
return f"VectorEntry(id={self.id}, vector={self.vector}, metadata={self.metadata})"
|