pub mod config;
pub mod mockai;
pub mod rule_types;
pub mod session;
pub mod session_state;
pub mod types;
pub use config::{
BehaviorModelConfig, IntelligentBehaviorConfig, PerformanceConfig, PersonasConfig,
VectorStoreConfig,
};
pub use mockai::MockAiBehavior;
pub use session::{SessionManager, SessionTracking, SessionTrackingMethod};
pub use session_state::{InteractionRecord, SessionState};
pub use types::BehaviorRules;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct Persona {
pub name: String,
#[serde(default)]
pub traits: HashMap<String, String>,
}
impl Persona {
pub fn get_numeric_trait(&self, key: &str) -> Option<u64> {
self.traits.get(key).and_then(|value| {
if let Some((min_str, max_str)) = value.split_once('-') {
if let (Ok(min), Ok(max)) =
(min_str.trim().parse::<u64>(), max_str.trim().parse::<u64>())
{
return Some((min + max) / 2);
}
}
value.parse::<u64>().ok()
})
}
pub fn get_trait(&self, key: &str) -> Option<&String> {
self.traits.get(key)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LlmGenerationRequest {
pub system_prompt: String,
pub user_prompt: String,
#[serde(default = "default_temperature")]
pub temperature: f64,
#[serde(default = "default_max_tokens")]
pub max_tokens: usize,
pub schema: Option<Value>,
}
impl LlmGenerationRequest {
pub fn new(system_prompt: impl Into<String>, user_prompt: impl Into<String>) -> Self {
Self {
system_prompt: system_prompt.into(),
user_prompt: user_prompt.into(),
temperature: default_temperature(),
max_tokens: default_max_tokens(),
schema: None,
}
}
#[must_use]
pub fn with_temperature(mut self, temperature: f64) -> Self {
self.temperature = temperature;
self
}
#[must_use]
pub fn with_max_tokens(mut self, max_tokens: usize) -> Self {
self.max_tokens = max_tokens;
self
}
#[must_use]
pub fn with_schema(mut self, schema: Value) -> Self {
self.schema = Some(schema);
self
}
}
fn default_temperature() -> f64 {
0.7
}
fn default_max_tokens() -> usize {
1024
}
#[derive(Debug, Clone)]
pub struct Request {
pub method: String,
pub path: String,
pub body: Option<Value>,
pub query_params: HashMap<String, String>,
pub headers: HashMap<String, String>,
}
#[derive(Debug, Clone)]
pub struct Response {
pub status_code: u16,
pub body: Value,
pub headers: HashMap<String, String>,
}
#[derive(Debug, Clone)]
pub struct HttpExchange {
pub method: String,
pub path: String,
pub query_params: Option<String>,
pub headers: String,
pub body: Option<String>,
pub body_encoding: String,
pub status_code: Option<i32>,
pub response_headers: Option<String>,
pub response_body: Option<String>,
pub response_body_encoding: Option<String>,
pub timestamp: DateTime<Utc>,
}