pageindex 0.2.10.dev1__tar.gz → 0.2.10.dev2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/PKG-INFO +1 -1
  2. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/client.py +46 -4
  3. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/local_chat.py +27 -2
  4. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pyproject.toml +1 -1
  5. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/LICENSE +0 -0
  6. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/README.md +0 -0
  7. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/__init__.py +0 -0
  8. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/_version.py +0 -0
  9. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/agent_tools.py +0 -0
  10. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/cloud_api.py +0 -0
  11. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/config.yaml +0 -0
  12. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/errors.py +0 -0
  13. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/README.md +0 -0
  14. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/__init__.py +0 -0
  15. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/api.py +0 -0
  16. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/blocks/__init__.py +0 -0
  17. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/blocks/build.py +0 -0
  18. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/blocks/join_rules.py +0 -0
  19. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/classification/__init__.py +0 -0
  20. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/classification/body_text.py +0 -0
  21. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/classification/header_footer.py +0 -0
  22. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/classification/keyword_tables.py +0 -0
  23. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/classification/toc_boilerplate.py +0 -0
  24. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/clustering/__init__.py +0 -0
  25. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/clustering/build.py +0 -0
  26. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/clustering/merge_rules.py +0 -0
  27. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/columns/__init__.py +0 -0
  28. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/columns/gutters.py +0 -0
  29. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/columns/splitting.py +0 -0
  30. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/data/boilerplate_phrases.json +0 -0
  31. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/data/dictionaries.json +0 -0
  32. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/data/glyph_name_table.json +0 -0
  33. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/data/normalized_unicodes.json +0 -0
  34. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/data/script_bucket_table.json +0 -0
  35. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/embedded_toc.py +0 -0
  36. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/heading_detection/__init__.py +0 -0
  37. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/heading_detection/candidates.py +0 -0
  38. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/heading_detection/detectors.py +0 -0
  39. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/heading_detection/keyword_tables.py +0 -0
  40. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/heading_detection/neighbors.py +0 -0
  41. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/heading_detection/page_scan.py +0 -0
  42. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/heading_detection/style_detectors.py +0 -0
  43. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/heading_detection/text_checks.py +0 -0
  44. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/labels/__init__.py +0 -0
  45. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/labels/caption_regions.py +0 -0
  46. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/labels/caption_text.py +0 -0
  47. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/main.py +0 -0
  48. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/model/__init__.py +0 -0
  49. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/model/block.py +0 -0
  50. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/model/char_stats.py +0 -0
  51. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/model/numbering.py +0 -0
  52. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/model/rects.py +0 -0
  53. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/model/span_line.py +0 -0
  54. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/outline/__init__.py +0 -0
  55. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/outline/filtering.py +0 -0
  56. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/outline/tree.py +0 -0
  57. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/outline_assembly/__init__.py +0 -0
  58. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/outline_assembly/assembly.py +0 -0
  59. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/outline_assembly/candidates.py +0 -0
  60. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/outline_assembly/cliques.py +0 -0
  61. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/outline_assembly/selection.py +0 -0
  62. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/outline_assembly/style_context.py +0 -0
  63. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/parser_pdfium_charlevel/__init__.py +0 -0
  64. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/parser_pdfium_charlevel/char_extract.py +0 -0
  65. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/parser_pdfium_charlevel/cmap_parse.py +0 -0
  66. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/parser_pdfium_charlevel/code_walk.py +0 -0
  67. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/parser_pdfium_charlevel/content_stream.py +0 -0
  68. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/parser_pdfium_charlevel/font_unicode.py +0 -0
  69. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/parser_pdfium_charlevel/geometry.py +0 -0
  70. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/parser_pdfium_charlevel/glyph_tables.py +0 -0
  71. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/parser_pdfium_charlevel/merge.py +0 -0
  72. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/parser_pdfium_charlevel/pdf_objects.py +0 -0
  73. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/parser_pdfium_charlevel/pipeline.py +0 -0
  74. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/parser_pdfium_charlevel/remerge.py +0 -0
  75. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/parser_pdfium_charlevel/text_normalize.py +0 -0
  76. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/parser_pdfium_charlevel/unicode_apply.py +0 -0
  77. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/parser_pdfium_parallel.py +0 -0
  78. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/phases/__init__.py +0 -0
  79. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/phases/line_numbers.py +0 -0
  80. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/phases/page_view.py +0 -0
  81. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/stats/__init__.py +0 -0
  82. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/stats/aggregates.py +0 -0
  83. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/stats/scripts.py +0 -0
  84. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/title/__init__.py +0 -0
  85. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/title/detect.py +0 -0
  86. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/title/dicts.py +0 -0
  87. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/title/scoring.py +0 -0
  88. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/tokens/__init__.py +0 -0
  89. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/tokens/hashing.py +0 -0
  90. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/tokens/token_types.py +0 -0
  91. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/tokens/tokenizer.py +0 -0
  92. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/flash/tokens/tries.py +0 -0
  93. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/integrations/__init__.py +0 -0
  94. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/integrations/anthropic_sdk.py +0 -0
  95. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/integrations/claude_agent_sdk.py +0 -0
  96. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/integrations/openai_agents.py +0 -0
  97. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/local_api.py +0 -0
  98. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/local_store.py +0 -0
  99. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/mcp_bridge.py +0 -0
  100. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/page_index_classic.py +0 -0
  101. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/page_index_md.py +0 -0
  102. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/tree_optimize.py +0 -0
  103. {pageindex-0.2.10.dev1 → pageindex-0.2.10.dev2}/pageindex/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pageindex
