Skip to content

Commit

Permalink
Merge branch 'dev' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
tjbck authored Mar 21, 2024
2 parents b22ed64 + ae347bb commit 6313a98
Show file tree
Hide file tree
Showing 26 changed files with 1,870 additions and 247 deletions.
2 changes: 1 addition & 1 deletion backend/apps/ollama/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -709,7 +709,7 @@ class GenerateChatCompletionForm(BaseModel):
format: Optional[str] = None
options: Optional[dict] = None
template: Optional[str] = None
stream: Optional[bool] = True
stream: Optional[bool] = None
keep_alive: Optional[Union[int, str]] = None


Expand Down
2 changes: 2 additions & 0 deletions backend/apps/web/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
DEFAULT_USER_ROLE,
ENABLE_SIGNUP,
USER_PERMISSIONS,
WEBHOOK_URL,
)

app = FastAPI()
Expand All @@ -32,6 +33,7 @@
app.state.DEFAULT_PROMPT_SUGGESTIONS = DEFAULT_PROMPT_SUGGESTIONS
app.state.DEFAULT_USER_ROLE = DEFAULT_USER_ROLE
app.state.USER_PERMISSIONS = USER_PERMISSIONS
app.state.WEBHOOK_URL = WEBHOOK_URL


app.add_middleware(
Expand Down
14 changes: 13 additions & 1 deletion backend/apps/web/routers/auths.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@
create_token,
)
from utils.misc import parse_duration, validate_email_format
from constants import ERROR_MESSAGES
from utils.webhook import post_webhook
from constants import ERROR_MESSAGES, WEBHOOK_MESSAGES

router = APIRouter()

Expand Down Expand Up @@ -155,6 +156,17 @@ async def signup(request: Request, form_data: SignupForm):
)
# response.set_cookie(key='token', value=token, httponly=True)

if request.app.state.WEBHOOK_URL:
post_webhook(
request.app.state.WEBHOOK_URL,
WEBHOOK_MESSAGES.USER_SIGNUP(user.name),
{
"action": "signup",
"message": WEBHOOK_MESSAGES.USER_SIGNUP(user.name),
"user": user.model_dump_json(exclude_none=True),
},
)

