use serde::{Deserialize, Serialize};
use uuid::Uuid;
use super::{HandoffId, HandoffTransferTiming};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Request {
pub request_id: Uuid,
pub tokens: Vec<u32>,
pub max_output_tokens: usize,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub output_token_ids: Option<Vec<u32>>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Command {
Submit(Request),
SubmitHandoffPrefill {
handoff_id: HandoffId,
request: Request,
},
ReserveDestination {
handoff_id: HandoffId,
request: Request,
},
ActivateDestination { handoff_id: HandoffId },
ReleaseSource { handoff_id: HandoffId },
CancelSource { handoff_id: HandoffId },
CancelDestination { handoff_id: HandoffId },
CancelRequest {
request_id: Uuid,
discard_pending_output: bool,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CommandResult {
Submitted(Uuid),
DestinationAccepted { request_id: Uuid },
Applied,
Noop,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum LifecycleEvent {
SourceHeld {
handoff_id: HandoffId,
request_id: Uuid,
transfer_timing: HandoffTransferTiming,
},
DestinationReserved {
handoff_id: HandoffId,
request_id: Uuid,
transferable_prompt_tokens: usize,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct KvBlock {
pub block_hash: u64,
pub tokens_hash: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub token_ids: Option<Vec<u32>>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct StoredBlocks {
pub parent_hash: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub start_position: Option<usize>,
pub blocks: Vec<KvBlock>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum KvEventData {
Stored(StoredBlocks),
Removed { block_hashes: Vec<u64> },
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct KvEvent {
pub event_id: u64,
pub dp_rank: u32,
pub data: KvEventData,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub struct CacheTierAttribution {
pub g1_reused_input_tokens: usize,
pub host_reused_input_tokens: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Admission {
pub request_id: Uuid,
pub reused_input_tokens: usize,
pub cache_tier_attribution: Option<CacheTierAttribution>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PressureKind {
VllmPreemption,
SglangRetraction,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct PressureState {
pub running_requests: usize,
pub waiting_requests: Option<usize>,
pub active_blocks: usize,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PressureEvent {
pub at_ms: f64,
pub kind: PressureKind,
pub request_id: Uuid,
pub state_before: PressureState,
pub state_after: PressureState,
pub request_active_blocks_before: usize,
pub logical_available_blocks_before: Option<usize>,
pub required_blocks_before: Option<usize>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Output {
pub request_id: Uuid,
pub token_id: Option<u32>,
pub completed: bool,
pub rejected: bool,
pub cached_tokens: Option<usize>,
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct Metrics {
pub dp_rank: u32,
pub active_blocks: u64,
pub inactive_blocks: u64,
pub total_blocks: u64,
pub cache_usage: f64,
pub physical_cache_usage: f64,
pub running_requests: u64,
pub waiting_requests: u64,
pub preemptions_total: u64,
pub sglang_cache_hit_tokens: u64,
pub sglang_cache_total_tokens: u64,
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct ForwardPassMetrics {
pub num_prefill_requests: u32,
pub sum_prefill_tokens: u64,
pub var_prefill_length: f64,
pub sum_prefill_kv_tokens: u64,
pub num_decode_requests: u32,
pub sum_decode_kv_tokens: u64,
pub var_decode_kv_tokens: f64,
pub num_queued_prefill: u32,
pub sum_queued_prefill_tokens: u64,
pub var_queued_prefill_length: f64,
pub num_queued_decode: u32,
pub sum_queued_decode_kv_tokens: u64,
pub var_queued_decode_kv_tokens: f64,
pub duration_ms: f64,
}
#[derive(Debug, Clone, PartialEq)]
pub struct CommandEffects {
pub result: CommandResult,
pub lifecycle_events: Vec<LifecycleEvent>,
pub kv_events: Vec<KvEvent>,
pub retired_requests: Vec<Uuid>,
pub metrics: Metrics,
pub suppressed_pending_output: bool,
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct PassStartEffects {
pub admissions: Vec<Admission>,
pub pressure_events: Vec<PressureEvent>,
pub kv_events: Vec<KvEvent>,
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct PassCompletionEffects {
pub outputs: Vec<Output>,
pub lifecycle_events: Vec<LifecycleEvent>,
pub kv_events: Vec<KvEvent>,
pub metrics: Metrics,
pub forward_pass_metrics: ForwardPassMetrics,
}
#[doc(hidden)]
pub struct PendingPass {
pub(crate) started_at_ms: f64,
pub(crate) effects: PassCompletionEffects,
}