Skip to main content

control_query_direct_bypass_matrix/
control_query_direct_bypass_matrix.rs

1#[path = "support/utils.rs"]
2mod _utils;
3
4use _utils::{
5    boxed_error, cleanup_run, create_client, is_permission_denied_like, new_run_id, print_summary,
6    require, ScenarioConfig,
7};
8use mubit_sdk::{Client, TransportMode};
9use serde_json::{json, Value};
10use std::error::Error;
11use std::time::Instant;
12
13async fn run_lane(
14    client: &Client,
15    run_id: &str,
16    query: &str,
17    expect_enabled: bool,
18) -> Result<Value, Box<dyn Error>> {
19    let payload = client
20        .control
21        .query(json!({
22            "run_id": run_id,
23            "query": query,
24            "schema": "",
25            "mode": "direct_bypass",
26            "direct_lane": "semantic_search",
27            "include_linked_runs": false,
28            "limit": 5,
29            "embedding": [],
30        }))
31        .await;
32
33    match payload {
34        Ok(payload) => {
35            require(
36                expect_enabled,
37                format!("direct bypass semantic lane unexpectedly succeeded: {payload}"),
38            )?;
39            require(
40                payload.get("mode").and_then(Value::as_str) == Some("direct_bypass"),
41                format!("unexpected mode payload: {payload}"),
42            )?;
43
44            Ok(json!({
45                "enabled": true,
46                "status": "ok",
47                "mode": payload.get("mode").cloned().unwrap_or(Value::Null),
48                "final_answer": payload.get("final_answer").and_then(Value::as_str).unwrap_or_default(),
49            }))
50        }
51        Err(err) => {
52            if expect_enabled {
53                return Err(boxed_error(format!(
54                    "direct bypass semantic lane expected enabled but failed: {err}"
55                )));
56            }
57            let message = err.to_string();
58            require(
59                is_permission_denied_like(&message),
60                format!("direct bypass semantic lane should fail with permission denied: {message}"),
61            )?;
62            Ok(json!({
63                "enabled": false,
64                "status": "denied",
65                "message": message,
66            }))
67        }
68    }
69}
70
71#[tokio::main(flavor = "current_thread")]
72async fn main() -> Result<(), Box<dyn Error>> {
73    let name = "control_query_direct_bypass_matrix";
74    let started = Instant::now();
75    let config = ScenarioConfig::from_env();
76    let client = create_client().await?;
77    let run_id = new_run_id("control_query_direct_bypass");
78    client.set_run_id(Some(run_id.clone()));
79    client.set_transport(TransportMode::Http);
80
81    let mut passed = true;
82    let mut detail = "validated control query direct bypass semantic lane".to_string();
83    let mut metrics = json!({});
84
85    let scenario = async {
86        let semantic = run_lane(
87            &client,
88            &run_id,
89            "semantic direct bypass probe",
90            config.expect_direct_search_enabled,
91        )
92        .await?;
93
94        metrics = json!({
95            "run_id": run_id,
96            "expect_direct_search_enabled": config.expect_direct_search_enabled,
97            "semantic": semantic,
98        });
99
100        Ok::<(), Box<dyn Error>>(())
101    }
102    .await;
103
104    if let Err(err) = scenario {
105        passed = false;
106        detail = err.to_string();
107    }
108
109    let cleanup_ok = cleanup_run(&client, &run_id).await;
110    if !cleanup_ok {
111        passed = false;
112        detail = format!("{detail} | cleanup failures");
113    }
114
115    print_summary(
116        name,
117        passed,
118        &detail,
119        &metrics,
120        started.elapsed().as_secs_f64(),
121        cleanup_ok,
122    );
123
124    if passed { Ok(()) } else { Err(boxed_error(detail)) }
125}