enzostvs's picture
enzostvs HF Staff
typo
d84eaac
<script lang="ts">
import { CodeXml, ExternalLink } from '@lucide/svelte';
import { Button } from '$lib/components/ui/button';
import * as Dialog from '$lib/components/ui/sheet/index.js';
import Code from '$lib/components/chat/markdown/Code.svelte';
import { useSvelteFlow } from '@xyflow/svelte';
import { breakpointsState } from '$lib/state/breakpoints.svelte';
import { modelsState } from '$lib/state/models.svelte';
type Instruction = {
library: string;
doc_link: string;
install: string;
code: string;
};
type Language = {
language: string;
instructions: Instruction[];
};
const { getNodes } = useSvelteFlow();
let firstModelSelection = $derived(
(getNodes()?.[0]?.data as { selectedModels?: string[] })?.selectedModels?.[0] ??
(modelsState.models[0]?.id as string) ??
''
);
const instructions: Language[] = $derived([
{
language: 'Javascript',
instructions: [
{
library: 'openai',
doc_link: 'https://platform.openai.com/docs/libraries',
install: 'npm install --save openai',
code: `import { OpenAI } from "openai";";
const client = new OpenAI({
baseURL: "https://router.huggingface.co/v1",
apiKey: process.env.HF_TOKEN,
});
const stream = await client.chat.completions.create({
model: "${firstModelSelection}",
messages: [
{ role: "user", content: "What is the capital of France?" }
],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || "");
}`
},
{
library: 'huggingface.js',
doc_link: 'https://huggingface.co/docs/huggingface.js/inference/README',
install: 'npm install --save @huggingface/inference',
code: `import { InferenceClient } from "@huggingface/inference";
const client = new InferenceClient(process.env.HF_TOKEN);
let out = "";
const stream = client.chatCompletionStream({
model: "${firstModelSelection}",
messages: [
{ role: "user", content: "What is the capital of France?" }
],
});
for await (const chunk of stream) {
if (chunk.choices && chunk.choices.length > 0) {
const newContent = chunk.choices[0].delta.content;
out += newContent;
console.log(newContent);
}
}`
}
]
},
{
language: 'Python',
instructions: [
{
library: 'openai',
doc_link: 'https://platform.openai.com/docs/libraries',
install: 'pip install --upgrade openai',
code: `import os
from openai import OpenAI
client = OpenAI(
base_url="https://router.huggingface.co/v1",
api_key=os.environ.get("HF_TOKEN"),
)
stream = client.chat.completions.create(
model="${firstModelSelection}",
messages=[{"role": "user", "content": "What is the capital of France?"}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content, end="")`
},
{
library: 'huggingface_hub',
doc_link: 'https://huggingface.co/docs/huggingface_hub/guides/inference',
install: 'pip install --upgrade huggingface_hub',
code: `import os
from huggingface_hub import InferenceClient
client = InferenceClient(
api_key=os.environ["HF_TOKEN"],
)
stream = client.chat.completions.create(
model="${firstModelSelection}",
messages=[{"role": "user", "content": "What is the capital of France?"}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content, end="")`
},
{
library: 'requests',
doc_link: 'https://requests.readthedocs.io/en/latest/',
install: 'pip install requests',
code: `import os
import json
import requests
API_URL = "https://router.huggingface.co/v1/chat/completions"
headers = {"Authorization": f"Bearer {os.environ['HF_TOKEN']}"}
def query(payload):
response = requests.post(API_URL, headers=headers, json=payload, stream=True)
for line in response.iter_lines():
if not line.startswith(b"data:"):
continue
if line.strip() == b"data: [DONE]":
return
yield json.loads(line.decode("utf-8").lstrip("data:"))
chunks = query({
"messages": [{"role": "user", "content": "What is the capital of France?"}],
"model": "${firstModelSelection}",
"stream": True,
})
for chunk in chunks:
print(chunk["choices"][0]["delta"]["content"], end="")`
}
]
},
{
language: 'cURL',
instructions: [
{
library: 'curl',
doc_link: 'https://huggingface.co/docs/api-inference/getting-started',
install: '',
code: `curl https://router.huggingface.co/v1/chat/completions \\
-H "Authorization: Bearer $HF_TOKEN" \\
-H "Content-Type: application/json" \\
-d '{
"model": "${firstModelSelection}",
"messages": [
{ "role": "user", "content": "What is the capital of France?" }
],
"stream": true
}'`
}
]
}
]);
let open = $state(false);
let selectedLanguage = $state<string>('Javascript');
let selectedLibrary = $state<string>('openai');
let languageData = $derived(instructions.find((i) => i.language === selectedLanguage));
let libraryData = $derived(languageData?.instructions.find((i) => i.library === selectedLibrary));
let showLibraryTabs = $derived((languageData?.instructions.length ?? 0) > 1);
function selectLanguage(lang: string) {
selectedLanguage = lang;
const langData = instructions.find((i) => i.language === lang);
if (langData) selectedLibrary = langData.instructions[0].library;
}
</script>
<Dialog.Root bind:open>
<Dialog.Trigger class="">
<Button variant="outline" size={breakpointsState.isMobile ? 'icon-sm' : 'default'}>
<CodeXml />
{#if !breakpointsState.isMobile}
How to use the API
{/if}
</Button>
</Dialog.Trigger>
<Dialog.Content class="max-w-xl! gap-0! p-0!">
<Dialog.Header class="mb-0 gap-1! rounded-none border-b p-5">
<Dialog.Title>Use the API</Dialog.Title>
<Dialog.Description>How to use the API in your application.</Dialog.Description>
</Dialog.Header>
<div class="space-y-4 p-5">
<div class="flex items-center gap-1.5">
{#each instructions as lang}
<Button
variant={selectedLanguage === lang.language ? 'default' : 'outline'}
size="default"
onclick={() => selectLanguage(lang.language)}
>
{lang.language}
</Button>
{/each}
</div>
{#if showLibraryTabs && languageData}
<div class="flex items-center gap-1.5">
{#each languageData.instructions as instr}
<Button
variant={selectedLibrary === instr.library ? 'outline-blue' : 'outline'}
size="xs"
class="rounded-full!"
onclick={() => (selectedLibrary = instr.library)}
>
{instr.library}
</Button>
{/each}
</div>
{/if}
{#if libraryData}
{#if libraryData.install}
<div class="overflow-hidden rounded-lg border border-border">
<div class="flex items-center justify-between border-b border-border px-3.5 py-2.5">
<p class="text-xs font-semibold text-primary">Install</p>
</div>
<Code text={libraryData.install} className="" />
</div>
{/if}
<div class="overflow-hidden rounded-lg border border-border">
<div class="flex items-center justify-between border-b border-border px-3.5 py-2.5">
<p class="text-xs font-semibold text-primary">Streaming API</p>
<div class="flex items-center gap-1.5">
<a href={libraryData.doc_link} target="_blank" rel="noopener noreferrer">
<Button variant="outline" size="2xs">
<ExternalLink class="size-3.5" />
View documentation
</Button>
</a>
</div>
</div>
<Code text={libraryData.code} className="" />
</div>
{/if}
</div>
</Dialog.Content>
</Dialog.Root>