use std::time::Duration;
use crate::engine::retry::LlmRetryPolicy;
use crate::registry::ResolvedAgent;
use awaken_runtime_contract::contract::executor::{
InferenceExecutionError, InferenceRequest, InterruptCause,
};
pub(super) fn stream_retry_policy_for(_agent: &ResolvedAgent) -> LlmRetryPolicy {
LlmRetryPolicy::default()
}
pub(super) fn idle_timeout_for(request: &InferenceRequest, policy: &LlmRetryPolicy) -> Duration {
let base = Duration::from_secs(policy.stream_idle_timeout_secs);
let model = request.upstream_model.as_str();
let name_hits = model.contains("thinking")
|| model.contains("reasoning")
|| model.starts_with("o1")
|| model.starts_with("o3")
|| model.starts_with("o4");
let options_hits = request
.overrides
.as_ref()
.and_then(|o| o.reasoning_effort.as_ref())
.is_some();
if name_hits || options_hits {
base * 2
} else {
base
}
}
pub(super) fn stream_retry_backoff(
cause: &InterruptCause,
attempt: u32,
policy: &LlmRetryPolicy,
) -> Duration {
match cause {
InterruptCause::IdleStall => Duration::from_millis(200),
_ => policy.delay_before_retry(
&InferenceExecutionError::Provider("mid-stream".into()),
attempt,
),
}
}