From ec13f22a6c7675f77026f62bf3220b2348bb5f50 Mon Sep 17 00:00:00 2001 From: jigsawstack <91052168+VineeTagarwaL-code@users.noreply.github.com> Date: Fri, 1 Aug 2025 03:42:27 +0530 Subject: [PATCH 01/13] fix: fixes image generation, speech to text, removed fetch as export --- src/audio/audio.ts | 11 ++++++++++- src/audio/interfaces.ts | 14 +++++++++----- src/core.ts | 1 - src/general/index.ts | 19 ++----------------- src/general/interfaces.ts | 22 ++++++++++++++++++++++ src/helpers.ts | 6 +++++- test.ts | 11 +++++++++++ 7 files changed, 59 insertions(+), 25 deletions(-) create mode 100644 test.ts diff --git a/src/audio/audio.ts b/src/audio/audio.ts index 967d633..6d69301 100644 --- a/src/audio/audio.ts +++ b/src/audio/audio.ts @@ -1,8 +1,17 @@ import { respToFileChoice } from "../helpers"; import { RequestClient } from "../request"; -import { ListTTSVoiceClonesParams, SpeechToTextParams, SpeechToTextResponse, TTSCloneParams, TextToSpeechParams } from "./interfaces"; +import { ListTTSVoiceClonesParams, SpeechToTextParams, SpeechToTextResponse, SpeechToTextSyncResponse, SpeechToTextWebhookResponse, TTSCloneParams, TextToSpeechParams } from "./interfaces"; class Audio { constructor(private readonly client: RequestClient) {} + // Overload for when webhook_url is provided - returns webhook response + speech_to_text(params: SpeechToTextParams & { webhook_url: string }): Promise; + // Overload for when webhook_url is not provided - returns sync response + speech_to_text(params: SpeechToTextParams & { webhook_url?: undefined }): Promise; + // Overload for file upload with webhook_url + speech_to_text(file: Blob | Buffer, params: Omit & { webhook_url: string }): Promise; + // Overload for file upload without webhook_url + speech_to_text(file: Blob | Buffer, params?: Omit & { webhook_url?: undefined }): Promise; + // Generic fallback speech_to_text(params: SpeechToTextParams): Promise; speech_to_text(file: Blob | Buffer, params?: Omit): Promise; async speech_to_text(params: SpeechToTextParams | Blob | Buffer, options?: SpeechToTextParams): Promise { diff --git a/src/audio/interfaces.ts b/src/audio/interfaces.ts index 22198e3..d200f6a 100644 --- a/src/audio/interfaces.ts +++ b/src/audio/interfaces.ts @@ -11,16 +11,13 @@ export interface SpeechToTextParams { chunk_duration?: number; } -export interface SpeechToTextResponse extends BaseResponse { +export interface SpeechToTextSyncResponse extends BaseResponse { text: string; chunks: Array<{ timestamp: number[]; text: string; }>; - status?: "processing" | "error"; - id?: string; speakers?: { - // available when by_speaker is true speaker: string; timestamp: number[]; text: string; @@ -32,9 +29,16 @@ export interface SpeechToTextWebhookResponse extends BaseResponse { id: string; } +export type SpeechToTextResponse = + T extends { webhook_url: string } + ? SpeechToTextWebhookResponse + : T extends { webhook_url?: undefined } + ? SpeechToTextSyncResponse + : SpeechToTextSyncResponse | SpeechToTextWebhookResponse; + export interface TextToSpeechParams { text: string; - accent?: SupportedAccents; // see https://docs.jigsawstack.com/additional-resources/speaker-voices for the list of supported accents. + accent?: SupportedAccents; voice_clone_id?: string; return_type?: "url" | "binary" | "base64"; } diff --git a/src/core.ts b/src/core.ts index 9f9ed96..4d5a756 100644 --- a/src/core.ts +++ b/src/core.ts @@ -31,7 +31,6 @@ export const JigsawStack = (config?: BaseConfig) => { }; return { - fetch: client.fetchJSS, sentiment: general.sentiment, translate: general.translate, image_generation: general.image_generation, diff --git a/src/general/index.ts b/src/general/index.ts index bf1fa00..ac53214 100644 --- a/src/general/index.ts +++ b/src/general/index.ts @@ -13,6 +13,7 @@ import { TranslateImageParams, TranslateParams, TranslateResponse, + ImageGenerationParams, } from "./interfaces"; class General { @@ -48,24 +49,8 @@ class General { return await this.client.fetchJSS("/ai/sentiment", "POST", params); }; - image_generation = async (params: { - prompt: string; - aspect_ratio?: "1:1" | "16:9" | "21:9" | "3:2" | "2:3" | "4:5" | "5:4" | "3:4" | "4:3" | "9:16" | "9:21"; - width?: number; - height?: number; - steps?: number; - output_format?: "png" | "svg"; - return_type?: "url" | "binary" | "base64"; - advance_config?: { - negative_prompt?: string; - guidance?: number; - seed?: number; - }; - url?: string; - file_store_key?: string; - }) => { + image_generation = async (params: ImageGenerationParams) => { const resp = await this.client.fetchJSS("/ai/image_generation", "POST", params); - return respToFileChoice(resp); }; diff --git a/src/general/interfaces.ts b/src/general/interfaces.ts index cacee57..69f654d 100644 --- a/src/general/interfaces.ts +++ b/src/general/interfaces.ts @@ -1,5 +1,27 @@ import { BaseResponse } from "../../types"; + +export interface ImageGenerationParams { + prompt: string; + aspect_ratio?: "1:1" | "16:9" | "21:9" | "3:2" | "2:3" | "4:5" | "5:4" | "3:4" | "4:3" | "9:16" | "9:21"; + width?: number; + height?: number; + steps?: number; + output_format?: "png" | "svg"; + return_type?: "url" | "binary" | "base64"; + advance_config?: { + negative_prompt?: string; + guidance?: number; + seed?: number; + }; + url?: string; + file_store_key?: string; +} + +export interface ImageGenerationResponse extends BaseResponse { + url: string; +} + export interface SentimentResponse extends BaseResponse { sentiment: { emotion: string; diff --git a/src/helpers.ts b/src/helpers.ts index e7cd89b..98efa26 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -1,4 +1,8 @@ -export const respToFileChoice = (resp) => { +export const respToFileChoice = (resp: Response): { + blob: () => Promise; + buffer: () => Promise; + file: (filename: string, options?: FilePropertyBag) => Promise; +} => { if (!(resp instanceof Response)) { return resp; } diff --git a/test.ts b/test.ts new file mode 100644 index 0000000..3f6b04f --- /dev/null +++ b/test.ts @@ -0,0 +1,11 @@ +import { JigsawStack } from "./dist/index.mjs"; + +const jigsaw = JigsawStack({ + apiKey: "sk_61635c6833032ef257aab9157e7376b0dadf30806aea75b18029878accaa31669dd074c3468d35d490a88c41944c2b94607a8a43207a1b7049db41bde8b8cefd024Am7v5COxYErMQyQU6u", +}); + +const response = await jigsaw.image_generation({ + prompt: "A beautiful sunset over a calm ocean", +}); + +console.log( await response.blob()); From 417909502fff1774ac8160fb8ed88bb1686036c5 Mon Sep 17 00:00:00 2001 From: jigsawstack <91052168+VineeTagarwaL-code@users.noreply.github.com> Date: Fri, 1 Aug 2025 04:37:39 +0530 Subject: [PATCH 02/13] fix: text_to_sql fix --- src/general/index.ts | 8 ++------ src/general/interfaces.ts | 9 +++++++++ src/vercel-ai-toolkit.ts | 24 ++++++++++++++++++------ 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/general/index.ts b/src/general/index.ts index ac53214..ba04839 100644 --- a/src/general/index.ts +++ b/src/general/index.ts @@ -14,6 +14,7 @@ import { TranslateParams, TranslateResponse, ImageGenerationParams, + TextToSQLParams, } from "./interfaces"; class General { @@ -54,12 +55,7 @@ class General { return respToFileChoice(resp); }; - text_to_sql = async (params: { - prompt: string; - sql_schema?: string; - file_store_key?: string; - database?: "postgresql" | "mysql" | "sqlite"; - }): Promise => { + text_to_sql = async (params: TextToSQLParams): Promise => { return await this.client.fetchJSS("/ai/sql", "POST", params); }; diff --git a/src/general/interfaces.ts b/src/general/interfaces.ts index 69f654d..7a28407 100644 --- a/src/general/interfaces.ts +++ b/src/general/interfaces.ts @@ -1,6 +1,15 @@ import { BaseResponse } from "../../types"; +export type TextToSQLParams = { + prompt: string; + database?: "postgresql" | "mysql" | "sqlite"; +} & ( + | { sql_schema: string; file_store_key?: never } + | { file_store_key: string; sql_schema?: never } + | { sql_schema?: undefined; file_store_key?: undefined } +); + export interface ImageGenerationParams { prompt: string; aspect_ratio?: "1:1" | "16:9" | "21:9" | "3:2" | "2:3" | "4:5" | "5:4" | "3:4" | "4:3" | "9:16" | "9:21"; diff --git a/src/vercel-ai-toolkit.ts b/src/vercel-ai-toolkit.ts index f46f552..ebfd17e 100644 --- a/src/vercel-ai-toolkit.ts +++ b/src/vercel-ai-toolkit.ts @@ -154,12 +154,24 @@ export class JigsawStackToolSet { database: z.enum(["postgresql", "mysql", "sqlite"]).optional().describe("Database type"), }), execute: async ({ prompt, sql_schema, file_store_key, database }) => { - return await this.jigsawStack.text_to_sql({ - prompt, - sql_schema, - file_store_key, - database, - }); + if (file_store_key) { + return await this.jigsawStack.text_to_sql({ + prompt, + file_store_key, + database, + }); + } else if (sql_schema) { + return await this.jigsawStack.text_to_sql({ + prompt, + sql_schema, + database, + }); + } else { + return await this.jigsawStack.text_to_sql({ + prompt, + database, + }); + } }, }), From d7b3c971b093669c3cfd40eb13e8f90e067342fb Mon Sep 17 00:00:00 2001 From: jigsawstack <91052168+VineeTagarwaL-code@users.noreply.github.com> Date: Fri, 1 Aug 2025 04:44:55 +0530 Subject: [PATCH 03/13] fix: fixed image translate --- src/general/interfaces.ts | 9 +++++---- src/vercel-ai-toolkit.ts | 18 +++++++++++++----- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/general/interfaces.ts b/src/general/interfaces.ts index 7a28407..a7b4d93 100644 --- a/src/general/interfaces.ts +++ b/src/general/interfaces.ts @@ -55,12 +55,13 @@ export interface TranslateParams { text: string | string[]; } -export interface TranslateImageParams { +export type TranslateImageParams= { target_language: string; - url?: string; - file_store_key?: string; return_type?: "url" | "binary" | "base64"; -} +} & ( + | { url: string; file_store_key?: never } + | { file_store_key: string; url?: never } +) export interface SpeechToTextResponse extends BaseResponse { text: string; diff --git a/src/vercel-ai-toolkit.ts b/src/vercel-ai-toolkit.ts index ebfd17e..df05c74 100644 --- a/src/vercel-ai-toolkit.ts +++ b/src/vercel-ai-toolkit.ts @@ -89,11 +89,19 @@ export class JigsawStackToolSet { target_language: z.string().describe('Target language code (e.g., "en", "es", "fr")'), }), execute: async ({ url, file_store_key, target_language }) => { - await this.jigsawStack.translate.image({ - url, - file_store_key, - target_language, - }); + if (url) { + return await this.jigsawStack.translate.image({ + url, + target_language, + return_type: "url", + }); + } else if (file_store_key) { + return await this.jigsawStack.translate.image({ + file_store_key, + target_language, + return_type: "url", + }); + } return { success: true, From 1ec42dacee2a7c838045dbbc0eca9fd287fcfd4c Mon Sep 17 00:00:00 2001 From: jigsawstack <91052168+VineeTagarwaL-code@users.noreply.github.com> Date: Fri, 1 Aug 2025 05:18:43 +0530 Subject: [PATCH 04/13] fix: fixed vision --- src/vercel-ai-toolkit.ts | 34 ++++++++++++++++++++++++---------- src/vision/interfaces.ts | 19 +++++++++++-------- test.ts | 3 +-- 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/vercel-ai-toolkit.ts b/src/vercel-ai-toolkit.ts index df05c74..ef502f4 100644 --- a/src/vercel-ai-toolkit.ts +++ b/src/vercel-ai-toolkit.ts @@ -267,12 +267,19 @@ export class JigsawStackToolSet { page_range: z.array(z.number()).optional().describe("Page range for PDF files"), }), execute: async ({ prompt, url, file_store_key, page_range }) => { - return await this.jigsawStack.vision.vocr({ - prompt, - url, - file_store_key, - page_range, - }); + if (url) { + return await this.jigsawStack.vision.vocr({ + prompt, + url, + page_range, + }); + } else if (file_store_key) { + return await this.jigsawStack.vision.vocr({ + prompt, + file_store_key, + page_range, + }); + } }, }), @@ -283,10 +290,17 @@ export class JigsawStackToolSet { file_store_key: z.string().optional().describe("File store key of uploaded image"), }), execute: async ({ url, file_store_key }) => { - return await this.jigsawStack.vision.object_detection({ - url, - file_store_key, - }); + if (url) { + return await this.jigsawStack.vision.object_detection({ + url, + return_type: "url", + }); + } else if (file_store_key) { + return await this.jigsawStack.vision.object_detection({ + file_store_key, + return_type: "url", + }); + } }, }), diff --git a/src/vision/interfaces.ts b/src/vision/interfaces.ts index f098256..a6eed71 100644 --- a/src/vision/interfaces.ts +++ b/src/vision/interfaces.ts @@ -1,9 +1,10 @@ -export interface VOCRParams { +export type VOCRParams = { prompt: string | string[]; - url?: string; - file_store_key?: string; page_range?: Array; -} +} & ( + | { url: string; file_store_key?: never } + | { file_store_key: string; url?: never } +); interface Bounds { top_left: { @@ -46,14 +47,15 @@ export interface VOCRResponse { page_range?: Array; // only available when page_range is specified } -export interface ObjectDetectionParams { - url?: string; - file_store_key?: string; +export type ObjectDetectionParams = { prompts?: string[]; features?: ("object_detection" | "gui")[]; annotated_image?: boolean; return_type?: "url" | "base64"; -} +} & ( + | { url: string; file_store_key?: never } + | { file_store_key: string; url?: never } +); export interface ObjectDetectionResponse { // Optional annotated image - included only if annotated_image=true and objects/gui_elements exist @@ -73,6 +75,7 @@ interface GuiElement { interface DetectedObject { bounds: BoundingBox; + label: string; mask?: string; // URL or base64 string depending on return_type - only present for some objects } diff --git a/test.ts b/test.ts index 3f6b04f..4fed9bd 100644 --- a/test.ts +++ b/test.ts @@ -4,8 +4,7 @@ const jigsaw = JigsawStack({ apiKey: "sk_61635c6833032ef257aab9157e7376b0dadf30806aea75b18029878accaa31669dd074c3468d35d490a88c41944c2b94607a8a43207a1b7049db41bde8b8cefd024Am7v5COxYErMQyQU6u", }); -const response = await jigsaw.image_generation({ +const reponse = await jigsaw.image_generation({ prompt: "A beautiful sunset over a calm ocean", }); -console.log( await response.blob()); From b66743887d7882b06642da2ad812caac03375b88 Mon Sep 17 00:00:00 2001 From: jigsawstack <91052168+VineeTagarwaL-code@users.noreply.github.com> Date: Fri, 1 Aug 2025 05:52:52 +0530 Subject: [PATCH 05/13] fix: type issues --- src/audio/audio.ts | 22 ++++++++++++++++++---- src/audio/interfaces.ts | 9 ++++----- src/general/index.ts | 4 ++-- src/general/interfaces.ts | 8 ++------ src/helpers.ts | 4 +++- src/vision/interfaces.ts | 12 +++--------- test.ts | 10 ---------- 7 files changed, 32 insertions(+), 37 deletions(-) delete mode 100644 test.ts diff --git a/src/audio/audio.ts b/src/audio/audio.ts index 6d69301..297ba66 100644 --- a/src/audio/audio.ts +++ b/src/audio/audio.ts @@ -1,16 +1,30 @@ import { respToFileChoice } from "../helpers"; import { RequestClient } from "../request"; -import { ListTTSVoiceClonesParams, SpeechToTextParams, SpeechToTextResponse, SpeechToTextSyncResponse, SpeechToTextWebhookResponse, TTSCloneParams, TextToSpeechParams } from "./interfaces"; +import { + ListTTSVoiceClonesParams, + SpeechToTextParams, + SpeechToTextResponse, + SpeechToTextSyncResponse, + SpeechToTextWebhookResponse, + TTSCloneParams, + TextToSpeechParams, +} from "./interfaces"; class Audio { constructor(private readonly client: RequestClient) {} // Overload for when webhook_url is provided - returns webhook response speech_to_text(params: SpeechToTextParams & { webhook_url: string }): Promise; - // Overload for when webhook_url is not provided - returns sync response + // Overload for when webhook_url is not provided - returns sync response speech_to_text(params: SpeechToTextParams & { webhook_url?: undefined }): Promise; // Overload for file upload with webhook_url - speech_to_text(file: Blob | Buffer, params: Omit & { webhook_url: string }): Promise; + speech_to_text( + file: Blob | Buffer, + params: Omit & { webhook_url: string } + ): Promise; // Overload for file upload without webhook_url - speech_to_text(file: Blob | Buffer, params?: Omit & { webhook_url?: undefined }): Promise; + speech_to_text( + file: Blob | Buffer, + params?: Omit & { webhook_url?: undefined } + ): Promise; // Generic fallback speech_to_text(params: SpeechToTextParams): Promise; speech_to_text(file: Blob | Buffer, params?: Omit): Promise; diff --git a/src/audio/interfaces.ts b/src/audio/interfaces.ts index d200f6a..94152ee 100644 --- a/src/audio/interfaces.ts +++ b/src/audio/interfaces.ts @@ -29,11 +29,10 @@ export interface SpeechToTextWebhookResponse extends BaseResponse { id: string; } -export type SpeechToTextResponse = - T extends { webhook_url: string } - ? SpeechToTextWebhookResponse - : T extends { webhook_url?: undefined } - ? SpeechToTextSyncResponse +export type SpeechToTextResponse = T extends { webhook_url: string } + ? SpeechToTextWebhookResponse + : T extends { webhook_url?: undefined } + ? SpeechToTextSyncResponse : SpeechToTextSyncResponse | SpeechToTextWebhookResponse; export interface TextToSpeechParams { diff --git a/src/general/index.ts b/src/general/index.ts index ba04839..f5b16de 100644 --- a/src/general/index.ts +++ b/src/general/index.ts @@ -4,17 +4,17 @@ import { RequestClient } from "../request"; import { EmbeddingParams, EmbeddingResponse, + ImageGenerationParams, PredictionParams, PredictionResponse, SentimentResponse, SummaryParams, SummaryResponse, + TextToSQLParams, TextToSQLResponse, TranslateImageParams, TranslateParams, TranslateResponse, - ImageGenerationParams, - TextToSQLParams, } from "./interfaces"; class General { diff --git a/src/general/interfaces.ts b/src/general/interfaces.ts index a7b4d93..975fba1 100644 --- a/src/general/interfaces.ts +++ b/src/general/interfaces.ts @@ -1,6 +1,5 @@ import { BaseResponse } from "../../types"; - export type TextToSQLParams = { prompt: string; database?: "postgresql" | "mysql" | "sqlite"; @@ -55,13 +54,10 @@ export interface TranslateParams { text: string | string[]; } -export type TranslateImageParams= { +export type TranslateImageParams = { target_language: string; return_type?: "url" | "binary" | "base64"; -} & ( - | { url: string; file_store_key?: never } - | { file_store_key: string; url?: never } -) +} & ({ url: string; file_store_key?: never } | { file_store_key: string; url?: never }); export interface SpeechToTextResponse extends BaseResponse { text: string; diff --git a/src/helpers.ts b/src/helpers.ts index 98efa26..a08e3c6 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -1,4 +1,6 @@ -export const respToFileChoice = (resp: Response): { +export const respToFileChoice = ( + resp: Response +): { blob: () => Promise; buffer: () => Promise; file: (filename: string, options?: FilePropertyBag) => Promise; diff --git a/src/vision/interfaces.ts b/src/vision/interfaces.ts index a6eed71..ff0a7f8 100644 --- a/src/vision/interfaces.ts +++ b/src/vision/interfaces.ts @@ -1,10 +1,7 @@ -export type VOCRParams = { +export type VOCRParams = { prompt: string | string[]; page_range?: Array; -} & ( - | { url: string; file_store_key?: never } - | { file_store_key: string; url?: never } -); +} & ({ url: string; file_store_key?: never } | { file_store_key: string; url?: never }); interface Bounds { top_left: { @@ -52,10 +49,7 @@ export type ObjectDetectionParams = { features?: ("object_detection" | "gui")[]; annotated_image?: boolean; return_type?: "url" | "base64"; -} & ( - | { url: string; file_store_key?: never } - | { file_store_key: string; url?: never } -); +} & ({ url: string; file_store_key?: never } | { file_store_key: string; url?: never }); export interface ObjectDetectionResponse { // Optional annotated image - included only if annotated_image=true and objects/gui_elements exist diff --git a/test.ts b/test.ts deleted file mode 100644 index 4fed9bd..0000000 --- a/test.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { JigsawStack } from "./dist/index.mjs"; - -const jigsaw = JigsawStack({ - apiKey: "sk_61635c6833032ef257aab9157e7376b0dadf30806aea75b18029878accaa31669dd074c3468d35d490a88c41944c2b94607a8a43207a1b7049db41bde8b8cefd024Am7v5COxYErMQyQU6u", -}); - -const reponse = await jigsaw.image_generation({ - prompt: "A beautiful sunset over a calm ocean", -}); - From a0df46cc85fc03c90d60449869d42c154ed6bb03 Mon Sep 17 00:00:00 2001 From: jigsawstack <91052168+VineeTagarwaL-code@users.noreply.github.com> Date: Tue, 26 Aug 2025 03:53:55 +0530 Subject: [PATCH 06/13] feat: fixes --- package.json | 14 +++++++-- tests/web.test.ts | 74 ----------------------------------------------- yarn.lock | 5 ++++ 3 files changed, 16 insertions(+), 77 deletions(-) diff --git a/package.json b/package.json index 0e54e6d..e04520d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,12 @@ { "name": "jigsawstack", "description": "JigsawStack - The AI SDK for Typescript and Javascript", - "keywords": ["framework", "ai", "nextjs", "react"], + "keywords": [ + "framework", + "ai", + "nextjs", + "react" + ], "type": "module", "license": "MIT", "version": "0.2.12", @@ -20,7 +25,9 @@ "main": "./dist/index.cjs", "module": "./dist/index.mjs", "types": "./dist/index.d.cts", - "files": ["dist/**"], + "files": [ + "dist/**" + ], "exports": { "require": { "types": "./dist/index.d.cts", @@ -34,7 +41,7 @@ "scripts": { "build": "pkgroll --src=./", "format": "biome check --write .", - "test": "yarn build && node --test --no-warnings --import tsx --test-reporter=spec tests/*.ts" + "test": "yarn build && node --test --no-warnings --import tsx --test-reporter=spec --require dotenv/config tests/*.ts" }, "dependencies": { "isomorphic-fetch": "^3.0.0", @@ -43,6 +50,7 @@ "devDependencies": { "@biomejs/biome": "^1.9.4", "@types/node": "^22.0.2", + "dotenv": "^17.2.1", "pkgroll": "^2.11.2", "tsx": "^4.16.4", "typescript": "^5.5.4" diff --git a/tests/web.test.ts b/tests/web.test.ts index f0e2376..28afee6 100644 --- a/tests/web.test.ts +++ b/tests/web.test.ts @@ -1224,78 +1224,4 @@ describe("Web Search Suggestions API", () => { }); }); -// Deep Research API Tests (lightweight tests to avoid long execution times) -describe("Deep Research API", () => { - let client: ReturnType; - - beforeEach(() => { - client = createJigsawStackClient(); - }); - - test("should fail when query parameter is missing", async () => { - try { - await client.web.search({ - deep_research: true, - // Missing query parameter - } as any); - throw new Error("Expected API call to fail with missing query"); - } catch (error) { - expectType(error, "object"); - } - }); - - test("should validate deep_research_config parameter structure", async () => { - // Test with valid config structure - const result = await client.web.search({ - query: "test", - deep_research: true, - deep_research_config: { - max_depth: 2, - max_breadth: 2, - max_output_tokens: 2000, - target_output_tokens: 1500, - }, - }); - - expectSuccess(result); - expectArray(result.results); - }); - test("should work with deep_research enabled but no config (uses defaults)", async () => { - const result = await client.web.search({ - query: "quick test", // Use simple query to minimize execution time - deep_research: true, - // No deep_research_config - should use defaults - }); - - expectSuccess(result); - expectArray(result.results); - }); - - test("should handle invalid deep_research_config values", async () => { - try { - await client.web.search({ - query: "test", - deep_research: true, - deep_research_config: { - max_depth: -1, // Invalid negative value - max_breadth: 1, - max_output_tokens: 1000, - }, - }); - throw new Error("Expected API call to fail with invalid max_depth"); - } catch (error) { - expectType(error, "object"); - } - }); - - test("should work with deep_research disabled", async () => { - const result = await client.web.search({ - query: "normal search", - deep_research: false, - }); - - expectSuccess(result); - expectArray(result.results); - }); -}); diff --git a/yarn.lock b/yarn.lock index 354862a..ecf7ba4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -535,6 +535,11 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== +dotenv@^17.2.1: + version "17.2.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.2.1.tgz#6f32e10faf014883515538dc922a0fb8765d9b32" + integrity sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ== + esbuild@^0.24.2: version "0.24.2" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.2.tgz#b5b55bee7de017bff5fb8a4e3e44f2ebe2c3567d" From 2c4e1c51c2f74c07bac8948347e1d8df722e5fe3 Mon Sep 17 00:00:00 2001 From: jigsawstack <91052168+VineeTagarwaL-code@users.noreply.github.com> Date: Tue, 26 Aug 2025 03:58:04 +0530 Subject: [PATCH 07/13] feat: fixes --- src/audio/audio.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/audio/audio.ts b/src/audio/audio.ts index 4d457b1..7769134 100644 --- a/src/audio/audio.ts +++ b/src/audio/audio.ts @@ -1,5 +1,5 @@ import { RequestClient } from "../request"; -import { SpeechToTextParams, SpeechToTextResponse, SpeechToTextSyncResponse, SpeechToTextWebhookResponse } from "./interfaces"; +import { SpeechToTextParams, SpeechToTextSyncResponse, SpeechToTextWebhookResponse } from "./interfaces"; class Audio { constructor(private readonly client: RequestClient) {} // Overload for when webhook_url is provided - returns webhook response @@ -17,9 +17,12 @@ class Audio { params?: Omit & { webhook_url?: undefined } ): Promise; // Generic fallback - speech_to_text(params: SpeechToTextParams): Promise; - speech_to_text(file: Blob | Buffer, params?: Omit): Promise; - async speech_to_text(params: SpeechToTextParams | Blob | Buffer, options?: SpeechToTextParams): Promise { + speech_to_text(params: SpeechToTextParams): Promise; + speech_to_text(file: Blob | Buffer, params?: Omit): Promise; + async speech_to_text( + params: SpeechToTextParams | Blob | Buffer, + options?: SpeechToTextParams + ): Promise { if (params instanceof Blob || params instanceof Buffer) { return await this.client.fetchJSS("/ai/transcribe", "POST", params, options); } From 980f9ebc73f97e21d77bd126053bb206e2490c86 Mon Sep 17 00:00:00 2001 From: jigsawstack <91052168+VineeTagarwaL-code@users.noreply.github.com> Date: Tue, 26 Aug 2025 04:04:32 +0530 Subject: [PATCH 08/13] update --- src/audio/audio.ts | 15 --------------- src/general/interfaces.ts | 2 +- src/vercel-ai-toolkit.ts | 2 -- 3 files changed, 1 insertion(+), 18 deletions(-) diff --git a/src/audio/audio.ts b/src/audio/audio.ts index 7769134..6898d3d 100644 --- a/src/audio/audio.ts +++ b/src/audio/audio.ts @@ -2,21 +2,6 @@ import { RequestClient } from "../request"; import { SpeechToTextParams, SpeechToTextSyncResponse, SpeechToTextWebhookResponse } from "./interfaces"; class Audio { constructor(private readonly client: RequestClient) {} - // Overload for when webhook_url is provided - returns webhook response - speech_to_text(params: SpeechToTextParams & { webhook_url: string }): Promise; - // Overload for when webhook_url is not provided - returns sync response - speech_to_text(params: SpeechToTextParams & { webhook_url?: undefined }): Promise; - // Overload for file upload with webhook_url - speech_to_text( - file: Blob | Buffer, - params: Omit & { webhook_url: string } - ): Promise; - // Overload for file upload without webhook_url - speech_to_text( - file: Blob | Buffer, - params?: Omit & { webhook_url?: undefined } - ): Promise; - // Generic fallback speech_to_text(params: SpeechToTextParams): Promise; speech_to_text(file: Blob | Buffer, params?: Omit): Promise; async speech_to_text( diff --git a/src/general/interfaces.ts b/src/general/interfaces.ts index 975fba1..43ec4d4 100644 --- a/src/general/interfaces.ts +++ b/src/general/interfaces.ts @@ -57,7 +57,7 @@ export interface TranslateParams { export type TranslateImageParams = { target_language: string; return_type?: "url" | "binary" | "base64"; -} & ({ url: string; file_store_key?: never } | { file_store_key: string; url?: never }); +}; export interface SpeechToTextResponse extends BaseResponse { text: string; diff --git a/src/vercel-ai-toolkit.ts b/src/vercel-ai-toolkit.ts index 3e03caa..e21e920 100644 --- a/src/vercel-ai-toolkit.ts +++ b/src/vercel-ai-toolkit.ts @@ -91,13 +91,11 @@ export class JigsawStackToolSet { execute: async ({ url, file_store_key, target_language }) => { if (url) { return await this.jigsawStack.translate.image({ - url, target_language, return_type: "url", }); } else if (file_store_key) { return await this.jigsawStack.translate.image({ - file_store_key, target_language, return_type: "url", }); From 5c30965759dcd954ae5e61bdbecaecbcc9b7c443 Mon Sep 17 00:00:00 2001 From: Win Cheng Date: Mon, 25 Aug 2025 16:17:28 -0700 Subject: [PATCH 09/13] linting --- package.json | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index e04520d..5353358 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,7 @@ { "name": "jigsawstack", "description": "JigsawStack - The AI SDK for Typescript and Javascript", - "keywords": [ - "framework", - "ai", - "nextjs", - "react" - ], + "keywords": ["framework", "ai", "nextjs", "react"], "type": "module", "license": "MIT", "version": "0.2.12", @@ -25,9 +20,7 @@ "main": "./dist/index.cjs", "module": "./dist/index.mjs", "types": "./dist/index.d.cts", - "files": [ - "dist/**" - ], + "files": ["dist/**"], "exports": { "require": { "types": "./dist/index.d.cts", From 5105b11257aaf9dfa401e13e53ac5998d35e4ef9 Mon Sep 17 00:00:00 2001 From: jigsawstack <91052168+VineeTagarwaL-code@users.noreply.github.com> Date: Tue, 26 Aug 2025 05:19:37 +0530 Subject: [PATCH 10/13] feat: update --- package.json | 2 +- src/general/interfaces.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 5353358..82063f9 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "scripts": { "build": "pkgroll --src=./", "format": "biome check --write .", - "test": "yarn build && node --test --no-warnings --import tsx --test-reporter=spec --require dotenv/config tests/*.ts" + "test": "yarn build && node --test --no-warnings --import tsx --test-reporter=spec tests/*.ts" }, "dependencies": { "isomorphic-fetch": "^3.0.0", diff --git a/src/general/interfaces.ts b/src/general/interfaces.ts index 43ec4d4..b04fcdc 100644 --- a/src/general/interfaces.ts +++ b/src/general/interfaces.ts @@ -55,6 +55,7 @@ export interface TranslateParams { } export type TranslateImageParams = { + url?: string; target_language: string; return_type?: "url" | "binary" | "base64"; }; From 9c47267725a7c0e751028c2ad5825cdd4e4b78e7 Mon Sep 17 00:00:00 2001 From: jigsawstack <91052168+VineeTagarwaL-code@users.noreply.github.com> Date: Wed, 27 Aug 2025 05:13:52 +0530 Subject: [PATCH 11/13] fix: fixes --- package.json | 1 - src/vercel-ai-toolkit.ts | 55 ++++++++++------------------------------ src/vision/interfaces.ts | 6 +++-- 3 files changed, 18 insertions(+), 44 deletions(-) diff --git a/package.json b/package.json index 82063f9..0e54e6d 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,6 @@ "devDependencies": { "@biomejs/biome": "^1.9.4", "@types/node": "^22.0.2", - "dotenv": "^17.2.1", "pkgroll": "^2.11.2", "tsx": "^4.16.4", "typescript": "^5.5.4" diff --git a/src/vercel-ai-toolkit.ts b/src/vercel-ai-toolkit.ts index e21e920..3a24a3e 100644 --- a/src/vercel-ai-toolkit.ts +++ b/src/vercel-ai-toolkit.ts @@ -89,24 +89,11 @@ export class JigsawStackToolSet { target_language: z.string().describe('Target language code (e.g., "en", "es", "fr")'), }), execute: async ({ url, file_store_key, target_language }) => { - if (url) { - return await this.jigsawStack.translate.image({ - target_language, - return_type: "url", - }); - } else if (file_store_key) { - return await this.jigsawStack.translate.image({ - target_language, - return_type: "url", - }); - } - - return { - success: true, - message: `Successfully translated image to ${target_language}`, + return await this.jigsawStack.translate.image({ + url, target_language, - note: "Image has been translated. Use jigsawStack.translate.image() directly to get the binary data.", - }; + return_type: "url", + }); }, }), @@ -265,19 +252,12 @@ export class JigsawStackToolSet { page_range: z.array(z.number()).optional().describe("Page range for PDF files"), }), execute: async ({ prompt, url, file_store_key, page_range }) => { - if (url) { - return await this.jigsawStack.vision.vocr({ - prompt, - url, - page_range, - }); - } else if (file_store_key) { - return await this.jigsawStack.vision.vocr({ - prompt, - file_store_key, - page_range, - }); - } + return await this.jigsawStack.vision.vocr({ + prompt, + url, + page_range, + file_store_key, + }); }, }), @@ -288,17 +268,10 @@ export class JigsawStackToolSet { file_store_key: z.string().optional().describe("File store key of uploaded image"), }), execute: async ({ url, file_store_key }) => { - if (url) { - return await this.jigsawStack.vision.object_detection({ - url, - return_type: "url", - }); - } else if (file_store_key) { - return await this.jigsawStack.vision.object_detection({ - file_store_key, - return_type: "url", - }); - } + return await this.jigsawStack.vision.object_detection({ + file_store_key, + return_type: "url", + }); }, }), diff --git a/src/vision/interfaces.ts b/src/vision/interfaces.ts index 0435be2..aba7b4b 100644 --- a/src/vision/interfaces.ts +++ b/src/vision/interfaces.ts @@ -3,7 +3,7 @@ export type VOCRParams = { url?: string; file_store_key?: string; page_range?: Array; -} & ({ url: string; file_store_key?: never } | { file_store_key: string; url?: never }); +}; interface Bounds { top_left: { @@ -47,11 +47,13 @@ export interface VOCRResponse { } export type ObjectDetectionParams = { + url?: string; + file_store_key?: string; prompts?: string[]; features?: ("object_detection" | "gui")[]; annotated_image?: boolean; return_type?: "url" | "base64"; -} & ({ url: string; file_store_key?: never } | { file_store_key: string; url?: never }); +}; export interface ObjectDetectionResponse { // Optional annotated image - included only if annotated_image=true and objects/gui_elements exist From 1f21488cc691df533b3cb3a7c39f7b36608a480b Mon Sep 17 00:00:00 2001 From: jigsawstack <91052168+VineeTagarwaL-code@users.noreply.github.com> Date: Wed, 27 Aug 2025 05:14:21 +0530 Subject: [PATCH 12/13] update --- yarn.lock | 5 ----- 1 file changed, 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index ecf7ba4..354862a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -535,11 +535,6 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -dotenv@^17.2.1: - version "17.2.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.2.1.tgz#6f32e10faf014883515538dc922a0fb8765d9b32" - integrity sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ== - esbuild@^0.24.2: version "0.24.2" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.2.tgz#b5b55bee7de017bff5fb8a4e3e44f2ebe2c3567d" From b671f4e4a326a5d70a0deaa5175b8104d82c8537 Mon Sep 17 00:00:00 2001 From: jigsawstack <91052168+VineeTagarwaL-code@users.noreply.github.com> Date: Wed, 27 Aug 2025 05:45:32 +0530 Subject: [PATCH 13/13] update --- src/general/interfaces.ts | 8 +++----- src/vercel-ai-toolkit.ts | 24 ++++++------------------ 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/src/general/interfaces.ts b/src/general/interfaces.ts index b04fcdc..dcaade3 100644 --- a/src/general/interfaces.ts +++ b/src/general/interfaces.ts @@ -3,11 +3,9 @@ import { BaseResponse } from "../../types"; export type TextToSQLParams = { prompt: string; database?: "postgresql" | "mysql" | "sqlite"; -} & ( - | { sql_schema: string; file_store_key?: never } - | { file_store_key: string; sql_schema?: never } - | { sql_schema?: undefined; file_store_key?: undefined } -); + sql_schema?: string; + file_store_key?: string; +}; export interface ImageGenerationParams { prompt: string; diff --git a/src/vercel-ai-toolkit.ts b/src/vercel-ai-toolkit.ts index 3a24a3e..813e6e0 100644 --- a/src/vercel-ai-toolkit.ts +++ b/src/vercel-ai-toolkit.ts @@ -147,24 +147,12 @@ export class JigsawStackToolSet { database: z.enum(["postgresql", "mysql", "sqlite"]).optional().describe("Database type"), }), execute: async ({ prompt, sql_schema, file_store_key, database }) => { - if (file_store_key) { - return await this.jigsawStack.text_to_sql({ - prompt, - file_store_key, - database, - }); - } else if (sql_schema) { - return await this.jigsawStack.text_to_sql({ - prompt, - sql_schema, - database, - }); - } else { - return await this.jigsawStack.text_to_sql({ - prompt, - database, - }); - } + return await this.jigsawStack.text_to_sql({ + prompt, + sql_schema, + file_store_key, + database, + }); }, }),