Improve the default system prompt

This commit is contained in:
Georg Bauer
2026-07-27 14:26:10 +02:00
parent a90a241ae1
commit 8f02f0934b
5 changed files with 28 additions and 15 deletions

View File

@@ -185,7 +185,7 @@ pub(crate) enum Message {
PreferenceEndpointCorsChanged(bool), PreferenceEndpointCorsChanged(bool),
PreferenceContextChanged(String), PreferenceContextChanged(String),
PreferenceMaxTokensChanged(String), PreferenceMaxTokensChanged(String),
PreferenceSystemPromptChanged(String), PreferenceSystemPromptAction(text_editor::Action),
PreferenceTemperatureChanged(String), PreferenceTemperatureChanged(String),
PreferenceTopPChanged(String), PreferenceTopPChanged(String),
PreferenceMinPChanged(String), PreferenceMinPChanged(String),
@@ -684,8 +684,8 @@ impl App {
self.preference_draft.max_generated_tokens = value; self.preference_draft.max_generated_tokens = value;
self.preference_error = None; self.preference_error = None;
} }
Message::PreferenceSystemPromptChanged(value) => { Message::PreferenceSystemPromptAction(action) => {
self.preference_draft.system_prompt = value; self.preference_draft.system_prompt.perform(action);
self.preference_error = None; self.preference_error = None;
} }
Message::PreferenceTemperatureChanged(value) => { Message::PreferenceTemperatureChanged(value) => {

View File

@@ -12,7 +12,7 @@ pub(super) struct PreferenceDraft {
pub(super) endpoint_cors: bool, pub(super) endpoint_cors: bool,
pub(super) context_tokens: String, pub(super) context_tokens: String,
pub(super) max_generated_tokens: String, pub(super) max_generated_tokens: String,
pub(super) system_prompt: String, pub(super) system_prompt: text_editor::Content,
pub(super) temperature: String, pub(super) temperature: String,
pub(super) top_p: String, pub(super) top_p: String,
pub(super) min_p: String, pub(super) min_p: String,
@@ -62,7 +62,7 @@ impl PreferenceDraft {
endpoint_cors: config.endpoint.cors, endpoint_cors: config.endpoint.cors,
context_tokens: generation.context_tokens.to_string(), context_tokens: generation.context_tokens.to_string(),
max_generated_tokens: generation.max_generated_tokens.to_string(), max_generated_tokens: generation.max_generated_tokens.to_string(),
system_prompt: generation.system_prompt.clone(), system_prompt: text_editor::Content::with_text(&generation.system_prompt),
temperature: optional_string(generation.temperature), temperature: optional_string(generation.temperature),
top_p: optional_string(generation.top_p), top_p: optional_string(generation.top_p),
min_p: optional_string(generation.min_p), min_p: optional_string(generation.min_p),
@@ -111,7 +111,7 @@ impl PreferenceDraft {
"Maximum generated tokens", "Maximum generated tokens",
&self.max_generated_tokens, &self.max_generated_tokens,
)?, )?,
system_prompt: self.system_prompt.clone(), system_prompt: self.system_prompt.text(),
temperature: parse_optional_f32("Temperature", &self.temperature)?, temperature: parse_optional_f32("Temperature", &self.temperature)?,
top_p: parse_optional_f32("Top-p", &self.top_p)?, top_p: parse_optional_f32("Top-p", &self.top_p)?,
min_p: parse_optional_f32("Min-p", &self.min_p)?, min_p: parse_optional_f32("Min-p", &self.min_p)?,
@@ -423,6 +423,16 @@ impl App {
mod tests { mod tests {
use super::*; use super::*;
#[test]
fn multiline_system_prompt_round_trips_through_the_editor() {
let draft = PreferenceDraft::from_saved(&Config::default());
assert_eq!(
draft.generation().unwrap().system_prompt,
crate::settings::DEFAULT_SYSTEM_PROMPT
);
}
#[test] #[test]
fn runtime_config_updates_after_lock_poisoning() { fn runtime_config_updates_after_lock_poisoning() {
let runtime = Arc::new(RwLock::new(Config::default())); let runtime = Arc::new(RwLock::new(Config::default()));

View File

@@ -18,8 +18,8 @@ use crate::settings::{GIB, REASONING_MODES};
use iced::theme::{Palette, palette}; use iced::theme::{Palette, palette};
use iced::widget::{ use iced::widget::{
Button, Space, Svg, Tooltip, button, checkbox, column, container, image, markdown, mouse_area, Button, Space, Svg, Tooltip, button, checkbox, column, container, image, markdown, mouse_area,
opaque, pick_list, progress_bar, row, rule, scrollable, slider, stack, svg, text, text_input, opaque, pick_list, progress_bar, row, rule, scrollable, slider, stack, svg, text, text_editor,
tooltip, text_input, tooltip,
}; };
use iced::{Alignment, Background, Border, Color, Element, Length, Padding, Theme, window}; use iced::{Alignment, Background, Border, Color, Element, Length, Padding, Theme, window};
use std::collections::VecDeque; use std::collections::VecDeque;

View File

@@ -173,11 +173,10 @@ impl App {
text("System prompt").size(13), text("System prompt").size(13),
"Standing instruction sent before every conversation: persona, tone, house rules. Leave it empty to send no system message at all.", "Standing instruction sent before every conversation: persona, tone, house rules. Leave it empty to send no system message at all.",
), ),
text_input( text_editor(&self.preference_draft.system_prompt)
"You are a helpful assistant", .placeholder("Additional system instructions…")
&self.preference_draft.system_prompt, .height(140)
) .on_action(Message::PreferenceSystemPromptAction)
.on_input(Message::PreferenceSystemPromptChanged)
.padding(9), .padding(9),
Space::new().height(4), Space::new().height(4),
text("SAMPLING & REASONING").size(11).color(muted_text()), text("SAMPLING & REASONING").size(11).color(muted_text()),

View File

@@ -537,12 +537,14 @@ pub(crate) struct GenerationPreferences {
pub(crate) reasoning_mode: ReasoningMode, pub(crate) reasoning_mode: ReasoningMode,
} }
pub(crate) const DEFAULT_SYSTEM_PROMPT: &str = "You are an expert coding assistant operating inside DS4Server, a local coding agent harness. You help users by reading files, executing commands, editing code, and writing new files.\n\nGuidelines:\n- Be concise in your responses\n- Show file paths clearly when working with files";
impl Default for GenerationPreferences { impl Default for GenerationPreferences {
fn default() -> Self { fn default() -> Self {
Self { Self {
context_tokens: 32_768, context_tokens: 32_768,
max_generated_tokens: 50_000, max_generated_tokens: 50_000,
system_prompt: "You are a helpful assistant".into(), system_prompt: DEFAULT_SYSTEM_PROMPT.into(),
temperature: None, temperature: None,
top_p: None, top_p: None,
min_p: None, min_p: None,
@@ -667,6 +669,8 @@ mod tests {
#[test] #[test]
fn effective_settings_preserve_unset_model_defaults() { fn effective_settings_preserve_unset_model_defaults() {
let defaults = GenerationPreferences::default(); let defaults = GenerationPreferences::default();
assert_eq!(defaults.system_prompt, DEFAULT_SYSTEM_PROMPT);
assert!(defaults.system_prompt.contains("\n\nGuidelines:\n-"));
let cache = KvCachePreferences::default().settings(); let cache = KvCachePreferences::default().settings();
let deepseek = defaults.turn_settings(ModelChoice::DeepSeekV4Flash, cache); let deepseek = defaults.turn_settings(ModelChoice::DeepSeekV4Flash, cache);
assert_eq!( assert_eq!(