prodex 0.53.0

OpenAI profile pooling and safe auto-rotate for Codex CLI and Claude Code
Documentation
use super::*;

#[derive(Clone, Copy)]
pub(crate) struct RuntimePreviousResponseLogContext<'a> {
    pub(crate) request_id: u64,
    pub(crate) transport: &'a str,
    pub(crate) route: &'a str,
    pub(crate) websocket_session: Option<u64>,
    pub(crate) via: Option<&'a str>,
}

fn runtime_previous_response_log_suffix(context: RuntimePreviousResponseLogContext<'_>) -> String {
    context
        .via
        .map(|via| format!(" via={via}"))
        .unwrap_or_default()
}

fn runtime_previous_response_not_found_prefix(
    context: RuntimePreviousResponseLogContext<'_>,
) -> String {
    match context.websocket_session {
        Some(session_id) => format!(
            "request={} transport={} route={} websocket_session={session_id}",
            context.request_id, context.transport, context.route
        ),
        None => format!(
            "request={} transport={} route={}",
            context.request_id, context.transport, context.route
        ),
    }
}

fn runtime_previous_response_event_prefix(
    context: RuntimePreviousResponseLogContext<'_>,
) -> String {
    match context.websocket_session {
        Some(session_id) => format!(
            "request={} websocket_session={session_id}",
            context.request_id
        ),
        None => format!(
            "request={} transport={}",
            context.request_id, context.transport
        ),
    }
}

pub(crate) fn runtime_previous_response_not_found_log_message(
    context: RuntimePreviousResponseLogContext<'_>,
    profile_name: &str,
    retry_index: usize,
    turn_state: Option<&str>,
) -> String {
    format!(
        "{} previous_response_not_found profile={profile_name} retry_index={retry_index} replay_turn_state={turn_state:?}{}",
        runtime_previous_response_not_found_prefix(context),
        runtime_previous_response_log_suffix(context),
    )
}

pub(crate) fn runtime_previous_response_retry_immediate_log_message(
    context: RuntimePreviousResponseLogContext<'_>,
    profile_name: &str,
    delay_ms: u128,
    reason: &str,
) -> String {
    format!(
        "{} previous_response_retry_immediate profile={profile_name} delay_ms={delay_ms} reason={reason}{}",
        runtime_previous_response_event_prefix(context),
        runtime_previous_response_log_suffix(context),
    )
}

pub(crate) fn runtime_previous_response_stale_continuation_log_message(
    context: RuntimePreviousResponseLogContext<'_>,
    profile_name: &str,
) -> String {
    format!(
        "{} stale_continuation reason=previous_response_not_found_locked_affinity profile={profile_name}{}",
        runtime_previous_response_event_prefix(context),
        runtime_previous_response_log_suffix(context),
    )
}

pub(crate) fn runtime_proxy_log_previous_response_stale_continuation(
    shared: &RuntimeRotationProxyShared,
    context: RuntimePreviousResponseLogContext<'_>,
    profile_name: &str,
) {
    runtime_proxy_record_continuity_failure_reason(
        shared,
        "stale_continuation",
        "previous_response_not_found_locked_affinity",
    );
    runtime_proxy_log(
        shared,
        runtime_previous_response_stale_continuation_log_message(context, profile_name),
    );
}

pub(crate) fn runtime_previous_response_not_found_fresh_fallback_log_message(
    context: RuntimePreviousResponseLogContext<'_>,
    decision: crate::runtime_proxy::RuntimePreviousResponseNotFoundDecision,
    fresh_fallback_shape: Option<crate::runtime_proxy::RuntimePreviousResponseFreshFallbackShape>,
    profile_name: &str,
    blocked: bool,
) -> String {
    let outcome = crate::runtime_proxy::runtime_previous_response_not_found_observability_outcome(
        decision,
        fresh_fallback_shape,
    )
    .unwrap_or("-");
    let event = if blocked {
        "previous_response_fresh_fallback_blocked"
    } else {
        "previous_response_fresh_fallback"
    };
    format!(
        "{} {event} reason=previous_response_not_found request_shape={} outcome={outcome} profile={profile_name}{}",
        runtime_previous_response_event_prefix(context),
        crate::runtime_proxy::runtime_previous_response_fresh_fallback_shape_label(
            fresh_fallback_shape,
        ),
        runtime_previous_response_log_suffix(context),
    )
}

