{% include 'includes/loading_overlay.html' %}

DictIA DictIA

{% with messages = get_flashed_messages(with_categories=true) %} {% if messages %} {% for category, message in messages %}
{{ message }}
{% endfor %} {% endif %} {% endwith %}

${t('adminDashboard.userManagement')}

${t('adminDashboard.id')} ${t('adminDashboard.username')} ${t('adminDashboard.email')} ${t('adminDashboard.admin')} ${t('adminDashboard.publicShare')} ${t('adminDashboard.recordings')} ${t('adminDashboard.storageUsed')} ${t('adminDashboard.actions')}
${ user.id } ${ user.username } ${ user.email } Yes No ${ user.recordings_count } ${ formatFileSize(user.storage_used) }
Loading users...
No users found.

${t('adminDashboard.systemStatistics')}

${t('adminDashboard.totalUsers')}

${ stats.total_users }

${t('adminDashboard.totalRecordings')}

${ stats.total_recordings }

${t('adminDashboard.totalStorage')}

${ formatFileSize(stats.total_storage) }

${t('adminDashboard.totalQueries')}

${ stats.total_queries }

${t('adminDashboard.recordingStatusDistribution')}

${ stats.completed_recordings } ${t('adminDashboard.completedRecordings')}
${ stats.processing_recordings } ${t('adminDashboard.processingRecordings')}
${ stats.pending_recordings } ${t('adminDashboard.pendingRecordings')}
${ stats.failed_recordings } ${t('adminDashboard.failedRecordings')}

${t('adminDashboard.topUsersByStorage')}

${ user.username }
${ formatFileSize(user.storage_used) } (${ user.recordings_count} recordings)
No data available

Token Usage Statistics

Usage Summary

Today

${ tokenStats.today?.tokens?.toLocaleString() || 0 }

This Month

${ tokenStats.current_month?.tokens?.toLocaleString() || 0 }

Monthly Cost

$${ (tokenStats.current_month?.cost || 0).toFixed(4) }

Warnings

${ tokenStats.users_at_100_percent } blocked ${ tokenStats.users_over_80_percent } warning None

User Token Usage (This Month)
${ user.username }
${ user.current_usage?.toLocaleString() || 0 } / ${ user.monthly_budget?.toLocaleString() } (unlimited)
No token usage data available
Daily Token Usage (Last 30 Days)
Monthly Token Usage (Last 12 Months)

${t('adminDashboard.transcriptionUsage')}

Usage Summary

${t('adminDashboard.todaysMinutes')}

${ transcriptionStats.today?.minutes || 0 }

${t('adminDashboard.thisMonth')}

${ transcriptionStats.current_month?.minutes || 0 } min

${t('adminDashboard.monthlyCost')}

$${ (transcriptionStats.current_month?.cost || 0).toFixed(4) }

${t('adminDashboard.budgetWarnings')}

${ transcriptionStats.users_at_100_percent } ${t('adminDashboard.blocked')} ${ transcriptionStats.users_over_80_percent } ${t('adminDashboard.warning')} ${t('adminDashboard.none')}

${t('adminDashboard.userTranscriptionUsage')}
${ user.username }
${ user.current_usage_minutes || 0 } min / ${ user.monthly_budget_minutes } min (unlimited)
${t('adminDashboard.noTranscriptionData')}

${t('adminDashboard.systemSettings')}

${ setting.key }

${ getSettingDescription(setting) }

${ setting.setting_type } ${t('adminDashboard.lastUpdated')}: ${ formatDate(setting.updated_at) }
Enabled Disabled ${t('adminDashboard.noLimit')} ${ Number(setting.value).toLocaleString() } ${t('adminDashboard.characters')} ${ Number(setting.value).toLocaleString() } ${t('adminDashboard.megabytes')} ${ Number(setting.value).toLocaleString() } ${t('adminDashboard.seconds')} ${ setting.value.substring(0, 80) }... ${ setting.value || t('adminDashboard.notSet') }
Loading settings...
No system settings found.

${t('adminDashboard.defaultPrompts')}

${t('adminDashboard.defaultPromptInfo')}

${t('adminDashboard.promptDescription')}

${ promptSaveMessage }

${t('adminDashboard.promptHierarchy')}

