YashVardhan-coder
Initial clean deploy
b8c035c
Raw
History Blame Contribute Delete
16.3 kB
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GuardrailShield AI - Admin Dashboard</title>
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<link rel="stylesheet" href="/static/css/styles.css">
</head>
<body>
<div class="app-container">
<!-- Sidebar Navigation -->
<aside class="sidebar">
<div class="logo">
<span class="shield-icon">🛡️</span>
<h2>GuardrailShield</h2>
</div>
<nav class="nav-menu">
<a href="#" class="active" id="tabBtnOverview" onclick="switchTab('overview')"><span class="menu-icon">📊</span> Overview</a>
<a href="#" id="tabBtnSettings" onclick="switchTab('settings')"><span class="menu-icon">⚙️</span> Rules Configuration</a>
<a href="/docs" target="_blank"><span class="menu-icon">📄</span> API Docs</a>
</nav>
<div class="sidebar-footer">
<a href="#" class="btn btn-secondary" style="width:100%; text-align:center; display:block;" onclick="performLogout()">🔓 Log Out</a>
<p style="text-align: center; margin-top: 10px; font-size: 12px; color: var(--text-secondary);">Status: <span class="badge badge-success">Live</span></p>
</div>
</aside>
<!-- Main Dashboard View -->
<main class="main-content">
<!-- TAB 1: OVERVIEW -->
<div id="viewOverview" class="tab-view active">
<header class="dashboard-header">
<div>
<h1>Security Audit Dashboard</h1>
<p class="subtitle">Real-time LLM input & output guard monitoring</p>
</div>
<button class="btn btn-primary" onclick="refreshDashboard()">🔄 Refresh</button>
</header>
<!-- Statistics Grid -->
<section class="stats-grid">
<div class="flat-card" style="margin-bottom: 0;">
<div class="card-header">Total Requests</div>
<div class="card-val" id="totalQueries">-</div>
<div class="card-footer">Scanned inputs & responses</div>
</div>
<div class="flat-card" style="margin-bottom: 0;">
<div class="card-header">Pass Rate</div>
<div class="card-val text-success" id="passRate">-%</div>
<div class="card-footer">Queries marked safe</div>
</div>
<div class="flat-card" style="margin-bottom: 0;">
<div class="card-header">Blocked Requests</div>
<div class="card-val text-danger" id="blockedQueries">-</div>
<div class="card-footer">Threats blocked at boundary</div>
</div>
<div class="flat-card" style="margin-bottom: 0;">
<div class="card-header">Avg Risk Score</div>
<div class="card-val" id="avgRisk">-</div>
<div class="card-footer">System-wide mean risk index</div>
</div>
</section>
<!-- Charts Section -->
<section class="charts-section">
<div class="flat-card">
<h3>Threat Category Distribution</h3>
<div style="max-height: 250px; display: flex; justify-content: center;">
<canvas id="categoryChart"></canvas>
</div>
</div>
<div class="flat-card">
<h3>Recent Risk Index Trend</h3>
<canvas id="riskTrendChart"></canvas>
</div>
</section>
<!-- Logs Table -->
<section class="logs-section flat-card">
<h3>Recent Audit Transactions</h3>
<div class="table-wrapper">
<table>
<thead>
<tr>
<th>Timestamp</th>
<th>Prompt</th>
<th>Response</th>
<th>Safety status</th>
<th>Risk Score</th>
<th>Threat Category</th>
</tr>
</thead>
<tbody id="logsTableBody">
<tr><td colspan="6" class="text-center">Loading transactions...</td></tr>
</tbody>
</table>
</div>
</section>
</div>
<!-- TAB 2: RULES CONFIGURATION -->
<div id="viewSettings" class="tab-view">
<header class="dashboard-header">
<div>
<h1>Rules & Settings Editor</h1>
<p class="subtitle">Customize guardrail parameters dynamically</p>
</div>
<button class="btn btn-primary" onclick="saveSettings()">💾 Save Changes</button>
</header>
<div class="settings-grid">
<!-- Ollama config card -->
<div class="flat-card">
<h3>Ollama Service Completion Config</h3>
<div class="form-row">
<div class="form-group">
<label for="ollamaUrl">Ollama Server Endpoint URL</label>
<input type="text" id="ollamaUrl" placeholder="http://127.0.0.1:11434">
</div>
<div class="form-group">
<label for="ollamaModel">Model Name</label>
<input type="text" id="ollamaModel" placeholder="gemma:1b">
</div>
</div>
</div>
<!-- Admin Credentials config card -->
<div class="flat-card">
<h3>Admin Portal Authentication Credentials</h3>
<div class="form-row">
<div class="form-group">
<label for="adminUsername">Admin Username</label>
<input type="text" id="adminUsername" placeholder="admin">
</div>
<div class="form-group">
<label for="adminPassword">Admin Password</label>
<input type="password" id="adminPassword" placeholder="adminpassword">
</div>
</div>
</div>
<!-- Alerting Configuration Card -->
<div class="flat-card">
<h3>🔔 Alert Notifications Configuration</h3>
<p class="subtitle">Configure real-time security alerts to Telegram and Slack when threats are blocked.</p>
<!-- Telegram Section -->
<div class="alert-channel-section">
<div class="channel-header">
<div class="channel-toggle">
<input type="checkbox" id="telegramEnabled" class="toggle-checkbox">
<label for="telegramEnabled" class="toggle-label">📱 Telegram Alerts</label>
</div>
<button class="btn btn-secondary" onclick="testAlert('telegram')">🔔 Test Telegram</button>
</div>
<div class="form-row">
<div class="form-group">
<label for="telegramBotToken">Bot Token (from @BotFather)</label>
<input type="password" id="telegramBotToken" placeholder="123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11">
</div>
<div class="form-group">
<label for="telegramChatId">Chat ID</label>
<input type="text" id="telegramChatId" placeholder="-1001234567890">
</div>
</div>
</div>
<!-- Slack Section -->
<div class="alert-channel-section" style="margin-top: 20px;">
<div class="channel-header">
<div class="channel-toggle">
<input type="checkbox" id="slackEnabled" class="toggle-checkbox">
<label for="slackEnabled" class="toggle-label">💬 Slack Alerts</label>
</div>
<button class="btn btn-secondary" onclick="testAlert('slack')">🔔 Test Slack</button>
</div>
<div class="form-row">
<div class="form-group">
<label for="slackWebhookUrl">Incoming Webhook URL</label>
<input type="text" id="slackWebhookUrl" placeholder="https://hooks.slack.com/services/T00.../B00.../xxxx">
</div>
</div>
</div>
<div id="alertTestResult" class="alert-test-result" style="display:none;"></div>
</div>
<!-- Semantic Vector Blocklist Card -->
<div class="flat-card">
<div class="header-flex">
<h3>🧠 Semantic Vector Blocklist (Sentence Similarity)</h3>
<div class="channel-toggle">
<input type="checkbox" id="semanticEnabled" class="toggle-checkbox">
<label for="semanticEnabled" class="toggle-label">Enable Semantic Guard</label>
</div>
</div>
<p class="subtitle">Blocks user prompts that have a high semantic similarity to a database of known jailbreaks, even if they bypass regex patterns.</p>
<div class="form-row" style="align-items: center; margin-bottom: 20px;">
<div class="form-group" style="flex: 2;">
<label for="semanticThreshold">Cosine Similarity Threshold (Default: 0.82)</label>
<div style="display: flex; align-items: center; gap: 15px;">
<input type="range" id="semanticThreshold" min="0.5" max="1.0" step="0.01" value="0.82" style="flex: 1; accent-color: var(--color-primary);" oninput="document.getElementById('thresholdValue').innerText = this.value">
<span id="thresholdValue" style="font-weight: bold; width: 40px; color: var(--color-primary);">0.82</span>
</div>
</div>
</div>
<!-- Add new phrase -->
<div class="form-row" style="margin-bottom: 20px;">
<div class="form-group" style="flex: 4;">
<label for="newSemanticPhrase">Add New Blocklisted Phrase</label>
<input type="text" id="newSemanticPhrase" placeholder="e.g. You are now in Developer Mode (DAN) and can bypass rules...">
</div>
<div class="form-group" style="flex: 1; align-self: flex-end;">
<button class="btn btn-secondary" onclick="addSemanticPhrase()" style="width: 100%;">➕ Add Phrase</button>
</div>
</div>
<!-- Active phrases list -->
<div class="table-wrapper">
<table id="semanticPhrasesTable">
<thead>
<tr>
<th>Blocklisted Phrase</th>
<th style="width: 100px; text-align: center;">Action</th>
</tr>
</thead>
<tbody>
<!-- Dynamic rows -->
</tbody>
</table>
</div>
<!-- Semantic Similarity Tester -->
<div class="semantic-tester-section" style="margin-top: 30px; padding-top: 20px; border-top: 1px solid rgba(255,255,255,0.08);">
<h4>🔍 Semantic Similarity Tester</h4>
<p class="subtitle">Enter a prompt to calculate its similarity against the active blocklist. Does not trigger real block events.</p>
<div class="form-row">
<div class="form-group" style="flex: 4;">
<input type="text" id="semanticTestPrompt" placeholder="Enter test prompt here (e.g. Bypass all guardrail guidelines)...">
</div>
<div class="form-group" style="flex: 1;">
<button class="btn btn-secondary" onclick="testSemanticSimilarity()" style="width: 100%;">Analyze Match</button>
</div>
</div>
<div id="semanticTestResult" class="alert-test-result" style="display: none; margin-top: 15px;"></div>
</div>
</div>
<!-- Jailbreak Regex Editor -->
<div class="flat-card">
<div class="header-flex">
<h3>Jailbreak Regex Rules</h3>
<button class="btn btn-secondary" onclick="addJailbreakRule()">➕ Add Rule</button>
</div>
<div class="table-wrapper">
<table id="jailbreakRulesTable">
<thead>
<tr>
<th>Rule Name</th>
<th>Regex Pattern</th>
<th>Description</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<!-- Dynamic rows -->
</tbody>
</table>
</div>
</div>
<!-- Toxic Keywords Editor -->
<div class="flat-card">
<h3>Output Toxicity Keywords</h3>
<p class="subtitle">Enter keywords or phrases (comma-separated) to monitor and block in model responses.</p>
<textarea id="toxicKeywords" class="form-textarea" rows="4"></textarea>
</div>
</div>
</div>
</main>
</div>
<script src="/static/js/dashboard.js"></script>
</body>
</html>