rho-coding-agent 1.18.2

A lightweight agent harness inspired by Pi
Documentation
use std::sync::Arc;

use rho_sdk::{
    model::handoff::HandoffReport, provider::ModelProvider, Error, ReasoningLevel, Session,
};

pub(crate) struct ProviderController {
    provider: Arc<dyn ModelProvider>,
    reasoning: ReasoningLevel,
}

impl ProviderController {
    pub(crate) fn new(provider: Arc<dyn ModelProvider>, reasoning: ReasoningLevel) -> Self {
        Self {
            provider,
            reasoning,
        }
    }

    pub(crate) fn provider(&self) -> &Arc<dyn ModelProvider> {
        &self.provider
    }

    pub(crate) fn reasoning(&self) -> ReasoningLevel {
        self.reasoning
    }

    pub(crate) fn replace(
        &mut self,
        session: &Session,
        provider: Arc<dyn ModelProvider>,
        reasoning: ReasoningLevel,
    ) -> Result<HandoffReport, Error> {
        session.set_reasoning_level(reasoning)?;
        let report = match session.replace_provider(Arc::clone(&provider)) {
            Ok(report) => report,
            Err(error) => {
                let _ = session.set_reasoning_level(self.reasoning);
                return Err(error);
            }
        };
        self.provider = provider;
        self.reasoning = reasoning;
        Ok(report)
    }
}