pub(crate) fn runtime_previous_response_affinity_released_log_message(
    context: RuntimePreviousResponseLogContext<'_>,
    profile_name: &str,
) -> String {
    format!(
        "{} previous_response_affinity_released profile={profile_name}{}",
        runtime_previous_response_event_prefix(context),
        runtime_previous_response_log_suffix(context),
    )
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn websocket_previous_response_logs_keep_existing_fields() {
        let context = RuntimePreviousResponseLogContext {
            request_id: 17,
            transport: "websocket",
            route: "websocket",
            websocket_session: Some(23),
            via: Some("direct_current_profile_fallback"),
        };

        assert_eq!(
            runtime_previous_response_not_found_log_message(
                context,
                "alpha",
                2,
                Some("turn-state"),
            ),
            "request=17 transport=websocket route=websocket websocket_session=23 previous_response_not_found profile=alpha retry_index=2 replay_turn_state=Some(\"turn-state\") via=direct_current_profile_fallback"
        );
        assert_eq!(
            runtime_previous_response_retry_immediate_log_message(
                context,
                "alpha",
                250,
                "non_blocking_retry",
            ),
            "request=17 websocket_session=23 previous_response_retry_immediate profile=alpha delay_ms=250 reason=non_blocking_retry via=direct_current_profile_fallback"
        );
        assert_eq!(
            runtime_previous_response_stale_continuation_log_message(context, "alpha"),
            "request=17 websocket_session=23 stale_continuation reason=previous_response_not_found_locked_affinity profile=alpha via=direct_current_profile_fallback"
        );
        assert_eq!(
            runtime_previous_response_affinity_released_log_message(context, "alpha"),
            "request=17 websocket_session=23 previous_response_affinity_released profile=alpha via=direct_current_profile_fallback"
        );
    }

    #[test]
    fn http_previous_response_logs_keep_existing_fields() {
        let context = RuntimePreviousResponseLogContext {
            request_id: 41,
            transport: "http",
            route: "responses",
            websocket_session: None,
            via: None,
        };

        assert_eq!(
            runtime_previous_response_not_found_log_message(context, "beta", 1, None),
            "request=41 transport=http route=responses previous_response_not_found profile=beta retry_index=1 replay_turn_state=None"
        );
        assert_eq!(
            runtime_previous_response_retry_immediate_log_message(context, "beta", 500, "-",),
            "request=41 transport=http previous_response_retry_immediate profile=beta delay_ms=500 reason=-"
        );
        assert_eq!(
            runtime_previous_response_affinity_released_log_message(context, "beta"),
            "request=41 transport=http previous_response_affinity_released profile=beta"
        );
        assert_eq!(
            runtime_previous_response_not_found_fresh_fallback_log_message(
                context,
                crate::runtime_proxy::RuntimePreviousResponseNotFoundDecision {
                    retry_delay: None,
                    retry_reason: None,
                    chain_retry_reason: None,
                    request_requires_locked_previous_response_affinity: false,
                    stale_continuation: false,
                    fresh_fallback_allowed: false,
                    fresh_fallback_blocked_without_affinity: true,
                },
                Some(
                    crate::runtime_proxy::RuntimePreviousResponseFreshFallbackShape::ContextDependentContinuation
                ),
                "beta",
                true,
            ),
            "request=41 transport=http previous_response_fresh_fallback_blocked reason=previous_response_not_found request_shape=continuation_only outcome=blocked_nonreplayable_without_affinity profile=beta"
        );
    }
}