Vai al contenuto
LUNEDì, OTTOBRE 19, 2026NOTIZIE TECNOLOGICHE INDIPENDENTI, RECENSIONI E GUIDE PRATICHE
INFORMAZIONI SU
ULTIME NOTIZIE /

OpenCode v2 vs Hermes Agent vs OpenClaw: The 2026 Open-Source Agent Showdown (and Why OpenCode 2.0 Is the Update of the Year)

LEGGI LA GUIDA
GRAHAM MIRANDA / TECNOLOGIA

Cruscotto dei limiti di perplessità

Caricate i vostri limiti di perplessità

Seguite questi rapidi passaggi per copiare i vostri dati Perplexity in tempo reale e visualizzare i vostri limiti personali in questo cruscotto.

Fase 1 - Aprire i dati del limite di tariffa

Per prima cosa, prelevate le informazioni sull'utilizzo e la quota attuali direttamente da Perplexity.

  1. Assicuratevi di aver effettuato l'accesso al vostro account Perplexity nel browser.
  2. Aprire questo link in una nuova scheda:

Il browser mostrerà un blocco di testo JSON: si tratta dei dati relativi al limite di velocità in tempo reale (il numero di messaggi, di ricerche, ecc. che si possono utilizzare).

Selezionate tutto ciò che è presente in quella pagina (Ctrl/⌘ + A, allora Ctrl/⌘ + C) per copiarlo.

Fase 2 - Aprire i dati delle impostazioni

Quindi, recuperate i dettagli del vostro piano, i limiti dei file, i connettori e le preferenze.

  1. Aprire questo link in una nuova scheda:

Questa pagina mostra un altro blocco JSON contenente i dettagli dell'abbonamento, i limiti di file e pagine e la configurazione del connettore.

Anche in questo caso, selezionare tutto il testo della pagina e copiarlo (Ctrl/⌘ + A, allora Ctrl/⌘ + C).

Fase 3 - Incollare i dati nel dashboard

Ora sono presenti due blocchi JSON: uno per i limiti tariffari e uno per le impostazioni dell'account.

  1. Ritorno a questa pagina.
  2. Incollare il file limite di velocità JSON nel primo campo di immissione.
  3. Incollare il file impostazioni JSON nel secondo campo di immissione.
  4. Cliccare “Visualizzare i miei limiti” per trasformare i dati grezzi in una panoramica pulita e interattiva dell'utilizzo, delle quote e dei connettori.

I dati vengono utilizzati solo nel browser per la visualizzazione. L'utente ha il pieno controllo di ciò che incolla e condivide.

: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; –ombra: 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; } /* Intestazione */ .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; } /* Sezione di inserimento */ .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); } /* Griglia della dashboard */ .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); } } /* Intestazioni delle sezioni */ .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); } /* Griglia delle schede */ .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 { font-size: 2rem; font-weight: 700; margin-bottom: 0.5rem; } .card-description { font-size: 0.875rem; color: var(–text-muted); } /* Barra di avanzamento */ .progress-container { margin-top: 1rem; } .progress-header { display: flex; justify-content: space-between; font-size: 0.75rem; color: var(–text-muted); margin-bottom: 0.5rem; } .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); } /* Tabella delle fonti */ .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); } /* Griglia dei connettori */ .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); } /* Messaggio di errore */ .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; } /* Stato vuoto */ .empty-state { text-align: center; padding: 4rem 2rem; color: var(–text-muted); } .empty-state-icon { font-size: 4rem; margin-bottom: 1rem; opacity: 0.5; } /* Responsivo */ @media (max-width: 768px) { .container { padding: 1rem; } .header h1 { font-size: 1.75rem; } .cards-grid { grid-template-columns: 1fr; } .sources-table { font-size: 0.75rem; } .sources-table th, .sources-table td { padding: 0.75rem; } .input-header { flex-direction: column; gap: 1rem; align-items: flex-start; } } /* Animazioni */ @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } .pulse { animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; } /* Barra di scorrimento */ ::-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); }

