pub mod builder;
pub mod continuous_engine;
pub mod embedding_engine;
pub(crate) mod layer_split;
pub mod modality_stubs;
pub mod parallel;
pub mod pipeline;
mod product_composition;
pub mod recurrent_state;
pub mod registry;
pub(crate) mod resource_lifecycle;
pub mod speculative;
pub mod tensor_factory;
pub mod transcription_engine;
pub mod tts_engine;
#[cfg(feature = "cuda")]
pub mod vnext_determinism;
pub use ferrum_interfaces::engine::{EmbedEngine, LlmInferenceEngine, TranscribeEngine, TtsEngine};
pub use ferrum_interfaces::{
IncrementalTokenizer, InferenceEngine as InferenceEngineInterface, KvCacheManager,
ModelExecutor, Sampler, SchedulerInterface as Scheduler, Tokenizer,
};
pub use ferrum_types::{
BatchId, EngineConfig, EngineStatus, FerrumError, InferenceRequest, InferenceResponse,
RequestId, Result, StreamChunk,
};
pub use ferrum_scheduler::BatchPlan;
pub use continuous_engine::{ContinuousBatchEngine, SequenceState};
pub use pipeline::{
ChunkedPrefillConfig, ChunkedPrefillExecutor, ExecutionPhase, PipelineConfig, PipelineExecutor,
};
pub use recurrent_state::{
InMemoryRecurrentStateConfig, InMemoryRecurrentStateHandle, InMemoryRecurrentStateManager,
};
pub use builder::{
create_engine, create_prepared_product_engine, create_product_engine, EngineBuilder,
};
pub use registry::{
global_registry, set_global_registry, ComponentConfig, ComponentFactory, ComponentMetadata,
ComponentRegistry, ContinuousBatchSchedulerFactory, DefaultKvCacheFactory,
FifoSchedulerFactory, GreedySampler, GreedySamplerFactory, HuggingFaceTokenizerFactory,
LlmExecutorFactory, MultinomialSamplerFactory, PagedKvCacheFactory, PrioritySchedulerFactory,
StubExecutorFactory, StubTokenizer, StubTokenizerFactory,
};
#[allow(deprecated)]
pub use registry::CandleExecutorFactory;
pub use parallel::{
global_device_manager, DeviceCapability, DeviceInfo, DeviceManager, LayerDistribution,
ParallelConfig, ParallelExecutor, ParallelExecutorFactory, ParallelismType,
TensorParallelConfig, TensorParallelGroup,
};
pub async fn create_default_engine(
config: EngineConfig,
) -> Result<Box<dyn LlmInferenceEngine + Send + Sync>> {
create_engine(config).await
}
#[cfg(test)]
mod integration_tests {
use super::*;
fn test_config() -> EngineConfig {
let mut config = EngineConfig::default();
config.model.model_id = ferrum_types::ModelId::new("test-model");
config.backend.device = ferrum_types::Device::CPU;
config
}
#[tokio::test]
async fn test_create_engine_via_builder() {
let engine = EngineBuilder::new(test_config())
.with_tokenizer("stub")
.with_executor("stub")
.build()
.await;
assert!(engine.is_ok());
}
#[tokio::test]
async fn test_create_engine_convenience() {
let engine = create_default_engine(test_config()).await;
assert!(engine.is_ok());
}
#[test]
fn test_global_registry() {
let registry = global_registry();
assert!(registry.list_tokenizers().contains(&"stub".to_string()));
assert!(registry
.list_samplers()
.contains(&"multinomial".to_string()));
}
#[test]
fn test_custom_registry() {
let registry = ComponentRegistry::new();
assert!(registry.list_tokenizers().is_empty());
registry.register_defaults();
assert!(!registry.list_tokenizers().is_empty());
}
}