Skip to content

Commit

Permalink
integrate jigsawstack tools
Browse files Browse the repository at this point in the history
  • Loading branch information
iamNarcisse committed Sep 19, 2024
1 parent 27599b7 commit 1157f27
Show file tree
Hide file tree
Showing 5 changed files with 322 additions and 0 deletions.
48 changes: 48 additions & 0 deletions packages/jigsawstack/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
{
"name": "@agentic/jigsawstack",
"version": "1.0.0",
"description": "Agentic adapter for the Jigsawstack AI SDK.",
"author": "Narcisse Egonu",
"license": "MIT",
"repository": {
"type": "git",
"url": "git+https://github.com/transitive-bullshit/agentic.git"
},
"type": "module",
"source": "./src/index.ts",
"types": "./dist/index.d.ts",
"sideEffects": false,
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.js",
"default": "./dist/index.js"
}
},
"files": [
"dist"
],
"scripts": {
"build": "tsup --config ../../tsup.config.ts",
"dev": "tsup --config ../../tsup.config.ts --watch",
"clean": "del dist",
"test": "run-s test:*",
"test:lint": "eslint .",
"test:typecheck": "tsc --noEmit",
"test:unit": "vitest run"
},
"peerDependencies": {
"@agentic/core": "workspace:*"
},
"devDependencies": {
"@agentic/core": "workspace:*",
"@agentic/tsconfig": "workspace:*"
},
"publishConfig": {
"access": "public"
},
"dependencies": {
"ky": "^1.5.0",
"p-throttle": "^6.1.0"
}
}
1 change: 1 addition & 0 deletions packages/jigsawstack/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './jigsawstack-client'
57 changes: 57 additions & 0 deletions packages/jigsawstack/src/integration.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// eslint-disable-next-line simple-import-sort/imports

import { expect, test } from 'vitest'

import { type jigsawstack,JigsawStackClient } from './jigsawstack-client'

const jigsaw = new JigsawStackClient()

test.skip('should run successfully and return the search result', async () => {
const params: jigsawstack.SearchParams = {
query: 'The leaning tower of pisa',
ai_overview: true,
spell_check: true
}
const result = await jigsaw.aiSearch(params)
expect(result).toBeTruthy()
expect(result.success).toBe(true)
})

test.skip('should run successfully and return the valid sql result', async () => {
const params: jigsawstack.TextToSqlParams = {
sql_schema:
"CREATE TABLE Transactions (transaction_id INT PRIMARY KEY, user_id INT NOT NULL,total_amount DECIMAL(10, 2 NOT NULL, transaction_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,status VARCHAR(20) DEFAULT 'pending',FOREIGN KEY(user_id) REFERENCES Users(user_id))",
prompt:
'Generate a query to get transactions that amount exceed 10000 and sort by when created'
}

const result = await jigsaw.textToSql(params)
expect(result).toBeTruthy()
expect(result.success).toBe(true)
})

test.skip('should return result.success is true for successful vocr', async () => {
const result = await jigsaw.vocr({
prompt: 'Describe the image in detail',
url: 'https://rogilvkqloanxtvjfrkm.supabase.co/storage/v1/object/public/demo/Collabo%201080x842.jpg?t=2024-03-22T09%3A22%3A48.442Z'
})
expect(result.success).toBe(true)
})

test('should run successfully and return the transcribe result', async () => {
const data = await jigsaw.speechToText({
url: 'https://rogilvkqloanxtvjfrkm.supabase.co/storage/v1/object/public/demo/Video%201737458382653833217.mp4?t=2024-03-22T09%3A50%3A49.894'
})
expect(data).toBeTruthy()
expect(data.success).toBe(true)
})

test.skip('should run successfully and return scrape result', async () => {
const params: jigsawstack.ScrapeParams = {
url: 'https://jigsawstack.com/pricing',
element_prompts: ['Pro Plan']
}
const result = await jigsaw.aiScrape(params)
expect(result).toBeTruthy()
expect(result.success).toBe(true)
})
210 changes: 210 additions & 0 deletions packages/jigsawstack/src/jigsawstack-client.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
import { AIFunctionsProvider, assert, getEnv } from '@agentic/core'
import ky, { type KyInstance } from 'ky'

