inference-playground / src /lib /components /CodeSnippets.svelte
mishig's picture
mishig HF staff
Render current messages in snippets (#19)
e08d702 unverified
raw
history blame
No virus
6.18 kB
<script lang="ts">
import hljs from 'highlight.js/lib/core';
import javascript from 'highlight.js/lib/languages/javascript';
import python from 'highlight.js/lib/languages/python';
import bash from 'highlight.js/lib/languages/bash';
import type { Conversation } from '$lib/types';
hljs.registerLanguage('javascript', javascript);
hljs.registerLanguage('python', python);
hljs.registerLanguage('bash', bash);
export let conversation: Conversation;
const lanuages = ['javascript', 'python', 'bash'];
type Language = (typeof lanuages)[number];
const labelsByLanguage: Record<Language, string> = {
javascript: 'JavaScript',
python: 'Python',
bash: 'Curl'
};
interface Snippet {
label: string;
code: string;
language?: Language;
}
const snippetsByLanguage: Record<Language, Snippet[]> = {
javascript: getJavascriptSnippets(),
python: getPythonSnippets(),
bash: getBashSnippets()
};
let selectedLanguage: Language = 'javascript';
function getMessages(){
const placeholder = [{ role: "user", content: "Tell me a story" }];
const messages = conversation.messages.length ? conversation.messages : placeholder;
return JSON.stringify(messages, null, 2);
}
function highlight(code: string, language: Language) {
return hljs.highlight(code, { language }).value;
}
function getJavascriptSnippets() {
const messagesStr = getMessages().replace(/"([^"]+)":/g, '$1:');
const snippets: Snippet[] = [];
snippets.push({
label: 'Install @huggingface/inference',
language: 'bash',
code: `npm install --save @huggingface/inference
# or
yarn add @huggingface/inference`
});
if (conversation.config.streaming) {
snippets.push({
label: 'Streaming API',
code: `import { HfInference } from "@huggingface/inference"
const inference = new HfInference("your HF token")
let out = "";
for await (const chunk of inference.chatCompletionStream({
model: "${conversation.model}",
messages: ${messagesStr},
max_tokens: ${conversation.config.maxTokens},
temperature: ${conversation.config.temperature},
seed: 0,
})) {
if (chunk.choices && chunk.choices.length > 0) {
const newContent = chunk.choices[0].delta.content;
out += newContent;
process.stdout.write(newContent);
}
}`
});
} else {
// non-streaming
snippets.push({
label: 'Non-Streaming API',
code: `import { HfInference } from '@huggingface/inference'
const inference = new HfInference("your access token")
const out = await inference.chatCompletion({
model: "${conversation.model}",
messages: ${messagesStr},
max_tokens: ${conversation.config.maxTokens},
temperature: ${conversation.config.temperature},
seed: 0,
});
console.log(out.choices[0].message);`
});
}
return snippets;
}
function getPythonSnippets() {
const snippets: Snippet[] = [];
snippets.push({
label: 'Install',
code: `import { HfInference } from '@huggingface/inference'
const hf = new HfInference('your access token')`
});
if (conversation.config.streaming) {
snippets.push({
label: 'Streaming API',
code: `let out = "";
for await (const chunk of hf.chatCompletionStream({
model: "${conversation.model}",
messages: [
{ role: "user", content: "Complete the equation 1+1= ,just the answer" },
],
max_tokens: ${conversation.config.maxTokens},
temperature: ${conversation.config.temperature},
seed: 0,
})) {
if (chunk.choices && chunk.choices.length > 0) {
out += chunk.choices[0].delta.content;
}
}`
});
} else {
// non-streaming
snippets.push({
label: 'Non-Streaming API',
code: `await hf.chatCompletion({
model: "${conversation.model}",
messages: [
{ role: "user", content: "Complete the this sentence with words one plus one is equal " }
],
max_tokens: ${conversation.config.maxTokens},
temperature: ${conversation.config.temperature},
seed: 0,
});`
});
}
return snippets;
}
function getBashSnippets() {
const snippets: Snippet[] = [];
snippets.push({
label: 'Install',
code: `import { HfInference } from '@huggingface/inference'
const hf = new HfInference("your access token")`
});
if (conversation.config.streaming) {
snippets.push({
label: 'Streaming API',
code: `let out = "";
for await (const chunk of hf.chatCompletionStream({
model: "${conversation.model}",
messages: [
{ role: "user", content: "Complete the equation 1+1= ,just the answer" },
],
max_tokens: ${conversation.config.maxTokens},
temperature: ${conversation.config.temperature},
seed: 0,
})) {
if (chunk.choices && chunk.choices.length > 0) {
out += chunk.choices[0].delta.content;
}
}`
});
} else {
// non-streaming
snippets.push({
label: 'Non-Streaming API',
code: `await hf.chatCompletion({
model: "${conversation.model}",
messages: [
{ role: "user", content: "Complete the this sentence with words one plus one is equal " }
],
max_tokens: ${conversation.config.maxTokens},
temperature: ${conversation.config.temperature},
seed: 0,
});`
});
}
return snippets;
}
</script>
<div class="px-2 pt-2">
<div
class="border-b border-gray-200 text-center text-sm font-medium text-gray-500 dark:border-gray-700 dark:text-gray-400"
>
<ul class="-mb-px flex flex-wrap">
{#each Object.entries(labelsByLanguage) as [language, label]}
<li>
<button
on:click={() => (selectedLanguage = language)}
class="inline-block rounded-t-lg border-b-2 p-4 {language === selectedLanguage
? 'border-black text-black dark:border-blue-500 dark:text-blue-500'
: 'border-transparent hover:border-gray-300 hover:text-gray-600 dark:hover:text-gray-300'}"
aria-current="page">{label}</button
>
</li>
{/each}
</ul>
</div>
{#each snippetsByLanguage[selectedLanguage] as { label, code, language }}
<div class="px-4 pb-4 pt-6">
<h2 class="font-semibold">{label}</h2>
</div>
<pre
class="overflow-x-auto rounded-lg border border-gray-200/80 bg-white px-4 py-6 text-sm shadow-sm dark:border-gray-800 dark:bg-gray-800/50">{@html highlight(
code,
language ?? selectedLanguage
)}</pre>
{/each}
</div>