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 1757b7c..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""" @@ -83,7 +85,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: "turbo", "fast", or "balanced". Defaults to "balanced". output_format: str = "markdown" # markdown, json, html, chunks save_checkpoint: bool = False webhook_url: Optional[str] = None @@ -94,6 +97,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 @@ -202,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 = [