|
<!DOCTYPE html> |
|
<html class="bg-gradient-to-br from-gray-50 to-gray-100"> |
|
<head> |
|
<meta charset="utf-8" /> |
|
<meta name="viewport" content="width=device-width" /> |
|
<title>SmolLM2 WebGPU Structured Generation π₯</title> |
|
<script src="https://cdn.tailwindcss.com"></script> |
|
<link rel="stylesheet" href="./style/style.css" /> |
|
|
|
<link |
|
rel="stylesheet" |
|
href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/default.min.css" |
|
/> |
|
<link rel="stylesheet" href="./style/ace.css" /> |
|
<link rel="stylesheet" href="./style/hljs.css" /> |
|
</head> |
|
<body class="min-h-screen p-8 bg-gradient-to-br from-transparent to-blue-50/30"> |
|
<div class="max-w-7xl mx-auto"> |
|
<h1 class="text-5xl font-bold text-transparent bg-clip-text bg-gradient-to-r from-blue-600 to-indigo-600 mb-4">SmolLM2 WebGPU Structured Generation π₯</h1> |
|
<h4 class="text-lg text-gray-600 mb-8 backdrop-blur-sm"> |
|
Generate structured output from LLMs using |
|
<a |
|
class="text-blue-600 hover:text-blue-800 underline decoration-2 transition-colors" |
|
referrerpolicy="no-referrer" |
|
href="https://webllm.mlc.ai/" |
|
target="_blank" |
|
>WebLLM</a |
|
> and <a |
|
class="text-blue-600 hover:text-blue-800 underline decoration-2 transition-colors" |
|
referrerpolicy="no-referrer" |
|
href="https://xgrammar.mlc.ai/" |
|
target="_blank" |
|
>XGrammar</a>. |
|
</h4> |
|
<main class="flex gap-8 flex-col md:flex-row"> |
|
<div id="left-col" class="flex-1 space-y-6"> |
|
<div class="bg-white/80 backdrop-blur-sm rounded-xl shadow-lg border border-gray-100/50 p-6 transition-all hover:shadow-xl"> |
|
<form> |
|
<label for="model-selection" class="block"> |
|
<span class="block font-semibold mb-2 text-gray-800">Model</span> |
|
<select id="model-selection" class="w-full rounded-lg border-gray-200 shadow-sm focus:border-blue-500 focus:ring-blue-500 transition-all"></select> |
|
</label> |
|
</form> |
|
</div> |
|
<div class="bg-white/80 backdrop-blur-sm rounded-xl shadow-lg border border-gray-100/50 p-6 transition-all hover:shadow-xl"> |
|
<form> |
|
<label for="grammar-selection" class="block"> |
|
<span class="block font-semibold mb-2 text-gray-800">Grammar</span> |
|
<select id="grammar-selection" value="json" class="w-full rounded-lg border-gray-200 shadow-sm focus:border-blue-500 focus:ring-blue-500 transition-all"> |
|
<option value="json">JSON Schema (Default)</option> |
|
<option value="custom">Custom Grammar</option> |
|
</select> |
|
</label> |
|
</form> |
|
</div> |
|
<div id="ebnf-grammar-container" class="bg-white/80 backdrop-blur-sm rounded-xl shadow-lg border border-gray-100/50 p-6 transition-all hover:shadow-xl hidden"> |
|
<form> |
|
<label for="ebnf-grammar" class="block"> |
|
<span class="block font-semibold mb-2 text-gray-800">Custom Grammar</span> |
|
<span class="block text-gray-600 text-sm mb-4"> |
|
The custom grammar is described in the |
|
<a |
|
class="text-blue-600 hover:text-blue-800 underline decoration-2 transition-colors" |
|
href="https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form" |
|
referrerpolicy="no-referrer" |
|
target="_blank" |
|
>extended Backus-Naur form (EBNF)</a |
|
>. Below is an example of JSON grammar in EBNF. Please follow |
|
this example when writing new grammars. |
|
</span> |
|
<div id="ebnf-grammar" class="border rounded-lg bg-white/50"></div> |
|
</label> |
|
</form> |
|
</div> |
|
<div id="schema-container" class="bg-white/80 backdrop-blur-sm rounded-xl shadow-lg border border-gray-100/50 p-6 transition-all hover:shadow-xl"> |
|
<form> |
|
<label class="block"> |
|
<span class="block font-semibold mb-2 text-gray-800">Schema</span> |
|
<span class="block text-gray-600 text-sm mb-4"> |
|
Provide a JSON schema to generate output in the specified format. |
|
</span> |
|
<div id="schema" class="border rounded-lg bg-white/50"></div> |
|
</label> |
|
</form> |
|
</div> |
|
</div> |
|
<div id="right-col" class="flex-1 space-y-6"> |
|
<div class="bg-white/80 backdrop-blur-sm rounded-xl shadow-lg border border-gray-100/50 p-6 transition-all hover:shadow-xl"> |
|
<form> |
|
<label for="prompt" class="block"> |
|
<span class="block font-semibold mb-2 text-gray-800">Prompt</span> |
|
<textarea |
|
id="prompt" |
|
dir="ltr" |
|
placeholder="Enter your prompt here..." |
|
rows="1" |
|
class="w-full rounded-lg border-gray-200 shadow-sm focus:border-blue-500 focus:ring-blue-500 transition-all" |
|
></textarea> |
|
</label> |
|
</form> |
|
</div> |
|
<button id="generate" class="w-full bg-gradient-to-r from-blue-600 to-indigo-600 hover:from-blue-700 hover:to-indigo-700 text-white font-semibold py-3 px-6 rounded-xl shadow-lg transition-all hover:shadow-xl hover:scale-[1.02] active:scale-[0.98]">Generate</button> |
|
<div class="bg-white/80 backdrop-blur-sm rounded-xl shadow-lg border border-gray-100/50 p-6 transition-all hover:shadow-xl"> |
|
<form> |
|
<label class="block"> |
|
<span class="block font-semibold mb-2 text-gray-800">Output</span> |
|
<div id="output" class="border rounded-lg p-4 bg-white/50"></div> |
|
</label> |
|
<p class="info hidden text-sm text-gray-600 mt-4" id="stats"></p> |
|
</form> |
|
</div> |
|
</div> |
|
</main> |
|
</div> |
|
<script src="./dist/index.js" type="module"></script> |
|
</body> |
|
</html> |
|
|