agents-js-oasst / src /routes /+page.svelte
nsarrazin's picture
cat example is lolz
ab28d28
raw
history blame
4.33 kB
<script lang="ts">
import LogoHuggingFaceBorderless from '$lib/components/LogoHuggingFaceBorderless.svelte';
import { generateCode } from '$lib/agents/generateCode';
import { tools } from '$lib/agents/tools';
import { evalBuilder } from '$lib/agents/evalBuilder';
let prompt = 'Draw a picture of a cat wearing a top hat. Then caption the picture and read it out loud.';
let selectedTools: Array<string> = [];
let codePromise: Promise<string> | null = null;
let messages: Array<{ message: string; data: string | Blob | undefined }> = [];
let files: FileList | null = null;
let isLoading = false;
const onGenerate = async () => {
messages = [];
codePromise = generateCode(
prompt,
tools.filter((el) => el.name === 'message' || selectedTools.includes(el.name)),
files
);
};
const onRun = async (code: string) => {
messages = [];
const wrapperEval = await evalBuilder(
code,
tools.filter((el) => el.name === 'message' || selectedTools.includes(el.name)),
files,
(message, data) => {
messages = [...messages, { message, data }];
}
);
isLoading = true;
await wrapperEval();
isLoading = false;
};
const isBlob = (message: string | Blob): message is Blob => {
return message instanceof Blob;
};
</script>
<div class="flex flex-col space-y-4 max-w-xl">
<div class="flex flex-row justify-around">
<LogoHuggingFaceBorderless classNames="text-4xl" />
<h1 class="text-3xl font-semibold w-fit mx-auto">Agents.js</h1>
</div>
<div class="divider" />
<h3 class="text-lg w-fit mx-auto">Select your tools</h3>
<div class="join mx-auto">
{#each tools.filter((tool) => tool.name != 'message') as tool}
<label
class="form-switch join-item btn normal-case btn-sm"
class:btn-info={selectedTools.includes(tool.name)}
>
<input
class="hidden"
type="checkbox"
bind:group={selectedTools}
name="tools"
value={tool.name}
/>
{tool.name}
</label>
{/each}
</div>
<div class="divider" />
<span class="label-text"> Input your request </span>
<textarea
class="textarea border-base-300 bg-base-300"
placeholder="Ask something here"
bind:value={prompt}
/>
<div class="grid grid-cols-2 gap-5">
<div class="form-control">
<label class="label">
<span class="label-text">
{#if files && files.length > 0}
{files[0].type.split('/')[0]} detected
<button class="btn-sm btn btn-ghost" on:click={() => (files = null)}>clear </button>
{:else}
Upload a file (image or audio)
{/if}
</span>
</label>
<input
type="file"
bind:files
accept="audio/*, image/*"
class="mt-auto file-input file-input-bordered max-w-xs"
class:file-input-primary={files && files.length > 0}
/>
</div>
<button
class="btn btn-primary mt-auto"
on:click={onGenerate}
on:keypress={onGenerate}
disabled={selectedTools.length === 0}>generate</button
>
</div>
{#if codePromise}
{#await codePromise}
<div class="loading loading-lg mx-auto" />
{:then code}
<div class="mockup-code text-sm">
<pre class="ml-4"><code>{code}</code></pre>
</div>
<button
class="btn btn-primary w-fit mx-auto"
on:click={() => {
onRun(code);
}}
>
run code
</button>
{/await}
{/if}
<div class="divider" />
{#if isLoading}
<div class="loading loading-lg mx-auto" />
{:else if messages.length > 0}
<h3 class="text-lg w-fit mx-auto">Results</h3>
{/if}
<div class="join join-vertical w-full">
{#each messages as message}
<div class="collapse collapse-arrow join-item border border-base-300">
<input type="radio" name="my-accordion-4" checked={true} />
<div class="collapse-title text-xl font-medium">
{message.message}
</div>
<div class="collapse-content">
{#if !!message.data && isBlob(message.data)}
{#if message.data.type.startsWith('image')}
<img class="mx-auto" alt="generated" src={URL.createObjectURL(message.data)} />
{:else if message.data.type.startsWith('audio')}
<audio controls src={URL.createObjectURL(message.data)} />
{:else}
<p class="text-mono text-light w-full">blob type unknown</p>
{/if}
{:else if !!message.data}
<p class="text-mono text-light w-full">{message.data}</p>
{/if}
</div>
</div>
{/each}
</div>
</div>