Changed HTML to use djlint

This commit is contained in:
Adrien Bouvais 2024-08-04 10:09:15 +02:00
parent 5384383908
commit fa1bd44a99
13 changed files with 1004 additions and 839 deletions

View File

@ -1,4 +1,7 @@
<div class="chat-container mt-5" style="padding-bottom: 155px;" hx-indicator="#textarea-control" hx-ext="sse"> <div class="chat-container mt-5"
style="padding-bottom: 155px"
hx-indicator="#textarea-control"
hx-ext="sse">
<hx hx-get="/loadChat" hx-trigger="load once" hx-swap="outerHTML"></hx> <hx hx-get="/loadChat" hx-trigger="load once" hx-swap="outerHTML"></hx>
<hx hx-get="/loadChatInput" hx-trigger="load once" hx-swap="outerHTML" id="textarea-control"></hx> <hx hx-get="/loadChatInput" hx-trigger="load once" hx-swap="outerHTML" id="textarea-control"></hx>
</div> </div>

View File

@ -3,11 +3,15 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no"> <meta name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
<title>JADE</title> <title>JADE</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@1.0.0/css/bulma.min.css"> <link rel="stylesheet"
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css"> href="https://cdn.jsdelivr.net/npm/bulma@1.0.0/css/bulma.min.css">
<link href="https://fonts.googleapis.com/css?family=Russo+One" rel="stylesheet"> <link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css">
<link href="https://fonts.googleapis.com/css?family=Russo+One"
rel="stylesheet">
<!--link rel="stylesheet" href="/animations.css"--> <!--link rel="stylesheet" href="/animations.css"-->
<link rel="stylesheet" href="/style.css"> <link rel="stylesheet" href="/style.css">
@ -19,7 +23,8 @@
<script async src="https://js.stripe.com/v3/pricing-table.js"></script> <script async src="https://js.stripe.com/v3/pricing-table.js"></script>
<!-- highlight.js --> <!-- highlight.js -->
<link rel="stylesheet" href="https://unpkg.com/@highlightjs/cdn-assets@11.9.0/styles/default.min.css"> <link rel="stylesheet"
href="https://unpkg.com/@highlightjs/cdn-assets@11.9.0/styles/default.min.css">
<script src="https://unpkg.com/@highlightjs/cdn-assets@11.9.0/highlight.min.js"></script> <script src="https://unpkg.com/@highlightjs/cdn-assets@11.9.0/highlight.min.js"></script>
<script>hljs.highlightAll();</script> <script>hljs.highlightAll();</script>
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>

View File

@ -3,8 +3,11 @@
<div class="chat-input-container mb-5"> <div class="chat-input-container mb-5">
<div class="textarea-wrapper"> <div class="textarea-wrapper">
<div class="control" id="textarea-control"> <div class="control" id="textarea-control">
<textarea {% if not IsLogin or not HaveKey %}disabled{% endif %} class="textarea has-fixed-size" <textarea {% if not IsLogin or not HaveKey %}disabled{% endif %}
placeholder="Type your message here..." name="message" oninput="toggleSendButton()" class="textarea has-fixed-size"
placeholder="Type your message here..."
name="message"
oninput="toggleSendButton()"
id="chat-input-textarea"></textarea> id="chat-input-textarea"></textarea>
</div> </div>
<div class="button-group"> <div class="button-group">
@ -12,9 +15,16 @@
<hx hx-get="/loadUsageKPI" hx-trigger="load" hx-swap="outerHTML" hx-target="this"></hx> <hx hx-get="/loadUsageKPI" hx-trigger="load" hx-swap="outerHTML" hx-target="this"></hx>
<hx hx-get="/loadConversationSelection" hx-trigger="load" hx-swap="outerHTML" hx-target="this"></hx> <hx hx-get="/loadConversationSelection" hx-trigger="load" hx-swap="outerHTML" hx-target="this"></hx>
<hx hx-get="/loadModelSelection" hx-trigger="load" hx-swap="outerHTML" hx-target="this"></hx> <hx hx-get="/loadModelSelection" hx-trigger="load" hx-swap="outerHTML" hx-target="this"></hx>
<button disabled type="submit" class="send-button button is-primary is-small" hx-post="/generatePlaceholder" <button disabled
hx-swap="beforeend" hx-target="#chat-messages" id="chat-input-send-btn" class="chat-input" type="submit"
hx-include="[name='message']" hx-vals="js:{selectedLLMIds: getSelectedModelsIDs()}" class="send-button button is-primary is-small"
hx-post="/generatePlaceholder"
hx-swap="beforeend"
hx-target="#chat-messages"
id="chat-input-send-btn"
class="chat-input"
hx-include="[name='message']"
hx-vals="js:{selectedLLMIds: getSelectedModelsIDs()}"
onclick="onClickSendButton()"> onclick="onClickSendButton()">
<span class="icon"> <span class="icon">
<i class="fa-solid fa-chevron-right"></i> <i class="fa-solid fa-chevron-right"></i>

View File

@ -3,55 +3,30 @@
To use JADE, you need to sign up for an API key. You can enter an API key in To use JADE, you need to sign up for an API key. You can enter an API key in
the settings menu. Once enter you get access to all models from this provider. the settings menu. Once enter you get access to all models from this provider.
</p> </p>
<a <a class="button is-small is-primary is-outlined mt-1"
class="button is-small is-primary is-outlined mt-1"
href="https://openai.com/index/openai-api/" href="https://openai.com/index/openai-api/"
target="_blank" target="_blank">Get OpenAI API key</a>
> <a class="button is-small is-primary is-outlined mt-1"
Get OpenAI API key
</a>
<a
class="button is-small is-primary is-outlined mt-1"
href="https://console.anthropic.com/" href="https://console.anthropic.com/"
target="_blank" target="_blank">Get Anthropic API key</a>
> <a class="button is-small is-primary is-outlined mt-1"
Get Anthropic API key
</a>
<a
class="button is-small is-primary is-outlined mt-1"
href="https://console.mistral.ai/" href="https://console.mistral.ai/"
target="_blank" target="_blank">Get Mistral API key</a>
> <a class="button is-small is-primary is-outlined mt-1"
Get Mistral API key
</a>
<a
class="button is-small is-primary is-outlined mt-1"
href="https://console.groq.com/" href="https://console.groq.com/"
target="_blank" target="_blank">Get Groq API key</a>
> <a class="button is-small is-primary is-outlined mt-1"
Get Groq API key
</a>
<a
class="button is-small is-primary is-outlined mt-1"
href="https://aistudio.google.com/app/apikey" href="https://aistudio.google.com/app/apikey"
target="_blank" target="_blank">Get Google API key</a>
> <a class="button is-small is-primary is-outlined mt-1"
Get Google API key href="https://build.nvidia.com/explore/discover"
</a> target="_blank">Get Nvidia NIM API key</a>
<a <a class="button is-small is-primary is-outlined mt-1"
class="button is-small is-primary is-outlined mt-1"
href="https://docs.perplexity.ai/docs/getting-started" href="https://docs.perplexity.ai/docs/getting-started"
target="_blank" target="_blank">Get Perplexity API key</a>
> <a class="button is-small is-primary is-outlined mt-1"
Get Perplexity API key
</a>
<a
class="button is-small is-primary is-outlined mt-1"
href="https://fireworks.ai/login" href="https://fireworks.ai/login"
target="_blank" target="_blank">Get Fireworks API key</a>
>
Get Fireworks API key
</a>
<h2>Conversations</h2> <h2>Conversations</h2>
<p> <p>
@ -68,10 +43,10 @@
</p> </p>
<p> <p>
To create a new bot, click the "+" button, enter a name and a model, and To create a new bot, click the "+" button, enter a name and a model, and
optionally set a temperature and a system prompt. Once created, you can select optionally set a temperature, a max tokens and a system prompt. Once created,
a bot by clicking on it and reorder it by dragging. Hold SHIFT and click to you can select a bot by clicking on it and reorder it by dragging. Hold SHIFT
select multiple bots. You can delete selected bots by clicking the trash can and click to select multiple bots. You can delete selected bots by clicking
icon. the trash can icon.
</p> </p>
<h2>Multi-Models</h2> <h2>Multi-Models</h2>

