use std::sync::{Arc, Mutex};
use std::time::SystemTime;
use tokio::sync::mpsc;
use crate::batch::{new_batch_store, BatchStore};
use crate::batch_spool::{BatchQueueSender, BatchStore as DiskBatchStore};
use crate::metrics::Metrics;
use crate::queue::{BatchRequest, VocabBytes};
use crate::router::ModelPool;
use oxillama_runtime::sampling::SamplerConfig;
pub struct AppState {
pub queue: mpsc::Sender<BatchRequest>,
pub model_id: String,
pub loaded_at: u64,
pub default_sampler: SamplerConfig,
pub vocab_bytes: Option<VocabBytes>,
pub hidden_size: usize,
pub metrics: Arc<Metrics>,
pub batch_store: BatchStore,
pub batch_disk_store: Arc<DiskBatchStore>,
pub batch_queue_tx: BatchQueueSender,
pub model_pool: Mutex<ModelPool>,
}
impl AppState {
pub fn new(
queue: mpsc::Sender<BatchRequest>,
model_id: String,
default_sampler: SamplerConfig,
vocab_bytes: Option<VocabBytes>,
hidden_size: usize,
) -> Self {
let loaded_at = SystemTime::now()
.duration_since(SystemTime::UNIX_EPOCH)
.map(|d| d.as_secs())
.unwrap_or(0);
let spool_dir = std::env::temp_dir().join("oxillama_batch_spool");
let batch_disk_store = Arc::new(DiskBatchStore::new(spool_dir).unwrap_or_else(|_| {
DiskBatchStore::new(std::env::temp_dir()).expect("fallback spool dir")
}));
let (batch_queue_tx, _) =
tokio::sync::mpsc::channel::<crate::batch_spool::BatchWorkItem>(1);
Self {
queue,
model_id,
loaded_at,
default_sampler,
vocab_bytes,
hidden_size,
metrics: Arc::new(Metrics::new()),
batch_store: new_batch_store(),
batch_disk_store,
batch_queue_tx,
model_pool: Mutex::new(ModelPool::new(4, 0)),
}
}
pub fn with_batch_pipeline(
queue: mpsc::Sender<BatchRequest>,
model_id: String,
default_sampler: SamplerConfig,
vocab_bytes: Option<VocabBytes>,
hidden_size: usize,
batch_disk_store: Arc<DiskBatchStore>,
batch_queue_tx: BatchQueueSender,
) -> Self {
let loaded_at = SystemTime::now()
.duration_since(SystemTime::UNIX_EPOCH)
.map(|d| d.as_secs())
.unwrap_or(0);
Self {
queue,
model_id,
loaded_at,
default_sampler,
vocab_bytes,
hidden_size,
metrics: Arc::new(Metrics::new()),
batch_store: new_batch_store(),
batch_disk_store,
batch_queue_tx,
model_pool: Mutex::new(ModelPool::new(4, 0)),
}
}
}