Skip to main content

llama_vision_multiturn/
main.rs

1use anyhow::Result;
2use mistralrs::{RequestBuilder, TextMessageRole, VisionMessages, VisionModelBuilder};
3
4const MODEL_ID: &str = "meta-llama/Llama-3.2-11B-Vision-Instruct";
5
6#[tokio::main]
7async fn main() -> Result<()> {
8    let model = VisionModelBuilder::new(MODEL_ID)
9        .with_logging()
10        .with_isq(mistralrs::IsqType::Q8_0)
11        .build()
12        .await?;
13
14    let mut messages = VisionMessages::new().add_message(TextMessageRole::User, "Hello!");
15
16    let resp = model
17        .send_chat_request(RequestBuilder::from(messages.clone()).set_sampler_max_len(100))
18        .await?
19        .choices[0]
20        .message
21        .content
22        .clone()
23        .unwrap();
24    println!("\n\n{resp}");
25    messages = messages.add_message(TextMessageRole::Assistant, resp);
26
27    let bytes = match reqwest::blocking::get(
28        // "https://s3.amazonaws.com/cdn.tulips.com/images/large/Timeless-Tulip.jpg",
29        "https://niche-museums.imgix.net/pioneer-history.jpeg",
30    ) {
31        Ok(http_resp) => http_resp.bytes()?.to_vec(),
32        Err(e) => anyhow::bail!(e),
33    };
34    let image = image::load_from_memory(&bytes)?;
35
36    messages = messages.add_image_message(
37        TextMessageRole::User,
38        "What is depicted here? Please describe the scene in detail.",
39        vec![image],
40        &model,
41    )?;
42    let resp = model
43        .send_chat_request(RequestBuilder::from(messages.clone()).set_sampler_max_len(100))
44        .await?
45        .choices[0]
46        .message
47        .content
48        .clone()
49        .unwrap();
50    println!("\n\n{resp}");
51    messages = messages.add_message(TextMessageRole::Assistant, resp);
52
53    let bytes = match reqwest::blocking::get(
54            "https://www.nhmagazine.com/content/uploads/2019/05/mtwashingtonFranconia-2-19-18-108-Edit-Edit.jpg"
55        ) {
56            Ok(http_resp) => http_resp.bytes()?.to_vec(),
57            Err(e) => anyhow::bail!(e),
58        };
59    let image = image::load_from_memory(&bytes)?;
60
61    messages =
62        messages.add_image_message(TextMessageRole::User, "What is this?", vec![image], &model)?;
63    let resp = model
64        .send_chat_request(RequestBuilder::from(messages.clone()).set_sampler_max_len(100))
65        .await?
66        .choices[0]
67        .message
68        .content
69        .clone()
70        .unwrap();
71    println!("\n\n{resp}");
72    messages = messages.add_message(TextMessageRole::Assistant, resp);
73
74    let bytes =
75        match reqwest::blocking::get("https://cdn.britannica.com/79/4679-050-BC127236/Titanic.jpg")
76        {
77            Ok(http_resp) => http_resp.bytes()?.to_vec(),
78            Err(e) => anyhow::bail!(e),
79        };
80    let image = image::load_from_memory(&bytes)?;
81
82    messages =
83        messages.add_image_message(TextMessageRole::User, "What is this?", vec![image], &model)?;
84    let resp = model
85        .send_chat_request(RequestBuilder::from(messages.clone()).set_sampler_max_len(100))
86        .await?
87        .choices[0]
88        .message
89        .content
90        .clone()
91        .unwrap();
92    println!("\n\nModel response*: {resp}");
93    messages = messages.add_message(TextMessageRole::Assistant, resp);
94
95    println!("Final chat history: {messages:?}");
96
97    Ok(())
98}