Skip to main content
useStream is UI-agnostic. It returns plain reactive state with messages, tool calls, loading flags, and thread history that you wire to any visual layer you choose. These pages show how three different libraries integrate with useStream, each with a different philosophy for building AI chat and generative UI.

Integrations

AI Elements

Composable shadcn/ui-based components for AI chat. Drop in Conversation, Message, Tool, and Reasoning and wire them directly to stream.messages.

assistant-ui

Headless React framework with a full runtime layer. Bridge useStream to AssistantRuntimeProvider via the useExternalStoreRuntime adapter.

OpenUI

Generative UI library that lets the agent produce complete, interactive dashboards in a declarative component DSL. Purpose-built for data-rich, report-style UIs.

Choosing a library

All three connect to useStream the same way. The choice depends on what kind of UI you’re building:
AI Elementsassistant-uiOpenUI
Best forChat with rich message typesFull-featured chat with minimal setupGenerated dashboards and reports
UI styleComposable shadcn/ui componentsHeadless slots + default themePrebuilt component library with declarative DSL
CustomisationEdit source files directlyOverride component slotsTheme via CSS custom properties
Streaming UXComponent-level progressive renderBuilt-in thread managementHoisting — shell appears immediately, data fills in
Tool callsTool / ToolHeader / ToolOutputCustom via message slotsInline in the generated UI
Agent formatAny stream.messagesAny stream.messagesAgent outputs openui-lang text
All three work with any @langchain/react-compatible agent: createAgent, createDeepAgent, or a custom LangGraph graph.