@onlist/sdk 0.1.0 → 0.3.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/README.md +207 -13
- package/dist/index.cjs +349 -29
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +524 -12
- package/dist/index.d.ts +524 -12
- package/dist/index.js +337 -28
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -31,16 +31,27 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
31
31
|
var index_exports = {};
|
|
32
32
|
__export(index_exports, {
|
|
33
33
|
APIError: () => APIError,
|
|
34
|
+
AccountActivity: () => AccountActivity,
|
|
35
|
+
AccountApiKeys: () => AccountApiKeys,
|
|
36
|
+
AccountCredits: () => AccountCredits,
|
|
37
|
+
AccountGenerations: () => AccountGenerations,
|
|
38
|
+
AccountOAuth: () => AccountOAuth,
|
|
34
39
|
AuthenticationError: () => AuthenticationError,
|
|
40
|
+
BadRequestError: () => BadRequestError,
|
|
35
41
|
InsufficientBalanceError: () => InsufficientBalanceError,
|
|
36
42
|
Marketplace: () => Marketplace,
|
|
37
43
|
MarketplaceModels: () => MarketplaceModels,
|
|
38
44
|
MarketplaceProviders: () => MarketplaceProviders,
|
|
45
|
+
MarketplaceRankings: () => MarketplaceRankings,
|
|
46
|
+
NotFoundError: () => NotFoundError,
|
|
39
47
|
Onlist: () => Onlist,
|
|
40
48
|
OnlistError: () => OnlistError,
|
|
49
|
+
PermissionDeniedError: () => PermissionDeniedError,
|
|
41
50
|
ProviderError: () => ProviderError,
|
|
42
51
|
RateLimitError: () => RateLimitError,
|
|
43
|
-
VERSION: () => VERSION
|
|
52
|
+
VERSION: () => VERSION,
|
|
53
|
+
exchangeAuthCode: () => exchangeAuthCode,
|
|
54
|
+
generatePkce: () => generatePkce
|
|
44
55
|
});
|
|
45
56
|
module.exports = __toCommonJS(index_exports);
|
|
46
57
|
|
|
@@ -94,6 +105,24 @@ var ProviderError = class extends APIError {
|
|
|
94
105
|
this.name = "ProviderError";
|
|
95
106
|
}
|
|
96
107
|
};
|
|
108
|
+
var NotFoundError = class extends APIError {
|
|
109
|
+
constructor(message = "Not found", opts) {
|
|
110
|
+
super(message, { status: 404, ...opts });
|
|
111
|
+
this.name = "NotFoundError";
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
var BadRequestError = class extends APIError {
|
|
115
|
+
constructor(message = "Bad request", opts) {
|
|
116
|
+
super(message, { status: 400, ...opts });
|
|
117
|
+
this.name = "BadRequestError";
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
var PermissionDeniedError = class extends APIError {
|
|
121
|
+
constructor(message = "Permission denied", opts) {
|
|
122
|
+
super(message, { status: 403, ...opts });
|
|
123
|
+
this.name = "PermissionDeniedError";
|
|
124
|
+
}
|
|
125
|
+
};
|
|
97
126
|
function raiseForStatus(status, body) {
|
|
98
127
|
let error = {};
|
|
99
128
|
if (body && typeof body === "object" && "error" in body) {
|
|
@@ -107,18 +136,26 @@ function raiseForStatus(status, body) {
|
|
|
107
136
|
const code = typeof error.code === "string" ? error.code : null;
|
|
108
137
|
const param = typeof error.param === "string" ? error.param : null;
|
|
109
138
|
const opts = { status, type, code, param, body };
|
|
139
|
+
if (status === 400) throw new BadRequestError(message, opts);
|
|
110
140
|
if (status === 401) throw new AuthenticationError(message, opts);
|
|
111
141
|
if (status === 402) throw new InsufficientBalanceError(message, opts);
|
|
142
|
+
if (status === 403) throw new PermissionDeniedError(message, opts);
|
|
143
|
+
if (status === 404) throw new NotFoundError(message, opts);
|
|
112
144
|
if (status === 429) throw new RateLimitError(message, opts);
|
|
113
145
|
if (code && code.startsWith("no_provider")) throw new ProviderError(message, opts);
|
|
114
146
|
throw new APIError(message, opts);
|
|
115
147
|
}
|
|
116
148
|
|
|
117
149
|
// src/version.ts
|
|
118
|
-
var VERSION = "0.
|
|
150
|
+
var VERSION = "0.3.0";
|
|
119
151
|
|
|
120
|
-
// src/
|
|
152
|
+
// src/http.ts
|
|
121
153
|
var DEFAULT_TIMEOUT = 3e4;
|
|
154
|
+
var DEFAULT_MAX_RETRIES = 2;
|
|
155
|
+
var INITIAL_RETRY_DELAY = 500;
|
|
156
|
+
var MAX_RETRY_DELAY = 8e3;
|
|
157
|
+
var JITTER_FACTOR = 0.25;
|
|
158
|
+
var RETRYABLE_STATUSES = /* @__PURE__ */ new Set([408, 429, 500, 502, 503, 504]);
|
|
122
159
|
function encodePath(segment) {
|
|
123
160
|
return segment.split("/").map((s) => encodeURIComponent(s)).join("/");
|
|
124
161
|
}
|
|
@@ -137,86 +174,346 @@ async function parseResponse(response) {
|
|
|
137
174
|
}
|
|
138
175
|
return body;
|
|
139
176
|
}
|
|
177
|
+
function retryDelay(attempt, retryAfterHeader) {
|
|
178
|
+
if (retryAfterHeader) {
|
|
179
|
+
const seconds = Number(retryAfterHeader);
|
|
180
|
+
if (!isNaN(seconds) && seconds > 0) {
|
|
181
|
+
return Math.min(seconds * 1e3, MAX_RETRY_DELAY);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
const base = Math.min(INITIAL_RETRY_DELAY * 2 ** attempt, MAX_RETRY_DELAY);
|
|
185
|
+
const jitter = base * JITTER_FACTOR * (2 * Math.random() - 1);
|
|
186
|
+
return Math.max(0, base + jitter);
|
|
187
|
+
}
|
|
188
|
+
function buildFetchInit(opts, init) {
|
|
189
|
+
const headers = {
|
|
190
|
+
"User-Agent": `onlist-js/${VERSION}`,
|
|
191
|
+
Accept: "application/json",
|
|
192
|
+
...init?.headers
|
|
193
|
+
};
|
|
194
|
+
if (opts.apiKey) {
|
|
195
|
+
headers["Authorization"] = `Bearer ${opts.apiKey}`;
|
|
196
|
+
}
|
|
197
|
+
const signal = AbortSignal.timeout(opts.timeout ?? DEFAULT_TIMEOUT);
|
|
198
|
+
return { ...init, headers, signal };
|
|
199
|
+
}
|
|
200
|
+
async function fetchWithRetry(opts, path, init) {
|
|
201
|
+
const url = `${opts.baseURL.replace(/\/$/, "")}${path}`;
|
|
202
|
+
const fetchInit = buildFetchInit(opts, init);
|
|
203
|
+
const method = (init?.method ?? "GET").toUpperCase();
|
|
204
|
+
const maxRetries = method === "GET" ? opts.maxRetries ?? DEFAULT_MAX_RETRIES : 0;
|
|
205
|
+
let lastError;
|
|
206
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
207
|
+
try {
|
|
208
|
+
const response = await fetch(url, fetchInit);
|
|
209
|
+
if (response.ok || !RETRYABLE_STATUSES.has(response.status) || attempt === maxRetries) {
|
|
210
|
+
return response;
|
|
211
|
+
}
|
|
212
|
+
const delay = retryDelay(attempt, response.headers.get("Retry-After"));
|
|
213
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
214
|
+
} catch (err) {
|
|
215
|
+
lastError = err;
|
|
216
|
+
if (attempt === maxRetries) break;
|
|
217
|
+
const delay = retryDelay(attempt, null);
|
|
218
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
throw lastError;
|
|
222
|
+
}
|
|
223
|
+
function jsonBody(value) {
|
|
224
|
+
return {
|
|
225
|
+
body: JSON.stringify(value),
|
|
226
|
+
headers: { "Content-Type": "application/json" }
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// src/account.ts
|
|
231
|
+
function unwrap(body) {
|
|
232
|
+
if (body && typeof body === "object" && "data" in body) {
|
|
233
|
+
return body.data;
|
|
234
|
+
}
|
|
235
|
+
return body;
|
|
236
|
+
}
|
|
237
|
+
function base64url(bytes) {
|
|
238
|
+
let binary = "";
|
|
239
|
+
for (const b of bytes) binary += String.fromCharCode(b);
|
|
240
|
+
return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
241
|
+
}
|
|
242
|
+
async function generatePkce() {
|
|
243
|
+
const raw = new Uint8Array(32);
|
|
244
|
+
crypto.getRandomValues(raw);
|
|
245
|
+
const verifier = base64url(raw);
|
|
246
|
+
const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(verifier));
|
|
247
|
+
return { verifier, challenge: base64url(new Uint8Array(digest)) };
|
|
248
|
+
}
|
|
249
|
+
var DEFAULT_BASE_URL = "https://onlist.io";
|
|
250
|
+
async function exchangeAuthCode(code, opts) {
|
|
251
|
+
const resource = new AccountOAuth({
|
|
252
|
+
baseURL: opts?.baseURL ?? DEFAULT_BASE_URL,
|
|
253
|
+
timeout: opts?.timeout
|
|
254
|
+
});
|
|
255
|
+
return resource.exchange(code, opts?.codeVerifier ?? "");
|
|
256
|
+
}
|
|
257
|
+
var AccountCredits = class {
|
|
258
|
+
constructor(_opts) {
|
|
259
|
+
this._opts = _opts;
|
|
260
|
+
}
|
|
261
|
+
_opts;
|
|
262
|
+
/** Get lifetime credits purchased and credits used, in USD. */
|
|
263
|
+
async get() {
|
|
264
|
+
const resp = await fetchWithRetry(this._opts, "/api/v1/credits");
|
|
265
|
+
return unwrap(await parseResponse(resp));
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
var AccountGenerations = class {
|
|
269
|
+
constructor(_opts) {
|
|
270
|
+
this._opts = _opts;
|
|
271
|
+
}
|
|
272
|
+
_opts;
|
|
273
|
+
/**
|
|
274
|
+
* Look up one call by request ID.
|
|
275
|
+
*
|
|
276
|
+
* @param requestId The value of the `X-Oneapi-Request-Id` response header
|
|
277
|
+
* from the original call.
|
|
278
|
+
*/
|
|
279
|
+
async get(requestId) {
|
|
280
|
+
const search = new URLSearchParams({ id: requestId });
|
|
281
|
+
const resp = await fetchWithRetry(this._opts, `/api/v1/generation?${search}`);
|
|
282
|
+
return unwrap(await parseResponse(resp));
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
var AccountApiKeys = class {
|
|
286
|
+
constructor(_opts) {
|
|
287
|
+
this._opts = _opts;
|
|
288
|
+
}
|
|
289
|
+
_opts;
|
|
290
|
+
/** Describe the credential this client is using. */
|
|
291
|
+
async current() {
|
|
292
|
+
const resp = await fetchWithRetry(this._opts, "/api/v1/key");
|
|
293
|
+
return unwrap(await parseResponse(resp));
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* List inference keys.
|
|
297
|
+
*
|
|
298
|
+
* Pages are a fixed 100 keys and no total is returned: request
|
|
299
|
+
* `offset += 100` until you get a short page.
|
|
300
|
+
*/
|
|
301
|
+
async list(params) {
|
|
302
|
+
const search = new URLSearchParams();
|
|
303
|
+
search.set("offset", String(params?.offset ?? 0));
|
|
304
|
+
search.set("include_disabled", String(params?.include_disabled ?? false));
|
|
305
|
+
const resp = await fetchWithRetry(this._opts, `/api/v1/keys?${search}`);
|
|
306
|
+
return unwrap(await parseResponse(resp)) ?? [];
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Create an inference key.
|
|
310
|
+
*
|
|
311
|
+
* The plaintext secret is on `.key` of the result and is never retrievable
|
|
312
|
+
* again.
|
|
313
|
+
*
|
|
314
|
+
* @param name Display name for the key. Required.
|
|
315
|
+
*/
|
|
316
|
+
async create(name, params) {
|
|
317
|
+
const body = { name };
|
|
318
|
+
if (params?.limit !== void 0) body.limit = params.limit;
|
|
319
|
+
if (params?.limit_reset !== void 0) body.limit_reset = params.limit_reset;
|
|
320
|
+
if (params?.expires_at !== void 0) body.expires_at = params.expires_at;
|
|
321
|
+
const resp = await fetchWithRetry(this._opts, "/api/v1/keys", {
|
|
322
|
+
method: "POST",
|
|
323
|
+
...jsonBody(body)
|
|
324
|
+
});
|
|
325
|
+
return await parseResponse(resp);
|
|
326
|
+
}
|
|
327
|
+
/** Get one inference key by its `hash`. */
|
|
328
|
+
async get(hash) {
|
|
329
|
+
const resp = await fetchWithRetry(this._opts, `/api/v1/keys/${encodePath(hash)}`);
|
|
330
|
+
return unwrap(await parseResponse(resp));
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Update an inference key. Omitted fields are left unchanged.
|
|
334
|
+
*
|
|
335
|
+
* For `limit`, `limit_reset` and `expires_at`, passing `null` clears the
|
|
336
|
+
* value; leaving the field out leaves it alone.
|
|
337
|
+
*/
|
|
338
|
+
async update(hash, patch) {
|
|
339
|
+
const body = {};
|
|
340
|
+
if (patch.name !== void 0) body.name = patch.name;
|
|
341
|
+
if (patch.disabled !== void 0) body.disabled = patch.disabled;
|
|
342
|
+
if (patch.limit !== void 0) body.limit = patch.limit;
|
|
343
|
+
if (patch.limit_reset !== void 0) body.limit_reset = patch.limit_reset;
|
|
344
|
+
if (patch.expires_at !== void 0) body.expires_at = patch.expires_at;
|
|
345
|
+
const resp = await fetchWithRetry(this._opts, `/api/v1/keys/${encodePath(hash)}`, {
|
|
346
|
+
method: "PATCH",
|
|
347
|
+
...jsonBody(body)
|
|
348
|
+
});
|
|
349
|
+
return unwrap(await parseResponse(resp));
|
|
350
|
+
}
|
|
351
|
+
/** Delete an inference key. Resolves to `true` on success. */
|
|
352
|
+
async delete(hash) {
|
|
353
|
+
const resp = await fetchWithRetry(this._opts, `/api/v1/keys/${encodePath(hash)}`, {
|
|
354
|
+
method: "DELETE"
|
|
355
|
+
});
|
|
356
|
+
const data = unwrap(await parseResponse(resp));
|
|
357
|
+
return Boolean(data?.deleted);
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
var AccountActivity = class {
|
|
361
|
+
constructor(_opts) {
|
|
362
|
+
this._opts = _opts;
|
|
363
|
+
}
|
|
364
|
+
_opts;
|
|
365
|
+
/**
|
|
366
|
+
* List usage grouped by day, model and provider.
|
|
367
|
+
*
|
|
368
|
+
* Covers the last 30 complete UTC days; today is excluded.
|
|
369
|
+
*/
|
|
370
|
+
async list(params) {
|
|
371
|
+
const search = new URLSearchParams();
|
|
372
|
+
if (params?.date) search.set("date", params.date);
|
|
373
|
+
if (params?.api_key_hash) search.set("api_key_hash", params.api_key_hash);
|
|
374
|
+
const qs = search.toString();
|
|
375
|
+
const resp = await fetchWithRetry(this._opts, `/api/v1/activity${qs ? `?${qs}` : ""}`);
|
|
376
|
+
return unwrap(await parseResponse(resp)) ?? [];
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
var AccountOAuth = class {
|
|
380
|
+
constructor(_opts) {
|
|
381
|
+
this._opts = _opts;
|
|
382
|
+
}
|
|
383
|
+
_opts;
|
|
384
|
+
/**
|
|
385
|
+
* Exchange an authorization code for a new inference key.
|
|
386
|
+
*
|
|
387
|
+
* Unauthenticated, and single-use: the code is consumed even when the
|
|
388
|
+
* verifier turns out to be wrong, so a failure means restarting the
|
|
389
|
+
* browser flow.
|
|
390
|
+
*
|
|
391
|
+
* @param code The `code` query parameter from the callback URL.
|
|
392
|
+
* @param codeVerifier The verifier from {@link generatePkce}. Required
|
|
393
|
+
* whenever the authorization request carried a challenge.
|
|
394
|
+
*/
|
|
395
|
+
async exchange(code, codeVerifier = "") {
|
|
396
|
+
const resp = await fetchWithRetry(this._opts, "/api/v1/auth/keys", {
|
|
397
|
+
method: "POST",
|
|
398
|
+
...jsonBody({ code, code_verifier: codeVerifier })
|
|
399
|
+
});
|
|
400
|
+
return await parseResponse(resp);
|
|
401
|
+
}
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
// src/marketplace.ts
|
|
140
405
|
var MarketplaceModels = class {
|
|
141
406
|
constructor(_opts) {
|
|
142
407
|
this._opts = _opts;
|
|
143
408
|
}
|
|
144
409
|
_opts;
|
|
410
|
+
/** List models in the marketplace catalog. */
|
|
145
411
|
async list(params) {
|
|
146
412
|
const search = new URLSearchParams();
|
|
147
413
|
search.set("limit", String(params?.limit ?? 20));
|
|
148
414
|
search.set("offset", String(params?.offset ?? 0));
|
|
149
415
|
if (params?.q) search.set("q", params.q);
|
|
150
|
-
const resp = await this.
|
|
416
|
+
const resp = await fetchWithRetry(this._opts, `/api/mkt/models?${search}`);
|
|
151
417
|
return await parseResponse(resp);
|
|
152
418
|
}
|
|
419
|
+
/** Get detailed info for a specific model, including provider offers. */
|
|
153
420
|
async get(modelId) {
|
|
154
|
-
const resp = await this.
|
|
421
|
+
const resp = await fetchWithRetry(this._opts, `/api/mkt/models/${encodePath(modelId)}`);
|
|
155
422
|
let data = await parseResponse(resp);
|
|
156
423
|
if (data && typeof data === "object" && "data" in data) {
|
|
157
424
|
data = data.data;
|
|
158
425
|
}
|
|
159
426
|
return data;
|
|
160
427
|
}
|
|
161
|
-
_fetch(path, init) {
|
|
162
|
-
return fetchWithOpts(this._opts, path, init);
|
|
163
|
-
}
|
|
164
428
|
};
|
|
165
429
|
var MarketplaceProviders = class {
|
|
166
430
|
constructor(_opts) {
|
|
167
431
|
this._opts = _opts;
|
|
168
432
|
}
|
|
169
433
|
_opts;
|
|
434
|
+
/** List providers on the marketplace. */
|
|
170
435
|
async list(params) {
|
|
171
436
|
const search = new URLSearchParams();
|
|
172
437
|
if (params?.sort) search.set("sort", params.sort);
|
|
173
438
|
if (params?.q) search.set("q", params.q);
|
|
174
439
|
const qs = search.toString();
|
|
175
|
-
const resp = await this.
|
|
440
|
+
const resp = await fetchWithRetry(this._opts, `/api/mkt/providers${qs ? `?${qs}` : ""}`);
|
|
176
441
|
return await parseResponse(resp);
|
|
177
442
|
}
|
|
443
|
+
/** Get detailed info for a specific provider. */
|
|
178
444
|
async get(slug) {
|
|
179
|
-
const resp = await this.
|
|
445
|
+
const resp = await fetchWithRetry(this._opts, `/api/mkt/provider/${encodePath(slug)}`);
|
|
180
446
|
let data = await parseResponse(resp);
|
|
181
447
|
if (data && typeof data === "object" && "data" in data) {
|
|
182
448
|
data = data.data;
|
|
183
449
|
}
|
|
184
450
|
return data;
|
|
185
451
|
}
|
|
186
|
-
|
|
187
|
-
|
|
452
|
+
};
|
|
453
|
+
var MarketplaceRankings = class {
|
|
454
|
+
constructor(_opts) {
|
|
455
|
+
this._opts = _opts;
|
|
456
|
+
}
|
|
457
|
+
_opts;
|
|
458
|
+
/** Get the model usage leaderboard and chart series. */
|
|
459
|
+
async models(params) {
|
|
460
|
+
const search = new URLSearchParams();
|
|
461
|
+
if (params?.sort) search.set("sort", params.sort);
|
|
462
|
+
if (params?.window) search.set("window", params.window);
|
|
463
|
+
if (params?.limit != null) search.set("limit", String(params.limit));
|
|
464
|
+
if (params?.offset != null) search.set("offset", String(params.offset));
|
|
465
|
+
const qs = search.toString();
|
|
466
|
+
const resp = await fetchWithRetry(this._opts, `/api/mkt/rankings/models${qs ? `?${qs}` : ""}`);
|
|
467
|
+
return await parseResponse(resp);
|
|
468
|
+
}
|
|
469
|
+
/** Get the app rankings list. */
|
|
470
|
+
async apps(params) {
|
|
471
|
+
const search = new URLSearchParams();
|
|
472
|
+
if (params?.sort) search.set("sort", params.sort);
|
|
473
|
+
if (params?.window) search.set("window", params.window);
|
|
474
|
+
if (params?.category) search.set("category", params.category);
|
|
475
|
+
if (params?.subcategory) search.set("subcategory", params.subcategory);
|
|
476
|
+
if (params?.page != null) search.set("page", String(params.page));
|
|
477
|
+
if (params?.limit != null) search.set("limit", String(params.limit));
|
|
478
|
+
const qs = search.toString();
|
|
479
|
+
const resp = await fetchWithRetry(this._opts, `/api/mkt/apps${qs ? `?${qs}` : ""}`);
|
|
480
|
+
return await parseResponse(resp);
|
|
188
481
|
}
|
|
189
482
|
};
|
|
190
483
|
var Marketplace = class {
|
|
484
|
+
/** Browse and search models. */
|
|
191
485
|
models;
|
|
486
|
+
/** Browse and search providers. */
|
|
192
487
|
providers;
|
|
488
|
+
/** Model and app usage rankings. */
|
|
489
|
+
rankings;
|
|
193
490
|
constructor(opts) {
|
|
194
491
|
this.models = new MarketplaceModels(opts);
|
|
195
492
|
this.providers = new MarketplaceProviders(opts);
|
|
493
|
+
this.rankings = new MarketplaceRankings(opts);
|
|
196
494
|
}
|
|
197
495
|
};
|
|
198
|
-
function fetchWithOpts(opts, path, init) {
|
|
199
|
-
const url = `${opts.baseURL.replace(/\/$/, "")}${path}`;
|
|
200
|
-
const headers = {
|
|
201
|
-
"User-Agent": `onlist-js/${VERSION}`,
|
|
202
|
-
Accept: "application/json",
|
|
203
|
-
...init?.headers
|
|
204
|
-
};
|
|
205
|
-
if (opts.apiKey) {
|
|
206
|
-
headers["Authorization"] = `Bearer ${opts.apiKey}`;
|
|
207
|
-
}
|
|
208
|
-
const signal = AbortSignal.timeout(opts.timeout ?? DEFAULT_TIMEOUT);
|
|
209
|
-
return fetch(url, { ...init, headers, signal });
|
|
210
|
-
}
|
|
211
496
|
|
|
212
497
|
// src/client.ts
|
|
213
498
|
var BASE_URL = "https://onlist.io/v1";
|
|
214
499
|
var MARKETPLACE_BASE_URL = "https://onlist.io";
|
|
215
|
-
var ENV_API_KEY = "ONLIST_API_KEY";
|
|
216
500
|
var Onlist = class extends import_openai.default {
|
|
501
|
+
/** Access to marketplace data: models, providers, and rankings. */
|
|
217
502
|
marketplace;
|
|
503
|
+
/** Account balance. */
|
|
504
|
+
credits;
|
|
505
|
+
/** Cost and timing for individual calls. */
|
|
506
|
+
generations;
|
|
507
|
+
/** Inference key management. */
|
|
508
|
+
apiKeys;
|
|
509
|
+
/** Daily usage rollups. */
|
|
510
|
+
activity;
|
|
511
|
+
/** Sign in with Onlist — the PKCE code exchange. */
|
|
512
|
+
oauth;
|
|
513
|
+
/** The credential the account API is using. */
|
|
514
|
+
managementKey;
|
|
218
515
|
constructor(opts) {
|
|
219
|
-
const apiKey = opts?.apiKey ?? (typeof process !== "undefined" ? process.env?.
|
|
516
|
+
const apiKey = opts?.apiKey ?? (typeof process !== "undefined" ? process.env?.ONLIST_API_KEY ?? process.env?.OPENAI_API_KEY : void 0) ?? void 0;
|
|
220
517
|
const baseURL = opts?.baseURL ?? BASE_URL;
|
|
221
518
|
super({
|
|
222
519
|
...opts,
|
|
@@ -231,22 +528,45 @@ var Onlist = class extends import_openai.default {
|
|
|
231
528
|
const marketplaceBase = String(baseURL).split("/v1")[0] || MARKETPLACE_BASE_URL;
|
|
232
529
|
this.marketplace = new Marketplace({
|
|
233
530
|
apiKey: this.apiKey,
|
|
234
|
-
baseURL: marketplaceBase
|
|
531
|
+
baseURL: marketplaceBase,
|
|
532
|
+
maxRetries: opts?.maxRetries
|
|
235
533
|
});
|
|
534
|
+
this.managementKey = opts?.managementKey ?? (typeof process !== "undefined" ? process.env?.ONLIST_MANAGEMENT_KEY : void 0) ?? this.apiKey ?? void 0;
|
|
535
|
+
const accountOpts = {
|
|
536
|
+
apiKey: this.managementKey,
|
|
537
|
+
baseURL: marketplaceBase,
|
|
538
|
+
maxRetries: opts?.maxRetries
|
|
539
|
+
};
|
|
540
|
+
this.credits = new AccountCredits(accountOpts);
|
|
541
|
+
this.generations = new AccountGenerations(accountOpts);
|
|
542
|
+
this.apiKeys = new AccountApiKeys(accountOpts);
|
|
543
|
+
this.activity = new AccountActivity(accountOpts);
|
|
544
|
+
this.oauth = new AccountOAuth(accountOpts);
|
|
236
545
|
}
|
|
237
546
|
};
|
|
238
547
|
// Annotate the CommonJS export names for ESM import in node:
|
|
239
548
|
0 && (module.exports = {
|
|
240
549
|
APIError,
|
|
550
|
+
AccountActivity,
|
|
551
|
+
AccountApiKeys,
|
|
552
|
+
AccountCredits,
|
|
553
|
+
AccountGenerations,
|
|
554
|
+
AccountOAuth,
|
|
241
555
|
AuthenticationError,
|
|
556
|
+
BadRequestError,
|
|
242
557
|
InsufficientBalanceError,
|
|
243
558
|
Marketplace,
|
|
244
559
|
MarketplaceModels,
|
|
245
560
|
MarketplaceProviders,
|
|
561
|
+
MarketplaceRankings,
|
|
562
|
+
NotFoundError,
|
|
246
563
|
Onlist,
|
|
247
564
|
OnlistError,
|
|
565
|
+
PermissionDeniedError,
|
|
248
566
|
ProviderError,
|
|
249
567
|
RateLimitError,
|
|
250
|
-
VERSION
|
|
568
|
+
VERSION,
|
|
569
|
+
exchangeAuthCode,
|
|
570
|
+
generatePkce
|
|
251
571
|
});
|
|
252
572
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/errors.ts","../src/version.ts","../src/marketplace.ts"],"sourcesContent":["export { Onlist } from \"./client.js\";\nexport type { OnlistOptions } from \"./client.js\";\n\nexport { Marketplace, MarketplaceModels, MarketplaceProviders } from \"./marketplace.js\";\nexport type { MarketplaceOptions } from \"./marketplace.js\";\n\nexport {\n OnlistError,\n APIError,\n AuthenticationError,\n InsufficientBalanceError,\n RateLimitError,\n ProviderError,\n} from \"./errors.js\";\n\nexport type {\n Pricing,\n Architecture,\n TopProvider,\n Model,\n ProviderOffer,\n ModelDetail,\n ModelListResponse,\n Provider,\n ProviderDetail,\n ProviderListResponse,\n MaxPrice,\n ProviderRouting,\n} from \"./types/index.js\";\n\nexport { VERSION } from \"./version.js\";\n","import OpenAI from \"openai\";\nimport type { ClientOptions } from \"openai\";\nimport { Marketplace } from \"./marketplace.js\";\nimport { VERSION } from \"./version.js\";\n\nconst BASE_URL = \"https://onlist.io/v1\";\nconst MARKETPLACE_BASE_URL = \"https://onlist.io\";\nconst ENV_API_KEY = \"ONLIST_API_KEY\";\n\nexport interface OnlistOptions extends Omit<ClientOptions, \"apiKey\" | \"baseURL\"> {\n apiKey?: string | null;\n baseURL?: string | null;\n}\n\nexport class Onlist extends OpenAI {\n readonly marketplace: Marketplace;\n\n constructor(opts?: OnlistOptions) {\n const apiKey =\n opts?.apiKey ??\n (typeof process !== \"undefined\" ? process.env?.[ENV_API_KEY] : undefined) ??\n undefined;\n\n const baseURL = opts?.baseURL ?? BASE_URL;\n\n super({\n ...opts,\n apiKey: apiKey ?? undefined,\n baseURL,\n defaultHeaders: {\n \"User-Agent\": `onlist-js/${VERSION}`,\n \"HTTP-Referer\": \"https://onlist.io\",\n ...opts?.defaultHeaders,\n },\n });\n\n const marketplaceBase = String(baseURL).split(\"/v1\")[0] || MARKETPLACE_BASE_URL;\n\n this.marketplace = new Marketplace({\n apiKey: this.apiKey,\n baseURL: marketplaceBase,\n });\n }\n}\n","export class OnlistError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"OnlistError\";\n }\n}\n\nexport class APIError extends OnlistError {\n readonly status: number;\n readonly type: string | null;\n readonly code: string | null;\n readonly param: string | null;\n readonly body: unknown;\n\n constructor(\n message: string,\n opts: {\n status: number;\n type?: string | null;\n code?: string | null;\n param?: string | null;\n body?: unknown;\n },\n ) {\n super(message);\n this.name = \"APIError\";\n this.status = opts.status;\n this.type = opts.type ?? null;\n this.code = opts.code ?? null;\n this.param = opts.param ?? null;\n this.body = opts.body ?? null;\n }\n}\n\nexport class AuthenticationError extends APIError {\n constructor(message = \"Invalid API key\", opts?: Partial<ConstructorParameters<typeof APIError>[1]>) {\n super(message, { status: 401, ...opts });\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class InsufficientBalanceError extends APIError {\n constructor(message = \"Insufficient balance\", opts?: Partial<ConstructorParameters<typeof APIError>[1]>) {\n super(message, { status: 402, ...opts });\n this.name = \"InsufficientBalanceError\";\n }\n}\n\nexport class RateLimitError extends APIError {\n constructor(message = \"Rate limited\", opts?: Partial<ConstructorParameters<typeof APIError>[1]>) {\n super(message, { status: 429, ...opts });\n this.name = \"RateLimitError\";\n }\n}\n\nexport class ProviderError extends APIError {\n constructor(message: string, opts: ConstructorParameters<typeof APIError>[1]) {\n super(message, opts);\n this.name = \"ProviderError\";\n }\n}\n\nexport function raiseForStatus(status: number, body: unknown): never {\n let error: Record<string, unknown> = {};\n if (body && typeof body === \"object\" && \"error\" in body) {\n const e = (body as Record<string, unknown>).error;\n error = typeof e === \"object\" && e !== null ? (e as Record<string, unknown>) : {};\n } else if (body && typeof body === \"object\") {\n error = body as Record<string, unknown>;\n }\n\n const message = (typeof error.message === \"string\" ? error.message : String(body)) || \"Unknown error\";\n const type = typeof error.type === \"string\" ? error.type : null;\n const code = typeof error.code === \"string\" ? error.code : null;\n const param = typeof error.param === \"string\" ? error.param : null;\n const opts = { status, type, code, param, body };\n\n if (status === 401) throw new AuthenticationError(message, opts);\n if (status === 402) throw new InsufficientBalanceError(message, opts);\n if (status === 429) throw new RateLimitError(message, opts);\n if (code && code.startsWith(\"no_provider\")) throw new ProviderError(message, opts);\n\n throw new APIError(message, opts);\n}\n","export const VERSION = \"0.1.0\";\n","import { raiseForStatus } from \"./errors.js\";\nimport { VERSION } from \"./version.js\";\nimport type { ModelDetail, ModelListResponse } from \"./types/model.js\";\nimport type { ProviderDetail, ProviderListResponse } from \"./types/provider.js\";\n\nconst DEFAULT_TIMEOUT = 30_000;\n\nfunction encodePath(segment: string): string {\n return segment\n .split(\"/\")\n .map((s) => encodeURIComponent(s))\n .join(\"/\");\n}\n\nasync function parseResponse(response: Response): Promise<unknown> {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = await response.text().catch(() => \"\");\n }\n\n if (!response.ok) {\n raiseForStatus(response.status, body);\n }\n\n if (body && typeof body === \"object\" && \"data\" in body && \"success\" in body) {\n return (body as Record<string, unknown>).data;\n }\n return body;\n}\n\nexport interface MarketplaceOptions {\n apiKey?: string | null;\n baseURL: string;\n timeout?: number;\n}\n\nexport class MarketplaceModels {\n constructor(private readonly _opts: MarketplaceOptions) {}\n\n async list(params?: { limit?: number; offset?: number; q?: string }): Promise<ModelListResponse> {\n const search = new URLSearchParams();\n search.set(\"limit\", String(params?.limit ?? 20));\n search.set(\"offset\", String(params?.offset ?? 0));\n if (params?.q) search.set(\"q\", params.q);\n\n const resp = await this._fetch(`/api/mkt/models?${search}`);\n return (await parseResponse(resp)) as ModelListResponse;\n }\n\n async get(modelId: string): Promise<ModelDetail> {\n const resp = await this._fetch(`/api/mkt/models/${encodePath(modelId)}`);\n let data = (await parseResponse(resp)) as Record<string, unknown>;\n if (data && typeof data === \"object\" && \"data\" in data) {\n data = data.data as Record<string, unknown>;\n }\n return data as unknown as ModelDetail;\n }\n\n private _fetch(path: string, init?: RequestInit): Promise<Response> {\n return fetchWithOpts(this._opts, path, init);\n }\n}\n\nexport class MarketplaceProviders {\n constructor(private readonly _opts: MarketplaceOptions) {}\n\n async list(params?: { sort?: string; q?: string }): Promise<ProviderListResponse> {\n const search = new URLSearchParams();\n if (params?.sort) search.set(\"sort\", params.sort);\n if (params?.q) search.set(\"q\", params.q);\n\n const qs = search.toString();\n const resp = await this._fetch(`/api/mkt/providers${qs ? `?${qs}` : \"\"}`);\n return (await parseResponse(resp)) as ProviderListResponse;\n }\n\n async get(slug: string): Promise<ProviderDetail> {\n const resp = await this._fetch(`/api/mkt/provider/${encodePath(slug)}`);\n let data = (await parseResponse(resp)) as Record<string, unknown>;\n if (data && typeof data === \"object\" && \"data\" in data) {\n data = data.data as Record<string, unknown>;\n }\n return data as unknown as ProviderDetail;\n }\n\n private _fetch(path: string, init?: RequestInit): Promise<Response> {\n return fetchWithOpts(this._opts, path, init);\n }\n}\n\nexport class Marketplace {\n readonly models: MarketplaceModels;\n readonly providers: MarketplaceProviders;\n\n constructor(opts: MarketplaceOptions) {\n this.models = new MarketplaceModels(opts);\n this.providers = new MarketplaceProviders(opts);\n }\n}\n\nfunction fetchWithOpts(opts: MarketplaceOptions, path: string, init?: RequestInit): Promise<Response> {\n const url = `${opts.baseURL.replace(/\\/$/, \"\")}${path}`;\n const headers: Record<string, string> = {\n \"User-Agent\": `onlist-js/${VERSION}`,\n Accept: \"application/json\",\n ...(init?.headers as Record<string, string>),\n };\n if (opts.apiKey) {\n headers[\"Authorization\"] = `Bearer ${opts.apiKey}`;\n }\n const signal = AbortSignal.timeout(opts.timeout ?? DEFAULT_TIMEOUT);\n return fetch(url, { ...init, headers, signal });\n}\n"],"mappings":"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","names":["OpenAI"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/errors.ts","../src/version.ts","../src/http.ts","../src/account.ts","../src/marketplace.ts"],"sourcesContent":["export { Onlist } from \"./client.js\";\nexport type { OnlistOptions } from \"./client.js\";\n\nexport { Marketplace, MarketplaceModels, MarketplaceProviders, MarketplaceRankings } from \"./marketplace.js\";\nexport type { MarketplaceOptions } from \"./marketplace.js\";\n\nexport {\n AccountActivity,\n AccountApiKeys,\n AccountCredits,\n AccountGenerations,\n AccountOAuth,\n exchangeAuthCode,\n generatePkce,\n} from \"./account.js\";\nexport type { AccountOptions } from \"./account.js\";\n\nexport {\n OnlistError,\n APIError,\n AuthenticationError,\n BadRequestError,\n InsufficientBalanceError,\n NotFoundError,\n PermissionDeniedError,\n RateLimitError,\n ProviderError,\n} from \"./errors.js\";\n\nexport type {\n Pricing,\n Architecture,\n TopProvider,\n Model,\n ProviderOffer,\n ModelDetail,\n ModelListResponse,\n Provider,\n ProviderDetail,\n ProviderListResponse,\n MaxPrice,\n ProviderRouting,\n ModelRanking,\n ModelSeriesPoint,\n ModelRankingsResponse,\n ModelRankingsParams,\n AppRanking,\n AppRankingsResponse,\n AppRankingsParams,\n RateLimit,\n APIKey,\n CurrentKey,\n CreatedKey,\n CreateKeyParams,\n UpdateKeyParams,\n ListKeysParams,\n Credits,\n Generation,\n ActivityRow,\n ActivityParams,\n ExchangedKey,\n PkcePair,\n} from \"./types/index.js\";\n\nexport { VERSION } from \"./version.js\";\n","import OpenAI from \"openai\";\nimport type { ClientOptions } from \"openai\";\nimport {\n AccountActivity,\n AccountApiKeys,\n AccountCredits,\n AccountGenerations,\n AccountOAuth,\n} from \"./account.js\";\nimport { Marketplace } from \"./marketplace.js\";\nimport { VERSION } from \"./version.js\";\n\nconst BASE_URL = \"https://onlist.io/v1\";\nconst MARKETPLACE_BASE_URL = \"https://onlist.io\";\n\n/** Options for creating an Onlist client. */\nexport interface OnlistOptions extends Omit<ClientOptions, \"apiKey\" | \"baseURL\"> {\n /** API key. Falls back to ONLIST_API_KEY then OPENAI_API_KEY env vars. */\n apiKey?: string | null;\n /**\n * Management key (`mgmt_...`) for the account API. Falls back to\n * ONLIST_MANAGEMENT_KEY, then to the API key.\n */\n managementKey?: string | null;\n /** Base URL for the API. Defaults to https://onlist.io/v1. */\n baseURL?: string | null;\n /** Maximum retry attempts for marketplace and account API calls. Defaults to 2. */\n maxRetries?: number;\n}\n\n/** Onlist API client, extending the OpenAI SDK with marketplace and account features. */\nexport class Onlist extends OpenAI {\n /** Access to marketplace data: models, providers, and rankings. */\n readonly marketplace: Marketplace;\n /** Account balance. */\n readonly credits: AccountCredits;\n /** Cost and timing for individual calls. */\n readonly generations: AccountGenerations;\n /** Inference key management. */\n readonly apiKeys: AccountApiKeys;\n /** Daily usage rollups. */\n readonly activity: AccountActivity;\n /** Sign in with Onlist — the PKCE code exchange. */\n readonly oauth: AccountOAuth;\n /** The credential the account API is using. */\n readonly managementKey: string | undefined;\n\n constructor(opts?: OnlistOptions) {\n const apiKey =\n opts?.apiKey ??\n (typeof process !== \"undefined\"\n ? process.env?.ONLIST_API_KEY ?? process.env?.OPENAI_API_KEY\n : undefined) ??\n undefined;\n\n const baseURL = opts?.baseURL ?? BASE_URL;\n\n super({\n ...opts,\n apiKey: apiKey ?? undefined,\n baseURL,\n defaultHeaders: {\n \"User-Agent\": `onlist-js/${VERSION}`,\n \"HTTP-Referer\": \"https://onlist.io\",\n ...opts?.defaultHeaders,\n },\n });\n\n const marketplaceBase = String(baseURL).split(\"/v1\")[0] || MARKETPLACE_BASE_URL;\n\n this.marketplace = new Marketplace({\n apiKey: this.apiKey,\n baseURL: marketplaceBase,\n maxRetries: opts?.maxRetries,\n });\n\n // Falls back to the inference key so that a client built the OpenRouter\n // way — one key, one keyhole — still reaches the account endpoints.\n // Whether that key is allowed there is the server's call: the SDK never\n // inspects key prefixes locally, it just surfaces the 403.\n this.managementKey =\n opts?.managementKey ??\n (typeof process !== \"undefined\" ? process.env?.ONLIST_MANAGEMENT_KEY : undefined) ??\n this.apiKey ??\n undefined;\n\n const accountOpts = {\n apiKey: this.managementKey,\n baseURL: marketplaceBase,\n maxRetries: opts?.maxRetries,\n };\n this.credits = new AccountCredits(accountOpts);\n this.generations = new AccountGenerations(accountOpts);\n this.apiKeys = new AccountApiKeys(accountOpts);\n this.activity = new AccountActivity(accountOpts);\n this.oauth = new AccountOAuth(accountOpts);\n }\n}\n","/** Base error class for all Onlist SDK errors. */\nexport class OnlistError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"OnlistError\";\n }\n}\n\n/** Error thrown when an API request fails. */\nexport class APIError extends OnlistError {\n readonly status: number;\n readonly type: string | null;\n readonly code: string | null;\n readonly param: string | null;\n readonly body: unknown;\n\n constructor(\n message: string,\n opts: {\n status: number;\n type?: string | null;\n code?: string | null;\n param?: string | null;\n body?: unknown;\n },\n ) {\n super(message);\n this.name = \"APIError\";\n this.status = opts.status;\n this.type = opts.type ?? null;\n this.code = opts.code ?? null;\n this.param = opts.param ?? null;\n this.body = opts.body ?? null;\n }\n}\n\n/** Error thrown when the API key is invalid or missing. */\nexport class AuthenticationError extends APIError {\n constructor(message = \"Invalid API key\", opts?: Partial<ConstructorParameters<typeof APIError>[1]>) {\n super(message, { status: 401, ...opts });\n this.name = \"AuthenticationError\";\n }\n}\n\n/** Error thrown when the account balance is insufficient. */\nexport class InsufficientBalanceError extends APIError {\n constructor(message = \"Insufficient balance\", opts?: Partial<ConstructorParameters<typeof APIError>[1]>) {\n super(message, { status: 402, ...opts });\n this.name = \"InsufficientBalanceError\";\n }\n}\n\n/** Error thrown when the request is rate-limited. */\nexport class RateLimitError extends APIError {\n constructor(message = \"Rate limited\", opts?: Partial<ConstructorParameters<typeof APIError>[1]>) {\n super(message, { status: 429, ...opts });\n this.name = \"RateLimitError\";\n }\n}\n\n/** Error thrown when no matching provider is available. */\nexport class ProviderError extends APIError {\n constructor(message: string, opts: ConstructorParameters<typeof APIError>[1]) {\n super(message, opts);\n this.name = \"ProviderError\";\n }\n}\n\n/** Error thrown when a requested resource is not found. */\nexport class NotFoundError extends APIError {\n constructor(message = \"Not found\", opts?: Partial<ConstructorParameters<typeof APIError>[1]>) {\n super(message, { status: 404, ...opts });\n this.name = \"NotFoundError\";\n }\n}\n\n/** Error thrown when the request is malformed or its parameters are rejected. */\nexport class BadRequestError extends APIError {\n constructor(message = \"Bad request\", opts?: Partial<ConstructorParameters<typeof APIError>[1]>) {\n super(message, { status: 400, ...opts });\n this.name = \"BadRequestError\";\n }\n}\n\n/**\n * Error thrown when the credential is valid but not allowed here.\n *\n * Most commonly: an inference key (`sk-...`) was used on an endpoint that\n * only accepts a management key (`mgmt_...`). The server's message is passed\n * through unchanged.\n */\nexport class PermissionDeniedError extends APIError {\n constructor(\n message = \"Permission denied\",\n opts?: Partial<ConstructorParameters<typeof APIError>[1]>,\n ) {\n super(message, { status: 403, ...opts });\n this.name = \"PermissionDeniedError\";\n }\n}\n\nexport function raiseForStatus(status: number, body: unknown): never {\n let error: Record<string, unknown> = {};\n if (body && typeof body === \"object\" && \"error\" in body) {\n const e = (body as Record<string, unknown>).error;\n error = typeof e === \"object\" && e !== null ? (e as Record<string, unknown>) : {};\n } else if (body && typeof body === \"object\") {\n error = body as Record<string, unknown>;\n }\n\n const message = (typeof error.message === \"string\" ? error.message : String(body)) || \"Unknown error\";\n const type = typeof error.type === \"string\" ? error.type : null;\n // The account face sends `code` as the HTTP status (an int), the\n // marketplace as a string slug. Only strings survive to `code`.\n const code = typeof error.code === \"string\" ? error.code : null;\n const param = typeof error.param === \"string\" ? error.param : null;\n const opts = { status, type, code, param, body };\n\n if (status === 400) throw new BadRequestError(message, opts);\n if (status === 401) throw new AuthenticationError(message, opts);\n if (status === 402) throw new InsufficientBalanceError(message, opts);\n if (status === 403) throw new PermissionDeniedError(message, opts);\n if (status === 404) throw new NotFoundError(message, opts);\n if (status === 429) throw new RateLimitError(message, opts);\n if (code && code.startsWith(\"no_provider\")) throw new ProviderError(message, opts);\n\n throw new APIError(message, opts);\n}\n","export const VERSION = \"0.3.0\";\n","import { raiseForStatus } from \"./errors.js\";\nimport { VERSION } from \"./version.js\";\n\nexport const DEFAULT_TIMEOUT = 30_000;\nexport const DEFAULT_MAX_RETRIES = 2;\nconst INITIAL_RETRY_DELAY = 500;\nconst MAX_RETRY_DELAY = 8_000;\nconst JITTER_FACTOR = 0.25;\n\n/** Retryable status codes: timeouts, rate limits, and server errors. */\nexport const RETRYABLE_STATUSES = new Set([408, 429, 500, 502, 503, 504]);\n\n/** Shared options for the REST resources (marketplace and account). */\nexport interface RequestOptions {\n apiKey?: string | null;\n baseURL: string;\n timeout?: number;\n /** Maximum retry attempts for failed requests. Defaults to 2. */\n maxRetries?: number;\n}\n\nexport function encodePath(segment: string): string {\n return segment\n .split(\"/\")\n .map((s) => encodeURIComponent(s))\n .join(\"/\");\n}\n\nexport async function parseResponse(response: Response): Promise<unknown> {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = await response.text().catch(() => \"\");\n }\n\n if (!response.ok) {\n raiseForStatus(response.status, body);\n }\n\n // Only the marketplace envelope ({success, data}) is unwrapped here. The\n // account face uses OpenRouter's {data} without `success`, and POST /keys\n // returns {data, key} where the sibling field is the whole point —\n // unwrapping either one would silently drop data.\n if (body && typeof body === \"object\" && \"data\" in body && \"success\" in body) {\n return (body as Record<string, unknown>).data;\n }\n return body;\n}\n\n/** Calculates the retry delay with exponential backoff and jitter. */\nexport function retryDelay(attempt: number, retryAfterHeader: string | null): number {\n if (retryAfterHeader) {\n const seconds = Number(retryAfterHeader);\n if (!isNaN(seconds) && seconds > 0) {\n return Math.min(seconds * 1000, MAX_RETRY_DELAY);\n }\n }\n const base = Math.min(INITIAL_RETRY_DELAY * 2 ** attempt, MAX_RETRY_DELAY);\n const jitter = base * JITTER_FACTOR * (2 * Math.random() - 1);\n return Math.max(0, base + jitter);\n}\n\nexport function buildFetchInit(opts: RequestOptions, init?: RequestInit): RequestInit {\n const headers: Record<string, string> = {\n \"User-Agent\": `onlist-js/${VERSION}`,\n Accept: \"application/json\",\n ...(init?.headers as Record<string, string>),\n };\n if (opts.apiKey) {\n headers[\"Authorization\"] = `Bearer ${opts.apiKey}`;\n }\n const signal = AbortSignal.timeout(opts.timeout ?? DEFAULT_TIMEOUT);\n return { ...init, headers, signal };\n}\n\nexport async function fetchWithRetry(\n opts: RequestOptions,\n path: string,\n init?: RequestInit,\n): Promise<Response> {\n const url = `${opts.baseURL.replace(/\\/$/, \"\")}${path}`;\n const fetchInit = buildFetchInit(opts, init);\n // Only idempotent GETs are replayed. A retried POST /api/v1/keys mints a\n // second key and a retried OAuth exchange burns the authorization code;\n // in both cases the caller ends up worse off than seeing the error.\n const method = (init?.method ?? \"GET\").toUpperCase();\n const maxRetries = method === \"GET\" ? opts.maxRetries ?? DEFAULT_MAX_RETRIES : 0;\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const response = await fetch(url, fetchInit);\n if (response.ok || !RETRYABLE_STATUSES.has(response.status) || attempt === maxRetries) {\n return response;\n }\n const delay = retryDelay(attempt, response.headers.get(\"Retry-After\"));\n await new Promise((resolve) => setTimeout(resolve, delay));\n } catch (err) {\n lastError = err;\n if (attempt === maxRetries) break;\n const delay = retryDelay(attempt, null);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n throw lastError;\n}\n\n/** Serialise a JSON request body with the header fetch needs for it. */\nexport function jsonBody(value: unknown): RequestInit {\n return {\n body: JSON.stringify(value),\n headers: { \"Content-Type\": \"application/json\" },\n };\n}\n","/**\n * Account resources — the OpenRouter-compatible `/api/v1/*` face.\n *\n * Namespaces follow the wire path segments (`credits`, `generations`,\n * `apiKeys`, `activity`) and methods use a fixed verb set\n * (`list`/`get`/`create`/`update`/`delete`). Two departures, both forced:\n * `GET /api/v1/key` has no matching verb so it is `apiKeys.current()`, and\n * `/api/v1/auth/*` would read as client authentication config so the\n * namespace is `oauth`.\n *\n * Most of these endpoints require a **management key** (`mgmt_...`). The SDK\n * does not inspect key prefixes locally — it sends whatever credential it\n * was given and surfaces the server's 403 as `PermissionDeniedError`.\n */\n\nimport {\n encodePath,\n fetchWithRetry,\n jsonBody,\n parseResponse,\n type RequestOptions,\n} from \"./http.js\";\nimport type {\n ActivityParams,\n ActivityRow,\n APIKey,\n CreatedKey,\n CreateKeyParams,\n Credits,\n CurrentKey,\n ExchangedKey,\n Generation,\n ListKeysParams,\n PkcePair,\n UpdateKeyParams,\n} from \"./types/account.js\";\n\n/** Options for creating the account resources. */\nexport type AccountOptions = RequestOptions;\n\n/**\n * Unwrap the OpenRouter `{data: …}` envelope.\n *\n * Only used where the payload is entirely inside `data`. `POST /keys` and\n * `POST /auth/keys` carry fields alongside it and are parsed whole.\n */\nfunction unwrap(body: unknown): unknown {\n if (body && typeof body === \"object\" && \"data\" in body) {\n return (body as Record<string, unknown>).data;\n }\n return body;\n}\n\nfunction base64url(bytes: Uint8Array): string {\n let binary = \"\";\n for (const b of bytes) binary += String.fromCharCode(b);\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\n/**\n * Generate an S256 PKCE `{verifier, challenge}` pair.\n *\n * Send the challenge to `/auth` when starting the browser flow, keep the\n * verifier in memory, and pass it back to `oauth.exchange()`:\n *\n * ```typescript\n * const { verifier, challenge } = await generatePkce();\n * window.location.href =\n * `https://onlist.io/auth?callback_url=${cb}` +\n * `&code_challenge=${challenge}&code_challenge_method=S256`;\n * ```\n */\nexport async function generatePkce(): Promise<PkcePair> {\n const raw = new Uint8Array(32);\n crypto.getRandomValues(raw);\n const verifier = base64url(raw);\n const digest = await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(verifier));\n return { verifier, challenge: base64url(new Uint8Array(digest)) };\n}\n\nconst DEFAULT_BASE_URL = \"https://onlist.io\";\n\n/**\n * Exchange a PKCE authorization code for an inference key, with no client.\n *\n * `client.oauth.exchange()` does the same thing, but constructing an\n * {@link Onlist} requires an API key — and an app running the \"Sign in with\n * Onlist\" flow does not have one yet. That is the entire point of the flow,\n * so it gets a credential-free entry point:\n *\n * ```typescript\n * const { verifier, challenge } = await generatePkce();\n * // ...user approves in the browser, your callback receives ?code=...\n * const result = await exchangeAuthCode(code, { codeVerifier: verifier });\n * const client = new Onlist({ apiKey: result.key });\n * ```\n *\n * Single-use: the code is consumed even when the verifier turns out to be\n * wrong, so a failure means restarting the browser flow.\n */\nexport async function exchangeAuthCode(\n code: string,\n opts?: { codeVerifier?: string; baseURL?: string; timeout?: number },\n): Promise<ExchangedKey> {\n const resource = new AccountOAuth({\n baseURL: opts?.baseURL ?? DEFAULT_BASE_URL,\n timeout: opts?.timeout,\n });\n return resource.exchange(code, opts?.codeVerifier ?? \"\");\n}\n\n/** Account balance. Requires a management key. */\nexport class AccountCredits {\n constructor(private readonly _opts: AccountOptions) {}\n\n /** Get lifetime credits purchased and credits used, in USD. */\n async get(): Promise<Credits> {\n const resp = await fetchWithRetry(this._opts, \"/api/v1/credits\");\n return unwrap(await parseResponse(resp)) as Credits;\n }\n}\n\n/**\n * Per-call cost and timing.\n *\n * Accepts either credential type: an inference key can look up only the\n * calls it made, a management key any call on the account.\n */\nexport class AccountGenerations {\n constructor(private readonly _opts: AccountOptions) {}\n\n /**\n * Look up one call by request ID.\n *\n * @param requestId The value of the `X-Oneapi-Request-Id` response header\n * from the original call.\n */\n async get(requestId: string): Promise<Generation> {\n const search = new URLSearchParams({ id: requestId });\n const resp = await fetchWithRetry(this._opts, `/api/v1/generation?${search}`);\n return unwrap(await parseResponse(resp)) as Generation;\n }\n}\n\n/**\n * Manage inference keys (`sk-...`). Requires a management key.\n *\n * The exception is {@link current}, which answers for whichever credential\n * made the request.\n */\nexport class AccountApiKeys {\n constructor(private readonly _opts: AccountOptions) {}\n\n /** Describe the credential this client is using. */\n async current(): Promise<CurrentKey> {\n const resp = await fetchWithRetry(this._opts, \"/api/v1/key\");\n return unwrap(await parseResponse(resp)) as CurrentKey;\n }\n\n /**\n * List inference keys.\n *\n * Pages are a fixed 100 keys and no total is returned: request\n * `offset += 100` until you get a short page.\n */\n async list(params?: ListKeysParams): Promise<APIKey[]> {\n const search = new URLSearchParams();\n search.set(\"offset\", String(params?.offset ?? 0));\n search.set(\"include_disabled\", String(params?.include_disabled ?? false));\n\n const resp = await fetchWithRetry(this._opts, `/api/v1/keys?${search}`);\n return (unwrap(await parseResponse(resp)) as APIKey[]) ?? [];\n }\n\n /**\n * Create an inference key.\n *\n * The plaintext secret is on `.key` of the result and is never retrievable\n * again.\n *\n * @param name Display name for the key. Required.\n */\n async create(name: string, params?: CreateKeyParams): Promise<CreatedKey> {\n const body: Record<string, unknown> = { name };\n if (params?.limit !== undefined) body.limit = params.limit;\n if (params?.limit_reset !== undefined) body.limit_reset = params.limit_reset;\n if (params?.expires_at !== undefined) body.expires_at = params.expires_at;\n\n const resp = await fetchWithRetry(this._opts, \"/api/v1/keys\", {\n method: \"POST\",\n ...jsonBody(body),\n });\n return (await parseResponse(resp)) as CreatedKey;\n }\n\n /** Get one inference key by its `hash`. */\n async get(hash: string): Promise<APIKey> {\n const resp = await fetchWithRetry(this._opts, `/api/v1/keys/${encodePath(hash)}`);\n return unwrap(await parseResponse(resp)) as APIKey;\n }\n\n /**\n * Update an inference key. Omitted fields are left unchanged.\n *\n * For `limit`, `limit_reset` and `expires_at`, passing `null` clears the\n * value; leaving the field out leaves it alone.\n */\n async update(hash: string, patch: UpdateKeyParams): Promise<APIKey> {\n // `!== undefined` rather than `in`: an explicit `undefined` means the\n // same thing as an absent field, and neither must reach the wire.\n const body: Record<string, unknown> = {};\n if (patch.name !== undefined) body.name = patch.name;\n if (patch.disabled !== undefined) body.disabled = patch.disabled;\n if (patch.limit !== undefined) body.limit = patch.limit;\n if (patch.limit_reset !== undefined) body.limit_reset = patch.limit_reset;\n if (patch.expires_at !== undefined) body.expires_at = patch.expires_at;\n\n const resp = await fetchWithRetry(this._opts, `/api/v1/keys/${encodePath(hash)}`, {\n method: \"PATCH\",\n ...jsonBody(body),\n });\n return unwrap(await parseResponse(resp)) as APIKey;\n }\n\n /** Delete an inference key. Resolves to `true` on success. */\n async delete(hash: string): Promise<boolean> {\n const resp = await fetchWithRetry(this._opts, `/api/v1/keys/${encodePath(hash)}`, {\n method: \"DELETE\",\n });\n const data = unwrap(await parseResponse(resp)) as { deleted?: boolean } | null;\n return Boolean(data?.deleted);\n }\n}\n\n/** Daily usage rollups. Requires a management key. */\nexport class AccountActivity {\n constructor(private readonly _opts: AccountOptions) {}\n\n /**\n * List usage grouped by day, model and provider.\n *\n * Covers the last 30 complete UTC days; today is excluded.\n */\n async list(params?: ActivityParams): Promise<ActivityRow[]> {\n const search = new URLSearchParams();\n if (params?.date) search.set(\"date\", params.date);\n if (params?.api_key_hash) search.set(\"api_key_hash\", params.api_key_hash);\n\n const qs = search.toString();\n const resp = await fetchWithRetry(this._opts, `/api/v1/activity${qs ? `?${qs}` : \"\"}`);\n return (unwrap(await parseResponse(resp)) as ActivityRow[]) ?? [];\n }\n}\n\n/**\n * Sign in with Onlist — the PKCE authorization-code exchange.\n *\n * Only the exchange lives here. The authorization step itself happens in the\n * user's browser at `https://onlist.io/auth`; there is no SDK call for it,\n * because the SDK has no session to authorize with.\n */\nexport class AccountOAuth {\n constructor(private readonly _opts: AccountOptions) {}\n\n /**\n * Exchange an authorization code for a new inference key.\n *\n * Unauthenticated, and single-use: the code is consumed even when the\n * verifier turns out to be wrong, so a failure means restarting the\n * browser flow.\n *\n * @param code The `code` query parameter from the callback URL.\n * @param codeVerifier The verifier from {@link generatePkce}. Required\n * whenever the authorization request carried a challenge.\n */\n async exchange(code: string, codeVerifier = \"\"): Promise<ExchangedKey> {\n const resp = await fetchWithRetry(this._opts, \"/api/v1/auth/keys\", {\n method: \"POST\",\n ...jsonBody({ code, code_verifier: codeVerifier }),\n });\n return (await parseResponse(resp)) as ExchangedKey;\n }\n}\n","import {\n encodePath,\n fetchWithRetry,\n parseResponse,\n type RequestOptions,\n} from \"./http.js\";\nimport type { ModelDetail, ModelListResponse } from \"./types/model.js\";\nimport type { ProviderDetail, ProviderListResponse } from \"./types/provider.js\";\nimport type {\n ModelRankingsResponse,\n ModelRankingsParams,\n AppRankingsResponse,\n AppRankingsParams,\n} from \"./types/rankings.js\";\n\n/** Options for creating a Marketplace client. */\nexport type MarketplaceOptions = RequestOptions;\n\n/** Access to marketplace model data. */\nexport class MarketplaceModels {\n constructor(private readonly _opts: MarketplaceOptions) {}\n\n /** List models in the marketplace catalog. */\n async list(params?: { limit?: number; offset?: number; q?: string }): Promise<ModelListResponse> {\n const search = new URLSearchParams();\n search.set(\"limit\", String(params?.limit ?? 20));\n search.set(\"offset\", String(params?.offset ?? 0));\n if (params?.q) search.set(\"q\", params.q);\n\n const resp = await fetchWithRetry(this._opts, `/api/mkt/models?${search}`);\n return (await parseResponse(resp)) as ModelListResponse;\n }\n\n /** Get detailed info for a specific model, including provider offers. */\n async get(modelId: string): Promise<ModelDetail> {\n const resp = await fetchWithRetry(this._opts, `/api/mkt/models/${encodePath(modelId)}`);\n let data = (await parseResponse(resp)) as Record<string, unknown>;\n if (data && typeof data === \"object\" && \"data\" in data) {\n data = data.data as Record<string, unknown>;\n }\n return data as unknown as ModelDetail;\n }\n}\n\n/** Access to marketplace provider data. */\nexport class MarketplaceProviders {\n constructor(private readonly _opts: MarketplaceOptions) {}\n\n /** List providers on the marketplace. */\n async list(params?: { sort?: string; q?: string }): Promise<ProviderListResponse> {\n const search = new URLSearchParams();\n if (params?.sort) search.set(\"sort\", params.sort);\n if (params?.q) search.set(\"q\", params.q);\n\n const qs = search.toString();\n const resp = await fetchWithRetry(this._opts, `/api/mkt/providers${qs ? `?${qs}` : \"\"}`);\n return (await parseResponse(resp)) as ProviderListResponse;\n }\n\n /** Get detailed info for a specific provider. */\n async get(slug: string): Promise<ProviderDetail> {\n const resp = await fetchWithRetry(this._opts, `/api/mkt/provider/${encodePath(slug)}`);\n let data = (await parseResponse(resp)) as Record<string, unknown>;\n if (data && typeof data === \"object\" && \"data\" in data) {\n data = data.data as Record<string, unknown>;\n }\n return data as unknown as ProviderDetail;\n }\n}\n\n/** Access to marketplace rankings (models and apps). */\nexport class MarketplaceRankings {\n constructor(private readonly _opts: MarketplaceOptions) {}\n\n /** Get the model usage leaderboard and chart series. */\n async models(params?: ModelRankingsParams): Promise<ModelRankingsResponse> {\n const search = new URLSearchParams();\n if (params?.sort) search.set(\"sort\", params.sort);\n if (params?.window) search.set(\"window\", params.window);\n if (params?.limit != null) search.set(\"limit\", String(params.limit));\n if (params?.offset != null) search.set(\"offset\", String(params.offset));\n\n const qs = search.toString();\n const resp = await fetchWithRetry(this._opts, `/api/mkt/rankings/models${qs ? `?${qs}` : \"\"}`);\n return (await parseResponse(resp)) as ModelRankingsResponse;\n }\n\n /** Get the app rankings list. */\n async apps(params?: AppRankingsParams): Promise<AppRankingsResponse> {\n const search = new URLSearchParams();\n if (params?.sort) search.set(\"sort\", params.sort);\n if (params?.window) search.set(\"window\", params.window);\n if (params?.category) search.set(\"category\", params.category);\n if (params?.subcategory) search.set(\"subcategory\", params.subcategory);\n if (params?.page != null) search.set(\"page\", String(params.page));\n if (params?.limit != null) search.set(\"limit\", String(params.limit));\n\n const qs = search.toString();\n const resp = await fetchWithRetry(this._opts, `/api/mkt/apps${qs ? `?${qs}` : \"\"}`);\n return (await parseResponse(resp)) as AppRankingsResponse;\n }\n}\n\n/** Client for the Onlist marketplace public API. */\nexport class Marketplace {\n /** Browse and search models. */\n readonly models: MarketplaceModels;\n /** Browse and search providers. */\n readonly providers: MarketplaceProviders;\n /** Model and app usage rankings. */\n readonly rankings: MarketplaceRankings;\n\n constructor(opts: MarketplaceOptions) {\n this.models = new MarketplaceModels(opts);\n this.providers = new MarketplaceProviders(opts);\n this.rankings = new MarketplaceRankings(opts);\n }\n}\n"],"mappings":"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","names":["OpenAI"]}
|