segmind 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/errors.ts","../src/chat.ts","../src/core/env.ts","../src/core/http.ts","../src/job.ts","../src/version.ts","../src/client.ts","../src/image-url.ts","../src/index.ts"],"sourcesContent":["export interface SegmindErrorOptions {\n status?: number;\n detail?: string;\n requestId?: string;\n body?: unknown;\n cause?: unknown;\n}\n\n/** Base class of every error the SDK throws (except an `AbortSignal`'s own reason). */\nexport class SegmindError extends Error {\n /** HTTP status, when the error came from a response. */\n readonly status: number | undefined;\n /** The server's error text (`error` in the response body), when it sent one. */\n readonly detail: string | undefined;\n /** The v2 request id the error belongs to, when there is one. */\n readonly requestId: string | undefined;\n /** The parsed response body, or its text when it was not JSON. */\n readonly body: unknown;\n\n constructor(message: string, options: SegmindErrorOptions = {}) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = new.target.name;\n this.status = options.status;\n this.detail = options.detail;\n this.requestId = options.requestId;\n this.body = options.body;\n }\n\n /** Reads the response body and builds the error. Consumes the body. */\n static async fromResponse(response: Response, requestId?: string): Promise<SegmindError> {\n const text = await response.text().catch(() => '');\n let body: unknown = text;\n try {\n body = text ? JSON.parse(text) : undefined;\n } catch {\n // not JSON: keep the text\n }\n const detail = errorDetail(body) ?? (typeof body === 'string' && body ? body.slice(0, 500) : undefined);\n const message = detail ? `${response.status} ${detail}` : `${response.status} ${response.statusText || 'request failed'}`;\n return new SegmindError(message, { status: response.status, detail, requestId, body });\n }\n}\n\n/** The request never got a response: DNS, TLS, connection reset, or the client's timeout. */\nexport class APIConnectionError extends SegmindError {}\n\n/** A v2 request reached `FAILED`. The server's error text is in `detail`. */\nexport class InferenceFailed extends SegmindError {\n /** The status body that reported the failure. */\n readonly statusBody: Record<string, unknown>;\n\n constructor(requestId: string, statusBody: Record<string, unknown>) {\n const detail = typeof statusBody.error === 'string' ? statusBody.error : undefined;\n super(detail ? `request ${requestId} failed: ${detail}` : `request ${requestId} failed`, {\n detail,\n requestId,\n body: statusBody,\n });\n this.statusBody = statusBody;\n }\n}\n\n/**\n * `wait()` ran past its timeout. The request may still finish on the server:\n * `job.status()` or a new `wait()` picks it up again.\n */\nexport class InferenceTimeout extends SegmindError {\n readonly elapsedMs: number;\n\n constructor(requestId: string, elapsedMs: number) {\n super(`request ${requestId} did not finish within ${Math.round(elapsedMs)} ms`, { requestId });\n this.elapsedMs = elapsedMs;\n }\n}\n\nfunction errorDetail(body: unknown): string | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const record = body as Record<string, unknown>;\n for (const key of ['error', 'message', 'detail']) {\n const value = record[key];\n if (typeof value === 'string' && value) return value;\n if (value && typeof value === 'object' && typeof (value as { message?: unknown }).message === 'string') {\n return (value as { message: string }).message;\n }\n }\n return undefined;\n}\n","import { SegmindError } from './core/errors';\nimport type { Params, RunResult } from './types';\n\n/** An OpenAI-style chat message; content may be text or a list of parts. */\nexport interface ChatMessage {\n role: 'system' | 'developer' | 'user' | 'assistant' | 'tool' | (string & {});\n content: string | Array<Record<string, unknown>>;\n [key: string]: unknown;\n}\n\n/** Chat inputs: `messages` or `prompt` (at least one), plus any model params. */\nexport type ChatParams = Params & {\n messages?: ChatMessage[];\n prompt?: string;\n};\n\ntype Raw = Record<string, unknown>;\n\n/**\n * One reply from any chat model. The gateway returns each provider's own JSON\n * (OpenAI, Anthropic or Gemini shape); this reads the common fields from all\n * three. `raw` is always the provider's body, untouched.\n */\nexport class ChatResponse {\n constructor(readonly raw: Raw) {}\n\n /** The assistant's text. Throws when the body holds none (inspect `raw`). */\n get text(): string {\n const text = extractText(this.raw);\n if (text === undefined) {\n throw new SegmindError(\n `could not find assistant text in the response (top-level keys: ${Object.keys(this.raw).sort().join(', ')}); inspect ChatResponse.raw`,\n { body: this.raw },\n );\n }\n return text;\n }\n\n /** `text` parsed as JSON, for JSON mode and structured outputs. */\n json<T = unknown>(): T {\n const text = this.text;\n try {\n return JSON.parse(text) as T;\n } catch (err) {\n throw new SegmindError(`ChatResponse.text is not valid JSON: ${(err as Error).message}`, {\n body: text,\n cause: err,\n });\n }\n }\n\n /** The provider's token usage (`usage` or Gemini's `usageMetadata`). */\n get usage(): Record<string, unknown> | undefined {\n return (record(this.raw.usage) ?? record(this.raw.usageMetadata)) || undefined;\n }\n\n /** Why generation stopped (`finish_reason`, `stop_reason` or `finishReason`). */\n get finishReason(): string | undefined {\n if (Array.isArray(this.raw.choices)) return str(record(this.raw.choices[0])?.finish_reason);\n if ('stop_reason' in this.raw) return str(this.raw.stop_reason);\n if (Array.isArray(this.raw.candidates)) return str(record(this.raw.candidates[0])?.finishReason);\n return undefined;\n }\n\n /** Tool calls in the OpenAI shape, when the model made any. */\n get toolCalls(): unknown[] {\n if (!Array.isArray(this.raw.choices)) return [];\n const calls = record(record(this.raw.choices[0])?.message)?.tool_calls;\n return Array.isArray(calls) ? calls : [];\n }\n}\n\n/** Validates chat inputs. Every other key passes to the model unchanged. */\nexport function chatBody(params: ChatParams): Params {\n if (params.messages === undefined && params.prompt === undefined) {\n throw new SegmindError('chat: pass messages: [...] or prompt: \"...\"');\n }\n if (params.stream === true) {\n throw new SegmindError('chat: streaming is not supported yet; omit stream or set it to false');\n }\n return params;\n}\n\n/**\n * A v2 result carries the provider's JSON as a string in `output`. Decode it;\n * accept an object there too, and treat non-JSON text as the reply itself.\n */\nexport function chatFromRunResult(body: RunResult): ChatResponse {\n const output = body.output;\n if (typeof output === 'string') {\n try {\n const parsed: unknown = JSON.parse(output);\n if (record(parsed)) return new ChatResponse(parsed as Raw);\n } catch {\n // plain text reply\n }\n return new ChatResponse({ choices: [{ message: { content: output } }] });\n }\n if (record(output)) return new ChatResponse(output as Raw);\n return new ChatResponse(body);\n}\n\nfunction extractText(raw: Raw): string | undefined {\n // OpenAI: choices[0].message.content (a string, or a list of text parts)\n if ('choices' in raw) {\n const content = record(record(Array.isArray(raw.choices) ? raw.choices[0] : undefined)?.message)?.content;\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n return content\n .map(record)\n .filter((part) => part && (part.type === undefined || part.type === 'text'))\n .map((part) => str(part!.text) ?? '')\n .join('');\n }\n return undefined;\n }\n // Anthropic: content: [{type: \"text\", text}]\n if (Array.isArray(raw.content)) {\n return raw.content\n .map(record)\n .filter((part) => part?.type === 'text')\n .map((part) => str(part!.text) ?? '')\n .join('');\n }\n // Gemini: candidates[0].content.parts[].text\n if ('candidates' in raw) {\n const candidate = record(Array.isArray(raw.candidates) ? raw.candidates[0] : undefined);\n const parts = record(candidate?.content)?.parts;\n if (!Array.isArray(parts)) return candidate ? '' : undefined;\n return parts.map((part) => str(record(part)?.text) ?? '').join('');\n }\n return undefined;\n}\n\nfunction record(value: unknown): Raw | undefined {\n return value && typeof value === 'object' && !Array.isArray(value) ? (value as Raw) : undefined;\n}\n\nfunction str(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n","type Globals = {\n process?: { env?: Record<string, string | undefined>; versions?: { node?: string }; version?: string };\n navigator?: { product?: string };\n window?: unknown;\n document?: unknown;\n Buffer?: { from(data: Uint8Array): { toString(encoding: 'base64'): string } };\n crypto?: { randomUUID?: () => string };\n};\n\nconst g = globalThis as unknown as Globals;\n\nexport type Runtime = 'node' | 'browser' | 'react-native' | 'other';\n\n/** Where this code is running. React Native is checked first: it defines `window`. */\nexport function detectRuntime(): Runtime {\n if (g.navigator?.product === 'ReactNative') return 'react-native';\n if (typeof g.window !== 'undefined' && typeof g.document !== 'undefined') return 'browser';\n if (g.process?.versions?.node) return 'node';\n return 'other';\n}\n\n/** An environment variable, or undefined where there is no `process.env`. */\nexport function readEnv(name: string): string | undefined {\n try {\n const value = g.process?.env?.[name];\n return value?.trim() ? value.trim() : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function nodeVersion(): string | undefined {\n return g.process?.versions?.node ? g.process.version : undefined;\n}\n\n/**\n * A request id the gateway accepts as `X-Request-ID` ([A-Za-z0-9_-]{8,128}).\n * React Native has no `crypto.randomUUID` without a polyfill, hence the fallback.\n */\nexport function randomRequestId(): string {\n const uuid = g.crypto?.randomUUID?.();\n if (uuid) return uuid;\n let id = '';\n for (let i = 0; i < 32; i++) id += Math.floor(Math.random() * 16).toString(16);\n return id;\n}\n\nexport function toBase64(bytes: Uint8Array): string {\n if (g.Buffer) return g.Buffer.from(bytes).toString('base64');\n let binary = '';\n const chunk = 0x8000;\n for (let i = 0; i < bytes.length; i += chunk) {\n binary += String.fromCharCode(...bytes.subarray(i, i + chunk));\n }\n return btoa(binary);\n}\n","import { APIConnectionError, SegmindError } from './errors';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\nexport interface HttpConfig {\n apiKey: string | undefined;\n fetch: typeof fetch;\n timeout: number;\n maxRetries: number;\n headers: Record<string, string>;\n}\n\nexport interface HttpRequest {\n method: HttpMethod;\n url: string;\n /** Sent as JSON. */\n body?: unknown;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n /** Milliseconds for this attempt; defaults to the client's timeout. */\n timeout?: number;\n /**\n * Retry connection errors and retryable statuses. Only for requests that\n * cannot bill twice: reads, polls, and v2 submits that carry an\n * `X-Request-ID` (the gateway answers a repeat with 409, not a second job).\n */\n retry?: boolean;\n}\n\n/** Statuses worth another attempt: the request was not processed. */\nexport const RETRYABLE_STATUS = new Set([408, 429, 502, 503, 504]);\n\nconst MAX_RETRY_DELAY_MS = 60_000;\n\n/** Delay before retry number `attempt` (0-based), honouring `Retry-After`. */\nexport function retryDelay(attempt: number, retryAfter: string | null, now = Date.now()): number {\n if (retryAfter) {\n const seconds = Number(retryAfter);\n if (Number.isFinite(seconds) && seconds >= 0) return Math.min(seconds * 1000, MAX_RETRY_DELAY_MS);\n const date = Date.parse(retryAfter);\n if (!Number.isNaN(date)) return Math.min(Math.max(date - now, 0), MAX_RETRY_DELAY_MS);\n }\n const base = Math.min(500 * 2 ** attempt, 8000);\n return base * (0.75 + Math.random() * 0.25);\n}\n\n/** Resolves after `ms`, or rejects with the signal's reason when it aborts. */\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason);\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(signal!.reason);\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nexport class HttpClient {\n constructor(readonly config: HttpConfig) {}\n\n /** The response whatever its status, after retries when `retry` is set. */\n async fetchRaw(req: HttpRequest): Promise<Response> {\n for (let attempt = 0; ; attempt++) {\n const canRetry = req.retry === true && attempt < this.config.maxRetries;\n let response: Response;\n try {\n response = await this.attempt(req);\n } catch (err) {\n if (canRetry && err instanceof APIConnectionError) {\n await sleep(retryDelay(attempt, null), req.signal);\n continue;\n }\n throw err;\n }\n if (canRetry && RETRYABLE_STATUS.has(response.status)) {\n await response.body?.cancel().catch(() => undefined);\n await sleep(retryDelay(attempt, response.headers.get('retry-after')), req.signal);\n continue;\n }\n return response;\n }\n }\n\n /** The response, or a `SegmindError` for any status outside 2xx. */\n async request(req: HttpRequest): Promise<Response> {\n const response = await this.fetchRaw(req);\n if (!response.ok) throw await SegmindError.fromResponse(response);\n return response;\n }\n\n /** The parsed JSON body of a 2xx response. */\n async json<T>(req: HttpRequest): Promise<T> {\n return readJson<T>(await this.request(req));\n }\n\n private async attempt(req: HttpRequest): Promise<Response> {\n const { signal } = req;\n if (signal?.aborted) throw signal.reason;\n\n const timeout = req.timeout ?? this.config.timeout;\n const controller = new AbortController();\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, timeout);\n const onAbort = () => controller.abort(signal!.reason);\n signal?.addEventListener('abort', onAbort, { once: true });\n\n const headers: Record<string, string> = { ...this.config.headers, ...req.headers };\n if (this.config.apiKey) headers['x-api-key'] = this.config.apiKey;\n if (req.body !== undefined) headers['content-type'] = 'application/json';\n\n try {\n return await this.config.fetch(req.url, {\n method: req.method,\n headers,\n body: req.body === undefined ? undefined : JSON.stringify(req.body),\n signal: controller.signal,\n });\n } catch (err) {\n if (signal?.aborted) throw signal.reason ?? err;\n const reason = timedOut ? `request timed out after ${timeout} ms` : `connection error: ${describe(err)}`;\n throw new APIConnectionError(`${req.method} ${req.url}: ${reason}`, { cause: err });\n } finally {\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n }\n }\n}\n\nexport async function readJson<T>(response: Response): Promise<T> {\n const text = await response.text();\n try {\n return JSON.parse(text) as T;\n } catch (err) {\n throw new SegmindError(`${response.status} response was not JSON`, {\n status: response.status,\n body: text.slice(0, 500),\n cause: err,\n });\n }\n}\n\nfunction describe(err: unknown): string {\n if (err instanceof Error) {\n const cause = (err as { cause?: unknown }).cause;\n return cause instanceof Error ? `${err.message} (${cause.message})` : err.message;\n }\n return String(err);\n}\n","import { InferenceFailed, InferenceTimeout, SegmindError } from './core/errors';\nimport { type HttpClient, readJson, sleep } from './core/http';\nimport type { JobStatus, RunResult, SubmitResponse, WaitOptions } from './types';\n\nexport const DEFAULT_WAIT_TIMEOUT_MS = 600_000;\nexport const DEFAULT_WAIT_INTERVAL_MS = 1_000;\n\nconst TERMINAL = new Set(['COMPLETED', 'FAILED']);\n\n/**\n * A submitted v2 request. `wait()` polls until it finishes; `status()` and\n * `result()` read it once.\n */\nexport class Job<T = RunResult> {\n readonly requestId: string;\n readonly statusUrl: string;\n readonly responseUrl: string;\n\n constructor(\n private readonly http: HttpClient,\n /** The body the submit returned. */\n readonly submitResponse: SubmitResponse,\n private readonly transform: (body: RunResult) => T = (body) => body as T,\n ) {\n this.requestId = submitResponse.request_id;\n this.statusUrl = submitResponse.status_url;\n this.responseUrl = submitResponse.response_url;\n }\n\n /** The current state, without waiting. */\n async status(options: { signal?: AbortSignal } = {}): Promise<JobStatus> {\n return (await this.read(this.statusUrl, options.signal)) as JobStatus;\n }\n\n /**\n * The finished result. Throws `InferenceFailed` when the request failed, and\n * a `SegmindError` when it has not finished yet (use `wait()` for that).\n */\n async result(options: { signal?: AbortSignal } = {}): Promise<T> {\n const body = (await this.read(this.responseUrl, options.signal)) as RunResult;\n if (body.status === 'FAILED') throw new InferenceFailed(this.requestId, body);\n if (body.status !== undefined && body.status !== 'COMPLETED') {\n throw new SegmindError(`request ${this.requestId} is still ${String(body.status)}; use wait()`, {\n requestId: this.requestId,\n body,\n });\n }\n return this.transform(body);\n }\n\n /** Polls until the request finishes, then returns its result. */\n async wait(options: WaitOptions = {}): Promise<T> {\n const timeout = options.timeout ?? DEFAULT_WAIT_TIMEOUT_MS;\n const interval = options.interval ?? DEFAULT_WAIT_INTERVAL_MS;\n const started = Date.now();\n for (;;) {\n const status = await this.status({ signal: options.signal });\n if (status.status === 'COMPLETED') return this.result({ signal: options.signal });\n if (status.status === 'FAILED') throw new InferenceFailed(this.requestId, status);\n const elapsed = Date.now() - started;\n if (elapsed >= timeout) throw new InferenceTimeout(this.requestId, elapsed);\n await sleep(Math.min(interval, timeout - elapsed), options.signal);\n }\n }\n\n /**\n * The gateway serves a FAILED request's body with HTTP 422 on both the status\n * and result URLs. A body that names a terminal state is the answer whatever\n * its status code; anything else outside 2xx is a real error.\n */\n private async read(url: string, signal: AbortSignal | undefined): Promise<Record<string, unknown>> {\n const response = await this.http.fetchRaw({ method: 'GET', url, signal, retry: true });\n if (response.ok) return readJson<Record<string, unknown>>(response);\n const error = await SegmindError.fromResponse(response, this.requestId);\n const body = error.body;\n if (body && typeof body === 'object' && TERMINAL.has(String((body as { status?: unknown }).status))) {\n return body as Record<string, unknown>;\n }\n throw error;\n }\n}\n","// Kept equal to package.json \"version\" by scripts/sync-version.mjs; test/misc.test.ts fails if they drift.\nexport const VERSION = '0.1.0';\n","import { type ChatParams, ChatResponse, chatBody, chatFromRunResult } from './chat';\nimport { detectRuntime, nodeVersion, randomRequestId, readEnv } from './core/env';\nimport { APIConnectionError, SegmindError } from './core/errors';\nimport { HttpClient, readJson, retryDelay, sleep } from './core/http';\nimport { Job } from './job';\nimport type { CallOptions, Params, RunOptions, RunResult, SubmitOptions, SubmitResponse } from './types';\nimport { VERSION } from './version';\n\nexport const DEFAULT_BASE_URL = 'https://api.segmind.com';\nexport const DEFAULT_SPOT_URL = 'https://api.spotprod.segmind.com';\nexport const DEFAULT_CONSOLE_URL = 'https://cloud.segmind.com/api';\n\nexport interface ClientOptions {\n /** Your Segmind API key. Defaults to `SEGMIND_API_KEY` from the environment. */\n apiKey?: string;\n /** The inference API root, without `/v1`. Defaults to `SEGMIND_BASE_URL` or https://api.segmind.com. */\n baseURL?: string;\n /** The catalog and history API. Default https://api.spotprod.segmind.com. */\n spotURL?: string;\n /** The account API. Default https://cloud.segmind.com/api. */\n consoleURL?: string;\n /** Milliseconds per HTTP request. Default 600 000. */\n timeout?: number;\n /** Retries for requests that cannot bill twice. Default 2. */\n maxRetries?: number;\n /** A `fetch` implementation. Defaults to the global one. */\n fetch?: typeof fetch;\n /** Headers added to every request. */\n defaultHeaders?: Record<string, string>;\n /**\n * Allow an API key in a browser or React Native app. Anyone who can open the\n * app can read the key and spend your credits. Prefer calling your own\n * backend, or realtime session tokens.\n */\n dangerouslyAllowBrowser?: boolean;\n}\n\n/**\n * The Segmind API client.\n *\n * ```ts\n * const segmind = new Segmind(); // reads SEGMIND_API_KEY\n * const result = await segmind.run('seedream-4.5', { prompt: 'A sunset over mountains' });\n * ```\n */\nexport class Segmind {\n readonly baseURL: string;\n readonly spotURL: string;\n readonly consoleURL: string;\n readonly models: Models;\n readonly accounts: Accounts;\n /** @internal */\n readonly http: HttpClient;\n\n constructor(options: ClientOptions = {}) {\n const apiKey = options.apiKey ?? readEnv('SEGMIND_API_KEY');\n const runtime = detectRuntime();\n if (apiKey && (runtime === 'browser' || runtime === 'react-native') && !options.dangerouslyAllowBrowser) {\n throw new SegmindError(\n 'An API key in a browser or mobile app exposes it to every user. Call Segmind from your backend instead, ' +\n 'or pass dangerouslyAllowBrowser: true if you accept that risk.',\n );\n }\n if (!apiKey) {\n throw new SegmindError('Missing API key: pass { apiKey } or set the SEGMIND_API_KEY environment variable.');\n }\n const fetchImpl = options.fetch ?? globalThis.fetch?.bind(globalThis);\n if (!fetchImpl) throw new SegmindError('No fetch implementation available: pass { fetch }.');\n\n this.baseURL = trimBase(options.baseURL ?? readEnv('SEGMIND_BASE_URL') ?? DEFAULT_BASE_URL);\n this.spotURL = trimSlash(options.spotURL ?? DEFAULT_SPOT_URL);\n this.consoleURL = trimSlash(options.consoleURL ?? DEFAULT_CONSOLE_URL);\n\n const headers: Record<string, string> = { 'X-Initiator': 'SDK-JS', ...options.defaultHeaders };\n const node = nodeVersion();\n if (runtime === 'node' && node) headers['User-Agent'] = `segmind-js/${VERSION} node/${node}`;\n\n this.http = new HttpClient({\n apiKey,\n fetch: fetchImpl,\n timeout: options.timeout ?? 600_000,\n maxRetries: options.maxRetries ?? 2,\n headers,\n });\n this.models = new Models(this);\n this.accounts = new Accounts(this);\n }\n\n /**\n * Runs a model and returns its result: submits to the v2 queue, then polls\n * until it finishes. `params` go to the model unchanged.\n */\n async run(slug: string, params: Params = {}, options: RunOptions = {}): Promise<RunResult> {\n const job = await this.submit(slug, params, options);\n return job.wait(options);\n }\n\n /**\n * One blocking `POST /v1/{slug}`. Returns the fetch `Response`: call\n * `.arrayBuffer()` for media or `.json()` for JSON models. Never retried,\n * because the call bills.\n */\n async runSync(slug: string, params: Params = {}, options: CallOptions = {}): Promise<Response> {\n return this.http.request({\n method: 'POST',\n url: `${this.baseURL}/v1/${path(slug)}`,\n body: params,\n signal: options.signal,\n timeout: options.timeout,\n });\n }\n\n /**\n * Submits to the v2 queue and returns a `Job` to wait on. Safe to retry: the\n * submit carries an `X-Request-ID`, and the gateway answers a repeat with\n * the existing request rather than a second one.\n */\n async submit(slug: string, params: Params = {}, options: SubmitOptions = {}): Promise<Job> {\n return this.submitJob(slug, params, options, (body) => body);\n }\n\n /** Chat with an LLM through the v2 queue. Returns a provider-neutral reply. */\n async chat(slug: string, params: ChatParams, options: RunOptions = {}): Promise<ChatResponse> {\n const job = await this.submitChat(slug, params, options);\n return job.wait(options);\n }\n\n /** Chat with one blocking `POST /v1/{slug}`. */\n async chatSync(slug: string, params: ChatParams, options: CallOptions = {}): Promise<ChatResponse> {\n const response = await this.runSync(slug, chatBody(params), options);\n return new ChatResponse(await readJson<Record<string, unknown>>(response));\n }\n\n /** Submits a chat to the v2 queue and returns a `Job` whose result is a `ChatResponse`. */\n async submitChat(slug: string, params: ChatParams, options: SubmitOptions = {}): Promise<Job<ChatResponse>> {\n return this.submitJob(slug, chatBody(params), options, chatFromRunResult);\n }\n\n private async submitJob<T>(\n slug: string,\n params: Params,\n options: SubmitOptions,\n transform: (body: RunResult) => T,\n ): Promise<Job<T>> {\n const url = `${this.baseURL}/v2/${path(slug)}`;\n const maxRetries = this.http.config.maxRetries;\n let requestId = options.requestId ?? randomRequestId();\n\n for (let attempt = 0; ; attempt++) {\n const canRetry = attempt < maxRetries;\n let response: Response;\n try {\n response = await this.http.fetchRaw({\n method: 'POST',\n url,\n body: params,\n headers: { 'X-Request-ID': requestId },\n signal: options.signal,\n });\n } catch (err) {\n // The submit may or may not have arrived. Resending the same id is\n // safe: a request that did arrive comes back as 409 with its URLs.\n if (canRetry && err instanceof APIConnectionError) {\n await sleep(retryDelay(attempt, null), options.signal);\n continue;\n }\n throw err;\n }\n\n if (response.ok || response.status === 409) {\n const body = await readJson<SubmitResponse>(response);\n if (response.status === 409 && !body.status_url) {\n throw new SegmindError(`409 ${String((body as { error?: unknown }).error ?? 'conflict')}`, {\n status: 409,\n requestId,\n body,\n });\n }\n return new Job(this.http, validateSubmit(body, response.status), transform);\n }\n if (canRetry && response.status === 503) {\n // Queueing failed and nothing was billed; the gateway asks for a new id.\n await response.body?.cancel().catch(() => undefined);\n requestId = randomRequestId();\n await sleep(retryDelay(attempt, response.headers.get('retry-after')), options.signal);\n continue;\n }\n if (canRetry && (response.status === 429 || response.status === 502 || response.status === 504)) {\n await response.body?.cancel().catch(() => undefined);\n await sleep(retryDelay(attempt, response.headers.get('retry-after')), options.signal);\n continue;\n }\n throw await SegmindError.fromResponse(response, requestId);\n }\n }\n}\n\n/** One catalog entry. Only the commonly used fields are typed. */\nexport interface ModelInfo {\n slug: string;\n title?: string;\n type?: string;\n description?: string;\n is_visible?: boolean;\n is_depreciated?: boolean;\n is_new?: boolean;\n coming_soon?: boolean;\n parameters_schema?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/** The catalog response, as the API returns it. */\nexport interface ModelsListResponse {\n 'Inference Model Information List': ModelInfo[];\n [key: string]: unknown;\n}\n\n/** The model catalog. */\nexport class Models {\n constructor(private readonly client: Segmind) {}\n\n /** Every model in the catalog, under the key `Inference Model Information List`. */\n async list(options: { signal?: AbortSignal } = {}): Promise<ModelsListResponse> {\n return this.client.http.json({\n method: 'GET',\n url: `${this.client.spotURL}/inference-model-information/list`,\n signal: options.signal,\n retry: true,\n });\n }\n}\n\n/** The account the API key belongs to. */\nexport class Accounts {\n constructor(private readonly client: Segmind) {}\n\n /** Account details for the API key. */\n async current(options: { signal?: AbortSignal } = {}): Promise<Record<string, unknown>> {\n return this.client.http.json({\n method: 'GET',\n url: `${this.client.consoleURL}/auth/authenticate`,\n signal: options.signal,\n retry: true,\n });\n }\n}\n\nfunction validateSubmit(body: SubmitResponse, status: number): SubmitResponse {\n if (!body.request_id || !body.status_url || !body.response_url) {\n throw new SegmindError(\n `v2 submit returned ${status} without request_id, status_url and response_url (keys: ${Object.keys(body).sort().join(', ')})`,\n { status, body },\n );\n }\n return body;\n}\n\nfunction path(slug: string): string {\n const clean = slug.trim().replace(/^\\/+/, '');\n if (!clean) throw new SegmindError('A model slug is required.');\n return clean;\n}\n\nfunction trimSlash(url: string): string {\n return url.replace(/\\/+$/, '');\n}\n\n/** Accepts `https://api.segmind.com/v1` too, since that is what the Python SDK takes. */\nfunction trimBase(url: string): string {\n return trimSlash(url).replace(/\\/v\\d+$/, '');\n}\n","import { detectRuntime, toBase64 } from './core/env';\nimport { SegmindError } from './core/errors';\n\n/** An OpenAI-style image part, for the `content` list of a chat message. */\nexport interface ImageUrlPart {\n type: 'image_url';\n image_url: { url: string };\n}\n\nexport type ImageInput = string | Blob | ArrayBuffer | Uint8Array;\n\nconst MIME_BY_EXTENSION: Record<string, string> = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n svg: 'image/svg+xml',\n heic: 'image/heic',\n heif: 'image/heif',\n tif: 'image/tiff',\n tiff: 'image/tiff',\n avif: 'image/avif',\n};\n\n/**\n * Builds an image part for a chat message.\n *\n * - An `http(s)://` or `data:` URL passes through.\n * - A file path (Node only) is read and inlined as a base64 `data:` URI.\n * - A `Blob`, `ArrayBuffer` or `Uint8Array` is inlined; pass `mimeType` when\n * it cannot be told from the blob or the bytes.\n *\n * Inlining is the safer route: the gateway cannot fetch URLs on every host.\n */\nexport async function imageUrl(input: ImageInput, options: { mimeType?: string } = {}): Promise<ImageUrlPart> {\n return { type: 'image_url', image_url: { url: await toDataUri(input, options.mimeType) } };\n}\n\nasync function toDataUri(input: ImageInput, mimeType: string | undefined): Promise<string> {\n if (typeof input === 'string') {\n if (/^(https?:|data:)/i.test(input)) return input;\n if (detectRuntime() !== 'node') {\n throw new SegmindError(`imageUrl: ${JSON.stringify(input)} is not an http(s) or data: URL (file paths work in Node only)`);\n }\n return fileToDataUri(input, mimeType);\n }\n if (typeof Blob !== 'undefined' && input instanceof Blob) {\n const bytes = new Uint8Array(await input.arrayBuffer());\n return dataUri(bytes, mimeType ?? (input.type || sniff(bytes)));\n }\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input as ArrayBuffer);\n return dataUri(bytes, mimeType ?? sniff(bytes));\n}\n\nasync function fileToDataUri(path: string, mimeType: string | undefined): Promise<string> {\n const { readFile } = await import('node:fs/promises');\n let bytes: Uint8Array;\n try {\n bytes = new Uint8Array(await readFile(path));\n } catch (err) {\n throw new SegmindError(`imageUrl: cannot read ${JSON.stringify(path)}: ${(err as Error).message}`, { cause: err });\n }\n const extension = path.split('.').pop()?.toLowerCase() ?? '';\n return dataUri(bytes, mimeType ?? MIME_BY_EXTENSION[extension] ?? sniff(bytes));\n}\n\nfunction dataUri(bytes: Uint8Array, mimeType: string | undefined): string {\n if (!mimeType) {\n throw new SegmindError('imageUrl: cannot tell the image type; pass { mimeType }');\n }\n return `data:${mimeType};base64,${toBase64(bytes)}`;\n}\n\n/** The image type from its first bytes, for the common formats. */\nfunction sniff(bytes: Uint8Array): string | undefined {\n const at = (offset: number, signature: number[]) => signature.every((b, i) => bytes[offset + i] === b);\n if (at(0, [0x89, 0x50, 0x4e, 0x47])) return 'image/png';\n if (at(0, [0xff, 0xd8, 0xff])) return 'image/jpeg';\n if (at(0, [0x47, 0x49, 0x46, 0x38])) return 'image/gif';\n if (at(0, [0x52, 0x49, 0x46, 0x46]) && at(8, [0x57, 0x45, 0x42, 0x50])) return 'image/webp';\n return undefined;\n}\n","import type { ChatParams, ChatResponse } from './chat';\nimport { Segmind } from './client';\nimport type { Job } from './job';\nimport type { CallOptions, Params, RunOptions, RunResult, SubmitOptions } from './types';\n\nexport { Segmind, Models, Accounts, DEFAULT_BASE_URL, DEFAULT_SPOT_URL, DEFAULT_CONSOLE_URL } from './client';\nexport type { ClientOptions, ModelInfo, ModelsListResponse } from './client';\nexport { Job, DEFAULT_WAIT_TIMEOUT_MS, DEFAULT_WAIT_INTERVAL_MS } from './job';\nexport { ChatResponse } from './chat';\nexport type { ChatMessage, ChatParams } from './chat';\nexport { imageUrl } from './image-url';\nexport type { ImageInput, ImageUrlPart } from './image-url';\nexport { SegmindError, APIConnectionError, InferenceFailed, InferenceTimeout } from './core/errors';\nexport type {\n CallOptions,\n JobState,\n JobStatus,\n Params,\n RunOptions,\n RunResult,\n SubmitOptions,\n SubmitResponse,\n WaitOptions,\n} from './types';\nexport { VERSION } from './version';\n\nlet shared: Segmind | undefined;\n\n/** The client behind the module-level functions, created on first use from the environment. */\nfunction client(): Segmind {\n shared ??= new Segmind();\n return shared;\n}\n\n/** `new Segmind().run(...)` with the key from `SEGMIND_API_KEY`. */\nexport const run = (slug: string, params?: Params, options?: RunOptions): Promise<RunResult> =>\n client().run(slug, params, options);\n\n/** `new Segmind().runSync(...)` with the key from `SEGMIND_API_KEY`. */\nexport const runSync = (slug: string, params?: Params, options?: CallOptions): Promise<Response> =>\n client().runSync(slug, params, options);\n\n/** `new Segmind().submit(...)` with the key from `SEGMIND_API_KEY`. */\nexport const submit = (slug: string, params?: Params, options?: SubmitOptions): Promise<Job> =>\n client().submit(slug, params, options);\n\n/** `new Segmind().chat(...)` with the key from `SEGMIND_API_KEY`. */\nexport const chat = (slug: string, params: ChatParams, options?: RunOptions): Promise<ChatResponse> =>\n client().chat(slug, params, options);\n\n/** `new Segmind().chatSync(...)` with the key from `SEGMIND_API_KEY`. */\nexport const chatSync = (slug: string, params: ChatParams, options?: CallOptions): Promise<ChatResponse> =>\n client().chatSync(slug, params, options);\n\n/** `new Segmind().submitChat(...)` with the key from `SEGMIND_API_KEY`. */\nexport const submitChat = (slug: string, params: ChatParams, options?: SubmitOptions): Promise<Job<ChatResponse>> =>\n client().submitChat(slug, params, options);\n\n/** `new Segmind().models` with the key from `SEGMIND_API_KEY`. */\nexport const models = {\n list: (options?: { signal?: AbortSignal }) => client().models.list(options),\n};\n\n/** `new Segmind().accounts` with the key from `SEGMIND_API_KEY`. */\nexport const accounts = {\n current: (options?: { signal?: AbortSignal }) => client().accounts.current(options),\n};\n"],"mappings":"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","names":["record","client","bytes","path"]}
1
+ {"version":3,"sources":["../src/core/errors.ts","../src/chat.ts","../src/core/env.ts","../src/core/http.ts","../src/core/input.ts","../src/files.ts","../src/generations.ts","../src/job.ts","../src/pixelflows.ts","../src/version.ts","../src/webhooks.ts","../src/client.ts","../src/image-url.ts","../src/index.ts"],"sourcesContent":["export interface SegmindErrorOptions {\n status?: number;\n detail?: string;\n requestId?: string;\n body?: unknown;\n cause?: unknown;\n}\n\n/** Base class of every error the SDK throws (except an `AbortSignal`'s own reason). */\nexport class SegmindError extends Error {\n /** HTTP status, when the error came from a response. */\n readonly status: number | undefined;\n /** The server's error text (`error` in the response body), when it sent one. */\n readonly detail: string | undefined;\n /** The v2 request id the error belongs to, when there is one. */\n readonly requestId: string | undefined;\n /** The parsed response body, or its text when it was not JSON. */\n readonly body: unknown;\n\n constructor(message: string, options: SegmindErrorOptions = {}) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = new.target.name;\n this.status = options.status;\n this.detail = options.detail;\n this.requestId = options.requestId;\n this.body = options.body;\n }\n\n /** Reads the response body and builds the error. Consumes the body. */\n static async fromResponse(response: Response, requestId?: string): Promise<SegmindError> {\n const text = await response.text().catch(() => '');\n let body: unknown = text;\n try {\n body = text ? JSON.parse(text) : undefined;\n } catch {\n // not JSON: keep the text\n }\n const detail = errorDetail(body) ?? (typeof body === 'string' && body ? body.slice(0, 500) : undefined);\n const message = detail ? `${response.status} ${detail}` : `${response.status} ${response.statusText || 'request failed'}`;\n return new SegmindError(message, { status: response.status, detail, requestId, body });\n }\n}\n\n/** The request never got a response: DNS, TLS, connection reset, or the client's timeout. */\nexport class APIConnectionError extends SegmindError {}\n\n/** A v2 request reached `FAILED`. The server's error text is in `detail`. */\nexport class InferenceFailed extends SegmindError {\n /** The status body that reported the failure. */\n readonly statusBody: Record<string, unknown>;\n\n constructor(requestId: string, statusBody: Record<string, unknown>, detail?: string) {\n detail ??= typeof statusBody.error === 'string' ? statusBody.error : undefined;\n super(detail ? `request ${requestId} failed: ${detail}` : `request ${requestId} failed`, {\n detail,\n requestId,\n body: statusBody,\n });\n this.statusBody = statusBody;\n }\n}\n\n/**\n * `wait()` ran past its timeout. The request may still finish on the server:\n * `job.status()` or a new `wait()` picks it up again.\n */\nexport class InferenceTimeout extends SegmindError {\n readonly elapsedMs: number;\n\n constructor(requestId: string, elapsedMs: number) {\n super(`request ${requestId} did not finish within ${Math.round(elapsedMs)} ms`, { requestId });\n this.elapsedMs = elapsedMs;\n }\n}\n\nfunction errorDetail(body: unknown): string | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const record = body as Record<string, unknown>;\n for (const key of ['error', 'message', 'detail']) {\n const value = record[key];\n if (typeof value === 'string' && value) return value;\n if (value && typeof value === 'object' && typeof (value as { message?: unknown }).message === 'string') {\n return (value as { message: string }).message;\n }\n }\n return undefined;\n}\n","import { SegmindError } from './core/errors';\nimport type { Params, RunResult } from './types';\n\n/** An OpenAI-style chat message; content may be text or a list of parts. */\nexport interface ChatMessage {\n role: 'system' | 'developer' | 'user' | 'assistant' | 'tool' | (string & {});\n content: string | Array<Record<string, unknown>>;\n [key: string]: unknown;\n}\n\n/**\n * Chat inputs: `messages` or `prompt` (at least one), plus any model params.\n * `messages` is a list for OpenAI- and Anthropic-style models; Gemini models\n * take their own object (`{ system_instruction, contents }`), sent unchanged.\n */\nexport type ChatParams = Params & {\n messages?: ChatMessage[] | Record<string, unknown>;\n prompt?: string;\n};\n\ntype Raw = Record<string, unknown>;\n\n/**\n * One reply from any chat model. The gateway returns each provider's own JSON\n * (OpenAI, Anthropic or Gemini shape); this reads the common fields from all\n * three. `raw` is always the provider's body, untouched.\n */\nexport class ChatResponse {\n constructor(readonly raw: Raw) {}\n\n /** The assistant's text. Throws when the body holds none (inspect `raw`). */\n get text(): string {\n const text = extractText(this.raw);\n if (text === undefined) {\n throw new SegmindError(\n `could not find assistant text in the response (top-level keys: ${Object.keys(this.raw).sort().join(', ')}); inspect ChatResponse.raw`,\n { body: this.raw },\n );\n }\n return text;\n }\n\n /** `text` parsed as JSON, for JSON mode and structured outputs. */\n json<T = unknown>(): T {\n const text = this.text;\n try {\n return JSON.parse(text) as T;\n } catch (err) {\n throw new SegmindError(`ChatResponse.text is not valid JSON: ${(err as Error).message}`, {\n body: text,\n cause: err,\n });\n }\n }\n\n /** The provider's token usage (`usage` or Gemini's `usageMetadata`). */\n get usage(): Record<string, unknown> | undefined {\n return (record(this.raw.usage) ?? record(this.raw.usageMetadata)) || undefined;\n }\n\n /** Why generation stopped (`finish_reason`, `stop_reason` or `finishReason`). */\n get finishReason(): string | undefined {\n if (Array.isArray(this.raw.choices)) return str(record(this.raw.choices[0])?.finish_reason);\n if ('stop_reason' in this.raw) return str(this.raw.stop_reason);\n if (Array.isArray(this.raw.candidates)) return str(record(this.raw.candidates[0])?.finishReason);\n return undefined;\n }\n\n /** Tool calls in the OpenAI shape, when the model made any. */\n get toolCalls(): unknown[] {\n if (!Array.isArray(this.raw.choices)) return [];\n const calls = record(record(this.raw.choices[0])?.message)?.tool_calls;\n return Array.isArray(calls) ? calls : [];\n }\n}\n\n/** Validates chat inputs. Every other key passes to the model unchanged. */\nexport function chatBody(params: ChatParams): Params {\n if (params.messages === undefined && params.prompt === undefined) {\n throw new SegmindError('chat: pass messages: [...] or prompt: \"...\"');\n }\n if (params.stream === true) {\n throw new SegmindError('chat: streaming is not supported yet; omit stream or set it to false');\n }\n return params;\n}\n\n/**\n * A v2 result carries the provider's JSON as a string in `output`. Decode it;\n * accept an object there too, and treat non-JSON text as the reply itself.\n */\nexport function chatFromRunResult(body: RunResult): ChatResponse {\n const output = body.output;\n if (typeof output === 'string') {\n try {\n const parsed: unknown = JSON.parse(output);\n if (record(parsed)) return new ChatResponse(parsed as Raw);\n } catch {\n // plain text reply\n }\n return new ChatResponse({ choices: [{ message: { content: output } }] });\n }\n if (record(output)) return new ChatResponse(output as Raw);\n return new ChatResponse(body);\n}\n\nfunction extractText(raw: Raw): string | undefined {\n // OpenAI: choices[0].message.content (a string, or a list of text parts)\n if ('choices' in raw) {\n const content = record(record(Array.isArray(raw.choices) ? raw.choices[0] : undefined)?.message)?.content;\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n return content\n .map(record)\n .filter((part) => part && (part.type === undefined || part.type === 'text'))\n .map((part) => str(part!.text) ?? '')\n .join('');\n }\n return undefined;\n }\n // Anthropic: content: [{type: \"text\", text}]\n if (Array.isArray(raw.content)) {\n return raw.content\n .map(record)\n .filter((part) => part?.type === 'text')\n .map((part) => str(part!.text) ?? '')\n .join('');\n }\n // Gemini: candidates[0].content.parts[].text\n if ('candidates' in raw) {\n const candidate = record(Array.isArray(raw.candidates) ? raw.candidates[0] : undefined);\n const parts = record(candidate?.content)?.parts;\n if (!Array.isArray(parts)) return candidate ? '' : undefined;\n return parts.map((part) => str(record(part)?.text) ?? '').join('');\n }\n return undefined;\n}\n\nfunction record(value: unknown): Raw | undefined {\n return value && typeof value === 'object' && !Array.isArray(value) ? (value as Raw) : undefined;\n}\n\nfunction str(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n","type Globals = {\n process?: { env?: Record<string, string | undefined>; versions?: { node?: string }; version?: string };\n navigator?: { product?: string };\n window?: unknown;\n document?: unknown;\n Buffer?: { from(data: Uint8Array): { toString(encoding: 'base64'): string } };\n crypto?: { randomUUID?: () => string };\n};\n\nconst g = globalThis as unknown as Globals;\n\nexport type Runtime = 'node' | 'browser' | 'react-native' | 'other';\n\n/** Where this code is running. React Native is checked first: it defines `window`. */\nexport function detectRuntime(): Runtime {\n if (g.navigator?.product === 'ReactNative') return 'react-native';\n if (typeof g.window !== 'undefined' && typeof g.document !== 'undefined') return 'browser';\n if (g.process?.versions?.node) return 'node';\n return 'other';\n}\n\n/** An environment variable, or undefined where there is no `process.env`. */\nexport function readEnv(name: string): string | undefined {\n try {\n const value = g.process?.env?.[name];\n return value?.trim() ? value.trim() : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function nodeVersion(): string | undefined {\n return g.process?.versions?.node ? g.process.version : undefined;\n}\n\n/**\n * A request id the gateway accepts as `X-Request-ID` ([A-Za-z0-9_-]{8,128}).\n * React Native has no `crypto.randomUUID` without a polyfill, hence the fallback.\n */\nexport function randomRequestId(): string {\n const uuid = g.crypto?.randomUUID?.();\n if (uuid) return uuid;\n let id = '';\n for (let i = 0; i < 32; i++) id += Math.floor(Math.random() * 16).toString(16);\n return id;\n}\n\nexport function toBase64(bytes: Uint8Array): string {\n if (g.Buffer) return g.Buffer.from(bytes).toString('base64');\n let binary = '';\n const chunk = 0x8000;\n for (let i = 0; i < bytes.length; i += chunk) {\n binary += String.fromCharCode(...bytes.subarray(i, i + chunk));\n }\n return btoa(binary);\n}\n","import { APIConnectionError, SegmindError } from './errors';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\nexport interface HttpConfig {\n apiKey: string | undefined;\n fetch: typeof fetch;\n timeout: number;\n maxRetries: number;\n headers: Record<string, string>;\n}\n\nexport interface HttpRequest {\n method: HttpMethod;\n url: string;\n /** Query parameters; `undefined` values are left out. */\n query?: Record<string, string | number | boolean | undefined>;\n /** Sent as JSON. */\n body?: unknown;\n /** Sent as is, instead of a JSON `body`. */\n rawBody?: Uint8Array | Blob;\n /**\n * Send only `headers`: no API key, no `X-Initiator`, no default headers. For\n * presigned URLs on other hosts, which must never see the key.\n */\n bare?: boolean;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n /** Milliseconds for this attempt; defaults to the client's timeout. */\n timeout?: number;\n /**\n * Retry connection errors and retryable statuses. Only for requests that\n * cannot bill twice: reads, polls, and v2 submits that carry an\n * `X-Request-ID` (the gateway answers a repeat with 409, not a second job).\n */\n retry?: boolean;\n}\n\n/** Statuses worth another attempt: the request was not processed. */\nexport const RETRYABLE_STATUS = new Set([408, 429, 502, 503, 504]);\n\nconst MAX_RETRY_DELAY_MS = 60_000;\n\n/** Delay before retry number `attempt` (0-based), honouring `Retry-After`. */\nexport function retryDelay(attempt: number, retryAfter: string | null, now = Date.now()): number {\n if (retryAfter) {\n const seconds = Number(retryAfter);\n if (Number.isFinite(seconds) && seconds >= 0) return Math.min(seconds * 1000, MAX_RETRY_DELAY_MS);\n const date = Date.parse(retryAfter);\n if (!Number.isNaN(date)) return Math.min(Math.max(date - now, 0), MAX_RETRY_DELAY_MS);\n }\n const base = Math.min(500 * 2 ** attempt, 8000);\n return base * (0.75 + Math.random() * 0.25);\n}\n\n/** Resolves after `ms`, or rejects with the signal's reason when it aborts. */\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason);\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(signal!.reason);\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nexport class HttpClient {\n constructor(readonly config: HttpConfig) {}\n\n /** The response whatever its status, after retries when `retry` is set. */\n async fetchRaw(req: HttpRequest): Promise<Response> {\n for (let attempt = 0; ; attempt++) {\n const canRetry = req.retry === true && attempt < this.config.maxRetries;\n let response: Response;\n try {\n response = await this.attempt(req);\n } catch (err) {\n if (canRetry && err instanceof APIConnectionError) {\n await sleep(retryDelay(attempt, null), req.signal);\n continue;\n }\n throw err;\n }\n if (canRetry && RETRYABLE_STATUS.has(response.status)) {\n await response.body?.cancel().catch(() => undefined);\n await sleep(retryDelay(attempt, response.headers.get('retry-after')), req.signal);\n continue;\n }\n return response;\n }\n }\n\n /** The response, or a `SegmindError` for any status outside 2xx. */\n async request(req: HttpRequest): Promise<Response> {\n const response = await this.fetchRaw(req);\n if (!response.ok) throw await SegmindError.fromResponse(response);\n return response;\n }\n\n /** The parsed JSON body of a 2xx response. */\n async json<T>(req: HttpRequest): Promise<T> {\n return readJson<T>(await this.request(req));\n }\n\n private async attempt(req: HttpRequest): Promise<Response> {\n const { signal } = req;\n if (signal?.aborted) throw signal.reason;\n\n const timeout = req.timeout ?? this.config.timeout;\n const controller = new AbortController();\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, timeout);\n const onAbort = () => controller.abort(signal!.reason);\n signal?.addEventListener('abort', onAbort, { once: true });\n\n const headers: Record<string, string> = req.bare ? { ...req.headers } : { ...this.config.headers, ...req.headers };\n if (this.config.apiKey && !req.bare) headers['x-api-key'] = this.config.apiKey;\n if (req.body !== undefined) headers['content-type'] = 'application/json';\n const body = req.rawBody ?? (req.body === undefined ? undefined : JSON.stringify(req.body));\n\n try {\n return await this.config.fetch(withQuery(req.url, req.query), {\n method: req.method,\n headers,\n body: body as BodyInit | undefined,\n signal: controller.signal,\n });\n } catch (err) {\n if (signal?.aborted) throw signal.reason ?? err;\n const reason = timedOut ? `request timed out after ${timeout} ms` : `connection error: ${describe(err)}`;\n throw new APIConnectionError(`${req.method} ${req.url}: ${reason}`, { cause: err });\n } finally {\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n }\n }\n}\n\nexport async function readJson<T>(response: Response): Promise<T> {\n const text = await response.text();\n try {\n return JSON.parse(text) as T;\n } catch (err) {\n throw new SegmindError(`${response.status} response was not JSON`, {\n status: response.status,\n body: text.slice(0, 500),\n cause: err,\n });\n }\n}\n\nfunction withQuery(url: string, query: HttpRequest['query']): string {\n if (!query) return url;\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) params.set(key, String(value));\n }\n const qs = params.toString();\n return qs ? `${url}${url.includes('?') ? '&' : '?'}${qs}` : url;\n}\n\nfunction describe(err: unknown): string {\n if (err instanceof Error) {\n const cause = (err as { cause?: unknown }).cause;\n return cause instanceof Error ? `${err.message} (${cause.message})` : err.message;\n }\n return String(err);\n}\n","import { detectRuntime } from './env';\nimport { SegmindError } from './errors';\n\n/** A file to send: a path (Node only), a `Blob` or `File`, or raw bytes. */\nexport type FileInput = string | Blob | ArrayBuffer | Uint8Array;\n\nexport interface ReadFile {\n bytes: Uint8Array;\n /** A name with the right extension: the server types the file from it. */\n filename: string;\n mimeType: string | undefined;\n}\n\nconst MIME_BY_EXTENSION: Record<string, string> = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n svg: 'image/svg+xml',\n heic: 'image/heic',\n heif: 'image/heif',\n tif: 'image/tiff',\n tiff: 'image/tiff',\n avif: 'image/avif',\n mp4: 'video/mp4',\n mov: 'video/quicktime',\n webm: 'video/webm',\n mkv: 'video/x-matroska',\n avi: 'video/x-msvideo',\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n m4a: 'audio/mp4',\n ogg: 'audio/ogg',\n flac: 'audio/flac',\n aac: 'audio/aac',\n pdf: 'application/pdf',\n txt: 'text/plain',\n json: 'application/json',\n glb: 'model/gltf-binary',\n};\n\nconst EXTENSION_BY_MIME: Record<string, string> = Object.fromEntries(\n Object.entries(MIME_BY_EXTENSION).map(([ext, mime]) => [mime, ext]),\n);\nEXTENSION_BY_MIME['image/jpeg'] = 'jpg';\n\nexport function mimeFromName(name: string): string | undefined {\n const extension = name.includes('.') ? name.split('.').pop()!.toLowerCase() : '';\n return MIME_BY_EXTENSION[extension];\n}\n\n/**\n * Reads any `FileInput` into bytes plus a usable name and type. The name comes\n * from `filename`, the path or the `File`; a nameless input gets one built from\n * its type (`upload.png`), sniffed from the first bytes when not given.\n */\nexport async function readFileInput(\n input: FileInput,\n options: { filename?: string; mimeType?: string; caller: string },\n): Promise<ReadFile> {\n let bytes: Uint8Array;\n let name = options.filename;\n let mimeType = options.mimeType;\n\n if (typeof input === 'string') {\n if (detectRuntime() !== 'node') {\n throw new SegmindError(`${options.caller}: file paths work in Node only; pass a Blob or bytes`);\n }\n const { readFile } = await import('node:fs/promises');\n try {\n bytes = new Uint8Array(await readFile(input));\n } catch (err) {\n throw new SegmindError(`${options.caller}: cannot read ${JSON.stringify(input)}: ${(err as Error).message}`, {\n cause: err,\n });\n }\n name ??= input.split(/[\\\\/]/).pop();\n } else if (typeof Blob !== 'undefined' && input instanceof Blob) {\n bytes = new Uint8Array(await input.arrayBuffer());\n name ??= (input as Blob & { name?: string }).name || undefined;\n mimeType ??= input.type || undefined;\n } else {\n bytes = input instanceof Uint8Array ? input : new Uint8Array(input as ArrayBuffer);\n }\n\n mimeType ??= (name && mimeFromName(name)) || sniff(bytes);\n if (!name || !name.includes('.')) {\n const extension = mimeType ? EXTENSION_BY_MIME[mimeType] : undefined;\n if (!extension) {\n throw new SegmindError(`${options.caller}: cannot tell the file type; pass { filename: 'name.ext' } or { mimeType }`);\n }\n name = `${name || 'upload'}.${extension}`;\n }\n return { bytes, filename: name, mimeType };\n}\n\n/** The type of common media from its first bytes. */\nexport function sniff(bytes: Uint8Array): string | undefined {\n const at = (offset: number, signature: number[]) => signature.every((b, i) => bytes[offset + i] === b);\n if (at(0, [0x89, 0x50, 0x4e, 0x47])) return 'image/png';\n if (at(0, [0xff, 0xd8, 0xff])) return 'image/jpeg';\n if (at(0, [0x47, 0x49, 0x46, 0x38])) return 'image/gif';\n if (at(0, [0x52, 0x49, 0x46, 0x46]) && at(8, [0x57, 0x45, 0x42, 0x50])) return 'image/webp';\n if (at(0, [0x52, 0x49, 0x46, 0x46]) && at(8, [0x57, 0x41, 0x56, 0x45])) return 'audio/wav';\n if (at(4, [0x66, 0x74, 0x79, 0x70])) return 'video/mp4';\n if (at(0, [0x49, 0x44, 0x33]) || at(0, [0xff, 0xfb])) return 'audio/mpeg';\n if (at(0, [0x25, 0x50, 0x44, 0x46])) return 'application/pdf';\n return undefined;\n}\n","import type { Segmind } from './client';\nimport { SegmindError } from './core/errors';\nimport { type FileInput, readFileInput } from './core/input';\n\nexport interface UploadOptions {\n /** The file's name, with an extension: the server types the file from it. */\n filename?: string;\n /** The file's type, when neither the name nor the bytes tell. */\n mimeType?: string;\n signal?: AbortSignal;\n}\n\nexport interface UploadedFile {\n /** Public URL to pass as a model input. */\n url: string;\n filename: string;\n size: number;\n}\n\n/** `POST /inference-request/input-presign`. */\ninterface PresignTicket {\n upload_url: string;\n url: string;\n expires_in?: number;\n required_headers?: Record<string, string>;\n}\n\n/**\n * Uploads files to pass as model inputs. Each file goes straight to storage on\n * a presigned URL, so large videos never travel as base64 JSON. The URLs are\n * public and temporary: the files are kept for at least two days.\n */\nexport class Files {\n constructor(private readonly client: Segmind) {}\n\n /** Uploads one file and returns its URL. */\n async upload(file: FileInput, options?: UploadOptions): Promise<UploadedFile>;\n /** Uploads several files, in order. */\n async upload(files: FileInput[], options?: Omit<UploadOptions, 'filename'>): Promise<UploadedFile[]>;\n async upload(input: FileInput | FileInput[], options: UploadOptions = {}): Promise<UploadedFile | UploadedFile[]> {\n if (Array.isArray(input)) {\n const uploaded: UploadedFile[] = [];\n for (const file of input) uploaded.push(await this.uploadOne(file, { ...options, filename: undefined }));\n return uploaded;\n }\n return this.uploadOne(input, options);\n }\n\n private async uploadOne(input: FileInput, options: UploadOptions): Promise<UploadedFile> {\n const file = await readFileInput(input, { ...options, caller: 'files.upload' });\n const { http } = this.client;\n\n // Minting stores nothing, so it retries safely.\n const ticket = await http.json<PresignTicket>({\n method: 'POST',\n url: `${this.client.spotURL}/inference-request/input-presign`,\n body: { filename: file.filename, size: file.bytes.byteLength },\n signal: options.signal,\n retry: true,\n });\n if (!ticket.upload_url || !ticket.url) {\n throw new SegmindError('files.upload: the presign response had no upload_url or url', { body: ticket });\n }\n\n // Every required header is signed into the URL, so send them verbatim. The\n // fetch implementation sets Content-Length from the body itself. A PUT to\n // the same key is idempotent, so it retries too. `bare` keeps the API key\n // off the storage host.\n const headers = { ...ticket.required_headers };\n delete headers['Content-Length'];\n delete headers['content-length'];\n await http.request({\n method: 'PUT',\n url: ticket.upload_url,\n rawBody: file.bytes,\n headers,\n bare: true,\n signal: options.signal,\n retry: true,\n });\n return { url: ticket.url, filename: file.filename, size: file.bytes.byteLength };\n }\n}\n","import type { Segmind } from './client';\n\n/** One page of a paginated list. */\nexport interface Page<T> {\n total_records: number;\n total_pages: number;\n current_page: number;\n per_page: number;\n has_next: boolean;\n has_previous: boolean;\n data: T[];\n [key: string]: unknown;\n}\n\n/** A generated output, with the request behind it. */\nexport interface Generation {\n request_id: string;\n model_name: string;\n generation_url: string;\n created_at: string;\n status?: string | null;\n /** Cost in USD. */\n credits_deduction?: number | null;\n latency_ms?: number | null;\n prompt?: string | null;\n parameters?: Record<string, unknown> | null;\n [key: string]: unknown;\n}\n\n/** A request, failed and in-flight ones included. */\nexport interface RequestRecord {\n request_id: string;\n model_name: string;\n model_status: string;\n /** Cost in USD. */\n credits_deduction: number | null;\n /** The inputs as sent, as a JSON string. */\n request_body?: string | null;\n generation_url?: string | null;\n latency_ms?: number | null;\n model_created?: string;\n error?: string | null;\n [key: string]: unknown;\n}\n\nexport interface GenerationsListOptions {\n page?: number;\n modelName?: string;\n /** YYYY-MM-DD. */\n startDate?: string;\n /** YYYY-MM-DD. */\n endDate?: string;\n /** Inside a team, any member's user id; otherwise only your own. */\n userId?: string;\n signal?: AbortSignal;\n}\n\nexport interface HistoryOptions {\n page?: number;\n /** 1–100. Default 20. */\n perPage?: number;\n /** YYYY-MM-DD. Default 7 days ago. */\n fromDate?: string;\n /** YYYY-MM-DD, inclusive. Default today. At most 31 days after `fromDate`. */\n toDate?: string;\n /** Substring match on the model slug. */\n modelName?: string;\n status?: 'COMPLETED' | 'FAILED' | 'PENDING';\n /** Inside a team, any member's user id; otherwise only your own. */\n userId?: string;\n /** Same as `userId`, by email. Pass one or the other. */\n userEmail?: string;\n sortBy?: 'model_created' | 'model_name' | 'credits_deduction';\n sortOrder?: 'asc' | 'desc';\n signal?: AbortSignal;\n}\n\n/** Your generations and request history. */\nexport class Generations {\n constructor(private readonly client: Segmind) {}\n\n /** Generated outputs, newest first. */\n async list(options: GenerationsListOptions = {}): Promise<Page<Generation>> {\n return this.read('/inference-request/generations', options.signal, {\n page: options.page ?? 1,\n model_name: options.modelName,\n start_date: options.startDate,\n end_date: options.endDate,\n user_id: options.userId,\n });\n }\n\n /** The newest generations for one model. */\n async recent(\n modelName: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<{ data: Array<Pick<Generation, 'request_id' | 'generation_url' | 'created_at' | 'status'>> }> {\n return this.read('/inference-request/recent-generations', options.signal, { model_name: modelName });\n }\n\n /**\n * Requests with their cost, inputs and outcome, failures included. A request\n * with several outputs appears once per output, each carrying its full cost:\n * de-duplicate on `request_id` before summing.\n */\n async history(options: HistoryOptions = {}): Promise<Page<RequestRecord>> {\n return this.read('/inference-request/request-history', options.signal, {\n page: options.page ?? 1,\n per_page: options.perPage ?? 20,\n from_date: options.fromDate,\n to_date: options.toDate,\n model_name: options.modelName,\n status: options.status,\n user_id: options.userId,\n user_email: options.userEmail,\n sort_by: options.sortBy,\n sort_order: options.sortOrder,\n });\n }\n\n /** One of your own requests, of any age. A teammate's request id is not found. */\n async get(requestId: string, options: { signal?: AbortSignal } = {}): Promise<RequestRecord> {\n return this.read(`/inference-request/request-history/${encodeURIComponent(requestId)}`, options.signal);\n }\n\n private read<T>(path: string, signal: AbortSignal | undefined, query?: Record<string, string | number | undefined>): Promise<T> {\n return this.client.http.json<T>({ method: 'GET', url: `${this.client.spotURL}${path}`, query, signal, retry: true });\n }\n}\n","import { InferenceFailed, InferenceTimeout, SegmindError } from './core/errors';\nimport { type HttpClient, readJson, sleep } from './core/http';\nimport type { JobStatus, RunResult, SubmitResponse, WaitOptions } from './types';\n\nexport const DEFAULT_WAIT_TIMEOUT_MS = 600_000;\nexport const DEFAULT_WAIT_INTERVAL_MS = 1_000;\n\nconst TERMINAL = new Set(['COMPLETED', 'FAILED']);\n\n/**\n * A submitted v2 request. `wait()` polls until it finishes; `status()` and\n * `result()` read it once.\n */\nexport class Job<T = RunResult> {\n readonly requestId: string;\n readonly statusUrl: string;\n readonly responseUrl: string;\n\n constructor(\n private readonly http: HttpClient,\n /** The body the submit returned. */\n readonly submitResponse: SubmitResponse,\n private readonly transform: (body: RunResult) => T = (body) => body as T,\n ) {\n this.requestId = submitResponse.request_id;\n this.statusUrl = submitResponse.status_url;\n this.responseUrl = submitResponse.response_url;\n }\n\n /** The current state, without waiting. */\n async status(options: { signal?: AbortSignal } = {}): Promise<JobStatus> {\n return (await this.read(this.statusUrl, options.signal)) as JobStatus;\n }\n\n /**\n * The finished result. Throws `InferenceFailed` when the request failed, and\n * a `SegmindError` when it has not finished yet (use `wait()` for that).\n */\n async result(options: { signal?: AbortSignal } = {}): Promise<T> {\n const body = (await this.read(this.responseUrl, options.signal)) as RunResult;\n if (body.status === 'FAILED') throw new InferenceFailed(this.requestId, body);\n if (body.status !== undefined && body.status !== 'COMPLETED') {\n throw new SegmindError(`request ${this.requestId} is still ${String(body.status)}; use wait()`, {\n requestId: this.requestId,\n body,\n });\n }\n return this.transform(body);\n }\n\n /** Polls until the request finishes, then returns its result. */\n async wait(options: WaitOptions = {}): Promise<T> {\n const timeout = options.timeout ?? DEFAULT_WAIT_TIMEOUT_MS;\n const interval = options.interval ?? DEFAULT_WAIT_INTERVAL_MS;\n const started = Date.now();\n for (;;) {\n const status = await this.status({ signal: options.signal });\n if (status.status === 'COMPLETED') return this.result({ signal: options.signal });\n if (status.status === 'FAILED') throw new InferenceFailed(this.requestId, status);\n const elapsed = Date.now() - started;\n if (elapsed >= timeout) throw new InferenceTimeout(this.requestId, elapsed);\n await sleep(Math.min(interval, timeout - elapsed), options.signal);\n }\n }\n\n /**\n * The gateway serves a FAILED request's body with HTTP 422 on both the status\n * and result URLs. A body that names a terminal state is the answer whatever\n * its status code; anything else outside 2xx is a real error.\n */\n private async read(url: string, signal: AbortSignal | undefined): Promise<Record<string, unknown>> {\n const response = await this.http.fetchRaw({ method: 'GET', url, signal, retry: true });\n if (response.ok) return readJson<Record<string, unknown>>(response);\n const error = await SegmindError.fromResponse(response, this.requestId);\n const body = error.body;\n if (body && typeof body === 'object' && TERMINAL.has(String((body as { status?: unknown }).status))) {\n return body as Record<string, unknown>;\n }\n throw error;\n }\n}\n","import type { Segmind } from './client';\nimport { InferenceFailed, InferenceTimeout, SegmindError } from './core/errors';\nimport { sleep } from './core/http';\n\nconst DONE = new Set(['COMPLETED', 'SUCCESS', 'SUCCEEDED']);\nconst FAILED = new Set(['FAILED', 'ERROR']);\nconst DEFAULT_TIMEOUT_MS = 600_000;\nconst DEFAULT_INTERVAL_MS = 2_000;\n\nexport interface PixelflowSubmitOptions {\n /**\n * `v2` (default) runs on the current workflow engine, which also loads\n * older graphs. `v1` is the legacy engine.\n */\n engine?: 'v1' | 'v2';\n signal?: AbortSignal;\n}\n\nexport interface PixelflowWaitOptions {\n /** Give up after this many milliseconds. Default 600 000. */\n timeout?: number;\n /** Milliseconds between status checks. Default 2000. */\n interval?: number;\n signal?: AbortSignal;\n}\n\nexport interface PixelflowStatus {\n /** `QUEUED`, `PROCESSING`, `COMPLETED` or `FAILED`, upper-cased. */\n status: string;\n /** The finished outputs by keyname, unwrapped to their URL or value. `{}` until done. */\n outputs: Record<string, unknown>;\n /** The engine's own body, with `output` decoded from its JSON string. */\n raw: Record<string, unknown>;\n}\n\n/**\n * Published PixelFlow workflows, run through the gateway. `slug` is the\n * workflow's API slug from its API tab. Inputs are a flat object keyed by each\n * input's keyname: `{ Text_Prompt: 'a red fox' }`.\n */\nexport class PixelFlows {\n constructor(private readonly client: Segmind) {}\n\n /** Runs a workflow and waits for its outputs. */\n async run(\n slug: string,\n inputs: Record<string, unknown> = {},\n options: PixelflowSubmitOptions & PixelflowWaitOptions = {},\n ): Promise<PixelflowStatus> {\n const job = await this.submit(slug, inputs, options);\n return job.wait(options);\n }\n\n /** Starts a workflow and returns a job to wait on. Never retried: a run bills. */\n async submit(\n slug: string,\n inputs: Record<string, unknown> = {},\n options: PixelflowSubmitOptions = {},\n ): Promise<PixelflowJob> {\n const clean = slug.trim().replace(/^\\/+/, '');\n if (!clean) throw new SegmindError('pixelflows: a workflow slug is required');\n const route = options.engine === 'v1' ? '/workflows/' : '/workflows/v2/';\n const body = await this.client.http.json<Record<string, unknown>>({\n method: 'POST',\n url: `${this.client.baseURL}${route}${clean}`,\n body: inputs,\n signal: options.signal,\n });\n const requestId = body.request_id;\n if (typeof requestId !== 'string' || !requestId) {\n throw new SegmindError('pixelflows: the submit response had no request_id', { body });\n }\n return new PixelflowJob(this, requestId);\n }\n\n /** A run's current state, without waiting. */\n async getStatus(requestId: string, options: { signal?: AbortSignal } = {}): Promise<PixelflowStatus> {\n // Built from the base URL rather than the response's poll_url, so the API\n // key only ever goes to the configured host.\n const raw = await this.client.http.json<Record<string, unknown>>({\n method: 'GET',\n url: `${this.client.baseURL}/workflows/request/${encodeURIComponent(requestId)}`,\n signal: options.signal,\n retry: true,\n });\n return toStatus(raw);\n }\n\n /** Waits for a run started earlier, by its request id. */\n async poll(requestId: string, options: PixelflowWaitOptions = {}): Promise<PixelflowStatus> {\n return new PixelflowJob(this, requestId).wait(options);\n }\n}\n\n/** A started workflow run. */\nexport class PixelflowJob {\n constructor(\n private readonly pixelflows: PixelFlows,\n readonly requestId: string,\n ) {}\n\n status(options: { signal?: AbortSignal } = {}): Promise<PixelflowStatus> {\n return this.pixelflows.getStatus(this.requestId, options);\n }\n\n /**\n * Polls until the run finishes. Throws `InferenceFailed` (its `detail` names\n * the failing node) or `InferenceTimeout`; the run may still finish after a\n * timeout, so `wait()` can be called again.\n */\n async wait(options: PixelflowWaitOptions = {}): Promise<PixelflowStatus> {\n const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n const interval = options.interval ?? DEFAULT_INTERVAL_MS;\n const started = Date.now();\n for (;;) {\n const state = await this.status({ signal: options.signal });\n if (DONE.has(state.status)) return state;\n if (FAILED.has(state.status)) throw new InferenceFailed(this.requestId, state.raw, failureDetail(state.raw));\n const elapsed = Date.now() - started;\n if (elapsed + interval > timeout) throw new InferenceTimeout(this.requestId, elapsed);\n await sleep(interval, options.signal);\n }\n }\n}\n\nfunction toStatus(body: Record<string, unknown>): PixelflowStatus {\n const raw = { ...body };\n if (typeof raw.output === 'string') {\n try {\n raw.output = JSON.parse(raw.output);\n } catch {\n // Not JSON: keep the string as the engine sent it.\n }\n }\n const status = String(raw.status ?? 'UNKNOWN').toUpperCase();\n return { status, outputs: DONE.has(status) ? flattenOutputs(raw.output) : {}, raw };\n}\n\n/** `[{ keyname, value: { data, type } }]` (or a keyed object) → `{ keyname: data }`. */\nfunction flattenOutputs(output: unknown): Record<string, unknown> {\n const outputs: Record<string, unknown> = {};\n if (Array.isArray(output)) {\n for (const item of output) {\n if (item && typeof item === 'object' && typeof (item as { keyname?: unknown }).keyname === 'string') {\n const { keyname, value } = item as { keyname: string; value?: unknown };\n outputs[keyname] = unwrap(value);\n }\n }\n } else if (output && typeof output === 'object') {\n for (const [key, value] of Object.entries(output)) outputs[key] = unwrap(value);\n }\n return outputs;\n}\n\nfunction unwrap(value: unknown): unknown {\n if (value && typeof value === 'object' && 'data' in value) return (value as { data: unknown }).data;\n return value;\n}\n\n/**\n * The engine reports a failure inside a 200 body as\n * `{ error_message: { details, error_message, failed_node } }`; `details`\n * names the node, which the bare `error_message` (often just \"400\") does not.\n */\nfunction failureDetail(body: Record<string, unknown>): string | undefined {\n const error = body.error_message ?? body.error;\n if (typeof error === 'string') return error;\n if (error && typeof error === 'object') {\n const e = error as Record<string, unknown>;\n const text = e.details ?? e.error_message ?? e.error;\n if (typeof text === 'string') return text;\n }\n return undefined;\n}\n","// Kept equal to package.json \"version\" by scripts/sync-version.mjs; test/misc.test.ts fails if they drift.\nexport const VERSION = '0.2.0';\n","import type { Segmind } from './client';\nimport { SegmindError } from './core/errors';\n\n/** A webhook registration, as the API returns it. Only the common fields are typed. */\nexport interface Webhook {\n webhook_id?: string;\n webhook_url?: string;\n event?: { types?: string[] };\n [key: string]: unknown;\n}\n\n/**\n * Your webhook registrations. Event types are the console's names, such as\n * `PIXELFLOW` and `PIXELFLOW_API_RUN`.\n */\nexport class Webhooks {\n constructor(private readonly client: Segmind) {}\n\n /** Every registration; `[]` when you have none. */\n async get(options: { signal?: AbortSignal } = {}): Promise<Webhook[]> {\n return this.call('GET', '/get', { signal: options.signal, retry: true });\n }\n\n /** Registers an endpoint for the given event types. */\n async add(webhookUrl: string, eventTypes: string[], options: { signal?: AbortSignal } = {}): Promise<Record<string, unknown>> {\n return this.call('POST', '/add', {\n body: { webhook_url: webhookUrl, event: { types: requireTypes(eventTypes) } },\n signal: options.signal,\n });\n }\n\n /** Changes a registration's URL and event types. */\n async update(\n webhookId: string,\n webhookUrl: string,\n eventTypes: string[],\n options: { signal?: AbortSignal } = {},\n ): Promise<Record<string, unknown>> {\n return this.call('POST', '/update', {\n body: { webhook_id: webhookId, webhook_url: webhookUrl, event: { types: requireTypes(eventTypes) } },\n signal: options.signal,\n });\n }\n\n /** Deactivates a registration. */\n async delete(webhookId: string, options: { signal?: AbortSignal } = {}): Promise<Record<string, unknown>> {\n return this.call('GET', '/inactive', { query: { webhook_id: webhookId }, signal: options.signal, retry: true });\n }\n\n /** Delivery history for one registration. */\n async logs(webhookId: string, options: { signal?: AbortSignal } = {}): Promise<Record<string, unknown>> {\n return this.call('GET', '/dispatch-logs', { query: { webhook_id: webhookId }, signal: options.signal, retry: true });\n }\n\n private call<T>(\n method: 'GET' | 'POST',\n path: string,\n req: { body?: unknown; query?: Record<string, string>; signal?: AbortSignal; retry?: boolean },\n ): Promise<T> {\n return this.client.http.json<T>({ method, url: `${this.client.spotURL}/webhook${path}`, ...req });\n }\n}\n\nfunction requireTypes(eventTypes: string[]): string[] {\n if (!Array.isArray(eventTypes) || eventTypes.length === 0) {\n throw new SegmindError('webhooks: pass at least one event type, e.g. [\"PIXELFLOW_API_RUN\"]');\n }\n return eventTypes;\n}\n","import { type ChatParams, ChatResponse, chatBody, chatFromRunResult } from './chat';\nimport { detectRuntime, nodeVersion, randomRequestId, readEnv } from './core/env';\nimport { APIConnectionError, SegmindError } from './core/errors';\nimport { HttpClient, readJson, retryDelay, sleep } from './core/http';\nimport { Files } from './files';\nimport { Generations } from './generations';\nimport { Job } from './job';\nimport { PixelFlows } from './pixelflows';\nimport type { CallOptions, Params, RunOptions, RunResult, SubmitOptions, SubmitResponse } from './types';\nimport { VERSION } from './version';\nimport { Webhooks } from './webhooks';\n\nexport const DEFAULT_BASE_URL = 'https://api.segmind.com';\nexport const DEFAULT_SPOT_URL = 'https://api.spotprod.segmind.com';\nexport const DEFAULT_CONSOLE_URL = 'https://cloud.segmind.com/api';\n\nexport interface ClientOptions {\n /** Your Segmind API key. Defaults to `SEGMIND_API_KEY` from the environment. */\n apiKey?: string;\n /** The inference API root, without `/v1`. Defaults to `SEGMIND_BASE_URL` or https://api.segmind.com. */\n baseURL?: string;\n /** The catalog, history, webhook and upload API. Default https://api.spotprod.segmind.com. */\n spotURL?: string;\n /** The account API. Default https://cloud.segmind.com/api. */\n consoleURL?: string;\n /** Milliseconds per HTTP request. Default 600 000. */\n timeout?: number;\n /** Retries for requests that cannot bill twice. Default 2. */\n maxRetries?: number;\n /** A `fetch` implementation. Defaults to the global one. */\n fetch?: typeof fetch;\n /** Headers added to every request. */\n defaultHeaders?: Record<string, string>;\n /**\n * Allow an API key in a browser or React Native app. Anyone who can open the\n * app can read the key and spend your credits. Prefer calling your own\n * backend, or realtime session tokens.\n */\n dangerouslyAllowBrowser?: boolean;\n}\n\n/**\n * The Segmind API client.\n *\n * ```ts\n * const segmind = new Segmind(); // reads SEGMIND_API_KEY\n * const result = await segmind.run('seedream-4.5', { prompt: 'A sunset over mountains' });\n * ```\n */\nexport class Segmind {\n readonly baseURL: string;\n readonly spotURL: string;\n readonly consoleURL: string;\n readonly models: Models;\n readonly accounts: Accounts;\n /** Upload files to pass as model inputs. */\n readonly files: Files;\n /** Your generations and request history. */\n readonly generations: Generations;\n /** Your webhook registrations. */\n readonly webhooks: Webhooks;\n /** Run published PixelFlow workflows. */\n readonly pixelflows: PixelFlows;\n /** @internal */\n readonly http: HttpClient;\n\n constructor(options: ClientOptions = {}) {\n const apiKey = options.apiKey ?? readEnv('SEGMIND_API_KEY');\n const runtime = detectRuntime();\n if (apiKey && (runtime === 'browser' || runtime === 'react-native') && !options.dangerouslyAllowBrowser) {\n throw new SegmindError(\n 'An API key in a browser or mobile app exposes it to every user. Call Segmind from your backend instead, ' +\n 'or pass dangerouslyAllowBrowser: true if you accept that risk.',\n );\n }\n if (!apiKey) {\n throw new SegmindError('Missing API key: pass { apiKey } or set the SEGMIND_API_KEY environment variable.');\n }\n const fetchImpl = options.fetch ?? globalThis.fetch?.bind(globalThis);\n if (!fetchImpl) throw new SegmindError('No fetch implementation available: pass { fetch }.');\n\n this.baseURL = trimBase(options.baseURL ?? readEnv('SEGMIND_BASE_URL') ?? DEFAULT_BASE_URL);\n this.spotURL = trimSlash(options.spotURL ?? DEFAULT_SPOT_URL);\n this.consoleURL = trimSlash(options.consoleURL ?? DEFAULT_CONSOLE_URL);\n\n const headers: Record<string, string> = { 'X-Initiator': 'SDK-JS', ...options.defaultHeaders };\n const node = nodeVersion();\n if (runtime === 'node' && node) headers['User-Agent'] = `segmind-js/${VERSION} node/${node}`;\n\n this.http = new HttpClient({\n apiKey,\n fetch: fetchImpl,\n timeout: options.timeout ?? 600_000,\n maxRetries: options.maxRetries ?? 2,\n headers,\n });\n this.models = new Models(this);\n this.accounts = new Accounts(this);\n this.files = new Files(this);\n this.generations = new Generations(this);\n this.webhooks = new Webhooks(this);\n this.pixelflows = new PixelFlows(this);\n }\n\n /**\n * Runs a model and returns its result: submits to the v2 queue, then polls\n * until it finishes. `params` go to the model unchanged.\n */\n async run(slug: string, params: Params = {}, options: RunOptions = {}): Promise<RunResult> {\n const job = await this.submit(slug, params, options);\n return job.wait(options);\n }\n\n /**\n * One blocking `POST /v1/{slug}`. Returns the fetch `Response`: call\n * `.arrayBuffer()` for media or `.json()` for JSON models. Never retried,\n * because the call bills.\n */\n async runSync(slug: string, params: Params = {}, options: CallOptions = {}): Promise<Response> {\n return this.http.request({\n method: 'POST',\n url: `${this.baseURL}/v1/${path(slug)}`,\n body: params,\n signal: options.signal,\n timeout: options.timeout,\n });\n }\n\n /**\n * Submits to the v2 queue and returns a `Job` to wait on. Safe to retry: the\n * submit carries an `X-Request-ID`, and the gateway answers a repeat with\n * the existing request rather than a second one.\n */\n async submit(slug: string, params: Params = {}, options: SubmitOptions = {}): Promise<Job> {\n return this.submitJob(slug, params, options, (body) => body);\n }\n\n /** Chat with an LLM through the v2 queue. Returns a provider-neutral reply. */\n async chat(slug: string, params: ChatParams, options: RunOptions = {}): Promise<ChatResponse> {\n const job = await this.submitChat(slug, params, options);\n return job.wait(options);\n }\n\n /** Chat with one blocking `POST /v1/{slug}`. */\n async chatSync(slug: string, params: ChatParams, options: CallOptions = {}): Promise<ChatResponse> {\n const response = await this.runSync(slug, chatBody(params), options);\n return new ChatResponse(await readJson<Record<string, unknown>>(response));\n }\n\n /** Submits a chat to the v2 queue and returns a `Job` whose result is a `ChatResponse`. */\n async submitChat(slug: string, params: ChatParams, options: SubmitOptions = {}): Promise<Job<ChatResponse>> {\n return this.submitJob(slug, chatBody(params), options, chatFromRunResult);\n }\n\n private async submitJob<T>(\n slug: string,\n params: Params,\n options: SubmitOptions,\n transform: (body: RunResult) => T,\n ): Promise<Job<T>> {\n const url = `${this.baseURL}/v2/${path(slug)}`;\n const maxRetries = this.http.config.maxRetries;\n let requestId = options.requestId ?? randomRequestId();\n\n for (let attempt = 0; ; attempt++) {\n const canRetry = attempt < maxRetries;\n let response: Response;\n try {\n response = await this.http.fetchRaw({\n method: 'POST',\n url,\n body: params,\n headers: { 'X-Request-ID': requestId },\n signal: options.signal,\n });\n } catch (err) {\n // The submit may or may not have arrived. Resending the same id is\n // safe: a request that did arrive comes back as 409 with its URLs.\n if (canRetry && err instanceof APIConnectionError) {\n await sleep(retryDelay(attempt, null), options.signal);\n continue;\n }\n throw err;\n }\n\n if (response.ok || response.status === 409) {\n const body = await readJson<SubmitResponse>(response);\n if (response.status === 409 && !body.status_url) {\n throw new SegmindError(`409 ${String((body as { error?: unknown }).error ?? 'conflict')}`, {\n status: 409,\n requestId,\n body,\n });\n }\n return new Job(this.http, validateSubmit(body, response.status), transform);\n }\n if (canRetry && response.status === 503) {\n // Queueing failed and nothing was billed; the gateway asks for a new id.\n await response.body?.cancel().catch(() => undefined);\n requestId = randomRequestId();\n await sleep(retryDelay(attempt, response.headers.get('retry-after')), options.signal);\n continue;\n }\n if (canRetry && (response.status === 429 || response.status === 502 || response.status === 504)) {\n await response.body?.cancel().catch(() => undefined);\n await sleep(retryDelay(attempt, response.headers.get('retry-after')), options.signal);\n continue;\n }\n throw await SegmindError.fromResponse(response, requestId);\n }\n }\n}\n\n/** One catalog entry. Only the commonly used fields are typed. */\nexport interface ModelInfo {\n slug: string;\n title?: string;\n type?: string;\n description?: string;\n is_visible?: boolean;\n is_depreciated?: boolean;\n is_new?: boolean;\n coming_soon?: boolean;\n parameters_schema?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/** The catalog response, as the API returns it. */\nexport interface ModelsListResponse {\n 'Inference Model Information List': ModelInfo[];\n [key: string]: unknown;\n}\n\n/** The model catalog. */\nexport class Models {\n constructor(private readonly client: Segmind) {}\n\n /** Every model in the catalog, under the key `Inference Model Information List`. */\n async list(options: { signal?: AbortSignal } = {}): Promise<ModelsListResponse> {\n return this.client.http.json({\n method: 'GET',\n url: `${this.client.spotURL}/inference-model-information/list`,\n signal: options.signal,\n retry: true,\n });\n }\n}\n\n/** The account the API key belongs to. */\nexport class Accounts {\n constructor(private readonly client: Segmind) {}\n\n /** Account details for the API key. */\n async current(options: { signal?: AbortSignal } = {}): Promise<Record<string, unknown>> {\n return this.client.http.json({\n method: 'GET',\n url: `${this.client.consoleURL}/auth/authenticate`,\n signal: options.signal,\n retry: true,\n });\n }\n}\n\nfunction validateSubmit(body: SubmitResponse, status: number): SubmitResponse {\n if (!body.request_id || !body.status_url || !body.response_url) {\n throw new SegmindError(\n `v2 submit returned ${status} without request_id, status_url and response_url (keys: ${Object.keys(body).sort().join(', ')})`,\n { status, body },\n );\n }\n return body;\n}\n\nfunction path(slug: string): string {\n const clean = slug.trim().replace(/^\\/+/, '');\n if (!clean) throw new SegmindError('A model slug is required.');\n return clean;\n}\n\nfunction trimSlash(url: string): string {\n return url.replace(/\\/+$/, '');\n}\n\n/** Accepts `https://api.segmind.com/v1` too, since that is what the Python SDK takes. */\nfunction trimBase(url: string): string {\n return trimSlash(url).replace(/\\/v\\d+$/, '');\n}\n","import { toBase64 } from './core/env';\nimport { type FileInput, readFileInput } from './core/input';\n\n/** An OpenAI-style image part, for the `content` list of a chat message. */\nexport interface ImageUrlPart {\n type: 'image_url';\n image_url: { url: string };\n}\n\nexport type ImageInput = FileInput;\n\n/**\n * Builds an image part for a chat message.\n *\n * - An `http(s)://` or `data:` URL passes through.\n * - A file path (Node only) is read and inlined as a base64 `data:` URI.\n * - A `Blob`, `ArrayBuffer` or `Uint8Array` is inlined; pass `mimeType` when\n * it cannot be told from the blob or the bytes.\n *\n * Inlining is the safer route: the gateway cannot fetch URLs on every host.\n */\nexport async function imageUrl(input: ImageInput, options: { mimeType?: string } = {}): Promise<ImageUrlPart> {\n if (typeof input === 'string' && /^(https?:|data:)/i.test(input)) {\n return { type: 'image_url', image_url: { url: input } };\n }\n const file = await readFileInput(input, { mimeType: options.mimeType, caller: 'imageUrl' });\n return { type: 'image_url', image_url: { url: `data:${file.mimeType};base64,${toBase64(file.bytes)}` } };\n}\n","import type { ChatParams, ChatResponse } from './chat';\nimport { Segmind } from './client';\nimport type { FileInput } from './core/input';\nimport type { Files, UploadOptions } from './files';\nimport type { Generations } from './generations';\nimport type { PixelFlows } from './pixelflows';\nimport type { Webhooks } from './webhooks';\nimport type { Job } from './job';\nimport type { CallOptions, Params, RunOptions, RunResult, SubmitOptions } from './types';\n\nexport { Segmind, Models, Accounts, DEFAULT_BASE_URL, DEFAULT_SPOT_URL, DEFAULT_CONSOLE_URL } from './client';\nexport type { ClientOptions, ModelInfo, ModelsListResponse } from './client';\nexport { Job, DEFAULT_WAIT_TIMEOUT_MS, DEFAULT_WAIT_INTERVAL_MS } from './job';\nexport { ChatResponse } from './chat';\nexport type { ChatMessage, ChatParams } from './chat';\nexport { imageUrl } from './image-url';\nexport type { ImageInput, ImageUrlPart } from './image-url';\nexport type { FileInput } from './core/input';\nexport { Files } from './files';\nexport type { UploadOptions, UploadedFile } from './files';\nexport { Generations } from './generations';\nexport type { Generation, GenerationsListOptions, HistoryOptions, Page, RequestRecord } from './generations';\nexport { Webhooks } from './webhooks';\nexport type { Webhook } from './webhooks';\nexport { PixelFlows, PixelflowJob } from './pixelflows';\nexport type { PixelflowStatus, PixelflowSubmitOptions, PixelflowWaitOptions } from './pixelflows';\nexport { SegmindError, APIConnectionError, InferenceFailed, InferenceTimeout } from './core/errors';\nexport type {\n CallOptions,\n JobState,\n JobStatus,\n Params,\n RunOptions,\n RunResult,\n SubmitOptions,\n SubmitResponse,\n WaitOptions,\n} from './types';\nexport { VERSION } from './version';\n\nlet shared: Segmind | undefined;\n\n/** The client behind the module-level functions, created on first use from the environment. */\nfunction client(): Segmind {\n shared ??= new Segmind();\n return shared;\n}\n\n/** `new Segmind().run(...)` with the key from `SEGMIND_API_KEY`. */\nexport const run = (slug: string, params?: Params, options?: RunOptions): Promise<RunResult> =>\n client().run(slug, params, options);\n\n/** `new Segmind().runSync(...)` with the key from `SEGMIND_API_KEY`. */\nexport const runSync = (slug: string, params?: Params, options?: CallOptions): Promise<Response> =>\n client().runSync(slug, params, options);\n\n/** `new Segmind().submit(...)` with the key from `SEGMIND_API_KEY`. */\nexport const submit = (slug: string, params?: Params, options?: SubmitOptions): Promise<Job> =>\n client().submit(slug, params, options);\n\n/** `new Segmind().chat(...)` with the key from `SEGMIND_API_KEY`. */\nexport const chat = (slug: string, params: ChatParams, options?: RunOptions): Promise<ChatResponse> =>\n client().chat(slug, params, options);\n\n/** `new Segmind().chatSync(...)` with the key from `SEGMIND_API_KEY`. */\nexport const chatSync = (slug: string, params: ChatParams, options?: CallOptions): Promise<ChatResponse> =>\n client().chatSync(slug, params, options);\n\n/** `new Segmind().submitChat(...)` with the key from `SEGMIND_API_KEY`. */\nexport const submitChat = (slug: string, params: ChatParams, options?: SubmitOptions): Promise<Job<ChatResponse>> =>\n client().submitChat(slug, params, options);\n\n/** `new Segmind().models` with the key from `SEGMIND_API_KEY`. */\nexport const models = {\n list: (options?: { signal?: AbortSignal }) => client().models.list(options),\n};\n\n/** `new Segmind().accounts` with the key from `SEGMIND_API_KEY`. */\nexport const accounts = {\n current: (options?: { signal?: AbortSignal }) => client().accounts.current(options),\n};\n\n/** `new Segmind().files` with the key from `SEGMIND_API_KEY`. */\nexport const files: Pick<Files, 'upload'> = {\n upload: ((input: FileInput | FileInput[], options?: UploadOptions) =>\n client().files.upload(input as FileInput, options)) as Files['upload'],\n};\n\n/** `new Segmind().generations` with the key from `SEGMIND_API_KEY`. */\nexport const generations: Pick<Generations, 'list' | 'recent' | 'history' | 'get'> = {\n list: (options) => client().generations.list(options),\n recent: (modelName, options) => client().generations.recent(modelName, options),\n history: (options) => client().generations.history(options),\n get: (requestId, options) => client().generations.get(requestId, options),\n};\n\n/** `new Segmind().webhooks` with the key from `SEGMIND_API_KEY`. */\nexport const webhooks: Pick<Webhooks, 'get' | 'add' | 'update' | 'delete' | 'logs'> = {\n get: (options) => client().webhooks.get(options),\n add: (webhookUrl, eventTypes, options) => client().webhooks.add(webhookUrl, eventTypes, options),\n update: (webhookId, webhookUrl, eventTypes, options) =>\n client().webhooks.update(webhookId, webhookUrl, eventTypes, options),\n delete: (webhookId, options) => client().webhooks.delete(webhookId, options),\n logs: (webhookId, options) => client().webhooks.logs(webhookId, options),\n};\n\n/** `new Segmind().pixelflows` with the key from `SEGMIND_API_KEY`. */\nexport const pixelflows: Pick<PixelFlows, 'run' | 'submit' | 'getStatus' | 'poll'> = {\n run: (slug, inputs, options) => client().pixelflows.run(slug, inputs, options),\n submit: (slug, inputs, options) => client().pixelflows.submit(slug, inputs, options),\n getStatus: (requestId, options) => client().pixelflows.getStatus(requestId, options),\n poll: (requestId, options) => client().pixelflows.poll(requestId, options),\n};\n"],"mappings":"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","names":["record","client","client","path","client","pixelflows","client","path","client"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "segmind",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Official JavaScript SDK for the Segmind API: image, video, audio and LLM models from Node, browsers and React Native.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Segmind <support@segmind.com>",