General.svelte 5.99 KB
Newer Older
1
2
<script lang="ts">
	import { getDocs } from '$lib/apis/documents';
3
4
	import {
		getChunkParams,
5
		getQuerySettings,
6
7
		scanDocs,
		updateChunkParams,
8
		updateQuerySettings
9
	} from '$lib/apis/rag';
10
11
	import { documents } from '$lib/stores';
	import { onMount } from 'svelte';
Jannik Streidl's avatar
Jannik Streidl committed
12
	import { toast } from 'svelte-sonner';
13
14

	export let saveHandler: Function;
Timothy J. Baek's avatar
Timothy J. Baek committed
15
16
17

	let loading = false;

Timothy J. Baek's avatar
Timothy J. Baek committed
18
19
20
	let chunkSize = 0;
	let chunkOverlap = 0;

21
22
23
24
	let querySettings = {
		template: '',
		k: 4
	};
25

26
	const scanHandler = async () => {
Timothy J. Baek's avatar
Timothy J. Baek committed
27
		loading = true;
28
		const res = await scanDocs(localStorage.token);
Timothy J. Baek's avatar
Timothy J. Baek committed
29
		loading = false;
30
31
32

		if (res) {
			await documents.set(await getDocs(localStorage.token));
Timothy J. Baek's avatar
Timothy J. Baek committed
33
			toast.success('Scan complete!');
34
35
36
		}
	};

Timothy J. Baek's avatar
Timothy J. Baek committed
37
38
	const submitHandler = async () => {
		const res = await updateChunkParams(localStorage.token, chunkSize, chunkOverlap);
39
		querySettings = await updateQuerySettings(localStorage.token, querySettings);
Timothy J. Baek's avatar
Timothy J. Baek committed
40
41
42
43
44
45
46
47
48
	};

	onMount(async () => {
		const res = await getChunkParams(localStorage.token);

		if (res) {
			chunkSize = res.chunk_size;
			chunkOverlap = res.chunk_overlap;
		}
49

50
		querySettings = await getQuerySettings(localStorage.token);
Timothy J. Baek's avatar
Timothy J. Baek committed
51
	});
52
53
54
55
56
</script>

<form
	class="flex flex-col h-full justify-between space-y-3 text-sm"
	on:submit|preventDefault={() => {
Timothy J. Baek's avatar
Timothy J. Baek committed
57
		submitHandler();
58
59
60
61
62
63
64
65
66
67
68
		saveHandler();
	}}
>
	<div class=" space-y-3 pr-1.5 overflow-y-scroll max-h-80">
		<div>
			<div class=" mb-2 text-sm font-medium">General Settings</div>

			<div class="  flex w-full justify-between">
				<div class=" self-center text-xs font-medium">Scan for documents from '/data/docs'</div>

				<button
Timothy J. Baek's avatar
Timothy J. Baek committed
69
70
71
					class=" self-center text-xs p-1 px-3 bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 rounded flex flex-row space-x-1 items-center {loading
						? ' cursor-not-allowed'
						: ''}"
72
73
74
75
76
					on:click={() => {
						scanHandler();
						console.log('check');
					}}
					type="button"
Timothy J. Baek's avatar
Timothy J. Baek committed
77
					disabled={loading}
78
				>
Timothy J. Baek's avatar
Timothy J. Baek committed
79
					<div class="self-center font-medium">Scan</div>
80

Timothy J. Baek's avatar
Timothy J. Baek committed
81
					<!-- <svg
82
83
84
85
86
87
88
89
90
91
						xmlns="http://www.w3.org/2000/svg"
						viewBox="0 0 16 16"
						fill="currentColor"
						class="w-3 h-3"
					>
						<path
							fill-rule="evenodd"
							d="M13.836 2.477a.75.75 0 0 1 .75.75v3.182a.75.75 0 0 1-.75.75h-3.182a.75.75 0 0 1 0-1.5h1.37l-.84-.841a4.5 4.5 0 0 0-7.08.932.75.75 0 0 1-1.3-.75 6 6 0 0 1 9.44-1.242l.842.84V3.227a.75.75 0 0 1 .75-.75Zm-.911 7.5A.75.75 0 0 1 13.199 11a6 6 0 0 1-9.44 1.241l-.84-.84v1.371a.75.75 0 0 1-1.5 0V9.591a.75.75 0 0 1 .75-.75H5.35a.75.75 0 0 1 0 1.5H3.98l.841.841a4.5 4.5 0 0 0 7.08-.932.75.75 0 0 1 1.025-.273Z"
							clip-rule="evenodd"
						/>
