Why LlamaIndex + Tabstack
Adding web access to an agent usually means writing your own fetch and parse code. @tabstack/llamaindex replaces that with a hosted API exposed as native LlamaIndex tools: schema-enforced output, server-side rendering of JS-heavy pages, and one key for extraction, research, generation, and automation.
Quickstart
Install the adapter and set your key:
npm install @tabstack/llamaindex llamaindex zod
export TABSTACK_API_KEY="your-key-here"
llamaindex (v0.12 or later) and zod are peer dependencies. The tools come pre-built as an array, so pass them straight to an agent:
import { tabstackTools } from "@tabstack/llamaindex";
import { agent } from "@llamaindex/workflow";
import { openai } from "@llamaindex/openai";
import { Settings } from "llamaindex";
Settings.llm = openai({ model: "gpt-4o" });
const researcher = agent({ tools: tabstackTools });
const result = await researcher.run(
"What are Vercel's current pricing plans? Cite your sources.",
);
console.log(result.data);
The tools resolve TABSTACK_API_KEY lazily on first call, so importing the package never requires a key.
For a custom key, base URL, or a shared client, build the tools explicitly:
import { createTabstackLlamaindexTools } from "@tabstack/llamaindex";
const tools = createTabstackLlamaindexTools({ apiKey: process.env.MY_KEY });
// or pass an SDK client you already have: createTabstackLlamaindexTools({ client })
The tools
| Export | Tool name | What it does |
|---|---|---|
extractStructuredDataTool |
extract_structured_data |
Pull specific fields from a URL into a JSON shape you define. |
extractPageContentTool |
extract_page_content |
Fetch a page as clean Markdown. |
researchQuestionTool |
research_question |
Synthesized answer with cited sources across multiple pages. |
generateStructuredDataTool |
generate_structured_data |
Fetch a page, then AI-transform it into derived or reshaped JSON. |
automateBrowserTaskTool |
automate_browser_task |
Run a multi-step, natural-language browser task. |
Import individual tools for a subset, or use the tabstackTools array for all of them. The names stay in lockstep with the @tabstack/langchain, @tabstack/ai, @tabstack/eve, and Python langchain-tabstack packages.
Good to know
automate_browser_taskruns non-interactively. It does not pause for human-in-the-loop form input, so it does not wait on a person. It returns the final answer plus the data it extracted and the pages it visited.- Failed calls throw
TabstackToolError, a normalized message plus an HTTPstatusfor API errors. LlamaIndex surfaces this in the tool result. - Inputs are validated against the core Zod schema, since LlamaIndex passes the schema straight through as the tool’s
parameters, so malformed model output is caught before the call runs. - Zod 3 and Zod 4 both work. LlamaIndex’s
tool()is Zod-native and accepts either, and your app’s own Zod version is used.
Common use cases
- Replace a brittle web loader with a hosted API that returns the shape you asked for.
- Give a LlamaIndex agent cited, multi-source research over live pages.
- Read a specific URL as clean Markdown for indexing or summarization.
- Keep tool names consistent across your TypeScript and Python agents.