From fe70436a5cb99d4e8a0481f70178c597ee3d00d6 Mon Sep 17 00:00:00 2001 From: Vikram Oberoi Date: Fri, 15 May 2026 16:01:30 -0400 Subject: [PATCH 1/5] add extraction_mode to ExtractOptions New parameter: extraction_mode ("balanced" or "accurate"). Controls the extraction pipeline independently from mode (which controls parsing). When not set, the API defaults to balanced. Accurate mode returns per-field verification metadata including extraction_status, reasoning, citations, and verification feedback. Co-Authored-By: Claude Opus 4.6 (1M context) --- datalab_sdk/models.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/datalab_sdk/models.py b/datalab_sdk/models.py index 1757b7c..d845205 100644 --- a/datalab_sdk/models.py +++ b/datalab_sdk/models.py @@ -83,7 +83,8 @@ class ExtractOptions(ProcessingOptions): schema_id: Optional[str] = None # ID of a saved extraction schema (e.g. sch_k8Hx9mP2nQ4v). Mutually exclusive with page_schema. schema_version: Optional[int] = None # Version of the schema. Only valid with schema_id. checkpoint_id: Optional[str] = None # From previous /convert with save_checkpoint=true - mode: str = "fast" # fast, balanced, accurate + mode: str = "fast" # Parse mode: fast, balanced, accurate + extraction_mode: Optional[str] = None # Extraction mode: "balanced" (default) or "accurate" output_format: str = "markdown" # markdown, json, html, chunks save_checkpoint: bool = False webhook_url: Optional[str] = None @@ -94,6 +95,9 @@ def to_form_data(self) -> Dict[str, Any]: # When using schema_id, suppress the empty default page_schema if self.schema_id and not self.page_schema: form_data.pop("page_schema", None) + # Only send extraction_mode if explicitly set + if self.extraction_mode is None: + form_data.pop("extraction_mode", None) return form_data From f4e93fcb036e711ad677b7b54b3f5f29bb96b9b5 Mon Sep 17 00:00:00 2001 From: Vikram Oberoi Date: Thu, 4 Jun 2026 10:07:15 -0400 Subject: [PATCH 2/5] extraction: update extraction_mode values to fast/balanced extraction_mode is now "fast" (single-pass) or "balanced" (multi-pass, default); "accurate" removed. Default resolved server-side when unset. Co-Authored-By: Claude Opus 4.8 (1M context) --- datalab_sdk/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datalab_sdk/models.py b/datalab_sdk/models.py index d845205..cdb9bb7 100644 --- a/datalab_sdk/models.py +++ b/datalab_sdk/models.py @@ -84,7 +84,7 @@ class ExtractOptions(ProcessingOptions): schema_version: Optional[int] = None # Version of the schema. Only valid with schema_id. checkpoint_id: Optional[str] = None # From previous /convert with save_checkpoint=true mode: str = "fast" # Parse mode: fast, balanced, accurate - extraction_mode: Optional[str] = None # Extraction mode: "balanced" (default) or "accurate" + extraction_mode: Optional[str] = None # Extraction mode: "fast" (single-pass) or "balanced" (multi-pass, default). Resolved server-side when unset. output_format: str = "markdown" # markdown, json, html, chunks save_checkpoint: bool = False webhook_url: Optional[str] = None From 94cc6d01e11dff090eb88cb74e347cbca6b5ae79 Mon Sep 17 00:00:00 2001 From: Vikram Oberoi Date: Thu, 4 Jun 2026 10:22:16 -0400 Subject: [PATCH 3/5] extraction: remove pass-count wording from extraction_mode doc Co-Authored-By: Claude Opus 4.8 (1M context) --- datalab_sdk/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datalab_sdk/models.py b/datalab_sdk/models.py index cdb9bb7..2507461 100644 --- a/datalab_sdk/models.py +++ b/datalab_sdk/models.py @@ -84,7 +84,7 @@ class ExtractOptions(ProcessingOptions): schema_version: Optional[int] = None # Version of the schema. Only valid with schema_id. checkpoint_id: Optional[str] = None # From previous /convert with save_checkpoint=true mode: str = "fast" # Parse mode: fast, balanced, accurate - extraction_mode: Optional[str] = None # Extraction mode: "fast" (single-pass) or "balanced" (multi-pass, default). Resolved server-side when unset. + extraction_mode: Optional[str] = None # Extraction mode: "fast" or "balanced" (default). Resolved server-side when unset. output_format: str = "markdown" # markdown, json, html, chunks save_checkpoint: bool = False webhook_url: Optional[str] = None From a5747109cc800a33cf21b4554fc764edf7f32277 Mon Sep 17 00:00:00 2001 From: Vikram Oberoi Date: Thu, 4 Jun 2026 10:23:51 -0400 Subject: [PATCH 4/5] extraction: document extraction_mode default as balanced Co-Authored-By: Claude Opus 4.8 (1M context) --- datalab_sdk/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datalab_sdk/models.py b/datalab_sdk/models.py index 2507461..79ed19c 100644 --- a/datalab_sdk/models.py +++ b/datalab_sdk/models.py @@ -84,7 +84,7 @@ class ExtractOptions(ProcessingOptions): schema_version: Optional[int] = None # Version of the schema. Only valid with schema_id. checkpoint_id: Optional[str] = None # From previous /convert with save_checkpoint=true mode: str = "fast" # Parse mode: fast, balanced, accurate - extraction_mode: Optional[str] = None # Extraction mode: "fast" or "balanced" (default). Resolved server-side when unset. + extraction_mode: Optional[str] = None # Extraction mode: "fast" or "balanced". Defaults to "balanced". output_format: str = "markdown" # markdown, json, html, chunks save_checkpoint: bool = False webhook_url: Optional[str] = None From dbed06ef74f5e54a0bab3f2bdb679468aa1ac647 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 13 Jul 2026 10:31:15 +0000 Subject: [PATCH 5/5] SDK audit update (20260713-103115) --- datalab_sdk/client.py | 3 +++ datalab_sdk/models.py | 9 +++++++-- uv.lock | 4 ++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/datalab_sdk/client.py b/datalab_sdk/client.py index f57e1bc..9d55099 100644 --- a/datalab_sdk/client.py +++ b/datalab_sdk/client.py @@ -427,6 +427,9 @@ def _build_conversion_result(self, result_data: Dict[str, Any], default_format: runtime=result_data.get("runtime"), cost_breakdown=result_data.get("cost_breakdown"), evaluation=result_data.get("evaluation"), + extraction_score_average=result_data.get("extraction_score_average"), + extraction_mode=result_data.get("extraction_mode"), + segmentation_schema=result_data.get("segmentation_schema"), ) async def _submit_and_poll( diff --git a/datalab_sdk/models.py b/datalab_sdk/models.py index 79ed19c..003c57d 100644 --- a/datalab_sdk/models.py +++ b/datalab_sdk/models.py @@ -54,6 +54,7 @@ class ConvertOptions(ProcessingOptions): include_markdown_in_chunks: bool = False # include markdown field in chunks/JSON output token_efficient_markdown: bool = False # optimize markdown for LLM token usage eval_rubric_id: Optional[int] = None # run evaluation rubric after conversion + word_bboxes: bool = False # predict per-word bounding boxes with confidence scores (HTML only) def to_form_data(self) -> Dict[str, Any]: """Convert to form data format for API requests""" @@ -83,8 +84,8 @@ class ExtractOptions(ProcessingOptions): schema_id: Optional[str] = None # ID of a saved extraction schema (e.g. sch_k8Hx9mP2nQ4v). Mutually exclusive with page_schema. schema_version: Optional[int] = None # Version of the schema. Only valid with schema_id. checkpoint_id: Optional[str] = None # From previous /convert with save_checkpoint=true - mode: str = "fast" # Parse mode: fast, balanced, accurate - extraction_mode: Optional[str] = None # Extraction mode: "fast" or "balanced". Defaults to "balanced". + mode: Optional[str] = None # Parse mode: fast, balanced, accurate. When None, defaults to 'accurate' for balanced extraction and 'fast' otherwise. + extraction_mode: Optional[str] = None # Extraction mode: "turbo", "fast", or "balanced". Defaults to "balanced". output_format: str = "markdown" # markdown, json, html, chunks save_checkpoint: bool = False webhook_url: Optional[str] = None @@ -163,6 +164,7 @@ class FormFillingOptions(ProcessingOptions): field_data: Dict[str, Dict[str, str]] = field(default_factory=dict) context: Optional[str] = None # Optional context to guide form filling confidence_threshold: float = 0.5 # Minimum confidence for field matching (0.0-1.0) + webhook_url: Optional[str] = None # Optional webhook URL to call when the request is complete def to_form_data(self) -> Dict[str, Any]: """Convert to form data format for API requests""" @@ -206,6 +208,9 @@ class ConversionResult: runtime: Optional[float] = None cost_breakdown: Optional[Dict[str, Any]] = None evaluation: Optional[Dict[str, Any]] = None # Evaluation results when run_eval=true + extraction_score_average: Optional[float] = None # Average confidence score (1-5) across extracted fields + extraction_mode: Optional[str] = None # Extraction mode used: turbo, fast, or balanced + segmentation_schema: Optional[str] = None # Segmentation schema echoed back from the API def save_output( self, output_path: Union[str, Path], save_images: bool = True diff --git a/uv.lock b/uv.lock index 2145e97..1fa3aa4 100644 --- a/uv.lock +++ b/uv.lock @@ -212,7 +212,7 @@ wheels = [ [[package]] name = "datalab-python-sdk" -version = "0.3.0" +version = "0.5.0" source = { editable = "." } dependencies = [ { name = "aiohttp" }, @@ -271,7 +271,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [