pub mod builder;
pub mod history;
pub mod prompt;
use self::history::ChatHistory;
use crate::config::AgentConfig;
use crate::llm::LLMEngine;
use crate::types::{DynTool, Message, StreamFormatter, ToolCallParser, ToolDefinition};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::sync::Arc;
#[cfg(not(target_arch = "wasm32"))]
pub type EvictionHandler = Arc<dyn Fn(&AgentState, Vec<Arc<Message>>) + Send + Sync>;
#[cfg(target_arch = "wasm32")]
pub type EvictionHandler = Arc<dyn Fn(&AgentState, Vec<Arc<Message>>)>;
#[cfg(not(target_arch = "wasm32"))]
pub type FormatterFactory = Arc<dyn Fn() -> Box<dyn StreamFormatter + Send + Sync> + Send + Sync>;
#[cfg(target_arch = "wasm32")]
pub type FormatterFactory = Arc<dyn Fn() -> Box<dyn StreamFormatter>>;
#[cfg(not(target_arch = "wasm32"))]
pub(crate) type DynToolObj = dyn DynTool + Send + Sync;
#[cfg(target_arch = "wasm32")]
pub(crate) type DynToolObj = dyn DynTool;
#[cfg(not(target_arch = "wasm32"))]
pub(crate) type ToolCallParserObj = dyn ToolCallParser + Send + Sync;
#[cfg(target_arch = "wasm32")]
pub(crate) type ToolCallParserObj = dyn ToolCallParser;
#[cfg(not(target_arch = "wasm32"))]
pub(crate) type ExtensionsMap = anymap2::SendSyncAnyMap;
#[cfg(target_arch = "wasm32")]
pub(crate) type ExtensionsMap = anymap2::AnyMap;
#[derive(Serialize, Deserialize, Default)]
pub struct AgentState {
pub session_id: String,
pub dynamic_context: String,
pub chat_history: ChatHistory,
#[serde(skip)]
extensions: ExtensionsMap,
}
#[derive(Clone)]
pub struct Agent {
pub(crate) llm_engine: Arc<LLMEngine>,
pub(crate) config: Arc<AgentConfig>,
pub(crate) tools_def: Arc<Vec<ToolDefinition>>,
pub(crate) tool_map: Arc<HashMap<String, Arc<DynToolObj>>>,
pub(crate) tool_parser: Arc<ToolCallParserObj>,
pub(crate) cached_tool_prompt: Arc<String>,
pub(crate) formatter_factory: FormatterFactory,
pub(crate) on_evict_handler: Option<EvictionHandler>,
}
impl AgentState {
pub fn clear_history(&mut self, agent: &Agent) {
self.chat_history.clear();
agent.llm_engine.reset_context();
}
pub fn set_dynamic_context(&mut self, context: &str) {
self.dynamic_context = context.to_string();
}
pub fn append_dynamic_context(&mut self, context: &str) {
if context.is_empty() {
return;
}
if !self.dynamic_context.is_empty() {
self.dynamic_context.push_str("\n\n");
}
self.dynamic_context.push_str(context);
}
pub fn clear_dynamic_context(&mut self) {
self.dynamic_context.clear();
}
}
impl Agent {
pub async fn evaluate_sentence_entropy(&self, sentence: &str) -> crate::error::Result<f32> {
self.llm_engine.evaluate_sentence_entropy(sentence).await
}
pub fn get_llama_engine(&self) -> Arc<LLMEngine> {
self.llm_engine.clone()
}
}