@superlinked/sie-sdk 0.4.2 → 0.6.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 +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +35 -2
- package/dist/index.d.ts +35 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/internal/constants.ts","../src/msgpack.ts","../src/internal/retry.ts","../src/internal/parsing.ts","../src/internal/provisioning.ts","../src/sse.ts","../src/version.ts","../src/client.ts","../src/types.ts","../src/encoding.ts","../src/scoring.ts","../src/images.ts"],"names":["buffer","getRetryAfter","sleep"],"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/**\n * Error surfaced mid-stream from `streamChatCompletions` / `streamGenerate`.\n *\n * The SSE wire shape includes optional `error: {message, type, param, code}`\n * (chat) or `error: {code, message}` (SIE-native generate) on the terminal\n * chunk. When the SDK sees such a chunk it does NOT yield the chunk; instead\n * it throws `SIEStreamError`, mirroring the non-streaming `handleError` path\n * so callers can catch the same way they would for HTTP-level failures.\n *\n * Compare with `RequestError` / `ServerError`: those fire before the SSE\n * stream opens (HTTP 4xx / 5xx). `SIEStreamError` fires after at least one\n * byte has gone out — the connection itself was healthy, but the worker /\n * gateway emitted an error envelope partway through generation.\n */\nexport class SIEStreamError extends SIEError {\n /** SIE-native error code (e.g. `context_exceeded`, `cancelled`). */\n readonly code: string | undefined;\n /** OpenAI-style error type (e.g. `context_length_exceeded`, `server_error`). */\n readonly errorType: string | undefined;\n /** Offending field name when known (chat shape only). */\n readonly param: string | null | undefined;\n\n constructor(\n message: string,\n options?: { code?: string; errorType?: string; param?: string | null },\n ) {\n super(message);\n this.name = \"SIEStreamError\";\n this.code = options?.code;\n this.errorType = options?.errorType;\n this.param = options?.param;\n }\n}\n\n/**\n * Error when the server reports a *terminal* model-load failure.\n *\n * Distinct from {@link ModelLoadingError} — this is thrown on the first\n * response (no retry budget consumed) when the server returns HTTP\n * `502 MODEL_LOAD_FAILED`. The server uses this code for permanent-class\n * failures (gated repos, missing dependencies, unrecognised model\n * architectures) where retrying would waste time. See sie-test#85.\n *\n * Permanent failures will not auto-clear; an operator must fix the\n * underlying cause (e.g. set `HF_TOKEN`, accept the model license on\n * HuggingFace, upgrade `transformers`).\n */\nexport class ModelLoadFailedError extends ServerError {\n /** The model that was requested */\n readonly model: string | undefined;\n /**\n * Server-side classification: one of `GATED`, `OOM`, `DEPENDENCY`,\n * `NOT_FOUND`, `NETWORK`, `UNKNOWN`. Use this to route to specific\n * remediation paths (e.g. surface a \"set HF_TOKEN\" hint for `GATED`).\n */\n readonly errorClass: string | undefined;\n /** Whether the failure is non-retryable per server policy. */\n readonly permanent: boolean;\n /** How many load attempts the server has logged. */\n readonly attempts: number;\n\n constructor(\n message: string,\n options?: {\n model?: string;\n errorClass?: string;\n permanent?: boolean;\n attempts?: number;\n },\n ) {\n super(message, \"MODEL_LOAD_FAILED\", 502);\n this.name = \"ModelLoadFailedError\";\n this.model = options?.model;\n this.errorClass = options?.errorClass;\n this.permanent = options?.permanent ?? true;\n this.attempts = options?.attempts ?? 1;\n }\n}\n\n/**\n * Error when the request input exceeds the model's maximum token capacity.\n *\n * Thrown when the server returns HTTP `400 INPUT_TOO_LONG` for an\n * extraction request. Distinct from generic {@link RequestError} so\n * callers can branch on token-budget failures specifically (truncate\n * the input client-side, switch to a longer-context model, or surface\n * a targeted error to the end user) without parsing the error code.\n *\n * Subclass of {@link RequestError} so existing 4xx handlers continue\n * to work; new code can catch {@link InputTooLongError} for tailored\n * handling.\n */\nexport class InputTooLongError extends RequestError {\n /** The model that was requested */\n readonly model: string | undefined;\n\n constructor(message: string, options?: { model?: string }) {\n super(message, \"INPUT_TOO_LONG\", 400);\n this.name = \"InputTooLongError\";\n this.model = options?.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 // Check `obj === null` first: `typeof null` is also `\"object\"` in JS.\n if (obj === null || typeof obj !== \"object\") {\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). `Retry-After: 0` means \"retry\n // immediately\" and must be honored (>= 0), not treated as invalid and\n // replaced by the default delay.\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 {\n InputTooLongError,\n ModelLoadFailedError,\n ProvisioningError,\n RequestError,\n ServerError,\n} from \"../errors.js\";\nimport { unpackMessage } from \"../msgpack.js\";\nimport type {\n CapacityInfo,\n Classification,\n DetectedObject,\n EncodeResult,\n Entity,\n ExtractResult,\n FinishReason,\n GenerateResult,\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 the error-detail object from a response body (JSON or msgpack).\n *\n * Returns the nested `error` / `detail` object so callers can read\n * auxiliary fields like `error_class`, `permanent`, `attempts` without\n * re-parsing. Used by the {@link throwIfModelLoadFailed} short-circuit.\n */\nexport async function getErrorDetail(\n response: Response,\n): Promise<Record<string, unknown> | 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 if (data.error && typeof data.error === \"object\") {\n return data.error as Record<string, unknown>;\n }\n if (data.detail && typeof data.detail === \"object\") {\n return data.detail as Record<string, unknown>;\n }\n if (typeof data.code === \"string\") {\n return data;\n }\n } catch {\n // Ignore parsing errors\n }\n return undefined;\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 const detail = await getErrorDetail(response);\n if (!detail) return undefined;\n const code = detail.code;\n return typeof code === \"string\" ? code : undefined;\n}\n\n/**\n * Throw {@link ModelLoadFailedError} if the response is a 502 carrying\n * the `MODEL_LOAD_FAILED` error code.\n *\n * Used by the retry loop to short-circuit *before* engaging the\n * `MODEL_LOADING` budget. The server emits 502 + this code for\n * permanent-class failures (gated repos, missing dependencies); the SDK\n * must surface the error immediately rather than retrying for the full\n * provision timeout.\n *\n * No-op for any other status / error code.\n */\nexport async function throwIfModelLoadFailed(response: Response, model?: string): Promise<void> {\n if (response.status !== 502) return;\n const detail = await getErrorDetail(response.clone());\n if (!detail) return;\n if (detail.code !== \"MODEL_LOAD_FAILED\") return;\n const errorClass = typeof detail.error_class === \"string\" ? detail.error_class : undefined;\n const permanent = typeof detail.permanent === \"boolean\" ? detail.permanent : true;\n // Defensive: server should always send an int >= 1, but a malformed\n // payload must not crash the retry loop. Use ``Number.isFinite`` so\n // ``NaN`` (from a non-numeric string) and infinities both fall back\n // to 1, and a legitimate 0 (if the server semantics ever change) is\n // preserved instead of being clobbered by ``|| 1``.\n const attemptsRaw = detail.attempts;\n const parsedAttempts =\n typeof attemptsRaw === \"number\"\n ? attemptsRaw\n : typeof attemptsRaw === \"string\"\n ? Number.parseInt(attemptsRaw, 10)\n : Number.NaN;\n const attempts = Number.isFinite(parsedAttempts) ? parsedAttempts : 1;\n const message =\n typeof detail.message === \"string\" ? detail.message : `Model '${model ?? \"?\"}' failed to load`;\n throw new ModelLoadFailedError(message, {\n model,\n errorClass,\n permanent,\n attempts,\n });\n}\n\n/**\n * Throw {@link InputTooLongError} if the response is a 400 carrying the\n * `INPUT_TOO_LONG` error code.\n *\n * Used by the extract path to surface token-budget overruns as a typed\n * exception (so callers can catch {@link InputTooLongError} specifically)\n * instead of relying on a generic {@link RequestError} + string-matching\n * the `code`.\n *\n * No-op for any other status / error code.\n */\nexport async function throwIfInputTooLong(response: Response, model?: string): Promise<void> {\n if (response.status !== 400) return;\n const detail = await getErrorDetail(response.clone());\n if (!detail) return;\n if (detail.code !== \"INPUT_TOO_LONG\") return;\n const message =\n typeof detail.message === \"string\"\n ? detail.message\n : \"Input exceeds the model's maximum token capacity\";\n throw new InputTooLongError(message, { model });\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 // Prefer nested ``error`` / ``detail`` objects (gateway + FastAPI dict detail),\n // same as Python ``handle_error``. Legacy: string ``detail``, or top-level\n // ``message`` (e.g. gateway 202 provisioning body).\n const detail = await getErrorDetail(response.clone());\n\n let code: string | undefined;\n let message: string;\n\n if (detail) {\n const c = detail.code;\n code = typeof c === \"string\" ? c : undefined;\n const m = detail.message;\n message = typeof m === \"string\" ? m : JSON.stringify(detail);\n } else {\n try {\n const data = (await response.json()) as Record<string, unknown>;\n if (typeof data.detail === \"string\") {\n code = typeof data.code === \"string\" ? data.code : undefined;\n message = data.detail;\n } else if (typeof data.message === \"string\") {\n code = typeof data.code === \"string\" ? data.code : undefined;\n message = data.message;\n } else {\n code = typeof data.code === \"string\" ? data.code : undefined;\n message = response.statusText;\n }\n } catch {\n code = undefined;\n message = response.statusText;\n }\n }\n\n if (status === HTTP_ACCEPTED) {\n const retryAfter = getRetryAfter(response);\n throw new ProvisioningError(message, gpu, retryAfter);\n }\n\n if (status >= HTTP_CLIENT_ERROR_MIN && status <= HTTP_CLIENT_ERROR_MAX) {\n if (status === 400 && code === \"INPUT_TOO_LONG\") {\n // Fallback dispatch — ``model`` is only attached by the helper-style\n // short-circuit (``throwIfInputTooLong``) on the extract path.\n throw new InputTooLongError(message);\n }\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\ninterface WireUsageBlock {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n}\n\ninterface WireGenerateResult {\n model?: string;\n text?: string;\n finish_reason?: string;\n usage?: WireUsageBlock;\n attempt_id?: string;\n ttft_ms?: number;\n tpot_ms?: number;\n}\n\n/**\n * Describe an unknown value's runtime type for error messages, mirroring\n * the granularity of Python's ``type(x).__name__`` (``typeof null`` is\n * ``\"object\"`` in JS, so disambiguate ``null`` explicitly).\n */\nfunction describeType(value: unknown): string {\n if (value === null) return \"null\";\n return typeof value;\n}\n\n/**\n * Parse the gateway's streaming generate response envelope into a\n * :class:`GenerateResult`. Tolerant of missing *optional* fields for\n * forward compat with future surface extensions.\n *\n * ``model`` and ``text`` are required strings: a missing or non-string\n * value is surfaced as a {@link RequestError} rather than being silently\n * coerced to an empty string. A truncated / malformed envelope must not\n * look like a legitimate empty completion (silent data loss). This mirrors\n * the Python SDK's ``_parse_generate_result`` contract.\n */\n/**\n * Coerce a wire-format token count into a safe non-negative integer.\n *\n * The wire `usage` envelope is untyped JSON, so a malformed payload can carry\n * a string (`\"5\"`), a float (`3.9`), `null`, or a missing field. The previous\n * `?? 0` only guarded null/undefined, letting strings/floats leak verbatim\n * into the SDK's `number`-typed fields. We mirror the Python SDK's int\n * coercion: keep only finite numbers and truncate toward zero; everything\n * else (string, NaN, Infinity, null) becomes `0`.\n */\nfunction coerceTokenCount(v: unknown): number {\n return typeof v === \"number\" && Number.isFinite(v) ? Math.trunc(v) : 0;\n}\n\nexport function parseGenerateResult(data: Record<string, unknown>): GenerateResult {\n const wire = data as WireGenerateResult;\n if (typeof wire.model !== \"string\") {\n throw new RequestError(\n `Generate response missing string 'model' field: got ${describeType(wire.model)}`,\n );\n }\n if (typeof wire.text !== \"string\") {\n throw new RequestError(\n `Generate response missing string 'text' field: got ${describeType(wire.text)}`,\n );\n }\n const usage = wire.usage ?? {};\n const finish = (wire.finish_reason ?? \"stop\") as FinishReason;\n return {\n model: wire.model,\n text: wire.text,\n finishReason: finish,\n usage: {\n promptTokens: coerceTokenCount(usage.prompt_tokens),\n completionTokens: coerceTokenCount(usage.completion_tokens),\n totalTokens: coerceTokenCount(usage.total_tokens),\n },\n attemptId: wire.attempt_id,\n ttftMs: wire.ttft_ms,\n tpotMs: wire.tpot_ms,\n };\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 * Shared provisioning / retry loop for non-streaming POST endpoints.\n *\n * Both {@link SIEClient.generate} and {@link SIEClient.chatCompletions}\n * receive identical pre-execution capacity signals from the gateway —\n * `202 Accepted` (provisioning) and `503` with a known error code\n * (`MODEL_LOADING`) or a generic 503 (scale-from-zero). They both need\n * to retry those SAFE pre-execution signals while honouring a caller-\n * supplied `waitForCapacity` flag plus a `provisionTimeout` budget.\n *\n * This helper centralises that loop. Callers supply a `performFetch`\n * callback that issues a fresh `fetch` per attempt (the request must be\n * re-buildable, which the JSON chat path satisfies trivially since the\n * body is a plain object). The loop returns the first successful\n * response or throws a typed error.\n *\n * The streaming path keeps its own inline copy because it needs\n * abortable sleeps composed with the caller's `AbortSignal` (see\n * `consumeSseStream` in `client.ts`).\n */\n\nimport { ModelLoadingError, ProvisioningError, RequestError } from \"../errors.js\";\nimport {\n DEFAULT_RETRY_DELAY,\n HTTP_ACCEPTED,\n MODEL_LOADING_DEFAULT_DELAY,\n MODEL_LOADING_ERROR_CODE,\n} from \"./constants.js\";\nimport { getErrorCode, getRetryAfter, handleError, throwIfModelLoadFailed } from \"./parsing.js\";\n\n/** Options controlling the provisioning retry loop. */\nexport interface ProvisioningOptions {\n /** Model name (used to populate `ModelLoadingError.model`). */\n model: string;\n /** GPU label passed through to `ProvisioningError`. May be `undefined`. */\n gpu: string | undefined;\n /**\n * When `true`, the loop retries 202 / `503 MODEL_LOADING` / generic 503\n * until the provision budget is exhausted. When `false`, the first such\n * signal throws (the call-site opted out of waiting).\n */\n waitForCapacity: boolean;\n /**\n * Total cumulative wall-clock budget (ms) for retries. Defaults to\n * `DEFAULT_PROVISION_TIMEOUT` if omitted.\n */\n provisionTimeoutMs: number;\n}\n\n/** Sleep for `ms` milliseconds. Non-abortable; the non-streaming surface\n * does not expose an AbortSignal to the caller. */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Wrap a non-streaming POST attempt in the shared provisioning retry loop.\n *\n * The `performFetch` callback MUST re-issue the request from scratch on\n * each invocation — never reuse a consumed `Response`. It is responsible\n * for its own per-attempt timeout and for translating low-level\n * `TypeError` / `AbortError` into `SIEConnectionError`.\n *\n * The loop returns the first non-retryable success (`status === 200`).\n * Any other terminal status is handed to {@link handleError}, which\n * always throws.\n *\n * @internal\n */\nexport async function withProvisioningRetry(\n performFetch: () => Promise<Response>,\n opts: ProvisioningOptions,\n): Promise<Response> {\n const startTime = Date.now();\n\n while (true) {\n const response = await performFetch();\n\n if (response.status === HTTP_ACCEPTED) {\n if (!opts.waitForCapacity) {\n throw new ProvisioningError(\n \"No capacity available. Server is provisioning.\",\n opts.gpu,\n getRetryAfter(response),\n );\n }\n const elapsed = Date.now() - startTime;\n if (elapsed >= opts.provisionTimeoutMs) {\n throw new ProvisioningError(\n `Provisioning timeout after ${elapsed}ms`,\n opts.gpu,\n getRetryAfter(response),\n );\n }\n const delay = getRetryAfter(response) ?? DEFAULT_RETRY_DELAY;\n await sleep(Math.min(delay, opts.provisionTimeoutMs - elapsed));\n continue;\n }\n\n // 502 MODEL_LOAD_FAILED is terminal — surface immediately.\n await throwIfModelLoadFailed(response, opts.model);\n\n if (response.status === 503) {\n const errorCode = await getErrorCode(response.clone());\n if (errorCode === MODEL_LOADING_ERROR_CODE) {\n const elapsed = Date.now() - startTime;\n if (elapsed >= opts.provisionTimeoutMs) {\n throw new ModelLoadingError(`Model loading timeout for '${opts.model}'`, opts.model);\n }\n const delay = getRetryAfter(response) ?? MODEL_LOADING_DEFAULT_DELAY;\n await sleep(Math.min(delay, opts.provisionTimeoutMs - elapsed));\n continue;\n }\n if (opts.waitForCapacity) {\n const elapsed = Date.now() - startTime;\n if (elapsed < opts.provisionTimeoutMs) {\n const delay = getRetryAfter(response) ?? DEFAULT_RETRY_DELAY;\n await sleep(Math.min(delay, opts.provisionTimeoutMs - elapsed));\n continue;\n }\n }\n }\n\n if (!response.ok) {\n await handleError(response);\n }\n\n // Defensive: handleError always throws on !ok, but if a future caller\n // adds a non-200 success status we still want to surface it cleanly.\n if (response.status !== 200) {\n throw new RequestError(`Unexpected response status ${response.status}`);\n }\n return response;\n }\n}\n","/**\n * Minimal SSE (Server-Sent Events) parser for the SIE TS SDK.\n *\n * Reads from a `ReadableStreamDefaultReader<Uint8Array>` (a `fetch` response\n * body), decodes the UTF-8 byte stream, and yields each event's `data:`\n * payload as a string. Sentinel `data: [DONE]` payloads close the generator\n * without yielding. The `signal` parameter cancels the read cooperatively\n * and propagates as a `SIEConnectionError`.\n *\n * Scope: this parser supports only the subset of the SSE spec the SIE\n * gateway emits today —\n *\n * - `data: <single-line>\\n\\n`\n * - the literal `data: [DONE]\\n\\n` terminator\n * - keep-alive comment lines (`: <text>\\n`), which are skipped\n *\n * Other SSE features (`event:`, `id:`, `retry:`, multi-line `data:`\n * continuations) are not produced by `sse.rs` and are not handled here.\n * If the gateway grows new event shapes, extend this parser deliberately\n * rather than adding a generic SSE dependency.\n */\n\nimport { SIEConnectionError, SIEStreamError } from \"./errors.js\";\n\nconst SSE_DONE = \"[DONE]\";\n\n/**\n * Hard cap on the in-progress event buffer.\n *\n * The buffer holds bytes received but not yet terminated by an event\n * separator (`\\n\\n` / `\\r\\n\\r\\n`). A well-behaved gateway flushes complete\n * events promptly, so this only grows unbounded if a peer (or a broken\n * intermediary) sends a frame that never terminates. Without a cap that\n * OOMs the client; we instead surface a `SIEStreamError` once the buffer\n * exceeds this size.\n *\n * The bound is measured in UTF-16 code units (the units of\n * `String.prototype.length`), NOT bytes, because the cap is compared\n * against the decoded `buffer.length` below. 8 Mi chars is far above any\n * legitimate single SSE event the SIE gateway emits (chunks are\n * token-sized) while still bounding memory.\n */\nconst MAX_SSE_BUFFER_CHARS = 8 * 1024 * 1024;\n\n/**\n * Async-iterate over the `data:` payloads of an SSE response body.\n *\n * @param reader The locked reader returned by `response.body.getReader()`.\n * @param signal Optional `AbortSignal`; when fired, the generator throws\n * `SIEConnectionError` (kind `\"other\"`) and releases the\n * reader so the upstream fetch is cancelled.\n * @returns A generator of `data:` payload strings. The generator\n * completes (without throwing) when the server emits\n * `[DONE]` or the underlying stream is closed cleanly.\n */\nexport async function* parseSseStream(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<string, void, undefined> {\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n\n // Tracks whether the loop reached a *clean* terminus — either the\n // `[DONE]` sentinel or a graceful EOF (`result.done`). Any other exit\n // (a caller `break`/early `return` out of the consuming `for await`, a\n // thrown `SIEStreamError`, or a JSON parse `RequestError` raised by the\n // consumer) leaves this `false`, and the `finally` then `cancel()`s the\n // reader so the underlying HTTP body/socket closes promptly. Without\n // that, the gateway never sees the client disconnect and the worker\n // keeps generating to full `max_new_tokens` (wasted / billable tokens).\n let completedCleanly = false;\n\n // Bridge the AbortSignal onto the reader: cancelling the reader\n // tears down the fetch body promptly. We register the listener\n // once and clean it up in `finally`.\n const onAbort = () => {\n // `cancel()` returns a promise; we don't await it here — the\n // top-level loop sees `signal.aborted` and throws.\n reader.cancel().catch(() => {\n // Cancelling an already-released reader throws; ignore.\n });\n };\n if (signal) {\n if (signal.aborted) {\n throw new SIEConnectionError(\"Stream aborted before first read\", \"other\");\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n try {\n while (true) {\n if (signal?.aborted) {\n throw new SIEConnectionError(\"Stream aborted by caller\", \"other\");\n }\n\n // Race `read()` against the abort signal. We can't rely on\n // `reader.cancel()` to settle the pending read promptly across\n // every WHATWG-streams implementation (Node 22's lets an\n // in-flight source `pull()` run to completion), so we drop our\n // own claim on the read result if the caller aborts and surface\n // `SIEConnectionError` immediately. The `reader.cancel()` call\n // in `onAbort` still fires to tear down the upstream fetch.\n let result: Awaited<ReturnType<typeof reader.read>>;\n try {\n if (signal) {\n if (signal.aborted) {\n throw new SIEConnectionError(\"Stream aborted by caller\", \"other\");\n }\n result = await new Promise<Awaited<ReturnType<typeof reader.read>>>((resolve, reject) => {\n let settled = false;\n const onAbortRace = () => {\n if (settled) return;\n settled = true;\n signal.removeEventListener(\"abort\", onAbortRace);\n reject(new SIEConnectionError(\"Stream aborted by caller\", \"other\"));\n };\n signal.addEventListener(\"abort\", onAbortRace, { once: true });\n reader.read().then(\n (r) => {\n if (settled) return;\n settled = true;\n signal.removeEventListener(\"abort\", onAbortRace);\n resolve(r);\n },\n (err) => {\n if (settled) return;\n settled = true;\n signal.removeEventListener(\"abort\", onAbortRace);\n reject(err);\n },\n );\n });\n } else {\n result = await reader.read();\n }\n } catch (err) {\n if (err instanceof SIEConnectionError) throw err;\n if (signal?.aborted) {\n throw new SIEConnectionError(\"Stream aborted by caller\", \"other\");\n }\n throw err;\n }\n\n if (result.done) {\n // Flush any trailing decoder state, then break out so the\n // post-loop tail handler can process a final event block that\n // arrived without a trailing blank line. The gateway normally\n // emits a `[DONE]` terminator, but a stream that ends with a\n // last `data:` line and no trailing `\\n\\n` would otherwise drop\n // that event (which can carry `finish_reason` / `usage`).\n buffer += decoder.decode();\n break;\n }\n\n buffer += decoder.decode(result.value, { stream: true });\n\n // Guard against an event frame that never terminates. The buffer only\n // retains bytes for an event we have not yet been able to split off;\n // if it grows past the cap, the peer is sending an unbounded frame and\n // we must fail rather than OOM the client.\n if (buffer.length > MAX_SSE_BUFFER_CHARS) {\n throw new SIEStreamError(\n `SSE event buffer exceeded ${MAX_SSE_BUFFER_CHARS} chars without an event terminator`,\n );\n }\n\n // Events are separated by a blank line (`\\n\\n`). We also accept\n // `\\r\\n\\r\\n` for compat with intermediaries that rewrite line\n // endings.\n let sepIdx: number;\n while (true) {\n const lfIdx = buffer.indexOf(\"\\n\\n\");\n const crlfIdx = buffer.indexOf(\"\\r\\n\\r\\n\");\n if (lfIdx === -1 && crlfIdx === -1) break;\n let sepLen = 2;\n if (lfIdx === -1) {\n sepIdx = crlfIdx;\n sepLen = 4;\n } else if (crlfIdx === -1) {\n sepIdx = lfIdx;\n } else {\n if (lfIdx < crlfIdx) {\n sepIdx = lfIdx;\n } else {\n sepIdx = crlfIdx;\n sepLen = 4;\n }\n }\n const eventBlock = buffer.slice(0, sepIdx);\n buffer = buffer.slice(sepIdx + sepLen);\n\n const payload = extractDataPayload(eventBlock);\n if (payload === null) continue;\n if (payload === SSE_DONE) {\n // Clean terminus: server signalled end-of-stream. No need to\n // cancel the body — it has already drained the relevant work.\n completedCleanly = true;\n return;\n }\n yield payload;\n }\n }\n\n // Stream ended (clean close). Flush a trailing event block that lacks\n // a terminating blank line — it goes through the same `extractDataPayload`\n // path and honours the `[DONE]` sentinel, so a final un-terminated\n // `data:` line (potentially carrying `finish_reason` / `usage`) is not\n // silently dropped. We strip a lone trailing newline first so a plain\n // `data: ...\\n` tail (one newline, no blank line) is treated as a\n // complete single-line event.\n const tail = buffer.replace(/\\r?\\n$/, \"\");\n if (tail !== \"\") {\n const payload = extractDataPayload(tail);\n if (payload !== null && payload !== SSE_DONE) {\n yield payload;\n }\n }\n\n // Reaching here means we drained the stream to a graceful EOF (the\n // `result.done` break above flowed through the tail flush without a\n // `[DONE]`). That is a clean terminus.\n completedCleanly = true;\n } finally {\n if (signal) signal.removeEventListener(\"abort\", onAbort);\n if (completedCleanly) {\n // Clean terminus — just drop our claim on the reader.\n try {\n reader.releaseLock();\n } catch {\n // Reader already released or cancelled.\n }\n } else {\n // Early / error teardown (caller break or early return, thrown\n // SIEStreamError, JSON parse RequestError, buffer-cap overflow, or an\n // abort). Cancel the reader so the underlying HTTP body/socket closes\n // and the worker stops generating. `cancel()` also releases the lock,\n // so we do not call `releaseLock()` afterwards. Swallow any rejection\n // (e.g. an already-released/cancelled reader) so we never surface an\n // unhandled rejection from the teardown path.\n await reader.cancel().catch(() => {\n // Reader already released or cancelled, or the source's cancel\n // algorithm threw — nothing we can do at teardown.\n });\n }\n }\n}\n\n/**\n * Pull the `data:` payload out of a single SSE event block.\n *\n * Returns `null` for events with no `data:` line (keep-alive comments,\n * `event:`-only frames). When multiple `data:` lines are present they\n * are joined with `\\n` per the SSE spec, though the SIE gateway never\n * emits multi-line payloads today.\n */\nfunction extractDataPayload(block: string): string | null {\n const lines = block.split(/\\r?\\n/);\n const parts: string[] = [];\n for (const line of lines) {\n if (line === \"\" || line.startsWith(\":\")) continue;\n if (line.startsWith(\"data:\")) {\n // Per spec, a single leading space after the colon is stripped.\n let value = line.slice(5);\n if (value.startsWith(\" \")) value = value.slice(1);\n parts.push(value);\n }\n // Other field names (`event:`, `id:`, `retry:`) are ignored — the\n // SIE gateway does not emit them.\n }\n if (parts.length === 0) return null;\n return parts.join(\"\\n\");\n}\n","export const SDK_VERSION = \"0.4.2\"; // 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 SIEStreamError,\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 parseGenerateResult,\n parseScoreResult,\n throwIfInputTooLong,\n throwIfModelLoadFailed,\n} from \"./internal/parsing.js\";\nimport { withProvisioningRetry } from \"./internal/provisioning.js\";\nimport { packMessage, unpackMessage } from \"./msgpack.js\";\nimport { parseSseStream } from \"./sse.js\";\nimport type {\n CapacityInfo,\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionOptions,\n ChatCompletionRequest,\n EncodeOptions,\n EncodeResult,\n ExtractOptions,\n ExtractResult,\n GenerateChunk,\n GenerateOptions,\n GenerateResult,\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 * Pluck a mid-stream `error` block out of a `ChatCompletionChunk` and\n * convert it to `SIEStreamError`, mirroring the shape `sse.rs` emits:\n * `{ message, type, param, code }`. Returns `null` when the chunk is a\n * normal delta. Defined at module scope so it has zero coupling to\n * `SIEClient` state.\n */\nfunction extractChatChunkError(chunk: ChatCompletionChunk): SIEStreamError | null {\n const err = (\n chunk as ChatCompletionChunk & {\n error?: { message?: string; type?: string; param?: string | null; code?: string };\n }\n ).error;\n if (!err) return null;\n return new SIEStreamError(err.message ?? \"stream error\", {\n code: err.code,\n errorType: err.type,\n param: err.param,\n });\n}\n\n/** SIE-native chunk variant — see `sse.rs::build_generate_chunk_event`. */\nfunction extractGenerateChunkError(chunk: GenerateChunk): SIEStreamError | null {\n if (!chunk.error) return null;\n return new SIEStreamError(chunk.error.message, { code: chunk.error.code });\n}\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 /**\n * Generate text from a prompt (walking-skeleton SDK surface).\n *\n * The SDK does not currently expose streaming chunks. The worker streams\n * to the gateway, the gateway aggregates, and the SDK returns the\n * assembled result plus SIE-native timing metadata (TTFT, TPOT,\n * attempt id).\n *\n * @example\n * ```typescript\n * const result = await client.generate(\n * \"Qwen__Qwen3-4B-Instruct-2507\",\n * \"Write a haiku about the sea.\",\n * { maxNewTokens: 64, temperature: 0.7 },\n * );\n * console.log(result.text);\n * console.log(`TTFT: ${result.ttftMs}ms`);\n * ```\n */\n async generate(model: string, prompt: string, options: GenerateOptions): Promise<GenerateResult> {\n const body: Record<string, unknown> = {\n prompt,\n max_new_tokens: options.maxNewTokens,\n temperature: options.temperature ?? 1.0,\n top_p: options.topP ?? 1.0,\n };\n if (options.stop !== undefined) {\n body.stop = options.stop;\n }\n\n const { pool, gpu } = this.parseGpuParam(options.gpu);\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"Content-Type\": JSON_CONTENT_TYPE,\n [SDK_VERSION_HEADER]: SDK_VERSION,\n };\n if (pool) headers[\"X-SIE-Pool\"] = pool;\n if (gpu) headers[\"X-SIE-MACHINE-PROFILE\"] = gpu;\n if (this.apiKey) headers.Authorization = `Bearer ${this.apiKey}`;\n\n const safeModel = model.replaceAll(\"/\", \"__\");\n const url = `${this.baseUrl}/v1/generate/${encodeURIComponent(safeModel)}`;\n const waitForCapacity = options.waitForCapacity ?? this.defaultWaitForCapacity;\n\n const response = await withProvisioningRetry(() => this.performJsonPost(url, body, headers), {\n model,\n gpu,\n waitForCapacity,\n provisionTimeoutMs: this.provisionTimeout,\n });\n\n const data = (await response.json()) as Record<string, unknown>;\n if (data === null || typeof data !== \"object\") {\n throw new RequestError(\"Unexpected generate response shape\");\n }\n return parseGenerateResult(data);\n }\n\n /**\n * Per-attempt JSON POST used by the non-streaming surfaces\n * ({@link generate}, {@link chatCompletions}) inside the\n * {@link withProvisioningRetry} loop.\n *\n * Translates low-level transport failures into typed errors that the\n * retry loop will surface verbatim:\n * - `AbortError` → `SIEConnectionError` (per-attempt timeout)\n * - `TypeError` → `SIEConnectionError` (NOT retried — generation is\n * non-idempotent, so a mid-flight drop must surface instead of\n * silently re-issuing a billable generation)\n *\n * Each call uses a fresh `AbortController` so concurrent retries don't\n * share state, and the per-attempt timeout is bounded by `this.timeout`\n * (NOT the cumulative provisioning budget).\n */\n private async performJsonPost(\n url: string,\n body: unknown,\n headers: Record<string, string>,\n ): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n try {\n return await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new SIEConnectionError(`Request timeout after ${this.timeout}ms`, \"timeout\");\n }\n if (err instanceof TypeError) {\n // `generate()` / `chatCompletions()` are non-idempotent and carry\n // no dedup key, so a SECOND attempt issues a SECOND billable\n // generation. `fetch` throws `TypeError` for ANY network failure,\n // including a connection dropped AFTER the request body was sent\n // (mid-flight) — and it cannot reliably distinguish that from a\n // connect-time refusal. Retrying a mid-flight drop would\n // double-bill, so surface as `SIEConnectionError` and let the\n // retry loop propagate it. The SAFE pre-execution capacity\n // signals (202 / 503 MODEL_LOADING) are HTTP statuses, not\n // exceptions, so the retry loop still handles them.\n throw new SIEConnectionError(`Connection failed: ${err.message}`, \"connect\");\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Non-streaming chat-completion call against `/v1/chat/completions`.\n *\n * This is the OpenAI-compatible surface. The request body is forwarded\n * verbatim as JSON, so any field documented at\n * <https://platform.openai.com/docs/api-reference/chat/create> can be set;\n * the gateway will reject fields it does not yet support with\n * `400 unsupported_field`. SIE-native routing hints (`routing_key`,\n * `prompt_cache_key`) are part of the same request shape.\n *\n * Error semantics mirror `generate()`: 4xx → `RequestError`, 5xx →\n * `ServerError` (or the more specific `ModelLoadFailedError` for 502\n * `MODEL_LOAD_FAILED`), connection / timeout failures →\n * `SIEConnectionError`.\n *\n * If `req.stream === true`, this method throws `RequestError` immediately —\n * use {@link streamChatCompletions} instead. We do not auto-route because\n * the return type is fundamentally different (`Promise` vs\n * `AsyncGenerator`) and silently flipping would mis-type the call site.\n *\n * @example\n * ```typescript\n * const reply = await client.chatCompletions({\n * model: \"Qwen/Qwen3-4B-Instruct-2507\",\n * messages: [{ role: \"user\", content: \"Write a haiku about the sea.\" }],\n * max_completion_tokens: 64,\n * });\n * console.log(reply.choices[0]?.message.content);\n * ```\n */\n async chatCompletions(\n req: ChatCompletionRequest,\n options: ChatCompletionOptions = {},\n ): Promise<ChatCompletion> {\n if (req.stream === true) {\n throw new RequestError(\n \"chatCompletions() cannot be used with stream:true — use streamChatCompletions() instead.\",\n \"invalid_request\",\n 400,\n );\n }\n\n const body = { ...req, stream: false };\n const url = `${this.baseUrl}/v1/chat/completions`;\n const headers = this.buildChatHeaders(\"application/json\");\n const waitForCapacity = options.waitForCapacity ?? this.defaultWaitForCapacity;\n const provisionTimeoutMs = options.provisionTimeoutMs ?? this.provisionTimeout;\n\n // H1: pre-execution capacity signals (202 / 503 MODEL_LOADING /\n // generic 503) MUST be handled by the shared provisioning loop —\n // otherwise a 202 slipped through as `response.ok === true` and the\n // SDK returned the provisioning envelope cast as `ChatCompletion`\n // (no `choices`, no `id`). The loop also surfaces `ProvisioningError`\n // when the caller opted out (`waitForCapacity: false`) or the\n // provision budget is exhausted, matching `generate()`.\n const response = await withProvisioningRetry(() => this.performJsonPost(url, body, headers), {\n model: req.model,\n gpu: undefined,\n waitForCapacity,\n provisionTimeoutMs,\n });\n\n this.checkServerVersion(response);\n\n const data = (await response.json()) as ChatCompletion;\n if (data === null || typeof data !== \"object\") {\n throw new RequestError(\"Unexpected chat.completion response shape\");\n }\n return data;\n }\n\n /**\n * Streaming chat-completion call against `/v1/chat/completions` with\n * `Accept: text/event-stream`.\n *\n * Yields `ChatCompletionChunk` events in the order the gateway emits them.\n * The terminal chunk carries `finish_reason`; if\n * `req.stream_options.include_usage === true`, a final usage-only chunk\n * (`choices: []`, populated `usage`) follows it. The generator completes\n * cleanly on the `data: [DONE]` sentinel.\n *\n * Error semantics:\n *\n * - HTTP 4xx / 5xx **before** the stream opens → throws `RequestError` /\n * `ServerError` (same as {@link chatCompletions}).\n * - A chunk containing `error: { ... }` mid-stream → throws\n * {@link SIEStreamError}. The error chunk is consumed, never yielded.\n * - `signal.abort()` mid-stream → the generator throws\n * `SIEConnectionError` and releases the underlying reader, which\n * fires `StreamCancelGuard` on the gateway side.\n *\n * `req.stream` is set to `true` automatically; any existing value is\n * overwritten. We do not validate `req.stream === false` because the\n * call-site intent is unambiguous.\n *\n * @param req The chat-completion request. See {@link ChatCompletionRequest}.\n * @param signal Optional `AbortSignal` for cooperative cancellation.\n *\n * @example\n * ```typescript\n * const controller = new AbortController();\n * try {\n * for await (const chunk of client.streamChatCompletions(\n * {\n * model: \"Qwen/Qwen3-4B-Instruct-2507\",\n * messages: [{ role: \"user\", content: \"Count to ten.\" }],\n * stream_options: { include_usage: true },\n * },\n * controller.signal,\n * )) {\n * process.stdout.write(chunk.choices[0]?.delta.content ?? \"\");\n * }\n * } catch (err) {\n * if (err instanceof SIEStreamError) {\n * console.error(`mid-stream error: ${err.code} — ${err.message}`);\n * } else throw err;\n * }\n * ```\n */\n async *streamChatCompletions(\n req: ChatCompletionRequest,\n signal?: AbortSignal,\n ): AsyncGenerator<ChatCompletionChunk, void, undefined> {\n const body = { ...req, stream: true };\n const url = `${this.baseUrl}/v1/chat/completions`;\n yield* this.consumeSseStream<ChatCompletionChunk>(url, body, req.model, signal, (chunk) =>\n extractChatChunkError(chunk),\n );\n }\n\n /**\n * Streaming companion to {@link generate} — opens an SSE connection to\n * `/v1/generate/{model}` with `stream: true` and yields the SIE-native\n * chunk shape documented in\n * `packages/sie_gateway/src/handlers/sse.rs::build_generate_chunk_event`.\n *\n * The first delta carries `seq: 0` and `text_delta` populated; the\n * terminal chunk has `done: true`, `finish_reason`, and (typically)\n * `usage` + `ttft_ms`. The generator completes on the `data: [DONE]`\n * sentinel.\n *\n * Error semantics match {@link streamChatCompletions}: pre-stream HTTP\n * errors throw normally, mid-stream `error` chunks throw\n * {@link SIEStreamError}.\n *\n * @example\n * ```typescript\n * for await (const chunk of client.streamGenerate(\n * \"Qwen/Qwen3-4B-Instruct-2507\",\n * \"Write a haiku.\",\n * { maxNewTokens: 64, temperature: 0.7 },\n * )) {\n * process.stdout.write(chunk.text_delta);\n * if (chunk.done) console.log(`\\nTTFT: ${chunk.ttft_ms}ms`);\n * }\n * ```\n */\n async *streamGenerate(\n model: string,\n prompt: string,\n options: GenerateOptions,\n signal?: AbortSignal,\n ): AsyncGenerator<GenerateChunk, void, undefined> {\n const body: Record<string, unknown> = {\n prompt,\n max_new_tokens: options.maxNewTokens,\n temperature: options.temperature ?? 1.0,\n top_p: options.topP ?? 1.0,\n stream: true,\n };\n if (options.stop !== undefined) body.stop = options.stop;\n\n const safeModel = model.replaceAll(\"/\", \"__\");\n const url = `${this.baseUrl}/v1/generate/${encodeURIComponent(safeModel)}`;\n\n // Routing headers (parallel to generate()) — pool / gpu are passed\n // here even though the SSE handler also reads them from the body\n // for some endpoints, because the gateway looks at headers first.\n const { pool, gpu } = this.parseGpuParam(options.gpu);\n const waitForCapacity = options.waitForCapacity ?? this.defaultWaitForCapacity;\n yield* this.consumeSseStream<GenerateChunk>(\n url,\n body,\n model,\n signal,\n (chunk) => extractGenerateChunkError(chunk),\n { pool, gpu },\n { waitForCapacity },\n );\n }\n\n /**\n * Shared SSE consumption helper for the streaming methods.\n *\n * Performs a pre-stream provisioning retry loop (honoring\n * `waitForCapacity`/`provisionTimeout`), surfaces pre-stream errors via\n * {@link handleError} (so callers see the same `RequestError` /\n * `ServerError` hierarchy as the non-streaming endpoints), then iterates\n * the SSE payloads via {@link parseSseStream}. Each payload is JSON-parsed;\n * if the consumer-supplied `extractError` returns an `SIEStreamError`, the\n * generator throws it instead of yielding the chunk.\n *\n * Retry policy mirrors {@link generate}: only the SAFE pre-execution\n * capacity signals — `202` (provisioning) and `503 MODEL_LOADING` — are\n * retried, and only while `waitForCapacity` is set and the provision\n * budget remains. Once the body opens we never retry (the call is\n * non-idempotent; a mid-stream failure must not re-issue generation).\n *\n * @internal\n */\n private async *consumeSseStream<T>(\n url: string,\n body: unknown,\n model: string,\n signal: AbortSignal | undefined,\n extractError: (chunk: T) => SIEStreamError | null,\n routing?: { pool?: string; gpu?: string },\n provisioning?: { waitForCapacity?: boolean },\n ): AsyncGenerator<T, void, undefined> {\n const headers = this.buildChatHeaders(\"text/event-stream\");\n if (routing?.pool) headers[\"X-SIE-Pool\"] = routing.pool;\n if (routing?.gpu) headers[\"X-SIE-MACHINE-PROFILE\"] = routing.gpu;\n const waitForCapacity = provisioning?.waitForCapacity ?? this.defaultWaitForCapacity;\n const gpu = routing?.gpu;\n\n // Compose the caller's signal with our internal timeout-controller so\n // both can cancel the fetch. We use a fresh controller per call so\n // multiple concurrent streams don't share state.\n const controller = new AbortController();\n const onCallerAbort = () => controller.abort();\n if (signal) {\n if (signal.aborted) {\n throw new SIEConnectionError(\"Stream aborted before request\", \"other\");\n }\n signal.addEventListener(\"abort\", onCallerAbort, { once: true });\n }\n\n try {\n const startTime = Date.now();\n let response: Response | undefined;\n\n // Pre-stream provisioning retry loop. We re-fetch on the SAFE\n // pre-execution capacity signals only (202 / 503 MODEL_LOADING),\n // parallel to `generate()`. The loop terminates by `break`-ing on a\n // 200 (the only status that opens a body) or by throwing.\n while (true) {\n if (signal?.aborted) {\n throw new SIEConnectionError(\"Stream aborted before request\", \"other\");\n }\n // Pre-stream timeout only — once the body starts flowing we rely on\n // inter-chunk timeouts on the gateway side (`sse.rs` has its own\n // three-tier taxonomy). Setting `this.timeout` for the whole stream\n // would cap long generations at 30s. A fresh per-attempt timeout\n // covers each pre-stream fetch.\n const preStreamTimeoutId = setTimeout(() => controller.abort(), this.timeout);\n let attemptResponse: Response;\n try {\n attemptResponse = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n } catch (error) {\n if (signal?.aborted) {\n throw new SIEConnectionError(\"Stream aborted before response\", \"other\");\n }\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new SIEConnectionError(`Stream open 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(preStreamTimeoutId);\n }\n\n // BUG 13a: `Response.ok` is true for 202, so the old `!response.ok`\n // gate let a 202 slip through to `response.body` (null) and throw a\n // misleading \"no body\" RequestError. Handle 202 explicitly as the\n // provisioning path (retry under `waitForCapacity`, else throw\n // ProvisioningError honoring Retry-After).\n if (attemptResponse.status === HTTP_ACCEPTED) {\n if (!waitForCapacity) {\n throw new ProvisioningError(\n \"No capacity available. Server is provisioning.\",\n gpu,\n getRetryAfter(attemptResponse),\n );\n }\n const elapsed = Date.now() - startTime;\n if (elapsed >= this.provisionTimeout) {\n throw new ProvisioningError(\n `Provisioning timeout after ${elapsed}ms`,\n gpu,\n getRetryAfter(attemptResponse),\n );\n }\n const delay = getRetryAfter(attemptResponse) ?? DEFAULT_RETRY_DELAY;\n // Abortable: a long Retry-After sleep must yield promptly if the\n // caller aborts (`controller.signal` fires on caller-abort), not\n // wait out the full delay before the next loop's abort check.\n if (\n await abortableSleep(\n Math.min(delay, this.provisionTimeout - elapsed),\n controller.signal,\n )\n ) {\n throw new SIEConnectionError(\"Stream aborted while provisioning\", \"other\");\n }\n continue;\n }\n\n // 502 MODEL_LOAD_FAILED is terminal — surface immediately.\n await throwIfModelLoadFailed(attemptResponse, model);\n\n // BUG 13b: retry 503 MODEL_LOADING (a SAFE pre-execution signal)\n // when the caller opted into waiting for capacity, parallel to\n // `generate()`. Without `waitForCapacity` we fall through to\n // `handleError` and reject immediately (no retry).\n if (attemptResponse.status === 503) {\n const errorCode = await getErrorCode(attemptResponse.clone());\n if (errorCode === MODEL_LOADING_ERROR_CODE && waitForCapacity) {\n const elapsed = Date.now() - startTime;\n if (elapsed >= this.provisionTimeout) {\n throw new ModelLoadingError(`Model loading timeout for '${model}'`, model);\n }\n const delay = getRetryAfter(attemptResponse) ?? MODEL_LOADING_DEFAULT_DELAY;\n if (\n await abortableSleep(\n Math.min(delay, this.provisionTimeout - elapsed),\n controller.signal,\n )\n ) {\n throw new SIEConnectionError(\"Stream aborted while provisioning\", \"other\");\n }\n continue;\n }\n // Generic 503 (scale-from-zero: no / non-MODEL_LOADING error code).\n // Retry under `waitForCapacity`, mirroring non-streaming\n // `generate()`. This is still a SAFE pre-execution signal — the\n // body has not started, so no partial generation is at risk — so\n // the non-idempotency reasoning (never retry a mid-stream failure)\n // is preserved.\n if (waitForCapacity) {\n const elapsed = Date.now() - startTime;\n if (elapsed < this.provisionTimeout) {\n const delay = getRetryAfter(attemptResponse) ?? DEFAULT_RETRY_DELAY;\n if (\n await abortableSleep(\n Math.min(delay, this.provisionTimeout - elapsed),\n controller.signal,\n )\n ) {\n throw new SIEConnectionError(\"Stream aborted while provisioning\", \"other\");\n }\n continue;\n }\n }\n }\n\n // Any remaining non-200 is an error: don't rely on `!response.ok`\n // (which would also be false for the already-handled 202).\n if (attemptResponse.status !== 200) {\n await handleError(attemptResponse);\n }\n\n response = attemptResponse;\n break;\n }\n\n if (!response) {\n throw new RequestError(\"Streaming request failed without producing a response\");\n }\n this.checkServerVersion(response);\n\n const bodyStream = response.body;\n if (!bodyStream) {\n throw new RequestError(\"Streaming response has no body\");\n }\n const reader = bodyStream.getReader();\n for await (const payload of parseSseStream(reader, signal ?? controller.signal)) {\n let chunk: T;\n try {\n chunk = JSON.parse(payload) as T;\n } catch (err) {\n throw new RequestError(\n `Failed to parse SSE chunk as JSON: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n const streamErr = extractError(chunk);\n if (streamErr) throw streamErr;\n yield chunk;\n }\n } finally {\n if (signal) signal.removeEventListener(\"abort\", onCallerAbort);\n }\n }\n\n /**\n * Build the standard JSON header set for the chat-completions surface.\n * Pulled out so both the streaming and non-streaming paths agree on\n * auth / version / content-type wiring.\n */\n private buildChatHeaders(\n accept: \"application/json\" | \"text/event-stream\",\n ): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: accept,\n \"Content-Type\": JSON_CONTENT_TYPE,\n [SDK_VERSION_HEADER]: SDK_VERSION,\n };\n if (this.apiKey) headers.Authorization = `Bearer ${this.apiKey}`;\n return headers;\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 if (options.adapterOptions !== undefined) {\n params.options = options.adapterOptions;\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 or update 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 - Optional machine profile requirements for pool readiness, e.g., { \"l4\": 2, \"l4-spot\": 1 }\n * @param gpuCaps - Optional maximum assigned workers per machine profile\n *\n * @example\n * ```typescript\n * // Create or update 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(\n name: string,\n gpus?: Record<string, number>,\n gpuCaps?: Record<string, number>,\n ): Promise<void> {\n const alreadyTracking = this.pools.has(name);\n\n // Build pool creation request\n const requestBody: {\n name: string;\n gpus?: Record<string, number>;\n gpu_caps?: Record<string, number>;\n } = {\n name,\n };\n if (gpus !== undefined) {\n requestBody.gpus = gpus;\n }\n if (gpuCaps) {\n requestBody.gpu_caps = gpuCaps;\n }\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 if (alreadyTracking || this.pools.has(name)) {\n return;\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 {\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>; gpu_caps?: 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 // Short-circuit terminal load failures (sie-test#85). The server\n // emits 502 MODEL_LOAD_FAILED for permanent classes (gated repos,\n // missing dependencies, unrecognised architectures); we must\n // surface the error immediately rather than burn the\n // MODEL_LOADING retry budget on a known-bad config.\n await throwIfModelLoadFailed(response, model);\n\n // Short-circuit token-budget overruns (#849).\n await throwIfInputTooLong(response, model);\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 WebSocket(url);\n }\n // In Node, `WebSocket` resolves to the `ws` package which accepts\n // a third `{ headers }` options argument. In browsers, the native\n // WebSocket only takes `(url, protocols)` and the third arg is\n // silently dropped. Use `Reflect.construct` with a runtime args\n // array so the call site doesn't statically appear to pass\n // superfluous trailing arguments to the lib.dom WebSocket type.\n const args: unknown[] = [url, [], { headers }];\n return Reflect.construct(WebSocket, args) as WebSocket;\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 /** Canonical machine profiles configured in the cluster */\n configuredGpuTypes: string[];\n /** Machine profiles 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/machineProfile\") */\n name: string;\n /** Machine profile requirements for pool readiness, e.g., { l4: 2, \"a100-40gb\": 1 } */\n gpus?: Record<string, number>;\n /** Optional maximum assigned workers per machine profile */\n gpuCaps?: Record<string, number>;\n /** Optional maximum assigned workers per machine profile, as returned by the gateway */\n gpu_caps?: 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>; gpu_caps?: 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// Generation\n// ---------------------------------------------------------------------------\n\n/** Reason the generation terminated. */\nexport type FinishReason = \"stop\" | \"length\" | \"cancelled\" | \"content_filter\" | \"error\";\n\n/** Token usage for a single generation call. */\nexport interface GenerationUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\n/** Options for the generate operation. */\nexport interface GenerateOptions {\n /** Hard cap on output tokens. Required. */\n maxNewTokens: number;\n /** Sampling temperature. */\n temperature?: number;\n /** Nucleus sampling cutoff. */\n topP?: number;\n /** Optional list of stop strings. */\n stop?: string[];\n /** GPU type / pool spec, e.g. ``\"l4\"`` or ``\"eval-bench/l4\"``. */\n gpu?: string;\n /** Auto-retry under provisioning. */\n waitForCapacity?: boolean;\n}\n\n/** Aggregated generation result. */\nexport interface GenerateResult {\n /** Model id the gateway dispatched to. */\n model: string;\n /** Full generated text (concatenation of all streamed deltas). */\n text: string;\n /** Termination reason. */\n finishReason: FinishReason;\n /** Prompt / completion / total token counts. */\n usage: GenerationUsage;\n /** Worker-generated attempt id. */\n attemptId?: string;\n /** Time-to-first-token in milliseconds. */\n ttftMs?: number;\n /** Average time per output token in milliseconds. */\n tpotMs?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Chat completions (OpenAI-compatible) — /v1/chat/completions\n// ---------------------------------------------------------------------------\n\n/**\n * A single message in a chat completion request.\n *\n * Accepted roles: `system`, `user`, `assistant`, `tool`, `developer`. The\n * gateway normalises `developer` → `system` before forwarding to the worker\n * (the OpenAI 2024-08 rename — most chat templates only have `system`).\n *\n * `content` may be a string OR an array of typed content parts. The gateway\n * concatenates `text` / `input_text` parts; `image_url` / `input_image` parts\n * are rejected with `400 unsupported_field` because no vision-capable\n * generation model is configured today (the contract is forward-ready). See\n * `packages/sie_gateway/src/openapi.rs` and `proxy.rs::chat_params_from_json`\n * for the canonical accepted subset.\n */\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\" | \"developer\";\n content: string | ChatContentPart[] | null;\n name?: string;\n /** Required when `role === \"tool\"`. */\n tool_call_id?: string;\n /** Populated by the model when calling tools (assistant turns only). */\n tool_calls?: ToolCall[];\n}\n\n/**\n * One content part inside a multimodal `messages[*].content` array. Only the\n * text variants are accepted today; image parts are declared so callers can\n * see the rejection at the type layer instead of at runtime.\n */\nexport type ChatContentPart = { type: \"text\"; text: string } | { type: \"input_text\"; text: string };\n\n/** A tool call emitted by the model. */\nexport interface ToolCall {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n}\n\n/** A tool the model is allowed to call. */\nexport interface ToolSpec {\n type: \"function\";\n function: {\n name: string;\n description?: string;\n /** JSON Schema describing the function arguments. */\n parameters?: Record<string, unknown>;\n };\n}\n\n/** Tool-routing directive. */\nexport type ToolChoice =\n | \"auto\"\n | \"none\"\n | \"required\"\n | { type: \"function\"; function: { name: string } };\n\n/** Structured-output `response_format` envelope. */\nexport interface ResponseFormat {\n type: \"json_schema\" | \"json_object\" | \"text\";\n /** JSON Schema body when `type === \"json_schema\"`. */\n json_schema?: unknown;\n}\n\n/** OpenAI-compatible chat-completion finish reason. */\nexport type ChatFinishReason = \"stop\" | \"length\" | \"tool_calls\" | \"content_filter\" | null;\n\n/**\n * Request body for `chatCompletions` / `streamChatCompletions`.\n *\n * Field names are snake_case (the wire shape) so the SDK can hand the object\n * to `JSON.stringify` without further translation. SIE-specific routing\n * fields (`routing_key`, `prompt_cache_key`) match the gateway schema in\n * `packages/sie_gateway/src/openapi.rs`.\n *\n * The gateway honours: `model`, `messages`, `max_tokens` /\n * `max_completion_tokens`, `temperature`, `top_p`, `top_k`, `stop`, `stream`,\n * `stream_options`, `tools`, `tool_choice`, `parallel_tool_calls`,\n * `response_format`, `frequency_penalty`, `presence_penalty` (each in\n * `[-2, 2]`), `repetition_penalty`, `n`, `best_of`, `logprobs`,\n * `top_logprobs`, `logit_bias`, `seed`, `user`, `safety_identifier`,\n * `lora_adapter`, `routing_key`, and `prompt_cache_key`. Unknown fields\n * are rejected with `400 unsupported_field`.\n */\nexport interface ChatCompletionRequest {\n model: string;\n messages: ChatMessage[];\n /** Legacy alias; the gateway prefers `max_completion_tokens` when both set. */\n max_tokens?: number;\n max_completion_tokens?: number;\n temperature?: number;\n top_p?: number;\n /**\n * Non-OpenAI sampling knob (vLLM / SGLang). Integer `>= 1`; absent →\n * sampler default (top-k disabled).\n */\n top_k?: number;\n /**\n * Non-OpenAI repetition penalty (SGLang). Float in `(0.0, 2.0]`; `1.0`\n * means no penalty. Absent → sampler default.\n */\n repetition_penalty?: number;\n /** Single stop string or list of stop strings. */\n stop?: string | string[];\n /** Set to `true` to use `streamChatCompletions`. `chatCompletions` rejects this. */\n stream?: boolean;\n /** Streaming-only: ask the server to emit a final usage-only chunk before `[DONE]`. */\n stream_options?: { include_usage?: boolean };\n tools?: ToolSpec[];\n tool_choice?: ToolChoice;\n /** OpenAI parallel-tool-calls toggle (default `true`). */\n parallel_tool_calls?: boolean;\n response_format?: ResponseFormat;\n /** Accepted in the OpenAI range [-2, 2]; out-of-range values are rejected. */\n frequency_penalty?: number;\n presence_penalty?: number;\n /**\n * Multi-candidate count. Default `1`. `n > 1 && stream === true` is\n * rejected by the gateway with 400.\n */\n n?: number;\n /**\n * Generate this many candidates and return the top `n` by cumulative\n * logprob. Range `[1, 128]`; requires `best_of >= n` and `stream: false`.\n */\n best_of?: number;\n /**\n * `true` requests per-token log-probabilities on each chunk / on the\n * aggregate response. Required when `top_logprobs > 0`.\n */\n logprobs?: boolean;\n /**\n * How many alternate-token logprobs to return per position. Range\n * `[0, 20]` per the OpenAI spec; implies `logprobs: true` when `> 0`.\n */\n top_logprobs?: number;\n /**\n * `{token_id: bias_float}` map. Gateway validates per-value range\n * `[-100, 100]` and caps map size.\n */\n logit_bias?: Record<string, number>;\n seed?: number;\n /**\n * OpenAI's free-text end-user identifier. Accepted and logged at debug\n * level by the gateway.\n */\n user?: string;\n /**\n * OpenAI's free-text safety-tier identifier (replacement for `user` on\n * safety-sensitive accounts). Accepted but intentionally not logged.\n */\n safety_identifier?: string;\n /**\n * Multi-LoRA: served-name of the adapter to apply on the worker (SIE\n * extension). Must be a non-empty string; unknown names are rejected by\n * the gateway with 400 `unknown_lora`.\n */\n lora_adapter?: string;\n /** SIE-native routing affinity hint. */\n routing_key?: string;\n /** SIE-native prompt-cache hint. */\n prompt_cache_key?: string;\n}\n\n/** Token usage block (snake_case, matches the wire shape). */\nexport interface ChatUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n}\n\n/** A single choice in a `ChatCompletion` (non-streaming). */\nexport interface ChatChoice {\n index: number;\n message: ChatMessage;\n finish_reason: ChatFinishReason;\n logprobs: null;\n}\n\n/** Non-streaming response from `chatCompletions`. */\nexport interface ChatCompletion {\n id: string;\n object: \"chat.completion\";\n created: number;\n model: string;\n system_fingerprint: string | null;\n choices: ChatChoice[];\n usage: ChatUsage;\n}\n\n/** Incremental delta emitted on each streaming chunk. */\nexport interface ChatDelta {\n /** First chunk only, per the OpenAI streaming contract. */\n role?: \"assistant\";\n content?: string;\n tool_calls?: ToolCallDelta[];\n}\n\n/** Partial tool-call materialised across multiple streaming chunks. */\nexport interface ToolCallDelta {\n index: number;\n id?: string;\n type?: \"function\";\n function?: { name?: string; arguments?: string };\n}\n\n/** A single choice in a streaming `ChatCompletionChunk`. */\nexport interface ChatChunkChoice {\n index: number;\n delta: ChatDelta;\n finish_reason: ChatFinishReason;\n logprobs: null;\n}\n\n/**\n * One SSE event from `streamChatCompletions`.\n *\n * The terminal-usage chunk (emitted when `stream_options.include_usage` is\n * `true`) sets `choices: []` and populates `usage`.\n */\nexport interface ChatCompletionChunk {\n id: string;\n object: \"chat.completion.chunk\";\n created: number;\n model: string;\n system_fingerprint: string | null;\n choices: ChatChunkChoice[];\n usage?: ChatUsage;\n}\n\n/**\n * Per-call options for `chatCompletions` controlling the pre-execution\n * provisioning / retry loop. The request body itself is the separate\n * {@link ChatCompletionRequest} argument; these knobs only govern HOW the\n * SDK talks to the gateway, not WHAT it asks for.\n *\n * All fields are optional and fall back to the client-level defaults\n * (`waitForCapacity`, `provisionTimeout`) when omitted.\n */\nexport interface ChatCompletionOptions {\n /**\n * When `true`, retry the SAFE pre-execution capacity signals\n * (`202 Accepted`, `503 MODEL_LOADING`, generic `503`) until\n * `provisionTimeoutMs` elapses. When `false`, the first such signal\n * throws (`ProvisioningError` / `ModelLoadingError` / `ServerError`).\n * Defaults to the client's `waitForCapacity` (false unless the\n * constructor opted in).\n */\n waitForCapacity?: boolean;\n /**\n * Total cumulative wall-clock budget (ms) for provisioning retries.\n * Independent of the per-attempt `timeout`. Defaults to the client's\n * `provisionTimeout` (typically 5 minutes).\n */\n provisionTimeoutMs?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Streaming generate — /v1/generate/{model} with stream:true\n// ---------------------------------------------------------------------------\n\n/**\n * One SSE event from `streamGenerate`.\n *\n * SIE-native shape — see `packages/sie_gateway/src/handlers/sse.rs`\n * (`build_generate_chunk_event`). `usage` and `ttft_ms` only land on the\n * terminal chunk; `error` is populated when generation failed mid-stream\n * (handled by throwing `SIEStreamError`, never yielded).\n */\nexport interface GenerateChunk {\n request_id: string;\n seq: number;\n text_delta: string;\n done: boolean;\n finish_reason?: \"stop\" | \"length\" | \"cancelled\" | \"error\";\n usage?: ChatUsage;\n /** Time-to-first-token, milliseconds. Terminal chunk only. */\n ttft_ms?: number;\n /** Populated when the worker / gateway errored mid-stream. */\n error?: { code: string; message: string };\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 * Adapter-specific runtime options forwarded to the server as\n * `params.options`. Used for adapter knobs that aren't part of the\n * core extract API — e.g. `{ overflow_policy: \"error\" }` for\n * gliclass token-budget control. Mirrors the Python SDK's `options`\n * keyword argument.\n */\n adapterOptions?: Record<string, unknown>;\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 * 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 */\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 * 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/internal/provisioning.ts","../src/sse.ts","../src/version.ts","../src/client.ts","../src/types.ts","../src/encoding.ts","../src/scoring.ts","../src/images.ts"],"names":["buffer","getRetryAfter","sleep"],"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/**\n * Error surfaced mid-stream from `streamChatCompletions` / `streamGenerate`.\n *\n * The SSE wire shape includes optional `error: {message, type, param, code}`\n * (chat) or `error: {code, message}` (SIE-native generate) on the terminal\n * chunk. When the SDK sees such a chunk it does NOT yield the chunk; instead\n * it throws `SIEStreamError`, mirroring the non-streaming `handleError` path\n * so callers can catch the same way they would for HTTP-level failures.\n *\n * Compare with `RequestError` / `ServerError`: those fire before the SSE\n * stream opens (HTTP 4xx / 5xx). `SIEStreamError` fires after at least one\n * byte has gone out — the connection itself was healthy, but the worker /\n * gateway emitted an error envelope partway through generation.\n */\nexport class SIEStreamError extends SIEError {\n /** SIE-native error code (e.g. `context_exceeded`, `cancelled`). */\n readonly code: string | undefined;\n /** OpenAI-style error type (e.g. `context_length_exceeded`, `server_error`). */\n readonly errorType: string | undefined;\n /** Offending field name when known (chat shape only). */\n readonly param: string | null | undefined;\n\n constructor(\n message: string,\n options?: { code?: string; errorType?: string; param?: string | null },\n ) {\n super(message);\n this.name = \"SIEStreamError\";\n this.code = options?.code;\n this.errorType = options?.errorType;\n this.param = options?.param;\n }\n}\n\n/**\n * Error when the server reports a *terminal* model-load failure.\n *\n * Distinct from {@link ModelLoadingError} — this is thrown on the first\n * response (no retry budget consumed) when the server returns HTTP\n * `502 MODEL_LOAD_FAILED`. The server uses this code for permanent-class\n * failures (gated repos, missing dependencies, unrecognised model\n * architectures) where retrying would waste time. See sie-test#85.\n *\n * Permanent failures will not auto-clear; an operator must fix the\n * underlying cause (e.g. set `HF_TOKEN`, accept the model license on\n * HuggingFace, upgrade `transformers`).\n */\nexport class ModelLoadFailedError extends ServerError {\n /** The model that was requested */\n readonly model: string | undefined;\n /**\n * Server-side classification: one of `GATED`, `OOM`, `DEPENDENCY`,\n * `NOT_FOUND`, `NETWORK`, `UNKNOWN`. Use this to route to specific\n * remediation paths (e.g. surface a \"set HF_TOKEN\" hint for `GATED`).\n */\n readonly errorClass: string | undefined;\n /** Whether the failure is non-retryable per server policy. */\n readonly permanent: boolean;\n /** How many load attempts the server has logged. */\n readonly attempts: number;\n\n constructor(\n message: string,\n options?: {\n model?: string;\n errorClass?: string;\n permanent?: boolean;\n attempts?: number;\n },\n ) {\n super(message, \"MODEL_LOAD_FAILED\", 502);\n this.name = \"ModelLoadFailedError\";\n this.model = options?.model;\n this.errorClass = options?.errorClass;\n this.permanent = options?.permanent ?? true;\n this.attempts = options?.attempts ?? 1;\n }\n}\n\n/**\n * Error when the request input exceeds the model's maximum token capacity.\n *\n * Thrown when the server returns HTTP `400 INPUT_TOO_LONG` for an\n * extraction request. Distinct from generic {@link RequestError} so\n * callers can branch on token-budget failures specifically (truncate\n * the input client-side, switch to a longer-context model, or surface\n * a targeted error to the end user) without parsing the error code.\n *\n * Subclass of {@link RequestError} so existing 4xx handlers continue\n * to work; new code can catch {@link InputTooLongError} for tailored\n * handling.\n */\nexport class InputTooLongError extends RequestError {\n /** The model that was requested */\n readonly model: string | undefined;\n\n constructor(message: string, options?: { model?: string }) {\n super(message, \"INPUT_TOO_LONG\", 400);\n this.name = \"InputTooLongError\";\n this.model = options?.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 // Check `obj === null` first: `typeof null` is also `\"object\"` in JS.\n if (obj === null || typeof obj !== \"object\") {\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). `Retry-After: 0` means \"retry\n // immediately\" and must be honored (>= 0), not treated as invalid and\n // replaced by the default delay.\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 {\n InputTooLongError,\n ModelLoadFailedError,\n ProvisioningError,\n RequestError,\n ServerError,\n} from \"../errors.js\";\nimport { unpackMessage } from \"../msgpack.js\";\nimport type {\n CapacityInfo,\n Classification,\n DetectedObject,\n EncodeResult,\n Entity,\n ExtractResult,\n FinishReason,\n GenerateResult,\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 the error-detail object from a response body (JSON or msgpack).\n *\n * Returns the nested `error` / `detail` object so callers can read\n * auxiliary fields like `error_class`, `permanent`, `attempts` without\n * re-parsing. Used by the {@link throwIfModelLoadFailed} short-circuit.\n */\nexport async function getErrorDetail(\n response: Response,\n): Promise<Record<string, unknown> | 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 if (data.error && typeof data.error === \"object\") {\n return data.error as Record<string, unknown>;\n }\n if (data.detail && typeof data.detail === \"object\") {\n return data.detail as Record<string, unknown>;\n }\n if (typeof data.code === \"string\") {\n return data;\n }\n } catch {\n // Ignore parsing errors\n }\n return undefined;\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 const detail = await getErrorDetail(response);\n if (!detail) return undefined;\n const code = detail.code;\n return typeof code === \"string\" ? code : undefined;\n}\n\n/**\n * Throw {@link ModelLoadFailedError} if the response is a 502 carrying\n * the `MODEL_LOAD_FAILED` error code.\n *\n * Used by the retry loop to short-circuit *before* engaging the\n * `MODEL_LOADING` budget. The server emits 502 + this code for\n * permanent-class failures (gated repos, missing dependencies); the SDK\n * must surface the error immediately rather than retrying for the full\n * provision timeout.\n *\n * No-op for any other status / error code.\n */\nexport async function throwIfModelLoadFailed(response: Response, model?: string): Promise<void> {\n if (response.status !== 502) return;\n const detail = await getErrorDetail(response.clone());\n if (!detail) return;\n if (detail.code !== \"MODEL_LOAD_FAILED\") return;\n const errorClass = typeof detail.error_class === \"string\" ? detail.error_class : undefined;\n const permanent = typeof detail.permanent === \"boolean\" ? detail.permanent : true;\n // Defensive: server should always send an int >= 1, but a malformed\n // payload must not crash the retry loop. Use ``Number.isFinite`` so\n // ``NaN`` (from a non-numeric string) and infinities both fall back\n // to 1, and a legitimate 0 (if the server semantics ever change) is\n // preserved instead of being clobbered by ``|| 1``.\n const attemptsRaw = detail.attempts;\n const parsedAttempts =\n typeof attemptsRaw === \"number\"\n ? attemptsRaw\n : typeof attemptsRaw === \"string\"\n ? Number.parseInt(attemptsRaw, 10)\n : Number.NaN;\n const attempts = Number.isFinite(parsedAttempts) ? parsedAttempts : 1;\n const message =\n typeof detail.message === \"string\" ? detail.message : `Model '${model ?? \"?\"}' failed to load`;\n throw new ModelLoadFailedError(message, {\n model,\n errorClass,\n permanent,\n attempts,\n });\n}\n\n/**\n * Throw {@link InputTooLongError} if the response is a 400 carrying the\n * `INPUT_TOO_LONG` error code.\n *\n * Used by the extract path to surface token-budget overruns as a typed\n * exception (so callers can catch {@link InputTooLongError} specifically)\n * instead of relying on a generic {@link RequestError} + string-matching\n * the `code`.\n *\n * No-op for any other status / error code.\n */\nexport async function throwIfInputTooLong(response: Response, model?: string): Promise<void> {\n if (response.status !== 400) return;\n const detail = await getErrorDetail(response.clone());\n if (!detail) return;\n if (detail.code !== \"INPUT_TOO_LONG\") return;\n const message =\n typeof detail.message === \"string\"\n ? detail.message\n : \"Input exceeds the model's maximum token capacity\";\n throw new InputTooLongError(message, { model });\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 // Prefer nested ``error`` / ``detail`` objects (gateway + FastAPI dict detail),\n // same as Python ``handle_error``. Legacy: string ``detail``, or top-level\n // ``message`` (e.g. gateway 202 provisioning body).\n const detail = await getErrorDetail(response.clone());\n\n let code: string | undefined;\n let message: string;\n\n if (detail) {\n const c = detail.code;\n code = typeof c === \"string\" ? c : undefined;\n const m = detail.message;\n message = typeof m === \"string\" ? m : JSON.stringify(detail);\n } else {\n try {\n const data = (await response.json()) as Record<string, unknown>;\n if (typeof data.detail === \"string\") {\n code = typeof data.code === \"string\" ? data.code : undefined;\n message = data.detail;\n } else if (typeof data.message === \"string\") {\n code = typeof data.code === \"string\" ? data.code : undefined;\n message = data.message;\n } else {\n code = typeof data.code === \"string\" ? data.code : undefined;\n message = response.statusText;\n }\n } catch {\n code = undefined;\n message = response.statusText;\n }\n }\n\n if (status === HTTP_ACCEPTED) {\n const retryAfter = getRetryAfter(response);\n throw new ProvisioningError(message, gpu, retryAfter);\n }\n\n if (status >= HTTP_CLIENT_ERROR_MIN && status <= HTTP_CLIENT_ERROR_MAX) {\n if (status === 400 && code === \"INPUT_TOO_LONG\") {\n // Fallback dispatch — ``model`` is only attached by the helper-style\n // short-circuit (``throwIfInputTooLong``) on the extract path.\n throw new InputTooLongError(message);\n }\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\ninterface WireUsageBlock {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n}\n\ninterface WireGenerateResult {\n model?: string;\n text?: string;\n finish_reason?: string;\n usage?: WireUsageBlock;\n attempt_id?: string;\n ttft_ms?: number;\n tpot_ms?: number;\n}\n\n/**\n * Describe an unknown value's runtime type for error messages, mirroring\n * the granularity of Python's ``type(x).__name__`` (``typeof null`` is\n * ``\"object\"`` in JS, so disambiguate ``null`` explicitly).\n */\nfunction describeType(value: unknown): string {\n if (value === null) return \"null\";\n return typeof value;\n}\n\n/**\n * Parse the gateway's streaming generate response envelope into a\n * :class:`GenerateResult`. Tolerant of missing *optional* fields for\n * forward compat with future surface extensions.\n *\n * ``model`` and ``text`` are required strings: a missing or non-string\n * value is surfaced as a {@link RequestError} rather than being silently\n * coerced to an empty string. A truncated / malformed envelope must not\n * look like a legitimate empty completion (silent data loss). This mirrors\n * the Python SDK's ``_parse_generate_result`` contract.\n */\n/**\n * Coerce a wire-format token count into a safe non-negative integer.\n *\n * The wire `usage` envelope is untyped JSON, so a malformed payload can carry\n * a string (`\"5\"`), a float (`3.9`), `null`, or a missing field. The previous\n * `?? 0` only guarded null/undefined, letting strings/floats leak verbatim\n * into the SDK's `number`-typed fields. We mirror the Python SDK's int\n * coercion: keep only finite numbers and truncate toward zero; everything\n * else (string, NaN, Infinity, null) becomes `0`.\n */\nfunction coerceTokenCount(v: unknown): number {\n return typeof v === \"number\" && Number.isFinite(v) ? Math.trunc(v) : 0;\n}\n\nexport function parseGenerateResult(data: Record<string, unknown>): GenerateResult {\n const wire = data as WireGenerateResult;\n if (typeof wire.model !== \"string\") {\n throw new RequestError(\n `Generate response missing string 'model' field: got ${describeType(wire.model)}`,\n );\n }\n if (typeof wire.text !== \"string\") {\n throw new RequestError(\n `Generate response missing string 'text' field: got ${describeType(wire.text)}`,\n );\n }\n const usage = wire.usage ?? {};\n const finish = (wire.finish_reason ?? \"stop\") as FinishReason;\n return {\n model: wire.model,\n text: wire.text,\n finishReason: finish,\n usage: {\n promptTokens: coerceTokenCount(usage.prompt_tokens),\n completionTokens: coerceTokenCount(usage.completion_tokens),\n totalTokens: coerceTokenCount(usage.total_tokens),\n },\n attemptId: wire.attempt_id,\n ttftMs: wire.ttft_ms,\n tpotMs: wire.tpot_ms,\n };\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 * Shared provisioning / retry loop for non-streaming POST endpoints.\n *\n * Both {@link SIEClient.generate} and {@link SIEClient.chatCompletions}\n * receive identical pre-execution capacity signals from the gateway —\n * `202 Accepted` (provisioning) and `503` with a known error code\n * (`MODEL_LOADING`) or a generic 503 (scale-from-zero). They both need\n * to retry those SAFE pre-execution signals while honouring a caller-\n * supplied `waitForCapacity` flag plus a `provisionTimeout` budget.\n *\n * This helper centralises that loop. Callers supply a `performFetch`\n * callback that issues a fresh `fetch` per attempt (the request must be\n * re-buildable, which the JSON chat path satisfies trivially since the\n * body is a plain object). The loop returns the first successful\n * response or throws a typed error.\n *\n * The streaming path keeps its own inline copy because it needs\n * abortable sleeps composed with the caller's `AbortSignal` (see\n * `consumeSseStream` in `client.ts`).\n */\n\nimport { ModelLoadingError, ProvisioningError, RequestError } from \"../errors.js\";\nimport {\n DEFAULT_RETRY_DELAY,\n HTTP_ACCEPTED,\n MODEL_LOADING_DEFAULT_DELAY,\n MODEL_LOADING_ERROR_CODE,\n} from \"./constants.js\";\nimport { getErrorCode, getRetryAfter, handleError, throwIfModelLoadFailed } from \"./parsing.js\";\n\n/** Options controlling the provisioning retry loop. */\nexport interface ProvisioningOptions {\n /** Model name (used to populate `ModelLoadingError.model`). */\n model: string;\n /** GPU label passed through to `ProvisioningError`. May be `undefined`. */\n gpu: string | undefined;\n /**\n * When `true`, the loop retries 202 / `503 MODEL_LOADING` / generic 503\n * until the provision budget is exhausted. When `false`, the first such\n * signal throws (the call-site opted out of waiting).\n */\n waitForCapacity: boolean;\n /**\n * Total cumulative wall-clock budget (ms) for retries. Defaults to\n * `DEFAULT_PROVISION_TIMEOUT` if omitted.\n */\n provisionTimeoutMs: number;\n}\n\n/** Sleep for `ms` milliseconds. Non-abortable; the non-streaming surface\n * does not expose an AbortSignal to the caller. */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Wrap a non-streaming POST attempt in the shared provisioning retry loop.\n *\n * The `performFetch` callback MUST re-issue the request from scratch on\n * each invocation — never reuse a consumed `Response`. It is responsible\n * for its own per-attempt timeout and for translating low-level\n * `TypeError` / `AbortError` into `SIEConnectionError`.\n *\n * The loop returns the first non-retryable success (`status === 200`).\n * Any other terminal status is handed to {@link handleError}, which\n * always throws.\n *\n * @internal\n */\nexport async function withProvisioningRetry(\n performFetch: () => Promise<Response>,\n opts: ProvisioningOptions,\n): Promise<Response> {\n const startTime = Date.now();\n\n while (true) {\n const response = await performFetch();\n\n if (response.status === HTTP_ACCEPTED) {\n if (!opts.waitForCapacity) {\n throw new ProvisioningError(\n \"No capacity available. Server is provisioning.\",\n opts.gpu,\n getRetryAfter(response),\n );\n }\n const elapsed = Date.now() - startTime;\n if (elapsed >= opts.provisionTimeoutMs) {\n throw new ProvisioningError(\n `Provisioning timeout after ${elapsed}ms`,\n opts.gpu,\n getRetryAfter(response),\n );\n }\n const delay = getRetryAfter(response) ?? DEFAULT_RETRY_DELAY;\n await sleep(Math.min(delay, opts.provisionTimeoutMs - elapsed));\n continue;\n }\n\n // 502 MODEL_LOAD_FAILED is terminal — surface immediately.\n await throwIfModelLoadFailed(response, opts.model);\n\n if (response.status === 503) {\n const errorCode = await getErrorCode(response.clone());\n if (errorCode === MODEL_LOADING_ERROR_CODE) {\n const elapsed = Date.now() - startTime;\n if (elapsed >= opts.provisionTimeoutMs) {\n throw new ModelLoadingError(`Model loading timeout for '${opts.model}'`, opts.model);\n }\n const delay = getRetryAfter(response) ?? MODEL_LOADING_DEFAULT_DELAY;\n await sleep(Math.min(delay, opts.provisionTimeoutMs - elapsed));\n continue;\n }\n if (opts.waitForCapacity) {\n const elapsed = Date.now() - startTime;\n if (elapsed < opts.provisionTimeoutMs) {\n const delay = getRetryAfter(response) ?? DEFAULT_RETRY_DELAY;\n await sleep(Math.min(delay, opts.provisionTimeoutMs - elapsed));\n continue;\n }\n }\n }\n\n if (!response.ok) {\n await handleError(response);\n }\n\n // Defensive: handleError always throws on !ok, but if a future caller\n // adds a non-200 success status we still want to surface it cleanly.\n if (response.status !== 200) {\n throw new RequestError(`Unexpected response status ${response.status}`);\n }\n return response;\n }\n}\n","/**\n * Minimal SSE (Server-Sent Events) parser for the SIE TS SDK.\n *\n * Reads from a `ReadableStreamDefaultReader<Uint8Array>` (a `fetch` response\n * body), decodes the UTF-8 byte stream, and yields each event's `data:`\n * payload as a string. Sentinel `data: [DONE]` payloads close the generator\n * without yielding. The `signal` parameter cancels the read cooperatively\n * and propagates as a `SIEConnectionError`.\n *\n * Scope: this parser supports only the subset of the SSE spec the SIE\n * gateway emits today —\n *\n * - `data: <single-line>\\n\\n`\n * - the literal `data: [DONE]\\n\\n` terminator\n * - keep-alive comment lines (`: <text>\\n`), which are skipped\n *\n * Other SSE features (`event:`, `id:`, `retry:`, multi-line `data:`\n * continuations) are not produced by `sse.rs` and are not handled here.\n * If the gateway grows new event shapes, extend this parser deliberately\n * rather than adding a generic SSE dependency.\n */\n\nimport { SIEConnectionError, SIEStreamError } from \"./errors.js\";\n\nconst SSE_DONE = \"[DONE]\";\n\n/**\n * Hard cap on the in-progress event buffer.\n *\n * The buffer holds bytes received but not yet terminated by an event\n * separator (`\\n\\n` / `\\r\\n\\r\\n`). A well-behaved gateway flushes complete\n * events promptly, so this only grows unbounded if a peer (or a broken\n * intermediary) sends a frame that never terminates. Without a cap that\n * OOMs the client; we instead surface a `SIEStreamError` once the buffer\n * exceeds this size.\n *\n * The bound is measured in UTF-16 code units (the units of\n * `String.prototype.length`), NOT bytes, because the cap is compared\n * against the decoded `buffer.length` below. 8 Mi chars is far above any\n * legitimate single SSE event the SIE gateway emits (chunks are\n * token-sized) while still bounding memory.\n */\nconst MAX_SSE_BUFFER_CHARS = 8 * 1024 * 1024;\n\n/**\n * Async-iterate over the `data:` payloads of an SSE response body.\n *\n * @param reader The locked reader returned by `response.body.getReader()`.\n * @param signal Optional `AbortSignal`; when fired, the generator throws\n * `SIEConnectionError` (kind `\"other\"`) and releases the\n * reader so the upstream fetch is cancelled.\n * @returns A generator of `data:` payload strings. The generator\n * completes (without throwing) when the server emits\n * `[DONE]` or the underlying stream is closed cleanly.\n */\nexport async function* parseSseStream(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<string, void, undefined> {\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n\n // Tracks whether the loop reached a *clean* terminus — either the\n // `[DONE]` sentinel or a graceful EOF (`result.done`). Any other exit\n // (a caller `break`/early `return` out of the consuming `for await`, a\n // thrown `SIEStreamError`, or a JSON parse `RequestError` raised by the\n // consumer) leaves this `false`, and the `finally` then `cancel()`s the\n // reader so the underlying HTTP body/socket closes promptly. Without\n // that, the gateway never sees the client disconnect and the worker\n // keeps generating to full `max_new_tokens` (wasted / billable tokens).\n let completedCleanly = false;\n\n // Bridge the AbortSignal onto the reader: cancelling the reader\n // tears down the fetch body promptly. We register the listener\n // once and clean it up in `finally`.\n const onAbort = () => {\n // `cancel()` returns a promise; we don't await it here — the\n // top-level loop sees `signal.aborted` and throws.\n reader.cancel().catch(() => {\n // Cancelling an already-released reader throws; ignore.\n });\n };\n if (signal) {\n if (signal.aborted) {\n throw new SIEConnectionError(\"Stream aborted before first read\", \"other\");\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n try {\n while (true) {\n if (signal?.aborted) {\n throw new SIEConnectionError(\"Stream aborted by caller\", \"other\");\n }\n\n // Race `read()` against the abort signal. We can't rely on\n // `reader.cancel()` to settle the pending read promptly across\n // every WHATWG-streams implementation (Node 22's lets an\n // in-flight source `pull()` run to completion), so we drop our\n // own claim on the read result if the caller aborts and surface\n // `SIEConnectionError` immediately. The `reader.cancel()` call\n // in `onAbort` still fires to tear down the upstream fetch.\n let result: Awaited<ReturnType<typeof reader.read>>;\n try {\n if (signal) {\n if (signal.aborted) {\n throw new SIEConnectionError(\"Stream aborted by caller\", \"other\");\n }\n result = await new Promise<Awaited<ReturnType<typeof reader.read>>>((resolve, reject) => {\n let settled = false;\n const onAbortRace = () => {\n if (settled) return;\n settled = true;\n signal.removeEventListener(\"abort\", onAbortRace);\n reject(new SIEConnectionError(\"Stream aborted by caller\", \"other\"));\n };\n signal.addEventListener(\"abort\", onAbortRace, { once: true });\n reader.read().then(\n (r) => {\n if (settled) return;\n settled = true;\n signal.removeEventListener(\"abort\", onAbortRace);\n resolve(r);\n },\n (err) => {\n if (settled) return;\n settled = true;\n signal.removeEventListener(\"abort\", onAbortRace);\n reject(err);\n },\n );\n });\n } else {\n result = await reader.read();\n }\n } catch (err) {\n if (err instanceof SIEConnectionError) throw err;\n if (signal?.aborted) {\n throw new SIEConnectionError(\"Stream aborted by caller\", \"other\");\n }\n throw err;\n }\n\n if (result.done) {\n // Flush any trailing decoder state, then break out so the\n // post-loop tail handler can process a final event block that\n // arrived without a trailing blank line. The gateway normally\n // emits a `[DONE]` terminator, but a stream that ends with a\n // last `data:` line and no trailing `\\n\\n` would otherwise drop\n // that event (which can carry `finish_reason` / `usage`).\n buffer += decoder.decode();\n break;\n }\n\n buffer += decoder.decode(result.value, { stream: true });\n\n // Guard against an event frame that never terminates. The buffer only\n // retains bytes for an event we have not yet been able to split off;\n // if it grows past the cap, the peer is sending an unbounded frame and\n // we must fail rather than OOM the client.\n if (buffer.length > MAX_SSE_BUFFER_CHARS) {\n throw new SIEStreamError(\n `SSE event buffer exceeded ${MAX_SSE_BUFFER_CHARS} chars without an event terminator`,\n );\n }\n\n // Events are separated by a blank line (`\\n\\n`). We also accept\n // `\\r\\n\\r\\n` for compat with intermediaries that rewrite line\n // endings.\n let sepIdx: number;\n while (true) {\n const lfIdx = buffer.indexOf(\"\\n\\n\");\n const crlfIdx = buffer.indexOf(\"\\r\\n\\r\\n\");\n if (lfIdx === -1 && crlfIdx === -1) break;\n let sepLen = 2;\n if (lfIdx === -1) {\n sepIdx = crlfIdx;\n sepLen = 4;\n } else if (crlfIdx === -1) {\n sepIdx = lfIdx;\n } else {\n if (lfIdx < crlfIdx) {\n sepIdx = lfIdx;\n } else {\n sepIdx = crlfIdx;\n sepLen = 4;\n }\n }\n const eventBlock = buffer.slice(0, sepIdx);\n buffer = buffer.slice(sepIdx + sepLen);\n\n const payload = extractDataPayload(eventBlock);\n if (payload === null) continue;\n if (payload === SSE_DONE) {\n // Clean terminus: server signalled end-of-stream. No need to\n // cancel the body — it has already drained the relevant work.\n completedCleanly = true;\n return;\n }\n yield payload;\n }\n }\n\n // Stream ended (clean close). Flush a trailing event block that lacks\n // a terminating blank line — it goes through the same `extractDataPayload`\n // path and honours the `[DONE]` sentinel, so a final un-terminated\n // `data:` line (potentially carrying `finish_reason` / `usage`) is not\n // silently dropped. We strip a lone trailing newline first so a plain\n // `data: ...\\n` tail (one newline, no blank line) is treated as a\n // complete single-line event.\n const tail = buffer.replace(/\\r?\\n$/, \"\");\n if (tail !== \"\") {\n const payload = extractDataPayload(tail);\n if (payload !== null && payload !== SSE_DONE) {\n yield payload;\n }\n }\n\n // Reaching here means we drained the stream to a graceful EOF (the\n // `result.done` break above flowed through the tail flush without a\n // `[DONE]`). That is a clean terminus.\n completedCleanly = true;\n } finally {\n if (signal) signal.removeEventListener(\"abort\", onAbort);\n if (completedCleanly) {\n // Clean terminus — just drop our claim on the reader.\n try {\n reader.releaseLock();\n } catch {\n // Reader already released or cancelled.\n }\n } else {\n // Early / error teardown (caller break or early return, thrown\n // SIEStreamError, JSON parse RequestError, buffer-cap overflow, or an\n // abort). Cancel the reader so the underlying HTTP body/socket closes\n // and the worker stops generating. `cancel()` also releases the lock,\n // so we do not call `releaseLock()` afterwards. Swallow any rejection\n // (e.g. an already-released/cancelled reader) so we never surface an\n // unhandled rejection from the teardown path.\n await reader.cancel().catch(() => {\n // Reader already released or cancelled, or the source's cancel\n // algorithm threw — nothing we can do at teardown.\n });\n }\n }\n}\n\n/**\n * Pull the `data:` payload out of a single SSE event block.\n *\n * Returns `null` for events with no `data:` line (keep-alive comments,\n * `event:`-only frames). When multiple `data:` lines are present they\n * are joined with `\\n` per the SSE spec, though the SIE gateway never\n * emits multi-line payloads today.\n */\nfunction extractDataPayload(block: string): string | null {\n const lines = block.split(/\\r?\\n/);\n const parts: string[] = [];\n for (const line of lines) {\n if (line === \"\" || line.startsWith(\":\")) continue;\n if (line.startsWith(\"data:\")) {\n // Per spec, a single leading space after the colon is stripped.\n let value = line.slice(5);\n if (value.startsWith(\" \")) value = value.slice(1);\n parts.push(value);\n }\n // Other field names (`event:`, `id:`, `retry:`) are ignored — the\n // SIE gateway does not emit them.\n }\n if (parts.length === 0) return null;\n return parts.join(\"\\n\");\n}\n","export const SDK_VERSION = \"0.6.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 SIEStreamError,\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 parseGenerateResult,\n parseScoreResult,\n throwIfInputTooLong,\n throwIfModelLoadFailed,\n} from \"./internal/parsing.js\";\nimport { withProvisioningRetry } from \"./internal/provisioning.js\";\nimport { packMessage, unpackMessage } from \"./msgpack.js\";\nimport { parseSseStream } from \"./sse.js\";\nimport type {\n CapacityInfo,\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionOptions,\n ChatCompletionRequest,\n EncodeOptions,\n EncodeResult,\n ExtractOptions,\n ExtractResult,\n GenerateChunk,\n GenerateOptions,\n GenerateResult,\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 * Pluck a mid-stream `error` block out of a `ChatCompletionChunk` and\n * convert it to `SIEStreamError`, mirroring the shape `sse.rs` emits:\n * `{ message, type, param, code }`. Returns `null` when the chunk is a\n * normal delta. Defined at module scope so it has zero coupling to\n * `SIEClient` state.\n */\nfunction extractChatChunkError(chunk: ChatCompletionChunk): SIEStreamError | null {\n const err = (\n chunk as ChatCompletionChunk & {\n error?: { message?: string; type?: string; param?: string | null; code?: string };\n }\n ).error;\n if (!err) return null;\n return new SIEStreamError(err.message ?? \"stream error\", {\n code: err.code,\n errorType: err.type,\n param: err.param,\n });\n}\n\n/** SIE-native chunk variant — see `sse.rs::build_generate_chunk_event`. */\nfunction extractGenerateChunkError(chunk: GenerateChunk): SIEStreamError | null {\n if (!chunk.error) return null;\n return new SIEStreamError(chunk.error.message, { code: chunk.error.code });\n}\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 /**\n * Generate text from a prompt (walking-skeleton SDK surface).\n *\n * The SDK does not currently expose streaming chunks. The worker streams\n * to the gateway, the gateway aggregates, and the SDK returns the\n * assembled result plus SIE-native timing metadata (TTFT, TPOT,\n * attempt id).\n *\n * @example\n * ```typescript\n * const result = await client.generate(\n * \"Qwen__Qwen3-4B-Instruct-2507\",\n * \"Write a haiku about the sea.\",\n * { maxNewTokens: 64, temperature: 0.7 },\n * );\n * console.log(result.text);\n * console.log(`TTFT: ${result.ttftMs}ms`);\n * ```\n */\n async generate(model: string, prompt: string, options: GenerateOptions): Promise<GenerateResult> {\n const body: Record<string, unknown> = {\n prompt,\n max_new_tokens: options.maxNewTokens,\n temperature: options.temperature ?? 1.0,\n top_p: options.topP ?? 1.0,\n };\n if (options.stop !== undefined) {\n body.stop = options.stop;\n }\n\n const { pool, gpu } = this.parseGpuParam(options.gpu);\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"Content-Type\": JSON_CONTENT_TYPE,\n [SDK_VERSION_HEADER]: SDK_VERSION,\n };\n if (pool) headers[\"X-SIE-Pool\"] = pool;\n if (gpu) headers[\"X-SIE-MACHINE-PROFILE\"] = gpu;\n if (this.apiKey) headers.Authorization = `Bearer ${this.apiKey}`;\n\n const safeModel = model.replaceAll(\"/\", \"__\");\n const url = `${this.baseUrl}/v1/generate/${encodeURIComponent(safeModel)}`;\n const waitForCapacity = options.waitForCapacity ?? this.defaultWaitForCapacity;\n\n const response = await withProvisioningRetry(() => this.performJsonPost(url, body, headers), {\n model,\n gpu,\n waitForCapacity,\n provisionTimeoutMs: this.provisionTimeout,\n });\n\n const data = (await response.json()) as Record<string, unknown>;\n if (data === null || typeof data !== \"object\") {\n throw new RequestError(\"Unexpected generate response shape\");\n }\n return parseGenerateResult(data);\n }\n\n /**\n * Per-attempt JSON POST used by the non-streaming surfaces\n * ({@link generate}, {@link chatCompletions}) inside the\n * {@link withProvisioningRetry} loop.\n *\n * Translates low-level transport failures into typed errors that the\n * retry loop will surface verbatim:\n * - `AbortError` → `SIEConnectionError` (per-attempt timeout)\n * - `TypeError` → `SIEConnectionError` (NOT retried — generation is\n * non-idempotent, so a mid-flight drop must surface instead of\n * silently re-issuing a billable generation)\n *\n * Each call uses a fresh `AbortController` so concurrent retries don't\n * share state, and the per-attempt timeout is bounded by `this.timeout`\n * (NOT the cumulative provisioning budget).\n */\n private async performJsonPost(\n url: string,\n body: unknown,\n headers: Record<string, string>,\n ): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n try {\n return await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new SIEConnectionError(`Request timeout after ${this.timeout}ms`, \"timeout\");\n }\n if (err instanceof TypeError) {\n // `generate()` / `chatCompletions()` are non-idempotent and carry\n // no dedup key, so a SECOND attempt issues a SECOND billable\n // generation. `fetch` throws `TypeError` for ANY network failure,\n // including a connection dropped AFTER the request body was sent\n // (mid-flight) — and it cannot reliably distinguish that from a\n // connect-time refusal. Retrying a mid-flight drop would\n // double-bill, so surface as `SIEConnectionError` and let the\n // retry loop propagate it. The SAFE pre-execution capacity\n // signals (202 / 503 MODEL_LOADING) are HTTP statuses, not\n // exceptions, so the retry loop still handles them.\n throw new SIEConnectionError(`Connection failed: ${err.message}`, \"connect\");\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Non-streaming chat-completion call against `/v1/chat/completions`.\n *\n * This is the OpenAI-compatible surface. The request body is forwarded\n * verbatim as JSON, so any field documented at\n * <https://platform.openai.com/docs/api-reference/chat/create> can be set;\n * the gateway will reject fields it does not yet support with\n * `400 unsupported_field`. SIE-native routing hints (`routing_key`,\n * `prompt_cache_key`) are part of the same request shape.\n *\n * Error semantics mirror `generate()`: 4xx → `RequestError`, 5xx →\n * `ServerError` (or the more specific `ModelLoadFailedError` for 502\n * `MODEL_LOAD_FAILED`), connection / timeout failures →\n * `SIEConnectionError`.\n *\n * If `req.stream === true`, this method throws `RequestError` immediately —\n * use {@link streamChatCompletions} instead. We do not auto-route because\n * the return type is fundamentally different (`Promise` vs\n * `AsyncGenerator`) and silently flipping would mis-type the call site.\n *\n * @example\n * ```typescript\n * const reply = await client.chatCompletions({\n * model: \"Qwen/Qwen3-4B-Instruct-2507\",\n * messages: [{ role: \"user\", content: \"Write a haiku about the sea.\" }],\n * max_completion_tokens: 64,\n * });\n * console.log(reply.choices[0]?.message.content);\n * ```\n */\n async chatCompletions(\n req: ChatCompletionRequest,\n options: ChatCompletionOptions = {},\n ): Promise<ChatCompletion> {\n if (req.stream === true) {\n throw new RequestError(\n \"chatCompletions() cannot be used with stream:true — use streamChatCompletions() instead.\",\n \"invalid_request\",\n 400,\n );\n }\n\n const body = { ...req, stream: false };\n const url = `${this.baseUrl}/v1/chat/completions`;\n const headers = this.buildChatHeaders(\"application/json\");\n const waitForCapacity = options.waitForCapacity ?? this.defaultWaitForCapacity;\n const provisionTimeoutMs = options.provisionTimeoutMs ?? this.provisionTimeout;\n\n // H1: pre-execution capacity signals (202 / 503 MODEL_LOADING /\n // generic 503) MUST be handled by the shared provisioning loop —\n // otherwise a 202 slipped through as `response.ok === true` and the\n // SDK returned the provisioning envelope cast as `ChatCompletion`\n // (no `choices`, no `id`). The loop also surfaces `ProvisioningError`\n // when the caller opted out (`waitForCapacity: false`) or the\n // provision budget is exhausted, matching `generate()`.\n const response = await withProvisioningRetry(() => this.performJsonPost(url, body, headers), {\n model: req.model,\n gpu: undefined,\n waitForCapacity,\n provisionTimeoutMs,\n });\n\n this.checkServerVersion(response);\n\n const data = (await response.json()) as ChatCompletion;\n if (data === null || typeof data !== \"object\") {\n throw new RequestError(\"Unexpected chat.completion response shape\");\n }\n return data;\n }\n\n /**\n * Streaming chat-completion call against `/v1/chat/completions` with\n * `Accept: text/event-stream`.\n *\n * Yields `ChatCompletionChunk` events in the order the gateway emits them.\n * The terminal chunk carries `finish_reason`; if\n * `req.stream_options.include_usage === true`, a final usage-only chunk\n * (`choices: []`, populated `usage`) follows it. The generator completes\n * cleanly on the `data: [DONE]` sentinel.\n *\n * Error semantics:\n *\n * - HTTP 4xx / 5xx **before** the stream opens → throws `RequestError` /\n * `ServerError` (same as {@link chatCompletions}).\n * - A chunk containing `error: { ... }` mid-stream → throws\n * {@link SIEStreamError}. The error chunk is consumed, never yielded.\n * - `signal.abort()` mid-stream → the generator throws\n * `SIEConnectionError` and releases the underlying reader, which\n * fires `StreamCancelGuard` on the gateway side.\n *\n * `req.stream` is set to `true` automatically; any existing value is\n * overwritten. We do not validate `req.stream === false` because the\n * call-site intent is unambiguous.\n *\n * @param req The chat-completion request. See {@link ChatCompletionRequest}.\n * @param signal Optional `AbortSignal` for cooperative cancellation.\n *\n * @example\n * ```typescript\n * const controller = new AbortController();\n * try {\n * for await (const chunk of client.streamChatCompletions(\n * {\n * model: \"Qwen/Qwen3-4B-Instruct-2507\",\n * messages: [{ role: \"user\", content: \"Count to ten.\" }],\n * stream_options: { include_usage: true },\n * },\n * controller.signal,\n * )) {\n * process.stdout.write(chunk.choices[0]?.delta.content ?? \"\");\n * }\n * } catch (err) {\n * if (err instanceof SIEStreamError) {\n * console.error(`mid-stream error: ${err.code} — ${err.message}`);\n * } else throw err;\n * }\n * ```\n */\n async *streamChatCompletions(\n req: ChatCompletionRequest,\n signal?: AbortSignal,\n ): AsyncGenerator<ChatCompletionChunk, void, undefined> {\n const body = { ...req, stream: true };\n const url = `${this.baseUrl}/v1/chat/completions`;\n yield* this.consumeSseStream<ChatCompletionChunk>(url, body, req.model, signal, (chunk) =>\n extractChatChunkError(chunk),\n );\n }\n\n /**\n * Streaming companion to {@link generate} — opens an SSE connection to\n * `/v1/generate/{model}` with `stream: true` and yields the SIE-native\n * chunk shape documented in\n * `packages/sie_gateway/src/handlers/sse.rs::build_generate_chunk_event`.\n *\n * The first delta carries `seq: 0` and `text_delta` populated; the\n * terminal chunk has `done: true`, `finish_reason`, and (typically)\n * `usage` + `ttft_ms`. The generator completes on the `data: [DONE]`\n * sentinel.\n *\n * Error semantics match {@link streamChatCompletions}: pre-stream HTTP\n * errors throw normally, mid-stream `error` chunks throw\n * {@link SIEStreamError}.\n *\n * @example\n * ```typescript\n * for await (const chunk of client.streamGenerate(\n * \"Qwen/Qwen3-4B-Instruct-2507\",\n * \"Write a haiku.\",\n * { maxNewTokens: 64, temperature: 0.7 },\n * )) {\n * process.stdout.write(chunk.text_delta);\n * if (chunk.done) console.log(`\\nTTFT: ${chunk.ttft_ms}ms`);\n * }\n * ```\n */\n async *streamGenerate(\n model: string,\n prompt: string,\n options: GenerateOptions,\n signal?: AbortSignal,\n ): AsyncGenerator<GenerateChunk, void, undefined> {\n const body: Record<string, unknown> = {\n prompt,\n max_new_tokens: options.maxNewTokens,\n temperature: options.temperature ?? 1.0,\n top_p: options.topP ?? 1.0,\n stream: true,\n };\n if (options.stop !== undefined) body.stop = options.stop;\n\n const safeModel = model.replaceAll(\"/\", \"__\");\n const url = `${this.baseUrl}/v1/generate/${encodeURIComponent(safeModel)}`;\n\n // Routing headers (parallel to generate()) — pool / gpu are passed\n // here even though the SSE handler also reads them from the body\n // for some endpoints, because the gateway looks at headers first.\n const { pool, gpu } = this.parseGpuParam(options.gpu);\n const waitForCapacity = options.waitForCapacity ?? this.defaultWaitForCapacity;\n yield* this.consumeSseStream<GenerateChunk>(\n url,\n body,\n model,\n signal,\n (chunk) => extractGenerateChunkError(chunk),\n { pool, gpu },\n { waitForCapacity },\n );\n }\n\n /**\n * Shared SSE consumption helper for the streaming methods.\n *\n * Performs a pre-stream provisioning retry loop (honoring\n * `waitForCapacity`/`provisionTimeout`), surfaces pre-stream errors via\n * {@link handleError} (so callers see the same `RequestError` /\n * `ServerError` hierarchy as the non-streaming endpoints), then iterates\n * the SSE payloads via {@link parseSseStream}. Each payload is JSON-parsed;\n * if the consumer-supplied `extractError` returns an `SIEStreamError`, the\n * generator throws it instead of yielding the chunk.\n *\n * Retry policy mirrors {@link generate}: only the SAFE pre-execution\n * capacity signals — `202` (provisioning) and `503 MODEL_LOADING` — are\n * retried, and only while `waitForCapacity` is set and the provision\n * budget remains. Once the body opens we never retry (the call is\n * non-idempotent; a mid-stream failure must not re-issue generation).\n *\n * @internal\n */\n private async *consumeSseStream<T>(\n url: string,\n body: unknown,\n model: string,\n signal: AbortSignal | undefined,\n extractError: (chunk: T) => SIEStreamError | null,\n routing?: { pool?: string; gpu?: string },\n provisioning?: { waitForCapacity?: boolean },\n ): AsyncGenerator<T, void, undefined> {\n const headers = this.buildChatHeaders(\"text/event-stream\");\n if (routing?.pool) headers[\"X-SIE-Pool\"] = routing.pool;\n if (routing?.gpu) headers[\"X-SIE-MACHINE-PROFILE\"] = routing.gpu;\n const waitForCapacity = provisioning?.waitForCapacity ?? this.defaultWaitForCapacity;\n const gpu = routing?.gpu;\n\n // Compose the caller's signal with our internal timeout-controller so\n // both can cancel the fetch. We use a fresh controller per call so\n // multiple concurrent streams don't share state.\n const controller = new AbortController();\n const onCallerAbort = () => controller.abort();\n if (signal) {\n if (signal.aborted) {\n throw new SIEConnectionError(\"Stream aborted before request\", \"other\");\n }\n signal.addEventListener(\"abort\", onCallerAbort, { once: true });\n }\n\n try {\n const startTime = Date.now();\n let response: Response | undefined;\n\n // Pre-stream provisioning retry loop. We re-fetch on the SAFE\n // pre-execution capacity signals only (202 / 503 MODEL_LOADING),\n // parallel to `generate()`. The loop terminates by `break`-ing on a\n // 200 (the only status that opens a body) or by throwing.\n while (true) {\n if (signal?.aborted) {\n throw new SIEConnectionError(\"Stream aborted before request\", \"other\");\n }\n // Pre-stream timeout only — once the body starts flowing we rely on\n // inter-chunk timeouts on the gateway side (`sse.rs` has its own\n // three-tier taxonomy). Setting `this.timeout` for the whole stream\n // would cap long generations at 30s. A fresh per-attempt timeout\n // covers each pre-stream fetch.\n const preStreamTimeoutId = setTimeout(() => controller.abort(), this.timeout);\n let attemptResponse: Response;\n try {\n attemptResponse = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n } catch (error) {\n if (signal?.aborted) {\n throw new SIEConnectionError(\"Stream aborted before response\", \"other\");\n }\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new SIEConnectionError(`Stream open 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(preStreamTimeoutId);\n }\n\n // BUG 13a: `Response.ok` is true for 202, so the old `!response.ok`\n // gate let a 202 slip through to `response.body` (null) and throw a\n // misleading \"no body\" RequestError. Handle 202 explicitly as the\n // provisioning path (retry under `waitForCapacity`, else throw\n // ProvisioningError honoring Retry-After).\n if (attemptResponse.status === HTTP_ACCEPTED) {\n if (!waitForCapacity) {\n throw new ProvisioningError(\n \"No capacity available. Server is provisioning.\",\n gpu,\n getRetryAfter(attemptResponse),\n );\n }\n const elapsed = Date.now() - startTime;\n if (elapsed >= this.provisionTimeout) {\n throw new ProvisioningError(\n `Provisioning timeout after ${elapsed}ms`,\n gpu,\n getRetryAfter(attemptResponse),\n );\n }\n const delay = getRetryAfter(attemptResponse) ?? DEFAULT_RETRY_DELAY;\n // Abortable: a long Retry-After sleep must yield promptly if the\n // caller aborts (`controller.signal` fires on caller-abort), not\n // wait out the full delay before the next loop's abort check.\n if (\n await abortableSleep(\n Math.min(delay, this.provisionTimeout - elapsed),\n controller.signal,\n )\n ) {\n throw new SIEConnectionError(\"Stream aborted while provisioning\", \"other\");\n }\n continue;\n }\n\n // 502 MODEL_LOAD_FAILED is terminal — surface immediately.\n await throwIfModelLoadFailed(attemptResponse, model);\n\n // BUG 13b: retry 503 MODEL_LOADING (a SAFE pre-execution signal)\n // when the caller opted into waiting for capacity, parallel to\n // `generate()`. Without `waitForCapacity` we fall through to\n // `handleError` and reject immediately (no retry).\n if (attemptResponse.status === 503) {\n const errorCode = await getErrorCode(attemptResponse.clone());\n if (errorCode === MODEL_LOADING_ERROR_CODE && waitForCapacity) {\n const elapsed = Date.now() - startTime;\n if (elapsed >= this.provisionTimeout) {\n throw new ModelLoadingError(`Model loading timeout for '${model}'`, model);\n }\n const delay = getRetryAfter(attemptResponse) ?? MODEL_LOADING_DEFAULT_DELAY;\n if (\n await abortableSleep(\n Math.min(delay, this.provisionTimeout - elapsed),\n controller.signal,\n )\n ) {\n throw new SIEConnectionError(\"Stream aborted while provisioning\", \"other\");\n }\n continue;\n }\n // Generic 503 (scale-from-zero: no / non-MODEL_LOADING error code).\n // Retry under `waitForCapacity`, mirroring non-streaming\n // `generate()`. This is still a SAFE pre-execution signal — the\n // body has not started, so no partial generation is at risk — so\n // the non-idempotency reasoning (never retry a mid-stream failure)\n // is preserved.\n if (waitForCapacity) {\n const elapsed = Date.now() - startTime;\n if (elapsed < this.provisionTimeout) {\n const delay = getRetryAfter(attemptResponse) ?? DEFAULT_RETRY_DELAY;\n if (\n await abortableSleep(\n Math.min(delay, this.provisionTimeout - elapsed),\n controller.signal,\n )\n ) {\n throw new SIEConnectionError(\"Stream aborted while provisioning\", \"other\");\n }\n continue;\n }\n }\n }\n\n // Any remaining non-200 is an error: don't rely on `!response.ok`\n // (which would also be false for the already-handled 202).\n if (attemptResponse.status !== 200) {\n await handleError(attemptResponse);\n }\n\n response = attemptResponse;\n break;\n }\n\n if (!response) {\n throw new RequestError(\"Streaming request failed without producing a response\");\n }\n this.checkServerVersion(response);\n\n const bodyStream = response.body;\n if (!bodyStream) {\n throw new RequestError(\"Streaming response has no body\");\n }\n const reader = bodyStream.getReader();\n for await (const payload of parseSseStream(reader, signal ?? controller.signal)) {\n let chunk: T;\n try {\n chunk = JSON.parse(payload) as T;\n } catch (err) {\n throw new RequestError(\n `Failed to parse SSE chunk as JSON: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n const streamErr = extractError(chunk);\n if (streamErr) throw streamErr;\n yield chunk;\n }\n } finally {\n if (signal) signal.removeEventListener(\"abort\", onCallerAbort);\n }\n }\n\n /**\n * Build the standard JSON header set for the chat-completions surface.\n * Pulled out so both the streaming and non-streaming paths agree on\n * auth / version / content-type wiring.\n */\n private buildChatHeaders(\n accept: \"application/json\" | \"text/event-stream\",\n ): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: accept,\n \"Content-Type\": JSON_CONTENT_TYPE,\n [SDK_VERSION_HEADER]: SDK_VERSION,\n };\n if (this.apiKey) headers.Authorization = `Bearer ${this.apiKey}`;\n return headers;\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 if (options.adapterOptions !== undefined) {\n params.options = options.adapterOptions;\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 or update 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 - Optional machine profile requirements for pool readiness, e.g., { \"l4\": 2, \"l4-spot\": 1 }\n * @param gpuCaps - Optional maximum assigned workers per machine profile\n *\n * @example\n * ```typescript\n * // Create or update 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(\n name: string,\n gpus?: Record<string, number>,\n gpuCaps?: Record<string, number>,\n ): Promise<void> {\n const alreadyTracking = this.pools.has(name);\n\n // Build pool creation request\n const requestBody: {\n name: string;\n gpus?: Record<string, number>;\n gpu_caps?: Record<string, number>;\n } = {\n name,\n };\n if (gpus !== undefined) {\n requestBody.gpus = gpus;\n }\n if (gpuCaps) {\n requestBody.gpu_caps = gpuCaps;\n }\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 if (alreadyTracking || this.pools.has(name)) {\n return;\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 {\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>; gpu_caps?: 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 // Short-circuit terminal load failures (sie-test#85). The server\n // emits 502 MODEL_LOAD_FAILED for permanent classes (gated repos,\n // missing dependencies, unrecognised architectures); we must\n // surface the error immediately rather than burn the\n // MODEL_LOADING retry budget on a known-bad config.\n await throwIfModelLoadFailed(response, model);\n\n // Short-circuit token-budget overruns (#849).\n await throwIfInputTooLong(response, model);\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 WebSocket(url);\n }\n // In Node, `WebSocket` resolves to the `ws` package which accepts\n // a third `{ headers }` options argument. In browsers, the native\n // WebSocket only takes `(url, protocols)` and the third arg is\n // silently dropped. Use `Reflect.construct` with a runtime args\n // array so the call site doesn't statically appear to pass\n // superfluous trailing arguments to the lib.dom WebSocket type.\n const args: unknown[] = [url, [], { headers }];\n return Reflect.construct(WebSocket, args) as WebSocket;\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 * Advertised model capabilities.\n *\n * Mirrors the gateway `capabilities` object on each `/v1/models` entry\n * (`ModelCapabilitiesWire`). All fields are optional; their presence\n * depends on what the model config declares. `grammar` lists the\n * supported grammar kinds (\"json_schema\" | \"regex\" | \"ebnf\").\n * `code`/`sql`/`guard` are informational flags advertising validated\n * generation jobs that back the model=\"code\"/\"sql\"/\"guard\" aliases.\n *\n * These flags mean the model *supports* a task — they are NOT a\n * precision-independent quality SLA. A flag is true at the model level even\n * when quality is profile/precision-dependent (e.g. `sql` quality regresses\n * under FP8; route SQL-critical traffic to a BF16 bundle via the `sql` alias).\n */\nexport interface ModelCapabilities {\n /** Supported grammar kinds: [\"json_schema\", \"regex\", \"ebnf\"] */\n grammar?: string[];\n /** Whether the model supports tool / function calling */\n tools?: boolean;\n /** Union of LoRA served-names across profiles (display summary) */\n lora_adapters?: string[];\n /** Per-profile LoRA served-names, keyed by profile name */\n profile_lora_adapters?: Record<string, string[]>;\n /** Validated for code generation; backs model=\"code\" */\n code?: boolean;\n /** Supports text-to-SQL; backs model=\"sql\". Precision-sensitive (FP8 regresses SQL) — a support flag, not a per-profile quality guarantee. */\n sql?: boolean;\n /** Generative guard model; backs model=\"guard\" */\n guard?: boolean;\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 /** Advertised model capabilities (grammar, tools, code/sql/guard, LoRA adapters) */\n capabilities?: ModelCapabilities;\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 /** Canonical machine profiles configured in the cluster */\n configuredGpuTypes: string[];\n /** Machine profiles 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/machineProfile\") */\n name: string;\n /** Machine profile requirements for pool readiness, e.g., { l4: 2, \"a100-40gb\": 1 } */\n gpus?: Record<string, number>;\n /** Optional maximum assigned workers per machine profile */\n gpuCaps?: Record<string, number>;\n /** Optional maximum assigned workers per machine profile, as returned by the gateway */\n gpu_caps?: 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>; gpu_caps?: 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// Generation\n// ---------------------------------------------------------------------------\n\n/** Reason the generation terminated. */\nexport type FinishReason = \"stop\" | \"length\" | \"cancelled\" | \"content_filter\" | \"error\";\n\n/** Token usage for a single generation call. */\nexport interface GenerationUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\n/** Options for the generate operation. */\nexport interface GenerateOptions {\n /** Hard cap on output tokens. Required. */\n maxNewTokens: number;\n /** Sampling temperature. */\n temperature?: number;\n /** Nucleus sampling cutoff. */\n topP?: number;\n /** Optional list of stop strings. */\n stop?: string[];\n /** GPU type / pool spec, e.g. ``\"l4\"`` or ``\"eval-bench/l4\"``. */\n gpu?: string;\n /** Auto-retry under provisioning. */\n waitForCapacity?: boolean;\n}\n\n/** Aggregated generation result. */\nexport interface GenerateResult {\n /** Model id the gateway dispatched to. */\n model: string;\n /** Full generated text (concatenation of all streamed deltas). */\n text: string;\n /** Termination reason. */\n finishReason: FinishReason;\n /** Prompt / completion / total token counts. */\n usage: GenerationUsage;\n /** Worker-generated attempt id. */\n attemptId?: string;\n /** Time-to-first-token in milliseconds. */\n ttftMs?: number;\n /** Average time per output token in milliseconds. */\n tpotMs?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Chat completions (OpenAI-compatible) — /v1/chat/completions\n// ---------------------------------------------------------------------------\n\n/**\n * A single message in a chat completion request.\n *\n * Accepted roles: `system`, `user`, `assistant`, `tool`, `developer`. The\n * gateway normalises `developer` → `system` before forwarding to the worker\n * (the OpenAI 2024-08 rename — most chat templates only have `system`).\n *\n * `content` may be a string OR an array of typed content parts. The gateway\n * concatenates `text` / `input_text` parts; `image_url` / `input_image` parts\n * are rejected with `400 unsupported_field` because no vision-capable\n * generation model is configured today (the contract is forward-ready). See\n * `packages/sie_gateway/src/openapi.rs` and `proxy.rs::chat_params_from_json`\n * for the canonical accepted subset.\n */\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\" | \"developer\";\n content: string | ChatContentPart[] | null;\n name?: string;\n /** Required when `role === \"tool\"`. */\n tool_call_id?: string;\n /** Populated by the model when calling tools (assistant turns only). */\n tool_calls?: ToolCall[];\n}\n\n/**\n * One content part inside a multimodal `messages[*].content` array. Only the\n * text variants are accepted today; image parts are declared so callers can\n * see the rejection at the type layer instead of at runtime.\n */\nexport type ChatContentPart = { type: \"text\"; text: string } | { type: \"input_text\"; text: string };\n\n/** A tool call emitted by the model. */\nexport interface ToolCall {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n}\n\n/** A tool the model is allowed to call. */\nexport interface ToolSpec {\n type: \"function\";\n function: {\n name: string;\n description?: string;\n /** JSON Schema describing the function arguments. */\n parameters?: Record<string, unknown>;\n };\n}\n\n/** Tool-routing directive. */\nexport type ToolChoice =\n | \"auto\"\n | \"none\"\n | \"required\"\n | { type: \"function\"; function: { name: string } };\n\n/** Structured-output `response_format` envelope. */\nexport interface ResponseFormat {\n type: \"json_schema\" | \"json_object\" | \"text\";\n /** JSON Schema body when `type === \"json_schema\"`. */\n json_schema?: unknown;\n}\n\n/** OpenAI-compatible chat-completion finish reason. */\nexport type ChatFinishReason = \"stop\" | \"length\" | \"tool_calls\" | \"content_filter\" | null;\n\n/**\n * Request body for `chatCompletions` / `streamChatCompletions`.\n *\n * Field names are snake_case (the wire shape) so the SDK can hand the object\n * to `JSON.stringify` without further translation. SIE-specific routing\n * fields (`routing_key`, `prompt_cache_key`) match the gateway schema in\n * `packages/sie_gateway/src/openapi.rs`.\n *\n * The gateway honours: `model`, `messages`, `max_tokens` /\n * `max_completion_tokens`, `temperature`, `top_p`, `top_k`, `stop`, `stream`,\n * `stream_options`, `tools`, `tool_choice`, `parallel_tool_calls`,\n * `response_format`, `frequency_penalty`, `presence_penalty` (each in\n * `[-2, 2]`), `repetition_penalty`, `n`, `best_of`, `logprobs`,\n * `top_logprobs`, `logit_bias`, `seed`, `user`, `safety_identifier`,\n * `lora_adapter`, `routing_key`, and `prompt_cache_key`. Unknown fields\n * are rejected with `400 unsupported_field`.\n */\nexport interface ChatCompletionRequest {\n model: string;\n messages: ChatMessage[];\n /** Legacy alias; the gateway prefers `max_completion_tokens` when both set. */\n max_tokens?: number;\n max_completion_tokens?: number;\n temperature?: number;\n top_p?: number;\n /**\n * Non-OpenAI sampling knob (vLLM / SGLang). Integer `>= 1`; absent →\n * sampler default (top-k disabled).\n */\n top_k?: number;\n /**\n * Non-OpenAI repetition penalty (SGLang). Float in `(0.0, 2.0]`; `1.0`\n * means no penalty. Absent → sampler default.\n */\n repetition_penalty?: number;\n /** Single stop string or list of stop strings. */\n stop?: string | string[];\n /** Set to `true` to use `streamChatCompletions`. `chatCompletions` rejects this. */\n stream?: boolean;\n /** Streaming-only: ask the server to emit a final usage-only chunk before `[DONE]`. */\n stream_options?: { include_usage?: boolean };\n tools?: ToolSpec[];\n tool_choice?: ToolChoice;\n /** OpenAI parallel-tool-calls toggle (default `true`). */\n parallel_tool_calls?: boolean;\n response_format?: ResponseFormat;\n /** Accepted in the OpenAI range [-2, 2]; out-of-range values are rejected. */\n frequency_penalty?: number;\n presence_penalty?: number;\n /**\n * Multi-candidate count. Default `1`. `n > 1 && stream === true` is\n * rejected by the gateway with 400.\n */\n n?: number;\n /**\n * Generate this many candidates and return the top `n` by cumulative\n * logprob. Range `[1, 128]`; requires `best_of >= n` and `stream: false`.\n */\n best_of?: number;\n /**\n * `true` requests per-token log-probabilities on each chunk / on the\n * aggregate response. Required when `top_logprobs > 0`.\n */\n logprobs?: boolean;\n /**\n * How many alternate-token logprobs to return per position. Range\n * `[0, 20]` per the OpenAI spec; implies `logprobs: true` when `> 0`.\n */\n top_logprobs?: number;\n /**\n * `{token_id: bias_float}` map. Gateway validates per-value range\n * `[-100, 100]` and caps map size.\n */\n logit_bias?: Record<string, number>;\n seed?: number;\n /**\n * OpenAI's free-text end-user identifier. Accepted and logged at debug\n * level by the gateway.\n */\n user?: string;\n /**\n * OpenAI's free-text safety-tier identifier (replacement for `user` on\n * safety-sensitive accounts). Accepted but intentionally not logged.\n */\n safety_identifier?: string;\n /**\n * Multi-LoRA: served-name of the adapter to apply on the worker (SIE\n * extension). Must be a non-empty string; unknown names are rejected by\n * the gateway with 400 `unknown_lora`.\n */\n lora_adapter?: string;\n /** SIE-native routing affinity hint. */\n routing_key?: string;\n /** SIE-native prompt-cache hint. */\n prompt_cache_key?: string;\n}\n\n/** Token usage block (snake_case, matches the wire shape). */\nexport interface ChatUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n}\n\n/** A single choice in a `ChatCompletion` (non-streaming). */\nexport interface ChatChoice {\n index: number;\n message: ChatMessage;\n finish_reason: ChatFinishReason;\n logprobs: null;\n}\n\n/** Non-streaming response from `chatCompletions`. */\nexport interface ChatCompletion {\n id: string;\n object: \"chat.completion\";\n created: number;\n model: string;\n system_fingerprint: string | null;\n choices: ChatChoice[];\n usage: ChatUsage;\n}\n\n/** Incremental delta emitted on each streaming chunk. */\nexport interface ChatDelta {\n /** First chunk only, per the OpenAI streaming contract. */\n role?: \"assistant\";\n content?: string;\n tool_calls?: ToolCallDelta[];\n}\n\n/** Partial tool-call materialised across multiple streaming chunks. */\nexport interface ToolCallDelta {\n index: number;\n id?: string;\n type?: \"function\";\n function?: { name?: string; arguments?: string };\n}\n\n/** A single choice in a streaming `ChatCompletionChunk`. */\nexport interface ChatChunkChoice {\n index: number;\n delta: ChatDelta;\n finish_reason: ChatFinishReason;\n logprobs: null;\n}\n\n/**\n * One SSE event from `streamChatCompletions`.\n *\n * The terminal-usage chunk (emitted when `stream_options.include_usage` is\n * `true`) sets `choices: []` and populates `usage`.\n */\nexport interface ChatCompletionChunk {\n id: string;\n object: \"chat.completion.chunk\";\n created: number;\n model: string;\n system_fingerprint: string | null;\n choices: ChatChunkChoice[];\n usage?: ChatUsage;\n}\n\n/**\n * Per-call options for `chatCompletions` controlling the pre-execution\n * provisioning / retry loop. The request body itself is the separate\n * {@link ChatCompletionRequest} argument; these knobs only govern HOW the\n * SDK talks to the gateway, not WHAT it asks for.\n *\n * All fields are optional and fall back to the client-level defaults\n * (`waitForCapacity`, `provisionTimeout`) when omitted.\n */\nexport interface ChatCompletionOptions {\n /**\n * When `true`, retry the SAFE pre-execution capacity signals\n * (`202 Accepted`, `503 MODEL_LOADING`, generic `503`) until\n * `provisionTimeoutMs` elapses. When `false`, the first such signal\n * throws (`ProvisioningError` / `ModelLoadingError` / `ServerError`).\n * Defaults to the client's `waitForCapacity` (false unless the\n * constructor opted in).\n */\n waitForCapacity?: boolean;\n /**\n * Total cumulative wall-clock budget (ms) for provisioning retries.\n * Independent of the per-attempt `timeout`. Defaults to the client's\n * `provisionTimeout` (typically 5 minutes).\n */\n provisionTimeoutMs?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Streaming generate — /v1/generate/{model} with stream:true\n// ---------------------------------------------------------------------------\n\n/**\n * One SSE event from `streamGenerate`.\n *\n * SIE-native shape — see `packages/sie_gateway/src/handlers/sse.rs`\n * (`build_generate_chunk_event`). `usage` and `ttft_ms` only land on the\n * terminal chunk; `error` is populated when generation failed mid-stream\n * (handled by throwing `SIEStreamError`, never yielded).\n */\nexport interface GenerateChunk {\n request_id: string;\n seq: number;\n text_delta: string;\n done: boolean;\n finish_reason?: \"stop\" | \"length\" | \"cancelled\" | \"error\";\n usage?: ChatUsage;\n /** Time-to-first-token, milliseconds. Terminal chunk only. */\n ttft_ms?: number;\n /** Populated when the worker / gateway errored mid-stream. */\n error?: { code: string; message: string };\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 * Adapter-specific runtime options forwarded to the server as\n * `params.options`. Used for adapter knobs that aren't part of the\n * core extract API — e.g. `{ overflow_policy: \"error\" }` for\n * gliclass token-budget control. Mirrors the Python SDK's `options`\n * keyword argument.\n */\n adapterOptions?: Record<string, unknown>;\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 * 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 */\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 * 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"]}
|