feat: add routing profile scheduling policies

This commit is contained in:
fawney19
2026-05-18 11:03:49 +08:00
parent a2f91b4108
commit 92813e6122
124 changed files with 11681 additions and 578 deletions

View File

@@ -49,6 +49,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -92,6 +94,8 @@ impl GatewayDataState {
let pool_score_writer = backends.write().pool_scores();
let provider_quota_reader = backends.read().provider_quotas();
let provider_quota_writer = backends.write().provider_quotas();
let routing_group_reader = backends.read().routing_groups();
let routing_group_writer = backends.write().routing_groups();
let usage_reader = backends.read().usage();
let usage_writer = backends.write().usage();
let user_reader = backends.read().users();
@@ -133,6 +137,8 @@ impl GatewayDataState {
pool_score_writer,
provider_quota_reader,
provider_quota_writer,
routing_group_reader,
routing_group_writer,
usage_reader,
usage_writer,
user_reader,
@@ -261,6 +267,14 @@ impl GatewayDataState {
self.request_candidate_writer.is_some()
}
pub(crate) fn has_routing_group_reader(&self) -> bool {
self.routing_group_reader.is_some()
}
pub(crate) fn has_routing_group_writer(&self) -> bool {
self.routing_group_writer.is_some()
}
pub(crate) fn has_provider_catalog_reader(&self) -> bool {
self.provider_catalog_reader.is_some()
}

View File

@@ -125,6 +125,9 @@ use aether_data_contracts::repository::provider_catalog::{
use aether_data_contracts::repository::quota::{
ProviderQuotaReadRepository, ProviderQuotaWriteRepository, StoredProviderQuotaSnapshot,
};
use aether_data_contracts::repository::routing_profiles::{
RoutingGroupReadRepository, RoutingGroupWriteRepository,
};
use aether_data_contracts::repository::settlement::{
SettlementWriteRepository, StoredUsageSettlement, UsageSettlementInput,
};
@@ -170,6 +173,8 @@ pub(crate) struct GatewayDataState {
pool_score_writer: Option<Arc<dyn PoolMemberScoreWriteRepository>>,
provider_quota_reader: Option<Arc<dyn ProviderQuotaReadRepository>>,
provider_quota_writer: Option<Arc<dyn ProviderQuotaWriteRepository>>,
routing_group_reader: Option<Arc<dyn RoutingGroupReadRepository>>,
routing_group_writer: Option<Arc<dyn RoutingGroupWriteRepository>>,
usage_reader: Option<Arc<dyn UsageReadRepository>>,
usage_writer: Option<Arc<dyn UsageWriteRepository>>,
user_reader: Option<Arc<dyn UserReadRepository>>,
@@ -279,6 +284,14 @@ impl fmt::Debug for GatewayDataState {
"has_provider_quota_writer",
&self.provider_quota_writer.is_some(),
)
.field(
"has_routing_group_reader",
&self.routing_group_reader.is_some(),
)
.field(
"has_routing_group_writer",
&self.routing_group_writer.is_some(),
)
.field("has_usage_reader", &self.usage_reader.is_some())
.field("has_usage_writer", &self.usage_writer.is_some())
.field("has_user_preferences", &self.user_preferences.is_some())
@@ -302,6 +315,7 @@ mod core;
mod integrations;
mod models;
mod pool_scores;
mod routing_profiles;
mod runtime;
#[cfg(test)]
mod testing;

View File

@@ -0,0 +1,131 @@
use aether_data_contracts::repository::routing_profiles::{
CreateRoutingGroupBindingRecord, CreateRoutingGroupRecord, CreateRoutingGroupVersionRecord,
RoutingGroupBindingQuery, RoutingGroupLookupKey, RoutingGroupReadRepository,
StoredRoutingGroup, StoredRoutingGroupBinding, StoredRoutingGroupVersion,
UpdateRoutingGroupBindingRecord, UpdateRoutingGroupRecord,
};
use std::sync::Arc;
use super::{DataLayerError, GatewayDataState};
impl GatewayDataState {
pub(crate) fn routing_group_read_repository(
&self,
) -> Option<Arc<dyn RoutingGroupReadRepository>> {
self.routing_group_reader.clone()
}
pub(crate) async fn list_routing_groups(
&self,
) -> Result<Vec<StoredRoutingGroup>, DataLayerError> {
match &self.routing_group_reader {
Some(repository) => repository.list_routing_groups().await,
None => Ok(Vec::new()),
}
}
pub(crate) async fn find_routing_group(
&self,
lookup: RoutingGroupLookupKey<'_>,
) -> Result<Option<StoredRoutingGroup>, DataLayerError> {
match &self.routing_group_reader {
Some(repository) => repository.find_routing_group(lookup).await,
None => Ok(None),
}
}
pub(crate) async fn list_routing_group_bindings(
&self,
query: &RoutingGroupBindingQuery,
) -> Result<Vec<StoredRoutingGroupBinding>, DataLayerError> {
match &self.routing_group_reader {
Some(repository) => repository.list_routing_group_bindings(query).await,
None => Ok(Vec::new()),
}
}
pub(crate) async fn list_routing_group_versions(
&self,
group_id: &str,
) -> Result<Vec<StoredRoutingGroupVersion>, DataLayerError> {
match &self.routing_group_reader {
Some(repository) => repository.list_routing_group_versions(group_id).await,
None => Ok(Vec::new()),
}
}
pub(crate) async fn create_routing_group(
&self,
record: CreateRoutingGroupRecord,
) -> Result<Option<StoredRoutingGroup>, DataLayerError> {
match &self.routing_group_writer {
Some(repository) => repository.create_routing_group(record).await.map(Some),
None => Ok(None),
}
}
pub(crate) async fn update_routing_group(
&self,
id: &str,
patch: UpdateRoutingGroupRecord,
) -> Result<Option<StoredRoutingGroup>, DataLayerError> {
match &self.routing_group_writer {
Some(repository) => repository.update_routing_group(id, patch).await,
None => Ok(None),
}
}
pub(crate) async fn delete_routing_group(&self, id: &str) -> Result<bool, DataLayerError> {
match &self.routing_group_writer {
Some(repository) => repository.delete_routing_group(id).await,
None => Ok(false),
}
}
pub(crate) async fn create_routing_group_binding(
&self,
record: CreateRoutingGroupBindingRecord,
) -> Result<Option<StoredRoutingGroupBinding>, DataLayerError> {
match &self.routing_group_writer {
Some(repository) => repository
.create_routing_group_binding(record)
.await
.map(Some),
None => Ok(None),
}
}
pub(crate) async fn update_routing_group_binding(
&self,
id: &str,
patch: UpdateRoutingGroupBindingRecord,
) -> Result<Option<StoredRoutingGroupBinding>, DataLayerError> {
match &self.routing_group_writer {
Some(repository) => repository.update_routing_group_binding(id, patch).await,
None => Ok(None),
}
}
pub(crate) async fn delete_routing_group_binding(
&self,
id: &str,
) -> Result<bool, DataLayerError> {
match &self.routing_group_writer {
Some(repository) => repository.delete_routing_group_binding(id).await,
None => Ok(false),
}
}
pub(crate) async fn create_routing_group_version(
&self,
record: CreateRoutingGroupVersionRecord,
) -> Result<Option<StoredRoutingGroupVersion>, DataLayerError> {
match &self.routing_group_writer {
Some(repository) => repository
.create_routing_group_version(record)
.await
.map(Some),
None => Ok(None),
}
}
}

View File

@@ -38,6 +38,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -92,6 +94,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,

View File

@@ -73,6 +73,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -126,6 +128,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -175,6 +179,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -312,6 +318,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -389,6 +397,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -447,6 +457,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: Some(provider_quota_reader),
provider_quota_writer: Some(provider_quota_writer),
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -514,6 +526,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: Some(provider_quota_reader),
provider_quota_writer: Some(provider_quota_writer),
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -563,6 +577,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -613,6 +629,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -674,6 +692,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: Some(usage_reader),
usage_writer: Some(usage_writer),
user_reader: None,
@@ -737,6 +757,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -784,6 +806,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: Some(repository),
usage_writer: None,
user_reader: None,
@@ -846,6 +870,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: Some(repository),
@@ -901,6 +927,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: Some(user_repository),
@@ -961,6 +989,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: Some(usage_reader),
usage_writer: Some(usage_writer),
user_reader: Some(user_repository),
@@ -1022,6 +1052,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: Some(user_repository),
@@ -1082,6 +1114,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: Some(usage_reader),
usage_writer: None,
user_reader: None,
@@ -1131,6 +1165,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -1180,6 +1216,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -1241,6 +1279,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -1307,6 +1347,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -1356,6 +1398,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -1410,6 +1454,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -1481,6 +1527,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -1547,6 +1595,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -1597,6 +1647,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -1647,6 +1699,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -1699,6 +1753,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: Some(usage_repository),
usage_writer: None,
user_reader: None,
@@ -1749,6 +1805,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -1799,6 +1857,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -1849,6 +1909,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -1907,6 +1969,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: Some(provider_quota_reader),
provider_quota_writer: Some(provider_quota_writer),
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -1966,6 +2030,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: Some(provider_quota_reader),
provider_quota_writer: Some(provider_quota_writer),
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -2028,6 +2094,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: Some(provider_quota_reader),
provider_quota_writer: Some(provider_quota_writer),
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -2096,6 +2164,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -2165,6 +2235,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -2238,6 +2310,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: Some(usage_reader),
usage_writer: Some(usage_writer),
user_reader: None,
@@ -2318,6 +2392,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: Some(usage_reader),
usage_writer: Some(usage_writer),
user_reader: None,
@@ -2380,6 +2456,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: Some(provider_quota_reader),
provider_quota_writer: Some(provider_quota_writer),
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -2433,6 +2511,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: Some(usage_reader),
usage_writer: Some(usage_writer),
user_reader: None,
@@ -2482,6 +2562,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -2537,6 +2619,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -2596,6 +2680,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: Some(usage_reader),
usage_writer: Some(usage_writer),
user_reader: None,
@@ -2656,6 +2742,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: Some(usage_reader),
usage_writer: Some(usage_writer),
user_reader: None,
@@ -2709,6 +2797,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: Some(provider_quota_reader),
provider_quota_writer: Some(provider_quota_writer),
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,

View File

@@ -42,6 +42,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -98,6 +100,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -151,6 +155,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -208,6 +214,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -269,6 +277,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,
@@ -339,6 +349,8 @@ impl GatewayDataState {
pool_score_writer: None,
provider_quota_reader: None,
provider_quota_writer: None,
routing_group_reader: None,
routing_group_writer: None,
usage_reader: None,
usage_writer: None,
user_reader: None,