From cc0ab832bb847f2a0e4825107e3c181bf9035b03 Mon Sep 17 00:00:00 2001 From: Khurdhula-Harshavardhan Date: Fri, 28 Nov 2025 15:59:06 -0800 Subject: [PATCH 1/9] fix: Added dimensions, instruction, query params to EmbeddingV2Params --- jigsawstack/embedding_v2.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/jigsawstack/embedding_v2.py b/jigsawstack/embedding_v2.py index 685cd52..b5ec1fb 100644 --- a/jigsawstack/embedding_v2.py +++ b/jigsawstack/embedding_v2.py @@ -15,6 +15,9 @@ class EmbeddingV2Params(TypedDict): url: NotRequired[str] file_store_key: NotRequired[str] token_overflow_mode: NotRequired[Literal["truncate", "error"]] + dimensions: NotRequired[int] + instruction: NotRequired[str] + query: NotRequired[bool] speaker_fingerprint: NotRequired[bool] @@ -44,7 +47,9 @@ def __init__( @overload def execute(self, params: EmbeddingV2Params) -> EmbeddingV2Response: ... @overload - def execute(self, blob: bytes, options: EmbeddingV2Params = None) -> EmbeddingV2Response: ... + def execute( + self, blob: bytes, options: EmbeddingV2Params = None + ) -> EmbeddingV2Response: ... def execute( self, From 4f6659ce7bcfd984efef9b28cb2dd466c4791c1a Mon Sep 17 00:00:00 2001 From: Khurdhula-Harshavardhan Date: Fri, 28 Nov 2025 16:00:30 -0800 Subject: [PATCH 2/9] fix: steps should be not-required --- jigsawstack/prediction.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jigsawstack/prediction.py b/jigsawstack/prediction.py index 00bd3cf..65ea514 100644 --- a/jigsawstack/prediction.py +++ b/jigsawstack/prediction.py @@ -1,6 +1,6 @@ from typing import Any, Dict, List, Union, cast -from typing_extensions import TypedDict +from typing_extensions import NotRequired, TypedDict from ._config import ClientConfig from ._types import BaseResponse @@ -25,9 +25,9 @@ class PredictionParams(TypedDict): """ The dataset to make predictions on. This is an array of object with keys date and value. See example below for more information. """ - steps: int + steps: NotRequired[int] """ - The number of predictions to make. The default is 5. + The number of predictions to make. Min: 1, Max: 500. Default: 5. """ From 0ea52a3269d2fd8f4081db62ebb282708f11585c Mon Sep 17 00:00:00 2001 From: Khurdhula-Harshavardhan Date: Fri, 28 Nov 2025 16:01:02 -0800 Subject: [PATCH 3/9] fix: Added name param to PromptEngineCreateParams --- jigsawstack/prompt_engine.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/jigsawstack/prompt_engine.py b/jigsawstack/prompt_engine.py index c264db9..bebc1a4 100644 --- a/jigsawstack/prompt_engine.py +++ b/jigsawstack/prompt_engine.py @@ -48,6 +48,7 @@ class PromptEngineRunResponse(TypedDict): class PromptEngineCreateParams(TypedDict): + name: NotRequired[str] prompt: str inputs: NotRequired[List[object]] return_prompt: Union[str, List[object], Dict[str, str]] @@ -119,10 +120,14 @@ def create(self, params: PromptEngineCreateParams) -> PromptEngineCreateResponse def get(self, id: str) -> PromptEngineGetResponse: path = f"/prompt_engine/{id}" - resp = Request(config=self.config, path=path, params={}, verb="get").perform_with_content() + resp = Request( + config=self.config, path=path, params={}, verb="get" + ).perform_with_content() return resp - def list(self, params: Union[PromptEngineListParams, None] = None) -> PromptEngineListResponse: + def list( + self, params: Union[PromptEngineListParams, None] = None + ) -> PromptEngineListResponse: if params is None: params = {} @@ -137,7 +142,9 @@ def list(self, params: Union[PromptEngineListParams, None] = None) -> PromptEngi base_path="/prompt_engine", params=params, ) - resp = Request(config=self.config, path=path, params={}, verb="get").perform_with_content() + resp = Request( + config=self.config, path=path, params={}, verb="get" + ).perform_with_content() return resp def delete(self, id: str) -> PromptEngineDeleteResponse: @@ -213,7 +220,9 @@ def __init__( headers=headers, ) - async def create(self, params: PromptEngineCreateParams) -> PromptEngineCreateResponse: + async def create( + self, params: PromptEngineCreateParams + ) -> PromptEngineCreateResponse: path = "/prompt_engine" resp = await AsyncRequest( config=self.config, From 1a8a84b5ff7ee4996eb27fae07aec8aeb3c7170a Mon Sep 17 00:00:00 2001 From: Khurdhula-Harshavardhan Date: Fri, 28 Nov 2025 16:01:44 -0800 Subject: [PATCH 4/9] fix: Added max_results and updated search params. --- jigsawstack/search.py | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/jigsawstack/search.py b/jigsawstack/search.py index 7898f8b..0b2af13 100644 --- a/jigsawstack/search.py +++ b/jigsawstack/search.py @@ -193,6 +193,11 @@ class SearchParams(TypedDict): Whether to perform spell checking on the query. Defaults to True. """ + max_results: NotRequired[int] + """ + Maximum number of search results to return. + """ + safe_search: NotRequired[Literal["strict", "moderate", "off"]] """ Safe search filtering level. Can be 'strict', 'moderate', or 'off' @@ -241,7 +246,7 @@ def search(self, params: SearchParams) -> SearchResponse: safe_search = params.get("safe_search", "moderate") spell_check = params.get("spell_check", "True") - body = { + body: Dict[str, Any] = { "byo_urls": params.get("byo_urls", []), "query": query, "ai_overview": ai_overview, @@ -249,6 +254,15 @@ def search(self, params: SearchParams) -> SearchResponse: "spell_check": spell_check, } + if "max_results" in params: + body["max_results"] = params["max_results"] + + if "country_code" in params: + body["country_code"] = params["country_code"] + + if "auto_scrape" in params: + body["auto_scrape"] = params["auto_scrape"] + path = "/web/search" resp = Request( config=self.config, @@ -304,13 +318,23 @@ async def search(self, params: SearchParams) -> SearchResponse: safe_search = params.get("safe_search", "moderate") spell_check = params.get("spell_check", "True") - body = { + body: Dict[str, Any] = { "byo_urls": params.get("byo_urls", []), "query": query, "ai_overview": ai_overview, "safe_search": safe_search, "spell_check": spell_check, } + + if "max_results" in params: + body["max_results"] = params["max_results"] + + if "country_code" in params: + body["country_code"] = params["country_code"] + + if "auto_scrape" in params: + body["auto_scrape"] = params["auto_scrape"] + resp = await AsyncRequest( config=self.config, path=path, From 44d6ec646c1c0d08ada4a3217a1f27fb3aa1a434 Mon Sep 17 00:00:00 2001 From: Khurdhula-Harshavardhan Date: Fri, 28 Nov 2025 16:02:22 -0800 Subject: [PATCH 5/9] fix: Added fine_grained param to VOCRParams --- jigsawstack/vision.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/jigsawstack/vision.py b/jigsawstack/vision.py index 0b5a483..2778cf3 100644 --- a/jigsawstack/vision.py +++ b/jigsawstack/vision.py @@ -150,6 +150,10 @@ class VOCRParams(TypedDict): url: NotRequired[str] file_store_key: NotRequired[str] page_range: NotRequired[List[int]] + fine_grained: NotRequired[bool] + """ + High fidelity word-level bounding boxes within complex documents. Default: false. + """ class Word(TypedDict): From 63cca7bc07abf9693e9022afcfb8cdcc55a8fc5e Mon Sep 17 00:00:00 2001 From: Khurdhula-Harshavardhan Date: Fri, 28 Nov 2025 16:02:46 -0800 Subject: [PATCH 6/9] fix: Changed element_prompts type from List[str] to Union[List[str], Dict[str, str]] in AIScrapeParams --- jigsawstack/web.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/jigsawstack/web.py b/jigsawstack/web.py index d432c25..c6ffe4d 100644 --- a/jigsawstack/web.py +++ b/jigsawstack/web.py @@ -128,7 +128,11 @@ class BaseAIScrapeParams(TypedDict): class AIScrapeParams(BaseAIScrapeParams): - element_prompts: NotRequired[List[str]] + element_prompts: NotRequired[Union[List[str], Dict[str, str]]] + """ + List of prompts or a dictionary of key-value prompts for element extraction. + Max 5 items. If dict, max 50 chars per key and max 500 chars per prompt value. + """ root_element_selector: NotRequired[str] page_position: NotRequired[int] From 8c937884e2ea77b184f884e1c05163dc003e9bcf Mon Sep 17 00:00:00 2001 From: Khurdhula-Harshavardhan Date: Fri, 28 Nov 2025 16:54:48 -0800 Subject: [PATCH 7/9] fix: formatting. --- jigsawstack/embedding_v2.py | 4 +--- jigsawstack/prompt_engine.py | 16 ++++------------ 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/jigsawstack/embedding_v2.py b/jigsawstack/embedding_v2.py index b5ec1fb..cefcbfe 100644 --- a/jigsawstack/embedding_v2.py +++ b/jigsawstack/embedding_v2.py @@ -47,9 +47,7 @@ def __init__( @overload def execute(self, params: EmbeddingV2Params) -> EmbeddingV2Response: ... @overload - def execute( - self, blob: bytes, options: EmbeddingV2Params = None - ) -> EmbeddingV2Response: ... + def execute(self, blob: bytes, options: EmbeddingV2Params = None) -> EmbeddingV2Response: ... def execute( self, diff --git a/jigsawstack/prompt_engine.py b/jigsawstack/prompt_engine.py index bebc1a4..9963343 100644 --- a/jigsawstack/prompt_engine.py +++ b/jigsawstack/prompt_engine.py @@ -120,14 +120,10 @@ def create(self, params: PromptEngineCreateParams) -> PromptEngineCreateResponse def get(self, id: str) -> PromptEngineGetResponse: path = f"/prompt_engine/{id}" - resp = Request( - config=self.config, path=path, params={}, verb="get" - ).perform_with_content() + resp = Request(config=self.config, path=path, params={}, verb="get").perform_with_content() return resp - def list( - self, params: Union[PromptEngineListParams, None] = None - ) -> PromptEngineListResponse: + def list(self, params: Union[PromptEngineListParams, None] = None) -> PromptEngineListResponse: if params is None: params = {} @@ -142,9 +138,7 @@ def list( base_path="/prompt_engine", params=params, ) - resp = Request( - config=self.config, path=path, params={}, verb="get" - ).perform_with_content() + resp = Request(config=self.config, path=path, params={}, verb="get").perform_with_content() return resp def delete(self, id: str) -> PromptEngineDeleteResponse: @@ -220,9 +214,7 @@ def __init__( headers=headers, ) - async def create( - self, params: PromptEngineCreateParams - ) -> PromptEngineCreateResponse: + async def create(self, params: PromptEngineCreateParams) -> PromptEngineCreateResponse: path = "/prompt_engine" resp = await AsyncRequest( config=self.config, From 9722e9448b86cc86fd5cd86423b1dc814977f8bb Mon Sep 17 00:00:00 2001 From: Khurdhula-Harshavardhan Date: Fri, 28 Nov 2025 16:55:31 -0800 Subject: [PATCH 8/9] update: version --- jigsawstack/version.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jigsawstack/version.py b/jigsawstack/version.py index b8d2d3c..c9225b9 100644 --- a/jigsawstack/version.py +++ b/jigsawstack/version.py @@ -1,4 +1,4 @@ -__version__ = "0.3.9" +__version__ = "0.4.0" def get_version() -> str: diff --git a/setup.py b/setup.py index 8a9a443..aaa15df 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ setup( name="jigsawstack", - version="0.3.9", + version="0.4.0", description="JigsawStack - The AI SDK for Python", long_description=open("README.md", encoding="utf8").read(), long_description_content_type="text/markdown", From 0e690e03fd4d50c3a5f53d73bf9ff2e9621c7db1 Mon Sep 17 00:00:00 2001 From: Khurdhula-Harshavardhan Date: Fri, 28 Nov 2025 18:50:20 -0800 Subject: [PATCH 9/9] chore: drop tests for scrape with cookies. --- tests/test_ai_scrape.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/test_ai_scrape.py b/tests/test_ai_scrape.py index 1f53453..e7e8e30 100644 --- a/tests/test_ai_scrape.py +++ b/tests/test_ai_scrape.py @@ -77,16 +77,16 @@ "is_mobile": True, }, }, - { - "name": "scrape_with_cookies", - "params": { - "url": URL, - "element_prompts": ["user data"], - "cookies": [ - {"name": "session", "value": "test123", "domain": "example.com"} - ], - }, - }, + # { + # "name": "scrape_with_cookies", + # "params": { + # "url": URL, + # "element_prompts": ["user data"], + # "cookies": [ + # {"name": "session", "value": "test123", "domain": "example.com"} + # ], + # }, + # }, { "name": "scrape_with_advance_config", "params": {