use serde::{Deserialize, Serialize}; use serde_json::Value; use crate::actions::{RoutingSchedulingMode, RoutingSetPriorityMode}; use crate::ranking::{CandidateKind, RoutingCandidateRankVector}; #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] pub struct RoutingPatchSummary { #[serde(default)] pub body_paths: Vec, #[serde(default)] pub header_names: Vec, #[serde(default, skip_serializing_if = "Option::is_none")] pub failed_action: Option, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct RoutingCandidateTrace { pub candidate_kind: CandidateKind, pub provider_id: String, pub endpoint_id: String, pub model_id: String, #[serde(default, skip_serializing_if = "Option::is_none")] pub key_id: Option, pub ranking_vector: RoutingCandidateRankVector, #[serde(default, skip_serializing_if = "Option::is_none")] pub skip_reason: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub selected_order: Option, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct RoutingPoolExpansionTrace { pub pool_group_id: String, pub key_id: String, #[serde(default)] pub pool_ranking_vector: Vec, #[serde(default, skip_serializing_if = "Option::is_none")] pub pool_skip_reason: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub selected_order: Option, } #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] pub struct RoutingRuntimeFacts { #[serde(default)] pub cache_affinity_hit: bool, #[serde(default, skip_serializing_if = "Option::is_none")] pub sticky_key_id: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub load_balance_seed: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub scheduler_mode: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub priority_mode: Option, } #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] pub struct RoutingDecisionTrace { #[serde(default, skip_serializing_if = "Option::is_none")] pub group_id: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub group_version: Option, pub selection_source: String, #[serde(default)] pub selected_rules: Vec, pub original_model: String, pub resolved_model: String, pub client_api_format: String, #[serde(default)] pub client_request_patch_summary: RoutingPatchSummary, #[serde(default)] pub provider_request_patch_summary: RoutingPatchSummary, #[serde(default)] pub global_candidates: Vec, #[serde(default)] pub pool_expansion: Vec, #[serde(default)] pub runtime_facts: RoutingRuntimeFacts, } impl RoutingDecisionTrace { pub fn to_extra_data_value(&self) -> Value { serde_json::json!({ "routing_trace": self }) } }