@onlist/sdk 0.1.0 → 0.2.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 +64 -12
- package/dist/index.cjs +98 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +130 -8
- package/dist/index.d.ts +130 -8
- package/dist/index.js +96 -16
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -48,6 +48,12 @@ 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
|
+
};
|
|
51
57
|
function raiseForStatus(status, body) {
|
|
52
58
|
let error = {};
|
|
53
59
|
if (body && typeof body === "object" && "error" in body) {
|
|
@@ -63,16 +69,22 @@ function raiseForStatus(status, body) {
|
|
|
63
69
|
const opts = { status, type, code, param, body };
|
|
64
70
|
if (status === 401) throw new AuthenticationError(message, opts);
|
|
65
71
|
if (status === 402) throw new InsufficientBalanceError(message, opts);
|
|
72
|
+
if (status === 404) throw new NotFoundError(message, opts);
|
|
66
73
|
if (status === 429) throw new RateLimitError(message, opts);
|
|
67
74
|
if (code && code.startsWith("no_provider")) throw new ProviderError(message, opts);
|
|
68
75
|
throw new APIError(message, opts);
|
|
69
76
|
}
|
|
70
77
|
|
|
71
78
|
// src/version.ts
|
|
72
|
-
var VERSION = "0.
|
|
79
|
+
var VERSION = "0.2.0";
|
|
73
80
|
|
|
74
81
|
// src/marketplace.ts
|
|
75
82
|
var DEFAULT_TIMEOUT = 3e4;
|
|
83
|
+
var DEFAULT_MAX_RETRIES = 2;
|
|
84
|
+
var INITIAL_RETRY_DELAY = 500;
|
|
85
|
+
var MAX_RETRY_DELAY = 8e3;
|
|
86
|
+
var JITTER_FACTOR = 0.25;
|
|
87
|
+
var RETRYABLE_STATUSES = /* @__PURE__ */ new Set([408, 429, 500, 502, 503, 504]);
|
|
76
88
|
function encodePath(segment) {
|
|
77
89
|
return segment.split("/").map((s) => encodeURIComponent(s)).join("/");
|
|
78
90
|
}
|
|
@@ -91,66 +103,109 @@ async function parseResponse(response) {
|
|
|
91
103
|
}
|
|
92
104
|
return body;
|
|
93
105
|
}
|
|
106
|
+
function retryDelay(attempt, retryAfterHeader) {
|
|
107
|
+
if (retryAfterHeader) {
|
|
108
|
+
const seconds = Number(retryAfterHeader);
|
|
109
|
+
if (!isNaN(seconds) && seconds > 0) {
|
|
110
|
+
return Math.min(seconds * 1e3, MAX_RETRY_DELAY);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const base = Math.min(INITIAL_RETRY_DELAY * 2 ** attempt, MAX_RETRY_DELAY);
|
|
114
|
+
const jitter = base * JITTER_FACTOR * (2 * Math.random() - 1);
|
|
115
|
+
return Math.max(0, base + jitter);
|
|
116
|
+
}
|
|
94
117
|
var MarketplaceModels = class {
|
|
95
118
|
constructor(_opts) {
|
|
96
119
|
this._opts = _opts;
|
|
97
120
|
}
|
|
98
121
|
_opts;
|
|
122
|
+
/** List models in the marketplace catalog. */
|
|
99
123
|
async list(params) {
|
|
100
124
|
const search = new URLSearchParams();
|
|
101
125
|
search.set("limit", String(params?.limit ?? 20));
|
|
102
126
|
search.set("offset", String(params?.offset ?? 0));
|
|
103
127
|
if (params?.q) search.set("q", params.q);
|
|
104
|
-
const resp = await this.
|
|
128
|
+
const resp = await fetchWithRetry(this._opts, `/api/mkt/models?${search}`);
|
|
105
129
|
return await parseResponse(resp);
|
|
106
130
|
}
|
|
131
|
+
/** Get detailed info for a specific model, including provider offers. */
|
|
107
132
|
async get(modelId) {
|
|
108
|
-
const resp = await this.
|
|
133
|
+
const resp = await fetchWithRetry(this._opts, `/api/mkt/models/${encodePath(modelId)}`);
|
|
109
134
|
let data = await parseResponse(resp);
|
|
110
135
|
if (data && typeof data === "object" && "data" in data) {
|
|
111
136
|
data = data.data;
|
|
112
137
|
}
|
|
113
138
|
return data;
|
|
114
139
|
}
|
|
115
|
-
_fetch(path, init) {
|
|
116
|
-
return fetchWithOpts(this._opts, path, init);
|
|
117
|
-
}
|
|
118
140
|
};
|
|
119
141
|
var MarketplaceProviders = class {
|
|
120
142
|
constructor(_opts) {
|
|
121
143
|
this._opts = _opts;
|
|
122
144
|
}
|
|
123
145
|
_opts;
|
|
146
|
+
/** List providers on the marketplace. */
|
|
124
147
|
async list(params) {
|
|
125
148
|
const search = new URLSearchParams();
|
|
126
149
|
if (params?.sort) search.set("sort", params.sort);
|
|
127
150
|
if (params?.q) search.set("q", params.q);
|
|
128
151
|
const qs = search.toString();
|
|
129
|
-
const resp = await this.
|
|
152
|
+
const resp = await fetchWithRetry(this._opts, `/api/mkt/providers${qs ? `?${qs}` : ""}`);
|
|
130
153
|
return await parseResponse(resp);
|
|
131
154
|
}
|
|
155
|
+
/** Get detailed info for a specific provider. */
|
|
132
156
|
async get(slug) {
|
|
133
|
-
const resp = await this.
|
|
157
|
+
const resp = await fetchWithRetry(this._opts, `/api/mkt/provider/${encodePath(slug)}`);
|
|
134
158
|
let data = await parseResponse(resp);
|
|
135
159
|
if (data && typeof data === "object" && "data" in data) {
|
|
136
160
|
data = data.data;
|
|
137
161
|
}
|
|
138
162
|
return data;
|
|
139
163
|
}
|
|
140
|
-
|
|
141
|
-
|
|
164
|
+
};
|
|
165
|
+
var MarketplaceRankings = class {
|
|
166
|
+
constructor(_opts) {
|
|
167
|
+
this._opts = _opts;
|
|
168
|
+
}
|
|
169
|
+
_opts;
|
|
170
|
+
/** Get the model usage leaderboard and chart series. */
|
|
171
|
+
async models(params) {
|
|
172
|
+
const search = new URLSearchParams();
|
|
173
|
+
if (params?.sort) search.set("sort", params.sort);
|
|
174
|
+
if (params?.window) search.set("window", params.window);
|
|
175
|
+
if (params?.limit != null) search.set("limit", String(params.limit));
|
|
176
|
+
if (params?.offset != null) search.set("offset", String(params.offset));
|
|
177
|
+
const qs = search.toString();
|
|
178
|
+
const resp = await fetchWithRetry(this._opts, `/api/mkt/rankings/models${qs ? `?${qs}` : ""}`);
|
|
179
|
+
return await parseResponse(resp);
|
|
180
|
+
}
|
|
181
|
+
/** Get the app rankings list. */
|
|
182
|
+
async apps(params) {
|
|
183
|
+
const search = new URLSearchParams();
|
|
184
|
+
if (params?.sort) search.set("sort", params.sort);
|
|
185
|
+
if (params?.window) search.set("window", params.window);
|
|
186
|
+
if (params?.category) search.set("category", params.category);
|
|
187
|
+
if (params?.subcategory) search.set("subcategory", params.subcategory);
|
|
188
|
+
if (params?.page != null) search.set("page", String(params.page));
|
|
189
|
+
if (params?.limit != null) search.set("limit", String(params.limit));
|
|
190
|
+
const qs = search.toString();
|
|
191
|
+
const resp = await fetchWithRetry(this._opts, `/api/mkt/apps${qs ? `?${qs}` : ""}`);
|
|
192
|
+
return await parseResponse(resp);
|
|
142
193
|
}
|
|
143
194
|
};
|
|
144
195
|
var Marketplace = class {
|
|
196
|
+
/** Browse and search models. */
|
|
145
197
|
models;
|
|
198
|
+
/** Browse and search providers. */
|
|
146
199
|
providers;
|
|
200
|
+
/** Model and app usage rankings. */
|
|
201
|
+
rankings;
|
|
147
202
|
constructor(opts) {
|
|
148
203
|
this.models = new MarketplaceModels(opts);
|
|
149
204
|
this.providers = new MarketplaceProviders(opts);
|
|
205
|
+
this.rankings = new MarketplaceRankings(opts);
|
|
150
206
|
}
|
|
151
207
|
};
|
|
152
|
-
function
|
|
153
|
-
const url = `${opts.baseURL.replace(/\/$/, "")}${path}`;
|
|
208
|
+
function buildFetchInit(opts, init) {
|
|
154
209
|
const headers = {
|
|
155
210
|
"User-Agent": `onlist-js/${VERSION}`,
|
|
156
211
|
Accept: "application/json",
|
|
@@ -160,17 +215,39 @@ function fetchWithOpts(opts, path, init) {
|
|
|
160
215
|
headers["Authorization"] = `Bearer ${opts.apiKey}`;
|
|
161
216
|
}
|
|
162
217
|
const signal = AbortSignal.timeout(opts.timeout ?? DEFAULT_TIMEOUT);
|
|
163
|
-
return
|
|
218
|
+
return { ...init, headers, signal };
|
|
219
|
+
}
|
|
220
|
+
async function fetchWithRetry(opts, path, init) {
|
|
221
|
+
const url = `${opts.baseURL.replace(/\/$/, "")}${path}`;
|
|
222
|
+
const fetchInit = buildFetchInit(opts, init);
|
|
223
|
+
const maxRetries = opts.maxRetries ?? DEFAULT_MAX_RETRIES;
|
|
224
|
+
let lastError;
|
|
225
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
226
|
+
try {
|
|
227
|
+
const response = await fetch(url, fetchInit);
|
|
228
|
+
if (response.ok || !RETRYABLE_STATUSES.has(response.status) || attempt === maxRetries) {
|
|
229
|
+
return response;
|
|
230
|
+
}
|
|
231
|
+
const delay = retryDelay(attempt, response.headers.get("Retry-After"));
|
|
232
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
233
|
+
} catch (err) {
|
|
234
|
+
lastError = err;
|
|
235
|
+
if (attempt === maxRetries) break;
|
|
236
|
+
const delay = retryDelay(attempt, null);
|
|
237
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
throw lastError;
|
|
164
241
|
}
|
|
165
242
|
|
|
166
243
|
// src/client.ts
|
|
167
244
|
var BASE_URL = "https://onlist.io/v1";
|
|
168
245
|
var MARKETPLACE_BASE_URL = "https://onlist.io";
|
|
169
|
-
var ENV_API_KEY = "ONLIST_API_KEY";
|
|
170
246
|
var Onlist = class extends OpenAI {
|
|
247
|
+
/** Access to marketplace data: models, providers, and rankings. */
|
|
171
248
|
marketplace;
|
|
172
249
|
constructor(opts) {
|
|
173
|
-
const apiKey = opts?.apiKey ?? (typeof process !== "undefined" ? process.env?.
|
|
250
|
+
const apiKey = opts?.apiKey ?? (typeof process !== "undefined" ? process.env?.ONLIST_API_KEY ?? process.env?.OPENAI_API_KEY : void 0) ?? void 0;
|
|
174
251
|
const baseURL = opts?.baseURL ?? BASE_URL;
|
|
175
252
|
super({
|
|
176
253
|
...opts,
|
|
@@ -185,7 +262,8 @@ var Onlist = class extends OpenAI {
|
|
|
185
262
|
const marketplaceBase = String(baseURL).split("/v1")[0] || MARKETPLACE_BASE_URL;
|
|
186
263
|
this.marketplace = new Marketplace({
|
|
187
264
|
apiKey: this.apiKey,
|
|
188
|
-
baseURL: marketplaceBase
|
|
265
|
+
baseURL: marketplaceBase,
|
|
266
|
+
maxRetries: opts?.maxRetries
|
|
189
267
|
});
|
|
190
268
|
}
|
|
191
269
|
};
|
|
@@ -196,6 +274,8 @@ export {
|
|
|
196
274
|
Marketplace,
|
|
197
275
|
MarketplaceModels,
|
|
198
276
|
MarketplaceProviders,
|
|
277
|
+
MarketplaceRankings,
|
|
278
|
+
NotFoundError,
|
|
199
279
|
Onlist,
|
|
200
280
|
OnlistError,
|
|
201
281
|
ProviderError,
|
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/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\";\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 /** Base URL for the API. Defaults to https://onlist.io/v1. */\n baseURL?: string | null;\n /** Maximum retry attempts for marketplace API calls. Defaults to 2. */\n maxRetries?: number;\n}\n\n/** Onlist API client, extending the OpenAI SDK with marketplace features. */\nexport class Onlist extends OpenAI {\n /** Access to marketplace data: models, providers, and rankings. */\n readonly marketplace: Marketplace;\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}\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\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 === 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.2.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\";\nimport type {\n ModelRankingsResponse,\n ModelRankingsParams,\n AppRankingsResponse,\n AppRankingsParams,\n} from \"./types/rankings.js\";\n\nconst DEFAULT_TIMEOUT = 30_000;\nconst 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. */\nconst RETRYABLE_STATUSES = new Set([408, 429, 500, 502, 503, 504]);\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\n/** Calculates the retry delay with exponential backoff and jitter. */\nfunction 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\n/** Options for creating a Marketplace client. */\nexport interface MarketplaceOptions {\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\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\nfunction buildFetchInit(opts: MarketplaceOptions, 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\nasync function fetchWithRetry(\n opts: MarketplaceOptions,\n path: string,\n init?: RequestInit,\n): Promise<Response> {\n const url = `${opts.baseURL.replace(/\\/$/, \"\")}${path}`;\n const fetchInit = buildFetchInit(opts, init);\n const maxRetries = opts.maxRetries ?? DEFAULT_MAX_RETRIES;\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"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onlist/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.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/
|
|
28
|
+
"url": "https://github.com/OnlistTeam/typescript-sdk.git"
|
|
29
29
|
},
|
|
30
30
|
"bugs": {
|
|
31
|
-
"url": "https://github.com/OnlistTeam/
|
|
31
|
+
"url": "https://github.com/OnlistTeam/typescript-sdk/issues"
|
|
32
32
|
},
|
|
33
33
|
"license": "MIT",
|
|
34
34
|
"author": "Onlist <dev@onlist.io>",
|