@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/dist/index.js CHANGED
@@ -48,6 +48,24 @@ var ProviderError = class extends APIError {
48
48
  this.name = "ProviderError";
49
49
  }
50
50
  };
51
+ var NotFoundError = class extends APIError {
52
+ constructor(message = "Not found", opts) {
53
+ super(message, { status: 404, ...opts });
54
+ this.name = "NotFoundError";
55
+ }
56
+ };
57
+ var BadRequestError = class extends APIError {
58
+ constructor(message = "Bad request", opts) {
59
+ super(message, { status: 400, ...opts });
60
+ this.name = "BadRequestError";
61
+ }
62
+ };
63
+ var PermissionDeniedError = class extends APIError {
64
+ constructor(message = "Permission denied", opts) {
65
+ super(message, { status: 403, ...opts });
66
+ this.name = "PermissionDeniedError";
67
+ }
68
+ };
51
69
  function raiseForStatus(status, body) {
52
70
  let error = {};
53
71
  if (body && typeof body === "object" && "error" in body) {
@@ -61,18 +79,26 @@ function raiseForStatus(status, body) {
61
79
  const code = typeof error.code === "string" ? error.code : null;
62
80
  const param = typeof error.param === "string" ? error.param : null;
63
81
  const opts = { status, type, code, param, body };
82
+ if (status === 400) throw new BadRequestError(message, opts);
64
83
  if (status === 401) throw new AuthenticationError(message, opts);
65
84
  if (status === 402) throw new InsufficientBalanceError(message, opts);
85
+ if (status === 403) throw new PermissionDeniedError(message, opts);
86
+ if (status === 404) throw new NotFoundError(message, opts);
66
87
  if (status === 429) throw new RateLimitError(message, opts);
67
88
  if (code && code.startsWith("no_provider")) throw new ProviderError(message, opts);
68
89
  throw new APIError(message, opts);
69
90
  }
70
91
 
71
92
  // src/version.ts
72
- var VERSION = "0.1.0";
93
+ var VERSION = "0.3.0";
73
94
 
74
- // src/marketplace.ts
95
+ // src/http.ts
75
96
  var DEFAULT_TIMEOUT = 3e4;
97
+ var DEFAULT_MAX_RETRIES = 2;
98
+ var INITIAL_RETRY_DELAY = 500;
99
+ var MAX_RETRY_DELAY = 8e3;
100
+ var JITTER_FACTOR = 0.25;
101
+ var RETRYABLE_STATUSES = /* @__PURE__ */ new Set([408, 429, 500, 502, 503, 504]);
76
102
  function encodePath(segment) {
77
103
  return segment.split("/").map((s) => encodeURIComponent(s)).join("/");
78
104
  }
@@ -91,86 +117,346 @@ async function parseResponse(response) {
91
117
  }
92
118
  return body;
93
119
  }
120
+ function retryDelay(attempt, retryAfterHeader) {
121
+ if (retryAfterHeader) {
122
+ const seconds = Number(retryAfterHeader);
123
+ if (!isNaN(seconds) && seconds > 0) {
124
+ return Math.min(seconds * 1e3, MAX_RETRY_DELAY);
125
+ }
126
+ }
127
+ const base = Math.min(INITIAL_RETRY_DELAY * 2 ** attempt, MAX_RETRY_DELAY);
128
+ const jitter = base * JITTER_FACTOR * (2 * Math.random() - 1);
129
+ return Math.max(0, base + jitter);
130
+ }
131
+ function buildFetchInit(opts, init) {
132
+ const headers = {
133
+ "User-Agent": `onlist-js/${VERSION}`,
134
+ Accept: "application/json",
135
+ ...init?.headers
136
+ };
137
+ if (opts.apiKey) {
138
+ headers["Authorization"] = `Bearer ${opts.apiKey}`;
139
+ }
140
+ const signal = AbortSignal.timeout(opts.timeout ?? DEFAULT_TIMEOUT);
141
+ return { ...init, headers, signal };
142
+ }
143
+ async function fetchWithRetry(opts, path, init) {
144
+ const url = `${opts.baseURL.replace(/\/$/, "")}${path}`;
145
+ const fetchInit = buildFetchInit(opts, init);
146
+ const method = (init?.method ?? "GET").toUpperCase();
147
+ const maxRetries = method === "GET" ? opts.maxRetries ?? DEFAULT_MAX_RETRIES : 0;
148
+ let lastError;
149
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
150
+ try {
151
+ const response = await fetch(url, fetchInit);
152
+ if (response.ok || !RETRYABLE_STATUSES.has(response.status) || attempt === maxRetries) {
153
+ return response;
154
+ }
155
+ const delay = retryDelay(attempt, response.headers.get("Retry-After"));
156
+ await new Promise((resolve) => setTimeout(resolve, delay));
157
+ } catch (err) {
158
+ lastError = err;
159
+ if (attempt === maxRetries) break;
160
+ const delay = retryDelay(attempt, null);
161
+ await new Promise((resolve) => setTimeout(resolve, delay));
162
+ }
163
+ }
164
+ throw lastError;
165
+ }
166
+ function jsonBody(value) {
167
+ return {
168
+ body: JSON.stringify(value),
169
+ headers: { "Content-Type": "application/json" }
170
+ };
171
+ }
172
+
173
+ // src/account.ts
174
+ function unwrap(body) {
175
+ if (body && typeof body === "object" && "data" in body) {
176
+ return body.data;
177
+ }
178
+ return body;
179
+ }
180
+ function base64url(bytes) {
181
+ let binary = "";
182
+ for (const b of bytes) binary += String.fromCharCode(b);
183
+ return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
184
+ }
185
+ async function generatePkce() {
186
+ const raw = new Uint8Array(32);
187
+ crypto.getRandomValues(raw);
188
+ const verifier = base64url(raw);
189
+ const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(verifier));
190
+ return { verifier, challenge: base64url(new Uint8Array(digest)) };
191
+ }
192
+ var DEFAULT_BASE_URL = "https://onlist.io";
193
+ async function exchangeAuthCode(code, opts) {
194
+ const resource = new AccountOAuth({
195
+ baseURL: opts?.baseURL ?? DEFAULT_BASE_URL,
196
+ timeout: opts?.timeout
197
+ });
198
+ return resource.exchange(code, opts?.codeVerifier ?? "");
199
+ }
200
+ var AccountCredits = class {
201
+ constructor(_opts) {
202
+ this._opts = _opts;
203
+ }
204
+ _opts;
205
+ /** Get lifetime credits purchased and credits used, in USD. */
206
+ async get() {
207
+ const resp = await fetchWithRetry(this._opts, "/api/v1/credits");
208
+ return unwrap(await parseResponse(resp));
209
+ }
210
+ };
211
+ var AccountGenerations = class {
212
+ constructor(_opts) {
213
+ this._opts = _opts;
214
+ }
215
+ _opts;
216
+ /**
217
+ * Look up one call by request ID.
218
+ *
219
+ * @param requestId The value of the `X-Oneapi-Request-Id` response header
220
+ * from the original call.
221
+ */
222
+ async get(requestId) {
223
+ const search = new URLSearchParams({ id: requestId });
224
+ const resp = await fetchWithRetry(this._opts, `/api/v1/generation?${search}`);
225
+ return unwrap(await parseResponse(resp));
226
+ }
227
+ };
228
+ var AccountApiKeys = class {
229
+ constructor(_opts) {
230
+ this._opts = _opts;
231
+ }
232
+ _opts;
233
+ /** Describe the credential this client is using. */
234
+ async current() {
235
+ const resp = await fetchWithRetry(this._opts, "/api/v1/key");
236
+ return unwrap(await parseResponse(resp));
237
+ }
238
+ /**
239
+ * List inference keys.
240
+ *
241
+ * Pages are a fixed 100 keys and no total is returned: request
242
+ * `offset += 100` until you get a short page.
243
+ */
244
+ async list(params) {
245
+ const search = new URLSearchParams();
246
+ search.set("offset", String(params?.offset ?? 0));
247
+ search.set("include_disabled", String(params?.include_disabled ?? false));
248
+ const resp = await fetchWithRetry(this._opts, `/api/v1/keys?${search}`);
249
+ return unwrap(await parseResponse(resp)) ?? [];
250
+ }
251
+ /**
252
+ * Create an inference key.
253
+ *
254
+ * The plaintext secret is on `.key` of the result and is never retrievable
255
+ * again.
256
+ *
257
+ * @param name Display name for the key. Required.
258
+ */
259
+ async create(name, params) {
260
+ const body = { name };
261
+ if (params?.limit !== void 0) body.limit = params.limit;
262
+ if (params?.limit_reset !== void 0) body.limit_reset = params.limit_reset;
263
+ if (params?.expires_at !== void 0) body.expires_at = params.expires_at;
264
+ const resp = await fetchWithRetry(this._opts, "/api/v1/keys", {
265
+ method: "POST",
266
+ ...jsonBody(body)
267
+ });
268
+ return await parseResponse(resp);
269
+ }
270
+ /** Get one inference key by its `hash`. */
271
+ async get(hash) {
272
+ const resp = await fetchWithRetry(this._opts, `/api/v1/keys/${encodePath(hash)}`);
273
+ return unwrap(await parseResponse(resp));
274
+ }
275
+ /**
276
+ * Update an inference key. Omitted fields are left unchanged.
277
+ *
278
+ * For `limit`, `limit_reset` and `expires_at`, passing `null` clears the
279
+ * value; leaving the field out leaves it alone.
280
+ */
281
+ async update(hash, patch) {
282
+ const body = {};
283
+ if (patch.name !== void 0) body.name = patch.name;
284
+ if (patch.disabled !== void 0) body.disabled = patch.disabled;
285
+ if (patch.limit !== void 0) body.limit = patch.limit;
286
+ if (patch.limit_reset !== void 0) body.limit_reset = patch.limit_reset;
287
+ if (patch.expires_at !== void 0) body.expires_at = patch.expires_at;
288
+ const resp = await fetchWithRetry(this._opts, `/api/v1/keys/${encodePath(hash)}`, {
289
+ method: "PATCH",
290
+ ...jsonBody(body)
291
+ });
292
+ return unwrap(await parseResponse(resp));
293
+ }
294
+ /** Delete an inference key. Resolves to `true` on success. */
295
+ async delete(hash) {
296
+ const resp = await fetchWithRetry(this._opts, `/api/v1/keys/${encodePath(hash)}`, {
297
+ method: "DELETE"
298
+ });
299
+ const data = unwrap(await parseResponse(resp));
300
+ return Boolean(data?.deleted);
301
+ }
302
+ };
303
+ var AccountActivity = class {
304
+ constructor(_opts) {
305
+ this._opts = _opts;
306
+ }
307
+ _opts;
308
+ /**
309
+ * List usage grouped by day, model and provider.
310
+ *
311
+ * Covers the last 30 complete UTC days; today is excluded.
312
+ */
313
+ async list(params) {
314
+ const search = new URLSearchParams();
315
+ if (params?.date) search.set("date", params.date);
316
+ if (params?.api_key_hash) search.set("api_key_hash", params.api_key_hash);
317
+ const qs = search.toString();
318
+ const resp = await fetchWithRetry(this._opts, `/api/v1/activity${qs ? `?${qs}` : ""}`);
319
+ return unwrap(await parseResponse(resp)) ?? [];
320
+ }
321
+ };
322
+ var AccountOAuth = class {
323
+ constructor(_opts) {
324
+ this._opts = _opts;
325
+ }
326
+ _opts;
327
+ /**
328
+ * Exchange an authorization code for a new inference key.
329
+ *
330
+ * Unauthenticated, and single-use: the code is consumed even when the
331
+ * verifier turns out to be wrong, so a failure means restarting the
332
+ * browser flow.
333
+ *
334
+ * @param code The `code` query parameter from the callback URL.
335
+ * @param codeVerifier The verifier from {@link generatePkce}. Required
336
+ * whenever the authorization request carried a challenge.
337
+ */
338
+ async exchange(code, codeVerifier = "") {
339
+ const resp = await fetchWithRetry(this._opts, "/api/v1/auth/keys", {
340
+ method: "POST",
341
+ ...jsonBody({ code, code_verifier: codeVerifier })
342
+ });
343
+ return await parseResponse(resp);
344
+ }
345
+ };
346
+
347
+ // src/marketplace.ts
94
348
  var MarketplaceModels = class {
95
349
  constructor(_opts) {
96
350
  this._opts = _opts;
97
351
  }
98
352
  _opts;
353
+ /** List models in the marketplace catalog. */
99
354
  async list(params) {
100
355
  const search = new URLSearchParams();
101
356
  search.set("limit", String(params?.limit ?? 20));
102
357
  search.set("offset", String(params?.offset ?? 0));
103
358
  if (params?.q) search.set("q", params.q);
104
- const resp = await this._fetch(`/api/mkt/models?${search}`);
359
+ const resp = await fetchWithRetry(this._opts, `/api/mkt/models?${search}`);
105
360
  return await parseResponse(resp);
106
361
  }
362
+ /** Get detailed info for a specific model, including provider offers. */
107
363
  async get(modelId) {
108
- const resp = await this._fetch(`/api/mkt/models/${encodePath(modelId)}`);
364
+ const resp = await fetchWithRetry(this._opts, `/api/mkt/models/${encodePath(modelId)}`);
109
365
  let data = await parseResponse(resp);
110
366
  if (data && typeof data === "object" && "data" in data) {
111
367
  data = data.data;
112
368
  }
113
369
  return data;
114
370
  }
115
- _fetch(path, init) {
116
- return fetchWithOpts(this._opts, path, init);
117
- }
118
371
  };
