RADZOR
ComponentsRecipesDocsContributeGitHub
Get Started
RADZOR

The universal component registry for LLM-driven development. Empowering developers to build better apps, faster.

Product
  • Components
  • Standard
Resources
  • Documentation
  • API Reference
  • AI Agent Integration
  • Pipeline Guide
  • MCP Server
Community
  • GitHub
  • X / Twitter
  • Discord

© 2026 Radzor Registry. All rights reserved.

Back to Docs

Building Pipelines

The real power of Radzor is chaining components together. Each component's manifest declares its inputs, outputs, and composability — your LLM (or you) reads these to wire them into a pipeline.

How Pipelines Work

Every component has a composability.connectsTo field in its manifest. This declares which outputs connect to which inputs on other components:

// @radzor/speech-to-text manifest
"composability": {
  "connectsTo": [{
    "output": "transcriptionResult",
    "compatibleWith": ["@radzor/llm-completion.action.complete.prompt"],
    "mapField": "text"
  }]
}

This tells you (and your LLM): "extract .textfrom the transcription result and pass it to llm-completion's complete() action as the prompt."

The mapField makes wiring deterministic — no guessing which field to extract from a complex output object. Combined with inline fields on outputs, an LLM can auto-wire the entire pipeline from manifests alone.

Cross-Runtime Pipelines

Components have a runtime field: Server, Browser, or Universal.

When a pipeline mixes browser and server components, you need a bridge — HTTP upload, WebSocket, or Server-Sent Events. The manifest marks these edges with "runtime": "cross-environment".

Browser component
HTTP / WebSocket bridge
Server component

The Wiring Pattern

Every Radzor pipeline follows the same 3 steps:

  1. Instantiate each component with its config — check inputs[].envVar for the right env variable names
  2. Call actions in sequence — use mapField to extract the right field from complex outputs
  3. Handle events for side effects (logging, error handling, streaming)

Check outputs[].fields to see the exact shape of complex return types. The mapField on composability edges tells you which field to extract (e.g. result.content, result.text) — no guessing required.

Pipeline Examples

Voice Bot

Capture voice → transcribe → generate response → speak it back

View recipe →
audio-capture
speech-to-text
llm-completion
text-to-speech
⚡ Bridge required: HTTP upload — browser sends audio blob, server returns text + audio base64
Env vars: OPENAI_API_KEY
// 1. Browser: capture audio
const capture = new AudioCapture({ sampleRate: 16000, codec: "opus" });
await capture.startRecording();
const blob = await capture.stopRecording();

// 2. Send to server via HTTP
const form = new FormData();
form.append("audio", blob, "recording.webm");
const res = await fetch("/api/voice", { method: "POST", body: form });
const { text, audio } = await res.json();

// --- Server (API route) ---
// 3. Transcribe
const stt = new SpeechToText({ provider: "openai", apiKey: process.env.OPENAI_API_KEY! });
const { text: transcript } = await stt.transcribe(audioBuffer);

// 4. Generate response
const llm = new LLMCompletion({ provider: "openai", apiKey: process.env.OPENAI_API_KEY!, model: "gpt-4o" });
const reply = await llm.complete(transcript);

// 5. Synthesize speech
const tts = new TextToSpeech({ provider: "openai", apiKey: process.env.OPENAI_API_KEY! });
const audio = await tts.synthesize(reply.content);

return Response.json({ text: reply.content, audio: Buffer.from(audio).toString("base64") });
$ npx radzor@latest add audio-capture speech-to-text llm-completion text-to-speech

RAG Pipeline

Semantic search over documents → augment LLM context

View recipe →
embeddings-store
llm-completion
Env vars: OPENAI_API_KEY
const store = new EmbeddingsStore({
  provider: "openai", apiKey: process.env.OPENAI_API_KEY!, dimensions: 1536
});

// Index documents (one-time)
await store.add("doc1", "Your document content here...");

// Query
const results = await store.search("user question", 3);
const context = results.map(r => r.content).join("\n\n");

const llm = new LLMCompletion({
  provider: "openai", apiKey: process.env.OPENAI_API_KEY!, model: "gpt-4o",
  systemPrompt: `Answer based on this context:\n\n${context}`
});
const answer = await llm.complete("user question");
$ npx radzor@latest add embeddings-store llm-completion

Scrape → Structure → Export

Scrape web pages → extract structured data with LLM → export to CSV

View recipe →
web-scraper
structured-output
csv-export
Env vars: OPENAI_API_KEY
const scraper = new WebScraper({ rateLimit: 2000 });
const page = await scraper.scrape("https://example.com/products", {
  selectors: { title: "h1", price: ".price", desc: ".description" }
});

const so = new StructuredOutput({
  provider: "openai", apiKey: process.env.OPENAI_API_KEY!, model: "gpt-4o"
});
const products = await so.extract(page.text, {
  type: "array", items: {
    type: "object",
    properties: { name: { type: "string" }, price: { type: "number" }, category: { type: "string" } }
  }
});

const csv = new CSVExport();
const csvString = csv.generate(products, {
  columns: ["name", "price", "category"], headers: true
});
$ npx radzor@latest add web-scraper structured-output csv-export

📊 Visualize with radzor graph

After installing components, run radzor graph to see the data-flow DAG. It resolves composability.connectsTo between installed components and warns about cross-runtime connections.

$ npx radzor@latest graph

Component Graph
  [browser] @radzor/audio-capture
  [server]  @radzor/speech-to-text
  [server]  @radzor/llm-completion
  [server]  @radzor/text-to-speech

Data Flow
  @radzor/audio-capture (audioBlob) ──▶ @radzor/speech-to-text (action.transcribe.audio)
    @radzor/speech-to-text (transcriptionResult.text) ──▶ @radzor/llm-completion (action.complete.prompt)
      @radzor/llm-completion (completionResult.content) ──▶ @radzor/text-to-speech (action.synthesize.text)

⚠ Cross-runtime: audio-capture [browser] → speech-to-text [server]

Use --mermaid to export as a Mermaid diagram for docs or READMEs.

💡 For LLMs

With envVar, fields, and mapField, an LLM can auto-wire a full pipeline from manifests alone — no need to read integration.md or source code.

Key fields: inputs[].envVar (env variable names), outputs[].fields (output object shapes), composability.mapField (field extraction), runtime (browser/server/universal).

Browse all recipes