Cruscotto dei limiti di perplessità

Visualizzare i limiti e l'utilizzo dell'API Perplexity in tempo reale

Incollare i dati JSON

⚡

Limiti della query

📄

Limiti di contenuto

📁

Limiti relativi a file e connettori

🔌

Fonte Limiti

Fonte Limite mensile Rimanente Stato
🔗

Servizi connessi

👤

Informazioni sul conto

📊

Nessun dato da visualizzare

Incollare i dati JSON sopra e fare clic su “Parse Data” per visualizzare i limiti.

// 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 = `
${progress.current} / ${progress.max === null ? ‘∞’ : progress.max} ${percentage.toFixed(0)}%
`; } return `
${titolo} ${badgeHtml}
${valore}
${descrizione}
${progressHtml}
`; } function renderQueryLimits(data) { const container = document.getElementById(‘queryLimits’); let html = ”‘; if (data.remaining_pro !== undefined) { html += createCard( ’Query Pro‘, data.remaining_pro, ’Query Pro rimanenti‘, data.remaining_pro > 100 ? { type: ’success‘, text: ’Buono‘ } : data.remaining_pro > 50 ? { type: ’warning‘, text: ’Basso‘ } : { type: ’danger‘, text: ’Critico‘ } ); } if (data.remaining_research !== undefined) { html += createCard( ’Ricerche‘, data.remaining_research, ’Ricerche rimanenti‘, data.remaining_research > 10 ? { type: ’success‘, text: ’Buono‘ } : data.remaining_research > 5 ? { type: ’warning‘, text: ’Basso‘ } : { type: ’danger‘, text: ’Critico‘ } ); } if (data.ricerca_agente_rimanente !== undefined) { html += createCard( ’Ricerca agenziale‘, data.remaining_agentic_research, ’Richieste di ricerca agenziale rimanenti‘, data.remaining_agentic_research > 0 ? { type: ’success‘, text: ’Disponibile‘ } : { tipo: ’pericolo‘, testo: ’Esaurito‘ } ); } if (data.remaining_labs !== undefined) { html += createCard( ’Ricerche di laboratori‘, data.remaining_labs, ’Ricerche rimanenti di laboratori/esperimenti‘, data.remaining_labs > 10 ? { type: ’success‘, text: ’Buono‘ } : data.remaining_labs > 5 ? { type: ’warning‘, text: ’Basso‘ } : { type: ’danger‘, text: ’Critico‘ } ); } if (data.query_count !== undefined) { html += createCard( ’Totale query‘, data.query_count, ’Totale delle query effettuate in questo periodo‘ ); } if (data.query_count_copilot !== undefined) { html += createCard( ’Query Copilot‘, data.query_count_copilot, ’Query effettuate tramite Copilot‘ ); } container.innerHTML = html || ‘

Non sono disponibili dati sul limite delle query

‘; } function renderContentLimits(data) { const container = document.getElementById(‘contentLimits’); let html = ”; if (data.pages_limit !== undefined) { html += createCard( ‘Limite pagine’, data.pages_limit, ‘Numero massimo di pagine consentite’ ); } if (data.upload_limit !== undefined) { html += createCard( ‘Limite di caricamento’, data.upload_limit, ‘Numero massimo di caricamenti consentiti’ ); } if (data.create_limit !== undefined) { html += createCard( ‘Limite di creazione’, data.create_limit, ‘Numero massimo di creazioni consentite’ ); } if (data.article_image_upload_limit !== undefined) { html += createCard( ‘Limite di caricamento immagini’, data.article_image_upload_limit, ‘Numero massimo di immagini per articolo’ ); } container.innerHTML = html || ‘

Non sono disponibili dati relativi al limite di contenuto

‘; } function renderConnectorLimits(data) { const container = document.getElementById(‘connectorLimits’); let html = ”; if (data.max_files_per_user !== undefined) { html += createCard( ‘File per utente’, data.max_files_per_user, ‘Numero massimo di file per utente’ ); } if (data.max_files_per_repository !== undefined) { html += createCard( ‘File per repository’, data.max_files_per_repository, ‘Numero massimo di file per repository’ ); } if (data.connector_limits) { const cl = data.connector_limits; if (cl.max_file_size_mb !== undefined) { html += createCard( ‘Dimensione massima del file’, cl.max_file_size_mb + ‘ MB’, ‘Dimensione massima del file caricato’ ); } if (cl.max_attachment_file_size_mb !== undefined) { html += createCard( ‘Dimensione massima allegato’, cl.max_attachment_file_size_mb + ‘ MB’, ‘Dimensione massima dell’allegato’ ); } if (cl.daily_attachment_limit !== undefined) { html += createCard( ‘Allegati giornalieri’, cl.daily_attachment_limit, ‘Limite giornaliero di allegati’ ); } if (cl.global_file_count !== undefined) { html += createCard( ‘Conteggio globale dei file’, cl.global_file_count, ‘Limite totale globale dei file’ ); } } container.innerHTML = html || ‘

Non sono disponibili dati relativi al limite dei connettori

‘; } 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 ? ‘Illimitato’ : 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 ? ‘Illimitato’ : 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 = ‘Illimitato‘; } else if (limits.remaining === 0) { statusBadge = ‘Esaurito‘; } else if (limits.remaining !== null && limits.monthly_limit !== null) { const pct = (limits.remaining / limits.monthly_limit) * 100; if (pct > 50) { statusBadge = ‘Buono‘; } else if (pct > 25) { statusBadge = ‘Basso‘; } else { statusBadge = ‘Critico‘; } } else { statusBadge = ‘N/D‘; } html += `
${icona}
${displayName}
${limitText} ${testo rimanente} ${statusBadge} `; }); tbody.innerHTML = html || ‘Non sono disponibili dati di origine‘; } 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 ? ‘Connesso’ : ‘Disconnesso’; html += `
${icona}
${displayName}
${statusText}
`; }); container.innerHTML = html || ‘

Non sono disponibili dati relativi ai connettori

‘; } function renderAccountInfo(data) { const container = document.getElementById(‘accountInfo’); let html = ”; if (data.subscription_tier) { html += createCard( ‘Livello di abbonamento’, data.subscription_tier.charAt(0).toUpperCase() + data.subscription_tier.slice(1), ‘Il tuo piano di abbonamento attuale’, { type: ‘success’, text: data.subscription_status === ‘active’ ? ‘Attivo’ : ‘Inattivo’ } ); } if (data.subscription_source) { html += createCard( ‘Metodo di pagamento’, data.subscription_source.charAt(0).toUpperCase() + data.subscription_source.slice(1), ‘Il tuo fornitore di servizi di pagamento’ ); } if (data.referral_code) { html += createCard( ‘Codice di riferimento’, data.referral_code, ‘Condividi con gli amici’ ); } if (data.default_model) { html += createCard( ‘Modello predefinito’, data.default_model.charAt(0).toUpperCase() + data.default_model.slice(1), ‘Il tuo modello di IA preferito’ ); } if (data.time_zone) { html += createCard( ‘Fuso orario’, data.time_zone, ‘Il tuo fuso orario locale’ ); } if (data.coupon_metadata?.name) { html += createCard( ‘Buono’, data.coupon_metadata.name, ‘Buono applicato’, data.coupon_metadata.expires_at ? { type: new Date(data.coupon_metadata.expires_at) > new Date() ? ‘success’ : ‘danger’, text: new Date(data.coupon_metadata.expires_at) > new Date() ? ‘Valido’ : ‘Scaduto’ } : null ); } container.innerHTML = html || ‘

Non sono disponibili informazioni sull'account

‘; } // Analisi automatica all’incollaggio document.getElementById(‘jsonInput’).addEventListener(‘paste’, function(e) { setTimeout(() => parseJSON(), 100); });
it_ITItaliano