3
- Version: 0.2.10.dev1
3
+ Version: 0.2.10.dev2
4
4
  Summary: Python SDK for PageIndex — reasoning-based, vectorless document retrieval, cloud and local
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
  import os
5
5
  import time
6
6
  import warnings
7
- from typing import Any, Callable, Iterator, Optional, Union
7
+ from typing import Any, Callable, Iterator, Optional, Union, cast
8
8
 
9
9
  from .errors import PageIndexAPIError
10
10
 
@@ -345,7 +345,44 @@ class PageIndexClient:
345
345
  "favor of chat completions; use chat_completions instead."
346
346
  ).get_retrieval(retrieval_id=retrieval_id)
347
347
 
348
- # ---------- CHAT COMPLETIONS ----------
348
+ # ---------- CHAT ----------
349
+
350
+ def chat(
351
+ self,
352
+ messages: Union[str, list[dict[str, str]]],
353
+ doc_id: Optional[Union[str, list[str]]] = None,
354
+ stream: bool = False,
355
+ model: Optional[str] = None,
356
+ ) -> Union[str, Iterator[str]]:
357
+ """
358
+ Ask a question about your documents, get the answer.
359
+
360
+ Thin sugar over ``chat_completions()`` in both modes — same
361
+ engine, same wire, minus the envelope. Multi-turn: keep your own
362
+ role/content list of the visible conversation (append each answer
363
+ as an assistant message) and pass it back. For usage accounting,
364
+ streaming metadata, or the tool-use process, use the protocol
365
+ surfaces: ``chat_completions()``, ``responses()``, ``messages()``.
366
+
367
+ Args:
368
+ messages: A question string, or role/content conversation
369
+ history.
370
+ doc_id: Document ID or list of IDs to scope the conversation.
371
+ Keep it identical across a conversation's calls.
372
+ stream: Yield the answer as text chunks as it is produced.
373
+ model: Local only — backend model name (defaults to
374
+ ``retrieve_model``).
375
+
376
+ Returns:
377
+ - stream=False: the answer string
378
+ - stream=True: iterator of text chunks
379
+ """
380
+ result = self.chat_completions(messages, stream=stream,
381
+ doc_id=doc_id, model=model)
382
+ if stream:
383
+ return cast(Iterator[str], result)
384
+ envelope = cast(dict[str, Any], result)
385
+ return envelope["choices"][0]["message"]["content"] or ""
349
386
 
