segmind 0.2.1 → 0.2.3

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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  The official JavaScript SDK for [Segmind](https://www.segmind.com): image, video, audio and LLM models through one API. It works in Node 22+, and in browsers and React Native through your own backend.
4
4
 
5
- > **Pre-release.** The API below is the 0.2 surface and may change before 1.0.
5
+ > **0.x.** The API below is the 0.2 surface. Until 1.0, a breaking change bumps the minor version, so pin `segmind@~0.2` if you need it to hold still.
6
6
 
7
7
  ## Install
8
8
 
@@ -97,7 +97,17 @@ const { url } = await segmind.files.upload('portrait.jpg'); // a path (Node), a
97
97
  const result = await segmind.run('some-image-to-image-model', { image: url });
98
98
  ```
99
99
 
100
- Each file goes straight to storage on a presigned URL, so large videos never travel as base64 JSON. The URLs are public and temporary (kept for at least two days): they are for passing files to models, not for keeping them. Pass an array to upload several, in order. Bytes without a name need `{ filename: 'clip.mp4' }` unless their type can be read from the first bytes.
100
+ Each file goes straight to storage on a presigned URL, so large videos never travel as base64 JSON. By default the URLs are public and temporary (kept for at least two days): they are for passing files to models, not for keeping them. Pass an array to upload several, in order. Bytes without a name need `{ filename: 'clip.mp4' }` unless their type can be read from the first bytes.
101
+
102
+ To keep a file, pass `persist: true`. It is saved to your asset library and its URL does not expire, the same as the Python SDK's upload:
103
+
104
+ ```ts
105
+ const logo = await segmind.files.upload('logo.png', { persist: true });
106
+ logo.url; // https://images.segmind.com/assets/…
107
+ logo.persistent; // true
108
+ ```
109
+
110
+ Persistent uploads take images, video, audio, PDF and common document types, up to 2 GB each.
101
111
 
102
112
  ## Generations
103
113
 
package/dist/index.cjs CHANGED
@@ -491,12 +491,16 @@ var Files = class {
491
491
  }
492
492
  async uploadOne(input, options) {
493
493
  const file = await readFileInput(input, { ...options, caller: "files.upload" });
494
- const { http } = this.client;
495
- const ticket = await http.json({
494
+ const url = options.persist ? await this.persist(file, options.signal) : await this.stage(file, options.signal);
495
+ return { url, filename: file.filename, size: file.bytes.byteLength, persistent: options.persist === true };
496
+ }
497
+ /** A temporary model input on the inference API's input bucket. */
498
+ async stage(file, signal) {
499
+ const ticket = await this.client.http.json({
496
500
  method: "POST",
497
501
  url: `${this.client.spotURL}/inference-request/input-presign`,
498
502
  body: { filename: file.filename, size: file.bytes.byteLength },
499
- signal: options.signal,
503
+ signal,
500
504
  retry: true
501
505
  });
502
506
  if (!ticket.upload_url || !ticket.url) {
@@ -505,16 +509,41 @@ var Files = class {
505
509
  const headers = { ...ticket.required_headers };
506
510
  delete headers["Content-Length"];
507
511
  delete headers["content-length"];
508
- await http.request({
509
- method: "PUT",
510
- url: ticket.upload_url,
511
- rawBody: file.bytes,
512
- headers,
513
- bare: true,
514
- signal: options.signal,
512
+ await this.put(ticket.upload_url, file, headers, signal);
513
+ return ticket.url;
514
+ }
515
+ /** A file in the caller's asset library: presign, PUT, then confirm to register it. */
516
+ async persist(file, signal) {
517
+ const contentType = file.mimeType;
518
+ if (!contentType) {
519
+ throw new SegmindError(`files.upload: cannot tell the type of ${file.filename}; pass { mimeType } to persist it`);
520
+ }
521
+ const { http, assetsURL } = this.client;
522
+ const ticket = await http.json({
523
+ method: "POST",
524
+ url: `${assetsURL}/upload-asset/presign`,
525
+ body: { filename: file.filename, contentType, size: file.bytes.byteLength },
526
+ signal,
515
527
  retry: true
516
528
  });
517
- return { url: ticket.url, filename: file.filename, size: file.bytes.byteLength };
529
+ if (!ticket.presignedUrl || !ticket.s3Key || !ticket.publicUrl) {
530
+ throw new SegmindError("files.upload: the asset presign response had no presignedUrl, s3Key or publicUrl", {
531
+ body: ticket
532
+ });
533
+ }
534
+ await this.put(ticket.presignedUrl, file, { "Content-Type": contentType }, signal);
535
+ const confirmed = await http.json({
536
+ method: "POST",
537
+ url: `${assetsURL}/upload-asset/confirm`,
538
+ body: { s3Key: ticket.s3Key, publicUrl: ticket.publicUrl, contentType, filename: file.filename },
539
+ signal,
540
+ retry: true
541
+ });
542
+ return confirmed.asset?.url ?? ticket.publicUrl;
543
+ }
544
+ /** A PUT to the same key is idempotent, so it retries. `bare` keeps the API key off the storage host. */
545
+ async put(url, file, headers, signal) {
546
+ await this.client.http.request({ method: "PUT", url, rawBody: file.bytes, headers, bare: true, signal, retry: true });
518
547
  }
519
548
  };
520
549
 
@@ -752,7 +781,7 @@ function failureDetail(body) {
752
781
  }
753
782
 
754
783
  // src/version.ts
755
- var VERSION = "0.2.1";
784
+ var VERSION = "0.2.3";
756
785
 
757
786
  // src/webhooks.ts
758
787
  var Webhooks = class {
@@ -801,10 +830,12 @@ function requireTypes(eventTypes) {
801
830
  var DEFAULT_BASE_URL = "https://api.segmind.com";
802
831
  var DEFAULT_SPOT_URL = "https://api.spotprod.segmind.com";
803
832
  var DEFAULT_CONSOLE_URL = "https://cloud.segmind.com/api";
833
+ var DEFAULT_ASSETS_URL = "https://platform-api.segmind.com";
804
834
  var Segmind = class {
805
835
  baseURL;
806
836
  spotURL;
807
837
  consoleURL;
838
+ assetsURL;
808
839
  models;
809
840
  accounts;
810
841
  /** Upload files to pass as model inputs. */
@@ -833,6 +864,7 @@ var Segmind = class {
833
864
  this.baseURL = trimBase(options.baseURL ?? readEnv("SEGMIND_BASE_URL") ?? DEFAULT_BASE_URL);
834
865
  this.spotURL = trimSlash(options.spotURL ?? DEFAULT_SPOT_URL);
835
866
  this.consoleURL = trimSlash(options.consoleURL ?? DEFAULT_CONSOLE_URL);
867
+ this.assetsURL = trimSlash(options.assetsURL ?? DEFAULT_ASSETS_URL);
836
868
  const headers = { "X-Initiator": "SDK-JS", ...options.defaultHeaders };
837
869
  const node = nodeVersion();
838
870
  if (runtime === "node" && node) headers["User-Agent"] = `segmind-js/${VERSION} node/${node}`;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../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"],"sourcesContent":["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, WebhookEventType } 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","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.1';\n","import type { Segmind } from './client';\nimport { SegmindError } from './core/errors';\n\n/**\n * What a registration subscribes to. `PIXELFLOW` covers PixelFlow runs; the\n * others are the platform's remaining subscription types.\n */\nexport type WebhookEventType = 'PIXELFLOW' | 'WORKFLOW' | 'INFERENCE' | 'FINETUNE' | (string & {});\n\n/** A webhook registration, as the API returns it. */\nexport interface Webhook {\n /** Pass to `update`, `delete` and `logs`. */\n id: string;\n user_id: string;\n webhook_url: string;\n /** Verifies that a delivery came from Segmind. Returned by `get`, not by `add`. */\n signing_secret?: string;\n event_types: WebhookEventType[];\n is_active: boolean;\n created_ts: string;\n [key: string]: unknown;\n}\n\n/** Your webhook registrations. One active registration per set of event types. */\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. A second active registration for the same types is refused (409). */\n async add(webhookUrl: string, eventTypes: WebhookEventType[], options: { signal?: AbortSignal } = {}): Promise<Webhook> {\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: WebhookEventType[],\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: WebhookEventType[]): string[] {\n if (!Array.isArray(eventTypes) || eventTypes.length === 0) {\n throw new SegmindError('webhooks: pass at least one event type, e.g. [\"PIXELFLOW\"]');\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"],"mappings":"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","names":["record","client","client","path","client","pixelflows","client","path","client"]}
1
+ {"version":3,"sources":["../src/index.ts","../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"],"sourcesContent":["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, WebhookEventType } 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","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, type ReadFile, 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 /**\n * Keep the file in your Segmind asset library and return a URL that does not\n * expire, as the Python SDK's upload does. By default the file is a temporary\n * model input, kept for at least two days.\n */\n persist?: boolean;\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 /** True when the file is in your asset library and the URL does not expire. */\n persistent: boolean;\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/** `POST /upload-asset/presign` on the asset library. */\ninterface AssetTicket {\n presignedUrl: string;\n s3Key: string;\n publicUrl: string;\n}\n\n/** `POST /upload-asset/confirm`. */\ninterface AssetConfirmation {\n asset?: { url?: 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. They are temporary unless you pass `persist: true`.\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 url = options.persist ? await this.persist(file, options.signal) : await this.stage(file, options.signal);\n return { url, filename: file.filename, size: file.bytes.byteLength, persistent: options.persist === true };\n }\n\n /** A temporary model input on the inference API's input bucket. */\n private async stage(file: ReadFile, signal?: AbortSignal): Promise<string> {\n // Minting stores nothing, so it retries safely.\n const ticket = await this.client.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,\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.\n const headers = { ...ticket.required_headers };\n delete headers['Content-Length'];\n delete headers['content-length'];\n await this.put(ticket.upload_url, file, headers, signal);\n return ticket.url;\n }\n\n /** A file in the caller's asset library: presign, PUT, then confirm to register it. */\n private async persist(file: ReadFile, signal?: AbortSignal): Promise<string> {\n const contentType = file.mimeType;\n if (!contentType) {\n throw new SegmindError(`files.upload: cannot tell the type of ${file.filename}; pass { mimeType } to persist it`);\n }\n const { http, assetsURL } = this.client;\n const ticket = await http.json<AssetTicket>({\n method: 'POST',\n url: `${assetsURL}/upload-asset/presign`,\n body: { filename: file.filename, contentType, size: file.bytes.byteLength },\n signal,\n retry: true,\n });\n if (!ticket.presignedUrl || !ticket.s3Key || !ticket.publicUrl) {\n throw new SegmindError('files.upload: the asset presign response had no presignedUrl, s3Key or publicUrl', {\n body: ticket,\n });\n }\n\n // The URL signs Content-Type and Content-Length, so the type must match the presign.\n await this.put(ticket.presignedUrl, file, { 'Content-Type': contentType }, signal);\n\n // Confirming upserts on the key, so a retry cannot register the file twice.\n const confirmed = await http.json<AssetConfirmation>({\n method: 'POST',\n url: `${assetsURL}/upload-asset/confirm`,\n body: { s3Key: ticket.s3Key, publicUrl: ticket.publicUrl, contentType, filename: file.filename },\n signal,\n retry: true,\n });\n return confirmed.asset?.url ?? ticket.publicUrl;\n }\n\n /** A PUT to the same key is idempotent, so it retries. `bare` keeps the API key off the storage host. */\n private async put(url: string, file: ReadFile, headers: Record<string, string>, signal?: AbortSignal) {\n await this.client.http.request({ method: 'PUT', url, rawBody: file.bytes, headers, bare: true, signal, retry: true });\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.3';\n","import type { Segmind } from './client';\nimport { SegmindError } from './core/errors';\n\n/**\n * What a registration subscribes to. `PIXELFLOW` covers PixelFlow runs; the\n * others are the platform's remaining subscription types.\n */\nexport type WebhookEventType = 'PIXELFLOW' | 'WORKFLOW' | 'INFERENCE' | 'FINETUNE' | (string & {});\n\n/** A webhook registration, as the API returns it. */\nexport interface Webhook {\n /** Pass to `update`, `delete` and `logs`. */\n id: string;\n user_id: string;\n webhook_url: string;\n /** Verifies that a delivery came from Segmind. Returned by `get`, not by `add`. */\n signing_secret?: string;\n event_types: WebhookEventType[];\n is_active: boolean;\n created_ts: string;\n [key: string]: unknown;\n}\n\n/** Your webhook registrations. One active registration per set of event types. */\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. A second active registration for the same types is refused (409). */\n async add(webhookUrl: string, eventTypes: WebhookEventType[], options: { signal?: AbortSignal } = {}): Promise<Webhook> {\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: WebhookEventType[],\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: WebhookEventType[]): string[] {\n if (!Array.isArray(eventTypes) || eventTypes.length === 0) {\n throw new SegmindError('webhooks: pass at least one event type, e.g. [\"PIXELFLOW\"]');\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';\nexport const DEFAULT_ASSETS_URL = 'https://platform-api.segmind.com';\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 /** The asset library API, for persistent uploads. Default https://platform-api.segmind.com. */\n assetsURL?: 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 assetsURL: 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 this.assetsURL = trimSlash(options.assetsURL ?? DEFAULT_ASSETS_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"],"mappings":"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","names":["record","client","client","path","client","pixelflows","client","path","client"]}