synaptic_models/
scripted.rs1use 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}