Étape 1 - Ouvrez vos données de limitation de taux
Tout d'abord, récupérez vos informations d'utilisation et de quota actuelles directement à partir de Perplexity.
- Assurez-vous d'être connecté à votre compte Perplexity dans votre navigateur.
- Ouvrir ce lien dans un nouvel onglet :
Votre navigateur affichera un bloc de texte JSON - il s'agit de vos données de limite de taux en direct (combien de messages, de recherches, etc. vous pouvez utiliser).
Sélectionnez tout ce qui se trouve sur cette page (Ctrl/⌘ + A, alors Ctrl/⌘ + C) pour le copier.
Étape 2 - Ouvrez vos données de paramétrage
Ensuite, récupérez les détails de votre plan, les limites de fichiers, les connecteurs et les préférences.
- Ouvrir ce lien dans un nouvel onglet :
Cette page présente un autre bloc JSON contenant les détails de votre abonnement, les limites de fichiers et de pages, ainsi que la configuration du connecteur.
Sélectionnez à nouveau tout le texte de la page et copiez-le (Ctrl/⌘ + A, alors Ctrl/⌘ + C).
Étape 3 - Collez vos données dans le tableau de bord
Vous avez maintenant deux blocs JSON : un pour vos limites de taux et un pour vos paramètres de compte.
- Retourner à cette page.
- Coller le limite de taux JSON dans le premier champ de saisie.
- Coller le paramètres JSON dans le deuxième champ de saisie.
- Cliquez sur “Visualiser mes limites” pour transformer vos données brutes en un aperçu propre et interactif de votre utilisation, de vos quotas et de vos connecteurs.
Vos données sont uniquement utilisées dans votre navigateur à des fins de visualisation. Vous gardez le contrôle total de ce que vous collez et partagez.
:root {
–bg-primary: #0a0a0f;
–bg-secondary: #12121a;
–bg-card : #1a1a24 ;
–bg-card-hover : #222230 ;
–text-primary : #ffffff ;
–text-secondary: #a0a0b0;
–text-muted: #6b6b7b;
–accent-primary: #6366f1;
–accent-secondary : #8b5cf6 ;
–accent-success : #10b981 ;
–accent-warning : #f59e0b ;
–accent-danger : #ef4444 ;
–accent-info : #3b82f6 ;
–border-color : #2a2a3a ;
–shadow : 0 4px 6px -1px rgba(0, 0, 0, 0,3), 0 2px 4px -1px rgba(0, 0, 0, 0,2);
–shadow-lg : 0 20px 25px -5px rgba(0, 0, 0, 0,4), 0 10px 10px -5px rgba(0, 0, 0, 0,3);
–radius: 12px;
–radius-sm: 8px;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: ‘Inter’, -apple-system, BlinkMacSystemFont, sans-serif;
background: var(–bg-primary);
color: var(–text-primary);
min-height: 100vh;
line-height: 1.6;
}
.container {
max-width: 1400px;
margin: 0 auto;
padding: 2rem;
}
/* En-tête */
.header {
text-align: center;
margin-bottom: 3rem;
padding: 2rem 0;
}
.header h1 {
font-size: 2.5rem;
font-weight: 700;
background: linear-gradient(135deg, var(–accent-primary), var(–accent-secondary));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: 0.5rem;
}
.header p {
color: var(–text-secondary);
font-size: 1.1rem;
}
/* Section de saisie */
.input-section {
background: var(–bg-card);
border-radius: var(–radius);
padding: 2rem;
margin-bottom: 2rem;
border: 1px solid var(–border-color);
}
.input-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 1rem;
}
.input-header h2 {
font-size: 1.25rem;
font-weight: 600;
display: flex;
align-items: center;
gap: 0.5rem;
}
.input-header h2::before {
content: “ 📋 ”;
}
.btn-group {
display: flex;
gap: 0.5rem;
}
.btn {
padding: 0.5rem 1rem;
border-radius: var(–radius-sm);
border: none;
font-size: 0.875rem;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
}
.btn-primary {
background: linear-gradient(135deg, var(–accent-primary), var(–accent-secondary));
color: white;
}
.btn-primary:hover {
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(99, 102, 241, 0.4);
}
.btn-secondary {
background: var(–bg-secondary);
color: var(–text-primary);
border: 1px solid var(–border-color);
}
.btn-secondary:hover {
background: var(–bg-card-hover);
}
.json-input {
width: 100%;
min-height: 200px;
background: var(–bg-secondary);
border: 1px solid var(–border-color);
border-radius: var(–radius-sm);
padding: 1rem;
color: var(–text-primary);
font-family: ‘JetBrains Mono’, ‘Fira Code’, monospace;
font-size: 0.875rem;
resize: vertical;
transition: border-color 0.2s ease;
}
.json-input:focus {
outline: none;
border-color: var(–accent-primary);
}
.json-input::placeholder {
color: var(–text-muted);
}
/* Grille du tableau de bord */
.dashboard {
display: none;
animation: fadeIn 0.5s ease;
}
.dashboard.active {
display: block;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
/* En-têtes de section */
.section-header {
display: flex;
align-items: center;
gap: 0.75rem;
margin: 2rem 0 1rem 0;
padding-bottom: 0.75rem;
border-bottom : 1px solid var(–border-color) ;
}
.section-header h2 {
font-size : 1.5rem ;
font-weight : 600 ;
}
.section-icon {
width: 40px;
height: 40px;
border-radius: var(–radius-sm);
display: flex;
align-items: center;
justify-content: center;
font-size: 1.25rem;
}
.icon-purple { background: rgba(99, 102, 241, 0.2); }
.icon-green { background: rgba(16, 185, 129, 0.2); }
.icon-blue { background: rgba(59, 130, 246, 0.2); }
.icon-orange { background: rgba(245, 158, 11, 0.2); }
.icon-red { background: rgba(239, 68, 68, 0.2); }
/* Grille de cartes */
.cards-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1.5rem;
margin-bottom: 2rem;
}
.card {
background: var(–bg-card);
border-radius: var(–radius);
padding: 1,5rem;
border: 1px solid var(–border-color);
transition: all 0,3s ease;
position : relative ;
overflow : hidden ;
}
.card::before {
content : ” ;
position : absolute ;
top : 0 ;
left : 0 ;
right : 0 ;
height: 3px;
background: linear-gradient(90deg, var(–accent-primary), var(–accent-secondary));
opacity: 0;
transition: opacity 0.3s ease;
}
.card:hover {
transform : translateY(-4px) ;
box-shadow : var(–shadow-lg) ;
border-color : var(–accent-primary) ;
}
.card:hover::before {
opacity : 1 ;
}
.card-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 1rem;
}
.card-title {
font-size: 0.875rem;
font-weight: 500;
color: var(–text-secondary);
text-transform: uppercase;
letter-spacing: 0.05em;
}
.card-badge {
padding: 0,25rem 0,75rem;
border-radius: 9999px;
font-size: 0,75rem;
font-weight: 600;
}
.badge-success {
background: rgba(16, 185, 129, 0.2);
color: var(–accent-success);
}
.badge-warning {
background: rgba(245, 158, 11, 0.2);
color: var(–accent-warning);
}
.badge-danger {
background: rgba(239, 68, 68, 0.2);
color: var(–accent-danger);
}
.badge-info {
background: rgba(59, 130, 246, 0.2);
color: var(–accent-info);
}
.card-value {
taille de police : 2rem ;
épaisseur de police : 700 ;
marge inférieure : 0,5rem ;
}
.card-description {
taille de police : 0,875 rem ;
couleur : var(–text-muted) ;
}
/* Barre de progression */
.progress-container {
marge supérieure : 1 rem ;
}
.progress-header {
display: flex;
justify-content: space-between;
taille de police : 0,75 rem;
couleur : var(–text-muted);
marge inférieure : 0,5 rem;
}
.progress-bar {
height: 8px;
background: var(–bg-secondary);
border-radius: 9999px;
overflow: hidden;
}
.progress-fill {
height: 100%;
border-radius : 9999px ;
transition : width 0.5s ease ;
}
.progress-success { background : linear-gradient(90deg, var(–accent-success), #34d399) ; }
.progress-warning { background: linear-gradient(90deg, var(–accent-warning), #fbbf24); }
.progress-danger { background: linear-gradient(90deg, var(–accent-danger), #f87171); }
.progress-info { background: linear-gradient(90deg, var(–accent-info), #60a5fa); }
/* Tableau des sources */
.sources-table {
width: 100%;
border-collapse: collapse;
background: var(–bg-card);
border-radius: var(–radius);
overflow: hidden;
border: 1px solid var(–border-color);
}
.sources-table th,
.sources-table td {
padding: 1rem 1.5rem;
text-align: left;
}
.sources-table th {
background: var(–bg-secondary);
font-weight: 600;
font-size: 0.875rem;
color: var(–text-secondary);
text-transform: uppercase;
letter-spacing: 0.05em;
}
.sources-table tr {
border-bottom: 1px solid var(–border-color);
}
.sources-table tr:last-child {
border-bottom: none;
}
.sources-table td {
font-size: 0.875rem;
}
.source-name {
display: flex;
align-items: center;
gap: 0.75rem;
}
.source-icon {
width: 32px;
height: 32px;
border-radius: var(–radius-sm);
background: var(–bg-secondary);
display: flex;
align-items: center;
justify-content: center;
font-size: 1rem;
}
.limit-value {
font-weight: 600;
}
.limit-unlimited {
color: var(–accent-success);
}
.limit-zero {
color: var(–accent-danger);
}
.limit-normal {
color: var(–text-primary);
}
/* Grille des connecteurs */
.connectors-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 1rem;
}
.connector-card {
background: var(–bg-card);
border-radius: var(–radius-sm);
padding : 1rem ;
border : 1px solid var(–border-color) ;
display : flex ;
align-items : center ;
gap : 1rem ;
}
.connector-status {
width : 12px ;
height: 12px;
border-radius: 50%;
flex-shrink: 0;
}
.status-connected {
background: var(–accent-success);
box-shadow : 0 0 8px var(–accent-success);
}
.status-disconnected {
background : var(–text-muted);
}
.connector-info {
flex : 1;
}
.connector-name {
font-weight: 500;
font-size: 0.875rem;
}
.connector-type {
font-size: 0.75rem;
color: var(–text-muted);
}
/* Message d’erreur */
.error-message {
background: rgba(239, 68, 68, 0.1);
border: 1px solid var(–accent-danger);
border-radius: var(–radius-sm);
padding: 1rem;
margin-top: 1rem;
color: var(–accent-danger);
display: none;
}
.error-message.active {
display: block;
}
/* État vide */
.empty-state {
text-align: center;
padding: 4rem 2rem;
color: var(–text-muted);
}
.empty-state-icon {
font-size: 4rem;
margin-bottom: 1rem;
opacity: 0.5;
}
/* Adaptatif */
@media (max-width: 768px) {
.container {
padding: 1rem;
}
.header h1 {
font-size: 1.75rem;
}
.cards-grid {
grid-template-columns: 1fr;
}
.sources-table {
taille de police : 0,75rem;
}
.sources-table th,
.sources-table td {
padding: 0,75rem;
}
.input-header {
flex-direction: column;
gap: 1rem;
align-items: flex-start;
}
}
/* Animations */
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
.pulse {
animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}
/* Barre de défilement */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: var(–bg-secondary);
}
::-webkit-scrollbar-thumb {
background: var(–border-color);
border-radius : 4px ;
}
::-webkit-scrollbar-thumb:hover {
background : var(–text-muted) ;
}
| Source |
Limite mensuelle |
Restant |
Statut |
📊
Pas de données à afficher
Collez vos données JSON ci-dessus et cliquez sur “Parse Data” pour visualiser vos limites.
// Example data
const example1 = `{“model_specific_limits”:{},”remaining_agentic_research”:0,”remaining_labs”:24,”remaining_pro”:600,”remaining_research”:20,”sources”:{“source_to_limit”:{“asana_mcp_merge”:{“monthly_limit”:null,”remaining”:null},”box”:{“monthly_limit”:0,”remaining”:0},”cbinsights_mcp_cashmere”:{“monthly_limit”:5,”remaining”:5},”confluence_mcp_merge”:{“monthly_limit”:null,”remaining”:null},”crunchbase”:{“monthly_limit”:0,”remaining”:0},”dropbox”:{“monthly_limit”:null,”remaining”:null},”factset”:{“monthly_limit”:0,”remaining”:0},”gcal”:{“monthly_limit”:null,”remaining”:null},”github_mcp_direct”:{“monthly_limit”:null,”remaining”:null},”google_drive”:{“monthly_limit”:null,”remaining”:null},”jira_mcp_merge”:{“monthly_limit”:null,”remaining”:null},”linear_alt”:{“monthly_limit”:null,”remaining”:null},”microsoft_teams_mcp_merge”:{“monthly_limit”:null,”remaining”:null},”notion_mcp”:{“monthly_limit”:null,”remaining”:null},”onedrive”:{“monthly_limit”:0,”remaining”:0},”org”:{“monthly_limit”:0,”remaining”:0},”outlook”:{“monthly_limit”:null,”remaining”:null},”pitchbook_mcp_cashmere”:{“monthly_limit”:5,”remaining”:5},”scholar”:{“monthly_limit”:null,”remaining”:null},”sharepoint”:{“monthly_limit”:0,”remaining”:0},”slack_direct”:{“monthly_limit”:null,”remaining”:null},”social”:{“monthly_limit”:null,”remaining”:null},”statista_mcp_cashmere”:{“monthly_limit”:5,”remaining”:5},”web”:{“monthly_limit”:null,”remaining”:null},”wiley_mcp_cashmere”:{“monthly_limit”:5,”remaining”:5}}}}`;
const example2 = `{“pages_limit”:100,”upload_limit”:50,”create_limit”:99,”article_image_upload_limit”:500,”max_files_per_user”:500,”max_files_per_repository”:50,”connector_limits”:{“repo_type_limits”:{“COLLECTION”:{“max_files”:50,”max_folders”:50},”HEALTH”:{“max_files”:200,”max_folders”:200}},”global_file_count”:500,”max_file_size_mb”:50,”max_attachment_file_size_mb”:50,”daily_attachment_limit”:500,”weekly_attachment_limit”:null,”daily_attachment_limit_non_priority_country”:null},”sources”:{“source_to_limit”:{“web”:{“monthly_limit”:null,”remaining”:null},”scholar”:{“monthly_limit”:null,”remaining”:null},”social”:{“monthly_limit”:null,”remaining”:null},”google_drive”:{“monthly_limit”:null,”remaining”:null},”gcal”:{“monthly_limit”:null,”remaining”:null},”dropbox”:{“monthly_limit”:null,”remaining”:null},”notion_mcp”:{“monthly_limit”:null,”remaining”:null},”outlook”:{“monthly_limit”:null,”remaining”:null},”linear_alt”:{“monthly_limit”:null,”remaining”:null},”github_mcp_direct”:{“monthly_limit”:null,”remaining”:null},”asana_mcp_merge”:{“monthly_limit”:null,”remaining”:null},”slack_direct”:{“monthly_limit”:null,”remaining”:null},”jira_mcp_merge”:{“monthly_limit”:null,”remaining”:null},”confluence_mcp_merge”:{“monthly_limit”:null,”remaining”:null},”microsoft_teams_mcp_merge”:{“monthly_limit”:null,”remaining”:null},”wiley_mcp_cashmere”:{“monthly_limit”:5,”remaining”:5},”cbinsights_mcp_cashmere”:{“monthly_limit”:5,”remaining”:5},”pitchbook_mcp_cashmere”:{“monthly_limit”:5,”remaining”:5},”statista_mcp_cashmere”:{“monthly_limit”:5,”remaining”:5}}},”has_ai_profile”:false,”referral_code”:”Q7N0LPC8″,”referral_num_success”:0,”referral_num_coupons”:0,”stripe_status”:”active”,”revenuecat_status”:”none”,”revenuecat_source”:”none”,”subscription_status”:”active”,”subscription_source”:”stripe”,”subscription_tier”:”yearly”,”coupon_metadata”:{“name”:”Deutsche Telekom HR”,”logo_image_url”:null,”logo_dark_image_url”:null,”accent_color”:null,”expires_at”:”2026-01-15T00:00:00″,”coupon_duration”:null,”coupon_duration_days”:null,”coupon_amount”:null,”coupon_percent”:null,”coupon_id”:”yglW31iG”,”promo_code_id”:”promo_1R1CDbGZwjqPfxkZrmz5rHc3″,”default_locale”:null,”has_custom_notifications”:false},”default_model”:”turbo”,”default_image_generation_model”:”gemini-flash”,”default_video_generation_model”:”default”,”query_count”:59,”query_count_copilot”:54,”query_count_mobile”:0,”disable_training”:false,”is_sidebar_collapsed”:null,”default_copilot”:null,”notif_status”:”daily”,”email_status”:”daily”,”time_zone”:”Europe/Berlin”,”device_language”:”en-US”,”discover_homepage_enabled”:false,”always_allow_browser_agent”:false,”has_accepted_api_terms”:false,”has_data_retention_warning”:false,”is_verified”:false,”allow_article_creation”:true,”connectors”:{“connectors”:[{“name”:”google_drive”,”auth_type”:”oauth”,”connected”:false,”error”:null,”picker_credentials”:null,”connection_display_name”:null,”connection_uuid”:null,”has_required_scopes”:null,”source_id”:”google_drive”,”connection_type”:”GOOGLE_DRIVE”,”capabilities”:{“direct_api_search”:true,”high_precision_search”:true,”file_upload”:true},”disabled_capabilities”:[]},{“name”:”gcal”,”auth_type”:”oauth”,”connected”:false,”error”:null,”picker_credentials”:null,”connection_display_name”:null,”connection_uuid”:null,”has_required_scopes”:null,”source_id”:”gcal”,”connection_type”:”GCAL”,”capabilities”:{},”disabled_capabilities”:[]},{“name”:”dropbox”,”auth_type”:”oauth”,”connected”:false,”error”:null,”picker_credentials”:null,”connection_display_name”:null,”connection_uuid”:null,”has_required_scopes”:null,”source_id”:”dropbox”,”connection_type”:”DROPBOX”,”capabilities”:{“direct_api_search”:true,”high_precision_search”:true,”file_upload”:true},”disabled_capabilities”:[]},{“name”:”edgar”,”auth_type”:”none”,”connected”:false,”error”:null,”picker_credentials”:null,”connection_display_name”:null,”connection_uuid”:null,”has_required_scopes”:null,”source_id”:”edgar”,”connection_type”:null,”capabilities”:{},”disabled_capabilities”:[]},{“name”:”outlook”,”auth_type”:”oauth”,”connected”:false,”error”:null,”picker_credentials”:null,”connection_display_name”:null,”connection_uuid”:null,”has_required_scopes”:null,”source_id”:”outlook”,”connection_type”:”OUTLOOK”,”capabilities”:{},”disabled_capabilities”:[]},{“name”:”linear_alt”,”auth_type”:”oauth”,”connected”:false,”error”:null,”picker_credentials”:null,”connection_display_name”:null,”connection_uuid”:null,”has_required_scopes”:null,”source_id”:”linear_alt”,”connection_type”:”LINEAR_ALT”,”capabilities”:{},”disabled_capabilities”:[]},{“name”:”notion_mcp”,”auth_type”:”oauth”,”connected”:false,”error”:null,”picker_credentials”:null,”connection_display_name”:null,”connection_uuid”:null,”has_required_scopes”:null,”source_id”:”notion_mcp”,”connection_type”:”NOTION_MCP”,”capabilities”:{},”disabled_capabilities”:[]},{“name”:”github_mcp_direct”,”auth_type”:”oauth”,”connected”:false,”error”:null,”picker_credentials”:null,”connection_display_name”:null,”connection_uuid”:null,”has_required_scopes”:null,”source_id”:”github_mcp_direct”,”connection_type”:”GITHUB_MCP_DIRECT”,”capabilities”:{},”disabled_capabilities”:[]},{“name”:”asana_mcp_merge”,”auth_type”:”oauth”,”connected”:false,”error”:null,”picker_credentials”:null,”connection_display_name”:null,”connection_uuid”:null,”has_required_scopes”:null,”source_id”:”asana_mcp_merge”,”connection_type”:”ASANA_MCP_MERGE”,”capabilities”:{},”disabled_capabilities”:[]},{“name”:”slack_direct”,”auth_type”:”oauth”,”connected”:false,”error”:null,”picker_credentials”:null,”connection_display_name”:null,”connection_uuid”:null,”has_required_scopes”:null,”source_id”:”slack_direct”,”connection_type”:”SLACK_DIRECT”,”capabilities”:{},”disabled_capabilities”:[]},{“name”:”jira_mcp_merge”,”auth_type”:”oauth”,”connected”:false,”error”:null,”picker_credentials”:null,”connection_display_name”:null,”connection_uuid”:null,”has_required_scopes”:null,”source_id”:”jira_mcp_merge”,”connection_type”:”JIRA_MCP_MERGE”,”capabilities”:{},”disabled_capabilities”:[]},{“name”:”confluence_mcp_merge”,”auth_type”:”oauth”,”connected”:false,”error”:null,”picker_credentials”:null,”connection_display_name”:null,”connection_uuid”:null,”has_required_scopes”:null,”source_id”:”confluence_mcp_merge”,”connection_type”:”CONFLUENCE_MCP_MERGE”,”capabilities”:{},”disabled_capabilities”:[]},{“name”:”microsoft_teams_mcp_merge”,”auth_type”:”oauth”,”connected”:false,”error”:null,”picker_credentials”:null,”connection_display_name”:null,”connection_uuid”:null,”has_required_scopes”:null,”source_id”:”microsoft_teams_mcp_merge”,”connection_type”:”MICROSOFT_TEAMS_MCP_MERGE”,”capabilities”:{},”disabled_capabilities”:[]}]}}`;
// Source icons mapping
const sourceIcons = {
web: ‘🌐’,
scholar: ‘🎓’,
social: ‘💬’,
google_drive: ‘📁’,
gcal: ‘📅’,
dropbox: ‘📦’,
notion_mcp: ‘📝’,
outlook: ‘📧’,
linear_alt: ‘📊’,
github_mcp_direct: ‘💻’,
asana_mcp_merge: ‘✅’,
slack_direct: ‘💬’,
jira_mcp_merge: ‘📋’,
confluence_mcp_merge: ‘📚’,
microsoft_teams_mcp_merge: ‘👥’,
wiley_mcp_cashmere: ‘📖’,
cbinsights_mcp_cashmere: ‘💡’,
pitchbook_mcp_cashmere: ‘💰’,
statista_mcp_cashmere: ‘📈’,
box: ‘📦’,
crunchbase: ‘🏢’,
factset: ‘📊’,
onedrive: ‘☁️’,
org: ‘🏛️’,
sharepoint: ‘📑’,
edgar: ‘⚖️’
};
// Connector icons
const connectorIcons = {
google_drive: ‘📁’,
gcal: ‘📅’,
dropbox: ‘📦’,
edgar: ‘⚖️’,
outlook: ‘📧’,
linear_alt: ‘📊’,
notion_mcp: ‘📝’,
github_mcp_direct: ‘💻’,
asana_mcp_merge: ‘✅’,
slack_direct: ‘💬’,
jira_mcp_merge: ‘📋’,
confluence_mcp_merge: ‘📚’,
microsoft_teams_mcp_merge: ‘👥’
};
function loadExample(num) {
document.getElementById(‘jsonInput’).value = num === 1 ? example1 : example2;
parseJSON();
}
function clearData() {
document.getElementById(‘jsonInput’).value = ”;
document.getElementById(‘dashboard’).classList.remove(‘active’);
document.getElementById(’emptyState’).style.display = ‘block’;
hideError();
}
function showError(message) {
const errorEl = document.getElementById(‘errorMessage’);
errorEl.textContent = message;
errorEl.classList.add(‘active’);
}
function hideError() {
document.getElementById(‘errorMessage’).classList.remove(‘active’);
}
function parseJSON() {
const input = document.getElementById(‘jsonInput’).value.trim();
if (!input) {
showError(‘Please enter JSON data’);
return;
}
try {
const data = JSON.parse(input);
hideError();
renderDashboard(data);
} catch (e) {
showError(‘Invalid JSON: ‘ + e.message);
}
}
function renderDashboard(data) {
document.getElementById(’emptyState’).style.display = ‘none’;
document.getElementById(‘dashboard’).classList.add(‘active’);
renderQueryLimits(data);
renderContentLimits(data);
renderConnectorLimits(data);
renderSources(data);
renderConnectors(data);
renderAccountInfo(data);
}
function createCard(title, value, description, badge = null, progress = null) {
let badgeHtml = ”;
if (badge) {
badgeHtml = `
${badge.text}`;
}
let progressHtml = ”;
if (progress) {
const percentage = Math.min(100, (progress.current / progress.max) * 100);
const progressClass = percentage > 90 ? ‘danger’ : percentage > 70 ? ‘warning’ : ‘success’ ;
progressHtml = `
`;
}
return `
${valeur}
${description}
${progressHtml}
`;
}
function renderQueryLimits(data) {
const container = document.getElementById(‘queryLimits’);
let html = ”;
if (data.remaining_pro !== undefined) {
html += createCard(
‘Requêtes Pro’,
data.remaining_pro,
‘Requêtes Pro restantes’,
data.remaining_pro > 100 ? { type: ‘success’, text: ‘Bon’ } :
data.remaining_pro > 50 ? { type: ‘warning’, text: ‘Faible’ } : { type: ‘danger’, text: ‘Critique’ }
);
}
if (data.remaining_research !== undefined) {
html += createCard(
‘Requêtes de recherche’,
data.remaining_research,
‘Requêtes de recherche restantes’,
data.remaining_research > 10 ? { type : ‘success’, text : ‘Bon’ } :
data.remaining_research > 5 ? { type : ‘warning’, text : ‘Faible’ } : { type : ‘danger’, text : ‘Critique’ }
);
}
if (data.remaining_agentic_research !== undefined) {
html += createCard(
‘ Recherche agentique ’,
data.remaining_agentic_research,
‘ Requêtes de recherche agentique restantes ’,
data.remaining_agentic_research > 0 ? { type: ‘success’, text: ‘ Disponible ’ } : { type : ‘ danger ’, texte : ‘ Épuisé ’ }
);
}
if (data.remaining_labs !== undefined) {
html += createCard(
‘Requêtes de laboratoires’,
data.remaining_labs,
‘Requêtes de laboratoires/expérimentales restantes’,
data.remaining_labs > 10 ? { type: ‘success’, text: ‘ Bon ’ } :
data.remaining_labs > 5 ? { type : ‘ warning ’, text : ‘ Faible ’ } : { type : ‘ danger ’, text : ‘ Critique ’ }
);
}
if (data.query_count !== undefined) {
html += createCard(
‘Nombre total de requêtes’,
data.query_count,
‘Nombre total de requêtes effectuées au cours de cette période’
);
}
if (data.query_count_copilot !== undefined) {
html += createCard(
‘ Requêtes Copilot ’,
data.query_count_copilot,
‘ Requêtes effectuées via Copilot ’
);
}
container.innerHTML = html || ‘
Aucune donnée relative à la limite de requêtes n'est disponible
‘;
}
function renderContentLimits(data) {
const container = document.getElementById(‘contentLimits’);
let html = ”;
if (data.pages_limit !== undefined) {
html += createCard(
‘Limite de pages’,
data.pages_limit,
‘Nombre maximal de pages autorisé’
);
}
if (data.upload_limit !== undefined) {
html += createCard(
‘Limite de création’,
data.create_limit,
‘Nombre maximal de créations autorisées’
);
}
if (data.create_limit !== undefined) {
html += createCard(
‘ Limite de création ’,
data.create_limit,
‘ Nombre maximal de créations autorisées ’
);
}
if (data.article_image_upload_limit !== undefined) {
html += createCard(
‘Limite de téléchargement d’images’,
data.article_image_upload_limit,
‘Nombre maximal de téléchargements d’images d’article’
);
}
container.innerHTML = html || ‘
Aucune donnée relative à la limite de contenu n'est disponible
‘ ;
}
function renderConnectorLimits(data) {
const container = document.getElementById(‘ connectorLimits ’);
let html = ” ‘;
if (data.max_files_per_user !== undefined) {
html += createCard(
’Fichiers par utilisateur‘,
data.max_files_per_user,
’Nombre maximal de fichiers par utilisateur‘
);
}
if (data.max_files_per_repository !== undefined) {
html += createCard(
’Fichiers par référentiel‘,
data.max_files_per_repository,
’Nombre maximal de fichiers par référentiel‘
);
}
if (data.connector_limits) {
const cl = data.connector_limits;
if (cl.max_file_size_mb !== undefined) {
html += createCard(
’ Taille maximale des fichiers ‘,
cl.max_file_size_mb + ’ Mo ‘,
’ Taille maximale des fichiers à télécharger ‘
);
}
if (cl.max_attachment_file_size_mb !== undefined) {
html += createCard(
’ Taille maximale des pièces jointes ‘,
cl.max_attachment_file_size_mb + ’ Mo ‘,
’ Taille maximale des pièces jointes ‘
);
}
if (cl.daily_attachment_limit !== undefined) {
html += createCard(
’Pièces jointes quotidiennes‘,
cl.daily_attachment_limit,
’Limite quotidienne de pièces jointes‘
);
}
if (cl.global_file_count !== undefined) {
html += createCard(
’Nombre total de fichiers‘,
cl.global_file_count,
’Limite totale de fichiers‘
);
}
}
container.innerHTML = html || ‘
Aucune donnée disponible concernant la limite du nombre de connecteurs
‘;
}
function renderSources(data) {
const tbody = document.getElementById(‘sourcesTableBody’);
let html = ”;
const sources = data.sources?.source_to_limit || {};
Object.entries(sources).forEach(([name, limits]) => {
const icon = sourceIcons[name] || ‘🔌’;
const displayName = name.replace(/_/g, ‘ ‘).replace(/bw/g, l => l.toUpperCase());
let limitClass = ‘limit-normal’;
let limitText = limits.monthly_limit === null ? ‘ Illimité ’ : limits.monthly_limit ;
if (limits.monthly_limit === null) limitClass = ‘ limit-unlimited ’ ;
if (limits.monthly_limit === 0) limitClass = ‘ limit-zero ’ ;
let remainingClass = ‘limit-normal’ ;
let remainingText = limits.remaining === null ? ‘Illimité’ : limits.remaining ;
if (limits.remaining === null) remainingClass = ‘limit-unlimited’ ;
if (limits.remaining === 0) remainingClass = ‘limit-zero’ ;
let statusBadge = ” ;
if (limits.remaining === null && limits.monthly_limit === null) {
statusBadge = ‘
Illimité‘;
} else if (limits.remaining === 0) {
statusBadge = ‘
Épuisé‘;
} else if (limits.remaining !== null && limits.monthly_limit !== null) {
const pct = (limits.remaining / limits.monthly_limit) * 100;
if (pct > 50) {
statusBadge = ‘
Bon‘;
} else if (pct > 25) {
statusBadge = ‘
Faible‘;
} else {
statusBadge = ‘
Critique‘;
}
} else {
statusBadge = ‘
N/A‘ ;
}
html += `
|
|
${limitText} |
${texte restant} |
${statusBadge} |
`;
});
tbody.innerHTML = html || ‘
| Aucune donnée source n'est disponible |
‘;
}
function renderConnectors(data) {
const container = document.getElementById(‘connectorsGrid’);
let html = ”;
const connectors = data.connectors?.connectors || [];
connectors.forEach(connector => {
const icon = connectorIcons[connector.name] || ‘🔌’;
const displayName = connector.name.replace(/_/g, ‘ ‘).replace(/bw/g, l => l.toUpperCase());
const statusClass = connector.connected ? ‘status-connected’ : ‘status-disconnected’;
const statusText = connector.connected ? ‘Connecté’ : ‘Déconnecté’;
html += `
${icône}
${displayName}
${statusText}
`;
});
container.innerHTML = html || ‘
Aucune donnée relative aux connecteurs n'est disponible
‘;
}
function renderAccountInfo(data) {
const container = document.getElementById(‘accountInfo’);
let html = ”;
if (data.subscription_tier) {
html += createCard(
‘Niveau d’abonnement’,
data.subscription_tier.charAt(0).toUpperCase() + data.subscription_tier.slice(1),
‘Votre formule d’abonnement actuelle’,
{ type : ‘success’, text : data.subscription_status === ‘active’ ? ‘Actif’ : ‘Inactif’ }
);
}
if (data.source_d’abonnement) {
html += createCard(
‘Source de paiement’,
data.source_d’abonnement.charAt(0).toUpperCase() + data.source_d’abonnement.slice(1),
‘ Votre prestataire de paiement ’
);
}
if (data.referral_code) {
html += createCard(
‘ Code de parrainage ’,
data.referral_code,
‘ Partager avec vos amis ’
);
}
if (data.default_model) {
html += createCard(
‘Modèle par défaut’,
data.default_model.charAt(0).toUpperCase() + data.default_model.slice(1),
‘Votre modèle d’IA préféré’
);
}
if (data.time_zone) {
html += createCard(
‘Fuseau horaire’,
data.time_zone,
‘Votre fuseau horaire local’
);
}
if (data.coupon_metadata?.name) {
html += createCard(
‘Coupon’,
data.coupon_metadata.name,
‘Coupon appliqué’,
data.coupon_metadata.expires_at ? {
type: new Date(data.coupon_metadata.expires_at) > new Date() ? ‘succès’ : ‘danger’,
text: new Date(data.coupon_metadata.expires_at) > new Date() ? ‘Valide’ : ‘Expiré’
} : null
);
}
container.innerHTML = html || ‘
Aucune information sur le compte n'est disponible
‘;
}
// Analyse automatique lors du collage
document.getElementById(‘jsonInput’).addEventListener(‘paste’, function(e) {
setTimeout(() => parseJSON(), 100);
});