feat: implement web UI for provider and model configuration
- Added 'provider_configs' and 'model_configs' tables to database. - Refactored ProviderManager to support thread-safe dynamic updates and database overrides. - Implemented 'Models' tab in dashboard to manage model visibility, mapping, and pricing. - Added provider configuration modal to 'Providers' tab. - Integrated database overrides into chat completion logic (enabled state, mapping, and cost).
This commit is contained in:
@@ -124,7 +124,64 @@ class ProvidersPage {
|
||||
}
|
||||
|
||||
configureProvider(id) {
|
||||
window.authManager.showToast('Provider configuration via UI not yet implemented', 'info');
|
||||
const provider = this.providers.find(p => p.id === id);
|
||||
if (!provider) return;
|
||||
|
||||
const modal = document.createElement('div');
|
||||
modal.className = 'modal active';
|
||||
modal.innerHTML = `
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h3 class="modal-title">Configure ${provider.name}</h3>
|
||||
<button class="modal-close" onclick="this.closest('.modal').remove()">
|
||||
<i class="fas fa-times"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="form-control">
|
||||
<label class="checkbox-label" style="display: flex; align-items: center; gap: 0.5rem; cursor: pointer;">
|
||||
<input type="checkbox" id="provider-enabled" ${provider.enabled ? 'checked' : ''} style="width: auto;">
|
||||
<span>Enable Provider</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-control">
|
||||
<label for="provider-base-url">Base URL</label>
|
||||
<input type="text" id="provider-base-url" value="${provider.base_url || ''}" placeholder="Default: ${provider.id === 'ollama' ? 'http://localhost:11434/v1' : 'Standard API URL'}">
|
||||
</div>
|
||||
<div class="form-control">
|
||||
<label for="provider-api-key">API Key (Optional / Overwrite)</label>
|
||||
<input type="password" id="provider-api-key" placeholder="••••••••••••••••">
|
||||
<small>Leave blank to keep existing key from .env or config.toml</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-secondary" onclick="this.closest('.modal').remove()">Cancel</button>
|
||||
<button class="btn btn-primary" id="save-provider-config">Save Configuration</button>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
document.body.appendChild(modal);
|
||||
|
||||
modal.querySelector('#save-provider-config').onclick = async () => {
|
||||
const enabled = modal.querySelector('#provider-enabled').checked;
|
||||
const baseUrl = modal.querySelector('#provider-base-url').value;
|
||||
const apiKey = modal.querySelector('#provider-api-key').value;
|
||||
|
||||
try {
|
||||
await window.api.put(`/providers/${id}`, {
|
||||
enabled,
|
||||
base_url: baseUrl || null,
|
||||
api_key: apiKey || null
|
||||
});
|
||||
|
||||
window.authManager.showToast(`${provider.name} configuration saved`, 'success');
|
||||
modal.remove();
|
||||
this.loadProviders();
|
||||
} catch (error) {
|
||||
window.authManager.showToast(error.message, 'error');
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
setupEventListeners() {
|
||||
|
||||
Reference in New Issue
Block a user