@vizlook/sdk
Version:
Vizlook JavaScript SDK
1 lines • 14.4 kB
Source Map (JSON)
{"version":3,"sources":["../src/errors.ts","../src/vizlook.ts","../src/index.ts"],"sourcesContent":["export enum HttpStatusCode {\n BadRequest = 400,\n Unauthorized = 401,\n InsufficientBalance = 402,\n TooManyRequests = 429,\n InternalServerError = 500,\n}\n\n/**\n * Error class for Vizlook API errors\n */\nexport class VizlookError extends Error {\n statusCode: number;\n timestamp: string;\n path?: string;\n extra?: Record<string, any>;\n\n /**\n * @param {string} [message] - Error message\n * @param {number} [statusCode] - HTTP status code\n * @param {Object} [options] - Error options\n * @param {string} [options.timestamp] - ISO timestamp string\n * @param {string} [options.path] - Path that caused the error\n * @param {Record<string, any>} [options.extra] - Extra information\n */\n constructor(\n message: string,\n statusCode: number,\n options?: {\n timestamp?: string;\n path?: string;\n extra?: Record<string, any>;\n }\n ) {\n super(message);\n this.name = \"VizlookError\";\n this.statusCode = statusCode;\n this.timestamp = options?.timestamp ?? new Date().toISOString();\n this.path = options?.path;\n this.extra = options?.extra;\n }\n}\n","import { HttpStatusCode, VizlookError } from \"./errors\";\nimport {\n AnswerOptions,\n AnswerResponse,\n AnswerStreamChunk,\n SearchOptions,\n SearchResponse,\n VideoContentsOptions,\n VideoContentsResponse,\n} from \"./types\";\n\nexport interface VizlookOptions {\n apiKey?: string;\n baseURL?: string;\n}\n\n/**\n * The Vizlook class encapsulates the API's endpoints.\n */\nexport class Vizlook {\n private baseURL: string;\n private headers: Headers;\n\n /**\n * Constructs the Vizlook SDK client.\n * @param {VizlookOptions} [VizlookOptions] - The options for the Vizlook SDK client.\n * @param {string} [VizlookOptions.apiKey] - The API key for authentication.\n * @param {string} [VizlookOptions.baseURL] - The base URL of the Vizlook API.\n */\n constructor({ apiKey, baseURL }: VizlookOptions = {}) {\n if (!apiKey) {\n apiKey = process.env.VIZLOOK_API_KEY;\n if (!apiKey) {\n throw new VizlookError(\n \"The API key must be provided as an argument or as an environment variable (VIZLOOK_API_KEY).\",\n HttpStatusCode.Unauthorized\n );\n }\n }\n\n this.baseURL = baseURL || \"https://api.vizlook.com\";\n this.headers = new Headers({\n \"x-api-key\": apiKey,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"vizlook-js-sdk 1.0.0\",\n });\n }\n\n /**\n * Makes a request to the Vizlook API.\n * @param {string} endpoint - The API endpoint to call.\n * @param {string} method - The HTTP method to use.\n * @param {any} [body] - The request body for POST requests.\n * @param {Record<string, any>} [params] - The query parameters.\n * @returns {Promise<T>} The response from the API.\n * @throws {VizlookError} When any API request fails with structured error information.\n */\n async request<T = unknown>(\n endpoint: string,\n method: string,\n body?: any,\n params?: Record<string, any>,\n headers?: Record<string, string>\n ): Promise<T> {\n let url = this.baseURL + endpoint;\n\n if (params && Object.keys(params).length > 0) {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (Array.isArray(value)) {\n for (const item of value) {\n searchParams.append(key, item);\n }\n } else if (value !== undefined) {\n searchParams.append(key, String(value));\n }\n }\n url += `?${searchParams.toString()}`;\n }\n\n let combinedHeaders: Record<string, string> = {};\n\n this.headers.forEach((value, key) => {\n combinedHeaders[key] = value;\n });\n\n if (headers) {\n combinedHeaders = { ...combinedHeaders, ...headers };\n }\n\n try {\n const response = await fetch(url, {\n method,\n headers: combinedHeaders,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n const { error = \"Unknown error.\", ...extra } = errorData;\n\n throw new VizlookError(error, response.status, {\n path: endpoint,\n extra,\n });\n }\n\n return (await response.json()) as T;\n } catch (err) {\n if (err instanceof VizlookError) {\n throw err;\n }\n\n throw new VizlookError(\n `An unknown error occurred while making the request.\\n${(err as Error).message || String(err)}`,\n HttpStatusCode.InternalServerError,\n {\n path: endpoint,\n }\n );\n }\n }\n\n /**\n * Performs a search with a query.\n *\n * @param {string} query - The query string. The query is limited to 500 characters.\n * @param {SearchOptions} [options] - Additional search options\n * @returns {Promise<SearchResponse>} A list of relevant search results.\n */\n async search(\n query: string,\n options?: SearchOptions\n ): Promise<SearchResponse> {\n const { includeTranscription, includeSummary, ...restOptions } =\n options || {};\n\n return await this.request<SearchResponse>(\"/search\", \"POST\", {\n query,\n contentOptions: {\n includeTranscription,\n includeSummary,\n },\n ...restOptions,\n });\n }\n\n /**\n * Answers a query in non-stream mode.\n *\n * @param {string} query - The query string. The query is limited to 500 characters.\n * @param {AnswerOptions} [options] - Additional answer options\n * @returns {Promise<AnswerResponse>} The answer to the query.\n */\n async answer(\n query: string,\n options?: AnswerOptions\n ): Promise<AnswerResponse> {\n const body = {\n query,\n stream: false,\n contentOptions: {\n includeTranscription: options?.includeTranscription,\n },\n };\n\n return await this.request<AnswerResponse>(\"/answer\", \"POST\", body);\n }\n\n /**\n * Answers a query in stream mode.\n *\n * @param {string} query - The query string. The query is limited to 500 characters.\n * @param {AnswerOptions} [options] - Additional answer options\n * @returns {Promise<AnswerStreamChunk>} The stream of answer chunks.\n *\n * Example:\n * ```ts\n * for await (const chunk of vizlook.streamAnswer(\"How to learn python?\", {\n * needTranscription: true,\n * })) {\n * console.log(chunk);\n * }\n * ```\n */\n async *streamAnswer(\n query: string,\n options?: AnswerOptions\n ): AsyncGenerator<AnswerStreamChunk> {\n const body = {\n query,\n stream: true,\n contentOptions: {\n includeTranscription: options?.includeTranscription,\n },\n };\n\n const response = await fetch(this.baseURL + \"/answer\", {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n const { error = \"Unknown error.\", ...extra } = errorData;\n\n throw new VizlookError(error, response.status, {\n path: \"/answer\",\n extra,\n });\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new VizlookError(\n \"No response body available for streaming.\",\n HttpStatusCode.InternalServerError,\n {\n path: \"/answer\",\n }\n );\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) {\n continue;\n }\n\n const jsonStr = line.replace(/^data:\\s*/, \"\").trim();\n if (!jsonStr || jsonStr === \"[DONE]\") {\n continue;\n }\n\n let chunkData: any;\n try {\n chunkData = JSON.parse(jsonStr) as AnswerStreamChunk;\n yield chunkData;\n } catch (err) {\n continue;\n }\n }\n }\n\n if (buffer.startsWith(\"data: \")) {\n const leftover = buffer.replace(/^data:\\s*/, \"\").trim();\n if (leftover && leftover !== \"[DONE]\") {\n try {\n const chunkData = JSON.parse(leftover) as AnswerStreamChunk;\n yield chunkData;\n } catch (e) {\n // ignore\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Retrieves contents of videos based on URLs.\n *\n * @param {string | string[]} urls - A URL or array of URLs. Only support YouTube URLs for now, such as https://www.youtube.com/watch?v=xxxxxx\n * @param {VideoContentsOptions} [options] - Additional options for retrieving video contents.\n * @returns {Promise<VideoContentsResponse>} A list of video contents for the requested URLs.\n */\n async getVideoContents(\n urls: string | string[],\n options?: VideoContentsOptions\n ): Promise<VideoContentsResponse> {\n if (!Array.isArray(urls)) {\n urls = [urls];\n }\n\n const { includeTranscription, includeSummary, ...restOptions } =\n options || {};\n\n return await this.request<VideoContentsResponse>(\"/videos\", \"POST\", {\n urls,\n contentOptions: {\n // The result will include at least one of the transcription and summary; by default, the transcription will be returned.\n includeTranscription: includeTranscription || !includeSummary,\n includeSummary,\n },\n ...restOptions,\n });\n }\n}\n","import { Vizlook } from \"./vizlook\";\n\nexport * from \"./vizlook\";\nexport * from \"./errors\";\nexport * from \"./types\";\n\nexport default Vizlook;\n"],"mappings":";AAAO,IAAK,iBAAL,kBAAKA,oBAAL;AACL,EAAAA,gCAAA,gBAAa,OAAb;AACA,EAAAA,gCAAA,kBAAe,OAAf;AACA,EAAAA,gCAAA,yBAAsB,OAAtB;AACA,EAAAA,gCAAA,qBAAkB,OAAlB;AACA,EAAAA,gCAAA,yBAAsB,OAAtB;AALU,SAAAA;AAAA,GAAA;AAWL,IAAM,eAAN,cAA2B,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EActC,YACE,SACA,YACA,SAKA;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,YAAY,SAAS,cAAa,oBAAI,KAAK,GAAE,YAAY;AAC9D,SAAK,OAAO,SAAS;AACrB,SAAK,QAAQ,SAAS;AAAA,EACxB;AACF;;;ACtBO,IAAM,UAAN,MAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUnB,YAAY,EAAE,QAAQ,QAAQ,IAAoB,CAAC,GAAG;AACpD,QAAI,CAAC,QAAQ;AACX,eAAS,QAAQ,IAAI;AACrB,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI;AAAA,UACR;AAAA;AAAA,QAEF;AAAA,MACF;AAAA,IACF;AAEA,SAAK,UAAU,WAAW;AAC1B,SAAK,UAAU,IAAI,QAAQ;AAAA,MACzB,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,QACJ,UACA,QACA,MACA,QACA,SACY;AACZ,QAAI,MAAM,KAAK,UAAU;AAEzB,QAAI,UAAU,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAC5C,YAAM,eAAe,IAAI,gBAAgB;AACzC,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,YAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,qBAAW,QAAQ,OAAO;AACxB,yBAAa,OAAO,KAAK,IAAI;AAAA,UAC/B;AAAA,QACF,WAAW,UAAU,QAAW;AAC9B,uBAAa,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,QACxC;AAAA,MACF;AACA,aAAO,IAAI,aAAa,SAAS,CAAC;AAAA,IACpC;AAEA,QAAI,kBAA0C,CAAC;AAE/C,SAAK,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AACnC,sBAAgB,GAAG,IAAI;AAAA,IACzB,CAAC;AAED,QAAI,SAAS;AACX,wBAAkB,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAAA,IACrD;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC;AAAA,QACA,SAAS;AAAA,QACT,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,MACtC,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY,MAAM,SAAS,KAAK;AACtC,cAAM,EAAE,QAAQ,kBAAkB,GAAG,MAAM,IAAI;AAE/C,cAAM,IAAI,aAAa,OAAO,SAAS,QAAQ;AAAA,UAC7C,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AAAA,MACH;AAEA,aAAQ,MAAM,SAAS,KAAK;AAAA,IAC9B,SAAS,KAAK;AACZ,UAAI,eAAe,cAAc;AAC/B,cAAM;AAAA,MACR;AAEA,YAAM,IAAI;AAAA,QACR;AAAA,EAAyD,IAAc,WAAW,OAAO,GAAG,CAAC;AAAA;AAAA,QAE7F;AAAA,UACE,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OACJ,OACA,SACyB;AACzB,UAAM,EAAE,sBAAsB,gBAAgB,GAAG,YAAY,IAC3D,WAAW,CAAC;AAEd,WAAO,MAAM,KAAK,QAAwB,WAAW,QAAQ;AAAA,MAC3D;AAAA,MACA,gBAAgB;AAAA,QACd;AAAA,QACA;AAAA,MACF;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OACJ,OACA,SACyB;AACzB,UAAM,OAAO;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,MACR,gBAAgB;AAAA,QACd,sBAAsB,SAAS;AAAA,MACjC;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,QAAwB,WAAW,QAAQ,IAAI;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,OAAO,aACL,OACA,SACmC;AACnC,UAAM,OAAO;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,MACR,gBAAgB;AAAA,QACd,sBAAsB,SAAS;AAAA,MACjC;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,MAAM,KAAK,UAAU,WAAW;AAAA,MACrD,QAAQ;AAAA,MACR,SAAS,KAAK;AAAA,MACd,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC,YAAM,EAAE,QAAQ,kBAAkB,GAAG,MAAM,IAAI;AAE/C,YAAM,IAAI,aAAa,OAAO,SAAS,QAAQ;AAAA,QAC7C,MAAM;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,SAAS,MAAM,UAAU;AACxC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR;AAAA;AAAA,QAEA;AAAA,UACE,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,IAAI,YAAY;AAChC,QAAI,SAAS;AAEb,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,MAAM;AACR;AAAA,QACF;AAEA,kBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,cAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,iBAAS,MAAM,IAAI,KAAK;AAExB,mBAAW,QAAQ,OAAO;AACxB,cAAI,CAAC,KAAK,WAAW,QAAQ,GAAG;AAC9B;AAAA,UACF;AAEA,gBAAM,UAAU,KAAK,QAAQ,aAAa,EAAE,EAAE,KAAK;AACnD,cAAI,CAAC,WAAW,YAAY,UAAU;AACpC;AAAA,UACF;AAEA,cAAI;AACJ,cAAI;AACF,wBAAY,KAAK,MAAM,OAAO;AAC9B,kBAAM;AAAA,UACR,SAAS,KAAK;AACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,OAAO,WAAW,QAAQ,GAAG;AAC/B,cAAM,WAAW,OAAO,QAAQ,aAAa,EAAE,EAAE,KAAK;AACtD,YAAI,YAAY,aAAa,UAAU;AACrC,cAAI;AACF,kBAAM,YAAY,KAAK,MAAM,QAAQ;AACrC,kBAAM;AAAA,UACR,SAAS,GAAG;AAAA,UAEZ;AAAA,QACF;AAAA,MACF;AAAA,IACF,UAAE;AACA,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBACJ,MACA,SACgC;AAChC,QAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,aAAO,CAAC,IAAI;AAAA,IACd;AAEA,UAAM,EAAE,sBAAsB,gBAAgB,GAAG,YAAY,IAC3D,WAAW,CAAC;AAEd,WAAO,MAAM,KAAK,QAA+B,WAAW,QAAQ;AAAA,MAClE;AAAA,MACA,gBAAgB;AAAA;AAAA,QAEd,sBAAsB,wBAAwB,CAAC;AAAA,QAC/C;AAAA,MACF;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AACF;;;ACxSA,IAAO,gBAAQ;","names":["HttpStatusCode"]}