export namespace jigsawstack {
export interface BaseResponse {
success: boolean
}

export const API_BASE_URL = 'https://api.jigsawstack.com/v1/'

export interface SearchParams {
query: string
ai_overview?: boolean
safe_search?: 'moderate' | 'strict' | 'off'
spell_check?: boolean
}

export interface SearchResponse extends BaseResponse {
query: string
spell_fixed: string
is_safe: boolean
ai_overview: string
results: {
title: string
url: string
description: string
content: string
is_safe: boolean
site_name: string
site_long_name: string
age: string
language: string
favicon: string
snippets: string[]
related_index: []
}[]
}

export interface CookieParameter {
name: string
value: string
url?: string
domain?: string
path?: string
secure?: boolean
httpOnly?: boolean
sameSite?: 'Strict' | 'Lax' | 'None'
expires?: boolean
priority?: string
sameParty?: boolean
}

export interface ScrapeParams {
url: string
element_prompts: string[]
http_headers?: object
reject_request_pattern?: string[]
goto_options?: {
timeout: number
wait_until: string
}
wait_for?: {
mode: string
value: string | number
}
advance_config?: {
console: boolean
network: boolean
cookies: boolean
}
size_preset?: string
is_mobile?: boolean
scale?: number
width?: number
height?: number
cookies?: Array<CookieParameter>
}

export interface ScrapeResponse extends BaseResponse {
data: any
}

export interface VOCRParams {
prompt: string | string[]
url?: string
file_store_key?: string
}

export interface VOCRResponse extends BaseResponse {
context: string
width: number
height: number
tags: string[]
has_text: boolean
sections: Array<any>
}

export interface TextToSqlParams {
prompt: string
sql_schema?: string
file_store_key?: string
}

export interface TextToSqlResponse extends BaseResponse {
sql: string
}

export interface SpeechToTextParams {
url?: string
file_store_key?: string
language?: string
translate?: boolean
by_speaker?: boolean
webhook_url?: string
}

export interface SpeechToTextResponse extends BaseResponse {
text: string
chunks: Array<{
timestamp: number[]
text: string
}>
status?: 'processing' | 'error'
id?: string
}
}

/**
* Basic JigsawStack API wrapper.
*/
export class JigsawStackClient extends AIFunctionsProvider {
protected readonly apiKey: string
protected readonly ky: KyInstance
constructor({
apiKey = getEnv('JIGSAWSTACK_API_KEY'),
timeoutMs = 60_000
}: {
apiKey?: string
throttle?: boolean
timeoutMs?: number
} = {}) {
assert(
apiKey,
'Please set the JIGSAWSTACK_API_KEY environment variable or pass it to the constructor as the apiKey field.'
)
super()
this.apiKey = apiKey
this.ky = ky.extend({
prefixUrl: jigsawstack.API_BASE_URL,
timeout: timeoutMs,
headers: {
'x-api-key': this.apiKey
}
})
}

async aiSearch(params: jigsawstack.SearchParams) {
return this.ky
.get('web/search', {
searchParams: {
...params
}
})
.json<jigsawstack.SearchResponse>()
}

async aiScrape(params: jigsawstack.ScrapeParams) {
return this.ky
.post('ai/scrape', {
json: {
...params
}
})
.json<jigsawstack.ScrapeResponse>()
}

async vocr(params: jigsawstack.VOCRParams) {
return this.ky
.post('vocr', {
json: {
...params
}
})
.json<jigsawstack.VOCRResponse>()
}

async textToSql(
params: jigsawstack.TextToSqlParams
): Promise<jigsawstack.TextToSqlResponse> {
return this.ky
.post('ai/sql', {
json: {
...params
}
})
.json<jigsawstack.TextToSqlResponse>()
}

async speechToText(
params: jigsawstack.SpeechToTextParams
): Promise<jigsawstack.SpeechToTextResponse> {
return this.ky
.post('ai/transcribe', {
json: {
...params
}
})
.json<jigsawstack.SpeechToTextResponse>()
}
}
6 changes: 6 additions & 0 deletions packages/jigsawstack/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"extends": "@agentic/tsconfig/base.json",
"include": ["src"],
"exclude": ["node_modules", "dist"]
}

0 comments on commit 1157f27

Please sign in to comment.