View File

@ -5,9 +5,12 @@
<!-- Left column with the icon --> <!-- Left column with the icon -->
{% if IsPlaceholder %} {% if IsPlaceholder %}
<figure class="image is-48x48 message-icon" style="flex-shrink: 0;" <figure class="image is-48x48 message-icon"
style="flex-shrink: 0"
sse-swap="swapIcon-{{ ConversationAreaId }}"> sse-swap="swapIcon-{{ ConversationAreaId }}">
<img src="icons/bouvai2.png" alt="User Image" id="selectedIcon-{{ ConversationAreaId }}"> <img src="icons/bouvai2.png"
alt="User Image"
id="selectedIcon-{{ ConversationAreaId }}">
</figure> </figure>
{% else %} {% else %}
@ -15,7 +18,9 @@
{% for message in Messages %} {% for message in Messages %}
{% if not message.Hidden %} {% if not message.Hidden %}
<figure class="image is-48x48 message-icon" style="flex-shrink: 0;"> <figure class="image is-48x48 message-icon" style="flex-shrink: 0;">
<img src="{{ message.Icon }}" alt="User Image" id="selectedIcon-{{ ConversationAreaId }}"> <img src="{{ message.Icon }}"
alt="User Image"
id="selectedIcon-{{ ConversationAreaId }}">
</figure> </figure>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
@ -27,7 +32,9 @@
<div class="column" id="content-column" style="width: 100px;"> <div class="column" id="content-column" style="width: 100px;">
{% if not IsPlaceholder %} {% if not IsPlaceholder %}
<div class="{% if not notFlex %} is-flex {% endif %} is-align-items-start"> <div class="{% if not notFlex %} is-flex {% endif %} is-align-items-start">
<div class="message-content" style="width: 100%; overflow-y: hidden;" <div class="message-content"
style="width: 100%;
overflow-y: hidden"
id="content-{{ ConversationAreaId }}"> id="content-{{ ConversationAreaId }}">
{% for message in Messages %} {% for message in Messages %}
{% if not message.Hidden %} {% if not message.Hidden %}
@ -39,9 +46,7 @@
</div> </div>
{% endif %} {% endif %}
<div class="message-body"> <div class="message-body">
<div class="content" style="overflow-x: auto; width: 100%;"> <div class="content" style="overflow-x: auto; width: 100%;">{{ message.Content | safe }}</div>
{{ message.Content | safe }}
</div>
</div> </div>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
@ -58,11 +63,15 @@
{% for message in Messages %} {% for message in Messages %}
<button class="button is-small is-primary message-button is-outlined mr-1" <button class="button is-small is-primary message-button is-outlined mr-1"
hx-get="/messageContent?id={{ message.Id }}" hx-target="#content-{{ ConversationAreaId }}" hx-get="/messageContent?id={{ message.Id }}"
onclick="updateIcon('{{ message.Icon }}', '{{ ConversationAreaId }}')" title="{{ message.Name }}"> hx-target="#content-{{ ConversationAreaId }}"
onclick="updateIcon('{{ message.Icon }}', '{{ ConversationAreaId }}')"
title="{{ message.Name }}">
<span class="icon is-small"> <span class="icon is-small">
<img src="{{ message.Icon }}" alt="{{ message.Name }}" <img src="{{ message.Icon }}"
style="max-height: 100%; max-width: 100%;"> alt="{{ message.Name }}"
style="max-height: 100%;
max-width: 100%">
</span> </span>
</button> </button>
{% endfor %} {% endfor %}
@ -71,13 +80,12 @@
{% elif IsPlaceholder %} {% elif IsPlaceholder %}
<div class="is-flex is-align-items-start"> <div class="is-flex is-align-items-start">
<div class="message-content" id="content-{{ ConversationAreaId }}" <div class="message-content"
id="content-{{ ConversationAreaId }}"
sse-swap="swapContent-{{ ConversationAreaId }}"> sse-swap="swapContent-{{ ConversationAreaId }}">
<hx hx-trigger="load" hx-get="/generateMultipleMessages" id="generate-multiple-messages"></hx> <hx hx-trigger="load" hx-get="/generateMultipleMessages" id="generate-multiple-messages"></hx>
<div class='message-header'> <div class='message-header'>
<p> <p>Waiting...</p>
Waiting...
</p>
</div> </div>
<div class="message-body"> <div class="message-body">
<div class="content"> <div class="content">
@ -97,8 +105,10 @@
</button> </button>
{% for selectedLLM in SelectedLLMs %} {% for selectedLLM in SelectedLLMs %}
<button disable class="button is-small is-primary message-button is-outlined mr-1" <button disable
sse-swap="swapSelectionBtn-{{ selectedLLM.ID.String() }}" hx-swap="outerHTML" class="button is-small is-primary message-button is-outlined mr-1"
sse-swap="swapSelectionBtn-{{ selectedLLM.ID.String() }}"
hx-swap="outerHTML"
hx-target="this"> hx-target="this">
<span class="icon is-small"> <span class="icon is-small">
<!--img src="icons/{{ selectedLLM.Company }}.png" alt="{{ selectedLLM.Name }}" <!--img src="icons/{{ selectedLLM.Company }}.png" alt="{{ selectedLLM.Name }}"

View File

