2025-07-18 14:24:24 -07:00
|
|
|
//! Factory for creating router instances
|
|
|
|
|
|
|
|
|
|
use super::{pd_router::PDRouter, router::Router, RouterTrait};
|
|
|
|
|
use crate::config::{PolicyConfig, RouterConfig, RoutingMode};
|
|
|
|
|
use crate::policies::PolicyFactory;
|
|
|
|
|
|
|
|
|
|
/// Factory for creating router instances based on configuration
|
|
|
|
|
pub struct RouterFactory;
|
|
|
|
|
|
|
|
|
|
impl RouterFactory {
|
|
|
|
|
/// Create a router instance from configuration
|
|
|
|
|
pub fn create_router(config: &RouterConfig) -> Result<Box<dyn RouterTrait>, String> {
|
|
|
|
|
match &config.mode {
|
|
|
|
|
RoutingMode::Regular { worker_urls } => {
|
|
|
|
|
Self::create_regular_router(worker_urls, &config.policy, config)
|
|
|
|
|
}
|
|
|
|
|
RoutingMode::PrefillDecode {
|
|
|
|
|
prefill_urls,
|
|
|
|
|
decode_urls,
|
2025-07-27 00:39:20 -07:00
|
|
|
prefill_policy,
|
|
|
|
|
decode_policy,
|
|
|
|
|
} => Self::create_pd_router(
|
|
|
|
|
prefill_urls,
|
|
|
|
|
decode_urls,
|
|
|
|
|
prefill_policy.as_ref(),
|
|
|
|
|
decode_policy.as_ref(),
|
|
|
|
|
&config.policy,
|
|
|
|
|
config,
|
|
|
|
|
),
|
2025-07-18 14:24:24 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Create a regular router with injected policy
|
|
|
|
|
fn create_regular_router(
|
|
|
|
|
worker_urls: &[String],
|
|
|
|
|
policy_config: &PolicyConfig,
|
|
|
|
|
router_config: &RouterConfig,
|
|
|
|
|
) -> Result<Box<dyn RouterTrait>, String> {
|
|
|
|
|
// Create policy
|
|
|
|
|
let policy = PolicyFactory::create_from_config(policy_config);
|
|
|
|
|
|
|
|
|
|
// Create regular router with injected policy
|
|
|
|
|
let router = Router::new(
|
|
|
|
|
worker_urls.to_vec(),
|
|
|
|
|
policy,
|
|
|
|
|
router_config.worker_startup_timeout_secs,
|
|
|
|
|
router_config.worker_startup_check_interval_secs,
|
|
|
|
|
)?;
|
|
|
|
|
|
|
|
|
|
Ok(Box::new(router))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Create a PD router with injected policy
|
|
|
|
|
fn create_pd_router(
|
|
|
|
|
prefill_urls: &[(String, Option<u16>)],
|
|
|
|
|
decode_urls: &[String],
|
2025-07-27 00:39:20 -07:00
|
|
|
prefill_policy_config: Option<&PolicyConfig>,
|
|
|
|
|
decode_policy_config: Option<&PolicyConfig>,
|
|
|
|
|
main_policy_config: &PolicyConfig,
|
2025-07-18 14:24:24 -07:00
|
|
|
router_config: &RouterConfig,
|
|
|
|
|
) -> Result<Box<dyn RouterTrait>, String> {
|
2025-07-27 00:39:20 -07:00
|
|
|
// Create policies - use specific policies if provided, otherwise fall back to main policy
|
|
|
|
|
let prefill_policy =
|
|
|
|
|
PolicyFactory::create_from_config(prefill_policy_config.unwrap_or(main_policy_config));
|
|
|
|
|
let decode_policy =
|
|
|
|
|
PolicyFactory::create_from_config(decode_policy_config.unwrap_or(main_policy_config));
|
2025-07-18 14:24:24 -07:00
|
|
|
|
2025-07-27 00:39:20 -07:00
|
|
|
// Create PD router with separate policies
|
2025-07-18 14:24:24 -07:00
|
|
|
let router = PDRouter::new(
|
|
|
|
|
prefill_urls.to_vec(),
|
|
|
|
|
decode_urls.to_vec(),
|
2025-07-27 00:39:20 -07:00
|
|
|
prefill_policy,
|
|
|
|
|
decode_policy,
|
2025-07-18 14:24:24 -07:00
|
|
|
router_config.worker_startup_timeout_secs,
|
|
|
|
|
router_config.worker_startup_check_interval_secs,
|
|
|
|
|
)?;
|
|
|
|
|
|
|
|
|
|
Ok(Box::new(router))
|
|
|
|
|
}
|
|
|
|
|
}
|