refactor: 抽离 AI pipeline 与调度共享能力逻辑

This commit is contained in:
fawney19
2026-04-10 01:46:14 +08:00
parent b901a6ffc7
commit 5014e2f5fd
255 changed files with 15057 additions and 3115 deletions

View File

@@ -85,7 +85,7 @@ pub struct AdminBillingRuleRecord {
pub variables: Value,
pub dimension_mappings: Value,
pub is_enabled: bool,
pub created_at_unix_secs: u64,
pub created_at_unix_ms: u64,
pub updated_at_unix_secs: u64,
}
@@ -114,7 +114,7 @@ pub struct AdminBillingCollectorRecord {
pub default_value: Option<String>,
pub priority: i32,
pub is_enabled: bool,
pub created_at_unix_secs: u64,
pub created_at_unix_ms: u64,
pub updated_at_unix_secs: u64,
}

View File

@@ -36,10 +36,10 @@ impl RequestCandidateStatus {
}
}
pub fn is_attempted(self, started_at_unix_secs: Option<u64>) -> bool {
pub fn is_attempted(self, started_at_unix_ms: Option<u64>) -> bool {
match self {
Self::Available | Self::Unused | Self::Skipped => false,
Self::Pending => started_at_unix_secs.is_some(),
Self::Pending => started_at_unix_ms.is_some(),
Self::Streaming | Self::Success | Self::Failed | Self::Cancelled => true,
}
}
@@ -68,9 +68,9 @@ pub struct StoredRequestCandidate {
pub concurrent_requests: Option<u32>,
pub extra_data: Option<serde_json::Value>,
pub required_capabilities: Option<serde_json::Value>,
pub created_at_unix_secs: u64,
pub started_at_unix_secs: Option<u64>,
pub finished_at_unix_secs: Option<u64>,
pub created_at_unix_ms: u64,
pub started_at_unix_ms: Option<u64>,
pub finished_at_unix_ms: Option<u64>,
}
impl StoredRequestCandidate {
@@ -97,9 +97,9 @@ impl StoredRequestCandidate {
concurrent_requests: Option<i32>,
extra_data: Option<serde_json::Value>,
required_capabilities: Option<serde_json::Value>,
created_at_unix_secs: i64,
started_at_unix_secs: Option<i64>,
finished_at_unix_secs: Option<i64>,
created_at_unix_ms: i64,
started_at_unix_ms: Option<i64>,
finished_at_unix_ms: Option<i64>,
) -> Result<Self, crate::DataLayerError> {
let candidate_index = u32::try_from(candidate_index).map_err(|_| {
crate::DataLayerError::UnexpectedValue(format!(
@@ -138,25 +138,25 @@ impl StoredRequestCandidate {
})
})
.transpose()?;
let created_at_unix_secs = u64::try_from(created_at_unix_secs).map_err(|_| {
let created_at_unix_ms = u64::try_from(created_at_unix_ms).map_err(|_| {
crate::DataLayerError::UnexpectedValue(format!(
"invalid request_candidates.created_at_unix_secs: {created_at_unix_secs}"
"invalid request_candidates.created_at_unix_ms: {created_at_unix_ms}"
))
})?;
let started_at_unix_secs = started_at_unix_secs
let started_at_unix_ms = started_at_unix_ms
.map(|value| {
u64::try_from(value).map_err(|_| {
crate::DataLayerError::UnexpectedValue(format!(
"invalid request_candidates.started_at_unix_secs: {value}"
"invalid request_candidates.started_at_unix_ms: {value}"
))
})
})
.transpose()?;
let finished_at_unix_secs = finished_at_unix_secs
let finished_at_unix_ms = finished_at_unix_ms
.map(|value| {
u64::try_from(value).map_err(|_| {
crate::DataLayerError::UnexpectedValue(format!(
"invalid request_candidates.finished_at_unix_secs: {value}"
"invalid request_candidates.finished_at_unix_ms: {value}"
))
})
})
@@ -184,9 +184,9 @@ impl StoredRequestCandidate {
concurrent_requests,
extra_data,
required_capabilities,
created_at_unix_secs,
started_at_unix_secs,
finished_at_unix_secs,
created_at_unix_ms,
started_at_unix_ms,
finished_at_unix_ms,
})
}
}
@@ -223,11 +223,7 @@ impl RequestCandidateTrace {
let candidates = if attempted_only {
all_candidates
.iter()
.filter(|candidate| {
candidate
.status
.is_attempted(candidate.started_at_unix_secs)
})
.filter(|candidate| candidate.status.is_attempted(candidate.started_at_unix_ms))
.cloned()
.collect::<Vec<_>>()
} else {
@@ -307,11 +303,15 @@ pub struct DecisionTraceCandidate {
pub provider_name: Option<String>,
pub provider_website: Option<String>,
pub provider_type: Option<String>,
pub provider_priority: Option<i32>,
pub provider_keep_priority_on_conversion: Option<bool>,
pub endpoint_api_format: Option<String>,
pub endpoint_api_family: Option<String>,
pub endpoint_kind: Option<String>,
pub provider_key_name: Option<String>,
pub provider_key_auth_type: Option<String>,
pub provider_key_internal_priority: Option<i32>,
pub provider_key_global_priority_by_format: Option<serde_json::Value>,
pub provider_key_capabilities: Option<serde_json::Value>,
pub provider_key_is_active: Option<bool>,
}
@@ -382,6 +382,8 @@ fn enrich_decision_trace_candidate(
provider_name: provider.map(|item| item.name.clone()),
provider_website: provider.and_then(|item| item.website.clone()),
provider_type: provider.map(|item| item.provider_type.clone()),
provider_priority: provider.map(|item| item.provider_priority),
provider_keep_priority_on_conversion: provider.map(|item| item.keep_priority_on_conversion),
endpoint_api_format: endpoint.map(|item| item.api_format.clone()),
endpoint_api_family: endpoint.and_then(|item| item.api_family.clone()),
endpoint_kind: endpoint.and_then(|item| item.endpoint_kind.clone()),
@@ -389,6 +391,9 @@ fn enrich_decision_trace_candidate(
.map(|item| item.name.clone())
.or_else(|| candidate.api_key_name.clone()),
provider_key_auth_type: provider_key.map(|item| item.auth_type.clone()),
provider_key_internal_priority: provider_key.map(|item| item.internal_priority),
provider_key_global_priority_by_format: provider_key
.and_then(|item| item.global_priority_by_format.clone()),
provider_key_capabilities: provider_key.and_then(|item| item.capabilities.clone()),
provider_key_is_active: provider_key.map(|item| item.is_active),
candidate,
@@ -409,8 +414,8 @@ pub struct PublicHealthTimelineBucket {
pub total_count: u64,
pub success_count: u64,
pub failed_count: u64,
pub min_created_at_unix_secs: Option<u64>,
pub max_created_at_unix_secs: Option<u64>,
pub min_created_at_unix_ms: Option<u64>,
pub max_created_at_unix_ms: Option<u64>,
}
#[async_trait]
@@ -476,9 +481,9 @@ pub struct UpsertRequestCandidateRecord {
pub concurrent_requests: Option<u32>,
pub extra_data: Option<serde_json::Value>,
pub required_capabilities: Option<serde_json::Value>,
pub created_at_unix_secs: Option<u64>,
pub started_at_unix_secs: Option<u64>,
pub finished_at_unix_secs: Option<u64>,
pub created_at_unix_ms: Option<u64>,
pub started_at_unix_ms: Option<u64>,
pub finished_at_unix_ms: Option<u64>,
}
impl UpsertRequestCandidateRecord {

View File

@@ -187,7 +187,7 @@ pub struct StoredAdminGlobalModel {
pub provider_count: u64,
pub active_provider_count: u64,
pub usage_count: u64,
pub created_at_unix_secs: Option<u64>,
pub created_at_unix_ms: Option<u64>,
pub updated_at_unix_secs: Option<u64>,
}
@@ -205,7 +205,7 @@ impl StoredAdminGlobalModel {
provider_count: u64,
active_provider_count: u64,
usage_count: u64,
created_at_unix_secs: Option<u64>,
created_at_unix_ms: Option<u64>,
updated_at_unix_secs: Option<u64>,
) -> Result<Self, crate::DataLayerError> {
if id.trim().is_empty() {
@@ -236,7 +236,7 @@ impl StoredAdminGlobalModel {
provider_count,
active_provider_count,
usage_count,
created_at_unix_secs,
created_at_unix_ms,
updated_at_unix_secs,
})
}
@@ -267,7 +267,7 @@ pub struct StoredAdminProviderModel {
pub is_active: bool,
pub is_available: bool,
pub config: Option<Value>,
pub created_at_unix_secs: Option<u64>,
pub created_at_unix_ms: Option<u64>,
pub updated_at_unix_secs: Option<u64>,
pub global_model_name: Option<String>,
pub global_model_display_name: Option<String>,
@@ -294,7 +294,7 @@ impl StoredAdminProviderModel {
is_active: bool,
is_available: bool,
config: Option<Value>,
created_at_unix_secs: Option<u64>,
created_at_unix_ms: Option<u64>,
updated_at_unix_secs: Option<u64>,
global_model_name: Option<String>,
global_model_display_name: Option<String>,
@@ -339,7 +339,7 @@ impl StoredAdminProviderModel {
is_active,
is_available,
config,
created_at_unix_secs,
created_at_unix_ms,
updated_at_unix_secs,
global_model_name,
global_model_display_name,

View File

@@ -23,7 +23,7 @@ pub struct StoredProviderCatalogProvider {
pub request_timeout_secs: Option<f64>,
pub stream_first_byte_timeout_secs: Option<f64>,
pub config: Option<serde_json::Value>,
pub created_at_unix_secs: Option<u64>,
pub created_at_unix_ms: Option<u64>,
pub updated_at_unix_secs: Option<u64>,
}
@@ -67,7 +67,7 @@ impl StoredProviderCatalogProvider {
request_timeout_secs: None,
stream_first_byte_timeout_secs: None,
config: None,
created_at_unix_secs: None,
created_at_unix_ms: None,
updated_at_unix_secs: None,
})
}
@@ -128,10 +128,10 @@ impl StoredProviderCatalogProvider {
pub fn with_timestamps(
mut self,
created_at_unix_secs: Option<u64>,
created_at_unix_ms: Option<u64>,
updated_at_unix_secs: Option<u64>,
) -> Self {
self.created_at_unix_secs = created_at_unix_secs;
self.created_at_unix_ms = created_at_unix_ms;
self.updated_at_unix_secs = updated_at_unix_secs;
self
}
@@ -154,7 +154,7 @@ pub struct StoredProviderCatalogEndpoint {
pub config: Option<serde_json::Value>,
pub format_acceptance_config: Option<serde_json::Value>,
pub proxy: Option<serde_json::Value>,
pub created_at_unix_secs: Option<u64>,
pub created_at_unix_ms: Option<u64>,
pub updated_at_unix_secs: Option<u64>,
}
@@ -189,7 +189,7 @@ impl StoredProviderCatalogEndpoint {
config: None,
format_acceptance_config: None,
proxy: None,
created_at_unix_secs: None,
created_at_unix_ms: None,
updated_at_unix_secs: None,
})
}
@@ -230,10 +230,10 @@ impl StoredProviderCatalogEndpoint {
pub fn with_timestamps(
mut self,
created_at_unix_secs: Option<u64>,
created_at_unix_ms: Option<u64>,
updated_at_unix_secs: Option<u64>,
) -> Self {
self.created_at_unix_secs = created_at_unix_secs;
self.created_at_unix_ms = created_at_unix_ms;
self.updated_at_unix_secs = updated_at_unix_secs;
self
}
@@ -286,7 +286,7 @@ pub struct StoredProviderCatalogKey {
pub oauth_invalid_at_unix_secs: Option<u64>,
pub oauth_invalid_reason: Option<String>,
pub status_snapshot: Option<serde_json::Value>,
pub created_at_unix_secs: Option<u64>,
pub created_at_unix_ms: Option<u64>,
pub updated_at_unix_secs: Option<u64>,
pub health_by_format: Option<serde_json::Value>,
pub circuit_breaker_by_format: Option<serde_json::Value>,
@@ -358,7 +358,7 @@ impl StoredProviderCatalogKey {
oauth_invalid_at_unix_secs: None,
oauth_invalid_reason: None,
status_snapshot: None,
created_at_unix_secs: None,
created_at_unix_ms: None,
updated_at_unix_secs: None,
health_by_format: None,
circuit_breaker_by_format: None,

View File

@@ -59,7 +59,7 @@ pub struct StoredRequestUsageAudit {
pub client_response_body: Option<Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub request_metadata: Option<Value>,
pub created_at_unix_secs: u64,
pub created_at_unix_ms: u64,
pub updated_at_unix_secs: u64,
pub finalized_at_unix_secs: Option<u64>,
}
@@ -100,7 +100,7 @@ impl StoredRequestUsageAudit {
first_byte_time_ms: Option<i32>,
status: String,
billing_status: String,
created_at_unix_secs: i64,
created_at_unix_ms: i64,
updated_at_unix_secs: i64,
finalized_at_unix_secs: Option<i64>,
) -> Result<Self, crate::DataLayerError> {
@@ -188,10 +188,7 @@ impl StoredRequestUsageAudit {
client_response_headers: None,
client_response_body: None,
request_metadata: None,
created_at_unix_secs: parse_timestamp(
created_at_unix_secs,
"usage.created_at_unix_secs",
)?,
created_at_unix_ms: parse_timestamp(created_at_unix_ms, "usage.created_at_unix_ms")?,
updated_at_unix_secs: parse_timestamp(
updated_at_unix_secs,
"usage.updated_at_unix_secs",
@@ -372,7 +369,7 @@ pub struct UpsertUsageRecord {
pub client_response_body: Option<Value>,
pub request_metadata: Option<Value>,
pub finalized_at_unix_secs: Option<u64>,
pub created_at_unix_secs: Option<u64>,
pub created_at_unix_ms: Option<u64>,
pub updated_at_unix_secs: u64,
}
@@ -630,7 +627,7 @@ mod tests {
client_response_body: None,
request_metadata: None,
finalized_at_unix_secs: None,
created_at_unix_secs: Some(100),
created_at_unix_ms: Some(100),
updated_at_unix_secs: 101,
};

View File

@@ -73,7 +73,7 @@ pub struct StoredVideoTask {
pub next_poll_at_unix_secs: Option<u64>,
pub poll_count: u32,
pub max_poll_count: u32,
pub created_at_unix_secs: u64,
pub created_at_unix_ms: u64,
pub submitted_at_unix_secs: Option<u64>,
pub completed_at_unix_secs: Option<u64>,
pub updated_at_unix_secs: u64,
@@ -115,7 +115,7 @@ impl StoredVideoTask {
next_poll_at_unix_secs: Option<i64>,
poll_count: i32,
max_poll_count: i32,
created_at_unix_secs: i64,
created_at_unix_ms: i64,
submitted_at_unix_secs: Option<i64>,
completed_at_unix_secs: Option<i64>,
updated_at_unix_secs: i64,
@@ -147,9 +147,9 @@ impl StoredVideoTask {
"invalid max_poll_count: {max_poll_count}"
))
})?;
let created_at_unix_secs = u64::try_from(created_at_unix_secs).map_err(|_| {
let created_at_unix_ms = u64::try_from(created_at_unix_ms).map_err(|_| {
crate::DataLayerError::UnexpectedValue(format!(
"invalid created_at_unix_secs: {created_at_unix_secs}"
"invalid created_at_unix_ms: {created_at_unix_ms}"
))
})?;
let submitted_at_unix_secs =
@@ -198,7 +198,7 @@ impl StoredVideoTask {
next_poll_at_unix_secs,
poll_count,
max_poll_count,
created_at_unix_secs,
created_at_unix_ms,
submitted_at_unix_secs,
completed_at_unix_secs,
updated_at_unix_secs,
@@ -241,7 +241,7 @@ pub struct UpsertVideoTask {
pub next_poll_at_unix_secs: Option<u64>,
pub poll_count: u32,
pub max_poll_count: u32,
pub created_at_unix_secs: u64,
pub created_at_unix_ms: u64,
pub submitted_at_unix_secs: Option<u64>,
pub completed_at_unix_secs: Option<u64>,
pub updated_at_unix_secs: u64,
@@ -283,7 +283,7 @@ impl UpsertVideoTask {
next_poll_at_unix_secs: self.next_poll_at_unix_secs,
poll_count: self.poll_count,
max_poll_count: self.max_poll_count,
created_at_unix_secs: self.created_at_unix_secs,
created_at_unix_ms: self.created_at_unix_ms,
submitted_at_unix_secs: self.submitted_at_unix_secs,
completed_at_unix_secs: self.completed_at_unix_secs,
updated_at_unix_secs: self.updated_at_unix_secs,
@@ -327,7 +327,7 @@ impl From<StoredVideoTask> for UpsertVideoTask {
next_poll_at_unix_secs: task.next_poll_at_unix_secs,
poll_count: task.poll_count,
max_poll_count: task.max_poll_count,
created_at_unix_secs: task.created_at_unix_secs,
created_at_unix_ms: task.created_at_unix_ms,
submitted_at_unix_secs: task.submitted_at_unix_secs,
completed_at_unix_secs: task.completed_at_unix_secs,
updated_at_unix_secs: task.updated_at_unix_secs,