@ -10,23 +10,24 @@
<div class="is-flex is-align-items-start mr-5" style="width: 100%;"> <div class="is-flex is-align-items-start mr-5" style="width: 100%;">
<div class="message-content" style="width: 100%;"> <div class="message-content" style="width: 100%;">
<div class="message-header"> <div class="message-header">
<p> <p>You</p>
You
</p>
</div> </div>
<div class="message-body" style="width: 100%;"> <div class="message-body" style="width: 100%;">
<div class="content" id="content-{{ ID }}" style="width: 100%;"> <div class="content" id="content-{{ ID }}" style="width: 100%;">
<div class="field" style="width: 100%;"> <div class="field" style="width: 100%;">
<div class="control" style="width: 100%;"> <div class="control" style="width: 100%;">
<textarea class="textarea is-small has-fixed-size mt-2" <textarea class="textarea is-small has-fixed-size mt-2"
placeholder="Enter your message here" rows="{{ Rows }}" placeholder="Enter your message here"
style="background-color: transparent; width: 100%;" rows="{{ Rows }}"
style="background-color: transparent;
width: 100%"
name="message">{{ Content }}</textarea> name="message">{{ Content }}</textarea>
</div> </div>
</div> </div>
<div class="field is-grouped is-flex is-justify-content-flex-end mb-3"> <div class="field is-grouped is-flex is-justify-content-flex-end mb-3">
<div class="control"> <div class="control">
<button hx-get="/userMessage?id={{ ID }}" hx-target="closest .message-user" <button hx-get="/userMessage?id={{ ID }}"
hx-target="closest .message-user"
class="button is-danger is-outlined is-small"> class="button is-danger is-outlined is-small">
<span class="icon"> <span class="icon">
<i class="fa-solid fa-xmark"></i> <i class="fa-solid fa-xmark"></i>
@ -34,13 +35,19 @@
</button> </button>
</div> </div>
<div class="control"> <div class="control">
<div style="display: none;" hx-trigger="click from:#edit-button-{{ ID }}" <div style="display: none"
hx-target="next .message-bot" hx-swap="outerHTML" hx-get="/empty"></div> hx-trigger="click from:#edit-button-{{ ID }}"
hx-target="next .message-bot"
hx-swap="outerHTML"
hx-get="/empty"></div>
<button class="button is-success is-outlined is-small" <button class="button is-success is-outlined is-small"
hx-post="/editMessage?id={{ ID }}" hx-target="closest .message-user" hx-post="/editMessage?id={{ ID }}"
hx-target="closest .message-user"
hx-include="[name='message']" hx-include="[name='message']"
hx-vals="js:{selectedLLMIds: getSelectedModelsIDs()}" hx-swap="outerHTML" hx-vals="js:{selectedLLMIds: getSelectedModelsIDs()}"
id="edit-button-{{ ID }}" hx-trigger="click"> hx-swap="outerHTML"
id="edit-button-{{ ID }}"
hx-trigger="click">
<span class="icon"> <span class="icon">
<i class="fa-solid fa-check"></i> <i class="fa-solid fa-check"></i>
</span> </span>

View File

@ -10,33 +10,40 @@
<div class="is-flex is-align-items-start"> <div class="is-flex is-align-items-start">
<div class="message-content" style="width: 100%; overflow-y: hidden;"> <div class="message-content" style="width: 100%; overflow-y: hidden;">
<div class="message-header"> <div class="message-header">
<p> <p>You</p>
You
</p>
</div> </div>
<div class="message-body"> <div class="message-body">
<div class="content" style="overflow-x: auto; width: 100%;" id="content-{{ ID }}"> <div class="content"
{{ Content | safe }} style="overflow-x: auto;
</div> width: 100%"
id="content-{{ ID }}">{{ Content | safe }}</div>
</div> </div>
</div> </div>
</div> </div>
<div class="is-flex is-justify-content mt-2"> <div class="is-flex is-justify-content mt-2">
<button id="delete-button-{{ ID }}" hx-post="/deleteMessage?id={{ ID }}" hx-swap="outerHTML" <button id="delete-button-{{ ID }}"
hx-target="#chat-container" class="button is-small is-danger message-button is-outlined mr-5"> hx-post="/deleteMessage?id={{ ID }}"
hx-swap="outerHTML"
hx-target="#chat-container"
class="button is-small is-danger message-button is-outlined mr-5">
<span class="icon"> <span class="icon">
<i class="fa-solid fa-trash"></i> <i class="fa-solid fa-trash"></i>
</span> </span>
</button> </button>
<button id="redo-button-{{ ID }}" class="button is-primary is-small message-button is-outlined mr-1 is-static" <button id="redo-button-{{ ID }}"
hx-post="/redoMessage?id={{ ID }}" hx-swap="innerHTML settle:200ms" hx-target="next .message-bot" class="button is-primary is-small message-button is-outlined mr-1 is-static"
hx-post="/redoMessage?id={{ ID }}"
hx-swap="innerHTML settle:200ms"
hx-target="next .message-bot"
hx-vals="js:{selectedLLMIds: getSelectedModelsIDs()}"> hx-vals="js:{selectedLLMIds: getSelectedModelsIDs()}">
<span class="icon"> <span class="icon">
<i class="fa-solid fa-arrows-rotate"></i> <i class="fa-solid fa-arrows-rotate"></i>
</span> </span>
</button> </button>
<button hx-get="/editMessageForm?id={{ ID }}" hx-target="closest .message-user" <button hx-get="/editMessageForm?id={{ ID }}"
id="edit-button-{{ ID }}" class="button is-primary is-small message-button is-outlined is-static mr-5"> hx-target="closest .message-user"
id="edit-button-{{ ID }}"
class="button is-primary is-small message-button is-outlined is-static mr-5">
<span class="icon"> <span class="icon">
<i class="fa-solid fa-pen"></i> <i class="fa-solid fa-pen"></i>
</span> </span>

View File

@ -1,7 +1,12 @@
<button class="button is-small is-primary message-button is-outlined mr-1" hx-get="/messageContent?id={{ message.Id }}" <button class="button is-small is-primary message-button is-outlined mr-1"
hx-target="#content-{{ ConversationAreaId }}" onclick="updateIcon('{{ message.Icon }}', '{{ ConversationAreaId }}')" hx-get="/messageContent?id={{ message.Id }}"
hx-target="#content-{{ ConversationAreaId }}"
onclick="updateIcon('{{ message.Icon }}', '{{ ConversationAreaId }}')"
title="{{ message.Name }}"> title="{{ message.Name }}">
<span class="icon is-small"> <span class="icon is-small">
<img src="{{ message.Icon }}" alt="{{ message.Name }}" style="max-height: 100%; max-width: 100%;"> <img src="{{ message.Icon }}"
alt="{{ message.Name }}"
style="max-height: 100%;
max-width: 100%">
</span> </span>
</button> </button>

View File

