NeroReflex

agent/mod.rs

Oct 28th, 2025
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 3.33 KB | None | 0 0
  1. use std::str::FromStr;
  2.  
  3. use ollama_rs::{
  4.     Ollama,
  5.     coordinator::Coordinator,
  6.     generation::{
  7.         chat::ChatMessage,
  8.         //tools::implementations::{Calculator, DDGSearcher, Scraper},
  9.     },
  10.     models::ModelOptions,
  11. };
  12. use reqwest::Url;
  13.  
  14. use crate::agents::config::Config;
  15.  
  16. pub mod fenrir;
  17. pub mod freya;
  18. pub mod loki;
  19. pub mod odin;
  20. pub mod thor;
  21. pub mod tyr;
  22.  
  23. pub mod config;
  24. pub mod scheduler;
  25.  
  26. const AGENT_DISCLAIMER: &str = "* messages from and to you are encapsulated by a program:
  27.        DO NOT include subjects, to or from fields in yout answer!";
  28.  
  29. pub struct Agent {
  30.     name: String,
  31.     subject: String,
  32.     sys_prompt: String,
  33.     coordinator: ollama_rs::coordinator::Coordinator<Vec<ChatMessage>>,
  34.     sent_messages: u64,
  35. }
  36.  
  37. impl Agent {
  38.     pub fn new(
  39.         name: String,
  40.         subject: String,
  41.         config: &Config,
  42.     ) -> Result<Self, crate::error::BalubaitecError> {
  43.         let ollama = match config.host(&name) {
  44.             Some(url) => Ollama::from_url(Url::from_str(url.as_str()).unwrap()),
  45.             None => Ollama::default(),
  46.         };
  47.  
  48.         let model = config.model(&name)?;
  49.         let tools = config.tools(&name)?;
  50.  
  51.         let history = vec![];
  52.  
  53.         let model_options = ModelOptions::default().num_ctx(config.ctx_window(&name));
  54.         let mut coordinator = Coordinator::new(ollama, model, history)
  55.             .options(model_options)
  56.             .add_tool(crate::tools::internal::request_send)
  57.             .add_tool(crate::tools::internal::reply_check);
  58.  
  59.         for tool in tools.into_iter() {
  60.             coordinator = match tool.trim().to_lowercase().as_str() {
  61.                 "time" => coordinator.add_tool(crate::tools::general::get_time),
  62.                 "weather" => coordinator.add_tool(crate::tools::general::get_weather),
  63.                 "bash" => coordinator.add_tool(crate::tools::development::shell_command),
  64.                 "read_file" => coordinator.add_tool(crate::tools::development::read_file),
  65.                 "dir" => coordinator.add_tool(crate::tools::development::list_directory_content),
  66.                 _ => return Err(crate::error::BalubaitecError::ToolNotAvailableError(tool)),
  67.             };
  68.         }
  69.  
  70.         let sent_messages = 0;
  71.  
  72.         let sys_prompt = config.system_prompt_self(&name)?;
  73.  
  74.         Ok(Self {
  75.             name,
  76.             subject,
  77.             sys_prompt,
  78.             coordinator,
  79.             sent_messages,
  80.         })
  81.     }
  82.  
  83.     pub async fn chat(&mut self, from: String, message: String) -> String {
  84.         let name = self.name.clone();
  85.         let subject = self.subject.clone();
  86.  
  87.         let msg = format!(
  88.             "
  89. From: {from}\n
  90. Subject: {subject}\n
  91. \n
  92. {message}
  93. "
  94.         );
  95.  
  96.         let mut messages = vec![ChatMessage::user(msg)];
  97.         if self.sent_messages == 0 {
  98.             messages.push(ChatMessage::system(self.sys_prompt.clone()));
  99.         }
  100.  
  101.         match self.coordinator.chat(messages).await {
  102.             Ok(resp) => {
  103.                 println!("Execution of agent {name} has ended successfully.");
  104.                 resp.message.content
  105.             }
  106.             Err(err) => {
  107.                 eprintln!("Ollama error on agent {name}: {err}");
  108.                 format!("There was an error contacting the agent {name}: {err}")
  109.             }
  110.         }
  111.     }
  112. }
  113.  
Advertisement
Add Comment
Please, Sign In to add comment