return {
"token": token,
"token_type": "Bearer",
Expand Down
8 changes: 7 additions & 1 deletion backend/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -290,13 +290,19 @@ def create_config_file(file_path):


DEFAULT_USER_ROLE = os.getenv("DEFAULT_USER_ROLE", "pending")
USER_PERMISSIONS = {"chat": {"deletion": True}}

USER_PERMISSIONS_CHAT_DELETION = (
os.environ.get("USER_PERMISSIONS_CHAT_DELETION", "True").lower() == "true"
)

USER_PERMISSIONS = {"chat": {"deletion": USER_PERMISSIONS_CHAT_DELETION}}


MODEL_FILTER_ENABLED = os.environ.get("MODEL_FILTER_ENABLED", False)
MODEL_FILTER_LIST = os.environ.get("MODEL_FILTER_LIST", "")
MODEL_FILTER_LIST = [model.strip() for model in MODEL_FILTER_LIST.split(";")]

WEBHOOK_URL = os.environ.get("WEBHOOK_URL", "")

####################################
# WEBUI_VERSION
Expand Down
9 changes: 8 additions & 1 deletion backend/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@ class MESSAGES(str, Enum):
DEFAULT = lambda msg="": f"{msg if msg else ''}"


class WEBHOOK_MESSAGES(str, Enum):
DEFAULT = lambda msg="": f"{msg if msg else ''}"
USER_SIGNUP = lambda username="": (
f"New user signed up: {username}" if username else "New user signed up"
)


class ERROR_MESSAGES(str, Enum):
def __str__(self) -> str:
return super().__str__()
Expand Down Expand Up @@ -46,7 +53,7 @@ def __str__(self) -> str:

PANDOC_NOT_INSTALLED = "Pandoc is not installed on the server. Please contact your administrator for assistance."
INCORRECT_FORMAT = (
lambda err="": f"Invalid format. Please use the correct format{err if err else ''}"
lambda err="": f"Invalid format. Please use the correct format{err}"
)
RATE_LIMIT_EXCEEDED = "API rate limit exceeded"

Expand Down
2 changes: 1 addition & 1 deletion backend/data/config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "0.0.1",
"version": 0,
"ui": {
"prompt_suggestions": [
{
Expand Down
28 changes: 27 additions & 1 deletion backend/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
FRONTEND_BUILD_DIR,
MODEL_FILTER_ENABLED,
MODEL_FILTER_LIST,
WEBHOOK_URL,
)
from constants import ERROR_MESSAGES

Expand All @@ -58,6 +59,9 @@ async def get_response(self, path: str, scope):
app.state.MODEL_FILTER_ENABLED = MODEL_FILTER_ENABLED
app.state.MODEL_FILTER_LIST = MODEL_FILTER_LIST

app.state.WEBHOOK_URL = WEBHOOK_URL


origins = ["*"]


Expand Down Expand Up @@ -178,7 +182,7 @@ class ModelFilterConfigForm(BaseModel):


@app.post("/api/config/model/filter")
async def get_model_filter_config(
async def update_model_filter_config(
form_data: ModelFilterConfigForm, user=Depends(get_admin_user)
):

Expand All @@ -197,6 +201,28 @@ async def get_model_filter_config(
}


@app.get("/api/webhook")
async def get_webhook_url(user=Depends(get_admin_user)):
return {
"url": app.state.WEBHOOK_URL,
}


class UrlForm(BaseModel):
url: str


@app.post("/api/webhook")
async def update_webhook_url(form_data: UrlForm, user=Depends(get_admin_user)):
app.state.WEBHOOK_URL = form_data.url

webui_app.state.WEBHOOK_URL = app.state.WEBHOOK_URL

return {
"url": app.state.WEBHOOK_URL,
}


@app.get("/api/version")
async def get_app_config():

Expand Down
20 changes: 20 additions & 0 deletions backend/utils/webhook.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import requests


def post_webhook(url: str, message: str, event_data: dict) -> bool:
try:
payload = {}

if "https://hooks.slack.com" in url:
payload["text"] = message
elif "https://discord.com/api/webhooks" in url:
payload["content"] = message
else:
payload = {**event_data}

r = requests.post(url, json=payload)
r.raise_for_status()
return True
except Exception as e:
print(e)
return False
57 changes: 57 additions & 0 deletions src/lib/apis/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -139,3 +139,60 @@ export const updateModelFilterConfig = async (

return res;
};

export const getWebhookUrl = async (token: string) => {
let error = null;

const res = await fetch(`${WEBUI_BASE_URL}/api/webhook`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`
}
})
.then(async (res) => {
if (!res.ok) throw await res.json();
return res.json();
})
.catch((err) => {
console.log(err);
error = err;
return null;
});

if (error) {
throw error;
}

return res.url;
};

export const updateWebhookUrl = async (token: string, url: string) => {
let error = null;

const res = await fetch(`${WEBUI_BASE_URL}/api/webhook`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`
},
body: JSON.stringify({
url: url
})
})
.then(async (res) => {
if (!res.ok) throw await res.json();
return res.json();
})
.catch((err) => {
console.log(err);
error = err;
return null;
});

if (error) {
throw error;
}

return res.url;
};
27 changes: 26 additions & 1 deletion src/lib/components/admin/Settings/General.svelte
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<script lang="ts">
import { getWebhookUrl, updateWebhookUrl } from '$lib/apis';
import {
getDefaultUserRole,
getJWTExpiresDuration,
Expand All @@ -16,6 +17,8 @@
let defaultUserRole = 'pending';
let JWTExpiresIn = '';
let webhookUrl = '';
const toggleSignUpEnabled = async () => {
signUpEnabled = await toggleSignUpEnabledStatus(localStorage.token);
};
Expand All @@ -28,18 +31,23 @@
JWTExpiresIn = await updateJWTExpiresDuration(localStorage.token, duration);
};
const updateWebhookUrlHandler = async () => {
webhookUrl = await updateWebhookUrl(localStorage.token, webhookUrl);
};
onMount(async () => {
signUpEnabled = await getSignUpEnabledStatus(localStorage.token);
defaultUserRole = await getDefaultUserRole(localStorage.token);
JWTExpiresIn = await getJWTExpiresDuration(localStorage.token);
webhookUrl = await getWebhookUrl(localStorage.token);
});
</script>

<form
class="flex flex-col h-full justify-between space-y-3 text-sm"
on:submit|preventDefault={() => {
// console.log('submit');
updateJWTExpiresDurationHandler(JWTExpiresIn);
updateWebhookUrlHandler();
saveHandler();
}}
>
Expand Down Expand Up @@ -108,6 +116,23 @@

<hr class=" dark:border-gray-700 my-3" />

<div class=" w-full justify-between">
<div class="flex w-full justify-between">
<div class=" self-center text-xs font-medium">{$i18n.t('Webhook URL')}</div>
</div>

<div class="flex mt-2 space-x-2">
<input
class="w-full rounded py-1.5 px-4 text-sm dark:text-gray-300 dark:bg-gray-800 outline-none border border-gray-100 dark:border-gray-600"
type="text"
placeholder={`https://example.com/webhook`}
bind:value={webhookUrl}
/>
</div>
</div>

<hr class=" dark:border-gray-700 my-3" />

<div class=" w-full justify-between">
<div class="flex w-full justify-between">
<div class=" self-center text-xs font-medium">{$i18n.t('JWT Expiration')}</div>
Expand Down
2 changes: 1 addition & 1 deletion src/lib/components/chat/MessageInput.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -673,7 +673,7 @@
? chatInputPlaceholder
: isRecording
? $i18n.t('Listening...')
: $i18n.t('Send a Messsage')}
: $i18n.t('Send a Message')}
bind:value={prompt}
on:keypress={(e) => {
if (e.keyCode == 13 && !e.shiftKey) {
Expand Down
2 changes: 1 addition & 1 deletion src/lib/components/chat/Messages/ResponseMessage.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -422,7 +422,7 @@
class=" flex justify-start space-x-1 overflow-x-auto buttons text-gray-700 dark:text-gray-500"
>
{#if siblings.length > 1}
<div class="flex self-center min-w-fit">
<div class="flex self-center min-w-fit -mt-1">
<button
class="self-center dark:hover:text-white hover:text-black transition"
on:click={() => {
Expand Down
2 changes: 1 addition & 1 deletion src/lib/components/chat/Messages/UserMessage.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@

<div class=" flex justify-start space-x-1 text-gray-700 dark:text-gray-500">
{#if siblings.length > 1}
<div class="flex self-center">
<div class="flex self-center -mt-1">
<button
class="self-center dark:hover:text-white hover:text-black transition"
on:click={() => {
Expand Down
2 changes: 1 addition & 1 deletion src/lib/components/documents/AddDocModal.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@
/>

<button
class="w-full text-sm font-medium py-3 bg-gray-850 hover:bg-gray-800 text-center rounded-xl"
class="w-full text-sm font-medium py-3 bg-gray-100 hover:bg-gray-200 dark:bg-gray-850 dark:hover:bg-gray-800 text-center rounded-xl"
type="button"
on:click={() => {
uploadDocInputElement.click();
Expand Down
Loading

0 comments on commit 6313a98

Please sign in to comment.