@ -1,6 +1,9 @@
<div class="dropdown is-up is-right {% if IsActive %} is-active {% endif %}" id="conversation-dropdown"> <div class="dropdown is-up is-right {% if IsActive %}is-active{% endif %}"
id="conversation-dropdown">
<div class="dropdown-trigger"> <div class="dropdown-trigger">
<button class="button is-small to-reduce-opacity" aria-haspopup="true" aria-controls="dropdown-menu3" <button class="button is-small to-reduce-opacity"
aria-haspopup="true"
aria-controls="dropdown-menu3"
onclick="this.parentElement.parentElement.classList.toggle('is-active')"> onclick="this.parentElement.parentElement.classList.toggle('is-active')">
<span class="icon"> <span class="icon">
<i class="fa-solid fa-comments"></i> <i class="fa-solid fa-comments"></i>
@ -13,54 +16,69 @@
<div id="conversation-list"> <div id="conversation-list">
{% for Conversation in Conversations %} {% for Conversation in Conversations %}
<div class="icon-text has-text unselected icon-conv {% if Conversation.Selected %}selected{% endif %}" <div class="icon-text has-text unselected icon-conv {% if Conversation.Selected %}selected{% endif %}"
data-id="{{ Conversation.ID.String() }}" style="cursor: pointer;" data-id="{{ Conversation.ID.String() }}"
style="cursor: pointer"
onclick="toggleConversationSelection(this, '{{ Conversation.Name }}')" onclick="toggleConversationSelection(this, '{{ Conversation.Name }}')"
hx-get="/selectConversation?conversation-id={{ Conversation.ID.String() }}" hx-swap="outerHTML" hx-get="/selectConversation?conversation-id={{ Conversation.ID.String() }}"
hx-target="#chat-container" name="{{ Conversation.Name }}"> hx-swap="outerHTML"
hx-target="#chat-container"
name="{{ Conversation.Name }}">
<span>{{ Conversation.Name }}</span> <span>{{ Conversation.Name }}</span>
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
<input class="input is-small mt-2 is-hidden" type="text" id="conversation-name-input" <input class="input is-small mt-2 is-hidden"
name="conversation-name-input" placeholder="Conversation name" autocomplete="off"> type="text"
id="conversation-name-input"
name="conversation-name-input"
placeholder="Conversation name"
autocomplete="off">
<div class="is-flex is-justify-content-space-between mt-4 "> <div class="is-flex is-justify-content-space-between mt-4 ">
<button class="button is-small is-danger {% if SelectedIsDefault %}is-hidden{% endif %}" <button class="button is-small is-danger {% if SelectedIsDefault %}is-hidden{% endif %}"
id="delete-conversation-button" hx-get="/deleteConversation" hx-swap="outerHTML" id="delete-conversation-button"
hx-target="#conversation-dropdown" hx-vals="js:{conversationId: findSelectedConversationID()}"> hx-get="/deleteConversation"
hx-swap="outerHTML"
hx-target="#conversation-dropdown"
hx-vals="js:{conversationId: findSelectedConversationID()}">
<span class="icon"> <span class="icon">
<i class="fa-solid fa-trash"></i> <i class="fa-solid fa-trash"></i>
</span> </span>
</button> </button>
<button <button class="button is-small is-primary is-outlined {% if not SelectedIsDefault %}is-hidden{% endif %}"
class="button is-small is-primary is-outlined {% if not SelectedIsDefault %} is-hidden {% endif %}"
id="archive-default-conversation-button"> id="archive-default-conversation-button">
<span class="icon"> <span class="icon">
<i class="fa-solid fa-box-archive"></i> <i class="fa-solid fa-box-archive"></i>
</span> </span>
</button> </button>
<button class="button is-small is-danger is-outlined is-hidden" id="cancel-conversation-button"> <button class="button is-small is-danger is-outlined is-hidden"
id="cancel-conversation-button">
<span class="icon"> <span class="icon">
<i class="fa-solid fa-xmark"></i> <i class="fa-solid fa-xmark"></i>
</span> </span>
</button> </button>
<div class="is-flex is-justify-content-flex-end"> <div class="is-flex is-justify-content-flex-end">
<button class="button is-small is-success is-outlined" id="create-conversation-button"> <button class="button is-small is-success is-outlined"
id="create-conversation-button">
<span class="icon"> <span class="icon">
<i class="fa-solid fa-plus"></i> <i class="fa-solid fa-plus"></i>
</span> </span>
</button> </button>
<button class="button is-small is-success is-outlined is-hidden" <button class="button is-small is-success is-outlined is-hidden"
id="confirm-conversation-button" hx-get="/createConversation" id="confirm-conversation-button"
hx-include="[name='conversation-name-input']" hx-swap="outerHTML" hx-get="/createConversation"
hx-include="[name='conversation-name-input']"
hx-swap="outerHTML"
hx-target="#conversation-dropdown"> hx-target="#conversation-dropdown">
<span class="icon"> <span class="icon">
<i class="fa-solid fa-check"></i> <i class="fa-solid fa-check"></i>
</span> </span>
</button> </button>
<button class="button is-small is-success is-outlined is-hidden" <button class="button is-small is-success is-outlined is-hidden"
id="confirm-archive-default-conversation-button" hx-post="/archiveDefaultConversation" id="confirm-archive-default-conversation-button"
hx-include="[name='conversation-name-input']" hx-swap="outerHTML" hx-post="/archiveDefaultConversation"
hx-include="[name='conversation-name-input']"
hx-swap="outerHTML"
hx-target="#conversation-dropdown"> hx-target="#conversation-dropdown">
<span class="icon"> <span class="icon">
<i class="fa-solid fa-check"></i> <i class="fa-solid fa-check"></i>

View File

