-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmodels.py
More file actions
132 lines (103 loc) · 3.22 KB
/
models.py
File metadata and controls
132 lines (103 loc) · 3.22 KB
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
"""
Pydantic request / response models for Feather DB Cloud API.
"""
from pydantic import BaseModel, Field
from typing import List, Optional, Dict, Any
from enum import IntEnum
class ContextTypeEnum(IntEnum):
FACT = 0
PREFERENCE = 1
EVENT = 2
CONVERSATION = 3
class MetadataIn(BaseModel):
timestamp: Optional[int] = None # defaults to now
importance: float = 1.0
type: ContextTypeEnum = ContextTypeEnum.FACT
source: str = ""
content: str = ""
tags_json: str = ""
namespace_id: str = ""
entity_id: str = ""
attributes: Dict[str, str] = Field(default_factory=dict)
class MetadataOut(MetadataIn):
recall_count: int = 0
last_recalled_at: int = 0
links: List[int] = Field(default_factory=list)
class AddVectorRequest(BaseModel):
id: int
vector: List[float]
metadata: Optional[MetadataIn] = None
modality: str = "text"
class SearchRequest(BaseModel):
vector: List[float]
k: int = 10
modality: str = "text"
# Filters
namespace_id: Optional[str] = None
entity_id: Optional[str] = None
attributes_match: Optional[Dict[str, str]] = None
source: Optional[str] = None
source_prefix: Optional[str] = None
importance_gte: Optional[float] = None
tags_contains: Optional[List[str]] = None
timestamp_after: Optional[int] = None
timestamp_before: Optional[int] = None
# Scoring
scoring_half_life: Optional[float] = None # days
scoring_weight: Optional[float] = None # 0.0–1.0
scoring_min: Optional[float] = None
class SearchResultItem(BaseModel):
id: int
score: float
metadata: MetadataOut
class SearchResponse(BaseModel):
results: List[SearchResultItem]
count: int
class KeywordSearchRequest(BaseModel):
query: str
k: int = 10
# Filters (same as SearchRequest)
namespace_id: Optional[str] = None
entity_id: Optional[str] = None
attributes_match: Optional[Dict[str, str]] = None
source: Optional[str] = None
source_prefix: Optional[str] = None
importance_gte: Optional[float] = None
tags_contains: Optional[List[str]] = None
timestamp_after: Optional[int] = None
timestamp_before: Optional[int] = None
class HybridSearchRequest(BaseModel):
vector: List[float]
query: str
k: int = 10
rrf_k: int = 60
modality: str = "text"
# Filters
namespace_id: Optional[str] = None
entity_id: Optional[str] = None
attributes_match: Optional[Dict[str, str]] = None
source: Optional[str] = None
source_prefix: Optional[str] = None
importance_gte: Optional[float] = None
tags_contains: Optional[List[str]] = None
timestamp_after: Optional[int] = None
timestamp_before: Optional[int] = None
# Scoring
scoring_half_life: Optional[float] = None
scoring_weight: Optional[float] = None
scoring_min: Optional[float] = None
class LinkRequest(BaseModel):
to_id: int
class UpdateImportanceRequest(BaseModel):
importance: float
class UpdateMetadataRequest(BaseModel):
metadata: MetadataIn
class NamespaceStats(BaseModel):
namespace: str
db_path: str
dim: int
modalities: List[str]
class HealthResponse(BaseModel):
status: str
version: str
namespaces_loaded: int