Skip to main content

Examples

These examples are meant to be adapted into real applications, not only read as API snippets.

1. Structured Extraction

Use this when your app needs predictable JSON rather than prose.

const chain = prompt.pipe(model).pipe(parser);
const result = await chain.invoke({ ticket: "Payment failed twice" });

Good fits:

  • support ticket triage
  • document metadata extraction
  • moderation labels

2. Input Enrichment With RunnableMap

Use this when one raw input needs to become several prompt variables.

const inputMap = new RunnableMap({
topic: new RunnableLambda(({ topic }) => topic.trim()),
tone: new RunnableLambda(() => "concise")
});

Good fits:

  • normalizing user input
  • injecting defaults
  • combining user data with app policy

3. Independent Branches With RunnableParallel

Use this when multiple calculations can happen from the same input without waiting on one another.

const parallel = new RunnableParallel({
length: new RunnableLambda((text: string) => text.length),
upper: new RunnableLambda((text: string) => text.toUpperCase())
});

Good fits:

  • feature extraction
  • side-by-side scoring
  • parallel preprocessing

4. Tool-Based Agent

Use Agent + tool(...) when the model may need external information before it can answer.

Good fits:

  • weather lookup
  • CRM lookup
  • calendar or ticket actions

Prefer a chain-only design until your task truly needs tool choice or a reasoning loop.

5. Choosing Between Chain And Agent

ScenarioBetter Fit
summarize text into JSONchain
classify support ticketschain
answer using a fixed retrieved contextchain
decide whether to call weather or searchagent
execute multi-step tool workflowsagent

6. Workflow + Agent Together

Use this pattern when you want deterministic orchestration around an agent loop.

import { z } from "zod";
import { Agent, Workflow, tool } from "@ai-agent-framework/core";
import { openai } from "@ai-agent-framework/openai";

const searchTool = tool({
name: "searchDocs",
description: "Search internal docs for an answer",
schema: z.object({ query: z.string() }),
async execute({ query }) {
return { query, hits: ["doc-1", "doc-2"] };
}
});

const agent = new Agent({
model: openai({ model: "gpt-4o-mini" }),
tools: [searchTool],
maxSteps: 8,
hooks: {
onStart(state) {
console.log("agent started", { steps: state.steps });
},
onEnd(_state, result) {
console.log("agent finished", { chars: result.length });
}
}
});

const workflow = new Workflow({
steps: [
{
id: "normalize-input",
run: (input: string) => input.trim()
},
{
id: "agent-answer",
run: async (normalized: string) => agent.run(normalized)
},
{
id: "attach-metadata",
run: (answer: string) => ({
answer,
generatedAt: Date.now()
})
}
]
});

const result = await workflow.run(" Find rollout risks for release ");
console.log(result.output);
console.log(result.snapshots.length);

Why this works well:

  • Workflow handles step orchestration and resume state
  • Agent handles tool-choice and iterative reasoning
  • hooks make instrumentation straightforward