@superlinked/sie-sdk 0.6.20 → 0.6.22
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 +139 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +118 -13
- package/dist/index.d.ts +118 -13
- package/dist/index.js +139 -19
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/images.ts","../src/internal/constants.ts","../src/msgpack.ts","../src/internal/retry.ts","../src/internal/parsing.ts","../src/internal/provisioning.ts","../src/jobs.ts","../src/sse.ts","../src/version.ts","../src/client.ts","../src/types.ts","../src/encoding.ts","../src/scoring.ts"],"names":["buffer","getRetryAfter","vector","sleep","options"],"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 503 with PROVISIONING code\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 when the server has exhausted its OOM-recovery strategies.\n *\n * Raised when:\n * - Server returns 503 with RESOURCE_EXHAUSTED code\n * - SDK retry limit is exceeded (or the next backoff would exhaust the\n * provision-timeout budget)\n *\n * Subclass of {@link ServerError} so callers that already catch\n * `ServerError` continue to behave correctly; new code can catch\n * `ResourceExhaustedError` specifically to react to sustained GPU\n * pressure (e.g., back off, route elsewhere, scale up). Mirrors the\n * Python SDK's `ResourceExhaustedError`.\n */\nexport class ResourceExhaustedError extends ServerError {\n /** The model that was requested */\n readonly model: string | undefined;\n /** Number of retry attempts made before giving up */\n readonly retries: number;\n\n constructor(message: string, options?: { model?: string; retries?: number }) {\n super(message, \"RESOURCE_EXHAUSTED\", 503);\n this.name = \"ResourceExhaustedError\";\n this.model = options?.model;\n this.retries = options?.retries ?? 0;\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 * 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","/**\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_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;\nexport const HTTP_GATEWAY_TIMEOUT = 504;\n\n// Default timeouts and delays\nexport const DEFAULT_TIMEOUT = 30_000; // 30 seconds\n// Floor for long-running POSTs (jobs.submit / files.upload / batches.create) so\n// a large upload / connector preflight / batch creation does not abort while the\n// server keeps working. Matches the Python SDK's 120s floor.\nexport const DEFAULT_LONG_RUNNING_TIMEOUT = 120_000; // 2 minutes\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// jobs.wait() polling — mirrors the Python SDK's jobs.wait defaults.\nexport const DEFAULT_JOB_WAIT_TIMEOUT = 600_000; // 10 minutes\nexport const DEFAULT_JOB_WAIT_POLL = 2_000; // 2 seconds\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\nexport const PROVISIONING_ERROR_CODE = \"PROVISIONING\"; // Error code from gateway provisioning\n\n// RESOURCE_EXHAUSTED (server-side OOM) retry settings — mirror the Python SDK\n// (packages/sie_sdk/src/sie_sdk/client/_shared.py).\nexport const RESOURCE_EXHAUSTED_MAX_RETRIES = 3; // Max bounded retries\nexport const RESOURCE_EXHAUSTED_DEFAULT_DELAY = 5_000; // Base backoff (ms)\nexport const RESOURCE_EXHAUSTED_MAX_DELAY = 30_000; // Backoff ceiling (ms)\nexport const RESOURCE_EXHAUSTED_ERROR_CODE = \"RESOURCE_EXHAUSTED\"; // 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 {\n DEFAULT_MAX_RETRY_DELAY,\n DEFAULT_RETRY_DELAY,\n RESOURCE_EXHAUSTED_DEFAULT_DELAY,\n RESOURCE_EXHAUSTED_MAX_DELAY,\n} from \"./constants.js\";\n\nconst RETRY_JITTER_FRACTION = 0.25;\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 * Apply bounded downward jitter to a fixed retry delay.\n *\n * The jittered value is drawn from [delay * 0.75, delay], so it never\n * exceeds the caller's existing timeout cap. A zero Retry-After hint\n * remains an immediate retry.\n */\nexport function applyRetryJitter(delay: number): number {\n if (delay <= 0) return Math.max(delay, 0);\n const low = delay * (1 - RETRY_JITTER_FRACTION);\n return Math.max(0, low + Math.random() * (delay - low));\n}\n\n/**\n * Compute the next sleep interval (ms) for a `503 RESOURCE_EXHAUSTED` retry.\n *\n * Mirrors the Python SDK's `compute_oom_backoff`: a first-retry\n * `Retry-After` hint is honoured verbatim (capped at `maxDelay`, no\n * jitter — the server gave an explicit instruction); subsequent retries\n * use bounded exponential backoff, `max(baseDelay, retryAfter) * 2**attempt`\n * capped at `maxDelay`, with bounded downward jitter so a fleet of clients\n * evicted by the same OOM event does not retry in lockstep. Always returns\n * a value in `[0, maxDelay]`.\n *\n * @param retryAfter - Parsed `Retry-After` hint in milliseconds, if any\n * @param attempt - 0-indexed retry number (0 = first retry)\n */\nexport function computeOomBackoff(\n retryAfter: number | undefined,\n attempt: number,\n baseDelay: number = RESOURCE_EXHAUSTED_DEFAULT_DELAY,\n maxDelay: number = RESOURCE_EXHAUSTED_MAX_DELAY,\n): number {\n // Defensive floor: a negative Retry-After (malformed upstream) must not\n // produce a negative sleep.\n const safeRetryAfter = retryAfter !== undefined ? Math.max(retryAfter, 0) : undefined;\n if (safeRetryAfter !== undefined && attempt === 0) {\n return Math.min(safeRetryAfter, maxDelay);\n }\n // `max(...)`: a zero hint falls back to `baseDelay`, and a hint above\n // `baseDelay` keeps the schedule non-decreasing (see the Python SDK's\n // `compute_oom_backoff` for the full rationale).\n const base = safeRetryAfter !== undefined ? Math.max(baseDelay, safeRetryAfter) : baseDelay;\n const capped = Math.max(0, Math.min(base * 2 ** attempt, maxDelay));\n return applyRetryJitter(capped);\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_CLIENT_ERROR_MAX,\n HTTP_CLIENT_ERROR_MIN,\n HTTP_SERVER_ERROR_MAX,\n HTTP_SERVER_ERROR_MIN,\n MSGPACK_CONTENT_TYPE,\n PROVISIONING_ERROR_CODE,\n} from \"./constants.js\";\n\nimport { getRetryAfter as getRetryAfterFromHeader } from \"./retry.js\";\n\nconst SIE_ERROR_CODE_HEADER = \"X-SIE-Error-Code\";\n\nfunction normalizeErrorCode(code: string | undefined): string | undefined {\n if (code === \"provisioning\") return PROVISIONING_ERROR_CODE;\n return code;\n}\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 headerCode = response.headers.get(SIE_ERROR_CODE_HEADER);\n if (headerCode) return headerCode;\n\n const detail = await getErrorDetail(response);\n if (!detail) return undefined;\n const code = detail.code;\n return typeof code === \"string\" ? normalizeErrorCode(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``.\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 code = response.headers.get(SIE_ERROR_CODE_HEADER) ?? normalizeErrorCode(code);\n\n if (status === 503 && code === PROVISIONING_ERROR_CODE) {\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 gpu_count?: number;\n ready_gpu_slots?: number;\n healthy: boolean;\n queue_depth: number;\n pending_cost?: number;\n inflight_batches?: 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 gpuCount: w.gpu_count ?? 0,\n readyGpuSlots: w.ready_gpu_slots ?? w.gpu_count ?? (w.healthy ? 1 : 0),\n healthy: w.healthy,\n queueDepth: w.queue_depth,\n pendingCost: w.pending_cost ?? 0,\n inflightBatches: w.inflight_batches ?? 0,\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 * `503` with a known error code (`PROVISIONING`, `MODEL_LOADING` or\n * `RESOURCE_EXHAUSTED`). They both need to retry those SAFE\n * pre-execution signals while honouring a caller-supplied\n * `waitForCapacity` flag plus a `provisionTimeout` budget. A `504` is\n * post-publish and therefore terminal here (non-idempotent generation).\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 {\n ModelLoadingError,\n ProvisioningError,\n RequestError,\n ResourceExhaustedError,\n ServerError,\n} from \"../errors.js\";\nimport {\n DEFAULT_RETRY_DELAY,\n HTTP_GATEWAY_TIMEOUT,\n MODEL_LOADING_DEFAULT_DELAY,\n MODEL_LOADING_ERROR_CODE,\n PROVISIONING_ERROR_CODE,\n RESOURCE_EXHAUSTED_ERROR_CODE,\n RESOURCE_EXHAUSTED_MAX_RETRIES,\n} from \"./constants.js\";\nimport { getErrorCode, getRetryAfter, handleError, throwIfModelLoadFailed } from \"./parsing.js\";\nimport { applyRetryJitter, computeOomBackoff } from \"./retry.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 `503 PROVISIONING` / `503 MODEL_LOADING`\n * until the provision budget is exhausted. When `false`, the first\n * provisioning 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 * Budget check + backoff for one `503 RESOURCE_EXHAUSTED` retry.\n *\n * Mirrors the Python SDK's `_handle_oom_retry`: throws\n * {@link ResourceExhaustedError} when the retry budget is exhausted\n * (`oomRetries >= maxOomRetries`), the provision budget has elapsed, or\n * the next backoff would consume the remaining budget without leaving\n * room for the retried request to run (surfacing the *root cause* now\n * instead of a later \"provisioning timeout\"). Otherwise returns the\n * delay (ms) to sleep before the next attempt.\n *\n * Distinct from MODEL_LOADING: the model is already resident, the\n * request just lost the race for compute resources. This is a SAFE\n * pre-execution signal (the worker rejected the request before running\n * it), so on the buffered paths it is retried regardless of\n * `waitForCapacity`, matching the Python SDK.\n *\n * @internal\n */\nexport function nextOomRetryDelay(opts: {\n retryAfter: number | undefined;\n oomRetries: number;\n maxOomRetries: number;\n elapsedMs: number;\n provisionTimeoutMs: number;\n model: string;\n}): number {\n const { retryAfter, oomRetries, maxOomRetries, elapsedMs, provisionTimeoutMs, model } = opts;\n const message = `Server resource exhausted after ${oomRetries} retry attempt(s) for model '${model}'`;\n if (oomRetries >= maxOomRetries || elapsedMs >= provisionTimeoutMs) {\n throw new ResourceExhaustedError(message, { model, retries: oomRetries });\n }\n const delay = computeOomBackoff(retryAfter, oomRetries);\n if (delay >= provisionTimeoutMs - elapsedMs) {\n throw new ResourceExhaustedError(message, { model, retries: oomRetries });\n }\n return delay;\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 let oomRetries = 0;\n\n while (true) {\n const response = await performFetch();\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 === PROVISIONING_ERROR_CODE) {\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 retryAfter = getRetryAfter(response);\n const delay = retryAfter ?? applyRetryJitter(DEFAULT_RETRY_DELAY);\n await sleep(Math.min(delay, opts.provisionTimeoutMs - elapsed));\n continue;\n }\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 (errorCode === RESOURCE_EXHAUSTED_ERROR_CODE) {\n // Retried regardless of `waitForCapacity` (bounded budget), matching\n // the Python SDK: the signal fires before any generation starts.\n const delay = nextOomRetryDelay({\n retryAfter: getRetryAfter(response),\n oomRetries,\n maxOomRetries: RESOURCE_EXHAUSTED_MAX_RETRIES,\n elapsedMs: Date.now() - startTime,\n provisionTimeoutMs: opts.provisionTimeoutMs,\n model: opts.model,\n });\n oomRetries += 1;\n await sleep(delay);\n continue;\n }\n }\n\n // Do NOT retry 504. A 504 GATEWAY_TIMEOUT is a *post-publish* timeout:\n // the work item is already on the queue and a worker may be — or have\n // finished — generating. Generation is non-idempotent and carries no\n // dedup key, so retrying could issue a SECOND billable generation.\n // The pre-execution 503 signals above remain retryable because those\n // fire before any generation can have started (Python SDK parity).\n if (response.status === HTTP_GATEWAY_TIMEOUT) {\n throw new ServerError(\n \"Gateway timed out (504) after the request was published to the queue; \" +\n \"a worker may already be generating. Not retried because generation is \" +\n \"non-idempotent (retrying could double-bill). Re-issue manually if needed.\",\n await getErrorCode(response.clone()),\n HTTP_GATEWAY_TIMEOUT,\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 * Jobs surface (`client.jobs`) — pure helpers + wire types.\n *\n * The jobs API is the gateway's batch class. `client.jobs.submit(...)` binds to\n * `POST /v1/jobs`; this module owns the transport-free pieces (the\n * `source → operation → sink / when` slot mapping and result decoding) so they\n * mirror the Python SDK's `sie_sdk.jobs`.\n */\n\nimport { RequestError } from \"./errors.js\";\nimport { unpackMessage } from \"./msgpack.js\";\n\n/** Job lifecycle state (queued → running → terminal). */\nexport type JobState = \"queued\" | \"running\" | \"succeeded\" | \"failed\" | \"suspended\" | \"cancelled\";\n\n/** Terminal states with no further transitions (job lifecycle). */\nexport const TERMINAL_JOB_STATES: ReadonlySet<JobState> = new Set([\n \"succeeded\",\n \"failed\",\n \"suspended\",\n \"cancelled\",\n]);\n\n/** One inline input item (the `/v1/encode` item contract: `{text}` / `{id,text}`). */\nexport type JobItem = { text?: string; id?: string } & Record<string, unknown>;\n\n/**\n * A job source: inline items (a list, or a bare string = one text item) or a\n * connector `scheme://<connection>/…` URI.\n */\nexport type JobSource = string | Array<string | JobItem>;\n\n/**\n * The uniform source-mapping slots (wire-shaped, mirroring the Python\n * SDK's dict): `id_field` ≈ `custom_id`, `input_field` ≈ `body.input`,\n * `carry` = source fields echoed to the sink keyed by id, `input_type` pins\n * the item shape. The sink slot rides separately as `outputField`. All\n * optional — per-connector URI params stay as aliases.\n */\nexport interface JobFieldMap {\n id_field?: string;\n input_field?: string;\n carry?: string[];\n input_type?: \"text\" | \"document\";\n}\n\n/** Options for `client.jobs.submit`. */\nexport interface SubmitJobOptions {\n /** Inline items or a connector URI (incl. `upload://<file-id>`). */\n source: JobSource;\n /** Model id (e.g. \"BAAI/bge-m3\"). */\n model: string;\n /** Job operation: encode | score | extract | parse | generate (default \"encode\"). */\n operation?: string;\n /** Sink: \"return\" (default), \"inplace\", or a connector URI. */\n sink?: string | null;\n /** Override the source connection name (default: derived from the URI). */\n connection?: string | null;\n /** Distinct connection name for the sink. */\n sinkConnection?: string | null;\n /** Uniform source mapping (connector jobs only). */\n fieldMap?: JobFieldMap | null;\n /** Sink target (≈ `response.body`; aliases PG `column` / object-store `suffix`). */\n outputField?: string | null;\n /** Trigger: \"now\" (default), \"schedule:<cron>\", or \"watch:<source>\". */\n when?: string | null;\n /** Encode output types (default: dense). */\n outputTypes?: string[];\n /**\n * Per-item options plus the op inputs, forwarded as-is (operation\n * matrix): score → `options.query`, extract → `options.labels` /\n * `options.output_schema`, generate → sampling (e.g. `max_new_tokens`).\n */\n options?: Record<string, unknown> | null;\n}\n\n/** The preflight reservation echoed on submit / status. */\nexport interface JobPreflight {\n estimated_credits?: number;\n estimate_basis?: string;\n}\n\n/** One spawned chunk's settle metadata (`output.chunks[]`; results-as-refs). */\nexport interface JobChunk {\n seq?: number;\n items?: number;\n state?: string;\n ref?: string | null;\n units?: number | null;\n credits?: number | null;\n error?: unknown;\n}\n\n/** The `201` envelope from `POST /v1/jobs` (inline or connector job). */\nexport interface JobSubmitResult {\n id: string;\n object: string;\n operation: string;\n model: string;\n state: JobState;\n total_items?: number;\n chunks?: number;\n preflight?: JobPreflight;\n input_source?: string;\n source?: string;\n sink?: string;\n}\n\n/** A job's public status doc from `GET /v1/jobs/{id}` (refs, never payloads). */\nexport interface JobStatus {\n id: string;\n object: string;\n operation: string;\n model: string;\n state: JobState;\n total_items?: number;\n completed_items?: number;\n preflight?: JobPreflight;\n settled_credits?: number;\n created_at?: number;\n finished_at?: number | null;\n output?: { kind?: string; chunks?: JobChunk[] };\n}\n\n/** One decoded per-item result retrieved from a finished job's chunk refs. */\nexport interface JobResultItem {\n id: string | null;\n success: boolean | null;\n units: unknown;\n dims: number | null;\n dense: number[] | Float32Array | null;\n}\n\n/** A finished job's decoded results — the chunk refs read and unpacked. */\nexport interface JobResults {\n job_id: string;\n state: JobState | undefined;\n total_items: number | undefined;\n settled_credits: number | undefined;\n chunks: JobChunk[];\n retrieved: number;\n dims: number | null;\n items: JobResultItem[];\n}\n\nconst SINK_RETURN = new Set([\"return\", \"default\"]);\nconst SINK_INPLACE = new Set([\"inplace\", \"in_place\", \"in place\"]);\n\n// Internal push-to-us schemes (OUR Files store): no org connection to\n// name, so no `connection`/`sink_connection` is derived from the URI.\nconst INTERNAL_SCHEMES = new Set([\"upload\"]);\n\n// Uniform source-mapping slots (the sink slot is `output_field`).\nconst FIELD_MAP_KEYS = new Set([\"id_field\", \"input_field\", \"carry\", \"input_type\"]);\nconst INPUT_TYPES = new Set([\"text\", \"document\"]);\n\nfunction isConnectorUri(value: string): boolean {\n return value.includes(\"://\");\n}\n\nfunction isInternalUri(uri: string): boolean {\n return INTERNAL_SCHEMES.has(uri.split(\"://\", 1)[0] ?? \"\");\n}\n\nfunction normItem(item: string | JobItem, index: number): JobItem {\n if (typeof item === \"string\") return { text: item };\n if (item !== null && typeof item === \"object\") return item;\n throw new RequestError(`item ${index} must be a string or an object`, \"invalid_request\", 400);\n}\n\n/**\n * Derive a connection name from a connector URI's authority.\n *\n * `postgres://warehouse?query=…` → `warehouse`; `s3://customer-bucket/in/` →\n * `customer-bucket`. Credentials never appear in the call — the job only names\n * the connection; the runner resolves it org-scoped.\n */\nexport function connectionName(uri: string): string {\n // URL can't parse custom schemes reliably; take the authority manually.\n const afterScheme = uri.split(\"://\", 2)[1] ?? \"\";\n const authority = afterScheme.split(/[/?#]/, 1)[0] ?? \"\";\n const name = authority.trim();\n if (!name) {\n throw new RequestError(\n `connector URI ${JSON.stringify(uri)} names no connection (expected 'scheme://<connection>/…')`,\n \"invalid_request\",\n 400,\n );\n }\n return name;\n}\n\nfunction resolveSource(source: JobSource, connection?: string | null): Record<string, unknown> {\n if (Array.isArray(source)) {\n if (source.length === 0) {\n throw new RequestError(\"inline source has no items\", \"invalid_request\", 400);\n }\n return { items: source.map((item, i) => normItem(item, i)) };\n }\n if (isConnectorUri(source)) {\n if (isInternalUri(source)) {\n // Internal scheme (upload:// = OUR Files store): no connection.\n return connection ? { src: source, connection } : { src: source };\n }\n return { src: source, connection: connection ?? connectionName(source) };\n }\n if (typeof source === \"string\" && source.trim()) {\n return { items: [{ text: source }] };\n }\n throw new RequestError(\n \"source must be inline items (a list/string) or a connector URI (scheme://<connection>/…)\",\n \"invalid_request\",\n 400,\n );\n}\n\nfunction resolveSink(\n sink: string | null | undefined,\n sourceConnection: string | undefined,\n sinkConnection: string | null | undefined,\n): Record<string, unknown> {\n if (sink === null || sink === undefined || SINK_RETURN.has(sink.trim().toLowerCase())) {\n return {};\n }\n if (SINK_INPLACE.has(sink.trim().toLowerCase())) {\n return { sink: \"inplace\" };\n }\n if (isConnectorUri(sink)) {\n const body: Record<string, unknown> = { sink };\n if (isInternalUri(sink)) {\n // Internal scheme: OUR Files store, no connection to name.\n if (sinkConnection != null) body.sink_connection = sinkConnection;\n return body;\n }\n const resolved = sinkConnection ?? connectionName(sink);\n // Thread the sink connection when explicitly overridden or distinct from\n // the source's (the common \"index my own store\" case reuses the source).\n if (sinkConnection != null || resolved !== sourceConnection) {\n body.sink_connection = resolved;\n }\n return body;\n }\n throw new RequestError(\n `sink must be 'return', 'inplace', or a connector URI (got ${JSON.stringify(sink)})`,\n \"invalid_request\",\n 400,\n );\n}\n\n/**\n * Validate + map the uniform slots onto the wire fields (`field_map` +\n * `output_field`). Only set fields ride the wire (`/v1` additive-only).\n */\nfunction resolveFieldMap(\n fieldMap: JobFieldMap | null | undefined,\n outputField: string | null | undefined,\n): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n if (fieldMap != null) {\n const unknown = Object.keys(fieldMap).filter((key) => !FIELD_MAP_KEYS.has(key));\n if (unknown.length > 0) {\n throw new RequestError(\n `unknown field_map key(s) ${JSON.stringify(unknown)} (known: ${[...FIELD_MAP_KEYS].join(\", \")})`,\n \"invalid_request\",\n 400,\n );\n }\n if (\n fieldMap.carry != null &&\n (!Array.isArray(fieldMap.carry) || fieldMap.carry.some((c) => typeof c !== \"string\" || !c))\n ) {\n throw new RequestError(\n `field_map.carry must be a list of field names (got ${JSON.stringify(fieldMap.carry)})`,\n \"invalid_request\",\n 400,\n );\n }\n if (fieldMap.input_type != null && !INPUT_TYPES.has(fieldMap.input_type)) {\n throw new RequestError(\n `field_map.input_type must be one of ${[...INPUT_TYPES].join(\", \")} (got ${JSON.stringify(fieldMap.input_type)})`,\n \"invalid_request\",\n 400,\n );\n }\n const mapped: Record<string, unknown> = {};\n if (fieldMap.id_field != null) mapped.id_field = fieldMap.id_field;\n if (fieldMap.input_field != null) mapped.input_field = fieldMap.input_field;\n if (fieldMap.input_type != null) mapped.input_type = fieldMap.input_type;\n if (fieldMap.carry != null && fieldMap.carry.length > 0) mapped.carry = fieldMap.carry;\n if (Object.keys(mapped).length > 0) body.field_map = mapped;\n }\n if (outputField != null) {\n if (typeof outputField !== \"string\" || !outputField) {\n throw new RequestError(\n `output_field must be a non-empty string (got ${JSON.stringify(outputField)})`,\n \"invalid_request\",\n 400,\n );\n }\n body.output_field = outputField;\n }\n return body;\n}\n\nfunction resolveWhen(when: string | null | undefined): Record<string, unknown> {\n if (when == null || when.trim() === \"\" || when.trim().toLowerCase() === \"now\") {\n return {};\n }\n const text = when.trim();\n // Slice off the prefix (not `split(\":\")`, which would drop a value's own colons).\n if (text.toLowerCase().startsWith(\"schedule:\")) {\n return { when: \"schedule\", schedule: text.slice(\"schedule:\".length).trim() };\n }\n if (text.toLowerCase().startsWith(\"watch:\")) {\n return { when: \"watch\", watch: text.slice(\"watch:\".length).trim() };\n }\n if (text.toLowerCase() === \"schedule\") {\n throw new RequestError(\n \"schedule trigger needs a cron expr: when='schedule:<cron>'\",\n \"invalid_request\",\n 400,\n );\n }\n // A bare cron expression (5 whitespace-separated fields) is a schedule.\n if (text.split(/\\s+/).length === 5) {\n return { when: \"schedule\", schedule: text };\n }\n throw new RequestError(\n `unrecognized when ${JSON.stringify(when)}: use 'now', 'schedule:<cron>', or 'watch:<source>'`,\n \"invalid_request\",\n 400,\n );\n}\n\n/**\n * Compose the `POST /v1/jobs` body from the source/op/sink/when slots.\n *\n * A thin, pure mapping: inline `items` or connector `src`/`sink` +\n * connection name, plus an optional trigger. Only the fields that are set ride\n * the wire, so an inline submit is byte-for-byte the realtime POC body and the\n * connector body is additive (`/v1` additive-only rule).\n */\nexport function buildJobBody(options: SubmitJobOptions): Record<string, unknown> {\n const operation = options.operation ?? \"encode\";\n const body: Record<string, unknown> = { operation, model: options.model };\n const sourceFields = resolveSource(options.source, options.connection);\n Object.assign(body, sourceFields);\n Object.assign(\n body,\n resolveSink(\n options.sink,\n sourceFields.connection as string | undefined,\n options.sinkConnection,\n ),\n );\n const mappingFields = resolveFieldMap(options.fieldMap, options.outputField);\n if (Object.keys(mappingFields).length > 0 && !(\"src\" in body)) {\n throw new RequestError(\n \"fieldMap/outputField apply to connector-src jobs; an inline items job maps nothing\",\n \"invalid_request\",\n 400,\n );\n }\n Object.assign(body, mappingFields);\n Object.assign(body, resolveWhen(options.when));\n if (options.outputTypes && options.outputTypes.length > 0) {\n body.output_types = options.outputTypes;\n }\n // Per-item options + op inputs (score query / extract labels / generate\n // sampling), forwarded as-is; an empty map stays off the wire (additive).\n if (options.options && Object.keys(options.options).length > 0) {\n body.options = options.options;\n }\n return body;\n}\n\n/** The chunk-ref metadata from a job status doc (`output.chunks` refs). */\nexport function jobChunks(jobDoc: JobStatus): JobChunk[] {\n const raw = jobDoc.output?.chunks ?? [];\n return raw.map((chunk) => ({\n seq: chunk.seq,\n items: chunk.items,\n state: chunk.state,\n ref: chunk.ref,\n units: chunk.units,\n credits: chunk.credits,\n error: chunk.error ?? null,\n }));\n}\n\nfunction toNumberArrayLike(value: unknown): number[] | Float32Array | null {\n if (value == null) return null;\n if (value instanceof Float32Array) return value;\n if (Array.isArray(value)) return value as number[];\n if (ArrayBuffer.isView(value)) return value as unknown as Float32Array;\n return null;\n}\n\nfunction denseInfo(dense: unknown): {\n dims: number | null;\n vector: number[] | Float32Array | null;\n} {\n if (dense == null) return { dims: null, vector: null };\n if (typeof dense === \"object\" && !Array.isArray(dense) && !ArrayBuffer.isView(dense)) {\n const rec = dense as Record<string, unknown>;\n let raw: unknown = null;\n for (const key of [\"values\", \"vector\", \"dense\"]) {\n if (rec[key] != null) {\n raw = rec[key];\n break;\n }\n }\n const vector = toNumberArrayLike(raw);\n let dims = typeof rec.dims === \"number\" ? rec.dims : null;\n if (dims == null && vector != null) dims = vector.length;\n return { dims, vector };\n }\n const vector = toNumberArrayLike(dense);\n return { dims: vector != null ? vector.length : null, vector };\n}\n\n/** Decode one WorkResult map (from a chunk ref) into a per-item result. */\nexport function decodeResultItem(result: Record<string, unknown>): JobResultItem {\n const payload = result.result_msgpack;\n let decoded: Record<string, unknown> | null = null;\n if (payload instanceof Uint8Array) {\n try {\n decoded = unpackMessage<Record<string, unknown>>(payload);\n } catch {\n decoded = null;\n }\n }\n const dense = decoded && typeof decoded === \"object\" ? decoded.dense : null;\n const { dims, vector } = denseInfo(dense);\n return {\n id: (result.id as string) ?? null,\n success: (result.success as boolean) ?? null,\n units: result.units ?? null,\n dims,\n dense: vector,\n };\n}\n\n/** Decode a chunk ref's msgpack `WorkResult` array into per-item results. */\nexport function decodeChunkBytes(raw: Uint8Array): JobResultItem[] {\n const results = unpackMessage<unknown>(raw);\n if (!Array.isArray(results)) return [];\n return results.map((r) => decodeResultItem(r as Record<string, unknown>));\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.20\"; // 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 ResourceExhaustedError,\n SIEConnectionError,\n SIEStreamError,\n ServerError,\n} from \"./errors.js\";\nimport { toImageWireFormat } from \"./images.js\";\nimport type { ImageInput, ImageWireFormat } from \"./images.js\";\nimport {\n DEFAULT_JOB_WAIT_POLL,\n DEFAULT_JOB_WAIT_TIMEOUT,\n DEFAULT_LEASE_RENEWAL_INTERVAL,\n DEFAULT_LONG_RUNNING_TIMEOUT,\n DEFAULT_PROVISION_TIMEOUT,\n DEFAULT_RETRY_DELAY,\n DEFAULT_TIMEOUT,\n HTTP_CLIENT_ERROR_MIN,\n HTTP_GATEWAY_TIMEOUT,\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 PROVISIONING_ERROR_CODE,\n RESOURCE_EXHAUSTED_ERROR_CODE,\n RESOURCE_EXHAUSTED_MAX_RETRIES,\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 { nextOomRetryDelay, withProvisioningRetry } from \"./internal/provisioning.js\";\nimport { applyRetryJitter } from \"./internal/retry.js\";\nimport {\n type JobResultItem,\n type JobResults,\n type JobStatus,\n type JobSubmitResult,\n type SubmitJobOptions,\n TERMINAL_JOB_STATES,\n buildJobBody,\n decodeChunkBytes,\n jobChunks,\n} from \"./jobs.js\";\nimport { packMessage, unpackMessage } from \"./msgpack.js\";\nimport { parseSseStream } from \"./sse.js\";\nimport type {\n Batch,\n CapacityInfo,\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionOptions,\n ChatCompletionRequest,\n Connection,\n ConnectionCreated,\n ConnectionRevoked,\n CreatePoolOptions,\n EncodeOptions,\n EncodeResult,\n ExtractOptions,\n ExtractResult,\n FileDeleted,\n GenerateChunk,\n GenerateOptions,\n GenerateResult,\n Item,\n ModelInfo,\n PoolInfo,\n PoolSpec,\n SIEClientOptions,\n File as SIEFile,\n ScoreOptions,\n ScoreResult,\n StatusMessage,\n} from \"./types.js\";\nimport { SDK_VERSION } from \"./version.js\";\n\n/** The `client.jobs` batch namespace. */\nexport interface JobsNamespace {\n /** Submit a batch job (`POST /v1/jobs`); returns the created-job envelope. */\n submit(options: SubmitJobOptions): Promise<JobSubmitResult>;\n /** Fetch a job's public status doc (`GET /v1/jobs/{id}`). */\n get(jobId: string): Promise<JobStatus>;\n /** List the org's jobs (`GET /v1/jobs`; scoped to the key's org). */\n list(): Promise<JobStatus[]>;\n /** Cancel a job (`POST /v1/jobs/{id}/cancel`); the hold's remainder releases. */\n cancel(jobId: string): Promise<JobStatus>;\n /** Retrieve a finished job's chunk refs and decode the per-item results. */\n results(jobId: string): Promise<JobResults>;\n /**\n * Poll `get` until the job reaches a terminal state, then return its status.\n * Throws a `job_wait_timeout` `RequestError` if `timeoutMs` elapses first.\n * Mirrors the Python SDK's `jobs.wait` (default 600s timeout, 2s poll).\n */\n wait(jobId: string, options?: { timeoutMs?: number; pollMs?: number }): Promise<JobStatus>;\n}\n\n/** The `client.connections` namespace (org-scoped connector auth). */\nexport interface ConnectionsNamespace {\n /** Create an org-scoped connection (connector auth by name). */\n add(name: string, type: string, secret: string): Promise<ConnectionCreated>;\n /** List the org's active connections (secrets redacted). */\n list(): Promise<Connection[]>;\n /** Revoke (soft-delete) a connection; frees the name for reuse. */\n revoke(name: string): Promise<ConnectionRevoked>;\n}\n\n/** Accepted upload payloads — the same shapes `fetch` sends as a body. */\nexport type FileUploadInput = Uint8Array | ArrayBuffer | string | Blob;\n\n/**\n * The `client.files` OpenAI-compatible Files namespace. Method\n * names/args mirror `openai.files` so an `openai` → `sie-sdk` swap is mechanical.\n */\nexport interface FilesNamespace {\n /** Upload a file (`POST /v1/files`); `purpose` defaults to `\"batch\"`. */\n upload(\n file: FileUploadInput,\n options?: { purpose?: string; filename?: string },\n ): Promise<SIEFile>;\n /** OpenAI-exact alias for {@link upload} (`files.create({ file, purpose })`). */\n create(options: { file: FileUploadInput; purpose?: string; filename?: string }): Promise<SIEFile>;\n /** Fetch a file's metadata (`GET /v1/files/{id}`). */\n retrieve(fileId: string): Promise<SIEFile>;\n /** Download a file's raw bytes (`GET /v1/files/{id}/content`). */\n content(fileId: string): Promise<Uint8Array>;\n /** Delete a file (`DELETE /v1/files/{id}`; additive OpenAI-parity surface). */\n delete(fileId: string): Promise<FileDeleted>;\n}\n\n/**\n * The `client.batches` OpenAI-compatible Batch namespace. A\n * batch is a job over an uploaded file's JSONL lines;\n * `list` / `cancel` are the additive OpenAI-parity completion of the surface.\n * Args are OpenAI's exact snake_case body keys, so an `openai` → `sie-sdk` swap\n * is mechanical.\n */\nexport interface BatchesNamespace {\n /** Create a batch (`POST /v1/batches`); returns the Batch object. */\n create(options: {\n input_file_id: string;\n endpoint?: string;\n completion_window?: string;\n metadata?: Record<string, unknown>;\n }): Promise<Batch>;\n /** Fetch a batch's status (`GET /v1/batches/{id}`). */\n retrieve(batchId: string): Promise<Batch>;\n /** List the org's batches (`GET /v1/batches`; additive OpenAI-parity). */\n list(): Promise<Batch[]>;\n /** Cancel a batch (`POST /v1/batches/{id}/cancel`; additive OpenAI-parity). */\n cancel(batchId: string): Promise<Batch>;\n}\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/** Derive an upload filename: an explicit override > a File/Blob `.name` > default. */\nfunction resolveUploadFilename(file: FileUploadInput, filename?: string): string {\n if (filename) return filename;\n const name = (file as { name?: unknown }).name;\n if (typeof name === \"string\" && name.length > 0) {\n // A File's `.name` may include a path; keep just the basename.\n return name.split(/[/\\\\]/).pop() || \"upload.jsonl\";\n }\n return \"upload.jsonl\";\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\ntype ItemWithWireImages = Omit<Item, \"images\"> & { images?: ImageWireFormat[] };\ntype ItemForWire = Item | ItemWithWireImages;\n\nfunction isImageWireFormat(image: ImageInput | ImageWireFormat): image is ImageWireFormat {\n return typeof image === \"object\" && image !== null && \"data\" in image;\n}\n\nasync function imageForWire(image: ImageInput | ImageWireFormat): Promise<ImageWireFormat> {\n if (isImageWireFormat(image)) {\n return image;\n }\n return toImageWireFormat(image);\n}\n\nasync function itemImagesForWire(item: Item): Promise<ItemForWire> {\n if (!item.images || item.images.length === 0) {\n return item;\n }\n return { ...item, images: await Promise.all(item.images.map(imageForWire)) };\n}\n\nasync function itemsImagesForWire(items: Item[]): Promise<ItemForWire[]> {\n return Promise.all(items.map(itemImagesForWire));\n}\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 logical pool backed by the cluster's default worker queue\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 private readonly controlPlaneUrl?: string;\n private readonly org?: string;\n\n /** Batch class — `POST/GET /v1/jobs` on the keyed gateway. */\n readonly jobs: JobsNamespace;\n /** Org-scoped connections (connector auth by name) on the control plane. */\n readonly connections: ConnectionsNamespace;\n /** OpenAI-compatible Files API — `POST/GET /v1/files`. */\n readonly files: FilesNamespace;\n /** OpenAI-compatible Batch API — `POST/GET /v1/batches`. */\n readonly batches: BatchesNamespace;\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 // BREAKING CHANGE (0.7): default flipped from `false` to `true` to match\n // the Python SDK (`wait_for_capacity=True`). Callers that relied on\n // fail-fast 503 PROVISIONING / connect-error behaviour must now pass\n // `waitForCapacity: false` explicitly.\n this.defaultWaitForCapacity = options.waitForCapacity ?? true;\n this.provisionTimeout = options.provisionTimeout ?? DEFAULT_PROVISION_TIMEOUT;\n this.controlPlaneUrl = options.controlPlaneUrl?.replace(/\\/$/, \"\");\n this.org = options.org;\n\n // First-class batch + connector surface.\n this.jobs = {\n submit: (submitOptions) => this.jobSubmit(submitOptions),\n get: (jobId) => this.jobGet(jobId),\n list: () => this.jobList(),\n cancel: (jobId) => this.jobCancel(jobId),\n results: (jobId) => this.jobResults(jobId),\n wait: (jobId, options) => this.jobWait(jobId, options),\n };\n this.connections = {\n add: (name, type, secret) => this.connectionAdd(name, type, secret),\n list: () => this.connectionList(),\n revoke: (name) => this.connectionRevoke(name),\n };\n // OpenAI-compatible Files + Batches surface — a base_url\n // swap makes an `openai` batch caller work unchanged.\n this.files = {\n upload: (file, options) => this.fileUpload(file, options),\n create: (options) => this.fileUpload(options.file, options),\n retrieve: (fileId) => this.fileRetrieve(fileId),\n content: (fileId) => this.fileContent(fileId),\n delete: (fileId) => this.fileDelete(fileId),\n };\n this.batches = {\n create: (options) => this.batchCreate(options),\n retrieve: (batchId) => this.batchRetrieve(batchId),\n list: () => this.batchList(),\n cancel: (batchId) => this.batchCancel(batchId),\n };\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 const itemsForWire = await itemsImagesForWire(itemsArray);\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: itemsForWire,\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 (503 PROVISIONING / 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 (503 PROVISIONING /\n // MODEL_LOADING) MUST be handled by the shared provisioning loop.\n // The loop also surfaces `ProvisioningError` when the caller opted out\n // (`waitForCapacity: false`) or the provision budget is exhausted,\n // 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 explicit SAFE\n * pre-execution capacity signals — `503 PROVISIONING`,\n * `503 MODEL_LOADING` and `503 RESOURCE_EXHAUSTED` (the latter only\n * under `waitForCapacity`) — are retried while the provision budget\n * remains; a `504` is post-publish and therefore terminal.\n * Once the body opens we never retry (the call is non-idempotent; a\n * 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 oomRetries = 0;\n let response: Response | undefined;\n\n // Pre-stream provisioning retry loop. We re-fetch on explicit SAFE\n // pre-execution capacity signals only (503 PROVISIONING / MODEL_LOADING /\n // RESOURCE_EXHAUSTED), parallel to `generate()`. The loop terminates by\n // `break`-ing on a 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 // 502 MODEL_LOAD_FAILED is terminal — surface immediately.\n await throwIfModelLoadFailed(attemptResponse, model);\n\n // Retry explicit SAFE pre-execution signals before the stream opens.\n // Without `waitForCapacity`, provisioning falls through to\n // `handleError` and rejects immediately.\n if (attemptResponse.status === 503) {\n const errorCode = await getErrorCode(attemptResponse.clone());\n if (errorCode === PROVISIONING_ERROR_CODE) {\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 retryAfter = getRetryAfter(attemptResponse);\n const delay = retryAfter ?? applyRetryJitter(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 if (errorCode === MODEL_LOADING_ERROR_CODE) {\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 if (errorCode === RESOURCE_EXHAUSTED_ERROR_CODE) {\n // Pre-stream capacity signal. Mirrors the Python streaming\n // surface (`next_stream_retry_delay`): retried only under\n // `waitForCapacity`, bounded by the shared OOM budget.\n if (!waitForCapacity) {\n throw new ResourceExhaustedError(\n `Server resource exhausted after ${oomRetries} retry attempt(s) for model '${model}'`,\n { model, retries: oomRetries },\n );\n }\n const delay = nextOomRetryDelay({\n retryAfter: getRetryAfter(attemptResponse),\n oomRetries,\n maxOomRetries: RESOURCE_EXHAUSTED_MAX_RETRIES,\n elapsedMs: Date.now() - startTime,\n provisionTimeoutMs: this.provisionTimeout,\n model,\n });\n oomRetries += 1;\n if (await abortableSleep(delay, controller.signal)) {\n throw new SIEConnectionError(\"Stream aborted while provisioning\", \"other\");\n }\n continue;\n }\n }\n\n // 504 is terminal on the streaming path: post-publish, a worker may\n // already be generating, and generation is non-idempotent (Python\n // SDK parity — see `next_stream_retry_delay`).\n if (attemptResponse.status === HTTP_GATEWAY_TIMEOUT) {\n throw new ServerError(\n \"Gateway timed out (504) after the request was published to the queue; \" +\n \"a worker may already be generating. Not retried because generation is \" +\n \"non-idempotent (retrying could double-bill).\",\n await getErrorCode(attemptResponse.clone()),\n HTTP_GATEWAY_TIMEOUT,\n );\n }\n\n // Any remaining non-200 is an error.\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 const queryForWire = await itemImagesForWire(query);\n const itemsForWire = await itemsImagesForWire(items);\n\n // Build request body\n const body: Record<string, unknown> = {\n query: queryForWire,\n items: itemsForWire,\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 const itemsForWire = await itemsImagesForWire(itemsArray);\n\n // Build request body\n const body: Record<string, unknown> = {\n items: itemsForWire,\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 logical capacity isolation. By default they draw from the\n * cluster's `default` Helm/NATS queue; pass `queuePool` only when the cluster\n * has a dedicated physical worker queue declared under\n * `queueRouting.staticQueuePools` for this workload.\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 * @param queuePool - Optional Helm/NATS queue namespace backing this logical pool. Defaults to \"default\".\n * @param options - Optional bundle filter, warm floor, and pinned models\n * (Python SDK `create_pool` parity)\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 * // With a bundle filter, warm floor, and pinned models\n * await client.createPool(\"eval-bench\", { l4: 2 }, undefined, undefined, {\n * bundle: \"default\",\n * minimumWorkerCount: 1,\n * pinnedModels: [\"bge-m3\"],\n * });\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 queuePool?: string,\n options: CreatePoolOptions = {},\n ): Promise<void> {\n const alreadyTracking = this.pools.has(name);\n\n if (options.minimumWorkerCount !== undefined && options.minimumWorkerCount < 0) {\n throw new RangeError(\"minimumWorkerCount must be >= 0\");\n }\n\n // Build pool creation request\n const requestBody: {\n name: string;\n gpus?: Record<string, number>;\n gpu_caps?: Record<string, number>;\n queue_pool?: string;\n bundle?: string;\n minimum_worker_count?: number;\n pinned_models?: string[];\n } = {\n name,\n };\n if (gpus !== undefined) {\n requestBody.gpus = gpus;\n }\n if (gpuCaps) {\n requestBody.gpu_caps = gpuCaps;\n }\n if (queuePool) {\n requestBody.queue_pool = queuePool;\n }\n if (options.bundle) {\n requestBody.bundle = options.bundle;\n }\n if (options.minimumWorkerCount !== undefined) {\n requestBody.minimum_worker_count = options.minimumWorkerCount;\n }\n if (options.pinnedModels !== undefined) {\n requestBody.pinned_models = options.pinnedModels;\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: PoolSpec;\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 (capped by `provisionTimeout`):\n * - 503 `PROVISIONING` when `waitForCapacity: true`\n * - 503 `MODEL_LOADING` / `LORA_LOADING`\n * - 503 `RESOURCE_EXHAUSTED` regardless of `waitForCapacity` (bounded\n * exponential backoff, at most `RESOURCE_EXHAUSTED_MAX_RETRIES`)\n * - 504 gateway timeout when `waitForCapacity: true` — encode/score/\n * extract are idempotent queue paths, so a post-publish retry is safe\n * (unlike generate/chat, where a 504 is terminal)\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 // Retry counter for server-side OOM (RESOURCE_EXHAUSTED). Bounded so a\n // stuck-at-OOM server cannot cause unbounded blocking.\n let oomRetries = 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 // 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 explicit retryable 503 signals.\n if (response.status === 503) {\n const clonedResponse = response.clone();\n const errorCode = await getErrorCode(clonedResponse);\n\n if (errorCode === PROVISIONING_ERROR_CODE) {\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 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 const delay = retryAfter ?? applyRetryJitter(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 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 if (errorCode === RESOURCE_EXHAUSTED_ERROR_CODE) {\n // Server-side OOM. Retried regardless of `waitForCapacity`\n // (bounded budget), matching the Python SDK: the worker already\n // accepted the request and is recovering from transient capacity\n // exhaustion.\n const delay = nextOomRetryDelay({\n retryAfter: getRetryAfter(response),\n oomRetries,\n maxOomRetries: RESOURCE_EXHAUSTED_MAX_RETRIES,\n elapsedMs: Date.now() - startTime,\n provisionTimeoutMs: this.provisionTimeout,\n model,\n });\n oomRetries += 1;\n await sleep(delay);\n continue;\n }\n }\n\n // Handle 504 (gateway timeout): queued work was published, but the\n // gateway did not receive a worker result before its deadline.\n // Encode/score/extract are idempotent, so callers that opted into\n // waitForCapacity can retry within the provision budget (Python SDK\n // parity). On budget exhaustion this falls through to handleError.\n if (response.status === HTTP_GATEWAY_TIMEOUT && waitForCapacity) {\n const elapsed = Date.now() - startTime;\n if (elapsed < this.provisionTimeout) {\n const delay = getRetryAfter(response) ?? MODEL_LOADING_DEFAULT_DELAY;\n await sleep(Math.min(delay, this.provisionTimeout - elapsed));\n continue;\n }\n }\n\n // Handle other errors\n if (!response.ok) {\n await handleError(response, gpu);\n }\n\n // Success\n this.checkServerVersion(response);\n return response;\n }\n }\n\n /**\n * Make a single msgpack HTTP request to the SIE server (no retry logic).\n */\n private async request(\n path: string,\n body?: unknown,\n pool?: string,\n gpu?: string,\n ): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n Accept: MSGPACK_CONTENT_TYPE,\n [SDK_VERSION_HEADER]: SDK_VERSION,\n };\n\n if (body !== undefined) {\n headers[\"Content-Type\"] = MSGPACK_CONTENT_TYPE;\n }\n\n // Pool header takes precedence for routing\n if (pool) {\n headers[\"X-SIE-Pool\"] = pool;\n }\n\n if (gpu) {\n headers[\"X-SIE-MACHINE-PROFILE\"] = gpu;\n }\n\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: body !== undefined ? packMessage(body) : undefined,\n signal: controller.signal,\n });\n\n return response;\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new SIEConnectionError(`Request timeout after ${this.timeout}ms`, \"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 // ---------------------------------------------------------------------------\n // Jobs + connections namespaces. Jobs ride the keyed gateway\n // (`/v1/jobs`); connections ride the control plane (`/internal/orgs/{org}/…`).\n // ---------------------------------------------------------------------------\n\n /** One JSON request over `fetch` (bearer auth reused; absolute or base-relative URL). */\n private async jsonRequest<T>(\n target: string,\n method: \"GET\" | \"POST\" | \"DELETE\",\n body?: unknown,\n timeoutMs: number = this.timeout,\n ): Promise<T> {\n const url = target.startsWith(\"http\") ? target : `${this.baseUrl}${target}`;\n const headers: Record<string, string> = {\n Accept: JSON_CONTENT_TYPE,\n [SDK_VERSION_HEADER]: SDK_VERSION,\n };\n if (this.apiKey) headers.Authorization = `Bearer ${this.apiKey}`;\n const init: RequestInit = { method, headers };\n if (body !== undefined) {\n headers[\"Content-Type\"] = JSON_CONTENT_TYPE;\n init.body = JSON.stringify(body);\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n init.signal = controller.signal;\n try {\n const response = await fetch(url, init);\n if (!response.ok) {\n await handleError(response);\n }\n this.checkServerVersion(response);\n const text = await response.text();\n return (text ? JSON.parse(text) : {}) as T;\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new SIEConnectionError(`Request timeout after ${timeoutMs}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 async jobSubmit(options: SubmitJobOptions): Promise<JobSubmitResult> {\n return this.jsonRequest<JobSubmitResult>(\n \"/v1/jobs\",\n \"POST\",\n buildJobBody(options),\n Math.max(this.timeout, DEFAULT_LONG_RUNNING_TIMEOUT),\n );\n }\n\n private async jobGet(jobId: string): Promise<JobStatus> {\n return this.jsonRequest<JobStatus>(`/v1/jobs/${encodeURIComponent(jobId)}`, \"GET\");\n }\n\n private async jobList(): Promise<JobStatus[]> {\n const data = await this.jsonRequest<{ object?: string; data?: JobStatus[] }>(\"/v1/jobs\", \"GET\");\n return Array.isArray(data) ? data : (data.data ?? []);\n }\n\n private async jobCancel(jobId: string): Promise<JobStatus> {\n return this.jsonRequest<JobStatus>(`/v1/jobs/${encodeURIComponent(jobId)}/cancel`, \"POST\");\n }\n\n private async jobResults(jobId: string): Promise<JobResults> {\n const job = await this.jobGet(jobId);\n const chunks = jobChunks(job);\n const items: JobResultItem[] = [];\n for (const chunk of chunks) {\n if (chunk.state !== \"succeeded\" || !chunk.ref) continue;\n const raw = await this.readRef(chunk.ref);\n items.push(...decodeChunkBytes(raw));\n }\n const withDims = items.find((it) => it.dims != null);\n return {\n job_id: job.id ?? jobId,\n state: job.state,\n total_items: job.total_items,\n settled_credits: job.settled_credits,\n chunks,\n retrieved: items.length,\n dims: withDims ? withDims.dims : null,\n items,\n };\n }\n\n private async jobWait(\n jobId: string,\n options?: { timeoutMs?: number; pollMs?: number },\n ): Promise<JobStatus> {\n const timeoutMs = options?.timeoutMs ?? DEFAULT_JOB_WAIT_TIMEOUT;\n const pollMs = options?.pollMs ?? DEFAULT_JOB_WAIT_POLL;\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n const job = await this.jobGet(jobId);\n if (job.state && TERMINAL_JOB_STATES.has(job.state)) {\n return job;\n }\n if (Date.now() >= deadline) {\n throw new RequestError(\n `job ${jobId} still ${JSON.stringify(job.state)} after ${timeoutMs}ms`,\n \"job_wait_timeout\",\n 504,\n );\n }\n await sleep(pollMs);\n }\n }\n\n /** Retrieve a chunk's payload-store ref (http(s) URL). */\n private async readRef(ref: string): Promise<Uint8Array> {\n if (!ref.startsWith(\"http://\") && !ref.startsWith(\"https://\")) {\n throw new RequestError(\n `cannot retrieve payload-store ref ${JSON.stringify(ref)} (the TS SDK reads http(s) refs)`,\n \"bad_ref\",\n 400,\n );\n }\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n try {\n const response = await fetch(ref, {\n headers: { Accept: \"application/octet-stream\" },\n signal: controller.signal,\n });\n if (!response.ok) {\n await handleError(response);\n }\n return new Uint8Array(await response.arrayBuffer());\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 connectionsBase(): string {\n if (!this.controlPlaneUrl) {\n throw new RequestError(\n \"connections require controlPlaneUrl on the client: new SIEClient(url, { controlPlaneUrl, org })\",\n \"missing_control_plane_url\",\n 400,\n );\n }\n if (!this.org) {\n throw new RequestError(\n \"connections require org on the client: new SIEClient(url, { controlPlaneUrl, org })\",\n \"missing_org\",\n 400,\n );\n }\n return `${this.controlPlaneUrl}/internal/orgs/${encodeURIComponent(this.org)}/connections`;\n }\n\n private async connectionAdd(\n name: string,\n type: string,\n secret: string,\n ): Promise<ConnectionCreated> {\n return this.jsonRequest<ConnectionCreated>(this.connectionsBase(), \"POST\", {\n type,\n name,\n secret,\n });\n }\n\n private async connectionList(): Promise<Connection[]> {\n const data = await this.jsonRequest<{ connections?: Connection[] }>(\n this.connectionsBase(),\n \"GET\",\n );\n return Array.isArray(data) ? data : (data.connections ?? []);\n }\n\n private async connectionRevoke(name: string): Promise<ConnectionRevoked> {\n return this.jsonRequest<ConnectionRevoked>(\n `${this.connectionsBase()}/${encodeURIComponent(name)}`,\n \"DELETE\",\n );\n }\n\n // ---------------------------------------------------------------------------\n // Files + batches namespaces — the OpenAI-compatible file /\n // batch surface on the keyed gateway. Method names/args mirror `openai.files`\n // / `openai.batches` so switching an OpenAI-batch caller to the SDK is\n // mechanical.\n // ---------------------------------------------------------------------------\n\n /** POST a raw body and parse the JSON response (bearer auth reused). */\n private async rawPostJson<T>(\n path: string,\n body: FileUploadInput,\n contentType: string,\n timeoutMs: number = this.timeout,\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n Accept: JSON_CONTENT_TYPE,\n \"Content-Type\": contentType,\n [SDK_VERSION_HEADER]: SDK_VERSION,\n };\n if (this.apiKey) headers.Authorization = `Bearer ${this.apiKey}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body,\n signal: controller.signal,\n });\n if (!response.ok) {\n await handleError(response);\n }\n this.checkServerVersion(response);\n const text = await response.text();\n return (text ? JSON.parse(text) : {}) as T;\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new SIEConnectionError(`Request timeout after ${timeoutMs}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 /** GET raw bytes (bearer auth reused); used to download a file's content. */\n private async rawGetBytes(path: string): Promise<Uint8Array> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n Accept: \"application/jsonl\",\n [SDK_VERSION_HEADER]: SDK_VERSION,\n };\n if (this.apiKey) headers.Authorization = `Bearer ${this.apiKey}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n try {\n const response = await fetch(url, { method: \"GET\", headers, signal: controller.signal });\n if (!response.ok) {\n await handleError(response);\n }\n this.checkServerVersion(response);\n return new Uint8Array(await response.arrayBuffer());\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 async fileUpload(\n file: FileUploadInput,\n options?: { purpose?: string; filename?: string },\n ): Promise<SIEFile> {\n const purpose = options?.purpose ?? \"batch\";\n const filename = resolveUploadFilename(file, options?.filename);\n const query = new URLSearchParams({ purpose, filename }).toString();\n const body: FileUploadInput = file instanceof ArrayBuffer ? new Uint8Array(file) : file;\n return this.rawPostJson<SIEFile>(\n `/v1/files?${query}`,\n body,\n \"application/jsonl\",\n Math.max(this.timeout, DEFAULT_LONG_RUNNING_TIMEOUT),\n );\n }\n\n private async fileRetrieve(fileId: string): Promise<SIEFile> {\n return this.jsonRequest<SIEFile>(`/v1/files/${encodeURIComponent(fileId)}`, \"GET\");\n }\n\n private async fileContent(fileId: string): Promise<Uint8Array> {\n return this.rawGetBytes(`/v1/files/${encodeURIComponent(fileId)}/content`);\n }\n\n private async fileDelete(fileId: string): Promise<FileDeleted> {\n return this.jsonRequest<FileDeleted>(`/v1/files/${encodeURIComponent(fileId)}`, \"DELETE\");\n }\n\n private async batchCreate(options: {\n input_file_id: string;\n endpoint?: string;\n completion_window?: string;\n metadata?: Record<string, unknown>;\n }): Promise<Batch> {\n const body: Record<string, unknown> = {\n input_file_id: options.input_file_id,\n endpoint: options.endpoint ?? \"/v1/embeddings\",\n completion_window: options.completion_window ?? \"24h\",\n };\n if (options.metadata !== undefined) {\n body.metadata = options.metadata;\n }\n return this.jsonRequest<Batch>(\n \"/v1/batches\",\n \"POST\",\n body,\n Math.max(this.timeout, DEFAULT_LONG_RUNNING_TIMEOUT),\n );\n }\n\n private async batchRetrieve(batchId: string): Promise<Batch> {\n return this.jsonRequest<Batch>(`/v1/batches/${encodeURIComponent(batchId)}`, \"GET\");\n }\n\n private async batchList(): Promise<Batch[]> {\n const data = await this.jsonRequest<{ object?: string; data?: Batch[] }>(\"/v1/batches\", \"GET\");\n return Array.isArray(data) ? data : (data.data ?? []);\n }\n\n private async batchCancel(batchId: string): Promise<Batch> {\n return this.jsonRequest<Batch>(`/v1/batches/${encodeURIComponent(batchId)}/cancel`, \"POST\");\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\nimport type { ImageInput, ImageWireFormat } from \"./images.js\";\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 for multimodal models; converted to wire format by the client */\n images?: (ImageInput | ImageWireFormat)[];\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 /** Number of GPUs on this worker */\n gpuCount: number;\n /** Number of worker GPU slots ready to receive work */\n readyGpuSlots: number;\n /** Whether the worker is healthy */\n healthy: boolean;\n /** Number of items in the worker's queue */\n queueDepth: number;\n /** Worker-local scheduler pending cost */\n pendingCost: number;\n /** Number of batches currently executing on the worker */\n inflightBatches: 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 PoolCreateSpec {\n /** Pool name (used in GPU param as \"poolName/machineProfile\") */\n name: string;\n /** Optional Helm/NATS queue namespace backing this logical pool. Defaults to \"default\"; non-default values must be declared under queueRouting.staticQueuePools. */\n queuePool?: 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}\n\n/**\n * Optional arguments for `SIEClient.createPool`, mirroring the Python SDK's\n * `create_pool` keyword arguments (`bundle`, `minimum_worker_count`,\n * `pinned_models`).\n */\nexport interface CreatePoolOptions {\n /** Optional bundle filter. When set, only workers running this bundle will be assigned to the pool. */\n bundle?: string;\n /**\n * Per-pool warm floor (minimum machines kept warm). The gateway publishes\n * it as `sie_gateway_pool_warm_floor` for KEDA. Defaults to 0 (scale to zero).\n */\n minimumWorkerCount?: number;\n /**\n * Model ids to keep loaded so the first request to them pays no cold\n * model-load. Each id must be a model the gateway already tracks and may be\n * profile-qualified (\"model-name:profile_name\"); unknown ids are rejected.\n */\n pinnedModels?: string[];\n}\n\n/**\n * Pool specification returned by the gateway.\n */\nexport interface PoolSpec {\n /** Pool name (used in GPU param as \"poolName/machineProfile\") */\n name: string;\n /** Helm/NATS queue namespace backing this logical pool */\n queue_pool?: string;\n /** Optional bundle constraint for this pool */\n bundle?: string | null;\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, as returned by the gateway */\n gpu_caps?: Record<string, number>;\n /** Optional TTL for dynamic pool leases */\n ttl_seconds?: number | null;\n /** Minimum workers kept warm for this pool */\n minimum_worker_count?: number;\n /** Models pinned for this pool */\n pinned_models?: string[];\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: PoolSpec;\n /** Pool status */\n status: PoolStatus;\n}\n\n// ---------------------------------------------------------------------------\n// WebSocket Status Types\n// ---------------------------------------------------------------------------\n\n/**\n * Canonical model residency states. The runtime `MODEL_STATES` array is the\n * single source the `ModelState` type is derived from, so it can be checked\n * against the shared golden fixture (`packages/wire-fixtures/model_state.json`)\n * in CI. Includes `\"failed\"` (a terminal load-failure state) to stay in parity\n * with the Python SDK and server, which already carry it.\n */\nexport const MODEL_STATES = [\"available\", \"loading\", \"loaded\", \"unloading\", \"failed\"] as const;\nexport type ModelState = (typeof MODEL_STATES)[number];\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 /**\n * Whether to auto-retry retryable capacity signals (503 PROVISIONING,\n * idempotent 504 gateway timeouts, transient connect errors).\n * Default: `true`, matching the Python SDK's `wait_for_capacity=True`.\n * BREAKING (0.7): the default was previously `false` — pass `false`\n * explicitly to fail fast.\n */\n waitForCapacity?: boolean;\n /** Maximum time to wait for provisioning in milliseconds (default: 300000) */\n provisionTimeout?: number;\n /**\n * Control-plane base URL for the `connections` namespace (connector\n * auth lives on the control plane, not the keyed gateway). Required to call\n * `client.connections.*`.\n */\n controlPlaneUrl?: string;\n /** Org the `connections` namespace operates on (org-scoped by path in the POC). */\n org?: string;\n}\n\n/**\n * An org-scoped connection (connector auth by name). The secret is never\n * returned by the list endpoint (only the job-runner resolve path sees it).\n */\nexport interface Connection {\n id?: number;\n type?: string;\n name?: string;\n created_at?: number;\n}\n\n/** The `201` envelope from creating a connection (org + connection, no secret). */\nexport interface ConnectionCreated extends Connection {\n org?: string;\n account_id?: number;\n}\n\n/** The envelope from revoking (soft-deleting) a connection. */\nexport interface ConnectionRevoked {\n org?: string;\n account_id?: number;\n name?: string;\n state?: string;\n}\n\n/**\n * An OpenAI-shaped file object (`POST/GET /v1/files`). The\n * gateway emits `{id, object:\"file\", bytes, created_at, filename, purpose}`;\n * `status` / `expires_at` are the optional OpenAI fields surfaced\n * when the TTL-GC lands. Byte-for-byte OpenAI's `FileObject`.\n */\nexport interface File {\n id?: string;\n object?: string;\n bytes?: number;\n created_at?: number;\n filename?: string;\n purpose?: string;\n status?: string;\n expires_at?: number;\n}\n\n/** The envelope from deleting a file (OpenAI `FileDeleted`). */\nexport interface FileDeleted {\n id?: string;\n object?: string;\n deleted?: boolean;\n}\n\n/** Per-batch request tally (OpenAI `request_counts`). */\nexport interface BatchRequestCounts {\n total?: number;\n completed?: number;\n failed?: number;\n}\n\n/**\n * An OpenAI-shaped batch object (`POST/GET /v1/batches`).\n * The gateway emits `{id, object:\"batch\", endpoint, input_file_id,\n * completion_window, status, output_file_id, error_file_id, created_at,\n * finished_at, request_counts, errors}`. The granular OpenAI\n * timestamps (`completed_at` etc.) are optional — a strict OpenAI SDK reads them\n * when the gateway surfaces them.\n */\nexport interface Batch {\n id?: string;\n object?: string;\n endpoint?: string;\n input_file_id?: string;\n completion_window?: string;\n status?: string;\n output_file_id?: string | null;\n error_file_id?: string | null;\n created_at?: number;\n finished_at?: number | null;\n in_progress_at?: number | null;\n completed_at?: number | null;\n failed_at?: number | null;\n expired_at?: number | null;\n cancelled_at?: number | null;\n request_counts?: BatchRequestCounts;\n errors?: unknown;\n metadata?: Record<string, unknown> | null;\n}\n\n/** The listing envelope from `GET /v1/batches` (OpenAI cursor page). */\nexport interface BatchList {\n object?: string;\n data?: Batch[];\n first_id?: string;\n last_id?: string;\n has_more?: boolean;\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 * carrying a base64 `data:` URI are accepted for vision-capable generation\n * models (non-vision/encode-only models reject with `400 unsupported_field`;\n * remote (non-`data:`) URLs reject with `400 invalid_request`). 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. Text parts\n * (`text` / `input_text`) are concatenated; image parts (`image_url` /\n * `input_image`) carry a base64 `data:` URI and are accepted for vision-capable\n * generation models.\n */\nexport type ChatContentPart =\n | { type: \"text\"; text: string }\n | { type: \"input_text\"; text: string }\n | { type: \"image_url\"; image_url: { url: string } }\n | { type: \"input_image\"; image_url: string | { url: 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 * (`503 PROVISIONING`, `503 MODEL_LOADING`, `503 RESOURCE_EXHAUSTED`)\n * until `provisionTimeoutMs` elapses. When `false`, the first\n * provisioning signal throws (`ProvisioningError` / `ModelLoadingError`\n * / `ServerError`). Defaults to the client's `waitForCapacity`\n * (true unless the constructor opted out).\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/images.ts","../src/internal/constants.ts","../src/msgpack.ts","../src/internal/retry.ts","../src/internal/parsing.ts","../src/internal/provisioning.ts","../src/jobs.ts","../src/sse.ts","../src/version.ts","../src/client.ts","../src/types.ts","../src/encoding.ts","../src/scoring.ts"],"names":["buffer","getRetryAfter","vector","sleep","options"],"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 503 with PROVISIONING code\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 when the server has exhausted its OOM-recovery strategies.\n *\n * Raised when:\n * - Server returns 503 with RESOURCE_EXHAUSTED code\n * - SDK retry limit is exceeded (or the next backoff would exhaust the\n * provision-timeout budget)\n *\n * Subclass of {@link ServerError} so callers that already catch\n * `ServerError` continue to behave correctly; new code can catch\n * `ResourceExhaustedError` specifically to react to sustained GPU\n * pressure (e.g., back off, route elsewhere, scale up). Mirrors the\n * Python SDK's `ResourceExhaustedError`.\n */\nexport class ResourceExhaustedError extends ServerError {\n /** The model that was requested */\n readonly model: string | undefined;\n /** Number of retry attempts made before giving up */\n readonly retries: number;\n\n constructor(message: string, options?: { model?: string; retries?: number }) {\n super(message, \"RESOURCE_EXHAUSTED\", 503);\n this.name = \"ResourceExhaustedError\";\n this.model = options?.model;\n this.retries = options?.retries ?? 0;\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 * 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","/**\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_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;\nexport const HTTP_GATEWAY_TIMEOUT = 504;\n\n// Default timeouts and delays\nexport const DEFAULT_TIMEOUT = 30_000; // 30 seconds\n// Floor for long-running POSTs (jobs.submit / files.upload / batches.create) so\n// a large upload / connector preflight / batch creation does not abort while the\n// server keeps working. Matches the Python SDK's 120s floor.\nexport const DEFAULT_LONG_RUNNING_TIMEOUT = 120_000; // 2 minutes\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// jobs.wait() polling — mirrors the Python SDK's jobs.wait defaults.\nexport const DEFAULT_JOB_WAIT_TIMEOUT = 600_000; // 10 minutes\nexport const DEFAULT_JOB_WAIT_POLL = 2_000; // 2 seconds\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\nexport const PROVISIONING_ERROR_CODE = \"PROVISIONING\"; // Error code from gateway provisioning\n\n// RESOURCE_EXHAUSTED (server-side OOM) retry settings — mirror the Python SDK\n// (packages/sie_sdk/src/sie_sdk/client/_shared.py).\nexport const RESOURCE_EXHAUSTED_MAX_RETRIES = 3; // Max bounded retries\nexport const RESOURCE_EXHAUSTED_DEFAULT_DELAY = 5_000; // Base backoff (ms)\nexport const RESOURCE_EXHAUSTED_MAX_DELAY = 30_000; // Backoff ceiling (ms)\nexport const RESOURCE_EXHAUSTED_ERROR_CODE = \"RESOURCE_EXHAUSTED\"; // 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 {\n DEFAULT_MAX_RETRY_DELAY,\n DEFAULT_RETRY_DELAY,\n RESOURCE_EXHAUSTED_DEFAULT_DELAY,\n RESOURCE_EXHAUSTED_MAX_DELAY,\n} from \"./constants.js\";\n\nconst RETRY_JITTER_FRACTION = 0.25;\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 * Apply bounded downward jitter to a fixed retry delay.\n *\n * The jittered value is drawn from [delay * 0.75, delay], so it never\n * exceeds the caller's existing timeout cap. A zero Retry-After hint\n * remains an immediate retry.\n */\nexport function applyRetryJitter(delay: number): number {\n if (delay <= 0) return Math.max(delay, 0);\n const low = delay * (1 - RETRY_JITTER_FRACTION);\n return Math.max(0, low + Math.random() * (delay - low));\n}\n\n/**\n * Compute the next sleep interval (ms) for a `503 RESOURCE_EXHAUSTED` retry.\n *\n * Mirrors the Python SDK's `compute_oom_backoff`: a first-retry\n * `Retry-After` hint is honoured verbatim (capped at `maxDelay`, no\n * jitter — the server gave an explicit instruction); subsequent retries\n * use bounded exponential backoff, `max(baseDelay, retryAfter) * 2**attempt`\n * capped at `maxDelay`, with bounded downward jitter so a fleet of clients\n * evicted by the same OOM event does not retry in lockstep. Always returns\n * a value in `[0, maxDelay]`.\n *\n * @param retryAfter - Parsed `Retry-After` hint in milliseconds, if any\n * @param attempt - 0-indexed retry number (0 = first retry)\n */\nexport function computeOomBackoff(\n retryAfter: number | undefined,\n attempt: number,\n baseDelay: number = RESOURCE_EXHAUSTED_DEFAULT_DELAY,\n maxDelay: number = RESOURCE_EXHAUSTED_MAX_DELAY,\n): number {\n // Defensive floor: a negative Retry-After (malformed upstream) must not\n // produce a negative sleep.\n const safeRetryAfter = retryAfter !== undefined ? Math.max(retryAfter, 0) : undefined;\n if (safeRetryAfter !== undefined && attempt === 0) {\n return Math.min(safeRetryAfter, maxDelay);\n }\n // `max(...)`: a zero hint falls back to `baseDelay`, and a hint above\n // `baseDelay` keeps the schedule non-decreasing (see the Python SDK's\n // `compute_oom_backoff` for the full rationale).\n const base = safeRetryAfter !== undefined ? Math.max(baseDelay, safeRetryAfter) : baseDelay;\n const capped = Math.max(0, Math.min(base * 2 ** attempt, maxDelay));\n return applyRetryJitter(capped);\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 ExtractItemError,\n ExtractResult,\n FinishReason,\n GenerateResult,\n Relation,\n ScoreEntry,\n ScoreResult,\n WorkerInfo,\n} from \"../types.js\";\nimport {\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 PROVISIONING_ERROR_CODE,\n} from \"./constants.js\";\n\nimport { getRetryAfter as getRetryAfterFromHeader } from \"./retry.js\";\n\nconst SIE_ERROR_CODE_HEADER = \"X-SIE-Error-Code\";\n\nfunction normalizeErrorCode(code: string | undefined): string | undefined {\n if (code === \"provisioning\") return PROVISIONING_ERROR_CODE;\n return code;\n}\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 headerCode = response.headers.get(SIE_ERROR_CODE_HEADER);\n if (headerCode) return headerCode;\n\n const detail = await getErrorDetail(response);\n if (!detail) return undefined;\n const code = detail.code;\n return typeof code === \"string\" ? normalizeErrorCode(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``.\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 code = response.headers.get(SIE_ERROR_CODE_HEADER) ?? normalizeErrorCode(code);\n\n if (status === 503 && code === PROVISIONING_ERROR_CODE) {\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 WireScoreUsage {\n input_tokens: number;\n images?: number;\n}\n\ninterface WireScoreResult {\n model?: string;\n query_id?: string;\n scores: WireScoreEntry[];\n usage?: WireScoreUsage;\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 data?: Record<string, unknown>;\n error?: { code: string; message: string };\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 usage: wire.usage\n ? {\n inputTokens: wire.usage.input_tokens,\n images: wire.usage.images,\n }\n : undefined,\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\nfunction parseExtractItemError(data: unknown): ExtractItemError | undefined {\n if (data === undefined || data === null) return undefined;\n if (typeof data === \"object\" && !Array.isArray(data)) {\n const error = data as Record<string, unknown>;\n if (\n typeof error.code === \"string\" &&\n error.code.trim().length > 0 &&\n typeof error.message === \"string\" &&\n error.message.trim().length > 0\n ) {\n return { code: error.code, message: error.message };\n }\n }\n return {\n code: \"INTERNAL_ERROR\",\n message: \"Malformed extraction item error\",\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 data: data.data,\n error: parseExtractItemError(data.error),\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 gpu_count?: number;\n ready_gpu_slots?: number;\n healthy: boolean;\n queue_depth: number;\n pending_cost?: number;\n inflight_batches?: 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 gpuCount: w.gpu_count ?? 0,\n readyGpuSlots: w.ready_gpu_slots ?? w.gpu_count ?? (w.healthy ? 1 : 0),\n healthy: w.healthy,\n queueDepth: w.queue_depth,\n pendingCost: w.pending_cost ?? 0,\n inflightBatches: w.inflight_batches ?? 0,\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 * `503` with a known error code (`PROVISIONING`, `MODEL_LOADING` or\n * `RESOURCE_EXHAUSTED`). They both need to retry those SAFE\n * pre-execution signals while honouring a caller-supplied\n * `waitForCapacity` flag plus a `provisionTimeout` budget. A `504` is\n * post-publish and therefore terminal here (non-idempotent generation).\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 {\n ModelLoadingError,\n ProvisioningError,\n RequestError,\n ResourceExhaustedError,\n ServerError,\n} from \"../errors.js\";\nimport {\n DEFAULT_RETRY_DELAY,\n HTTP_GATEWAY_TIMEOUT,\n MODEL_LOADING_DEFAULT_DELAY,\n MODEL_LOADING_ERROR_CODE,\n PROVISIONING_ERROR_CODE,\n RESOURCE_EXHAUSTED_ERROR_CODE,\n RESOURCE_EXHAUSTED_MAX_RETRIES,\n} from \"./constants.js\";\nimport { getErrorCode, getRetryAfter, handleError, throwIfModelLoadFailed } from \"./parsing.js\";\nimport { applyRetryJitter, computeOomBackoff } from \"./retry.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 `503 PROVISIONING` / `503 MODEL_LOADING`\n * until the provision budget is exhausted. When `false`, the first\n * provisioning 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 * Budget check + backoff for one `503 RESOURCE_EXHAUSTED` retry.\n *\n * Mirrors the Python SDK's `_handle_oom_retry`: throws\n * {@link ResourceExhaustedError} when the retry budget is exhausted\n * (`oomRetries >= maxOomRetries`), the provision budget has elapsed, or\n * the next backoff would consume the remaining budget without leaving\n * room for the retried request to run (surfacing the *root cause* now\n * instead of a later \"provisioning timeout\"). Otherwise returns the\n * delay (ms) to sleep before the next attempt.\n *\n * Distinct from MODEL_LOADING: the model is already resident, the\n * request just lost the race for compute resources. This is a SAFE\n * pre-execution signal (the worker rejected the request before running\n * it), so on the buffered paths it is retried regardless of\n * `waitForCapacity`, matching the Python SDK.\n *\n * @internal\n */\nexport function nextOomRetryDelay(opts: {\n retryAfter: number | undefined;\n oomRetries: number;\n maxOomRetries: number;\n elapsedMs: number;\n provisionTimeoutMs: number;\n model: string;\n}): number {\n const { retryAfter, oomRetries, maxOomRetries, elapsedMs, provisionTimeoutMs, model } = opts;\n const message = `Server resource exhausted after ${oomRetries} retry attempt(s) for model '${model}'`;\n if (oomRetries >= maxOomRetries || elapsedMs >= provisionTimeoutMs) {\n throw new ResourceExhaustedError(message, { model, retries: oomRetries });\n }\n const delay = computeOomBackoff(retryAfter, oomRetries);\n if (delay >= provisionTimeoutMs - elapsedMs) {\n throw new ResourceExhaustedError(message, { model, retries: oomRetries });\n }\n return delay;\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 let oomRetries = 0;\n\n while (true) {\n const response = await performFetch();\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 === PROVISIONING_ERROR_CODE) {\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 retryAfter = getRetryAfter(response);\n const delay = retryAfter ?? applyRetryJitter(DEFAULT_RETRY_DELAY);\n await sleep(Math.min(delay, opts.provisionTimeoutMs - elapsed));\n continue;\n }\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 (errorCode === RESOURCE_EXHAUSTED_ERROR_CODE) {\n // Retried regardless of `waitForCapacity` (bounded budget), matching\n // the Python SDK: the signal fires before any generation starts.\n const delay = nextOomRetryDelay({\n retryAfter: getRetryAfter(response),\n oomRetries,\n maxOomRetries: RESOURCE_EXHAUSTED_MAX_RETRIES,\n elapsedMs: Date.now() - startTime,\n provisionTimeoutMs: opts.provisionTimeoutMs,\n model: opts.model,\n });\n oomRetries += 1;\n await sleep(delay);\n continue;\n }\n }\n\n // Do NOT retry 504. A 504 GATEWAY_TIMEOUT is a *post-publish* timeout:\n // the work item is already on the queue and a worker may be — or have\n // finished — generating. Generation is non-idempotent and carries no\n // dedup key, so retrying could issue a SECOND billable generation.\n // The pre-execution 503 signals above remain retryable because those\n // fire before any generation can have started (Python SDK parity).\n if (response.status === HTTP_GATEWAY_TIMEOUT) {\n throw new ServerError(\n \"Gateway timed out (504) after the request was published to the queue; \" +\n \"a worker may already be generating. Not retried because generation is \" +\n \"non-idempotent (retrying could double-bill). Re-issue manually if needed.\",\n await getErrorCode(response.clone()),\n HTTP_GATEWAY_TIMEOUT,\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 * Jobs surface (`client.jobs`) — pure helpers + wire types.\n *\n * The jobs API is the gateway's batch class. `client.jobs.submit(...)` binds to\n * `POST /v1/jobs`; this module owns the transport-free pieces (the\n * `source → operation → sink / when` slot mapping and result decoding) so they\n * mirror the Python SDK's `sie_sdk.jobs`.\n */\n\nimport { RequestError } from \"./errors.js\";\nimport { unpackMessage } from \"./msgpack.js\";\n\n/** Job lifecycle state (queued → running → terminal). */\nexport type JobState = \"queued\" | \"running\" | \"succeeded\" | \"failed\" | \"suspended\" | \"cancelled\";\n\n/** Terminal states with no further transitions (job lifecycle). */\nexport const TERMINAL_JOB_STATES: ReadonlySet<JobState> = new Set([\n \"succeeded\",\n \"failed\",\n \"suspended\",\n \"cancelled\",\n]);\n\n/** One inline input item (the `/v1/encode` item contract: `{text}` / `{id,text}`). */\nexport type JobItem = { text?: string; id?: string } & Record<string, unknown>;\n\n/**\n * A job source: inline items (a list, or a bare string = one text item) or a\n * connector `scheme://<connection>/…` URI.\n */\nexport type JobSource = string | Array<string | JobItem>;\n\n/**\n * The uniform source-mapping slots (wire-shaped, mirroring the Python\n * SDK's dict): `id_field` ≈ `custom_id`, `input_field` ≈ `body.input`,\n * `carry` = source fields echoed to the sink keyed by id, `input_type` pins\n * the item shape. The sink slot rides separately as `outputField`. All\n * optional — per-connector URI params stay as aliases.\n */\nexport interface JobFieldMap {\n id_field?: string;\n input_field?: string;\n carry?: string[];\n input_type?: \"text\" | \"document\";\n}\n\n/** Options for `client.jobs.submit`. */\nexport interface SubmitJobOptions {\n /** Inline items or a connector URI (incl. `upload://<file-id>`). */\n source: JobSource;\n /** Model id (e.g. \"BAAI/bge-m3\"). */\n model: string;\n /** Job operation: encode | score | extract | parse | generate (default \"encode\"). */\n operation?: string;\n /** Sink: \"return\" (default), \"inplace\", or a connector URI. */\n sink?: string | null;\n /** Override the source connection name (default: derived from the URI). */\n connection?: string | null;\n /** Distinct connection name for the sink. */\n sinkConnection?: string | null;\n /** Uniform source mapping (connector jobs only). */\n fieldMap?: JobFieldMap | null;\n /** Sink target (≈ `response.body`; aliases PG `column` / object-store `suffix`). */\n outputField?: string | null;\n /** Trigger: \"now\" (default), \"schedule:<cron>\", or \"watch:<source>\". */\n when?: string | null;\n /** Encode output types (default: dense). */\n outputTypes?: string[];\n /**\n * Per-item options plus the op inputs, forwarded as-is (operation\n * matrix): score → `options.query`, extract → `options.labels` /\n * `options.output_schema`, generate → sampling (e.g. `max_new_tokens`).\n */\n options?: Record<string, unknown> | null;\n}\n\n/** The preflight reservation echoed on submit / status. */\nexport interface JobPreflight {\n estimated_credits?: number;\n estimate_basis?: string;\n}\n\n/** One spawned chunk's settle metadata (`output.chunks[]`; results-as-refs). */\nexport interface JobChunk {\n seq?: number;\n items?: number;\n state?: string;\n ref?: string | null;\n units?: number | null;\n credits?: number | null;\n error?: unknown;\n}\n\n/** The `201` envelope from `POST /v1/jobs` (inline or connector job). */\nexport interface JobSubmitResult {\n id: string;\n object: string;\n operation: string;\n model: string;\n state: JobState;\n total_items?: number;\n chunks?: number;\n preflight?: JobPreflight;\n input_source?: string;\n source?: string;\n sink?: string;\n}\n\n/** A job's public status doc from `GET /v1/jobs/{id}` (refs, never payloads). */\nexport interface JobStatus {\n id: string;\n object: string;\n operation: string;\n model: string;\n state: JobState;\n total_items?: number;\n completed_items?: number;\n preflight?: JobPreflight;\n settled_credits?: number;\n created_at?: number;\n finished_at?: number | null;\n output?: { kind?: string; chunks?: JobChunk[] };\n}\n\n/** One decoded per-item result retrieved from a finished job's chunk refs. */\nexport interface JobResultItem {\n id: string | null;\n success: boolean | null;\n units: unknown;\n dims: number | null;\n dense: number[] | Float32Array | null;\n}\n\n/** A finished job's decoded results — the chunk refs read and unpacked. */\nexport interface JobResults {\n job_id: string;\n state: JobState | undefined;\n total_items: number | undefined;\n settled_credits: number | undefined;\n chunks: JobChunk[];\n retrieved: number;\n dims: number | null;\n items: JobResultItem[];\n}\n\nconst SINK_RETURN = new Set([\"return\", \"default\"]);\nconst SINK_INPLACE = new Set([\"inplace\", \"in_place\", \"in place\"]);\n\n// Internal push-to-us schemes (OUR Files store): no org connection to\n// name, so no `connection`/`sink_connection` is derived from the URI.\nconst INTERNAL_SCHEMES = new Set([\"upload\"]);\n\n// Uniform source-mapping slots (the sink slot is `output_field`).\nconst FIELD_MAP_KEYS = new Set([\"id_field\", \"input_field\", \"carry\", \"input_type\"]);\nconst INPUT_TYPES = new Set([\"text\", \"document\"]);\n\nfunction isConnectorUri(value: string): boolean {\n return value.includes(\"://\");\n}\n\nfunction isInternalUri(uri: string): boolean {\n return INTERNAL_SCHEMES.has(uri.split(\"://\", 1)[0] ?? \"\");\n}\n\nfunction normItem(item: string | JobItem, index: number): JobItem {\n if (typeof item === \"string\") return { text: item };\n if (item !== null && typeof item === \"object\") return item;\n throw new RequestError(`item ${index} must be a string or an object`, \"invalid_request\", 400);\n}\n\n/**\n * Derive a connection name from a connector URI's authority.\n *\n * `postgres://warehouse?query=…` → `warehouse`; `s3://customer-bucket/in/` →\n * `customer-bucket`. Credentials never appear in the call — the job only names\n * the connection; the runner resolves it org-scoped.\n */\nexport function connectionName(uri: string): string {\n // URL can't parse custom schemes reliably; take the authority manually.\n const afterScheme = uri.split(\"://\", 2)[1] ?? \"\";\n const authority = afterScheme.split(/[/?#]/, 1)[0] ?? \"\";\n const name = authority.trim();\n if (!name) {\n throw new RequestError(\n `connector URI ${JSON.stringify(uri)} names no connection (expected 'scheme://<connection>/…')`,\n \"invalid_request\",\n 400,\n );\n }\n return name;\n}\n\nfunction resolveSource(source: JobSource, connection?: string | null): Record<string, unknown> {\n if (Array.isArray(source)) {\n if (source.length === 0) {\n throw new RequestError(\"inline source has no items\", \"invalid_request\", 400);\n }\n return { items: source.map((item, i) => normItem(item, i)) };\n }\n if (isConnectorUri(source)) {\n if (isInternalUri(source)) {\n // Internal scheme (upload:// = OUR Files store): no connection.\n return connection ? { src: source, connection } : { src: source };\n }\n return { src: source, connection: connection ?? connectionName(source) };\n }\n if (typeof source === \"string\" && source.trim()) {\n return { items: [{ text: source }] };\n }\n throw new RequestError(\n \"source must be inline items (a list/string) or a connector URI (scheme://<connection>/…)\",\n \"invalid_request\",\n 400,\n );\n}\n\nfunction resolveSink(\n sink: string | null | undefined,\n sourceConnection: string | undefined,\n sinkConnection: string | null | undefined,\n): Record<string, unknown> {\n if (sink === null || sink === undefined || SINK_RETURN.has(sink.trim().toLowerCase())) {\n return {};\n }\n if (SINK_INPLACE.has(sink.trim().toLowerCase())) {\n return { sink: \"inplace\" };\n }\n if (isConnectorUri(sink)) {\n const body: Record<string, unknown> = { sink };\n if (isInternalUri(sink)) {\n // Internal scheme: OUR Files store, no connection to name.\n if (sinkConnection != null) body.sink_connection = sinkConnection;\n return body;\n }\n const resolved = sinkConnection ?? connectionName(sink);\n // Thread the sink connection when explicitly overridden or distinct from\n // the source's (the common \"index my own store\" case reuses the source).\n if (sinkConnection != null || resolved !== sourceConnection) {\n body.sink_connection = resolved;\n }\n return body;\n }\n throw new RequestError(\n `sink must be 'return', 'inplace', or a connector URI (got ${JSON.stringify(sink)})`,\n \"invalid_request\",\n 400,\n );\n}\n\n/**\n * Validate + map the uniform slots onto the wire fields (`field_map` +\n * `output_field`). Only set fields ride the wire (`/v1` additive-only).\n */\nfunction resolveFieldMap(\n fieldMap: JobFieldMap | null | undefined,\n outputField: string | null | undefined,\n): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n if (fieldMap != null) {\n const unknown = Object.keys(fieldMap).filter((key) => !FIELD_MAP_KEYS.has(key));\n if (unknown.length > 0) {\n throw new RequestError(\n `unknown field_map key(s) ${JSON.stringify(unknown)} (known: ${[...FIELD_MAP_KEYS].join(\", \")})`,\n \"invalid_request\",\n 400,\n );\n }\n if (\n fieldMap.carry != null &&\n (!Array.isArray(fieldMap.carry) || fieldMap.carry.some((c) => typeof c !== \"string\" || !c))\n ) {\n throw new RequestError(\n `field_map.carry must be a list of field names (got ${JSON.stringify(fieldMap.carry)})`,\n \"invalid_request\",\n 400,\n );\n }\n if (fieldMap.input_type != null && !INPUT_TYPES.has(fieldMap.input_type)) {\n throw new RequestError(\n `field_map.input_type must be one of ${[...INPUT_TYPES].join(\", \")} (got ${JSON.stringify(fieldMap.input_type)})`,\n \"invalid_request\",\n 400,\n );\n }\n const mapped: Record<string, unknown> = {};\n if (fieldMap.id_field != null) mapped.id_field = fieldMap.id_field;\n if (fieldMap.input_field != null) mapped.input_field = fieldMap.input_field;\n if (fieldMap.input_type != null) mapped.input_type = fieldMap.input_type;\n if (fieldMap.carry != null && fieldMap.carry.length > 0) mapped.carry = fieldMap.carry;\n if (Object.keys(mapped).length > 0) body.field_map = mapped;\n }\n if (outputField != null) {\n if (typeof outputField !== \"string\" || !outputField) {\n throw new RequestError(\n `output_field must be a non-empty string (got ${JSON.stringify(outputField)})`,\n \"invalid_request\",\n 400,\n );\n }\n body.output_field = outputField;\n }\n return body;\n}\n\nfunction resolveWhen(when: string | null | undefined): Record<string, unknown> {\n if (when == null || when.trim() === \"\" || when.trim().toLowerCase() === \"now\") {\n return {};\n }\n const text = when.trim();\n // Slice off the prefix (not `split(\":\")`, which would drop a value's own colons).\n if (text.toLowerCase().startsWith(\"schedule:\")) {\n return { when: \"schedule\", schedule: text.slice(\"schedule:\".length).trim() };\n }\n if (text.toLowerCase().startsWith(\"watch:\")) {\n return { when: \"watch\", watch: text.slice(\"watch:\".length).trim() };\n }\n if (text.toLowerCase() === \"schedule\") {\n throw new RequestError(\n \"schedule trigger needs a cron expr: when='schedule:<cron>'\",\n \"invalid_request\",\n 400,\n );\n }\n // A bare cron expression (5 whitespace-separated fields) is a schedule.\n if (text.split(/\\s+/).length === 5) {\n return { when: \"schedule\", schedule: text };\n }\n throw new RequestError(\n `unrecognized when ${JSON.stringify(when)}: use 'now', 'schedule:<cron>', or 'watch:<source>'`,\n \"invalid_request\",\n 400,\n );\n}\n\n/**\n * Compose the `POST /v1/jobs` body from the source/op/sink/when slots.\n *\n * A thin, pure mapping: inline `items` or connector `src`/`sink` +\n * connection name, plus an optional trigger. Only the fields that are set ride\n * the wire, so an inline submit is byte-for-byte the realtime POC body and the\n * connector body is additive (`/v1` additive-only rule).\n */\nexport function buildJobBody(options: SubmitJobOptions): Record<string, unknown> {\n const operation = options.operation ?? \"encode\";\n const body: Record<string, unknown> = { operation, model: options.model };\n const sourceFields = resolveSource(options.source, options.connection);\n Object.assign(body, sourceFields);\n Object.assign(\n body,\n resolveSink(\n options.sink,\n sourceFields.connection as string | undefined,\n options.sinkConnection,\n ),\n );\n const mappingFields = resolveFieldMap(options.fieldMap, options.outputField);\n if (Object.keys(mappingFields).length > 0 && !(\"src\" in body)) {\n throw new RequestError(\n \"fieldMap/outputField apply to connector-src jobs; an inline items job maps nothing\",\n \"invalid_request\",\n 400,\n );\n }\n Object.assign(body, mappingFields);\n Object.assign(body, resolveWhen(options.when));\n if (options.outputTypes && options.outputTypes.length > 0) {\n body.output_types = options.outputTypes;\n }\n // Per-item options + op inputs (score query / extract labels / generate\n // sampling), forwarded as-is; an empty map stays off the wire (additive).\n if (options.options && Object.keys(options.options).length > 0) {\n body.options = options.options;\n }\n return body;\n}\n\n/** The chunk-ref metadata from a job status doc (`output.chunks` refs). */\nexport function jobChunks(jobDoc: JobStatus): JobChunk[] {\n const raw = jobDoc.output?.chunks ?? [];\n return raw.map((chunk) => ({\n seq: chunk.seq,\n items: chunk.items,\n state: chunk.state,\n ref: chunk.ref,\n units: chunk.units,\n credits: chunk.credits,\n error: chunk.error ?? null,\n }));\n}\n\nfunction toNumberArrayLike(value: unknown): number[] | Float32Array | null {\n if (value == null) return null;\n if (value instanceof Float32Array) return value;\n if (Array.isArray(value)) return value as number[];\n if (ArrayBuffer.isView(value)) return value as unknown as Float32Array;\n return null;\n}\n\nfunction denseInfo(dense: unknown): {\n dims: number | null;\n vector: number[] | Float32Array | null;\n} {\n if (dense == null) return { dims: null, vector: null };\n if (typeof dense === \"object\" && !Array.isArray(dense) && !ArrayBuffer.isView(dense)) {\n const rec = dense as Record<string, unknown>;\n let raw: unknown = null;\n for (const key of [\"values\", \"vector\", \"dense\"]) {\n if (rec[key] != null) {\n raw = rec[key];\n break;\n }\n }\n const vector = toNumberArrayLike(raw);\n let dims = typeof rec.dims === \"number\" ? rec.dims : null;\n if (dims == null && vector != null) dims = vector.length;\n return { dims, vector };\n }\n const vector = toNumberArrayLike(dense);\n return { dims: vector != null ? vector.length : null, vector };\n}\n\n/** Decode one WorkResult map (from a chunk ref) into a per-item result. */\nexport function decodeResultItem(result: Record<string, unknown>): JobResultItem {\n const payload = result.result_msgpack;\n let decoded: Record<string, unknown> | null = null;\n if (payload instanceof Uint8Array) {\n try {\n decoded = unpackMessage<Record<string, unknown>>(payload);\n } catch {\n decoded = null;\n }\n }\n const dense = decoded && typeof decoded === \"object\" ? decoded.dense : null;\n const { dims, vector } = denseInfo(dense);\n return {\n id: (result.id as string) ?? null,\n success: (result.success as boolean) ?? null,\n units: result.units ?? null,\n dims,\n dense: vector,\n };\n}\n\n/** Decode a chunk ref's msgpack `WorkResult` array into per-item results. */\nexport function decodeChunkBytes(raw: Uint8Array): JobResultItem[] {\n const results = unpackMessage<unknown>(raw);\n if (!Array.isArray(results)) return [];\n return results.map((r) => decodeResultItem(r as Record<string, unknown>));\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.22\"; // 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 ResourceExhaustedError,\n SIEConnectionError,\n SIEStreamError,\n ServerError,\n} from \"./errors.js\";\nimport { toImageWireFormat } from \"./images.js\";\nimport type { ImageInput, ImageWireFormat } from \"./images.js\";\nimport {\n DEFAULT_JOB_WAIT_POLL,\n DEFAULT_JOB_WAIT_TIMEOUT,\n DEFAULT_LEASE_RENEWAL_INTERVAL,\n DEFAULT_LONG_RUNNING_TIMEOUT,\n DEFAULT_PROVISION_TIMEOUT,\n DEFAULT_RETRY_DELAY,\n DEFAULT_TIMEOUT,\n HTTP_CLIENT_ERROR_MIN,\n HTTP_GATEWAY_TIMEOUT,\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 PROVISIONING_ERROR_CODE,\n RESOURCE_EXHAUSTED_ERROR_CODE,\n RESOURCE_EXHAUSTED_MAX_RETRIES,\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 { nextOomRetryDelay, withProvisioningRetry } from \"./internal/provisioning.js\";\nimport { applyRetryJitter } from \"./internal/retry.js\";\nimport {\n type JobResultItem,\n type JobResults,\n type JobStatus,\n type JobSubmitResult,\n type SubmitJobOptions,\n TERMINAL_JOB_STATES,\n buildJobBody,\n decodeChunkBytes,\n jobChunks,\n} from \"./jobs.js\";\nimport { packMessage, unpackMessage } from \"./msgpack.js\";\nimport { parseSseStream } from \"./sse.js\";\nimport type {\n Batch,\n CapacityInfo,\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionOptions,\n ChatCompletionRequest,\n Connection,\n ConnectionCreated,\n ConnectionRevoked,\n CreatePoolOptions,\n EncodeOptions,\n EncodeResult,\n ExtractItem,\n ExtractOptions,\n ExtractResult,\n FileDeleted,\n GenerateChunk,\n GenerateOptions,\n GenerateResult,\n Item,\n ModelInfo,\n PoolInfo,\n PoolSpec,\n RequestMetadata,\n SIEClientOptions,\n File as SIEFile,\n ScoreOptions,\n ScoreResult,\n StatusMessage,\n StreamGenerateOptions,\n} from \"./types.js\";\nimport { SDK_VERSION } from \"./version.js\";\n\n/** The `client.jobs` batch namespace. */\nexport interface JobsNamespace {\n /** Submit a batch job (`POST /v1/jobs`); returns the created-job envelope. */\n submit(options: SubmitJobOptions): Promise<JobSubmitResult>;\n /** Fetch a job's public status doc (`GET /v1/jobs/{id}`). */\n get(jobId: string): Promise<JobStatus>;\n /** List the org's jobs (`GET /v1/jobs`; scoped to the key's org). */\n list(): Promise<JobStatus[]>;\n /** Cancel a job (`POST /v1/jobs/{id}/cancel`); the hold's remainder releases. */\n cancel(jobId: string): Promise<JobStatus>;\n /** Retrieve a finished job's chunk refs and decode the per-item results. */\n results(jobId: string): Promise<JobResults>;\n /**\n * Poll `get` until the job reaches a terminal state, then return its status.\n * Throws a `job_wait_timeout` `RequestError` if `timeoutMs` elapses first.\n * Mirrors the Python SDK's `jobs.wait` (default 600s timeout, 2s poll).\n */\n wait(jobId: string, options?: { timeoutMs?: number; pollMs?: number }): Promise<JobStatus>;\n}\n\n/** The `client.connections` namespace (org-scoped connector auth). */\nexport interface ConnectionsNamespace {\n /** Create an org-scoped connection (connector auth by name). */\n add(name: string, type: string, secret: string): Promise<ConnectionCreated>;\n /** List the org's active connections (secrets redacted). */\n list(): Promise<Connection[]>;\n /** Revoke (soft-delete) a connection; frees the name for reuse. */\n revoke(name: string): Promise<ConnectionRevoked>;\n}\n\n/** Accepted upload payloads — the same shapes `fetch` sends as a body. */\nexport type FileUploadInput = Uint8Array | ArrayBuffer | string | Blob;\n\n/**\n * The `client.files` OpenAI-compatible Files namespace. Method\n * names/args mirror `openai.files` so an `openai` → `sie-sdk` swap is mechanical.\n */\nexport interface FilesNamespace {\n /** Upload a file (`POST /v1/files`); `purpose` defaults to `\"batch\"`. */\n upload(\n file: FileUploadInput,\n options?: { purpose?: string; filename?: string },\n ): Promise<SIEFile>;\n /** OpenAI-exact alias for {@link upload} (`files.create({ file, purpose })`). */\n create(options: { file: FileUploadInput; purpose?: string; filename?: string }): Promise<SIEFile>;\n /** Fetch a file's metadata (`GET /v1/files/{id}`). */\n retrieve(fileId: string): Promise<SIEFile>;\n /** Download a file's raw bytes (`GET /v1/files/{id}/content`). */\n content(fileId: string): Promise<Uint8Array>;\n /** Delete a file (`DELETE /v1/files/{id}`; additive OpenAI-parity surface). */\n delete(fileId: string): Promise<FileDeleted>;\n}\n\n/**\n * The `client.batches` OpenAI-compatible Batch namespace. A\n * batch is a job over an uploaded file's JSONL lines;\n * `list` / `cancel` are the additive OpenAI-parity completion of the surface.\n * Args are OpenAI's exact snake_case body keys, so an `openai` → `sie-sdk` swap\n * is mechanical.\n */\nexport interface BatchesNamespace {\n /** Create a batch (`POST /v1/batches`); returns the Batch object. */\n create(options: {\n input_file_id: string;\n endpoint?: string;\n completion_window?: string;\n metadata?: Record<string, unknown>;\n }): Promise<Batch>;\n /** Fetch a batch's status (`GET /v1/batches/{id}`). */\n retrieve(batchId: string): Promise<Batch>;\n /** List the org's batches (`GET /v1/batches`; additive OpenAI-parity). */\n list(): Promise<Batch[]>;\n /** Cancel a batch (`POST /v1/batches/{id}/cancel`; additive OpenAI-parity). */\n cancel(batchId: string): Promise<Batch>;\n}\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\nfunction parseNonnegativeMeterHeader(headers: Headers, name: string): number | undefined {\n const raw = headers.get(name);\n if (raw === null || !/^(0|[1-9]\\d*)$/.test(raw)) return undefined;\n const parsed = Number(raw);\n return Number.isSafeInteger(parsed) ? parsed : undefined;\n}\n\n/** Parse optional request-scoped metadata from one successful terminal response. */\nfunction parseRequestMetadata(headers: Headers): RequestMetadata | undefined {\n const metadata: RequestMetadata = {};\n const requestId = headers.get(\"x-sie-request-id\");\n if (\n requestId !== null &&\n requestId.length > 0 &&\n requestId.length <= 256 &&\n requestId === requestId.trim() &&\n /^[\\x20-\\x7e]+$/.test(requestId)\n ) {\n metadata.id = requestId;\n }\n const executionIdentitySha256 = headers.get(\"x-sie-execution-identity-sha256\");\n if (\n executionIdentitySha256 !== null &&\n /^[0-9a-f]{64}$/.test(executionIdentitySha256)\n ) {\n metadata.executionIdentitySha256 = executionIdentitySha256;\n }\n\n const usageHeaders = {\n inputTokens: \"x-sie-units-input-tokens\",\n pairs: \"x-sie-units-pairs\",\n images: \"x-sie-units-images\",\n pages: \"x-sie-units-pages\",\n outputTokens: \"x-sie-units-output-tokens\",\n audioMs: \"x-sie-units-audio-ms\",\n } as const;\n const usage: NonNullable<RequestMetadata[\"usage\"]> = {};\n for (const [field, header] of Object.entries(usageHeaders) as [\n keyof typeof usageHeaders,\n string,\n ][]) {\n const value = parseNonnegativeMeterHeader(headers, header);\n if (value !== undefined) usage[field] = value;\n }\n if (Object.keys(usage).length > 0) metadata.usage = usage;\n\n const creditsDebited = parseNonnegativeMeterHeader(headers, \"x-sie-credits-debited\");\n if (creditsDebited !== undefined) metadata.creditsDebited = creditsDebited;\n return Object.keys(metadata).length > 0 ? metadata : undefined;\n}\n\nfunction attachRequestMetadata<T extends { request?: RequestMetadata }>(\n results: T[],\n headers: Headers,\n): void {\n const metadata = parseRequestMetadata(headers);\n if (metadata === undefined) return;\n for (const result of results) {\n result.request = { ...metadata };\n if (metadata.usage !== undefined) result.request.usage = { ...metadata.usage };\n }\n}\n\n/** Enforce the JavaScript safe-integer contract before signed-i64 gateway transport. */\nfunction validateGenerationSeed(seed: number): number {\n if (!Number.isSafeInteger(seed)) {\n throw new RangeError(\"seed must be a JavaScript safe integer\");\n }\n return seed;\n}\n\n/** Serialize the controls shared by blocking and streaming native generation. */\nfunction applyGenerateOptions(body: Record<string, unknown>, options: GenerateOptions): void {\n if (options.temperature !== undefined) body.temperature = options.temperature;\n if (options.topP !== undefined) body.top_p = options.topP;\n if (options.adapterOptions !== undefined) body.options = options.adapterOptions;\n if (options.stop !== undefined) body.stop = options.stop;\n if (options.frequencyPenalty !== undefined) body.frequency_penalty = options.frequencyPenalty;\n if (options.presencePenalty !== undefined) body.presence_penalty = options.presencePenalty;\n if (options.grammar !== undefined) body.grammar = options.grammar;\n if (options.seed !== undefined) body.seed = validateGenerationSeed(options.seed);\n if (options.logitBias !== undefined) body.logit_bias = options.logitBias;\n if (options.routingKey !== undefined) body.routing_key = options.routingKey;\n if (options.promptCacheKey !== undefined) body.prompt_cache_key = options.promptCacheKey;\n if (options.safetyIdentifier !== undefined) body.safety_identifier = options.safetyIdentifier;\n if (options.loraAdapter !== undefined) body.lora_adapter = options.loraAdapter;\n}\n\n/** Derive an upload filename: an explicit override > a File/Blob `.name` > default. */\nfunction resolveUploadFilename(file: FileUploadInput, filename?: string): string {\n if (filename) return filename;\n const name = (file as { name?: unknown }).name;\n if (typeof name === \"string\" && name.length > 0) {\n // A File's `.name` may include a path; keep just the basename.\n return name.split(/[/\\\\]/).pop() || \"upload.jsonl\";\n }\n return \"upload.jsonl\";\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\ntype ItemWithWireImages = Omit<Item, \"images\"> & { images?: ImageWireFormat[] };\ntype ItemForWire = Item | ItemWithWireImages;\n\ninterface AudioWireFormat {\n data: Uint8Array;\n format?: string;\n sample_rate?: number;\n}\n\ntype ExtractItemForWire = Omit<ExtractItem, \"images\" | \"audio\"> & {\n images?: ImageWireFormat[];\n audio?: AudioWireFormat;\n};\n\nfunction isImageWireFormat(image: ImageInput | ImageWireFormat): image is ImageWireFormat {\n return typeof image === \"object\" && image !== null && \"data\" in image;\n}\n\nasync function imageForWire(image: ImageInput | ImageWireFormat): Promise<ImageWireFormat> {\n if (isImageWireFormat(image)) {\n return image;\n }\n return toImageWireFormat(image);\n}\n\nasync function itemImagesForWire(item: Item): Promise<ItemForWire> {\n if (!item.images || item.images.length === 0) {\n return item;\n }\n return { ...item, images: await Promise.all(item.images.map(imageForWire)) };\n}\n\nasync function itemsImagesForWire(items: Item[]): Promise<ItemForWire[]> {\n return Promise.all(items.map(itemImagesForWire));\n}\n\nasync function extractItemForWire(item: ExtractItem): Promise<ExtractItemForWire> {\n const { images, audio, ...wireItem } = item;\n const wireImages = images ? await Promise.all(images.map(imageForWire)) : undefined;\n if (!audio) {\n return { ...wireItem, ...(wireImages === undefined ? {} : { images: wireImages }) };\n }\n if (audio instanceof Uint8Array) {\n return {\n ...wireItem,\n ...(wireImages === undefined ? {} : { images: wireImages }),\n audio: { data: audio },\n };\n }\n const { sampleRate, ...wireAudio } = audio;\n return {\n ...wireItem,\n ...(wireImages === undefined ? {} : { images: wireImages }),\n audio: {\n ...wireAudio,\n ...(sampleRate === undefined ? {} : { sample_rate: sampleRate }),\n },\n };\n}\n\nasync function itemsForExtractWire(items: ExtractItem[]): Promise<ExtractItemForWire[]> {\n return Promise.all(items.map(extractItemForWire));\n}\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 logical pool backed by the cluster's default worker queue\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 private readonly controlPlaneUrl?: string;\n private readonly org?: string;\n\n /** Batch class — `POST/GET /v1/jobs` on the keyed gateway. */\n readonly jobs: JobsNamespace;\n /** Org-scoped connections (connector auth by name) on the control plane. */\n readonly connections: ConnectionsNamespace;\n /** OpenAI-compatible Files API — `POST/GET /v1/files`. */\n readonly files: FilesNamespace;\n /** OpenAI-compatible Batch API — `POST/GET /v1/batches`. */\n readonly batches: BatchesNamespace;\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 // BREAKING CHANGE (0.7): default flipped from `false` to `true` to match\n // the Python SDK (`wait_for_capacity=True`). Callers that relied on\n // fail-fast 503 PROVISIONING / connect-error behaviour must now pass\n // `waitForCapacity: false` explicitly.\n this.defaultWaitForCapacity = options.waitForCapacity ?? true;\n this.provisionTimeout = options.provisionTimeout ?? DEFAULT_PROVISION_TIMEOUT;\n this.controlPlaneUrl = options.controlPlaneUrl?.replace(/\\/$/, \"\");\n this.org = options.org;\n\n // First-class batch + connector surface.\n this.jobs = {\n submit: (submitOptions) => this.jobSubmit(submitOptions),\n get: (jobId) => this.jobGet(jobId),\n list: () => this.jobList(),\n cancel: (jobId) => this.jobCancel(jobId),\n results: (jobId) => this.jobResults(jobId),\n wait: (jobId, options) => this.jobWait(jobId, options),\n };\n this.connections = {\n add: (name, type, secret) => this.connectionAdd(name, type, secret),\n list: () => this.connectionList(),\n revoke: (name) => this.connectionRevoke(name),\n };\n // OpenAI-compatible Files + Batches surface — a base_url\n // swap makes an `openai` batch caller work unchanged.\n this.files = {\n upload: (file, options) => this.fileUpload(file, options),\n create: (options) => this.fileUpload(options.file, options),\n retrieve: (fileId) => this.fileRetrieve(fileId),\n content: (fileId) => this.fileContent(fileId),\n delete: (fileId) => this.fileDelete(fileId),\n };\n this.batches = {\n create: (options) => this.batchCreate(options),\n retrieve: (batchId) => this.batchRetrieve(batchId),\n list: () => this.batchList(),\n cancel: (batchId) => this.batchCancel(batchId),\n };\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 const itemsForWire = await itemsImagesForWire(itemsArray);\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: itemsForWire,\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 attachRequestMetadata(results, response.headers);\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 };\n applyGenerateOptions(body, options);\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 const result = parseGenerateResult(data);\n attachRequestMetadata([result], response.headers);\n return result;\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 (503 PROVISIONING / 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 if (req.seed !== undefined) {\n validateGenerationSeed(req.seed);\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 (503 PROVISIONING /\n // MODEL_LOADING) MUST be handled by the shared provisioning loop.\n // The loop also surfaces `ProvisioningError` when the caller opted out\n // (`waitForCapacity: false`) or the provision budget is exhausted,\n // 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 attachRequestMetadata([data], response.headers);\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 if (req.seed !== undefined) {\n validateGenerationSeed(req.seed);\n }\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 * Delta chunks may carry text, log probabilities, or both; callers must not\n * assume every non-terminal event has a non-empty `text_delta`. The terminal\n * chunk has `done: true`, `finish_reason`, and (typically) `usage` +\n * `ttft_ms`. The generator completes on the `data: [DONE]` 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: StreamGenerateOptions,\n signal?: AbortSignal,\n ): AsyncGenerator<GenerateChunk, void, undefined> {\n const body: Record<string, unknown> = {\n prompt,\n max_new_tokens: options.maxNewTokens,\n stream: true,\n };\n applyGenerateOptions(body, options);\n if (options.logprobs !== undefined) body.logprobs = options.logprobs;\n if (options.topLogprobs !== undefined) {\n body.top_logprobs = options.topLogprobs;\n body.logprobs = true;\n }\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 explicit SAFE\n * pre-execution capacity signals — `503 PROVISIONING`,\n * `503 MODEL_LOADING` and `503 RESOURCE_EXHAUSTED` (the latter only\n * under `waitForCapacity`) — are retried while the provision budget\n * remains; a `504` is post-publish and therefore terminal.\n * Once the body opens we never retry (the call is non-idempotent; a\n * 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 oomRetries = 0;\n let response: Response | undefined;\n\n // Pre-stream provisioning retry loop. We re-fetch on explicit SAFE\n // pre-execution capacity signals only (503 PROVISIONING / MODEL_LOADING /\n // RESOURCE_EXHAUSTED), parallel to `generate()`. The loop terminates by\n // `break`-ing on a 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 // 502 MODEL_LOAD_FAILED is terminal — surface immediately.\n await throwIfModelLoadFailed(attemptResponse, model);\n\n // Retry explicit SAFE pre-execution signals before the stream opens.\n // Without `waitForCapacity`, provisioning falls through to\n // `handleError` and rejects immediately.\n if (attemptResponse.status === 503) {\n const errorCode = await getErrorCode(attemptResponse.clone());\n if (errorCode === PROVISIONING_ERROR_CODE) {\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 retryAfter = getRetryAfter(attemptResponse);\n const delay = retryAfter ?? applyRetryJitter(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 if (errorCode === MODEL_LOADING_ERROR_CODE) {\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 if (errorCode === RESOURCE_EXHAUSTED_ERROR_CODE) {\n // Pre-stream capacity signal. Mirrors the Python streaming\n // surface (`next_stream_retry_delay`): retried only under\n // `waitForCapacity`, bounded by the shared OOM budget.\n if (!waitForCapacity) {\n throw new ResourceExhaustedError(\n `Server resource exhausted after ${oomRetries} retry attempt(s) for model '${model}'`,\n { model, retries: oomRetries },\n );\n }\n const delay = nextOomRetryDelay({\n retryAfter: getRetryAfter(attemptResponse),\n oomRetries,\n maxOomRetries: RESOURCE_EXHAUSTED_MAX_RETRIES,\n elapsedMs: Date.now() - startTime,\n provisionTimeoutMs: this.provisionTimeout,\n model,\n });\n oomRetries += 1;\n if (await abortableSleep(delay, controller.signal)) {\n throw new SIEConnectionError(\"Stream aborted while provisioning\", \"other\");\n }\n continue;\n }\n }\n\n // 504 is terminal on the streaming path: post-publish, a worker may\n // already be generating, and generation is non-idempotent (Python\n // SDK parity — see `next_stream_retry_delay`).\n if (attemptResponse.status === HTTP_GATEWAY_TIMEOUT) {\n throw new ServerError(\n \"Gateway timed out (504) after the request was published to the queue; \" +\n \"a worker may already be generating. Not retried because generation is \" +\n \"non-idempotent (retrying could double-bill).\",\n await getErrorCode(attemptResponse.clone()),\n HTTP_GATEWAY_TIMEOUT,\n );\n }\n\n // Any remaining non-200 is an error.\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 const queryForWire = await itemImagesForWire(query);\n const itemsForWire = await itemsImagesForWire(items);\n\n // Build request body\n const body: Record<string, unknown> = {\n query: queryForWire,\n items: itemsForWire,\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 const result = parseScoreResult(data);\n attachRequestMetadata([result], response.headers);\n return result;\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: ExtractItem, 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(\n model: string,\n items: ExtractItem[],\n options: ExtractOptions,\n ): 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: ExtractItem | ExtractItem[],\n options: ExtractOptions,\n ): Promise<ExtractResult | ExtractResult[]> {\n const isSingleItem = !Array.isArray(items);\n const itemsArray = isSingleItem ? [items] : items;\n const itemsForWire = await itemsForExtractWire(itemsArray);\n\n // Build request body\n const body: Record<string, unknown> = {\n items: itemsForWire,\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 attachRequestMetadata(results, response.headers);\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 logical capacity isolation. By default they draw from the\n * cluster's `default` Helm/NATS queue; pass `queuePool` only when the cluster\n * has a dedicated physical worker queue declared under\n * `queueRouting.staticQueuePools` for this workload.\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 * @param queuePool - Optional Helm/NATS queue namespace backing this logical pool. Defaults to \"default\".\n * @param options - Optional bundle filter, warm floor, and pinned models\n * (Python SDK `create_pool` parity)\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 * // With a bundle filter, warm floor, and pinned models\n * await client.createPool(\"eval-bench\", { l4: 2 }, undefined, undefined, {\n * bundle: \"default\",\n * minimumWorkerCount: 1,\n * pinnedModels: [\"bge-m3\"],\n * });\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 queuePool?: string,\n options: CreatePoolOptions = {},\n ): Promise<void> {\n const alreadyTracking = this.pools.has(name);\n\n if (options.minimumWorkerCount !== undefined && options.minimumWorkerCount < 0) {\n throw new RangeError(\"minimumWorkerCount must be >= 0\");\n }\n\n // Build pool creation request\n const requestBody: {\n name: string;\n gpus?: Record<string, number>;\n gpu_caps?: Record<string, number>;\n queue_pool?: string;\n bundle?: string;\n minimum_worker_count?: number;\n pinned_models?: string[];\n } = {\n name,\n };\n if (gpus !== undefined) {\n requestBody.gpus = gpus;\n }\n if (gpuCaps) {\n requestBody.gpu_caps = gpuCaps;\n }\n if (queuePool) {\n requestBody.queue_pool = queuePool;\n }\n if (options.bundle) {\n requestBody.bundle = options.bundle;\n }\n if (options.minimumWorkerCount !== undefined) {\n requestBody.minimum_worker_count = options.minimumWorkerCount;\n }\n if (options.pinnedModels !== undefined) {\n requestBody.pinned_models = options.pinnedModels;\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: PoolSpec;\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 (capped by `provisionTimeout`):\n * - 503 `PROVISIONING` when `waitForCapacity: true`\n * - 503 `MODEL_LOADING` / `LORA_LOADING`\n * - 503 `RESOURCE_EXHAUSTED` regardless of `waitForCapacity` (bounded\n * exponential backoff, at most `RESOURCE_EXHAUSTED_MAX_RETRIES`)\n * - 504 gateway timeout when `waitForCapacity: true` — encode/score/\n * extract are idempotent queue paths, so a post-publish retry is safe\n * (unlike generate/chat, where a 504 is terminal)\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 // Retry counter for server-side OOM (RESOURCE_EXHAUSTED). Bounded so a\n // stuck-at-OOM server cannot cause unbounded blocking.\n let oomRetries = 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 // 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 explicit retryable 503 signals.\n if (response.status === 503) {\n const clonedResponse = response.clone();\n const errorCode = await getErrorCode(clonedResponse);\n\n if (errorCode === PROVISIONING_ERROR_CODE) {\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 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 const delay = retryAfter ?? applyRetryJitter(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 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 if (errorCode === RESOURCE_EXHAUSTED_ERROR_CODE) {\n // Server-side OOM. Retried regardless of `waitForCapacity`\n // (bounded budget), matching the Python SDK: the worker already\n // accepted the request and is recovering from transient capacity\n // exhaustion.\n const delay = nextOomRetryDelay({\n retryAfter: getRetryAfter(response),\n oomRetries,\n maxOomRetries: RESOURCE_EXHAUSTED_MAX_RETRIES,\n elapsedMs: Date.now() - startTime,\n provisionTimeoutMs: this.provisionTimeout,\n model,\n });\n oomRetries += 1;\n await sleep(delay);\n continue;\n }\n }\n\n // Handle 504 (gateway timeout): queued work was published, but the\n // gateway did not receive a worker result before its deadline.\n // Encode/score/extract are idempotent, so callers that opted into\n // waitForCapacity can retry within the provision budget (Python SDK\n // parity). On budget exhaustion this falls through to handleError.\n if (response.status === HTTP_GATEWAY_TIMEOUT && waitForCapacity) {\n const elapsed = Date.now() - startTime;\n if (elapsed < this.provisionTimeout) {\n const delay = getRetryAfter(response) ?? MODEL_LOADING_DEFAULT_DELAY;\n await sleep(Math.min(delay, this.provisionTimeout - elapsed));\n continue;\n }\n }\n\n // Handle other errors\n if (!response.ok) {\n await handleError(response, gpu);\n }\n\n // Success\n this.checkServerVersion(response);\n return response;\n }\n }\n\n /**\n * Make a single msgpack HTTP request to the SIE server (no retry logic).\n */\n private async request(\n path: string,\n body?: unknown,\n pool?: string,\n gpu?: string,\n ): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n Accept: MSGPACK_CONTENT_TYPE,\n [SDK_VERSION_HEADER]: SDK_VERSION,\n };\n\n if (body !== undefined) {\n headers[\"Content-Type\"] = MSGPACK_CONTENT_TYPE;\n }\n\n // Pool header takes precedence for routing\n if (pool) {\n headers[\"X-SIE-Pool\"] = pool;\n }\n\n if (gpu) {\n headers[\"X-SIE-MACHINE-PROFILE\"] = gpu;\n }\n\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: body !== undefined ? packMessage(body) : undefined,\n signal: controller.signal,\n });\n\n return response;\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new SIEConnectionError(`Request timeout after ${this.timeout}ms`, \"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 // ---------------------------------------------------------------------------\n // Jobs + connections namespaces. Jobs ride the keyed gateway\n // (`/v1/jobs`); connections ride the control plane (`/internal/orgs/{org}/…`).\n // ---------------------------------------------------------------------------\n\n /** One JSON request over `fetch` (bearer auth reused; absolute or base-relative URL). */\n private async jsonRequest<T>(\n target: string,\n method: \"GET\" | \"POST\" | \"DELETE\",\n body?: unknown,\n timeoutMs: number = this.timeout,\n ): Promise<T> {\n const url = target.startsWith(\"http\") ? target : `${this.baseUrl}${target}`;\n const headers: Record<string, string> = {\n Accept: JSON_CONTENT_TYPE,\n [SDK_VERSION_HEADER]: SDK_VERSION,\n };\n if (this.apiKey) headers.Authorization = `Bearer ${this.apiKey}`;\n const init: RequestInit = { method, headers };\n if (body !== undefined) {\n headers[\"Content-Type\"] = JSON_CONTENT_TYPE;\n init.body = JSON.stringify(body);\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n init.signal = controller.signal;\n try {\n const response = await fetch(url, init);\n if (!response.ok) {\n await handleError(response);\n }\n this.checkServerVersion(response);\n const text = await response.text();\n return (text ? JSON.parse(text) : {}) as T;\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new SIEConnectionError(`Request timeout after ${timeoutMs}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 async jobSubmit(options: SubmitJobOptions): Promise<JobSubmitResult> {\n return this.jsonRequest<JobSubmitResult>(\n \"/v1/jobs\",\n \"POST\",\n buildJobBody(options),\n Math.max(this.timeout, DEFAULT_LONG_RUNNING_TIMEOUT),\n );\n }\n\n private async jobGet(jobId: string): Promise<JobStatus> {\n return this.jsonRequest<JobStatus>(`/v1/jobs/${encodeURIComponent(jobId)}`, \"GET\");\n }\n\n private async jobList(): Promise<JobStatus[]> {\n const data = await this.jsonRequest<{ object?: string; data?: JobStatus[] }>(\"/v1/jobs\", \"GET\");\n return Array.isArray(data) ? data : (data.data ?? []);\n }\n\n private async jobCancel(jobId: string): Promise<JobStatus> {\n return this.jsonRequest<JobStatus>(`/v1/jobs/${encodeURIComponent(jobId)}/cancel`, \"POST\");\n }\n\n private async jobResults(jobId: string): Promise<JobResults> {\n const job = await this.jobGet(jobId);\n const chunks = jobChunks(job);\n const items: JobResultItem[] = [];\n for (const chunk of chunks) {\n if (chunk.state !== \"succeeded\" || !chunk.ref) continue;\n const raw = await this.readRef(chunk.ref);\n items.push(...decodeChunkBytes(raw));\n }\n const withDims = items.find((it) => it.dims != null);\n return {\n job_id: job.id ?? jobId,\n state: job.state,\n total_items: job.total_items,\n settled_credits: job.settled_credits,\n chunks,\n retrieved: items.length,\n dims: withDims ? withDims.dims : null,\n items,\n };\n }\n\n private async jobWait(\n jobId: string,\n options?: { timeoutMs?: number; pollMs?: number },\n ): Promise<JobStatus> {\n const timeoutMs = options?.timeoutMs ?? DEFAULT_JOB_WAIT_TIMEOUT;\n const pollMs = options?.pollMs ?? DEFAULT_JOB_WAIT_POLL;\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n const job = await this.jobGet(jobId);\n if (job.state && TERMINAL_JOB_STATES.has(job.state)) {\n return job;\n }\n if (Date.now() >= deadline) {\n throw new RequestError(\n `job ${jobId} still ${JSON.stringify(job.state)} after ${timeoutMs}ms`,\n \"job_wait_timeout\",\n 504,\n );\n }\n await sleep(pollMs);\n }\n }\n\n /** Retrieve a chunk's payload-store ref (http(s) URL). */\n private async readRef(ref: string): Promise<Uint8Array> {\n if (!ref.startsWith(\"http://\") && !ref.startsWith(\"https://\")) {\n throw new RequestError(\n `cannot retrieve payload-store ref ${JSON.stringify(ref)} (the TS SDK reads http(s) refs)`,\n \"bad_ref\",\n 400,\n );\n }\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n try {\n const response = await fetch(ref, {\n headers: { Accept: \"application/octet-stream\" },\n signal: controller.signal,\n });\n if (!response.ok) {\n await handleError(response);\n }\n return new Uint8Array(await response.arrayBuffer());\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 connectionsBase(): string {\n if (!this.controlPlaneUrl) {\n throw new RequestError(\n \"connections require controlPlaneUrl on the client: new SIEClient(url, { controlPlaneUrl, org })\",\n \"missing_control_plane_url\",\n 400,\n );\n }\n if (!this.org) {\n throw new RequestError(\n \"connections require org on the client: new SIEClient(url, { controlPlaneUrl, org })\",\n \"missing_org\",\n 400,\n );\n }\n return `${this.controlPlaneUrl}/internal/orgs/${encodeURIComponent(this.org)}/connections`;\n }\n\n private async connectionAdd(\n name: string,\n type: string,\n secret: string,\n ): Promise<ConnectionCreated> {\n return this.jsonRequest<ConnectionCreated>(this.connectionsBase(), \"POST\", {\n type,\n name,\n secret,\n });\n }\n\n private async connectionList(): Promise<Connection[]> {\n const data = await this.jsonRequest<{ connections?: Connection[] }>(\n this.connectionsBase(),\n \"GET\",\n );\n return Array.isArray(data) ? data : (data.connections ?? []);\n }\n\n private async connectionRevoke(name: string): Promise<ConnectionRevoked> {\n return this.jsonRequest<ConnectionRevoked>(\n `${this.connectionsBase()}/${encodeURIComponent(name)}`,\n \"DELETE\",\n );\n }\n\n // ---------------------------------------------------------------------------\n // Files + batches namespaces — the OpenAI-compatible file /\n // batch surface on the keyed gateway. Method names/args mirror `openai.files`\n // / `openai.batches` so switching an OpenAI-batch caller to the SDK is\n // mechanical.\n // ---------------------------------------------------------------------------\n\n /** POST a raw body and parse the JSON response (bearer auth reused). */\n private async rawPostJson<T>(\n path: string,\n body: FileUploadInput,\n contentType: string,\n timeoutMs: number = this.timeout,\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n Accept: JSON_CONTENT_TYPE,\n \"Content-Type\": contentType,\n [SDK_VERSION_HEADER]: SDK_VERSION,\n };\n if (this.apiKey) headers.Authorization = `Bearer ${this.apiKey}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body,\n signal: controller.signal,\n });\n if (!response.ok) {\n await handleError(response);\n }\n this.checkServerVersion(response);\n const text = await response.text();\n return (text ? JSON.parse(text) : {}) as T;\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new SIEConnectionError(`Request timeout after ${timeoutMs}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 /** GET raw bytes (bearer auth reused); used to download a file's content. */\n private async rawGetBytes(path: string): Promise<Uint8Array> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n Accept: \"application/jsonl\",\n [SDK_VERSION_HEADER]: SDK_VERSION,\n };\n if (this.apiKey) headers.Authorization = `Bearer ${this.apiKey}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n try {\n const response = await fetch(url, { method: \"GET\", headers, signal: controller.signal });\n if (!response.ok) {\n await handleError(response);\n }\n this.checkServerVersion(response);\n return new Uint8Array(await response.arrayBuffer());\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 async fileUpload(\n file: FileUploadInput,\n options?: { purpose?: string; filename?: string },\n ): Promise<SIEFile> {\n const purpose = options?.purpose ?? \"batch\";\n const filename = resolveUploadFilename(file, options?.filename);\n const query = new URLSearchParams({ purpose, filename }).toString();\n const body: FileUploadInput = file instanceof ArrayBuffer ? new Uint8Array(file) : file;\n return this.rawPostJson<SIEFile>(\n `/v1/files?${query}`,\n body,\n \"application/jsonl\",\n Math.max(this.timeout, DEFAULT_LONG_RUNNING_TIMEOUT),\n );\n }\n\n private async fileRetrieve(fileId: string): Promise<SIEFile> {\n return this.jsonRequest<SIEFile>(`/v1/files/${encodeURIComponent(fileId)}`, \"GET\");\n }\n\n private async fileContent(fileId: string): Promise<Uint8Array> {\n return this.rawGetBytes(`/v1/files/${encodeURIComponent(fileId)}/content`);\n }\n\n private async fileDelete(fileId: string): Promise<FileDeleted> {\n return this.jsonRequest<FileDeleted>(`/v1/files/${encodeURIComponent(fileId)}`, \"DELETE\");\n }\n\n private async batchCreate(options: {\n input_file_id: string;\n endpoint?: string;\n completion_window?: string;\n metadata?: Record<string, unknown>;\n }): Promise<Batch> {\n const body: Record<string, unknown> = {\n input_file_id: options.input_file_id,\n endpoint: options.endpoint ?? \"/v1/embeddings\",\n completion_window: options.completion_window ?? \"24h\",\n };\n if (options.metadata !== undefined) {\n body.metadata = options.metadata;\n }\n return this.jsonRequest<Batch>(\n \"/v1/batches\",\n \"POST\",\n body,\n Math.max(this.timeout, DEFAULT_LONG_RUNNING_TIMEOUT),\n );\n }\n\n private async batchRetrieve(batchId: string): Promise<Batch> {\n return this.jsonRequest<Batch>(`/v1/batches/${encodeURIComponent(batchId)}`, \"GET\");\n }\n\n private async batchList(): Promise<Batch[]> {\n const data = await this.jsonRequest<{ object?: string; data?: Batch[] }>(\"/v1/batches\", \"GET\");\n return Array.isArray(data) ? data : (data.data ?? []);\n }\n\n private async batchCancel(batchId: string): Promise<Batch> {\n return this.jsonRequest<Batch>(`/v1/batches/${encodeURIComponent(batchId)}/cancel`, \"POST\");\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\nimport type { ImageInput, ImageWireFormat } from \"./images.js\";\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/** Encoded audio bytes and optional decoder metadata. */\nexport interface AudioInput {\n /** Encoded audio bytes (WAV, MP3, FLAC, etc.) */\n data: Uint8Array;\n /** Audio container/codec format hint */\n format?: string;\n /** Source sample rate in Hz, when known */\n sampleRate?: number;\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 for multimodal models; converted to wire format by the client */\n images?: (ImageInput | ImageWireFormat)[];\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/** An item accepted by extract(), including optional encoded audio. */\nexport interface ExtractItem extends Item {\n /** Encoded audio for speech extraction, optionally with decoder metadata. */\n audio?: AudioInput | Uint8Array;\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/** Authoritative units settled for one completed HTTP request. */\nexport interface RequestUsage {\n inputTokens?: number;\n pairs?: number;\n images?: number;\n pages?: number;\n outputTokens?: number;\n audioMs?: number;\n}\n\n/** Optional gateway metadata from the successful terminal response. */\nexport interface RequestMetadata {\n id?: string;\n /** Worker-origin immutable release/runtime identity digest. */\n executionIdentitySha256?: string;\n usage?: RequestUsage;\n creditsDebited?: 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 /** Request-scoped usage and settled debit, when supplied by the gateway. */\n request?: RequestMetadata;\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\nexport interface ScoreUsage {\n /** Post-truncation input tokens processed */\n inputTokens: number;\n /** Images processed across query-document pairs */\n images?: 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 /** Authoritative usage when emitted by the score adapter */\n usage?: ScoreUsage;\n /** Request-scoped usage and settled debit, when supplied by the gateway. */\n request?: RequestMetadata;\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/** Stable per-item extraction failure. */\nexport interface ExtractItemError {\n /** Stable extraction error code */\n code: string;\n /** Sanitized extraction error message */\n message: string;\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 /** Additional structured extraction data */\n data?: Record<string, unknown>;\n /** Stable per-item failure when extraction did not complete */\n error?: ExtractItemError;\n /** Request-scoped usage and settled debit, when supplied by the gateway. */\n request?: RequestMetadata;\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 /** Number of GPUs on this worker */\n gpuCount: number;\n /** Number of worker GPU slots ready to receive work */\n readyGpuSlots: number;\n /** Whether the worker is healthy */\n healthy: boolean;\n /** Number of items in the worker's queue */\n queueDepth: number;\n /** Worker-local scheduler pending cost */\n pendingCost: number;\n /** Number of batches currently executing on the worker */\n inflightBatches: 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 PoolCreateSpec {\n /** Pool name (used in GPU param as \"poolName/machineProfile\") */\n name: string;\n /** Optional Helm/NATS queue namespace backing this logical pool. Defaults to \"default\"; non-default values must be declared under queueRouting.staticQueuePools. */\n queuePool?: 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}\n\n/**\n * Optional arguments for `SIEClient.createPool`, mirroring the Python SDK's\n * `create_pool` keyword arguments (`bundle`, `minimum_worker_count`,\n * `pinned_models`).\n */\nexport interface CreatePoolOptions {\n /** Optional bundle filter. When set, only workers running this bundle will be assigned to the pool. */\n bundle?: string;\n /**\n * Per-pool warm floor (minimum machines kept warm). The gateway emits\n * canonical `sie.gateway.pool.warm_floor` telemetry; the collector exposes\n * `sie_gateway_pool_warm_floor` to KEDA. Defaults to 0 (scale to zero).\n */\n minimumWorkerCount?: number;\n /**\n * Model ids to keep loaded so the first request to them pays no cold\n * model-load. Each id must be a model the gateway already tracks and may be\n * profile-qualified (\"model-name:profile_name\"); unknown ids are rejected.\n */\n pinnedModels?: string[];\n}\n\n/**\n * Pool specification returned by the gateway.\n */\nexport interface PoolSpec {\n /** Pool name (used in GPU param as \"poolName/machineProfile\") */\n name: string;\n /** Helm/NATS queue namespace backing this logical pool */\n queue_pool?: string;\n /** Optional bundle constraint for this pool */\n bundle?: string | null;\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, as returned by the gateway */\n gpu_caps?: Record<string, number>;\n /** Optional TTL for dynamic pool leases */\n ttl_seconds?: number | null;\n /** Minimum workers kept warm for this pool */\n minimum_worker_count?: number;\n /** Models pinned for this pool */\n pinned_models?: string[];\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: PoolSpec;\n /** Pool status */\n status: PoolStatus;\n}\n\n// ---------------------------------------------------------------------------\n// WebSocket Status Types\n// ---------------------------------------------------------------------------\n\n/**\n * Canonical model residency states. The runtime `MODEL_STATES` array is the\n * single source the `ModelState` type is derived from, so it can be checked\n * against the shared golden fixture (`packages/wire-fixtures/model_state.json`)\n * in CI. Includes `\"failed\"` (a terminal load-failure state) to stay in parity\n * with the Python SDK and server, which already carry it.\n */\nexport const MODEL_STATES = [\"available\", \"loading\", \"loaded\", \"unloading\", \"failed\"] as const;\nexport type ModelState = (typeof MODEL_STATES)[number];\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\n/**\n * Worker status snapshot. Request-rate and latency telemetry is exported\n * through the configured OTel destination instead of this message.\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}\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 /**\n * Whether to auto-retry retryable capacity signals (503 PROVISIONING,\n * idempotent 504 gateway timeouts, transient connect errors).\n * Default: `true`, matching the Python SDK's `wait_for_capacity=True`.\n * BREAKING (0.7): the default was previously `false` — pass `false`\n * explicitly to fail fast.\n */\n waitForCapacity?: boolean;\n /** Maximum time to wait for provisioning in milliseconds (default: 300000) */\n provisionTimeout?: number;\n /**\n * Control-plane base URL for the `connections` namespace (connector\n * auth lives on the control plane, not the keyed gateway). Required to call\n * `client.connections.*`.\n */\n controlPlaneUrl?: string;\n /** Org the `connections` namespace operates on (org-scoped by path in the POC). */\n org?: string;\n}\n\n/**\n * An org-scoped connection (connector auth by name). The secret is never\n * returned by the list endpoint (only the job-runner resolve path sees it).\n */\nexport interface Connection {\n id?: number;\n type?: string;\n name?: string;\n created_at?: number;\n}\n\n/** The `201` envelope from creating a connection (org + connection, no secret). */\nexport interface ConnectionCreated extends Connection {\n org?: string;\n account_id?: number;\n}\n\n/** The envelope from revoking (soft-deleting) a connection. */\nexport interface ConnectionRevoked {\n org?: string;\n account_id?: number;\n name?: string;\n state?: string;\n}\n\n/**\n * An OpenAI-shaped file object (`POST/GET /v1/files`). The\n * gateway emits `{id, object:\"file\", bytes, created_at, filename, purpose}`;\n * `status` / `expires_at` are the optional OpenAI fields surfaced\n * when the TTL-GC lands. Byte-for-byte OpenAI's `FileObject`.\n */\nexport interface File {\n id?: string;\n object?: string;\n bytes?: number;\n created_at?: number;\n filename?: string;\n purpose?: string;\n status?: string;\n expires_at?: number;\n}\n\n/** The envelope from deleting a file (OpenAI `FileDeleted`). */\nexport interface FileDeleted {\n id?: string;\n object?: string;\n deleted?: boolean;\n}\n\n/** Per-batch request tally (OpenAI `request_counts`). */\nexport interface BatchRequestCounts {\n total?: number;\n completed?: number;\n failed?: number;\n}\n\n/**\n * An OpenAI-shaped batch object (`POST/GET /v1/batches`).\n * The gateway emits `{id, object:\"batch\", endpoint, input_file_id,\n * completion_window, status, output_file_id, error_file_id, created_at,\n * finished_at, request_counts, errors}`. The granular OpenAI\n * timestamps (`completed_at` etc.) are optional — a strict OpenAI SDK reads them\n * when the gateway surfaces them.\n */\nexport interface Batch {\n id?: string;\n object?: string;\n endpoint?: string;\n input_file_id?: string;\n completion_window?: string;\n status?: string;\n output_file_id?: string | null;\n error_file_id?: string | null;\n created_at?: number;\n finished_at?: number | null;\n in_progress_at?: number | null;\n completed_at?: number | null;\n failed_at?: number | null;\n expired_at?: number | null;\n cancelled_at?: number | null;\n request_counts?: BatchRequestCounts;\n errors?: unknown;\n metadata?: Record<string, unknown> | null;\n}\n\n/** The listing envelope from `GET /v1/batches` (OpenAI cursor page). */\nexport interface BatchList {\n object?: string;\n data?: Batch[];\n first_id?: string;\n last_id?: string;\n has_more?: boolean;\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 /** OpenAI-compatible frequency penalty in [-2, 2]. */\n frequencyPenalty?: number;\n /** OpenAI-compatible presence penalty in [-2, 2]. */\n presencePenalty?: number;\n /** Native structured-output grammar. */\n grammar?: Record<string, unknown>;\n /**\n * Optional per-request sampling seed. Must be a JavaScript safe integer\n * (-(2^53 - 1) through 2^53 - 1) so JSON serialization preserves it exactly.\n * Reproducibility depends on the active backend and deployment configuration.\n */\n seed?: number;\n /** Token-id-to-bias map. */\n logitBias?: Record<string, number>;\n /** Stable request routing key. */\n routingKey?: string;\n /** Prompt cache affinity key. */\n promptCacheKey?: string;\n /** Opaque privacy-preserving safety identifier. */\n safetyIdentifier?: string;\n /** Served LoRA adapter name. */\n loraAdapter?: string;\n /**\n * Governed generation runtime options forwarded as `options`. Typed native\n * fields still win when both surfaces provide the same sampler control.\n */\n adapterOptions?: Record<string, unknown>;\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/** Options for streaming native generation. */\nexport interface StreamGenerateOptions extends GenerateOptions {\n /** Include per-token log probabilities in streamed chunks. */\n logprobs?: boolean;\n /** Number of alternate token log probabilities to return, in [0, 20]. */\n topLogprobs?: number;\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 /** Request-scoped usage and settled debit, when supplied by the gateway. */\n request?: RequestMetadata;\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 * carrying a base64 `data:` URI are accepted for vision-capable generation\n * models (non-vision/encode-only models reject with `400 unsupported_field`;\n * remote (non-`data:`) URLs reject with `400 invalid_request`). 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. Text parts\n * (`text` / `input_text`) are concatenated; image parts (`image_url` /\n * `input_image`) carry a base64 `data:` URI and are accepted for vision-capable\n * generation models.\n */\nexport type ChatContentPart =\n | { type: \"text\"; text: string }\n | { type: \"input_text\"; text: string }\n | { type: \"image_url\"; image_url: { url: string } }\n | { type: \"input_image\"; image_url: string | { url: 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 /**\n * Optional per-request sampling seed. Must be a JavaScript safe integer\n * (`-(2^53 - 1)` through `2^53 - 1`) so the caller's integer is represented\n * exactly. The SDK throws `RangeError` before network I/O for invalid values.\n * Reproducibility depends on the active backend and deployment configuration.\n */\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 /** Request-scoped usage and settled debit, when supplied by the gateway. */\n request?: RequestMetadata;\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 * (`503 PROVISIONING`, `503 MODEL_LOADING`, `503 RESOURCE_EXHAUSTED`)\n * until `provisionTimeoutMs` elapses. When `false`, the first\n * provisioning signal throws (`ProvisioningError` / `ModelLoadingError`\n * / `ServerError`). Defaults to the client's `waitForCapacity`\n * (true unless the constructor opted out).\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 /** Per-token log probabilities aligned with `text_delta`. */\n logprobs?: Array<Record<string, unknown>>;\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"]}
|