Simplify project LLM setup

Keep the project creation modal focused on basic project details and Git cloning, without loading model config data. Move project model selection into a collapsed Advanced Settings accordion on the edit screen, and reduce the project LLM UI to a global preset selector plus the existing tune-icon preset editor shortcut.
This commit is contained in:
Alessandro 2026-05-07 03:31:20 +02:00
parent 28a0b35ad4
commit 7b20baebbf
4 changed files with 46 additions and 82 deletions

View file

@ -36,14 +36,6 @@
</div>
</template>
<div class="project-detail-inline-section">
<div class="project-detail-header">
<span class="projects-project-card-title">LLM</span>
</div>
<x-component path="projects/project-edit-llm.html">
</x-component>
</div>
<div class="buttons-right">
<button type="button" class="button cancel"
@click="$store.projects.cancelCreate()"
@ -82,12 +74,6 @@
margin-bottom: 1em;
}
.project-detail-inline-section {
border-top: 1px solid var(--color-border);
margin-top: 1em;
padding-top: 1em;
}
.button-loading {
display: inline-flex;
align-items: center;

View file

@ -4,86 +4,54 @@
<title>Project LLM</title>
<script type="module">
import { store } from "/components/projects/projects-store.js";
import { store as modelConfigStore } from "/plugins/_model_config/webui/model-config-store.js";
</script>
</head>
<body>
<div x-data x-init="await $store.modelConfig.ensureLoaded()">
<template x-if="$store.projects && $store.projects.selectedProject && $store.projects.selectedProject.llm && $store.modelConfig._loaded">
<div>
<div class="projects-form-group">
<label class="projects-form-label">Preset</label>
<span class="projects-form-description">Pick a preset to copy its main and utility model settings into this project. Embeddings stay with the current project config.</span>
<select class="projects-form-select"
x-model="$store.projects.selectedProject.llm.preset_key"
@change="$store.projects.applySelectedLlmPreset()">
<option value="current">Current config</option>
<optgroup label="Global presets">
<div x-data>
<template x-if="$store.projects && $store.projects.selectedProject && $store.projects.selectedProject.llm">
<div class="project-llm-preset-row">
<div class="projects-form-group project-llm-preset-field">
<label class="projects-form-label">Model preset</label>
<div class="projects-input-with-button-wrapper project-llm-preset-controls">
<select class="projects-form-select"
x-model="$store.projects.selectedProject.llm.preset_key"
@change="$store.projects.applySelectedLlmPreset()">
<option value="current">Current project config</option>
<template x-for="preset in $store.projects.selectedProject.llm.global_presets" :key="$store.projects.getLlmPresetKey(preset)">
<option :value="$store.projects.getLlmPresetKey(preset)" x-text="preset.name"></option>
</template>
</optgroup>
<optgroup label="This project's presets">
<template x-for="preset in $store.projects.selectedProject.llm.project_presets" :key="$store.projects.getLlmPresetKey(preset)">
<option :value="$store.projects.getLlmPresetKey(preset)" x-text="preset.name"></option>
</template>
</optgroup>
</select>
</div>
<div class="projects-form-group">
<label class="projects-form-label">Project preset</label>
<template x-if="$store.projects.selectedProject._meta.creating">
<span class="projects-form-description">Create or update a preset stored in this project's <strong>_model_config/presets.yaml</strong> when the project is saved.</span>
</template>
<template x-if="!$store.projects.selectedProject._meta.creating">
<span class="projects-form-description">Create or update a preset stored in <strong><span x-text="$store.projects.getSelectedAbsPath('.a0proj','plugins','_model_config','presets.yaml')"></span></strong>.</span>
</template>
<div class="projects-input-with-button-wrapper">
<input class="projects-form-input" type="text"
x-model="$store.projects.selectedProject.llm.new_preset_name"
placeholder="Preset name">
<button type="button" class="button icon-button"
:disabled="!$store.projects.selectedProject.llm.new_preset_name.trim()"
@click="$store.projects.saveSelectedLlmProjectPreset()">
<span class="icon material-symbols-outlined">save</span>
<span>Save preset</span>
</select>
<button type="button" class="button icon-button project-llm-edit-presets"
@click="openModal('/plugins/_model_config/webui/main.html')">
<span class="icon material-symbols-outlined">tune</span>
<span>Edit Presets</span>
</button>
</div>
</div>
<template x-for="section in $store.modelConfig.MODEL_SECTIONS" :key="section.key">
<div class="project-llm-model-section"
@input.capture="$store.projects.markLlmCurrent()"
@change.capture="$store.projects.markLlmCurrent()"
x-data="{ get model() { return $store.projects.selectedProject.llm.config[section.key]; }, get modelType() { return section.key.replace('_model', ''); }, get providers() { return $store.modelConfig.getProviders(section.key); }, get searchType() { return $store.modelConfig.getSearchType(section.key); }, apiKeyMode: 'store' }">
<div class="project-llm-section-title" x-text="section.title"></div>
<div class="project-llm-section-description" x-text="section.desc"></div>
<x-component path="/plugins/_model_config/webui/model-field.html"></x-component>
</div>
</template>
</div>
</template>
</div>
</body>
<style>
.project-llm-model-section {
border-top: 1px dashed var(--color-border);
margin-top: 1em;
padding-top: 1em;
.project-llm-preset-row {
max-width: 100%;
}
.project-llm-section-title {
font-size: 0.95rem;
font-weight: 700;
margin-bottom: 0.25em;
.project-llm-preset-field {
margin-bottom: 0;
}
.project-llm-section-description {
font-size: 0.8rem;
opacity: 0.75;
margin-bottom: 0.8em;
.project-llm-preset-controls {
align-items: stretch;
}
.project-llm-preset-controls select {
min-width: 0;
}
.project-llm-edit-presets {
flex: 0 0 auto;
}
</style>

View file

@ -32,14 +32,19 @@
</div>
<x-component path="projects/project-edit-basic-data.html">
</x-component>
</div>
<div class="project-detail">
<div class="project-detail-header">
<span class="projects-project-card-title">LLM</span>
<div class="settings-advanced-section project-advanced-section" x-data="{ advOpen: false }">
<button type="button" class="settings-advanced-toggle" @click="advOpen = !advOpen">
<span class="material-symbols-outlined settings-advanced-toggle-icon"
:style="advOpen ? 'transform:rotate(90deg)' : ''">chevron_right</span>
<span>Advanced Settings</span>
</button>
<div class="settings-advanced-body" x-show="advOpen" x-transition.opacity style="display: none;">
<x-component path="projects/project-edit-llm.html">
</x-component>
</div>
</div>
<x-component path="projects/project-edit-llm.html">
</x-component>
</div>
<div class="project-detail">
@ -104,6 +109,12 @@
.project-detail-header {
margin-bottom: 1em;
}
.project-advanced-section {
border-top: 1px solid var(--color-border);
margin-top: 1em;
padding-top: 0.5em;
}
</style>
</html>

View file

@ -410,7 +410,6 @@ const model = {
color: "",
git_url: "",
git_token: "",
llm: await this._createProjectLlmData(""),
};
},