- Add standalone Models tab with real-time quota/status display - Move model identity table from Dashboard to Models tab - Slim down Dashboard to KPI cards and charts only - Dashboard charts now use unfiltered data (independent of Models filters) Settings > Models improvements: - Remove redundant Alias column (only Mapping is functional) - Fix column misalignment bug (empty td) - Add column widths and hidden row opacity styling - Single row edit constraint (only one Mapping editable at a time) - showHiddenModels toggle now only affects Settings (not Models tab) - Update description text to match current functionality i18n: - Add 'models' and 'modelsPageDesc' keys (EN/ZH) - Add 'modelMappingHint' for Claude CLI guidance - Update 'modelsDesc' to reflect new functionality
70 lines
2.0 KiB
JavaScript
70 lines
2.0 KiB
JavaScript
/**
|
|
* Model Manager Component
|
|
* Handles model configuration (pinning, hiding, aliasing, mapping)
|
|
* Registers itself to window.Components for Alpine.js to consume
|
|
*/
|
|
window.Components = window.Components || {};
|
|
|
|
window.Components.modelManager = () => ({
|
|
// Track which model is currently being edited (null = none)
|
|
editingModelId: null,
|
|
|
|
init() {
|
|
// Component is ready
|
|
},
|
|
|
|
/**
|
|
* Start editing a model's mapping
|
|
* @param {string} modelId - The model to edit
|
|
*/
|
|
startEditing(modelId) {
|
|
this.editingModelId = modelId;
|
|
},
|
|
|
|
/**
|
|
* Stop editing
|
|
*/
|
|
stopEditing() {
|
|
this.editingModelId = null;
|
|
},
|
|
|
|
/**
|
|
* Check if a model is being edited
|
|
* @param {string} modelId - The model to check
|
|
*/
|
|
isEditing(modelId) {
|
|
return this.editingModelId === modelId;
|
|
},
|
|
|
|
/**
|
|
* Update model configuration with authentication
|
|
* @param {string} modelId - The model ID to update
|
|
* @param {object} configUpdates - Configuration updates (pinned, hidden, alias, mapping)
|
|
*/
|
|
async updateModelConfig(modelId, configUpdates) {
|
|
const store = Alpine.store('global');
|
|
try {
|
|
const { response, newPassword } = await window.utils.request('/api/models/config', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ modelId, config: configUpdates })
|
|
}, store.webuiPassword);
|
|
|
|
if (newPassword) store.webuiPassword = newPassword;
|
|
|
|
if (!response.ok) {
|
|
throw new Error('Failed to update model config');
|
|
}
|
|
|
|
// Optimistic update
|
|
Alpine.store('data').modelConfig[modelId] = {
|
|
...Alpine.store('data').modelConfig[modelId],
|
|
...configUpdates
|
|
};
|
|
Alpine.store('data').computeQuotaRows();
|
|
} catch (e) {
|
|
store.showToast('Failed to update model config: ' + e.message, 'error');
|
|
}
|
|
}
|
|
});
|