v0.2.16
the-dev-tools/dev-toolsv0.2.16Sep 10, 2026by github-actions[bot]
Upgrading?
AI Summary
Introduces cited answers with a persistent persona system and restructures targeting to conversation content.
Key Highlights
- Cited answers with `chat(citations=True)` and customizable citation prompts.
- Persistent persona/standing guidance via `instructions`.
- Targeting logic shifted to conversation content rather than system prompts.
Breaking Changes
- `doc_id` removed from eight agent-surface methods
- `chat()` now takes keyword arguments after `messages`
New Features
- `citation_prompt(format=...)` for bracketed and footnote variants
- `document_context(doc_id)` to retrieve conversation context
- Folder support for chat via `chat(folder_id=...)` and `client.folder_context(folder_id)`
Full Release Notes
- 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.
```python
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_key` decides 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_id` targets at the prompt level; `enable_citations` stays 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-call `openai_agent_config()` / `anthropic_runner_config()` / `claude_agent_config()` bundles and `agent_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, and `chat_completions()` keeps the OpenAI-compatible envelope — all with `doc_id` targeting, 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-call `backend`) 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 optional `mode=` cross-checks it, and `PageIndexLocalClient` / `PageIndexCloudClient` take the same slots. `PageIndexCloudClient()` reads `PAGEINDEX_API_KEY`; a bare `PageIndexClient()` stays local no matter what the environment holds.
- **Typed config shapes**: `IndexConfig` / `CloudIndexConfig` / `LocalIndexConfig` / `ChatConfig`, with `py.typed` shipped 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-agents` in 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 — with `client.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_config` bundles.
- **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_id` is gone from the eight agent-surface methods. Folders join chat: `chat(folder_id=...)` and `client.folder_context(folder_id)`. Also BREAKING: `chat()` takes keyword arguments after `messages`, and `chat(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 `PageIndexAPIError` with 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**: https://github.com/VectifyAI/PageIndex/compare/v0.2.15...v0.2.16
Related Repositories
ollama/ollama★ 184,201
Get up and running with Kimi, GLM, MiniMax, DeepSeek, gpt-oss, Qwen, Gemma and other models.
fatedier/frp★ 110,049
A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.
asheshgoplani/agent-deck★ 102,148
Terminal session manager for AI coding agents. One TUI for Claude, Gemini, OpenCode, Codex, and more.
infiniflow/ragflow★ 92,610
RAGFlow is a leading open-source Retrieval-Augmented Generation (RAG) engine that fuses cutting-edge RAG with Agent capabilities to create a superior context layer for LLMs
gohugoio/hugo★ 90,198
The world’s fastest framework for building websites.