Skip to main content

synaptic_models/
scripted.rs

1use std::{collections::VecDeque, sync::Arc};
2
3use async_trait::async_trait;
4use synaptic_core::{ChatModel, ChatRequest, ChatResponse, SynapseError};
5use tokio::sync::Mutex;
6
7#[derive(Clone)]
8pub struct ScriptedChatModel {
9    responses: Arc<Mutex<VecDeque<ChatResponse>>>,
10}
11
12impl ScriptedChatModel {
13    pub fn new(responses: Vec<ChatResponse>) -> Self {
14        Self {
15            responses: Arc::new(Mutex::new(VecDeque::from(responses))),
16        }
17    }
18}
19
20#[async_trait]
21impl ChatModel for ScriptedChatModel {
22    async fn chat(&self, _request: ChatRequest) -> Result<ChatResponse, SynapseError> {
23        let mut responses = self.responses.lock().await;
24        responses
25            .pop_front()
26            .ok_or_else(|| SynapseError::Model("scripted model exhausted responses".to_string()))
27    }
28}