v0.2.11

Gerstep/cybosv0.2.11Aug 25, 2026by github-actions[bot]

AI Summary

Adds support for custom chat models with cloud documents and introduces strict validation for configuration to prevent silent failures. It also ensures proper HTTP status handling for cloud errors.

Key Highlights

  • Support for custom chat models with cloud documents via `PageIndexClient(api_key, chat_model)`.
  • Strict validation for configuration to prevent silent failures or storing blank summaries.
  • Cloud errors now carry their HTTP status codes, and NaN/Infinity metadata is rejected.

Breaking Changes

  • Values that configure nothing (empty strings, whitespace, `{}`) now refuse at construction.

New Features

  • Custom chat model support for cloud documents.
  • Strict configuration validation and error reporting.
  • HTTP status code reporting for cloud errors.

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 now 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 now 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.
- **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_completions()` / `responses()` / `messages()` protocol doors with `doc_id` targeting, streaming, honest usage accounting, and prompt-cache continuity across turns.
- **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.
- **Dependencies**: Python >= 3.10; `openai-agents` in the base install (the chat engine); `[anthropic]` and `[claude]` extras for those SDKs.

## Also in 0.2.11

- **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; `chat()`, `chat_completions()`, `responses()` and `messages()` all work. 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.
- **`index=` / `chat=` slots**: the grouped spelling of the flat arguments — a string shorthand or a dict (`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.
- **Strict validation**: unknown keys, mixed sides, empty values and mode/content conflicts refuse at construction with the legal vocabulary in the message — nothing is silently guessed.
- **Indexing fails loud**: dead credentials or a missing model fail the run instead of storing a document with blank summaries; a context overflow stays a per-prompt failure the run absorbs; all-empty model replies never store a retrieval-ready document.
- **Chat envelopes append verbatim**: `messages()` output goes back into the next request unchanged; Claude cache marks follow the wire routing; `openai_agent_config()` takes `model_settings` and `name`.
- Every cloud error carries its HTTP status; NaN/Infinity metadata is rejected at the gate; the CLI's flash lane resolves `--summary-model` like the other lanes.

Compatibility: values that configure nothing (`""`, whitespace-only strings, `{}`) now refuse at construction; on a cloud client, `api_key` + `chat_model` (or `chat_backend`) selects own-model chat instead of erroring, and `client.retrieve_model = m` does the same.

**Full Changelog**: https://github.com/VectifyAI/PageIndex/compare/v0.2.10...v0.2.11