1use anyhow::Result;
2use mistralrs::{IsqType, TextMessageRole, TextMessages, VisionModelBuilder};
3use std::fs;
4use std::fs::OpenOptions;
5use tracing::info;
6use tracing::level_filters::LevelFilter;
7use tracing_subscriber::EnvFilter;
8
9const LOG_FILE: &str = "custom_logging.log";
10
11fn init_logging(log_file: &str) {
12 let _ = fs::remove_file(log_file);
13 let path = log_file.to_owned();
14 let writer = move || {
15 OpenOptions::new()
16 .create(true)
17 .append(true)
18 .open(&path)
19 .expect("failed to open log file")
20 };
21
22 let filter = EnvFilter::builder()
23 .with_default_directive(LevelFilter::INFO.into())
24 .from_env_lossy()
25 .add_directive("mistralrs_core=debug".parse().unwrap());
26
27 tracing_subscriber::fmt()
28 .with_env_filter(filter)
29 .with_target(false)
30 .with_writer(writer)
31 .try_init()
32 .expect("subscriber installed only once");
33}
34
35#[tokio::main]
36async fn main() -> Result<()> {
37 init_logging(LOG_FILE);
38 info!("Custom subscriber installed; writing logs to {LOG_FILE}");
39
40 let model = VisionModelBuilder::new("google/gemma-3-4b-it")
41 .with_isq(IsqType::Q4K)
42 .build()
44 .await?;
45
46 let messages = TextMessages::new()
47 .add_message(
48 TextMessageRole::System,
49 "You describe locations succinctly.",
50 )
51 .add_message(
52 TextMessageRole::User,
53 "Give me two sentences about the Mount Washington summit weather.",
54 );
55
56 let response = model.send_chat_request(messages).await?;
57 let answer = response.choices[0].message.content.as_ref().unwrap();
58 println!("Model response:\n{answer}");
59
60 info!("Completed inference run.");
61
62 let captured_logs = fs::read_to_string(LOG_FILE)?;
63 println!("\n--- Captured mistral.rs logs ---\n{captured_logs}");
64
65 Ok(())
66}