import { LattifAIRuntime } from './runtime'; import type { AssetsPathConfig, ContextOptions, LoadModelConfig, LoadedContextInfo, ModelMetadata, LattifAIConfig } from './runtime'; export interface LoadEncryptedBundleOptions { /** * 加密 ct 来源 — 三选一. 优先级: * 1. `ctStream` — 已就绪的 ReadableStream (调用方自己 fetch / file.stream()) * 2. `ctSource` — Blob | File | URL | string. wrapper 内部 .stream() 或 fetch * 3. `ct` — Uint8Array. 小文件 (<600 MiB) 走累积模式; 大文件自动升级流式 * * 至少必须给一个. 三个都给时按上述优先级取. */ ct?: Uint8Array; ctStream?: ReadableStream; ctSource?: Blob | URL | string; /** * Optional ct byte size — 仅在流式路径作为 plaintext buffer 上限提示 * (一次 alloc 省 grow). Blob / response.headers.content-length 命中时 * 自动填; 直接传 ctStream 时建议手动给. */ ctSize?: number; /** End-user license key, e.g. "LAI-XXXX-...". */ licenseKey: string; /** Model id signed onto the license entitlements. */ modelId: string; /** * sha256 of `ct`, hex-encoded. /v1/model metadata 返回的 sha256_encrypted. * * - **ct 路径 (Uint8Array)**: 必填; wrapper 在 decrypt 前做一次性校验, * 失败即 fail-fast (CDN tampering / corrupt cache). * - **ctStream / ctSource 路径**: 可选 / 忽略. 流式不预读完整 ct 算 sha, * 等价的完整性保障由 LaeStream 内部的 chunk 级 HMAC + manifest HMAC * 覆盖 (失败抛 ERR_DECRYPT). 提前给也不会用. */ sha256Encrypted?: string; /** Forwarded to internal loadModel (n_ctx, n_batch, kv types, …). */ loadConfig?: LoadModelConfig; /** Forwarded to internal loadMmproj when an encoder segment is present. */ mmprojOpts?: { useGpu?: boolean; nThreads?: number; }; } export interface MmprojCaps { supportsAudio: boolean; supportsVision: boolean; usesMrope: boolean; audioSampleRate: number; } export interface LoadEncryptedBundleResult { /** * Encoder capabilities (only meaningful when the bundle ships an * encoder segment; otherwise all-false / 0). */ caps: MmprojCaps; } export declare class LattifAI { #private; constructor(paths: AssetsPathConfig, config?: LattifAIConfig); loadEncryptedBundle(opts: LoadEncryptedBundleOptions): Promise; isModelLoaded(): boolean; getModelMetadata(): ModelMetadata; getLoadedContextInfo(): LoadedContextInfo; getBOS(): number; getEOS(): number; getEOT(): number; isTokenEOG(t: number): boolean; isMultithread(): boolean; usingWebGPU(): boolean; getNumThreads(): number; getChatTemplate(): string | null; isEncoderDecoderArchitecture(): boolean; mustAddBosToken(): boolean; mustAddEosToken(): boolean; tokenize(text: string, special?: boolean): Promise; detokenize(tokens: number[], returnString?: boolean): Promise; getVocab(): Promise; lookupToken(piece: string): Promise; samplingInit(...args: Parameters): Promise; samplingSample(): Promise<{ piece: Uint8Array; token: number; }>; samplingAccept(tokens: number[]): Promise; getLogits(topK?: number): Promise<{ token: number; p: number; }[]>; decode(...args: Parameters): Promise<{ nPast: number; }>; encode(...args: Parameters): Promise<{ nPast: number; }>; embeddings(tokens: number[]): Promise; loopDecode(opts: Parameters[0]): Promise<{ tokens: number[]; pieces: Uint8Array; pieceOffsets: number[]; stoppedByEog: boolean; nPast: number; }>; mtmdEvalAudio(...args: Parameters): Promise<{ nPast: number; nChunks: number; }>; kvRemove(nKeep: number, nDiscard: number): Promise; kvClear(): Promise; createCompletion(...args: any[]): any; createChatCompletion(...args: any[]): any; createEmbedding(...args: Parameters): Promise; formatChat(...args: Parameters): Promise; setOptions(opt: ContextOptions): Promise; getPerfContext(): Promise; resetPerfContext(): Promise<{ success: boolean; }>; exit(): Promise; }