40 lines
1.3 KiB
Rust
40 lines
1.3 KiB
Rust
//! Demonstrates passing an image to Chat Completions using a data URL.
|
|
//!
|
|
//! Set the `OPENAI_API_KEY` environment variable before running.
|
|
|
|
use anyhow::{Context as _, Result};
|
|
use base64::{Engine as _, engine::general_purpose};
|
|
use swiftide::chat_completion::{ChatCompletionRequest, ChatMessage, ChatMessageContentPart};
|
|
use swiftide::traits::ChatCompletion;
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<()> {
|
|
tracing_subscriber::fmt::init();
|
|
|
|
let openai = swiftide::integrations::openai::OpenAI::builder()
|
|
.default_prompt_model("gpt-4o-mini")
|
|
.build()?;
|
|
|
|
let image_path = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("../images/logo.png");
|
|
let image_bytes = std::fs::read(&image_path).with_context(|| format!("Read {image_path:?}"))?;
|
|
let encoded = general_purpose::STANDARD.encode(&image_bytes);
|
|
let data_url = format!("data:image/png;base64,{encoded}");
|
|
|
|
let message = ChatMessage::new_user_with_parts(vec![
|
|
ChatMessageContentPart::text("Describe this image in one sentence."),
|
|
ChatMessageContentPart::image(data_url),
|
|
]);
|
|
|
|
let request = ChatCompletionRequest::builder()
|
|
.messages(vec![message])
|
|
.build()?;
|
|
|
|
let response = openai.complete(&request).await?;
|
|
println!(
|
|
"Image description: {}",
|
|
response.message().unwrap_or("<no response>")
|
|
);
|
|
|
|
Ok(())
|
|
}
|