Files
swarm-assistent/Tabs/Text2Image/Assistent.html
T
Leonid PershinandCursor 65a0982b9d Ship Assistent 0.15.3: user-owned Generate, SwarmUI aspects, HF import UX.
Chips and quick patches apply params without auto-Generate; aspect sizes match Swarm Side Length 1024. HF import shows drafts after switching filter from approved-only; training status and job polling improved.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-23 19:13:36 +03:00

449 lines
43 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<div class="swarm-assistent-root" id="swarm_assistent_root">
<div class="sa-gate" id="sa_gate" hidden>
<p>Swarm Assistent только для моделей <strong>Krea 2</strong>. Выбери checkpoint Krea 2, чтобы включить чат.</p>
</div>
<header class="sa-appbar" id="sa_appbar">
<div class="sa-appbar-brand">
<span class="sa-appbar-title">Assistent</span>
<span class="sa-live-dot" id="sa_live_dot" hidden></span>
<span class="sa-health" id="sa_ollama_health" role="button" tabindex="0" title="Ollama: проверяю…" hidden>Ollama · …</span>
</div>
<div class="sa-app-tabs" role="tablist" aria-label="Разделы Assistent">
<button type="button" class="sa-app-tab sa-app-tab-active" data-view="chat" id="sa_tab_chat" role="tab" aria-selected="true">Чат</button>
<button type="button" class="sa-app-tab" data-view="train" id="sa_tab_train" role="tab" aria-selected="false">Обучение</button>
<button type="button" class="sa-app-tab" data-view="settings" id="sa_tab_settings" role="tab" aria-selected="false">Настройки</button>
</div>
<div class="sa-train-banner" id="sa_train_banner" hidden role="status">
<span class="sa-spinner" aria-hidden="true"></span>
<span id="sa_train_banner_text">Идёт тренировка…</span>
</div>
</header>
<div class="sa-views" id="sa_views">
<div class="sa-view" id="sa_view_chat">
<div class="sa-layout" id="sa_layout">
<aside class="sa-image-pane" id="sa_image_pane">
<div class="sa-board-head">
<span class="sa-board-title">Доска</span>
<div class="sa-board-tabs" role="tablist" aria-label="Доска">
<button type="button" class="sa-board-tab sa-board-tab-active" data-board="generate" id="sa_board_tab_gen" role="tab" aria-selected="true">Generate</button>
<button type="button" class="sa-board-tab" data-board="refs" id="sa_board_tab_refs" role="tab" aria-selected="false">
Refs
<span class="sa-board-badge" id="sa_refs_badge" hidden></span>
</button>
</div>
<button type="button" class="basic-button sa-icon-btn" id="sa_btn_add_ref" title="Добавить окно референса">+ Ref</button>
</div>
<div class="sa-board" id="sa_board" tabindex="0" title="Перетащи изображение на окно или вставь (Ctrl+V). Кликни, чтобы выбрать."></div>
<div class="sa-live-params" id="sa_live_params" title="Текущие параметры Generate"></div>
<div class="sa-image-actions" id="sa_image_actions">
<button type="button" class="basic-button sa-primary" id="sa_btn_look_result" title="Прикрепить готовый кадр Generate и спросить мнение">Посмотри результат</button>
<button type="button" class="basic-button" id="sa_btn_use_current" title="Скопировать текущий Generate в Ref">Снимок gen</button>
<button type="button" class="basic-button" id="sa_btn_clear_image" title="Очистить выбранный Ref">Очистить слот</button>
<div class="sa-more-wrap" id="sa_board_more_wrap">
<button type="button" class="basic-button sa-icon-btn" id="sa_btn_board_more" title="Init / Mask / Сброс" aria-expanded="false" aria-haspopup="true"></button>
<div class="sa-more-menu" id="sa_board_more_menu" hidden role="menu">
<button type="button" class="sa-more-item" id="sa_btn_as_init" role="menuitem">Как Init (img2img)</button>
<button type="button" class="sa-more-item" id="sa_btn_as_mask" role="menuitem">Как Mask (inpaint)</button>
<button type="button" class="sa-more-item" id="sa_btn_clear_init" role="menuitem">Сброс Init + Mask</button>
</div>
</div>
</div>
</aside>
<div class="sa-splitter" id="sa_splitter" role="separator" aria-orientation="vertical" title="Потяни, чтобы изменить ширину"></div>
<div class="sa-chat-workspace" id="sa_chat_workspace">
<section class="sa-chat-pane">
<header class="sa-chat-header">
<div class="sa-chat-title">
<div class="sa-sessions-bar">
<button type="button" class="sa-chats-icon-btn sa-chats-toggle" id="sa_btn_chats" title="Показать чаты" aria-expanded="false" aria-controls="sa_chats_panel" aria-label="Показать чаты">
<svg width="15" height="15" viewBox="0 0 16 16" fill="none" aria-hidden="true"><rect x="2.2" y="3" width="11.6" height="10" rx="1.4" stroke="currentColor" stroke-width="1.4"/><path d="M10.2 3v10" stroke="currentColor" stroke-width="1.4"/></svg>
<span class="sa-chats-count" id="sa_chats_count" hidden></span>
</button>
<span class="sa-session-label" id="sa_session_label" title="Текущий чат">Новый чат</span>
<button type="button" class="sa-chats-icon-btn" id="sa_btn_new_chat_bar" title="Новый чат" aria-label="Новый чат">
<svg width="14" height="14" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M8 3v10M3 8h10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
</button>
</div>
</div>
<div class="sa-header-right">
<div class="sa-ctx-wrap" id="sa_ctx_wrap">
<button type="button" class="sa-ctx-chip sa-ctx-ok" id="sa_ctx_chip" title="Контекст модели" aria-expanded="false" aria-controls="sa_ctx_panel">
<span class="sa-ctx-dot" hidden aria-hidden="true"></span>
<span class="sa-ctx-chip-text">— / —</span>
</button>
<div class="sa-ctx-panel" id="sa_ctx_panel" hidden role="dialog" aria-label="Бюджет контекста">
<div class="sa-ctx-panel-head">
<strong>Контекст</strong>
<button type="button" class="basic-button sa-icon-btn" id="sa_ctx_close" title="Закрыть" aria-label="Закрыть">×</button>
</div>
<div class="sa-ctx-bar"><div class="sa-ctx-bar-fill" id="sa_ctx_bar_fill"></div></div>
<div id="sa_ctx_panel_body" class="sa-ctx-panel-body"></div>
<label class="sa-check sa-ctx-auto"><input type="checkbox" id="sa_ctx_auto" checked /> Авто перед отправкой</label>
<div class="sa-ctx-actions">
<button type="button" class="basic-button sa-primary" id="sa_ctx_compress">Сжать сейчас</button>
<button type="button" class="basic-button" id="sa_ctx_reset">Сбросить сжатие</button>
</div>
</div>
</div>
<div class="sa-persona-wrap">
<select id="sa_persona" class="sa-select" title="Характер / тон" aria-label="Характер">
<option value="neutral">Нейтральный</option>
</select>
<button type="button" class="basic-button sa-icon-btn" id="sa_persona_delete" title="Удалить overlay-личность" hidden aria-label="Удалить личность"></button>
</div>
<div class="sa-persona-controls" id="sa_persona_controls" hidden></div>
<select id="sa_pack" class="sa-select" title="Пакет промпта" aria-label="Пакет промпта">
<option value="ordinary">Обычный</option>
<option value="write_prompt">Написать промпт</option>
</select>
<span class="sa-mode-badge" id="sa_mode_badge" title="Активный pack">обычный</span>
<select id="sa_model" class="sa-select sa-model-select" title="Модель Ollama (чат)" aria-label="Модель Ollama">
<option value="">Загрузка моделей…</option>
</select>
</div>
</header>
<div class="sa-chat-body">
<div class="sa-messages" id="sa_messages">
<div class="sa-chat-empty" id="sa_chat_empty">
<div class="sa-chat-empty-title">Совместная работа с Krea 2</div>
<div class="sa-chat-empty-hint">Напиши промпт, кинь refs, выбери персону — у каждого чата свои параметры Generate.</div>
</div>
</div>
<div class="sa-livebar" id="sa_livebar" hidden>
<span class="sa-spinner" aria-hidden="true"></span>
<span class="sa-livebar-text" id="sa_livebar_text">Работаю…</span>
<span class="sa-elapsed" id="sa_elapsed"></span>
</div>
<div class="sa-composer" id="sa_composer">
<div class="sa-chips" id="sa_chips" role="toolbar" aria-label="Быстрые параметры"></div>
<div class="sa-composer-params" id="sa_composer_params" title="Текущие параметры Generate. Чипы меняют их без автозапуска — Generate: «Собрать + Gen» или /gen."></div>
<div class="sa-lora-chips" id="sa_lora_chips" role="toolbar" aria-label="Активные LoRA"></div>
<div class="sa-slash-wrap">
<textarea id="sa_input" rows="3" placeholder="Промпт, img2img, критика… Enter = отправить (прервёт Writing…) · /help = команды" aria-label="Сообщение Assistent"></textarea>
<div class="sa-slash-menu" id="sa_slash_menu" hidden role="listbox"></div>
</div>
<div class="sa-composer-actions">
<button type="button" class="basic-button sa-primary" id="sa_btn_send">Отправить</button>
<button type="button" class="basic-button sa-btn-gen" id="sa_btn_build_gen" title="Нет патча — Generate с текущим промптом SwarmUI">Собрать + Gen</button>
<button type="button" class="basic-button" id="sa_btn_interrupt" title="Прервать генерацию / чат" hidden>Стоп</button>
<div class="sa-more-wrap" id="sa_clear_more_wrap">
<button type="button" class="basic-button" id="sa_btn_clear" title="Очистить чат">Очистить</button>
<button type="button" class="basic-button sa-icon-btn" id="sa_btn_clear_more" title="Ещё варианты очистки" aria-expanded="false"></button>
<div class="sa-more-menu" id="sa_clear_more_menu" hidden role="menu">
<button type="button" class="sa-more-item" id="sa_btn_clear_confirm" role="menuitem">Очистить весь чат…</button>
<button type="button" class="sa-more-item" id="sa_btn_clear_patches" role="menuitem">Убрать только патчи</button>
</div>
</div>
<span class="sa-status" id="sa_status" role="status" aria-live="polite"></span>
</div>
</div>
</div>
</section>
<aside class="sa-chats-drawer" id="sa_chats_panel" aria-label="Чаты">
<div class="sa-chats-drawer-head">
<span class="sa-chats-drawer-label">Чаты</span>
<div class="sa-chats-drawer-actions">
<button type="button" class="sa-chats-icon-btn" id="sa_btn_new_chat" title="Новый чат" aria-label="Новый чат">
<svg width="14" height="14" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M8 3v10M3 8h10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
</button>
<button type="button" class="sa-chats-icon-btn" id="sa_btn_chats_close" title="Скрыть панель" aria-label="Скрыть чаты">
<svg width="14" height="14" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M4 4l8 8M12 4l-8 8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
</button>
</div>
</div>
<div class="sa-chats-search-wrap">
<svg class="sa-chats-search-ico" width="12" height="12" viewBox="0 0 16 16" fill="none" aria-hidden="true"><circle cx="7" cy="7" r="4.5" stroke="currentColor" stroke-width="1.4"/><path d="M10.5 10.5L14 14" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
<input type="search" class="sa-chats-search" id="sa_chats_search" placeholder="Поиск…" autocomplete="off" aria-label="Поиск по чатам" />
</div>
<div class="sa-chats-list" id="sa_chats_list" role="list"></div>
</aside>
</div>
</div>
</div>
<div class="sa-view" id="sa_view_train" hidden>
<div class="sa-training" id="sa_training">
<div class="sa-training-tabs" role="tablist" aria-label="Разделы обучения">
<button type="button" class="sa-ttab sa-ttab-active" data-ttab="dataset" role="tab" aria-selected="true">Датасет</button>
<button type="button" class="sa-ttab" data-ttab="train" role="tab" aria-selected="false">Тренировка</button>
<button type="button" class="sa-ttab" data-ttab="models" role="tab" aria-selected="false">Модели</button>
</div>
<span class="sa-status sa-train-global-status" id="sa_train_status" role="status"></span>
<div class="sa-training-panes">
<div class="sa-tpane" data-tpane="dataset">
<div class="sa-train-toolbar">
<span class="sa-train-stats" id="sa_train_stats">Одобрено: —</span>
<select id="sa_train_filter_status" class="sa-select" title="Статус">
<option value="all">Все статусы</option>
<option value="approved">Одобренные</option>
<option value="draft">Черновики</option>
<option value="rejected">Отклонённые</option>
</select>
<select id="sa_train_filter_persona" class="sa-select" title="Личность"><option value="all">Все личности</option></select>
<button type="button" class="basic-button" id="sa_btn_train_from_chats">Из чатов</button>
<button type="button" class="basic-button" id="sa_btn_train_import_file">Импорт файла…</button>
<input type="file" id="sa_train_import_file" accept=".jsonl,.json,.csv,text/csv,application/json" hidden />
<button type="button" class="basic-button" id="sa_btn_train_export">Экспорт JSONL</button>
</div>
<div class="sa-agent-heard-panel" id="sa_agent_heard_panel">
<div class="sa-agent-heard-head">
<strong>Услышанное → агент</strong>
<span class="sa-agent-heard-stats" id="sa_agent_heard_stats">Подключено: —</span>
</div>
<p class="sa-agent-heard-hint">Одобренные примеры сразу попадают в RAG агента (без QLoRA). Агент видит их как <code>heard_examples</code> и может запросить через <code>heard_search</code>.</p>
<div class="sa-agent-heard-controls">
<label class="sa-check"><input type="checkbox" id="sa_agent_heard_enabled" checked /> Включено для чата</label>
<label class="sa-check"><input type="checkbox" id="sa_agent_auto_link" checked /> Авто-подключение при одобрении</label>
<label>Примеров в контексте <input type="number" id="sa_agent_heard_quota" min="0" max="8" value="3" /></label>
<button type="button" class="basic-button sa-primary" id="sa_btn_agent_sync">Подключить все одобренные</button>
</div>
</div>
<div class="sa-hf-panel">
<div class="sa-hf-head"><strong>Hugging Face</strong></div>
<div class="sa-hf-search-row">
<input type="search" id="sa_hf_search" class="sa-hf-search" placeholder="Поиск датасетов…" autocomplete="off" />
<button type="button" class="basic-button" id="sa_btn_hf_search">Найти</button>
<label class="sa-check sa-hf-show-all"><input type="checkbox" id="sa_hf_show_all" /> Показать все</label>
</div>
<div class="sa-hf-link-row">
<input type="text" id="sa_hf_link" class="sa-hf-link" placeholder="owner/name или https://huggingface.co/datasets/…" />
<button type="button" class="basic-button" id="sa_btn_hf_check">Проверить</button>
</div>
<div class="sa-hf-status" id="sa_hf_status" role="status"></div>
<div class="sa-hf-list" id="sa_hf_list"></div>
<div class="sa-hf-preview" id="sa_hf_preview" hidden></div>
<div class="sa-hf-mapping-row" id="sa_hf_mapping_row" hidden>
<span class="sa-settings-hint">Маппинг колонок:</span>
<label>Preset
<select id="sa_hf_mapping_preset" class="sa-select">
<option value="">— вручную —</option>
<option value="fiction_tags_text">Fiction: title/tags → text</option>
</select>
</label>
<label>User col <select id="sa_hf_user_col" class="sa-select"></select></label>
<label>Assistant col <select id="sa_hf_asst_col" class="sa-select"></select></label>
</div>
<div class="sa-hf-import-row" id="sa_hf_import_row" hidden>
<label>Лимит строк <input type="number" id="sa_hf_import_limit" min="1" max="5000" value="200" /></label>
<label>Соотношение внешних:своих <input type="number" id="sa_hf_mix_ratio" min="0" max="20" step="0.5" value="3" title="Сколько внешних примеров на один свой" /></label>
<button type="button" class="basic-button sa-primary" id="sa_btn_hf_import">Импортировать</button>
</div>
</div>
<div class="sa-train-samples" id="sa_train_samples"></div>
</div>
<div class="sa-tpane" data-tpane="train" hidden>
<div class="sa-train-modes">
<label class="sa-check"><input type="radio" name="sa_train_mode" value="modelfile" checked /> Быстро: Ollama Modelfile</label>
<label class="sa-check"><input type="radio" name="sa_train_mode" value="qlora" /> QLoRA (нужен python-раннер)</label>
</div>
<div class="sa-train-form" id="sa_train_form_modelfile">
<label>Базовая модель (Ollama)
<select id="sa_modelfile_base" class="sa-select"><option value=""></option></select>
</label>
<label>Имя результата <input type="text" id="sa_modelfile_name" placeholder="assistent-neutral:v1" /></label>
<label>Персона для SYSTEM
<select id="sa_modelfile_persona" class="sa-select"><option value="neutral">neutral</option></select>
</label>
<label>Few-shot примеров <input type="number" id="sa_modelfile_shots" min="0" max="32" value="8" /></label>
<label>SYSTEM (редактируемый) <textarea id="sa_modelfile_system" rows="8" spellcheck="false"></textarea></label>
<div class="sa-settings-row sa-knob-row">
<label>num_ctx <input type="number" id="sa_modelfile_num_ctx" min="2048" max="131072" step="1024" value="16384" /></label>
<label>temperature <input type="number" id="sa_modelfile_temp" min="0" max="2" step="0.05" value="0.7" /></label>
</div>
<button type="button" class="basic-button sa-primary" id="sa_btn_modelfile_create">Создать модель</button>
</div>
<div class="sa-train-form" id="sa_train_form_qlora" hidden>
<p class="sa-settings-hint">Base model — HF id (safetensors). Тренер скачает веса сам (нужен HF_TOKEN в User Settings).</p>
<label>HF base model <input type="text" id="sa_qlora_base" placeholder="Qwen/Qwen2.5-7B-Instruct" /></label>
<label>Ollama base (FROM для ADAPTER)
<select id="sa_qlora_ollama_base" class="sa-select"><option value=""></option></select>
</label>
<label>Имя модели в Ollama <input type="text" id="sa_qlora_name" placeholder="my-lora:v1" /></label>
<div class="sa-settings-row sa-knob-row">
<label>rank <input type="number" id="sa_qlora_rank" min="4" max="128" value="16" /></label>
<label>alpha <input type="number" id="sa_qlora_alpha" min="4" max="256" value="32" /></label>
<label>LR <input type="number" id="sa_qlora_lr" min="0.000001" max="0.01" step="0.00001" value="0.0002" /></label>
<label>epochs <input type="number" id="sa_qlora_epochs" min="1" max="20" value="3" /></label>
<label>seq_len <input type="number" id="sa_qlora_seq" min="512" max="8192" step="256" value="2048" /></label>
<label>max_samples <input type="number" id="sa_qlora_max_samples" min="0" max="50000" value="0" title="0 = все строки" /></label>
</div>
<label class="sa-check"><input type="checkbox" id="sa_qlora_4bit" checked /> 4-bit QLoRA</label>
<label>HF датасет (опционально, без локального датасета) <input type="text" id="sa_qlora_hf_dataset" placeholder="krplt/ru-fictext-nsfw" /></label>
<p class="sa-settings-hint">После обучения: safetensors → GGUF (convert script) → ollama create. Настрой пути в Настройки → Модели.</p>
<button type="button" class="basic-button sa-primary" id="sa_btn_qlora_start">Запустить QLoRA</button>
<button type="button" class="basic-button" id="sa_btn_qlora_cancel" hidden>Отменить</button>
</div>
<div class="sa-train-progress" id="sa_train_progress" hidden>
<div class="sa-train-progress-bar"><div class="sa-train-progress-fill" id="sa_train_progress_fill"></div></div>
<pre class="sa-train-log" id="sa_train_log"></pre>
</div>
</div>
<div class="sa-tpane" data-tpane="models" hidden>
<p class="sa-settings-hint">Обученные и созданные модели (Ollama tags).</p>
<div class="sa-train-models-list" id="sa_train_models_list"></div>
<div class="sa-settings-row">
<button type="button" class="basic-button" id="sa_btn_train_models_refresh">Обновить</button>
</div>
</div>
</div>
</div>
</div>
<div class="sa-view" id="sa_view_settings" hidden>
<div class="sa-settings" id="sa_settings">
<div class="sa-settings-tabs" role="tablist" aria-label="Разделы настроек">
<button type="button" class="sa-stab sa-stab-active" data-stab="behavior" role="tab" aria-selected="true">Поведение</button>
<button type="button" class="sa-stab" data-stab="models" role="tab" aria-selected="false">Модели</button>
<button type="button" class="sa-stab" data-stab="personas" role="tab" aria-selected="false">Личности</button>
<button type="button" class="sa-stab" data-stab="user" role="tab" aria-selected="false">О пользователе</button>
<button type="button" class="sa-stab" data-stab="craft" role="tab" aria-selected="false">Крафт</button>
<button type="button" class="sa-stab" data-stab="more" role="tab" aria-selected="false">Ещё</button>
</div>
<div class="sa-settings-panes">
<div class="sa-spane" data-spane="behavior">
<p class="sa-settings-hint">Автодействия после ответа модели и скилы текущей личности.</p>
<label class="sa-check" title="По умолчанию выкл. Кадр смотрит по кнопке «Посмотри результат», /look, или когда модель сама шлёт look_at. Эта галка — после каждого Generate."><input type="checkbox" id="sa_auto_vision" /> После Generate — look_at кадра</label>
<label class="sa-check"><input type="checkbox" id="sa_auto_apply" checked /> Авто-применять патч</label>
<label class="sa-check" title="Устарело в 0.14: Generate запускает модель через generate:true или кнопки из сессии чата." hidden><input type="checkbox" id="sa_auto_generate" /> Авто-Generate после патча</label>
<label class="sa-check" title="По умолчанию выкл. Критика кадра — кнопка «Посмотри результат» или /look. Галка шлёт JPEG после каждого Generate."><input type="checkbox" id="sa_auto_critique" /> Авто-критика после Generate</label>
<label class="sa-check" title="Выгружает чат-модель перед Generate (keep_alive:0). По умолчанию выкл. Park — no-op если модель уже выгружена; warm после Generate — no-op если /api/ps ещё держит VL. Включай только если Generate падает по VRAM."><input type="checkbox" id="sa_park_llm" /> Park LLM перед Generate (VRAM)</label>
<label class="sa-check sa-danger" title="Опасно — скачивает без Confirm"><input type="checkbox" id="sa_auto_download" /> Авто-скачивание Civitai (выкл)</label>
<div class="sa-skills-label">Скилы (процедуры)</div>
<div class="sa-skills-box" id="sa_skills_box"></div>
</div>
<div class="sa-spane" data-spane="models" hidden>
<p class="sa-settings-hint">Ollama и модель эмбеддингов для крафт-памяти.</p>
<label>Ollama URL <input type="text" id="sa_base_url" value="http://127.0.0.1:11434" /></label>
<label>Модель чата
<select id="sa_settings_chat_model" class="sa-select" title="Синхрон с шапкой">
<option value=""></option>
</select>
</label>
<label>Модель памяти (embed)
<select id="sa_embed_model" class="sa-select" title="Хранение и группировка памяти (use: memory)">
<option value="nomic-embed-text">nomic-embed-text</option>
</select>
</label>
<div class="sa-skills-label">QLoRA-раннер</div>
<label>Python <input type="text" id="sa_runner_python" placeholder="python или полный путь" /></label>
<label>Тип тренера
<select id="sa_runner_kind" class="sa-select">
<option value="builtin" selected>Встроенный (train_qlora.py)</option>
<option value="custom">Custom command</option>
</select>
</label>
<label>GGUF base model (.gguf) <input type="text" id="sa_runner_gguf_base" placeholder="C:/models/base.gguf" title="Базовая GGUF для convert_lora_to_gguf" /></label>
<label>Рабочая директория <input type="text" id="sa_runner_workdir" placeholder="Assistent/training/runner" /></label>
<label>Custom command <input type="text" id="sa_runner_cmd" placeholder="{python} train.py --config {config}" /></label>
<label>convert_lora_to_gguf.py <input type="text" id="sa_runner_gguf_script" placeholder="C:/llama.cpp/convert_lora_to_gguf.py" /></label>
<label>GGUF cmd template <input type="text" id="sa_runner_gguf_cmd" placeholder='"{python}" "{script}" "{base}" "{lora}" "{out}"' /></label>
<div class="sa-settings-row">
<button type="button" class="basic-button" id="sa_btn_refresh_models">Обновить модели</button>
<button type="button" class="basic-button" id="sa_btn_refresh_inventory">Обновить inventory</button>
<button type="button" class="basic-button" id="sa_btn_settings_health">Проверить Ollama</button>
<button type="button" class="basic-button" id="sa_btn_save_runner">Сохранить раннер</button>
</div>
<div class="sa-settings-health" id="sa_settings_health_line">Ollama · …</div>
</div>
<div class="sa-spane" data-spane="personas" hidden>
<p class="sa-settings-hint">Встроенные личности нельзя удалить. Свои — экспорт / импорт / удаление.</p>
<div class="sa-persona-panel">
<div class="sa-persona-list" id="sa_persona_list"></div>
<div class="sa-persona-preview" id="sa_persona_preview">
<div class="sa-mem-empty">Выбери личность слева</div>
</div>
</div>
<div class="sa-settings-row">
<button type="button" class="basic-button" id="sa_btn_persona_export">Экспорт</button>
<button type="button" class="basic-button" id="sa_btn_persona_import">Импорт…</button>
<button type="button" class="basic-button" id="sa_btn_persona_clone">Клонировать</button>
<button type="button" class="basic-button sa-danger-btn" id="sa_btn_persona_delete_panel" disabled title="Только overlay">Удалить</button>
<input type="file" id="sa_persona_import_file" accept=".json,.assistent-persona.json,application/json" hidden />
</div>
</div>
<div class="sa-spane" data-spane="user" hidden>
<p class="sa-settings-hint">Факты о тебе: общие для всех агентов и личные для текущей личности. Вес управляет силой в промпте.</p>
<label>Вес в промпте <span id="sa_user_prefs_weight_val">1.0</span>
<input type="range" id="sa_user_prefs_weight" min="0" max="1.5" step="0.1" value="1" />
</label>
<p class="sa-settings-hint">0 = выкл · 0.5 = кратко · 1 = полный список · &gt;1 = жёстко соблюдать</p>
<div class="sa-user-prefs-cols">
<div>
<div class="sa-mem-head">
<span class="sa-skills-label">Общие</span>
<button type="button" class="basic-button sa-icon-btn" id="sa_btn_pref_add_global" title="Добавить">+</button>
</div>
<div class="sa-mem-list" id="sa_prefs_global"></div>
</div>
<div>
<div class="sa-mem-head">
<span class="sa-skills-label">Для этой личности</span>
<button type="button" class="basic-button sa-icon-btn" id="sa_btn_pref_add_persona" title="Добавить">+</button>
</div>
<div class="sa-mem-list" id="sa_prefs_persona"></div>
</div>
</div>
<div class="sa-settings-row">
<button type="button" class="basic-button" id="sa_btn_prefs_refresh">Обновить</button>
<button type="button" class="basic-button" id="sa_btn_prefs_clear_global">Очистить общие</button>
<button type="button" class="basic-button" id="sa_btn_prefs_clear_persona">Очистить личность</button>
<button type="button" class="basic-button sa-danger-btn" id="sa_btn_prefs_clear_all">Очистить всё</button>
</div>
</div>
<div class="sa-spane" data-spane="craft" hidden>
<p class="sa-settings-hint">Крафт-RAG: LoRA, карточки, pitfalls. Не путать с «О пользователе».</p>
<div class="sa-mem-head">
<span class="sa-skills-label">Крафт-память</span>
<select id="sa_mem_scope" class="sa-select sa-mem-kind" title="Слой">
<option value="all">Все слои</option>
<option value="shared">Общая</option>
<option value="personal">Эта личность</option>
</select>
<select id="sa_mem_kind" class="sa-select sa-mem-kind" title="Фильтр по типу">
<option value="all">Все типы</option>
</select>
<input type="search" id="sa_mem_search" class="sa-mem-search" placeholder="Поиск…" autocomplete="off" />
<button type="button" class="basic-button sa-icon-btn" id="sa_btn_mem_refresh" title="Перечитать память"></button>
</div>
<div class="sa-mem-list" id="sa_mem_list"></div>
<div class="sa-mem-foot">
<span class="sa-mem-total" id="sa_mem_total">Всего: —</span>
</div>
<label>memory_top_k <input type="number" id="sa_memory_top_k" min="1" max="30" step="1" value="10" /></label>
<div class="sa-settings-row">
<button type="button" class="basic-button" id="sa_btn_mem_clear_kind">Очистить тип</button>
<button type="button" class="basic-button" id="sa_btn_mem_clear_persona">Очистить личность</button>
<button type="button" class="basic-button" id="sa_btn_mem_clear_shared">Очистить общую</button>
<button type="button" class="basic-button sa-danger-btn" id="sa_btn_mem_clear_all">Очистить всё крафт</button>
</div>
</div>
<div class="sa-spane" data-spane="more" hidden>
<p class="sa-settings-hint">Контекст Ollama и Exact Turbo/RAW (пишется в overlay).</p>
<label>num_ctx <input type="number" id="sa_num_ctx" min="2048" max="131072" step="1024" value="16384" /></label>
<label>history_keep_turns <input type="number" id="sa_history_keep" min="1" max="32" step="1" value="4" /></label>
<label>compress_at <input type="number" id="sa_compress_at" min="0.4" max="0.95" step="0.05" value="0.7" title="Доля от (num_ctx num_predict)" /></label>
<label>chars_per_token <input type="number" id="sa_chars_per_token" min="1.5" max="8" step="0.1" value="3.2" /></label>
<label class="sa-check"><input type="checkbox" id="sa_compress_auto" checked /> Автосжатие перед отправкой</label>
<div class="sa-skills-label">Exact · Turbo</div>
<div class="sa-settings-row sa-knob-row">
<label>steps <input type="number" id="sa_exact_turbo_steps" min="1" max="64" step="1" /></label>
<label>cfg <input type="number" id="sa_exact_turbo_cfg" min="0.1" max="30" step="0.1" /></label>
<label>σ <input type="number" id="sa_exact_turbo_sigma" min="0.1" max="10" step="0.05" /></label>
</div>
<div class="sa-skills-label">Exact · RAW</div>
<div class="sa-settings-row sa-knob-row">
<label>steps <input type="number" id="sa_exact_raw_steps" min="1" max="64" step="1" /></label>
<label>cfg <input type="number" id="sa_exact_raw_cfg" min="0.1" max="30" step="0.1" /></label>
<label>σ <input type="number" id="sa_exact_raw_sigma" min="0.1" max="10" step="0.05" /></label>
</div>
<div class="sa-settings-row">
<button type="button" class="basic-button sa-primary" id="sa_btn_knobs_save">Сохранить knobs</button>
<button type="button" class="basic-button" id="sa_btn_reset_ui">Сброс UI-state</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>