1use crate::tokens::Token;
17use serde::{Deserialize, Serialize};
18
19#[derive(Debug, Clone, Serialize, Deserialize, Default)]
20pub struct RouterRequest {
21 pub tokens: Vec<Token>,
22}
23
24#[derive(Debug, Clone, Serialize, Deserialize, Default)]
25pub struct RouterResponse {
26 pub worker_id: i64,
27}
28
29#[derive(Debug)]
30pub struct WorkerSelectionResult {
31 pub worker_id: i64,
33
34 pub required_blocks: u64,
36
37 pub overlap_blocks: usize,
40}
41
42#[derive(Debug, Clone, Serialize, Deserialize, Default)]
43pub struct ForwardPassMetrics {
44 pub data_parallel_rank: Option<u32>, pub request_active_slots: u64,
48 pub request_total_slots: u64,
49 pub kv_active_blocks: u64,
50 pub kv_total_blocks: u64,
51 pub num_requests_waiting: u64,
53 pub gpu_cache_usage_perc: f32,
55 pub gpu_prefix_cache_hit_rate: f32,
57}
58
59#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Ord, PartialOrd)]
62pub struct LocalBlockHash(pub u64);
63
64#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Ord, PartialOrd)]
69pub struct ExternalSequenceBlockHash(pub u64);
70
71impl From<u64> for ExternalSequenceBlockHash {
73 fn from(value: u64) -> Self {
74 Self(value)
75 }
76}
77
78impl From<i64> for ExternalSequenceBlockHash {
79 fn from(value: i64) -> Self {
82 Self(value as u64)
83 }
84}
85
86#[derive(Serialize, Deserialize, Debug, Clone)]
88pub struct KvCacheEvents {
89 pub events: Vec<KvCacheEvent>,
91 pub shutdown: bool,
93}
94
95#[derive(Serialize, Deserialize, Debug, Clone)]
97pub struct KvCacheEvent {
98 pub event_id: u64,
100 pub data: KvCacheEventData,
102}
103
104#[derive(Serialize, Deserialize, Debug, Clone)]
108#[serde(rename_all = "snake_case")]
109pub enum KvCacheEventData {
110 Stored(KvCacheStoreData),
111 Removed(KvCacheRemoveData),
112 Cleared,
113}
114
115#[derive(Serialize, Deserialize, Debug, Clone)]
117pub struct KvCacheStoreData {
118 pub parent_hash: Option<ExternalSequenceBlockHash>,
120 pub blocks: Vec<KvCacheStoredBlockData>,
122}
123
124#[derive(Serialize, Deserialize, Debug, Clone)]
126pub struct KvCacheStoredBlockData {
127 pub block_hash: ExternalSequenceBlockHash,
129 pub tokens_hash: LocalBlockHash,
131}
132
133#[derive(Serialize, Deserialize, Debug, Clone)]
135pub struct KvCacheRemoveData {
136 pub block_hashes: Vec<ExternalSequenceBlockHash>,
138}
139
140impl Serialize for LocalBlockHash {
141 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
142 where
143 S: serde::Serializer,
144 {
145 serializer.serialize_u64(self.0)
146 }
147}
148
149impl<'de> Deserialize<'de> for LocalBlockHash {
150 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
151 where
152 D: serde::Deserializer<'de>,
153 {
154 let value = u64::deserialize(deserializer)?;
155 Ok(LocalBlockHash(value))
156 }
157}
158
159impl Serialize for ExternalSequenceBlockHash {
160 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
161 where
162 S: serde::Serializer,
163 {
164 serializer.serialize_u64(self.0)
165 }
166}
167
168impl<'de> Deserialize<'de> for ExternalSequenceBlockHash {
169 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
170 where
171 D: serde::Deserializer<'de>,
172 {
173 let value = u64::deserialize(deserializer)?;
174 Ok(ExternalSequenceBlockHash(value))
175 }
176}
177
178#[cfg(test)]
179mod tests {
180 use super::*;
181 use serde_json;
182
183 #[test]
184 fn test_local_block_hash_serialization() {
185 let hash = LocalBlockHash(12345);
186 let serialized = serde_json::to_string(&hash).unwrap();
187 assert_eq!(serialized, "12345");
188
189 let deserialized: LocalBlockHash = serde_json::from_str(&serialized).unwrap();
190 assert_eq!(deserialized, hash);
191 }
192
193 #[test]
194 fn test_external_sequence_block_hash_serialization() {
195 let hash = ExternalSequenceBlockHash(67890);
196 let serialized = serde_json::to_string(&hash).unwrap();
197 assert_eq!(serialized, "67890");
198
199 let deserialized: ExternalSequenceBlockHash = serde_json::from_str(&serialized).unwrap();
200 assert_eq!(deserialized, hash);
201 }
202
203 #[test]
204 fn test_kv_cache_events_serialization() {
205 let event_data = KvCacheEventData::Stored(KvCacheStoreData {
206 parent_hash: Some(ExternalSequenceBlockHash(1)),
207 blocks: vec![KvCacheStoredBlockData {
208 block_hash: ExternalSequenceBlockHash(2),
209 tokens_hash: LocalBlockHash(3),
210 }],
211 });
212
213 let event = KvCacheEvent {
214 event_id: 1,
215 data: event_data,
216 };
217
218 let events = KvCacheEvents {
219 events: vec![event],
220 shutdown: false,
221 };
222
223 let serialized = serde_json::to_string(&events).unwrap();
224 let deserialized: KvCacheEvents = serde_json::from_str(&serialized).unwrap();
225
226 assert_eq!(deserialized.events.len(), 1);
227 assert_eq!(deserialized.events[0].event_id, 1);
228 if let KvCacheEventData::Stored(store_data) = &deserialized.events[0].data {
229 assert_eq!(store_data.parent_hash.unwrap().0, 1);
230 assert_eq!(store_data.blocks.len(), 1);
231 assert_eq!(store_data.blocks[0].block_hash.0, 2);
232 assert_eq!(store_data.blocks[0].tokens_hash.0, 3);
233 } else {
234 panic!("Expected KvCacheEventData::Stored variant");
235 }
236 assert!(!deserialized.shutdown);
237 }
238
239 #[test]
240 fn test_kv_cache_remove_data_serialization() {
241 let remove_data = KvCacheRemoveData {
242 block_hashes: vec![ExternalSequenceBlockHash(4), ExternalSequenceBlockHash(5)],
243 };
244
245 let serialized = serde_json::to_string(&remove_data).unwrap();
246 let deserialized: KvCacheRemoveData = serde_json::from_str(&serialized).unwrap();
247
248 assert_eq!(deserialized.block_hashes.len(), 2);
249 assert_eq!(deserialized.block_hashes[0].0, 4);
250 assert_eq!(deserialized.block_hashes[1].0, 5);
251 }
252}