+page.svelte 4.6 KB
Newer Older
1
<script lang="ts">
Timothy J. Baek's avatar
Timothy J. Baek committed
2
	import { modelfiles, settings, user } from '$lib/stores';
3
	import { onMount } from 'svelte';
Timothy J. Baek's avatar
Timothy J. Baek committed
4
	import toast from 'svelte-french-toast';
5

Timothy J. Baek's avatar
Timothy J. Baek committed
6
7
8
9
	import { OLLAMA_API_BASE_URL } from '$lib/constants';

	const deleteModelHandler = async (tagName) => {
		let success = null;
10
		const res = await fetch(`${$settings?.API_BASE_URL ?? OLLAMA_API_BASE_URL}/delete`, {
Timothy J. Baek's avatar
Timothy J. Baek committed
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
			method: 'DELETE',
			headers: {
				'Content-Type': 'text/event-stream',
				...($settings.authHeader && { Authorization: $settings.authHeader }),
				...($user && { Authorization: `Bearer ${localStorage.token}` })
			},
			body: JSON.stringify({
				name: tagName
			})
		})
			.then(async (res) => {
				if (!res.ok) throw await res.json();
				return res.json();
			})
			.then((json) => {
				console.log(json);
				toast.success(`Deleted ${tagName}`);
				success = true;
				return json;
			})
			.catch((err) => {
				console.log(err);
				toast.error(err.error);
				return null;
			});

		return success;
	};

	const deleteModelfilebyTagName = async (tagName) => {
		await deleteModelHandler(tagName);
		await modelfiles.set($modelfiles.filter((modelfile) => modelfile.tagName != tagName));
Timothy J. Baek's avatar
Timothy J. Baek committed
43
		localStorage.setItem('modelfiles', JSON.stringify($modelfiles));
Timothy J. Baek's avatar
Timothy J. Baek committed
44
	};
45
46
</script>

Timothy J. Baek's avatar
Timothy J. Baek committed
47
48
49
50
51
<div class="min-h-screen w-full flex justify-center dark:text-white">
	<div class=" py-2.5 flex flex-col justify-between w-full">
		<div class="max-w-2xl mx-auto w-full px-3 md:px-0 my-10">
			<div class=" text-2xl font-semibold mb-6">My Modelfiles</div>

52
53
			<a class=" flex space-x-4 cursor-pointer w-full mb-3" href="/modelfiles/create">
				<div class=" self-center w-10">
Timothy J. Baek's avatar
Timothy J. Baek committed
54
					<div
55
						class="w-full h-10 flex justify-center rounded-full bg-transparent dark:bg-gray-700 border border-dashed border-gray-200"
Timothy J. Baek's avatar
Timothy J. Baek committed
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
					>
						<svg
							xmlns="http://www.w3.org/2000/svg"
							viewBox="0 0 24 24"
							fill="currentColor"
							class="w-6"
						>
							<path
								fill-rule="evenodd"
								d="M12 3.75a.75.75 0 01.75.75v6.75h6.75a.75.75 0 010 1.5h-6.75v6.75a.75.75 0 01-1.5 0v-6.75H4.5a.75.75 0 010-1.5h6.75V4.5a.75.75 0 01.75-.75z"
								clip-rule="evenodd"
							/>
						</svg>
					</div>
				</div>

				<div class=" self-center">
					<div class=" font-bold">Create a modelfile</div>
					<div class=" text-sm">Customize Ollama models for a specific purpose</div>
				</div>
			</a>

78
79
			{#each $modelfiles as modelfile}
				<hr class=" dark:border-gray-700 my-2.5" />
Timothy J. Baek's avatar
Timothy J. Baek committed
80
81
82
83
84
85
86
87
88
89
90
91
92
				<div class=" flex space-x-4 cursor-pointer w-full mb-3">
					<a
						class=" flex flex-1 space-x-4 cursor-pointer w-full"
						href={`/?models=${modelfile.tagName}`}
					>
						<div class=" self-center w-10">
							<div class=" rounded-full bg-stone-700">
								<img
									src={modelfile.imageUrl ?? '/user.png'}
									alt="modelfile profile"
									class=" rounded-full w-full h-auto object-cover"
								/>
							</div>
93
94
						</div>

Timothy J. Baek's avatar
Timothy J. Baek committed
95
						<div class=" flex-1 self-center">
Timothy J. Baek's avatar
Timothy J. Baek committed
96
							<div class=" font-bold capitalize">{modelfile.title}</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
97
98
99
100
101
102
103
104
105
							<div class=" text-sm overflow-hidden text-ellipsis line-clamp-2">
								{modelfile.desc}
							</div>
						</div>
					</a>
					<div class=" self-center">
						<a
							class=" w-fit text-sm px-3 py-2 border dark:border-gray-600 rounded-xl"
							type="button"
106
							href={`/modelfiles/edit?tag=${modelfile.tagName}`}
Timothy J. Baek's avatar
Timothy J. Baek committed
107
108
109
110
111
112
113
114
115
116
117
118
119
						>
							Edit</a
						>

						<button
							class=" w-fit text-sm px-3 py-2 border dark:border-gray-600 rounded-xl"
							type="button"
							on:click={() => {
								deleteModelfilebyTagName(modelfile.tagName);
							}}
						>
							Delete</button
						>
120
					</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
121
				</div>
122
123
124
125
			{/each}

			<div class=" my-16">
				<div class=" text-2xl font-semibold mb-6">Made by OllamaHub Community</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
126

127
128
129
130
131
132
133
134
135
				<a
					class=" flex space-x-4 cursor-pointer w-full mb-3"
					href="https://ollamahub.com/"
					target="_blank"
				>
					<div class=" self-center w-10">
						<div
							class="w-full h-10 flex justify-center rounded-full bg-transparent dark:bg-gray-700 border border-dashed border-gray-200"
						>
Timothy J. Baek's avatar
Timothy J. Baek committed
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
							<svg
								xmlns="http://www.w3.org/2000/svg"
								viewBox="0 0 24 24"
								fill="currentColor"
								class="w-6"
							>
								<path
									fill-rule="evenodd"
									d="M12 3.75a.75.75 0 01.75.75v6.75h6.75a.75.75 0 010 1.5h-6.75v6.75a.75.75 0 01-1.5 0v-6.75H4.5a.75.75 0 010-1.5h6.75V4.5a.75.75 0 01.75-.75z"
									clip-rule="evenodd"
								/>
							</svg>
						</div>
					</div>

					<div class=" self-center">
152
153
						<div class=" font-bold">Discover a modelfile</div>
						<div class=" text-sm">Discover, download, and explore Ollama Modelfiles</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
154
155
					</div>
				</a>
156
			</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
157
158
159
		</div>
	</div>
</div>