Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
86db626
fix: multipart form requests to utlize file and data.
Khurdhula-Harshavardhan Sep 12, 2025
08c6c42
fix: maintain same structure and logic as sync request.
Khurdhula-Harshavardhan Sep 12, 2025
73d5647
fix: mutlipart form request for STT.
Khurdhula-Harshavardhan Sep 13, 2025
caed1b5
fix: multiform request for obj-detection.
Khurdhula-Harshavardhan Sep 13, 2025
4146c25
test: defining test cases for vocr
Khurdhula-Harshavardhan Sep 13, 2025
411bf89
fix: multipart-form request for image translation.
Khurdhula-Harshavardhan Sep 13, 2025
d61fe05
fix: multipart request for NSFW.
Khurdhula-Harshavardhan Sep 13, 2025
306eeb5
fix: multipartform request.
Khurdhula-Harshavardhan Sep 13, 2025
b8bbf70
chore: formatting.
Khurdhula-Harshavardhan Sep 13, 2025
f5b73b2
fix: linting
Khurdhula-Harshavardhan Sep 13, 2025
085907b
test: updating ci to include vocr tests.
Khurdhula-Harshavardhan Sep 13, 2025
b5ec3b3
rm unnecessary params
winzamark123 Sep 15, 2025
762ce6a
fix: drop unnecessary data param, as every request is not multipartform.
Khurdhula-Harshavardhan Sep 15, 2025
2127ca1
chore: ruff formatting.
Khurdhula-Harshavardhan Sep 15, 2025
563f65e
feat: update version to 0.3.4
Khurdhula-Harshavardhan Sep 15, 2025
777706d
feat: ruff formatting.
Khurdhula-Harshavardhan Sep 15, 2025
f97b559
fix: drop unused param.
Khurdhula-Harshavardhan Sep 15, 2025
50d8e5d
fix: updating properties for JigsawStack & AsyncJigsawStack, and embe…
Khurdhula-Harshavardhan Sep 15, 2025
8fa4631
chore: drop redundant disable logging flag.
Khurdhula-Harshavardhan Sep 16, 2025
0c3aa60
fix: pass user defined headers as config.
Khurdhula-Harshavardhan Sep 16, 2025
2d7e43a
fix: pass logging param withing header, rename api_url as base_url an…
Khurdhula-Harshavardhan Sep 16, 2025
160c859
fix: env variable to still be API_URL
Khurdhula-Harshavardhan Sep 16, 2025
d81794d
feat: formatting with ruff
Khurdhula-Harshavardhan Sep 16, 2025
ad9ab56
feat: pass headers to endpoint.
Khurdhula-Harshavardhan Sep 16, 2025
6bef4e1
feat: pass headers to endpoint.
Khurdhula-Harshavardhan Sep 16, 2025
5b29bef
fix: AsyncPromptEngine must accept headers.
Khurdhula-Harshavardhan Sep 16, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ jobs:
- test_web.py
- test_deep_research.py
- test_ai_scrape.py
- test_vocr.py
steps:
- uses: actions/checkout@v4

Expand Down
236 changes: 86 additions & 150 deletions jigsawstack/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,24 +21,29 @@


class JigsawStack:
api_key: str
base_url: str
headers: Dict[str, str]
audio: Audio
vision: Vision
image_generation: ImageGeneration
file: Store
web: Web
search: Search
classification: Classification
embedding: Embedding
embedding_v2: EmbeddingV2
store: Store
image_generation: ImageGeneration
prediction: Prediction
prompt_engine: PromptEngine
api_key: str
api_url: str
headers: Dict[str, str]
# disable_request_logging: bool
sentiment: Sentiment
summary: Summary
text_to_sql: SQL
translate: Translate
validate: Validate
vision: Vision
web: Web

def __init__(
self,
api_key: Union[str, None] = None,
api_url: Union[str, None] = None,
# disable_request_logging: Union[bool, None] = None,
base_url: Union[str, None] = None,
headers: Union[Dict[str, str], None] = None,
) -> None:
if api_key is None:
Expand All @@ -49,117 +54,89 @@ def __init__(
"The api_key client option must be set either by passing api_key to the client or by setting the JIGSAWSTACK_API_KEY environment variable"
)

if api_url is None:
api_url = os.environ.get("JIGSAWSTACK_API_URL")
if api_url is None:
api_url = "https://api.jigsawstack.com/"
if base_url is None:
base_url = os.environ.get("JIGSAWSTACK_API_URL")
if base_url is None:
base_url = "https://api.jigsawstack.com/"

self.api_key = api_key
self.api_url = api_url
self.base_url = base_url

self.headers = headers or {}
self.headers = headers or {"Content-Type": "application/json"}

disable_request_logging = self.headers.get("x-jigsaw-no-request-log")
self.audio = Audio(api_key=api_key, base_url=base_url + "/v1", headers=headers)

self.web = Web(api_key=api_key, base_url=base_url + "/v1", headers=headers)

self.audio = Audio(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
)
self.web = Web(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
)
self.sentiment = Sentiment(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
api_key=api_key, base_url=base_url + "/v1", headers=headers
).analyze
self.validate = Validate(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
)

self.validate = Validate(api_key=api_key, base_url=base_url + "/v1", headers=headers)
self.summary = Summary(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
api_key=api_key, base_url=base_url + "/v1", headers=headers
).summarize
self.vision = Vision(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
)

self.vision = Vision(api_key=api_key, base_url=base_url + "/v1", headers=headers)

self.prediction = Prediction(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
api_key=api_key, base_url=base_url + "/v1", headers=headers
).predict

