Dashboard
Vue d'ensemble des sessions actives (derniere 2h)
{{ stat.label }}
Sessions recentes
| Session | App | Flow | Resultat | Steps | Duree | Platform | Date | TTL |
|---|---|---|---|---|---|---|---|---|
| {{ session.session_id?.substring(0, 12) }}... | {{ session.app_id }} | {{ session.status }} | {{ session.result?.status || session.final_result?.overall_status }} - | {{ session.steps_order?.join(', ') || '-' }} | {{ session.total_duration_ms ? (session.total_duration_ms / 1000).toFixed(1) + 's' : '-' }} | {{ session.client?.platform || '-' }} | {{ formatDate(session.created_at) }} | {{ sessionTTL(session) }} |
| Aucune session dans les 2 dernieres heures | ||||||||
Statistiques d'utilisation
Sessions par jour
Consommation du mois (toutes applications)
Sessions
Rechercher et explorer les sessions de verification
{{ sessionTotal }} session(s) trouvee(s)
| Session | App | Flow | Resultat | Steps | Duree | Platform | Date | TTL |
|---|---|---|---|---|---|---|---|---|
| {{ s.session_id?.substring(0, 12) }}... | {{ s.app_id }} | {{ s.status }} | {{ s.result?.status || s.final_result?.overall_status }} - | {{ s.steps_order?.join(', ') || '-' }} | {{ s.total_duration_ms ? (s.total_duration_ms / 1000).toFixed(1) + 's' : '-' }} | {{ s.client?.platform || '-' }} | {{ formatDate(s.created_at) }} | {{ sessionTTL(s.created_at) }} |
| Recherche en cours... Lancez une recherche pour afficher les sessions | ||||||||
Applications
Gerer les applications et cles API
{{ app.name }}
{{ app.app_id }}Aucune application
{{ detailApp.name }}
{{ detailApp.status }} {{ detailApp.billing?.plan || 'free' }} {{ detailApp.billing.billing_mode === 'per_session' ? 'Par session' : 'Par operation' }} Fixe: {{ formatCurrency(detailApp.billing.monthly_fixed_fee) }} XOF/mois{{ detailApp.app_id }}
Informations generales
Types de documents & options
Documents autorises
Cles API
| Nom | Cle (masquee) | Status | Creee | Actions |
|---|---|---|---|---|
| {{ k.name }} | {{ maskApiKey(k.api_key) }} | {{ k.status }} | {{ formatDate(k.created_at) }} |
|
| Aucune cle API | ||||
Cle regeneree avec succes — Copiez-la maintenant, elle ne sera plus affichee
{{ rotatedNewKey }}
Utilisation par cle API
| Cle | Requetes totales | Derniere utilisation | Ce mois |
|---|---|---|---|
| {{ k.name }} | {{ k.usage_stats?.total_requests || 0 }} | {{ k.usage_stats?.last_used_at ? formatDate(k.usage_stats.last_used_at) : 'Jamais' }} | {{ Object.values(val || {}).reduce((s,v) => s + (typeof v === 'number' ? v : 0), 0) }} ops - |
Quotas par type de session
Securite — {{ selectedKey.name }}
Restrictions d'acces pour cette cle
Cles temporaires
| Cle | Nom | Expire | Utilisations | Status |
|---|---|---|---|---|
| {{ tk.temp_key?.substring(0, 12) }}... | {{ tk.name || '-' }} | {{ formatDate(tk.expires_at) }} | {{ tk.used_count || 0 }} | revoque expire active |
Echecs Webhook (24h)
{{ webhookFailuresTotal }} echec(s)| Event | Session | URL | Tentatives | Erreur | Date |
|---|---|---|---|---|---|
| {{ wf.event }} | {{ wf.session_id?.substring(0, 10) }}... | {{ wf.webhook_url }} | {{ wf.attempts }} | {{ wf.last_error }} | {{ formatDate(wf.created_at) }} |
Utilisateurs de cette application
{{ appUsers.length }} utilisateur(s)| Nom | Role | Status | Actions | |
|---|---|---|---|---|
| {{ u.name }} | {{ u.email }} | {{ u.role }} | {{ u.status }} |
|
Aucun utilisateur attache a cette application
Statut & Actions
{{ detailApp.status === 'active' ? 'Les cles API de cette application sont fonctionnelles.' : detailApp.status === 'suspended' ? 'Les cles API sont temporairement desactivees.' : 'Les cles API sont desactivees. Reactivez pour restaurer l\'acces.' }}
Configuration Tarifs
{{ editingApp?.app_name || editingApp?.name }} — {{ editingApp?.app_id }}
Quotas mensuels inclus
Operations gratuites par mois. Au-dela, le prix de depassement s'applique.
Prix de depassement (XOF)
Prix par operation au-dela du quota mensuel inclus.
Simulateur de cout
Entrez le volume prevu par jour ou par mois pour estimer le cout mensuel.
| Operation | Volume {{ simMode === 'day' ? '/jour' : '/mois' }} | Total/mois | Inclus | Depassement | Cout |
|---|---|---|---|---|---|
| {{ field.label }} | {{ simMonthly(field.key) }} | {{ simIncluded(field.key) }} | {{ simOverage(field.key) }} | {{ formatCurrency(simCost(field.key)) }} | |
| Cout mensuel estime | {{ formatCurrency(totalSimulatedCost) }} XOF | ||||
Tarifs enregistres avec succes
Plan {{ pricingForm.plan }} — les nouveaux tarifs sont actifs immediatement.
Documents
Types de documents configures dans le systeme
{{ doc.name }}
Aucun document configure
{{ selectedDocument.name || selectedDocument.doc_type }}
{{ selectedDocument.doc_type }}Configuration complete
{{ JSON.stringify(selectedDocument, null, 2) }}
Plans
Gerer les plans tarifaires globaux
Chargement des plans...
{{ plan.name }}
{{ plan.description }}
Aucun plan configure
{{ creatingNewPlan ? 'Nouveau Plan' : 'Modifier: ' + editingPlan.name }}
Identifiant unique (lowercase, underscores)
Quotas mensuels inclus
0 = pas de limite specifique pour ce type de session
Tarifs unitaires
Tarifs hors-forfait
Features
Utilisateurs
Gerer les comptes utilisateurs
| Nom | Role | App | Status | Actions | |
|---|---|---|---|---|---|
| {{ u.name }} | {{ u.email }} | {{ u.role }} | {{ appName(u.app_id) }} ({{ u.app_id }}) - | {{ u.status }} |
|
Settings LLM
Configuration des providers IA et routage des requetes
Stats en temps reel (depuis redemarrage)
| Route:Provider | Requetes | Succes | Echecs API | Tokens in | Tokens out | Latence moy. |
|---|---|---|---|---|---|---|
| {{ key }} | {{ stat.total_requests }} | {{ stat.successes }} | {{ stat.api_failures }} | {{ formatNumber(stat.total_input_tokens) }} | {{ formatNumber(stat.total_output_tokens) }} | {{ stat.total_requests > 0 ? Math.round(stat.total_latency_ms / stat.total_requests) + 'ms' : '-' }} |
Historique par jour / provider
| Date | Route | Provider | Modele | Requetes | Succes | Echecs | Tokens in | Tokens out | Latence moy. |
|---|---|---|---|---|---|---|---|---|---|
| {{ stat.date }} | {{ stat.route }} | {{ stat.provider }} | {{ stat.model?.split('/').pop() }} | {{ stat.total_requests }} | {{ stat.successes }} | {{ stat.api_failures }} | {{ formatNumber(stat.total_input_tokens) }} | {{ formatNumber(stat.total_output_tokens) }} | {{ stat.avg_latency_ms ? Math.round(stat.avg_latency_ms) + 'ms' : '-' }} |
Routage des requetes
Tarification LLM (USD / million tokens)
| Provider/Modele | Input $/M | Output $/M | |
|---|---|---|---|
| {{ key }} |
Providers & Cles API
Fallback automatique
Analyse & Prompts
Face Identification (1:N)
Chargement...
Tarification LLM (USD / 1M tokens)
| Provider / Modele | Input $/M | Output $/M | |
|---|---|---|---|
| {{ key }} |
{{ Object.keys(llmSettings.llm.pricing || {}).length }} entree(s) — Les prix sont utilises pour calculer le cout par session (total_cost_usd)
Chargement des settings...
Configuration
Edition JSON des documents Elasticsearch — 50 derniers changements conserves
Chargement de la configuration...
Historique des versions
Restaurer la version {{ restoreVersion.version }} ?
Du {{ new Date(restoreVersion.updated_at).toLocaleString('fr-FR') }} par {{ restoreVersion.updated_by || 'inconnu' }}.
Entrez votre mot de passe pour confirmer.
Selectionnez un document a modifier
Registre d'Identites
Personnes identifiees par KYC (recto+verso PASS)
| Identifiant | Champs principaux | Document | Soumissions | Cree par | Date |
|---|---|---|---|---|---|
|
{{ id.identifier_value }}
{{ id.identifier_key }}
|
{{ f.label }}: {{ f.value }}
|
{{ id.document_type }} {{ id.country }} 🧬 | {{ id.submissions_count || 1 }} | {{ id.created_by_app }} | {{ formatDate(id.created_at) }} |
Aucune identite trouvee
Les identites sont creees automatiquement lors de sessions KYC PASS avec recto+verso
| Identifiant | Type | App | Session | Face Match | Date |
|---|---|---|---|---|---|
| {{ sub.identifier_value }} | {{ sub.document_type }} | {{ sub.app_id }} | {{ sub.session_id?.substring(0, 12) }}... | {{ sub.face_match_score.toFixed(1) }}% - | {{ formatDate(sub.submitted_at) }} |
Aucune soumission
Migrations
Historique des migrations Elasticsearch
| ID | Description | Statut | Duree | Execute le |
|---|---|---|---|---|
| {{ m.migration_id }} | {{ m.description }} | {{ m.status === 'completed' ? 'OK' : 'FAILED' }} DESTRUCTIVE | {{ m.duration_ms ? m.duration_ms + 'ms' : '—' }} | {{ m.executed_at ? new Date(m.executed_at).toLocaleString('fr-FR') : '—' }} |
python3 migrate.py pour initialiser.
python3 migrate.py --status pour voir les migrations en attente.
python3 migrate.py pour executer les migrations.
Analyse des couts
Suivi des couts LLM par provider, modele et route
Cout total
Requetes totales
Tokens totaux
Cout moyen / requete
Provider le + utilise
Provider le + cher
Evolution des couts par jour
Repartition par provider
| Provider | Modele | Route | Requetes {{ costProviderSort === 'requests' ? '▲' : costProviderSort === '-requests' ? '▼' : '' }} | Tokens in | Tokens out | Cout USD {{ costProviderSort === 'cost' ? '▲' : costProviderSort === '-cost' ? '▼' : '' }} | Cout FCFA | Latence moy. | Echecs |
|---|---|---|---|---|---|---|---|---|---|
| {{ p.provider }} | {{ p.model?.split('/').pop() }} | {{ p.route }} | {{ formatNumber(p.total_requests) }} | {{ formatNumber(p.total_input_tokens) }} | {{ formatNumber(p.total_output_tokens) }} | ${{ p.total_cost_usd?.toFixed(4) }} | {{ formatCurrency(Math.round((p.total_cost_usd || 0) * 561.5)) }} | {{ p.avg_latency_ms ? Math.round(p.avg_latency_ms) + 'ms' : '-' }} | {{ p.api_failures || 0 }} |
| Aucune donnee pour cette periode | |||||||||
Detail quotidien
| Date | Provider | Modele | Route | Requetes | Succes | Echecs | Tokens in | Tokens out | Cout USD | Cout FCFA | Latence moy. |
|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ rec.date }} | {{ rec.provider }} | {{ rec.model?.split('/').pop() }} | {{ rec.route }} | {{ rec.total_requests }} | {{ rec.successes }} | {{ rec.api_failures || 0 }} | {{ formatNumber(rec.total_input_tokens) }} | {{ formatNumber(rec.total_output_tokens) }} | ${{ (rec.estimated_cost_usd || 0).toFixed(4) }} | {{ formatCurrency(Math.round((rec.estimated_cost_usd || 0) * 561.5)) }} | {{ rec.avg_latency_ms ? Math.round(rec.avg_latency_ms) + 'ms' : '-' }} |
| Aucune donnee pour cette periode | |||||||||||
Taux de change : 1 USD = 561,50 FCFA. Les couts sont estimes a partir du pricing configure dans Settings LLM.
Les donnees sont issues de l'index kyvshield_llm_stats.
Liste personnalisee
Entrees personnalisees verifiees lors du screening AML
Chargement...
| Nom | Date naiss. | Nationalite | Risque | Raison | Ajoute par | Date | Actif | Actions |
|---|---|---|---|---|---|---|---|---|
| {{ entry.full_name || (entry.first_name + ' ' + entry.last_name) }} | {{ entry.birth_date || '-' }} | {{ entry.nationality || '-' }} | {{ entry.risk_level }} | {{ entry.reason }} | {{ entry.added_by }} | {{ entry.added_at ? new Date(entry.added_at).toLocaleDateString('fr-FR') : '-' }} | {{ entry.is_active ? 'Oui' : 'Non' }} |
|
Aucune entree dans la liste personnalisee
Ajoutez des personnes a surveiller lors du screening AML
{{ editWatchlistEntry ? 'Modifier l\'entree' : 'Nouvelle entree' }}
Verification AML
Screening AML/Sanctions manuel et historique
| Nom | Score | Sources | Topics |
|---|---|---|---|
| {{ m.name }} | {{ (m.score * 100).toFixed(0) }}% | {{ (m.datasets || []).join(', ') }} | {{ (m.topics || []).join(', ') }} |
JSON brut
{{ JSON.stringify(amlScreeningResult, null, 2) }}
| Nom | Nationalite | Statut | Risque | Matches | Source | Duree | Date |
|---|---|---|---|---|---|---|---|
| {{ item.query?.full_name || '-' }} | {{ item.query?.nationality || '-' }} | {{ item.result?.status }} | {{ item.result?.risk_level }} | {{ item.result?.total_matches || 0 }} | {{ item.source || 'standalone' }} | {{ item.duration_ms }}ms | {{ item.created_at ? new Date(item.created_at).toLocaleString('fr-FR') : '-' }} |
{{ JSON.stringify(amlHistoryDetail, null, 2) }}
Aucun screening AML enregistre
Facturation
Consommation et couts par application
| Operation | Utilise | Inclus | Depassement | Prix unit. | Cout |
|---|---|---|---|---|---|
| {{ row.label }} | {{ row.used }} | {{ row.included }} | {{ row.overage }} | {{ row.unitPrice }} XOF | {{ formatCurrency(row.cost) }} |
| Abonnement fixe | {{ formatCurrency(selectedAppBilling.monthly_fixed_fee) }} | ||||
| Sous-total operations | {{ formatCurrency(selectedMonthData.costs.total) }} | ||||
| Total | {{ formatCurrency((selectedAppBilling?.monthly_fixed_fee || 0) + selectedMonthData.costs.total) }} XOF | ||||
Detail journalier - {{ selectedBillingMonth }}
Historique mensuel
Aucune donnee de facturation
Identification
Identification faciale (1:N) et verification faciale (1:1)
Rechercher une personne parmi les identites KYC existantes a partir d'une photo de visage.
Glissez ou cliquez pour charger une photo
1 a 10, defaut 3
0.0 a 1.0, defaut 0.6
| Nom | Score | Document | N° Identite | Pays |
|---|---|---|---|---|
| {{ m.full_name || '-' }} | {{ (m.score * 100).toFixed(1) }}% | {{ m.document_type || '-' }} | {{ m.identifier_value || '-' }} | {{ m.country || '-' }} |
JSON brut
{{ JSON.stringify(idIdentifyResult, null, 2) }}
Comparer deux visages pour verifier s'il s'agit de la meme personne.
Visage de reference
Selfie ou photo
JSON brut
{{ JSON.stringify(fvResult, null, 2) }}
| Date | Type | App | Resultats / Match | Score | Duree |
|---|---|---|---|---|---|
| {{ item.created_at ? new Date(item.created_at).toLocaleString('fr-FR') : '-' }} | {{ item.type || (item.results_count != null ? 'identify' : 'face_verify') }} | {{ item.app_id || '-' }} | {{ item.results_count || 0 }} resultat(s) {{ item.is_match ? 'MATCH' : 'NO MATCH' }} | {{ (item.top_score * 100).toFixed(1) }}% {{ (item.similarity_score * 100).toFixed(1) }}% - | {{ item.duration_ms }}ms |
Aucune recherche enregistree