npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@molecule/api-ai-summarization

v1.0.1

Published

AI text summarization composed over any bonded LLM (@molecule/api-ai), with a swappable provider contract

Readme

@molecule/api-ai-summarization

Auto-generated, AI-first package reference for the molecule.dev ecosystem. It is written to be read by coding agents as much as by people, and is generated from this package's source — edit src/index.ts JSDoc, not this file.

AI summarization for molecule.dev — concise summaries over any bonded LLM.

A core package: it defines the AISummarizationProvider contract and the bond accessor only — zero concrete implementation. The batteries-included default lives in the bond package @molecule/api-ai-summarization-llm, which composes the swappable ai chat bond (@molecule/api-ai). Apps may bond that default or any custom AISummarizationProvider.

Quick Start

import { provider as anthropic } from '@molecule/api-ai-anthropic'
import { requireProvider } from '@molecule/api-ai-summarization'
import { provider } from '@molecule/api-ai-summarization-llm'
import { bond } from '@molecule/api-bond'

// Wire the AI chat provider the default composes, then bond the summarizer.
bond('ai', anthropic)
bond('ai-summarization', provider)

// Use anywhere after startup.
const { summary, usage } = await requireProvider().summarize({
  text: longArticle,
  format: 'bullets',
  maxLength: 60,
  focus: 'the financial impact',
})

Type

core

Installation

npm install @molecule/api-ai-summarization @molecule/api-ai @molecule/api-bond @molecule/api-i18n

API

Interfaces

AISummarizationConfig

Config options for an AI summarization bond.

interface AISummarizationConfig {
  [key: string]: unknown
}

AISummarizationProvider

AI summarization provider interface.

Implemented by the batteries-included default (composing @molecule/api-ai) or by a custom bond package. All implementations return the same normalized SummarizeResult regardless of the LLM behind them.

interface AISummarizationProvider {
  readonly name: string

  /**
   * Summarize the given text.
   *
   * @param input - The source text plus optional shape/length/focus controls.
   * @returns The summary and (when reported) token usage.
   */
  summarize(input: SummarizeInput): Promise<SummarizeResult>
}

SummarizeInput

Input for a summarize request.

interface SummarizeInput {
  /** The source text to summarize. */
  text: string
  /** Approximate target length in words. */
  maxLength?: number
  /** Output shape. Defaults to `'paragraph'`. */
  format?: 'paragraph' | 'bullets' | 'tldr'
  /** Optional angle or extra instructions to steer the summary. */
  focus?: string
  /** AI model override, passed through to the AI provider. */
  model?: string
  /** Named AI provider to use; falls back to the bonded default when omitted. */
  provider?: string
  /** Abort signal to cancel the in-flight AI request. */
  signal?: AbortSignal
}

SummarizeResult

Result of a summarize request.

interface SummarizeResult {
  /** The generated summary. */
  summary: string
  /** Token usage reported by the underlying AI provider, when available. */
  usage?: TokenUsage
}

Functions

getAllProviders()

Retrieves all named AI summarization providers as a Map keyed by name.

function getAllProviders(): Map<string, AISummarizationProvider>

Returns: Map of provider name → AISummarizationProvider.

getProvider()

Retrieves the singleton AI summarization provider, or null if none is bonded.

Falls back to a single named provider when no singleton is bonded — this lets apps that wire bond('ai-summarization', 'fast', provider) directly still work with the simple getProvider() / requireProvider() accessors. When multiple named providers are bonded, the fallback declines (returns null) because the choice is ambiguous.

function getProvider(): AISummarizationProvider | null

Returns: The bonded AI summarization provider, or null.

getProviderByName(name)

Retrieves a named AI summarization provider, or null if not bonded.

function getProviderByName(name: string): AISummarizationProvider | null
  • name — The provider name.

Returns: The named provider, or null.

hasProvider(name)

Checks whether an AI summarization provider is currently bonded.

function hasProvider(name?: string): boolean
  • name — Optional provider name. If omitted, checks the singleton.

Returns: true if the provider is bonded.

requireProvider()

Retrieves the bonded AI summarization provider, throwing if none is bonded.

function requireProvider(): AISummarizationProvider

Returns: The bonded provider.

setProvider(provider)

Registers an AI summarization provider in singleton mode.

  • Singleton: setProvider(provider) — bonds a single default provider.
function setProvider(provider: AISummarizationProvider): void
  • provider — The default provider implementation for this process.

Available Providers

| Provider | Package | | ---------------- | ------------------------------------ | | Ai Summarization | @molecule/api-ai-summarization-llm |

Injection Notes

Requirements

Peer dependencies:

  • @molecule/api-ai ^1.0.1
  • @molecule/api-bond ^1.0.1
  • @molecule/api-i18n ^1.0.1

Runtime Dependencies

  • @molecule/api-ai
  • @molecule/api-bond
  • @molecule/api-i18n

This core imports @molecule/api-ai only as a type (the shared TokenUsage interface on SummarizeResult) — never for runtime use. A provider must be bonded before requireProvider() resolves (it throws otherwise). Swap in a custom AISummarizationProvider via bond('ai-summarization', myProvider) without changing any call site.

E2E Tests

Integration checklist — drive the real UI (live preview, no mocks), adapt each item to this app's actual screens/flows, and check every box off one by one. A box you can't check is an integration bug to fix — not a skip:

  • [ ] Summarizing a real long document through the app's UI returns a summary that is clearly SHORTER than the input and captures its key points — not a truncation of the first N characters, not an echo of the input, not empty. The sandbox has a live AI provider, so this runs for real; the output is non-deterministic, so assert on behavior (it is shorter, the main ideas are present), never on an exact string.
  • [ ] A second, different document yields a genuinely different summary — not the same cached/boilerplate text — confirming each summary reflects the actual input rather than a canned response.
  • [ ] The shape/length controls actually change the output: a smaller maxLength (approx target words) produces a shorter summary than a larger one, and switching format between 'paragraph', 'bullets', and 'tldr' visibly changes the structure (bullets render as a list, tldr is terser). If the app exposes only some of these, verify the ones it exposes.
  • [ ] Edge inputs are handled, not silently mangled: empty or whitespace-only input does not crash and gives a clear "nothing to summarize" response; very long input (beyond the model's limit) either summarizes or fails with a visible, clear message — never a silent truncation that drops half the meaning.
  • [ ] A provider failure (the AI request errors, is rate-limited, or times out) surfaces gracefully in the UI — a readable error, no blank screen, no crash, no uncaught 500.
  • [ ] The summarize call runs server-side only: no AI key or provider secret is ever exposed to the browser. Confirm the request goes to this app's own API and the key never appears in network traffic or the client bundle.