use tokio_util::sync::CancellationToken;
use super::gemini::GeminiVideo;
use super::{VideoConfig, VideoRequest, VideoUnderstanding, resolve_config};
use crate::shared::config::VideoSettings;
fn client_for(var: &str) -> Option<(String, GeminiVideo)> {
let Ok(key) = std::env::var("MINDFORK_GEMINI_KEY") else {
eprintln!("skip: MINDFORK_GEMINI_KEY not set");
return None;
};
let Ok(model) = std::env::var(var) else {
eprintln!("skip: {var} not set");
return None;
};
let cfg = resolve_config(&VideoSettings::default(), Some(key), false)
.expect("a key and the default settings are enough to configure the slot");
let client = GeminiVideo::new(VideoConfig {
model: model.clone(),
..cfg
});
Some((model, client))
}
fn ten_seconds() -> VideoRequest {
VideoRequest {
url: "https://www.youtube.com/watch?v=dQw4w9WgXcQ".into(),
prompt: "In one sentence: what is shown on screen?".into(),
start_secs: Some(0),
end_secs: Some(10),
max_output_tokens: 300,
}
}
#[tokio::test]
#[ignore = "requires MINDFORK_GEMINI_KEY + MINDFORK_LIVE_NO_MINIMAL_LEVEL_MODEL (a Gemini 3.x model, not a Pro, that refuses thinkingLevel \"minimal\")"]
async fn a_video_is_described_by_a_model_without_the_minimal_level() {
let Some((model, client)) = client_for("MINDFORK_LIVE_NO_MINIMAL_LEVEL_MODEL") else {
return;
};
for nth in 1..=2 {
let answer = client
.describe(ten_seconds(), &CancellationToken::new())
.await
.expect("a video request must not be refused for its thinking level");
println!("{model} request {nth}: {}", answer.text.trim());
assert!(
!answer.text.trim().is_empty(),
"{model}: an empty description"
);
}
let learned = client.learned_level();
println!("{model}: asked instead of \"minimal\": {learned:?}");
assert!(
learned.is_some(),
"{model} was declared to refuse \"minimal\", yet nothing was refused — the recovery did not run"
);
}
#[tokio::test]
#[ignore = "requires MINDFORK_GEMINI_KEY + MINDFORK_LIVE_MINIMAL_LEVEL_MODEL (a Gemini 3.x model that takes thinkingLevel \"minimal\")"]
async fn a_video_on_a_model_with_the_minimal_level_is_asked_as_before() {
let Some((model, client)) = client_for("MINDFORK_LIVE_MINIMAL_LEVEL_MODEL") else {
return;
};
let answer = client
.describe(ten_seconds(), &CancellationToken::new())
.await
.expect("the video request is accepted");
println!("{model}: {}", answer.text.trim());
assert!(
!answer.text.trim().is_empty(),
"{model}: an empty description"
);
assert_eq!(
client.learned_level(),
None,
"{model} was declared to take \"minimal\": nothing should have been learned"
);
}