OpenUI Assistant
evex/openui-assistantFreeItem
An Eve agent that streams OpenUI Lang generative UI using the official openuiChatLibrary, with demo weather, stock, and search tools from the openui-chat example.
Install it
npx shadcn@latest add https://evex.sh/r/openui-assistant.jsonSource
1"use client";23import { Renderer } from "@openuidev/react-lang";4import { openuiChatLibrary } from "@openuidev/react-ui/genui-lib";5import type { EveMessage } from "eve/react";6import { useEveAgent } from "eve/react";7import { useMemo, useState } from "react";89function getLatestAssistantText(messages: readonly EveMessage[]): string {10 for (let index = messages.length - 1; index >= 0; index -= 1) {11 const message = messages[index];1213 if (message?.role !== "assistant") {14 continue;15 }1617 return message.parts18 .filter((part) => part.type === "text")19 .map((part) => part.text)20 .join("\n");21 }2223 return "";24}2526/**27 * Reference chat surface that streams Eve assistant text into the OpenUI28 * Renderer. Copy this component into a Next.js app that already uses29 * `withEve()` from `eve/next`.30 */31export function OpenUIEveChat() {32 const agent = useEveAgent();33 const [submitError, setSubmitError] = useState<string | null>(null);34 const isStreaming = agent.status === "streaming";35 const isBusy =36 agent.status === "submitted" || isStreaming;3738 const assistantProgram = useMemo(39 () => getLatestAssistantText(agent.data.messages),40 [agent.data.messages],41 );4243 return (44 <div className="mx-auto flex h-dvh max-w-3xl flex-col gap-4 p-4">45 <section46 aria-busy={isBusy}47 aria-live="polite"48 className="min-h-0 flex-1 overflow-auto rounded-xl border p-4"49 >50 {assistantProgram.length > 0 ? (51 <Renderer52 isStreaming={isStreaming}53 library={openuiChatLibrary}54 response={assistantProgram}55 />56 ) : (57 <p className="text-sm text-muted-foreground">58 Ask for weather, a stock quote, or a demo search to see generative UI.59 </p>60 )}61 </section>6263 <form64 className="flex gap-2"65 onSubmit={async (event) => {66 event.preventDefault();67 const formElement = event.currentTarget;68 const form = new FormData(formElement);69 const message = String(form.get("message") ?? "").trim();7071 if (message.length > 0) {72 setSubmitError(null);7374 try {75 await agent.send(message);76 formElement.reset();77 } catch (error) {78 const errorMessage =79 error instanceof Error ? error.message : "Failed to send message.";80 setSubmitError(errorMessage);81 }82 }83// … truncated
What it pulls in
npm packages
Files it writes
More from evex
All 11 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Brand Visual Asset Generatorbrand-visual-asset-generator | evex | Other | Free | 3 deps · 16 files | |
| Branded SEO Page Builderbranded-seo-page-builder | evex | Other | Free | 2 deps · 16 files | |
| Code Reviewercode-reviewer | evex | Other | Free | 5 deps · 14 files | |
| Eve Agent Buildereve-agent-builder | evex | Other | Free | 3 deps · 27 files | |
| Linear Operations Agentlinear-operations-agent | evex | Other | Free | 3 deps · 27 files | |
| Postgres Data Analystpostgres-data-analyst | evex | Other | Free | 6 deps · 13 files | |
| Programmatic SEO Agentprogrammatic-seo-agent | evex | Other | Free | 4 deps · 19 files | |
| Supabase Data Analystsupabase-data-analyst | evex | Other | Free | 3 deps · 10 files |
