Edit on GitHub
Example7 min read

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.