Summarization
Complete examples for document summarization with the Vault SDK. Covers single-document summarization, chunking long documents, and returning structured output with Zod.
Overview
BasicSingle prompt, single response. Best for documents under 4k tokens.
ChunkedSplit long documents into chunks, summarize each, then reduce to a final summary.
StructuredReturn a typed summary object with title, bullets, and sentiment via Zod schema.
Basic Example
app/actions/summarize.ts
'use server';
import { vault } from '@/lib/vault';
export async function summarize(text: string): Promise<string> {
const result = await vault.infer({
model: 'vault-3-turbo',
prompt: `Summarize the following in 2–3 sentences. \
Be concise and factual. No bullet points.\n\n${text}`,
maxTokens: 200,
});
return result.text;
}Chunked Documents
For long documents, split into chunks, summarize each, then reduce with a final summarization pass.
lib/summarize-long.ts
import { vault } from '@/lib/vault';
function chunkText(text: string, maxChars = 3000): string[] {
const sentences = text.split(/(?<=[.!?])\s+/);
const chunks: string[] = [];
let current = '';
for (const s of sentences) {
if ((current + s).length > maxChars) {
if (current) chunks.push(current.trim());
current = s;
} else {
current += ' ' + s;
}
}
if (current) chunks.push(current.trim());
return chunks;
}
export async function summarizeLong(text: string): Promise<string> {
const chunks = chunkText(text);
// Summarize each chunk
const chunkSummaries = await Promise.all(
chunks.map((chunk) =>
vault.infer({
model: 'vault-3-turbo',
prompt: `Summarize this section in 1–2 sentences:\n\n${chunk}`,
maxTokens: 100,
}).then((r) => r.text)
)
);
// Final reduce pass
const combined = chunkSummaries.join('\n');
const final = await vault.infer({
model: 'vault-3-turbo',
prompt: `Combine these section summaries into a coherent 3-sentence summary:\n\n${combined}`,
maxTokens: 200,
});
return final.text;
}Structured Output
Return a typed object by asking the model to respond in JSON and parsing it with Zod.
lib/summarize-structured.ts
import { z } from 'zod';
import { vault } from '@/lib/vault';
const SummarySchema = z.object({
title: z.string(),
bullets: z.array(z.string()).max(5),
sentiment: z.enum(['positive', 'neutral', 'negative']),
});
export type Summary = z.infer<typeof SummarySchema>;
export async function summarizeStructured(text: string): Promise<Summary> {
const result = await vault.infer({
model: 'vault-3-pro',
prompt: `Summarize this document as JSON matching this schema exactly:
{ "title": string, "bullets": string[], "sentiment": "positive"|"neutral"|"negative" }
Document:
${text}`,
maxTokens: 300,
});
const json = JSON.parse(result.text);
return SummarySchema.parse(json);
}Use vault-3-pro for structured output tasks. It follows format instructions more reliably than vault-3-turbo.