feat(ai): Implement configurable base system prompt and expose in UI
This commit is contained in:
+13
-5
@@ -143,7 +143,8 @@ _SYSTEM_PROMPT: str = (
|
||||
)
|
||||
|
||||
_custom_system_prompt: str = ""
|
||||
_global_tool_instructions: str = ""
|
||||
_base_system_prompt_override: str = ""
|
||||
_use_default_base_system_prompt: bool = True
|
||||
_project_context_marker: str = ""
|
||||
|
||||
def set_custom_system_prompt(prompt: str) -> None:
|
||||
@@ -151,9 +152,13 @@ def set_custom_system_prompt(prompt: str) -> None:
|
||||
global _custom_system_prompt
|
||||
_custom_system_prompt = prompt
|
||||
|
||||
def set_global_tool_instructions(instructions: str) -> None:
|
||||
global _global_tool_instructions
|
||||
_global_tool_instructions = instructions
|
||||
def set_base_system_prompt(prompt: str) -> None:
|
||||
global _base_system_prompt_override
|
||||
_base_system_prompt_override = prompt
|
||||
|
||||
def set_use_default_base_prompt(use_default: bool) -> None:
|
||||
global _use_default_base_system_prompt
|
||||
_use_default_base_system_prompt = use_default
|
||||
|
||||
def set_project_context_marker(marker: str) -> None:
|
||||
global _project_context_marker
|
||||
@@ -165,7 +170,10 @@ def _get_context_marker() -> str:
|
||||
def _get_combined_system_prompt(preset: Optional[ToolPreset] = None, bias: Optional[BiasProfile] = None) -> str:
|
||||
if preset is None: preset = _active_tool_preset
|
||||
if bias is None: bias = _active_bias_profile
|
||||
base = _global_tool_instructions if _global_tool_instructions.strip() else _SYSTEM_PROMPT
|
||||
if _use_default_base_system_prompt:
|
||||
base = _SYSTEM_PROMPT
|
||||
else:
|
||||
base = _base_system_prompt_override
|
||||
if _custom_system_prompt.strip():
|
||||
base = f"{base}\n\n[USER SYSTEM PROMPT]\n{_custom_system_prompt}"
|
||||
if preset and bias:
|
||||
|
||||
+14
-5
@@ -233,7 +233,8 @@ class AppController:
|
||||
self.ui_auto_add_history: bool = False
|
||||
self.ui_active_tool_preset: str | None = None
|
||||
self.ui_global_system_prompt: str = ""
|
||||
self.ui_global_tool_instructions: str = ""
|
||||
self.ui_base_system_prompt: str = ""
|
||||
self.ui_use_default_base_prompt: bool = True
|
||||
self.ui_project_context_marker: str = ""
|
||||
self.ui_agent_tools: Dict[str, bool] = {}
|
||||
self.available_models: List[str] = []
|
||||
@@ -355,6 +356,8 @@ class AppController:
|
||||
'manual_approve': 'ui_manual_approve',
|
||||
'global_system_prompt': 'ui_global_system_prompt',
|
||||
'project_system_prompt': 'ui_project_system_prompt',
|
||||
'base_system_prompt': 'ui_base_system_prompt',
|
||||
'use_default_base_prompt': 'ui_use_default_base_prompt',
|
||||
'global_preset_name': 'ui_global_preset_name',
|
||||
'project_preset_name': 'ui_project_preset_name',
|
||||
'ui_active_tool_preset': 'ui_active_tool_preset',
|
||||
@@ -409,6 +412,8 @@ class AppController:
|
||||
'bg_shader_enabled': 'bg_shader_enabled',
|
||||
'global_system_prompt': 'ui_global_system_prompt',
|
||||
'project_system_prompt': 'ui_project_system_prompt',
|
||||
'base_system_prompt': 'ui_base_system_prompt',
|
||||
'use_default_base_prompt': 'ui_use_default_base_prompt',
|
||||
'global_preset_name': 'ui_global_preset_name',
|
||||
'project_preset_name': 'ui_project_preset_name',
|
||||
'ui_active_tool_preset': 'ui_active_tool_preset',
|
||||
@@ -915,7 +920,8 @@ class AppController:
|
||||
self.ui_word_wrap = proj_meta.get("word_wrap", True)
|
||||
self.ui_auto_add_history = disc_sec.get("auto_add", False)
|
||||
self.ui_global_system_prompt = self.config.get("ai", {}).get("system_prompt", "")
|
||||
self.ui_global_tool_instructions = self.config.get("ai", {}).get("tool_instructions", "")
|
||||
self.ui_base_system_prompt = self.config.get("ai", {}).get("base_system_prompt", "")
|
||||
self.ui_use_default_base_prompt = self.config.get("ai", {}).get("use_default_base_prompt", True)
|
||||
self.ui_project_context_marker = proj_meta.get("context_marker", "")
|
||||
|
||||
self.preset_manager = presets.PresetManager(Path(self.active_project_path).parent if self.active_project_path else None)
|
||||
@@ -1408,7 +1414,8 @@ class AppController:
|
||||
self.ai_response = ""
|
||||
csp = filter(bool, [self.ui_global_system_prompt.strip(), self.ui_project_system_prompt.strip()])
|
||||
ai_client.set_custom_system_prompt("\n\n".join(csp))
|
||||
ai_client.set_global_tool_instructions(self.ui_global_tool_instructions)
|
||||
ai_client.set_base_system_prompt(self.ui_base_system_prompt)
|
||||
ai_client.set_use_default_base_prompt(self.ui_use_default_base_prompt)
|
||||
ai_client.set_project_context_marker(self.ui_project_context_marker)
|
||||
ai_client.set_model_params(self.temperature, self.max_tokens, self.history_trunc_limit, self.top_p)
|
||||
ai_client.set_agent_tools(self.ui_agent_tools) # Force update adapter path right before send to bypass potential duplication issues
|
||||
@@ -1828,7 +1835,8 @@ class AppController:
|
||||
base_dir = self.active_project_root
|
||||
csp = filter(bool, [self.ui_global_system_prompt.strip(), self.ui_project_system_prompt.strip()])
|
||||
ai_client.set_custom_system_prompt("\n\n".join(csp))
|
||||
ai_client.set_global_tool_instructions(self.ui_global_tool_instructions)
|
||||
ai_client.set_base_system_prompt(self.ui_base_system_prompt)
|
||||
ai_client.set_use_default_base_prompt(self.ui_use_default_base_prompt)
|
||||
ai_client.set_project_context_marker(self.ui_project_context_marker)
|
||||
temp = req.temperature if req.temperature is not None else self.temperature
|
||||
top_p = req.top_p if req.top_p is not None else self.top_p
|
||||
@@ -2496,7 +2504,8 @@ class AppController:
|
||||
"active_preset": self.ui_global_preset_name,
|
||||
}
|
||||
self.config["ai"]["system_prompt"] = self.ui_global_system_prompt
|
||||
self.config["ai"]["tool_instructions"] = self.ui_global_tool_instructions
|
||||
self.config["ai"]["base_system_prompt"] = self.ui_base_system_prompt
|
||||
self.config["ai"]["use_default_base_prompt"] = self.ui_use_default_base_prompt
|
||||
self.config["projects"] = {"paths": self.project_paths, "active": self.active_project_path}
|
||||
from src import bg_shader
|
||||
# Update gui section while preserving other keys like bg_shader_enabled
|
||||
|
||||
+14
-4
@@ -4275,10 +4275,20 @@ def hello():
|
||||
imgui.set_item_tooltip("Open preset management modal")
|
||||
ch, self.ui_global_system_prompt = imgui.input_text_multiline("##gsp", self.ui_global_system_prompt, imgui.ImVec2(-1, 100))
|
||||
imgui.separator()
|
||||
imgui.text("Global Tool Instructions")
|
||||
ch, self.ui_global_tool_instructions = imgui.input_text_multiline("##gti", getattr(self, "ui_global_tool_instructions", ""), imgui.ImVec2(-1, 100))
|
||||
if imgui.is_item_hovered():
|
||||
imgui.set_tooltip("Instructions given to the agent about how to use its tools.")
|
||||
imgui.text("Base System Prompt")
|
||||
imgui.same_line()
|
||||
_, self.ui_use_default_base_prompt = imgui.checkbox("Use Default Base System Prompt", self.ui_use_default_base_prompt)
|
||||
imgui.same_line()
|
||||
if imgui.button("Reset to Default"):
|
||||
self.ui_base_system_prompt = ai_client._SYSTEM_PROMPT
|
||||
self.ui_use_default_base_prompt = False
|
||||
|
||||
if self.ui_use_default_base_prompt:
|
||||
imgui.begin_disabled()
|
||||
imgui.input_text_multiline("##base_prompt_def", ai_client._SYSTEM_PROMPT, imgui.ImVec2(-1, 100), imgui.InputTextFlags_.read_only)
|
||||
imgui.end_disabled()
|
||||
else:
|
||||
ch, self.ui_base_system_prompt = imgui.input_text_multiline("##base_prompt", self.ui_base_system_prompt, imgui.ImVec2(-1, 150))
|
||||
imgui.separator()
|
||||
imgui.text("Project System Prompt")
|
||||
current_project = self.controller.ui_project_preset_name or "Select Preset..."
|
||||
|
||||
Reference in New Issue
Block a user