self.text_to_sql = SQL(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
api_key=api_key, base_url=base_url + "/v1", headers=headers
).text_to_sql
self.store = Store(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
)
self.translate = Translate(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
)

self.store = Store(api_key=api_key, base_url=base_url + "/v1", headers=headers)

self.translate = Translate(api_key=api_key, base_url=base_url + "/v1", headers=headers)

self.embedding = Embedding(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
api_key=api_key, base_url=base_url + "/v1", headers=headers
).execute

self.embeddingV2 = EmbeddingV2(
api_key=api_key,
api_url=api_url + "/v2",
disable_request_logging=disable_request_logging,
self.embedding_v2 = EmbeddingV2(
api_key=api_key, base_url=base_url + "/v2", headers=headers
).execute

self.image_generation = ImageGeneration(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
api_key=api_key, base_url=base_url + "/v1", headers=headers
).image_generation

self.classification = Classification(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
api_key=api_key, base_url=base_url + "/v1", headers=headers
).classify

self.prompt_engine = PromptEngine(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
api_key=api_key, base_url=base_url + "/v1", headers=headers
)


class AsyncJigsawStack:
validate: AsyncValidate
web: AsyncWeb
api_key: str
base_url: str
headers: Dict[str, str]
audio: AsyncAudio
vision: AsyncVision
classification: AsyncClassification
embedding: AsyncEmbedding
embedding_v2: AsyncEmbeddingV2
image_generation: AsyncImageGeneration
store: AsyncStore
prediction: AsyncPrediction
prompt_engine: AsyncPromptEngine
api_key: str
api_url: str
disable_request_logging: bool
sentiment: AsyncSentiment
store: AsyncStore
summary: AsyncSummary
text_to_sql: AsyncSQL
translate: AsyncTranslate
validate: AsyncValidate
vision: AsyncVision
web: AsyncWeb

def __init__(
self,
api_key: Union[str, None] = None,
api_url: Union[str, None] = None,
disable_request_logging: Union[bool, None] = None,
base_url: Union[str, None] = None,
headers: Union[Dict[str, str], None] = None,
) -> None:
if api_key is None:
api_key = os.environ.get("JIGSAWSTACK_API_KEY")
Expand All @@ -169,100 +146,59 @@ def __init__(
"The api_key client option must be set either by passing api_key to the client or by setting the JIGSAWSTACK_API_KEY environment variable"
)

if api_url is None:
api_url = os.environ.get("JIGSAWSTACK_API_URL")
if api_url is None:
api_url = "https://api.jigsawstack.com/"
if base_url is None:
base_url = os.environ.get("JIGSAWSTACK_API_URL")
if base_url is None:
base_url = "https://api.jigsawstack.com/"

self.api_key = api_key
self.api_url = api_url
self.base_url = base_url
self.headers = headers or {"Content-Type": "application/json"}

self.web = AsyncWeb(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
)
self.web = AsyncWeb(api_key=api_key, base_url=base_url + "/v1", headers=headers)

self.validate = AsyncValidate(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
)
self.audio = AsyncAudio(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
)
self.validate = AsyncValidate(api_key=api_key, base_url=base_url + "/v1", headers=headers)

self.vision = AsyncVision(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
)
self.audio = AsyncAudio(api_key=api_key, base_url=base_url + "/v1", headers=headers)

self.store = AsyncStore(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
)
self.vision = AsyncVision(api_key=api_key, base_url=base_url + "/v1", headers=headers)

self.store = AsyncStore(api_key=api_key, base_url=base_url + "/v1", headers=headers)

self.summary = AsyncSummary(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
api_key=api_key, base_url=base_url + "/v1", headers=headers
).summarize

self.prediction = AsyncPrediction(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
).predict
self.prediction = AsyncPrediction(api_key=api_key, base_url=base_url + "/v1").predict

self.text_to_sql = AsyncSQL(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
api_key=api_key, base_url=base_url + "/v1", headers=headers
).text_to_sql

self.sentiment = AsyncSentiment(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
api_key=api_key, base_url=base_url + "/v1", headers=headers
).analyze

self.translate = AsyncTranslate(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
)
self.translate = AsyncTranslate(api_key=api_key, base_url=base_url + "/v1", headers=headers)

self.embedding = AsyncEmbedding(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
api_key=api_key, base_url=base_url + "/v1", headers=headers
).execute

self.embeddingV2 = AsyncEmbeddingV2(
api_key=api_key,
api_url=api_url + "/v2",
disable_request_logging=disable_request_logging,
self.embedding_v2 = AsyncEmbeddingV2(
api_key=api_key, base_url=base_url + "/v2", headers=headers
).execute

self.image_generation = AsyncImageGeneration(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
api_key=api_key, base_url=base_url + "/v1", headers=headers
).image_generation

self.classification = AsyncClassification(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
api_key=api_key, base_url=base_url + "/v1", headers=headers
).classify

self.prompt_engine = AsyncPromptEngine(
api_key=api_key,
api_url=api_url + "/v1",
disable_request_logging=disable_request_logging,
api_key=api_key, base_url=base_url + "/v1", headers=headers
)


Expand Down
12 changes: 6 additions & 6 deletions jigsawstack/_config.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
from typing import Union
from typing import Dict, Union


class ClientConfig:
base_url: str
api_key: str
disable_request_logging: Union[bool, None] = None
headers: Union[Dict[str, str], None]

def __init__(
self,
api_key: str,
api_url: str,
disable_request_logging: Union[bool, None] = None,
base_url: str,
headers: Union[Dict[str, str], None] = None,
):
self.api_key = api_key
self.api_url = api_url
self.disable_request_logging = disable_request_logging
self.base_url = base_url
self.headers = headers
Loading