openui-forge
FreeBuild generative UI with OpenUI — any LLM provider, any backend language. Scaffold, integrate, validate.
The English summary is being prepared. Showing the original description.
OpenUI generative UI with Rust Axum backend. Async SSE streaming with reqwest and async-stream.
The English summary is being prepared. Showing the original description.
Review the instructions the agent will receive before you install.
Build generative UI apps with a React frontend + Rust Axum backend. Async SSE streaming to OpenAI-compatible NDJSON.
OPENAI_API_KEY environment variable setnpm install @openuidev/react-ui @openuidev/react-headless @openuidev/react-lang lucide-react zod
npx @openuidev/cli generate ./src/lib/library.ts --out backend/system-prompt.txt
cargo run on :3001, frontend on :3000backend/Cargo.toml[package]
name = "openui-backend"
version = "0.1.0"
edition = "2021"
[dependencies]
axum = "0.8"
http = "1"
tokio = { version = "1", features = ["full"] }
reqwest = { version = "0.13", features = ["json", "stream"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
async-stream = "0.3"
futures = "0.3"
tower-http = { version = "0.6", features = ["cors"] }
dotenvy = "0.15"
backend/src/main.rsuse axum::{
extract::{Json, State},
response::sse::{Event, Sse},
routing::post,
Router,
};
use futures::stream::Stream;
use http::HeaderValue;
use reqwest::Client;
use serde::{Deserialize, Serialize};
use std::{convert::Infallible, fs, net::SocketAddr, sync::Arc};
use tower_http::cors::{Any, CorsLayer};
#[derive(Deserialize)]
struct ChatRequest {
messages: Vec<Message>,
}
#[derive(Serialize, Deserialize, Clone)]
struct Message {
role: String,
content: String,
}
#[derive(Clone)]
struct AppState {
system_prompt: String,
}
#[tokio::main]
async fn main() {
dotenvy::dotenv().ok();
let system_prompt = fs::read_to_string("system-prompt.txt")
.expect("system-prompt.txt not found");
let state = Arc::new(AppState { system_prompt });
let cors = CorsLayer::new()
.allow_origin("http://localhost:3000".parse::<HeaderValue>().unwrap())
.allow_methods([http::Method::POST])
.allow_headers(Any);
let app = Router::new()
.route("/api/chat", post(chat_handler))
.layer(cors)
.with_state(state);
let addr = SocketAddr::from(([0, 0, 0, 0], 3001));
println!("Rust backend listening on {addr}");
let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
axum::serve(listener, app).await.unwrap();
}
async fn chat_handler(
State(state): State<Arc<AppState>>,
Json(req): Json<ChatRequest>,
) -> Sse<impl Stream<Item = Result<Event, Infallible>>> {
let mut messages = vec![Message { role: "system".into(), content: state.system_prompt.clone() }];
messages.extend(req.messages);
let api_key = std::env::var("OPENAI_API_KEY").expect("OPENAI_API_KEY not set");
let client = Client::new();
let stream = async_stream::stream! {
let resp = client
.post("https://api.openai.com/v1/chat/completions")
.bearer_auth(&api_key)
.json(&serde_json::json!({
"model": std::env::var("OPENAI_MODEL").unwrap_or_else(|_| "gpt-5.5".into()),
"stream": true,
"messages": messages,
}))
.send()
.await;
if let Ok(resp) = resp {
let mut bytes_stream = resp.bytes_stream();
use futures::StreamExt;
let mut buffer = String::new();
while let Some(Ok(chunk)) = bytes_stream.next().await {
buffer.push_str(&String::from_utf8_lossy(&chunk));
while let Some(pos) = buffer.find("\n\n") {
let line = buffer[..pos].to_string();
buffer = buffer[pos + 2..].to_string();
if line.starts_with("data: ") {
yield Ok(Event::default().data(&line[6..]));
}
}
}
}
};
Sse::new(stream)
}
app/chat/page.tsx"use client";
import { FullScreen } from "@openuidev/react-ui";
import { openuiChatLibrary } from "@openuidev/react-ui/genui-lib";
import {
openAIAdapter,
openAIMessageFormat,
} from "@openuidev/react-headless";
export default function ChatPage() {
return (
<FullScreen
componentLibrary={openuiChatLibrary}
streamProtocol={openAIAdapter()}
messageFormat={openAIMessageFormat}
apiUrl="http://localhost:3001/api/chat"
/>
);
}
The Rust backend re-emits SSE via Axum's
Sse<...>response (Axum wraps eachEvent::default().data(...)with thedata:prefix). Pair it withopenAIAdapter()on the frontend.openAIReadableStreamAdapter()is for NDJSON and will silently produce no output here.
npx @openuidev/cli generate ./src/lib/library.ts --out backend/system-prompt.txt
system-prompt.txt exists in the Rust backend directoryOPENAI_API_KEY is set in environment or .envapiUrl points to http://localhost:3001/api/chatstreamProtocol={openAIAdapter()} and openAIMessageFormatcomponentLibrary={openuiChatLibrary} prop passed to FullScreen@openuidev/react-ui/components.css)| Error | Cause | Fix |
|---|---|---|
system-prompt.txt not found | File missing | Run CLI generate command |
| CORS blocked | Origin not in CorsLayer | Update .allow_origin() |
| Partial SSE events | Chunk boundary splitting | Buffer and split on \n\n boundaries (handled in code) |
Compile error on http::HeaderValue | Missing http crate | Add http = "1" to Cargo.toml (already in the example) or import from axum::http |
static_mut_refs warning on static mut | Rust 2024 deprecates raw static mut access | Use OnceLock<String> or carry state in State<Arc<AppState>> (this example uses the latter) |
| Connection reset | Tokio runtime panic | Check .await on all async calls, verify features = ["full"] |
No reviews yet. Tell others what you thought.
No login needed. Share how it worked for you, ask a question, or note where it did not run.
No comments yet. Be the first to write one.
Build generative UI with OpenUI — any LLM provider, any backend language. Scaffold, integrate, validate.
The English summary is being prepared. Showing the original description.
OpenUI generative UI with Anthropic Claude SDK backend. Stream conversion to OpenAI NDJSON format.
The English summary is being prepared. Showing the original description.
OpenUI generative UI with C# ASP.NET Core Minimal API backend. Direct OpenAI API SSE streaming via HttpClient on .NET 10.
The English summary is being prepared. Showing the original description.
OpenUI generative UI with Elixir Phoenix backend. Chunked SSE streaming via Plug.Conn and Req.
The English summary is being prepared. Showing the original description.
OpenUI generative UI with Go (net/http) backend. Direct OpenAI API streaming via HTTP.
The English summary is being prepared. Showing the original description.
OpenUI generative UI with a Java Spring Boot (WebFlux) backend. Streams the OpenAI API directly via WebClient as SSE.
The English summary is being prepared. Showing the original description.