Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

LLM and agent-driven analytics

<perspective-viewer> ships with an embedded LLM agent. A user types “show me monthly revenue by region as a stacked bar, top five only”, and the agent reads the table’s schema, writes the view configuration, authors any computed columns it needs, picks the chart, and applies it — through the same public API your own code would use.

It is opt-in. The Chat tab stays hidden and no network request is made until you configure a model:

import { providers } from "@perspective-dev/viewer";

const viewer = document.querySelector("perspective-viewer");
viewer.agentConfig({
    ...providers.anthropic,
    apiKey: "sk-ant-...",
});

Why an agent fits Perspective

An LLM is good at translating intent into a small, structured configuration, and unreliable at arithmetic over data it has to read. Perspective’s configuration is exactly that kind of target: a complete analysis — grouping, column splits, aggregates, filters, sorts, expressions, chart type — is a few lines of JSON, and the numbers are computed by the engine, not the model.

  • The agent’s tools read the table’s schema and the viewer’s configuration — none of them read rows, so your data is not sent to the model.
  • Every answer is an ordinary, inspectable viewer configuration. The user can see exactly what was grouped and filtered, adjust it by hand, and save it.
  • Because the engine is incremental, an agent-built view over streaming data keeps updating after the conversation ends.

Any model, including local ones

The agent speaks the OpenAI chat-completions convention, so it works with Anthropic, OpenAI, Gemini and OpenRouter endpoints, with local servers such as Ollama, LM Studio, llama.cpp and vLLM, and with in-page engines such as WebLLM — in which case the data, the query engine and the model all run inside the browser tab.

Keys and production use

A key passed to agentConfig is a key in the browser. That is fine for local development and internal tools; for anything shared, point url at a proxy you control and keep the credential on the server. See Configuring the LLM agent for the full connection options.

Driving Perspective from your own agent

The agent uses no private hooks. restore(), save(), Table.schema() and View are the complete surface, and a view configuration is plain JSON — so an external agent, a notebook assistant or an MCP tool can produce the same results by emitting a ViewerConfig. The guide is published for that purpose as Markdown at /llms.txt and /llms-full.txt.