@hoodcompute/sdk 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-72VFNNOI.js → chunk-EH6FBSJB.js} +86 -10
- package/dist/chunk-EH6FBSJB.js.map +1 -0
- package/dist/{client-CIPi_mUM.d.cts → client-PLfo5vhW.d.cts} +26 -1
- package/dist/{client-CIPi_mUM.d.ts → client-PLfo5vhW.d.ts} +26 -1
- package/dist/index.cjs +84 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -4
- package/dist/index.d.ts +6 -4
- package/dist/index.js +1 -1
- package/dist/react.cjs +111 -17
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +3 -1
- package/dist/react.d.ts +3 -1
- package/dist/react.js +28 -10
- package/dist/react.js.map +1 -1
- package/package.json +3 -3
- package/dist/chunk-72VFNNOI.js.map +0 -1
package/dist/react.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/constants.ts","../src/http.ts","../src/streaming.ts","../src/resources/chat.ts","../src/resources/models.ts","../src/resources/jobs.ts","../src/resources/account.ts","../src/client.ts","../src/react.ts"],"names":["response","normalize","useState","useMemo","useRef","useCallback"],"mappings":"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","file":"react.cjs","sourcesContent":["/**\n * Error types raised by the HoodCompute SDK.\n *\n * Every failed API request is surfaced as a `HoodComputeError` (or a subclass).\n * The machine-readable `code` maps to the codes documented at\n * https://docs.hoodcompute.com/api-reference/errors.\n */\n\n/** Shape of the error body returned by the API. */\nexport interface ApiErrorBody {\n code?: string\n message?: string\n type?: string\n param?: string | null\n docs?: string\n details?: Record<string, unknown>\n}\n\n/** Base class for all errors raised by the SDK. */\nexport class HoodComputeError extends Error {\n /** HTTP status code, when the error came from an API response. */\n readonly status?: number\n /** Machine-readable error code, for example `insufficient_credits`. */\n readonly code?: string\n /** Error category reported by the API. */\n readonly type?: string\n /** Request parameter that caused the error, when applicable. */\n readonly param?: string | null\n /** Additional structured detail from the API. */\n readonly details?: Record<string, unknown>\n /** Value of the `x-request-id` response header, useful for support. */\n readonly requestId?: string\n\n constructor(\n message: string,\n opts: {\n status?: number\n code?: string\n type?: string\n param?: string | null\n details?: Record<string, unknown>\n requestId?: string\n } = {},\n ) {\n super(message)\n this.name = \"HoodComputeError\"\n this.status = opts.status\n this.code = opts.code\n this.type = opts.type\n this.param = opts.param\n this.details = opts.details\n this.requestId = opts.requestId\n }\n}\n\n/** 401 / 403. The API key is missing, invalid, revoked, or suspended. */\nexport class AuthenticationError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"AuthenticationError\"\n }\n}\n\n/** 402. The credit balance is too low for the requested tier. */\nexport class InsufficientCreditsError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"InsufficientCreditsError\"\n }\n}\n\n/** 400. The request body is malformed or a required field is missing. */\nexport class InvalidRequestError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"InvalidRequestError\"\n }\n}\n\n/** 404. The requested resource does not exist. */\nexport class NotFoundError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"NotFoundError\"\n }\n}\n\n/** 429. The request rate to the API is too high. Back off and retry. */\nexport class RateLimitError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"RateLimitError\"\n }\n}\n\n/**\n * 503. No workers are currently hosting the requested model. This is a\n * transient condition. Check `retryAfter` and try again.\n */\nexport class NoWorkersAvailableError extends HoodComputeError {\n /** Suggested seconds to wait before retrying. */\n get retryAfter(): number | undefined {\n const value = this.details?.retry_after\n return typeof value === \"number\" ? value : undefined\n }\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"NoWorkersAvailableError\"\n }\n}\n\n/** 504. No worker completed the job within the timeout. Credits were refunded. */\nexport class JobTimeoutError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"JobTimeoutError\"\n }\n}\n\n/** 5xx. An internal server error. Usually safe to retry. */\nexport class ServerError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"ServerError\"\n }\n}\n\n/** The request failed to reach the API, or timed out, or was aborted. */\nexport class ConnectionError extends HoodComputeError {\n constructor(message: string, opts: { cause?: unknown } = {}) {\n super(message)\n this.name = \"ConnectionError\"\n if (opts.cause !== undefined) this.cause = opts.cause\n }\n}\n\n/**\n * Construct the appropriate error subclass from an API response.\n * @internal\n */\nexport function errorFromResponse(\n status: number,\n body: ApiErrorBody | undefined,\n requestId?: string,\n): HoodComputeError {\n const code = body?.code\n const message = body?.message ?? `HoodCompute API request failed with status ${status}`\n const opts = {\n status,\n code,\n type: body?.type,\n param: body?.param ?? null,\n details: body?.details,\n requestId,\n }\n\n if (code === \"no_workers_available\") return new NoWorkersAvailableError(message, opts)\n if (code === \"job_timeout\") return new JobTimeoutError(message, opts)\n if (code === \"insufficient_credits\") return new InsufficientCreditsError(message, opts)\n\n switch (status) {\n case 400:\n case 422:\n return new InvalidRequestError(message, opts)\n case 401:\n case 403:\n return new AuthenticationError(message, opts)\n case 402:\n return new InsufficientCreditsError(message, opts)\n case 404:\n return new NotFoundError(message, opts)\n case 429:\n return new RateLimitError(message, opts)\n case 503:\n return new NoWorkersAvailableError(message, opts)\n case 504:\n return new JobTimeoutError(message, opts)\n default:\n if (status >= 500) return new ServerError(message, opts)\n return new HoodComputeError(message, opts)\n }\n}\n\n/** Whether an error is worth retrying with the same payload. @internal */\nexport function isRetryable(err: unknown): boolean {\n if (err instanceof ConnectionError) return true\n if (err instanceof HoodComputeError) {\n if (err.status === undefined) return false\n return err.status >= 500 || err.status === 429\n }\n return false\n}\n","/**\n * Network and client defaults for HoodCompute.\n */\n\n/** Default HoodCompute API base URL. */\nexport const DEFAULT_BASE_URL = \"https://api.hoodcompute.com/v1\"\n\n/** Robinhood Chain mainnet chain ID. */\nexport const ROBINHOOD_CHAIN_ID = 4663\n\n/** Base URL of the Robinhood Chain Blockscout explorer. */\nexport const BLOCKSCOUT_BASE_URL = \"https://robinhoodchain.blockscout.com\"\n\n/** Default request timeout in milliseconds. */\nexport const DEFAULT_TIMEOUT_MS = 120_000\n\n/** Default number of automatic retries on transient failures. */\nexport const DEFAULT_MAX_RETRIES = 2\n\n/** SDK version, surfaced in the User-Agent header. */\nexport const SDK_VERSION = \"0.1.0\"\n\n/**\n * Build a Blockscout explorer link for a Robinhood Chain transaction hash.\n *\n * @example\n * explorerTxUrl(receipt.settlementTx)\n * // \"https://robinhoodchain.blockscout.com/tx/0x...\"\n */\nexport function explorerTxUrl(txHash: string): string {\n return `${BLOCKSCOUT_BASE_URL}/tx/${txHash}`\n}\n\n/**\n * Build a Blockscout explorer link for a Robinhood Chain address.\n */\nexport function explorerAddressUrl(address: string): string {\n return `${BLOCKSCOUT_BASE_URL}/address/${address}`\n}\n","/**\n * Internal HTTP transport. Handles authentication headers, timeouts, automatic\n * retries with exponential backoff, and error normalization. Not part of the\n * public API surface.\n * @internal\n */\n\nimport {\n ConnectionError,\n errorFromResponse,\n isRetryable,\n type ApiErrorBody,\n} from \"./errors.js\"\nimport { SDK_VERSION } from \"./constants.js\"\n\nexport interface HttpClientOptions {\n apiKey: string\n baseURL: string\n timeout: number\n maxRetries: number\n defaultHeaders?: Record<string, string>\n fetch?: typeof fetch\n}\n\nexport interface RequestOptions {\n method?: string\n path: string\n query?: Record<string, string | number | undefined>\n body?: unknown\n /** When true, the raw Response is returned without reading the body. */\n stream?: boolean\n signal?: AbortSignal\n}\n\nexport class HttpClient {\n private readonly apiKey: string\n private readonly baseURL: string\n private readonly timeout: number\n private readonly maxRetries: number\n private readonly defaultHeaders: Record<string, string>\n private readonly fetchImpl: typeof fetch\n\n constructor(options: HttpClientOptions) {\n this.apiKey = options.apiKey\n this.baseURL = options.baseURL.replace(/\\/$/, \"\")\n this.timeout = options.timeout\n this.maxRetries = options.maxRetries\n this.defaultHeaders = options.defaultHeaders ?? {}\n\n const impl = options.fetch ?? globalThis.fetch\n if (!impl) {\n throw new ConnectionError(\n \"No global fetch implementation found. Use Node 18+ or pass a `fetch` option.\",\n )\n }\n this.fetchImpl = impl\n }\n\n /** Perform a request and return the parsed JSON body plus response headers. */\n async request<T>(options: RequestOptions): Promise<{ data: T; response: Response }> {\n const response = await this.raw(options)\n const text = await response.text()\n const data = text ? (JSON.parse(text) as T) : (undefined as T)\n return { data, response }\n }\n\n /**\n * Perform a request and return the raw Response. Used by the streaming path,\n * which reads `response.body` directly. Errors are still parsed and thrown.\n */\n async raw(options: RequestOptions): Promise<Response> {\n const url = this.buildUrl(options.path, options.query)\n const headers = this.buildHeaders(options)\n const init: RequestInit = {\n method: options.method ?? \"GET\",\n headers,\n }\n if (options.body !== undefined) {\n init.body = JSON.stringify(options.body)\n }\n\n let lastError: unknown\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n const response = await this.fetchWithTimeout(url, init, options.signal)\n if (response.ok) return response\n\n const error = await this.toError(response)\n if (isRetryable(error) && attempt < this.maxRetries) {\n lastError = error\n await sleep(this.backoff(attempt, error))\n continue\n }\n throw error\n } catch (err) {\n if (err instanceof ConnectionError && attempt < this.maxRetries) {\n lastError = err\n await sleep(this.backoff(attempt))\n continue\n }\n throw err\n }\n }\n\n // Loop only exits via return/throw except when the last attempt was a\n // retryable failure that exhausted the budget.\n throw lastError instanceof Error\n ? lastError\n : new ConnectionError(\"Request failed after exhausting retries.\")\n }\n\n private async fetchWithTimeout(\n url: string,\n init: RequestInit,\n userSignal?: AbortSignal,\n ): Promise<Response> {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), this.timeout)\n const onAbort = () => controller.abort()\n userSignal?.addEventListener(\"abort\", onAbort, { once: true })\n\n try {\n return await this.fetchImpl(url, { ...init, signal: controller.signal })\n } catch (err) {\n if (userSignal?.aborted) {\n throw new ConnectionError(\"Request aborted by caller.\", { cause: err })\n }\n if (controller.signal.aborted) {\n throw new ConnectionError(`Request timed out after ${this.timeout}ms.`, { cause: err })\n }\n throw new ConnectionError(\"Failed to reach the HoodCompute API.\", { cause: err })\n } finally {\n clearTimeout(timer)\n userSignal?.removeEventListener(\"abort\", onAbort)\n }\n }\n\n private async toError(response: Response) {\n let body: ApiErrorBody | undefined\n try {\n const parsed = (await response.json()) as { error?: ApiErrorBody } | ApiErrorBody\n body = \"error\" in parsed && parsed.error ? parsed.error : (parsed as ApiErrorBody)\n } catch {\n body = undefined\n }\n const requestId = response.headers.get(\"x-request-id\") ?? undefined\n return errorFromResponse(response.status, body, requestId)\n }\n\n private buildUrl(path: string, query?: RequestOptions[\"query\"]): string {\n const url = new URL(`${this.baseURL}${path}`)\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) url.searchParams.set(key, String(value))\n }\n }\n return url.toString()\n }\n\n private buildHeaders(options: RequestOptions): Record<string, string> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n Accept: options.stream ? \"text/event-stream\" : \"application/json\",\n \"User-Agent\": `hoodcompute-sdk-js/${SDK_VERSION}`,\n ...this.defaultHeaders,\n }\n if (options.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\"\n }\n return headers\n }\n\n private backoff(attempt: number, error?: unknown): number {\n // Honor a server-suggested retry_after when present (in seconds).\n const retryAfter =\n error &&\n typeof error === \"object\" &&\n \"details\" in error &&\n typeof (error as { details?: Record<string, unknown> }).details?.retry_after === \"number\"\n ? ((error as { details: Record<string, unknown> }).details.retry_after as number) * 1000\n : undefined\n if (retryAfter !== undefined) return retryAfter\n return Math.min(1000 * 2 ** attempt, 8000)\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","/**\n * Server-Sent Events parsing and the streaming chat completion object.\n */\n\nimport type { ChatCompletionChunk } from \"./types.js\"\nimport { ConnectionError } from \"./errors.js\"\n\n/**\n * Lightweight settlement metadata surfaced from a streaming response once it\n * closes. Values are read from response headers as the network makes them\n * available. For the full on-chain receipt, call `client.jobs.getReceipt(jobId)`.\n */\nexport interface StreamReceipt {\n jobId: string | null\n settlementTx: string | null\n escrowTx: string | null\n workerAddress: string | null\n creditsRemaining: number | null\n}\n\n/**\n * An async-iterable stream of chat completion chunks.\n *\n * Iterate it with `for await` to consume tokens as they arrive. Once iteration\n * finishes, `jobId` and `receipt` are populated from the response.\n *\n * @example\n * const stream = await client.chat.completions.create({ ..., stream: true })\n * for await (const chunk of stream) {\n * process.stdout.write(chunk.choices[0]?.delta?.content ?? \"\")\n * }\n * console.log(stream.receipt.settlementTx)\n */\nexport class ChatCompletionStream implements AsyncIterable<ChatCompletionChunk> {\n /** HoodCompute job ID for this completion, from the response header. */\n jobId: string | null\n /** Settlement metadata, populated once the stream finishes. */\n receipt: StreamReceipt\n\n private readonly response: Response\n\n constructor(response: Response) {\n this.response = response\n this.jobId = response.headers.get(\"x-hoodcompute-job-id\")\n this.receipt = this.readReceipt()\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<ChatCompletionChunk> {\n const body = this.response.body\n if (!body) {\n throw new ConnectionError(\"The streaming response contained no body.\")\n }\n\n const decoder = new TextDecoder()\n const reader = body.getReader()\n let buffer = \"\"\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n\n // SSE events are separated by a blank line.\n let boundary = buffer.indexOf(\"\\n\\n\")\n while (boundary !== -1) {\n const rawEvent = buffer.slice(0, boundary)\n buffer = buffer.slice(boundary + 2)\n\n const chunk = parseEvent(rawEvent)\n if (chunk === DONE) {\n return\n }\n if (chunk) {\n yield chunk\n }\n boundary = buffer.indexOf(\"\\n\\n\")\n }\n }\n\n // Flush a trailing event with no terminating blank line.\n const trailing = parseEvent(buffer)\n if (trailing && trailing !== DONE) {\n yield trailing\n }\n } finally {\n reader.releaseLock()\n // Refresh the receipt in case trailer headers landed after the stream.\n this.receipt = this.readReceipt()\n }\n }\n\n /** Convenience: collect the full concatenated text of the stream. */\n async text(): Promise<string> {\n let out = \"\"\n for await (const chunk of this) {\n out += chunk.choices[0]?.delta?.content ?? \"\"\n }\n return out\n }\n\n private readReceipt(): StreamReceipt {\n const h = this.response.headers\n const creditsRemaining = h.get(\"x-hoodcompute-credits-remaining\")\n return {\n jobId: h.get(\"x-hoodcompute-job-id\"),\n settlementTx: h.get(\"x-hoodcompute-settlement-tx\"),\n escrowTx: h.get(\"x-hoodcompute-tx-hash\"),\n workerAddress: h.get(\"x-hoodcompute-worker\"),\n creditsRemaining: creditsRemaining !== null ? Number(creditsRemaining) : null,\n }\n }\n}\n\n/** Sentinel marking the `[DONE]` terminator. */\nconst DONE = Symbol(\"done\")\n\n/**\n * Parse one raw SSE event block into a chunk. Returns `DONE` on the terminator,\n * `null` for events without usable data (comments, empty blocks).\n */\nfunction parseEvent(raw: string): ChatCompletionChunk | typeof DONE | null {\n const dataLines: string[] = []\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trimEnd()\n if (trimmed.startsWith(\":\") || trimmed === \"\") continue\n if (trimmed.startsWith(\"data:\")) {\n dataLines.push(trimmed.slice(5).trimStart())\n }\n }\n if (dataLines.length === 0) return null\n\n const data = dataLines.join(\"\\n\")\n if (data === \"[DONE]\") return DONE\n\n try {\n return JSON.parse(data) as ChatCompletionChunk\n } catch {\n return null\n }\n}\n","/**\n * Chat completions. OpenAI-compatible in request and response shape, with the\n * job ID and on-chain settlement attached to every result.\n */\n\nimport type { HttpClient } from \"../http.js\"\nimport type {\n ChatCompletion,\n ChatCompletionCreateParams,\n} from \"../types.js\"\nimport { ChatCompletionStream } from \"../streaming.js\"\n\n/** Raw response body from the completions endpoint, before SDK normalization. */\ninterface RawChatCompletion {\n id: string\n object: \"chat.completion\"\n created: number\n model: string\n choices: ChatCompletion[\"choices\"]\n usage: ChatCompletion[\"usage\"]\n}\n\nexport class Completions {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Create a chat completion.\n *\n * Pass `stream: true` to receive a {@link ChatCompletionStream}. Otherwise a\n * fully resolved {@link ChatCompletion} is returned.\n */\n create(\n params: ChatCompletionCreateParams & { stream: true },\n options?: { signal?: AbortSignal },\n ): Promise<ChatCompletionStream>\n create(\n params: ChatCompletionCreateParams & { stream?: false },\n options?: { signal?: AbortSignal },\n ): Promise<ChatCompletion>\n create(\n params: ChatCompletionCreateParams,\n options?: { signal?: AbortSignal },\n ): Promise<ChatCompletion | ChatCompletionStream>\n async create(\n params: ChatCompletionCreateParams,\n options: { signal?: AbortSignal } = {},\n ): Promise<ChatCompletion | ChatCompletionStream> {\n if (params.stream) {\n const response = await this.http.raw({\n method: \"POST\",\n path: \"/chat/completions\",\n body: params,\n stream: true,\n signal: options.signal,\n })\n return new ChatCompletionStream(response)\n }\n\n const { data, response } = await this.http.request<RawChatCompletion>({\n method: \"POST\",\n path: \"/chat/completions\",\n body: params,\n signal: options.signal,\n })\n\n const creditsRemaining = response.headers.get(\"x-hoodcompute-credits-remaining\")\n return {\n ...data,\n jobId: response.headers.get(\"x-hoodcompute-job-id\") ?? data.id,\n settlementTx: response.headers.get(\"x-hoodcompute-settlement-tx\"),\n creditsCharged: null,\n creditsRemaining: creditsRemaining !== null ? Number(creditsRemaining) : null,\n }\n }\n}\n\nexport class Chat {\n readonly completions: Completions\n constructor(http: HttpClient) {\n this.completions = new Completions(http)\n }\n}\n","/**\n * Models. Reflects the live worker pool: a model is listed only while at least\n * one worker is hosting it.\n */\n\nimport type { HttpClient } from \"../http.js\"\nimport type { Model, ModelList, ModelTier } from \"../types.js\"\n\ninterface RawModel {\n id: string\n object: \"model\"\n created: number\n owned_by: string\n hoodcompute: {\n tier: ModelTier\n credits_per_request: number\n credits_per_1k_tokens: number\n active_workers: number\n median_latency_ms: number\n parameters: string\n context_window: number\n }\n}\n\nfunction normalize(raw: RawModel): Model {\n return {\n id: raw.id,\n object: raw.object,\n created: raw.created,\n ownedBy: raw.owned_by,\n hoodcompute: {\n tier: raw.hoodcompute.tier,\n creditsPerRequest: raw.hoodcompute.credits_per_request,\n creditsPer1kTokens: raw.hoodcompute.credits_per_1k_tokens,\n activeWorkers: raw.hoodcompute.active_workers,\n medianLatencyMs: raw.hoodcompute.median_latency_ms,\n parameters: raw.hoodcompute.parameters,\n contextWindow: raw.hoodcompute.context_window,\n },\n }\n}\n\nexport class Models {\n constructor(private readonly http: HttpClient) {}\n\n /** List every model currently available on the network. */\n async list(options: { signal?: AbortSignal } = {}): Promise<ModelList> {\n const { data } = await this.http.request<{ object: \"list\"; data: RawModel[] }>({\n path: \"/models\",\n signal: options.signal,\n })\n return { object: \"list\", data: data.data.map(normalize) }\n }\n\n /** Retrieve a single model by ID, including its live worker count. */\n async retrieve(modelId: string, options: { signal?: AbortSignal } = {}): Promise<Model> {\n const { data } = await this.http.request<RawModel>({\n path: `/models/${encodeURIComponent(modelId)}`,\n signal: options.signal,\n })\n return normalize(data)\n }\n}\n","/**\n * Jobs. Retrieve job status, fetch on-chain receipts, and open disputes.\n */\n\nimport type { HttpClient } from \"../http.js\"\nimport type {\n DisputeResult,\n Job,\n JobList,\n JobListParams,\n JobReceipt,\n JobStatus,\n ModelTier,\n Usage,\n} from \"../types.js\"\nimport { NotFoundError } from \"../errors.js\"\n\ninterface RawJob {\n id: string\n object: \"job\"\n status: JobStatus\n model: string\n tier: ModelTier\n credits_charged: number\n usdg_value: number\n worker_address: string\n created_at: string\n completed_at: string | null\n on_chain: {\n escrow_tx: string\n settlement_tx: string\n escrow_address: string\n block_number: number\n proof_hash: string\n } | null\n usage: Usage | null\n}\n\nfunction normalize(raw: RawJob): Job {\n return {\n id: raw.id,\n object: raw.object,\n status: raw.status,\n model: raw.model,\n tier: raw.tier,\n creditsCharged: raw.credits_charged,\n usdgValue: raw.usdg_value,\n workerAddress: raw.worker_address,\n createdAt: raw.created_at,\n completedAt: raw.completed_at,\n onChain: raw.on_chain\n ? {\n escrowTx: raw.on_chain.escrow_tx,\n settlementTx: raw.on_chain.settlement_tx,\n escrowAddress: raw.on_chain.escrow_address,\n blockNumber: raw.on_chain.block_number,\n proofHash: raw.on_chain.proof_hash,\n }\n : null,\n usage: raw.usage,\n }\n}\n\nexport class Jobs {\n constructor(private readonly http: HttpClient) {}\n\n /** Retrieve a job by ID, including its on-chain settlement detail. */\n async get(jobId: string, options: { signal?: AbortSignal } = {}): Promise<Job> {\n const { data } = await this.http.request<RawJob>({\n path: `/jobs/${encodeURIComponent(jobId)}`,\n signal: options.signal,\n })\n return normalize(data)\n }\n\n /** List jobs for the authenticated key, most recent first. */\n async list(params: JobListParams = {}, options: { signal?: AbortSignal } = {}): Promise<JobList> {\n const { data } = await this.http.request<{\n object: \"list\"\n data: RawJob[]\n has_more: boolean\n next_cursor: string | null\n }>({\n path: \"/jobs\",\n query: {\n limit: params.limit,\n before: params.before,\n after: params.after,\n status: params.status,\n model: params.model,\n },\n signal: options.signal,\n })\n return {\n object: \"list\",\n data: data.data.map(normalize),\n hasMore: data.has_more,\n nextCursor: data.next_cursor,\n }\n }\n\n /**\n * Fetch the on-chain receipt for a settled job. Throws if the job exists but\n * has not settled yet.\n */\n async getReceipt(jobId: string, options: { signal?: AbortSignal } = {}): Promise<JobReceipt> {\n const job = await this.get(jobId, options)\n if (!job.onChain) {\n throw new NotFoundError(\n `Job ${jobId} has status \"${job.status}\" and no on-chain receipt yet.`,\n { code: \"receipt_not_ready\" },\n )\n }\n return {\n jobId: job.id,\n model: job.model,\n tier: job.tier,\n creditsCharged: job.creditsCharged,\n usdgValue: job.usdgValue,\n workerAddress: job.workerAddress,\n escrowTx: job.onChain.escrowTx,\n settlementTx: job.onChain.settlementTx,\n blockNumber: job.onChain.blockNumber,\n proofHash: job.onChain.proofHash,\n }\n }\n\n /**\n * Open a dispute on a completed job. Must be called within 60 seconds of\n * receiving the final output token.\n *\n * @param receivedOutputHash SHA-256 of the full response text you received,\n * formatted as `sha256:<hex>`.\n */\n async dispute(\n jobId: string,\n receivedOutputHash: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<DisputeResult> {\n const { data } = await this.http.request<{\n job_id: string\n dispute_opened: boolean\n your_hash: string\n worker_hash: string\n dispute_tx?: string | null\n arbitration_window_hours?: number | null\n }>({\n method: \"POST\",\n path: `/jobs/${encodeURIComponent(jobId)}/dispute`,\n body: { received_output_hash: receivedOutputHash },\n signal: options.signal,\n })\n return {\n jobId: data.job_id,\n disputeOpened: data.dispute_opened,\n yourHash: data.your_hash,\n workerHash: data.worker_hash,\n disputeTx: data.dispute_tx ?? null,\n arbitrationWindowHours: data.arbitration_window_hours ?? null,\n }\n }\n}\n","/**\n * Account. The wallet and credit balance tied to the authenticated API key.\n */\n\nimport type { HttpClient } from \"../http.js\"\nimport type { Account } from \"../types.js\"\n\ninterface RawAccount {\n wallet: string\n credits_remaining: number\n usdg_value: number\n last_topup_at: string | null\n api_key_created_at: string | null\n}\n\nexport class AccountResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Retrieve the current account, including the live credit balance. */\n async get(options: { signal?: AbortSignal } = {}): Promise<Account> {\n const { data } = await this.http.request<RawAccount>({\n path: \"/account\",\n signal: options.signal,\n })\n return {\n wallet: data.wallet,\n creditsRemaining: data.credits_remaining,\n usdgValue: data.usdg_value,\n lastTopupAt: data.last_topup_at ?? null,\n apiKeyCreatedAt: data.api_key_created_at ?? null,\n }\n }\n}\n","/**\n * The HoodCompute client. Entry point for chat completions, models, jobs, and\n * account access against the decentralized inference network.\n */\n\nimport { HttpClient } from \"./http.js\"\nimport { HoodComputeError } from \"./errors.js\"\nimport {\n DEFAULT_BASE_URL,\n DEFAULT_MAX_RETRIES,\n DEFAULT_TIMEOUT_MS,\n} from \"./constants.js\"\nimport { Chat } from \"./resources/chat.js\"\nimport { Models } from \"./resources/models.js\"\nimport { Jobs } from \"./resources/jobs.js\"\nimport { AccountResource } from \"./resources/account.js\"\n\nexport interface HoodComputeClientOptions {\n /**\n * API key, formatted `hoodc_live_...`. Falls back to the\n * `HOODCOMPUTE_API_KEY` environment variable when omitted.\n */\n apiKey?: string\n /** API base URL. Defaults to `https://api.hoodcompute.com/v1`. */\n baseURL?: string\n /** Per-request timeout in milliseconds. Defaults to 120000. */\n timeout?: number\n /** Automatic retries on 5xx, 429, and connection failures. Defaults to 2. */\n maxRetries?: number\n /** Headers added to every request. */\n defaultHeaders?: Record<string, string>\n /** Custom fetch implementation. Defaults to the global `fetch`. */\n fetch?: typeof fetch\n}\n\nexport class HoodComputeClient {\n readonly chat: Chat\n readonly models: Models\n readonly jobs: Jobs\n readonly account: AccountResource\n\n constructor(options: HoodComputeClientOptions = {}) {\n const apiKey = options.apiKey ?? readEnv(\"HOODCOMPUTE_API_KEY\")\n if (!apiKey) {\n throw new HoodComputeError(\n \"Missing API key. Pass `apiKey` to the client or set the HOODCOMPUTE_API_KEY environment variable.\",\n { code: \"missing_api_key\" },\n )\n }\n\n const http = new HttpClient({\n apiKey,\n baseURL: options.baseURL ?? DEFAULT_BASE_URL,\n timeout: options.timeout ?? DEFAULT_TIMEOUT_MS,\n maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,\n defaultHeaders: options.defaultHeaders,\n fetch: options.fetch,\n })\n\n this.chat = new Chat(http)\n this.models = new Models(http)\n this.jobs = new Jobs(http)\n this.account = new AccountResource(http)\n }\n}\n\nfunction readEnv(name: string): string | undefined {\n if (typeof process !== \"undefined\" && process.env) {\n return process.env[name]\n }\n return undefined\n}\n","/**\n * @hoodcompute/sdk/react\n *\n * React hooks for building chat UIs on top of the HoodCompute network.\n * `react` is a peer dependency, imported only from this subpath, so the core\n * SDK stays framework-agnostic.\n */\n\nimport { useCallback, useMemo, useRef, useState } from \"react\"\nimport { HoodComputeClient } from \"./client.js\"\nimport type { ChatMessage } from \"./types.js\"\nimport type { StreamReceipt } from \"./streaming.js\"\n\n/** Status of the chat hook. */\nexport type ChatStatus = \"idle\" | \"streaming\" | \"settling\" | \"error\"\n\n/** Credit balance surfaced by the hook. */\nexport interface ChatBalance {\n creditsRemaining: number\n usdgValue: number\n}\n\nexport interface UseHoodComputeChatOptions {\n /** Model ID to run. */\n model: string\n /**\n * API key. Prefer a server-side proxy in production. When you must call from\n * the browser during beta, use a `NEXT_PUBLIC_`-scoped key you can revoke.\n */\n apiKey?: string\n /** Override the API base URL. */\n baseURL?: string\n /** Reuse an existing client instead of constructing one from `apiKey`. */\n client?: HoodComputeClient\n /** Optional system prompt, prepended to every request. */\n systemPrompt?: string\n /** Called after each job settles, with the stream receipt. */\n onComplete?: (receipt: StreamReceipt) => void\n /** Called when a request fails. */\n onError?: (error: Error) => void\n}\n\nexport interface UseHoodComputeChatResult {\n /** Send a user message and stream the assistant reply into `messages`. */\n send: (message: string) => Promise<void>\n /** The running conversation. */\n messages: ChatMessage[]\n /** Current status of the hook. */\n status: ChatStatus\n /** Latest known credit balance, or null before the first completion. */\n balance: ChatBalance | null\n /** Receipt from the most recent settled job. */\n lastReceipt: StreamReceipt | null\n /** The last error, or null. */\n error: Error | null\n /** Clear the conversation and reset status. */\n reset: () => void\n}\n\n/**\n * A chat hook that streams tokens and tracks on-chain settlement.\n *\n * @example\n * const { send, messages, status, balance } = useHoodComputeChat({\n * model: \"qwen3-8b\",\n * apiKey: process.env.NEXT_PUBLIC_HOODCOMPUTE_API_KEY,\n * })\n */\nexport function useHoodComputeChat(\n options: UseHoodComputeChatOptions,\n): UseHoodComputeChatResult {\n const { model, apiKey, baseURL, client: providedClient, systemPrompt, onComplete, onError } =\n options\n\n const [messages, setMessages] = useState<ChatMessage[]>([])\n const [status, setStatus] = useState<ChatStatus>(\"idle\")\n const [balance, setBalance] = useState<ChatBalance | null>(null)\n const [lastReceipt, setLastReceipt] = useState<StreamReceipt | null>(null)\n const [error, setError] = useState<Error | null>(null)\n\n const client = useMemo(\n () => providedClient ?? new HoodComputeClient({ apiKey, baseURL }),\n [providedClient, apiKey, baseURL],\n )\n\n // Keep the latest callbacks without re-creating `send` on every render.\n const callbacks = useRef({ onComplete, onError })\n callbacks.current = { onComplete, onError }\n\n const send = useCallback(\n async (message: string) => {\n setError(null)\n setStatus(\"streaming\")\n\n const userMessage: ChatMessage = { role: \"user\", content: message }\n const history = [...messages, userMessage]\n setMessages((prev) => [...prev, userMessage, { role: \"assistant\", content: \"\" }])\n\n const outbound: ChatMessage[] = systemPrompt\n ? [{ role: \"system\", content: systemPrompt }, ...history]\n : history\n\n try {\n const stream = await client.chat.completions.create({\n model,\n messages: outbound,\n stream: true,\n })\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content\n if (!delta) continue\n setMessages((prev) => {\n const next = [...prev]\n const last = next[next.length - 1]\n if (last && last.role === \"assistant\") {\n next[next.length - 1] = { ...last, content: last.content + delta }\n }\n return next\n })\n }\n\n setStatus(\"settling\")\n const receipt = stream.receipt\n setLastReceipt(receipt)\n if (receipt.creditsRemaining !== null) {\n setBalance({\n creditsRemaining: receipt.creditsRemaining,\n usdgValue: Number((receipt.creditsRemaining * 0.01).toFixed(2)),\n })\n }\n callbacks.current.onComplete?.(receipt)\n setStatus(\"idle\")\n } catch (err) {\n const normalized = err instanceof Error ? err : new Error(String(err))\n setError(normalized)\n setStatus(\"error\")\n callbacks.current.onError?.(normalized)\n }\n },\n [client, model, messages, systemPrompt],\n )\n\n const reset = useCallback(() => {\n setMessages([])\n setStatus(\"idle\")\n setError(null)\n setLastReceipt(null)\n }, [])\n\n return { send, messages, status, balance, lastReceipt, error, reset }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/constants.ts","../src/http.ts","../src/streaming.ts","../src/resources/chat.ts","../src/resources/models.ts","../src/resources/jobs.ts","../src/resources/account.ts","../src/client.ts","../src/react.ts"],"names":["response","normalize","sleep","useState","useMemo","useRef","useCallback"],"mappings":"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","file":"react.cjs","sourcesContent":["/**\n * Error types raised by the HoodCompute SDK.\n *\n * Every failed API request is surfaced as a `HoodComputeError` (or a subclass).\n * The machine-readable `code` maps to the codes documented at\n * https://docs.hoodcompute.com/api-reference/errors.\n */\n\n/** Shape of the error body returned by the API. */\nexport interface ApiErrorBody {\n code?: string\n message?: string\n type?: string\n param?: string | null\n docs?: string\n details?: Record<string, unknown>\n}\n\n/** Base class for all errors raised by the SDK. */\nexport class HoodComputeError extends Error {\n /** HTTP status code, when the error came from an API response. */\n readonly status?: number\n /** Machine-readable error code, for example `insufficient_credits`. */\n readonly code?: string\n /** Error category reported by the API. */\n readonly type?: string\n /** Request parameter that caused the error, when applicable. */\n readonly param?: string | null\n /** Additional structured detail from the API. */\n readonly details?: Record<string, unknown>\n /** Value of the `x-request-id` response header, useful for support. */\n readonly requestId?: string\n\n constructor(\n message: string,\n opts: {\n status?: number\n code?: string\n type?: string\n param?: string | null\n details?: Record<string, unknown>\n requestId?: string\n } = {},\n ) {\n super(message)\n this.name = \"HoodComputeError\"\n this.status = opts.status\n this.code = opts.code\n this.type = opts.type\n this.param = opts.param\n this.details = opts.details\n this.requestId = opts.requestId\n }\n}\n\n/** 401 / 403. The API key is missing, invalid, revoked, or suspended. */\nexport class AuthenticationError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"AuthenticationError\"\n }\n}\n\n/** 402. The credit balance is too low for the requested tier. */\nexport class InsufficientCreditsError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"InsufficientCreditsError\"\n }\n}\n\n/** 400. The request body is malformed or a required field is missing. */\nexport class InvalidRequestError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"InvalidRequestError\"\n }\n}\n\n/** 404. The requested resource does not exist. */\nexport class NotFoundError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"NotFoundError\"\n }\n}\n\n/** 429. The request rate to the API is too high. Back off and retry. */\nexport class RateLimitError extends HoodComputeError {\n /** Suggested seconds to wait before retrying, when the API provides one. */\n get retryAfter(): number | undefined {\n const value = this.details?.retry_after\n return typeof value === \"number\" ? value : undefined\n }\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"RateLimitError\"\n }\n}\n\n/**\n * 503. No workers are currently hosting the requested model. This is a\n * transient condition. Check `retryAfter` and try again.\n */\nexport class NoWorkersAvailableError extends HoodComputeError {\n /** Suggested seconds to wait before retrying. */\n get retryAfter(): number | undefined {\n const value = this.details?.retry_after\n return typeof value === \"number\" ? value : undefined\n }\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"NoWorkersAvailableError\"\n }\n}\n\n/** 504. No worker completed the job within the timeout. Credits were refunded. */\nexport class JobTimeoutError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"JobTimeoutError\"\n }\n}\n\n/** 5xx. An internal server error. Usually safe to retry. */\nexport class ServerError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"ServerError\"\n }\n}\n\n/** The request failed to reach the API, or timed out, or was aborted. */\nexport class ConnectionError extends HoodComputeError {\n constructor(message: string, opts: { cause?: unknown } = {}) {\n super(message)\n this.name = \"ConnectionError\"\n if (opts.cause !== undefined) this.cause = opts.cause\n }\n}\n\n/**\n * Construct the appropriate error subclass from an API response.\n * @internal\n */\nexport function errorFromResponse(\n status: number,\n body: ApiErrorBody | undefined,\n requestId?: string,\n): HoodComputeError {\n const code = body?.code\n const message = body?.message ?? `HoodCompute API request failed with status ${status}`\n const opts = {\n status,\n code,\n type: body?.type,\n param: body?.param ?? null,\n details: body?.details,\n requestId,\n }\n\n if (code === \"no_workers_available\") return new NoWorkersAvailableError(message, opts)\n if (code === \"job_timeout\") return new JobTimeoutError(message, opts)\n if (code === \"insufficient_credits\") return new InsufficientCreditsError(message, opts)\n\n switch (status) {\n case 400:\n case 422:\n return new InvalidRequestError(message, opts)\n case 401:\n case 403:\n return new AuthenticationError(message, opts)\n case 402:\n return new InsufficientCreditsError(message, opts)\n case 404:\n return new NotFoundError(message, opts)\n case 429:\n return new RateLimitError(message, opts)\n case 503:\n return new NoWorkersAvailableError(message, opts)\n case 504:\n return new JobTimeoutError(message, opts)\n default:\n if (status >= 500) return new ServerError(message, opts)\n return new HoodComputeError(message, opts)\n }\n}\n\n/** Whether an error is worth retrying with the same payload. @internal */\nexport function isRetryable(err: unknown): boolean {\n if (err instanceof ConnectionError) return true\n if (err instanceof HoodComputeError) {\n if (err.status === undefined) return false\n return err.status >= 500 || err.status === 429\n }\n return false\n}\n","/**\n * Network and client defaults for HoodCompute.\n */\n\n/** Default HoodCompute API base URL. */\nexport const DEFAULT_BASE_URL = \"https://api.hoodcompute.com/v1\"\n\n/** Robinhood Chain mainnet chain ID. */\nexport const ROBINHOOD_CHAIN_ID = 4663\n\n/** Base URL of the Robinhood Chain Blockscout explorer. */\nexport const BLOCKSCOUT_BASE_URL = \"https://robinhoodchain.blockscout.com\"\n\n/** Default request timeout in milliseconds. */\nexport const DEFAULT_TIMEOUT_MS = 120_000\n\n/** Default number of automatic retries on transient failures. */\nexport const DEFAULT_MAX_RETRIES = 2\n\n/** SDK version, surfaced in the User-Agent header. Keep in sync with package.json. */\nexport const SDK_VERSION = \"0.2.2\"\n\n/**\n * Build a Blockscout explorer link for a Robinhood Chain transaction hash.\n *\n * @example\n * explorerTxUrl(receipt.settlementTx)\n * // \"https://robinhoodchain.blockscout.com/tx/0x...\"\n */\nexport function explorerTxUrl(txHash: string): string {\n return `${BLOCKSCOUT_BASE_URL}/tx/${txHash}`\n}\n\n/**\n * Build a Blockscout explorer link for a Robinhood Chain address.\n */\nexport function explorerAddressUrl(address: string): string {\n return `${BLOCKSCOUT_BASE_URL}/address/${address}`\n}\n","/**\n * Internal HTTP transport. Handles authentication headers, timeouts, automatic\n * retries with exponential backoff, and error normalization. Not part of the\n * public API surface.\n * @internal\n */\n\nimport {\n ConnectionError,\n errorFromResponse,\n isRetryable,\n type ApiErrorBody,\n} from \"./errors.js\"\nimport { SDK_VERSION } from \"./constants.js\"\n\nexport interface HttpClientOptions {\n apiKey: string\n baseURL: string\n timeout: number\n maxRetries: number\n defaultHeaders?: Record<string, string>\n fetch?: typeof fetch\n}\n\nexport interface RequestOptions {\n method?: string\n path: string\n query?: Record<string, string | number | undefined>\n body?: unknown\n /** When true, the raw Response is returned without reading the body. */\n stream?: boolean\n signal?: AbortSignal\n}\n\nexport class HttpClient {\n private readonly apiKey: string\n private readonly baseURL: string\n private readonly timeout: number\n private readonly maxRetries: number\n private readonly defaultHeaders: Record<string, string>\n private readonly fetchImpl: typeof fetch\n\n constructor(options: HttpClientOptions) {\n this.apiKey = options.apiKey\n this.baseURL = options.baseURL.replace(/\\/$/, \"\")\n this.timeout = options.timeout\n this.maxRetries = options.maxRetries\n this.defaultHeaders = options.defaultHeaders ?? {}\n\n const impl = options.fetch ?? globalThis.fetch\n if (!impl) {\n throw new ConnectionError(\n \"No global fetch implementation found. Use Node 18+ or pass a `fetch` option.\",\n )\n }\n this.fetchImpl = impl\n }\n\n /** Perform a request and return the parsed JSON body plus response headers. */\n async request<T>(options: RequestOptions): Promise<{ data: T; response: Response }> {\n const response = await this.raw(options)\n const text = await response.text()\n const data = text ? (JSON.parse(text) as T) : (undefined as T)\n return { data, response }\n }\n\n /**\n * Perform a request and return the raw Response. Used by the streaming path,\n * which reads `response.body` directly. Errors are still parsed and thrown.\n */\n async raw(options: RequestOptions): Promise<Response> {\n const url = this.buildUrl(options.path, options.query)\n const headers = this.buildHeaders(options)\n const init: RequestInit = {\n method: options.method ?? \"GET\",\n headers,\n }\n if (options.body !== undefined) {\n init.body = JSON.stringify(options.body)\n }\n\n let lastError: unknown\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n const response = await this.fetchWithTimeout(url, init, options.signal)\n if (response.ok) return response\n\n const error = await this.toError(response)\n if (isRetryable(error) && attempt < this.maxRetries) {\n lastError = error\n await sleep(this.backoff(attempt, error))\n continue\n }\n throw error\n } catch (err) {\n // An abort from the caller is a deliberate cancellation, never retried.\n if (options.signal?.aborted) throw err\n if (err instanceof ConnectionError && attempt < this.maxRetries) {\n lastError = err\n await sleep(this.backoff(attempt))\n continue\n }\n throw err\n }\n }\n\n // Loop only exits via return/throw except when the last attempt was a\n // retryable failure that exhausted the budget.\n throw lastError instanceof Error\n ? lastError\n : new ConnectionError(\"Request failed after exhausting retries.\")\n }\n\n private async fetchWithTimeout(\n url: string,\n init: RequestInit,\n userSignal?: AbortSignal,\n ): Promise<Response> {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), this.timeout)\n const onAbort = () => controller.abort()\n // A signal that is already aborted never fires its \"abort\" event again.\n if (userSignal?.aborted) {\n controller.abort()\n } else {\n userSignal?.addEventListener(\"abort\", onAbort, { once: true })\n }\n\n try {\n return await this.fetchImpl(url, { ...init, signal: controller.signal })\n } catch (err) {\n if (userSignal?.aborted) {\n throw new ConnectionError(\"Request aborted by caller.\", { cause: err })\n }\n if (controller.signal.aborted) {\n throw new ConnectionError(`Request timed out after ${this.timeout}ms.`, { cause: err })\n }\n throw new ConnectionError(\"Failed to reach the HoodCompute API.\", { cause: err })\n } finally {\n clearTimeout(timer)\n userSignal?.removeEventListener(\"abort\", onAbort)\n }\n }\n\n private async toError(response: Response) {\n let body: ApiErrorBody | undefined\n try {\n const parsed = (await response.json()) as { error?: ApiErrorBody } | ApiErrorBody\n body = \"error\" in parsed && parsed.error ? parsed.error : (parsed as ApiErrorBody)\n } catch {\n body = undefined\n }\n\n // Surface a standard Retry-After header through `details.retry_after` when\n // the body itself does not carry one, so the retry loop and callers see a\n // single source of truth.\n const retryAfterHeader = response.headers.get(\"retry-after\")\n if (retryAfterHeader !== null && typeof body?.details?.retry_after !== \"number\") {\n const seconds = Number(retryAfterHeader)\n if (Number.isFinite(seconds) && seconds >= 0) {\n body = { ...body, details: { ...body?.details, retry_after: seconds } }\n }\n }\n\n const requestId = response.headers.get(\"x-request-id\") ?? undefined\n return errorFromResponse(response.status, body, requestId)\n }\n\n private buildUrl(path: string, query?: RequestOptions[\"query\"]): string {\n const url = new URL(`${this.baseURL}${path}`)\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) url.searchParams.set(key, String(value))\n }\n }\n return url.toString()\n }\n\n private buildHeaders(options: RequestOptions): Record<string, string> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n Accept: options.stream ? \"text/event-stream\" : \"application/json\",\n \"User-Agent\": `hoodcompute-sdk-js/${SDK_VERSION}`,\n ...this.defaultHeaders,\n }\n if (options.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\"\n }\n return headers\n }\n\n private backoff(attempt: number, error?: unknown): number {\n // Honor a server-suggested retry_after when present (in seconds).\n const retryAfter =\n error &&\n typeof error === \"object\" &&\n \"details\" in error &&\n typeof (error as { details?: Record<string, unknown> }).details?.retry_after === \"number\"\n ? ((error as { details: Record<string, unknown> }).details.retry_after as number) * 1000\n : undefined\n if (retryAfter !== undefined) return retryAfter\n // Full jitter keeps simultaneous clients from retrying in lockstep.\n return Math.min(1000 * 2 ** attempt, 8000) * (0.5 + Math.random() * 0.5)\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","/**\n * Server-Sent Events parsing and the streaming chat completion object.\n */\n\nimport type { ChatCompletionChunk } from \"./types.js\"\nimport { ConnectionError } from \"./errors.js\"\n\n/**\n * Lightweight settlement metadata surfaced from a streaming response once it\n * closes. Values are read from response headers as the network makes them\n * available. For the full on-chain receipt, call `client.jobs.getReceipt(jobId)`.\n */\nexport interface StreamReceipt {\n jobId: string | null\n settlementTx: string | null\n escrowTx: string | null\n workerAddress: string | null\n creditsRemaining: number | null\n}\n\n/**\n * An async-iterable stream of chat completion chunks.\n *\n * Iterate it with `for await` to consume tokens as they arrive. Once iteration\n * finishes, `jobId` and `receipt` are populated from the response.\n *\n * @example\n * const stream = await client.chat.completions.create({ ..., stream: true })\n * for await (const chunk of stream) {\n * process.stdout.write(chunk.choices[0]?.delta?.content ?? \"\")\n * }\n * console.log(stream.receipt.settlementTx)\n */\nexport class ChatCompletionStream implements AsyncIterable<ChatCompletionChunk> {\n /** HoodCompute job ID for this completion, from the response header. */\n jobId: string | null\n /** Settlement metadata, populated once the stream finishes. */\n receipt: StreamReceipt\n\n private readonly response: Response\n\n constructor(response: Response) {\n this.response = response\n this.jobId = response.headers.get(\"x-hoodcompute-job-id\")\n this.receipt = this.readReceipt()\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<ChatCompletionChunk> {\n const body = this.response.body\n if (!body) {\n throw new ConnectionError(\"The streaming response contained no body.\")\n }\n\n const decoder = new TextDecoder()\n const reader = body.getReader()\n let buffer = \"\"\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n\n // SSE events are separated by a blank line, with either LF or CRLF\n // line endings.\n let boundary = findBoundary(buffer)\n while (boundary !== null) {\n const rawEvent = buffer.slice(0, boundary.index)\n buffer = buffer.slice(boundary.index + boundary.length)\n\n const chunk = parseEvent(rawEvent)\n if (chunk === DONE) {\n return\n }\n if (chunk) {\n yield chunk\n }\n boundary = findBoundary(buffer)\n }\n }\n\n // Flush a trailing event with no terminating blank line.\n const trailing = parseEvent(buffer)\n if (trailing && trailing !== DONE) {\n yield trailing\n }\n } finally {\n // Cancel before releasing so an early exit from iteration closes the\n // underlying connection instead of leaving it open.\n await reader.cancel().catch(() => {})\n reader.releaseLock()\n // Refresh the receipt in case trailer headers landed after the stream.\n this.receipt = this.readReceipt()\n }\n }\n\n /** Convenience: collect the full concatenated text of the stream. */\n async text(): Promise<string> {\n let out = \"\"\n for await (const chunk of this) {\n out += chunk.choices[0]?.delta?.content ?? \"\"\n }\n return out\n }\n\n private readReceipt(): StreamReceipt {\n const h = this.response.headers\n const creditsRemaining = h.get(\"x-hoodcompute-credits-remaining\")\n return {\n jobId: h.get(\"x-hoodcompute-job-id\"),\n settlementTx: h.get(\"x-hoodcompute-settlement-tx\"),\n escrowTx: h.get(\"x-hoodcompute-tx-hash\"),\n workerAddress: h.get(\"x-hoodcompute-worker\"),\n creditsRemaining: creditsRemaining !== null ? Number(creditsRemaining) : null,\n }\n }\n}\n\n/** Sentinel marking the `[DONE]` terminator. */\nconst DONE = Symbol(\"done\")\n\n/**\n * Locate the earliest blank-line event boundary in the buffer, whether the\n * server uses LF or CRLF line endings.\n */\nfunction findBoundary(buffer: string): { index: number; length: number } | null {\n const lf = buffer.indexOf(\"\\n\\n\")\n const crlf = buffer.indexOf(\"\\r\\n\\r\\n\")\n if (lf === -1 && crlf === -1) return null\n if (crlf !== -1 && (lf === -1 || crlf < lf)) return { index: crlf, length: 4 }\n return { index: lf, length: 2 }\n}\n\n/**\n * Parse one raw SSE event block into a chunk. Returns `DONE` on the terminator,\n * `null` for events without usable data (comments, empty blocks).\n */\nfunction parseEvent(raw: string): ChatCompletionChunk | typeof DONE | null {\n const dataLines: string[] = []\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trimEnd()\n if (trimmed.startsWith(\":\") || trimmed === \"\") continue\n if (trimmed.startsWith(\"data:\")) {\n dataLines.push(trimmed.slice(5).trimStart())\n }\n }\n if (dataLines.length === 0) return null\n\n const data = dataLines.join(\"\\n\")\n if (data === \"[DONE]\") return DONE\n\n try {\n return JSON.parse(data) as ChatCompletionChunk\n } catch {\n return null\n }\n}\n","/**\n * Chat completions. OpenAI-compatible in request and response shape, with the\n * job ID and on-chain settlement attached to every result.\n */\n\nimport type { HttpClient } from \"../http.js\"\nimport type {\n ChatCompletion,\n ChatCompletionCreateParams,\n} from \"../types.js\"\nimport { ChatCompletionStream } from \"../streaming.js\"\n\n/** Raw response body from the completions endpoint, before SDK normalization. */\ninterface RawChatCompletion {\n id: string\n object: \"chat.completion\"\n created: number\n model: string\n choices: ChatCompletion[\"choices\"]\n usage: ChatCompletion[\"usage\"]\n}\n\nexport class Completions {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Create a chat completion.\n *\n * Pass `stream: true` to receive a {@link ChatCompletionStream}. Otherwise a\n * fully resolved {@link ChatCompletion} is returned.\n */\n create(\n params: ChatCompletionCreateParams & { stream: true },\n options?: { signal?: AbortSignal },\n ): Promise<ChatCompletionStream>\n create(\n params: ChatCompletionCreateParams & { stream?: false },\n options?: { signal?: AbortSignal },\n ): Promise<ChatCompletion>\n create(\n params: ChatCompletionCreateParams,\n options?: { signal?: AbortSignal },\n ): Promise<ChatCompletion | ChatCompletionStream>\n async create(\n params: ChatCompletionCreateParams,\n options: { signal?: AbortSignal } = {},\n ): Promise<ChatCompletion | ChatCompletionStream> {\n if (params.stream) {\n const response = await this.http.raw({\n method: \"POST\",\n path: \"/chat/completions\",\n body: params,\n stream: true,\n signal: options.signal,\n })\n return new ChatCompletionStream(response)\n }\n\n const { data, response } = await this.http.request<RawChatCompletion>({\n method: \"POST\",\n path: \"/chat/completions\",\n body: params,\n signal: options.signal,\n })\n\n const creditsRemaining = response.headers.get(\"x-hoodcompute-credits-remaining\")\n return {\n ...data,\n jobId: response.headers.get(\"x-hoodcompute-job-id\") ?? data.id,\n settlementTx: response.headers.get(\"x-hoodcompute-settlement-tx\"),\n creditsCharged: null,\n creditsRemaining: creditsRemaining !== null ? Number(creditsRemaining) : null,\n }\n }\n}\n\nexport class Chat {\n readonly completions: Completions\n constructor(http: HttpClient) {\n this.completions = new Completions(http)\n }\n}\n","/**\n * Models. Reflects the live worker pool: a model is listed only while at least\n * one worker is hosting it.\n */\n\nimport type { HttpClient } from \"../http.js\"\nimport type { Model, ModelList, ModelTier } from \"../types.js\"\n\ninterface RawModel {\n id: string\n object: \"model\"\n created: number\n owned_by: string\n hoodcompute: {\n tier: ModelTier\n credits_per_request: number\n credits_per_1k_tokens: number\n active_workers: number\n median_latency_ms: number\n parameters: string\n context_window: number\n }\n}\n\nfunction normalize(raw: RawModel): Model {\n return {\n id: raw.id,\n object: raw.object,\n created: raw.created,\n ownedBy: raw.owned_by,\n hoodcompute: {\n tier: raw.hoodcompute.tier,\n creditsPerRequest: raw.hoodcompute.credits_per_request,\n creditsPer1kTokens: raw.hoodcompute.credits_per_1k_tokens,\n activeWorkers: raw.hoodcompute.active_workers,\n medianLatencyMs: raw.hoodcompute.median_latency_ms,\n parameters: raw.hoodcompute.parameters,\n contextWindow: raw.hoodcompute.context_window,\n },\n }\n}\n\nexport class Models {\n constructor(private readonly http: HttpClient) {}\n\n /** List every model currently available on the network. */\n async list(options: { signal?: AbortSignal } = {}): Promise<ModelList> {\n const { data } = await this.http.request<{ object: \"list\"; data: RawModel[] }>({\n path: \"/models\",\n signal: options.signal,\n })\n return { object: \"list\", data: data.data.map(normalize) }\n }\n\n /** Retrieve a single model by ID, including its live worker count. */\n async retrieve(modelId: string, options: { signal?: AbortSignal } = {}): Promise<Model> {\n const { data } = await this.http.request<RawModel>({\n path: `/models/${encodeURIComponent(modelId)}`,\n signal: options.signal,\n })\n return normalize(data)\n }\n}\n","/**\n * Jobs. Retrieve job status, fetch on-chain receipts, and open disputes.\n */\n\nimport type { HttpClient } from \"../http.js\"\nimport type {\n DisputeResult,\n Job,\n JobList,\n JobListParams,\n JobReceipt,\n JobStatus,\n ModelTier,\n Usage,\n} from \"../types.js\"\nimport { ConnectionError, JobTimeoutError, NotFoundError } from \"../errors.js\"\n\n/** Statuses after which a job will no longer change. */\nconst TERMINAL_STATUSES: ReadonlySet<JobStatus> = new Set([\n \"settled\",\n \"failed\",\n \"refunded\",\n])\n\nexport interface WaitForSettlementOptions {\n /** Milliseconds between polls. Defaults to 2000. */\n pollIntervalMs?: number\n /** Give up after this many milliseconds. Defaults to 120000. */\n timeoutMs?: number\n signal?: AbortSignal\n}\n\ninterface RawJob {\n id: string\n object: \"job\"\n status: JobStatus\n model: string\n tier: ModelTier\n credits_charged: number\n usdg_value: number\n worker_address: string\n created_at: string\n completed_at: string | null\n on_chain: {\n escrow_tx: string\n settlement_tx: string\n escrow_address: string\n block_number: number\n proof_hash: string\n } | null\n usage: Usage | null\n}\n\nfunction normalize(raw: RawJob): Job {\n return {\n id: raw.id,\n object: raw.object,\n status: raw.status,\n model: raw.model,\n tier: raw.tier,\n creditsCharged: raw.credits_charged,\n usdgValue: raw.usdg_value,\n workerAddress: raw.worker_address,\n createdAt: raw.created_at,\n completedAt: raw.completed_at,\n onChain: raw.on_chain\n ? {\n escrowTx: raw.on_chain.escrow_tx,\n settlementTx: raw.on_chain.settlement_tx,\n escrowAddress: raw.on_chain.escrow_address,\n blockNumber: raw.on_chain.block_number,\n proofHash: raw.on_chain.proof_hash,\n }\n : null,\n usage: raw.usage,\n }\n}\n\nexport class Jobs {\n constructor(private readonly http: HttpClient) {}\n\n /** Retrieve a job by ID, including its on-chain settlement detail. */\n async get(jobId: string, options: { signal?: AbortSignal } = {}): Promise<Job> {\n const { data } = await this.http.request<RawJob>({\n path: `/jobs/${encodeURIComponent(jobId)}`,\n signal: options.signal,\n })\n return normalize(data)\n }\n\n /** List jobs for the authenticated key, most recent first. */\n async list(params: JobListParams = {}, options: { signal?: AbortSignal } = {}): Promise<JobList> {\n const { data } = await this.http.request<{\n object: \"list\"\n data: RawJob[]\n has_more: boolean\n next_cursor: string | null\n }>({\n path: \"/jobs\",\n query: {\n limit: params.limit,\n before: params.before,\n after: params.after,\n status: params.status,\n model: params.model,\n },\n signal: options.signal,\n })\n return {\n object: \"list\",\n data: data.data.map(normalize),\n hasMore: data.has_more,\n nextCursor: data.next_cursor,\n }\n }\n\n /**\n * List every job matching the filters, transparently following cursor\n * pagination. Stop iterating early to stop fetching pages.\n *\n * @example\n * for await (const job of client.jobs.iterate({ status: \"settled\" })) {\n * console.log(job.id, job.creditsCharged)\n * }\n */\n async *iterate(\n params: Omit<JobListParams, \"before\" | \"after\"> = {},\n options: { signal?: AbortSignal } = {},\n ): AsyncGenerator<Job, void, undefined> {\n let cursor: string | undefined\n while (true) {\n const page = await this.list({ ...params, before: cursor }, options)\n yield* page.data\n if (!page.hasMore || page.nextCursor === null) return\n cursor = page.nextCursor\n }\n }\n\n /**\n * Poll a job until it reaches a terminal status (`settled`, `failed`, or\n * `refunded`) and return the final record. Throws {@link JobTimeoutError}\n * when the deadline passes first.\n */\n async waitForSettlement(\n jobId: string,\n options: WaitForSettlementOptions = {},\n ): Promise<Job> {\n const pollIntervalMs = options.pollIntervalMs ?? 2_000\n const timeoutMs = options.timeoutMs ?? 120_000\n const deadline = Date.now() + timeoutMs\n\n while (true) {\n const job = await this.get(jobId, { signal: options.signal })\n if (TERMINAL_STATUSES.has(job.status)) return job\n\n if (Date.now() + pollIntervalMs > deadline) {\n throw new JobTimeoutError(\n `Job ${jobId} still has status \"${job.status}\" after ${timeoutMs}ms.`,\n { code: \"settlement_wait_timeout\" },\n )\n }\n await sleep(pollIntervalMs)\n if (options.signal?.aborted) {\n throw new ConnectionError(\"Request aborted by caller.\")\n }\n }\n }\n\n /**\n * Fetch the on-chain receipt for a settled job. Throws if the job exists but\n * has not settled yet.\n */\n async getReceipt(jobId: string, options: { signal?: AbortSignal } = {}): Promise<JobReceipt> {\n const job = await this.get(jobId, options)\n if (!job.onChain) {\n throw new NotFoundError(\n `Job ${jobId} has status \"${job.status}\" and no on-chain receipt yet.`,\n { code: \"receipt_not_ready\" },\n )\n }\n return {\n jobId: job.id,\n model: job.model,\n tier: job.tier,\n creditsCharged: job.creditsCharged,\n usdgValue: job.usdgValue,\n workerAddress: job.workerAddress,\n escrowTx: job.onChain.escrowTx,\n settlementTx: job.onChain.settlementTx,\n blockNumber: job.onChain.blockNumber,\n proofHash: job.onChain.proofHash,\n }\n }\n\n /**\n * Open a dispute on a completed job. Must be called within 60 seconds of\n * receiving the final output token.\n *\n * @param receivedOutputHash SHA-256 of the full response text you received,\n * formatted as `sha256:<hex>`.\n */\n async dispute(\n jobId: string,\n receivedOutputHash: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<DisputeResult> {\n const { data } = await this.http.request<{\n job_id: string\n dispute_opened: boolean\n your_hash: string\n worker_hash: string\n dispute_tx?: string | null\n arbitration_window_hours?: number | null\n }>({\n method: \"POST\",\n path: `/jobs/${encodeURIComponent(jobId)}/dispute`,\n body: { received_output_hash: receivedOutputHash },\n signal: options.signal,\n })\n return {\n jobId: data.job_id,\n disputeOpened: data.dispute_opened,\n yourHash: data.your_hash,\n workerHash: data.worker_hash,\n disputeTx: data.dispute_tx ?? null,\n arbitrationWindowHours: data.arbitration_window_hours ?? null,\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","/**\n * Account. The wallet and credit balance tied to the authenticated API key.\n */\n\nimport type { HttpClient } from \"../http.js\"\nimport type { Account } from \"../types.js\"\n\ninterface RawAccount {\n wallet: string\n credits_remaining: number\n usdg_value: number\n last_topup_at: string | null\n api_key_created_at: string | null\n}\n\nexport class AccountResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Retrieve the current account, including the live credit balance. */\n async get(options: { signal?: AbortSignal } = {}): Promise<Account> {\n const { data } = await this.http.request<RawAccount>({\n path: \"/account\",\n signal: options.signal,\n })\n return {\n wallet: data.wallet,\n creditsRemaining: data.credits_remaining,\n usdgValue: data.usdg_value,\n lastTopupAt: data.last_topup_at ?? null,\n apiKeyCreatedAt: data.api_key_created_at ?? null,\n }\n }\n}\n","/**\n * The HoodCompute client. Entry point for chat completions, models, jobs, and\n * account access against the decentralized inference network.\n */\n\nimport { HttpClient } from \"./http.js\"\nimport { HoodComputeError } from \"./errors.js\"\nimport {\n DEFAULT_BASE_URL,\n DEFAULT_MAX_RETRIES,\n DEFAULT_TIMEOUT_MS,\n} from \"./constants.js\"\nimport { Chat } from \"./resources/chat.js\"\nimport { Models } from \"./resources/models.js\"\nimport { Jobs } from \"./resources/jobs.js\"\nimport { AccountResource } from \"./resources/account.js\"\n\nexport interface HoodComputeClientOptions {\n /**\n * API key, formatted `hoodc_live_...`. Falls back to the\n * `HOODCOMPUTE_API_KEY` environment variable when omitted.\n */\n apiKey?: string\n /** API base URL. Defaults to `https://api.hoodcompute.com/v1`. */\n baseURL?: string\n /** Per-request timeout in milliseconds. Defaults to 120000. */\n timeout?: number\n /** Automatic retries on 5xx, 429, and connection failures. Defaults to 2. */\n maxRetries?: number\n /** Headers added to every request. */\n defaultHeaders?: Record<string, string>\n /** Custom fetch implementation. Defaults to the global `fetch`. */\n fetch?: typeof fetch\n}\n\nexport class HoodComputeClient {\n readonly chat: Chat\n readonly models: Models\n readonly jobs: Jobs\n readonly account: AccountResource\n\n constructor(options: HoodComputeClientOptions = {}) {\n const apiKey = options.apiKey ?? readEnv(\"HOODCOMPUTE_API_KEY\")\n if (!apiKey) {\n throw new HoodComputeError(\n \"Missing API key. Pass `apiKey` to the client or set the HOODCOMPUTE_API_KEY environment variable.\",\n { code: \"missing_api_key\" },\n )\n }\n\n const http = new HttpClient({\n apiKey,\n baseURL: options.baseURL ?? DEFAULT_BASE_URL,\n timeout: options.timeout ?? DEFAULT_TIMEOUT_MS,\n maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,\n defaultHeaders: options.defaultHeaders,\n fetch: options.fetch,\n })\n\n this.chat = new Chat(http)\n this.models = new Models(http)\n this.jobs = new Jobs(http)\n this.account = new AccountResource(http)\n }\n}\n\nfunction readEnv(name: string): string | undefined {\n if (typeof process !== \"undefined\" && process.env) {\n return process.env[name]\n }\n return undefined\n}\n","/**\n * @hoodcompute/sdk/react\n *\n * React hooks for building chat UIs on top of the HoodCompute network.\n * `react` is a peer dependency, imported only from this subpath, so the core\n * SDK stays framework-agnostic.\n */\n\nimport { useCallback, useMemo, useRef, useState } from \"react\"\nimport { HoodComputeClient } from \"./client.js\"\nimport type { ChatMessage } from \"./types.js\"\nimport type { StreamReceipt } from \"./streaming.js\"\n\n/** Status of the chat hook. */\nexport type ChatStatus = \"idle\" | \"streaming\" | \"settling\" | \"error\"\n\n/** Credit balance surfaced by the hook. */\nexport interface ChatBalance {\n creditsRemaining: number\n usdgValue: number\n}\n\nexport interface UseHoodComputeChatOptions {\n /** Model ID to run. */\n model: string\n /**\n * API key. Prefer a server-side proxy in production. When you must call from\n * the browser during beta, use a `NEXT_PUBLIC_`-scoped key you can revoke.\n */\n apiKey?: string\n /** Override the API base URL. */\n baseURL?: string\n /** Reuse an existing client instead of constructing one from `apiKey`. */\n client?: HoodComputeClient\n /** Optional system prompt, prepended to every request. */\n systemPrompt?: string\n /** Called after each job settles, with the stream receipt. */\n onComplete?: (receipt: StreamReceipt) => void\n /** Called when a request fails. */\n onError?: (error: Error) => void\n}\n\nexport interface UseHoodComputeChatResult {\n /** Send a user message and stream the assistant reply into `messages`. */\n send: (message: string) => Promise<void>\n /** Abort the in-flight request, keeping whatever streamed so far. */\n stop: () => void\n /** The running conversation. */\n messages: ChatMessage[]\n /** Current status of the hook. */\n status: ChatStatus\n /** Latest known credit balance, or null before the first completion. */\n balance: ChatBalance | null\n /** Receipt from the most recent settled job. */\n lastReceipt: StreamReceipt | null\n /** The last error, or null. */\n error: Error | null\n /** Clear the conversation and reset status. */\n reset: () => void\n}\n\n/**\n * A chat hook that streams tokens and tracks on-chain settlement.\n *\n * @example\n * const { send, messages, status, balance } = useHoodComputeChat({\n * model: \"qwen3-8b\",\n * apiKey: process.env.NEXT_PUBLIC_HOODCOMPUTE_API_KEY,\n * })\n */\nexport function useHoodComputeChat(\n options: UseHoodComputeChatOptions,\n): UseHoodComputeChatResult {\n const { model, apiKey, baseURL, client: providedClient, systemPrompt, onComplete, onError } =\n options\n\n const [messages, setMessages] = useState<ChatMessage[]>([])\n const [status, setStatus] = useState<ChatStatus>(\"idle\")\n const [balance, setBalance] = useState<ChatBalance | null>(null)\n const [lastReceipt, setLastReceipt] = useState<StreamReceipt | null>(null)\n const [error, setError] = useState<Error | null>(null)\n\n const client = useMemo(\n () => providedClient ?? new HoodComputeClient({ apiKey, baseURL }),\n [providedClient, apiKey, baseURL],\n )\n\n // Keep the latest callbacks without re-creating `send` on every render.\n const callbacks = useRef({ onComplete, onError })\n callbacks.current = { onComplete, onError }\n\n // Mirror `messages` in a ref so `send` always reads the current history,\n // even when called twice before React re-renders.\n const messagesRef = useRef(messages)\n messagesRef.current = messages\n\n const abortRef = useRef<AbortController | null>(null)\n\n const stop = useCallback(() => {\n abortRef.current?.abort()\n }, [])\n\n const send = useCallback(\n async (message: string) => {\n // One request at a time: a new send cancels the previous stream.\n abortRef.current?.abort()\n const controller = new AbortController()\n abortRef.current = controller\n\n setError(null)\n setStatus(\"streaming\")\n\n const userMessage: ChatMessage = { role: \"user\", content: message }\n const history = [...messagesRef.current, userMessage]\n messagesRef.current = [...history, { role: \"assistant\", content: \"\" }]\n setMessages(messagesRef.current)\n\n const outbound: ChatMessage[] = systemPrompt\n ? [{ role: \"system\", content: systemPrompt }, ...history]\n : history\n\n try {\n const stream = await client.chat.completions.create(\n { model, messages: outbound, stream: true },\n { signal: controller.signal },\n )\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content\n if (!delta) continue\n setMessages((prev) => {\n const next = [...prev]\n const last = next[next.length - 1]\n if (last && last.role === \"assistant\") {\n next[next.length - 1] = { ...last, content: last.content + delta }\n }\n return next\n })\n }\n\n setStatus(\"settling\")\n const receipt = stream.receipt\n setLastReceipt(receipt)\n if (receipt.creditsRemaining !== null) {\n setBalance({\n creditsRemaining: receipt.creditsRemaining,\n usdgValue: Number((receipt.creditsRemaining * 0.01).toFixed(2)),\n })\n }\n callbacks.current.onComplete?.(receipt)\n setStatus(\"idle\")\n } catch (err) {\n // A deliberate stop (or a newer send taking over) is not an error.\n if (controller.signal.aborted) {\n if (abortRef.current === controller) setStatus(\"idle\")\n return\n }\n const normalized = err instanceof Error ? err : new Error(String(err))\n setError(normalized)\n setStatus(\"error\")\n callbacks.current.onError?.(normalized)\n } finally {\n if (abortRef.current === controller) abortRef.current = null\n }\n },\n [client, model, systemPrompt],\n )\n\n const reset = useCallback(() => {\n abortRef.current?.abort()\n abortRef.current = null\n messagesRef.current = []\n setMessages([])\n setStatus(\"idle\")\n setError(null)\n setLastReceipt(null)\n }, [])\n\n return { send, stop, messages, status, balance, lastReceipt, error, reset }\n}\n"]}
|
package/dist/react.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { H as HoodComputeClient, S as StreamReceipt, g as ChatMessage } from './client-
|
|
1
|
+
import { H as HoodComputeClient, S as StreamReceipt, g as ChatMessage } from './client-PLfo5vhW.cjs';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @hoodcompute/sdk/react
|
|
@@ -37,6 +37,8 @@ interface UseHoodComputeChatOptions {
|
|
|
37
37
|
interface UseHoodComputeChatResult {
|
|
38
38
|
/** Send a user message and stream the assistant reply into `messages`. */
|
|
39
39
|
send: (message: string) => Promise<void>;
|
|
40
|
+
/** Abort the in-flight request, keeping whatever streamed so far. */
|
|
41
|
+
stop: () => void;
|
|
40
42
|
/** The running conversation. */
|
|
41
43
|
messages: ChatMessage[];
|
|
42
44
|
/** Current status of the hook. */
|
package/dist/react.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { H as HoodComputeClient, S as StreamReceipt, g as ChatMessage } from './client-
|
|
1
|
+
import { H as HoodComputeClient, S as StreamReceipt, g as ChatMessage } from './client-PLfo5vhW.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @hoodcompute/sdk/react
|
|
@@ -37,6 +37,8 @@ interface UseHoodComputeChatOptions {
|
|
|
37
37
|
interface UseHoodComputeChatResult {
|
|
38
38
|
/** Send a user message and stream the assistant reply into `messages`. */
|
|
39
39
|
send: (message: string) => Promise<void>;
|
|
40
|
+
/** Abort the in-flight request, keeping whatever streamed so far. */
|
|
41
|
+
stop: () => void;
|
|
40
42
|
/** The running conversation. */
|
|
41
43
|
messages: ChatMessage[];
|
|
42
44
|
/** Current status of the hook. */
|
package/dist/react.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { HoodComputeClient } from './chunk-
|
|
1
|
+
import { HoodComputeClient } from './chunk-EH6FBSJB.js';
|
|
2
2
|
import { useState, useMemo, useRef, useCallback } from 'react';
|
|
3
3
|
|
|
4
4
|
function useHoodComputeChat(options) {
|
|
@@ -14,20 +14,29 @@ function useHoodComputeChat(options) {
|
|
|
14
14
|
);
|
|
15
15
|
const callbacks = useRef({ onComplete, onError });
|
|
16
16
|
callbacks.current = { onComplete, onError };
|
|
17
|
+
const messagesRef = useRef(messages);
|
|
18
|
+
messagesRef.current = messages;
|
|
19
|
+
const abortRef = useRef(null);
|
|
20
|
+
const stop = useCallback(() => {
|
|
21
|
+
abortRef.current?.abort();
|
|
22
|
+
}, []);
|
|
17
23
|
const send = useCallback(
|
|
18
24
|
async (message) => {
|
|
25
|
+
abortRef.current?.abort();
|
|
26
|
+
const controller = new AbortController();
|
|
27
|
+
abortRef.current = controller;
|
|
19
28
|
setError(null);
|
|
20
29
|
setStatus("streaming");
|
|
21
30
|
const userMessage = { role: "user", content: message };
|
|
22
|
-
const history = [...
|
|
23
|
-
|
|
31
|
+
const history = [...messagesRef.current, userMessage];
|
|
32
|
+
messagesRef.current = [...history, { role: "assistant", content: "" }];
|
|
33
|
+
setMessages(messagesRef.current);
|
|
24
34
|
const outbound = systemPrompt ? [{ role: "system", content: systemPrompt }, ...history] : history;
|
|
25
35
|
try {
|
|
26
|
-
const stream = await client.chat.completions.create(
|
|
27
|
-
model,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
});
|
|
36
|
+
const stream = await client.chat.completions.create(
|
|
37
|
+
{ model, messages: outbound, stream: true },
|
|
38
|
+
{ signal: controller.signal }
|
|
39
|
+
);
|
|
31
40
|
for await (const chunk of stream) {
|
|
32
41
|
const delta = chunk.choices[0]?.delta?.content;
|
|
33
42
|
if (!delta) continue;
|
|
@@ -52,21 +61,30 @@ function useHoodComputeChat(options) {
|
|
|
52
61
|
callbacks.current.onComplete?.(receipt);
|
|
53
62
|
setStatus("idle");
|
|
54
63
|
} catch (err) {
|
|
64
|
+
if (controller.signal.aborted) {
|
|
65
|
+
if (abortRef.current === controller) setStatus("idle");
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
55
68
|
const normalized = err instanceof Error ? err : new Error(String(err));
|
|
56
69
|
setError(normalized);
|
|
57
70
|
setStatus("error");
|
|
58
71
|
callbacks.current.onError?.(normalized);
|
|
72
|
+
} finally {
|
|
73
|
+
if (abortRef.current === controller) abortRef.current = null;
|
|
59
74
|
}
|
|
60
75
|
},
|
|
61
|
-
[client, model,
|
|
76
|
+
[client, model, systemPrompt]
|
|
62
77
|
);
|
|
63
78
|
const reset = useCallback(() => {
|
|
79
|
+
abortRef.current?.abort();
|
|
80
|
+
abortRef.current = null;
|
|
81
|
+
messagesRef.current = [];
|
|
64
82
|
setMessages([]);
|
|
65
83
|
setStatus("idle");
|
|
66
84
|
setError(null);
|
|
67
85
|
setLastReceipt(null);
|
|
68
86
|
}, []);
|
|
69
|
-
return { send, messages, status, balance, lastReceipt, error, reset };
|
|
87
|
+
return { send, stop, messages, status, balance, lastReceipt, error, reset };
|
|
70
88
|
}
|
|
71
89
|
|
|
72
90
|
export { useHoodComputeChat };
|
package/dist/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"sources":["../src/react.ts"],"names":[],"mappings":"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","file":"react.js","sourcesContent":["/**\n * @hoodcompute/sdk/react\n *\n * React hooks for building chat UIs on top of the HoodCompute network.\n * `react` is a peer dependency, imported only from this subpath, so the core\n * SDK stays framework-agnostic.\n */\n\nimport { useCallback, useMemo, useRef, useState } from \"react\"\nimport { HoodComputeClient } from \"./client.js\"\nimport type { ChatMessage } from \"./types.js\"\nimport type { StreamReceipt } from \"./streaming.js\"\n\n/** Status of the chat hook. */\nexport type ChatStatus = \"idle\" | \"streaming\" | \"settling\" | \"error\"\n\n/** Credit balance surfaced by the hook. */\nexport interface ChatBalance {\n creditsRemaining: number\n usdgValue: number\n}\n\nexport interface UseHoodComputeChatOptions {\n /** Model ID to run. */\n model: string\n /**\n * API key. Prefer a server-side proxy in production. When you must call from\n * the browser during beta, use a `NEXT_PUBLIC_`-scoped key you can revoke.\n */\n apiKey?: string\n /** Override the API base URL. */\n baseURL?: string\n /** Reuse an existing client instead of constructing one from `apiKey`. */\n client?: HoodComputeClient\n /** Optional system prompt, prepended to every request. */\n systemPrompt?: string\n /** Called after each job settles, with the stream receipt. */\n onComplete?: (receipt: StreamReceipt) => void\n /** Called when a request fails. */\n onError?: (error: Error) => void\n}\n\nexport interface UseHoodComputeChatResult {\n /** Send a user message and stream the assistant reply into `messages`. */\n send: (message: string) => Promise<void>\n /** Abort the in-flight request, keeping whatever streamed so far. */\n stop: () => void\n /** The running conversation. */\n messages: ChatMessage[]\n /** Current status of the hook. */\n status: ChatStatus\n /** Latest known credit balance, or null before the first completion. */\n balance: ChatBalance | null\n /** Receipt from the most recent settled job. */\n lastReceipt: StreamReceipt | null\n /** The last error, or null. */\n error: Error | null\n /** Clear the conversation and reset status. */\n reset: () => void\n}\n\n/**\n * A chat hook that streams tokens and tracks on-chain settlement.\n *\n * @example\n * const { send, messages, status, balance } = useHoodComputeChat({\n * model: \"qwen3-8b\",\n * apiKey: process.env.NEXT_PUBLIC_HOODCOMPUTE_API_KEY,\n * })\n */\nexport function useHoodComputeChat(\n options: UseHoodComputeChatOptions,\n): UseHoodComputeChatResult {\n const { model, apiKey, baseURL, client: providedClient, systemPrompt, onComplete, onError } =\n options\n\n const [messages, setMessages] = useState<ChatMessage[]>([])\n const [status, setStatus] = useState<ChatStatus>(\"idle\")\n const [balance, setBalance] = useState<ChatBalance | null>(null)\n const [lastReceipt, setLastReceipt] = useState<StreamReceipt | null>(null)\n const [error, setError] = useState<Error | null>(null)\n\n const client = useMemo(\n () => providedClient ?? new HoodComputeClient({ apiKey, baseURL }),\n [providedClient, apiKey, baseURL],\n )\n\n // Keep the latest callbacks without re-creating `send` on every render.\n const callbacks = useRef({ onComplete, onError })\n callbacks.current = { onComplete, onError }\n\n // Mirror `messages` in a ref so `send` always reads the current history,\n // even when called twice before React re-renders.\n const messagesRef = useRef(messages)\n messagesRef.current = messages\n\n const abortRef = useRef<AbortController | null>(null)\n\n const stop = useCallback(() => {\n abortRef.current?.abort()\n }, [])\n\n const send = useCallback(\n async (message: string) => {\n // One request at a time: a new send cancels the previous stream.\n abortRef.current?.abort()\n const controller = new AbortController()\n abortRef.current = controller\n\n setError(null)\n setStatus(\"streaming\")\n\n const userMessage: ChatMessage = { role: \"user\", content: message }\n const history = [...messagesRef.current, userMessage]\n messagesRef.current = [...history, { role: \"assistant\", content: \"\" }]\n setMessages(messagesRef.current)\n\n const outbound: ChatMessage[] = systemPrompt\n ? [{ role: \"system\", content: systemPrompt }, ...history]\n : history\n\n try {\n const stream = await client.chat.completions.create(\n { model, messages: outbound, stream: true },\n { signal: controller.signal },\n )\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content\n if (!delta) continue\n setMessages((prev) => {\n const next = [...prev]\n const last = next[next.length - 1]\n if (last && last.role === \"assistant\") {\n next[next.length - 1] = { ...last, content: last.content + delta }\n }\n return next\n })\n }\n\n setStatus(\"settling\")\n const receipt = stream.receipt\n setLastReceipt(receipt)\n if (receipt.creditsRemaining !== null) {\n setBalance({\n creditsRemaining: receipt.creditsRemaining,\n usdgValue: Number((receipt.creditsRemaining * 0.01).toFixed(2)),\n })\n }\n callbacks.current.onComplete?.(receipt)\n setStatus(\"idle\")\n } catch (err) {\n // A deliberate stop (or a newer send taking over) is not an error.\n if (controller.signal.aborted) {\n if (abortRef.current === controller) setStatus(\"idle\")\n return\n }\n const normalized = err instanceof Error ? err : new Error(String(err))\n setError(normalized)\n setStatus(\"error\")\n callbacks.current.onError?.(normalized)\n } finally {\n if (abortRef.current === controller) abortRef.current = null\n }\n },\n [client, model, systemPrompt],\n )\n\n const reset = useCallback(() => {\n abortRef.current?.abort()\n abortRef.current = null\n messagesRef.current = []\n setMessages([])\n setStatus(\"idle\")\n setError(null)\n setLastReceipt(null)\n }, [])\n\n return { send, stop, messages, status, balance, lastReceipt, error, reset }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hoodcompute/sdk",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Typed TypeScript SDK for the HoodCompute decentralized AI inference network. OpenAI-compatible chat completions with on-chain settlement receipts on Robinhood Chain.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "HoodCompute",
|
|
7
7
|
"homepage": "https://hoodcompute.com",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
|
-
"url": "https://github.com/hoodcompute/
|
|
10
|
+
"url": "https://github.com/hoodcompute/monorepo.git"
|
|
11
11
|
},
|
|
12
12
|
"bugs": {
|
|
13
|
-
"url": "https://github.com/hoodcompute/
|
|
13
|
+
"url": "https://github.com/hoodcompute/monorepo/issues"
|
|
14
14
|
},
|
|
15
15
|
"keywords": [
|
|
16
16
|
"hoodcompute",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/constants.ts","../src/streaming.ts","../src/http.ts","../src/resources/chat.ts","../src/resources/models.ts","../src/resources/jobs.ts","../src/resources/account.ts","../src/client.ts"],"names":["response","normalize"],"mappings":"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","file":"chunk-72VFNNOI.js","sourcesContent":["/**\n * Error types raised by the HoodCompute SDK.\n *\n * Every failed API request is surfaced as a `HoodComputeError` (or a subclass).\n * The machine-readable `code` maps to the codes documented at\n * https://docs.hoodcompute.com/api-reference/errors.\n */\n\n/** Shape of the error body returned by the API. */\nexport interface ApiErrorBody {\n code?: string\n message?: string\n type?: string\n param?: string | null\n docs?: string\n details?: Record<string, unknown>\n}\n\n/** Base class for all errors raised by the SDK. */\nexport class HoodComputeError extends Error {\n /** HTTP status code, when the error came from an API response. */\n readonly status?: number\n /** Machine-readable error code, for example `insufficient_credits`. */\n readonly code?: string\n /** Error category reported by the API. */\n readonly type?: string\n /** Request parameter that caused the error, when applicable. */\n readonly param?: string | null\n /** Additional structured detail from the API. */\n readonly details?: Record<string, unknown>\n /** Value of the `x-request-id` response header, useful for support. */\n readonly requestId?: string\n\n constructor(\n message: string,\n opts: {\n status?: number\n code?: string\n type?: string\n param?: string | null\n details?: Record<string, unknown>\n requestId?: string\n } = {},\n ) {\n super(message)\n this.name = \"HoodComputeError\"\n this.status = opts.status\n this.code = opts.code\n this.type = opts.type\n this.param = opts.param\n this.details = opts.details\n this.requestId = opts.requestId\n }\n}\n\n/** 401 / 403. The API key is missing, invalid, revoked, or suspended. */\nexport class AuthenticationError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"AuthenticationError\"\n }\n}\n\n/** 402. The credit balance is too low for the requested tier. */\nexport class InsufficientCreditsError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"InsufficientCreditsError\"\n }\n}\n\n/** 400. The request body is malformed or a required field is missing. */\nexport class InvalidRequestError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"InvalidRequestError\"\n }\n}\n\n/** 404. The requested resource does not exist. */\nexport class NotFoundError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"NotFoundError\"\n }\n}\n\n/** 429. The request rate to the API is too high. Back off and retry. */\nexport class RateLimitError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"RateLimitError\"\n }\n}\n\n/**\n * 503. No workers are currently hosting the requested model. This is a\n * transient condition. Check `retryAfter` and try again.\n */\nexport class NoWorkersAvailableError extends HoodComputeError {\n /** Suggested seconds to wait before retrying. */\n get retryAfter(): number | undefined {\n const value = this.details?.retry_after\n return typeof value === \"number\" ? value : undefined\n }\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"NoWorkersAvailableError\"\n }\n}\n\n/** 504. No worker completed the job within the timeout. Credits were refunded. */\nexport class JobTimeoutError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"JobTimeoutError\"\n }\n}\n\n/** 5xx. An internal server error. Usually safe to retry. */\nexport class ServerError extends HoodComputeError {\n constructor(...args: ConstructorParameters<typeof HoodComputeError>) {\n super(...args)\n this.name = \"ServerError\"\n }\n}\n\n/** The request failed to reach the API, or timed out, or was aborted. */\nexport class ConnectionError extends HoodComputeError {\n constructor(message: string, opts: { cause?: unknown } = {}) {\n super(message)\n this.name = \"ConnectionError\"\n if (opts.cause !== undefined) this.cause = opts.cause\n }\n}\n\n/**\n * Construct the appropriate error subclass from an API response.\n * @internal\n */\nexport function errorFromResponse(\n status: number,\n body: ApiErrorBody | undefined,\n requestId?: string,\n): HoodComputeError {\n const code = body?.code\n const message = body?.message ?? `HoodCompute API request failed with status ${status}`\n const opts = {\n status,\n code,\n type: body?.type,\n param: body?.param ?? null,\n details: body?.details,\n requestId,\n }\n\n if (code === \"no_workers_available\") return new NoWorkersAvailableError(message, opts)\n if (code === \"job_timeout\") return new JobTimeoutError(message, opts)\n if (code === \"insufficient_credits\") return new InsufficientCreditsError(message, opts)\n\n switch (status) {\n case 400:\n case 422:\n return new InvalidRequestError(message, opts)\n case 401:\n case 403:\n return new AuthenticationError(message, opts)\n case 402:\n return new InsufficientCreditsError(message, opts)\n case 404:\n return new NotFoundError(message, opts)\n case 429:\n return new RateLimitError(message, opts)\n case 503:\n return new NoWorkersAvailableError(message, opts)\n case 504:\n return new JobTimeoutError(message, opts)\n default:\n if (status >= 500) return new ServerError(message, opts)\n return new HoodComputeError(message, opts)\n }\n}\n\n/** Whether an error is worth retrying with the same payload. @internal */\nexport function isRetryable(err: unknown): boolean {\n if (err instanceof ConnectionError) return true\n if (err instanceof HoodComputeError) {\n if (err.status === undefined) return false\n return err.status >= 500 || err.status === 429\n }\n return false\n}\n","/**\n * Network and client defaults for HoodCompute.\n */\n\n/** Default HoodCompute API base URL. */\nexport const DEFAULT_BASE_URL = \"https://api.hoodcompute.com/v1\"\n\n/** Robinhood Chain mainnet chain ID. */\nexport const ROBINHOOD_CHAIN_ID = 4663\n\n/** Base URL of the Robinhood Chain Blockscout explorer. */\nexport const BLOCKSCOUT_BASE_URL = \"https://robinhoodchain.blockscout.com\"\n\n/** Default request timeout in milliseconds. */\nexport const DEFAULT_TIMEOUT_MS = 120_000\n\n/** Default number of automatic retries on transient failures. */\nexport const DEFAULT_MAX_RETRIES = 2\n\n/** SDK version, surfaced in the User-Agent header. */\nexport const SDK_VERSION = \"0.1.0\"\n\n/**\n * Build a Blockscout explorer link for a Robinhood Chain transaction hash.\n *\n * @example\n * explorerTxUrl(receipt.settlementTx)\n * // \"https://robinhoodchain.blockscout.com/tx/0x...\"\n */\nexport function explorerTxUrl(txHash: string): string {\n return `${BLOCKSCOUT_BASE_URL}/tx/${txHash}`\n}\n\n/**\n * Build a Blockscout explorer link for a Robinhood Chain address.\n */\nexport function explorerAddressUrl(address: string): string {\n return `${BLOCKSCOUT_BASE_URL}/address/${address}`\n}\n","/**\n * Server-Sent Events parsing and the streaming chat completion object.\n */\n\nimport type { ChatCompletionChunk } from \"./types.js\"\nimport { ConnectionError } from \"./errors.js\"\n\n/**\n * Lightweight settlement metadata surfaced from a streaming response once it\n * closes. Values are read from response headers as the network makes them\n * available. For the full on-chain receipt, call `client.jobs.getReceipt(jobId)`.\n */\nexport interface StreamReceipt {\n jobId: string | null\n settlementTx: string | null\n escrowTx: string | null\n workerAddress: string | null\n creditsRemaining: number | null\n}\n\n/**\n * An async-iterable stream of chat completion chunks.\n *\n * Iterate it with `for await` to consume tokens as they arrive. Once iteration\n * finishes, `jobId` and `receipt` are populated from the response.\n *\n * @example\n * const stream = await client.chat.completions.create({ ..., stream: true })\n * for await (const chunk of stream) {\n * process.stdout.write(chunk.choices[0]?.delta?.content ?? \"\")\n * }\n * console.log(stream.receipt.settlementTx)\n */\nexport class ChatCompletionStream implements AsyncIterable<ChatCompletionChunk> {\n /** HoodCompute job ID for this completion, from the response header. */\n jobId: string | null\n /** Settlement metadata, populated once the stream finishes. */\n receipt: StreamReceipt\n\n private readonly response: Response\n\n constructor(response: Response) {\n this.response = response\n this.jobId = response.headers.get(\"x-hoodcompute-job-id\")\n this.receipt = this.readReceipt()\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<ChatCompletionChunk> {\n const body = this.response.body\n if (!body) {\n throw new ConnectionError(\"The streaming response contained no body.\")\n }\n\n const decoder = new TextDecoder()\n const reader = body.getReader()\n let buffer = \"\"\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n\n // SSE events are separated by a blank line.\n let boundary = buffer.indexOf(\"\\n\\n\")\n while (boundary !== -1) {\n const rawEvent = buffer.slice(0, boundary)\n buffer = buffer.slice(boundary + 2)\n\n const chunk = parseEvent(rawEvent)\n if (chunk === DONE) {\n return\n }\n if (chunk) {\n yield chunk\n }\n boundary = buffer.indexOf(\"\\n\\n\")\n }\n }\n\n // Flush a trailing event with no terminating blank line.\n const trailing = parseEvent(buffer)\n if (trailing && trailing !== DONE) {\n yield trailing\n }\n } finally {\n reader.releaseLock()\n // Refresh the receipt in case trailer headers landed after the stream.\n this.receipt = this.readReceipt()\n }\n }\n\n /** Convenience: collect the full concatenated text of the stream. */\n async text(): Promise<string> {\n let out = \"\"\n for await (const chunk of this) {\n out += chunk.choices[0]?.delta?.content ?? \"\"\n }\n return out\n }\n\n private readReceipt(): StreamReceipt {\n const h = this.response.headers\n const creditsRemaining = h.get(\"x-hoodcompute-credits-remaining\")\n return {\n jobId: h.get(\"x-hoodcompute-job-id\"),\n settlementTx: h.get(\"x-hoodcompute-settlement-tx\"),\n escrowTx: h.get(\"x-hoodcompute-tx-hash\"),\n workerAddress: h.get(\"x-hoodcompute-worker\"),\n creditsRemaining: creditsRemaining !== null ? Number(creditsRemaining) : null,\n }\n }\n}\n\n/** Sentinel marking the `[DONE]` terminator. */\nconst DONE = Symbol(\"done\")\n\n/**\n * Parse one raw SSE event block into a chunk. Returns `DONE` on the terminator,\n * `null` for events without usable data (comments, empty blocks).\n */\nfunction parseEvent(raw: string): ChatCompletionChunk | typeof DONE | null {\n const dataLines: string[] = []\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trimEnd()\n if (trimmed.startsWith(\":\") || trimmed === \"\") continue\n if (trimmed.startsWith(\"data:\")) {\n dataLines.push(trimmed.slice(5).trimStart())\n }\n }\n if (dataLines.length === 0) return null\n\n const data = dataLines.join(\"\\n\")\n if (data === \"[DONE]\") return DONE\n\n try {\n return JSON.parse(data) as ChatCompletionChunk\n } catch {\n return null\n }\n}\n","/**\n * Internal HTTP transport. Handles authentication headers, timeouts, automatic\n * retries with exponential backoff, and error normalization. Not part of the\n * public API surface.\n * @internal\n */\n\nimport {\n ConnectionError,\n errorFromResponse,\n isRetryable,\n type ApiErrorBody,\n} from \"./errors.js\"\nimport { SDK_VERSION } from \"./constants.js\"\n\nexport interface HttpClientOptions {\n apiKey: string\n baseURL: string\n timeout: number\n maxRetries: number\n defaultHeaders?: Record<string, string>\n fetch?: typeof fetch\n}\n\nexport interface RequestOptions {\n method?: string\n path: string\n query?: Record<string, string | number | undefined>\n body?: unknown\n /** When true, the raw Response is returned without reading the body. */\n stream?: boolean\n signal?: AbortSignal\n}\n\nexport class HttpClient {\n private readonly apiKey: string\n private readonly baseURL: string\n private readonly timeout: number\n private readonly maxRetries: number\n private readonly defaultHeaders: Record<string, string>\n private readonly fetchImpl: typeof fetch\n\n constructor(options: HttpClientOptions) {\n this.apiKey = options.apiKey\n this.baseURL = options.baseURL.replace(/\\/$/, \"\")\n this.timeout = options.timeout\n this.maxRetries = options.maxRetries\n this.defaultHeaders = options.defaultHeaders ?? {}\n\n const impl = options.fetch ?? globalThis.fetch\n if (!impl) {\n throw new ConnectionError(\n \"No global fetch implementation found. Use Node 18+ or pass a `fetch` option.\",\n )\n }\n this.fetchImpl = impl\n }\n\n /** Perform a request and return the parsed JSON body plus response headers. */\n async request<T>(options: RequestOptions): Promise<{ data: T; response: Response }> {\n const response = await this.raw(options)\n const text = await response.text()\n const data = text ? (JSON.parse(text) as T) : (undefined as T)\n return { data, response }\n }\n\n /**\n * Perform a request and return the raw Response. Used by the streaming path,\n * which reads `response.body` directly. Errors are still parsed and thrown.\n */\n async raw(options: RequestOptions): Promise<Response> {\n const url = this.buildUrl(options.path, options.query)\n const headers = this.buildHeaders(options)\n const init: RequestInit = {\n method: options.method ?? \"GET\",\n headers,\n }\n if (options.body !== undefined) {\n init.body = JSON.stringify(options.body)\n }\n\n let lastError: unknown\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n const response = await this.fetchWithTimeout(url, init, options.signal)\n if (response.ok) return response\n\n const error = await this.toError(response)\n if (isRetryable(error) && attempt < this.maxRetries) {\n lastError = error\n await sleep(this.backoff(attempt, error))\n continue\n }\n throw error\n } catch (err) {\n if (err instanceof ConnectionError && attempt < this.maxRetries) {\n lastError = err\n await sleep(this.backoff(attempt))\n continue\n }\n throw err\n }\n }\n\n // Loop only exits via return/throw except when the last attempt was a\n // retryable failure that exhausted the budget.\n throw lastError instanceof Error\n ? lastError\n : new ConnectionError(\"Request failed after exhausting retries.\")\n }\n\n private async fetchWithTimeout(\n url: string,\n init: RequestInit,\n userSignal?: AbortSignal,\n ): Promise<Response> {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), this.timeout)\n const onAbort = () => controller.abort()\n userSignal?.addEventListener(\"abort\", onAbort, { once: true })\n\n try {\n return await this.fetchImpl(url, { ...init, signal: controller.signal })\n } catch (err) {\n if (userSignal?.aborted) {\n throw new ConnectionError(\"Request aborted by caller.\", { cause: err })\n }\n if (controller.signal.aborted) {\n throw new ConnectionError(`Request timed out after ${this.timeout}ms.`, { cause: err })\n }\n throw new ConnectionError(\"Failed to reach the HoodCompute API.\", { cause: err })\n } finally {\n clearTimeout(timer)\n userSignal?.removeEventListener(\"abort\", onAbort)\n }\n }\n\n private async toError(response: Response) {\n let body: ApiErrorBody | undefined\n try {\n const parsed = (await response.json()) as { error?: ApiErrorBody } | ApiErrorBody\n body = \"error\" in parsed && parsed.error ? parsed.error : (parsed as ApiErrorBody)\n } catch {\n body = undefined\n }\n const requestId = response.headers.get(\"x-request-id\") ?? undefined\n return errorFromResponse(response.status, body, requestId)\n }\n\n private buildUrl(path: string, query?: RequestOptions[\"query\"]): string {\n const url = new URL(`${this.baseURL}${path}`)\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) url.searchParams.set(key, String(value))\n }\n }\n return url.toString()\n }\n\n private buildHeaders(options: RequestOptions): Record<string, string> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n Accept: options.stream ? \"text/event-stream\" : \"application/json\",\n \"User-Agent\": `hoodcompute-sdk-js/${SDK_VERSION}`,\n ...this.defaultHeaders,\n }\n if (options.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\"\n }\n return headers\n }\n\n private backoff(attempt: number, error?: unknown): number {\n // Honor a server-suggested retry_after when present (in seconds).\n const retryAfter =\n error &&\n typeof error === \"object\" &&\n \"details\" in error &&\n typeof (error as { details?: Record<string, unknown> }).details?.retry_after === \"number\"\n ? ((error as { details: Record<string, unknown> }).details.retry_after as number) * 1000\n : undefined\n if (retryAfter !== undefined) return retryAfter\n return Math.min(1000 * 2 ** attempt, 8000)\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","/**\n * Chat completions. OpenAI-compatible in request and response shape, with the\n * job ID and on-chain settlement attached to every result.\n */\n\nimport type { HttpClient } from \"../http.js\"\nimport type {\n ChatCompletion,\n ChatCompletionCreateParams,\n} from \"../types.js\"\nimport { ChatCompletionStream } from \"../streaming.js\"\n\n/** Raw response body from the completions endpoint, before SDK normalization. */\ninterface RawChatCompletion {\n id: string\n object: \"chat.completion\"\n created: number\n model: string\n choices: ChatCompletion[\"choices\"]\n usage: ChatCompletion[\"usage\"]\n}\n\nexport class Completions {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Create a chat completion.\n *\n * Pass `stream: true` to receive a {@link ChatCompletionStream}. Otherwise a\n * fully resolved {@link ChatCompletion} is returned.\n */\n create(\n params: ChatCompletionCreateParams & { stream: true },\n options?: { signal?: AbortSignal },\n ): Promise<ChatCompletionStream>\n create(\n params: ChatCompletionCreateParams & { stream?: false },\n options?: { signal?: AbortSignal },\n ): Promise<ChatCompletion>\n create(\n params: ChatCompletionCreateParams,\n options?: { signal?: AbortSignal },\n ): Promise<ChatCompletion | ChatCompletionStream>\n async create(\n params: ChatCompletionCreateParams,\n options: { signal?: AbortSignal } = {},\n ): Promise<ChatCompletion | ChatCompletionStream> {\n if (params.stream) {\n const response = await this.http.raw({\n method: \"POST\",\n path: \"/chat/completions\",\n body: params,\n stream: true,\n signal: options.signal,\n })\n return new ChatCompletionStream(response)\n }\n\n const { data, response } = await this.http.request<RawChatCompletion>({\n method: \"POST\",\n path: \"/chat/completions\",\n body: params,\n signal: options.signal,\n })\n\n const creditsRemaining = response.headers.get(\"x-hoodcompute-credits-remaining\")\n return {\n ...data,\n jobId: response.headers.get(\"x-hoodcompute-job-id\") ?? data.id,\n settlementTx: response.headers.get(\"x-hoodcompute-settlement-tx\"),\n creditsCharged: null,\n creditsRemaining: creditsRemaining !== null ? Number(creditsRemaining) : null,\n }\n }\n}\n\nexport class Chat {\n readonly completions: Completions\n constructor(http: HttpClient) {\n this.completions = new Completions(http)\n }\n}\n","/**\n * Models. Reflects the live worker pool: a model is listed only while at least\n * one worker is hosting it.\n */\n\nimport type { HttpClient } from \"../http.js\"\nimport type { Model, ModelList, ModelTier } from \"../types.js\"\n\ninterface RawModel {\n id: string\n object: \"model\"\n created: number\n owned_by: string\n hoodcompute: {\n tier: ModelTier\n credits_per_request: number\n credits_per_1k_tokens: number\n active_workers: number\n median_latency_ms: number\n parameters: string\n context_window: number\n }\n}\n\nfunction normalize(raw: RawModel): Model {\n return {\n id: raw.id,\n object: raw.object,\n created: raw.created,\n ownedBy: raw.owned_by,\n hoodcompute: {\n tier: raw.hoodcompute.tier,\n creditsPerRequest: raw.hoodcompute.credits_per_request,\n creditsPer1kTokens: raw.hoodcompute.credits_per_1k_tokens,\n activeWorkers: raw.hoodcompute.active_workers,\n medianLatencyMs: raw.hoodcompute.median_latency_ms,\n parameters: raw.hoodcompute.parameters,\n contextWindow: raw.hoodcompute.context_window,\n },\n }\n}\n\nexport class Models {\n constructor(private readonly http: HttpClient) {}\n\n /** List every model currently available on the network. */\n async list(options: { signal?: AbortSignal } = {}): Promise<ModelList> {\n const { data } = await this.http.request<{ object: \"list\"; data: RawModel[] }>({\n path: \"/models\",\n signal: options.signal,\n })\n return { object: \"list\", data: data.data.map(normalize) }\n }\n\n /** Retrieve a single model by ID, including its live worker count. */\n async retrieve(modelId: string, options: { signal?: AbortSignal } = {}): Promise<Model> {\n const { data } = await this.http.request<RawModel>({\n path: `/models/${encodeURIComponent(modelId)}`,\n signal: options.signal,\n })\n return normalize(data)\n }\n}\n","/**\n * Jobs. Retrieve job status, fetch on-chain receipts, and open disputes.\n */\n\nimport type { HttpClient } from \"../http.js\"\nimport type {\n DisputeResult,\n Job,\n JobList,\n JobListParams,\n JobReceipt,\n JobStatus,\n ModelTier,\n Usage,\n} from \"../types.js\"\nimport { NotFoundError } from \"../errors.js\"\n\ninterface RawJob {\n id: string\n object: \"job\"\n status: JobStatus\n model: string\n tier: ModelTier\n credits_charged: number\n usdg_value: number\n worker_address: string\n created_at: string\n completed_at: string | null\n on_chain: {\n escrow_tx: string\n settlement_tx: string\n escrow_address: string\n block_number: number\n proof_hash: string\n } | null\n usage: Usage | null\n}\n\nfunction normalize(raw: RawJob): Job {\n return {\n id: raw.id,\n object: raw.object,\n status: raw.status,\n model: raw.model,\n tier: raw.tier,\n creditsCharged: raw.credits_charged,\n usdgValue: raw.usdg_value,\n workerAddress: raw.worker_address,\n createdAt: raw.created_at,\n completedAt: raw.completed_at,\n onChain: raw.on_chain\n ? {\n escrowTx: raw.on_chain.escrow_tx,\n settlementTx: raw.on_chain.settlement_tx,\n escrowAddress: raw.on_chain.escrow_address,\n blockNumber: raw.on_chain.block_number,\n proofHash: raw.on_chain.proof_hash,\n }\n : null,\n usage: raw.usage,\n }\n}\n\nexport class Jobs {\n constructor(private readonly http: HttpClient) {}\n\n /** Retrieve a job by ID, including its on-chain settlement detail. */\n async get(jobId: string, options: { signal?: AbortSignal } = {}): Promise<Job> {\n const { data } = await this.http.request<RawJob>({\n path: `/jobs/${encodeURIComponent(jobId)}`,\n signal: options.signal,\n })\n return normalize(data)\n }\n\n /** List jobs for the authenticated key, most recent first. */\n async list(params: JobListParams = {}, options: { signal?: AbortSignal } = {}): Promise<JobList> {\n const { data } = await this.http.request<{\n object: \"list\"\n data: RawJob[]\n has_more: boolean\n next_cursor: string | null\n }>({\n path: \"/jobs\",\n query: {\n limit: params.limit,\n before: params.before,\n after: params.after,\n status: params.status,\n model: params.model,\n },\n signal: options.signal,\n })\n return {\n object: \"list\",\n data: data.data.map(normalize),\n hasMore: data.has_more,\n nextCursor: data.next_cursor,\n }\n }\n\n /**\n * Fetch the on-chain receipt for a settled job. Throws if the job exists but\n * has not settled yet.\n */\n async getReceipt(jobId: string, options: { signal?: AbortSignal } = {}): Promise<JobReceipt> {\n const job = await this.get(jobId, options)\n if (!job.onChain) {\n throw new NotFoundError(\n `Job ${jobId} has status \"${job.status}\" and no on-chain receipt yet.`,\n { code: \"receipt_not_ready\" },\n )\n }\n return {\n jobId: job.id,\n model: job.model,\n tier: job.tier,\n creditsCharged: job.creditsCharged,\n usdgValue: job.usdgValue,\n workerAddress: job.workerAddress,\n escrowTx: job.onChain.escrowTx,\n settlementTx: job.onChain.settlementTx,\n blockNumber: job.onChain.blockNumber,\n proofHash: job.onChain.proofHash,\n }\n }\n\n /**\n * Open a dispute on a completed job. Must be called within 60 seconds of\n * receiving the final output token.\n *\n * @param receivedOutputHash SHA-256 of the full response text you received,\n * formatted as `sha256:<hex>`.\n */\n async dispute(\n jobId: string,\n receivedOutputHash: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<DisputeResult> {\n const { data } = await this.http.request<{\n job_id: string\n dispute_opened: boolean\n your_hash: string\n worker_hash: string\n dispute_tx?: string | null\n arbitration_window_hours?: number | null\n }>({\n method: \"POST\",\n path: `/jobs/${encodeURIComponent(jobId)}/dispute`,\n body: { received_output_hash: receivedOutputHash },\n signal: options.signal,\n })\n return {\n jobId: data.job_id,\n disputeOpened: data.dispute_opened,\n yourHash: data.your_hash,\n workerHash: data.worker_hash,\n disputeTx: data.dispute_tx ?? null,\n arbitrationWindowHours: data.arbitration_window_hours ?? null,\n }\n }\n}\n","/**\n * Account. The wallet and credit balance tied to the authenticated API key.\n */\n\nimport type { HttpClient } from \"../http.js\"\nimport type { Account } from \"../types.js\"\n\ninterface RawAccount {\n wallet: string\n credits_remaining: number\n usdg_value: number\n last_topup_at: string | null\n api_key_created_at: string | null\n}\n\nexport class AccountResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Retrieve the current account, including the live credit balance. */\n async get(options: { signal?: AbortSignal } = {}): Promise<Account> {\n const { data } = await this.http.request<RawAccount>({\n path: \"/account\",\n signal: options.signal,\n })\n return {\n wallet: data.wallet,\n creditsRemaining: data.credits_remaining,\n usdgValue: data.usdg_value,\n lastTopupAt: data.last_topup_at ?? null,\n apiKeyCreatedAt: data.api_key_created_at ?? null,\n }\n }\n}\n","/**\n * The HoodCompute client. Entry point for chat completions, models, jobs, and\n * account access against the decentralized inference network.\n */\n\nimport { HttpClient } from \"./http.js\"\nimport { HoodComputeError } from \"./errors.js\"\nimport {\n DEFAULT_BASE_URL,\n DEFAULT_MAX_RETRIES,\n DEFAULT_TIMEOUT_MS,\n} from \"./constants.js\"\nimport { Chat } from \"./resources/chat.js\"\nimport { Models } from \"./resources/models.js\"\nimport { Jobs } from \"./resources/jobs.js\"\nimport { AccountResource } from \"./resources/account.js\"\n\nexport interface HoodComputeClientOptions {\n /**\n * API key, formatted `hoodc_live_...`. Falls back to the\n * `HOODCOMPUTE_API_KEY` environment variable when omitted.\n */\n apiKey?: string\n /** API base URL. Defaults to `https://api.hoodcompute.com/v1`. */\n baseURL?: string\n /** Per-request timeout in milliseconds. Defaults to 120000. */\n timeout?: number\n /** Automatic retries on 5xx, 429, and connection failures. Defaults to 2. */\n maxRetries?: number\n /** Headers added to every request. */\n defaultHeaders?: Record<string, string>\n /** Custom fetch implementation. Defaults to the global `fetch`. */\n fetch?: typeof fetch\n}\n\nexport class HoodComputeClient {\n readonly chat: Chat\n readonly models: Models\n readonly jobs: Jobs\n readonly account: AccountResource\n\n constructor(options: HoodComputeClientOptions = {}) {\n const apiKey = options.apiKey ?? readEnv(\"HOODCOMPUTE_API_KEY\")\n if (!apiKey) {\n throw new HoodComputeError(\n \"Missing API key. Pass `apiKey` to the client or set the HOODCOMPUTE_API_KEY environment variable.\",\n { code: \"missing_api_key\" },\n )\n }\n\n const http = new HttpClient({\n apiKey,\n baseURL: options.baseURL ?? DEFAULT_BASE_URL,\n timeout: options.timeout ?? DEFAULT_TIMEOUT_MS,\n maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,\n defaultHeaders: options.defaultHeaders,\n fetch: options.fetch,\n })\n\n this.chat = new Chat(http)\n this.models = new Models(http)\n this.jobs = new Jobs(http)\n this.account = new AccountResource(http)\n }\n}\n\nfunction readEnv(name: string): string | undefined {\n if (typeof process !== \"undefined\" && process.env) {\n return process.env[name]\n }\n return undefined\n}\n"]}
|