UNPKG

@gensx/storage

Version:

Cloud storage, blobs, sqlite, and vector database providers/hooks for GenSX.

1 lines 24.8 kB
{"version":3,"file":"remote.cjs","sources":["@gensx/storage/../../../../src/search/remote.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/only-throw-error */\n\nimport { readConfig } from \"@gensx/core\";\n\nimport { parseErrorResponse } from \"../utils/parse-error.js\";\nimport { USER_AGENT } from \"../utils/user-agent.js\";\nimport {\n DeleteNamespaceResult,\n EnsureNamespaceResult,\n Namespace,\n QueryOptions,\n QueryResults,\n Schema,\n SearchStorage as ISearchStorage,\n WriteParams,\n} from \"./types.js\";\n\n/**\n * Base URL for the GenSX Console API\n */\nconst API_BASE_URL = \"https://api.gensx.com\";\n\n/**\n * Error types for search operations\n */\nexport type SearchErrorCode =\n | \"NOT_FOUND\"\n | \"PERMISSION_DENIED\"\n | \"INVALID_ARGUMENT\"\n | \"SEARCH_ERROR\"\n | \"NOT_IMPLEMENTED\"\n | \"NETWORK_ERROR\";\n\n/**\n * Abstract base error class for search operations\n */\nexport abstract class SearchError extends Error {\n constructor(\n public readonly code: SearchErrorCode,\n message: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = \"SearchError\";\n }\n}\n\n/**\n * Error class for when a vector is not found\n */\nexport class SearchNotFoundError extends SearchError {\n constructor(message: string, cause?: Error) {\n super(\"NOT_FOUND\", message, cause);\n this.name = \"SearchNotFoundError\";\n }\n}\n\n/**\n * Error class for permission denied errors\n */\nexport class SearchPermissionDeniedError extends SearchError {\n constructor(message: string, cause?: Error) {\n super(\"PERMISSION_DENIED\", message, cause);\n this.name = \"SearchPermissionDeniedError\";\n }\n}\n\n/**\n * Error class for invalid argument errors\n */\nexport class SearchInvalidArgumentError extends SearchError {\n constructor(message: string, cause?: Error) {\n super(\"INVALID_ARGUMENT\", message, cause);\n this.name = \"SearchInvalidArgumentError\";\n }\n}\n\n/**\n * Error class for API errors (bad requests, server errors, etc.)\n */\nexport class SearchApiError extends SearchError {\n constructor(message: string, cause?: Error) {\n super(\"SEARCH_ERROR\", message, cause);\n this.name = \"SearchApiError\";\n }\n}\n\n/**\n * Error class for malformed or missing API responses\n */\nexport class SearchResponseError extends SearchError {\n constructor(message: string, cause?: Error) {\n super(\"SEARCH_ERROR\", message, cause);\n this.name = \"SearchResponseError\";\n }\n}\n\n/**\n * Error class for not implemented errors\n */\nexport class SearchNotImplementedError extends SearchError {\n constructor(message: string, cause?: Error) {\n super(\"NOT_IMPLEMENTED\", message, cause);\n this.name = \"SearchNotImplementedError\";\n }\n}\n\n/**\n * Error class for network errors\n */\nexport class SearchNetworkError extends SearchError {\n constructor(message: string, cause?: Error) {\n super(\"NETWORK_ERROR\", message, cause);\n this.name = \"SearchNetworkError\";\n }\n}\n\n/**\n * Helper to convert API errors to more specific errors\n */\nfunction handleApiError(err: unknown, operation: string): never {\n if (err instanceof SearchError) {\n throw err;\n }\n if (err instanceof Error) {\n throw new SearchNetworkError(\n `Error during ${operation}: ${err.message}`,\n err,\n );\n }\n throw new SearchNetworkError(`Error during ${operation}: ${String(err)}`);\n}\n\n/**\n * Remote implementation of vector namespace\n */\nexport class SearchNamespace implements Namespace {\n constructor(\n public readonly namespaceId: string,\n private apiBaseUrl: string,\n private apiKey: string,\n private org: string,\n private project: string,\n private environment: string,\n ) {}\n\n async write({\n upsertColumns,\n upsertRows,\n patchColumns,\n patchRows,\n deletes,\n deleteByFilter,\n distanceMetric,\n schema,\n }: WriteParams): Promise<{ message: string; rowsAffected: number }> {\n try {\n const response = await fetch(\n `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/search/${encodeURIComponent(this.namespaceId)}`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": USER_AGENT,\n },\n body: JSON.stringify({\n upsertColumns,\n upsertRows,\n patchColumns,\n patchRows,\n deletes,\n deleteByFilter,\n distanceMetric,\n schema,\n } as Record<string, unknown>),\n },\n );\n\n if (!response.ok) {\n const message = await parseErrorResponse(response);\n throw new SearchApiError(`Failed to write: ${message}`);\n }\n\n const data = (await response.json()) as {\n message: string;\n rowsAffected: number;\n };\n return data;\n } catch (err) {\n if (!(err instanceof SearchError)) {\n throw handleApiError(err, \"write\");\n }\n throw err;\n }\n }\n\n async query({\n topK,\n includeAttributes,\n filters,\n rankBy,\n aggregateBy,\n consistency,\n }: QueryOptions): Promise<QueryResults> {\n try {\n const response = await fetch(\n `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/search/${encodeURIComponent(this.namespaceId)}/query`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": USER_AGENT,\n },\n body: JSON.stringify({\n rankBy,\n topK: topK,\n includeAttributes,\n filters,\n aggregateBy,\n consistency,\n }),\n },\n );\n\n if (!response.ok) {\n const message = await parseErrorResponse(response);\n throw new SearchApiError(`Failed to query: ${message}`);\n }\n\n const data = (await response.json()) as QueryResults;\n return data;\n } catch (err) {\n if (!(err instanceof SearchError)) {\n throw handleApiError(err, \"query\");\n }\n throw err;\n }\n }\n\n async getSchema(): Promise<Schema> {\n try {\n const response = await fetch(\n `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/search/${encodeURIComponent(this.namespaceId)}/schema`,\n {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"User-Agent\": USER_AGENT,\n },\n },\n );\n\n if (!response.ok) {\n const message = await parseErrorResponse(response);\n throw new SearchApiError(`Failed to get schema: ${message}`);\n }\n\n const data = (await response.json()) as Schema;\n return data;\n } catch (err) {\n if (!(err instanceof SearchError)) {\n throw handleApiError(err, \"schema\");\n }\n throw err;\n }\n }\n\n async updateSchema({ schema }: { schema: Schema }): Promise<Schema> {\n try {\n const response = await fetch(\n `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/search/${encodeURIComponent(this.namespaceId)}/schema`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": USER_AGENT,\n },\n body: JSON.stringify(schema),\n },\n );\n\n if (!response.ok) {\n const message = await parseErrorResponse(response);\n throw new SearchApiError(`Failed to update schema: ${message}`);\n }\n\n const data = (await response.json()) as Schema;\n return data;\n } catch (err) {\n if (!(err instanceof SearchError)) {\n throw handleApiError(err, \"updateSchema\");\n }\n throw err;\n }\n }\n}\n\n/**\n * Remote implementation of search\n */\nexport class SearchStorage implements ISearchStorage {\n private apiKey: string;\n private apiBaseUrl: string;\n private org: string;\n private project: string;\n private environment: string;\n private namespaces: Map<string, SearchNamespace> = new Map<\n string,\n SearchNamespace\n >();\n\n constructor(project: string, environment: string) {\n this.project = project;\n this.environment = environment;\n\n const config = readConfig();\n\n this.apiKey = process.env.GENSX_API_KEY ?? config.api?.token ?? \"\";\n if (!this.apiKey) {\n throw new Error(\n \"GENSX_API_KEY environment variable must be set for search\",\n );\n }\n\n this.org = process.env.GENSX_ORG ?? config.api?.org ?? \"\";\n if (!this.org) {\n throw new Error(\n \"Organization ID must be provided via constructor or GENSX_ORG environment variable\",\n );\n }\n\n this.apiBaseUrl =\n process.env.GENSX_API_BASE_URL ?? config.api?.baseUrl ?? API_BASE_URL;\n }\n\n getNamespace(name: string): Namespace {\n if (!this.namespaces.has(name)) {\n this.namespaces.set(\n name,\n new SearchNamespace(\n name,\n this.apiBaseUrl,\n this.apiKey,\n this.org,\n this.project,\n this.environment,\n ),\n );\n }\n\n return this.namespaces.get(name)!;\n }\n\n async ensureNamespace(name: string): Promise<EnsureNamespaceResult> {\n try {\n const response = await fetch(\n `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/search/${encodeURIComponent(name)}/ensure`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"User-Agent\": USER_AGENT,\n },\n },\n );\n\n if (!response.ok) {\n const message = await parseErrorResponse(response);\n throw new SearchApiError(`Failed to ensure namespace: ${message}`);\n }\n\n const data = (await response.json()) as EnsureNamespaceResult;\n\n // Make sure the namespace is in our cache\n if (!this.namespaces.has(name)) {\n this.getNamespace(name);\n }\n\n return data;\n } catch (err) {\n if (!(err instanceof SearchError)) {\n throw handleApiError(err, \"ensureNamespace\");\n }\n throw err;\n }\n }\n\n async deleteNamespace(name: string): Promise<DeleteNamespaceResult> {\n try {\n const response = await fetch(\n `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/search/${encodeURIComponent(name)}`,\n {\n method: \"DELETE\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"User-Agent\": USER_AGENT,\n },\n },\n );\n\n if (!response.ok) {\n const message = await parseErrorResponse(response);\n throw new SearchApiError(`Failed to delete namespace: ${message}`);\n }\n\n const data = (await response.json()) as DeleteNamespaceResult;\n\n // Remove namespace from caches if it was successfully deleted\n if (data.deleted) {\n if (this.namespaces.has(name)) {\n const ns = this.namespaces.get(name);\n if (ns) {\n this.namespaces.delete(name);\n }\n }\n }\n\n return data;\n } catch (err) {\n if (!(err instanceof SearchError)) {\n throw handleApiError(err, \"deleteNamespace\");\n }\n throw err;\n }\n }\n\n async listNamespaces(options?: {\n prefix?: string;\n limit?: number;\n cursor?: string;\n }): Promise<{\n namespaces: { name: string; createdAt: Date }[];\n nextCursor?: string;\n }> {\n try {\n // Normalize prefix by removing trailing slash\n const normalizedPrefix = options?.prefix?.replace(/\\/$/, \"\");\n\n const url = new URL(\n `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/search`,\n );\n\n if (normalizedPrefix) {\n url.searchParams.append(\"prefix\", normalizedPrefix);\n }\n\n if (options?.limit) {\n url.searchParams.append(\"limit\", options.limit.toString());\n }\n\n if (options?.cursor) {\n url.searchParams.append(\"cursor\", options.cursor);\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"User-Agent\": USER_AGENT,\n },\n });\n\n if (!response.ok) {\n const message = await parseErrorResponse(response);\n throw new SearchApiError(`Failed to list namespaces: ${message}`);\n }\n\n const data = (await response.json()) as {\n namespaces: { name: string; createdAt: string }[];\n nextCursor?: string;\n };\n\n return {\n namespaces: data.namespaces.map((ns) => ({\n name: ns.name,\n createdAt: new Date(ns.createdAt),\n })),\n nextCursor: data.nextCursor,\n };\n } catch (err) {\n if (!(err instanceof SearchError)) {\n throw handleApiError(err, \"listNamespaces\");\n }\n throw err;\n }\n }\n\n hasEnsuredNamespace(name: string): boolean {\n return this.namespaces.has(name);\n }\n\n /**\n * Check if a namespace exists\n * @param name The namespace name to check\n * @returns Promise that resolves to true if the namespace exists\n */\n async namespaceExists(name: string): Promise<boolean> {\n try {\n const response = await fetch(\n `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/search/${encodeURIComponent(name)}`,\n {\n method: \"HEAD\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"User-Agent\": USER_AGENT,\n },\n },\n );\n\n return response.ok;\n } catch (err) {\n if (!(err instanceof SearchError)) {\n throw handleApiError(err, \"namespaceExists\");\n }\n throw err;\n }\n }\n}\n"],"names":["USER_AGENT","parseErrorResponse","readConfig"],"mappings":"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"}