Skip to content

Generating Text

generateText is the non-streaming counterpart to streamText. It calls model.doGenerate() and returns an Observable<TextResult> that emits a single complete response. Use it when you need the full answer at once — background processing, data extraction, classification, or any task where streaming to the UI is not needed.

import { generateText } from "rxjs-ai";
generateText({
model: myModel,
messages: [{ role: "user", content: [{ type: "text", text: "Summarize this document." }] }],
}).subscribe((result) => {
console.log(result.text);
});
import { generateText, type LanguageModel, type Message } from "rxjs-ai";
const messages: Message[] = [
{ role: "user", content: [{ type: "text", text: "What is 2 + 2?" }] },
];
generateText({ model, messages }).subscribe((result) => {
console.log("Text:", result.text);
console.log("Tokens used:", result.usage.totalTokens);
console.log("Finish reason:", result.finishReason);
});
OptionTypeDefaultDescription
modelLanguageModelRequiredThe language model to use.
messagesreadonly Message[]RequiredThe conversation messages to send.
systemstringundefinedSystem prompt prepended to the conversation.
temperaturenumberundefinedSampling temperature (0–2).
maxTokensnumberundefinedMaximum tokens to generate.
topPnumberundefinedNucleus sampling threshold.
topKnumberundefinedTop-k sampling limit.
stopSequencesreadonly string[]undefinedSequences that stop generation.
signalAbortSignalundefinedSignal for external cancellation.

Observable<TextResult> — emits a single value and completes.

PropertyTypeDescription
textstringThe complete generated text.
usageTokenUsageToken counts (prompt, completion, total).
finishReasonFinishReasonWhy generation stopped: "stop", "length", "tool-calls", "error", or "unknown".
messagesreadonly Message[]The conversation including the assistant’s response.
const controller = new AbortController();
generateText({
model,
messages,
signal: controller.signal,
}).subscribe({
next: (result) => console.log(result.text),
error: (err) => {
if (err.name === "AbortError") {
console.log("Request cancelled");
}
},
});
// Cancel if it takes too long
setTimeout(() => controller.abort(), 5000);

Because generateText returns a standard Observable, all RxJS operators work naturally.

import { retry } from "rxjs";
generateText({ model, messages })
.pipe(retry(2))
.subscribe({
next: (result) => console.log(result.text),
error: (err) => console.error("Failed after 3 attempts:", err),
});
import { map } from "rxjs";
generateText({ model, messages })
.pipe(map((result) => result.text.toUpperCase()))
.subscribe((uppercased) => console.log(uppercased));
import { catchError } from "rxjs";
generateText({ model: primaryModel, messages }).pipe(
catchError(() => generateText({ model: fallbackModel, messages })),
).subscribe((result) => {
console.log(result.text);
});
import { from, switchMap } from "rxjs";
const prompts = ["Summarize chapter 1", "Summarize chapter 2", "Summarize chapter 3"];
from(prompts).pipe(
switchMap((prompt) =>
generateText({
model,
messages: [{ role: "user", content: [{ type: "text", text: prompt }] }],
}),
),
).subscribe((result) => {
console.log(result.text);
});
interface TextResult {
readonly text: string;
readonly usage: TokenUsage;
readonly finishReason: FinishReason;
readonly messages: readonly Message[];
}
interface TokenUsage {
readonly promptTokens: number;
readonly completionTokens: number;
readonly totalTokens: number;
}
type FinishReason = "stop" | "length" | "tool-calls" | "error" | "unknown";
generateTextstreamText
ReturnsObservable<TextResult>StreamTextResult with stream$, text$, delta$
EmissionsSingle (complete response)Multiple (one per token)
Best forBackground tasks, data extraction, batch processingReal-time UI, chat, live previews
Model methoddoGenerate()doStream()