- The PageIndex SDK, local or cloud — vectorless, reasoning-based RAG, end to end.
- Much faster indexing — the PageIndex Flash engine gets the tree from layout stats: no LLM involved for the structure generation itself, LLMs only write the node summaries, and tree expansion proposes a wave of nodes concurrently.
client = PageIndexClient()
client.submit_document("report.pdf")
client.chat("What does the report conclude?")Index, to chat, to agent integration, one client.
Local mode needs no server, no vector DB, no PageIndex API key.
Highlights
- Flash engine: the local default (
mode="standard"keeps the classic LLM pipeline). Embedded bookmarks are consumed when trustworthy, and tree optimization is on by default —optimize="merge"for the deterministic LLM-free pass,"full"(default) adds LLM expand, which runs a wave of nodes concurrently instead of one round-trip at a time. - One complete surface, local and cloud:
PageIndexLocalClient(storage_path=...)is the same client as cloud — submit, tree, page content, chat, and agent tools all present in both modes, so code moves between them unchanged. - Cloud documents, your own model:
api_keydecides where your documents live; a configured chat model decides who answers — and the two combine.PageIndexClient(api_key="pi-...", chat_model="openai/gpt-5.2")runs the same in-process document-QA engine over the live cloud tool set. Page content flows through your process to your provider on your credentials;doc_idtargets at the prompt level;enable_citationsstays with the managed chat. - Agent integration: the cloud MCP tool contract, in-process —
client.agent_tools()(plain functions),as_openai_tools(),as_anthropic_tools(),as_claude_mcp(), plus one-callopenai_agent_config()/anthropic_runner_config()/claude_agent_config()bundles andagent_instructions()for the system prompt. Cloud clients get the live server tool set over the MCP bridge (read-only endpoint by default); local clients get the in-process subset with the same schemas and envelopes — agent prompts port unchanged. - Chat surfaces:
chat()— question in, answer out, on any backend;chat(stream=True)shows the run as it happens, thinking and tool calls woven into the text, or as typed events via.events;chat(protocol="responses" | "messages")drives the OpenAI Responses or Anthropic Messages API natively with that protocol's own shapes, andchat_completions()keeps the OpenAI-compatible envelope — all withdoc_idtargeting, streaming, honest usage accounting, and prompt-cache continuity across turns. Transcripts append verbatim: a protocol lane's output goes back into the next request unchanged. - Model & connection knobs:
index_model/chat_model,index_backend/chat_backend(and per-callbackend) passed verbatim to each lane — LiteLLM-routed providers, keyless OpenAI-compatible servers, Azure/Bedrock/Vertex included. index=/chat=slots: the grouped spelling of the flat arguments — a string shorthand or a mapping (index={"model": ..., "storage_path": ...},chat={"model": ..., "backend": ...})."cloud"/"local"name a side, an optionalmode=cross-checks it, andPageIndexLocalClient/PageIndexCloudClienttake the same slots.PageIndexCloudClient()readsPAGEINDEX_API_KEY; a barePageIndexClient()stays local no matter what the environment holds.- Typed config shapes:
IndexConfig/CloudIndexConfig/LocalIndexConfig/ChatConfig, withpy.typedshipped so your type checker sees them. - Nothing fails quietly: unknown keys, mixed sides, empty values and mode/content conflicts refuse at construction with the legal vocabulary in the message; dead credentials or a missing model fail the indexing run instead of storing a document with blank summaries; every cloud error carries its HTTP status.
- Dependencies: Python >= 3.10;
openai-agentsin the base install (the chat engine);[anthropic]and[claude]extras for those SDKs.
Also in 0.2.16
- Cited answers, and a persona that sticks.
chat(citations=True)makes the answer cite every claim the way PageIndex chat does —<cite doc="…" page="…"/>, down to the block on cloud documents with block data — withclient.citation_prompt(format=...)for the bracketed and footnote variants.PageIndexClient(..., instructions="You are ACME's support assistant…")sets standing guidance for the answering agent, appended after the managed prompt on every answer surface and on the*_agent_configbundles. - Targeting is conversation content. The document block now leads the first user message instead of the system prompt, so the cached prefix survives and the target does not stick across turns.
client.document_context(doc_id)hands you that text for conversations you own — BREAKING:doc_idis gone from the eight agent-surface methods. Folders join chat:chat(folder_id=...)andclient.folder_context(folder_id). Also BREAKING:chat()takes keyword arguments aftermessages, andchat(protocol="chat_completions")is the Chat Completions lane's spelling (chat_completions()stays). - A rate-limited tool call fails the run, not the answer. A cloud 429 or 5xx on a tool call retries below the tool layer and then raises
PageIndexAPIErrorwith its status, instead of reaching the model as "try again" text that lands in the answer; an exhausted plan quota surfaces as 402.
Full Changelog: v0.2.15...v0.2.16