UNPKG

eve

Version:

Filesystem-first framework for durable backend AI agents that run anywhere.

112 lines (84 loc) 3.98 kB
--- title: "SvelteKit" description: "Run an eve agent and a SvelteKit app as one project with the eveSvelteKit Vite plugin." --- `eve/sveltekit` runs a SvelteKit frontend and an eve agent as one project instead of two services. The `eveSvelteKit()` Vite plugin puts both on one dev server and one Vercel deploy, and [`useEveAgent`](./use-eve-agent-svelte) finds the mounted routes on its own. There's no CORS to configure and no URL env vars to keep in sync. ## Prerequisites - The `eve` package installed in your project (`npm install eve@latest`). - An existing eve agent directory. If you don't have one, start from [Getting started](../../getting-started). - A SvelteKit app to mount the agent in. ## Register the Vite plugin Add `eveSvelteKit()` before `sveltekit()`: ```ts title="vite.config.ts" import { sveltekit } from "@sveltejs/kit/vite"; import { eveSvelteKit } from "eve/sveltekit"; import { defineConfig } from "vite"; export default defineConfig({ plugins: [eveSvelteKit(), sveltekit()], }); ``` The plugin looks for an `agent/` folder in the SvelteKit project root. Pass `eveRoot` when the agent lives elsewhere: ```ts export default defineConfig({ plugins: [ eveSvelteKit({ eveRoot: "../my-agent", }), sveltekit(), ], }); ``` The plugin accepts only two options, `eveRoot` and `eveBuildCommand`. ## Call the binding With the plugin in `vite.config.ts`, components call [`useEveAgent`](./use-eve-agent-svelte) from `eve/svelte` and don't pass a host: ```svelte <script lang="ts"> import { useEveAgent } from "eve/svelte"; const agent = useEveAgent(); let message = $state(""); let isBusy = $derived(agent.status === "submitted" || agent.status === "streaming"); async function handleSubmit() { const text = message.trim(); if (!text || isBusy) return; message = ""; await agent.send({ message: text }); } </script> <form onsubmit={(event) => { event.preventDefault(); void handleSubmit(); }}> <input bind:value={message} disabled={isBusy} /> <button type="submit" disabled={isBusy}>Send</button> </form> ``` The default eve channel is fail-closed. With no `agent/channels/eve.ts` authored, eve registers `eveChannel({ auth: [vercelOidc(), localDev()] })`: `vercelOidc()` gets the first chance to resolve a Vercel caller, `localDev()` opens the remaining localhost requests, and everything else gets a `401`. To set your own auth policy, add `agent/channels/eve.ts`: ```ts title="agent/channels/eve.ts" import { eveChannel } from "eve/channels/eve"; import { localDev, vercelOidc } from "eve/channels/auth"; export default eveChannel({ auth: [vercelOidc(), localDev()] }); ``` For a public demo, use `none()` (also from `eve/channels/auth`) to skip authentication. See [Channels](../../channels/overview) and [Auth & route protection](../auth-and-route-protection). ## Dev vs deploy topology - **Local dev.** `npm run dev` boots the eve dev server next to SvelteKit and proxies the eve routes to it, so the browser only ever hits the SvelteKit origin. `npm run build && npm run preview` behaves the same way: the preview server gets its own eve route proxy and either reuses the shared eve server or starts one. - **Vercel.** The SvelteKit app and the eve runtime deploy as a single project. The web app is public; the eve runtime sits behind it on the same origin. Use `eveBuildCommand` for a project-specific agent build: ```ts export default defineConfig({ plugins: [ eveSvelteKit({ eveBuildCommand: "npm run build:eve", }), sveltekit(), ], }); ``` - **Non-Vercel hosts.** When the eve service runs on a separate origin, pass `host` directly to `useEveAgent`: ```ts const agent = useEveAgent({ host: "https://agent.example.com", }); ``` ## What to read next - [`useEveAgent` (Svelte)](./use-eve-agent-svelte): the binding API - [Auth & route protection](../auth-and-route-protection) - [Deployment](../deployment/overview)