assay_core/providers/
strict.rs1use crate::model::LlmResponse;
2use crate::providers::embedder::Embedder;
3use crate::providers::llm::LlmClient;
4use async_trait::async_trait;
5use std::sync::Arc;
6
7pub 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
33pub 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}