@ -1,6 +1,8 @@
<div class="dropdown is-up is-right" id="models-dropdown"> <div class="dropdown is-up is-right" id="models-dropdown">
<div class="dropdown-trigger"> <div class="dropdown-trigger">
<button class="button is-small to-reduce-opacity" aria-haspopup="true" aria-controls="dropdown-menu3" <button class="button is-small to-reduce-opacity"
aria-haspopup="true"
aria-controls="dropdown-menu3"
onclick="this.parentElement.parentElement.classList.toggle('is-active')"> onclick="this.parentElement.parentElement.classList.toggle('is-active')">
<span class="icon"><i class="fa-solid fa-robot"></i></span> <span class="icon"><i class="fa-solid fa-robot"></i></span>
</button> </button>
@ -10,8 +12,10 @@
<div class="dropdown-item" id="models-list"> <div class="dropdown-item" id="models-list">
<div id="llm-list"> <div id="llm-list">
{% for LLM in LLMs %} {% for LLM in LLMs %}
<div class="icon-text has-text unselected icon-llm" data-id="{{ LLM.ID.String() }}" <div class="icon-text has-text unselected icon-llm"
style="cursor: pointer;" onclick="toggleSelection(this)"> data-id="{{ LLM.ID.String() }}"
style="cursor: pointer"
onclick="toggleSelection(this)">
<span class="icon"> <span class="icon">
<img src="{{ LLM.Model.Company.Icon }}" /> <img src="{{ LLM.Model.Company.Icon }}" />
</span> </span>
@ -20,9 +24,15 @@
{% endfor %} {% endfor %}
</div> </div>
<div class="is-flex is-justify-content-space-between mt-4"> <div class="is-flex is-justify-content-space-between mt-4">
<button disabled class="button is-small is-danger" hx-get="/deleteLLM" hx-swap="outerHTML" <button disabled
hx-target="#models-dropdown" hx-confirm="Are you sure?" hx-trigger="click" class="button is-small is-danger"
hx-vals="js:{selectedLLMIds: getSelectedModelsIDs()}" id="delete-model-button"> hx-get="/deleteLLM"
hx-swap="outerHTML"
hx-target="#models-dropdown"
hx-confirm="Are you sure?"
hx-trigger="click"
hx-vals="js:{selectedLLMIds: getSelectedModelsIDs()}"
id="delete-model-button">
<span class="icon"> <span class="icon">
<i class="fa-solid fa-trash"></i> <i class="fa-solid fa-trash"></i>
</span> </span>
@ -33,7 +43,8 @@
<i class="fa-solid fa-pen"></i> <i class="fa-solid fa-pen"></i>
</span> </span>
</button --> </button -->
<button class="button is-small is-success is-outlined" id="create-model-button"> <button class="button is-small is-success is-outlined"
id="create-model-button">
<span class="icon"> <span class="icon">
<i class="fa-solid fa-plus"></i> <i class="fa-solid fa-plus"></i>
</span> </span>
@ -42,13 +53,22 @@
</div> </div>
</div> </div>
<div class="dropdown-item is-hidden" id="models-creation"> <div class="dropdown-item is-hidden" id="models-creation">
<form id="create-model-form" hx-post="/createLLM" hx-target="#models-dropdown" hx-swap="outerHTML"> <form id="create-model-form"
<input class="input is-small mb-3" type="text" id="model-name-input" name="model-name-input" hx-post="/createLLM"
placeholder="Model name" autocomplete="off"> hx-target="#models-dropdown"
hx-swap="outerHTML">
<input class="input is-small mb-3"
type="text"
id="model-name-input"
name="model-name-input"
placeholder="Model name"
autocomplete="off">
<div class="select is-fullwidth is-small mb-3" id="model-id-input"> <div class="select is-fullwidth is-small mb-3" id="model-id-input">
<select name="selectedLLMId"> <select name="selectedLLMId">
{% for modelInfo in ModelInfos %} {% for modelInfo in ModelInfos %}
<option value="{{ modelInfo.ModelID }}">{{ modelInfo.Company.Name }} - {{ modelInfo.Name }}</option> <option value="{{ modelInfo.ModelID }}">
{{ modelInfo.Company.Name }} - {{ modelInfo.Name }}
</option>
{% endfor %} {% endfor %}
<option value="{% if IsPremium %}custom{% else %}none{% endif %}">Custom Endpoints</option> <option value="{% if IsPremium %}custom{% else %}none{% endif %}">Custom Endpoints</option>
</select> </select>
@ -56,30 +76,62 @@
<p class="is-hidden" style="color: red;" id="endpoint-error"> <p class="is-hidden" style="color: red;" id="endpoint-error">
<small>Need premium subscription</small> <small>Need premium subscription</small>
</p> </p>
<input class="input is-small mb-3 is-hidden" type="text" id="model-cid-input" name="model-cid-input" <input class="input is-small mb-3 is-hidden"
placeholder="Model id" autocomplete="off"> type="text"
<input class="input is-small mb-3 is-hidden" type="text" id="model-url-input" name="model-url-input" id="model-cid-input"
placeholder="URL (with /v1/chat/completions)" autocomplete="off"> name="model-cid-input"
<input class="input is-small mb-3 is-hidden" type="text" id="model-key-input" name="model-key-input" placeholder="Model id"
placeholder="Token" autocomplete="off"> autocomplete="off">
<p><small>Temperature:</small></p> <input class="input is-small mb-3 is-hidden"
<input class="slider is-small mb-3" step="0.05" min="0" max="2" value="0" type="range" type="text"
id="temperature-slider" name="temperature-slider"> id="model-url-input"
name="model-url-input"
placeholder="URL (with /v1/chat/completions)"
autocomplete="off">
<input class="input is-small mb-3 is-hidden"
type="text"
id="model-key-input"
name="model-key-input"
placeholder="Token"
autocomplete="off">
<p>
<small>Temperature:</small>
</p>
<input class="slider is-small mb-3"
step="0.05"
min="0"
max="2"
value="0"
type="range"
id="temperature-slider"
name="temperature-slider">
<output id="temperature-slider-output">0</output> <output id="temperature-slider-output">0</output>
<p><small>Max token (optional):</small></p> <p>
<input class="input is-small mb-3" type="number" id="max-token-input" name="max-token-input" <small>Max token (optional):</small>
placeholder="" autocomplete="off"> </p>
<p><small>System prompt (optional):</small></p> <input class="input is-small mb-3"
<textarea class="textarea is-small mb-5 has-fixed-size" id="model-prompt-input" type="number"
id="max-token-input"
name="max-token-input"
placeholder=""
autocomplete="off">
<p>
<small>System prompt (optional):</small>
</p>
<textarea class="textarea is-small mb-5 has-fixed-size"
id="model-prompt-input"
name="model-prompt-input"></textarea> name="model-prompt-input"></textarea>
<div class="is-flex is-justify-content-flex-end"> <div class="is-flex is-justify-content-flex-end">
<button class="button is-small is-danger is-outlined mr-3" id="cancel-create-model-button" <button class="button is-small is-danger is-outlined mr-3"
id="cancel-create-model-button"
type="button"> type="button">
<span class="icon"> <span class="icon">
<i class="fa-solid fa-xmark"></i> <i class="fa-solid fa-xmark"></i>
</span> </span>
</button> </button>
<button disabled class="button is-small is-success" id="confirm-create-model-button" <button disabled
class="button is-small is-success"
id="confirm-create-model-button"
type="submit"> type="submit">
<span class="icon"> <span class="icon">
<i class="fa-solid fa-check"></i> <i class="fa-solid fa-check"></i>

View File

