From a7590f9fdcbec53af344703cff37f7e625abba71 Mon Sep 17 00:00:00 2001 From: harald Date: Wed, 25 Feb 2026 12:19:59 +0100 Subject: [PATCH] fix(channel): merge delivery instructions into initial system message Some models (e.g. Qwen 3.5) enforce that all system messages must appear at the beginning of the conversation. The Telegram delivery instructions were appended as a separate system message after the user message, causing a Jinja template error. Merge them into the first system message instead. Co-Authored-By: Claude Opus 4.6 --- src/channels/mod.rs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/channels/mod.rs b/src/channels/mod.rs index 435deb7..127e2f5 100644 --- a/src/channels/mod.rs +++ b/src/channels/mod.rs @@ -626,14 +626,14 @@ async fn process_channel_message(ctx: Arc, msg: traits::C .cloned() .unwrap_or_default(); - let mut history = vec![ChatMessage::system(ctx.system_prompt.as_str())]; + let system_prompt = match channel_delivery_instructions(&msg.channel) { + Some(instructions) => format!("{}\n\n{instructions}", ctx.system_prompt), + None => ctx.system_prompt.to_string(), + }; + let mut history = vec![ChatMessage::system(&system_prompt)]; history.append(&mut prior_turns); history.push(ChatMessage::user(&enriched_message)); - if let Some(instructions) = channel_delivery_instructions(&msg.channel) { - history.push(ChatMessage::system(instructions)); - } - // Determine if this channel supports streaming draft updates let use_streaming = target_channel .as_ref() @@ -2304,6 +2304,7 @@ mod tests { reliability: Arc::new(crate::config::ReliabilityConfig::default()), provider_runtime_options: providers::ProviderRuntimeOptions::default(), workspace_dir: Arc::new(std::env::temp_dir()), + channel_message_timeout_secs: 300, }); process_channel_message( @@ -2356,6 +2357,7 @@ mod tests { reliability: Arc::new(crate::config::ReliabilityConfig::default()), provider_runtime_options: providers::ProviderRuntimeOptions::default(), workspace_dir: Arc::new(std::env::temp_dir()), + channel_message_timeout_secs: 300, }); process_channel_message( @@ -2417,6 +2419,7 @@ mod tests { reliability: Arc::new(crate::config::ReliabilityConfig::default()), provider_runtime_options: providers::ProviderRuntimeOptions::default(), workspace_dir: Arc::new(std::env::temp_dir()), + channel_message_timeout_secs: 300, }); process_channel_message( @@ -2499,6 +2502,7 @@ mod tests { reliability: Arc::new(crate::config::ReliabilityConfig::default()), provider_runtime_options: providers::ProviderRuntimeOptions::default(), workspace_dir: Arc::new(std::env::temp_dir()), + channel_message_timeout_secs: 300, }); process_channel_message( @@ -2557,6 +2561,7 @@ mod tests { reliability: Arc::new(crate::config::ReliabilityConfig::default()), provider_runtime_options: providers::ProviderRuntimeOptions::default(), workspace_dir: Arc::new(std::env::temp_dir()), + channel_message_timeout_secs: 300, }); process_channel_message( @@ -2610,6 +2615,7 @@ mod tests { reliability: Arc::new(crate::config::ReliabilityConfig::default()), provider_runtime_options: providers::ProviderRuntimeOptions::default(), workspace_dir: Arc::new(std::env::temp_dir()), + channel_message_timeout_secs: 300, }); process_channel_message( @@ -2714,6 +2720,7 @@ mod tests { reliability: Arc::new(crate::config::ReliabilityConfig::default()), provider_runtime_options: providers::ProviderRuntimeOptions::default(), workspace_dir: Arc::new(std::env::temp_dir()), + channel_message_timeout_secs: 300, }); let (tx, rx) = tokio::sync::mpsc::channel::(4); @@ -2784,6 +2791,7 @@ mod tests { reliability: Arc::new(crate::config::ReliabilityConfig::default()), provider_runtime_options: providers::ProviderRuntimeOptions::default(), workspace_dir: Arc::new(std::env::temp_dir()), + channel_message_timeout_secs: 300, }); process_channel_message( @@ -3174,6 +3182,7 @@ mod tests { reliability: Arc::new(crate::config::ReliabilityConfig::default()), provider_runtime_options: providers::ProviderRuntimeOptions::default(), workspace_dir: Arc::new(std::env::temp_dir()), + channel_message_timeout_secs: 300, }); process_channel_message(