car-server-core 0.55.0

Transport-neutral library for the CAR daemon JSON-RPC dispatcher (used by car-server and tokhn-daemon)
Documentation
//! Keep a conversation's explicit model choice across replies and planning.
use super::native_loop::{AssistantGenerateError, TurnGenerator};
use async_trait::async_trait;
use car_inference::{GenerateRequest, InferenceResult, InferenceRetryProgress};
use std::sync::Arc;

pub(super) struct DiscussionModel {
    pub inner: Arc<dyn TurnGenerator>,
    pub model: String,
}

impl DiscussionModel {
    fn select(&self, mut req: GenerateRequest) -> GenerateRequest {
        req.model = Some(self.model.clone());
        req.params.strict_model = true;
        req
    }
}

#[async_trait]
impl TurnGenerator for DiscussionModel {
    async fn generate(&self, req: GenerateRequest) -> Result<InferenceResult, String> {
        self.inner.generate(self.select(req)).await
    }
    async fn generate_assistant(
        &self,
        req: GenerateRequest,
    ) -> Result<InferenceResult, AssistantGenerateError> {
        self.inner.generate_assistant(self.select(req)).await
    }
    async fn generate_assistant_observed(
        &self,
        req: GenerateRequest,
        observer: &mut (dyn FnMut(InferenceRetryProgress) + Send),
    ) -> Result<InferenceResult, AssistantGenerateError> {
        self.inner
            .generate_assistant_observed(self.select(req), observer)
            .await
    }
    fn context_window(&self, _: &str) -> usize {
        self.inner.context_window(&self.model)
    }
}