assay_core/providers/
strict.rs

1use crate::model::LlmResponse;
2use crate::providers::embedder::Embedder;
3use crate::providers::llm::LlmClient;
4use async_trait::async_trait;
5use std::sync::Arc;
6
7// Strict LlmClient
8pub struct StrictLlmClient {
9    inner: Arc<dyn LlmClient>,
10}
11
12impl StrictLlmClient {
13    pub fn new(inner: Arc<dyn LlmClient>) -> Self {
14        Self { inner }
15    }
16}
17
18#[async_trait]
19impl LlmClient for StrictLlmClient {
20    async fn complete(
21        &self,
22        _prompt: &str,
23        _context: Option<&[String]>,
24    ) -> anyhow::Result<LlmResponse> {
25        anyhow::bail!("config error: --replay-strict forbids live LLM calls. Provide --trace-file or precomputed trace entries.");
26    }
27
28    fn provider_name(&self) -> &'static str {
29        self.inner.provider_name()
30    }
31}
32
33// Strict Embedder
34pub struct StrictEmbedder {
35    inner: Arc<dyn Embedder>,
36}
37
38impl StrictEmbedder {
39    pub fn new(inner: Arc<dyn Embedder>) -> Self {
40        Self { inner }
41    }
42}
43
44#[async_trait]
45impl Embedder for StrictEmbedder {
46    async fn embed(&self, _text: &str) -> anyhow::Result<Vec<f32>> {
47        anyhow::bail!("config error: --replay-strict forbids live Embedder calls. Ensure precomputed embeddings are present in trace.");
48    }
49
50    fn name(&self) -> &'static str {
51        self.inner.name()
52    }
53
54    fn model_id(&self) -> String {
55        self.inner.model_id()
56    }
57}