@ -1,7 +1,8 @@
<div class="dropdown is-up is-right" id="settings-dropdown"> <div class="dropdown is-up is-right" id="settings-dropdown">
<div class="dropdown-trigger"> <div class="dropdown-trigger">
<button class="button is-small {% if not AnyExists %}is-danger{% endif %} to-reduce-opacity" <button class="button is-small {% if not AnyExists %}is-danger{% endif %} to-reduce-opacity"
aria-haspopup="true" aria-controls="dropdown-menu3" aria-haspopup="true"
aria-controls="dropdown-menu3"
onclick="this.parentElement.parentElement.classList.toggle('is-active')"> onclick="this.parentElement.parentElement.classList.toggle('is-active')">
<span class="icon"><i class="fa-solid fa-bars"></i></i></span> <span class="icon"><i class="fa-solid fa-bars"></i></i></span>
</button> </button>
@ -10,12 +11,18 @@
<div class="dropdown-content"> <div class="dropdown-content">
<div class="dropdown-item"> <div class="dropdown-item">
<div class="field"> <div class="field">
<form id="api-keys-form" hx-post="/addKeys" hx-trigger="submit" hx-target="#api-keys-status"> <form id="api-keys-form"
hx-post="/addKeys"
hx-trigger="submit"
hx-target="#api-keys-status">
<div class="field has-addons is-hidden" id="openai-field"> <div class="field has-addons is-hidden" id="openai-field">
<p class="control has-icons-left is-expanded"> <p class="control has-icons-left is-expanded">
<input class="input is-small {% if OpenaiExists %}is-success{% endif %}" type="text" <input class="input is-small {% if OpenaiExists %}is-success{% endif %}"
{%if not IsLogin %}disabled{% endif %} placeholder="OpenAI API key" type="text"
name="openai_key" autocomplete="off"> {% if not IsLogin %}disabled{% endif %}
placeholder="OpenAI API key"
name="openai_key"
autocomplete="off">
<span class="icon is-small is-left"> <span class="icon is-small is-left">
<i class="fas fa-lock"></i> <i class="fas fa-lock"></i>
</span> </span>
@ -23,9 +30,12 @@
</div> </div>
<div class="field has-addons is-hidden" id="anthropic-field"> <div class="field has-addons is-hidden" id="anthropic-field">
<p class="control has-icons-left is-expanded"> <p class="control has-icons-left is-expanded">
<input class="input is-small {% if AnthropicExists %}is-success{% endif %}" type="text" <input class="input is-small {% if AnthropicExists %}is-success{% endif %}"
{% if not IsLogin %}disabled{% endif %} placeholder="Anthropic API key" type="text"
name="anthropic_key" autocomplete="off"> {% if not IsLogin %}disabled{% endif %}
placeholder="Anthropic API key"
name="anthropic_key"
autocomplete="off">
<span class="icon is-small is-left"> <span class="icon is-small is-left">
<i class="fas fa-lock"></i> <i class="fas fa-lock"></i>
</span> </span>
@ -33,9 +43,12 @@
</div> </div>
<div class="field has-addons is-hidden" id="mistral-field"> <div class="field has-addons is-hidden" id="mistral-field">
<p class="control has-icons-left is-expanded"> <p class="control has-icons-left is-expanded">
<input class="input is-small {% if MistralExists %}is-success{% endif %}" type="text" <input class="input is-small {% if MistralExists %}is-success{% endif %}"
{%if not IsLogin %}disabled{% endif %} placeholder="Mistral API key" type="text"
name="mistral_key" autocomplete="off"> {% if not IsLogin %}disabled{% endif %}
placeholder="Mistral API key"
name="mistral_key"
autocomplete="off">
<span class="icon is-small is-left"> <span class="icon is-small is-left">
<i class="fas fa-lock"></i> <i class="fas fa-lock"></i>
</span> </span>
@ -43,8 +56,11 @@
</div> </div>
<div class="field has-addons is-hidden" id="groq-field"> <div class="field has-addons is-hidden" id="groq-field">
<p class="control has-icons-left is-expanded"> <p class="control has-icons-left is-expanded">
<input class="input is-small {% if GroqExists %}is-success{% endif %}" type="text" <input class="input is-small {% if GroqExists %}is-success{% endif %}"
placeholder="Groq API key" {%if not IsLogin %}disabled{% endif %} name="groq_key" type="text"
placeholder="Groq API key"
{% if not IsLogin %}disabled{% endif %}
name="groq_key"
autocomplete="off"> autocomplete="off">
<span class="icon is-small is-left"> <span class="icon is-small is-left">
<i class="fas fa-lock"></i> <i class="fas fa-lock"></i>
@ -53,8 +69,11 @@
</div> </div>
<div class="field has-addons is-hidden" id="gemini-field"> <div class="field has-addons is-hidden" id="gemini-field">
<p class="control has-icons-left is-expanded"> <p class="control has-icons-left is-expanded">
<input class="input is-small {% if GoogleExists %}is-success{% endif %}" type="text" <input class="input is-small {% if GoogleExists %}is-success{% endif %}"
placeholder="Google API key" name="google_key" autocomplete="off"> type="text"
placeholder="Google API key"
name="google_key"
autocomplete="off">
<span class="icon is-small is-left"> <span class="icon is-small is-left">
<i class="fas fa-lock"></i> <i class="fas fa-lock"></i>
</span> </span>
@ -62,8 +81,11 @@
</div> </div>
<div class="field has-addons is-hidden" id="nim-field"> <div class="field has-addons is-hidden" id="nim-field">
<p class="control has-icons-left is-expanded"> <p class="control has-icons-left is-expanded">
<input class="input is-small {% if NimExists %}is-success{% endif %}" type="text" <input class="input is-small {% if NimExists %}is-success{% endif %}"
placeholder="NIM API key" name="nim_key" autocomplete="off"> type="text"
placeholder="NIM API key"
name="nim_key"
autocomplete="off">
<span class="icon is-small is-left"> <span class="icon is-small is-left">
<i class="fas fa-lock"></i> <i class="fas fa-lock"></i>
</span> </span>
@ -71,8 +93,11 @@
</div> </div>
<div class="field has-addons is-hidden" id="perplexity-field"> <div class="field has-addons is-hidden" id="perplexity-field">
<p class="control has-icons-left is-expanded"> <p class="control has-icons-left is-expanded">
<input class="input is-small {% if PerplexityExists %}is-success{% endif %}" type="text" <input class="input is-small {% if PerplexityExists %}is-success{% endif %}"
placeholder="Perplexity API key" name="perplexity_key" autocomplete="off"> type="text"
placeholder="Perplexity API key"
name="perplexity_key"
autocomplete="off">
<span class="icon is-small is-left"> <span class="icon is-small is-left">
<i class="fas fa-lock"></i> <i class="fas fa-lock"></i>
</span> </span>
@ -80,19 +105,27 @@
</div> </div>
<div class="field has-addons is-hidden" id="fireworks-field"> <div class="field has-addons is-hidden" id="fireworks-field">
<p class="control has-icons-left is-expanded"> <p class="control has-icons-left is-expanded">
<input class="input is-small {% if FireworksExists %}is-success{% endif %}" type="text" <input class="input is-small {% if FireworksExists %}is-success{% endif %}"
placeholder="Fireworks API key" name="fireworks_key" autocomplete="off"> type="text"
placeholder="Fireworks API key"
name="fireworks_key"
autocomplete="off">
<span class="icon is-small is-left"> <span class="icon is-small is-left">
<i class="fas fa-lock"></i> <i class="fas fa-lock"></i>
</span> </span>
</p> </p>
</div> </div>
<div class="field has-addons is-hidden" id="goose-field" <div class="field has-addons is-hidden"
id="goose-field"
title="GooseAI chat API will be available soon"> title="GooseAI chat API will be available soon">
<p class="control has-icons-left is-expanded"> <p class="control has-icons-left is-expanded">
<input class="input is-small {% if GooseaiExists %}is-success{% endif %}" type="text" <input class="input is-small {% if GooseaiExists %}is-success{% endif %}"
{%if not IsLogin %}disabled{% endif %} placeholder="Gooseai API key" type="text"
name="goose_key" autocomplete="off" disabled> {% if not IsLogin %}disabled{% endif %}
placeholder="Gooseai API key"
name="goose_key"
autocomplete="off"
disabled>
<span class="icon is-small is-left"> <span class="icon is-small is-left">
<i class="fas fa-lock"></i> <i class="fas fa-lock"></i>
</span> </span>
@ -108,7 +141,8 @@
</button> </button>
</p> </p>
<p class="control"> <p class="control">
<button id="toggle-keys-button" type="button" <button id="toggle-keys-button"
type="button"
class="button is-small {% if not AnyExists %}is-danger{% endif %}"> class="button is-small {% if not AnyExists %}is-danger{% endif %}">
<span class="icon is-small"> <span class="icon is-small">
<i class="fa-solid fa-chevron-down"></i> <i class="fa-solid fa-chevron-down"></i>
@ -120,15 +154,20 @@
<p id="api-keys-status"></p> <p id="api-keys-status"></p>
</div> </div>
{% if isBasic or isPremium %} {% if isBasic or isPremium %}
<a class="button is-small mt-1" href="{{ StripeSubLink }}" target="_blank"> <a class="button is-small mt-1"
<span class="icon is-small" {% if isPremium %}style="color: #b00202" {%else%}style="color: #126d0f" href="{{ StripeSubLink }}"
{% endif %}> target="_blank">
<span class="icon is-small"
{% if isPremium %}style="color: #b00202" {% else %}style="color: #126d0f" {% endif %}>
<i class="fa-solid fa-heart"></i> <i class="fa-solid fa-heart"></i>
</span> </span>
<span>Manage subscription</span> <span>Manage subscription</span>
</a> </a>
{% else %} {% else %}
<a class="button is-small mt-1" hx-get="/pricingTable" hx-target="#chat-container" hx-swap="outerHTML" <a class="button is-small mt-1"
hx-get="/pricingTable"
hx-target="#chat-container"
hx-swap="outerHTML"
hx-trigger="click"> hx-trigger="click">
<span class="icon is-small"> <span class="icon is-small">
<i class="fa-solid fa-heart"></i> <i class="fa-solid fa-heart"></i>
@ -136,14 +175,20 @@
<span>Subscribe to JADE</span> <span>Subscribe to JADE</span>
</a> </a>
{% endif %} {% endif %}
<a class="button is-small mt-1" hx-get="/generateTermAndService" hx-target="#chat-container" <a class="button is-small mt-1"
hx-swap="outerHTML" hx-trigger="click"> hx-get="/generateTermAndService"
hx-target="#chat-container"
hx-swap="outerHTML"
hx-trigger="click">
<span class="icon is-small"> <span class="icon is-small">
<i class="fa-regular fa-file-lines"></i> <i class="fa-regular fa-file-lines"></i>
</span> </span>
<span>Terms and conditions</span> <span>Terms and conditions</span>
</a> </a>
<a class="button is-small mt-1" hx-get="/help" hx-target="#chat-container" hx-swap="outerHTML" <a class="button is-small mt-1"
hx-get="/help"
hx-target="#chat-container"
hx-swap="outerHTML"
hx-trigger="click"> hx-trigger="click">
<span class="icon is-small"> <span class="icon is-small">
<i class="fa-solid fa-info"></i> <i class="fa-solid fa-info"></i>

