@octomil/browser 1.0.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.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +75 -0
  3. package/dist/cache.d.ts +25 -0
  4. package/dist/cache.d.ts.map +1 -0
  5. package/dist/cache.js +202 -0
  6. package/dist/cache.js.map +1 -0
  7. package/dist/device-auth.d.ts +41 -0
  8. package/dist/device-auth.d.ts.map +1 -0
  9. package/dist/device-auth.js +203 -0
  10. package/dist/device-auth.js.map +1 -0
  11. package/dist/experiments.d.ts +44 -0
  12. package/dist/experiments.d.ts.map +1 -0
  13. package/dist/experiments.js +135 -0
  14. package/dist/experiments.js.map +1 -0
  15. package/dist/federated.d.ts +53 -0
  16. package/dist/federated.d.ts.map +1 -0
  17. package/dist/federated.js +180 -0
  18. package/dist/federated.js.map +1 -0
  19. package/dist/index.cjs +2148 -0
  20. package/dist/index.cjs.map +7 -0
  21. package/dist/index.d.ts +37 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +45 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/inference.d.ts +43 -0
  26. package/dist/inference.d.ts.map +1 -0
  27. package/dist/inference.js +213 -0
  28. package/dist/inference.js.map +1 -0
  29. package/dist/integrity.d.ts +19 -0
  30. package/dist/integrity.d.ts.map +1 -0
  31. package/dist/integrity.js +35 -0
  32. package/dist/integrity.js.map +1 -0
  33. package/dist/model-loader.d.ts +40 -0
  34. package/dist/model-loader.d.ts.map +1 -0
  35. package/dist/model-loader.js +232 -0
  36. package/dist/model-loader.js.map +1 -0
  37. package/dist/octomil.d.ts +92 -0
  38. package/dist/octomil.d.ts.map +1 -0
  39. package/dist/octomil.js +368 -0
  40. package/dist/octomil.js.map +1 -0
  41. package/dist/octomil.min.js +2849 -0
  42. package/dist/octomil.min.js.map +7 -0
  43. package/dist/privacy.d.ts +40 -0
  44. package/dist/privacy.d.ts.map +1 -0
  45. package/dist/privacy.js +118 -0
  46. package/dist/privacy.js.map +1 -0
  47. package/dist/rollouts.d.ts +43 -0
  48. package/dist/rollouts.d.ts.map +1 -0
  49. package/dist/rollouts.js +114 -0
  50. package/dist/rollouts.js.map +1 -0
  51. package/dist/secure-aggregation.d.ts +50 -0
  52. package/dist/secure-aggregation.d.ts.map +1 -0
  53. package/dist/secure-aggregation.js +174 -0
  54. package/dist/secure-aggregation.js.map +1 -0
  55. package/dist/streaming.d.ts +25 -0
  56. package/dist/streaming.d.ts.map +1 -0
  57. package/dist/streaming.js +148 -0
  58. package/dist/streaming.js.map +1 -0
  59. package/dist/telemetry.d.ts +41 -0
  60. package/dist/telemetry.d.ts.map +1 -0
  61. package/dist/telemetry.js +130 -0
  62. package/dist/telemetry.js.map +1 -0
  63. package/dist/types.d.ts +239 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +17 -0
  66. package/dist/types.js.map +1 -0
  67. package/package.json +62 -0
