From 897eb850a1c7d8c23ab5cf66fb5ba6acb3e2b1e9 Mon Sep 17 00:00:00 2001 From: Adil Hafeez Date: Wed, 22 Apr 2026 23:54:23 -0700 Subject: [PATCH] add overrides.disable_signals to skip CPU-heavy signal analysis Made-with: Cursor --- config/plano_config_schema.yaml | 3 +++ crates/brightstaff/src/app_state.rs | 3 +++ crates/brightstaff/src/handlers/llm/mod.rs | 8 +++++- crates/brightstaff/src/main.rs | 3 +++ crates/common/src/configuration.rs | 26 +++++++++++++++++++ .../includes/plano_config_full_reference.yaml | 3 +++ .../plano_config_full_reference_rendered.yaml | 1 + 7 files changed, 46 insertions(+), 1 deletion(-) diff --git a/config/plano_config_schema.yaml b/config/plano_config_schema.yaml index 3439ebee..22515ccf 100644 --- a/config/plano_config_schema.yaml +++ b/config/plano_config_schema.yaml @@ -278,6 +278,9 @@ properties: type: boolean use_agent_orchestrator: type: boolean + disable_signals: + type: boolean + description: "Disable agentic signal analysis (frustration, repetition, escalation, etc.) on LLM responses to save CPU. Default false." upstream_connect_timeout: type: string description: "Connect timeout for upstream provider clusters (e.g., '5s', '10s'). Default is '5s'." diff --git a/crates/brightstaff/src/app_state.rs b/crates/brightstaff/src/app_state.rs index e585d2db..1d534e89 100644 --- a/crates/brightstaff/src/app_state.rs +++ b/crates/brightstaff/src/app_state.rs @@ -24,4 +24,7 @@ pub struct AppState { /// Shared HTTP client for upstream LLM requests (connection pooling / keep-alive). pub http_client: reqwest::Client, pub filter_pipeline: Arc, + /// When false, agentic signal analysis is skipped on LLM responses to save CPU. + /// Controlled by `overrides.disable_signals` in plano config. + pub signals_enabled: bool, } diff --git a/crates/brightstaff/src/handlers/llm/mod.rs b/crates/brightstaff/src/handlers/llm/mod.rs index 94930caa..401cd0c5 100644 --- a/crates/brightstaff/src/handlers/llm/mod.rs +++ b/crates/brightstaff/src/handlers/llm/mod.rs @@ -143,6 +143,7 @@ async fn llm_chat_inner( &request_path, &state.model_aliases, &state.llm_providers, + state.signals_enabled, ) .await { @@ -408,6 +409,7 @@ async fn parse_and_validate_request( request_path: &str, model_aliases: &Option>, llm_providers: &Arc>, + signals_enabled: bool, ) -> Result>> { let raw_bytes = request .collect() @@ -486,7 +488,11 @@ async fn parse_and_validate_request( let user_message_preview = client_request .get_recent_user_message() .map(|msg| truncate_message(&msg, 50)); - let messages_for_signals = Some(client_request.get_messages()); + let messages_for_signals = if signals_enabled { + Some(client_request.get_messages()) + } else { + None + }; // Set the upstream model name and strip routing metadata client_request.set_model(model_name_only.clone()); diff --git a/crates/brightstaff/src/main.rs b/crates/brightstaff/src/main.rs index 80e03b4b..2d610d6f 100644 --- a/crates/brightstaff/src/main.rs +++ b/crates/brightstaff/src/main.rs @@ -328,6 +328,8 @@ async fn init_app_state( .as_ref() .and_then(|tracing| tracing.span_attributes.clone()); + let signals_enabled = !overrides.disable_signals.unwrap_or(false); + Ok(AppState { orchestrator_service, model_aliases: config.model_aliases.clone(), @@ -339,6 +341,7 @@ async fn init_app_state( span_attributes, http_client: reqwest::Client::new(), filter_pipeline, + signals_enabled, }) } diff --git a/crates/common/src/configuration.rs b/crates/common/src/configuration.rs index 028c8046..acf47e43 100644 --- a/crates/common/src/configuration.rs +++ b/crates/common/src/configuration.rs @@ -234,6 +234,7 @@ pub struct Overrides { pub llm_routing_model: Option, pub agent_orchestration_model: Option, pub orchestrator_model_context_length: Option, + pub disable_signals: Option, } #[derive(Debug, Clone, Serialize, Deserialize, Default)] @@ -750,4 +751,29 @@ mod test { assert!(model_ids.contains(&"openai-gpt4".to_string())); assert!(!model_ids.contains(&"plano-orchestrator".to_string())); } + + #[test] + fn test_overrides_disable_signals_default_none() { + let overrides = super::Overrides::default(); + assert_eq!(overrides.disable_signals, None); + } + + #[test] + fn test_overrides_disable_signals_deserialize() { + let yaml = r#" +disable_signals: true +"#; + let overrides: super::Overrides = serde_yaml::from_str(yaml).unwrap(); + assert_eq!(overrides.disable_signals, Some(true)); + + let yaml_false = r#" +disable_signals: false +"#; + let overrides: super::Overrides = serde_yaml::from_str(yaml_false).unwrap(); + assert_eq!(overrides.disable_signals, Some(false)); + + let yaml_missing = "{}"; + let overrides: super::Overrides = serde_yaml::from_str(yaml_missing).unwrap(); + assert_eq!(overrides.disable_signals, None); + } } diff --git a/docs/source/resources/includes/plano_config_full_reference.yaml b/docs/source/resources/includes/plano_config_full_reference.yaml index 1d544727..808d0a98 100644 --- a/docs/source/resources/includes/plano_config_full_reference.yaml +++ b/docs/source/resources/includes/plano_config_full_reference.yaml @@ -173,6 +173,9 @@ overrides: llm_routing_model: Plano-Orchestrator # Model used for agent orchestration (must be listed in model_providers) agent_orchestration_model: Plano-Orchestrator + # Disable agentic signal analysis (frustration, repetition, escalation, etc.) + # on LLM responses to save CPU. Default: false. + disable_signals: false # Model affinity — pin routing decisions for agentic loops routing: diff --git a/docs/source/resources/includes/plano_config_full_reference_rendered.yaml b/docs/source/resources/includes/plano_config_full_reference_rendered.yaml index 4992ce3b..a0603221 100644 --- a/docs/source/resources/includes/plano_config_full_reference_rendered.yaml +++ b/docs/source/resources/includes/plano_config_full_reference_rendered.yaml @@ -170,6 +170,7 @@ model_providers: provider_interface: plano overrides: agent_orchestration_model: Plano-Orchestrator + disable_signals: false llm_routing_model: Plano-Orchestrator optimize_context_window: true prompt_target_intent_matching_threshold: 0.7