|
<!DOCTYPE html> |
|
<html lang="en"> |
|
<head> |
|
<meta charset="UTF-8" /> |
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0 maximum-scale=1.0" /> |
|
<meta name="description" content="A conversational AI system that listens, learns, and challenges" /> |
|
<meta property="og:title" content="MoA ChatUI" /> |
|
<meta property="og:image" content="https://openai.com/content/images/2022/11/ChatGPT.jpg" /> |
|
<meta property="og:description" content="A conversational AI system that listens, learns, and challenges" /> |
|
<meta property="og:url" content="https://chat.acy.dev" /> |
|
<link rel="stylesheet" href="{{ url_for('bp.static', filename='css/style.css') }}" /> |
|
<link rel="apple-touch-icon" sizes="180x180" href="{{ url_for('bp.static', filename='img/apple-touch-icon.png') }}" /> |
|
<link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('bp.static', filename='img/favicon-32x32.png') }}" /> |
|
<link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('bp.static', filename='img/favicon-16x16.png') }}" /> |
|
<link rel="manifest" href="{{ url_for('bp.static', filename='img/site.webmanifest') }}" /> |
|
<link rel="stylesheet" href="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@latest/build/styles/base16/dracula.min.css" /> |
|
<title>MoA Visualizer</title> |
|
<style> |
|
.hidden { |
|
display: none; |
|
} |
|
.fade-in { |
|
animation: fadeIn 0.5s; |
|
} |
|
@keyframes fadeIn { |
|
from { opacity: 0; } |
|
to { opacity: 1; } |
|
} |
|
</style> |
|
</head> |
|
<body data-urlprefix="{{ url_prefix}}"> |
|
<div class="main-container"> |
|
<div class="box sidebar"> |
|
<div class="top"> |
|
<button class="button" onclick="new_conversation()"> |
|
<i class="fa-regular fa-plus"></i> |
|
<span>{{_('New Conversation')}}</span> |
|
</button> |
|
<div class="spinner"></div> |
|
</div> |
|
<div class="sidebar-footer"> |
|
<button class="button" onclick="delete_conversations()"> |
|
<i class="fa-regular fa-trash"></i> |
|
<span>{{_('Clear Conversations')}}</span> |
|
</button> |
|
<div class="api-key-container hidden" id="api-key-container"> |
|
<button id="show-api-key-button" class="button"> |
|
<i class="fa-regular fa-key"></i> |
|
<span>{{_('API Key')}}</span> |
|
</button> |
|
<input type="password" id="API-key" class="hidden fade-in" /> |
|
<button id="api-key-ok-button" class="button hidden fade-in">{{_('Ok')}}</button> |
|
</div> |
|
<div class="settings-container"> |
|
<div class="checkbox field"> |
|
<span>{{_('Dark Mode')}}</span> |
|
<input type="checkbox" id="theme-toggler" /> |
|
<label for="theme-toggler"></label> |
|
</div> |
|
<div class="field"> |
|
<span>{{_('Language')}}</span> |
|
<select class="dropdown" id="language" onchange="changeLanguage(this.value)"></select> |
|
</div> |
|
</div> |
|
<a class="info" href="https://github.com/ruslanmv/ollama-webui/" target="_blank"> |
|
<i class="fa-brands fa-github"></i> |
|
<span class="conversation-title">ollama-webui</span> |
|
</a> |
|
</div> |
|
</div> |
|
<div class="conversation"> |
|
<div class="stop-generating stop-generating-hidden"> |
|
<button class="button" id="cancelButton"> |
|
<span>{{_('Stop Generating')}}</span> |
|
</button> |
|
</div> |
|
<div class="box" id="messages"></div> |
|
<div class="user-input"> |
|
<div class="box input-box"> |
|
<textarea id="message-input" placeholder="{{_('Ask a question')}}" cols="30" rows="10" style="white-space: pre-wrap"></textarea> |
|
<div id="send-button"> |
|
<i class="fa-regular fa-paper-plane-top"></i> |
|
</div> |
|
</div> |
|
</div> |
|
<div> |
|
<div class="options-container"> |
|
<div class="buttons"> |
|
<div class="field"> |
|
<select class="dropdown" name="model" id="model"> |
|
<optgroup label="Ollama"> |
|
<option value="llama3">llama3</option> |
|
<option value='phi3'>phi3 </option> |
|
<option value='mistral'>mistral </option> |
|
<option value='gemma:2b'> gemma:2b</option> |
|
</optgroup> |
|
</select> |
|
</div> |
|
<div class="field"> |
|
<select class="dropdown" name="jailbreak" id="jailbreak"> |
|
<option value="default" selected>{{_('Default')}}</option> |
|
<option value="gpt-dan-11.0">{{_('DAN')}}</option> |
|
<option value="gpt-evil">{{_('Evil')}}</option> |
|
</select> |
|
</div> |
|
</div> |
|
<div class="field checkbox"> |
|
<input type="checkbox" id="switch" /> |
|
<label for="switch"></label> |
|
<span>{{_('online')}}</span> |
|
</div> |
|
</div> |
|
</div> |
|
<div class="moa-visualizer"> |
|
<h2>Mixture-of-Agents Chat</h2> |
|
<div class="step"> |
|
<p class="step-name">Please duplicate this space for GPU access </p> |
|
<p class="step-details">On a CPU only space, inference is slow whereas even on the cheapest GPU hardware available on HF spaces you get quick replies!</p> |
|
</div> |
|
<div class="step"> |
|
<p class="step-name">(Recommended) Swap the aggregator to any large model of your liking on HF!</p> |
|
<p class="step-details">Currently, in order to accomodate free tier space capacity both the aggregator and reference models are on the lighter side (yet still very performant!). A more performant aggregator yields better results! </p> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
<div class="menu-button"> |
|
<i class="fa-solid fa-bars"></i> |
|
</div> |
|
<script> |
|
window.conversation_id = "{{ chat_id }}"; |
|
</script> |
|
<script src="{{ url_for('bp.static', filename='js/api-key.js') }}"></script> |
|
<script src="{{ url_for('bp.static', filename='js/icons.js') }}"></script> |
|
<script src="{{ url_for('bp.static', filename='js/chat.js') }}" defer></script> |
|
<script src="https://cdn.jsdelivr.net/npm/markdown-it@latest/dist/markdown-it.min.js"></script> |
|
<script src="{{ url_for('bp.static', filename='js/highlight.min.js') }}"></script> |
|
<script src="{{ url_for('bp.static', filename='js/highlightjs-copy.min.js') }}"></script> |
|
<script src="{{ url_for('bp.static', filename='js/theme-toggler.js') }}"></script> |
|
<script src="{{ url_for('bp.static', filename='js/sidebar-toggler.js') }}"></script> |
|
<script src="{{ url_for('bp.static', filename='js/change-language.js') }}"></script> |
|
<script> |
|
document.getElementById('switch').addEventListener('change', function() { |
|
var apiKeyContainer = document.getElementById('api-key-container'); |
|
if (this.checked) { |
|
apiKeyContainer.classList.remove('hidden'); |
|
} else { |
|
apiKeyContainer.classList.add('hidden'); |
|
} |
|
}); |
|
document.getElementById('show-api-key-button').addEventListener('click', function() { |
|
var apiKeyInput = document.getElementById('API-key'); |
|
var okButton = document.getElementById('api-key-ok-button'); |
|
apiKeyInput.classList.remove('hidden'); |
|
okButton.classList.remove('hidden'); |
|
}); |
|
</script> |
|
</body> |
|
</html> |