π€ General Widget Manager
Beheer de algemene ITLive widget die op itlive.nl wordt getoond
βοΈ Widget Configuratie
π Embed Code Generator
Genereer embed code om de widget op externe websites te plaatsen.
π RAG Documents
Upload en beheer documents voor RAG (Retrieval Augmented Generation). AI gebruikt deze voor betere context.
Voegt Admin-pagina's en Klantportaal-beschrijving toe aan RAG.
Bestaande RAG Documents
Nog geen RAG documents. Voeg er een toe!
π Kennis Base
Voeg ITLive-specifieke kennis toe die de widget kan gebruiken om klanten te helpen.
Huidige Kennis Base Preview:
Geen kennis base content.
π Training Data
Voeg vraag-antwoord paren toe om de widget te trainen op specifieke vragen.
Bestaande Training Data
Nog geen training data. Voeg er een toe!
π§ Snel Widget Installeren - Wizard
Volg deze stappen om de widget snel in te stellen en te installeren.
Stap 1: Basis Configuratie β
Ga naar de βοΈ Configuratie tab en vul de basisinstellingen in:
- Widget Naam
- Widget Titel
- Welkomstbericht
- System Prompt
Stap 2: AI Instellingen β
Configureer AI in de π€ AI Instellingen tab:
- Max Tokens (aanbevolen: 2000)
- Temperature (aanbevolen: 0.7)
- Schakel RAG in voor betere context
- Schakel Persistent Memory in voor chat geschiedenis
Stap 3: RAG Documents Toevoegen (Optioneel)
Voeg relevante documents toe in de π RAG Documents tab voor betere AI context:
- Prijzen informatie
- Diensten overzicht
- Support informatie
- Technische documentatie
Stap 4: Instructies Toevoegen (Optioneel)
Maak instructies in de π Instructies tab om AI gedrag te sturen:
- Altijd vriendelijk zijn
- Specifieke diensten benadrukken
- Call-to-action toevoegen
Stap 5: Embed Code KopiΓ«ren π
Kopieer de embed code uit de π Embed Code tab en plak deze op je website:
<script src="https://portal.itlive.nl/admin_portal/widgets/general-widget-embed.js?token=GENERATE_TOKEN"></script>
π‘ Tips
- Test de widget eerst in de ποΈ Preview tab
- Zorg dat AI Providers zijn geconfigureerd in Admin β AI Providers
- RAG documents verbeteren de kwaliteit van AI antwoorden aanzienlijk
- Persistent memory zorgt voor betere context in langere gesprekken
- Meerdere instructies kunnen elkaar aanvullen
π₯ Automatische Widget Generatie voor Klanten
Genereer automatisch AI widgets voor klanten op basis van hun bedrijfsgegevens, RAG index en services.
Voer het klant ID in om automatisch een widget te genereren met AI op basis van klantgegevens.
Gegenereerde Klant Widgets
π Widget Analytics
Bekijk statistieken en gebruik van de widgets.
ποΈ Widget Preview
Test hoe de widget eruit ziet en werkt
`;
document.getElementById('embed-code-html').value = embedCode;
});
// Save embed settings
document.getElementById('embed-enabled')?.addEventListener('change', async function() {
const res = await fetch('/admin_portal/api/general-widget-api.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ action: 'save-embed-settings', embed_enabled: this.checked })
});
const result = await res.json();
if (result.success) {
showAlert('embed-alert', 'β
Embed instellingen opgeslagen!', 'success');
}
});
// RAG document form
document.getElementById('rag-form')?.addEventListener('submit', async (e) => {
e.preventDefault();
const formData = new FormData();
formData.append('action', 'add-rag-document');
formData.append('title', document.getElementById('rag-title').value);
formData.append('category', document.getElementById('rag-category').value);
formData.append('content', document.getElementById('rag-content').value);
const fileInput = document.getElementById('rag-file');
if (fileInput.files.length > 0) {
formData.append('file', fileInput.files[0]);
}
const res = await fetch('/admin_portal/api/general-widget-api.php', {
method: 'POST',
body: formData
});
const result = await res.json();
if (result.success) {
showAlert('rag-alert', 'β
RAG document toegevoegd!', 'success');
document.getElementById('rag-form').reset();
setTimeout(() => location.reload(), 1000);
} else {
showAlert('rag-alert', 'β Fout: ' + result.message, 'error');
}
});
async function deleteRAGDocument(id) {
if (!confirm('Weet je zeker dat je dit RAG document wilt verwijderen?')) return;
const res = await fetch('/admin_portal/api/general-widget-api.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ action: 'delete-rag-document', id: id })
});
const result = await res.json();
if (result.success) {
location.reload();
} else {
alert('Fout: ' + result.message);
}
}
document.getElementById('btn-index-portal-data')?.addEventListener('click', async function() {
const btn = this;
btn.disabled = true;
btn.textContent = 'Bezigβ¦';
const res = await fetch('/admin_portal/api/general-widget-api.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ action: 'index-portal-data' })
});
const result = await res.json();
btn.disabled = false;
btn.textContent = 'π Indexeer met portaldata';
if (result.success) {
showAlert('rag-alert', 'β
' + result.message, 'success');
setTimeout(() => location.reload(), 1200);
} else {
showAlert('rag-alert', 'β ' + (result.message || 'Fout bij indexeren'), 'error');
}
});
// Instructions form
document.getElementById('instructions-form')?.addEventListener('submit', async (e) => {
e.preventDefault();
const data = {
action: 'add-instruction',
instruction_name: document.getElementById('instruction-name').value,
instruction_text: document.getElementById('instruction-text').value,
priority: parseInt(document.getElementById('instruction-priority').value),
is_active: document.getElementById('instruction-active').checked
};
if (!data.instruction_name || !data.instruction_text) {
showAlert('instructions-alert', 'β Naam en tekst zijn verplicht', 'error');
return;
}
const res = await fetch('/admin_portal/api/general-widget-api.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
const result = await res.json();
if (result.success) {
showAlert('instructions-alert', 'β
Instructie toegevoegd!', 'success');
document.getElementById('instructions-form').reset();
setTimeout(() => location.reload(), 1000);
} else {
showAlert('instructions-alert', 'β Fout: ' + result.message, 'error');
}
});
async function toggleInstruction(id, isActive) {
const res = await fetch('/admin_portal/api/general-widget-api.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ action: 'toggle-instruction', id: id, is_active: isActive })
});
const result = await res.json();
if (result.success) {
location.reload();
} else {
alert('Fout: ' + result.message);
}
}
async function deleteInstruction(id) {
if (!confirm('Weet je zeker dat je deze instructie wilt verwijderen?')) return;
const res = await fetch('/admin_portal/api/general-widget-api.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ action: 'delete-instruction', id: id })
});
const result = await res.json();
if (result.success) {
location.reload();
} else {
alert('Fout: ' + result.message);
}
}
function showAlert(containerId, message, type) {
const container = document.getElementById(containerId);
if (!container) return;
container.innerHTML = `
${message}
`;
setTimeout(() => {
container.innerHTML = '';
}, 5000);
}
// Customer widgets functions
async function generateCustomerWidget() {
const customerId = parseInt(document.getElementById('customer-id-widget').value);
if (!customerId || customerId <= 0) {
showAlert('customer-widgets-alert', 'β Voer een geldig klant ID in', 'error');
return;
}
const btn = event.target;
btn.disabled = true;
btn.textContent = 'Bezig met genereren...';
try {
const res = await fetch('/admin_portal/api/general-widget-api.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
action: 'generate-customer-widget',
customer_id: customerId
})
});
const result = await res.json();
if (result.success) {
showAlert('customer-widgets-alert', 'β
Widget succesvol gegenereerd! Embed token: ' + result.embed_token, 'success');
loadCustomerWidgets();
} else {
showAlert('customer-widgets-alert', 'β Fout: ' + result.message, 'error');
}
} catch (error) {
showAlert('customer-widgets-alert', 'β Fout: ' + error.message, 'error');
} finally {
btn.disabled = false;
btn.textContent = 'π€ Genereer Widget voor Klant';
}
}
async function loadCustomerWidgets() {
const res = await fetch('/admin_portal/api/general-widget-api.php?action=list-customer-widgets');
const data = await res.json();
const container = document.getElementById('customer-widgets-list');
if (!data.success || !data.widgets || data.widgets.length === 0) {
container.innerHTML = '
Nog geen klant widgets gegenereerd.
';
return;
}
container.innerHTML = data.widgets.map(widget => `
Embed Token: ${widget.embed_token}
Welkomstbericht: ${widget.welcome_message || 'Geen'}
`).join('');
}
async function deleteCustomerWidget(id) {
if (!confirm('Weet je zeker dat je deze klant widget wilt verwijderen?')) return;
// TODO: Add delete endpoint
alert('Delete functionaliteit komt binnenkort');
}
async function loadAnalytics() {
// TODO: Implement analytics loading
document.getElementById('total-sessions').textContent = '0';
document.getElementById('total-messages').textContent = '0';
document.getElementById('active-widgets').textContent = '1';
}