350
387
  def chat_completions(
351
388
  self,
@@ -368,7 +405,9 @@ class PageIndexClient:
368
405
  backend, so any OpenAI-compatible server works; a ``/`` in the
369
406
  model name means LiteLLM provider routing, so prefix ``openai/``
370
407
  when the backend itself serves slashed ids, e.g.
371
- ``openai/Qwen/...`` on vLLM). The non-stream
408
+ ``openai/Qwen/...`` on vLLM; LiteLLM-routed Claude models —
409
+ Anthropic direct, Bedrock, Vertex — get the managed prompt
410
+ prefix cache-marked automatically). The non-stream
372
411
  response carries the final answer only; streaming yields the
373
412
  agent's visible text as it is produced, including narration before
374
413
  tool calls. ``finish_reason`` reports loop completion ("stop") —
@@ -380,7 +419,10 @@ class PageIndexClient:
380
419
  messages: Conversation messages with 'role' and 'content' keys,
381
420
  or a bare query string (it becomes a single user message).
382
421
  Local also accepts system/developer messages — their content
383
- is appended to the managed system prompt.
422
+ is appended to the managed system prompt. Local takes text
423
+ history only: tool-role turns are rejected (the cloud
424
+ endpoint forwards them verbatim), and message fields beyond
425
+ role/content are dropped.
384
426
  stream: Enable streaming responses.
385
427
  doc_id: Document ID or list of IDs to scope the conversation.
386
428
  Keep it identical across a conversation's calls — the
@@ -206,7 +206,8 @@ def _require_openai_agents(method: str) -> None:
206
206
  except ImportError as exc:
207
207
  raise PageIndexAPIError(
208
208
  f"{method} in local mode requires the OpenAI Agents SDK — "
209
- "pip install openai-agents (or pip install 'pageindex[openai]')."
209
+ "pip install openai-agents (or pip install 'pageindex[openai]'). "
210
+ "messages() runs on the anthropic extra instead."
210
211
  ) from exc
211
212
 
212
213
 
@@ -271,6 +272,29 @@ def _reported_model(model_name: str) -> str:
271
272
  return model_name.removeprefix("litellm/").removeprefix("openai/")
272
273
 
273
274
 
275
+ def _cache_extra_args(model_name: str) -> Optional[dict]:
276
+ """Claude's prompt caching is opt-in per request: on Claude models
277
+ routed through LiteLLM (Anthropic direct, Bedrock, Vertex — each
278
+ channel live-verified), mark the managed system prefix via LiteLLM's
279
+ injection param so the loop's later turns and a conversation's next
280
+ calls read it instead of repaying full price. Provider resolution is
281
+ LiteLLM's own, so this predicate can never disagree with where the
282
+ request actually routes."""
283
+ if "/" not in model_name or model_name.startswith("openai/"):
284
+ return None
285
+ try:
286
+ from litellm import get_llm_provider
287
+ model, provider, _, _ = get_llm_provider(
288
+ model=model_name.removeprefix("litellm/"))
289
+ except Exception:
290
+ return None
291
+ if provider == "anthropic" or (provider in ("bedrock", "vertex_ai")
292
+ and "claude" in model.lower()):
293
+ return {"cache_control_injection_points": [
294
+ {"location": "message", "role": "system"}]}
295
+ return None
296
+
297
+
274
298
  def _openai_agent(client, protocol: str, model_name: str, instructions: str,
275
299
  temperature, top_p, doc_ids=None):
276
300
  from agents import Agent, ModelSettings
@@ -280,7 +304,8 @@ def _openai_agent(client, protocol: str, model_name: str, instructions: str,
280
304
  instructions=instructions,
281
305
  tools=build_openai_tools(client, doc_ids=doc_ids),
282
306
  model=_openai_model(protocol, model_name),
283
- model_settings=ModelSettings(temperature=temperature, top_p=top_p),
307
+ model_settings=ModelSettings(temperature=temperature, top_p=top_p,
308
+ extra_args=_cache_extra_args(model_name)),
284
309
  )
285
310
 
286
311
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pageindex"
3
- version = "0.2.10.dev1"
3
+ version = "0.2.10.dev2"
4
4
  description = "Python SDK for PageIndex — reasoning-based, vectorless document retrieval, cloud and local"
5
5
  readme = "README.md"
6
6
  license = "MIT"
File without changes