agents-js-oasst / src /routes /+page.svelte
nsarrazin's picture
nsarrazin HF staff
add support for arbitrary HF endpoints
28e12d0
raw
history blame
3.25 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";
import FileUpload from "$lib/components/FileUpload.svelte";
import ToolSelector from "$lib/components/ToolSelector.svelte";
import CodePreview from "$lib/components/CodePreview.svelte";
import ResultsDisplay from "$lib/components/ResultsDisplay.svelte";
import LlmSelector from "$lib/components/LLMSelector.svelte";
import type { LLM } from "$lib/types";
import { HFLLM } from "$lib/agents/llm";
import { OPENAI_API_KEY } from "$lib/store";
import ApiKeyModal from "$lib/components/ApiKeyModal.svelte";
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 llm: LLM = HFLLM;
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) => selectedTools.includes(el.name)),
files,
llm
);
};
const onRun = async (code: string) => {
messages = [];
const callback = (message: string, data: string | Blob | undefined) => {
messages = [...messages, { message, data }];
};
const wrapperEval = await evalBuilder(
code,
tools.filter((el) => selectedTools.includes(el.name)),
files,
callback
);
isLoading = true;
try {
await wrapperEval();
} catch (e) {
if (e instanceof Error) {
messages = [
...messages,
{ message: "An error occurred", data: e.message },
];
}
}
isLoading = false;
};
let dialogElement: HTMLDialogElement;
</script>
<ApiKeyModal bind:dialogElement />
<div class="flex flex-col space-y-4 max-w-xl">
<div class="flex flex-row">
<LogoHuggingFaceBorderless classNames="text-4xl" />
<h1 class="text-3xl font-semibold mx-auto">Agents.js</h1>
<button
class="btn btn-ghost"
on:click={() => dialogElement.showModal()}
on:keydown={() => dialogElement.showModal()}>API keys</button
>
</div>
{#if $OPENAI_API_KEY !== ""}
<div class="divider" />
<LlmSelector bind:llm />
{/if}
<div class="divider" />
<ToolSelector bind:selectedTools />
<div class="divider" />
<span class="label-text text-lg"> Input your request </span>
<textarea
class="textarea border-base-300 bg-base-300"
placeholder="Ask something here"
bind:value={prompt}
/>
<FileUpload bind:files />
<button
class="btn btn-primary mt-auto w-fit mx-auto"
on:click={onGenerate}
on:keypress={onGenerate}
disabled={selectedTools.length === 0}>generate</button
>
{#if codePromise}
<CodePreview bind:codePromise {onRun} />
{/if}
<div class="divider" />
<ResultsDisplay bind:messages />
{#if isLoading}
<div class="loading loading-lg mx-auto" />
{/if}
</div>