rho-coding-agent 1.3.0

A lightweight agent harness inspired by Pi
Documentation
use crate::{
    model::{models_dev, ModelError},
    reasoning::ReasoningLevel,
};

#[derive(Debug, PartialEq, Eq)]
pub(super) struct OpenAiReasoningConfig {
    pub(super) effort: Option<String>,
    pub(super) summary: Option<String>,
}

pub(super) fn normalize_openai_reasoning_level(
    requested: ReasoningLevel,
    supported: Option<&[ReasoningLevel]>,
) -> Option<ReasoningLevel> {
    let Some(supported) = supported else {
        return Some(requested);
    };
    if requested == ReasoningLevel::Off {
        return Some(requested.normalize(Some(supported)));
    }
    let supported = supported
        .iter()
        .copied()
        .filter(|level| *level != ReasoningLevel::Off)
        .collect::<Vec<_>>();
    (!supported.is_empty()).then(|| requested.normalize(Some(&supported)))
}

pub(super) fn openai_reasoning_config(
    provider: &'static str,
    model: &str,
    requested: ReasoningLevel,
) -> Result<OpenAiReasoningConfig, ModelError> {
    let supported = models_dev::cached_reasoning_levels(provider, model);
    let Some(normalized_level) = normalize_openai_reasoning_level(requested, supported.as_deref())
    else {
        return Err(ModelError::UnsupportedReasoning {
            provider,
            model: model.to_string(),
            requested,
        });
    };
    Ok(OpenAiReasoningConfig {
        effort: models_dev::cached_reasoning_effort(provider, model, normalized_level),
        summary: normalized_level.summary().map(str::to_string),
    })
}