agent_trace/runtime/
synthesis_gate.rs1use crate::llm::{Llm, ResolvedBackendInfo};
2use anyhow::Result;
3use std::path::Path;
4
5pub 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
14pub fn require_synthesis_backend(store_root: Option<&Path>) -> Result<ResolvedBackendInfo> {
17 Llm::require_backend(store_root)
18}
19
20pub 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}