Add Knowledge Hub books FTS and remove training UI (0.16.0).
Index Assistent/books search.jsonl, expose knowledge hops/catalog in chat, and drop QLoRA/HF training stack. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -10,13 +10,8 @@
|
||||
</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">
|
||||
@@ -161,140 +156,6 @@
|
||||
</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
|
||||
<select id="sa_qlora_base" class="sa-select"><option value="">— выберите модель —</option></select>
|
||||
</label>
|
||||
<label id="sa_qlora_base_custom_row" hidden>Другая модель (HF id)
|
||||
<input type="text" id="sa_qlora_base_custom" placeholder="org/model-name" />
|
||||
</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">После QLoRA/Modelfile — итог здесь и в списке Ollama. Выбери модель в шапке Assistent или ⚙ → Модели.</p>
|
||||
<div class="sa-train-last-job" id="sa_train_last_job" hidden></div>
|
||||
<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="Разделы настроек">
|
||||
@@ -330,24 +191,10 @@
|
||||
<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>
|
||||
@@ -358,6 +205,14 @@
|
||||
<div class="sa-persona-preview" id="sa_persona_preview">
|
||||
<div class="sa-mem-empty">Выбери личность слева</div>
|
||||
</div>
|
||||
<div class="sa-knowledge-panel" id="sa_knowledge_panel" hidden>
|
||||
<div class="sa-mem-head"><span class="sa-skills-label">Знания (books)</span></div>
|
||||
<p class="sa-settings-hint" id="sa_knowledge_hint">FTS-корпуса для ask:knowledge. Bundled/pack — только просмотр; overlay — редактируемо.</p>
|
||||
<div class="sa-knowledge-list" id="sa_knowledge_list"></div>
|
||||
<div class="sa-settings-row">
|
||||
<button type="button" class="basic-button sa-primary" id="sa_btn_knowledge_save" hidden>Сохранить attach</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sa-settings-row">
|
||||
<button type="button" class="basic-button" id="sa_btn_persona_export">Экспорт</button>
|
||||
|
||||
Reference in New Issue
Block a user