View File

@ -1,6 +1,9 @@
<div class="dropdown is-up is-right {% if IsActive %} is-active{% endif %}" id="usage-dropdown"> <div class="dropdown is-up is-right {% if IsActive %}is-active{% endif %}"
id="usage-dropdown">
<div class="dropdown-trigger"> <div class="dropdown-trigger">
<button class="button is-small to-reduce-opacity" aria-haspopup="true" aria-controls="dropdown-menu3" <button class="button is-small to-reduce-opacity"
aria-haspopup="true"
aria-controls="dropdown-menu3"
onclick="this.parentElement.parentElement.classList.toggle('is-active')"> onclick="this.parentElement.parentElement.classList.toggle('is-active')">
<span class="icon"><i class="fa-regular fa-money-bill-1"></i></span> <span class="icon"><i class="fa-regular fa-money-bill-1"></i></span>
</button> </button>
@ -9,8 +12,12 @@
<div class="dropdown-content"> <div class="dropdown-content">
<div class="dropdown-item"> <div class="dropdown-item">
<!-- Placeholder for additional text --> <!-- Placeholder for additional text -->
<div class="content" id="usage-content" style="max-height: 30vh; overflow-y: auto;"> <div class="content"
<table class="table is-narrow is-fullwidth is-striped" style="max-width: 200px;"> id="usage-content"
style="max-height: 30vh;
overflow-y: auto">
<table class="table is-narrow is-fullwidth is-striped"
style="max-width: 200px">
<tbody> <tbody>
{% for usage in usages %} {% for usage in usages %}
<tr> <tr>
@ -32,34 +39,36 @@
<div class="content totalCostCell"> <div class="content totalCostCell">
<p> <p>
<strong>Total:</strong> <strong>Total:</strong>
<span class="totalCost"> <span class="totalCost">{{ TotalCost|floatformat:2 }}$</span>
{{ TotalCost|floatformat:2 }}$
</span>
</p> </p>
</div> </div>
<!-- Total count --> <!-- Total count -->
<div class="content is-hidden totalCountCell"> <div class="content is-hidden totalCountCell">
<p> <p>
<strong>Total:</strong> <strong>Total:</strong>
<span class="totalCount"> <span class="totalCount">{{ TotalCount }} messages</span>
{{ TotalCount }} messages
</span>
</p> </p>
</div> </div>
<!-- Top buttons --> <!-- Top buttons -->
<div class="buttons has-addons is-centered"> <div class="buttons has-addons is-centered">
<button class="button is-small is-primary" title="Money Spent" id="money-spent-button"> <button class="button is-small is-primary"
title="Money Spent"
id="money-spent-button">
<span class="icon ml-4 mr-4"><i class="fa-regular fa-money-bill-1"></i></span> <span class="icon ml-4 mr-4"><i class="fa-regular fa-money-bill-1"></i></span>
</button> </button>
<button class="button is-small" title="Messages Sent" id="messages-sent-button"> <button class="button is-small"
title="Messages Sent"
id="messages-sent-button">
<span class="icon ml-4 mr-4"><i class="fa-regular fa-envelope"></i></span> <span class="icon ml-4 mr-4"><i class="fa-regular fa-envelope"></i></span>
</button> </button>
</div> </div>
<!-- Row with text and buttons --> <!-- Row with text and buttons -->
<div class="level is-mobile"> <div class="level is-mobile">
<div class="level-left"> <div class="level-left">
<button class="button is-small" hx-get="/loadUsageKPI?month={{ DateID }}&offset=-1" <button class="button is-small"
hx-swap="outerHTML" hx-target="#usage-dropdown"> hx-get="/loadUsageKPI?month={{ DateID }}&offset=-1"
hx-swap="outerHTML"
hx-target="#usage-dropdown">
<span class="icon"><i class="fa-solid fa-chevron-left"></i></span> <span class="icon"><i class="fa-solid fa-chevron-left"></i></span>
</button> </button>
</div> </div>
@ -67,8 +76,10 @@
<p>{{ Date }}</p> <p>{{ Date }}</p>
</div> </div>
<div class="level-right"> <div class="level-right">
<button class="button is-small" hx-get="/loadUsageKPI?month={{ DateID }}&offset=1" <button class="button is-small"
hx-swap="outerHTML" hx-target="#usage-dropdown"> hx-get="/loadUsageKPI?month={{ DateID }}&offset=1"
hx-swap="outerHTML"
hx-target="#usage-dropdown">
<span class="icon"><i class="fa-solid fa-chevron-right"></i></span> <span class="icon"><i class="fa-solid fa-chevron-right"></i></span>
</button> </button>
</div> </div>

View File