${t('adminDashboard.promptPriorityDescription')}

  1. ${t('adminDashboard.tagCustomPrompt')}: ${t('adminDashboard.tagCustomPromptDesc')}
  2. Folder Custom Prompt: Applied when recording is in a folder with a custom prompt (if Folders feature enabled)
  3. ${t('adminDashboard.userCustomPrompt')}: ${t('adminDashboard.userCustomPromptDesc')}
  4. ${t('adminDashboard.adminDefaultPrompt')}: ${t('adminDashboard.adminDefaultPromptDesc')}
  5. ${t('adminDashboard.systemFallback')}: ${t('adminDashboard.systemFallbackDesc')}
${t('adminDashboard.systemPrompt')}:
You are an AI assistant that generates comprehensive summaries for meeting transcripts. Respond only with the summary in Markdown format. Do NOT use markdown code blocks (```markdown). Provide raw markdown content directly.

Context:
- Current date: {current_date}
- Tags applied to this transcript by the user: {tag_names} (if tags exist)
- Information about the user: Name: {name}, Job title: {job_title}, Company: {company} (if provided)

Language Requirement: You MUST generate the entire summary in {user_output_language}. This is mandatory. (if language preference is set)
${t('adminDashboard.userMessageTemplate')}:
Transcription:
"""
{transcript_text}
"""

Summarization Instructions:
/* This section is dynamically replaced with one of the following (in order of priority):
   1. Combined tag prompts (if tags with custom prompts are selected)
   2. User's personal summarization prompt (if set in account settings)
   3. Admin default prompt (shown below)
   4. System fallback prompt */
${ defaultSummaryPrompt || originalDefaultPrompt }

{language_directive} (e.g., "Ensure your response is in {language}." if language is set)

${t('adminDashboard.placeholdersNote')}

${t('adminDashboard.additionalContext')}:
  • ${t('adminDashboard.contextNotes.transcriptLimit')}
  • ${t('adminDashboard.contextNotes.jsonConversion')}
  • ${t('adminDashboard.contextNotes.tagPrompts')}
  • ${t('adminDashboard.contextNotes.modelConfig')}

${t('adminDashboard.vectorStoreManagement')}

${t('adminDashboard.aboutInquireMode')}

${t('adminDashboard.inquireModeDescription')}

${t('adminDashboard.chunkSize')}: 500 ${t('adminDashboard.characters')}
${t('adminDashboard.overlap')}: 50 ${t('adminDashboard.characters')}
${t('adminDashboard.embeddingModel')}: all-MiniLM-L6-v2
${t('adminDashboard.vectorDimensions')}: 384

${t('adminDashboard.totalRecordings')}

${ inquireStatus.total_completed_recordings || 0 }

${t('adminDashboard.processedForInquire')}

${ inquireStatus.processed_for_inquire || 0 }

${t('adminDashboard.needProcessing')}

${ inquireStatus.need_processing || 0 }

${t('adminDashboard.totalChunks')}

${ inquireStatus.total_chunks || 0 }

${t('adminDashboard.embeddingsStatus')}

${ inquireStatus.embeddings_available ? t('adminDashboard.available') : t('adminDashboard.textSearchOnly') }

${t('adminDashboard.processingProgress')}

${ getProcessingProgress() }% ${t('adminDashboard.complete')}

${t('adminDashboard.processingActions')}

${t('adminDashboard.recordingsNeedProcessing').replace('{{count}}', inquireStatus.need_processing)}

${ processingResult.message }

Failed recordings:

  • ID ${ fail.id }: ${ fail.title } - ${ fail.reason }

${t('adminDashboard.allRecordingsProcessed')}

${t('adminDashboard.vectorStoreUpToDate')}

Group Management

${t('adminDashboard.groupName')} ${t('adminDashboard.description')} ${t('adminDashboard.members')} ${t('adminDashboard.created')} ${t('adminDashboard.actions')}
${ group.name }
${ group.description || t('adminDashboard.noDescription') }
${ group.member_count || 0 } ${t('adminDashboard.membersCount')}
${ new Date(group.created_at).toLocaleDateString() }

Journal d'audit

Journal d'audit désactivé

Ajoutez ENABLE_AUDIT_LOG=true dans le fichier .env pour activer la traçabilité Loi 25.

Chargement des journaux...

Date Utilisateur Action Ressource Statut IP
${ formatDate(log.timestamp) } ${ log.username || 'Anonyme' } ${ auditActionLabel(log.action) } ${ auditResourceLabel(log.resource_type) } #${ log.resource_id } ${ log.status } ${ log.ip_address || '-' }

Aucun log d'accès enregistré

Date Utilisateur Action IP Détails
${ formatDate(log.timestamp) } ${ log.username || '-' } ${ auditActionLabel(log.action) } ${ log.ip_address || '-' } ${ log.details ? JSON.stringify(log.details) : '-' }

Aucun log d'authentification enregistré

Page ${ auditPage } de ${ auditTotalPages } (${ auditSubTab === 'access' ? auditAccessTotal : auditAuthTotal } entrées)

${t('adminDashboard.addNewUser')}

${t('adminDashboard.tokenBudgetHelp')}

${t('adminDashboard.transcriptionBudgetHelp')}

${t('adminDashboard.editUser')}

${t('adminDashboard.tokenBudgetHelp')}

${t('adminDashboard.currentUsage')}: ${ editingUser.current_token_usage?.toLocaleString() || 0 } ${t('adminDashboard.tokens')} ${ editingUser.token_usage_percentage || 0 }%

${t('adminDashboard.transcriptionBudgetHelp')}

${t('adminDashboard.currentUsageMinutes')}: ${ editingUser.current_transcription_usage_minutes || 0 } ${t('adminDashboard.minutes')} ${ editingUser.transcription_usage_percentage || 0 }%

Confirm Delete

Are you sure you want to delete the user ${ userToDelete?.username }? This action cannot be undone.

Edit System Setting

${ editingSetting.key }
${ editingSetting.description || 'No description available' }
${ editingSetting.setting_type }
${t('adminDashboard.noLimit')} ${ Number(editingSetting.value).toLocaleString() } ${t('adminDashboard.characters')} ${ Number(editingSetting.value).toLocaleString() } ${t('adminDashboard.megabytes')} ${ Number(editingSetting.value).toLocaleString() } ${t('adminDashboard.seconds')} (${ Math.round(Number(editingSetting.value) / 60) } ${t('adminDashboard.minutes')}) ${ editingSetting.value || t('adminDashboard.notSet') }
Recommended: 30000-50000 characters for most LLMs
${t('adminDashboard.maxFileSizeHelp')}
${t('adminDashboard.minutes')}
${t('adminDashboard.seconds')}
${t('adminDashboard.total')}: ${ (settingTimeoutMinutes * 60 + settingTimeoutSeconds).toLocaleString() } ${t('adminDashboard.seconds')}
${t('adminDashboard.timeoutRecommendation')}
${ settingError }

${ editingTeam ? 'Edit Group' : 'Create Group' }

${ teamError }

Manage Group: ${ currentTeam?.name }

Add Member

Current Members (${ teamMembers.length })

${ member.username }
${ member.email }
${t('adminDashboard.noMembersYet')}
${ teamMemberError }

Sync Group Shares

This will create shares for all recordings with group tags that have auto-sharing enabled.

Only missing shares will be created - existing shares won't be duplicated.

Sync Complete

Shares created: ${ syncResults.shares_created }
Recordings processed: ${ syncResults.recordings_processed }

Delete Group

Are you sure you want to delete the group ${ teamToDelete?.name }? This will remove all members from the group. This action cannot be undone.

Manage Tags for ${ currentTeam?.name }

${ editingTeamTagId ? 'Edit Group Tag' : 'Create New Group Tag' }

Recordings with this tag will use this prompt for AI summaries and chat.

Les enregistrements avec cette étiquette seront supprimés après ce nombre de jours. Laisser vide pour la rétention globale (${ globalRetentionDays } jours).

Note : Si les deux sont activés, tous les membres du groupe auront accès. Si seulement « administrateurs du groupe » est activé, seuls les responsables du groupe y auront accès.

${ teamTagError }

Group Tags

${ tag.name }
${ tag.retention_days } day retention Global retention Protected
Custom prompt configured
Language: ${ tag.default_language.toUpperCase() }
Speakers: ${ tag.default_min_speakers }-${ tag.default_max_speakers }auto

No group tags created yet