Timothy J. Baek's avatar
Timothy J. Baek committed
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
					</svg> -->

					{#if loading}
						<div class="ml-3 self-center">
							<svg
								class=" w-3 h-3"
								viewBox="0 0 24 24"
								fill="currentColor"
								xmlns="http://www.w3.org/2000/svg"
								><style>
									.spinner_ajPY {
										transform-origin: center;
										animation: spinner_AtaB 0.75s infinite linear;
									}
									@keyframes spinner_AtaB {
										100% {
											transform: rotate(360deg);
										}
									}
								</style><path
									d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
									opacity=".25"
								/><path
									d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
									class="spinner_ajPY"
								/></svg
							>
						</div>
					{/if}
121
122
123
				</button>
			</div>
		</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160

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

		<div class=" ">
			<div class=" text-sm font-medium">Chunk Params</div>

			<div class=" flex">
				<div class="  flex w-full justify-between">
					<div class="self-center text-xs font-medium min-w-fit">Chunk Size</div>

					<div class="self-center p-3">
						<input
							class=" w-full rounded py-1.5 px-4 text-sm dark:text-gray-300 dark:bg-gray-800 outline-none border border-gray-100 dark:border-gray-600"
							type="number"
							placeholder="Enter Chunk Size"
							bind:value={chunkSize}
							autocomplete="off"
							min="0"
						/>
					</div>
				</div>

				<div class="flex w-full">
					<div class=" self-center text-xs font-medium min-w-fit">Chunk Overlap</div>

					<div class="self-center p-3">
						<input
							class="w-full rounded py-1.5 px-4 text-sm dark:text-gray-300 dark:bg-gray-800 outline-none border border-gray-100 dark:border-gray-600"
							type="number"
							placeholder="Enter Chunk Overlap"
							bind:value={chunkOverlap}
							autocomplete="off"
							min="0"
						/>
					</div>
				</div>
			</div>
161

162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
			<div class=" text-sm font-medium">Query Params</div>

			<div class=" flex">
				<div class="  flex w-full justify-between">
					<div class="self-center text-xs font-medium flex-1">Top K</div>

					<div class="self-center p-3">
						<input
							class=" w-full rounded py-1.5 px-4 text-sm dark:text-gray-300 dark:bg-gray-800 outline-none border border-gray-100 dark:border-gray-600"
							type="number"
							placeholder="Enter Top K"
							bind:value={querySettings.k}
							autocomplete="off"
							min="0"
						/>
					</div>
				</div>

				<!-- <div class="flex w-full">
					<div class=" self-center text-xs font-medium min-w-fit">Chunk Overlap</div>

					<div class="self-center p-3">
						<input
							class="w-full rounded py-1.5 px-4 text-sm dark:text-gray-300 dark:bg-gray-800 outline-none border border-gray-100 dark:border-gray-600"
							type="number"
							placeholder="Enter Chunk Overlap"
							bind:value={chunkOverlap}
							autocomplete="off"
							min="0"
						/>
					</div>
				</div> -->
			</div>

196
197
198
			<div>
				<div class=" mb-2.5 text-sm font-medium">RAG Template</div>
				<textarea
199
					bind:value={querySettings.template}
200
201
202
203
					class="w-full rounded p-4 text-sm dark:text-gray-300 dark:bg-gray-800 outline-none resize-none"
					rows="4"
				/>
			</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
204
		</div>
205
206
	</div>

Timothy J. Baek's avatar
Timothy J. Baek committed
207
	<div class="flex justify-end pt-3 text-sm font-medium">
208
209
210
211
212
213
		<button
			class=" px-4 py-2 bg-emerald-600 hover:bg-emerald-700 text-gray-100 transition rounded"
			type="submit"
		>
			Save
		</button>
Timothy J. Baek's avatar
Timothy J. Baek committed
214
	</div>
215
</form>