119
372
  var MarketplaceProviders = class {
120
373
  constructor(_opts) {
121
374
  this._opts = _opts;
122
375
  }
123
376
  _opts;
377
+ /** List providers on the marketplace. */
124
378
  async list(params) {
125
379
  const search = new URLSearchParams();
126
380
  if (params?.sort) search.set("sort", params.sort);
127
381
  if (params?.q) search.set("q", params.q);
128
382
  const qs = search.toString();
129
- const resp = await this._fetch(`/api/mkt/providers${qs ? `?${qs}` : ""}`);
383
+ const resp = await fetchWithRetry(this._opts, `/api/mkt/providers${qs ? `?${qs}` : ""}`);
130
384
  return await parseResponse(resp);
131
385
  }
386
+ /** Get detailed info for a specific provider. */
132
387
  async get(slug) {
133
- const resp = await this._fetch(`/api/mkt/provider/${encodePath(slug)}`);
388
+ const resp = await fetchWithRetry(this._opts, `/api/mkt/provider/${encodePath(slug)}`);
134
389
  let data = await parseResponse(resp);
135
390
  if (data && typeof data === "object" && "data" in data) {
136
391
  data = data.data;
137
392
  }
138
393
  return data;
139
394
  }
140
- _fetch(path, init) {
141
- return fetchWithOpts(this._opts, path, init);
395
+ };
396
+ var MarketplaceRankings = class {
397
+ constructor(_opts) {
398
+ this._opts = _opts;
399
+ }
400
+ _opts;
401
+ /** Get the model usage leaderboard and chart series. */
402
+ async models(params) {
403
+ const search = new URLSearchParams();
404
+ if (params?.sort) search.set("sort", params.sort);
405
+ if (params?.window) search.set("window", params.window);
406
+ if (params?.limit != null) search.set("limit", String(params.limit));
407
+ if (params?.offset != null) search.set("offset", String(params.offset));
408
+ const qs = search.toString();
409
+ const resp = await fetchWithRetry(this._opts, `/api/mkt/rankings/models${qs ? `?${qs}` : ""}`);
410
+ return await parseResponse(resp);
411
+ }
412
+ /** Get the app rankings list. */
413
+ async apps(params) {
414
+ const search = new URLSearchParams();
415
+ if (params?.sort) search.set("sort", params.sort);
416
+ if (params?.window) search.set("window", params.window);
417
+ if (params?.category) search.set("category", params.category);
418
+ if (params?.subcategory) search.set("subcategory", params.subcategory);
419
+ if (params?.page != null) search.set("page", String(params.page));
420
+ if (params?.limit != null) search.set("limit", String(params.limit));
421
+ const qs = search.toString();
422
+ const resp = await fetchWithRetry(this._opts, `/api/mkt/apps${qs ? `?${qs}` : ""}`);
423
+ return await parseResponse(resp);
142
424
  }
143
425
  };
144
426
  var Marketplace = class {
427
+ /** Browse and search models. */
145
428
  models;
429
+ /** Browse and search providers. */
146
430
  providers;
431
+ /** Model and app usage rankings. */
432
+ rankings;
147
433
  constructor(opts) {
148
434
  this.models = new MarketplaceModels(opts);
149
435
  this.providers = new MarketplaceProviders(opts);
436
+ this.rankings = new MarketplaceRankings(opts);
150
437
  }
151
438
  };
152
- function fetchWithOpts(opts, path, init) {
153
- const url = `${opts.baseURL.replace(/\/$/, "")}${path}`;
154
- const headers = {
155
- "User-Agent": `onlist-js/${VERSION}`,
156
- Accept: "application/json",
157
- ...init?.headers
158
- };
159
- if (opts.apiKey) {
160
- headers["Authorization"] = `Bearer ${opts.apiKey}`;
161
- }
162
- const signal = AbortSignal.timeout(opts.timeout ?? DEFAULT_TIMEOUT);
163
- return fetch(url, { ...init, headers, signal });
164
- }
165
439
 
166
440
  // src/client.ts
167
441
  var BASE_URL = "https://onlist.io/v1";
168
442
  var MARKETPLACE_BASE_URL = "https://onlist.io";
169
- var ENV_API_KEY = "ONLIST_API_KEY";
170
443
  var Onlist = class extends OpenAI {
444
+ /** Access to marketplace data: models, providers, and rankings. */
171
445
  marketplace;
446
+ /** Account balance. */
447
+ credits;
448
+ /** Cost and timing for individual calls. */
449
+ generations;
450
+ /** Inference key management. */
451
+ apiKeys;
452
+ /** Daily usage rollups. */
453
+ activity;
454
+ /** Sign in with Onlist — the PKCE code exchange. */
455
+ oauth;
456
+ /** The credential the account API is using. */
457
+ managementKey;
172
458
  constructor(opts) {
173
- const apiKey = opts?.apiKey ?? (typeof process !== "undefined" ? process.env?.[ENV_API_KEY] : void 0) ?? void 0;
459
+ const apiKey = opts?.apiKey ?? (typeof process !== "undefined" ? process.env?.ONLIST_API_KEY ?? process.env?.OPENAI_API_KEY : void 0) ?? void 0;
174
460
  const baseURL = opts?.baseURL ?? BASE_URL;
175
461
  super({
176
462
  ...opts,
@@ -185,21 +471,44 @@ var Onlist = class extends OpenAI {
185
471
  const marketplaceBase = String(baseURL).split("/v1")[0] || MARKETPLACE_BASE_URL;
186
472
  this.marketplace = new Marketplace({
187
473
  apiKey: this.apiKey,
188
- baseURL: marketplaceBase
474
+ baseURL: marketplaceBase,
475
+ maxRetries: opts?.maxRetries
189
476
  });
477
+ this.managementKey = opts?.managementKey ?? (typeof process !== "undefined" ? process.env?.ONLIST_MANAGEMENT_KEY : void 0) ?? this.apiKey ?? void 0;
478
+ const accountOpts = {
479
+ apiKey: this.managementKey,
480
+ baseURL: marketplaceBase,
481
+ maxRetries: opts?.maxRetries
482
+ };
483
+ this.credits = new AccountCredits(accountOpts);
484
+ this.generations = new AccountGenerations(accountOpts);
485
+ this.apiKeys = new AccountApiKeys(accountOpts);
486
+ this.activity = new AccountActivity(accountOpts);
487
+ this.oauth = new AccountOAuth(accountOpts);
190
488
  }
191
489
  };
192
490
  export {
193
491
  APIError,
492
+ AccountActivity,
493
+ AccountApiKeys,
494
+ AccountCredits,
495
+ AccountGenerations,
496
+ AccountOAuth,
194
497
  AuthenticationError,
498
+ BadRequestError,
195
499
  InsufficientBalanceError,
196
500
  Marketplace,
197
501
  MarketplaceModels,
198
502
  MarketplaceProviders,
503
+ MarketplaceRankings,
504
+ NotFoundError,
199
505
  Onlist,
200
506
  OnlistError,
507
+ PermissionDeniedError,
201
508
  ProviderError,
202
509
  RateLimitError,
203
- VERSION
510
+ VERSION,
511
+ exchangeAuthCode,
512
+ generatePkce
204
513
  };
205
514
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/errors.ts","../src/version.ts","../src/marketplace.ts"],"sourcesContent":["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":[]}
1
+ {"version":3,"sources":["../src/client.ts","../src/errors.ts","../src/version.ts","../src/http.ts","../src/account.ts","../src/marketplace.ts"],"sourcesContent":["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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onlist/sdk",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Official JavaScript/TypeScript SDK for Onlist, the AI API marketplace. Access 200+ AI models (GPT, Claude, Gemini, DeepSeek, Llama) through a unified OpenAI-compatible API with provider routing, marketplace data, and competitive pricing.",
5
5
  "keywords": [
6
6
  "onlist",
@@ -25,10 +25,10 @@
25
25
  "homepage": "https://onlist.io",
26
26
  "repository": {
27
27
  "type": "git",
28
- "url": "https://github.com/OnlistTeam/onlist-js.git"
28
+ "url": "https://github.com/OnlistTeam/typescript-sdk.git"
29
29
  },
30
30
  "bugs": {
31
- "url": "https://github.com/OnlistTeam/onlist-js/issues"
31
+ "url": "https://github.com/OnlistTeam/typescript-sdk/issues"
32
32
  },
33
33
  "license": "MIT",
34
34
  "author": "Onlist <dev@onlist.io>",