Skip to main content

agent_trace/runtime/
synthesis_gate.rs

1use crate::llm::{Llm, ResolvedBackendInfo};
2use anyhow::Result;
3use std::path::Path;
4
5/// Test-only escape hatch — never documented for end users.
6/// In-process unit tests (`cfg(test)`) also allow degraded mode.
7pub fn allow_degraded_mode() -> bool {
8    if cfg!(test) {
9        return true;
10    }
11    std::env::var("AGENT_TRACE_ALLOW_DEGRADED").as_deref() == Ok("1")
12}
13
14/// Fail fast when no reachable synthesis backend is configured.
15/// Delegates to `Llm::require_backend`.
16pub fn require_synthesis_backend(store_root: Option<&Path>) -> Result<ResolvedBackendInfo> {
17    Llm::require_backend(store_root)
18}
19
20/// Used by trace pipeline paths that must not silently emit degraded artifacts.
21pub fn ensure_synthesis_available(info: &ResolvedBackendInfo) -> Result<()> {
22    if info.degraded && !allow_degraded_mode() {
23        anyhow::bail!("Synthesis backend unavailable. Run: agent-trace model ensure");
24    }
25    Ok(())
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31    use crate::config::SynthesisProvider;
32
33    #[test]
34    fn allow_degraded_in_unit_test_builds() {
35        assert!(allow_degraded_mode());
36    }
37
38    #[test]
39    fn ensure_synthesis_available_ok_when_not_degraded() {
40        let info = ResolvedBackendInfo {
41            label: "ollama/qwen2.5".into(),
42            provider: SynthesisProvider::Ollama,
43            model: "qwen2.5".into(),
44            degraded: false,
45        };
46        assert!(ensure_synthesis_available(&info).is_ok());
47    }
48
49    #[test]
50    fn ensure_synthesis_available_ok_when_degraded_but_allowed() {
51        let info = ResolvedBackendInfo {
52            label: "degraded".into(),
53            provider: SynthesisProvider::Ollama,
54            model: "mechanical".into(),
55            degraded: true,
56        };
57        assert!(allow_degraded_mode());
58        assert!(ensure_synthesis_available(&info).is_ok());
59    }
60}