Option to disable login on first N messages (#352)
Browse files* disable login on first message
* update banner here too
* modal wording tweaks
* prevent NaN
---------
Co-authored-by: Victor Mustar <[email protected]>
- .env +5 -4
- src/hooks.server.ts +2 -2
- src/lib/components/LoginModal.svelte +6 -4
- src/routes/+layout.server.ts +2 -1
- src/routes/+layout.svelte +1 -1
- src/routes/conversation/[id]/+page.svelte +5 -0
.env
CHANGED
@@ -60,10 +60,10 @@ PUBLIC_SHARE_PREFIX=#https://hf.co/chat
|
|
60 |
PUBLIC_GOOGLE_ANALYTICS_ID=#G-XXXXXXXX / Leave empty to disable
|
61 |
PUBLIC_DEPRECATED_GOOGLE_ANALYTICS_ID=#UA-XXXXXXXX-X / Leave empty to disable
|
62 |
PUBLIC_ANNOUNCEMENT_BANNERS=`[
|
63 |
-
|
64 |
-
"title": "
|
65 |
-
"linkTitle": "
|
66 |
-
"linkHref": "https://
|
67 |
}
|
68 |
]`
|
69 |
|
@@ -72,6 +72,7 @@ PARQUET_EXPORT_HF_TOKEN=
|
|
72 |
PARQUET_EXPORT_SECRET=
|
73 |
|
74 |
RATE_LIMIT= # requests per minute
|
|
|
75 |
|
76 |
PUBLIC_APP_NAME=ChatUI # name used as title throughout the app
|
77 |
PUBLIC_APP_ASSETS=chatui # used to find logos & favicons in static/$PUBLIC_APP_ASSETS
|
|
|
60 |
PUBLIC_GOOGLE_ANALYTICS_ID=#G-XXXXXXXX / Leave empty to disable
|
61 |
PUBLIC_DEPRECATED_GOOGLE_ANALYTICS_ID=#UA-XXXXXXXX-X / Leave empty to disable
|
62 |
PUBLIC_ANNOUNCEMENT_BANNERS=`[
|
63 |
+
{
|
64 |
+
"title": "Llama v2 is live on HuggingChat! 🦙",
|
65 |
+
"linkTitle": "Announcement",
|
66 |
+
"linkHref": "https://huggingface.co/blog/llama2"
|
67 |
}
|
68 |
]`
|
69 |
|
|
|
72 |
PARQUET_EXPORT_SECRET=
|
73 |
|
74 |
RATE_LIMIT= # requests per minute
|
75 |
+
MESSAGES_BEFORE_LOGIN=# how many messages a user can send in a conversation before having to login. set to 0 to force login right away
|
76 |
|
77 |
PUBLIC_APP_NAME=ChatUI # name used as title throughout the app
|
78 |
PUBLIC_APP_ASSETS=chatui # used to find logos & favicons in static/$PUBLIC_APP_ASSETS
|
src/hooks.server.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
import { COOKIE_NAME } from "$env/static/private";
|
2 |
import type { Handle } from "@sveltejs/kit";
|
3 |
import {
|
4 |
PUBLIC_GOOGLE_ANALYTICS_ID,
|
@@ -64,7 +64,7 @@ export const handle: Handle = async ({ event, resolve }) => {
|
|
64 |
!event.url.pathname.startsWith(`${base}/admin`) &&
|
65 |
!["GET", "OPTIONS", "HEAD"].includes(event.request.method)
|
66 |
) {
|
67 |
-
if (!user && requiresUser) {
|
68 |
return errorResponse(401, ERROR_MESSAGES.authOnly);
|
69 |
}
|
70 |
|
|
|
1 |
+
import { COOKIE_NAME, MESSAGES_BEFORE_LOGIN } from "$env/static/private";
|
2 |
import type { Handle } from "@sveltejs/kit";
|
3 |
import {
|
4 |
PUBLIC_GOOGLE_ANALYTICS_ID,
|
|
|
64 |
!event.url.pathname.startsWith(`${base}/admin`) &&
|
65 |
!["GET", "OPTIONS", "HEAD"].includes(event.request.method)
|
66 |
) {
|
67 |
+
if (!user && requiresUser && !((parseInt(MESSAGES_BEFORE_LOGIN) || 0) > 0)) {
|
68 |
return errorResponse(401, ERROR_MESSAGES.authOnly);
|
69 |
}
|
70 |
|
src/lib/components/LoginModal.svelte
CHANGED
@@ -25,11 +25,14 @@
|
|
25 |
v{PUBLIC_VERSION}
|
26 |
</div>
|
27 |
</h2>
|
28 |
-
<p
|
29 |
-
|
|
|
|
|
|
|
30 |
</p>
|
31 |
<p class="text-base text-gray-800">
|
32 |
-
AI is an area of active research with known problems such as biased generation and
|
33 |
misinformation. Do not use this application for high-stakes decisions or advice.
|
34 |
</p>
|
35 |
{#if PUBLIC_APP_DATA_SHARING}
|
@@ -54,7 +57,6 @@
|
|
54 |
with <LogoHuggingFaceBorderless classNames="text-xl mr-1 ml-1.5" /> Hugging Face
|
55 |
{/if}
|
56 |
</button>
|
57 |
-
<p class="mt-2 px-2 text-sm text-gray-500">to start chatting right away</p>
|
58 |
{:else}
|
59 |
<input type="hidden" name="ethicsModalAccepted" value={true} />
|
60 |
{#each Object.entries(settings) as [key, val]}
|
|
|
25 |
v{PUBLIC_VERSION}
|
26 |
</div>
|
27 |
</h2>
|
28 |
+
<p
|
29 |
+
class="px-4 text-lg font-semibold leading-snug text-gray-800 sm:px-12"
|
30 |
+
style="text-wrap: balance;"
|
31 |
+
>
|
32 |
+
Please Sign in with Hugging Face to continue
|
33 |
</p>
|
34 |
<p class="text-base text-gray-800">
|
35 |
+
Disclaimer: AI is an area of active research with known problems such as biased generation and
|
36 |
misinformation. Do not use this application for high-stakes decisions or advice.
|
37 |
</p>
|
38 |
{#if PUBLIC_APP_DATA_SHARING}
|
|
|
57 |
with <LogoHuggingFaceBorderless classNames="text-xl mr-1 ml-1.5" /> Hugging Face
|
58 |
{/if}
|
59 |
</button>
|
|
|
60 |
{:else}
|
61 |
<input type="hidden" name="ethicsModalAccepted" value={true} />
|
62 |
{#each Object.entries(settings) as [key, val]}
|
src/routes/+layout.server.ts
CHANGED
@@ -6,7 +6,7 @@ import { UrlDependency } from "$lib/types/UrlDependency";
|
|
6 |
import { defaultModel, models, oldModels, validateModel } from "$lib/server/models";
|
7 |
import { authCondition, requiresUser } from "$lib/server/auth";
|
8 |
import { DEFAULT_SETTINGS } from "$lib/types/Settings";
|
9 |
-
import { SERPAPI_KEY, SERPER_API_KEY } from "$env/static/private";
|
10 |
|
11 |
export const load: LayoutServerLoad = async ({ locals, depends, url }) => {
|
12 |
const { conversations } = collections;
|
@@ -82,5 +82,6 @@ export const load: LayoutServerLoad = async ({ locals, depends, url }) => {
|
|
82 |
email: locals.user.email,
|
83 |
},
|
84 |
requiresLogin: requiresUser,
|
|
|
85 |
};
|
86 |
};
|
|
|
6 |
import { defaultModel, models, oldModels, validateModel } from "$lib/server/models";
|
7 |
import { authCondition, requiresUser } from "$lib/server/auth";
|
8 |
import { DEFAULT_SETTINGS } from "$lib/types/Settings";
|
9 |
+
import { SERPAPI_KEY, SERPER_API_KEY, MESSAGES_BEFORE_LOGIN } from "$env/static/private";
|
10 |
|
11 |
export const load: LayoutServerLoad = async ({ locals, depends, url }) => {
|
12 |
const { conversations } = collections;
|
|
|
82 |
email: locals.user.email,
|
83 |
},
|
84 |
requiresLogin: requiresUser,
|
85 |
+
messagesBeforeLogin: parseInt(MESSAGES_BEFORE_LOGIN ?? 0),
|
86 |
};
|
87 |
};
|
src/routes/+layout.svelte
CHANGED
@@ -178,7 +178,7 @@
|
|
178 |
{#if isSettingsOpen}
|
179 |
<SettingsModal on:close={() => (isSettingsOpen = false)} settings={data.settings} />
|
180 |
{/if}
|
181 |
-
{#if requiresLogin}
|
182 |
<LoginModal settings={data.settings} />
|
183 |
{/if}
|
184 |
<slot />
|
|
|
178 |
{#if isSettingsOpen}
|
179 |
<SettingsModal on:close={() => (isSettingsOpen = false)} settings={data.settings} />
|
180 |
{/if}
|
181 |
+
{#if requiresLogin && data.messagesBeforeLogin === 0}
|
182 |
<LoginModal settings={data.settings} />
|
183 |
{/if}
|
184 |
<slot />
|
src/routes/conversation/[id]/+page.svelte
CHANGED
@@ -16,6 +16,7 @@
|
|
16 |
import type { WebSearchMessage } from "$lib/types/WebSearch";
|
17 |
import type { Message } from "$lib/types/Message";
|
18 |
import { browser } from "$app/environment";
|
|
|
19 |
|
20 |
export let data;
|
21 |
|
@@ -279,4 +280,8 @@
|
|
279 |
models={data.models}
|
280 |
currentModel={findCurrentModel([...data.models, ...data.oldModels], data.model)}
|
281 |
settings={data.settings}
|
|
|
|
|
|
|
|
|
282 |
/>
|
|
|
16 |
import type { WebSearchMessage } from "$lib/types/WebSearch";
|
17 |
import type { Message } from "$lib/types/Message";
|
18 |
import { browser } from "$app/environment";
|
19 |
+
import { PUBLIC_APP_DISCLAIMER } from "$env/static/public";
|
20 |
|
21 |
export let data;
|
22 |
|
|
|
280 |
models={data.models}
|
281 |
currentModel={findCurrentModel([...data.models, ...data.oldModels], data.model)}
|
282 |
settings={data.settings}
|
283 |
+
loginRequired={(data.requiresLogin
|
284 |
+
? !data.user
|
285 |
+
: !data.settings.ethicsModalAcceptedAt && !!PUBLIC_APP_DISCLAIMER) &&
|
286 |
+
data.messages.length > data.messagesBeforeLogin}
|
287 |
/>
|