llama_vision_multiturn/
main.rs1use 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://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}