File size: 1,195 Bytes
ff934bb
 
144112e
a0ed974
a1a6daf
ff934bb
a1a6daf
 
 
 
 
 
ff934bb
a1a6daf
ff934bb
a1a6daf
 
 
 
 
 
 
 
 
 
 
 
 
ff934bb
a1a6daf
ff934bb
 
a1a6daf
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<script lang="ts">
	import type { Model } from "$lib/types/Model";
	import { getTokenizer } from "$lib/utils/getTokenizer";
	import type { PreTrainedTokenizer } from "@huggingface/transformers";
	import { untrack } from "svelte";

	interface Props {
		classNames?: string;
		prompt?: string;
		modelTokenizer: Exclude<Model["tokenizer"], undefined>;
		truncate?: number | undefined;
	}

	let { classNames = "", prompt = "", modelTokenizer, truncate = undefined }: Props = $props();

	let tokenizer: Promise<PreTrainedTokenizer> = $derived(getTokenizer(modelTokenizer));

	let nTokens = $state(0);

	$effect(() => {
		prompt &&
			untrack(() => {
				tokenizer.then((tokenizer) => {
					const { input_ids } = tokenizer(prompt);
					nTokens = input_ids.size;
				});
			});
	});

	let exceedLimit = $derived(nTokens > (truncate || Infinity));
</script>

<div class={classNames}>
	<p
		class="peer text-sm {exceedLimit ? 'text-red-500 opacity-100' : 'opacity-60 hover:opacity-90'}"
	>
		{nTokens}{truncate ? `/${truncate}` : ""}
	</p>
	<div
		class="invisible absolute -top-6 right-0 whitespace-nowrap rounded bg-black px-1 text-sm text-white peer-hover:visible"
	>
		Tokens usage
	</div>
</div>