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 4b59812a428c92b8fa93e257ca4d6a3c581bec97 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 29 Jun 2026 10:45:49 +0000 Subject: [PATCH 5/5] SDK audit update (20260629-104549) --- datalab_sdk/client.py | 4 ++++ datalab_sdk/models.py | 8 +++++++- uv.lock | 4 ++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/datalab_sdk/client.py b/datalab_sdk/client.py index f57e1bc..ab4d41b 100644 --- a/datalab_sdk/client.py +++ b/datalab_sdk/client.py @@ -427,6 +427,10 @@ 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"), + result_url=result_data.get("result_url"), + expires_in=result_data.get("expires_in"), ) async def _submit_and_poll( diff --git a/datalab_sdk/models.py b/datalab_sdk/models.py index 79ed19c..ccc7903 100644 --- a/datalab_sdk/models.py +++ b/datalab_sdk/models.py @@ -15,6 +15,7 @@ class ProcessingOptions: max_pages: Optional[int] = None skip_cache: bool = False page_range: Optional[str] = None + processing_location: Optional[str] = None # Data residency region override (e.g. "us", "eu") def to_form_data(self) -> Dict[str, Any]: """Convert to form data format for API requests""" @@ -54,6 +55,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 inlined into HTML output def to_form_data(self) -> Dict[str, Any]: """Convert to form data format for API requests""" @@ -84,7 +86,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". Defaults to "balanced". + 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 @@ -206,6 +208,10 @@ 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" + result_url: Optional[str] = None # Signed URL for direct download of large result JSON + expires_in: Optional[int] = None # Seconds until result_url expires 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 = [