refactor(success_based): add support for exploration (#8158)

Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
Chethan Rao
2025-05-27 22:46:44 +05:30
committed by GitHub
parent b7c5f1f276
commit 3eb94d9a3d
8 changed files with 40 additions and 10 deletions

View File

@ -23374,9 +23374,13 @@
}, },
"specificity_level": { "specificity_level": {
"$ref": "#/components/schemas/SuccessRateSpecificityLevel" "$ref": "#/components/schemas/SuccessRateSpecificityLevel"
}
}, },
"additionalProperties": false "exploration_percent": {
"type": "number",
"format": "double",
"nullable": true
}
}
}, },
"SuccessRateSpecificityLevel": { "SuccessRateSpecificityLevel": {
"type": "string", "type": "string",

View File

@ -44,6 +44,7 @@ paths:
min_aggregates_size: 5 min_aggregates_size: 5
default_success_rate: 0.95 default_success_rate: 0.95
specificity_level: ENTITY specificity_level: ENTITY
exploration_percent: 20.0
responses: responses:
"200": "200":
description: Success rate calculated successfully description: Success rate calculated successfully
@ -758,6 +759,17 @@ components:
items: items:
$ref: "#/components/schemas/LabelWithScore" $ref: "#/components/schemas/LabelWithScore"
description: List of labels with their calculated success rates description: List of labels with their calculated success rates
routing_approach:
$ref: "#/components/schemas/RoutingApproach"
RoutingApproach:
type: string
description: >
Defines the routing approach based on the success rate calculation.
enum:
- EXPLORATION
- EXPLOITATION
example: EXPLOITATION
UpdateSuccessRateWindowRequest: UpdateSuccessRateWindowRequest:
type: object type: object

View File

@ -27396,9 +27396,13 @@
}, },
"specificity_level": { "specificity_level": {
"$ref": "#/components/schemas/SuccessRateSpecificityLevel" "$ref": "#/components/schemas/SuccessRateSpecificityLevel"
}
}, },
"additionalProperties": false "exploration_percent": {
"type": "number",
"format": "double",
"nullable": true
}
}
}, },
"SuccessRateSpecificityLevel": { "SuccessRateSpecificityLevel": {
"type": "string", "type": "string",

View File

@ -62,6 +62,7 @@ pub struct PaymentInfo {
pub struct DecidedGateway { pub struct DecidedGateway {
pub gateway_priority_map: Option<HashMap<String, f64>>, pub gateway_priority_map: Option<HashMap<String, f64>>,
pub debit_routing_output: Option<DebitRoutingOutput>, pub debit_routing_output: Option<DebitRoutingOutput>,
pub routing_approach: String,
} }
#[derive(Debug, Serialize, Deserialize, PartialEq)] #[derive(Debug, Serialize, Deserialize, PartialEq)]

View File

@ -965,6 +965,7 @@ impl Default for SuccessBasedRoutingConfig {
max_total_count: Some(5), max_total_count: Some(5),
}), }),
specificity_level: SuccessRateSpecificityLevel::default(), specificity_level: SuccessRateSpecificityLevel::default(),
exploration_percent: Some(20.0),
}), }),
decision_engine_configs: None, decision_engine_configs: None,
} }
@ -985,7 +986,6 @@ pub enum DynamicRoutingConfigParams {
} }
#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, ToSchema)] #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, ToSchema)]
#[serde(deny_unknown_fields)]
pub struct SuccessBasedRoutingConfigBody { pub struct SuccessBasedRoutingConfigBody {
pub min_aggregates_size: Option<u32>, pub min_aggregates_size: Option<u32>,
pub default_success_rate: Option<f64>, pub default_success_rate: Option<f64>,
@ -993,6 +993,7 @@ pub struct SuccessBasedRoutingConfigBody {
pub current_block_threshold: Option<CurrentBlockThreshold>, pub current_block_threshold: Option<CurrentBlockThreshold>,
#[serde(default)] #[serde(default)]
pub specificity_level: SuccessRateSpecificityLevel, pub specificity_level: SuccessRateSpecificityLevel,
pub exploration_percent: Option<f64>,
} }
#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, ToSchema)] #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, ToSchema)]
@ -1118,7 +1119,10 @@ impl SuccessBasedRoutingConfigBody {
.as_mut() .as_mut()
.map(|threshold| threshold.update(current_block_threshold)); .map(|threshold| threshold.update(current_block_threshold));
} }
self.specificity_level = new.specificity_level self.specificity_level = new.specificity_level;
if let Some(exploration_percent) = new.exploration_percent {
self.exploration_percent = Some(exploration_percent);
}
} }
} }

View File

@ -290,6 +290,7 @@ impl ForeignTryFrom<SuccessBasedRoutingConfigBody> for CalSuccessRateConfig {
SuccessRateSpecificityLevel::Merchant => Some(ProtoSpecificityLevel::Entity.into()), SuccessRateSpecificityLevel::Merchant => Some(ProtoSpecificityLevel::Entity.into()),
SuccessRateSpecificityLevel::Global => Some(ProtoSpecificityLevel::Global.into()), SuccessRateSpecificityLevel::Global => Some(ProtoSpecificityLevel::Global.into()),
}, },
exploration_percent: config.exploration_percent,
}) })
} }
} }

View File

@ -1776,10 +1776,7 @@ pub async fn perform_decide_gateway_call_with_open_router(
))?; ))?;
if let Some(gateway_priority_map) = decided_gateway.gateway_priority_map { if let Some(gateway_priority_map) = decided_gateway.gateway_priority_map {
logger::debug!( logger::debug!(gateway_priority_map=?gateway_priority_map, routing_approach=decided_gateway.routing_approach, "open_router decide_gateway call response");
"open_router decide_gateway call response: {:?}",
gateway_priority_map
);
routable_connectors.sort_by(|connector_choice_a, connector_choice_b| { routable_connectors.sort_by(|connector_choice_a, connector_choice_b| {
let connector_choice_a_score = gateway_priority_map let connector_choice_a_score = gateway_priority_map
.get(&connector_choice_a.to_string()) .get(&connector_choice_a.to_string())

View File

@ -23,6 +23,7 @@ message CalSuccessRateConfig {
uint32 min_aggregates_size = 1; uint32 min_aggregates_size = 1;
double default_success_rate = 2; double default_success_rate = 2;
optional SuccessRateSpecificityLevel specificity_level = 3; optional SuccessRateSpecificityLevel specificity_level = 3;
optional double exploration_percent = 4;
} }
enum SuccessRateSpecificityLevel { enum SuccessRateSpecificityLevel {
@ -32,6 +33,12 @@ enum SuccessRateSpecificityLevel {
message CalSuccessRateResponse { message CalSuccessRateResponse {
repeated LabelWithScore labels_with_score = 1; repeated LabelWithScore labels_with_score = 1;
RoutingApproach routing_approach = 2;
}
enum RoutingApproach {
EXPLORATION = 0;
EXPLOITATION = 1;
} }
message LabelWithScore { message LabelWithScore {