@@ -0,0 +1,148 @@
1
+ /**
2
+ * @octomil/browser — Streaming inference engine
3
+ *
4
+ * Wraps server-sent events / streaming HTTP responses for incremental
5
+ * inference results (text generation, audio, video, image tiles).
6
+ */
7
+ import { OctomilError } from "./types.js";
8
+ // ---------------------------------------------------------------------------
9
+ // StreamingInferenceEngine
10
+ // ---------------------------------------------------------------------------
11
+ export class StreamingInferenceEngine {
12
+ serverUrl;
13
+ apiKey;
14
+ onTelemetry;
15
+ constructor(options) {
16
+ this.serverUrl = options.serverUrl;
17
+ this.apiKey = options.apiKey;
18
+ this.onTelemetry = options.onTelemetry;
19
+ }
20
+ /**
21
+ * Stream inference results from the server.
22
+ *
23
+ * Returns an async iterable of chunks. Supports cancellation via AbortSignal.
24
+ */
25
+ async *stream(modelId, input, options = {}) {
26
+ const abortController = new AbortController();
27
+ const signal = options.signal
28
+ ? this.combineSignals(options.signal, abortController.signal)
29
+ : abortController.signal;
30
+ const url = `${this.serverUrl}/api/v1/models/${encodeURIComponent(modelId)}/stream`;
31
+ const headers = {
32
+ "Content-Type": "application/json",
33
+ Accept: "text/event-stream",
34
+ };
35
+ if (this.apiKey) {
36
+ headers["Authorization"] = `Bearer ${this.apiKey}`;
37
+ }
38
+ const startTime = performance.now();
39
+ let ttfc = null;
40
+ let chunkCount = 0;
41
+ let totalBytes = 0;
42
+ this.onTelemetry?.({
43
+ type: "streaming_start",
44
+ model: modelId,
45
+ metadata: { modality: options.modality ?? "text" },
46
+ timestamp: Date.now(),
47
+ });
48
+ let response;
49
+ try {
50
+ response = await fetch(url, {
51
+ method: "POST",
52
+ headers,
53
+ body: JSON.stringify({
54
+ input,
55
+ modality: options.modality ?? "text",
56
+ ...options.params,
57
+ }),
58
+ signal,
59
+ });
60
+ }
61
+ catch (err) {
62
+ this.onTelemetry?.({
63
+ type: "streaming_error",
64
+ model: modelId,
65
+ metadata: { error: String(err) },
66
+ timestamp: Date.now(),
67
+ });
68
+ throw new OctomilError("NETWORK_ERROR", `Streaming request failed: ${String(err)}`, err);
69
+ }
70
+ if (!response.ok) {
71
+ throw new OctomilError("INFERENCE_FAILED", `Streaming inference failed: HTTP ${response.status}`);
72
+ }
73
+ if (!response.body) {
74
+ throw new OctomilError("INFERENCE_FAILED", "Server did not return a streaming body.");
75
+ }
76
+ const reader = response.body.getReader();
77
+ const decoder = new TextDecoder();
78
+ let buffer = "";
79
+ try {
80
+ while (true) {
81
+ const { done, value } = await reader.read();
82
+ if (done)
83
+ break;
84
+ buffer += decoder.decode(value, { stream: true });
85
+ const lines = buffer.split("\n");
86
+ buffer = lines.pop() ?? "";
87
+ for (const line of lines) {
88
+ if (!line.startsWith("data: "))
89
+ continue;
90
+ const data = line.slice(6).trim();
91
+ if (data === "[DONE]")
92
+ break;
93
+ let parsed;
94
+ try {
95
+ parsed = JSON.parse(data);
96
+ }
97
+ catch {
98
+ continue;
99
+ }
100
+ chunkCount++;
101
+ totalBytes += data.length;
102
+ if (ttfc === null) {
103
+ ttfc = performance.now() - startTime;
104
+ this.onTelemetry?.({
105
+ type: "streaming_chunk",
106
+ model: modelId,
107
+ durationMs: ttfc,
108
+ metadata: { chunkIndex: 0, ttfc: true },
109
+ timestamp: Date.now(),
110
+ });
111
+ }
112
+ yield parsed;
113
+ }
114
+ }
115
+ }
116
+ finally {
117
+ reader.releaseLock();
118
+ }
119
+ const totalMs = performance.now() - startTime;
120
+ this.onTelemetry?.({
121
+ type: "streaming_complete",
122
+ model: modelId,
123
+ durationMs: totalMs,
124
+ metadata: { chunkCount, totalBytes, ttfcMs: ttfc },
125
+ timestamp: Date.now(),
126
+ });
127
+ return {
128
+ totalChunks: chunkCount,
129
+ totalBytes,
130
+ durationMs: totalMs,
131
+ ttfcMs: ttfc ?? totalMs,
132
+ };
133
+ }
134
+ combineSignals(...signals) {
135
+ const controller = new AbortController();
136
+ for (const signal of signals) {
137
+ if (signal.aborted) {
138
+ controller.abort(signal.reason);
139
+ return controller.signal;
140
+ }
141
+ signal.addEventListener("abort", () => controller.abort(signal.reason), {
142
+ once: true,
143
+ });
144
+ }
145
+ return controller.signal;
146
+ }
147
+ }
148
+ //# sourceMappingURL=streaming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @octomil/browser — Telemetry reporter
3
+ *
4
+ * Opt-in, batched, non-blocking telemetry. Events are queued in memory
5
+ * and flushed periodically using `navigator.sendBeacon` (preferred) or
6
+ * `fetch` with `keepalive: true`.
7
+ */
8
+ import type { TelemetryEvent } from "./types.js";
9
+ export interface TelemetryReporterOptions {
10
+ /** Endpoint to POST batched events to. */
11
+ url?: string;
12
+ /** Flush interval in milliseconds. */
13
+ flushIntervalMs?: number;
14
+ /** Maximum events per batch. */
15
+ maxBatchSize?: number;
16
+ /** API key included in the `Authorization` header. */
17
+ apiKey?: string;
18
+ }
19
+ export declare class TelemetryReporter {
20
+ private readonly url;
21
+ private readonly flushIntervalMs;
22
+ private readonly maxBatchSize;
23
+ private readonly apiKey;
24
+ private queue;
25
+ private timerId;
26
+ private disposed;
27
+ constructor(options?: TelemetryReporterOptions);
28
+ /** Enqueue a telemetry event. Non-blocking, never throws. */
29
+ track(event: TelemetryEvent): void;
30
+ /** Flush all queued events immediately. */
31
+ flush(): Promise<void>;
32
+ /** Stop the flush timer and send remaining events. */
33
+ dispose(): void;
34
+ private startAutoFlush;
35
+ private send;
36
+ private sendBeacon;
37
+ }
38
+ export declare function initTelemetry(options?: TelemetryReporterOptions): TelemetryReporter;
39
+ export declare function getTelemetry(): TelemetryReporter | null;
40
+ export declare function disposeTelemetry(): void;
41
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAcjD,MAAM,WAAW,wBAAwB;IACvC,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAE5C,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,OAAO,CAA+C;IAC9D,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,GAAE,wBAA6B;IAclD,6DAA6D;IAC7D,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IASlC,2CAA2C;IACrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,sDAAsD;IACtD,OAAO,IAAI,IAAI;IAmBf,OAAO,CAAC,cAAc;YAOR,IAAI;IA0BlB,OAAO,CAAC,UAAU;CAcnB;AAQD,wBAAgB,aAAa,CAC3B,OAAO,GAAE,wBAA6B,GACrC,iBAAiB,CAMnB;AAED,wBAAgB,YAAY,IAAI,iBAAiB,GAAG,IAAI,CAEvD;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * @octomil/browser — Telemetry reporter
3
+ *
4
+ * Opt-in, batched, non-blocking telemetry. Events are queued in memory
5
+ * and flushed periodically using `navigator.sendBeacon` (preferred) or
6
+ * `fetch` with `keepalive: true`.
7
+ */
8
+ // ---------------------------------------------------------------------------
9
+ // Constants
10
+ // ---------------------------------------------------------------------------
11
+ const DEFAULT_FLUSH_INTERVAL_MS = 30_000; // 30 seconds
12
+ const DEFAULT_MAX_BATCH_SIZE = 50;
13
+ const DEFAULT_TELEMETRY_URL = "https://api.octomil.io/v1/telemetry";
14
+ export class TelemetryReporter {
15
+ url;
16
+ flushIntervalMs;
17
+ maxBatchSize;
18
+ apiKey;
19
+ queue = [];
20
+ timerId = null;
21
+ disposed = false;
22
+ constructor(options = {}) {
23
+ this.url = options.url ?? DEFAULT_TELEMETRY_URL;
24
+ this.flushIntervalMs =
25
+ options.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS;
26
+ this.maxBatchSize = options.maxBatchSize ?? DEFAULT_MAX_BATCH_SIZE;
27
+ this.apiKey = options.apiKey;
28
+ this.startAutoFlush();
29
+ }
30
+ // -----------------------------------------------------------------------
31
+ // Public
32
+ // -----------------------------------------------------------------------
33
+ /** Enqueue a telemetry event. Non-blocking, never throws. */
34
+ track(event) {
35
+ if (this.disposed)
36
+ return;
37
+ this.queue.push(event);
38
+ if (this.queue.length >= this.maxBatchSize) {
39
+ void this.flush();
40
+ }
41
+ }
42
+ /** Flush all queued events immediately. */
43
+ async flush() {
44
+ if (this.queue.length === 0)
45
+ return;
46
+ const batch = this.queue.splice(0, this.maxBatchSize);
47
+ await this.send(batch);
48
+ }
49
+ /** Stop the flush timer and send remaining events. */
50
+ dispose() {
51
+ if (this.disposed)
52
+ return;
53
+ this.disposed = true;
54
+ if (this.timerId !== null) {
55
+ clearInterval(this.timerId);
56
+ this.timerId = null;
57
+ }
58
+ // Best-effort final flush via beacon.
59
+ if (this.queue.length > 0) {
60
+ this.sendBeacon(this.queue.splice(0));
61
+ }
62
+ }
63
+ // -----------------------------------------------------------------------
64
+ // Internal
65
+ // -----------------------------------------------------------------------
66
+ startAutoFlush() {
67
+ if (typeof setInterval === "undefined")
68
+ return;
69
+ this.timerId = setInterval(() => {
70
+ void this.flush();
71
+ }, this.flushIntervalMs);
72
+ }
73
+ async send(events) {
74
+ const body = JSON.stringify({ events });
75
+ try {
76
+ // Try sendBeacon first — it survives page unload.
77
+ if (this.sendBeacon(events))
78
+ return;
79
+ // Fallback to fetch with keepalive.
80
+ const headers = {
81
+ "Content-Type": "application/json",
82
+ };
83
+ if (this.apiKey) {
84
+ headers["Authorization"] = `Bearer ${this.apiKey}`;
85
+ }
86
+ await fetch(this.url, {
87
+ method: "POST",
88
+ headers,
89
+ body,
90
+ keepalive: true,
91
+ });
92
+ }
93
+ catch {
94
+ // Telemetry is best-effort. Swallow all errors.
95
+ }
96
+ }
97
+ sendBeacon(events) {
98
+ if (typeof navigator === "undefined" || !navigator.sendBeacon) {
99
+ return false;
100
+ }
101
+ try {
102
+ const blob = new Blob([JSON.stringify({ events })], {
103
+ type: "application/json",
104
+ });
105
+ return navigator.sendBeacon(this.url, blob);
106
+ }
107
+ catch {
108
+ return false;
109
+ }
110
+ }
111
+ }
112
+ // ---------------------------------------------------------------------------
113
+ // Singleton helpers
114
+ // ---------------------------------------------------------------------------
115
+ let _reporter = null;
116
+ export function initTelemetry(options = {}) {
117
+ if (_reporter) {
118
+ _reporter.dispose();
119
+ }
120
+ _reporter = new TelemetryReporter(options);
121
+ return _reporter;
122
+ }
123
+ export function getTelemetry() {
124
+ return _reporter;
125
+ }
126
+ export function disposeTelemetry() {
127
+ _reporter?.dispose();
128
+ _reporter = null;
129
+ }
130
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,239 @@
1
+ /**
2
+ * @octomil/browser — TypeScript type definitions
3
+ *
4
+ * All public interfaces and types for the browser inference SDK.
5
+ */
6
+ /** Inference backend. `"webgpu"` is preferred; `"wasm"` is the universal fallback. */
7
+ export type Backend = "webgpu" | "wasm";
8
+ /** Model caching strategy. */
9
+ export type CacheStrategy = "cache-api" | "indexeddb" | "none";
10
+ /** Options for initialising an {@link Octomil} instance. */
11
+ export interface OctomilOptions {
12
+ /**
13
+ * Model identifier — either a full URL to an `.onnx` file or
14
+ * a name resolvable via the Octomil model registry.
15
+ */
16
+ model: string;
17
+ /** Octomil server URL (used to resolve registry model names). */
18
+ serverUrl?: string;
19
+ /** Octomil API key for authenticated model downloads. */
20
+ apiKey?: string;
21
+ /**
22
+ * Inference backend.
23
+ * - `"webgpu"` — uses WebGPU when available (fastest).
24
+ * - `"wasm"` — WASM SIMD fallback (universal).
25
+ * - `undefined` — auto-detect (try WebGPU first, then WASM).
26
+ */
27
+ backend?: Backend;
28
+ /**
29
+ * Whether to report anonymous telemetry (latency, cache hits) to the
30
+ * Octomil dashboard. Opt-in only.
31
+ * @default false
32
+ */
33
+ telemetry?: boolean;
34
+ /** Telemetry endpoint override. Only used when `telemetry` is `true`. */
35
+ telemetryUrl?: string;
36
+ /**
37
+ * Model caching strategy.
38
+ * @default "cache-api"
39
+ */
40
+ cacheStrategy?: CacheStrategy;
41
+ /** Called during model download with progress information. */
42
+ onProgress?: (progress: DownloadProgress) => void;
43
+ }
44
+ /** Progress information emitted during model download. */
45
+ export interface DownloadProgress {
46
+ /** Bytes received so far. */
47
+ loaded: number;
48
+ /** Total bytes (may be 0 if the server omits Content-Length). */
49
+ total: number;
50
+ /** Percentage 0–100 (NaN when total is unknown). */
51
+ percent: number;
52
+ }
53
+ /**
54
+ * Named tensor map. Keys are input tensor names, values are the data.
55
+ * When a model has a single input you can pass the data directly.
56
+ */
57
+ export type TensorData = Float32Array | Int32Array | BigInt64Array | Uint8Array;
58
+ export interface NamedTensors {
59
+ [name: string]: {
60
+ data: TensorData;
61
+ dims: number[];
62
+ };
63
+ }
64
+ /**
65
+ * Predict input — either a named tensor map for explicit control,
66
+ * or a convenience payload that the model adapter will pre-process.
67
+ */
68
+ export type PredictInput = NamedTensors | {
69
+ text: string;
70
+ } | {
71
+ image: ImageData | HTMLCanvasElement | HTMLImageElement;
72
+ } | {
73
+ raw: TensorData;
74
+ dims: number[];
75
+ };
76
+ /** Result of a single inference call. */
77
+ export interface PredictOutput {
78
+ /** Raw output tensors keyed by name. */
79
+ tensors: NamedTensors;
80
+ /** Top-level convenience fields (model-dependent). */
81
+ label?: string;
82
+ score?: number;
83
+ scores?: number[];
84
+ /** Inference wall-clock time in milliseconds. */
85
+ latencyMs: number;
86
+ }
87
+ /** Role for a chat message. */
88
+ export type ChatRole = "system" | "user" | "assistant";
89
+ /** A single message in a chat conversation. */
90
+ export interface ChatMessage {
91
+ role: ChatRole;
92
+ content: string;
93
+ }
94
+ /** Response from the chat API. */
95
+ export interface ChatResponse {
96
+ message: ChatMessage;
97
+ /** Token-generation latency in milliseconds. */
98
+ latencyMs: number;
99
+ /** Usage stats when available. */
100
+ usage?: {
101
+ promptTokens: number;
102
+ completionTokens: number;
103
+ totalTokens: number;
104
+ };
105
+ }
106
+ /** Information about the cached model. */
107
+ export interface CacheInfo {
108
+ /** Whether the model is currently cached. */
109
+ cached: boolean;
110
+ /** Size in bytes (0 if not cached). */
111
+ sizeBytes: number;
112
+ /** ISO-8601 timestamp of when the model was cached. */
113
+ cachedAt?: string;
114
+ }
115
+ /** A single telemetry event queued for delivery. */
116
+ export interface TelemetryEvent {
117
+ type: "model_load" | "inference" | "cache_hit" | "cache_miss" | "error" | "streaming_start" | "streaming_chunk" | "streaming_complete" | "streaming_error" | "training_complete" | "rollout_status" | "experiment_metric";
118
+ model: string;
119
+ durationMs?: number;
120
+ metadata?: Record<string, unknown>;
121
+ timestamp: number;
122
+ }
123
+ /** Metadata returned by the Octomil model registry. */
124
+ export interface ModelMetadata {
125
+ name: string;
126
+ version: string;
127
+ format: "onnx";
128
+ sizeBytes: number;
129
+ url: string;
130
+ checksum?: string;
131
+ }
132
+ export interface DeviceAuthConfig {
133
+ serverUrl: string;
134
+ apiKey: string;
135
+ }
136
+ export interface DeviceAuthToken {
137
+ accessToken: string;
138
+ refreshToken: string;
139
+ /** Epoch ms when the access token expires. */
140
+ expiresAt: number;
141
+ }
142
+ export interface DeviceInfo {
143
+ userAgent: string;
144
+ language: string;
145
+ screenWidth: number;
146
+ screenHeight: number;
147
+ timezone: string;
148
+ webgpu: boolean;
149
+ }
150
+ export type StreamingModality = "text" | "image" | "audio" | "video";
151
+ export interface StreamingOptions {
152
+ modality?: StreamingModality;
153
+ signal?: AbortSignal;
154
+ params?: Record<string, unknown>;
155
+ }
156
+ export interface StreamingChunk {
157
+ index: number;
158
+ data: unknown;
159
+ modality: StreamingModality;
160
+ done: boolean;
161
+ }
162
+ export interface StreamingResult {
163
+ totalChunks: number;
164
+ totalBytes: number;
165
+ durationMs: number;
166
+ ttfcMs: number;
167
+ }
168
+ export interface ChatOptions {
169
+ temperature?: number;
170
+ maxTokens?: number;
171
+ topP?: number;
172
+ stream?: boolean;
173
+ signal?: AbortSignal;
174
+ }
175
+ export interface ChatChunk {
176
+ index: number;
177
+ content: string;
178
+ done: boolean;
179
+ role?: ChatRole;
180
+ }
181
+ export type WeightMap = Record<string, Float32Array>;
182
+ export interface TrainingConfig {
183
+ modelId?: string;
184
+ epochs: number;
185
+ batchSize: number;
186
+ learningRate: number;
187
+ /** User-provided training step — browser ONNX doesn't support training natively. */
188
+ onTrainStep: (weights: WeightMap, params: {
189
+ epoch: number;
190
+ batchSize: number;
191
+ learningRate: number;
192
+ }) => Promise<TrainStepResult>;
193
+ }
194
+ export interface TrainStepResult {
195
+ weights: WeightMap;
196
+ loss?: number;
197
+ }
198
+ export interface FederatedRound {
199
+ id: string;
200
+ federationId: string;
201
+ roundNumber: number;
202
+ status: "pending" | "selecting" | "in_progress" | "aggregating" | "complete";
203
+ modelVersion: string;
204
+ config: Record<string, unknown>;
205
+ }
206
+ export type RolloutStatus = "pending" | "canary" | "active" | "rolled_back";
207
+ export interface RolloutVersion {
208
+ version: string;
209
+ status: RolloutStatus;
210
+ percentage: number;
211
+ createdAt: string;
212
+ }
213
+ export interface RolloutConfig {
214
+ modelId: string;
215
+ versions: RolloutVersion[];
216
+ }
217
+ export interface ExperimentVariant {
218
+ id: string;
219
+ name: string;
220
+ modelId: string;
221
+ modelVersion: string;
222
+ trafficPercentage: number;
223
+ }
224
+ export interface Experiment {
225
+ id: string;
226
+ name: string;
227
+ status: "draft" | "active" | "paused" | "completed";
228
+ variants: ExperimentVariant[];
229
+ createdAt: string;
230
+ }
231
+ /** Error codes emitted by the SDK. */
232
+ export type OctomilErrorCode = "MODEL_NOT_FOUND" | "MODEL_LOAD_FAILED" | "INFERENCE_FAILED" | "BACKEND_UNAVAILABLE" | "CACHE_ERROR" | "NETWORK_ERROR" | "INVALID_INPUT" | "NOT_LOADED" | "SESSION_DISPOSED";
233
+ /** Structured error thrown by the SDK. */
234
+ export declare class OctomilError extends Error {
235
+ readonly code: OctomilErrorCode;
236
+ readonly cause?: unknown;
237
+ constructor(code: OctomilErrorCode, message: string, cause?: unknown);
238
+ }
239
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @octomil/browser — TypeScript type definitions
3
+ *
4
+ * All public interfaces and types for the browser inference SDK.
5
+ */
6
+ /** Structured error thrown by the SDK. */
7
+ export class OctomilError extends Error {
8
+ code;
9
+ cause;
10
+ constructor(code, message, cause) {
11
+ super(message);
12
+ this.name = "OctomilError";
13
+ this.code = code;
14
+ this.cause = cause;
15
+ }
16
+ }
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0VH,0CAA0C;AAC1C,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAmB;IACvB,KAAK,CAAW;IAEzB,YAAY,IAAsB,EAAE,OAAe,EAAE,KAAe;QAClE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "@octomil/browser",
3
+ "version": "1.0.0",
4
+ "description": "In-browser ML inference via ONNX Runtime Web + WebGPU",
5
+ "type": "module",
6
+ "main": "dist/index.cjs",
7
+ "module": "dist/index.js",
8
+ "browser": "dist/octomil.min.js",
9
+ "unpkg": "dist/octomil.min.js",
10
+ "jsdelivr": "dist/octomil.min.js",
11
+ "types": "dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.js",
16
+ "require": "./dist/index.cjs"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "scripts": {
23
+ "build": "tsc && node build.mjs",
24
+ "build:types": "tsc",
25
+ "build:bundle": "node build.mjs",
26
+ "test": "vitest run",
27
+ "test:watch": "vitest",
28
+ "lint": "eslint src/",
29
+ "typecheck": "tsc --noEmit",
30
+ "prepublishOnly": "pnpm run build && pnpm test"
31
+ },
32
+ "dependencies": {
33
+ "onnxruntime-web": "^1.17.0"
34
+ },
35
+ "devDependencies": {
36
+ "esbuild": "^0.24.0",
37
+ "typescript": "^5.4.0",
38
+ "vitest": "^2.0.0",
39
+ "@vitest/coverage-v8": "^2.0.0",
40
+ "eslint": "^9.0.0",
41
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
42
+ "@typescript-eslint/parser": "^8.0.0"
43
+ },
44
+ "keywords": [
45
+ "octomil",
46
+ "onnx",
47
+ "webgpu",
48
+ "wasm",
49
+ "machine-learning",
50
+ "inference",
51
+ "browser",
52
+ "federated-learning"
53
+ ],
54
+ "license": "MIT",
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "https://github.com/octomil/octomil-browser"
58
+ },
59
+ "engines": {
60
+ "node": ">=18.0.0"
61
+ }
62
+ }