diff --git a/src/auto_task/intent_classifier.rs b/src/auto_task/intent_classifier.rs index 1e6f91b9..2fd86012 100644 --- a/src/auto_task/intent_classifier.rs +++ b/src/auto_task/intent_classifier.rs @@ -286,7 +286,7 @@ Respond with JSON only: let response = self.call_llm(&prompt, bot_id).await?; let elapsed = start.elapsed(); info!("LLM classification completed in {:?}, response_len={} chars", elapsed, response.len()); - trace!("LLM classification response: {}", &response[..response.len().min(500)]); + trace!("LLM classification response: {}", response.chars().take(500).collect::()); Self::parse_classification_response(&response, intent) } diff --git a/src/core/bot/mod.rs b/src/core/bot/mod.rs index 1bc265db..a6f8f5c3 100644 --- a/src/core/bot/mod.rs +++ b/src/core/bot/mod.rs @@ -535,11 +535,36 @@ impl BotOrchestrator { .ok(); // Load system-prompt from config.csv, fallback to default - let system_prompt = config_manager - .get_config(&session.bot_id, "system-prompt", Some("You are a helpful assistant with access to tools that can help you complete tasks. When a user's request matches one of your available tools, use the appropriate tool instead of providing a generic response.")) - .unwrap_or_else(|_| "You are a helpful General Bots assistant.".to_string()); + // Load system-prompt: auto-detect PROMPT.md, PROMPT.txt, prompt.md, prompt.txt in .gbot folder + // Ignore system-prompt-file config to avoid double .gbot path bug + let bot_id = session.bot_id; + let bot_name = { + let conn = state_clone.conn.get().ok(); + if let Some(mut db_conn) = conn { + use crate::core::shared::models::schema::bots::dsl::*; + bots.filter(id.eq(bot_id)) + .select(name) + .first::(&mut db_conn) + .unwrap_or_else(|_| "default".to_string()) + } else { + "default".to_string() + } + }; + let work_dir = crate::core::shared::utils::get_stack_path(); + let gbot_dir = format!("{}/data/system/work/{}.gbai/{}.gbot/", + work_dir, bot_name, bot_name); + + let system_prompt = std::fs::read_to_string(format!("{}PROMPT.md", gbot_dir)) + .or_else(|_| std::fs::read_to_string(format!("{}prompt.md", gbot_dir))) + .or_else(|_| std::fs::read_to_string(format!("{}PROMPT.txt", gbot_dir))) + .or_else(|_| std::fs::read_to_string(format!("{}prompt.txt", gbot_dir))) + .unwrap_or_else(|_| { + config_manager + .get_config(&session.bot_id, "system-prompt", Some("You are a helpful assistant with access to tools that can help you complete tasks. When a user's request matches one of your available tools, use the appropriate tool instead of providing a generic response.")) + .unwrap_or_else(|_| "You are a helpful General Bots assistant.".to_string()) + }); - info!("Loaded system-prompt for bot {}: {}", session.bot_id, &system_prompt[..system_prompt.len().min(500)]); + info!("Loaded system-prompt for bot {}: {}", session.bot_id, system_prompt.chars().take(500).collect::()); Ok((session, context_data, history, model, key, system_prompt, bot_llm_url, explicit_llm_provider)) }, diff --git a/src/main_module/bootstrap.rs b/src/main_module/bootstrap.rs index 44c51834..a90a56cd 100644 --- a/src/main_module/bootstrap.rs +++ b/src/main_module/bootstrap.rs @@ -1079,10 +1079,23 @@ fn create_bot_from_drive( // LocalFileMonitor and ConfigWatcher disabled - drive (MinIO) is the only source now -async fn start_local_file_monitor(_app_state: Arc) { - trace!("LocalFileMonitor disabled for state - using drive (MinIO) only"); +async fn start_local_file_monitor(app_state: Arc) { + use crate::drive::local_file_monitor::LocalFileMonitor; + + let monitor = LocalFileMonitor::new(app_state.clone()); + if let Err(e) = monitor.start_monitoring().await { + error!("Failed to start LocalFileMonitor: {}", e); + } else { + trace!("LocalFileMonitor started - monitoring /opt/gbo/data for bot changes"); + } } -async fn start_config_watcher(_app_state: Arc) { - trace!("ConfigWatcher disabled for state - using drive (MinIO) only"); +async fn start_config_watcher(app_state: Arc) { + use crate::core::config::watcher::ConfigWatcher; + use std::sync::Arc as StdArc; + + let data_dir = std::path::PathBuf::from("/home/rodriguez/src/gb/botserver-stack/data/system/work"); + let watcher = ConfigWatcher::new(data_dir, app_state.clone()); + let _handle = StdArc::new(watcher).spawn(); + trace!("ConfigWatcher started - monitoring config.csv changes"); }