Spaces:
Sleeping
Sleeping
JoFrost
commited on
Commit
•
5528541
1
Parent(s):
e66a6c5
update to current version
Browse files- .env +33 -3
- .svelte-kit/ambient.d.ts +154 -186
- .svelte-kit/generated/server/internal.js +2 -2
- .svelte-kit/types/src/routes/proxy+layout.server.ts +2 -1
- PRIVACY.md +0 -1
- README.md +1 -1
- src/app.html +1 -52
- src/hooks.server.ts +29 -29
- src/lib/components/ConfirmModal.svelte +8 -6
- src/lib/components/LoadingModal.svelte +2 -2
- src/lib/components/LoginModal.svelte +1 -1
- src/lib/components/ModelCardMetadata.svelte +1 -1
- src/lib/components/ModelsModal.svelte +21 -9
- src/lib/components/NavConversationItem.svelte +3 -1
- src/lib/components/SettingsModal.svelte +7 -15
- src/lib/components/Tooltip.svelte +1 -1
- src/lib/components/chat/ChatIntroduction.svelte +24 -11
- src/lib/components/chat/ChatMessage.svelte +11 -32
- src/lib/components/chat/ChatWindow.svelte +7 -7
- src/lib/server/database.ts +11 -11
- src/lib/server/models.ts +2 -0
- src/lib/types/Message.ts +1 -0
- src/routes/+layout.server.ts +3 -3
- src/routes/+layout.svelte +31 -23
- src/routes/+page.svelte +20 -10
- src/routes/LayoutWritable.js +2 -0
- src/routes/LocalDB.ts +129 -113
- src/routes/conversation/[id]/+page.svelte +111 -55
- src/routes/conversation/[id]/ParamsWritable.js +1 -1
- src/routes/conversation/[id]/summarize/+server.ts +1 -4
- src/routes/conversation/[id]/worker.js +20 -8
- src/routes/conversations/+page.server.ts +1 -1
- src/routes/login/callback/updateUser.ts +1 -3
- src/routes/r/[id]/+page.svelte +0 -1
- src/routes/settings/+page.server.ts +0 -16
.env
CHANGED
@@ -32,6 +32,8 @@ MODELS=`[
|
|
32 |
{
|
33 |
"name": "Xenova/LaMini-Flan-T5-783M",
|
34 |
"is_local": true,
|
|
|
|
|
35 |
"userMessageToken": "<|prompter|>",
|
36 |
"assistantMessageToken": "<|assistant|>",
|
37 |
"messageEndToken": "</s>",
|
@@ -49,12 +51,40 @@ MODELS=`[
|
|
49 |
}
|
50 |
],
|
51 |
"parameters": {
|
52 |
-
"temperature": 0.
|
53 |
"top_p": 0.95,
|
54 |
"repetition_penalty": 1.2,
|
55 |
"top_k": 50,
|
56 |
"truncate": 1000,
|
57 |
-
"max_new_tokens":
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
58 |
}
|
59 |
}
|
60 |
]`
|
@@ -79,7 +109,7 @@ PARQUET_EXPORT_SECRET=
|
|
79 |
RATE_LIMIT= # requests per minute
|
80 |
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
|
81 |
|
82 |
-
PUBLIC_APP_NAME=
|
83 |
PUBLIC_APP_ASSETS=chatui # used to find logos & favicons in static/$PUBLIC_APP_ASSETS
|
84 |
PUBLIC_APP_COLOR=blue # can be any of tailwind colors: https://tailwindcss.com/docs/customizing-colors#default-color-palette
|
85 |
PUBLIC_APP_DATA_SHARING=#set to 1 to enable options & text regarding data sharing
|
|
|
32 |
{
|
33 |
"name": "Xenova/LaMini-Flan-T5-783M",
|
34 |
"is_local": true,
|
35 |
+
"is_code": false,
|
36 |
+
"type": "text2text-generation",
|
37 |
"userMessageToken": "<|prompter|>",
|
38 |
"assistantMessageToken": "<|assistant|>",
|
39 |
"messageEndToken": "</s>",
|
|
|
51 |
}
|
52 |
],
|
53 |
"parameters": {
|
54 |
+
"temperature": 0.8,
|
55 |
"top_p": 0.95,
|
56 |
"repetition_penalty": 1.2,
|
57 |
"top_k": 50,
|
58 |
"truncate": 1000,
|
59 |
+
"max_new_tokens": 256
|
60 |
+
}
|
61 |
+
},
|
62 |
+
{
|
63 |
+
"name": "Xenova/codegen-350M-mono",
|
64 |
+
"is_local": true,
|
65 |
+
"is_code": true,
|
66 |
+
"type": "text-generation",
|
67 |
+
"userMessageToken": "<|prompter|>",
|
68 |
+
"assistantMessageToken": "<|assistant|>",
|
69 |
+
"messageEndToken": "</s>",
|
70 |
+
"preprompt": "",
|
71 |
+
"promptExamples": [
|
72 |
+
{
|
73 |
+
"title": "Calculates the nth Fibonacci number",
|
74 |
+
"prompt": "def fib(n):\n '''Calculates the nth Fibonacci number'''"
|
75 |
+
},
|
76 |
+
{
|
77 |
+
"title": "Reimplement your own math.sqrt function",
|
78 |
+
"prompt": "def sqrt(n):\n '''Reimplement your own math.sqrt function'''"
|
79 |
+
}
|
80 |
+
],
|
81 |
+
"parameters": {
|
82 |
+
"temperature": 0.5,
|
83 |
+
"top_p": 0.95,
|
84 |
+
"repetition_penalty": 1.2,
|
85 |
+
"top_k": 50,
|
86 |
+
"truncate": 1000,
|
87 |
+
"max_new_tokens": 45
|
88 |
}
|
89 |
}
|
90 |
]`
|
|
|
109 |
RATE_LIMIT= # requests per minute
|
110 |
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
|
111 |
|
112 |
+
PUBLIC_APP_NAME=ChatUI # name used as title throughout the app
|
113 |
PUBLIC_APP_ASSETS=chatui # used to find logos & favicons in static/$PUBLIC_APP_ASSETS
|
114 |
PUBLIC_APP_COLOR=blue # can be any of tailwind colors: https://tailwindcss.com/docs/customizing-colors#default-color-palette
|
115 |
PUBLIC_APP_DATA_SHARING=#set to 1 to enable options & text regarding data sharing
|
.svelte-kit/ambient.d.ts
CHANGED
@@ -51,107 +51,91 @@ declare module '$env/static/private' {
|
|
51 |
export const PARQUET_EXPORT_SECRET: string;
|
52 |
export const RATE_LIMIT: string;
|
53 |
export const MESSAGES_BEFORE_LOGIN: string;
|
54 |
-
export const
|
55 |
-
export const
|
56 |
-
export const
|
57 |
-
export const
|
58 |
-
export const
|
59 |
-
export const
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
export const GIT_ASKPASS: string;
|
61 |
-
export const npm_node_execpath: string;
|
62 |
-
export const SHLVL: string;
|
63 |
-
export const npm_config_noproxy: string;
|
64 |
export const HOME: string;
|
65 |
-
export const
|
66 |
-
export const
|
67 |
-
export const
|
68 |
-
export const
|
69 |
-
export const
|
70 |
-
export const
|
71 |
-
export const
|
72 |
-
export const
|
73 |
-
export const
|
74 |
-
export const
|
75 |
-
export const
|
76 |
-
export const
|
77 |
-
export const VSCODE_GIT_ASKPASS_NODE: string;
|
78 |
-
export const npm_config_userconfig: string;
|
79 |
-
export const npm_config_local_prefix: string;
|
80 |
-
export const CINNAMON_VERSION: string;
|
81 |
-
export const DBUS_SESSION_BUS_ADDRESS: string;
|
82 |
export const npm_config_engine_strict: string;
|
83 |
-
export const
|
84 |
-
export const
|
85 |
-
export const
|
|
|
86 |
export const npm_config_metrics_registry: string;
|
87 |
-
export const QT_QPA_PLATFORMTHEME: string;
|
88 |
-
export const INFOPATH: string;
|
89 |
-
export const LOGNAME: string;
|
90 |
-
export const _: string;
|
91 |
-
export const npm_config_prefix: string;
|
92 |
-
export const XDG_SESSION_CLASS: string;
|
93 |
-
export const TERM: string;
|
94 |
-
export const GTK_OVERLAY_SCROLLING: string;
|
95 |
-
export const XDG_SESSION_ID: string;
|
96 |
-
export const npm_config_cache: string;
|
97 |
-
export const GNOME_DESKTOP_SESSION_ID: string;
|
98 |
export const npm_config_node_gyp: string;
|
99 |
-
export const
|
100 |
-
export const
|
101 |
-
export const
|
102 |
-
export const
|
103 |
-
export const
|
104 |
-
export const
|
105 |
-
export const npm_package_name: string;
|
106 |
-
export const XDG_SESSION_PATH: string;
|
107 |
-
export const LC_ADDRESS: string;
|
108 |
-
export const GNOME_TERMINAL_SCREEN: string;
|
109 |
-
export const XDG_RUNTIME_DIR: string;
|
110 |
-
export const GDK_BACKEND: string;
|
111 |
-
export const DISPLAY: string;
|
112 |
-
export const LANG: string;
|
113 |
-
export const XDG_CURRENT_DESKTOP: string;
|
114 |
-
export const LC_TELEPHONE: string;
|
115 |
-
export const XDG_SESSION_DESKTOP: string;
|
116 |
-
export const XAUTHORITY: string;
|
117 |
-
export const LS_COLORS: string;
|
118 |
-
export const VSCODE_GIT_IPC_HANDLE: string;
|
119 |
-
export const GNOME_TERMINAL_SERVICE: string;
|
120 |
-
export const TERM_PROGRAM: string;
|
121 |
export const npm_lifecycle_script: string;
|
122 |
-
export const
|
123 |
-
export const
|
124 |
-
export const
|
125 |
-
export const SHELL: string;
|
126 |
-
export const LC_NAME: string;
|
127 |
export const npm_package_version: string;
|
128 |
-
export const
|
129 |
-
export const
|
130 |
-
export const
|
131 |
-
export const
|
132 |
-
export const
|
133 |
-
export const
|
134 |
-
export const
|
135 |
-
export const
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
136 |
export const VSCODE_GIT_ASKPASS_EXTRA_ARGS: string;
|
137 |
-
export const
|
138 |
-
export const
|
139 |
-
export const
|
140 |
-
export const
|
141 |
-
export const
|
142 |
-
export const
|
143 |
-
export const NVM_CD_FLAGS: string;
|
144 |
-
export const XDG_DATA_DIRS: string;
|
145 |
-
export const npm_config_global_prefix: string;
|
146 |
-
export const HOMEBREW_REPOSITORY: string;
|
147 |
-
export const LC_NUMERIC: string;
|
148 |
-
export const npm_command: string;
|
149 |
-
export const LC_PAPER: string;
|
150 |
-
export const MANPATH: string;
|
151 |
-
export const VTE_VERSION: string;
|
152 |
-
export const INIT_CWD: string;
|
153 |
-
export const EDITOR: string;
|
154 |
-
export const NODE_ENV: string;
|
155 |
}
|
156 |
|
157 |
/**
|
@@ -216,107 +200,91 @@ declare module '$env/dynamic/private' {
|
|
216 |
PARQUET_EXPORT_SECRET: string;
|
217 |
RATE_LIMIT: string;
|
218 |
MESSAGES_BEFORE_LOGIN: string;
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
225 |
GIT_ASKPASS: string;
|
226 |
-
npm_node_execpath: string;
|
227 |
-
SHLVL: string;
|
228 |
-
npm_config_noproxy: string;
|
229 |
HOME: string;
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
VSCODE_GIT_ASKPASS_NODE: string;
|
243 |
-
npm_config_userconfig: string;
|
244 |
-
npm_config_local_prefix: string;
|
245 |
-
CINNAMON_VERSION: string;
|
246 |
-
DBUS_SESSION_BUS_ADDRESS: string;
|
247 |
npm_config_engine_strict: string;
|
248 |
-
|
249 |
-
|
250 |
-
|
|
|
251 |
npm_config_metrics_registry: string;
|
252 |
-
QT_QPA_PLATFORMTHEME: string;
|
253 |
-
INFOPATH: string;
|
254 |
-
LOGNAME: string;
|
255 |
-
_: string;
|
256 |
-
npm_config_prefix: string;
|
257 |
-
XDG_SESSION_CLASS: string;
|
258 |
-
TERM: string;
|
259 |
-
GTK_OVERLAY_SCROLLING: string;
|
260 |
-
XDG_SESSION_ID: string;
|
261 |
-
npm_config_cache: string;
|
262 |
-
GNOME_DESKTOP_SESSION_ID: string;
|
263 |
npm_config_node_gyp: string;
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
npm_package_name: string;
|
271 |
-
XDG_SESSION_PATH: string;
|
272 |
-
LC_ADDRESS: string;
|
273 |
-
GNOME_TERMINAL_SCREEN: string;
|
274 |
-
XDG_RUNTIME_DIR: string;
|
275 |
-
GDK_BACKEND: string;
|
276 |
-
DISPLAY: string;
|
277 |
-
LANG: string;
|
278 |
-
XDG_CURRENT_DESKTOP: string;
|
279 |
-
LC_TELEPHONE: string;
|
280 |
-
XDG_SESSION_DESKTOP: string;
|
281 |
-
XAUTHORITY: string;
|
282 |
-
LS_COLORS: string;
|
283 |
-
VSCODE_GIT_IPC_HANDLE: string;
|
284 |
-
GNOME_TERMINAL_SERVICE: string;
|
285 |
-
TERM_PROGRAM: string;
|
286 |
npm_lifecycle_script: string;
|
287 |
-
|
288 |
-
|
289 |
-
|
290 |
-
SHELL: string;
|
291 |
-
LC_NAME: string;
|
292 |
npm_package_version: string;
|
293 |
-
|
294 |
-
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
|
300 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
301 |
VSCODE_GIT_ASKPASS_EXTRA_ARGS: string;
|
302 |
-
|
303 |
-
|
304 |
-
|
305 |
-
|
306 |
-
|
307 |
-
|
308 |
-
NVM_CD_FLAGS: string;
|
309 |
-
XDG_DATA_DIRS: string;
|
310 |
-
npm_config_global_prefix: string;
|
311 |
-
HOMEBREW_REPOSITORY: string;
|
312 |
-
LC_NUMERIC: string;
|
313 |
-
npm_command: string;
|
314 |
-
LC_PAPER: string;
|
315 |
-
MANPATH: string;
|
316 |
-
VTE_VERSION: string;
|
317 |
-
INIT_CWD: string;
|
318 |
-
EDITOR: string;
|
319 |
-
NODE_ENV: string;
|
320 |
[key: `PUBLIC_${string}`]: undefined;
|
321 |
[key: `${string}`]: string | undefined;
|
322 |
}
|
|
|
51 |
export const PARQUET_EXPORT_SECRET: string;
|
52 |
export const RATE_LIMIT: string;
|
53 |
export const MESSAGES_BEFORE_LOGIN: string;
|
54 |
+
export const ACSetupSvcPort: string;
|
55 |
+
export const ACSvcPort: string;
|
56 |
+
export const ALLUSERSPROFILE: string;
|
57 |
+
export const APPDATA: string;
|
58 |
+
export const CHROME_CRASHPAD_PIPE_NAME: string;
|
59 |
+
export const COLOR: string;
|
60 |
+
export const COLORTERM: string;
|
61 |
+
export const CommonProgramFiles: string;
|
62 |
+
export const CommonProgramW6432: string;
|
63 |
+
export const COMPUTERNAME: string;
|
64 |
+
export const ComSpec: string;
|
65 |
+
export const DriverData: string;
|
66 |
+
export const EDITOR: string;
|
67 |
+
export const EFC_47272: string;
|
68 |
+
export const EnableLog: string;
|
69 |
export const GIT_ASKPASS: string;
|
|
|
|
|
|
|
70 |
export const HOME: string;
|
71 |
+
export const HOMEDRIVE: string;
|
72 |
+
export const HOMEPATH: string;
|
73 |
+
export const INIT_CWD: string;
|
74 |
+
export const LANG: string;
|
75 |
+
export const LOCALAPPDATA: string;
|
76 |
+
export const LOGONSERVER: string;
|
77 |
+
export const NODE: string;
|
78 |
+
export const NODE_ENV: string;
|
79 |
+
export const NODE_EXE: string;
|
80 |
+
export const NPM_CLI_JS: string;
|
81 |
+
export const npm_command: string;
|
82 |
+
export const npm_config_cache: string;
|
|
|
|
|
|
|
|
|
|
|
83 |
export const npm_config_engine_strict: string;
|
84 |
+
export const npm_config_globalconfig: string;
|
85 |
+
export const npm_config_global_prefix: string;
|
86 |
+
export const npm_config_init_module: string;
|
87 |
+
export const npm_config_local_prefix: string;
|
88 |
export const npm_config_metrics_registry: string;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
89 |
export const npm_config_node_gyp: string;
|
90 |
+
export const npm_config_noproxy: string;
|
91 |
+
export const npm_config_prefix: string;
|
92 |
+
export const npm_config_userconfig: string;
|
93 |
+
export const npm_config_user_agent: string;
|
94 |
+
export const npm_execpath: string;
|
95 |
+
export const npm_lifecycle_event: string;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
96 |
export const npm_lifecycle_script: string;
|
97 |
+
export const npm_node_execpath: string;
|
98 |
+
export const npm_package_json: string;
|
99 |
+
export const npm_package_name: string;
|
|
|
|
|
100 |
export const npm_package_version: string;
|
101 |
+
export const NPM_PREFIX_NPM_CLI_JS: string;
|
102 |
+
export const NUMBER_OF_PROCESSORS: string;
|
103 |
+
export const OculusBase: string;
|
104 |
+
export const OneDrive: string;
|
105 |
+
export const OneDriveConsumer: string;
|
106 |
+
export const ORIGINAL_XDG_CURRENT_DESKTOP: string;
|
107 |
+
export const OS: string;
|
108 |
+
export const Path: string;
|
109 |
+
export const PATHEXT: string;
|
110 |
+
export const PROCESSOR_ARCHITECTURE: string;
|
111 |
+
export const PROCESSOR_IDENTIFIER: string;
|
112 |
+
export const PROCESSOR_LEVEL: string;
|
113 |
+
export const PROCESSOR_REVISION: string;
|
114 |
+
export const ProgramData: string;
|
115 |
+
export const ProgramFiles: string;
|
116 |
+
export const ProgramW6432: string;
|
117 |
+
export const PROMPT: string;
|
118 |
+
export const PSModulePath: string;
|
119 |
+
export const PUBLIC: string;
|
120 |
+
export const RlsSvcPort: string;
|
121 |
+
export const SESSIONNAME: string;
|
122 |
+
export const SystemDrive: string;
|
123 |
+
export const SystemRoot: string;
|
124 |
+
export const TEMP: string;
|
125 |
+
export const TERM_PROGRAM: string;
|
126 |
+
export const TERM_PROGRAM_VERSION: string;
|
127 |
+
export const TMP: string;
|
128 |
+
export const USERDOMAIN: string;
|
129 |
+
export const USERDOMAIN_ROAMINGPROFILE: string;
|
130 |
+
export const USERNAME: string;
|
131 |
+
export const USERPROFILE: string;
|
132 |
export const VSCODE_GIT_ASKPASS_EXTRA_ARGS: string;
|
133 |
+
export const VSCODE_GIT_ASKPASS_MAIN: string;
|
134 |
+
export const VSCODE_GIT_ASKPASS_NODE: string;
|
135 |
+
export const VSCODE_GIT_IPC_HANDLE: string;
|
136 |
+
export const VSCODE_INJECTION: string;
|
137 |
+
export const VSCODE_NONCE: string;
|
138 |
+
export const windir: string;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
139 |
}
|
140 |
|
141 |
/**
|
|
|
200 |
PARQUET_EXPORT_SECRET: string;
|
201 |
RATE_LIMIT: string;
|
202 |
MESSAGES_BEFORE_LOGIN: string;
|
203 |
+
ACSetupSvcPort: string;
|
204 |
+
ACSvcPort: string;
|
205 |
+
ALLUSERSPROFILE: string;
|
206 |
+
APPDATA: string;
|
207 |
+
CHROME_CRASHPAD_PIPE_NAME: string;
|
208 |
+
COLOR: string;
|
209 |
+
COLORTERM: string;
|
210 |
+
CommonProgramFiles: string;
|
211 |
+
CommonProgramW6432: string;
|
212 |
+
COMPUTERNAME: string;
|
213 |
+
ComSpec: string;
|
214 |
+
DriverData: string;
|
215 |
+
EDITOR: string;
|
216 |
+
EFC_47272: string;
|
217 |
+
EnableLog: string;
|
218 |
GIT_ASKPASS: string;
|
|
|
|
|
|
|
219 |
HOME: string;
|
220 |
+
HOMEDRIVE: string;
|
221 |
+
HOMEPATH: string;
|
222 |
+
INIT_CWD: string;
|
223 |
+
LANG: string;
|
224 |
+
LOCALAPPDATA: string;
|
225 |
+
LOGONSERVER: string;
|
226 |
+
NODE: string;
|
227 |
+
NODE_ENV: string;
|
228 |
+
NODE_EXE: string;
|
229 |
+
NPM_CLI_JS: string;
|
230 |
+
npm_command: string;
|
231 |
+
npm_config_cache: string;
|
|
|
|
|
|
|
|
|
|
|
232 |
npm_config_engine_strict: string;
|
233 |
+
npm_config_globalconfig: string;
|
234 |
+
npm_config_global_prefix: string;
|
235 |
+
npm_config_init_module: string;
|
236 |
+
npm_config_local_prefix: string;
|
237 |
npm_config_metrics_registry: string;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
238 |
npm_config_node_gyp: string;
|
239 |
+
npm_config_noproxy: string;
|
240 |
+
npm_config_prefix: string;
|
241 |
+
npm_config_userconfig: string;
|
242 |
+
npm_config_user_agent: string;
|
243 |
+
npm_execpath: string;
|
244 |
+
npm_lifecycle_event: string;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
245 |
npm_lifecycle_script: string;
|
246 |
+
npm_node_execpath: string;
|
247 |
+
npm_package_json: string;
|
248 |
+
npm_package_name: string;
|
|
|
|
|
249 |
npm_package_version: string;
|
250 |
+
NPM_PREFIX_NPM_CLI_JS: string;
|
251 |
+
NUMBER_OF_PROCESSORS: string;
|
252 |
+
OculusBase: string;
|
253 |
+
OneDrive: string;
|
254 |
+
OneDriveConsumer: string;
|
255 |
+
ORIGINAL_XDG_CURRENT_DESKTOP: string;
|
256 |
+
OS: string;
|
257 |
+
Path: string;
|
258 |
+
PATHEXT: string;
|
259 |
+
PROCESSOR_ARCHITECTURE: string;
|
260 |
+
PROCESSOR_IDENTIFIER: string;
|
261 |
+
PROCESSOR_LEVEL: string;
|
262 |
+
PROCESSOR_REVISION: string;
|
263 |
+
ProgramData: string;
|
264 |
+
ProgramFiles: string;
|
265 |
+
ProgramW6432: string;
|
266 |
+
PROMPT: string;
|
267 |
+
PSModulePath: string;
|
268 |
+
PUBLIC: string;
|
269 |
+
RlsSvcPort: string;
|
270 |
+
SESSIONNAME: string;
|
271 |
+
SystemDrive: string;
|
272 |
+
SystemRoot: string;
|
273 |
+
TEMP: string;
|
274 |
+
TERM_PROGRAM: string;
|
275 |
+
TERM_PROGRAM_VERSION: string;
|
276 |
+
TMP: string;
|
277 |
+
USERDOMAIN: string;
|
278 |
+
USERDOMAIN_ROAMINGPROFILE: string;
|
279 |
+
USERNAME: string;
|
280 |
+
USERPROFILE: string;
|
281 |
VSCODE_GIT_ASKPASS_EXTRA_ARGS: string;
|
282 |
+
VSCODE_GIT_ASKPASS_MAIN: string;
|
283 |
+
VSCODE_GIT_ASKPASS_NODE: string;
|
284 |
+
VSCODE_GIT_IPC_HANDLE: string;
|
285 |
+
VSCODE_INJECTION: string;
|
286 |
+
VSCODE_NONCE: string;
|
287 |
+
windir: string;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
288 |
[key: `PUBLIC_${string}`]: undefined;
|
289 |
[key: `${string}`]: string | undefined;
|
290 |
}
|
.svelte-kit/generated/server/internal.js
CHANGED
@@ -17,10 +17,10 @@ export const options = {
|
|
17 |
root,
|
18 |
service_worker: false,
|
19 |
templates: {
|
20 |
-
app: ({ head, body, assets, nonce, env }) => "<!DOCTYPE html>\n<html lang=\"en\" class=\"h-full\">\n\t<link rel=\"stylesheet\" href=\"https://www.w3schools.com/w3css/4/w3.css\" />\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\" />\n\t\t<script>\n\t\t\tif (\n\t\t\t\tlocalStorage.theme === \"dark\" ||\n\t\t\t\t(!(\"theme\" in localStorage) && window.matchMedia(\"(prefers-color-scheme: dark)\").matches)\n\t\t\t) {\n\t\t\t\tdocument.documentElement.classList.add(\"dark\");\n\t\t\t}\
|
21 |
error: ({ status, message }) => "<!DOCTYPE html>\n<html lang=\"en\">\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<title>" + message + "</title>\n\n\t\t<style>\n\t\t\tbody {\n\t\t\t\t--bg: white;\n\t\t\t\t--fg: #222;\n\t\t\t\t--divider: #ccc;\n\t\t\t\tbackground: var(--bg);\n\t\t\t\tcolor: var(--fg);\n\t\t\t\tfont-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n\t\t\t\t\tUbuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\theight: 100vh;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t.error {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tmax-width: 32rem;\n\t\t\t\tmargin: 0 1rem;\n\t\t\t}\n\n\t\t\t.status {\n\t\t\t\tfont-weight: 200;\n\t\t\t\tfont-size: 3rem;\n\t\t\t\tline-height: 1;\n\t\t\t\tposition: relative;\n\t\t\t\ttop: -0.05rem;\n\t\t\t}\n\n\t\t\t.message {\n\t\t\t\tborder-left: 1px solid var(--divider);\n\t\t\t\tpadding: 0 0 0 1rem;\n\t\t\t\tmargin: 0 0 0 1rem;\n\t\t\t\tmin-height: 2.5rem;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.message h1 {\n\t\t\t\tfont-weight: 400;\n\t\t\t\tfont-size: 1em;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t@media (prefers-color-scheme: dark) {\n\t\t\t\tbody {\n\t\t\t\t\t--bg: #222;\n\t\t\t\t\t--fg: #ddd;\n\t\t\t\t\t--divider: #666;\n\t\t\t\t}\n\t\t\t}\n\t\t</style>\n\t</head>\n\t<body>\n\t\t<div class=\"error\">\n\t\t\t<span class=\"status\">" + status + "</span>\n\t\t\t<div class=\"message\">\n\t\t\t\t<h1>" + message + "</h1>\n\t\t\t</div>\n\t\t</div>\n\t</body>\n</html>\n"
|
22 |
},
|
23 |
-
version_hash: "
|
24 |
};
|
25 |
|
26 |
export function get_hooks() {
|
|
|
17 |
root,
|
18 |
service_worker: false,
|
19 |
templates: {
|
20 |
+
app: ({ head, body, assets, nonce, env }) => "<!DOCTYPE html>\r\n<html lang=\"en\" class=\"h-full\">\r\n\t<link rel=\"stylesheet\" href=\"https://www.w3schools.com/w3css/4/w3.css\" />\r\n\t<head>\r\n\t\t<meta charset=\"utf-8\" />\r\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\" />\r\n\t\t<meta property=\"og:image\" content=\"/chatui/thumbnail.jpg\"/>\r\n\t\t<script>\r\n\t\t\tif (\r\n\t\t\t\tlocalStorage.theme === \"dark\" ||\r\n\t\t\t\t(!(\"theme\" in localStorage) && window.matchMedia(\"(prefers-color-scheme: dark)\").matches)\r\n\t\t\t) {\r\n\t\t\t\tdocument.documentElement.classList.add(\"dark\");\r\n\t\t\t}\r\n\t\t</script>\r\n\t\t" + head + "\r\n\t</head>\r\n\t<body data-sveltekit-preload-data=\"hover\" class=\"h-full dark:bg-gray-900\">\r\n\t\t<div id=\"app\" class=\"contents h-full\">" + body + "</div>\r\n\t</body>\r\n</html>\r\n",
|
21 |
error: ({ status, message }) => "<!DOCTYPE html>\n<html lang=\"en\">\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<title>" + message + "</title>\n\n\t\t<style>\n\t\t\tbody {\n\t\t\t\t--bg: white;\n\t\t\t\t--fg: #222;\n\t\t\t\t--divider: #ccc;\n\t\t\t\tbackground: var(--bg);\n\t\t\t\tcolor: var(--fg);\n\t\t\t\tfont-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n\t\t\t\t\tUbuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\theight: 100vh;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t.error {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tmax-width: 32rem;\n\t\t\t\tmargin: 0 1rem;\n\t\t\t}\n\n\t\t\t.status {\n\t\t\t\tfont-weight: 200;\n\t\t\t\tfont-size: 3rem;\n\t\t\t\tline-height: 1;\n\t\t\t\tposition: relative;\n\t\t\t\ttop: -0.05rem;\n\t\t\t}\n\n\t\t\t.message {\n\t\t\t\tborder-left: 1px solid var(--divider);\n\t\t\t\tpadding: 0 0 0 1rem;\n\t\t\t\tmargin: 0 0 0 1rem;\n\t\t\t\tmin-height: 2.5rem;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.message h1 {\n\t\t\t\tfont-weight: 400;\n\t\t\t\tfont-size: 1em;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t@media (prefers-color-scheme: dark) {\n\t\t\t\tbody {\n\t\t\t\t\t--bg: #222;\n\t\t\t\t\t--fg: #ddd;\n\t\t\t\t\t--divider: #666;\n\t\t\t\t}\n\t\t\t}\n\t\t</style>\n\t</head>\n\t<body>\n\t\t<div class=\"error\">\n\t\t\t<span class=\"status\">" + status + "</span>\n\t\t\t<div class=\"message\">\n\t\t\t\t<h1>" + message + "</h1>\n\t\t\t</div>\n\t\t</div>\n\t</body>\n</html>\n"
|
22 |
},
|
23 |
+
version_hash: "aw3qnn"
|
24 |
};
|
25 |
|
26 |
export function get_hooks() {
|
.svelte-kit/types/src/routes/proxy+layout.server.ts
CHANGED
@@ -29,7 +29,6 @@ export const load = async ({ locals, depends, url }: Parameters<LayoutServerLoad
|
|
29 |
throw redirect(302, url.pathname);
|
30 |
}
|
31 |
|
32 |
-
|
33 |
return {
|
34 |
conversations: [],
|
35 |
settings: {
|
@@ -46,6 +45,8 @@ export const load = async ({ locals, depends, url }: Parameters<LayoutServerLoad
|
|
46 |
websiteUrl: model.websiteUrl,
|
47 |
modelUrl: model.modelUrl,
|
48 |
is_local: model.is_local,
|
|
|
|
|
49 |
datasetName: model.datasetName,
|
50 |
datasetUrl: model.datasetUrl,
|
51 |
displayName: model.displayName,
|
|
|
29 |
throw redirect(302, url.pathname);
|
30 |
}
|
31 |
|
|
|
32 |
return {
|
33 |
conversations: [],
|
34 |
settings: {
|
|
|
45 |
websiteUrl: model.websiteUrl,
|
46 |
modelUrl: model.modelUrl,
|
47 |
is_local: model.is_local,
|
48 |
+
is_code: model.is_code,
|
49 |
+
type: model.type,
|
50 |
datasetName: model.datasetName,
|
51 |
datasetUrl: model.datasetUrl,
|
52 |
displayName: model.displayName,
|
PRIVACY.md
CHANGED
@@ -15,4 +15,3 @@ BlindChat is an open-source project to provide fully in-browser and private Conv
|
|
15 |
It is currently developed and maintained by [Mithril Security](https://www.mithrilsecurity.io/), a startup aiming to make AI more private.
|
16 |
|
17 |
You can find more information on our [Github](https://github.com/mithril-security/blind_chat/), join us on our [Discord](https://discord.com/invite/TxEHagpWd4), or directly [contact us](mailto:contact@mithrilsecurity.io).
|
18 |
-
|
|
|
15 |
It is currently developed and maintained by [Mithril Security](https://www.mithrilsecurity.io/), a startup aiming to make AI more private.
|
16 |
|
17 |
You can find more information on our [Github](https://github.com/mithril-security/blind_chat/), join us on our [Discord](https://discord.com/invite/TxEHagpWd4), or directly [contact us](mailto:contact@mithrilsecurity.io).
|
|
README.md
CHANGED
@@ -8,4 +8,4 @@ pinned: false
|
|
8 |
app_port: 3000
|
9 |
---
|
10 |
|
11 |
-
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
|
|
8 |
app_port: 3000
|
9 |
---
|
10 |
|
11 |
+
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
src/app.html
CHANGED
@@ -4,6 +4,7 @@
|
|
4 |
<head>
|
5 |
<meta charset="utf-8" />
|
6 |
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
|
|
|
7 |
<script>
|
8 |
if (
|
9 |
localStorage.theme === "dark" ||
|
@@ -11,62 +12,10 @@
|
|
11 |
) {
|
12 |
document.documentElement.classList.add("dark");
|
13 |
}
|
14 |
-
|
15 |
-
// For some reason, Sveltekit doesn't let us load env variables from .env here, so we load it from hooks.server.ts
|
16 |
-
window.gaId = "%gaId%";
|
17 |
-
window.gaIdDeprecated = "%gaIdDeprecated%";
|
18 |
</script>
|
19 |
%sveltekit.head%
|
20 |
</head>
|
21 |
<body data-sveltekit-preload-data="hover" class="h-full dark:bg-gray-900">
|
22 |
<div id="app" class="contents h-full">%sveltekit.body%</div>
|
23 |
-
|
24 |
-
<!-- Google Tag Manager -->
|
25 |
-
<script>
|
26 |
-
if (window.gaId) {
|
27 |
-
const script = document.createElement("script");
|
28 |
-
script.src = "https://www.googletagmanager.com/gtag/js?id=" + window.gaId;
|
29 |
-
script.async = true;
|
30 |
-
document.head.appendChild(script);
|
31 |
-
|
32 |
-
window.dataLayer = window.dataLayer || [];
|
33 |
-
function gtag() {
|
34 |
-
dataLayer.push(arguments);
|
35 |
-
}
|
36 |
-
gtag("js", new Date());
|
37 |
-
/// ^ See https://developers.google.com/tag-platform/gtagjs/install
|
38 |
-
gtag("config", window.gaId);
|
39 |
-
gtag("consent", "default", { ad_storage: "denied", analytics_storage: "denied" });
|
40 |
-
/// ^ See https://developers.google.com/tag-platform/gtagjs/reference#consent
|
41 |
-
/// TODO: ask the user for their consent and update this with gtag('consent', 'update')
|
42 |
-
}
|
43 |
-
</script>
|
44 |
-
|
45 |
-
<!-- Google Analytics v3 (deprecated on 1 July 2023) -->
|
46 |
-
<script>
|
47 |
-
if (window.gaIdDeprecated) {
|
48 |
-
(function (i, s, o, g, r, a, m) {
|
49 |
-
i["GoogleAnalyticsObject"] = r;
|
50 |
-
(i[r] =
|
51 |
-
i[r] ||
|
52 |
-
function () {
|
53 |
-
(i[r].q = i[r].q || []).push(arguments);
|
54 |
-
}),
|
55 |
-
(i[r].l = 1 * new Date());
|
56 |
-
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
|
57 |
-
a.async = 1;
|
58 |
-
a.src = g;
|
59 |
-
m.parentNode.insertBefore(a, m);
|
60 |
-
})(
|
61 |
-
window,
|
62 |
-
document,
|
63 |
-
"script",
|
64 |
-
"https://www.google-analytics.com/analytics.js",
|
65 |
-
"ganalytics"
|
66 |
-
);
|
67 |
-
ganalytics("create", window.gaIdDeprecated, "auto");
|
68 |
-
ganalytics("send", "pageview");
|
69 |
-
}
|
70 |
-
</script>
|
71 |
</body>
|
72 |
</html>
|
|
|
4 |
<head>
|
5 |
<meta charset="utf-8" />
|
6 |
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
|
7 |
+
<meta property="og:image" content="/chatui/thumbnail.jpg" />
|
8 |
<script>
|
9 |
if (
|
10 |
localStorage.theme === "dark" ||
|
|
|
12 |
) {
|
13 |
document.documentElement.classList.add("dark");
|
14 |
}
|
|
|
|
|
|
|
|
|
15 |
</script>
|
16 |
%sveltekit.head%
|
17 |
</head>
|
18 |
<body data-sveltekit-preload-data="hover" class="h-full dark:bg-gray-900">
|
19 |
<div id="app" class="contents h-full">%sveltekit.body%</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
</body>
|
21 |
</html>
|
src/hooks.server.ts
CHANGED
@@ -53,37 +53,37 @@ export const handle: Handle = async ({ event, resolve }) => {
|
|
53 |
}
|
54 |
}
|
55 |
|
56 |
-
if (
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
) {
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
}
|
87 |
|
88 |
refreshSessionCookie(event.cookies, event.locals.sessionId);
|
89 |
|
|
|
53 |
}
|
54 |
}
|
55 |
|
56 |
+
// if (
|
57 |
+
// !event.url.pathname.startsWith(`${base}/login`) &&
|
58 |
+
// !event.url.pathname.startsWith(`${base}/admin`) &&
|
59 |
+
// !["GET", "OPTIONS", "HEAD"].includes(event.request.method)
|
60 |
+
// ) {
|
61 |
+
// if (
|
62 |
+
// !user &&
|
63 |
+
// requiresUser &&
|
64 |
+
// !((MESSAGES_BEFORE_LOGIN ? parseInt(MESSAGES_BEFORE_LOGIN) : 0) > 0)
|
65 |
+
// ) {
|
66 |
+
// return errorResponse(401, ERROR_MESSAGES.authOnly);
|
67 |
+
// }
|
68 |
|
69 |
+
// // if login is not required and the call is not from /settings and we display the ethics modal with PUBLIC_APP_DISCLAIMER
|
70 |
+
// // we check if the user has accepted the ethics modal first.
|
71 |
+
// // If login is required, `ethicsModalAcceptedAt` is already true at this point, so do not pass this condition. This saves a DB call.
|
72 |
+
// if (
|
73 |
+
// !requiresUser &&
|
74 |
+
// !event.url.pathname.startsWith(`${base}/settings`) &&
|
75 |
+
// !!PUBLIC_APP_DISCLAIMER
|
76 |
+
// ) {
|
77 |
+
// const hasAcceptedEthicsModal = await collections.settings.countDocuments({
|
78 |
+
// sessionId: event.locals.sessionId,
|
79 |
+
// ethicsModalAcceptedAt: { $exists: true },
|
80 |
+
// });
|
81 |
|
82 |
+
// if (!hasAcceptedEthicsModal) {
|
83 |
+
// return errorResponse(405, "You need to accept the welcome modal first");
|
84 |
+
// }
|
85 |
+
// }
|
86 |
+
// }
|
87 |
|
88 |
refreshSessionCookie(event.cookies, event.locals.sessionId);
|
89 |
|
src/lib/components/ConfirmModal.svelte
CHANGED
@@ -8,20 +8,22 @@
|
|
8 |
|
9 |
<Modal>
|
10 |
<div class="flex w-full flex-col gap-0 p-2">
|
11 |
-
<div class="flex items-start text-xl font-bold text-gray-800
|
12 |
<h1>You are about to download an AI model on your device</h1>
|
13 |
<br />
|
14 |
<button type="button" class="group" on:click={() => dispatch("close")}>
|
15 |
<CarbonClose class="text-gray-900 group-hover:text-gray-500" />
|
16 |
</button>
|
17 |
</div>
|
18 |
-
<div class="flex items-start text-
|
19 |
-
<br
|
20 |
-
|
|
|
|
|
21 |
<br />
|
22 |
</div>
|
23 |
-
<div class="flex items-start text-
|
24 |
-
<br
|
25 |
</div>
|
26 |
<br />
|
27 |
</div>
|
|
|
8 |
|
9 |
<Modal>
|
10 |
<div class="flex w-full flex-col gap-0 p-2">
|
11 |
+
<div class="m-2 flex items-start text-xl font-bold text-gray-800">
|
12 |
<h1>You are about to download an AI model on your device</h1>
|
13 |
<br />
|
14 |
<button type="button" class="group" on:click={() => dispatch("close")}>
|
15 |
<CarbonClose class="text-gray-900 group-hover:text-gray-500" />
|
16 |
</button>
|
17 |
</div>
|
18 |
+
<div class="text-m m-2 flex items-start text-gray-800">
|
19 |
+
<br />To ensure your conversations with our AI remain private, our web application sends a
|
20 |
+
model to your device to perform inference locally. No data leaves your device.<br />
|
21 |
+
<br />This might be demanding in terms of bandwidth, storage and computing power on your side.<br
|
22 |
+
/>
|
23 |
<br />
|
24 |
</div>
|
25 |
+
<div class="text-m m-2 flex items-start text-gray-800">
|
26 |
+
<br /><b>Mobile usage is not advised.</b><br />
|
27 |
</div>
|
28 |
<br />
|
29 |
</div>
|
src/lib/components/LoadingModal.svelte
CHANGED
@@ -23,8 +23,8 @@
|
|
23 |
<h2>Loading the model...</h2>
|
24 |
<br />
|
25 |
</div>
|
26 |
-
<div class="flex items-start text-
|
27 |
-
<br
|
28 |
</div>
|
29 |
<br />
|
30 |
{#await forceUpdate(pr) then _}
|
|
|
23 |
<h2>Loading the model...</h2>
|
24 |
<br />
|
25 |
</div>
|
26 |
+
<div class="text-s flex items-start text-gray-800">
|
27 |
+
<br />Please wait while we download the model. This has to be done only once.
|
28 |
</div>
|
29 |
<br />
|
30 |
{#await forceUpdate(pr) then _}
|
src/lib/components/LoginModal.svelte
CHANGED
@@ -14,7 +14,7 @@
|
|
14 |
|
15 |
<Modal>
|
16 |
<div
|
17 |
-
class="flex w-full flex-col items-center gap-6 bg-gradient-to-t from-primary-500/40 via-primary-500/10 to-primary-500/0 px-4 pb-10 pt-9 text-center
|
18 |
>
|
19 |
<h2 class="flex items-center text-2xl font-semibold text-gray-800">
|
20 |
<Logo classNames="mr-1" />
|
|
|
14 |
|
15 |
<Modal>
|
16 |
<div
|
17 |
+
class="flex w-full flex-col items-center gap-6 bg-gradient-to-t from-primary-500/40 via-primary-500/10 to-primary-500/0 px-4 pb-10 pt-9 text-center"
|
18 |
>
|
19 |
<h2 class="flex items-center text-2xl font-semibold text-gray-800">
|
20 |
<Logo classNames="mr-1" />
|
src/lib/components/ModelCardMetadata.svelte
CHANGED
@@ -9,7 +9,7 @@
|
|
9 |
</script>
|
10 |
|
11 |
<div
|
12 |
-
class="flex items-center gap-5 rounded-xl bg-gray-100 px-3 py-2 text-sm
|
13 |
{variant === 'dark'
|
14 |
? 'text-gray-600 dark:bg-gray-800 dark:text-gray-300'
|
15 |
: 'text-gray-800 dark:bg-gray-100 dark:text-gray-600'}"
|
|
|
9 |
</script>
|
10 |
|
11 |
<div
|
12 |
+
class="flex items-center gap-5 rounded-xl bg-gray-100 px-3 py-2 text-sm
|
13 |
{variant === 'dark'
|
14 |
? 'text-gray-600 dark:bg-gray-800 dark:text-gray-300'
|
15 |
: 'text-gray-800 dark:bg-gray-100 dark:text-gray-600'}"
|
src/lib/components/ModelsModal.svelte
CHANGED
@@ -13,13 +13,20 @@
|
|
13 |
import CarbonEdit from "~icons/carbon/edit";
|
14 |
import CarbonSave from "~icons/carbon/save";
|
15 |
import CarbonRestart from "~icons/carbon/restart";
|
|
|
16 |
|
17 |
export let settings: LayoutData["settings"];
|
18 |
export let models: Array<Model>;
|
19 |
|
20 |
-
let selectedModelId =
|
|
|
21 |
|
22 |
-
|
|
|
|
|
|
|
|
|
|
|
23 |
|
24 |
let expanded = false;
|
25 |
|
@@ -30,6 +37,11 @@
|
|
30 |
expanded = !expanded;
|
31 |
}
|
32 |
|
|
|
|
|
|
|
|
|
|
|
33 |
let value = "";
|
34 |
|
35 |
function onModelChange() {
|
@@ -37,6 +49,7 @@
|
|
37 |
settings.customPrompts[selectedModelId] ??
|
38 |
models.filter((el) => el.id === selectedModelId)[0].preprompt ??
|
39 |
"";
|
|
|
40 |
}
|
41 |
|
42 |
$: selectedModelId, onModelChange();
|
@@ -44,16 +57,11 @@
|
|
44 |
|
45 |
<Modal width="max-w-lg" on:close>
|
46 |
<form
|
47 |
-
action="{base}/settings"
|
48 |
-
method="post"
|
49 |
on:submit={() => {
|
50 |
if (expanded) {
|
51 |
onToggle();
|
52 |
}
|
53 |
}}
|
54 |
-
use:enhance={() => {
|
55 |
-
dispatch("close");
|
56 |
-
}}
|
57 |
class="flex w-full flex-col gap-5 p-6"
|
58 |
>
|
59 |
{#each Object.entries(settings).filter(([k]) => !(k == "activeModel" || k === "customPrompts")) as [key, val]}
|
@@ -129,7 +137,7 @@
|
|
129 |
enterkeyhint="send"
|
130 |
tabindex="0"
|
131 |
rows="1"
|
132 |
-
class="h-20 w-full resize-none scroll-p-3 overflow-x-hidden overflow-y-scroll rounded-md border border-gray-300 bg-transparent p-1
|
133 |
bind:value
|
134 |
hidden={!expanded}
|
135 |
/>
|
@@ -140,8 +148,12 @@
|
|
140 |
{/each}
|
141 |
</div>
|
142 |
<button
|
143 |
-
type="
|
144 |
class="mt-2 rounded-full bg-black px-5 py-2 text-lg font-semibold text-gray-100 ring-gray-400 ring-offset-1 transition-colors hover:ring"
|
|
|
|
|
|
|
|
|
145 |
>
|
146 |
Apply
|
147 |
</button>
|
|
|
13 |
import CarbonEdit from "~icons/carbon/edit";
|
14 |
import CarbonSave from "~icons/carbon/save";
|
15 |
import CarbonRestart from "~icons/carbon/restart";
|
16 |
+
import { curr_model_writable } from "../../routes/LayoutWritable";
|
17 |
|
18 |
export let settings: LayoutData["settings"];
|
19 |
export let models: Array<Model>;
|
20 |
|
21 |
+
let selectedModelId = "";
|
22 |
+
let selectedNum = 0;
|
23 |
|
24 |
+
curr_model_writable.subscribe((val) => {
|
25 |
+
selectedModelId = models[val].name;
|
26 |
+
selectedNum = val;
|
27 |
+
});
|
28 |
+
|
29 |
+
const dispatch = createEventDispatcher<{ close: void; closeAndSave }>();
|
30 |
|
31 |
let expanded = false;
|
32 |
|
|
|
37 |
expanded = !expanded;
|
38 |
}
|
39 |
|
40 |
+
function onApply() {
|
41 |
+
curr_model_writable.set(selectedNum);
|
42 |
+
dispatch("close");
|
43 |
+
}
|
44 |
+
|
45 |
let value = "";
|
46 |
|
47 |
function onModelChange() {
|
|
|
49 |
settings.customPrompts[selectedModelId] ??
|
50 |
models.filter((el) => el.id === selectedModelId)[0].preprompt ??
|
51 |
"";
|
52 |
+
selectedNum = models.findIndex((el) => el.id == selectedModelId);
|
53 |
}
|
54 |
|
55 |
$: selectedModelId, onModelChange();
|
|
|
57 |
|
58 |
<Modal width="max-w-lg" on:close>
|
59 |
<form
|
|
|
|
|
60 |
on:submit={() => {
|
61 |
if (expanded) {
|
62 |
onToggle();
|
63 |
}
|
64 |
}}
|
|
|
|
|
|
|
65 |
class="flex w-full flex-col gap-5 p-6"
|
66 |
>
|
67 |
{#each Object.entries(settings).filter(([k]) => !(k == "activeModel" || k === "customPrompts")) as [key, val]}
|
|
|
137 |
enterkeyhint="send"
|
138 |
tabindex="0"
|
139 |
rows="1"
|
140 |
+
class="h-20 w-full resize-none scroll-p-3 overflow-x-hidden overflow-y-scroll rounded-md border border-gray-300 bg-transparent p-1 text-xs outline-none focus:ring-0 focus-visible:ring-0"
|
141 |
bind:value
|
142 |
hidden={!expanded}
|
143 |
/>
|
|
|
148 |
{/each}
|
149 |
</div>
|
150 |
<button
|
151 |
+
type="button"
|
152 |
class="mt-2 rounded-full bg-black px-5 py-2 text-lg font-semibold text-gray-100 ring-gray-400 ring-offset-1 transition-colors hover:ring"
|
153 |
+
on:click={() =>
|
154 |
+
dispatch("closeAndSave", {
|
155 |
+
id: selectedNum,
|
156 |
+
})}
|
157 |
>
|
158 |
Apply
|
159 |
</button>
|
src/lib/components/NavConversationItem.svelte
CHANGED
@@ -24,7 +24,9 @@
|
|
24 |
on:mouseleave={() => {
|
25 |
confirmDelete = false;
|
26 |
}}
|
27 |
-
on:click
|
|
|
|
|
28 |
href="{base}/conversation/{conv.id}"
|
29 |
class="group flex h-11 flex-none items-center gap-1.5 rounded-lg pl-3 pr-2 text-gray-500 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-700 {conv.id ===
|
30 |
$page.params.id
|
|
|
24 |
on:mouseleave={() => {
|
25 |
confirmDelete = false;
|
26 |
}}
|
27 |
+
on:click={() => {
|
28 |
+
params_writable.set(conv.id);
|
29 |
+
}}
|
30 |
href="{base}/conversation/{conv.id}"
|
31 |
class="group flex h-11 flex-none items-center gap-1.5 rounded-lg pl-3 pr-2 text-gray-500 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-700 {conv.id ===
|
32 |
$page.params.id
|
src/lib/components/SettingsModal.svelte
CHANGED
@@ -14,7 +14,7 @@
|
|
14 |
|
15 |
let isConfirmingDeletion = false;
|
16 |
|
17 |
-
const dispatch = createEventDispatcher<{ close: void
|
18 |
</script>
|
19 |
|
20 |
<Modal on:close>
|
@@ -33,16 +33,14 @@
|
|
33 |
method="post"
|
34 |
action="{base}/settings"
|
35 |
>
|
36 |
-
<form
|
37 |
-
on:submit|preventDefault={() => (isConfirmingDeletion = true)}
|
38 |
-
>
|
39 |
<button type="submit" class="underline decoration-gray-300 hover:decoration-gray-700">
|
40 |
Delete all conversations
|
41 |
</button>
|
42 |
</form>
|
43 |
<button
|
44 |
type="submit"
|
45 |
-
class="mt-2 rounded-full bg-black px-5 py-2 text-lg font-semibold text-gray-100 ring-gray-400 ring-offset-1 transition-all focus-visible:outline-none focus-visible:ring
|
46 |
>
|
47 |
Apply
|
48 |
</button>
|
@@ -50,14 +48,7 @@
|
|
50 |
|
51 |
{#if isConfirmingDeletion}
|
52 |
<Modal on:close={() => (isConfirmingDeletion = false)}>
|
53 |
-
<form
|
54 |
-
use:enhance={() => {
|
55 |
-
dispatch("close");
|
56 |
-
}}
|
57 |
-
method="post"
|
58 |
-
action="{base}/conversations?/delete"
|
59 |
-
class="flex w-full flex-col gap-5 p-6"
|
60 |
-
>
|
61 |
<div class="flex items-start justify-between text-xl font-semibold text-gray-800">
|
62 |
<h2>Are you sure?</h2>
|
63 |
<button type="button" class="group" on:click={() => (isConfirmingDeletion = false)}>
|
@@ -68,8 +59,9 @@
|
|
68 |
This action will delete all your conversations. This cannot be undone.
|
69 |
</p>
|
70 |
<button
|
71 |
-
type="
|
72 |
-
class="mt-2 rounded-full bg-red-700 px-5 py-2 text-lg font-semibold text-gray-100 ring-gray-400 ring-offset-1 transition-all focus-visible:outline-none focus-visible:ring
|
|
|
73 |
>
|
74 |
Confirm deletion
|
75 |
</button>
|
|
|
14 |
|
15 |
let isConfirmingDeletion = false;
|
16 |
|
17 |
+
const dispatch = createEventDispatcher<{ close: void; deleteAllConversations: void }>();
|
18 |
</script>
|
19 |
|
20 |
<Modal on:close>
|
|
|
33 |
method="post"
|
34 |
action="{base}/settings"
|
35 |
>
|
36 |
+
<form on:submit|preventDefault={() => (isConfirmingDeletion = true)}>
|
|
|
|
|
37 |
<button type="submit" class="underline decoration-gray-300 hover:decoration-gray-700">
|
38 |
Delete all conversations
|
39 |
</button>
|
40 |
</form>
|
41 |
<button
|
42 |
type="submit"
|
43 |
+
class="mt-2 rounded-full bg-black px-5 py-2 text-lg font-semibold text-gray-100 ring-gray-400 ring-offset-1 transition-all hover:ring focus-visible:outline-none focus-visible:ring"
|
44 |
>
|
45 |
Apply
|
46 |
</button>
|
|
|
48 |
|
49 |
{#if isConfirmingDeletion}
|
50 |
<Modal on:close={() => (isConfirmingDeletion = false)}>
|
51 |
+
<form class="flex w-full flex-col gap-5 p-6">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
<div class="flex items-start justify-between text-xl font-semibold text-gray-800">
|
53 |
<h2>Are you sure?</h2>
|
54 |
<button type="button" class="group" on:click={() => (isConfirmingDeletion = false)}>
|
|
|
59 |
This action will delete all your conversations. This cannot be undone.
|
60 |
</p>
|
61 |
<button
|
62 |
+
type="button"
|
63 |
+
class="mt-2 rounded-full bg-red-700 px-5 py-2 text-lg font-semibold text-gray-100 ring-gray-400 ring-offset-1 transition-all hover:ring focus-visible:outline-none focus-visible:ring"
|
64 |
+
on:click={() => dispatch("deleteAllConversations")}
|
65 |
>
|
66 |
Confirm deletion
|
67 |
</button>
|
src/lib/components/Tooltip.svelte
CHANGED
@@ -6,7 +6,7 @@
|
|
6 |
|
7 |
<div
|
8 |
class="
|
9 |
-
pointer-events-none absolute rounded bg-black px-2 py-1 font-normal leading-tight text-white shadow transition-opacity
|
10 |
{position}
|
11 |
{classNames}
|
12 |
"
|
|
|
6 |
|
7 |
<div
|
8 |
class="
|
9 |
+
pointer-events-none absolute rounded bg-black px-2 py-1 font-normal leading-tight text-white shadow transition-opacity
|
10 |
{position}
|
11 |
{classNames}
|
12 |
"
|
src/lib/components/chat/ChatIntroduction.svelte
CHANGED
@@ -12,14 +12,20 @@
|
|
12 |
import type { LayoutData } from "../../../routes/$types";
|
13 |
import { findCurrentModel } from "$lib/utils/models";
|
14 |
import { env } from "$env/dynamic/public";
|
|
|
15 |
|
16 |
export let currentModel: Model;
|
17 |
export let settings: LayoutData["settings"];
|
18 |
export let models: Model[];
|
19 |
|
20 |
let isModelsModalOpen = false;
|
|
|
21 |
|
22 |
-
|
|
|
|
|
|
|
|
|
23 |
|
24 |
const announcementBanners = PUBLIC_ANNOUNCEMENT_BANNERS
|
25 |
? JSON.parse(PUBLIC_ANNOUNCEMENT_BANNERS)
|
@@ -27,7 +33,7 @@
|
|
27 |
|
28 |
const dispatch = createEventDispatcher<{ message: string }>();
|
29 |
|
30 |
-
$: title = env.PUBLIC_APP_NAME
|
31 |
</script>
|
32 |
|
33 |
<div class="my-auto grid gap-8 lg:grid-cols-3">
|
@@ -49,17 +55,24 @@
|
|
49 |
</div>
|
50 |
<div class="lg:col-span-2 lg:pl-24">
|
51 |
{#each announcementBanners as banner}
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
{/each}
|
61 |
{#if isModelsModalOpen}
|
62 |
-
<ModelsModal
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
{/if}
|
64 |
<div class="overflow-hidden rounded-xl border dark:border-gray-800">
|
65 |
<div class="flex p-3">
|
|
|
12 |
import type { LayoutData } from "../../../routes/$types";
|
13 |
import { findCurrentModel } from "$lib/utils/models";
|
14 |
import { env } from "$env/dynamic/public";
|
15 |
+
import { curr_model_writable } from "../../../routes/LayoutWritable";
|
16 |
|
17 |
export let currentModel: Model;
|
18 |
export let settings: LayoutData["settings"];
|
19 |
export let models: Model[];
|
20 |
|
21 |
let isModelsModalOpen = false;
|
22 |
+
let selectedNum = 0;
|
23 |
|
24 |
+
curr_model_writable.subscribe((val) => {
|
25 |
+
selectedNum = val;
|
26 |
+
});
|
27 |
+
|
28 |
+
$: currentModelMetadata = findCurrentModel(models, models[selectedNum].name);
|
29 |
|
30 |
const announcementBanners = PUBLIC_ANNOUNCEMENT_BANNERS
|
31 |
? JSON.parse(PUBLIC_ANNOUNCEMENT_BANNERS)
|
|
|
33 |
|
34 |
const dispatch = createEventDispatcher<{ message: string }>();
|
35 |
|
36 |
+
$: title = env.PUBLIC_APP_NAME;
|
37 |
</script>
|
38 |
|
39 |
<div class="my-auto grid gap-8 lg:grid-cols-3">
|
|
|
55 |
</div>
|
56 |
<div class="lg:col-span-2 lg:pl-24">
|
57 |
{#each announcementBanners as banner}
|
58 |
+
<AnnouncementBanner classNames="mb-4" title={banner.title}>
|
59 |
+
<a
|
60 |
+
target="_blank"
|
61 |
+
href={banner.linkHref}
|
62 |
+
class="mr-2 flex items-center underline hover:no-underline"
|
63 |
+
><CarbonArrowUpRight class="mr-1.5 text-xs" /> {banner.linkTitle}</a
|
64 |
+
>
|
65 |
+
</AnnouncementBanner>
|
66 |
{/each}
|
67 |
{#if isModelsModalOpen}
|
68 |
+
<ModelsModal
|
69 |
+
{settings}
|
70 |
+
{models}
|
71 |
+
on:close={() => (isModelsModalOpen = false)}
|
72 |
+
on:closeAndSave={(id) => (
|
73 |
+
(isModelsModalOpen = false), curr_model_writable.set(id.detail.id)
|
74 |
+
)}
|
75 |
+
/>
|
76 |
{/if}
|
77 |
<div class="overflow-hidden rounded-xl border dark:border-gray-800">
|
78 |
<div class="flex p-3">
|
src/lib/components/chat/ChatMessage.svelte
CHANGED
@@ -37,7 +37,10 @@
|
|
37 |
return ret;
|
38 |
}
|
39 |
function unsanitizeMd(md: string) {
|
40 |
-
|
|
|
|
|
|
|
41 |
}
|
42 |
|
43 |
export let model: Model;
|
@@ -131,14 +134,12 @@
|
|
131 |
class="prose max-w-none dark:prose-invert max-sm:prose-sm prose-headings:font-semibold prose-h1:text-lg prose-h2:text-base prose-h3:text-base prose-pre:bg-gray-800 dark:prose-pre:bg-gray-900"
|
132 |
bind:this={contentEl}
|
133 |
>
|
134 |
-
{#
|
135 |
-
{
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
{/if}
|
141 |
-
{/each}
|
142 |
</div>
|
143 |
</div>
|
144 |
<!-- {#if isAuthor && !loading && message.content}
|
@@ -184,29 +185,7 @@
|
|
184 |
{message.content.trim()}
|
185 |
</div>
|
186 |
{#if !loading}
|
187 |
-
<div class="absolute right-0 top-3.5 flex gap-2 lg:-right-2"
|
188 |
-
<!-- {#if downloadLink}
|
189 |
-
<a
|
190 |
-
class="rounded-lg border border-gray-100 p-1 text-xs text-gray-400 group-hover:block hover:text-gray-500 dark:border-gray-800 dark:text-gray-400 dark:hover:text-gray-300 md:hidden"
|
191 |
-
title="Download prompt and parameters"
|
192 |
-
type="button"
|
193 |
-
target="_blank"
|
194 |
-
href={downloadLink}
|
195 |
-
>
|
196 |
-
<CarbonDownload />
|
197 |
-
</a>
|
198 |
-
{/if} -->
|
199 |
-
<!-- {#if !readOnly}
|
200 |
-
<button
|
201 |
-
class="cursor-pointer rounded-lg border border-gray-100 p-1 text-xs text-gray-400 group-hover:block hover:text-gray-500 dark:border-gray-800 dark:text-gray-400 dark:hover:text-gray-300 md:hidden lg:-right-2"
|
202 |
-
title="Retry"
|
203 |
-
type="button"
|
204 |
-
on:click={() => dispatch("retry", { content: message.content, id: message.id })}
|
205 |
-
>
|
206 |
-
<CarbonRotate360 />
|
207 |
-
</button>
|
208 |
-
{/if} -->
|
209 |
-
</div>
|
210 |
{/if}
|
211 |
</div>
|
212 |
{/if}
|
|
|
37 |
return ret;
|
38 |
}
|
39 |
function unsanitizeMd(md: string) {
|
40 |
+
if (md != undefined)
|
41 |
+
return md.replaceAll("<", "<");
|
42 |
+
else
|
43 |
+
return ""
|
44 |
}
|
45 |
|
46 |
export let model: Model;
|
|
|
134 |
class="prose max-w-none dark:prose-invert max-sm:prose-sm prose-headings:font-semibold prose-h1:text-lg prose-h2:text-base prose-h3:text-base prose-pre:bg-gray-800 dark:prose-pre:bg-gray-900"
|
135 |
bind:this={contentEl}
|
136 |
>
|
137 |
+
{#if message.isCode == true}
|
138 |
+
<CodeBlock lang={"python"} code={unsanitizeMd(message.content)} />
|
139 |
+
{:else}
|
140 |
+
<!-- eslint-disable-next-line svelte/no-at-html-tags -->
|
141 |
+
{@html marked(message.content, options)}
|
142 |
+
{/if}
|
|
|
|
|
143 |
</div>
|
144 |
</div>
|
145 |
<!-- {#if isAuthor && !loading && message.content}
|
|
|
185 |
{message.content.trim()}
|
186 |
</div>
|
187 |
{#if !loading}
|
188 |
+
<div class="absolute right-0 top-3.5 flex gap-2 lg:-right-2" />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
189 |
{/if}
|
190 |
</div>
|
191 |
{/if}
|
src/lib/components/chat/ChatWindow.svelte
CHANGED
@@ -83,7 +83,7 @@
|
|
83 |
</div>
|
84 |
<form
|
85 |
on:submit|preventDefault={handleSubmit}
|
86 |
-
class="relative flex w-full max-w-4xl flex-1 items-center rounded-xl border bg-gray-100 focus-within:border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:focus-within:border-gray-500
|
87 |
{isReadOnly ? 'opacity-30' : ''}"
|
88 |
>
|
89 |
<div class="flex w-full flex-1 border-none bg-transparent">
|
@@ -100,19 +100,19 @@
|
|
100 |
|
101 |
{#if loading}
|
102 |
<button
|
103 |
-
class="btn mx-1 my-1 inline-block h-[2.4rem] self-end rounded-lg bg-transparent p-1 px-[0.7rem] text-gray-400
|
104 |
on:click={() => dispatch("stop")}
|
105 |
>
|
106 |
<CarbonStopFilledAlt />
|
107 |
</button>
|
108 |
<div
|
109 |
-
class="mx-1 my-1 hidden h-[2.4rem] items-center p-1 px-[0.7rem] text-gray-400
|
110 |
>
|
111 |
<EosIconsLoading />
|
112 |
</div>
|
113 |
{:else}
|
114 |
<button
|
115 |
-
class="btn mx-1 my-1 h-[2.4rem] self-end rounded-lg bg-transparent p-1 px-[0.7rem] text-gray-400
|
116 |
disabled={!message || isReadOnly}
|
117 |
type="submit"
|
118 |
>
|
@@ -128,9 +128,9 @@
|
|
128 |
target="_blank"
|
129 |
rel="noreferrer"
|
130 |
class="hover:underline">{currentModel.displayName}</a
|
131 |
-
> <span class="max-sm:hidden">·</span><br class="sm:hidden" /> Generated content may be
|
132 |
-
or false.
|
133 |
-
<br
|
134 |
</p>
|
135 |
<!-- {#if messages.length}
|
136 |
<button
|
|
|
83 |
</div>
|
84 |
<form
|
85 |
on:submit|preventDefault={handleSubmit}
|
86 |
+
class="relative flex w-full max-w-4xl flex-1 items-center rounded-xl border bg-gray-100 focus-within:border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:focus-within:border-gray-500
|
87 |
{isReadOnly ? 'opacity-30' : ''}"
|
88 |
>
|
89 |
<div class="flex w-full flex-1 border-none bg-transparent">
|
|
|
100 |
|
101 |
{#if loading}
|
102 |
<button
|
103 |
+
class="btn mx-1 my-1 inline-block h-[2.4rem] self-end rounded-lg bg-transparent p-1 px-[0.7rem] text-gray-400 enabled:hover:text-gray-700 disabled:opacity-60 enabled:dark:hover:text-gray-100 dark:disabled:opacity-40 md:hidden"
|
104 |
on:click={() => dispatch("stop")}
|
105 |
>
|
106 |
<CarbonStopFilledAlt />
|
107 |
</button>
|
108 |
<div
|
109 |
+
class="mx-1 my-1 hidden h-[2.4rem] items-center p-1 px-[0.7rem] text-gray-400 enabled:hover:text-gray-700 disabled:opacity-60 enabled:dark:hover:text-gray-100 dark:disabled:opacity-40 md:flex"
|
110 |
>
|
111 |
<EosIconsLoading />
|
112 |
</div>
|
113 |
{:else}
|
114 |
<button
|
115 |
+
class="btn mx-1 my-1 h-[2.4rem] self-end rounded-lg bg-transparent p-1 px-[0.7rem] text-gray-400 enabled:hover:text-gray-700 disabled:opacity-60 enabled:dark:hover:text-gray-100 dark:disabled:opacity-40"
|
116 |
disabled={!message || isReadOnly}
|
117 |
type="submit"
|
118 |
>
|
|
|
128 |
target="_blank"
|
129 |
rel="noreferrer"
|
130 |
class="hover:underline">{currentModel.displayName}</a
|
131 |
+
> <span class="max-sm:hidden">·</span><br class="sm:hidden" /> Generated content may be
|
132 |
+
inaccurate or false.
|
133 |
+
<br /><br /> 🔒 All conversations are end-to-end protected
|
134 |
</p>
|
135 |
<!-- {#if messages.length}
|
136 |
<button
|
src/lib/server/database.ts
CHANGED
@@ -1,15 +1,15 @@
|
|
1 |
-
let client = undefined
|
2 |
-
export const connectPromise = undefined
|
3 |
|
4 |
-
const db = undefined
|
5 |
|
6 |
-
const conversations = undefined
|
7 |
-
const sharedConversations = undefined
|
8 |
-
const abortedGenerations = undefined
|
9 |
-
const settings = undefined
|
10 |
-
const users = undefined
|
11 |
-
const webSearches = undefined
|
12 |
-
const messageEvents = undefined
|
13 |
|
14 |
export { client, db };
|
15 |
export const collections = {
|
@@ -20,4 +20,4 @@ export const collections = {
|
|
20 |
users,
|
21 |
webSearches,
|
22 |
messageEvents,
|
23 |
-
};
|
|
|
1 |
+
let client = undefined;
|
2 |
+
export const connectPromise = undefined;
|
3 |
|
4 |
+
const db = undefined;
|
5 |
|
6 |
+
const conversations = undefined;
|
7 |
+
const sharedConversations = undefined;
|
8 |
+
const abortedGenerations = undefined;
|
9 |
+
const settings = undefined;
|
10 |
+
const users = undefined;
|
11 |
+
const webSearches = undefined;
|
12 |
+
const messageEvents = undefined;
|
13 |
|
14 |
export { client, db };
|
15 |
export const collections = {
|
|
|
20 |
users,
|
21 |
webSearches,
|
22 |
messageEvents,
|
23 |
+
};
|
src/lib/server/models.ts
CHANGED
@@ -64,6 +64,8 @@ const modelsRaw = z
|
|
64 |
displayName: z.string().min(1).optional(),
|
65 |
description: z.string().min(1).optional(),
|
66 |
is_local: z.boolean().optional(),
|
|
|
|
|
67 |
websiteUrl: z.string().url().optional(),
|
68 |
modelUrl: z.string().url().optional(),
|
69 |
datasetName: z.string().min(1).optional(),
|
|
|
64 |
displayName: z.string().min(1).optional(),
|
65 |
description: z.string().min(1).optional(),
|
66 |
is_local: z.boolean().optional(),
|
67 |
+
is_code: z.boolean().optional(),
|
68 |
+
type: z.string().min(1),
|
69 |
websiteUrl: z.string().url().optional(),
|
70 |
modelUrl: z.string().url().optional(),
|
71 |
datasetName: z.string().min(1).optional(),
|
src/lib/types/Message.ts
CHANGED
@@ -6,4 +6,5 @@ export type Message = Partial<Timestamps> & {
|
|
6 |
content: string;
|
7 |
webSearchId?: string;
|
8 |
score?: -1 | 0 | 1;
|
|
|
9 |
};
|
|
|
6 |
content: string;
|
7 |
webSearchId?: string;
|
8 |
score?: -1 | 0 | 1;
|
9 |
+
isCode: boolean;
|
10 |
};
|
src/routes/+layout.server.ts
CHANGED
@@ -28,12 +28,10 @@ export const load: LayoutServerLoad = async ({ locals, depends, url }) => {
|
|
28 |
throw redirect(302, url.pathname);
|
29 |
}
|
30 |
|
31 |
-
|
32 |
return {
|
33 |
conversations: [],
|
34 |
settings: {
|
35 |
-
shareConversationsWithModelAuthors:
|
36 |
-
DEFAULT_SETTINGS.shareConversationsWithModelAuthors,
|
37 |
ethicsModalAcceptedAt: null,
|
38 |
activeModel: DEFAULT_SETTINGS.activeModel,
|
39 |
searchEnabled: false,
|
@@ -45,6 +43,8 @@ export const load: LayoutServerLoad = async ({ locals, depends, url }) => {
|
|
45 |
websiteUrl: model.websiteUrl,
|
46 |
modelUrl: model.modelUrl,
|
47 |
is_local: model.is_local,
|
|
|
|
|
48 |
datasetName: model.datasetName,
|
49 |
datasetUrl: model.datasetUrl,
|
50 |
displayName: model.displayName,
|
|
|
28 |
throw redirect(302, url.pathname);
|
29 |
}
|
30 |
|
|
|
31 |
return {
|
32 |
conversations: [],
|
33 |
settings: {
|
34 |
+
shareConversationsWithModelAuthors: DEFAULT_SETTINGS.shareConversationsWithModelAuthors,
|
|
|
35 |
ethicsModalAcceptedAt: null,
|
36 |
activeModel: DEFAULT_SETTINGS.activeModel,
|
37 |
searchEnabled: false,
|
|
|
43 |
websiteUrl: model.websiteUrl,
|
44 |
modelUrl: model.modelUrl,
|
45 |
is_local: model.is_local,
|
46 |
+
is_code: model.is_code,
|
47 |
+
type: model.type,
|
48 |
datasetName: model.datasetName,
|
49 |
datasetUrl: model.datasetUrl,
|
50 |
displayName: model.displayName,
|
src/routes/+layout.svelte
CHANGED
@@ -19,8 +19,18 @@
|
|
19 |
import LoadingModal from "$lib/components/LoadingModal.svelte";
|
20 |
import LoginModal from "$lib/components/LoginModal.svelte";
|
21 |
import { PUBLIC_APP_ASSETS, PUBLIC_APP_NAME } from "$env/static/public";
|
22 |
-
import {
|
23 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
import { env } from "$env/dynamic/public";
|
25 |
|
26 |
export let data;
|
@@ -29,7 +39,7 @@
|
|
29 |
|
30 |
let go_to_main = false;
|
31 |
|
32 |
-
let conversations_list = []
|
33 |
|
34 |
isloading_writable.subscribe((value) => {
|
35 |
isloading = value;
|
@@ -42,14 +52,14 @@
|
|
42 |
|
43 |
refresh_chats_writable.subscribe(async (value) => {
|
44 |
if (value.length > 0) {
|
45 |
-
conversations_list = value
|
46 |
-
refresh_chats_writable.set([])
|
47 |
}
|
48 |
});
|
49 |
|
50 |
refresh_chats_writable_empty.subscribe(async (value) => {
|
51 |
-
conversations_list = []
|
52 |
-
refresh_chats_writable.set(conversations_list)
|
53 |
});
|
54 |
|
55 |
export function getProgress(progress: number) {}
|
@@ -74,19 +84,19 @@
|
|
74 |
await deleteChat(id);
|
75 |
|
76 |
if ($page.params.id !== id) {
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
}
|
81 |
}
|
82 |
|
83 |
async function deleteAllConversations(id: string) {
|
84 |
await deleteAllChats();
|
85 |
-
|
86 |
if ($page.params.id !== id) {
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
}
|
91 |
}
|
92 |
|
@@ -95,7 +105,7 @@
|
|
95 |
}
|
96 |
|
97 |
onMount(async () => {
|
98 |
-
await refreshChats()
|
99 |
});
|
100 |
|
101 |
onDestroy(() => {
|
@@ -105,7 +115,7 @@
|
|
105 |
$: if ($error) onError();
|
106 |
|
107 |
const requiresLogin =
|
108 |
-
|
109 |
!$page.route.id?.startsWith("/r/") &&
|
110 |
(data.requiresLogin
|
111 |
? !data.user
|
@@ -114,12 +124,11 @@
|
|
114 |
let loginModalVisible = false;
|
115 |
|
116 |
async function refreshChats() {
|
117 |
-
let ret = await getChats()
|
118 |
-
data.conversations = ret
|
119 |
-
conversations_list = ret
|
120 |
}
|
121 |
$: title = env.PUBLIC_APP_NAME;
|
122 |
-
|
123 |
</script>
|
124 |
|
125 |
<svelte:head>
|
@@ -194,9 +203,7 @@
|
|
194 |
<Toast message={currentError} />
|
195 |
{/if}
|
196 |
{#if showWarning}
|
197 |
-
<ConfirmModal
|
198 |
-
on:close={() => (showWarning = false)}
|
199 |
-
/>
|
200 |
{/if}
|
201 |
{#if isloading}
|
202 |
<LoadingModal />
|
@@ -204,6 +211,7 @@
|
|
204 |
{#if isSettingsOpen}
|
205 |
<SettingsModal
|
206 |
on:close={() => (isSettingsOpen = false)}
|
|
|
207 |
settings={data.settings}
|
208 |
models={data.models}
|
209 |
/>
|
|
|
19 |
import LoadingModal from "$lib/components/LoadingModal.svelte";
|
20 |
import LoginModal from "$lib/components/LoginModal.svelte";
|
21 |
import { PUBLIC_APP_ASSETS, PUBLIC_APP_NAME } from "$env/static/public";
|
22 |
+
import {
|
23 |
+
isloading_writable,
|
24 |
+
refresh_chats_writable,
|
25 |
+
refresh_chats_writable_empty,
|
26 |
+
} from "./LayoutWritable";
|
27 |
+
import {
|
28 |
+
deleteAllChats,
|
29 |
+
deleteChat,
|
30 |
+
getChats,
|
31 |
+
getMessages,
|
32 |
+
modifyTitle,
|
33 |
+
} from "../routes/LocalDB";
|
34 |
import { env } from "$env/dynamic/public";
|
35 |
|
36 |
export let data;
|
|
|
39 |
|
40 |
let go_to_main = false;
|
41 |
|
42 |
+
let conversations_list = [];
|
43 |
|
44 |
isloading_writable.subscribe((value) => {
|
45 |
isloading = value;
|
|
|
52 |
|
53 |
refresh_chats_writable.subscribe(async (value) => {
|
54 |
if (value.length > 0) {
|
55 |
+
conversations_list = value;
|
56 |
+
refresh_chats_writable.set([]);
|
57 |
}
|
58 |
});
|
59 |
|
60 |
refresh_chats_writable_empty.subscribe(async (value) => {
|
61 |
+
conversations_list = [];
|
62 |
+
refresh_chats_writable.set(conversations_list);
|
63 |
});
|
64 |
|
65 |
export function getProgress(progress: number) {}
|
|
|
84 |
await deleteChat(id);
|
85 |
|
86 |
if ($page.params.id !== id) {
|
87 |
+
await invalidate(UrlDependency.ConversationList);
|
88 |
+
} else {
|
89 |
+
await goto(`${base}/`, { invalidateAll: true });
|
90 |
}
|
91 |
}
|
92 |
|
93 |
async function deleteAllConversations(id: string) {
|
94 |
await deleteAllChats();
|
95 |
+
|
96 |
if ($page.params.id !== id) {
|
97 |
+
await invalidate(UrlDependency.ConversationList);
|
98 |
+
} else {
|
99 |
+
await goto(`${base}/`, { invalidateAll: true });
|
100 |
}
|
101 |
}
|
102 |
|
|
|
105 |
}
|
106 |
|
107 |
onMount(async () => {
|
108 |
+
await refreshChats();
|
109 |
});
|
110 |
|
111 |
onDestroy(() => {
|
|
|
115 |
$: if ($error) onError();
|
116 |
|
117 |
const requiresLogin =
|
118 |
+
!$page.error &&
|
119 |
!$page.route.id?.startsWith("/r/") &&
|
120 |
(data.requiresLogin
|
121 |
? !data.user
|
|
|
124 |
let loginModalVisible = false;
|
125 |
|
126 |
async function refreshChats() {
|
127 |
+
let ret = await getChats();
|
128 |
+
data.conversations = ret;
|
129 |
+
conversations_list = ret;
|
130 |
}
|
131 |
$: title = env.PUBLIC_APP_NAME;
|
|
|
132 |
</script>
|
133 |
|
134 |
<svelte:head>
|
|
|
203 |
<Toast message={currentError} />
|
204 |
{/if}
|
205 |
{#if showWarning}
|
206 |
+
<ConfirmModal on:close={() => (showWarning = false)} />
|
|
|
|
|
207 |
{/if}
|
208 |
{#if isloading}
|
209 |
<LoadingModal />
|
|
|
211 |
{#if isSettingsOpen}
|
212 |
<SettingsModal
|
213 |
on:close={() => (isSettingsOpen = false)}
|
214 |
+
on:deleteAllConversations={() => ((isSettingsOpen = false), deleteAllChats())}
|
215 |
settings={data.settings}
|
216 |
models={data.models}
|
217 |
/>
|
src/routes/+page.svelte
CHANGED
@@ -8,21 +8,28 @@
|
|
8 |
import { findCurrentModel } from "$lib/utils/models";
|
9 |
import { createChat } from "../routes/LocalDB";
|
10 |
import { params_writable } from "../routes/conversation/[id]/ParamsWritable";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
|
12 |
export let data;
|
13 |
let loading = false;
|
14 |
|
15 |
// dec2hex :: Integer -> String
|
16 |
// i.e. 0-255 -> '00'-'ff'
|
17 |
-
function dec2hex
|
18 |
-
return dec.toString(16).padStart(2, "0")
|
19 |
}
|
20 |
|
21 |
// generateId :: Integer -> String
|
22 |
-
function generateId
|
23 |
-
var arr = new Uint8Array((len || 40) / 2)
|
24 |
-
window.crypto.getRandomValues(arr)
|
25 |
-
return Array.from(arr, dec2hex).join(
|
26 |
}
|
27 |
|
28 |
async function createConversation(message: string) {
|
@@ -34,8 +41,8 @@
|
|
34 |
// Ugly hack to use a store as temp storage, feel free to improve ^^
|
35 |
pendingMessage.set(message);
|
36 |
|
37 |
-
console.log(conversationId)
|
38 |
-
params_writable.set(conversationId)
|
39 |
// invalidateAll to update list of conversations
|
40 |
await goto(`${base}/conversation/${conversationId}`, { invalidateAll: true });
|
41 |
} catch (err) {
|
@@ -48,13 +55,16 @@
|
|
48 |
</script>
|
49 |
|
50 |
<svelte:head>
|
51 |
-
|
52 |
</svelte:head>
|
53 |
|
54 |
<ChatWindow
|
55 |
on:message={(ev) => createConversation(ev.detail)}
|
56 |
{loading}
|
57 |
-
currentModel={findCurrentModel(
|
|
|
|
|
|
|
58 |
models={data.models}
|
59 |
settings={data.settings}
|
60 |
/>
|
|
|
8 |
import { findCurrentModel } from "$lib/utils/models";
|
9 |
import { createChat } from "../routes/LocalDB";
|
10 |
import { params_writable } from "../routes/conversation/[id]/ParamsWritable";
|
11 |
+
import { curr_model_writable, curr_model_writable_string } from "./LayoutWritable";
|
12 |
+
|
13 |
+
let curr_model_id = 0;
|
14 |
+
|
15 |
+
curr_model_writable.subscribe((val) => {
|
16 |
+
curr_model_id = val;
|
17 |
+
});
|
18 |
|
19 |
export let data;
|
20 |
let loading = false;
|
21 |
|
22 |
// dec2hex :: Integer -> String
|
23 |
// i.e. 0-255 -> '00'-'ff'
|
24 |
+
function dec2hex(dec) {
|
25 |
+
return dec.toString(16).padStart(2, "0");
|
26 |
}
|
27 |
|
28 |
// generateId :: Integer -> String
|
29 |
+
function generateId(len) {
|
30 |
+
var arr = new Uint8Array((len || 40) / 2);
|
31 |
+
window.crypto.getRandomValues(arr);
|
32 |
+
return Array.from(arr, dec2hex).join("");
|
33 |
}
|
34 |
|
35 |
async function createConversation(message: string) {
|
|
|
41 |
// Ugly hack to use a store as temp storage, feel free to improve ^^
|
42 |
pendingMessage.set(message);
|
43 |
|
44 |
+
console.log(conversationId);
|
45 |
+
params_writable.set(conversationId);
|
46 |
// invalidateAll to update list of conversations
|
47 |
await goto(`${base}/conversation/${conversationId}`, { invalidateAll: true });
|
48 |
} catch (err) {
|
|
|
55 |
</script>
|
56 |
|
57 |
<svelte:head>
|
58 |
+
<title>{PUBLIC_APP_NAME}</title>
|
59 |
</svelte:head>
|
60 |
|
61 |
<ChatWindow
|
62 |
on:message={(ev) => createConversation(ev.detail)}
|
63 |
{loading}
|
64 |
+
currentModel={findCurrentModel(
|
65 |
+
[...data.models, ...data.oldModels],
|
66 |
+
data.models[curr_model_id].name
|
67 |
+
)}
|
68 |
models={data.models}
|
69 |
settings={data.settings}
|
70 |
/>
|
src/routes/LayoutWritable.js
CHANGED
@@ -3,3 +3,5 @@ import { writable } from "svelte/store";
|
|
3 |
export const isloading_writable = writable(false);
|
4 |
export const refresh_chats_writable = writable([]);
|
5 |
export const refresh_chats_writable_empty = writable(false);
|
|
|
|
|
|
3 |
export const isloading_writable = writable(false);
|
4 |
export const refresh_chats_writable = writable([]);
|
5 |
export const refresh_chats_writable_empty = writable(false);
|
6 |
+
export const curr_model_writable = writable(0);
|
7 |
+
export const curr_model_writable_string = writable("");
|
src/routes/LocalDB.ts
CHANGED
@@ -1,154 +1,170 @@
|
|
1 |
-
import Dexie, { type Table, liveQuery } from
|
2 |
import { refresh_chats_writable_empty, refresh_chats_writable } from "../routes/LayoutWritable";
|
3 |
-
import { env } from
|
4 |
|
5 |
export interface Chat {
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
|
|
11 |
}
|
12 |
|
13 |
export interface MessageDb {
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
}
|
20 |
|
21 |
export class ChatDatabase extends Dexie {
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
|
|
|
|
|
|
30 |
}
|
31 |
|
32 |
-
export async function createChat(
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
|
|
|
|
|
|
|
|
53 |
}
|
54 |
|
55 |
export async function deleteAllChats() {
|
56 |
-
|
57 |
-
|
58 |
}
|
59 |
|
60 |
export async function deleteChat(id_chat: string) {
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
}
|
70 |
}
|
71 |
|
72 |
export async function modifyTitle(id_chat: string, newTitle: string) {
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
}
|
82 |
|
83 |
-
export async function addMessageToChat(id_chat: string, msg: MessageDb) {
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
}
|
100 |
}
|
101 |
|
102 |
export async function getTitle(id_chat: string) {
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
return title_ret
|
112 |
}
|
113 |
|
114 |
export async function getMessages(id_chat: string) {
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
124 |
}
|
125 |
|
126 |
export async function getChats() {
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
model: "", // Hardcoded for now
|
133 |
id: chat.id,
|
134 |
updatedAt: chat.createdAt,
|
135 |
createdAt: chat.createdAt,
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
return titles;
|
143 |
}
|
144 |
|
145 |
-
|
146 |
export async function getChat(id_chat: string) {
|
147 |
-
|
148 |
-
|
149 |
-
|
|
|
|
|
|
|
|
|
150 |
}
|
151 |
|
152 |
export const db = new ChatDatabase();
|
153 |
-
|
154 |
-
|
|
|
1 |
+
import Dexie, { type Table, liveQuery } from "dexie";
|
2 |
import { refresh_chats_writable_empty, refresh_chats_writable } from "../routes/LayoutWritable";
|
3 |
+
import { env } from "$env/dynamic/public";
|
4 |
|
5 |
export interface Chat {
|
6 |
+
index?: number;
|
7 |
+
title: string;
|
8 |
+
id: string;
|
9 |
+
createdAt: Date;
|
10 |
+
model: string;
|
11 |
+
message?: Array<MessageDb>;
|
12 |
}
|
13 |
|
14 |
export interface MessageDb {
|
15 |
+
content: string;
|
16 |
+
from: string;
|
17 |
+
id: string;
|
18 |
+
createdAt: Date;
|
19 |
+
updatedAt: Date;
|
20 |
}
|
21 |
|
22 |
export class ChatDatabase extends Dexie {
|
23 |
+
chats!: Table<Chat>;
|
24 |
+
|
25 |
+
constructor() {
|
26 |
+
super("blindchat");
|
27 |
+
this.version(16).stores({
|
28 |
+
chats: null,
|
29 |
+
});
|
30 |
+
this.version(17).stores({
|
31 |
+
chats: "++index, title, createdAt, id, message, model",
|
32 |
+
});
|
33 |
+
}
|
34 |
}
|
35 |
|
36 |
+
export async function createChat(
|
37 |
+
id_chat: string,
|
38 |
+
msg: MessageDb | undefined,
|
39 |
+
model: string,
|
40 |
+
title?: string
|
41 |
+
) {
|
42 |
+
try {
|
43 |
+
let title_f = "";
|
44 |
+
if (title === undefined) {
|
45 |
+
let count = (await db.chats.count()) + 1;
|
46 |
+
title_f = "Untitled " + count;
|
47 |
+
} else title_f = title;
|
48 |
+
const chat = {
|
49 |
+
id: id_chat,
|
50 |
+
title: title_f,
|
51 |
+
message: msg === undefined ? undefined : [msg],
|
52 |
+
createdAt: new Date(),
|
53 |
+
model: model,
|
54 |
+
};
|
55 |
+
const id = await db.chats.add(chat);
|
56 |
+
} catch (error) {
|
57 |
+
console.log(error);
|
58 |
+
}
|
59 |
+
let push = await getChats();
|
60 |
+
refresh_chats_writable.set(push);
|
61 |
}
|
62 |
|
63 |
export async function deleteAllChats() {
|
64 |
+
const chat_ret = await db.chats.clear();
|
65 |
+
refresh_chats_writable_empty.set(true);
|
66 |
}
|
67 |
|
68 |
export async function deleteChat(id_chat: string) {
|
69 |
+
const chat_ret = await db.chats.where("id").equals(id_chat).delete();
|
70 |
+
let count = await db.chats.count();
|
71 |
+
if (count > 0) {
|
72 |
+
let push = await getChats();
|
73 |
+
refresh_chats_writable.set(push);
|
74 |
+
} else {
|
75 |
+
refresh_chats_writable_empty.set(true);
|
76 |
+
}
|
|
|
77 |
}
|
78 |
|
79 |
export async function modifyTitle(id_chat: string, newTitle: string) {
|
80 |
+
const chat_ret = db.chats.where("id").equals(id_chat);
|
81 |
+
let count = await chat_ret.count();
|
82 |
+
if (count > 0) {
|
83 |
+
let res = await chat_ret.first();
|
84 |
+
chat_ret.modify({ title: newTitle });
|
85 |
+
let push = await getChats();
|
86 |
+
refresh_chats_writable.set(push);
|
87 |
+
}
|
88 |
}
|
89 |
|
90 |
+
export async function addMessageToChat(id_chat: string, msg: MessageDb, model: string) {
|
91 |
+
const chat_ret = db.chats.where("id").equals(id_chat);
|
92 |
+
let count = await chat_ret.count();
|
93 |
+
if (count < 1) {
|
94 |
+
createChat(id_chat, msg, model);
|
95 |
+
} else {
|
96 |
+
let msgs: MessageDb[];
|
97 |
+
chat_ret.first().then((res) => {
|
98 |
+
if (res?.message == undefined) {
|
99 |
+
msgs.push(msg);
|
100 |
+
res.message = msgs;
|
101 |
+
}
|
102 |
+
res.message.push(msg);
|
103 |
+
chat_ret.modify({ id: id_chat, message: res.message });
|
104 |
+
});
|
105 |
+
}
|
|
|
106 |
}
|
107 |
|
108 |
export async function getTitle(id_chat: string) {
|
109 |
+
let title_ret = env.PUBLIC_APP_NAME;
|
110 |
+
try {
|
111 |
+
const chat_ret = await db.chats.where("id").equals(id_chat).first();
|
112 |
+
title_ret = chat_ret!.title;
|
113 |
+
} catch (err) {
|
114 |
+
console.log(err);
|
115 |
+
}
|
116 |
+
return title_ret;
|
|
|
117 |
}
|
118 |
|
119 |
export async function getMessages(id_chat: string) {
|
120 |
+
try {
|
121 |
+
const chat_ret = await db.chats.where("id").equals(id_chat).first();
|
122 |
+
const msg = chat_ret?.message;
|
123 |
+
return [...msg];
|
124 |
+
} catch (err) {
|
125 |
+
console.log(err);
|
126 |
+
}
|
127 |
+
return undefined;
|
128 |
+
}
|
129 |
+
|
130 |
+
export async function getModel(id_chat: string) {
|
131 |
+
try {
|
132 |
+
const chat_ret = await db.chats.where("id").equals(id_chat).first();
|
133 |
+
let model = chat_ret?.model;
|
134 |
+
if (model === undefined) return "";
|
135 |
+
return model;
|
136 |
+
} catch (err) {
|
137 |
+
console.log(err);
|
138 |
+
}
|
139 |
+
return "";
|
140 |
}
|
141 |
|
142 |
export async function getChats() {
|
143 |
+
let titles = [];
|
144 |
+
try {
|
145 |
+
const all = (await db.chats.orderBy("createdAt").toArray()).forEach(function (chat) {
|
146 |
+
titles.push({
|
147 |
+
title: chat.title,
|
148 |
model: "", // Hardcoded for now
|
149 |
id: chat.id,
|
150 |
updatedAt: chat.createdAt,
|
151 |
createdAt: chat.createdAt,
|
152 |
+
});
|
153 |
+
});
|
154 |
+
} catch (err) {
|
155 |
+
console.log(err);
|
156 |
+
}
|
157 |
+
return titles;
|
|
|
158 |
}
|
159 |
|
|
|
160 |
export async function getChat(id_chat: string) {
|
161 |
+
const chat_ret = db.chats
|
162 |
+
.where("id")
|
163 |
+
.equals(id_chat)
|
164 |
+
.first()
|
165 |
+
.then((res) => {
|
166 |
+
return res;
|
167 |
+
});
|
168 |
}
|
169 |
|
170 |
export const db = new ChatDatabase();
|
|
|
|
src/routes/conversation/[id]/+page.svelte
CHANGED
@@ -16,27 +16,36 @@
|
|
16 |
import type { Message } from "$lib/types/Message";
|
17 |
import { PUBLIC_APP_DISCLAIMER } from "$env/static/public";
|
18 |
import { pipeline, Pipeline, env as env_transformers } from "@xenova/transformers";
|
19 |
-
import { isloading_writable } from "../../LayoutWritable.js";
|
20 |
import { map_writable } from "$lib/components/LoadingModalWritable.js";
|
21 |
import { params_writable } from "./ParamsWritable.js";
|
22 |
-
import { addMessageToChat,getChats,getMessages,getTitle } from "../../LocalDB.js";
|
23 |
import { env } from "$env/dynamic/public";
|
24 |
export let data;
|
25 |
|
|
|
|
|
|
|
|
|
|
|
|
|
26 |
let pipelineWorker;
|
27 |
|
28 |
let pipe: Pipeline;
|
29 |
|
30 |
-
let id = ""
|
|
|
|
|
|
|
|
|
|
|
31 |
|
32 |
-
let
|
33 |
|
34 |
let messages = [];
|
35 |
let lastLoadedMessages = [];
|
36 |
let isAborted = false;
|
37 |
|
38 |
-
console.log(" - " + $page.params.id)
|
39 |
-
|
40 |
let webSearchMessages: WebSearchMessage[] = [];
|
41 |
|
42 |
// // Since we modify the messages array locally, we don't want to reset it if an old version is passed
|
@@ -69,30 +78,32 @@
|
|
69 |
break;
|
70 |
|
71 |
case "update":
|
72 |
-
if (
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
|
|
|
|
77 |
break;
|
78 |
|
79 |
case "complete":
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
}
|
96 |
}
|
97 |
break;
|
98 |
}
|
@@ -109,27 +120,43 @@
|
|
109 |
|
110 |
let opt = "";
|
111 |
|
|
|
|
|
112 |
messages = [
|
113 |
...messages,
|
114 |
// id doesn't match the backend id but it's not important for assistant messages
|
115 |
-
{
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
{
|
120 |
-
content: inputs,
|
121 |
-
from: "user",
|
122 |
-
id: randomUUID(),
|
123 |
createdAt: new Date(),
|
124 |
updatedAt: new Date(),
|
125 |
-
|
|
|
|
|
126 |
|
127 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
128 |
|
129 |
-
addMessageToChat(conversationId, msg)
|
130 |
|
131 |
let lastMessage = messages[messages.length - 1];
|
132 |
-
pipelineWorker.postMessage({
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
133 |
}
|
134 |
|
135 |
async function summarizeTitle(id: string) {
|
@@ -256,30 +283,59 @@
|
|
256 |
}
|
257 |
|
258 |
params_writable.subscribe(async (value) => {
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
268 |
}
|
|
|
|
|
|
|
269 |
});
|
270 |
|
271 |
onMount(async () => {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
272 |
const Worker = await import("./worker.js?worker");
|
273 |
pipelineWorker = new Worker.default();
|
274 |
-
|
275 |
//title_ret = await getTitle($page.params.id)
|
276 |
-
let res = await getMessages($page.params.id)
|
|
|
|
|
277 |
|
278 |
-
id = $page.params.id
|
279 |
-
|
280 |
if (res != undefined) {
|
281 |
-
|
282 |
-
|
283 |
}
|
284 |
|
285 |
pipelineWorker.addEventListener("message", onMessageReceived);
|
@@ -319,7 +375,7 @@
|
|
319 |
on:share={() => shareConversation($page.params.id, data.title)}
|
320 |
on:stop={() => (isAborted = true)}
|
321 |
models={data.models}
|
322 |
-
currentModel={findCurrentModel([...data.models, ...data.oldModels],
|
323 |
settings={data.settings}
|
324 |
{loginRequired}
|
325 |
/>
|
|
|
16 |
import type { Message } from "$lib/types/Message";
|
17 |
import { PUBLIC_APP_DISCLAIMER } from "$env/static/public";
|
18 |
import { pipeline, Pipeline, env as env_transformers } from "@xenova/transformers";
|
19 |
+
import { isloading_writable, curr_model_writable } from "../../LayoutWritable.js";
|
20 |
import { map_writable } from "$lib/components/LoadingModalWritable.js";
|
21 |
import { params_writable } from "./ParamsWritable.js";
|
22 |
+
import { addMessageToChat, getChats, getMessages, getTitle, getModel } from "../../LocalDB.js";
|
23 |
import { env } from "$env/dynamic/public";
|
24 |
export let data;
|
25 |
|
26 |
+
let curr_model_id = 0;
|
27 |
+
curr_model_writable.subscribe((val) => {
|
28 |
+
curr_model_id = val;
|
29 |
+
console.log(val);
|
30 |
+
});
|
31 |
+
|
32 |
let pipelineWorker;
|
33 |
|
34 |
let pipe: Pipeline;
|
35 |
|
36 |
+
let id = "";
|
37 |
+
|
38 |
+
let title_ret = "BlindChat";
|
39 |
+
|
40 |
+
let curr_model = data.model;
|
41 |
+
let curr_model_obj;
|
42 |
|
43 |
+
let id_now;
|
44 |
|
45 |
let messages = [];
|
46 |
let lastLoadedMessages = [];
|
47 |
let isAborted = false;
|
48 |
|
|
|
|
|
49 |
let webSearchMessages: WebSearchMessage[] = [];
|
50 |
|
51 |
// // Since we modify the messages array locally, we don't want to reset it if an old version is passed
|
|
|
78 |
break;
|
79 |
|
80 |
case "update":
|
81 |
+
if (e.data.id_now == id_now) {
|
82 |
+
if (lastMessage == undefined) lastMessage = messages[messages.length - 1];
|
83 |
+
lastMessage.content = e.data.output;
|
84 |
+
lastMessage.webSearchId = e.data.searchID;
|
85 |
+
lastMessage.updatedAt = new Date();
|
86 |
+
messages = [...messages];
|
87 |
+
}
|
88 |
break;
|
89 |
|
90 |
case "complete":
|
91 |
+
if (e.data.id_now == id_now) {
|
92 |
+
lastMessage = messages[messages.length - 1];
|
93 |
+
lastMessage.webSearchId = e.data.searchID;
|
94 |
+
lastMessage.updatedAt = new Date();
|
95 |
+
addMessageToChat($page.params.id, lastMessage);
|
96 |
+
messages = [...messages];
|
97 |
+
lastMessage = undefined;
|
98 |
+
loading = false;
|
99 |
+
pending = false;
|
100 |
+
webSearchMessages = [];
|
101 |
+
|
102 |
+
if (messages.filter((m) => m.from === "user").length === 1) {
|
103 |
+
invalidate(UrlDependency.ConversationList).catch(console.error);
|
104 |
+
} else {
|
105 |
+
invalidate(UrlDependency.ConversationList).then((value) => {});
|
106 |
+
}
|
107 |
}
|
108 |
break;
|
109 |
}
|
|
|
120 |
|
121 |
let opt = "";
|
122 |
|
123 |
+
console.log(curr_model_obj);
|
124 |
+
|
125 |
messages = [
|
126 |
...messages,
|
127 |
// id doesn't match the backend id but it's not important for assistant messages
|
128 |
+
{
|
129 |
+
from: "assistant",
|
130 |
+
content: "",
|
131 |
+
id: responseId,
|
|
|
|
|
|
|
|
|
132 |
createdAt: new Date(),
|
133 |
updatedAt: new Date(),
|
134 |
+
isCode: curr_model_obj.is_code ?? false,
|
135 |
+
},
|
136 |
+
];
|
137 |
|
138 |
+
let msg = {
|
139 |
+
content: inputs,
|
140 |
+
from: "user",
|
141 |
+
id: randomUUID(),
|
142 |
+
createdAt: new Date(),
|
143 |
+
updatedAt: new Date(),
|
144 |
+
isCode: false,
|
145 |
+
};
|
146 |
|
147 |
+
addMessageToChat(conversationId, msg, curr_model);
|
148 |
|
149 |
let lastMessage = messages[messages.length - 1];
|
150 |
+
pipelineWorker.postMessage({
|
151 |
+
id_now: id_now,
|
152 |
+
task: curr_model_obj.type,
|
153 |
+
max_new_tokens: curr_model_obj.parameters?.max_new_tokens ?? 256,
|
154 |
+
temperature: curr_model_obj.parameters?.temperature ?? 0.7,
|
155 |
+
model: curr_model,
|
156 |
+
text: inputs,
|
157 |
+
webSearchId: webSearchId,
|
158 |
+
conversationId: conversationId,
|
159 |
+
});
|
160 |
}
|
161 |
|
162 |
async function summarizeTitle(id: string) {
|
|
|
283 |
}
|
284 |
|
285 |
params_writable.subscribe(async (value) => {
|
286 |
+
if (value != id) {
|
287 |
+
id = value;
|
288 |
+
//title_ret = await getTitle(value)
|
289 |
+
let res = await getMessages(value);
|
290 |
+
|
291 |
+
curr_model = await getModel(value);
|
292 |
+
if (curr_model === undefined || curr_model.length == 0) {
|
293 |
+
curr_model_obj = findCurrentModel(
|
294 |
+
[...data.models, ...data.oldModels],
|
295 |
+
data.models[curr_model_id].name
|
296 |
+
);
|
297 |
+
curr_model = curr_model_obj.name;
|
298 |
+
} else {
|
299 |
+
curr_model_obj = findCurrentModel([...data.models, ...data.oldModels], curr_model);
|
300 |
+
}
|
301 |
+
|
302 |
+
console.log(curr_model);
|
303 |
+
console.log(curr_model_obj);
|
304 |
+
|
305 |
+
if (res != undefined) {
|
306 |
+
messages = res;
|
307 |
+
lastLoadedMessages = res;
|
308 |
}
|
309 |
+
|
310 |
+
id_now = randomUUID();
|
311 |
+
}
|
312 |
});
|
313 |
|
314 |
onMount(async () => {
|
315 |
+
curr_model = await getModel($page.params.id);
|
316 |
+
if (curr_model === undefined || curr_model.length == 0) {
|
317 |
+
curr_model_obj = findCurrentModel(
|
318 |
+
[...data.models, ...data.oldModels],
|
319 |
+
data.models[curr_model_id].name
|
320 |
+
);
|
321 |
+
curr_model = curr_model_obj.name;
|
322 |
+
} else {
|
323 |
+
curr_model_obj = findCurrentModel([...data.models, ...data.oldModels], curr_model);
|
324 |
+
}
|
325 |
+
|
326 |
+
id_now = randomUUID();
|
327 |
+
|
328 |
const Worker = await import("./worker.js?worker");
|
329 |
pipelineWorker = new Worker.default();
|
330 |
+
|
331 |
//title_ret = await getTitle($page.params.id)
|
332 |
+
let res = await getMessages($page.params.id);
|
333 |
+
|
334 |
+
id = $page.params.id;
|
335 |
|
|
|
|
|
336 |
if (res != undefined) {
|
337 |
+
messages = res;
|
338 |
+
lastLoadedMessages = res;
|
339 |
}
|
340 |
|
341 |
pipelineWorker.addEventListener("message", onMessageReceived);
|
|
|
375 |
on:share={() => shareConversation($page.params.id, data.title)}
|
376 |
on:stop={() => (isAborted = true)}
|
377 |
models={data.models}
|
378 |
+
currentModel={findCurrentModel([...data.models, ...data.oldModels], curr_model)}
|
379 |
settings={data.settings}
|
380 |
{loginRequired}
|
381 |
/>
|
src/routes/conversation/[id]/ParamsWritable.js
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
import { writable } from "svelte/store";
|
2 |
|
3 |
-
export const params_writable = writable("");
|
|
|
1 |
import { writable } from "svelte/store";
|
2 |
|
3 |
+
export const params_writable = writable("");
|
src/routes/conversation/[id]/summarize/+server.ts
CHANGED
@@ -52,8 +52,5 @@ export async function POST({ params, locals }) {
|
|
52 |
{ headers: { "Content-Type": "application/json" } }
|
53 |
);*/
|
54 |
|
55 |
-
return new Response(
|
56 |
-
JSON.stringify({}),
|
57 |
-
{ headers: { "Content-Type": "application/json" } }
|
58 |
-
);
|
59 |
}
|
|
|
52 |
{ headers: { "Content-Type": "application/json" } }
|
53 |
);*/
|
54 |
|
55 |
+
return new Response(JSON.stringify({}), { headers: { "Content-Type": "application/json" } });
|
|
|
|
|
|
|
56 |
}
|
src/routes/conversation/[id]/worker.js
CHANGED
@@ -1,13 +1,18 @@
|
|
1 |
import { pipeline, env } from "@xenova/transformers";
|
2 |
|
3 |
export class FlanPipeline {
|
4 |
-
static
|
5 |
-
static model = "Xenova/LaMini-Flan-T5-783M";
|
6 |
static instance = null;
|
7 |
|
8 |
-
static async getInstance(progress_callback = null) {
|
9 |
if (this.instance === null) {
|
10 |
-
this.instance = pipeline(
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
}
|
12 |
return this.instance;
|
13 |
}
|
@@ -15,16 +20,22 @@ export class FlanPipeline {
|
|
15 |
|
16 |
// Listen for messages from the main thread
|
17 |
self.addEventListener("message", async (event) => {
|
18 |
-
let pipe = await FlanPipeline.getInstance(
|
19 |
-
|
20 |
-
|
|
|
|
|
|
|
|
|
21 |
|
22 |
let output = await pipe(event.data.text, {
|
23 |
-
max_new_tokens:
|
|
|
24 |
callback_function: (x) => {
|
25 |
self.postMessage({
|
26 |
status: "update",
|
27 |
output: pipe.tokenizer.decode(x[0].output_token_ids, { skip_special_tokens: true }),
|
|
|
28 |
});
|
29 |
},
|
30 |
});
|
@@ -34,5 +45,6 @@ self.addEventListener("message", async (event) => {
|
|
34 |
status: "complete",
|
35 |
output: output,
|
36 |
searchID: event.data.searchID,
|
|
|
37 |
});
|
38 |
});
|
|
|
1 |
import { pipeline, env } from "@xenova/transformers";
|
2 |
|
3 |
export class FlanPipeline {
|
4 |
+
static curr_model = "";
|
|
|
5 |
static instance = null;
|
6 |
|
7 |
+
static async getInstance(progress_callback = null, model, task) {
|
8 |
if (this.instance === null) {
|
9 |
+
this.instance = pipeline(task, model, { progress_callback });
|
10 |
+
this.curr_model = model;
|
11 |
+
} else {
|
12 |
+
if (this.curr_model != model) {
|
13 |
+
this.instance = pipeline(task, model, { progress_callback });
|
14 |
+
this.curr_model = model;
|
15 |
+
}
|
16 |
}
|
17 |
return this.instance;
|
18 |
}
|
|
|
20 |
|
21 |
// Listen for messages from the main thread
|
22 |
self.addEventListener("message", async (event) => {
|
23 |
+
let pipe = await FlanPipeline.getInstance(
|
24 |
+
(x) => {
|
25 |
+
self.postMessage(x);
|
26 |
+
},
|
27 |
+
event.data.model,
|
28 |
+
event.data.task
|
29 |
+
);
|
30 |
|
31 |
let output = await pipe(event.data.text, {
|
32 |
+
max_new_tokens: event.data.max_new_tokens,
|
33 |
+
temperature: event.data.temperature,
|
34 |
callback_function: (x) => {
|
35 |
self.postMessage({
|
36 |
status: "update",
|
37 |
output: pipe.tokenizer.decode(x[0].output_token_ids, { skip_special_tokens: true }),
|
38 |
+
id_now: event.data.id_now,
|
39 |
});
|
40 |
},
|
41 |
});
|
|
|
45 |
status: "complete",
|
46 |
output: output,
|
47 |
searchID: event.data.searchID,
|
48 |
+
id_now: event.data.id_now,
|
49 |
});
|
50 |
});
|
src/routes/conversations/+page.server.ts
CHANGED
@@ -7,4 +7,4 @@ export const actions = {
|
|
7 |
delete: async function ({ locals }) {
|
8 |
throw redirect(303, `${base}/`);
|
9 |
},
|
10 |
-
};
|
|
|
7 |
delete: async function ({ locals }) {
|
8 |
throw redirect(303, `${base}/`);
|
9 |
},
|
10 |
+
};
|
src/routes/login/callback/updateUser.ts
CHANGED
@@ -9,6 +9,4 @@ export async function updateUser(params: {
|
|
9 |
userData: UserinfoResponse;
|
10 |
locals: App.Locals;
|
11 |
cookies: Cookies;
|
12 |
-
}) {
|
13 |
-
|
14 |
-
}
|
|
|
9 |
userData: UserinfoResponse;
|
10 |
locals: App.Locals;
|
11 |
cookies: Cookies;
|
12 |
+
}) {}
|
|
|
|
src/routes/r/[id]/+page.svelte
CHANGED
@@ -16,7 +16,6 @@
|
|
16 |
let loading = false;
|
17 |
|
18 |
async function createConversation() {
|
19 |
-
console.log("create")
|
20 |
try {
|
21 |
loading = true;
|
22 |
const res = await fetch(`${base}/conversation`, {
|
|
|
16 |
let loading = false;
|
17 |
|
18 |
async function createConversation() {
|
|
|
19 |
try {
|
20 |
loading = true;
|
21 |
const res = await fetch(`${base}/conversation`, {
|
src/routes/settings/+page.server.ts
CHANGED
@@ -28,22 +28,6 @@ export const actions = {
|
|
28 |
customPrompts: JSON.parse(formData.get("customPrompts")?.toString() ?? "{}"),
|
29 |
});
|
30 |
|
31 |
-
await collections.settings.updateOne(
|
32 |
-
authCondition(locals),
|
33 |
-
{
|
34 |
-
$set: {
|
35 |
-
...settings,
|
36 |
-
...(ethicsModalAccepted && { ethicsModalAcceptedAt: new Date() }),
|
37 |
-
updatedAt: new Date(),
|
38 |
-
},
|
39 |
-
$setOnInsert: {
|
40 |
-
createdAt: new Date(),
|
41 |
-
},
|
42 |
-
},
|
43 |
-
{
|
44 |
-
upsert: true,
|
45 |
-
}
|
46 |
-
);
|
47 |
throw redirect(303, request.headers.get("referer") || `${base}/`);
|
48 |
},
|
49 |
};
|
|
|
28 |
customPrompts: JSON.parse(formData.get("customPrompts")?.toString() ?? "{}"),
|
29 |
});
|
30 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
31 |
throw redirect(303, request.headers.get("referer") || `${base}/`);
|
32 |
},
|
33 |
};
|