use pixforge::providers::openai_compat::{AuthStyle, OpenaiCompatProvider};
use pixforge::providers::{ImageProvider, Request, Size};
#[test]
#[ignore = "requires a running LocalAI server; see file docs"]
fn localai_generates_a_real_image() {
let Some(url) = std::env::var("PIXFORGE_LOCALAI_URL").ok() else {
eprintln!(
"PIXFORGE_LOCALAI_URL not set; skipping. \
See tests/localai_integration.rs for setup."
);
return;
};
let model = std::env::var("PIXFORGE_LOCALAI_MODEL")
.unwrap_or_else(|_| "stable-diffusion-1.5".to_string());
let p = OpenaiCompatProvider {
endpoint: url,
api_key: None,
auth_style: AuthStyle::None,
timeout_secs: 240,
max_attempts: 1,
};
let extra = serde_json::Map::new();
let req = Request {
prompt: "a tiny pixel-art forest, low detail",
model: &model,
n: 1,
size: Some(Size {
width: 256,
height: 256,
}),
size_explicit: true,
seed: None,
negative_prompt: None,
quality: None,
extra: &extra,
};
let mut on_retry = |a: u32, m: &str, w: f64| {
eprintln!("retry attempt {a}: {m} (sleep {w:.1}s)");
};
let result = p
.generate(&req, &mut on_retry)
.expect("LocalAI generation failed; is the model installed?");
assert!(!result.images.is_empty(), "no images returned");
let img = &result.images[0];
assert!(
!img.bytes.is_empty(),
"image bytes are empty (got mime={})",
img.mime_type
);
let header = &img.bytes[..img.bytes.len().min(8)];
assert!(
header.starts_with(b"\x89PNG") || header.starts_with(b"\xff\xd8"),
"image bytes don't look like PNG or JPEG; got header {:?}",
header
);
eprintln!(
"LocalAI generated {} bytes ({}) in {:.1}s",
img.bytes.len(),
img.mime_type,
result.latency_secs
);
}