@superlinked/sie-sdk 0.1.10 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +54 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +42 -10
- package/dist/index.d.ts +42 -10
- package/dist/index.js +54 -19
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/internal/constants.ts","../src/version.ts","../src/msgpack.ts","../src/internal/retry.ts","../src/internal/parsing.ts","../src/client.ts","../src/types.ts","../src/encoding.ts","../src/scoring.ts","../src/images.ts"],"names":["buffer","getRetryAfter"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Error classes for the SIE TypeScript SDK.\n *\n * These errors mirror the Python SDK (packages/sie_sdk/src/sie_sdk/client/errors.py)\n * for consistent error handling across languages.\n *\n * @example\n * // Catching specific error types\n * try {\n * await client.encode(\"model\", { text: \"hello\" });\n * } catch (error) {\n * if (error instanceof RequestError) {\n * console.error(`Bad request (${error.code}): ${error.message}`);\n * } else if (error instanceof ProvisioningError) {\n * console.log(`GPU ${error.gpu} is provisioning, retry after ${error.retryAfter}ms`);\n * } else if (error instanceof SIEConnectionError) {\n * console.error(\"Cannot reach server:\", error.message);\n * }\n * }\n */\n\n/**\n * Base error for all SIE SDK errors.\n *\n * All SIE errors extend this class, so you can catch all SDK errors with:\n * `catch (error) { if (error instanceof SIEError) { ... } }`\n */\nexport class SIEError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SIEError\";\n // Maintain proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error connecting to the SIE server.\n *\n * Raised when:\n * - Network is unreachable\n * - DNS resolution fails\n * - Connection times out\n * - Server refuses connection\n */\nexport class SIEConnectionError extends SIEError {\n constructor(message: string) {\n super(message);\n this.name = \"SIEConnectionError\";\n }\n}\n\n/**\n * Error in the request (4xx responses).\n *\n * Raised when the client sends an invalid request:\n * - 400: Bad request (invalid parameters, malformed body)\n * - 401: Unauthorized (missing or invalid API key)\n * - 403: Forbidden (insufficient permissions)\n * - 404: Not found (invalid endpoint or model)\n * - 422: Validation error (invalid input format)\n */\nexport class RequestError extends SIEError {\n /** Error code from the server (e.g., \"INVALID_MODEL\", \"VALIDATION_ERROR\") */\n readonly code: string | undefined;\n /** HTTP status code (400-499) */\n readonly statusCode: number | undefined;\n\n constructor(message: string, code?: string, statusCode?: number) {\n super(message);\n this.name = \"RequestError\";\n this.code = code;\n this.statusCode = statusCode;\n }\n}\n\n/**\n * Error from the server (5xx responses).\n *\n * Raised when the server encounters an internal error:\n * - 500: Internal server error\n * - 502: Bad gateway\n * - 503: Service unavailable\n * - 504: Gateway timeout\n */\nexport class ServerError extends SIEError {\n /** Error code from the server (e.g., \"INTERNAL_ERROR\", \"LORA_LOADING\") */\n readonly code: string | undefined;\n /** HTTP status code (500-599) */\n readonly statusCode: number | undefined;\n\n constructor(message: string, code?: string, statusCode?: number) {\n super(message);\n this.name = \"ServerError\";\n this.code = code;\n this.statusCode = statusCode;\n }\n}\n\n/**\n * Error when capacity is not available and provisioning timed out.\n *\n * Raised when:\n * - Server returns 202 (no capacity, provisioning)\n * - waitForCapacity is false (caller doesn't want to wait)\n * - Or provisioning timeout exceeded\n *\n * The caller can use `retryAfter` to know when to retry.\n */\nexport class ProvisioningError extends SIEError {\n /** The GPU type that was requested */\n readonly gpu: string | undefined;\n /** Suggested retry delay in milliseconds (from server Retry-After header) */\n readonly retryAfter: number | undefined;\n\n constructor(message: string, gpu?: string, retryAfter?: number) {\n super(message);\n this.name = \"ProvisioningError\";\n this.gpu = gpu;\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Error related to resource pool operations.\n *\n * Raised when:\n * - Pool creation fails (e.g., insufficient capacity)\n * - Pool not found\n * - Pool in invalid state (e.g., expired)\n * - Pool lease renewal fails\n */\nexport class PoolError extends SIEError {\n /** Name of the pool */\n readonly poolName: string | undefined;\n /** Current pool state (if known): \"pending\", \"active\", \"expired\" */\n readonly state: string | undefined;\n\n constructor(message: string, poolName?: string, state?: string) {\n super(message);\n this.name = \"PoolError\";\n this.poolName = poolName;\n this.state = state;\n }\n}\n\n/**\n * Error when LoRA adapter is loading and retry limit exceeded.\n *\n * Raised when:\n * - Server returns 503 with LORA_LOADING code\n * - Retry limit is exceeded\n *\n * This usually means the adapter is being loaded from disk/network\n * and the caller should wait longer or reduce request rate.\n */\nexport class LoraLoadingError extends SIEError {\n /** The LoRA adapter that was requested */\n readonly lora: string | undefined;\n /** The model the LoRA was requested for */\n readonly model: string | undefined;\n\n constructor(message: string, lora?: string, model?: string) {\n super(message);\n this.name = \"LoraLoadingError\";\n this.lora = lora;\n this.model = model;\n }\n}\n\n/**\n * Error when model is loading and retry limit exceeded.\n *\n * Raised when:\n * - Server returns 503 with MODEL_LOADING code\n * - Retry limit is exceeded\n *\n * This usually means the model is being loaded from disk/HuggingFace\n * and the caller should wait longer.\n */\nexport class ModelLoadingError extends SIEError {\n /** The model that was requested */\n readonly model: string | undefined;\n\n constructor(message: string, model?: string) {\n super(message);\n this.name = \"ModelLoadingError\";\n this.model = model;\n }\n}\n","/**\n * Internal constants for the SIE TypeScript SDK\n */\n\nexport const MSGPACK_CONTENT_TYPE = \"application/msgpack\";\nexport const JSON_CONTENT_TYPE = \"application/json\";\n\nexport const HTTP_ACCEPTED = 202;\nexport const HTTP_CLIENT_ERROR_MIN = 400;\nexport const HTTP_CLIENT_ERROR_MAX = 499;\nexport const HTTP_SERVER_ERROR_MIN = 500;\nexport const HTTP_SERVER_ERROR_MAX = 599;\n\n// Default timeouts and delays\nexport const DEFAULT_TIMEOUT = 30_000; // 30 seconds\nexport const DEFAULT_PROVISION_TIMEOUT = 300_000; // 5 minutes (300s matches Python SDK)\nexport const DEFAULT_RETRY_DELAY = 5_000; // 5 seconds (matches Python SDK)\nexport const DEFAULT_MAX_RETRY_DELAY = 30_000; // 30 seconds\nexport const DEFAULT_LEASE_RENEWAL_INTERVAL = 60_000; // 1 minute\n\n// LoRA loading retry settings\nexport const LORA_LOADING_MAX_RETRIES = 10; // Max retries for LoRA loading\nexport const LORA_LOADING_DEFAULT_DELAY = 1_000; // 1 second default retry delay\nexport const LORA_LOADING_ERROR_CODE = \"LORA_LOADING\"; // Error code from server\n\n// Model loading retry settings\nexport const MODEL_LOADING_MAX_RETRIES = 60; // Max retries (60 * 5s = 5 min)\nexport const MODEL_LOADING_DEFAULT_DELAY = 5_000; // 5 seconds default retry delay\nexport const MODEL_LOADING_ERROR_CODE = \"MODEL_LOADING\"; // Error code from server\n\n// Version negotiation headers\nexport const SDK_VERSION_HEADER = \"X-SIE-SDK-Version\";\nexport const SERVER_VERSION_HEADER = \"X-SIE-Server-Version\";\n","export const SDK_VERSION = \"0.1.10\"; // x-release-please-version\n","/**\n * MessagePack serialization with msgpack-numpy compatibility.\n *\n * The SIE server uses Python's msgpack-numpy library which serializes numpy arrays\n * using extension type 78 ('N'). This module provides compatible encoding/decoding.\n *\n * Wire format for numpy arrays (extension type 78):\n * - dtype string (e.g., '<f4' for float32, '<i4' for int32) terminated by '|'\n * - shape as comma-separated dimensions terminated by '|'\n * - raw array data in little-endian format\n */\n\nimport { ExtensionCodec, decode, encode } from \"@msgpack/msgpack\";\n\n// msgpack-numpy extension type code (ord('N') = 78)\nconst EXT_TYPE_NUMPY = 78;\n\n/**\n * Parse numpy dtype string to get byte size and TypedArray constructor\n */\nfunction parseDtype(dtype: string): {\n size: number;\n construct: (\n buffer: ArrayBuffer,\n ) => Float32Array | Int32Array | Float64Array | Int16Array | Int8Array | Uint8Array;\n} {\n // Numpy dtypes: '<f4' (float32), '<f8' (float64), '<i4' (int32), '<i2' (int16),\n // '<i1' (int8), '|u1' (uint8), '<f2' (float16)\n // Note: '<' means little-endian, '|' means not applicable (single byte)\n const typeChar = dtype.slice(-2, -1); // 'f', 'i', 'u', etc.\n const sizeChar = dtype.slice(-1); // '4', '8', '2', '1'\n const size = Number.parseInt(sizeChar, 10);\n\n switch (`${typeChar}${size}`) {\n case \"f4\":\n return { size: 4, construct: (buf) => new Float32Array(buf) };\n case \"f8\":\n return { size: 8, construct: (buf) => new Float64Array(buf) };\n case \"f2\":\n // float16 - no native JS type, decode to Float32Array with conversion\n return {\n size: 2,\n construct: (buf) => {\n const float16 = new Uint16Array(buf);\n const float32 = new Float32Array(float16.length);\n for (let i = 0; i < float16.length; i++) {\n float32[i] = float16ToFloat32(float16[i] ?? 0);\n }\n return float32;\n },\n };\n case \"i4\":\n return { size: 4, construct: (buf) => new Int32Array(buf) };\n case \"i2\":\n return { size: 2, construct: (buf) => new Int16Array(buf) };\n case \"i1\":\n return { size: 1, construct: (buf) => new Int8Array(buf) };\n case \"u1\":\n return { size: 1, construct: (buf) => new Uint8Array(buf) };\n default:\n throw new Error(`Unsupported numpy dtype: ${dtype}`);\n }\n}\n\n/**\n * Convert a float16 (IEEE 754 half-precision) value to float32.\n */\nfunction float16ToFloat32(h: number): number {\n const sign = (h >>> 15) & 0x1;\n const exp = (h >>> 10) & 0x1f;\n const frac = h & 0x3ff;\n\n if (exp === 0) {\n if (frac === 0) {\n // Zero\n return sign ? -0 : 0;\n }\n // Subnormal\n const f = frac / 1024;\n return (sign ? -1 : 1) * f * 2 ** -14;\n }\n if (exp === 31) {\n // Infinity or NaN\n return frac === 0 ? (sign ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY) : Number.NaN;\n }\n // Normal\n return (sign ? -1 : 1) * (1 + frac / 1024) * 2 ** (exp - 15);\n}\n\n/**\n * Decode msgpack-numpy extension data to TypedArray\n */\nfunction decodeNumpyArray(\n data: Uint8Array,\n): Float32Array | Int32Array | Float64Array | Int16Array | Int8Array | Uint8Array {\n // Find first '|' separator (between dtype and shape)\n let dtypeEnd = 0;\n while (dtypeEnd < data.length && data[dtypeEnd] !== 0x7c) {\n // '|' = 0x7c\n dtypeEnd++;\n }\n\n const dtypeBytes = data.slice(0, dtypeEnd);\n const dtype = new TextDecoder().decode(dtypeBytes);\n\n // Find second '|' separator (between shape and data)\n let shapeEnd = dtypeEnd + 1;\n while (shapeEnd < data.length && data[shapeEnd] !== 0x7c) {\n shapeEnd++;\n }\n\n const shapeBytes = data.slice(dtypeEnd + 1, shapeEnd);\n const shapeStr = new TextDecoder().decode(shapeBytes);\n const shape = shapeStr.length > 0 ? shapeStr.split(\",\").map((s) => Number.parseInt(s, 10)) : [];\n\n // Remaining bytes are the array data\n const arrayData = data.slice(shapeEnd + 1);\n\n // Parse dtype and create TypedArray\n const { size, construct } = parseDtype(dtype);\n\n // Calculate total elements from shape\n const totalElements =\n shape.length > 0 ? shape.reduce((a, b) => a * b, 1) : arrayData.length / size;\n\n // Ensure proper alignment by copying to a new buffer\n const buffer = new ArrayBuffer(totalElements * size);\n new Uint8Array(buffer).set(arrayData.slice(0, totalElements * size));\n\n return construct(buffer);\n}\n\n/**\n * Encode TypedArray to msgpack-numpy extension format\n */\nfunction encodeNumpyArray(arr: Float32Array | Int32Array): Uint8Array {\n let dtype: string;\n if (arr instanceof Float32Array) {\n dtype = \"<f4\";\n } else if (arr instanceof Int32Array) {\n dtype = \"<i4\";\n } else {\n throw new Error(\"Unsupported TypedArray type\");\n }\n\n // Build wire format: dtype + '|' + shape + '|' + data\n const dtypeBytes = new TextEncoder().encode(dtype);\n const shapeBytes = new TextEncoder().encode(arr.length.toString());\n const separator = new Uint8Array([0x7c]); // '|'\n const dataBytes = new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n\n // Concatenate all parts\n const result = new Uint8Array(dtypeBytes.length + 1 + shapeBytes.length + 1 + dataBytes.length);\n let offset = 0;\n result.set(dtypeBytes, offset);\n offset += dtypeBytes.length;\n result.set(separator, offset);\n offset += 1;\n result.set(shapeBytes, offset);\n offset += shapeBytes.length;\n result.set(separator, offset);\n offset += 1;\n result.set(dataBytes, offset);\n\n return result;\n}\n\n/**\n * Create extension codec compatible with msgpack-numpy\n */\nfunction createExtensionCodec(): ExtensionCodec {\n const codec = new ExtensionCodec();\n\n // Register numpy array decoder (extension type 78)\n codec.register({\n type: EXT_TYPE_NUMPY,\n encode: (value: unknown): Uint8Array | null => {\n if (value instanceof Float32Array || value instanceof Int32Array) {\n return encodeNumpyArray(value);\n }\n return null;\n },\n decode: (\n data: Uint8Array,\n ): Float32Array | Int32Array | Float64Array | Int16Array | Int8Array | Uint8Array => {\n return decodeNumpyArray(data);\n },\n });\n\n return codec;\n}\n\nconst extensionCodec = createExtensionCodec();\n\n/**\n * Pack a message to MessagePack format (msgpack-numpy compatible)\n */\nexport function packMessage(data: unknown): Uint8Array {\n return encode(data, { extensionCodec });\n}\n\n/**\n * Check if an object is a msgpack-numpy array representation\n */\nfunction isNumpyArrayMap(\n obj: unknown,\n): obj is { nd: boolean; type: string; shape: number[]; data: Uint8Array } {\n if (typeof obj !== \"object\" || obj === null) {\n return false;\n }\n const map = obj as Record<string, unknown>;\n return (\n map.nd === true &&\n typeof map.type === \"string\" &&\n Array.isArray(map.shape) &&\n map.data instanceof Uint8Array\n );\n}\n\n/**\n * Convert a msgpack-numpy array map to a typed array or array of typed arrays\n *\n * For 1D arrays: returns a single typed array\n * For 2D arrays: returns an array of typed arrays (one per row)\n */\nfunction convertNumpyArrayMap(map: {\n nd: boolean;\n type: string;\n shape: number[];\n data: Uint8Array;\n}):\n | Float32Array\n | Int32Array\n | Float64Array\n | Int16Array\n | Int8Array\n | Uint8Array\n | Float32Array[]\n | Int32Array[]\n | Int8Array[] {\n const dtype = map.type;\n const arrayData = map.data;\n\n // Parse dtype to determine array type\n const { size, construct } = parseDtype(dtype);\n\n // Handle 2D arrays (e.g., multivector with shape [num_tokens, dim])\n if (map.shape.length === 2 && map.shape[0] !== undefined && map.shape[1] !== undefined) {\n const numRows = map.shape[0];\n const numCols = map.shape[1];\n const result: (\n | Float32Array\n | Int32Array\n | Float64Array\n | Int16Array\n | Int8Array\n | Uint8Array\n )[] = [];\n\n for (let row = 0; row < numRows; row++) {\n const offset = row * numCols * size;\n const buffer = new ArrayBuffer(numCols * size);\n new Uint8Array(buffer).set(arrayData.slice(offset, offset + numCols * size));\n result.push(construct(buffer));\n }\n\n return result as Float32Array[] | Int32Array[] | Int8Array[];\n }\n\n // 1D array (or scalar): return single typed array\n const totalElements =\n map.shape.length > 0 ? map.shape.reduce((a, b) => a * b, 1) : arrayData.length / size;\n\n // Ensure proper alignment by copying to a new buffer\n const buffer = new ArrayBuffer(totalElements * size);\n new Uint8Array(buffer).set(arrayData.slice(0, totalElements * size));\n\n return construct(buffer);\n}\n\n/**\n * Recursively convert msgpack-numpy array representations to typed arrays\n */\nfunction convertNumpyArrays(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n // Check if this is a numpy array map\n if (isNumpyArrayMap(obj)) {\n return convertNumpyArrayMap(obj);\n }\n\n // Recursively process arrays\n if (Array.isArray(obj)) {\n return obj.map((item) => convertNumpyArrays(item));\n }\n\n // Don't process typed arrays - they're already converted\n if (ArrayBuffer.isView(obj)) {\n return obj;\n }\n\n // Recursively process objects\n if (typeof obj === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = convertNumpyArrays(value);\n }\n return result;\n }\n\n return obj;\n}\n\n/**\n * Unpack a MessagePack message (msgpack-numpy compatible)\n *\n * Note: msgpack-numpy uses byte string keys (b'nd', b'type', b'shape', b'data') for numpy\n * array metadata. In JavaScript these become Uint8Array which need to be decoded as text.\n * After decoding, we recursively convert numpy array maps to typed arrays.\n */\nexport function unpackMessage<T = unknown>(data: Uint8Array): T {\n const decoded = decode(data, {\n extensionCodec,\n // Convert byte string keys (Uint8Array) to text strings\n mapKeyConverter: (key: unknown): string | number => {\n if (typeof key === \"string\" || typeof key === \"number\") {\n return key;\n }\n // msgpack-numpy uses byte string keys for numpy array metadata\n if (key instanceof Uint8Array) {\n return new TextDecoder().decode(key);\n }\n // Fallback: Convert arrays/objects to JSON string keys\n return JSON.stringify(key);\n },\n });\n\n // Convert any numpy array maps to typed arrays\n return convertNumpyArrays(decoded) as T;\n}\n","/**\n * Retry logic with exponential backoff and jitter\n */\n\nimport { DEFAULT_MAX_RETRY_DELAY, DEFAULT_RETRY_DELAY } from \"./constants.js\";\n\n/**\n * Compute backoff with decorrelated jitter\n * @param attempt - The current attempt number (0-indexed)\n * @param baseDelay - Base delay in milliseconds\n * @param maxDelay - Maximum delay in milliseconds\n */\nexport function computeBackoffWithJitter(\n attempt: number,\n baseDelay: number = DEFAULT_RETRY_DELAY,\n maxDelay: number = DEFAULT_MAX_RETRY_DELAY,\n): number {\n const exponentialDelay = baseDelay * 2 ** attempt;\n const cappedDelay = Math.min(exponentialDelay, maxDelay);\n // Decorrelated jitter: random value between 0 and cappedDelay\n return Math.random() * cappedDelay;\n}\n\n/**\n * Parse Retry-After header value\n * @param header - The Retry-After header value\n * @returns Delay in milliseconds, or undefined if invalid\n */\nexport function getRetryAfter(header: string | null): number | undefined {\n if (!header) return undefined;\n\n // Try parsing as seconds (integer)\n const seconds = Number.parseInt(header, 10);\n if (!Number.isNaN(seconds) && seconds > 0) {\n return seconds * 1000;\n }\n\n // Try parsing as HTTP-date\n const date = new Date(header);\n if (!Number.isNaN(date.getTime())) {\n const delay = date.getTime() - Date.now();\n return delay > 0 ? delay : undefined;\n }\n\n return undefined;\n}\n","/**\n * Parsing utilities for SIE responses\n */\n\nimport { ProvisioningError, RequestError, ServerError } from \"../errors.js\";\nimport { unpackMessage } from \"../msgpack.js\";\nimport type {\n CapacityInfo,\n Classification,\n DetectedObject,\n EncodeResult,\n Entity,\n ExtractResult,\n Relation,\n ScoreEntry,\n ScoreResult,\n WorkerInfo,\n} from \"../types.js\";\nimport {\n HTTP_ACCEPTED,\n HTTP_CLIENT_ERROR_MAX,\n HTTP_CLIENT_ERROR_MIN,\n HTTP_SERVER_ERROR_MAX,\n HTTP_SERVER_ERROR_MIN,\n MSGPACK_CONTENT_TYPE,\n} from \"./constants.js\";\n\nimport { getRetryAfter as getRetryAfterFromHeader } from \"./retry.js\";\n\n/**\n * Parse GPU parameter from \"pool/gpu\" format\n */\nexport function parseGpuParam(param: string): { pool?: string; gpu: string } {\n const parts = param.split(\"/\");\n if (parts.length === 2 && parts[0] !== undefined && parts[1] !== undefined) {\n return { pool: parts[0], gpu: parts[1] };\n }\n return { gpu: param };\n}\n\n/**\n * Extract Retry-After header value from Response in milliseconds\n */\nexport function getRetryAfter(response: Response): number | undefined {\n const header = response.headers.get(\"Retry-After\");\n return getRetryAfterFromHeader(header);\n}\n\n/**\n * Extract error code from response body (handles both JSON and msgpack)\n */\nexport async function getErrorCode(response: Response): Promise<string | undefined> {\n try {\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n let data: Record<string, unknown>;\n\n if (contentType.includes(MSGPACK_CONTENT_TYPE)) {\n const buffer = await response.arrayBuffer();\n data = unpackMessage<Record<string, unknown>>(new Uint8Array(buffer));\n } else {\n data = (await response.json()) as Record<string, unknown>;\n }\n\n // Check error.code pattern\n if (data.error && typeof data.error === \"object\") {\n const error = data.error as Record<string, unknown>;\n if (typeof error.code === \"string\") {\n return error.code;\n }\n }\n\n // Check detail.code pattern\n if (data.detail && typeof data.detail === \"object\") {\n const detail = data.detail as Record<string, unknown>;\n if (typeof detail.code === \"string\") {\n return detail.code;\n }\n }\n\n // Check top-level code\n if (typeof data.code === \"string\") {\n return data.code;\n }\n } catch {\n // Ignore parsing errors\n }\n return undefined;\n}\n\n/**\n * Handle HTTP error response and throw appropriate error\n */\nexport async function handleError(response: Response, gpu?: string): Promise<never> {\n const { status } = response;\n\n let errorBody: { code?: string; detail?: string } = {};\n try {\n errorBody = (await response.json()) as { code?: string; detail?: string };\n } catch {\n // Ignore JSON parsing errors\n }\n\n const code = errorBody.code ?? \"UNKNOWN\";\n const message = errorBody.detail ?? response.statusText;\n\n if (status === HTTP_ACCEPTED) {\n const retryAfter = response.headers.get(\"Retry-After\");\n throw new ProvisioningError(\n message,\n gpu,\n retryAfter ? Number.parseInt(retryAfter, 10) * 1000 : undefined,\n );\n }\n\n if (status >= HTTP_CLIENT_ERROR_MIN && status <= HTTP_CLIENT_ERROR_MAX) {\n throw new RequestError(message, code, status);\n }\n\n if (status >= HTTP_SERVER_ERROR_MIN && status <= HTTP_SERVER_ERROR_MAX) {\n throw new ServerError(message, code, status);\n }\n\n throw new ServerError(message, code, status);\n}\n\n// Wire format types (what server sends)\n// The server wraps arrays in objects like: {\"dense\": {\"values\": Float32Array}}\ninterface WireDenseResult {\n values: Float32Array;\n}\n\ninterface WireSparseResult {\n indices: Int32Array;\n values: Float32Array;\n}\n\ninterface WireMultivectorResult {\n values: Float32Array[]; // Actually an array of Float32Arrays for each token\n}\n\ninterface WireEncodeResult {\n id?: string;\n dense?: WireDenseResult; // Nested: {\"values\": Float32Array}\n sparse?: WireSparseResult;\n multivector?: WireMultivectorResult; // Nested: {\"values\": Float32Array[]}\n timing?: {\n total_ms?: number;\n queue_ms?: number;\n tokenization_ms?: number;\n inference_ms?: number;\n };\n}\n\ninterface WireScoreEntry {\n item_id: string;\n score: number;\n rank: number;\n}\n\ninterface WireScoreResult {\n model?: string;\n query_id?: string;\n scores: WireScoreEntry[];\n}\n\ninterface WireEntity {\n text: string;\n label: string;\n score: number;\n start?: number;\n end?: number;\n bbox?: number[];\n}\n\ninterface WireRelation {\n head: string;\n tail: string;\n relation: string;\n score: number;\n}\n\ninterface WireClassification {\n label: string;\n score: number;\n}\n\ninterface WireDetectedObject {\n label: string;\n score: number;\n bbox: number[];\n}\n\ninterface WireExtractResult {\n id?: string;\n entities: WireEntity[];\n relations?: WireRelation[];\n classifications?: WireClassification[];\n objects?: WireDetectedObject[];\n}\n\n/**\n * Parse wire format to EncodeResult\n *\n * Wire format from server uses nested objects:\n * - dense: {\"values\": Float32Array}\n * - sparse: {\"indices\": Int32Array, \"values\": Float32Array}\n * - multivector: {\"values\": Float32Array[]}\n */\nexport function parseEncodeResult(data: WireEncodeResult): EncodeResult {\n const result: EncodeResult = {};\n\n if (data.id !== undefined) {\n result.id = data.id;\n }\n\n // Dense is nested: {\"values\": Float32Array}\n if (data.dense) {\n result.dense = data.dense.values;\n }\n\n // Sparse is already flat: {\"indices\": Int32Array, \"values\": Float32Array}\n if (data.sparse) {\n result.sparse = {\n indices: data.sparse.indices,\n values: data.sparse.values,\n };\n }\n\n // Multivector is nested: {\"values\": Float32Array[]}\n if (data.multivector) {\n result.multivector = data.multivector.values;\n }\n\n if (data.timing) {\n result.timing = {\n totalMs: data.timing.total_ms,\n queueMs: data.timing.queue_ms,\n tokenizationMs: data.timing.tokenization_ms,\n inferenceMs: data.timing.inference_ms,\n };\n }\n\n return result;\n}\n\n/**\n * Parse wire format to EncodeResult[]\n *\n * Accepts unknown[] from msgpack deserialization and casts to WireEncodeResult[].\n */\nexport function parseEncodeResults(data: unknown[]): EncodeResult[] {\n return (data as WireEncodeResult[]).map(parseEncodeResult);\n}\n\n/**\n * Parse wire format to ScoreEntry\n */\nfunction parseScoreEntry(data: WireScoreEntry): ScoreEntry {\n return {\n itemId: data.item_id,\n score: data.score,\n rank: data.rank,\n };\n}\n\n/**\n * Parse wire format to ScoreResult\n *\n * Accepts unknown from msgpack deserialization and casts to WireScoreResult.\n */\nexport function parseScoreResult(data: unknown): ScoreResult {\n const wire = data as WireScoreResult;\n return {\n model: wire.model,\n queryId: wire.query_id,\n scores: wire.scores.map(parseScoreEntry),\n };\n}\n\n/**\n * Parse wire format to Entity\n */\nfunction parseEntity(data: WireEntity): Entity {\n return {\n text: data.text,\n label: data.label,\n score: data.score,\n start: data.start,\n end: data.end,\n bbox: data.bbox,\n };\n}\n\n/**\n * Parse wire format to ExtractResult\n */\nexport function parseExtractResult(data: WireExtractResult): ExtractResult {\n return {\n id: data.id,\n entities: data.entities.map(parseEntity),\n relations: (data.relations ?? []).map(\n (r: WireRelation): Relation => ({\n head: r.head,\n tail: r.tail,\n relation: r.relation,\n score: r.score,\n }),\n ),\n classifications: (data.classifications ?? []).map(\n (c: WireClassification): Classification => ({\n label: c.label,\n score: c.score,\n }),\n ),\n objects: (data.objects ?? []).map(\n (o: WireDetectedObject): DetectedObject => ({\n label: o.label,\n score: o.score,\n bbox: o.bbox,\n }),\n ),\n };\n}\n\n/**\n * Parse wire format to ExtractResult[]\n *\n * Accepts unknown[] from msgpack deserialization and casts to WireExtractResult[].\n */\nexport function parseExtractResults(data: unknown[]): ExtractResult[] {\n return (data as WireExtractResult[]).map(parseExtractResult);\n}\n\n// Wire format types for capacity\ninterface WireWorkerInfo {\n url: string;\n gpu: string;\n healthy: boolean;\n queue_depth: number;\n loaded_models: string[];\n}\n\ninterface WireCapacityResponse {\n status: string;\n type?: string;\n cluster?: {\n worker_count?: number;\n gpu_count?: number;\n models_loaded?: number;\n };\n configured_gpu_types?: string[];\n live_gpu_types?: string[];\n workers?: WireWorkerInfo[];\n}\n\n/**\n * Parse wire format to CapacityInfo\n */\nexport function parseCapacityInfo(data: unknown, gpuFilter?: string): CapacityInfo {\n const wire = data as WireCapacityResponse;\n\n // Filter workers by GPU if specified\n let workers = wire.workers ?? [];\n if (gpuFilter) {\n const gpuLower = gpuFilter.toLowerCase();\n workers = workers.filter((w) => w.gpu.toLowerCase() === gpuLower);\n }\n\n const parsedWorkers: WorkerInfo[] = workers.map((w) => ({\n url: w.url,\n gpu: w.gpu,\n healthy: w.healthy,\n queueDepth: w.queue_depth,\n loadedModels: w.loaded_models,\n }));\n\n return {\n status: wire.status,\n workerCount: gpuFilter ? parsedWorkers.length : (wire.cluster?.worker_count ?? 0),\n gpuCount: wire.cluster?.gpu_count ?? 0,\n modelsLoaded: wire.cluster?.models_loaded ?? 0,\n configuredGpuTypes: wire.configured_gpu_types ?? [],\n liveGpuTypes: wire.live_gpu_types ?? [],\n workers: parsedWorkers,\n };\n}\n","/**\n * SIE Client implementation\n *\n * @example\n * ```typescript\n * import { SIEClient } from \"@superlinked/sie-sdk\";\n *\n * const client = new SIEClient(\"http://localhost:8080\");\n *\n * // Encode single item\n * const result = await client.encode(\"bge-m3\", { text: \"Hello world\" });\n * console.log(result.dense); // Float32Array\n *\n * // Batch encode\n * const results = await client.encode(\"bge-m3\", [\n * { text: \"First document\" },\n * { text: \"Second document\" },\n * ]);\n *\n * // With GPU routing and auto-retry for capacity\n * const resultWithGpu = await client.encode(\n * \"bge-m3\",\n * { text: \"Hello\" },\n * { gpu: \"l4\", waitForCapacity: true },\n * );\n *\n * await client.close();\n * ```\n */\n\nimport {\n LoraLoadingError,\n ModelLoadingError,\n PoolError,\n ProvisioningError,\n RequestError,\n SIEConnectionError,\n} from \"./errors.js\";\nimport {\n DEFAULT_LEASE_RENEWAL_INTERVAL,\n DEFAULT_PROVISION_TIMEOUT,\n DEFAULT_RETRY_DELAY,\n DEFAULT_TIMEOUT,\n HTTP_ACCEPTED,\n HTTP_CLIENT_ERROR_MIN,\n JSON_CONTENT_TYPE,\n LORA_LOADING_DEFAULT_DELAY,\n LORA_LOADING_ERROR_CODE,\n LORA_LOADING_MAX_RETRIES,\n MODEL_LOADING_DEFAULT_DELAY,\n MODEL_LOADING_ERROR_CODE,\n MSGPACK_CONTENT_TYPE,\n SDK_VERSION_HEADER,\n SERVER_VERSION_HEADER,\n} from \"./internal/constants.js\";\nimport { SDK_VERSION } from \"./version.js\";\nimport {\n getErrorCode,\n getRetryAfter,\n handleError,\n parseCapacityInfo,\n parseEncodeResults,\n parseExtractResults,\n parseScoreResult,\n} from \"./internal/parsing.js\";\nimport { packMessage, unpackMessage } from \"./msgpack.js\";\nimport type {\n CapacityInfo,\n EncodeOptions,\n EncodeResult,\n ExtractOptions,\n ExtractResult,\n Item,\n ModelInfo,\n PoolInfo,\n SIEClientOptions,\n ScoreOptions,\n ScoreResult,\n StatusMessage,\n} from \"./types.js\";\n\n/** Helper to sleep for a given number of milliseconds */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/** Sleep that can be cancelled via AbortSignal. Returns true if aborted. */\nfunction abortableSleep(ms: number, signal: AbortSignal): Promise<boolean> {\n if (signal.aborted) return Promise.resolve(true);\n return new Promise((resolve) => {\n const onAbort = () => {\n clearTimeout(timeoutId);\n resolve(true);\n };\n const timeoutId = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve(false);\n }, ms);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nconst _LEASE_RENEWAL_MAX_RETRIES = 5;\n\n/**\n * SIE Client for embedding, scoring, and extraction.\n *\n * The client is async-only (no synchronous methods) and uses native fetch.\n * It handles msgpack serialization, error parsing, and retry logic.\n *\n * @example Resource pool usage\n * ```typescript\n * const client = new SIEClient(\"http://router:8080\");\n *\n * // Create a dedicated pool\n * await client.createPool(\"eval-bench\", { l4: 2 });\n *\n * // Use pool for requests\n * await client.encode(\"bge-m3\", { text: \"Hello\" }, { gpu: \"eval-bench/l4\" });\n *\n * // Check pool status\n * const pool = await client.getPool(\"eval-bench\");\n * console.log(`Pool state: ${pool?.status.state}`);\n *\n * // Clean up\n * await client.deletePool(\"eval-bench\");\n * await client.close();\n * ```\n */\nexport class SIEClient {\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly gpu?: string;\n private readonly apiKey?: string;\n private readonly defaultWaitForCapacity: boolean;\n private readonly provisionTimeout: number;\n\n // Pool state: track created pools and their lease renewal scheduling\n private readonly pools: Map<\n string,\n {\n timeoutId: ReturnType<typeof setTimeout> | null;\n abortController: AbortController;\n isRenewing: boolean;\n }\n > = new Map();\n\n // Version negotiation state\n private versionWarningLogged = false;\n\n // Note: LoRA and model loading retry counters are now local to each method\n // to avoid interference between concurrent requests\n\n /**\n * Create a new SIE client.\n *\n * @param baseUrl - Base URL of the SIE server (e.g., \"http://localhost:8080\")\n * @param options - Client options\n */\n constructor(baseUrl: string, options: SIEClientOptions = {}) {\n // Remove trailing slash\n this.baseUrl = baseUrl.replace(/\\/$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.gpu = options.gpu;\n this.apiKey = options.apiKey;\n this.defaultWaitForCapacity = options.waitForCapacity ?? false;\n this.provisionTimeout = options.provisionTimeout ?? DEFAULT_PROVISION_TIMEOUT;\n }\n\n /**\n * Get the base URL of the SIE server.\n *\n * @returns The normalized base URL (without trailing slash)\n */\n getBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Encode a single item.\n *\n * @param model - Model name (e.g., \"bge-m3\")\n * @param item - Item to encode\n * @param options - Encode options\n * @returns Encode result with embeddings\n */\n async encode(model: string, item: Item, options?: EncodeOptions): Promise<EncodeResult>;\n\n /**\n * Encode multiple items.\n *\n * @param model - Model name (e.g., \"bge-m3\")\n * @param items - Items to encode\n * @param options - Encode options\n * @returns Array of encode results in same order as input\n */\n async encode(model: string, items: Item[], options?: EncodeOptions): Promise<EncodeResult[]>;\n\n /**\n * Encode one or more items.\n */\n async encode(\n model: string,\n items: Item | Item[],\n options: EncodeOptions = {},\n ): Promise<EncodeResult | EncodeResult[]> {\n const isSingleItem = !Array.isArray(items);\n const itemsArray = isSingleItem ? [items] : items;\n\n // Build request body - model is in URL path, not body\n // Wire format uses snake_case\n const body: Record<string, unknown> = {\n items: itemsArray,\n };\n\n // Add params if any are specified\n const params: Record<string, unknown> = {};\n if (options.outputTypes) {\n params.output_types = options.outputTypes;\n }\n if (options.instruction !== undefined) {\n params.instruction = options.instruction;\n }\n if (options.isQuery !== undefined) {\n params.is_query = options.isQuery;\n }\n if (options.outputDtype !== undefined) {\n params.output_dtype = options.outputDtype;\n }\n if (Object.keys(params).length > 0) {\n body.params = params;\n }\n\n const waitForCapacity = options.waitForCapacity ?? this.defaultWaitForCapacity;\n const { pool, gpu } = this.parseGpuParam(options.gpu);\n\n // Model is in URL path: /v1/encode/{model}\n const response = await this.requestWithRetry(\n `/v1/encode/${encodeURIComponent(model)}`,\n body,\n pool,\n gpu,\n waitForCapacity,\n model,\n );\n\n // Wire format response: {\"items\": [...], \"timing\": {...}}\n interface WireResponse {\n items: unknown[];\n timing?: Record<string, unknown>;\n }\n\n const data = unpackMessage<WireResponse>(new Uint8Array(await response.arrayBuffer()));\n\n const results = parseEncodeResults(data.items);\n\n if (isSingleItem) {\n const first = results[0];\n if (!first) {\n throw new Error(\"No results returned from encode\");\n }\n return first;\n }\n return results;\n }\n\n /**\n * List available models.\n *\n * @returns Array of model information\n */\n async listModels(): Promise<ModelInfo[]> {\n const response = await this.requestJson(\"/v1/models\", \"GET\");\n\n // Wire format response: {\"models\": [...]}\n interface WireModelInfo {\n name: string;\n loaded: boolean;\n inputs: string[];\n outputs: string[];\n dims?: { dense?: number; sparse?: number; multivector?: number };\n max_sequence_length?: number;\n }\n\n interface WireModelsResponse {\n models: WireModelInfo[];\n }\n\n const data = (await response.json()) as WireModelsResponse;\n\n return data.models.map((m) => ({\n name: m.name,\n loaded: m.loaded,\n inputs: m.inputs,\n outputs: m.outputs,\n dims: m.dims,\n maxSequenceLength: m.max_sequence_length,\n }));\n }\n\n /**\n * Get details for a specific model.\n *\n * Returns model metadata including dimensions, supported inputs/outputs,\n * loaded status, and max sequence length. This is a lightweight call that\n * reads from model config — it does not load the model or trigger inference.\n *\n * @param name - Model name (e.g., \"BAAI/bge-m3\")\n * @returns Model information\n */\n async getModel(name: string): Promise<ModelInfo> {\n const response = await this.requestJson(`/v1/models/${encodeURIComponent(name)}`, \"GET\");\n\n interface WireModelInfo {\n name: string;\n loaded: boolean;\n inputs: string[];\n outputs: string[];\n dims?: { dense?: number; sparse?: number; multivector?: number };\n max_sequence_length?: number;\n }\n\n const data = (await response.json()) as WireModelInfo;\n\n return {\n name: data.name,\n loaded: data.loaded,\n inputs: data.inputs,\n outputs: data.outputs,\n dims: data.dims,\n maxSequenceLength: data.max_sequence_length,\n };\n }\n\n /**\n * Stream real-time status updates from a worker or router.\n *\n * @param mode - \"cluster\" uses router /ws/cluster-status, \"worker\" uses /ws/status.\n * \"auto\" detects the endpoint via /health.\n */\n async *watch(mode: \"auto\" | \"cluster\" | \"worker\" = \"auto\"): AsyncGenerator<StatusMessage> {\n const endpoint = mode === \"auto\" ? await this.detectEndpointType() : mode;\n const path = endpoint === \"cluster\" ? \"/ws/cluster-status\" : \"/ws/status\";\n const wsUrl = this.buildWsUrl(path);\n const ws = this.createWebSocket(wsUrl);\n\n const queue: StatusMessage[] = [];\n let resolveNext: (() => void) | null = null;\n let rejectNext: ((error: unknown) => void) | null = null;\n let closed = false;\n\n const notify = () => {\n if (resolveNext) {\n resolveNext();\n resolveNext = null;\n }\n };\n\n const fail = (error: unknown) => {\n if (rejectNext) {\n rejectNext(error);\n rejectNext = null;\n }\n };\n\n const waitForMessage = () =>\n new Promise<void>((resolve, reject) => {\n resolveNext = resolve;\n rejectNext = reject;\n });\n\n const parseMessage = (data: unknown): StatusMessage => {\n if (typeof data === \"string\") {\n return JSON.parse(data) as StatusMessage;\n }\n if (data instanceof ArrayBuffer) {\n return JSON.parse(new TextDecoder().decode(new Uint8Array(data))) as StatusMessage;\n }\n if (data instanceof Uint8Array) {\n return JSON.parse(new TextDecoder().decode(data)) as StatusMessage;\n }\n throw new Error(\"Unsupported WebSocket message type\");\n };\n\n const openPromise = new Promise<void>((resolve, reject) => {\n ws.addEventListener(\"open\", () => resolve());\n ws.addEventListener(\"error\", (event) => reject(event));\n });\n\n ws.addEventListener(\"message\", (event) => {\n try {\n queue.push(parseMessage(event.data));\n notify();\n } catch (error) {\n fail(error);\n }\n });\n\n ws.addEventListener(\"close\", () => {\n closed = true;\n notify();\n });\n\n try {\n await openPromise;\n while (!closed || queue.length > 0) {\n if (queue.length === 0) {\n await waitForMessage();\n continue;\n }\n const next = queue.shift();\n if (next) {\n yield next;\n }\n }\n } finally {\n ws.close();\n }\n }\n\n /**\n * Score items against a query using a reranker model.\n *\n * @param model - Model name (e.g., \"bge-reranker-v2\")\n * @param query - Query item\n * @param items - Items to score against the query\n * @param options - Score options\n * @returns Score result with sorted scores\n *\n * @example\n * ```typescript\n * const result = await client.score(\n * \"bge-reranker-v2\",\n * { text: \"What is machine learning?\" },\n * [\n * { id: \"doc-1\", text: \"Machine learning is...\" },\n * { id: \"doc-2\", text: \"Python is...\" },\n * ],\n * );\n *\n * // Scores are sorted by relevance (descending)\n * console.log(result.scores[0].itemId); // most relevant\n * ```\n */\n async score(\n model: string,\n query: Item,\n items: Item[],\n options: ScoreOptions = {},\n ): Promise<ScoreResult> {\n // Build request body\n const body: Record<string, unknown> = {\n query,\n items,\n };\n\n const waitForCapacity = options.waitForCapacity ?? this.defaultWaitForCapacity;\n const { pool, gpu } = this.parseGpuParam(options.gpu);\n\n const response = await this.requestWithRetry(\n `/v1/score/${encodeURIComponent(model)}`,\n body,\n pool,\n gpu,\n waitForCapacity,\n model,\n );\n\n // Wire format response matches ScoreResult structure\n const data = unpackMessage<unknown>(new Uint8Array(await response.arrayBuffer()));\n\n return parseScoreResult(data);\n }\n\n /**\n * Extract entities from a single item.\n *\n * @param model - Model name (e.g., \"gliner-multi-v2.1\")\n * @param item - Item to extract from\n * @param options - Extract options with labels\n * @returns Extract result with entities\n */\n async extract(model: string, item: Item, options: ExtractOptions): Promise<ExtractResult>;\n\n /**\n * Extract entities from multiple items.\n *\n * @param model - Model name (e.g., \"gliner-multi-v2.1\")\n * @param items - Items to extract from\n * @param options - Extract options with labels\n * @returns Array of extract results in same order as input\n */\n async extract(model: string, items: Item[], options: ExtractOptions): Promise<ExtractResult[]>;\n\n /**\n * Extract entities from one or more items.\n *\n * @example\n * ```typescript\n * const result = await client.extract(\n * \"gliner-multi-v2.1\",\n * { text: \"Apple was founded by Steve Jobs.\" },\n * { labels: [\"person\", \"organization\"] },\n * );\n *\n * for (const entity of result.entities) {\n * console.log(`${entity.text} (${entity.label})`);\n * }\n * // Output:\n * // Apple (organization)\n * // Steve Jobs (person)\n * ```\n */\n async extract(\n model: string,\n items: Item | Item[],\n options: ExtractOptions,\n ): Promise<ExtractResult | ExtractResult[]> {\n const isSingleItem = !Array.isArray(items);\n const itemsArray = isSingleItem ? [items] : items;\n\n // Build request body\n const body: Record<string, unknown> = {\n items: itemsArray,\n };\n\n // Add params\n const params: Record<string, unknown> = {\n labels: options.labels,\n };\n if (options.threshold !== undefined) {\n params.threshold = options.threshold;\n }\n body.params = params;\n\n const waitForCapacity = options.waitForCapacity ?? this.defaultWaitForCapacity;\n const { pool, gpu } = this.parseGpuParam(options.gpu);\n\n const response = await this.requestWithRetry(\n `/v1/extract/${encodeURIComponent(model)}`,\n body,\n pool,\n gpu,\n waitForCapacity,\n model,\n );\n\n // Wire format response: {\"items\": [...]}\n interface WireResponse {\n items: unknown[];\n }\n\n const data = unpackMessage<WireResponse>(new Uint8Array(await response.arrayBuffer()));\n\n const results = parseExtractResults(data.items);\n\n if (isSingleItem) {\n const first = results[0];\n if (!first) {\n throw new Error(\"No results returned from extract\");\n }\n return first;\n }\n return results;\n }\n\n /**\n * Close the client and cleanup resources.\n *\n * Stops pool lease renewal timers. Note that pools are not deleted\n * automatically - they are garbage collected by the router after inactivity.\n * This allows pool reuse if the client reconnects.\n */\n async close(): Promise<void> {\n // Stop all pool lease renewal timers and cancel in-flight renewals\n for (const [, poolState] of this.pools) {\n if (poolState.timeoutId !== null) {\n clearTimeout(poolState.timeoutId);\n }\n poolState.abortController.abort();\n }\n this.pools.clear();\n }\n\n /**\n * Create a resource pool for isolated capacity.\n *\n * Pools provide dedicated worker capacity, isolated from other clients.\n * Workers are assigned to pools and only serve requests from that pool.\n *\n * @param name - Pool name (used in GPU param as \"poolName/machineProfile\")\n * @param gpus - Machine profile requirements, e.g., { \"l4\": 2, \"l4-spot\": 1 }\n *\n * @example\n * ```typescript\n * // Create a pool with 2 L4 GPUs\n * await client.createPool(\"eval-bench\", { l4: 2 });\n *\n * // Use the pool for requests\n * await client.encode(\"bge-m3\", { text: \"Hello\" }, { gpu: \"eval-bench/l4\" });\n *\n * // Clean up when done\n * await client.deletePool(\"eval-bench\");\n * ```\n */\n async createPool(name: string, gpus: Record<string, number>): Promise<void> {\n // Check if pool already exists in our tracking\n if (this.pools.has(name)) {\n return; // Pool already created\n }\n\n // Build pool creation request\n const requestBody = { name, gpus };\n\n const url = `${this.baseUrl}/v1/pools`;\n const headers: Record<string, string> = {\n \"Content-Type\": JSON_CONTENT_TYPE,\n Accept: JSON_CONTENT_TYPE,\n [SDK_VERSION_HEADER]: SDK_VERSION,\n };\n\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(requestBody),\n signal: controller.signal,\n });\n\n if (response.status >= HTTP_CLIENT_ERROR_MIN) {\n let errorMsg = response.statusText;\n try {\n const data = (await response.json()) as { detail?: { message?: string } };\n errorMsg = data.detail?.message ?? JSON.stringify(data);\n } catch {\n // Use status text\n }\n throw new PoolError(`Failed to create pool '${name}': ${errorMsg}`, name);\n }\n\n // Start lease renewal loop for this pool (recursive setTimeout\n // prevents overlapping runs unlike setInterval)\n const abortController = new AbortController();\n const poolState = {\n timeoutId: null as ReturnType<typeof setTimeout> | null,\n abortController,\n isRenewing: false,\n };\n\n const renewLoop = async () => {\n if (abortController.signal.aborted) return;\n if (poolState.isRenewing) return;\n poolState.isRenewing = true;\n\n try {\n const renewUrl = `${this.baseUrl}/v1/pools/${encodeURIComponent(name)}/renew`;\n const renewHeaders: Record<string, string> = {\n Accept: JSON_CONTENT_TYPE,\n };\n\n if (this.apiKey) {\n renewHeaders.Authorization = `Bearer ${this.apiKey}`;\n }\n\n for (let attempt = 0; attempt < _LEASE_RENEWAL_MAX_RETRIES; attempt++) {\n if (abortController.signal.aborted) return;\n\n // Per-attempt controller: times out individual fetches and\n // forwards the pool-level abort so close()/deletePool() cancels\n // in-flight requests immediately.\n const perAttempt = new AbortController();\n const onPoolAbort = () => perAttempt.abort();\n abortController.signal.addEventListener(\"abort\", onPoolAbort, { once: true });\n const attemptTimeout = setTimeout(() => perAttempt.abort(), this.timeout);\n\n try {\n const resp = await fetch(renewUrl, {\n method: \"POST\",\n headers: renewHeaders,\n signal: perAttempt.signal,\n });\n if (resp.ok) break;\n } catch (error) {\n // Pool-level abort → stop entirely\n if (abortController.signal.aborted) return;\n // Per-attempt timeout or network error → fall through to retry\n } finally {\n clearTimeout(attemptTimeout);\n abortController.signal.removeEventListener(\"abort\", onPoolAbort);\n }\n if (attempt < _LEASE_RENEWAL_MAX_RETRIES - 1) {\n const aborted = await abortableSleep(\n Math.min(2 ** attempt * 1000, 10000),\n abortController.signal,\n );\n if (aborted) return;\n }\n }\n } finally {\n poolState.isRenewing = false;\n }\n\n // Schedule next renewal only after current run finishes\n if (!abortController.signal.aborted) {\n poolState.timeoutId = setTimeout(renewLoop, DEFAULT_LEASE_RENEWAL_INTERVAL);\n }\n };\n\n poolState.timeoutId = setTimeout(renewLoop, DEFAULT_LEASE_RENEWAL_INTERVAL);\n this.pools.set(name, poolState);\n } catch (error) {\n if (error instanceof PoolError) {\n throw error;\n }\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new PoolError(`Timeout creating pool '${name}'`, name);\n }\n throw new PoolError(\n `Failed to create pool '${name}': ${error instanceof Error ? error.message : \"Unknown error\"}`,\n name,\n );\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Get information about a pool.\n *\n * @param name - Pool name to query\n * @returns PoolInfo if pool exists, null otherwise\n *\n * @example\n * ```typescript\n * await client.createPool(\"eval-bench\", { l4: 2 });\n * const pool = await client.getPool(\"eval-bench\");\n * console.log(`Pool state: ${pool?.status.state}`);\n * console.log(`Workers: ${pool?.status.assignedWorkers.length}`);\n * ```\n */\n async getPool(name: string): Promise<PoolInfo | null> {\n try {\n const response = await this.requestJson(`/v1/pools/${encodeURIComponent(name)}`);\n const data = (await response.json()) as {\n name: string;\n spec: { gpus?: Record<string, number> };\n status: {\n state: string;\n assigned_workers: Array<{ name: string; url: string; gpu: string }>;\n created_at?: number;\n last_renewed?: number;\n };\n };\n\n return {\n name: data.name,\n spec: data.spec,\n status: {\n state: data.status.state,\n assignedWorkers: data.status.assigned_workers,\n createdAt: data.status.created_at,\n lastRenewed: data.status.last_renewed,\n },\n };\n } catch {\n // Pool might not exist\n return null;\n }\n }\n\n /**\n * Delete a pool.\n *\n * @param name - Pool name to delete\n * @returns true if pool was deleted, false if pool didn't exist\n *\n * @example\n * ```typescript\n * // Clean up pool when done\n * const deleted = await client.deletePool(\"eval-bench\");\n * if (deleted) {\n * console.log(\"Pool deleted successfully\");\n * }\n * ```\n */\n async deletePool(name: string): Promise<boolean> {\n // Stop lease renewal first if we're tracking this pool\n const poolState = this.pools.get(name);\n if (poolState) {\n if (poolState.timeoutId !== null) {\n clearTimeout(poolState.timeoutId);\n }\n poolState.abortController.abort();\n this.pools.delete(name);\n }\n\n try {\n const url = `${this.baseUrl}/v1/pools/${encodeURIComponent(name)}`;\n const headers: Record<string, string> = {\n Accept: JSON_CONTENT_TYPE,\n };\n\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: \"DELETE\",\n headers,\n signal: controller.signal,\n });\n\n return response.ok || response.status === 404;\n } finally {\n clearTimeout(timeoutId);\n }\n } catch {\n return false;\n }\n }\n\n private checkServerVersion(response: Response): void {\n if (this.versionWarningLogged) return;\n const serverVersion = response.headers.get(SERVER_VERSION_HEADER);\n if (!serverVersion) return;\n try {\n const sdkParts = SDK_VERSION.split(\".\").map(Number);\n const serverParts = serverVersion.split(\".\").map(Number);\n if (sdkParts.length < 2 || serverParts.length < 2) return;\n const sdkMajor = sdkParts[0];\n const sdkMinor = sdkParts[1];\n const serverMajor = serverParts[0];\n const serverMinor = serverParts[1];\n if (\n sdkMajor === undefined ||\n sdkMinor === undefined ||\n serverMajor === undefined ||\n serverMinor === undefined\n ) {\n return;\n }\n if (sdkMajor !== serverMajor || Math.abs(sdkMinor - serverMinor) > 1) {\n console.warn(\n `[SIE SDK] Version skew detected: SDK ${SDK_VERSION}, server ${serverVersion}. Consider upgrading.`,\n );\n this.versionWarningLogged = true;\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n /**\n * Parse GPU parameter into pool and GPU components.\n *\n * Supports \"pool/gpu\" format for pool routing.\n */\n private parseGpuParam(gpu?: string): { pool?: string; gpu?: string } {\n const effectiveGpu = gpu ?? this.gpu;\n\n if (!effectiveGpu) {\n return {};\n }\n\n // Parse \"pool/gpu\" format\n const parts = effectiveGpu.split(\"/\");\n if (parts.length === 2 && parts[0] && parts[1]) {\n return { pool: parts[0], gpu: parts[1] };\n }\n\n return { gpu: effectiveGpu };\n }\n\n /**\n * Get current cluster capacity information.\n *\n * Queries the router's /health endpoint for cluster state. Useful for\n * checking if specific GPU types are available before sending requests.\n *\n * @param gpu - Optional filter to check specific GPU type availability\n * @returns CapacityInfo with worker count, GPU types, and worker details\n *\n * @example\n * ```typescript\n * // Check cluster state\n * const capacity = await client.getCapacity();\n * console.log(`Workers: ${capacity.workerCount}, GPUs: ${capacity.liveGpuTypes}`);\n *\n * // Check if L4 GPUs are available\n * const l4Capacity = await client.getCapacity(\"l4\");\n * if (l4Capacity.workerCount > 0) {\n * console.log(\"L4 workers available\");\n * }\n * ```\n */\n async getCapacity(gpu?: string): Promise<CapacityInfo> {\n const response = await this.requestJson(\"/health\");\n const data = (await response.json()) as { type?: string };\n\n // Check if this is a router (has 'type': 'router') or worker\n if (data.type !== \"router\") {\n throw new RequestError(\n \"getCapacity() requires a router endpoint. This appears to be a worker.\",\n \"not_router\",\n 400,\n );\n }\n\n return parseCapacityInfo(data, gpu);\n }\n\n /**\n * Wait for GPU capacity to become available.\n *\n * Polls the router until workers with the specified GPU type are online.\n * This is useful for pre-warming the cluster before running benchmarks.\n *\n * @param gpu - GPU type to wait for (e.g., \"l4\", \"a100-80gb\")\n * @param options - Wait options\n * @returns CapacityInfo once capacity is available\n *\n * @example\n * ```typescript\n * // Wait for L4 capacity before running benchmarks\n * const capacity = await client.waitForCapacity(\"l4\", { timeout: 300000 });\n * console.log(`Ready with ${capacity.workerCount} L4 workers`);\n *\n * // Wait and pre-load a model\n * const capacityWithModel = await client.waitForCapacity(\"l4\", { model: \"bge-m3\" });\n * ```\n */\n async waitForCapacity(\n gpu: string,\n options: { model?: string; timeout?: number; pollInterval?: number } = {},\n ): Promise<CapacityInfo> {\n const timeout = options.timeout ?? this.provisionTimeout;\n const pollInterval = options.pollInterval ?? 5000;\n const startTime = Date.now();\n\n // If model is specified, use encode with waitForCapacity to trigger\n // both scale-up and model loading\n if (options.model) {\n await this.encode(options.model, { text: \"warmup\" }, { gpu, waitForCapacity: true });\n // After successful encode, get capacity info\n return this.getCapacity(gpu);\n }\n\n // Otherwise, poll capacity until workers are available\n while (true) {\n try {\n const capacity = await this.getCapacity(gpu);\n if (capacity.workerCount > 0) {\n return capacity;\n }\n } catch {\n // Keep trying on errors\n }\n\n const elapsed = Date.now() - startTime;\n if (elapsed >= timeout) {\n throw new ProvisioningError(\n `Timeout after ${elapsed}ms waiting for GPU '${gpu}' capacity`,\n gpu,\n );\n }\n\n // Wait before next poll\n const remaining = timeout - elapsed;\n const delay = Math.min(pollInterval, remaining);\n await sleep(delay);\n }\n }\n\n /**\n * Make a msgpack HTTP request with retry logic for 202 and LoRA loading.\n */\n private async requestWithRetry(\n path: string,\n body: unknown,\n pool: string | undefined,\n gpu: string | undefined,\n waitForCapacity: boolean,\n model: string,\n ): Promise<Response> {\n const startTime = Date.now();\n\n // Local retry counter for LoRA loading (uses retry count, not time-based)\n // Model loading uses cumulative time check, not retry counter\n let loraRetries = 0;\n\n while (true) {\n const response = await this.request(path, body, pool, gpu);\n\n // Handle 202 (provisioning) - capacity not available\n if (response.status === HTTP_ACCEPTED) {\n const retryAfter = getRetryAfter(response);\n\n if (!waitForCapacity) {\n throw new ProvisioningError(\n `No capacity available for GPU '${gpu}'. Server is provisioning.`,\n gpu,\n retryAfter,\n );\n }\n\n // Check if we've exceeded the timeout\n const elapsed = Date.now() - startTime;\n if (elapsed >= this.provisionTimeout) {\n throw new ProvisioningError(\n `Provisioning timeout after ${elapsed}ms waiting for GPU '${gpu}'`,\n gpu,\n retryAfter,\n );\n }\n\n // Wait and retry\n const delay = retryAfter ?? DEFAULT_RETRY_DELAY;\n const remaining = this.provisionTimeout - elapsed;\n const actualDelay = Math.min(delay, remaining);\n await sleep(actualDelay);\n continue;\n }\n\n // Handle 503 with LORA_LOADING or MODEL_LOADING - auto-retry\n if (response.status === 503) {\n const clonedResponse = response.clone();\n const errorCode = await getErrorCode(clonedResponse);\n\n if (errorCode === LORA_LOADING_ERROR_CODE) {\n loraRetries += 1;\n\n if (loraRetries > LORA_LOADING_MAX_RETRIES) {\n throw new LoraLoadingError(\n `LoRA loading timeout after ${loraRetries} retries`,\n undefined, // We don't have lora name at this level\n model,\n );\n }\n\n // Wait and retry\n const retryAfter = getRetryAfter(response);\n const delay = retryAfter ?? LORA_LOADING_DEFAULT_DELAY;\n await sleep(delay);\n continue;\n }\n\n if (errorCode === MODEL_LOADING_ERROR_CODE) {\n // Check if we've exceeded the provision timeout (cumulative wall-clock time)\n const elapsed = Date.now() - startTime;\n if (elapsed >= this.provisionTimeout) {\n throw new ModelLoadingError(\n `Model loading timeout after ${(elapsed / 1000).toFixed(1)}s for '${model}'`,\n model,\n );\n }\n\n // Wait and retry, respecting remaining time\n const retryAfter = getRetryAfter(response);\n const delay = retryAfter ?? MODEL_LOADING_DEFAULT_DELAY;\n const remaining = this.provisionTimeout - elapsed;\n const actualDelay = Math.min(delay, remaining);\n await sleep(actualDelay);\n continue;\n }\n }\n\n // Handle other errors\n if (!response.ok) {\n await handleError(response, gpu);\n }\n\n // Success\n this.checkServerVersion(response);\n return response;\n }\n }\n\n /**\n * Make a single msgpack HTTP request to the SIE server (no retry logic).\n */\n private async request(\n path: string,\n body?: unknown,\n pool?: string,\n gpu?: string,\n ): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n Accept: MSGPACK_CONTENT_TYPE,\n [SDK_VERSION_HEADER]: SDK_VERSION,\n };\n\n if (body !== undefined) {\n headers[\"Content-Type\"] = MSGPACK_CONTENT_TYPE;\n }\n\n // Pool header takes precedence for routing\n if (pool) {\n headers[\"X-SIE-Pool\"] = pool;\n }\n\n if (gpu) {\n headers[\"X-SIE-MACHINE-PROFILE\"] = gpu;\n }\n\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: body !== undefined ? packMessage(body) : undefined,\n signal: controller.signal,\n });\n\n return response;\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new SIEConnectionError(`Request timeout after ${this.timeout}ms`);\n }\n if (error instanceof TypeError) {\n throw new SIEConnectionError(`Connection failed: ${error.message}`);\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Make a JSON HTTP request to the SIE server.\n * Used for endpoints that return JSON (e.g., /v1/models, /health).\n */\n private async requestJson(path: string, method: \"GET\" | \"POST\" = \"GET\"): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n [SDK_VERSION_HEADER]: SDK_VERSION,\n };\n\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n await handleError(response);\n }\n\n return response;\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new SIEConnectionError(`Request timeout after ${this.timeout}ms`);\n }\n if (error instanceof TypeError) {\n throw new SIEConnectionError(`Connection failed: ${error.message}`);\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n private buildWsUrl(path: string): string {\n const url = new URL(this.baseUrl);\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n url.pathname = `${url.pathname.replace(/\\/$/, \"\")}${path}`;\n url.search = \"\";\n return url.toString();\n }\n\n private createWebSocket(url: string): WebSocket {\n const headers: Record<string, string> | undefined = this.apiKey\n ? { Authorization: `Bearer ${this.apiKey}` }\n : undefined;\n\n try {\n if (headers) {\n return new (\n WebSocket as unknown as {\n new (u: string, p?: string[], o?: { headers: Record<string, string> }): WebSocket;\n }\n )(url, [], { headers });\n }\n return new WebSocket(url);\n } catch (error) {\n if (headers) {\n throw new SIEConnectionError(\n \"WebSocket auth headers are not supported in this environment\",\n );\n }\n throw error;\n }\n }\n\n private async detectEndpointType(): Promise<\"cluster\" | \"worker\"> {\n const url = `${this.baseUrl}/health`;\n const headers: Record<string, string> = { Accept: \"application/json\" };\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n return \"worker\";\n }\n\n const data = (await response.json()) as { type?: string };\n return data.type === \"router\" ? \"cluster\" : \"worker\";\n } catch {\n return \"worker\";\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n","/**\n * Types for the SIE TypeScript SDK\n *\n * These types mirror the Python SDK (packages/sie_sdk/src/sie_sdk/types.py)\n * for full feature parity.\n */\n\n/**\n * Output dtype options for quantized embeddings.\n * Matches Python DType literal.\n */\nexport type DType = \"float32\" | \"float16\" | \"bfloat16\" | \"int8\" | \"uint8\" | \"binary\" | \"ubinary\";\n\n/**\n * Output type options for encode operation.\n */\nexport type OutputType = \"dense\" | \"sparse\" | \"multivector\";\n\n/**\n * A single item to encode, score, or extract from.\n *\n * For simple text encoding, just use `{ text: \"your text here\" }`.\n *\n * @example\n * // Simple text\n * { text: \"Hello world\" }\n *\n * // With ID for tracking through results\n * { id: \"doc-1\", text: \"Document text\" }\n *\n * // With images for multimodal models (ColPali, CLIP)\n * { text: \"Description\", images: [imageBytes] }\n *\n * // Pre-encoded multivector (for use with maxsim utility)\n * { multivector: [tokenEmbedding1, tokenEmbedding2, ...] }\n */\nexport interface Item {\n /** Optional ID to track this item through results */\n id?: string;\n /** Text content to encode */\n text?: string;\n /** Images as byte arrays (JPEG/PNG) for multimodal models */\n images?: Uint8Array[];\n /** Pre-encoded multivector (for use with maxsim utility) */\n multivector?: Float32Array[];\n /** Arbitrary metadata (passed through to results) */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Sparse vector result with non-zero indices and values.\n * Used by SPLADE-type models.\n */\nexport interface SparseResult {\n /** Token indices with non-zero weights */\n indices: Int32Array;\n /** Weight values for each index */\n values: Float32Array;\n}\n\n/**\n * Server-side timing breakdown for a request.\n */\nexport interface TimingInfo {\n totalMs?: number;\n queueMs?: number;\n tokenizationMs?: number;\n inferenceMs?: number;\n}\n\n/**\n * Result of encoding a single item.\n *\n * Contains the item ID (if provided) and one or more output representations\n * depending on what was requested via outputTypes.\n */\nexport interface EncodeResult {\n /** Item ID (echoed from request if provided) */\n id?: string;\n /** Dense embedding vector, shape [dims] */\n dense?: Float32Array;\n /** Sparse embedding with indices and values */\n sparse?: SparseResult;\n /** Multi-vector embedding for late interaction models, shape [numTokens][tokenDims] */\n multivector?: Float32Array[];\n /** Server-side timing breakdown */\n timing?: TimingInfo;\n}\n\n/**\n * Model dimension information.\n */\nexport interface ModelDims {\n dense?: number;\n sparse?: number;\n multivector?: number;\n}\n\n/**\n * Information about a model returned by listModels().\n */\nexport interface ModelInfo {\n /** Model name/identifier */\n name: string;\n /** Whether the model is currently loaded in memory */\n loaded: boolean;\n /** Supported input types: [\"text\"], [\"text\", \"image\"], etc. */\n inputs: string[];\n /** Supported output types: [\"dense\"], [\"dense\", \"sparse\"], etc. */\n outputs: string[];\n /** Embedding dimensions for each output type */\n dims?: ModelDims;\n /** Maximum sequence length the model supports */\n maxSequenceLength?: number;\n}\n\n/**\n * A single score entry from reranking.\n */\nexport interface ScoreEntry {\n /** ID of the item (from request or auto-generated) */\n itemId: string;\n /** Relevance score (higher = more relevant) */\n score: number;\n /** Position in sorted order (0 = most relevant) */\n rank: number;\n}\n\n/**\n * Result of scoring items against a query.\n */\nexport interface ScoreResult {\n /** Model used for scoring */\n model?: string;\n /** Query ID (echoed from request if provided) */\n queryId?: string;\n /** Score entries, sorted by relevance (descending) */\n scores: ScoreEntry[];\n}\n\n/**\n * A single extracted entity (NER span).\n */\nexport interface Entity {\n /** The extracted text span */\n text: string;\n /** Entity type/label (e.g., \"person\", \"organization\") */\n label: string;\n /** Confidence score */\n score: number;\n /** Start character offset in the original text */\n start?: number;\n /** End character offset in the original text */\n end?: number;\n /** Bounding box [x, y, width, height] for image-based extraction */\n bbox?: number[];\n}\n\n/**\n * A relation triple between two entities.\n */\nexport interface Relation {\n /** Head entity text */\n head: string;\n /** Tail entity text */\n tail: string;\n /** Relation type label (e.g., \"works_at\", \"founded_by\") */\n relation: string;\n /** Confidence score */\n score: number;\n}\n\n/**\n * A text classification result.\n */\nexport interface Classification {\n /** Classification label (e.g., \"positive\", \"negative\") */\n label: string;\n /** Confidence score */\n score: number;\n}\n\n/**\n * A detected object with bounding box.\n */\nexport interface DetectedObject {\n /** Object class label (e.g., \"person\", \"car\") */\n label: string;\n /** Confidence score */\n score: number;\n /** Bounding box [x, y, width, height] */\n bbox: number[];\n}\n\n/**\n * Result of extraction for a single item.\n */\nexport interface ExtractResult {\n /** Item ID (echoed from request if provided) */\n id?: string;\n /** List of extracted entities */\n entities: Entity[];\n /** List of extracted relation triples */\n relations: Relation[];\n /** List of classification results */\n classifications: Classification[];\n /** List of detected objects */\n objects: DetectedObject[];\n}\n\n/**\n * Information about a worker in the cluster.\n */\nexport interface WorkerInfo {\n /** Worker base URL */\n url: string;\n /** GPU type (e.g., \"l4\", \"a100-80gb\") */\n gpu: string;\n /** Whether the worker is healthy */\n healthy: boolean;\n /** Number of items in the worker's queue */\n queueDepth: number;\n /** List of model names loaded on this worker */\n loadedModels: string[];\n}\n\n/**\n * Cluster capacity information returned by getCapacity().\n */\nexport interface CapacityInfo {\n /** Overall cluster status: \"healthy\", \"degraded\", \"no_workers\" */\n status: string;\n /** Number of healthy workers */\n workerCount: number;\n /** Number of GPUs available */\n gpuCount: number;\n /** Number of unique models loaded across all workers */\n modelsLoaded: number;\n /** GPU types configured in the cluster */\n configuredGpuTypes: string[];\n /** GPU types currently running */\n liveGpuTypes: string[];\n /** List of worker details */\n workers: WorkerInfo[];\n}\n\n/**\n * Pool specification for creating resource pools.\n */\nexport interface PoolSpec {\n /** Pool name (used in GPU param as \"poolName/gpuType\") */\n name: string;\n /** GPU requirements, e.g., { l4: 2, \"a100-40gb\": 1 } */\n gpus?: Record<string, number>;\n}\n\n/**\n * Pool status information.\n */\nexport interface PoolStatus {\n /** Pool state: \"pending\", \"active\", \"expired\" */\n state: string;\n /** Workers assigned to this pool */\n assignedWorkers: Array<{ name: string; url: string; gpu: string }>;\n /** Unix timestamp when pool was created */\n createdAt?: number;\n /** Unix timestamp of last lease renewal */\n lastRenewed?: number;\n}\n\n/**\n * Full pool information.\n */\nexport interface PoolInfo {\n /** Pool name */\n name: string;\n /** Pool specification */\n spec: { gpus?: Record<string, number> };\n /** Pool status */\n status: PoolStatus;\n}\n\n// ---------------------------------------------------------------------------\n// WebSocket Status Types\n// ---------------------------------------------------------------------------\n\nexport type ModelState = \"available\" | \"loading\" | \"loaded\" | \"unloading\";\n\nexport interface ClusterSummary {\n worker_count: number;\n gpu_count: number;\n models_loaded: number;\n total_qps: number;\n}\n\nexport interface ClusterWorkerInfo {\n url: string;\n gpu: string;\n healthy: boolean;\n queue_depth: number;\n loaded_models: string[];\n}\n\nexport interface ModelSummary {\n name: string;\n state: ModelState;\n worker_count: number;\n gpu_types: string[];\n total_queue_depth: number;\n}\n\nexport interface ServerInfo {\n version: string;\n uptime_seconds: number;\n user: string;\n working_dir: string;\n pid: number;\n}\n\nexport interface GPUMetrics {\n device: string;\n name: string;\n gpu_type: string;\n utilization_pct: number;\n memory_used_bytes: number;\n memory_total_bytes: number;\n memory_threshold_pct?: number;\n}\n\nexport interface ModelConfig {\n hf_id: string;\n adapter: string;\n inputs: string[];\n outputs: string[];\n dims: Record<string, number | null>;\n max_sequence_length?: number;\n pooling?: string | null;\n normalize?: boolean;\n adapter_options_loadtime?: Record<string, unknown> | null;\n adapter_options_runtime?: Record<string, unknown> | null;\n}\n\nexport interface ModelStatus {\n name: string;\n state: ModelState;\n device: string | null;\n memory_bytes: number;\n config: ModelConfig;\n queue_depth: number;\n queue_pending_items: number;\n}\n\nexport interface WorkerStatusMessage {\n timestamp: number;\n name: string;\n gpu: string;\n gpu_count: number;\n bundle: string;\n machine_profile: string;\n loaded_models: string[];\n server: ServerInfo;\n gpus: GPUMetrics[];\n models: ModelStatus[];\n counters: Record<string, Record<string, number>>;\n histograms: Record<string, Record<string, Record<string, unknown>>>;\n}\n\nexport interface ClusterStatusMessage {\n timestamp: number;\n cluster: ClusterSummary;\n workers: ClusterWorkerInfo[];\n models: ModelSummary[];\n}\n\nexport type StatusMessage = WorkerStatusMessage | ClusterStatusMessage;\n\n// ---------------------------------------------------------------------------\n// Client Options\n// ---------------------------------------------------------------------------\n\n/**\n * Options for SIEClient constructor.\n */\nexport interface SIEClientOptions {\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Default GPU type for all requests (e.g., \"l4\", \"a100-80gb\") */\n gpu?: string;\n /** API key for authentication (sent as Bearer token) */\n apiKey?: string;\n /** Whether to auto-retry on 202 (provisioning) responses */\n waitForCapacity?: boolean;\n /** Maximum time to wait for provisioning in milliseconds (default: 300000) */\n provisionTimeout?: number;\n}\n\n/**\n * Options for encode operation.\n */\nexport interface EncodeOptions {\n /** Output types to request: [\"dense\"], [\"sparse\"], [\"dense\", \"sparse\", \"multivector\"] */\n outputTypes?: OutputType[];\n /** Instruction prefix for instruction-tuned models */\n instruction?: string;\n /** Whether this is a query (for asymmetric models) */\n isQuery?: boolean;\n /** Output dtype for quantization */\n outputDtype?: DType;\n /** GPU type for this request (overrides client default) */\n gpu?: string;\n /** Whether to wait for capacity (overrides client default) */\n waitForCapacity?: boolean;\n}\n\n/**\n * Options for score operation.\n */\nexport interface ScoreOptions {\n /** GPU type for this request */\n gpu?: string;\n /** Whether to wait for capacity */\n waitForCapacity?: boolean;\n}\n\n/**\n * Options for extract operation.\n */\nexport interface ExtractOptions {\n /** Entity labels to extract (e.g., [\"person\", \"organization\"]) */\n labels: string[];\n /** Minimum confidence threshold (0-1) */\n threshold?: number;\n /** GPU type for this request */\n gpu?: string;\n /** Whether to wait for capacity */\n waitForCapacity?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Utility Types\n// ---------------------------------------------------------------------------\n\n/**\n * Helper to convert typed arrays to regular number array.\n * Useful for JSON serialization or working with libraries that expect number[].\n */\nexport function toNumberArray(arr: Float32Array | Int32Array): number[] {\n return Array.from(arr);\n}\n\n/**\n * Helper to convert number array to Float32Array.\n */\nexport function toFloat32Array(arr: number[]): Float32Array {\n return new Float32Array(arr);\n}\n","/**\n * Helpers for converting SIE encode results to plain JavaScript types.\n *\n * These functions bridge SDK result types (Float32Array, typed dicts) to the\n * plain `number[]` / object formats that framework integrations and vector\n * databases expect.\n *\n * @example\n * ```typescript\n * import { SIEClient, denseEmbedding, sparseEmbedding } from \"@superlinked/sie-sdk\";\n *\n * const client = new SIEClient(\"http://localhost:8080\");\n * const result = await client.encode(\"BAAI/bge-m3\", { text: \"hello\" });\n * const vec = denseEmbedding(result); // number[]\n * const sp = sparseEmbedding(result); // { indices: number[], values: number[] }\n * ```\n */\n\nimport type { EncodeResult, SparseResult } from \"./types.js\";\nimport { toNumberArray } from \"./types.js\";\n\n/** Sparse vector in `{ indices, values }` format. */\nexport interface SparseVector {\n indices: number[];\n values: number[];\n}\n\n/**\n * Extract the dense embedding from an encode result as `number[]`.\n *\n * @param result - An {@link EncodeResult} from `client.encode()`.\n * @param strict - If `true` (default), throw when dense is missing. If `false`, return `[]`.\n * @returns The dense vector as a plain JavaScript number array.\n */\nexport function denseEmbedding(result: EncodeResult, strict = true): number[] {\n const dense = result.dense;\n if (!dense) {\n if (strict) {\n throw new Error(\"Encode result missing dense embedding\");\n }\n return [];\n }\n return toNumberArray(dense);\n}\n\n/**\n * Extract the sparse embedding from an encode result.\n *\n * @param result - An {@link EncodeResult} from `client.encode()`.\n * @returns Object with `indices: number[]` and `values: number[]`. Empty arrays if sparse is absent.\n */\nexport function sparseEmbedding(result: EncodeResult): SparseVector {\n const sparse = result.sparse;\n if (!sparse) {\n return { indices: [], values: [] };\n }\n return {\n indices: toNumberArray(sparse.indices),\n values: toNumberArray(sparse.values),\n };\n}\n\n/**\n * Extract the sparse embedding as a `Map<number, number>` (token index → weight).\n *\n * Useful for ChromaDB which expects sparse embeddings in this format.\n *\n * @param result - An {@link EncodeResult} from `client.encode()`.\n * @returns Map from integer token indices to float weights. Empty map if sparse is absent.\n */\nexport function sparseEmbeddingMap(result: EncodeResult): Map<number, number> {\n const sparse = result.sparse;\n if (!sparse) {\n return new Map();\n }\n const indices = toNumberArray(sparse.indices);\n const values = toNumberArray(sparse.values);\n const map = new Map<number, number>();\n for (let i = 0; i < indices.length; i++) {\n map.set(indices[i]!, values[i]!);\n }\n return map;\n}\n\n/**\n * Convert a raw sparse sub-object to plain JavaScript arrays.\n *\n * Unlike {@link sparseEmbedding}, this takes the sparse value itself\n * (already extracted from the result) — useful inside named-vector\n * loops where you've already pulled `result.sparse`.\n *\n * @param sparse - A {@link SparseResult} with `indices` and `values` typed arrays.\n * @returns Object with `indices: number[]` and `values: number[]`.\n */\nexport function normalizeSparseVector(sparse: SparseResult): SparseVector {\n return {\n indices: toNumberArray(sparse.indices),\n values: toNumberArray(sparse.values),\n };\n}\n\n/**\n * Convert a multivector (ColBERT) result to `number[][]`.\n *\n * SIE returns multivectors as `Float32Array[]`. Vector databases expect\n * nested plain JavaScript arrays.\n *\n * @param raw - Array of Float32Array token vectors.\n * @returns Nested array of number vectors.\n */\nexport function multivectorEmbedding(raw: Float32Array[]): number[][] {\n return raw.map((v) => toNumberArray(v));\n}\n","/**\n * Client-side scoring functions (MaxSim for ColBERT)\n */\n\n/**\n * Compute MaxSim score between a query and a document (both multivector)\n * MaxSim: for each query token, find max similarity to any document token, then sum\n */\nexport function maxsim(query: Float32Array[], document: Float32Array[]): number {\n if (query.length === 0 || document.length === 0) {\n return 0;\n }\n\n let totalScore = 0;\n\n for (const queryToken of query) {\n let maxSim = Number.NEGATIVE_INFINITY;\n\n for (const docToken of document) {\n // Dot product (assumes vectors are normalized)\n let sim = 0;\n for (let i = 0; i < queryToken.length; i++) {\n sim += (queryToken[i] ?? 0) * (docToken[i] ?? 0);\n }\n if (sim > maxSim) {\n maxSim = sim;\n }\n }\n\n totalScore += maxSim;\n }\n\n return totalScore;\n}\n\n/**\n * Compute MaxSim scores between a query and multiple documents\n */\nexport function maxsimDocuments(query: Float32Array[], documents: Float32Array[][]): number[] {\n return documents.map((doc) => maxsim(query, doc));\n}\n\n/**\n * Compute MaxSim scores for a batch of queries against a batch of documents\n * Returns a flattened array of scores: [q0d0, q0d1, ..., q1d0, q1d1, ...]\n */\nexport function maxsimBatch(queries: Float32Array[][], documents: Float32Array[][]): Float32Array {\n const scores = new Float32Array(queries.length * documents.length);\n let idx = 0;\n\n for (const query of queries) {\n for (const doc of documents) {\n scores[idx++] = maxsim(query, doc);\n }\n }\n\n return scores;\n}\n","/**\n * Image handling utilities for the SIE TypeScript SDK.\n *\n * Per design.md Section 4.3, images are serialized as bytes for transport.\n * This module handles conversion from various input formats to Uint8Array.\n *\n * Supported input formats:\n * - Uint8Array (raw bytes)\n * - ArrayBuffer / Buffer (Node.js)\n * - Blob / File (browser)\n * - string (base64 or data URL)\n *\n * @example\n * ```typescript\n * import { toImageBytes } from \"@superlinked/sie-sdk\";\n *\n * // From file input (browser)\n * const file = document.querySelector('input[type=\"file\"]').files[0];\n * const bytes = await toImageBytes(file);\n *\n * // From base64 string\n * const bytes = await toImageBytes(base64String);\n *\n * // From Uint8Array (passthrough)\n * const bytes = await toImageBytes(existingBytes);\n * ```\n */\n\n/**\n * Type for all supported image input formats.\n */\nexport type ImageInput = Uint8Array | ArrayBuffer | Blob | string;\n\n/**\n * Wire format for images sent to the server.\n * Per design.md Section 4.3.\n */\nexport interface ImageWireFormat {\n data: Uint8Array;\n format: \"jpeg\" | \"png\" | \"webp\";\n}\n\n/**\n * Convert various image input types to Uint8Array.\n *\n * Accepts:\n * - Uint8Array: passed through as-is\n * - ArrayBuffer / Buffer: wrapped in Uint8Array\n * - Blob / File: read as ArrayBuffer then wrapped\n * - string: decoded from base64 or data URL\n *\n * @param input - Image data in any supported format\n * @returns Image bytes as Uint8Array\n *\n * @example\n * ```typescript\n * // From base64 string\n * const bytes = await toImageBytes(base64String);\n *\n * // From file (browser)\n * const bytes = await toImageBytes(file);\n * ```\n */\nexport async function toImageBytes(input: ImageInput): Promise<Uint8Array> {\n // Already Uint8Array\n if (input instanceof Uint8Array) {\n return input;\n }\n\n // ArrayBuffer (or Buffer in Node.js)\n if (input instanceof ArrayBuffer) {\n return new Uint8Array(input);\n }\n\n // Blob or File (browser)\n if (typeof Blob !== \"undefined\" && input instanceof Blob) {\n const buffer = await input.arrayBuffer();\n return new Uint8Array(buffer);\n }\n\n // Base64 string or data URL\n if (typeof input === \"string\") {\n // Check if it's a data URL\n const dataUrlMatch = input.match(/^data:[^;]+;base64,(.+)$/);\n if (dataUrlMatch?.[1]) {\n return base64ToBytes(dataUrlMatch[1]);\n }\n\n // Assume it's raw base64\n return base64ToBytes(input);\n }\n\n throw new Error(`Unsupported image input type: ${typeof input}`);\n}\n\n/**\n * Convert base64 string to Uint8Array.\n */\nfunction base64ToBytes(base64: string): Uint8Array {\n // Use atob in browser, Buffer in Node.js\n if (typeof atob === \"function\") {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n\n // Node.js environment\n return new Uint8Array(Buffer.from(base64, \"base64\"));\n}\n\n/**\n * Convert image bytes to wire format for transport.\n *\n * Per design.md Section 4.3, images are sent as:\n * `{ data: <bytes>, format: \"jpeg\" | \"png\" | \"webp\" }`\n *\n * @param input - Image data in any supported format\n * @param format - Image format (defaults to \"jpeg\")\n * @returns Image in wire format\n */\nexport async function toImageWireFormat(\n input: ImageInput,\n format: \"jpeg\" | \"png\" | \"webp\" = \"jpeg\",\n): Promise<ImageWireFormat> {\n const data = await toImageBytes(input);\n return { data, format };\n}\n\n/**\n * Detect image format from bytes (magic number check).\n *\n * @param bytes - Image bytes\n * @returns Detected format or \"unknown\"\n */\nexport function detectImageFormat(bytes: Uint8Array): \"jpeg\" | \"png\" | \"webp\" | \"unknown\" {\n if (bytes.length < 4) {\n return \"unknown\";\n }\n\n // JPEG: starts with FF D8 FF\n if (bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff) {\n return \"jpeg\";\n }\n\n // PNG: starts with 89 50 4E 47 (0x89 'PNG')\n if (bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4e && bytes[3] === 0x47) {\n return \"png\";\n }\n\n // WebP: starts with RIFF....WEBP\n if (\n bytes[0] === 0x52 &&\n bytes[1] === 0x49 &&\n bytes[2] === 0x46 &&\n bytes[3] === 0x46 &&\n bytes.length >= 12 &&\n bytes[8] === 0x57 &&\n bytes[9] === 0x45 &&\n bytes[10] === 0x42 &&\n bytes[11] === 0x50\n ) {\n return \"webp\";\n }\n\n return \"unknown\";\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/internal/constants.ts","../src/msgpack.ts","../src/internal/retry.ts","../src/internal/parsing.ts","../src/version.ts","../src/client.ts","../src/types.ts","../src/encoding.ts","../src/scoring.ts","../src/images.ts"],"names":["buffer","getRetryAfter"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Error classes for the SIE TypeScript SDK.\n *\n * These errors mirror the Python SDK (packages/sie_sdk/src/sie_sdk/client/errors.py)\n * for consistent error handling across languages.\n *\n * @example\n * // Catching specific error types\n * try {\n * await client.encode(\"model\", { text: \"hello\" });\n * } catch (error) {\n * if (error instanceof RequestError) {\n * console.error(`Bad request (${error.code}): ${error.message}`);\n * } else if (error instanceof ProvisioningError) {\n * console.log(`GPU ${error.gpu} is provisioning, retry after ${error.retryAfter}ms`);\n * } else if (error instanceof SIEConnectionError) {\n * console.error(\"Cannot reach server:\", error.message);\n * }\n * }\n */\n\n/**\n * Base error for all SIE SDK errors.\n *\n * All SIE errors extend this class, so you can catch all SDK errors with:\n * `catch (error) { if (error instanceof SIEError) { ... } }`\n */\nexport class SIEError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SIEError\";\n // Maintain proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * `SIEConnectionError` failure category. Only `\"connect\"` is auto-retried\n * under `waitForCapacity: true`; `\"timeout\"` and `\"other\"` fail fast.\n */\nexport type SIEConnectionErrorKind = \"connect\" | \"timeout\" | \"other\";\n\n/**\n * Error connecting to the SIE server.\n *\n * Raised when:\n * - Network is unreachable\n * - DNS resolution fails\n * - Connection times out\n * - Server refuses connection\n */\nexport class SIEConnectionError extends SIEError {\n readonly kind: SIEConnectionErrorKind;\n\n constructor(message: string, kind: SIEConnectionErrorKind = \"other\") {\n super(message);\n this.name = \"SIEConnectionError\";\n this.kind = kind;\n }\n}\n\n/**\n * Error in the request (4xx responses).\n *\n * Raised when the client sends an invalid request:\n * - 400: Bad request (invalid parameters, malformed body)\n * - 401: Unauthorized (missing or invalid API key)\n * - 403: Forbidden (insufficient permissions)\n * - 404: Not found (invalid endpoint or model)\n * - 422: Validation error (invalid input format)\n */\nexport class RequestError extends SIEError {\n /** Error code from the server (e.g., \"INVALID_MODEL\", \"VALIDATION_ERROR\") */\n readonly code: string | undefined;\n /** HTTP status code (400-499) */\n readonly statusCode: number | undefined;\n\n constructor(message: string, code?: string, statusCode?: number) {\n super(message);\n this.name = \"RequestError\";\n this.code = code;\n this.statusCode = statusCode;\n }\n}\n\n/**\n * Error from the server (5xx responses).\n *\n * Raised when the server encounters an internal error:\n * - 500: Internal server error\n * - 502: Bad gateway\n * - 503: Service unavailable\n * - 504: Gateway timeout\n */\nexport class ServerError extends SIEError {\n /** Error code from the server (e.g., \"INTERNAL_ERROR\", \"LORA_LOADING\") */\n readonly code: string | undefined;\n /** HTTP status code (500-599) */\n readonly statusCode: number | undefined;\n\n constructor(message: string, code?: string, statusCode?: number) {\n super(message);\n this.name = \"ServerError\";\n this.code = code;\n this.statusCode = statusCode;\n }\n}\n\n/**\n * Error when capacity is not available and provisioning timed out.\n *\n * Raised when:\n * - Server returns 202 (no capacity, provisioning)\n * - waitForCapacity is false (caller doesn't want to wait)\n * - Or provisioning timeout exceeded\n *\n * The caller can use `retryAfter` to know when to retry.\n */\nexport class ProvisioningError extends SIEError {\n /** The GPU type that was requested */\n readonly gpu: string | undefined;\n /** Suggested retry delay in milliseconds (from server Retry-After header) */\n readonly retryAfter: number | undefined;\n\n constructor(message: string, gpu?: string, retryAfter?: number) {\n super(message);\n this.name = \"ProvisioningError\";\n this.gpu = gpu;\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Error related to resource pool operations.\n *\n * Raised when:\n * - Pool creation fails (e.g., insufficient capacity)\n * - Pool not found\n * - Pool in invalid state (e.g., expired)\n * - Pool lease renewal fails\n */\nexport class PoolError extends SIEError {\n /** Name of the pool */\n readonly poolName: string | undefined;\n /** Current pool state (if known): \"pending\", \"active\", \"expired\" */\n readonly state: string | undefined;\n\n constructor(message: string, poolName?: string, state?: string) {\n super(message);\n this.name = \"PoolError\";\n this.poolName = poolName;\n this.state = state;\n }\n}\n\n/**\n * Error when LoRA adapter is loading and retry limit exceeded.\n *\n * Raised when:\n * - Server returns 503 with LORA_LOADING code\n * - Retry limit is exceeded\n *\n * This usually means the adapter is being loaded from disk/network\n * and the caller should wait longer or reduce request rate.\n */\nexport class LoraLoadingError extends SIEError {\n /** The LoRA adapter that was requested */\n readonly lora: string | undefined;\n /** The model the LoRA was requested for */\n readonly model: string | undefined;\n\n constructor(message: string, lora?: string, model?: string) {\n super(message);\n this.name = \"LoraLoadingError\";\n this.lora = lora;\n this.model = model;\n }\n}\n\n/**\n * Error when model is loading and retry limit exceeded.\n *\n * Raised when:\n * - Server returns 503 with MODEL_LOADING code\n * - Retry limit is exceeded\n *\n * This usually means the model is being loaded from disk/HuggingFace\n * and the caller should wait longer.\n */\nexport class ModelLoadingError extends SIEError {\n /** The model that was requested */\n readonly model: string | undefined;\n\n constructor(message: string, model?: string) {\n super(message);\n this.name = \"ModelLoadingError\";\n this.model = model;\n }\n}\n","/**\n * Internal constants for the SIE TypeScript SDK\n */\n\nexport const MSGPACK_CONTENT_TYPE = \"application/msgpack\";\nexport const JSON_CONTENT_TYPE = \"application/json\";\n\nexport const HTTP_ACCEPTED = 202;\nexport const HTTP_CLIENT_ERROR_MIN = 400;\nexport const HTTP_CLIENT_ERROR_MAX = 499;\nexport const HTTP_SERVER_ERROR_MIN = 500;\nexport const HTTP_SERVER_ERROR_MAX = 599;\n\n// Default timeouts and delays\nexport const DEFAULT_TIMEOUT = 30_000; // 30 seconds\nexport const DEFAULT_PROVISION_TIMEOUT = 300_000; // 5 minutes (300s matches Python SDK)\nexport const DEFAULT_RETRY_DELAY = 5_000; // 5 seconds (matches Python SDK)\nexport const DEFAULT_MAX_RETRY_DELAY = 30_000; // 30 seconds\nexport const DEFAULT_LEASE_RENEWAL_INTERVAL = 60_000; // 1 minute\n\n// LoRA loading retry settings\nexport const LORA_LOADING_MAX_RETRIES = 10; // Max retries for LoRA loading\nexport const LORA_LOADING_DEFAULT_DELAY = 1_000; // 1 second default retry delay\nexport const LORA_LOADING_ERROR_CODE = \"LORA_LOADING\"; // Error code from server\n\n// Model loading retry settings\nexport const MODEL_LOADING_MAX_RETRIES = 60; // Max retries (60 * 5s = 5 min)\nexport const MODEL_LOADING_DEFAULT_DELAY = 5_000; // 5 seconds default retry delay\nexport const MODEL_LOADING_ERROR_CODE = \"MODEL_LOADING\"; // Error code from server\n\n// Version negotiation headers\nexport const SDK_VERSION_HEADER = \"X-SIE-SDK-Version\";\nexport const SERVER_VERSION_HEADER = \"X-SIE-Server-Version\";\n","/**\n * MessagePack serialization with msgpack-numpy compatibility.\n *\n * The SIE server uses Python's msgpack-numpy library which serializes numpy arrays\n * using extension type 78 ('N'). This module provides compatible encoding/decoding.\n *\n * Wire format for numpy arrays (extension type 78):\n * - dtype string (e.g., '<f4' for float32, '<i4' for int32) terminated by '|'\n * - shape as comma-separated dimensions terminated by '|'\n * - raw array data in little-endian format\n */\n\nimport { ExtensionCodec, decode, encode } from \"@msgpack/msgpack\";\n\n// msgpack-numpy extension type code (ord('N') = 78)\nconst EXT_TYPE_NUMPY = 78;\n\n/**\n * Parse numpy dtype string to get byte size and TypedArray constructor\n */\nfunction parseDtype(dtype: string): {\n size: number;\n construct: (\n buffer: ArrayBuffer,\n ) => Float32Array | Int32Array | Float64Array | Int16Array | Int8Array | Uint8Array;\n} {\n // Numpy dtypes: '<f4' (float32), '<f8' (float64), '<i4' (int32), '<i2' (int16),\n // '<i1' (int8), '|u1' (uint8), '<f2' (float16)\n // Note: '<' means little-endian, '|' means not applicable (single byte)\n const typeChar = dtype.slice(-2, -1); // 'f', 'i', 'u', etc.\n const sizeChar = dtype.slice(-1); // '4', '8', '2', '1'\n const size = Number.parseInt(sizeChar, 10);\n\n switch (`${typeChar}${size}`) {\n case \"f4\":\n return { size: 4, construct: (buf) => new Float32Array(buf) };\n case \"f8\":\n return { size: 8, construct: (buf) => new Float64Array(buf) };\n case \"f2\":\n // float16 - no native JS type, decode to Float32Array with conversion\n return {\n size: 2,\n construct: (buf) => {\n const float16 = new Uint16Array(buf);\n const float32 = new Float32Array(float16.length);\n for (let i = 0; i < float16.length; i++) {\n float32[i] = float16ToFloat32(float16[i] ?? 0);\n }\n return float32;\n },\n };\n case \"i4\":\n return { size: 4, construct: (buf) => new Int32Array(buf) };\n case \"i2\":\n return { size: 2, construct: (buf) => new Int16Array(buf) };\n case \"i1\":\n return { size: 1, construct: (buf) => new Int8Array(buf) };\n case \"u1\":\n return { size: 1, construct: (buf) => new Uint8Array(buf) };\n default:\n throw new Error(`Unsupported numpy dtype: ${dtype}`);\n }\n}\n\n/**\n * Convert a float16 (IEEE 754 half-precision) value to float32.\n */\nfunction float16ToFloat32(h: number): number {\n const sign = (h >>> 15) & 0x1;\n const exp = (h >>> 10) & 0x1f;\n const frac = h & 0x3ff;\n\n if (exp === 0) {\n if (frac === 0) {\n // Zero\n return sign ? -0 : 0;\n }\n // Subnormal\n const f = frac / 1024;\n return (sign ? -1 : 1) * f * 2 ** -14;\n }\n if (exp === 31) {\n // Infinity or NaN\n return frac === 0 ? (sign ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY) : Number.NaN;\n }\n // Normal\n return (sign ? -1 : 1) * (1 + frac / 1024) * 2 ** (exp - 15);\n}\n\n/**\n * Decode msgpack-numpy extension data to TypedArray\n */\nfunction decodeNumpyArray(\n data: Uint8Array,\n): Float32Array | Int32Array | Float64Array | Int16Array | Int8Array | Uint8Array {\n // Find first '|' separator (between dtype and shape)\n let dtypeEnd = 0;\n while (dtypeEnd < data.length && data[dtypeEnd] !== 0x7c) {\n // '|' = 0x7c\n dtypeEnd++;\n }\n\n const dtypeBytes = data.slice(0, dtypeEnd);\n const dtype = new TextDecoder().decode(dtypeBytes);\n\n // Find second '|' separator (between shape and data)\n let shapeEnd = dtypeEnd + 1;\n while (shapeEnd < data.length && data[shapeEnd] !== 0x7c) {\n shapeEnd++;\n }\n\n const shapeBytes = data.slice(dtypeEnd + 1, shapeEnd);\n const shapeStr = new TextDecoder().decode(shapeBytes);\n const shape = shapeStr.length > 0 ? shapeStr.split(\",\").map((s) => Number.parseInt(s, 10)) : [];\n\n // Remaining bytes are the array data\n const arrayData = data.slice(shapeEnd + 1);\n\n // Parse dtype and create TypedArray\n const { size, construct } = parseDtype(dtype);\n\n // Calculate total elements from shape\n const totalElements =\n shape.length > 0 ? shape.reduce((a, b) => a * b, 1) : arrayData.length / size;\n\n // Ensure proper alignment by copying to a new buffer\n const buffer = new ArrayBuffer(totalElements * size);\n new Uint8Array(buffer).set(arrayData.slice(0, totalElements * size));\n\n return construct(buffer);\n}\n\n/**\n * Encode TypedArray to msgpack-numpy extension format\n */\nfunction encodeNumpyArray(arr: Float32Array | Int32Array): Uint8Array {\n let dtype: string;\n if (arr instanceof Float32Array) {\n dtype = \"<f4\";\n } else if (arr instanceof Int32Array) {\n dtype = \"<i4\";\n } else {\n throw new Error(\"Unsupported TypedArray type\");\n }\n\n // Build wire format: dtype + '|' + shape + '|' + data\n const dtypeBytes = new TextEncoder().encode(dtype);\n const shapeBytes = new TextEncoder().encode(arr.length.toString());\n const separator = new Uint8Array([0x7c]); // '|'\n const dataBytes = new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n\n // Concatenate all parts\n const result = new Uint8Array(dtypeBytes.length + 1 + shapeBytes.length + 1 + dataBytes.length);\n let offset = 0;\n result.set(dtypeBytes, offset);\n offset += dtypeBytes.length;\n result.set(separator, offset);\n offset += 1;\n result.set(shapeBytes, offset);\n offset += shapeBytes.length;\n result.set(separator, offset);\n offset += 1;\n result.set(dataBytes, offset);\n\n return result;\n}\n\n/**\n * Create extension codec compatible with msgpack-numpy\n */\nfunction createExtensionCodec(): ExtensionCodec {\n const codec = new ExtensionCodec();\n\n // Register numpy array decoder (extension type 78)\n codec.register({\n type: EXT_TYPE_NUMPY,\n encode: (value: unknown): Uint8Array | null => {\n if (value instanceof Float32Array || value instanceof Int32Array) {\n return encodeNumpyArray(value);\n }\n return null;\n },\n decode: (\n data: Uint8Array,\n ): Float32Array | Int32Array | Float64Array | Int16Array | Int8Array | Uint8Array => {\n return decodeNumpyArray(data);\n },\n });\n\n return codec;\n}\n\nconst extensionCodec = createExtensionCodec();\n\n/**\n * Pack a message to MessagePack format (msgpack-numpy compatible)\n */\nexport function packMessage(data: unknown): Uint8Array {\n return encode(data, { extensionCodec });\n}\n\n/**\n * Check if an object is a msgpack-numpy array representation\n */\nfunction isNumpyArrayMap(\n obj: unknown,\n): obj is { nd: boolean; type: string; shape: number[]; data: Uint8Array } {\n if (typeof obj !== \"object\" || obj === null) {\n return false;\n }\n const map = obj as Record<string, unknown>;\n return (\n map.nd === true &&\n typeof map.type === \"string\" &&\n Array.isArray(map.shape) &&\n map.data instanceof Uint8Array\n );\n}\n\n/**\n * Convert a msgpack-numpy array map to a typed array or array of typed arrays\n *\n * For 1D arrays: returns a single typed array\n * For 2D arrays: returns an array of typed arrays (one per row)\n */\nfunction convertNumpyArrayMap(map: {\n nd: boolean;\n type: string;\n shape: number[];\n data: Uint8Array;\n}):\n | Float32Array\n | Int32Array\n | Float64Array\n | Int16Array\n | Int8Array\n | Uint8Array\n | Float32Array[]\n | Int32Array[]\n | Int8Array[] {\n const dtype = map.type;\n const arrayData = map.data;\n\n // Parse dtype to determine array type\n const { size, construct } = parseDtype(dtype);\n\n // Handle 2D arrays (e.g., multivector with shape [num_tokens, dim])\n if (map.shape.length === 2 && map.shape[0] !== undefined && map.shape[1] !== undefined) {\n const numRows = map.shape[0];\n const numCols = map.shape[1];\n const result: (\n | Float32Array\n | Int32Array\n | Float64Array\n | Int16Array\n | Int8Array\n | Uint8Array\n )[] = [];\n\n for (let row = 0; row < numRows; row++) {\n const offset = row * numCols * size;\n const buffer = new ArrayBuffer(numCols * size);\n new Uint8Array(buffer).set(arrayData.slice(offset, offset + numCols * size));\n result.push(construct(buffer));\n }\n\n return result as Float32Array[] | Int32Array[] | Int8Array[];\n }\n\n // 1D array (or scalar): return single typed array\n const totalElements =\n map.shape.length > 0 ? map.shape.reduce((a, b) => a * b, 1) : arrayData.length / size;\n\n // Ensure proper alignment by copying to a new buffer\n const buffer = new ArrayBuffer(totalElements * size);\n new Uint8Array(buffer).set(arrayData.slice(0, totalElements * size));\n\n return construct(buffer);\n}\n\n/**\n * Recursively convert msgpack-numpy array representations to typed arrays\n */\nfunction convertNumpyArrays(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n // Check if this is a numpy array map\n if (isNumpyArrayMap(obj)) {\n return convertNumpyArrayMap(obj);\n }\n\n // Recursively process arrays\n if (Array.isArray(obj)) {\n return obj.map((item) => convertNumpyArrays(item));\n }\n\n // Don't process typed arrays - they're already converted\n if (ArrayBuffer.isView(obj)) {\n return obj;\n }\n\n // Recursively process objects\n if (typeof obj === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = convertNumpyArrays(value);\n }\n return result;\n }\n\n return obj;\n}\n\n/**\n * Unpack a MessagePack message (msgpack-numpy compatible)\n *\n * Note: msgpack-numpy uses byte string keys (b'nd', b'type', b'shape', b'data') for numpy\n * array metadata. In JavaScript these become Uint8Array which need to be decoded as text.\n * After decoding, we recursively convert numpy array maps to typed arrays.\n */\nexport function unpackMessage<T = unknown>(data: Uint8Array): T {\n const decoded = decode(data, {\n extensionCodec,\n // Convert byte string keys (Uint8Array) to text strings\n mapKeyConverter: (key: unknown): string | number => {\n if (typeof key === \"string\" || typeof key === \"number\") {\n return key;\n }\n // msgpack-numpy uses byte string keys for numpy array metadata\n if (key instanceof Uint8Array) {\n return new TextDecoder().decode(key);\n }\n // Fallback: Convert arrays/objects to JSON string keys\n return JSON.stringify(key);\n },\n });\n\n // Convert any numpy array maps to typed arrays\n return convertNumpyArrays(decoded) as T;\n}\n","/**\n * Retry logic with exponential backoff and jitter\n */\n\nimport { DEFAULT_MAX_RETRY_DELAY, DEFAULT_RETRY_DELAY } from \"./constants.js\";\n\n/**\n * Compute backoff with decorrelated jitter\n * @param attempt - The current attempt number (0-indexed)\n * @param baseDelay - Base delay in milliseconds\n * @param maxDelay - Maximum delay in milliseconds\n */\nexport function computeBackoffWithJitter(\n attempt: number,\n baseDelay: number = DEFAULT_RETRY_DELAY,\n maxDelay: number = DEFAULT_MAX_RETRY_DELAY,\n): number {\n const exponentialDelay = baseDelay * 2 ** attempt;\n const cappedDelay = Math.min(exponentialDelay, maxDelay);\n // Decorrelated jitter: random value between 0 and cappedDelay\n return Math.random() * cappedDelay;\n}\n\n/**\n * Parse Retry-After header value\n * @param header - The Retry-After header value\n * @returns Delay in milliseconds, or undefined if invalid\n */\nexport function getRetryAfter(header: string | null): number | undefined {\n if (!header) return undefined;\n\n // Try parsing as seconds (integer)\n const seconds = Number.parseInt(header, 10);\n if (!Number.isNaN(seconds) && seconds > 0) {\n return seconds * 1000;\n }\n\n // Try parsing as HTTP-date\n const date = new Date(header);\n if (!Number.isNaN(date.getTime())) {\n const delay = date.getTime() - Date.now();\n return delay > 0 ? delay : undefined;\n }\n\n return undefined;\n}\n","/**\n * Parsing utilities for SIE responses\n */\n\nimport { ProvisioningError, RequestError, ServerError } from \"../errors.js\";\nimport { unpackMessage } from \"../msgpack.js\";\nimport type {\n CapacityInfo,\n Classification,\n DetectedObject,\n EncodeResult,\n Entity,\n ExtractResult,\n Relation,\n ScoreEntry,\n ScoreResult,\n WorkerInfo,\n} from \"../types.js\";\nimport {\n HTTP_ACCEPTED,\n HTTP_CLIENT_ERROR_MAX,\n HTTP_CLIENT_ERROR_MIN,\n HTTP_SERVER_ERROR_MAX,\n HTTP_SERVER_ERROR_MIN,\n MSGPACK_CONTENT_TYPE,\n} from \"./constants.js\";\n\nimport { getRetryAfter as getRetryAfterFromHeader } from \"./retry.js\";\n\n/**\n * Parse GPU parameter from \"pool/gpu\" format\n */\nexport function parseGpuParam(param: string): { pool?: string; gpu: string } {\n const parts = param.split(\"/\");\n if (parts.length === 2 && parts[0] !== undefined && parts[1] !== undefined) {\n return { pool: parts[0], gpu: parts[1] };\n }\n return { gpu: param };\n}\n\n/**\n * Extract Retry-After header value from Response in milliseconds\n */\nexport function getRetryAfter(response: Response): number | undefined {\n const header = response.headers.get(\"Retry-After\");\n return getRetryAfterFromHeader(header);\n}\n\n/**\n * Extract error code from response body (handles both JSON and msgpack)\n */\nexport async function getErrorCode(response: Response): Promise<string | undefined> {\n try {\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n let data: Record<string, unknown>;\n\n if (contentType.includes(MSGPACK_CONTENT_TYPE)) {\n const buffer = await response.arrayBuffer();\n data = unpackMessage<Record<string, unknown>>(new Uint8Array(buffer));\n } else {\n data = (await response.json()) as Record<string, unknown>;\n }\n\n // Check error.code pattern\n if (data.error && typeof data.error === \"object\") {\n const error = data.error as Record<string, unknown>;\n if (typeof error.code === \"string\") {\n return error.code;\n }\n }\n\n // Check detail.code pattern\n if (data.detail && typeof data.detail === \"object\") {\n const detail = data.detail as Record<string, unknown>;\n if (typeof detail.code === \"string\") {\n return detail.code;\n }\n }\n\n // Check top-level code\n if (typeof data.code === \"string\") {\n return data.code;\n }\n } catch {\n // Ignore parsing errors\n }\n return undefined;\n}\n\n/**\n * Handle HTTP error response and throw appropriate error\n */\nexport async function handleError(response: Response, gpu?: string): Promise<never> {\n const { status } = response;\n\n let errorBody: { code?: string; detail?: string } = {};\n try {\n errorBody = (await response.json()) as { code?: string; detail?: string };\n } catch {\n // Ignore JSON parsing errors\n }\n\n const code = errorBody.code ?? \"UNKNOWN\";\n const message = errorBody.detail ?? response.statusText;\n\n if (status === HTTP_ACCEPTED) {\n const retryAfter = response.headers.get(\"Retry-After\");\n throw new ProvisioningError(\n message,\n gpu,\n retryAfter ? Number.parseInt(retryAfter, 10) * 1000 : undefined,\n );\n }\n\n if (status >= HTTP_CLIENT_ERROR_MIN && status <= HTTP_CLIENT_ERROR_MAX) {\n throw new RequestError(message, code, status);\n }\n\n if (status >= HTTP_SERVER_ERROR_MIN && status <= HTTP_SERVER_ERROR_MAX) {\n throw new ServerError(message, code, status);\n }\n\n throw new ServerError(message, code, status);\n}\n\n// Wire format types (what server sends)\n// The server wraps arrays in objects like: {\"dense\": {\"values\": Float32Array}}\ninterface WireDenseResult {\n values: Float32Array;\n}\n\ninterface WireSparseResult {\n indices: Int32Array;\n values: Float32Array;\n}\n\ninterface WireMultivectorResult {\n values: Float32Array[]; // Actually an array of Float32Arrays for each token\n}\n\ninterface WireEncodeResult {\n id?: string;\n dense?: WireDenseResult; // Nested: {\"values\": Float32Array}\n sparse?: WireSparseResult;\n multivector?: WireMultivectorResult; // Nested: {\"values\": Float32Array[]}\n timing?: {\n total_ms?: number;\n queue_ms?: number;\n tokenization_ms?: number;\n inference_ms?: number;\n };\n}\n\ninterface WireScoreEntry {\n item_id: string;\n score: number;\n rank: number;\n}\n\ninterface WireScoreResult {\n model?: string;\n query_id?: string;\n scores: WireScoreEntry[];\n}\n\ninterface WireEntity {\n text: string;\n label: string;\n score: number;\n start?: number;\n end?: number;\n bbox?: number[];\n}\n\ninterface WireRelation {\n head: string;\n tail: string;\n relation: string;\n score: number;\n}\n\ninterface WireClassification {\n label: string;\n score: number;\n}\n\ninterface WireDetectedObject {\n label: string;\n score: number;\n bbox: number[];\n}\n\ninterface WireExtractResult {\n id?: string;\n entities: WireEntity[];\n relations?: WireRelation[];\n classifications?: WireClassification[];\n objects?: WireDetectedObject[];\n}\n\n/**\n * Parse wire format to EncodeResult\n *\n * Wire format from server uses nested objects:\n * - dense: {\"values\": Float32Array}\n * - sparse: {\"indices\": Int32Array, \"values\": Float32Array}\n * - multivector: {\"values\": Float32Array[]}\n */\nexport function parseEncodeResult(data: WireEncodeResult): EncodeResult {\n const result: EncodeResult = {};\n\n if (data.id !== undefined) {\n result.id = data.id;\n }\n\n // Dense is nested: {\"values\": Float32Array}\n if (data.dense) {\n result.dense = data.dense.values;\n }\n\n // Sparse is already flat: {\"indices\": Int32Array, \"values\": Float32Array}\n if (data.sparse) {\n result.sparse = {\n indices: data.sparse.indices,\n values: data.sparse.values,\n };\n }\n\n // Multivector is nested: {\"values\": Float32Array[]}\n if (data.multivector) {\n result.multivector = data.multivector.values;\n }\n\n if (data.timing) {\n result.timing = {\n totalMs: data.timing.total_ms,\n queueMs: data.timing.queue_ms,\n tokenizationMs: data.timing.tokenization_ms,\n inferenceMs: data.timing.inference_ms,\n };\n }\n\n return result;\n}\n\n/**\n * Parse wire format to EncodeResult[]\n *\n * Accepts unknown[] from msgpack deserialization and casts to WireEncodeResult[].\n */\nexport function parseEncodeResults(data: unknown[]): EncodeResult[] {\n return (data as WireEncodeResult[]).map(parseEncodeResult);\n}\n\n/**\n * Parse wire format to ScoreEntry\n */\nfunction parseScoreEntry(data: WireScoreEntry): ScoreEntry {\n return {\n itemId: data.item_id,\n score: data.score,\n rank: data.rank,\n };\n}\n\n/**\n * Parse wire format to ScoreResult\n *\n * Accepts unknown from msgpack deserialization and casts to WireScoreResult.\n */\nexport function parseScoreResult(data: unknown): ScoreResult {\n const wire = data as WireScoreResult;\n return {\n model: wire.model,\n queryId: wire.query_id,\n scores: wire.scores.map(parseScoreEntry),\n };\n}\n\n/**\n * Parse wire format to Entity\n */\nfunction parseEntity(data: WireEntity): Entity {\n return {\n text: data.text,\n label: data.label,\n score: data.score,\n start: data.start,\n end: data.end,\n bbox: data.bbox,\n };\n}\n\n/**\n * Parse wire format to ExtractResult\n */\nexport function parseExtractResult(data: WireExtractResult): ExtractResult {\n return {\n id: data.id,\n entities: data.entities.map(parseEntity),\n relations: (data.relations ?? []).map(\n (r: WireRelation): Relation => ({\n head: r.head,\n tail: r.tail,\n relation: r.relation,\n score: r.score,\n }),\n ),\n classifications: (data.classifications ?? []).map(\n (c: WireClassification): Classification => ({\n label: c.label,\n score: c.score,\n }),\n ),\n objects: (data.objects ?? []).map(\n (o: WireDetectedObject): DetectedObject => ({\n label: o.label,\n score: o.score,\n bbox: o.bbox,\n }),\n ),\n };\n}\n\n/**\n * Parse wire format to ExtractResult[]\n *\n * Accepts unknown[] from msgpack deserialization and casts to WireExtractResult[].\n */\nexport function parseExtractResults(data: unknown[]): ExtractResult[] {\n return (data as WireExtractResult[]).map(parseExtractResult);\n}\n\n// Wire format types for capacity\ninterface WireWorkerInfo {\n url: string;\n gpu: string;\n healthy: boolean;\n queue_depth: number;\n loaded_models: string[];\n}\n\ninterface WireCapacityResponse {\n status: string;\n type?: string;\n cluster?: {\n worker_count?: number;\n gpu_count?: number;\n models_loaded?: number;\n };\n configured_gpu_types?: string[];\n live_gpu_types?: string[];\n workers?: WireWorkerInfo[];\n}\n\n/**\n * Parse wire format to CapacityInfo\n */\nexport function parseCapacityInfo(data: unknown, gpuFilter?: string): CapacityInfo {\n const wire = data as WireCapacityResponse;\n\n // Filter workers by GPU if specified\n let workers = wire.workers ?? [];\n if (gpuFilter) {\n const gpuLower = gpuFilter.toLowerCase();\n workers = workers.filter((w) => w.gpu.toLowerCase() === gpuLower);\n }\n\n const parsedWorkers: WorkerInfo[] = workers.map((w) => ({\n url: w.url,\n gpu: w.gpu,\n healthy: w.healthy,\n queueDepth: w.queue_depth,\n loadedModels: w.loaded_models,\n }));\n\n return {\n status: wire.status,\n workerCount: gpuFilter ? parsedWorkers.length : (wire.cluster?.worker_count ?? 0),\n gpuCount: wire.cluster?.gpu_count ?? 0,\n modelsLoaded: wire.cluster?.models_loaded ?? 0,\n configuredGpuTypes: wire.configured_gpu_types ?? [],\n liveGpuTypes: wire.live_gpu_types ?? [],\n workers: parsedWorkers,\n };\n}\n","export const SDK_VERSION = \"0.3.0\"; // x-release-please-version\n","/**\n * SIE Client implementation\n *\n * @example\n * ```typescript\n * import { SIEClient } from \"@superlinked/sie-sdk\";\n *\n * const client = new SIEClient(\"http://localhost:8080\");\n *\n * // Encode single item\n * const result = await client.encode(\"bge-m3\", { text: \"Hello world\" });\n * console.log(result.dense); // Float32Array\n *\n * // Batch encode\n * const results = await client.encode(\"bge-m3\", [\n * { text: \"First document\" },\n * { text: \"Second document\" },\n * ]);\n *\n * // With GPU routing and auto-retry for capacity\n * const resultWithGpu = await client.encode(\n * \"bge-m3\",\n * { text: \"Hello\" },\n * { gpu: \"l4\", waitForCapacity: true },\n * );\n *\n * await client.close();\n * ```\n */\n\nimport {\n LoraLoadingError,\n ModelLoadingError,\n PoolError,\n ProvisioningError,\n RequestError,\n SIEConnectionError,\n} from \"./errors.js\";\nimport {\n DEFAULT_LEASE_RENEWAL_INTERVAL,\n DEFAULT_PROVISION_TIMEOUT,\n DEFAULT_RETRY_DELAY,\n DEFAULT_TIMEOUT,\n HTTP_ACCEPTED,\n HTTP_CLIENT_ERROR_MIN,\n JSON_CONTENT_TYPE,\n LORA_LOADING_DEFAULT_DELAY,\n LORA_LOADING_ERROR_CODE,\n LORA_LOADING_MAX_RETRIES,\n MODEL_LOADING_DEFAULT_DELAY,\n MODEL_LOADING_ERROR_CODE,\n MSGPACK_CONTENT_TYPE,\n SDK_VERSION_HEADER,\n SERVER_VERSION_HEADER,\n} from \"./internal/constants.js\";\nimport {\n getErrorCode,\n getRetryAfter,\n handleError,\n parseCapacityInfo,\n parseEncodeResults,\n parseExtractResults,\n parseScoreResult,\n} from \"./internal/parsing.js\";\nimport { packMessage, unpackMessage } from \"./msgpack.js\";\nimport type {\n CapacityInfo,\n EncodeOptions,\n EncodeResult,\n ExtractOptions,\n ExtractResult,\n Item,\n ModelInfo,\n PoolInfo,\n SIEClientOptions,\n ScoreOptions,\n ScoreResult,\n StatusMessage,\n} from \"./types.js\";\nimport { SDK_VERSION } from \"./version.js\";\n\n/** Helper to sleep for a given number of milliseconds */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/** Sleep that can be cancelled via AbortSignal. Returns true if aborted. */\nfunction abortableSleep(ms: number, signal: AbortSignal): Promise<boolean> {\n if (signal.aborted) return Promise.resolve(true);\n return new Promise((resolve) => {\n const onAbort = () => {\n clearTimeout(timeoutId);\n resolve(true);\n };\n const timeoutId = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve(false);\n }, ms);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nconst _LEASE_RENEWAL_MAX_RETRIES = 5;\n\n/**\n * SIE Client for embedding, scoring, and extraction.\n *\n * The client is async-only (no synchronous methods) and uses native fetch.\n * It handles msgpack serialization, error parsing, and retry logic.\n *\n * @example Resource pool usage\n * ```typescript\n * const client = new SIEClient(\"http://gateway:8080\");\n *\n * // Create a dedicated pool\n * await client.createPool(\"eval-bench\", { l4: 2 });\n *\n * // Use pool for requests\n * await client.encode(\"bge-m3\", { text: \"Hello\" }, { gpu: \"eval-bench/l4\" });\n *\n * // Check pool status\n * const pool = await client.getPool(\"eval-bench\");\n * console.log(`Pool state: ${pool?.status.state}`);\n *\n * // Clean up\n * await client.deletePool(\"eval-bench\");\n * await client.close();\n * ```\n */\nexport class SIEClient {\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly gpu?: string;\n private readonly apiKey?: string;\n private readonly defaultWaitForCapacity: boolean;\n private readonly provisionTimeout: number;\n\n // Pool state: track created pools and their lease renewal scheduling\n private readonly pools: Map<\n string,\n {\n timeoutId: ReturnType<typeof setTimeout> | null;\n abortController: AbortController;\n isRenewing: boolean;\n }\n > = new Map();\n\n // Version negotiation state\n private versionWarningLogged = false;\n\n // Note: LoRA and model loading retry counters are now local to each method\n // to avoid interference between concurrent requests\n\n /**\n * Create a new SIE client.\n *\n * @param baseUrl - Base URL of the SIE server (e.g., \"http://localhost:8080\")\n * @param options - Client options\n */\n constructor(baseUrl: string, options: SIEClientOptions = {}) {\n // Remove trailing slash\n this.baseUrl = baseUrl.replace(/\\/$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.gpu = options.gpu;\n this.apiKey = options.apiKey;\n this.defaultWaitForCapacity = options.waitForCapacity ?? false;\n this.provisionTimeout = options.provisionTimeout ?? DEFAULT_PROVISION_TIMEOUT;\n }\n\n /**\n * Get the base URL of the SIE server.\n *\n * @returns The normalized base URL (without trailing slash)\n */\n getBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Encode a single item.\n *\n * @param model - Model name (e.g., \"bge-m3\")\n * @param item - Item to encode\n * @param options - Encode options\n * @returns Encode result with embeddings\n */\n async encode(model: string, item: Item, options?: EncodeOptions): Promise<EncodeResult>;\n\n /**\n * Encode multiple items.\n *\n * @param model - Model name (e.g., \"bge-m3\")\n * @param items - Items to encode\n * @param options - Encode options\n * @returns Array of encode results in same order as input\n */\n async encode(model: string, items: Item[], options?: EncodeOptions): Promise<EncodeResult[]>;\n\n /**\n * Encode one or more items.\n */\n async encode(\n model: string,\n items: Item | Item[],\n options: EncodeOptions = {},\n ): Promise<EncodeResult | EncodeResult[]> {\n const isSingleItem = !Array.isArray(items);\n const itemsArray = isSingleItem ? [items] : items;\n\n // Build request body - model is in URL path, not body\n // Wire format uses snake_case\n const body: Record<string, unknown> = {\n items: itemsArray,\n };\n\n // Add params if any are specified\n const params: Record<string, unknown> = {};\n if (options.outputTypes) {\n params.output_types = options.outputTypes;\n }\n if (options.instruction !== undefined) {\n params.instruction = options.instruction;\n }\n if (options.isQuery !== undefined) {\n params.is_query = options.isQuery;\n }\n if (options.outputDtype !== undefined) {\n params.output_dtype = options.outputDtype;\n }\n if (Object.keys(params).length > 0) {\n body.params = params;\n }\n\n const waitForCapacity = options.waitForCapacity ?? this.defaultWaitForCapacity;\n const { pool, gpu } = this.parseGpuParam(options.gpu);\n\n // Model is in URL path: /v1/encode/{model}\n const response = await this.requestWithRetry(\n `/v1/encode/${encodeURIComponent(model)}`,\n body,\n pool,\n gpu,\n waitForCapacity,\n model,\n );\n\n // Wire format response: {\"items\": [...], \"timing\": {...}}\n interface WireResponse {\n items: unknown[];\n timing?: Record<string, unknown>;\n }\n\n const data = unpackMessage<WireResponse>(new Uint8Array(await response.arrayBuffer()));\n\n const results = parseEncodeResults(data.items);\n\n if (isSingleItem) {\n const first = results[0];\n if (!first) {\n throw new Error(\"No results returned from encode\");\n }\n return first;\n }\n return results;\n }\n\n /**\n * List available models.\n *\n * @returns Array of model information\n */\n async listModels(): Promise<ModelInfo[]> {\n const response = await this.requestJson(\"/v1/models\", \"GET\");\n\n // Wire format response: {\"models\": [...]}\n interface WireModelInfo {\n name: string;\n loaded: boolean;\n inputs: string[];\n outputs: string[];\n dims?: { dense?: number; sparse?: number; multivector?: number };\n max_sequence_length?: number;\n }\n\n interface WireModelsResponse {\n models: WireModelInfo[];\n }\n\n const data = (await response.json()) as WireModelsResponse;\n\n return data.models.map((m) => ({\n name: m.name,\n loaded: m.loaded,\n inputs: m.inputs,\n outputs: m.outputs,\n dims: m.dims,\n maxSequenceLength: m.max_sequence_length,\n }));\n }\n\n /**\n * Get details for a specific model.\n *\n * Returns model metadata including dimensions, supported inputs/outputs,\n * loaded status, and max sequence length. This is a lightweight call that\n * reads from model config — it does not load the model or trigger inference.\n *\n * @param name - Model name (e.g., \"BAAI/bge-m3\")\n * @returns Model information\n */\n async getModel(name: string): Promise<ModelInfo> {\n const response = await this.requestJson(`/v1/models/${encodeURIComponent(name)}`, \"GET\");\n\n interface WireModelInfo {\n name: string;\n loaded: boolean;\n inputs: string[];\n outputs: string[];\n dims?: { dense?: number; sparse?: number; multivector?: number };\n max_sequence_length?: number;\n }\n\n const data = (await response.json()) as WireModelInfo;\n\n return {\n name: data.name,\n loaded: data.loaded,\n inputs: data.inputs,\n outputs: data.outputs,\n dims: data.dims,\n maxSequenceLength: data.max_sequence_length,\n };\n }\n\n /**\n * Stream real-time status updates from a worker or gateway.\n *\n * @param mode - \"cluster\" uses gateway /ws/cluster-status, \"worker\" uses /ws/status.\n * \"auto\" detects the endpoint via /health.\n */\n async *watch(mode: \"auto\" | \"cluster\" | \"worker\" = \"auto\"): AsyncGenerator<StatusMessage> {\n const endpoint = mode === \"auto\" ? await this.detectEndpointType() : mode;\n const path = endpoint === \"cluster\" ? \"/ws/cluster-status\" : \"/ws/status\";\n const wsUrl = this.buildWsUrl(path);\n const ws = this.createWebSocket(wsUrl);\n\n const queue: StatusMessage[] = [];\n let resolveNext: (() => void) | null = null;\n let rejectNext: ((error: unknown) => void) | null = null;\n let closed = false;\n\n const notify = () => {\n if (resolveNext) {\n resolveNext();\n resolveNext = null;\n }\n };\n\n const fail = (error: unknown) => {\n if (rejectNext) {\n rejectNext(error);\n rejectNext = null;\n }\n };\n\n const waitForMessage = () =>\n new Promise<void>((resolve, reject) => {\n resolveNext = resolve;\n rejectNext = reject;\n });\n\n const parseMessage = (data: unknown): StatusMessage => {\n if (typeof data === \"string\") {\n return JSON.parse(data) as StatusMessage;\n }\n if (data instanceof ArrayBuffer) {\n return JSON.parse(new TextDecoder().decode(new Uint8Array(data))) as StatusMessage;\n }\n if (data instanceof Uint8Array) {\n return JSON.parse(new TextDecoder().decode(data)) as StatusMessage;\n }\n throw new Error(\"Unsupported WebSocket message type\");\n };\n\n const openPromise = new Promise<void>((resolve, reject) => {\n ws.addEventListener(\"open\", () => resolve());\n ws.addEventListener(\"error\", (event) => reject(event));\n });\n\n ws.addEventListener(\"message\", (event) => {\n try {\n queue.push(parseMessage(event.data));\n notify();\n } catch (error) {\n fail(error);\n }\n });\n\n ws.addEventListener(\"close\", () => {\n closed = true;\n notify();\n });\n\n try {\n await openPromise;\n while (!closed || queue.length > 0) {\n if (queue.length === 0) {\n await waitForMessage();\n continue;\n }\n const next = queue.shift();\n if (next) {\n yield next;\n }\n }\n } finally {\n ws.close();\n }\n }\n\n /**\n * Score items against a query using a reranker model.\n *\n * @param model - Model name (e.g., \"bge-reranker-v2\")\n * @param query - Query item\n * @param items - Items to score against the query\n * @param options - Score options\n * @returns Score result with sorted scores\n *\n * @example\n * ```typescript\n * const result = await client.score(\n * \"bge-reranker-v2\",\n * { text: \"What is machine learning?\" },\n * [\n * { id: \"doc-1\", text: \"Machine learning is...\" },\n * { id: \"doc-2\", text: \"Python is...\" },\n * ],\n * );\n *\n * // Scores are sorted by relevance (descending)\n * console.log(result.scores[0].itemId); // most relevant\n * ```\n */\n async score(\n model: string,\n query: Item,\n items: Item[],\n options: ScoreOptions = {},\n ): Promise<ScoreResult> {\n // Build request body\n const body: Record<string, unknown> = {\n query,\n items,\n };\n\n const waitForCapacity = options.waitForCapacity ?? this.defaultWaitForCapacity;\n const { pool, gpu } = this.parseGpuParam(options.gpu);\n\n const response = await this.requestWithRetry(\n `/v1/score/${encodeURIComponent(model)}`,\n body,\n pool,\n gpu,\n waitForCapacity,\n model,\n );\n\n // Wire format response matches ScoreResult structure\n const data = unpackMessage<unknown>(new Uint8Array(await response.arrayBuffer()));\n\n return parseScoreResult(data);\n }\n\n /**\n * Extract entities from a single item.\n *\n * @param model - Model name (e.g., \"gliner-multi-v2.1\")\n * @param item - Item to extract from\n * @param options - Extract options with labels\n * @returns Extract result with entities\n */\n async extract(model: string, item: Item, options: ExtractOptions): Promise<ExtractResult>;\n\n /**\n * Extract entities from multiple items.\n *\n * @param model - Model name (e.g., \"gliner-multi-v2.1\")\n * @param items - Items to extract from\n * @param options - Extract options with labels\n * @returns Array of extract results in same order as input\n */\n async extract(model: string, items: Item[], options: ExtractOptions): Promise<ExtractResult[]>;\n\n /**\n * Extract entities from one or more items.\n *\n * @example\n * ```typescript\n * const result = await client.extract(\n * \"gliner-multi-v2.1\",\n * { text: \"Apple was founded by Steve Jobs.\" },\n * { labels: [\"person\", \"organization\"] },\n * );\n *\n * for (const entity of result.entities) {\n * console.log(`${entity.text} (${entity.label})`);\n * }\n * // Output:\n * // Apple (organization)\n * // Steve Jobs (person)\n * ```\n */\n async extract(\n model: string,\n items: Item | Item[],\n options: ExtractOptions,\n ): Promise<ExtractResult | ExtractResult[]> {\n const isSingleItem = !Array.isArray(items);\n const itemsArray = isSingleItem ? [items] : items;\n\n // Build request body\n const body: Record<string, unknown> = {\n items: itemsArray,\n };\n\n // Add params\n const params: Record<string, unknown> = {\n labels: options.labels,\n };\n if (options.threshold !== undefined) {\n params.threshold = options.threshold;\n }\n body.params = params;\n\n const waitForCapacity = options.waitForCapacity ?? this.defaultWaitForCapacity;\n const { pool, gpu } = this.parseGpuParam(options.gpu);\n\n const response = await this.requestWithRetry(\n `/v1/extract/${encodeURIComponent(model)}`,\n body,\n pool,\n gpu,\n waitForCapacity,\n model,\n );\n\n // Wire format response: {\"items\": [...]}\n interface WireResponse {\n items: unknown[];\n }\n\n const data = unpackMessage<WireResponse>(new Uint8Array(await response.arrayBuffer()));\n\n const results = parseExtractResults(data.items);\n\n if (isSingleItem) {\n const first = results[0];\n if (!first) {\n throw new Error(\"No results returned from extract\");\n }\n return first;\n }\n return results;\n }\n\n /**\n * Close the client and cleanup resources.\n *\n * Stops pool lease renewal timers. Note that pools are not deleted\n * automatically - they are garbage collected by the gateway after inactivity.\n * This allows pool reuse if the client reconnects.\n */\n async close(): Promise<void> {\n // Stop all pool lease renewal timers and cancel in-flight renewals\n for (const [, poolState] of this.pools) {\n if (poolState.timeoutId !== null) {\n clearTimeout(poolState.timeoutId);\n }\n poolState.abortController.abort();\n }\n this.pools.clear();\n }\n\n /**\n * Create a resource pool for isolated capacity.\n *\n * Pools provide dedicated worker capacity, isolated from other clients.\n * Workers are assigned to pools and only serve requests from that pool.\n *\n * @param name - Pool name (used in GPU param as \"poolName/machineProfile\")\n * @param gpus - Machine profile requirements, e.g., { \"l4\": 2, \"l4-spot\": 1 }\n *\n * @example\n * ```typescript\n * // Create a pool with 2 L4 GPUs\n * await client.createPool(\"eval-bench\", { l4: 2 });\n *\n * // Use the pool for requests\n * await client.encode(\"bge-m3\", { text: \"Hello\" }, { gpu: \"eval-bench/l4\" });\n *\n * // Clean up when done\n * await client.deletePool(\"eval-bench\");\n * ```\n */\n async createPool(name: string, gpus: Record<string, number>): Promise<void> {\n // Check if pool already exists in our tracking\n if (this.pools.has(name)) {\n return; // Pool already created\n }\n\n // Build pool creation request\n const requestBody = { name, gpus };\n\n const url = `${this.baseUrl}/v1/pools`;\n const headers: Record<string, string> = {\n \"Content-Type\": JSON_CONTENT_TYPE,\n Accept: JSON_CONTENT_TYPE,\n [SDK_VERSION_HEADER]: SDK_VERSION,\n };\n\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(requestBody),\n signal: controller.signal,\n });\n\n if (response.status >= HTTP_CLIENT_ERROR_MIN) {\n let errorMsg = response.statusText;\n try {\n const data = (await response.json()) as { detail?: { message?: string } };\n errorMsg = data.detail?.message ?? JSON.stringify(data);\n } catch {\n // Use status text\n }\n throw new PoolError(`Failed to create pool '${name}': ${errorMsg}`, name);\n }\n\n // Start lease renewal loop for this pool (recursive setTimeout\n // prevents overlapping runs unlike setInterval)\n const abortController = new AbortController();\n const poolState = {\n timeoutId: null as ReturnType<typeof setTimeout> | null,\n abortController,\n isRenewing: false,\n };\n\n const renewLoop = async () => {\n if (abortController.signal.aborted) return;\n if (poolState.isRenewing) return;\n poolState.isRenewing = true;\n\n try {\n const renewUrl = `${this.baseUrl}/v1/pools/${encodeURIComponent(name)}/renew`;\n const renewHeaders: Record<string, string> = {\n Accept: JSON_CONTENT_TYPE,\n };\n\n if (this.apiKey) {\n renewHeaders.Authorization = `Bearer ${this.apiKey}`;\n }\n\n for (let attempt = 0; attempt < _LEASE_RENEWAL_MAX_RETRIES; attempt++) {\n if (abortController.signal.aborted) return;\n\n // Per-attempt controller: times out individual fetches and\n // forwards the pool-level abort so close()/deletePool() cancels\n // in-flight requests immediately.\n const perAttempt = new AbortController();\n const onPoolAbort = () => perAttempt.abort();\n abortController.signal.addEventListener(\"abort\", onPoolAbort, { once: true });\n const attemptTimeout = setTimeout(() => perAttempt.abort(), this.timeout);\n\n try {\n const resp = await fetch(renewUrl, {\n method: \"POST\",\n headers: renewHeaders,\n signal: perAttempt.signal,\n });\n if (resp.ok) break;\n } catch (error) {\n // Pool-level abort → stop entirely\n if (abortController.signal.aborted) return;\n // Per-attempt timeout or network error → fall through to retry\n } finally {\n clearTimeout(attemptTimeout);\n abortController.signal.removeEventListener(\"abort\", onPoolAbort);\n }\n if (attempt < _LEASE_RENEWAL_MAX_RETRIES - 1) {\n const aborted = await abortableSleep(\n Math.min(2 ** attempt * 1000, 10000),\n abortController.signal,\n );\n if (aborted) return;\n }\n }\n } finally {\n poolState.isRenewing = false;\n }\n\n // Schedule next renewal only after current run finishes\n if (!abortController.signal.aborted) {\n poolState.timeoutId = setTimeout(renewLoop, DEFAULT_LEASE_RENEWAL_INTERVAL);\n }\n };\n\n poolState.timeoutId = setTimeout(renewLoop, DEFAULT_LEASE_RENEWAL_INTERVAL);\n this.pools.set(name, poolState);\n } catch (error) {\n if (error instanceof PoolError) {\n throw error;\n }\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new PoolError(`Timeout creating pool '${name}'`, name);\n }\n throw new PoolError(\n `Failed to create pool '${name}': ${error instanceof Error ? error.message : \"Unknown error\"}`,\n name,\n );\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Get information about a pool.\n *\n * @param name - Pool name to query\n * @returns PoolInfo if pool exists, null otherwise\n *\n * @example\n * ```typescript\n * await client.createPool(\"eval-bench\", { l4: 2 });\n * const pool = await client.getPool(\"eval-bench\");\n * console.log(`Pool state: ${pool?.status.state}`);\n * console.log(`Workers: ${pool?.status.assignedWorkers.length}`);\n * ```\n */\n async getPool(name: string): Promise<PoolInfo | null> {\n try {\n const response = await this.requestJson(`/v1/pools/${encodeURIComponent(name)}`);\n const data = (await response.json()) as {\n name: string;\n spec: { gpus?: Record<string, number> };\n status: {\n state: string;\n assigned_workers: Array<{ name: string; url: string; gpu: string }>;\n created_at?: number;\n last_renewed?: number;\n };\n };\n\n return {\n name: data.name,\n spec: data.spec,\n status: {\n state: data.status.state,\n assignedWorkers: data.status.assigned_workers,\n createdAt: data.status.created_at,\n lastRenewed: data.status.last_renewed,\n },\n };\n } catch {\n // Pool might not exist\n return null;\n }\n }\n\n /**\n * Delete a pool.\n *\n * @param name - Pool name to delete\n * @returns true if pool was deleted, false if pool didn't exist\n *\n * @example\n * ```typescript\n * // Clean up pool when done\n * const deleted = await client.deletePool(\"eval-bench\");\n * if (deleted) {\n * console.log(\"Pool deleted successfully\");\n * }\n * ```\n */\n async deletePool(name: string): Promise<boolean> {\n // Stop lease renewal first if we're tracking this pool\n const poolState = this.pools.get(name);\n if (poolState) {\n if (poolState.timeoutId !== null) {\n clearTimeout(poolState.timeoutId);\n }\n poolState.abortController.abort();\n this.pools.delete(name);\n }\n\n try {\n const url = `${this.baseUrl}/v1/pools/${encodeURIComponent(name)}`;\n const headers: Record<string, string> = {\n Accept: JSON_CONTENT_TYPE,\n };\n\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: \"DELETE\",\n headers,\n signal: controller.signal,\n });\n\n return response.ok || response.status === 404;\n } finally {\n clearTimeout(timeoutId);\n }\n } catch {\n return false;\n }\n }\n\n private checkServerVersion(response: Response): void {\n if (this.versionWarningLogged) return;\n const serverVersion = response.headers.get(SERVER_VERSION_HEADER);\n if (!serverVersion) return;\n try {\n const sdkParts = SDK_VERSION.split(\".\").map(Number);\n const serverParts = serverVersion.split(\".\").map(Number);\n if (sdkParts.length < 2 || serverParts.length < 2) return;\n const sdkMajor = sdkParts[0];\n const sdkMinor = sdkParts[1];\n const serverMajor = serverParts[0];\n const serverMinor = serverParts[1];\n if (\n sdkMajor === undefined ||\n sdkMinor === undefined ||\n serverMajor === undefined ||\n serverMinor === undefined\n ) {\n return;\n }\n if (sdkMajor !== serverMajor || Math.abs(sdkMinor - serverMinor) > 1) {\n console.warn(\n `[SIE SDK] Version skew detected: SDK ${SDK_VERSION}, server ${serverVersion}. Consider upgrading.`,\n );\n this.versionWarningLogged = true;\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n /**\n * Parse GPU parameter into pool and GPU components.\n *\n * Supports \"pool/gpu\" format for pool routing.\n */\n private parseGpuParam(gpu?: string): { pool?: string; gpu?: string } {\n const effectiveGpu = gpu ?? this.gpu;\n\n if (!effectiveGpu) {\n return {};\n }\n\n // Parse \"pool/gpu\" format\n const parts = effectiveGpu.split(\"/\");\n if (parts.length === 2 && parts[0] && parts[1]) {\n return { pool: parts[0], gpu: parts[1] };\n }\n\n return { gpu: effectiveGpu };\n }\n\n /**\n * Get current cluster capacity information.\n *\n * Queries the gateway's /health endpoint for cluster state. Useful for\n * checking if specific GPU types are available before sending requests.\n *\n * @param gpu - Optional filter to check specific GPU type availability\n * @returns CapacityInfo with worker count, GPU types, and worker details\n *\n * @example\n * ```typescript\n * // Check cluster state\n * const capacity = await client.getCapacity();\n * console.log(`Workers: ${capacity.workerCount}, GPUs: ${capacity.liveGpuTypes}`);\n *\n * // Check if L4 GPUs are available\n * const l4Capacity = await client.getCapacity(\"l4\");\n * if (l4Capacity.workerCount > 0) {\n * console.log(\"L4 workers available\");\n * }\n * ```\n */\n async getCapacity(gpu?: string): Promise<CapacityInfo> {\n const response = await this.requestJson(\"/health\");\n const data = (await response.json()) as { type?: string };\n\n // Check if this is a gateway (has 'type': 'gateway') or worker\n if (data.type !== \"gateway\") {\n throw new RequestError(\n \"getCapacity() requires a gateway endpoint. This appears to be a worker.\",\n \"not_gateway\",\n 400,\n );\n }\n\n return parseCapacityInfo(data, gpu);\n }\n\n /**\n * Wait for GPU capacity to become available.\n *\n * Polls the gateway until workers with the specified GPU type are online.\n * This is useful for pre-warming the cluster before running benchmarks.\n *\n * @param gpu - GPU type to wait for (e.g., \"l4\", \"a100-80gb\")\n * @param options - Wait options\n * @returns CapacityInfo once capacity is available\n *\n * @example\n * ```typescript\n * // Wait for L4 capacity before running benchmarks\n * const capacity = await client.waitForCapacity(\"l4\", { timeout: 300000 });\n * console.log(`Ready with ${capacity.workerCount} L4 workers`);\n *\n * // Wait and pre-load a model\n * const capacityWithModel = await client.waitForCapacity(\"l4\", { model: \"bge-m3\" });\n * ```\n */\n async waitForCapacity(\n gpu: string,\n options: { model?: string; timeout?: number; pollInterval?: number } = {},\n ): Promise<CapacityInfo> {\n const timeout = options.timeout ?? this.provisionTimeout;\n const pollInterval = options.pollInterval ?? 5000;\n const startTime = Date.now();\n\n // If model is specified, use encode with waitForCapacity to trigger\n // both scale-up and model loading\n if (options.model) {\n await this.encode(options.model, { text: \"warmup\" }, { gpu, waitForCapacity: true });\n // After successful encode, get capacity info\n return this.getCapacity(gpu);\n }\n\n // Otherwise, poll capacity until workers are available\n while (true) {\n try {\n const capacity = await this.getCapacity(gpu);\n if (capacity.workerCount > 0) {\n return capacity;\n }\n } catch {\n // Keep trying on errors\n }\n\n const elapsed = Date.now() - startTime;\n if (elapsed >= timeout) {\n throw new ProvisioningError(\n `Timeout after ${elapsed}ms waiting for GPU '${gpu}' capacity`,\n gpu,\n );\n }\n\n // Wait before next poll\n const remaining = timeout - elapsed;\n const delay = Math.min(pollInterval, remaining);\n await sleep(delay);\n }\n }\n\n /**\n * Make a msgpack HTTP request with retry logic.\n *\n * Retried (only when `waitForCapacity: true`, capped by `provisionTimeout`):\n * - 202 Accepted (provisioning)\n * - 503 `MODEL_LOADING` / `LORA_LOADING` / no error code (scale-from-zero)\n * - `SIEConnectionError` with `kind === \"connect\"` (issue #95)\n *\n * `kind === \"timeout\"` is NOT retried — would extend the user-visible\n * timeout from `timeout` to `provisionTimeout`.\n */\n private async requestWithRetry(\n path: string,\n body: unknown,\n pool: string | undefined,\n gpu: string | undefined,\n waitForCapacity: boolean,\n model: string,\n ): Promise<Response> {\n const startTime = Date.now();\n\n // Local retry counter for LoRA loading (uses retry count, not time-based)\n // Model loading uses cumulative time check, not retry counter\n let loraRetries = 0;\n\n while (true) {\n let response: Response;\n try {\n response = await this.request(path, body, pool, gpu);\n } catch (err) {\n // Only retry connect-time failures; see docstring for rationale.\n if (waitForCapacity && err instanceof SIEConnectionError && err.kind === \"connect\") {\n const elapsed = Date.now() - startTime;\n if (elapsed < this.provisionTimeout) {\n const remaining = this.provisionTimeout - elapsed;\n const delay = Math.min(DEFAULT_RETRY_DELAY, remaining);\n await sleep(delay);\n continue;\n }\n }\n throw err;\n }\n\n // Handle 202 (provisioning) - capacity not available\n if (response.status === HTTP_ACCEPTED) {\n const retryAfter = getRetryAfter(response);\n\n if (!waitForCapacity) {\n throw new ProvisioningError(\n `No capacity available for GPU '${gpu}'. Server is provisioning.`,\n gpu,\n retryAfter,\n );\n }\n\n // Check if we've exceeded the timeout\n const elapsed = Date.now() - startTime;\n if (elapsed >= this.provisionTimeout) {\n throw new ProvisioningError(\n `Provisioning timeout after ${elapsed}ms waiting for GPU '${gpu}'`,\n gpu,\n retryAfter,\n );\n }\n\n // Wait and retry\n const delay = retryAfter ?? DEFAULT_RETRY_DELAY;\n const remaining = this.provisionTimeout - elapsed;\n const actualDelay = Math.min(delay, remaining);\n await sleep(actualDelay);\n continue;\n }\n\n // Handle 503 with LORA_LOADING or MODEL_LOADING - auto-retry\n if (response.status === 503) {\n const clonedResponse = response.clone();\n const errorCode = await getErrorCode(clonedResponse);\n\n if (errorCode === LORA_LOADING_ERROR_CODE) {\n loraRetries += 1;\n\n if (loraRetries > LORA_LOADING_MAX_RETRIES) {\n throw new LoraLoadingError(\n `LoRA loading timeout after ${loraRetries} retries`,\n undefined, // We don't have lora name at this level\n model,\n );\n }\n\n // Wait and retry\n const retryAfter = getRetryAfter(response);\n const delay = retryAfter ?? LORA_LOADING_DEFAULT_DELAY;\n await sleep(delay);\n continue;\n }\n\n if (errorCode === MODEL_LOADING_ERROR_CODE) {\n // Check if we've exceeded the provision timeout (cumulative wall-clock time)\n const elapsed = Date.now() - startTime;\n if (elapsed >= this.provisionTimeout) {\n throw new ModelLoadingError(\n `Model loading timeout after ${(elapsed / 1000).toFixed(1)}s for '${model}'`,\n model,\n );\n }\n\n // Wait and retry, respecting remaining time\n const retryAfter = getRetryAfter(response);\n const delay = retryAfter ?? MODEL_LOADING_DEFAULT_DELAY;\n const remaining = this.provisionTimeout - elapsed;\n const actualDelay = Math.min(delay, remaining);\n await sleep(actualDelay);\n continue;\n }\n\n // Generic 503 fall-through (router/gateway scale-from-zero).\n // New code-specific 503 branches MUST go ABOVE this block.\n if (waitForCapacity) {\n const elapsed = Date.now() - startTime;\n if (elapsed < this.provisionTimeout) {\n const retryAfter = getRetryAfter(response);\n const delay = retryAfter ?? DEFAULT_RETRY_DELAY;\n const remaining = this.provisionTimeout - elapsed;\n const actualDelay = Math.min(delay, remaining);\n await sleep(actualDelay);\n continue;\n }\n }\n }\n\n // Handle other errors\n if (!response.ok) {\n await handleError(response, gpu);\n }\n\n // Success\n this.checkServerVersion(response);\n return response;\n }\n }\n\n /**\n * Make a single msgpack HTTP request to the SIE server (no retry logic).\n */\n private async request(\n path: string,\n body?: unknown,\n pool?: string,\n gpu?: string,\n ): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n Accept: MSGPACK_CONTENT_TYPE,\n [SDK_VERSION_HEADER]: SDK_VERSION,\n };\n\n if (body !== undefined) {\n headers[\"Content-Type\"] = MSGPACK_CONTENT_TYPE;\n }\n\n // Pool header takes precedence for routing\n if (pool) {\n headers[\"X-SIE-Pool\"] = pool;\n }\n\n if (gpu) {\n headers[\"X-SIE-MACHINE-PROFILE\"] = gpu;\n }\n\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: body !== undefined ? packMessage(body) : undefined,\n signal: controller.signal,\n });\n\n return response;\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new SIEConnectionError(`Request timeout after ${this.timeout}ms`, \"timeout\");\n }\n if (error instanceof TypeError) {\n throw new SIEConnectionError(`Connection failed: ${error.message}`, \"connect\");\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Make a JSON HTTP request to the SIE server.\n * Used for endpoints that return JSON (e.g., /v1/models, /health).\n */\n private async requestJson(path: string, method: \"GET\" | \"POST\" = \"GET\"): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n [SDK_VERSION_HEADER]: SDK_VERSION,\n };\n\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n await handleError(response);\n }\n\n return response;\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new SIEConnectionError(`Request timeout after ${this.timeout}ms`, \"timeout\");\n }\n if (error instanceof TypeError) {\n throw new SIEConnectionError(`Connection failed: ${error.message}`, \"connect\");\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n private buildWsUrl(path: string): string {\n const url = new URL(this.baseUrl);\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n url.pathname = `${url.pathname.replace(/\\/$/, \"\")}${path}`;\n url.search = \"\";\n return url.toString();\n }\n\n private createWebSocket(url: string): WebSocket {\n const headers: Record<string, string> | undefined = this.apiKey\n ? { Authorization: `Bearer ${this.apiKey}` }\n : undefined;\n\n try {\n if (headers) {\n return new (\n WebSocket as unknown as {\n new (u: string, p?: string[], o?: { headers: Record<string, string> }): WebSocket;\n }\n )(url, [], { headers });\n }\n return new WebSocket(url);\n } catch (error) {\n if (headers) {\n throw new SIEConnectionError(\n \"WebSocket auth headers are not supported in this environment\",\n );\n }\n throw error;\n }\n }\n\n private async detectEndpointType(): Promise<\"cluster\" | \"worker\"> {\n const url = `${this.baseUrl}/health`;\n const headers: Record<string, string> = { Accept: \"application/json\" };\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n return \"worker\";\n }\n\n const data = (await response.json()) as { type?: string };\n return data.type === \"gateway\" ? \"cluster\" : \"worker\";\n } catch {\n return \"worker\";\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n","/**\n * Types for the SIE TypeScript SDK\n *\n * These types mirror the Python SDK (packages/sie_sdk/src/sie_sdk/types.py)\n * for full feature parity.\n */\n\n/**\n * Output dtype options for quantized embeddings.\n * Matches Python DType literal.\n */\nexport type DType = \"float32\" | \"float16\" | \"bfloat16\" | \"int8\" | \"uint8\" | \"binary\" | \"ubinary\";\n\n/**\n * Output type options for encode operation.\n */\nexport type OutputType = \"dense\" | \"sparse\" | \"multivector\";\n\n/**\n * Document input for composite-document extractors (PDF, DOCX, HTML, ...).\n *\n * The wire format is the document bytes plus an optional format hint. The\n * hint is advisory — adapters may sniff the bytes when it is missing or\n * unrecognized.\n */\nexport interface DocumentInput {\n /** Document bytes (raw file content) */\n data: Uint8Array;\n /** Document format hint: \"pdf\", \"docx\", \"html\", etc. */\n format?: string;\n}\n\n/**\n * A single item to encode, score, or extract from.\n *\n * For simple text encoding, just use `{ text: \"your text here\" }`.\n *\n * @example\n * // Simple text\n * { text: \"Hello world\" }\n *\n * // With ID for tracking through results\n * { id: \"doc-1\", text: \"Document text\" }\n *\n * // With images for multimodal models (ColPali, CLIP)\n * { text: \"Description\", images: [imageBytes] }\n *\n * // With a document for composite-document extractors (Docling, ...)\n * { document: { data: pdfBytes, format: \"pdf\" } }\n *\n * // Pre-encoded multivector (for use with maxsim utility)\n * { multivector: [tokenEmbedding1, tokenEmbedding2, ...] }\n */\nexport interface Item {\n /** Optional ID to track this item through results */\n id?: string;\n /** Text content to encode */\n text?: string;\n /** Images as byte arrays (JPEG/PNG) for multimodal models */\n images?: Uint8Array[];\n /** Document for composite-document extractors (PDF, DOCX, HTML, ...) */\n document?: DocumentInput;\n /** Pre-encoded multivector (for use with maxsim utility) */\n multivector?: Float32Array[];\n /** Arbitrary metadata (passed through to results) */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Sparse vector result with non-zero indices and values.\n * Used by SPLADE-type models.\n */\nexport interface SparseResult {\n /** Token indices with non-zero weights */\n indices: Int32Array;\n /** Weight values for each index */\n values: Float32Array;\n}\n\n/**\n * Server-side timing breakdown for a request.\n */\nexport interface TimingInfo {\n totalMs?: number;\n queueMs?: number;\n tokenizationMs?: number;\n inferenceMs?: number;\n}\n\n/**\n * Result of encoding a single item.\n *\n * Contains the item ID (if provided) and one or more output representations\n * depending on what was requested via outputTypes.\n */\nexport interface EncodeResult {\n /** Item ID (echoed from request if provided) */\n id?: string;\n /** Dense embedding vector, shape [dims] */\n dense?: Float32Array;\n /** Sparse embedding with indices and values */\n sparse?: SparseResult;\n /** Multi-vector embedding for late interaction models, shape [numTokens][tokenDims] */\n multivector?: Float32Array[];\n /** Server-side timing breakdown */\n timing?: TimingInfo;\n}\n\n/**\n * Model dimension information.\n */\nexport interface ModelDims {\n dense?: number;\n sparse?: number;\n multivector?: number;\n}\n\n/**\n * Information about a model returned by listModels().\n */\nexport interface ModelInfo {\n /** Model name/identifier */\n name: string;\n /** Whether the model is currently loaded in memory */\n loaded: boolean;\n /** Supported input types: [\"text\"], [\"text\", \"image\"], [\"text\", \"document\"], etc. */\n inputs: string[];\n /** Supported output types: [\"dense\"], [\"dense\", \"sparse\"], etc. */\n outputs: string[];\n /** Embedding dimensions for each output type */\n dims?: ModelDims;\n /** Maximum sequence length the model supports */\n maxSequenceLength?: number;\n}\n\n/**\n * A single score entry from reranking.\n */\nexport interface ScoreEntry {\n /** ID of the item (from request or auto-generated) */\n itemId: string;\n /** Relevance score (higher = more relevant) */\n score: number;\n /** Position in sorted order (0 = most relevant) */\n rank: number;\n}\n\n/**\n * Result of scoring items against a query.\n */\nexport interface ScoreResult {\n /** Model used for scoring */\n model?: string;\n /** Query ID (echoed from request if provided) */\n queryId?: string;\n /** Score entries, sorted by relevance (descending) */\n scores: ScoreEntry[];\n}\n\n/**\n * A single extracted entity (NER span).\n */\nexport interface Entity {\n /** The extracted text span */\n text: string;\n /** Entity type/label (e.g., \"person\", \"organization\") */\n label: string;\n /** Confidence score */\n score: number;\n /** Start character offset in the original text */\n start?: number;\n /** End character offset in the original text */\n end?: number;\n /** Bounding box [x, y, width, height] for image-based extraction */\n bbox?: number[];\n}\n\n/**\n * A relation triple between two entities.\n */\nexport interface Relation {\n /** Head entity text */\n head: string;\n /** Tail entity text */\n tail: string;\n /** Relation type label (e.g., \"works_at\", \"founded_by\") */\n relation: string;\n /** Confidence score */\n score: number;\n}\n\n/**\n * A text classification result.\n */\nexport interface Classification {\n /** Classification label (e.g., \"positive\", \"negative\") */\n label: string;\n /** Confidence score */\n score: number;\n}\n\n/**\n * A detected object with bounding box.\n */\nexport interface DetectedObject {\n /** Object class label (e.g., \"person\", \"car\") */\n label: string;\n /** Confidence score */\n score: number;\n /** Bounding box [x, y, width, height] */\n bbox: number[];\n}\n\n/**\n * Result of extraction for a single item.\n */\nexport interface ExtractResult {\n /** Item ID (echoed from request if provided) */\n id?: string;\n /** List of extracted entities */\n entities: Entity[];\n /** List of extracted relation triples */\n relations: Relation[];\n /** List of classification results */\n classifications: Classification[];\n /** List of detected objects */\n objects: DetectedObject[];\n}\n\n/**\n * Information about a worker in the cluster.\n */\nexport interface WorkerInfo {\n /** Worker base URL */\n url: string;\n /** GPU type (e.g., \"l4\", \"a100-80gb\") */\n gpu: string;\n /** Whether the worker is healthy */\n healthy: boolean;\n /** Number of items in the worker's queue */\n queueDepth: number;\n /** List of model names loaded on this worker */\n loadedModels: string[];\n}\n\n/**\n * Cluster capacity information returned by getCapacity().\n */\nexport interface CapacityInfo {\n /** Overall cluster status: \"healthy\", \"degraded\", \"no_workers\" */\n status: string;\n /** Number of healthy workers */\n workerCount: number;\n /** Number of GPUs available */\n gpuCount: number;\n /** Number of unique models loaded across all workers */\n modelsLoaded: number;\n /** GPU types configured in the cluster */\n configuredGpuTypes: string[];\n /** GPU types currently running */\n liveGpuTypes: string[];\n /** List of worker details */\n workers: WorkerInfo[];\n}\n\n/**\n * Pool specification for creating resource pools.\n */\nexport interface PoolSpec {\n /** Pool name (used in GPU param as \"poolName/gpuType\") */\n name: string;\n /** GPU requirements, e.g., { l4: 2, \"a100-40gb\": 1 } */\n gpus?: Record<string, number>;\n}\n\n/**\n * Pool status information.\n */\nexport interface PoolStatus {\n /** Pool state: \"pending\", \"active\", \"expired\" */\n state: string;\n /** Workers assigned to this pool */\n assignedWorkers: Array<{ name: string; url: string; gpu: string }>;\n /** Unix timestamp when pool was created */\n createdAt?: number;\n /** Unix timestamp of last lease renewal */\n lastRenewed?: number;\n}\n\n/**\n * Full pool information.\n */\nexport interface PoolInfo {\n /** Pool name */\n name: string;\n /** Pool specification */\n spec: { gpus?: Record<string, number> };\n /** Pool status */\n status: PoolStatus;\n}\n\n// ---------------------------------------------------------------------------\n// WebSocket Status Types\n// ---------------------------------------------------------------------------\n\nexport type ModelState = \"available\" | \"loading\" | \"loaded\" | \"unloading\";\n\nexport interface ClusterSummary {\n worker_count: number;\n gpu_count: number;\n models_loaded: number;\n total_qps: number;\n}\n\nexport interface ClusterWorkerInfo {\n url: string;\n gpu: string;\n healthy: boolean;\n queue_depth: number;\n loaded_models: string[];\n}\n\nexport interface ModelSummary {\n name: string;\n state: ModelState;\n worker_count: number;\n gpu_types: string[];\n total_queue_depth: number;\n}\n\nexport interface ServerInfo {\n version: string;\n uptime_seconds: number;\n user: string;\n working_dir: string;\n pid: number;\n}\n\nexport interface GPUMetrics {\n device: string;\n name: string;\n gpu_type: string;\n utilization_pct: number;\n memory_used_bytes: number;\n memory_total_bytes: number;\n memory_threshold_pct?: number;\n}\n\nexport interface ModelConfig {\n hf_id: string;\n adapter: string;\n inputs: string[];\n outputs: string[];\n dims: Record<string, number | null>;\n max_sequence_length?: number;\n pooling?: string | null;\n normalize?: boolean;\n adapter_options_loadtime?: Record<string, unknown> | null;\n adapter_options_runtime?: Record<string, unknown> | null;\n}\n\nexport interface ModelStatus {\n name: string;\n state: ModelState;\n device: string | null;\n memory_bytes: number;\n config: ModelConfig;\n queue_depth: number;\n queue_pending_items: number;\n}\n\nexport interface WorkerStatusMessage {\n timestamp: number;\n name: string;\n gpu: string;\n gpu_count: number;\n bundle: string;\n machine_profile: string;\n loaded_models: string[];\n server: ServerInfo;\n gpus: GPUMetrics[];\n models: ModelStatus[];\n counters: Record<string, Record<string, number>>;\n histograms: Record<string, Record<string, Record<string, unknown>>>;\n}\n\nexport interface ClusterStatusMessage {\n timestamp: number;\n cluster: ClusterSummary;\n workers: ClusterWorkerInfo[];\n models: ModelSummary[];\n}\n\nexport type StatusMessage = WorkerStatusMessage | ClusterStatusMessage;\n\n// ---------------------------------------------------------------------------\n// Client Options\n// ---------------------------------------------------------------------------\n\n/**\n * Options for SIEClient constructor.\n */\nexport interface SIEClientOptions {\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Default GPU type for all requests (e.g., \"l4\", \"a100-80gb\") */\n gpu?: string;\n /** API key for authentication (sent as Bearer token) */\n apiKey?: string;\n /** Whether to auto-retry on 202 (provisioning) responses */\n waitForCapacity?: boolean;\n /** Maximum time to wait for provisioning in milliseconds (default: 300000) */\n provisionTimeout?: number;\n}\n\n/**\n * Options for encode operation.\n */\nexport interface EncodeOptions {\n /** Output types to request: [\"dense\"], [\"sparse\"], [\"dense\", \"sparse\", \"multivector\"] */\n outputTypes?: OutputType[];\n /** Instruction prefix for instruction-tuned models */\n instruction?: string;\n /** Whether this is a query (for asymmetric models) */\n isQuery?: boolean;\n /** Output dtype for quantization */\n outputDtype?: DType;\n /** GPU type for this request (overrides client default) */\n gpu?: string;\n /** Whether to wait for capacity (overrides client default) */\n waitForCapacity?: boolean;\n}\n\n/**\n * Options for score operation.\n */\nexport interface ScoreOptions {\n /** GPU type for this request */\n gpu?: string;\n /** Whether to wait for capacity */\n waitForCapacity?: boolean;\n}\n\n/**\n * Options for extract operation.\n */\nexport interface ExtractOptions {\n /** Entity labels to extract (e.g., [\"person\", \"organization\"]) */\n labels: string[];\n /** Minimum confidence threshold (0-1) */\n threshold?: number;\n /** GPU type for this request */\n gpu?: string;\n /** Whether to wait for capacity */\n waitForCapacity?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Utility Types\n// ---------------------------------------------------------------------------\n\n/**\n * Helper to convert typed arrays to regular number array.\n * Useful for JSON serialization or working with libraries that expect number[].\n */\nexport function toNumberArray(arr: Float32Array | Int32Array): number[] {\n return Array.from(arr);\n}\n\n/**\n * Helper to convert number array to Float32Array.\n */\nexport function toFloat32Array(arr: number[]): Float32Array {\n return new Float32Array(arr);\n}\n","/**\n * Helpers for converting SIE encode results to plain JavaScript types.\n *\n * These functions bridge SDK result types (Float32Array, typed dicts) to the\n * plain `number[]` / object formats that framework integrations and vector\n * databases expect.\n *\n * @example\n * ```typescript\n * import { SIEClient, denseEmbedding, sparseEmbedding } from \"@superlinked/sie-sdk\";\n *\n * const client = new SIEClient(\"http://localhost:8080\");\n * const result = await client.encode(\"BAAI/bge-m3\", { text: \"hello\" });\n * const vec = denseEmbedding(result); // number[]\n * const sp = sparseEmbedding(result); // { indices: number[], values: number[] }\n * ```\n */\n\nimport type { EncodeResult, SparseResult } from \"./types.js\";\nimport { toNumberArray } from \"./types.js\";\n\n/** Sparse vector in `{ indices, values }` format. */\nexport interface SparseVector {\n indices: number[];\n values: number[];\n}\n\n/**\n * Extract the dense embedding from an encode result as `number[]`.\n *\n * @param result - An {@link EncodeResult} from `client.encode()`.\n * @param strict - If `true` (default), throw when dense is missing. If `false`, return `[]`.\n * @returns The dense vector as a plain JavaScript number array.\n */\nexport function denseEmbedding(result: EncodeResult, strict = true): number[] {\n const dense = result.dense;\n if (!dense) {\n if (strict) {\n throw new Error(\"Encode result missing dense embedding\");\n }\n return [];\n }\n return toNumberArray(dense);\n}\n\n/**\n * Extract the sparse embedding from an encode result.\n *\n * @param result - An {@link EncodeResult} from `client.encode()`.\n * @returns Object with `indices: number[]` and `values: number[]`. Empty arrays if sparse is absent.\n */\nexport function sparseEmbedding(result: EncodeResult): SparseVector {\n const sparse = result.sparse;\n if (!sparse) {\n return { indices: [], values: [] };\n }\n return {\n indices: toNumberArray(sparse.indices),\n values: toNumberArray(sparse.values),\n };\n}\n\n/**\n * Extract the sparse embedding as a `Map<number, number>` (token index → weight).\n *\n * Useful for ChromaDB which expects sparse embeddings in this format.\n *\n * @param result - An {@link EncodeResult} from `client.encode()`.\n * @returns Map from integer token indices to float weights. Empty map if sparse is absent.\n */\nexport function sparseEmbeddingMap(result: EncodeResult): Map<number, number> {\n const sparse = result.sparse;\n if (!sparse) {\n return new Map();\n }\n const indices = toNumberArray(sparse.indices);\n const values = toNumberArray(sparse.values);\n const map = new Map<number, number>();\n for (let i = 0; i < indices.length; i++) {\n map.set(indices[i]!, values[i]!);\n }\n return map;\n}\n\n/**\n * Convert a raw sparse sub-object to plain JavaScript arrays.\n *\n * Unlike {@link sparseEmbedding}, this takes the sparse value itself\n * (already extracted from the result) — useful inside named-vector\n * loops where you've already pulled `result.sparse`.\n *\n * @param sparse - A {@link SparseResult} with `indices` and `values` typed arrays.\n * @returns Object with `indices: number[]` and `values: number[]`.\n */\nexport function normalizeSparseVector(sparse: SparseResult): SparseVector {\n return {\n indices: toNumberArray(sparse.indices),\n values: toNumberArray(sparse.values),\n };\n}\n\n/**\n * Convert a multivector (ColBERT) result to `number[][]`.\n *\n * SIE returns multivectors as `Float32Array[]`. Vector databases expect\n * nested plain JavaScript arrays.\n *\n * @param raw - Array of Float32Array token vectors.\n * @returns Nested array of number vectors.\n */\nexport function multivectorEmbedding(raw: Float32Array[]): number[][] {\n return raw.map((v) => toNumberArray(v));\n}\n","/**\n * Client-side scoring functions (MaxSim for ColBERT)\n */\n\n/**\n * Compute MaxSim score between a query and a document (both multivector)\n * MaxSim: for each query token, find max similarity to any document token, then sum\n */\nexport function maxsim(query: Float32Array[], document: Float32Array[]): number {\n if (query.length === 0 || document.length === 0) {\n return 0;\n }\n\n let totalScore = 0;\n\n for (const queryToken of query) {\n let maxSim = Number.NEGATIVE_INFINITY;\n\n for (const docToken of document) {\n // Dot product (assumes vectors are normalized)\n let sim = 0;\n for (let i = 0; i < queryToken.length; i++) {\n sim += (queryToken[i] ?? 0) * (docToken[i] ?? 0);\n }\n if (sim > maxSim) {\n maxSim = sim;\n }\n }\n\n totalScore += maxSim;\n }\n\n return totalScore;\n}\n\n/**\n * Compute MaxSim scores between a query and multiple documents\n */\nexport function maxsimDocuments(query: Float32Array[], documents: Float32Array[][]): number[] {\n return documents.map((doc) => maxsim(query, doc));\n}\n\n/**\n * Compute MaxSim scores for a batch of queries against a batch of documents\n * Returns a flattened array of scores: [q0d0, q0d1, ..., q1d0, q1d1, ...]\n */\nexport function maxsimBatch(queries: Float32Array[][], documents: Float32Array[][]): Float32Array {\n const scores = new Float32Array(queries.length * documents.length);\n let idx = 0;\n\n for (const query of queries) {\n for (const doc of documents) {\n scores[idx++] = maxsim(query, doc);\n }\n }\n\n return scores;\n}\n","/**\n * Image handling utilities for the SIE TypeScript SDK.\n *\n * Per design.md Section 4.3, images are serialized as bytes for transport.\n * This module handles conversion from various input formats to Uint8Array.\n *\n * Supported input formats:\n * - Uint8Array (raw bytes)\n * - ArrayBuffer / Buffer (Node.js)\n * - Blob / File (browser)\n * - string (base64 or data URL)\n *\n * @example\n * ```typescript\n * import { toImageBytes } from \"@superlinked/sie-sdk\";\n *\n * // From file input (browser)\n * const file = document.querySelector('input[type=\"file\"]').files[0];\n * const bytes = await toImageBytes(file);\n *\n * // From base64 string\n * const bytes = await toImageBytes(base64String);\n *\n * // From Uint8Array (passthrough)\n * const bytes = await toImageBytes(existingBytes);\n * ```\n */\n\n/**\n * Type for all supported image input formats.\n */\nexport type ImageInput = Uint8Array | ArrayBuffer | Blob | string;\n\n/**\n * Wire format for images sent to the server.\n * Per design.md Section 4.3.\n */\nexport interface ImageWireFormat {\n data: Uint8Array;\n format: \"jpeg\" | \"png\" | \"webp\";\n}\n\n/**\n * Convert various image input types to Uint8Array.\n *\n * Accepts:\n * - Uint8Array: passed through as-is\n * - ArrayBuffer / Buffer: wrapped in Uint8Array\n * - Blob / File: read as ArrayBuffer then wrapped\n * - string: decoded from base64 or data URL\n *\n * @param input - Image data in any supported format\n * @returns Image bytes as Uint8Array\n *\n * @example\n * ```typescript\n * // From base64 string\n * const bytes = await toImageBytes(base64String);\n *\n * // From file (browser)\n * const bytes = await toImageBytes(file);\n * ```\n */\nexport async function toImageBytes(input: ImageInput): Promise<Uint8Array> {\n // Already Uint8Array\n if (input instanceof Uint8Array) {\n return input;\n }\n\n // ArrayBuffer (or Buffer in Node.js)\n if (input instanceof ArrayBuffer) {\n return new Uint8Array(input);\n }\n\n // Blob or File (browser)\n if (typeof Blob !== \"undefined\" && input instanceof Blob) {\n const buffer = await input.arrayBuffer();\n return new Uint8Array(buffer);\n }\n\n // Base64 string or data URL\n if (typeof input === \"string\") {\n // Check if it's a data URL\n const dataUrlMatch = input.match(/^data:[^;]+;base64,(.+)$/);\n if (dataUrlMatch?.[1]) {\n return base64ToBytes(dataUrlMatch[1]);\n }\n\n // Assume it's raw base64\n return base64ToBytes(input);\n }\n\n throw new Error(`Unsupported image input type: ${typeof input}`);\n}\n\n/**\n * Convert base64 string to Uint8Array.\n */\nfunction base64ToBytes(base64: string): Uint8Array {\n // Use atob in browser, Buffer in Node.js\n if (typeof atob === \"function\") {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n\n // Node.js environment\n return new Uint8Array(Buffer.from(base64, \"base64\"));\n}\n\n/**\n * Convert image bytes to wire format for transport.\n *\n * Per design.md Section 4.3, images are sent as:\n * `{ data: <bytes>, format: \"jpeg\" | \"png\" | \"webp\" }`\n *\n * @param input - Image data in any supported format\n * @param format - Image format (defaults to \"jpeg\")\n * @returns Image in wire format\n */\nexport async function toImageWireFormat(\n input: ImageInput,\n format: \"jpeg\" | \"png\" | \"webp\" = \"jpeg\",\n): Promise<ImageWireFormat> {\n const data = await toImageBytes(input);\n return { data, format };\n}\n\n/**\n * Detect image format from bytes (magic number check).\n *\n * @param bytes - Image bytes\n * @returns Detected format or \"unknown\"\n */\nexport function detectImageFormat(bytes: Uint8Array): \"jpeg\" | \"png\" | \"webp\" | \"unknown\" {\n if (bytes.length < 4) {\n return \"unknown\";\n }\n\n // JPEG: starts with FF D8 FF\n if (bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff) {\n return \"jpeg\";\n }\n\n // PNG: starts with 89 50 4E 47 (0x89 'PNG')\n if (bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4e && bytes[3] === 0x47) {\n return \"png\";\n }\n\n // WebP: starts with RIFF....WEBP\n if (\n bytes[0] === 0x52 &&\n bytes[1] === 0x49 &&\n bytes[2] === 0x46 &&\n bytes[3] === 0x46 &&\n bytes.length >= 12 &&\n bytes[8] === 0x57 &&\n bytes[9] === 0x45 &&\n bytes[10] === 0x42 &&\n bytes[11] === 0x50\n ) {\n return \"webp\";\n }\n\n return \"unknown\";\n}\n"]}
|