checkpoint(Saved system prompt presets)
This commit is contained in:
116
src/gui_2.py
116
src/gui_2.py
@@ -14,6 +14,7 @@ from src import cost_tracker
|
||||
from src import session_logger
|
||||
from src import project_manager
|
||||
from src import paths
|
||||
from src import presets
|
||||
from src import theme_2 as theme
|
||||
from src import theme_nerv_fx as theme_fx
|
||||
from src import api_hooks
|
||||
@@ -94,6 +95,15 @@ class App:
|
||||
self.controller.init_state()
|
||||
self.show_windows.setdefault("Diagnostics", False)
|
||||
self.controller.start_services(self)
|
||||
self.show_preset_manager_modal = False
|
||||
self._editing_preset_name = ""
|
||||
self._editing_preset_content = ""
|
||||
self._editing_preset_temperature = 0.0
|
||||
self._editing_preset_top_p = 1.0
|
||||
self._editing_preset_max_output_tokens = 4096
|
||||
self._editing_preset_scope = "project"
|
||||
self._editing_preset_is_new = False
|
||||
self._presets_list: dict[str, dict] = {}
|
||||
# Aliases for controller-owned locks
|
||||
self._send_thread_lock = self.controller._send_thread_lock
|
||||
self._disc_entries_lock = self.controller._disc_entries_lock
|
||||
@@ -110,7 +120,7 @@ class App:
|
||||
self.node_editor_ctx = ed.create_editor(self.node_editor_config)
|
||||
self.ui_selected_ticket_id: Optional[str] = None
|
||||
self.ui_selected_tickets: set[str] = set()
|
||||
self.ui_new_ticket_priority: str = "medium"
|
||||
self.ui_new_ticket_priority: str = 'medium'
|
||||
self._autofocus_response_tab = False
|
||||
gui_cfg = self.config.get("gui", {})
|
||||
self.ui_separate_message_panel = gui_cfg.get("separate_message_panel", False)
|
||||
@@ -332,6 +342,7 @@ class App:
|
||||
self._render_track_proposal_modal()
|
||||
self._render_patch_modal()
|
||||
self._render_save_preset_modal()
|
||||
self._render_preset_manager_modal()
|
||||
# Auto-save (every 60s)
|
||||
now = time.time()
|
||||
if now - self._last_autosave >= self._autosave_interval:
|
||||
@@ -850,6 +861,82 @@ class App:
|
||||
imgui.close_current_popup()
|
||||
imgui.end_popup()
|
||||
|
||||
def _render_preset_manager_modal(self) -> None:
|
||||
if not self.show_preset_manager_modal: return
|
||||
imgui.open_popup("Preset Manager")
|
||||
if imgui.begin_popup_modal("Preset Manager", True, imgui.WindowFlags_.always_auto_resize)[0]:
|
||||
imgui.begin_child("preset_list_area", imgui.ImVec2(250, 600), True)
|
||||
preset_names = sorted(self.controller.presets.keys())
|
||||
if imgui.button("New Preset", imgui.ImVec2(-1, 0)):
|
||||
self._editing_preset_name = ""
|
||||
self._editing_preset_content = ""
|
||||
self._editing_preset_temperature = 0.0
|
||||
self._editing_preset_top_p = 1.0
|
||||
self._editing_preset_max_output_tokens = 4096
|
||||
self._editing_preset_scope = "project"
|
||||
self._editing_preset_is_new = True
|
||||
imgui.separator()
|
||||
for name in preset_names:
|
||||
p = self.controller.presets[name]
|
||||
is_sel = (name == self._editing_preset_name)
|
||||
if imgui.selectable(name, is_sel)[0]:
|
||||
self._editing_preset_name = name
|
||||
self._editing_preset_content = p.system_prompt
|
||||
self._editing_preset_temperature = p.temperature if p.temperature is not None else 0.0
|
||||
self._editing_preset_top_p = p.top_p if p.top_p is not None else 1.0
|
||||
self._editing_preset_max_output_tokens = p.max_output_tokens if p.max_output_tokens is not None else 4096
|
||||
self._editing_preset_is_new = False
|
||||
imgui.end_child()
|
||||
imgui.same_line()
|
||||
imgui.begin_child("preset_edit_area", imgui.ImVec2(500, 600), False)
|
||||
imgui.text("Name:")
|
||||
_, self._editing_preset_name = imgui.input_text("##edit_name", self._editing_preset_name)
|
||||
imgui.text("Scope:")
|
||||
if imgui.radio_button("Global", self._editing_preset_scope == "global"):
|
||||
self._editing_preset_scope = "global"
|
||||
imgui.same_line()
|
||||
if imgui.radio_button("Project", self._editing_preset_scope == "project"):
|
||||
self._editing_preset_scope = "project"
|
||||
imgui.text("Content:")
|
||||
_, self._editing_preset_content = imgui.input_text_multiline("##edit_content", self._editing_preset_content, imgui.ImVec2(-1, 280))
|
||||
|
||||
imgui.text("Temperature:")
|
||||
_, self._editing_preset_temperature = imgui.input_float("##edit_temp", self._editing_preset_temperature, 0.1, 1.0, "%.2f")
|
||||
imgui.text("Top P:")
|
||||
_, self._editing_preset_top_p = imgui.input_float("##edit_top_p", self._editing_preset_top_p, 0.1, 1.0, "%.2f")
|
||||
imgui.text("Max Output Tokens:")
|
||||
_, self._editing_preset_max_output_tokens = imgui.input_int("##edit_max_tokens", self._editing_preset_max_output_tokens)
|
||||
|
||||
if imgui.button("Save", imgui.ImVec2(120, 0)):
|
||||
if self._editing_preset_name.strip():
|
||||
new_p = models.Preset(
|
||||
name=self._editing_preset_name.strip(),
|
||||
system_prompt=self._editing_preset_content,
|
||||
temperature=self._editing_preset_temperature,
|
||||
top_p=self._editing_preset_top_p,
|
||||
max_output_tokens=self._editing_preset_max_output_tokens
|
||||
)
|
||||
self.controller.preset_manager.save_preset(new_p, self._editing_preset_scope)
|
||||
self.controller.presets = self.controller.preset_manager.load_all()
|
||||
self.ai_status = f"Preset '{new_p.name}' saved to {self._editing_preset_scope}"
|
||||
imgui.same_line()
|
||||
if imgui.button("Delete", imgui.ImVec2(120, 0)):
|
||||
if self._editing_preset_name.strip():
|
||||
try:
|
||||
self.controller.preset_manager.delete_preset(self._editing_preset_name.strip(), self._editing_preset_scope)
|
||||
self.controller.presets = self.controller.preset_manager.load_all()
|
||||
self.ai_status = f"Preset '{self._editing_preset_name}' deleted from {self._editing_preset_scope}"
|
||||
self._editing_preset_name = ""
|
||||
self._editing_preset_content = ""
|
||||
except Exception as e:
|
||||
self.ai_status = f"Error deleting: {e}"
|
||||
imgui.same_line()
|
||||
if imgui.button("Close", imgui.ImVec2(120, 0)):
|
||||
self.show_preset_manager_modal = False
|
||||
imgui.close_current_popup()
|
||||
imgui.end_child()
|
||||
imgui.end_popup()
|
||||
|
||||
def _render_projects_panel(self) -> None:
|
||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_projects_panel")
|
||||
proj_name = self.project.get("project", {}).get("name", Path(self.active_project_path).stem)
|
||||
@@ -2827,9 +2914,36 @@ def hello():
|
||||
|
||||
def _render_system_prompts_panel(self) -> None:
|
||||
imgui.text("Global System Prompt (all projects)")
|
||||
preset_names = sorted(self.controller.presets.keys())
|
||||
current_global = self.controller.ui_global_preset_name or "Select Preset..."
|
||||
imgui.set_next_item_width(200)
|
||||
if imgui.begin_combo("##global_preset", current_global):
|
||||
for name in preset_names:
|
||||
is_sel = (name == current_global)
|
||||
if imgui.selectable(name, is_sel)[0]:
|
||||
self.controller._apply_preset(name, "global")
|
||||
if is_sel:
|
||||
imgui.set_item_default_focus()
|
||||
imgui.end_combo()
|
||||
imgui.same_line()
|
||||
if imgui.button("Manage Presets##global"):
|
||||
self.show_preset_manager_modal = True
|
||||
ch, self.ui_global_system_prompt = imgui.input_text_multiline("##gsp", self.ui_global_system_prompt, imgui.ImVec2(-1, 100))
|
||||
imgui.separator()
|
||||
imgui.text("Project System Prompt")
|
||||
current_project = self.controller.ui_project_preset_name or "Select Preset..."
|
||||
imgui.set_next_item_width(200)
|
||||
if imgui.begin_combo("##project_preset", current_project):
|
||||
for name in preset_names:
|
||||
is_sel = (name == current_project)
|
||||
if imgui.selectable(name, is_sel)[0]:
|
||||
self.controller._apply_preset(name, "project")
|
||||
if is_sel:
|
||||
imgui.set_item_default_focus()
|
||||
imgui.end_combo()
|
||||
imgui.same_line()
|
||||
if imgui.button("Manage Presets##project"):
|
||||
self.show_preset_manager_modal = True
|
||||
ch, self.ui_project_system_prompt = imgui.input_text_multiline("##psp", self.ui_project_system_prompt, imgui.ImVec2(-1, 100))
|
||||
|
||||
def _render_theme_panel(self) -> None:
|
||||
|
||||
Reference in New Issue
Block a user