Skip to main content

context_harness/agent_model/
fake.rs

1//! Deterministic model fixture. Each call consumes one scripted outcome.
2use super::*;
3use std::collections::VecDeque;
4use std::sync::Mutex;
5
6pub struct FakeModel {
7    outcomes: Mutex<VecDeque<ModelResult<ModelResponse>>>,
8}
9impl FakeModel {
10    pub fn new(outcomes: impl IntoIterator<Item = ModelResult<ModelResponse>>) -> Self {
11        Self {
12            outcomes: Mutex::new(outcomes.into_iter().collect()),
13        }
14    }
15}
16#[async_trait]
17impl ModelProvider for FakeModel {
18    async fn generate(&self, request: &ModelRequest) -> ModelResult<ModelResponse> {
19        request.validate()?;
20        let response = self
21            .outcomes
22            .lock()
23            .map_err(|_| ModelError::new(ModelErrorKind::ProviderFailure))?
24            .pop_front()
25            .ok_or_else(|| ModelError::new(ModelErrorKind::ScriptExhausted))??;
26        response.validate(request)?;
27        Ok(response)
28    }
29}