"""
CamelotLLMTableExtractor — Camelot for cell values, LLM for structure.

The integrity contract, and what holds it:

- Camelot's cells are the only value source handed to the LLM stages.
  The emitted table body is markdown written by the unifier (on pages
  with more than one candidate) and then by the structure-correction
  call. No code compares its numbers against Camelot's.
- The LLMs are told not to change numbers by their prompts alone:
  `UNIFY_FLAVORS_PROMPT` in `quber.agents.unifier` and
  `CORRECT_STRUCTURE_PROMPT` in `quber.agents.llm_client`.
- The page PNG raster flows into the unifier and the structure-correction
  call. The table-count check is a separate hook in `quber.core.validate`
  that `quber validate` runs after extraction.

Camelot output from both flavors flows into the classifier (drops
non-tables) and then the unifier (combines the flavor outputs per page).

The package is split by what a reader needs in view at once:

- `orchestrator` — the public face: constructor defaults, deps wiring,
  `extract_tables` / `extract_tables_sync`.
- `pipeline` — the pydantic-graph async graph: edge payload models,
  state/deps, steps, and the builder (the graph topology notes live on
  its module docstring).

The Camelot layer (page rendering, both flavors in spawn-context
subprocesses, content-empty shell detection) is shared with the
correspondence extractor and lives in
`quber.core.extractors.camelot.acquire`.
"""

from quber.core.extractors.camelot.llm.orchestrator import CamelotLLMTableExtractor

__all__ = ["CamelotLLMTableExtractor"]
