1use anyhow::Result;
2use mistralrs::{
3 IsqType, RequestBuilder, SearchResult, TextMessageRole, TextMessages, TextModelBuilder,
4 WebSearchOptions,
5};
6
7use std::fs;
8use std::sync::Arc;
9use walkdir::WalkDir;
10
11fn local_search(query: &str) -> Result<Vec<SearchResult>> {
15 let mut results = Vec::new();
16
17 for entry in WalkDir::new(".") {
18 let entry = entry?;
19 if entry.file_type().is_file() {
20 let name = entry.file_name().to_string_lossy();
21 if name.contains(query) {
22 let path = entry.path().display().to_string();
23 let content = fs::read_to_string(entry.path()).unwrap_or_default();
24
25 results.push(SearchResult {
26 title: name.into_owned(),
27 description: path.clone(),
28 url: path,
29 content,
30 });
31 }
32 }
33 }
34
35 results.sort_by_key(|r| r.title.clone());
37 results.reverse();
38 Ok(results)
39}
40
41#[tokio::main]
42async fn main() -> Result<()> {
43 let model = TextModelBuilder::new("NousResearch/Hermes-3-Llama-3.1-8B")
50 .with_isq(IsqType::Q4K)
51 .with_logging()
52 .with_search_callback(Arc::new(|params: &mistralrs::SearchFunctionParameters| {
53 local_search(¶ms.query)
56 }))
57 .build()
58 .await?;
59
60 let messages =
61 TextMessages::new().add_message(TextMessageRole::User, "Where is Cargo.toml in this repo?");
62
63 let messages =
66 RequestBuilder::from(messages).with_web_search_options(WebSearchOptions::default());
67
68 let response = model.send_chat_request(messages).await?;
69
70 println!("{}", response.choices[0].message.content.as_ref().unwrap());
71
72 Ok(())
73}