@ -1,5 +1,6 @@
<h1 class="title is-1">JADE: Simple Multi-Model Chatbot</h1> <h1 class="title is-1">JADE: Simple Multi-Model Chatbot</h1>
<br /><br /> <br />
<br />
<p> <p>
I often use LLMs and quickly found myself asking GPT4, Gemini and Claude the I often use LLMs and quickly found myself asking GPT4, Gemini and Claude the
same question. I wanted to be able to ask the same question to multiple same question. I wanted to be able to ask the same question to multiple
@ -15,18 +16,15 @@
When asking a question, you can use multiple models and compare their When asking a question, you can use multiple models and compare their
responses to choose the best one. responses to choose the best one.
</li> </li>
<li> <li>The selected response can be used for the next message across all models.</li>
The selected response can be used for the next message across all models.
</li>
</ol> </ol>
<p>For example, a response from GPT-4 Omni can be used by Claude Haiku.</p> <p>For example, a response from GPT-4 Omni can be used by Claude Haiku.</p>
<a class="button is-primary mt-2 mb-2" href="/signin"> <a class="button is-primary mt-2 mb-2" href="/signin">Try JADE now for free!</a>
Try JADE now for free!
</a>
<br /><br /> <br />
<br />
<h2>More information</h2> <h2>More information</h2>
<p> <p>
@ -39,32 +37,33 @@
<ul> <ul>
<li> <li>
<h3> <h3>
Get access to all models.<button Get access to all models.
class="button ml-2 is-small is-primary is-outlined" <button class="button ml-2 is-small is-primary is-outlined"
onclick="toggleDetails('all-models-details')" onclick="toggleDetails('all-models-details')">
>
<span class="icon is-small"> <span class="icon is-small">
<i class="fa-solid fa-info"></i> <i class="fa-solid fa-info"></i>
</span> </span>
</button> </button>
</h3> </h3>
<p id="all-models-details" style="display: none"> <p id="all-models-details" style="display: none">
With JADE, you can easily switch between models like GPT 3.5 or 4o, With JADE, you can easily switch between models like GPT 3.5 or 4o, Gemini, Llama, Mistral, Claude, and more. Even custom endpoint.
Gemini, Llama, Mistral, Claude, and more. Even custom endpoint. <br />
<br /><br />This means you can choose the best model for your specific <br />
This means you can choose the best model for your specific
needs, whether it's for general knowledge, creative writing, or technical needs, whether it's for general knowledge, creative writing, or technical
expertise. Having access to multiple models allows you to take advantage expertise. Having access to multiple models allows you to take advantage
of their unique strengths and weaknesses, ensuring you get the most of their unique strengths and weaknesses, ensuring you get the most
accurate and relevant responses. (See all models available in the last accurate and relevant responses. (See all models available in the last
section)<br /><br /> section)
<br />
<br />
</p> </p>
</li> </li>
<li> <li>
<h3> <h3>
Get the best answer from multiple models.<button Get the best answer from multiple models.
class="button ml-2 is-small is-primary is-outlined" <button class="button ml-2 is-small is-primary is-outlined"
onclick="toggleDetails('multi-models-details')" onclick="toggleDetails('multi-models-details')">
>
<span class="icon is-small"> <span class="icon is-small">
<i class="fa-solid fa-info"></i> <i class="fa-solid fa-info"></i>
</span> </span>
@ -73,16 +72,19 @@
<p id="multi-models-details" style="display: none"> <p id="multi-models-details" style="display: none">
You can ask a question and receive responses from several models at once, You can ask a question and receive responses from several models at once,
enabling you to compare their answers and choose the most suitable one. enabling you to compare their answers and choose the most suitable one.
<br /><br />This feature is particularly useful for complex queries where <br />
different models might offer unique insights or solutions.<br /><br /> <br />
This feature is particularly useful for complex queries where
different models might offer unique insights or solutions.
<br />
<br />
</p> </p>
</li> </li>
<li> <li>
<h3> <h3>
Even from the same model.<button Even from the same model.
class="button ml-2 is-small is-primary is-outlined" <button class="button ml-2 is-small is-primary is-outlined"
onclick="toggleDetails('same-models-details')" onclick="toggleDetails('same-models-details')">
>
<span class="icon is-small"> <span class="icon is-small">
<i class="fa-solid fa-info"></i> <i class="fa-solid fa-info"></i>
</span> </span>
@ -90,17 +92,21 @@
</h3> </h3>
<p id="same-models-details" style="display: none"> <p id="same-models-details" style="display: none">
The core feature of JADE are the bots. Each bot have a name, model, The core feature of JADE are the bots. Each bot have a name, model,
temperature and system prompt. <br /><br />You can create as many bot as temperature and system prompt.
<br />
<br />
You can create as many bot as
you want and select as many to answer each question. An example is you want and select as many to answer each question. An example is
creating the same model that reponse in different language.<br /><br /> creating the same model that reponse in different language.
<br />
<br />
</p> </p>
</li> </li>
<li> <li>
<h3> <h3>
Reduce Hallucination.<button Reduce Hallucination.
class="button is-small ml-2 is-primary is-outlined" <button class="button is-small ml-2 is-primary is-outlined"
onclick="toggleDetails('reduce-hallucination-details')" onclick="toggleDetails('reduce-hallucination-details')">
>
<span class="icon is-small"> <span class="icon is-small">
<i class="fa-solid fa-info"></i> <i class="fa-solid fa-info"></i>
</span> </span>
@ -108,17 +114,21 @@
</h3> </h3>
<p id="reduce-hallucination-details" style="display: none"> <p id="reduce-hallucination-details" style="display: none">
AI models sometimes generate information that is inaccurate or misleading, AI models sometimes generate information that is inaccurate or misleading,
a phenomenon known as "hallucination." <br /><br />By using multiple a phenomenon known as "hallucination."
<br />
<br />
By using multiple
models, JADE reduces each model's bias. This ensures that the responses models, JADE reduces each model's bias. This ensures that the responses
you receive are more reliable and trustworthy.<br /><br /> you receive are more reliable and trustworthy.
<br />
<br />
</p> </p>
</li> </li>
<li> <li>
<h3> <h3>
Pay only for what you use or not at all.<button Pay only for what you use or not at all.
class="button ml-2 is-small is-primary is-outlined" <button class="button ml-2 is-small is-primary is-outlined"
onclick="toggleDetails('flexible-pricing-details')" onclick="toggleDetails('flexible-pricing-details')">
>
<span class="icon is-small"> <span class="icon is-small">
<i class="fa-solid fa-info"></i> <i class="fa-solid fa-info"></i>
</span> </span>
@ -126,19 +136,26 @@
</h3> </h3>
<p id="flexible-pricing-details" style="display: none"> <p id="flexible-pricing-details" style="display: none">
JADE use API, so you get access to free credits or tiers depending of the JADE use API, so you get access to free credits or tiers depending of the
provider (see next section). <br /><br />This is particularly beneficial provider (see next section).
<br />
<br />
This is particularly beneficial
for users who may not need to use the chatbot extensively. Once the free for users who may not need to use the chatbot extensively. Once the free
credit use, you pay based on the length of you message and the response credit use, you pay based on the length of you message and the response
generated in tokens (a token is around 3 characters). Groq and Google also generated in tokens (a token is around 3 characters). Groq and Google also
offer free tiers that are enough for conversation.<<br /><br />The app itself is free until 200 messages per month then 0.95$ per month.<br /><br /> offer free tiers that are enough for conversation.<
<br />
<br />
The app itself is free until 200 messages per month then 0.95$ per month.
<br />
<br />
</p> </p>
</li> </li>
<li> <li>
<h3> <h3>
All providers and models.<button All providers and models.
class="button ml-2 is-small is-primary is-outlined" <button class="button ml-2 is-small is-primary is-outlined"
onclick="toggleDetails('provider-details')" onclick="toggleDetails('provider-details')">
>
<span class="icon is-small"> <span class="icon is-small">
<i class="fa-solid fa-info"></i> <i class="fa-solid fa-info"></i>
</span> </span>