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)
}
}