- 1
#![allow(clippy::unwrap_used, clippy::expect_used)] - 2
- 3
use vak_llm::openai::{OpenAiConfig, build_body}; - 4
use vak_llm::types::ChatRequest; - 5
use vak_llm::types::{ContentBlock, ImageSource, Message, Role}; - 6
- 7
#[test] - 8
fn image_block_serializes_to_anthropic_native_shape() { - 9
let msg = Message { - 10
role: Role::User, - 11
content: vec![ - 12
ContentBlock::text("what is this?"), - 13
ContentBlock::image_base64("image/png", "QUJD"), - 14
], - 15
}; - 16
let v = serde_json::to_value(&msg).unwrap(); - 17
assert_eq!(v["content"][0]["type"], "text"); - 18
assert_eq!(v["content"][1]["type"], "image"); - 19
// Anthropic expects the source nested object verbatim. - 20
assert_eq!(v["content"][1]["source"]["type"], "base64"); - 21
assert_eq!(v["content"][1]["source"]["media_type"], "image/png"); - 22
assert_eq!(v["content"][1]["source"]["data"], "QUJD"); - 23
- 24
// Roundtrip through the ledger format. - 25
let back: Message = serde_json::from_value(v).unwrap(); - 26
assert_eq!(back, msg); - 27
} - 28
- 29
#[test] - 30
fn openai_body_builds_multimodal_parts_from_images() { - 31
let req = ChatRequest { - 32
messages: vec![Message { - 33
role: Role::User, - 34
content: vec![ - 35
ContentBlock::text("describe"), - 36
ContentBlock::image_base64("image/jpeg", "Zm9v"), - 37
], - 38
}], - 39
..ChatRequest::new("test-model") - 40
}; - 41
let body = build_body(&OpenAiConfig::default(), &req).unwrap(); - 42
let content = body["messages"][0]["content"].as_array().unwrap(); - 43
assert_eq!(content[0]["type"], "text"); - 44
assert_eq!(content[1]["type"], "image_url"); - 45
assert_eq!( - 46
content[1]["image_url"]["url"], - 47
"data:image/jpeg;base64,Zm9v" - 48
); - 49
} - 50
- 51
#[test] - 52
fn openai_text_only_stays_a_plain_string() { - 53
let req = ChatRequest { - 54
messages: vec![Message::user_text("plain")], - 55
..ChatRequest::new("test-model") - 56
}; - 57
let body = build_body(&OpenAiConfig::default(), &req).unwrap(); - 58
assert_eq!(body["messages"][0]["content"], "plain"); - 59
} - 60
- 61
#[test] - 62
fn image_in_assistant_message_rejected_for_anthropic() { - 63
let req = ChatRequest { - 64
messages: vec![Message { - 65
role: Role::Assistant, - 66
content: vec![ContentBlock::Image { - 67
source: ImageSource { - 68
r#type: "base64".into(), - 69
media_type: "image/png".into(), - 70
data: "x".into(), - 71
}, - 72
}], - 73
}], - 74
..ChatRequest::new("test-model") - 75
}; - 76
assert!(vak_llm::anthropic::build_body(&req, true, false).is_err()); - 77
} - 78
Indexing the workspace…
Vakyartha documentation is discovering safe artifacts, anchors, and source references.