codex-helper-core 0.15.0

Core library for codex-helper.
Documentation
use crate::lb::{CooldownBackoff, LoadBalancer};
use crate::logging::now_ms;
use crate::state::ProxyState;

use super::attempt_target::AttemptTarget;

pub(super) async fn record_attempt_success(
    state: &ProxyState,
    service_name: &str,
    lb: Option<&LoadBalancer>,
    target: &AttemptTarget,
    failure_threshold_cooldown_secs: u64,
    cooldown_backoff: CooldownBackoff,
) {
    match target {
        AttemptTarget::Legacy(selected) => {
            if let Some(lb) = lb {
                lb.record_result_with_backoff(
                    selected.index,
                    true,
                    failure_threshold_cooldown_secs,
                    cooldown_backoff,
                );
            }
        }
        AttemptTarget::ProviderEndpoint(provider_target) => {
            state
                .record_provider_endpoint_attempt_success(
                    service_name,
                    provider_target.provider_endpoint.clone(),
                    now_ms(),
                )
                .await;
        }
    }
}

pub(super) async fn record_attempt_failure(
    state: &ProxyState,
    service_name: &str,
    lb: Option<&LoadBalancer>,
    target: &AttemptTarget,
    failure_threshold_cooldown_secs: u64,
    cooldown_backoff: CooldownBackoff,
) {
    match target {
        AttemptTarget::Legacy(selected) => {
            if let Some(lb) = lb {
                lb.record_result_with_backoff(
                    selected.index,
                    false,
                    failure_threshold_cooldown_secs,
                    cooldown_backoff,
                );
            }
        }
        AttemptTarget::ProviderEndpoint(provider_target) => {
            state
                .record_provider_endpoint_attempt_failure(
                    service_name,
                    provider_target.provider_endpoint.clone(),
                    failure_threshold_cooldown_secs,
                    cooldown_backoff,
                )
                .await;
        }
    }
}

pub(super) async fn penalize_attempt_target(
    state: &ProxyState,
    service_name: &str,
    lb: Option<&LoadBalancer>,
    target: &AttemptTarget,
    cooldown_secs: u64,
    reason: &str,
    cooldown_backoff: CooldownBackoff,
) {
    match target {
        AttemptTarget::Legacy(selected) => {
            if let Some(lb) = lb {
                lb.penalize_with_backoff(selected.index, cooldown_secs, reason, cooldown_backoff);
            }
        }
        AttemptTarget::ProviderEndpoint(provider_target) => {
            state
                .penalize_provider_endpoint_attempt(
                    service_name,
                    provider_target.provider_endpoint.clone(),
                    cooldown_secs,
                    cooldown_backoff,
                )
                .await;
        }
    }
}