addisai 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +300 -0
- package/dist/index.cjs +1465 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +718 -0
- package/dist/index.d.ts +718 -0
- package/dist/index.js +1434 -0
- package/dist/index.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/env.ts","../src/core/errors.ts","../src/version.ts","../src/core/request.ts","../src/core/redact.ts","../src/core/sse.ts","../src/lib/chat-stream.ts","../src/core/uploads.ts","../src/resources/chat.ts","../src/core/camelize.ts","../src/core/idempotency.ts","../src/core/pagination.ts","../src/lib/clip.ts","../src/resources/voice.ts","../src/resources/voices.ts","../src/resources/speech.ts","../src/resources/translate.ts","../src/resources/text-to-speech.ts","../src/lib/audio-stream.ts","../src/resources/legacy.ts","../src/client.ts","../src/lib/play.ts","../src/index.ts"],"names":["evt","ADDIS_CHAT_MODEL","cryptoRandom","decodeBase64"],"mappings":"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","file":"index.js","sourcesContent":["// Environment, runtime detection, and security guards.\n\nexport const DEFAULT_BASE_URL = \"https://api.addisassistant.com\";\nexport const API_KEY_ENV_VAR = \"ADDIS_API_KEY\";\n\n/** Read an environment variable across Node / Deno / Bun without crashing. */\nexport function readEnv(name: string): string | undefined {\n // Node / Bun\n if (typeof process !== \"undefined\" && process.env && name in process.env) {\n const value = process.env[name];\n return value == null || value === \"\" ? undefined : value;\n }\n // Deno\n const deno = (globalThis as any).Deno;\n if (deno?.env?.get) {\n try {\n const value = deno.env.get(name);\n return value ? value : undefined;\n } catch {\n // permission denied — treat as unset\n return undefined;\n }\n }\n return undefined;\n}\n\n/** True when we appear to be running inside a browser-like environment. */\nexport function isBrowserLike(): boolean {\n return (\n typeof (globalThis as any).window !== \"undefined\" &&\n typeof (globalThis as any).document !== \"undefined\"\n );\n}\n\nconst BLOCKED_HOST_SUFFIXES = [\".supabase.co\", \".supabase.in\"];\n\n/**\n * Validate and normalize the base URL.\n *\n * The SDK must only ever talk to the Cloudflare-wrapped API. Pointing it at a\n * raw Supabase Functions/Storage host is rejected, and plain http:// is refused\n * except for localhost (local testing).\n */\nexport function resolveBaseURL(baseURL: string | undefined): string {\n const raw = (baseURL ?? DEFAULT_BASE_URL).trim().replace(/\\/+$/, \"\");\n let url: URL;\n try {\n url = new URL(raw);\n } catch {\n throw new Error(`addisai: invalid baseURL \"${raw}\".`);\n }\n\n const host = url.hostname.toLowerCase();\n const isLocal = host === \"localhost\" || host === \"127.0.0.1\";\n\n if (url.protocol !== \"https:\" && !isLocal) {\n throw new Error(\n `addisai: baseURL must use https (got \"${url.protocol}//${host}\").`,\n );\n }\n\n if (BLOCKED_HOST_SUFFIXES.some((suffix) => host.endsWith(suffix))) {\n throw new Error(\n \"addisai: pointing the SDK at a raw *.supabase.co host is not allowed. \" +\n `Use the Addis AI API at ${DEFAULT_BASE_URL}.`,\n );\n }\n\n return raw;\n}\n\n/** Runtime descriptor used in the User-Agent header (no sensitive data). */\nexport function detectRuntime(): string {\n const g = globalThis as any;\n if (g.Deno?.version?.deno) return `Deno/${g.Deno.version.deno}`;\n if (g.Bun?.version) return `Bun/${g.Bun.version}`;\n if (typeof process !== \"undefined\" && process.versions?.node) {\n return `Node/${process.versions.node}`;\n }\n if (isBrowserLike()) return \"Browser\";\n return \"Unknown\";\n}\n","// Unified error hierarchy. Normalizes the three backend error envelope shapes:\n// 1. Voice routes: { error: { code, message, details } } + semantic HTTP\n// 2. Native routes: { status: \"error\", error: { code, message } }\n// 3. OpenAI route: { error: { message, type, param, code } }\n\nexport interface ErrorDetail {\n field?: string;\n code?: string;\n message?: string;\n}\n\nexport class AddisAIError extends Error {\n constructor(message: string) {\n super(message);\n this.name = new.target.name;\n // Restore prototype chain for transpiled targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when a capability exists in the SDK surface but is not yet enabled. */\nexport class NotSupportedError extends AddisAIError {}\n\n/** Network-level failure (DNS, TLS, socket, fetch rejection). */\nexport class APIConnectionError extends AddisAIError {\n readonly cause?: unknown;\n constructor(message = \"Connection error.\", cause?: unknown) {\n super(message);\n this.cause = cause;\n }\n}\n\n/** Request exceeded the configured timeout / was aborted by timeout. */\nexport class APIConnectionTimeoutError extends APIConnectionError {\n constructor(message = \"Request timed out.\") {\n super(message);\n }\n}\n\n/** Any non-2xx HTTP response. */\nexport class APIError extends AddisAIError {\n readonly status: number;\n readonly code: string | null;\n readonly details: ErrorDetail[];\n readonly requestId: string | null;\n readonly headers: Record<string, string>;\n\n constructor(\n status: number,\n message: string,\n opts: {\n code?: string | null;\n details?: ErrorDetail[];\n requestId?: string | null;\n headers?: Record<string, string>;\n } = {},\n ) {\n super(message);\n this.status = status;\n this.code = opts.code ?? null;\n this.details = opts.details ?? [];\n this.requestId = opts.requestId ?? null;\n this.headers = opts.headers ?? {};\n }\n}\n\nexport class BadRequestError extends APIError {} // 400\nexport class AuthenticationError extends APIError {} // 401\nexport class InsufficientCreditsError extends APIError { // 402\n get availableBalance(): number | null {\n return numericDetail(this, \"balance_too_low\") ?? null;\n }\n}\nexport class PermissionDeniedError extends APIError {} // 403\nexport class NotFoundError extends APIError {} // 404\nexport class ConflictError extends APIError {} // 409\nexport class IdempotencyConflictError extends ConflictError {} // 409 IDEMPOTENCY_CONFLICT\nexport class GenerationInProgressError extends ConflictError { // 409 GENERATION_IN_PROGRESS\n get retryAfter(): number | null {\n return headerNumber(this.headers, \"retry-after\");\n }\n}\nexport class UnprocessableEntityError extends APIError {} // 422\nexport class RateLimitError extends APIError { // 429\n get retryAfter(): number | null {\n return headerNumber(this.headers, \"retry-after\");\n }\n get limit(): number | null {\n return headerNumber(this.headers, \"x-ratelimit-limit\");\n }\n get remaining(): number | null {\n return headerNumber(this.headers, \"x-ratelimit-remaining\");\n }\n get reset(): number | null {\n return headerNumber(this.headers, \"x-ratelimit-reset\");\n }\n}\nexport class InternalServerError extends APIError {} // >= 500\n\nfunction headerNumber(headers: Record<string, string>, name: string): number | null {\n const raw = headers[name.toLowerCase()];\n if (!raw) return null;\n const n = Number(raw);\n return Number.isFinite(n) ? n : null;\n}\n\nfunction numericDetail(err: APIError, code: string): number | null {\n const detail = err.details.find((d) => d.code === code);\n const match = detail?.message?.match(/([\\d]+(?:\\.\\d+)?)/g);\n if (!match) return null;\n const n = Number(match[match.length - 1]);\n return Number.isFinite(n) ? n : null;\n}\n\ninterface ParsedEnvelope {\n message: string;\n code: string | null;\n details: ErrorDetail[];\n}\n\n/** Pull a normalized { message, code, details } out of any backend body. */\nfunction parseEnvelope(status: number, body: unknown, rawText: string): ParsedEnvelope {\n if (body && typeof body === \"object\") {\n const obj = body as Record<string, any>;\n const err = obj.error;\n if (err && typeof err === \"object\") {\n return {\n message: typeof err.message === \"string\" && err.message\n ? err.message\n : `Request failed with status ${status}.`,\n code: typeof err.code === \"string\"\n ? err.code\n : (typeof err.type === \"string\" ? err.type : null),\n details: Array.isArray(err.details) ? err.details : [],\n };\n }\n if (typeof obj.message === \"string\" && obj.message) {\n return { message: obj.message, code: typeof obj.code === \"string\" ? obj.code : null, details: [] };\n }\n }\n return {\n message: rawText?.slice(0, 500) || `Request failed with status ${status}.`,\n code: null,\n details: [],\n };\n}\n\n/** Build the most specific error class for an HTTP failure. */\nexport function makeAPIError(\n status: number,\n body: unknown,\n rawText: string,\n headers: Record<string, string>,\n): APIError {\n const { message, code, details } = parseEnvelope(status, body, rawText);\n const requestId = headers[\"x-request-id\"] ?? headers[\"cf-ray\"] ?? null;\n const opts = { code, details, requestId, headers };\n const upper = (code ?? \"\").toUpperCase();\n\n switch (status) {\n case 400:\n return new BadRequestError(status, message, opts);\n case 401:\n return new AuthenticationError(status, message, opts);\n case 402:\n return new InsufficientCreditsError(status, message, opts);\n case 403:\n return new PermissionDeniedError(status, message, opts);\n case 404:\n return new NotFoundError(status, message, opts);\n case 409:\n if (upper === \"IDEMPOTENCY_CONFLICT\") return new IdempotencyConflictError(status, message, opts);\n if (upper === \"GENERATION_IN_PROGRESS\") return new GenerationInProgressError(status, message, opts);\n return new ConflictError(status, message, opts);\n case 413:\n case 422:\n return new UnprocessableEntityError(status, message, opts);\n case 429:\n return new RateLimitError(status, message, opts);\n default:\n if (status >= 500) return new InternalServerError(status, message, opts);\n return new APIError(status, message, opts);\n }\n}\n","// Kept in sync with package.json on release.\nexport const VERSION = \"0.1.0\";\n","// Core HTTP transport: header assembly, serialization, timeout, abort,\n// automatic retries with backoff, and error normalization.\n\nimport { VERSION } from \"../version.js\";\nimport {\n APIConnectionError,\n APIConnectionTimeoutError,\n APIError,\n makeAPIError,\n} from \"./errors.js\";\nimport { detectRuntime } from \"./env.js\";\n\nexport type FetchLike = typeof fetch;\n\nexport interface TransportConfig {\n apiKey: string;\n baseURL: string;\n timeout: number;\n maxRetries: number;\n defaultHeaders: Record<string, string>;\n defaultQuery: Record<string, string>;\n fetch: FetchLike;\n logLevel: LogLevel;\n}\n\nexport type LogLevel = \"off\" | \"error\" | \"warn\" | \"info\" | \"debug\";\n\n/** Per-request options accepted by every resource method. */\nexport interface RequestOptions {\n timeout?: number;\n maxRetries?: number;\n signal?: AbortSignal;\n idempotencyKey?: string;\n headers?: Record<string, string>;\n query?: Record<string, unknown>;\n}\n\nexport interface InternalRequest {\n method: \"GET\" | \"POST\" | \"DELETE\" | \"PUT\" | \"PATCH\" | \"HEAD\";\n path: string;\n query?: Record<string, unknown>;\n /** JSON body (mutually exclusive with `form`). */\n body?: unknown;\n /** multipart/form-data body (mutually exclusive with `body`). */\n form?: FormData;\n /** Return the raw Response (for streaming or binary) instead of parsed JSON. */\n raw?: boolean;\n /** Minimum effective timeout in ms (e.g. paid synthesis budget). */\n timeoutFloor?: number;\n}\n\nconst LOG_ORDER: Record<LogLevel, number> = {\n off: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n};\n\nexport class Transport {\n constructor(private readonly config: TransportConfig) {}\n\n /** The configured fetch implementation, for direct asset downloads. */\n get fetch(): FetchLike {\n return this.config.fetch;\n }\n\n private log(level: Exclude<LogLevel, \"off\">, ...args: unknown[]): void {\n if (LOG_ORDER[this.config.logLevel] >= LOG_ORDER[level]) {\n // eslint-disable-next-line no-console\n (console as any)[level === \"debug\" ? \"log\" : level](\"[addisai]\", ...args);\n }\n }\n\n private buildURL(path: string, query?: Record<string, unknown>): string {\n const url = new URL(this.config.baseURL + path);\n const merged = { ...this.config.defaultQuery, ...(query ?? {}) };\n for (const [key, value] of Object.entries(merged)) {\n if (value == null) continue;\n url.searchParams.set(key, String(value));\n }\n return url.toString();\n }\n\n private buildHeaders(req: InternalRequest, opts: RequestOptions): Headers {\n const headers = new Headers();\n headers.set(\"Accept\", \"application/json\");\n headers.set(\"User-Agent\", `addisai-node/${VERSION} (${detectRuntime()})`);\n headers.set(\"X-Addis-Client\", `addisai-node/${VERSION}`);\n // Auth: API keys go in x-api-key. A Supabase JWT goes in Authorization.\n // Never send both — the voice function rejects a non-JWT bearer token.\n if (looksLikeJwt(this.config.apiKey)) {\n headers.set(\"Authorization\", `Bearer ${this.config.apiKey}`);\n } else {\n headers.set(\"x-api-key\", this.config.apiKey);\n }\n\n for (const [k, v] of Object.entries(this.config.defaultHeaders)) headers.set(k, v);\n for (const [k, v] of Object.entries(opts.headers ?? {})) headers.set(k, v);\n\n if (opts.idempotencyKey) headers.set(\"Idempotency-Key\", opts.idempotencyKey);\n if (req.body !== undefined && !req.form) headers.set(\"Content-Type\", \"application/json\");\n return headers;\n }\n\n private isRetryable(status: number, headers: Headers): boolean {\n if (status === 408 || status === 425 || status === 429) return true;\n // 409 is only retried when the server tells us to (GENERATION_IN_PROGRESS),\n // never for IDEMPOTENCY_CONFLICT.\n if (status === 409) return headers.has(\"retry-after\");\n return status >= 500;\n }\n\n private retryDelayMs(attempt: number, headers: Headers): number {\n const retryAfter = headers.get(\"retry-after\");\n if (retryAfter) {\n const seconds = Number(retryAfter);\n if (Number.isFinite(seconds)) return Math.min(seconds * 1000, 60_000);\n }\n const base = Math.min(500 * 2 ** attempt, 8_000);\n return base * (0.5 + Math.random() * 0.5); // jitter 50–100%\n }\n\n async request<T>(req: InternalRequest, opts: RequestOptions = {}): Promise<T> {\n const maxRetries = opts.maxRetries ?? this.config.maxRetries;\n let timeout = opts.timeout ?? this.config.timeout;\n if (req.timeoutFloor && timeout < req.timeoutFloor && opts.timeout === undefined) {\n timeout = req.timeoutFloor;\n }\n\n const url = this.buildURL(req.path, { ...req.query, ...opts.query });\n const headers = this.buildHeaders(req, opts);\n const bodyInit: BodyInit | undefined = req.form\n ? req.form\n : req.body !== undefined\n ? JSON.stringify(req.body)\n : undefined;\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const controller = new AbortController();\n const onAbort = () => controller.abort((opts.signal as any)?.reason);\n if (opts.signal) {\n if (opts.signal.aborted) controller.abort((opts.signal as any).reason);\n else opts.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n const timer = setTimeout(() => controller.abort(new DOMExceptionLike(\"timeout\")), timeout);\n\n let response: Response;\n try {\n this.log(\"debug\", `${req.method} ${url} (attempt ${attempt + 1}/${maxRetries + 1})`);\n response = await this.config.fetch(url, {\n method: req.method,\n headers,\n body: bodyInit,\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n opts.signal?.removeEventListener(\"abort\", onAbort);\n // Distinguish user-abort, timeout, and network failure.\n if (opts.signal?.aborted) throw err;\n const timedOut = isAbortError(err);\n lastError = timedOut\n ? new APIConnectionTimeoutError(`Request timed out after ${timeout}ms.`)\n : new APIConnectionError(\"Connection error.\", err);\n if (attempt < maxRetries) {\n await sleep(this.retryDelayMs(attempt, new Headers()));\n continue;\n }\n throw lastError;\n } finally {\n clearTimeout(timer);\n opts.signal?.removeEventListener(\"abort\", onAbort);\n }\n\n if (response.ok) {\n if (req.raw) return response as unknown as T;\n return (await this.parseJSON(response)) as T;\n }\n\n // Non-2xx: decide whether to retry.\n if (attempt < maxRetries && this.isRetryable(response.status, response.headers)) {\n const delay = this.retryDelayMs(attempt, response.headers);\n this.log(\"warn\", `Retrying after ${Math.round(delay)}ms (status ${response.status}).`);\n await sleep(delay);\n continue;\n }\n throw await this.toError(response);\n }\n throw lastError instanceof Error ? lastError : new APIConnectionError();\n }\n\n /**\n * Open a streaming request: a single fetch (streams are not retried once\n * started), with the timeout guarding only the initial response. The returned\n * controller stays live so the caller can cancel the body mid-stream.\n */\n async openStream(\n req: InternalRequest,\n opts: RequestOptions = {},\n ): Promise<{ response: Response; controller: AbortController }> {\n const controller = new AbortController();\n if (opts.signal) {\n if (opts.signal.aborted) controller.abort((opts.signal as any).reason);\n else opts.signal.addEventListener(\"abort\", () => controller.abort((opts.signal as any)?.reason), { once: true });\n }\n\n const timeout = opts.timeout ?? this.config.timeout;\n const url = this.buildURL(req.path, { ...req.query, ...opts.query });\n const headers = this.buildHeaders(req, opts);\n const bodyInit: BodyInit | undefined = req.form\n ? req.form\n : req.body !== undefined\n ? JSON.stringify(req.body)\n : undefined;\n\n const timer = setTimeout(() => controller.abort(new DOMExceptionLike(\"timeout\")), timeout);\n let response: Response;\n try {\n response = await this.config.fetch(url, {\n method: req.method,\n headers,\n body: bodyInit,\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n if (opts.signal?.aborted) throw err;\n throw isAbortError(err)\n ? new APIConnectionTimeoutError(`Request timed out after ${timeout}ms.`)\n : new APIConnectionError(\"Connection error.\", err);\n }\n clearTimeout(timer); // body cancellation now goes through `controller`\n if (!response.ok) throw await this.toError(response);\n return { response, controller };\n }\n\n private async parseJSON(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) return {};\n try {\n return JSON.parse(text);\n } catch {\n return { raw: text };\n }\n }\n\n private async toError(response: Response): Promise<APIError> {\n const text = await response.text().catch(() => \"\");\n let body: unknown = undefined;\n try {\n body = text ? JSON.parse(text) : undefined;\n } catch {\n body = undefined;\n }\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => (headers[key.toLowerCase()] = value));\n return makeAPIError(response.status, body, text, headers);\n }\n}\n\nclass DOMExceptionLike extends Error {\n constructor(public override readonly name: string) {\n super(name);\n }\n}\n\nfunction looksLikeJwt(key: string): boolean {\n return key.startsWith(\"ey\") && key.split(\".\").length === 3;\n}\n\nfunction isAbortError(err: unknown): boolean {\n return (\n err instanceof Error &&\n (err.name === \"AbortError\" || err.name === \"timeout\" || err.name === \"TimeoutError\")\n );\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Native success envelopes wrap the payload as `{ status, data }` or `{ data }`.\n * The OpenAI route returns the payload directly. This unwraps `.data` when\n * present and otherwise returns the body as-is.\n */\nexport function unwrapData<T>(body: unknown): T {\n if (body && typeof body === \"object\" && \"data\" in (body as any)) {\n return (body as any).data as T;\n }\n return body as T;\n}\n","// Secret redaction helpers. API keys and Authorization headers must never be\n// printed in logs, errors, or debug output.\n\nexport function redactApiKey(key: string | undefined | null): string {\n if (!key) return \"(none)\";\n if (key.length <= 8) return \"••••\";\n return `${key.slice(0, 4)}••••${key.slice(-2)}`;\n}\n\nconst SENSITIVE_HEADERS = new Set([\"authorization\", \"x-api-key\", \"apikey\", \"cookie\"]);\n\n/** Return a copy of headers with sensitive values masked, for safe logging. */\nexport function redactHeaders(headers: Headers | Record<string, string>): Record<string, string> {\n const out: Record<string, string> = {};\n const entries =\n headers instanceof Headers ? headers.entries() : Object.entries(headers);\n for (const [name, value] of entries as Iterable<[string, string]>) {\n out[name] = SENSITIVE_HEADERS.has(name.toLowerCase()) ? \"••••\" : value;\n }\n return out;\n}\n","// Server-Sent Events parser. Accumulates `event:` / `data:` fields into events\n// terminated by a blank line, and yields { event, data } blocks. Robust to\n// chunk boundaries that split mid-line or mid-event.\n\nexport interface SSEEvent {\n event: string | null;\n data: string;\n}\n\nexport async function* parseSSE(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<SSEEvent, void, unknown> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let eventName: string | null = null;\n let dataLines: string[] = [];\n\n const flush = (): SSEEvent | null => {\n if (dataLines.length === 0 && eventName === null) return null;\n const evt: SSEEvent = { event: eventName, data: dataLines.join(\"\\n\") };\n eventName = null;\n dataLines = [];\n return evt;\n };\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 let nl: number;\n while ((nl = buffer.indexOf(\"\\n\")) >= 0) {\n let line = buffer.slice(0, nl);\n buffer = buffer.slice(nl + 1);\n if (line.endsWith(\"\\r\")) line = line.slice(0, -1);\n\n if (line === \"\") {\n const evt = flush();\n if (evt) yield evt;\n continue;\n }\n if (line.startsWith(\":\")) continue; // comment\n const colon = line.indexOf(\":\");\n const field = colon === -1 ? line : line.slice(0, colon);\n let val = colon === -1 ? \"\" : line.slice(colon + 1);\n if (val.startsWith(\" \")) val = val.slice(1);\n\n if (field === \"event\") eventName = val;\n else if (field === \"data\") dataLines.push(val);\n }\n }\n const evt = flush();\n if (evt) yield evt;\n } finally {\n reader.releaseLock();\n }\n}\n\n/** Parse line-delimited JSON (ndjson). Yields parsed objects. */\nexport async function* parseNDJSON(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<any, void, unknown> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n let nl: number;\n while ((nl = buffer.indexOf(\"\\n\")) >= 0) {\n const line = buffer.slice(0, nl).trim();\n buffer = buffer.slice(nl + 1);\n if (line) yield safeParse(line);\n }\n }\n const tail = buffer.trim();\n if (tail) yield safeParse(tail);\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction safeParse(line: string): any {\n try {\n return JSON.parse(line);\n } catch {\n return undefined;\n }\n}\n","import { AddisAIError } from \"../core/errors.js\";\nimport { parseSSE } from \"../core/sse.js\";\nimport type { ChatCompletion, ChatCompletionChunk, ChatUsage } from \"../resources/chat.js\";\n\nexport const ADDIS_CHAT_MODEL = \"addis-1-alef\";\n\n/**\n * An OpenAI-style streaming chat response. It is async-iterable (`for await`),\n * and provides convenience accumulators and cancellation.\n */\nexport class ChatStream implements AsyncIterable<ChatCompletionChunk> {\n /** Transcription, if the request included audio input. */\n transcription?: { raw?: string; clean?: string };\n\n private readonly id = `chatcmpl-${cryptoRandom()}`;\n private readonly created = Math.floor(Date.now() / 1000);\n private consumed = false;\n private finalUsage: ChatUsage | undefined;\n\n constructor(\n private readonly response: Response,\n private readonly controller?: AbortController,\n ) {}\n\n /** Cancel the stream and underlying request. */\n abort(): void {\n this.controller?.abort();\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<ChatCompletionChunk> {\n if (this.consumed) {\n throw new AddisAIError(\"This stream has already been consumed.\");\n }\n this.consumed = true;\n if (!this.response.body) return;\n\n for await (const evt of parseSSE(this.response.body)) {\n const raw = evt.data.trim();\n if (!raw || raw === \"[DONE]\") {\n if (raw === \"[DONE]\") return;\n continue;\n }\n let payload: any;\n try {\n payload = JSON.parse(raw);\n } catch {\n continue;\n }\n\n if (payload.type === \"metadata\") {\n this.transcription = {\n raw: payload.transcription_raw,\n clean: payload.transcription_clean,\n };\n continue;\n }\n\n const usage = payload.usage_metadata;\n if (usage) {\n this.finalUsage = {\n prompt_tokens: usage.prompt_token_count ?? usage.promptTokenCount ?? 0,\n completion_tokens: usage.candidates_token_count ?? usage.candidatesTokenCount ?? 0,\n total_tokens: usage.total_token_count ?? usage.totalTokenCount ?? 0,\n };\n }\n\n const content: string = payload.text ?? payload.response_text ?? payload.delta?.content ?? \"\";\n const finishReason = payload.finish_reason ?? (payload.is_last_chunk ? \"stop\" : null);\n if (!content && !finishReason) continue;\n\n yield {\n id: this.id,\n object: \"chat.completion.chunk\",\n created: this.created,\n model: ADDIS_CHAT_MODEL,\n choices: [{ index: 0, delta: { content }, finish_reason: normalizeFinish(finishReason) }],\n };\n }\n }\n\n /** Consume the stream and return the concatenated assistant text. */\n async finalText(): Promise<string> {\n let text = \"\";\n for await (const chunk of this) text += chunk.choices[0]?.delta?.content ?? \"\";\n return text;\n }\n\n /** Consume the stream and return an assembled non-streaming completion. */\n async finalCompletion(): Promise<ChatCompletion> {\n let content = \"\";\n let finishReason: string | null = \"stop\";\n for await (const chunk of this) {\n content += chunk.choices[0]?.delta?.content ?? \"\";\n if (chunk.choices[0]?.finish_reason) finishReason = chunk.choices[0].finish_reason;\n }\n const completion: ChatCompletion = {\n id: this.id,\n object: \"chat.completion\",\n created: this.created,\n model: ADDIS_CHAT_MODEL,\n choices: [{ index: 0, message: { role: \"assistant\", content }, finish_reason: finishReason }],\n usage: this.finalUsage,\n };\n if (this.transcription) completion.transcription = this.transcription;\n return completion;\n }\n\n /** Re-encode the stream as a byte ReadableStream of SSE chunks (for piping). */\n toReadableStream(): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n const iterator = this[Symbol.asyncIterator]();\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n const { value, done } = await iterator.next();\n if (done) {\n controller.enqueue(encoder.encode(\"data: [DONE]\\n\\n\"));\n controller.close();\n return;\n }\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(value)}\\n\\n`));\n },\n });\n }\n}\n\nfunction normalizeFinish(reason: string | null): string | null {\n if (!reason) return null;\n switch (reason.toUpperCase()) {\n case \"STOP\":\n return \"stop\";\n case \"MAX_TOKENS\":\n return \"length\";\n case \"SAFETY\":\n case \"RECITATION\":\n return \"content_filter\";\n case \"TOOL_CALLS\":\n return \"tool_calls\";\n default:\n return reason.toLowerCase();\n }\n}\n\nfunction cryptoRandom(): string {\n const c = (globalThis as any).crypto;\n if (c?.randomUUID) return c.randomUUID();\n return Math.random().toString(36).slice(2);\n}\n","// File input coercion for multipart/form-data requests (STT, chat attachments).\n\nexport type Uploadable =\n | Blob\n | ArrayBuffer\n | ArrayBufferView\n | FileInput;\n\nexport interface FileInput {\n /** Raw bytes or a Blob. */\n data: Blob | ArrayBuffer | ArrayBufferView;\n /** Filename sent to the API; helps the server infer format. */\n filename?: string;\n /** MIME type, e.g. \"audio/wav\". Strongly recommended. */\n contentType?: string;\n}\n\nfunction isFileInput(value: unknown): value is FileInput {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"data\" in (value as any)\n );\n}\n\n/** Coerce any supported input into a Blob suitable for FormData. */\nexport function toBlob(input: Uploadable, fallbackType = \"application/octet-stream\"): {\n blob: Blob;\n filename: string;\n} {\n if (isFileInput(input)) {\n const type = input.contentType ?? fallbackType;\n const blob = input.data instanceof Blob\n ? (input.contentType ? new Blob([input.data], { type }) : input.data)\n : new Blob([input.data as BlobPart], { type });\n return { blob, filename: input.filename ?? \"file\" };\n }\n if (input instanceof Blob) {\n return { blob: input, filename: (input as File).name || \"file\" };\n }\n return { blob: new Blob([input as BlobPart], { type: fallbackType }), filename: \"file\" };\n}\n\n/**\n * Read a file from disk into a FileInput (Node/Bun/Deno only). Convenience for\n * `audio: await fileFromPath(\"./call.wav\")`.\n */\nexport async function fileFromPath(path: string, contentType?: string): Promise<FileInput> {\n // Lazy import so the SDK stays runtime-agnostic and browser-safe.\n const fs = await import(\"node:fs/promises\");\n const data = await fs.readFile(path);\n const filename = path.split(/[\\\\/]/).pop() || \"file\";\n return {\n data: new Uint8Array(data),\n filename,\n contentType: contentType ?? guessContentType(filename),\n };\n}\n\nfunction guessContentType(filename: string): string | undefined {\n const ext = filename.toLowerCase().split(\".\").pop();\n switch (ext) {\n case \"wav\": return \"audio/wav\";\n case \"mp3\": return \"audio/mpeg\";\n case \"m4a\": return \"audio/m4a\";\n case \"mp4\": return \"audio/mp4\";\n case \"ogg\": return \"audio/ogg\";\n case \"webm\": return \"audio/webm\";\n case \"flac\": return \"audio/flac\";\n case \"png\": return \"image/png\";\n case \"jpg\":\n case \"jpeg\": return \"image/jpeg\";\n case \"pdf\": return \"application/pdf\";\n default: return undefined;\n }\n}\n","import { AddisAIError } from \"../core/errors.js\";\nimport { type RequestOptions, type Transport } from \"../core/request.js\";\nimport { ChatStream } from \"../lib/chat-stream.js\";\nimport { toBlob, type Uploadable } from \"../core/uploads.js\";\nimport type { Language } from \"./shared.js\";\n\n/** Public model identifier surfaced to developers. Never the underlying model. */\nexport const ADDIS_CHAT_MODEL = \"addis-1-alef\";\n\nexport type ChatRole = \"system\" | \"developer\" | \"user\" | \"assistant\" | \"tool\";\n\nexport interface ToolCall {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n /** Opaque provider state. Managed by the SDK; echo it back unchanged. */\n addis_tool_state?: string;\n}\n\nexport interface ChatCompletionMessage {\n role: ChatRole;\n content?: string | null;\n name?: string;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n}\n\nexport interface FunctionTool {\n type: \"function\";\n function: {\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n };\n}\n\n/** A tool whose implementation the SDK will execute during `chat.runTools`. */\nexport interface RunnableTool {\n type: \"function\";\n function: {\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n /** Local implementation invoked with the parsed arguments. */\n function: (args: any) => unknown | Promise<unknown>;\n };\n}\n\nexport type ToolChoice =\n | \"auto\"\n | \"none\"\n | \"required\"\n | { type: \"function\"; function: { name: string } };\n\nexport interface ChatAttachment {\n /** A field name used for the multipart upload (defaults to \"attachment_N\"). */\n name?: string;\n file: Uploadable;\n}\n\nexport interface ChatCompletionCreateParams {\n /** Accepted for OpenAI compatibility. Addis selects the model internally. */\n model?: string;\n messages: ChatCompletionMessage[];\n /** Target language. \"am\" (Amharic) or \"om\" (Afan Oromo). Default \"am\". */\n language?: Language;\n /** Extra behaviour instructions (tone/format). Does not change identity. */\n system?: string;\n /** Replaces the assistant identity for branded apps. */\n persona?: string;\n temperature?: number;\n max_tokens?: number;\n tools?: FunctionTool[];\n tool_choice?: ToolChoice;\n /** Beta: stream tokens. Not available with tools. */\n stream?: boolean;\n /** Files/images/documents to attach to the final user message. */\n attachments?: ChatAttachment[];\n /** Audio voice-command input; transcribed server-side. */\n audio?: Uploadable;\n}\n\nexport interface ChatUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n}\n\nexport interface ChatCompletionChoice {\n index: number;\n message: ChatCompletionMessage;\n finish_reason: string | null;\n}\n\nexport interface ChatCompletion {\n id: string;\n object: \"chat.completion\";\n created: number;\n model: string;\n choices: ChatCompletionChoice[];\n usage?: ChatUsage;\n /** Present when audio input was transcribed. */\n transcription?: { raw?: string; clean?: string };\n /** Uploaded attachment URIs to reuse in later turns. */\n uploaded_attachments?: { fileUri: string; mimeType: string }[];\n}\n\nexport interface ChatCompletionChunk {\n id: string;\n object: \"chat.completion.chunk\";\n created: number;\n model: string;\n choices: Array<{\n index: number;\n delta: { role?: \"assistant\"; content?: string };\n finish_reason: string | null;\n }>;\n}\n\nexport class Chat {\n readonly completions: Completions;\n\n constructor(private readonly transport: Transport) {\n this.completions = new Completions(transport);\n }\n\n /**\n * Run an automatic tool-calling loop: the model requests tools, the SDK\n * executes your local implementations, feeds results back, and repeats until\n * the model produces a final answer.\n */\n async runTools(\n params: Omit<ChatCompletionCreateParams, \"tools\" | \"stream\"> & {\n tools: RunnableTool[];\n maxToolRoundtrips?: number;\n },\n opts?: RequestOptions,\n ): Promise<ChatCompletion> {\n const { maxToolRoundtrips = 5, tools, ...rest } = params;\n const impls = new Map<string, (args: any) => unknown | Promise<unknown>>();\n const wireTools: FunctionTool[] = tools.map((t) => {\n impls.set(t.function.name, t.function.function);\n return { type: \"function\", function: { name: t.function.name, description: t.function.description, parameters: t.function.parameters } };\n });\n\n const messages: ChatCompletionMessage[] = [...rest.messages];\n for (let i = 0; i <= maxToolRoundtrips; i++) {\n const completion = await this.completions.create(\n { ...rest, messages, tools: wireTools, stream: false },\n opts,\n );\n const choice = completion.choices[0];\n const calls = choice?.message.tool_calls ?? [];\n if (!calls.length || choice?.finish_reason !== \"tool_calls\") {\n return completion;\n }\n if (i === maxToolRoundtrips) {\n throw new AddisAIError(\n `runTools exceeded maxToolRoundtrips (${maxToolRoundtrips}) without a final answer.`,\n );\n }\n messages.push(choice!.message);\n for (const call of calls) {\n const impl = impls.get(call.function.name);\n if (!impl) {\n throw new AddisAIError(`No implementation provided for tool \"${call.function.name}\".`);\n }\n let args: unknown = {};\n try {\n args = call.function.arguments ? JSON.parse(call.function.arguments) : {};\n } catch {\n // pass raw string if not JSON\n args = call.function.arguments;\n }\n const result = await impl(args);\n messages.push({\n role: \"tool\",\n tool_call_id: call.id,\n name: call.function.name,\n content: typeof result === \"string\" ? result : JSON.stringify(result),\n });\n }\n }\n // Unreachable, but satisfies the type checker.\n throw new AddisAIError(\"runTools terminated unexpectedly.\");\n }\n}\n\nclass Completions {\n constructor(private readonly transport: Transport) {}\n\n create(params: ChatCompletionCreateParams & { stream: true }, opts?: RequestOptions): Promise<ChatStream>;\n create(params: ChatCompletionCreateParams & { stream?: false }, opts?: RequestOptions): Promise<ChatCompletion>;\n async create(\n params: ChatCompletionCreateParams,\n opts: RequestOptions = {},\n ): Promise<ChatCompletion | ChatStream> {\n const hasTools = Boolean(params.tools?.length) || params.messages.some((m) => m.role === \"tool\" || m.tool_calls);\n const language = params.language ?? \"am\";\n\n if (params.stream) {\n if (hasTools) {\n throw new AddisAIError(\"Streaming is not supported with tool calling. Use non-streaming mode for tools.\");\n }\n return this.createStream(params, language, opts);\n }\n\n if (params.attachments?.length || params.audio) {\n return this.createMultipart(params, language, opts);\n }\n\n // The model is selected by the backend and is intentionally not forwarded:\n // an arbitrary id would break generation and could leak the underlying model.\n const envelope = await this.transport.request<{ status?: string; data: NativeChatData }>(\n { method: \"POST\", path: \"/api/v1/chat_generate\", body: buildNativeBody(params, language) },\n opts,\n );\n return nativeToOpenAICompletion(envelope.data);\n }\n\n private async createStream(\n params: ChatCompletionCreateParams,\n language: Language,\n opts: RequestOptions,\n ): Promise<ChatStream> {\n const { response, controller } = await this.transport.openStream(\n { method: \"POST\", path: \"/api/v1/chat_generate\", body: buildNativeBody(params, language, { stream: true }) },\n opts,\n );\n return new ChatStream(response, controller);\n }\n\n private async createMultipart(\n params: ChatCompletionCreateParams,\n language: Language,\n opts: RequestOptions,\n ): Promise<ChatCompletion> {\n const form = new FormData();\n const attachmentFieldNames: string[] = [];\n (params.attachments ?? []).forEach((att, i) => {\n const field = att.name ?? `attachment_${i}`;\n const { blob, filename } = toBlob(att.file);\n form.append(field, blob, filename);\n attachmentFieldNames.push(field);\n });\n if (params.audio) {\n const { blob, filename } = toBlob(params.audio, \"audio/wav\");\n form.append(\"chat_audio_input\", blob, filename || \"audio.wav\");\n }\n\n const requestData = buildNativeBody(params, language);\n if (attachmentFieldNames.length) requestData.attachment_field_names = attachmentFieldNames;\n\n form.append(\n \"request_data\",\n new Blob([JSON.stringify(requestData)], { type: \"application/json\" }),\n );\n\n const envelope = await this.transport.request<{ status?: string; data: NativeChatData }>(\n { method: \"POST\", path: \"/api/v1/chat_generate\", form },\n opts,\n );\n return nativeToOpenAICompletion(envelope.data);\n }\n}\n\n/**\n * Convert OpenAI-style messages into the backend's native chat request\n * (`prompt` + `conversation_history` + folded `system`). The deployed backend\n * reads `prompt`/`conversation_history`, not a `messages` array.\n */\nfunction buildNativeBody(\n params: ChatCompletionCreateParams,\n language: Language,\n opts: { stream?: boolean } = {},\n): Record<string, unknown> {\n const systemParts: string[] = [];\n if (params.system) systemParts.push(params.system);\n const nonSystem: ChatCompletionMessage[] = [];\n for (const m of params.messages) {\n if (m.role === \"system\" || m.role === \"developer\") {\n if (typeof m.content === \"string\" && m.content.trim()) systemParts.push(m.content);\n } else {\n nonSystem.push(m);\n }\n }\n\n let lastUser = -1;\n for (let i = nonSystem.length - 1; i >= 0; i--) {\n const m = nonSystem[i]!;\n if (m.role === \"user\" && typeof m.content === \"string\" && m.content.trim()) {\n lastUser = i;\n break;\n }\n }\n\n const prompt = lastUser >= 0 ? (nonSystem[lastUser]!.content as string) : undefined;\n const historySource = lastUser >= 0 ? nonSystem.slice(0, lastUser) : nonSystem;\n const conversationHistory = historySource\n .map((m) => ({\n role: m.role === \"assistant\" ? \"assistant\" : m.role === \"tool\" ? \"assistant\" : \"user\",\n content: typeof m.content === \"string\" ? m.content : \"\",\n }))\n .filter((m) => m.content);\n\n const body: Record<string, unknown> = { target_language: language };\n if (prompt !== undefined) body.prompt = prompt;\n if (conversationHistory.length) body.conversation_history = conversationHistory;\n if (systemParts.length) body.system = systemParts.join(\"\\n\\n\");\n if (params.persona) body.persona = params.persona;\n if (params.tools) body.tools = params.tools;\n if (params.tool_choice !== undefined) body.tool_choice = params.tool_choice;\n\n const gen: Record<string, unknown> = {};\n if (params.temperature !== undefined) gen.temperature = params.temperature;\n if (params.max_tokens !== undefined) gen.maxOutputTokens = params.max_tokens;\n if (opts.stream) gen.stream = true;\n if (Object.keys(gen).length) body.generation_config = gen;\n return body;\n}\n\ninterface NativeChatData {\n response_text?: string;\n finish_reason?: string | null;\n usage_metadata?: {\n prompt_token_count?: number;\n candidates_token_count?: number;\n total_token_count?: number;\n } | null;\n tool_calls?: ToolCall[];\n uploaded_attachments?: { fileUri: string; mimeType: string }[];\n transcription_raw?: string;\n transcription_clean?: string;\n}\n\nfunction nativeToOpenAICompletion(data: NativeChatData): ChatCompletion {\n const toolCalls = data.tool_calls?.length ? data.tool_calls : undefined;\n const message: ChatCompletionMessage = toolCalls\n ? { role: \"assistant\", content: data.response_text || null, tool_calls: toolCalls }\n : { role: \"assistant\", content: data.response_text ?? \"\" };\n const completion: ChatCompletion = {\n id: `chatcmpl-${cryptoRandom()}`,\n object: \"chat.completion\",\n created: Math.floor(Date.now() / 1000),\n model: ADDIS_CHAT_MODEL,\n choices: [\n {\n index: 0,\n message,\n finish_reason: toolCalls ? \"tool_calls\" : normalizeFinishReason(data.finish_reason),\n },\n ],\n usage: data.usage_metadata\n ? {\n prompt_tokens: data.usage_metadata.prompt_token_count ?? 0,\n completion_tokens: data.usage_metadata.candidates_token_count ?? 0,\n total_tokens: data.usage_metadata.total_token_count ?? 0,\n }\n : undefined,\n };\n if (data.transcription_raw || data.transcription_clean) {\n completion.transcription = { raw: data.transcription_raw, clean: data.transcription_clean };\n }\n if (data.uploaded_attachments?.length) {\n completion.uploaded_attachments = data.uploaded_attachments;\n }\n return completion;\n}\n\nfunction normalizeFinishReason(reason: unknown): string {\n if (typeof reason !== \"string\" || !reason) return \"stop\";\n switch (reason.toUpperCase()) {\n case \"STOP\":\n return \"stop\";\n case \"MAX_TOKENS\":\n return \"length\";\n case \"SAFETY\":\n case \"RECITATION\":\n return \"content_filter\";\n case \"TOOL_CALLS\":\n return \"tool_calls\";\n default:\n return reason.toLowerCase();\n }\n}\n\nfunction cryptoRandom(): string {\n const c = (globalThis as any).crypto;\n if (c?.randomUUID) return c.randomUUID();\n return Math.random().toString(36).slice(2);\n}\n","// Deep snake_case -> camelCase key conversion for plain response objects.\n\nfunction toCamel(key: string): string {\n return key.replace(/_([a-z0-9])/g, (_, c: string) => c.toUpperCase());\n}\n\nexport function camelize<T = any>(input: unknown): T {\n if (Array.isArray(input)) {\n return input.map((item) => camelize(item)) as unknown as T;\n }\n if (input && typeof input === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(input as Record<string, unknown>)) {\n out[toCamel(key)] = camelize(value);\n }\n return out as T;\n }\n return input as T;\n}\n","// ULID generator (Crockford base32, lexicographically sortable) for idempotency\n// keys on paid mutations. No external dependency.\n\nconst ENCODING = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\"; // Crockford base32\nconst TIME_LEN = 10;\nconst RANDOM_LEN = 16;\n\nfunction randomBytes(n: number): Uint8Array {\n const buf = new Uint8Array(n);\n const c = (globalThis as any).crypto;\n if (c?.getRandomValues) {\n c.getRandomValues(buf);\n return buf;\n }\n // Extremely defensive fallback; supported runtimes all provide WebCrypto.\n for (let i = 0; i < n; i++) buf[i] = Math.floor(Math.random() * 256);\n return buf;\n}\n\nfunction encodeTime(now: number): string {\n let out = \"\";\n for (let i = TIME_LEN - 1; i >= 0; i--) {\n const mod = now % 32;\n out = ENCODING[mod]! + out;\n now = (now - mod) / 32;\n }\n return out;\n}\n\nfunction encodeRandom(): string {\n const bytes = randomBytes(RANDOM_LEN);\n let out = \"\";\n for (let i = 0; i < RANDOM_LEN; i++) {\n out += ENCODING[bytes[i]! % 32]!;\n }\n return out;\n}\n\n/** Generate a new ULID, e.g. \"01JZ900QK3GZTY2VJ9ZQ5A96M5\". */\nexport function ulid(): string {\n return encodeTime(Date.now()) + encodeRandom();\n}\n","// Cursor-based auto-pagination. Returned objects are async-iterable so callers\n// can `for await (const item of client.voice.clips.list())` across all pages,\n// while still exposing the current page and cursor.\n\nexport interface Page<T> {\n data: T[];\n nextCursor: string | null;\n limit: number | null;\n}\n\nexport class CursorPage<T> implements AsyncIterable<T> {\n constructor(\n private readonly firstPage: Page<T>,\n private readonly fetchPage: (cursor: string) => Promise<Page<T>>,\n ) {}\n\n /** Items on the first page only. */\n get data(): T[] {\n return this.firstPage.data;\n }\n\n get nextCursor(): string | null {\n return this.firstPage.nextCursor;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n let page = this.firstPage;\n while (true) {\n for (const item of page.data) yield item;\n if (!page.nextCursor) return;\n page = await this.fetchPage(page.nextCursor);\n }\n }\n}\n\n/**\n * A pending page that is BOTH awaitable (`await list()` → CursorPage) and\n * async-iterable (`for await (const item of list())` → items across all pages).\n * Lets `list()` be used either way without the caller needing to await first.\n */\nexport class CursorPagePromise<T> implements PromiseLike<CursorPage<T>>, AsyncIterable<T> {\n private promise?: Promise<CursorPage<T>>;\n constructor(private readonly load: () => Promise<CursorPage<T>>) {}\n\n private get inner(): Promise<CursorPage<T>> {\n return (this.promise ??= this.load());\n }\n\n then<TResult1 = CursorPage<T>, TResult2 = never>(\n onfulfilled?: ((value: CursorPage<T>) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return this.inner.then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null,\n ): Promise<CursorPage<T> | TResult> {\n return this.inner.catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<CursorPage<T>> {\n return this.inner.finally(onfinally);\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n const page = await this.inner;\n yield* page;\n }\n}\n","import { AddisAIError } from \"../core/errors.js\";\nimport type { FetchLike } from \"../core/request.js\";\nimport type { Language, OutputFormat } from \"../resources/shared.js\";\n\nexport interface ClipUsage {\n pricingUnit: \"character\";\n pricePer1000Characters: number;\n creditsUsed: number | null;\n creditsRemaining: number | null;\n currency: string;\n}\n\nexport interface ClipMeta {\n /** Voice settings the request sent that the engine did not apply. */\n ignoredVoiceSettings: string[];\n /** True when this result was replayed from a prior identical request (no new billing). */\n idempotentReplay: boolean;\n}\n\nexport interface ClipData {\n id: string;\n text: string;\n textPreview: string;\n voiceId: string;\n voiceName: string;\n voiceDescriptor: string;\n language: Language;\n outputFormat: OutputFormat;\n audioUrl: string;\n mimeType: string;\n durationSeconds: number | null;\n characterCount: number;\n billableCharacters: number;\n downloadName: string;\n createdAt: string;\n usage?: ClipUsage;\n meta?: ClipMeta;\n /** The idempotency key used for this generation. */\n clientRequestId?: string;\n}\n\n/**\n * A generated audio clip. Exposes the signed playback URL plus convenience\n * helpers to fetch the bytes or write them to disk.\n */\nexport class AddisClip implements ClipData {\n readonly id!: string;\n readonly text!: string;\n readonly textPreview!: string;\n readonly voiceId!: string;\n readonly voiceName!: string;\n readonly voiceDescriptor!: string;\n readonly language!: Language;\n readonly outputFormat!: OutputFormat;\n readonly audioUrl!: string;\n readonly mimeType!: string;\n readonly durationSeconds!: number | null;\n readonly characterCount!: number;\n readonly billableCharacters!: number;\n readonly downloadName!: string;\n readonly createdAt!: string;\n readonly usage?: ClipUsage;\n readonly meta?: ClipMeta;\n readonly clientRequestId?: string;\n\n constructor(data: ClipData, private readonly fetchImpl: FetchLike) {\n Object.assign(this, data);\n }\n\n /** Fetch the audio bytes from the signed playback URL. */\n async arrayBuffer(): Promise<ArrayBuffer> {\n if (!this.audioUrl) throw new AddisAIError(\"This clip has no audioUrl to download.\");\n const res = await this.fetchImpl(this.audioUrl);\n if (!res.ok) {\n throw new AddisAIError(`Failed to download clip ${this.id}: HTTP ${res.status}.`);\n }\n return res.arrayBuffer();\n }\n\n /** Write the audio to a file on disk (Node/Bun/Deno). */\n async toFile(path: string): Promise<void> {\n const buffer = await this.arrayBuffer();\n const fs = await import(\"node:fs/promises\");\n await fs.writeFile(path, Buffer.from(buffer));\n }\n}\n","import { camelize } from \"../core/camelize.js\";\nimport { ulid } from \"../core/idempotency.js\";\nimport { NotSupportedError } from \"../core/errors.js\";\nimport { CursorPage, CursorPagePromise, type Page } from \"../core/pagination.js\";\nimport { type RequestOptions, type Transport, unwrapData } from \"../core/request.js\";\nimport { AddisClip, type ClipData } from \"../lib/clip.js\";\nimport type { AudioStream } from \"../lib/audio-stream.js\";\nimport type { Language, OutputFormat } from \"./shared.js\";\n\n/** ElevenLabs-style voice controls, expressed on a 0–100 scale. */\nexport interface VoiceSettings {\n speed?: number;\n stability?: number;\n similarity?: number;\n style?: number;\n}\n\nexport interface VoiceGenerateParams {\n voiceId: string;\n text: string;\n language: Language;\n /** Default \"mp3_44100\". */\n outputFormat?: OutputFormat;\n voiceSettings?: VoiceSettings;\n /**\n * Idempotency key. Auto-generated if omitted and reused across retries so a\n * retried request is never billed twice. Reusing a key with changed inputs\n * raises IdempotencyConflictError.\n */\n clientRequestId?: string;\n}\n\nexport interface VoiceEstimateParams {\n voiceId: string;\n text: string;\n language: Language;\n outputFormat?: OutputFormat;\n}\n\nexport interface VoiceEstimate {\n characterCount: number;\n billableCharacters: number;\n pricingUnit: \"character\";\n pricePer1000Characters: number;\n estimatedCost: number;\n currency: string;\n currentBalance: number;\n estimatedBalanceAfter: number;\n canGenerate: boolean;\n}\n\nexport interface VoiceUsage {\n walletId: string;\n balance: number;\n formattedBalance: string;\n currency: string;\n lastDeductionAt: string | null;\n totalSpend: number;\n formattedTotalSpend: string;\n maxTtsCharacters: number;\n pricing: {\n unit: string;\n pricePer1000Characters: number;\n minimumCharge: number;\n currency: string;\n };\n budget: unknown | null;\n}\n\nexport interface ClipListParams {\n limit?: number;\n cursor?: string;\n language?: Language;\n voiceId?: string;\n}\n\nconst VOICE_TIMEOUT_FLOOR_MS = 95_000;\n\nexport class Voice {\n readonly clips: Clips;\n\n constructor(private readonly transport: Transport) {\n this.clips = new Clips(transport);\n }\n\n /** Synthesize speech and return the generated clip. */\n async generate(params: VoiceGenerateParams, opts: RequestOptions = {}): Promise<AddisClip> {\n const clientRequestId = params.clientRequestId ?? ulid();\n const body = {\n text: params.text,\n language: params.language,\n voice_id: params.voiceId,\n output_format: params.outputFormat ?? \"mp3_44100\",\n voice_settings: params.voiceSettings,\n stream: false,\n client_request_id: clientRequestId,\n };\n const data = unwrapData<Record<string, unknown>>(\n await this.transport.request(\n { method: \"POST\", path: \"/api/v1/voice/generations\", body, timeoutFloor: VOICE_TIMEOUT_FLOOR_MS },\n opts,\n ),\n );\n return new AddisClip({ ...mapClip(data), clientRequestId }, this.transport.fetch);\n }\n\n /**\n * Streaming synthesis. The surface is stable for when the API enables it;\n * until then it raises NotSupportedError. Use {@link Voice.generate} today.\n */\n async stream(_params: VoiceGenerateParams, _opts?: RequestOptions): Promise<AudioStream> {\n throw new NotSupportedError(\n \"Streaming voice synthesis is not yet available. Use voice.generate().\",\n );\n }\n\n /** Pre-flight cost estimate (and whether the wallet can cover it). */\n async estimate(params: VoiceEstimateParams, opts: RequestOptions = {}): Promise<VoiceEstimate> {\n const body = {\n text: params.text,\n language: params.language,\n voice_id: params.voiceId,\n output_format: params.outputFormat ?? \"mp3_44100\",\n };\n const data = unwrapData(\n await this.transport.request({ method: \"POST\", path: \"/api/v1/voice/estimate\", body }, opts),\n );\n return camelize<VoiceEstimate>(data);\n }\n\n /** Wallet balance and pricing for voice generation. */\n async usage(opts: RequestOptions = {}): Promise<VoiceUsage> {\n const data = unwrapData(\n await this.transport.request({ method: \"GET\", path: \"/api/v1/voice/usage\" }, opts),\n );\n return camelize<VoiceUsage>(data);\n }\n}\n\nexport class Clips {\n constructor(private readonly transport: Transport) {}\n\n /**\n * List generated clips. The returned value is both awaitable\n * (`const page = await clips.list()`) and async-iterable\n * (`for await (const clip of clips.list())` walks every page).\n */\n list(params: ClipListParams = {}, opts: RequestOptions = {}): CursorPagePromise<AddisClip> {\n const fetchPage = async (cursor?: string): Promise<Page<AddisClip>> => {\n const query: Record<string, unknown> = {\n limit: params.limit,\n cursor,\n language: params.language,\n voice_id: params.voiceId,\n };\n const body = await this.transport.request<{ data: Record<string, unknown>[]; meta?: { next_cursor?: string | null; limit?: number } }>(\n { method: \"GET\", path: \"/api/v1/voice/clips\", query },\n opts,\n );\n return {\n data: (body.data ?? []).map((c) => new AddisClip(mapClip(c), this.transport.fetch)),\n nextCursor: body.meta?.next_cursor ?? null,\n limit: body.meta?.limit ?? null,\n };\n };\n return new CursorPagePromise(async () => {\n const first = await fetchPage(params.cursor);\n return new CursorPage(first, (cursor) => fetchPage(cursor));\n });\n }\n\n /** Fetch one clip by ID. */\n async get(clipId: string, opts: RequestOptions = {}): Promise<AddisClip> {\n const data = unwrapData<Record<string, unknown>>(\n await this.transport.request({ method: \"GET\", path: `/api/v1/voice/clips/${encodeURIComponent(clipId)}` }, opts),\n );\n return new AddisClip(mapClip(data), this.transport.fetch);\n }\n\n /** Download the audio bytes for a clip. */\n async download(clipId: string, opts: RequestOptions = {}): Promise<ArrayBuffer> {\n const clip = await this.get(clipId, opts);\n return clip.arrayBuffer();\n }\n\n /** Delete a clip. */\n async delete(clipId: string, opts: RequestOptions = {}): Promise<void> {\n await this.transport.request<Response>(\n { method: \"DELETE\", path: `/api/v1/voice/clips/${encodeURIComponent(clipId)}`, raw: true },\n opts,\n );\n }\n}\n\n/** Whitelist-map the backend clip object to the public, camelCase ClipData. */\nfunction mapClip(raw: Record<string, any>): ClipData {\n return {\n id: raw.id,\n text: raw.text ?? raw.text_preview ?? \"\",\n textPreview: raw.text_preview ?? \"\",\n voiceId: raw.voice_id,\n voiceName: raw.voice_name,\n voiceDescriptor: raw.voice_descriptor,\n language: raw.language,\n outputFormat: raw.output_format,\n audioUrl: raw.audio_url ?? raw.playback?.url ?? \"\",\n mimeType: raw.mime_type,\n durationSeconds: raw.duration_seconds ?? null,\n characterCount: raw.character_count ?? 0,\n billableCharacters: raw.billable_characters ?? 0,\n downloadName: raw.download_name ?? \"\",\n createdAt: raw.created_at,\n usage: raw.usage\n ? {\n pricingUnit: raw.usage.pricing_unit ?? \"character\",\n pricePer1000Characters: raw.usage.price_per_1000_characters ?? 0,\n creditsUsed: raw.usage.credits_used ?? null,\n creditsRemaining: raw.usage.credits_remaining ?? null,\n currency: raw.usage.currency ?? \"ETB\",\n }\n : undefined,\n meta: raw.meta\n ? {\n ignoredVoiceSettings: raw.meta.ignored_voice_settings ?? [],\n idempotentReplay: Boolean(raw.meta.idempotent_replay),\n }\n : undefined,\n };\n}\n","import { camelize } from \"../core/camelize.js\";\nimport { type RequestOptions, type Transport, unwrapData } from \"../core/request.js\";\nimport type { Language } from \"./shared.js\";\n\nexport interface VoiceCatalogEntry {\n id: string;\n name: string;\n descriptor: string;\n language: Language;\n gender: string;\n style: string;\n scriptChip: string;\n tags: string[];\n previewAudioUrl: string | null;\n previewMimeType: string | null;\n previewDurationSeconds: number | null;\n isDefault: boolean;\n isAvailable: boolean;\n sortOrder: number;\n}\n\nexport interface VoiceListParams {\n language?: Language;\n gender?: \"female\" | \"male\";\n search?: string;\n includeUnavailable?: boolean;\n}\n\nexport interface VoicePreview {\n voiceId: string;\n audioUrl: string | null;\n audio: string | null;\n mimeType: string | null;\n durationSeconds: number | null;\n downloadName: string;\n}\n\nexport class Voices {\n constructor(private readonly transport: Transport) {}\n\n /** List the voice catalog. */\n async list(params: VoiceListParams = {}, opts: RequestOptions = {}): Promise<VoiceCatalogEntry[]> {\n const query: Record<string, unknown> = {\n language: params.language,\n gender: params.gender,\n search: params.search,\n include_unavailable: params.includeUnavailable,\n };\n const data = unwrapData<unknown[]>(\n await this.transport.request({ method: \"GET\", path: \"/api/v1/voice/voices\", query }, opts),\n );\n return camelize<VoiceCatalogEntry[]>(data);\n }\n\n /** Fetch a single voice's preview clip metadata. */\n async preview(voiceId: string, opts: RequestOptions = {}): Promise<VoicePreview> {\n const data = unwrapData(\n await this.transport.request(\n { method: \"GET\", path: `/api/v1/voice/voices/${encodeURIComponent(voiceId)}/preview` },\n opts,\n ),\n );\n return camelize<VoicePreview>(data);\n }\n}\n","import { type RequestOptions, type Transport, unwrapData } from \"../core/request.js\";\nimport { toBlob, type Uploadable } from \"../core/uploads.js\";\nimport type { SttLanguage } from \"./shared.js\";\n\nexport interface TranscribeParams {\n /** Audio input. Buffer/Blob/Uint8Array, or a FileInput descriptor. Max 25 MB / 120 s. */\n audio: Uploadable;\n /** Language of the audio: \"am\" | \"om\" | \"en\" | \"ha\" | \"sw\". */\n language: SttLanguage;\n}\n\nexport interface Transcription {\n text: string;\n confidence: number | null;\n usage: unknown;\n}\n\nexport class Speech {\n constructor(private readonly transport: Transport) {}\n\n /** Transcribe speech to text. */\n async transcribe(params: TranscribeParams, opts: RequestOptions = {}): Promise<Transcription> {\n const form = new FormData();\n const { blob, filename } = toBlob(params.audio, \"audio/wav\");\n form.append(\"audio\", blob, filename || \"audio.wav\");\n form.append(\n \"request_data\",\n new Blob([JSON.stringify({ language_code: params.language })], { type: \"application/json\" }),\n );\n\n const data = unwrapData<{ transcription?: string; confidence?: number | null; usage_metadata?: unknown }>(\n await this.transport.request({ method: \"POST\", path: \"/api/v2/stt\", form }, opts),\n );\n return {\n text: data.transcription ?? \"\",\n confidence: data.confidence ?? null,\n usage: data.usage_metadata ?? null,\n };\n }\n}\n","import { type RequestOptions, type Transport, unwrapData } from \"../core/request.js\";\nimport type { TranslateLanguage } from \"./shared.js\";\n\nexport interface TranslateParams {\n text: string;\n /** Target language: \"am\" | \"om\" | \"en\". */\n to: TranslateLanguage;\n /** Source language. Must differ from `to`. */\n from: TranslateLanguage;\n}\n\nexport interface Translation {\n text: string;\n sourceLanguage: TranslateLanguage;\n targetLanguage: TranslateLanguage;\n quality: \"high\" | \"medium\" | \"low\" | null;\n usage: unknown;\n}\n\nexport class Translate {\n constructor(private readonly transport: Transport) {}\n\n /** Translate text between Amharic, Afan Oromo, and English. */\n async create(params: TranslateParams, opts: RequestOptions = {}): Promise<Translation> {\n const body = {\n text: params.text,\n source_language: params.from,\n target_language: params.to,\n };\n const data = unwrapData<{\n translation?: string;\n source_language?: TranslateLanguage;\n target_language?: TranslateLanguage;\n quality?: \"high\" | \"medium\" | \"low\" | null;\n usage_metadata?: unknown;\n }>(await this.transport.request({ method: \"POST\", path: \"/api/v1/translate\", body }, opts));\n return {\n text: data.translation ?? \"\",\n sourceLanguage: data.source_language ?? params.from,\n targetLanguage: data.target_language ?? params.to,\n quality: data.quality ?? null,\n usage: data.usage_metadata ?? null,\n };\n }\n}\n","import type { RequestOptions } from \"../core/request.js\";\nimport type { AddisClip } from \"../lib/clip.js\";\nimport type { Voice, VoiceSettings } from \"./voice.js\";\nimport type { Language, OutputFormat } from \"./shared.js\";\n\n/**\n * ElevenLabs-style alias over `voice.*`, for developers migrating from\n * ElevenLabs. `client.textToSpeech.convert(voiceId, { text, language })`.\n */\nexport interface ConvertParams {\n text: string;\n language: Language;\n outputFormat?: OutputFormat;\n voiceSettings?: VoiceSettings;\n clientRequestId?: string;\n}\n\nexport class TextToSpeech {\n constructor(private readonly voice: Voice) {}\n\n /** Synthesize speech for a voice. Mirrors ElevenLabs `textToSpeech.convert`. */\n convert(voiceId: string, params: ConvertParams, opts?: RequestOptions): Promise<AddisClip> {\n return this.voice.generate({ voiceId, ...params }, opts);\n }\n}\n","import { AddisAIError } from \"../core/errors.js\";\nimport { parseNDJSON } from \"../core/sse.js\";\n\n/**\n * A stream of audio byte chunks. Async-iterable (`for await` yields\n * `Uint8Array`), with helpers to collect or save the audio. Normalizes the two\n * legacy stream encodings (newline-delimited base64 JSON chunks, or a raw audio\n * byte stream) into a single byte stream.\n */\nexport class AudioStream implements AsyncIterable<Uint8Array> {\n private consumed = false;\n\n constructor(\n private readonly response: Response,\n private readonly mode: \"ndjson\" | \"raw\",\n private readonly controller?: AbortController,\n ) {}\n\n static fromResponse(response: Response, controller?: AbortController): AudioStream {\n const contentType = (response.headers.get(\"content-type\") || \"\").toLowerCase();\n const mode = contentType.includes(\"ndjson\") || contentType.includes(\"json\") ? \"ndjson\" : \"raw\";\n return new AudioStream(response, mode, controller);\n }\n\n /** Cancel the stream and underlying request. */\n abort(): void {\n this.controller?.abort();\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<Uint8Array> {\n if (this.consumed) throw new AddisAIError(\"This stream has already been consumed.\");\n this.consumed = true;\n if (!this.response.body) return;\n\n if (this.mode === \"raw\") {\n const reader = this.response.body.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) yield value;\n }\n } finally {\n reader.releaseLock();\n }\n return;\n }\n\n for await (const obj of parseNDJSON(this.response.body)) {\n if (!obj) continue;\n if (obj.status === \"error\" || obj.error) {\n const message = obj.error?.message || \"Audio stream failed.\";\n throw new AddisAIError(message);\n }\n const b64 = obj.audio_chunk ?? obj.audio;\n if (typeof b64 === \"string\" && b64) yield decodeBase64(b64);\n }\n }\n\n /** Collect every chunk into a single ArrayBuffer. */\n async arrayBuffer(): Promise<ArrayBuffer> {\n const chunks: Uint8Array[] = [];\n let total = 0;\n for await (const chunk of this) {\n chunks.push(chunk);\n total += chunk.byteLength;\n }\n const out = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) {\n out.set(c, offset);\n offset += c.byteLength;\n }\n return out.buffer;\n }\n\n /** Stream the audio to a file on disk (Node/Bun/Deno). */\n async toFile(path: string): Promise<void> {\n const fs = await import(\"node:fs\");\n const handle = fs.createWriteStream(path);\n try {\n for await (const chunk of this) {\n await new Promise<void>((resolve, reject) => {\n handle.write(Buffer.from(chunk), (err) => (err ? reject(err) : resolve()));\n });\n }\n } finally {\n await new Promise<void>((resolve) => handle.end(resolve));\n }\n }\n}\n\nfunction decodeBase64(b64: string): Uint8Array {\n if (typeof Buffer !== \"undefined\") return new Uint8Array(Buffer.from(b64, \"base64\"));\n const binary = atob(b64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n","import { AddisAIError } from \"../core/errors.js\";\nimport { type RequestOptions, type Transport } from \"../core/request.js\";\nimport { AudioStream } from \"../lib/audio-stream.js\";\nimport type { Language } from \"./shared.js\";\n\nlet warned = false;\nfunction warnOnce(): void {\n if (warned) return;\n warned = true;\n // eslint-disable-next-line no-console\n console.warn(\n \"[addisai] addis.legacy.audio is DEPRECATED. Migrate to addis.voice.generate(), \" +\n \"which uses the current, more capable voice model. The legacy /audio endpoint \" +\n \"may be removed in a future release.\",\n );\n}\n\nfunction decodeBase64(b64: string): Uint8Array {\n if (typeof Buffer !== \"undefined\") return new Uint8Array(Buffer.from(b64, \"base64\"));\n const binary = atob(b64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\nexport interface LegacyAudioParams {\n text: string;\n /** \"am\" | \"om\". */\n language: Language;\n}\n\n/** Result of a legacy non-streaming synthesis. */\nexport class LegacyAudio {\n constructor(\n /** Base64-encoded audio (WAV or MP3, provider-dependent). */\n readonly audio: string,\n ) {}\n\n /** Decode the base64 audio into bytes. */\n arrayBuffer(): ArrayBuffer {\n const bytes = decodeBase64(this.audio);\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\n }\n\n /** Write the decoded audio to disk (Node/Bun/Deno). */\n async toFile(path: string): Promise<void> {\n const fs = await import(\"node:fs/promises\");\n await fs.writeFile(path, Buffer.from(this.arrayBuffer()));\n }\n}\n\n/**\n * @deprecated The legacy `/audio` text-to-speech endpoint. Use\n * {@link Voice.generate} (`addis.voice.generate`) instead — it uses the current\n * voice model and returns durable, signed clips with idempotent billing.\n *\n * Provided only as a migration bridge for existing integrations. Limited to\n * 1500 characters for non-streaming synthesis.\n */\nexport class LegacyAudioResource {\n constructor(private readonly transport: Transport) {}\n\n /**\n * @deprecated Use `addis.voice.generate(...)`.\n * Synthesize speech via the legacy endpoint (non-streaming).\n */\n async generate(params: LegacyAudioParams, opts: RequestOptions = {}): Promise<LegacyAudio> {\n warnOnce();\n const body = await this.transport.request<{ audio?: string; audio_chunk?: string }>(\n { method: \"POST\", path: \"/api/v1/audio\", body: { text: params.text, language: params.language, stream: false } },\n opts,\n );\n const audio = body.audio ?? body.audio_chunk;\n if (!audio) throw new AddisAIError(\"Legacy audio response did not contain audio data.\");\n return new LegacyAudio(audio);\n }\n\n /**\n * @deprecated Use `addis.voice.generate(...)`.\n * Stream synthesis via the legacy endpoint. Returns an {@link AudioStream} of\n * audio byte chunks. The SDK normalizes the two legacy encodings (Amharic\n * newline-delimited base64 JSON, Afan Oromo raw `audio/wav`) into one byte\n * stream. New code should not depend on this.\n */\n async stream(params: LegacyAudioParams, opts: RequestOptions = {}): Promise<AudioStream> {\n warnOnce();\n const { response, controller } = await this.transport.openStream(\n { method: \"POST\", path: \"/api/v1/audio\", body: { text: params.text, language: params.language, stream: true } },\n opts,\n );\n return AudioStream.fromResponse(response, controller);\n }\n}\n\n/** @deprecated Namespace for legacy endpoints retained for backward compatibility. */\nexport class Legacy {\n /** @deprecated Use `addis.voice` instead. */\n readonly audio: LegacyAudioResource;\n\n constructor(transport: Transport) {\n this.audio = new LegacyAudioResource(transport);\n }\n}\n","import {\n API_KEY_ENV_VAR,\n detectRuntime,\n isBrowserLike,\n readEnv,\n resolveBaseURL,\n} from \"./core/env.js\";\nimport { AddisAIError } from \"./core/errors.js\";\nimport { type FetchLike, type LogLevel, Transport } from \"./core/request.js\";\nimport { redactApiKey } from \"./core/redact.js\";\nimport { Chat } from \"./resources/chat.js\";\nimport { Voice } from \"./resources/voice.js\";\nimport { Voices } from \"./resources/voices.js\";\nimport { Speech } from \"./resources/speech.js\";\nimport { Translate } from \"./resources/translate.js\";\nimport { TextToSpeech } from \"./resources/text-to-speech.js\";\nimport { Legacy } from \"./resources/legacy.js\";\n\nexport interface ClientOptions {\n /** Addis AI API key. Defaults to `process.env.ADDIS_API_KEY`. */\n apiKey?: string;\n /** Override the API base URL. Defaults to the Addis AI Cloudflare endpoint. */\n baseURL?: string;\n /** Request timeout in milliseconds. Default 60000. */\n timeout?: number;\n /** Maximum automatic retries for transient failures. Default 2. */\n maxRetries?: number;\n /** Headers merged into every request. */\n defaultHeaders?: Record<string, string>;\n /** Query params merged into every request. */\n defaultQuery?: Record<string, string>;\n /** Inject a custom fetch implementation. Defaults to the global fetch. */\n fetch?: FetchLike;\n /** Allow running in a browser. API keys are secrets — keep this false. */\n dangerouslyAllowBrowser?: boolean;\n /** Logging verbosity. Secrets are never logged at any level. Default \"warn\". */\n logLevel?: LogLevel;\n}\n\nexport class AddisAI {\n readonly chat: Chat;\n readonly voice: Voice;\n readonly voices: Voices;\n readonly speech: Speech;\n readonly translate: Translate;\n /** ElevenLabs-style alias over `voice.*` for developers migrating. */\n readonly textToSpeech: TextToSpeech;\n /** @deprecated Legacy endpoints retained for backward compatibility. Use `voice`. */\n readonly legacy: Legacy;\n\n /** @internal */\n readonly _transport: Transport;\n private readonly _apiKey: string;\n\n constructor(options: ClientOptions = {}) {\n const apiKey = options.apiKey ?? readEnv(API_KEY_ENV_VAR);\n if (!apiKey) {\n throw new AddisAIError(\n `Missing API key. Pass { apiKey } or set the ${API_KEY_ENV_VAR} environment variable.`,\n );\n }\n\n if (isBrowserLike() && !options.dangerouslyAllowBrowser) {\n throw new AddisAIError(\n \"It looks like you're running in a browser. Exposing an Addis AI API key \" +\n \"in client-side code is a security risk. Call the SDK from your server, \" +\n \"or pass { dangerouslyAllowBrowser: true } if you understand the risk.\",\n );\n }\n\n const resolvedFetch = options.fetch ?? (globalThis.fetch as FetchLike | undefined);\n if (!resolvedFetch) {\n throw new AddisAIError(\n `No fetch implementation found in this runtime (${detectRuntime()}). ` +\n \"Upgrade to Node 18+ or pass a custom fetch via { fetch }.\",\n );\n }\n\n this._apiKey = apiKey;\n this._transport = new Transport({\n apiKey,\n baseURL: resolveBaseURL(options.baseURL),\n timeout: options.timeout ?? 60_000,\n maxRetries: options.maxRetries ?? 3,\n defaultHeaders: options.defaultHeaders ?? {},\n defaultQuery: options.defaultQuery ?? {},\n fetch: resolvedFetch,\n logLevel: options.logLevel ?? \"warn\",\n });\n\n this.chat = new Chat(this._transport);\n this.voice = new Voice(this._transport);\n this.voices = new Voices(this._transport);\n this.speech = new Speech(this._transport);\n this.translate = new Translate(this._transport);\n this.textToSpeech = new TextToSpeech(this.voice);\n this.legacy = new Legacy(this._transport);\n }\n\n /** Redacted representation; never exposes the API key. */\n toString(): string {\n return `AddisAI { apiKey: \"${redactApiKey(this._apiKey)}\" }`;\n }\n}\n","import { AddisClip } from \"./clip.js\";\n\n/**\n * Play audio through the system audio device (Node only). Lazily spawns\n * `ffplay` (from ffmpeg); falls back to `mpv`. Intended for local scripts and\n * demos, not production servers.\n */\nexport async function play(audio: AddisClip | ArrayBuffer | Uint8Array): Promise<void> {\n const bytes = audio instanceof AddisClip\n ? new Uint8Array(await audio.arrayBuffer())\n : audio instanceof ArrayBuffer\n ? new Uint8Array(audio)\n : audio;\n\n const { spawn } = await import(\"node:child_process\");\n\n const tryPlayer = (command: string, args: string[]): Promise<boolean> =>\n new Promise((resolve) => {\n let child;\n try {\n child = spawn(command, args, { stdio: [\"pipe\", \"ignore\", \"ignore\"] });\n } catch {\n return resolve(false);\n }\n child.on(\"error\", () => resolve(false));\n child.on(\"close\", (code) => resolve(code === 0));\n child.stdin?.on(\"error\", () => {});\n child.stdin?.write(Buffer.from(bytes));\n child.stdin?.end();\n });\n\n if (await tryPlayer(\"ffplay\", [\"-autoexit\", \"-nodisp\", \"-loglevel\", \"quiet\", \"-\"])) return;\n if (await tryPlayer(\"mpv\", [\"--really-quiet\", \"-\"])) return;\n throw new Error(\n \"play() requires ffplay (ffmpeg) or mpv on PATH. Save the clip with clip.toFile() instead.\",\n );\n}\n","import { AddisAI } from \"./client.js\";\n\nexport default AddisAI;\nexport { AddisAI };\nexport type { ClientOptions } from \"./client.js\";\n\n// Errors\nexport {\n AddisAIError,\n APIError,\n APIConnectionError,\n APIConnectionTimeoutError,\n AuthenticationError,\n BadRequestError,\n ConflictError,\n GenerationInProgressError,\n IdempotencyConflictError,\n InsufficientCreditsError,\n InternalServerError,\n NotFoundError,\n NotSupportedError,\n PermissionDeniedError,\n RateLimitError,\n UnprocessableEntityError,\n} from \"./core/errors.js\";\nexport type { ErrorDetail } from \"./core/errors.js\";\n\n// Request/runtime types\nexport type { LogLevel, RequestOptions } from \"./core/request.js\";\nexport { CursorPage, CursorPagePromise } from \"./core/pagination.js\";\n\n// Helpers\nexport { play } from \"./lib/play.js\";\nexport { fileFromPath } from \"./core/uploads.js\";\nexport type { FileInput, Uploadable } from \"./core/uploads.js\";\nexport { ulid } from \"./core/idempotency.js\";\n\n// Clip & streaming\nexport { AddisClip } from \"./lib/clip.js\";\nexport type { ClipData, ClipMeta, ClipUsage } from \"./lib/clip.js\";\nexport { ChatStream } from \"./lib/chat-stream.js\";\nexport { AudioStream } from \"./lib/audio-stream.js\";\n\n// Shared\nexport type {\n Language,\n OutputFormat,\n SttLanguage,\n TranslateLanguage,\n} from \"./resources/shared.js\";\n\n// Chat\nexport { ADDIS_CHAT_MODEL } from \"./resources/chat.js\";\nexport type {\n ChatAttachment,\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionChoice,\n ChatCompletionCreateParams,\n ChatCompletionMessage,\n ChatRole,\n ChatUsage,\n FunctionTool,\n ToolCall,\n ToolChoice,\n} from \"./resources/chat.js\";\n\n// Voice\nexport type {\n ClipListParams,\n VoiceEstimate,\n VoiceEstimateParams,\n VoiceGenerateParams,\n VoiceSettings,\n VoiceUsage,\n} from \"./resources/voice.js\";\n\n// Voices\nexport type {\n VoiceCatalogEntry,\n VoiceListParams,\n VoicePreview,\n} from \"./resources/voices.js\";\n\n// Speech & Translate\nexport type { TranscribeParams, Transcription } from \"./resources/speech.js\";\nexport type { TranslateParams, Translation } from \"./resources/translate.js\";\nexport type { ConvertParams } from \"./resources/text-to-speech.js\";\n\n// Legacy (deprecated)\nexport { LegacyAudio } from \"./resources/legacy.js\";\nexport type { LegacyAudioParams } from \"./resources/legacy.js\";\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "addisai",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Official Addis AI SDK for Node.js — voice (TTS), chat/LLM with system prompts, personas and function calling, speech-to-text, and translation for Amharic and Afan Oromo.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"addis",
|
|
7
|
+
"addisai",
|
|
8
|
+
"amharic",
|
|
9
|
+
"afan-oromo",
|
|
10
|
+
"tts",
|
|
11
|
+
"text-to-speech",
|
|
12
|
+
"voice",
|
|
13
|
+
"llm",
|
|
14
|
+
"speech-to-text",
|
|
15
|
+
"translation",
|
|
16
|
+
"ai"
|
|
17
|
+
],
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"author": "Addis AI",
|
|
20
|
+
"homepage": "https://addisai.com",
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+https://github.com/Addis-AI-Org/addisai-js.git"
|
|
24
|
+
},
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/Addis-AI-Org/addisai-js/issues"
|
|
27
|
+
},
|
|
28
|
+
"type": "module",
|
|
29
|
+
"main": "./dist/index.cjs",
|
|
30
|
+
"module": "./dist/index.js",
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"exports": {
|
|
33
|
+
".": {
|
|
34
|
+
"types": "./dist/index.d.ts",
|
|
35
|
+
"import": "./dist/index.js",
|
|
36
|
+
"require": "./dist/index.cjs"
|
|
37
|
+
},
|
|
38
|
+
"./package.json": "./package.json"
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
"dist",
|
|
42
|
+
"README.md",
|
|
43
|
+
"LICENSE"
|
|
44
|
+
],
|
|
45
|
+
"sideEffects": false,
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=18"
|
|
48
|
+
},
|
|
49
|
+
"scripts": {
|
|
50
|
+
"build": "tsup",
|
|
51
|
+
"dev": "tsup --watch",
|
|
52
|
+
"typecheck": "tsc --noEmit",
|
|
53
|
+
"test": "vitest run",
|
|
54
|
+
"test:watch": "vitest",
|
|
55
|
+
"smoke": "node scripts/smoke.mjs",
|
|
56
|
+
"lint": "tsc --noEmit",
|
|
57
|
+
"prepublishOnly": "npm run build"
|
|
58
|
+
},
|
|
59
|
+
"devDependencies": {
|
|
60
|
+
"@types/node": "^20.11.0",
|
|
61
|
+
"tsup": "^8.0.0",
|
|
62
|
+
"typescript": "^5.4.0",
|
|
63
|
+
"vitest": "^1.6.0"
|
|
64
|
+
},
|
|
65
|
+
"publishConfig": {
|
|
66
|
+
"access": "public",
|
|
67
|
+
"provenance": true
|
|
68
|
+
}
|
|
69
|
+
}
|