Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
update
Browse files- package.json +1 -2
- src/lib/components/Playground/Playground.svelte +37 -50
package.json
CHANGED
|
@@ -30,7 +30,6 @@
|
|
| 30 |
},
|
| 31 |
"type": "module",
|
| 32 |
"dependencies": {
|
| 33 |
-
"@huggingface/inference": "^2.7.0"
|
| 34 |
-
"sveltekit-search-params": "^2.1.2"
|
| 35 |
}
|
| 36 |
}
|
|
|
|
| 30 |
},
|
| 31 |
"type": "module",
|
| 32 |
"dependencies": {
|
| 33 |
+
"@huggingface/inference": "^2.7.0"
|
|
|
|
| 34 |
}
|
| 35 |
}
|
src/lib/components/Playground/Playground.svelte
CHANGED
|
@@ -1,6 +1,5 @@
|
|
| 1 |
<script lang="ts">
|
| 2 |
import { HfInference } from '@huggingface/inference';
|
| 3 |
-
import { queryParam, ssp } from 'sveltekit-search-params';
|
| 4 |
|
| 5 |
import PlaygroundCode from './PlaygroundCode.svelte';
|
| 6 |
import PlaygroundMessage from '$lib/components/Playground/PlaygroundMessage.svelte';
|
|
@@ -39,23 +38,13 @@
|
|
| 39 |
|
| 40 |
const startMessages: Message[] = [{ role: 'user', content: '' }];
|
| 41 |
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
decode: (value: string | null) => value || ''
|
| 50 |
-
});
|
| 51 |
-
|
| 52 |
-
const currentModel = queryParam('model', ssp.string(compatibleModels[0]));
|
| 53 |
-
const temperature = queryParam('temperature', ssp.number(0.5));
|
| 54 |
-
const maxTokens = queryParam('max_tokens', ssp.number(2048));
|
| 55 |
-
const streaming = queryParam('streaming', ssp.boolean(true));
|
| 56 |
-
const jsonMode = queryParam('json_mode', ssp.boolean(false));
|
| 57 |
-
$: systemMessage = { role: 'system', content: $systemMessageParam };
|
| 58 |
-
$: messages = $messagesParam;
|
| 59 |
|
| 60 |
let hfToken: string | null = '';
|
| 61 |
let viewCode = false;
|
|
@@ -66,19 +55,19 @@
|
|
| 66 |
let messageContainer: HTMLDivElement | null = null;
|
| 67 |
|
| 68 |
function addMessage() {
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
{ role:
|
| 72 |
];
|
| 73 |
}
|
| 74 |
|
| 75 |
function deleteMessage(i: number) {
|
| 76 |
-
|
| 77 |
}
|
| 78 |
|
| 79 |
function reset() {
|
| 80 |
-
|
| 81 |
-
|
| 82 |
}
|
| 83 |
|
| 84 |
function onKeydown(event: KeyboardEvent) {
|
|
@@ -108,37 +97,37 @@
|
|
| 108 |
|
| 109 |
if (streaming) {
|
| 110 |
streamingMessage = { role: 'assistant', content: '' };
|
| 111 |
-
|
| 112 |
let out = '';
|
| 113 |
|
| 114 |
for await (const chunk of hf.chatCompletionStream({
|
| 115 |
-
model:
|
| 116 |
messages: requestMessages,
|
| 117 |
-
temperature:
|
| 118 |
-
max_tokens:
|
| 119 |
-
json_mode:
|
| 120 |
})) {
|
| 121 |
if (chunk.choices && chunk.choices.length > 0) {
|
| 122 |
if (streamingMessage && chunk.choices[0]?.delta?.content) {
|
| 123 |
out += chunk.choices[0].delta.content;
|
| 124 |
streamingMessage.content = out;
|
| 125 |
-
|
| 126 |
scrollToBottom();
|
| 127 |
}
|
| 128 |
}
|
| 129 |
}
|
| 130 |
} else {
|
| 131 |
const response = await hf.chatCompletion({
|
| 132 |
-
model:
|
| 133 |
messages: requestMessages,
|
| 134 |
-
temperature:
|
| 135 |
-
max_tokens:
|
| 136 |
-
json_mode:
|
| 137 |
});
|
| 138 |
|
| 139 |
if (response.choices && response.choices.length > 0) {
|
| 140 |
const newMessage = { role: 'assistant', content: response.choices[0].message.content };
|
| 141 |
-
|
| 142 |
scrollToBottom();
|
| 143 |
}
|
| 144 |
}
|
|
@@ -175,7 +164,7 @@
|
|
| 175 |
{/if}
|
| 176 |
|
| 177 |
<div
|
| 178 |
-
class="w-dvh maxdivide-gray-200 grid
|
| 179 |
>
|
| 180 |
<div class="relative flex flex-col overflow-y-auto px-5 pb-24 pt-7">
|
| 181 |
<div class="pb-2 text-sm font-semibold">SYSTEM</div>
|
|
@@ -183,7 +172,7 @@
|
|
| 183 |
name=""
|
| 184 |
id=""
|
| 185 |
placeholder="Enter a custom prompt"
|
| 186 |
-
bind:value={
|
| 187 |
class="absolute inset-x-0 bottom-0 h-full resize-none bg-transparent p-2 pl-5 pr-3 pt-16 text-sm outline-none"
|
| 188 |
></textarea>
|
| 189 |
</div>
|
|
@@ -204,12 +193,7 @@
|
|
| 204 |
<div class="!p-0 text-sm font-semibold">Add message</div>
|
| 205 |
</button>
|
| 206 |
{:else}
|
| 207 |
-
<PlaygroundCode
|
| 208 |
-
model={$currentModel}
|
| 209 |
-
streaming={$streaming}
|
| 210 |
-
temperature={$temperature}
|
| 211 |
-
maxTokens={$maxTokens}
|
| 212 |
-
/>
|
| 213 |
{/if}
|
| 214 |
</div>
|
| 215 |
|
|
@@ -260,7 +244,7 @@
|
|
| 260 |
submit();
|
| 261 |
}}
|
| 262 |
type="button"
|
| 263 |
-
class="flex h-[42px] w-24 items-center justify-center rounded-lg bg-black px-5 py-2.5 text-sm font-medium text-white hover:bg-gray-900 focus:outline-none focus:ring-4 focus:ring-gray-300 disabled:opacity-50 dark:border-gray-700 dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-gray-700"
|
| 264 |
>
|
| 265 |
{#if loading}
|
| 266 |
<div class="flex flex-none items-center gap-[3px]">
|
|
@@ -278,7 +262,10 @@
|
|
| 278 |
/>
|
| 279 |
</div>
|
| 280 |
{:else}
|
| 281 |
-
|
|
|
|
|
|
|
|
|
|
| 282 |
{/if}
|
| 283 |
</button>
|
| 284 |
</div>
|
|
@@ -286,11 +273,11 @@
|
|
| 286 |
<div class="flex flex-col gap-6 overflow-hidden p-5">
|
| 287 |
<PlaygroundOptions
|
| 288 |
{compatibleModels}
|
| 289 |
-
bind:currentModel
|
| 290 |
-
bind:temperature
|
| 291 |
-
bind:maxTokens
|
| 292 |
-
bind:jsonMode
|
| 293 |
-
bind:streaming
|
| 294 |
/>
|
| 295 |
</div>
|
| 296 |
</div>
|
|
|
|
| 1 |
<script lang="ts">
|
| 2 |
import { HfInference } from '@huggingface/inference';
|
|
|
|
| 3 |
|
| 4 |
import PlaygroundCode from './PlaygroundCode.svelte';
|
| 5 |
import PlaygroundMessage from '$lib/components/Playground/PlaygroundMessage.svelte';
|
|
|
|
| 38 |
|
| 39 |
const startMessages: Message[] = [{ role: 'user', content: '' }];
|
| 40 |
|
| 41 |
+
let messages = startMessages;
|
| 42 |
+
let systemMessage = { role: 'system', content: '' };
|
| 43 |
+
let currentModel = compatibleModels[0];
|
| 44 |
+
let temperature = 0.5;
|
| 45 |
+
let maxTokens = 2048;
|
| 46 |
+
let streaming = true;
|
| 47 |
+
let jsonMode = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
|
| 49 |
let hfToken: string | null = '';
|
| 50 |
let viewCode = false;
|
|
|
|
| 55 |
let messageContainer: HTMLDivElement | null = null;
|
| 56 |
|
| 57 |
function addMessage() {
|
| 58 |
+
messages = [
|
| 59 |
+
...messages,
|
| 60 |
+
{ role: messages.at(-1)?.role === 'user' ? 'assistant' : 'user', content: '' }
|
| 61 |
];
|
| 62 |
}
|
| 63 |
|
| 64 |
function deleteMessage(i: number) {
|
| 65 |
+
messages = messages.filter((_, j) => j !== i);
|
| 66 |
}
|
| 67 |
|
| 68 |
function reset() {
|
| 69 |
+
messages = [...startMessages];
|
| 70 |
+
systemMessage.content = '';
|
| 71 |
}
|
| 72 |
|
| 73 |
function onKeydown(event: KeyboardEvent) {
|
|
|
|
| 97 |
|
| 98 |
if (streaming) {
|
| 99 |
streamingMessage = { role: 'assistant', content: '' };
|
| 100 |
+
messages = [...messages, streamingMessage];
|
| 101 |
let out = '';
|
| 102 |
|
| 103 |
for await (const chunk of hf.chatCompletionStream({
|
| 104 |
+
model: currentModel,
|
| 105 |
messages: requestMessages,
|
| 106 |
+
temperature: temperature,
|
| 107 |
+
max_tokens: maxTokens,
|
| 108 |
+
json_mode: jsonMode
|
| 109 |
})) {
|
| 110 |
if (chunk.choices && chunk.choices.length > 0) {
|
| 111 |
if (streamingMessage && chunk.choices[0]?.delta?.content) {
|
| 112 |
out += chunk.choices[0].delta.content;
|
| 113 |
streamingMessage.content = out;
|
| 114 |
+
messages = [...messages];
|
| 115 |
scrollToBottom();
|
| 116 |
}
|
| 117 |
}
|
| 118 |
}
|
| 119 |
} else {
|
| 120 |
const response = await hf.chatCompletion({
|
| 121 |
+
model: currentModel,
|
| 122 |
messages: requestMessages,
|
| 123 |
+
temperature: temperature,
|
| 124 |
+
max_tokens: maxTokens,
|
| 125 |
+
json_mode: jsonMode
|
| 126 |
});
|
| 127 |
|
| 128 |
if (response.choices && response.choices.length > 0) {
|
| 129 |
const newMessage = { role: 'assistant', content: response.choices[0].message.content };
|
| 130 |
+
messages = [...messages, newMessage];
|
| 131 |
scrollToBottom();
|
| 132 |
}
|
| 133 |
}
|
|
|
|
| 164 |
{/if}
|
| 165 |
|
| 166 |
<div
|
| 167 |
+
class="w-dvh maxdivide-gray-200 grid overflow-hidden max-md:grid-cols-1 max-md:divide-y md:h-dvh md:grid-cols-[260px,minmax(0,1fr),260px] md:divide-x dark:divide-gray-800 dark:bg-gray-900 dark:text-gray-300"
|
| 168 |
>
|
| 169 |
<div class="relative flex flex-col overflow-y-auto px-5 pb-24 pt-7">
|
| 170 |
<div class="pb-2 text-sm font-semibold">SYSTEM</div>
|
|
|
|
| 172 |
name=""
|
| 173 |
id=""
|
| 174 |
placeholder="Enter a custom prompt"
|
| 175 |
+
bind:value={systemMessage.content}
|
| 176 |
class="absolute inset-x-0 bottom-0 h-full resize-none bg-transparent p-2 pl-5 pr-3 pt-16 text-sm outline-none"
|
| 177 |
></textarea>
|
| 178 |
</div>
|
|
|
|
| 193 |
<div class="!p-0 text-sm font-semibold">Add message</div>
|
| 194 |
</button>
|
| 195 |
{:else}
|
| 196 |
+
<PlaygroundCode model={currentModel} {streaming} {temperature} {maxTokens} />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 197 |
{/if}
|
| 198 |
</div>
|
| 199 |
|
|
|
|
| 244 |
submit();
|
| 245 |
}}
|
| 246 |
type="button"
|
| 247 |
+
class="flex h-[42px] w-24 items-center justify-center gap-2 rounded-lg bg-black px-5 py-2.5 text-sm font-medium text-white hover:bg-gray-900 focus:outline-none focus:ring-4 focus:ring-gray-300 disabled:opacity-50 dark:border-gray-700 dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-gray-700"
|
| 248 |
>
|
| 249 |
{#if loading}
|
| 250 |
<div class="flex flex-none items-center gap-[3px]">
|
|
|
|
| 262 |
/>
|
| 263 |
</div>
|
| 264 |
{:else}
|
| 265 |
+
Run <span
|
| 266 |
+
class="inline-flex gap-0.5 rounded border border-white/20 bg-white/10 px-0.5 text-xs text-white/70"
|
| 267 |
+
>⌘<span class="translate-y-px">↵</span></span
|
| 268 |
+
>
|
| 269 |
{/if}
|
| 270 |
</button>
|
| 271 |
</div>
|
|
|
|
| 273 |
<div class="flex flex-col gap-6 overflow-hidden p-5">
|
| 274 |
<PlaygroundOptions
|
| 275 |
{compatibleModels}
|
| 276 |
+
bind:currentModel
|
| 277 |
+
bind:temperature
|
| 278 |
+
bind:maxTokens
|
| 279 |
+
bind:jsonMode
|
| 280 |
+
bind:streaming
|
| 281 |
/>
|
| 282 |
</div>
|
| 283 |
</div>
|