@macpaw/ai-sdk 0.1.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/CHANGELOG.md +39 -0
- package/LICENSE +21 -0
- package/MIGRATION.md +52 -0
- package/README.md +272 -0
- package/dist/chunk-KGOVQRMH.js +287 -0
- package/dist/chunk-KGOVQRMH.js.map +1 -0
- package/dist/chunk-N26BDEG5.cjs +302 -0
- package/dist/chunk-N26BDEG5.cjs.map +1 -0
- package/dist/gateway-errors-DdgDIyQw.d.cts +181 -0
- package/dist/gateway-errors-DdgDIyQw.d.ts +181 -0
- package/dist/index.cjs +483 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +109 -0
- package/dist/index.d.ts +109 -0
- package/dist/index.js +438 -0
- package/dist/index.js.map +1 -0
- package/dist/nestjs/index.cjs +149 -0
- package/dist/nestjs/index.cjs.map +1 -0
- package/dist/nestjs/index.d.cts +117 -0
- package/dist/nestjs/index.d.ts +117 -0
- package/dist/nestjs/index.js +145 -0
- package/dist/nestjs/index.js.map +1 -0
- package/package.json +128 -0
- package/scripts/setup.mjs +90 -0
- package/templates/AGENTS.md +51 -0
- package/templates/CLAUDE.md +55 -0
- package/templates/cursor/skills/integrate-ai-gateway/SKILL.md +90 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/gateway-errors.ts"],"names":[],"mappings":"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","file":"chunk-KGOVQRMH.js","sourcesContent":["/**\n * Error types for the AI Gateway SDK.\n *\n * Combines error classes, API codes, and response shapes in one place.\n * parseErrorResponse throws the SPECIFIC subclass (AuthError, CreditsError, etc.)\n * so that `instanceof` checks work correctly in consumer code.\n */\n\n// ─── API Codes ────────────────────────────────────────────────────────────────\n\ntype ObjectValues<T> = T[keyof T];\n\n/** Raw error codes returned by the AI Gateway HTTP API. */\nexport const GatewayApiCode = {\n BadRequest: 'BAD_REQUEST',\n Unauthorized: 'UNAUTHORIZED',\n InsufficientCredits: 'INSUFFICIENT_CREDITS',\n Forbidden: 'FORBIDDEN',\n Validation: 'VALIDATION',\n RateLimitExceeded: 'RATE_LIMIT_EXCEEDED',\n InternalServerError: 'INTERNAL_SERVER_ERROR',\n ServiceUnavailable: 'SERVICE_UNAVAILABLE',\n Timeout: 'TIMEOUT',\n NotFound: 'NOT_FOUND',\n Conflict: 'CONFLICT',\n} as const;\nexport type GatewayApiCode = ObjectValues<typeof GatewayApiCode>;\n\n/** Normalized error codes for app handling. */\nexport const ErrorCode = {\n AuthRequired: 'AUTH_REQUIRED',\n InsufficientCredits: 'INSUFFICIENT_CREDITS',\n SubscriptionExpired: 'SUBSCRIPTION_EXPIRED',\n ModelNotAllowed: 'MODEL_NOT_ALLOWED',\n RateLimited: 'RATE_LIMITED',\n BadRequest: 'BAD_REQUEST',\n Validation: 'VALIDATION',\n Forbidden: 'FORBIDDEN',\n InternalServerError: 'INTERNAL_SERVER_ERROR',\n ServiceUnavailable: 'SERVICE_UNAVAILABLE',\n Timeout: 'TIMEOUT',\n NotFound: 'NOT_FOUND',\n Conflict: 'CONFLICT',\n} as const;\nexport type ErrorCode = ObjectValues<typeof ErrorCode>;\n\n// ─── Error Shapes ─────────────────────────────────────────────────────────────\n\nexport interface GatewayApiErrorItem {\n target?: string;\n property?: string;\n constraints?: string[];\n message?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface GatewayApiErrorResponse {\n statusCode: number;\n message: string;\n timestamp: string;\n code: GatewayApiCode;\n path?: string;\n errors?: GatewayApiErrorItem[];\n request_id?: string;\n}\n\nexport interface OpenAIErrorResponse {\n error: {\n message: string;\n type?: string | null;\n code?: string | null;\n param?: string | null;\n };\n request_id?: string;\n}\n\n// ─── Error Classes ────────────────────────────────────────────────────────────\n\nexport interface NormalizedErrorMetadata {\n paymentUrl?: string;\n /** Suggested delay before retrying, in seconds (from server's `Retry-After`). */\n retryAfter?: number;\n requestId?: string;\n path?: string;\n timestamp?: string;\n errors?: GatewayApiErrorItem[];\n}\n\nexport class AIGatewayError extends Error {\n readonly code: ErrorCode;\n readonly statusCode: number;\n readonly metadata: NormalizedErrorMetadata;\n\n constructor(\n message: string,\n code: ErrorCode,\n statusCode: number,\n metadata: NormalizedErrorMetadata = {},\n options?: { cause?: unknown },\n ) {\n super(message);\n this.name = 'AIGatewayError';\n this.code = code;\n this.statusCode = statusCode;\n this.metadata = metadata;\n if (options?.cause !== undefined) {\n (this as Error & { cause?: unknown }).cause = options.cause;\n }\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n get paymentUrl(): string | undefined {\n return this.metadata.paymentUrl;\n }\n\n /** Suggested delay before retrying, in seconds. `undefined` if not provided by the server. */\n get retryAfter(): number | undefined {\n return this.metadata.retryAfter;\n }\n\n get requestId(): string | undefined {\n return this.metadata.requestId;\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n statusCode: this.statusCode,\n metadata: this.metadata,\n };\n }\n}\n\nexport class AuthError extends AIGatewayError {\n constructor(message: string, statusCode: number, metadata?: NormalizedErrorMetadata, options?: { cause?: unknown }) {\n super(message, ErrorCode.AuthRequired, statusCode, metadata, options);\n this.name = 'AuthError';\n }\n}\n\nexport class CreditsError extends AIGatewayError {\n constructor(\n message: string,\n statusCode: number,\n code: typeof ErrorCode.InsufficientCredits | typeof ErrorCode.SubscriptionExpired,\n metadata?: NormalizedErrorMetadata,\n options?: { cause?: unknown },\n ) {\n super(message, code, statusCode, metadata, options);\n this.name = 'CreditsError';\n }\n}\n\nexport class RateLimitError extends AIGatewayError {\n constructor(message: string, statusCode: number, metadata?: NormalizedErrorMetadata, options?: { cause?: unknown }) {\n super(message, ErrorCode.RateLimited, statusCode, metadata, options);\n this.name = 'RateLimitError';\n }\n}\n\nexport class ModelNotAllowedError extends AIGatewayError {\n constructor(message: string, statusCode: number, metadata?: NormalizedErrorMetadata, options?: { cause?: unknown }) {\n super(message, ErrorCode.ModelNotAllowed, statusCode, metadata, options);\n this.name = 'ModelNotAllowedError';\n }\n}\n\nexport class GatewayValidationError extends AIGatewayError {\n constructor(message: string, statusCode: number, metadata?: NormalizedErrorMetadata, options?: { cause?: unknown }) {\n super(message, ErrorCode.Validation, statusCode, metadata, options);\n this.name = 'GatewayValidationError';\n }\n}\n\n/** Type guard: returns true if the value is an AIGatewayError (or any subclass). */\nexport function isAIGatewayError(value: unknown): value is AIGatewayError {\n return value instanceof AIGatewayError;\n}\n\n// ─── Internal error factories ─────────────────────────────────────────────────\n\nfunction mapGatewayApiCodeToNormalized(code: string, statusCode: number): ErrorCode {\n switch (code) {\n case GatewayApiCode.Unauthorized:\n return ErrorCode.AuthRequired;\n case GatewayApiCode.InsufficientCredits:\n return statusCode === 402 ? ErrorCode.InsufficientCredits : ErrorCode.SubscriptionExpired;\n case GatewayApiCode.Forbidden:\n return ErrorCode.ModelNotAllowed;\n case GatewayApiCode.RateLimitExceeded:\n return ErrorCode.RateLimited;\n case GatewayApiCode.BadRequest:\n return ErrorCode.BadRequest;\n case GatewayApiCode.Validation:\n return ErrorCode.Validation;\n case GatewayApiCode.InternalServerError:\n return ErrorCode.InternalServerError;\n case GatewayApiCode.ServiceUnavailable:\n return ErrorCode.ServiceUnavailable;\n case GatewayApiCode.Timeout:\n return ErrorCode.Timeout;\n case GatewayApiCode.NotFound:\n return ErrorCode.NotFound;\n case GatewayApiCode.Conflict:\n return ErrorCode.Conflict;\n default:\n return statusCode >= 500 ? ErrorCode.InternalServerError : ErrorCode.BadRequest;\n }\n}\n\nfunction mapOpenAIErrorToNormalized(type?: string | null, statusCode?: number): ErrorCode {\n if (type === 'authentication_error') return ErrorCode.AuthRequired;\n if (type === 'rate_limit_error') return ErrorCode.RateLimited;\n if (type === 'team_model_access_denied') return ErrorCode.ModelNotAllowed;\n if (type === 'api_error') return ErrorCode.InternalServerError;\n if (type === 'invalid_request_error') return ErrorCode.BadRequest;\n if (statusCode === 401) return ErrorCode.AuthRequired;\n if (statusCode === 429) return ErrorCode.RateLimited;\n if (statusCode === 403) return ErrorCode.ModelNotAllowed;\n // Unknown OpenAI error.type: map by status category rather than defaulting to 5xx.\n return statusCode !== undefined && statusCode >= 400 && statusCode < 500\n ? ErrorCode.BadRequest\n : ErrorCode.InternalServerError;\n}\n\nfunction parseRetryAfterHeader(value: string): number | undefined {\n const seconds = Number(value);\n if (!Number.isNaN(seconds) && seconds >= 0) return seconds;\n const date = Date.parse(value);\n if (!Number.isNaN(date)) {\n const delta = Math.ceil((date - Date.now()) / 1000);\n return delta > 0 ? delta : 0;\n }\n return undefined;\n}\n\nfunction createTypedError(\n message: string,\n code: ErrorCode,\n statusCode: number,\n meta: NormalizedErrorMetadata,\n options?: { cause?: unknown },\n): AIGatewayError {\n switch (code) {\n case ErrorCode.AuthRequired:\n return new AuthError(message, statusCode, meta, options);\n case ErrorCode.InsufficientCredits:\n case ErrorCode.SubscriptionExpired:\n return new CreditsError(message, statusCode, code, meta, options);\n case ErrorCode.RateLimited:\n return new RateLimitError(message, statusCode, meta, options);\n case ErrorCode.ModelNotAllowed:\n return new ModelNotAllowedError(message, statusCode, meta, options);\n case ErrorCode.Validation:\n return new GatewayValidationError(message, statusCode, meta, options);\n default:\n return new AIGatewayError(message, code, statusCode, meta, options);\n }\n}\n\n// ─── Parse functions ──────────────────────────────────────────────────────────\n\nexport async function parseErrorResponseFromResponse(response: Response): Promise<never> {\n const contentType = response.headers.get('Content-Type') ?? '';\n let body: unknown;\n\n if (contentType.includes('application/json')) {\n try {\n body = await response.json();\n } catch {\n body = { message: response.statusText };\n }\n } else {\n body = { message: await response.text().catch(() => response.statusText) };\n }\n\n const retryAfterHeader = response.headers.get('Retry-After');\n let headerRetryAfter: number | undefined;\n if (retryAfterHeader) {\n headerRetryAfter = parseRetryAfterHeader(retryAfterHeader);\n }\n\n try {\n parseErrorResponse(response.status, body);\n } catch (error) {\n if (error instanceof AIGatewayError && error.retryAfter == null && headerRetryAfter != null) {\n throw createTypedError(\n error.message,\n error.code,\n error.statusCode,\n { ...error.metadata, retryAfter: headerRetryAfter },\n error.cause != null ? { cause: error.cause } : undefined,\n );\n }\n throw error;\n }\n}\n\n/**\n * Normalize an SSE `event: error` payload into a typed AIGatewayError subclass.\n */\nexport function parseStreamErrorPayload(payload: {\n message?: string;\n code?: string;\n statusCode?: number;\n metadata?: Record<string, unknown>;\n}): AIGatewayError {\n const statusCode = payload.statusCode ?? 500;\n const rawCode = payload.code ?? 'INTERNAL_SERVER_ERROR';\n const message = payload.message ?? 'Stream error';\n const meta: NormalizedErrorMetadata = {};\n if (payload.metadata) {\n if (typeof payload.metadata.paymentUrl === 'string') meta.paymentUrl = payload.metadata.paymentUrl;\n if (typeof payload.metadata.retryAfter === 'number') meta.retryAfter = payload.metadata.retryAfter;\n if (typeof payload.metadata.requestId === 'string') meta.requestId = payload.metadata.requestId;\n }\n const normalizedCode = mapGatewayApiCodeToNormalized(rawCode, statusCode);\n return createTypedError(message, normalizedCode, statusCode, meta);\n}\n\n/**\n * Parse error response body and throw appropriate AIGatewayError subclass.\n * Handles both Gateway API format and OpenAI proxy format.\n */\nexport function parseErrorResponse(statusCode: number, body: unknown): never {\n const meta: NormalizedErrorMetadata = {};\n\n if (body && typeof body === 'object') {\n if ('request_id' in body && typeof (body as { request_id?: string }).request_id === 'string') {\n meta.requestId = (body as { request_id: string }).request_id;\n }\n if ('path' in body && typeof (body as { path?: string }).path === 'string') {\n meta.path = (body as { path: string }).path;\n }\n if ('timestamp' in body && typeof (body as { timestamp?: string }).timestamp === 'string') {\n meta.timestamp = (body as { timestamp: string }).timestamp;\n }\n }\n\n const gatewayBody = body as GatewayApiErrorResponse | undefined;\n if (gatewayBody?.statusCode != null && typeof gatewayBody.message === 'string' && gatewayBody.code) {\n const code = mapGatewayApiCodeToNormalized(gatewayBody.code, gatewayBody.statusCode);\n if (gatewayBody.errors?.length) meta.errors = gatewayBody.errors;\n const firstError = gatewayBody.errors?.[0];\n if (firstError?.metadata) {\n if (typeof firstError.metadata.paymentUrl === 'string') meta.paymentUrl = firstError.metadata.paymentUrl;\n if (typeof firstError.metadata.retryAfter === 'number') meta.retryAfter = firstError.metadata.retryAfter;\n }\n throw createTypedError(gatewayBody.message, code, gatewayBody.statusCode, meta);\n }\n\n const oai = body as OpenAIErrorResponse | undefined;\n if (oai?.error?.message) {\n const code = mapOpenAIErrorToNormalized(oai.error.type, statusCode);\n if (oai.request_id) meta.requestId = oai.request_id;\n throw createTypedError(oai.error.message, code, statusCode, meta);\n }\n\n const message =\n typeof (body as { message?: string })?.message === 'string'\n ? (body as { message: string }).message\n : `Request failed with status ${statusCode}`;\n\n let fallbackCode: ErrorCode;\n if (statusCode === 401) fallbackCode = ErrorCode.AuthRequired;\n else if (statusCode === 403) fallbackCode = ErrorCode.Forbidden;\n else if (statusCode === 429) fallbackCode = ErrorCode.RateLimited;\n else if (statusCode >= 500) fallbackCode = ErrorCode.InternalServerError;\n else fallbackCode = ErrorCode.BadRequest;\n\n throw createTypedError(message, fallbackCode, statusCode, meta);\n}\n"]}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
7
|
+
var __typeError = (msg) => {
|
|
8
|
+
throw TypeError(msg);
|
|
9
|
+
};
|
|
10
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
11
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
12
|
+
var __decoratorStart = (base) => [, , , __create(base?.[__knownSymbol("metadata")] ?? null)];
|
|
13
|
+
var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
14
|
+
var __expectFn = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError("Function expected") : fn;
|
|
15
|
+
var __decoratorContext = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null)) });
|
|
16
|
+
var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
|
|
17
|
+
var __runInitializers = (array, flags, self, value) => {
|
|
18
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
|
|
19
|
+
return value;
|
|
20
|
+
};
|
|
21
|
+
var __decorateElement = (array, flags, name, decorators, target, extra) => {
|
|
22
|
+
var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
|
|
23
|
+
var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings[k + 5];
|
|
24
|
+
var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
|
|
25
|
+
var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc(k < 4 ? target : { get [name]() {
|
|
26
|
+
return __privateGet(this, extra);
|
|
27
|
+
}, set [name](x) {
|
|
28
|
+
return __privateSet(this, extra, x);
|
|
29
|
+
} }, name));
|
|
30
|
+
k ? p && k < 4 && __name(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name) : __name(target, name);
|
|
31
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
32
|
+
ctx = __decoratorContext(k, name, done = {}, array[3], extraInitializers);
|
|
33
|
+
if (k) {
|
|
34
|
+
ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn(target, x) : (x) => name in x };
|
|
35
|
+
if (k ^ 3) access.get = p ? (x) => (k ^ 1 ? __privateGet : __privateMethod)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name];
|
|
36
|
+
if (k > 2) access.set = p ? (x, y) => __privateSet(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name] = y;
|
|
37
|
+
}
|
|
38
|
+
it = (0, decorators[i])(k ? k < 4 ? p ? extra : desc[key] : k > 4 ? void 0 : { get: desc.get, set: desc.set } : target, ctx), done._ = 1;
|
|
39
|
+
if (k ^ 4 || it === void 0) __expectFn(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
|
|
40
|
+
else if (typeof it !== "object" || it === null) __typeError("Object expected");
|
|
41
|
+
else __expectFn(fn = it.get) && (desc.get = fn), __expectFn(fn = it.set) && (desc.set = fn), __expectFn(fn = it.init) && initializers.unshift(fn);
|
|
42
|
+
}
|
|
43
|
+
return k || __decoratorMetadata(array, target), desc && __defProp(target, name, desc), p ? k ^ 4 ? extra : desc : target;
|
|
44
|
+
};
|
|
45
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
46
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
47
|
+
var __privateIn = (member, obj) => Object(obj) !== obj ? __typeError('Cannot use the "in" operator on this value') : member.has(obj);
|
|
48
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
49
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
50
|
+
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
51
|
+
|
|
52
|
+
// src/gateway-errors.ts
|
|
53
|
+
var GatewayApiCode = {
|
|
54
|
+
BadRequest: "BAD_REQUEST",
|
|
55
|
+
Unauthorized: "UNAUTHORIZED",
|
|
56
|
+
InsufficientCredits: "INSUFFICIENT_CREDITS",
|
|
57
|
+
Forbidden: "FORBIDDEN",
|
|
58
|
+
Validation: "VALIDATION",
|
|
59
|
+
RateLimitExceeded: "RATE_LIMIT_EXCEEDED",
|
|
60
|
+
InternalServerError: "INTERNAL_SERVER_ERROR",
|
|
61
|
+
ServiceUnavailable: "SERVICE_UNAVAILABLE",
|
|
62
|
+
Timeout: "TIMEOUT",
|
|
63
|
+
NotFound: "NOT_FOUND",
|
|
64
|
+
Conflict: "CONFLICT"
|
|
65
|
+
};
|
|
66
|
+
var ErrorCode = {
|
|
67
|
+
AuthRequired: "AUTH_REQUIRED",
|
|
68
|
+
InsufficientCredits: "INSUFFICIENT_CREDITS",
|
|
69
|
+
SubscriptionExpired: "SUBSCRIPTION_EXPIRED",
|
|
70
|
+
ModelNotAllowed: "MODEL_NOT_ALLOWED",
|
|
71
|
+
RateLimited: "RATE_LIMITED",
|
|
72
|
+
BadRequest: "BAD_REQUEST",
|
|
73
|
+
Validation: "VALIDATION",
|
|
74
|
+
Forbidden: "FORBIDDEN",
|
|
75
|
+
InternalServerError: "INTERNAL_SERVER_ERROR",
|
|
76
|
+
ServiceUnavailable: "SERVICE_UNAVAILABLE",
|
|
77
|
+
Timeout: "TIMEOUT",
|
|
78
|
+
NotFound: "NOT_FOUND",
|
|
79
|
+
Conflict: "CONFLICT"
|
|
80
|
+
};
|
|
81
|
+
var AIGatewayError = class extends Error {
|
|
82
|
+
constructor(message, code, statusCode, metadata = {}, options) {
|
|
83
|
+
super(message);
|
|
84
|
+
__publicField(this, "code");
|
|
85
|
+
__publicField(this, "statusCode");
|
|
86
|
+
__publicField(this, "metadata");
|
|
87
|
+
this.name = "AIGatewayError";
|
|
88
|
+
this.code = code;
|
|
89
|
+
this.statusCode = statusCode;
|
|
90
|
+
this.metadata = metadata;
|
|
91
|
+
if (options?.cause !== void 0) {
|
|
92
|
+
this.cause = options.cause;
|
|
93
|
+
}
|
|
94
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
95
|
+
}
|
|
96
|
+
get paymentUrl() {
|
|
97
|
+
return this.metadata.paymentUrl;
|
|
98
|
+
}
|
|
99
|
+
/** Suggested delay before retrying, in seconds. `undefined` if not provided by the server. */
|
|
100
|
+
get retryAfter() {
|
|
101
|
+
return this.metadata.retryAfter;
|
|
102
|
+
}
|
|
103
|
+
get requestId() {
|
|
104
|
+
return this.metadata.requestId;
|
|
105
|
+
}
|
|
106
|
+
toJSON() {
|
|
107
|
+
return {
|
|
108
|
+
name: this.name,
|
|
109
|
+
message: this.message,
|
|
110
|
+
code: this.code,
|
|
111
|
+
statusCode: this.statusCode,
|
|
112
|
+
metadata: this.metadata
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
var AuthError = class extends AIGatewayError {
|
|
117
|
+
constructor(message, statusCode, metadata, options) {
|
|
118
|
+
super(message, ErrorCode.AuthRequired, statusCode, metadata, options);
|
|
119
|
+
this.name = "AuthError";
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
var CreditsError = class extends AIGatewayError {
|
|
123
|
+
constructor(message, statusCode, code, metadata, options) {
|
|
124
|
+
super(message, code, statusCode, metadata, options);
|
|
125
|
+
this.name = "CreditsError";
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
var RateLimitError = class extends AIGatewayError {
|
|
129
|
+
constructor(message, statusCode, metadata, options) {
|
|
130
|
+
super(message, ErrorCode.RateLimited, statusCode, metadata, options);
|
|
131
|
+
this.name = "RateLimitError";
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
var ModelNotAllowedError = class extends AIGatewayError {
|
|
135
|
+
constructor(message, statusCode, metadata, options) {
|
|
136
|
+
super(message, ErrorCode.ModelNotAllowed, statusCode, metadata, options);
|
|
137
|
+
this.name = "ModelNotAllowedError";
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
var GatewayValidationError = class extends AIGatewayError {
|
|
141
|
+
constructor(message, statusCode, metadata, options) {
|
|
142
|
+
super(message, ErrorCode.Validation, statusCode, metadata, options);
|
|
143
|
+
this.name = "GatewayValidationError";
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
function isAIGatewayError(value) {
|
|
147
|
+
return value instanceof AIGatewayError;
|
|
148
|
+
}
|
|
149
|
+
function mapGatewayApiCodeToNormalized(code, statusCode) {
|
|
150
|
+
switch (code) {
|
|
151
|
+
case GatewayApiCode.Unauthorized:
|
|
152
|
+
return ErrorCode.AuthRequired;
|
|
153
|
+
case GatewayApiCode.InsufficientCredits:
|
|
154
|
+
return statusCode === 402 ? ErrorCode.InsufficientCredits : ErrorCode.SubscriptionExpired;
|
|
155
|
+
case GatewayApiCode.Forbidden:
|
|
156
|
+
return ErrorCode.ModelNotAllowed;
|
|
157
|
+
case GatewayApiCode.RateLimitExceeded:
|
|
158
|
+
return ErrorCode.RateLimited;
|
|
159
|
+
case GatewayApiCode.BadRequest:
|
|
160
|
+
return ErrorCode.BadRequest;
|
|
161
|
+
case GatewayApiCode.Validation:
|
|
162
|
+
return ErrorCode.Validation;
|
|
163
|
+
case GatewayApiCode.InternalServerError:
|
|
164
|
+
return ErrorCode.InternalServerError;
|
|
165
|
+
case GatewayApiCode.ServiceUnavailable:
|
|
166
|
+
return ErrorCode.ServiceUnavailable;
|
|
167
|
+
case GatewayApiCode.Timeout:
|
|
168
|
+
return ErrorCode.Timeout;
|
|
169
|
+
case GatewayApiCode.NotFound:
|
|
170
|
+
return ErrorCode.NotFound;
|
|
171
|
+
case GatewayApiCode.Conflict:
|
|
172
|
+
return ErrorCode.Conflict;
|
|
173
|
+
default:
|
|
174
|
+
return statusCode >= 500 ? ErrorCode.InternalServerError : ErrorCode.BadRequest;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function mapOpenAIErrorToNormalized(type, statusCode) {
|
|
178
|
+
if (type === "authentication_error") return ErrorCode.AuthRequired;
|
|
179
|
+
if (type === "rate_limit_error") return ErrorCode.RateLimited;
|
|
180
|
+
if (type === "team_model_access_denied") return ErrorCode.ModelNotAllowed;
|
|
181
|
+
if (type === "api_error") return ErrorCode.InternalServerError;
|
|
182
|
+
if (type === "invalid_request_error") return ErrorCode.BadRequest;
|
|
183
|
+
if (statusCode === 401) return ErrorCode.AuthRequired;
|
|
184
|
+
if (statusCode === 429) return ErrorCode.RateLimited;
|
|
185
|
+
if (statusCode === 403) return ErrorCode.ModelNotAllowed;
|
|
186
|
+
return statusCode !== void 0 && statusCode >= 400 && statusCode < 500 ? ErrorCode.BadRequest : ErrorCode.InternalServerError;
|
|
187
|
+
}
|
|
188
|
+
function parseRetryAfterHeader(value) {
|
|
189
|
+
const seconds = Number(value);
|
|
190
|
+
if (!Number.isNaN(seconds) && seconds >= 0) return seconds;
|
|
191
|
+
const date = Date.parse(value);
|
|
192
|
+
if (!Number.isNaN(date)) {
|
|
193
|
+
const delta = Math.ceil((date - Date.now()) / 1e3);
|
|
194
|
+
return delta > 0 ? delta : 0;
|
|
195
|
+
}
|
|
196
|
+
return void 0;
|
|
197
|
+
}
|
|
198
|
+
function createTypedError(message, code, statusCode, meta, options) {
|
|
199
|
+
switch (code) {
|
|
200
|
+
case ErrorCode.AuthRequired:
|
|
201
|
+
return new AuthError(message, statusCode, meta, options);
|
|
202
|
+
case ErrorCode.InsufficientCredits:
|
|
203
|
+
case ErrorCode.SubscriptionExpired:
|
|
204
|
+
return new CreditsError(message, statusCode, code, meta, options);
|
|
205
|
+
case ErrorCode.RateLimited:
|
|
206
|
+
return new RateLimitError(message, statusCode, meta, options);
|
|
207
|
+
case ErrorCode.ModelNotAllowed:
|
|
208
|
+
return new ModelNotAllowedError(message, statusCode, meta, options);
|
|
209
|
+
case ErrorCode.Validation:
|
|
210
|
+
return new GatewayValidationError(message, statusCode, meta, options);
|
|
211
|
+
default:
|
|
212
|
+
return new AIGatewayError(message, code, statusCode, meta, options);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
async function parseErrorResponseFromResponse(response) {
|
|
216
|
+
const contentType = response.headers.get("Content-Type") ?? "";
|
|
217
|
+
let body;
|
|
218
|
+
if (contentType.includes("application/json")) {
|
|
219
|
+
try {
|
|
220
|
+
body = await response.json();
|
|
221
|
+
} catch {
|
|
222
|
+
body = { message: response.statusText };
|
|
223
|
+
}
|
|
224
|
+
} else {
|
|
225
|
+
body = { message: await response.text().catch(() => response.statusText) };
|
|
226
|
+
}
|
|
227
|
+
const retryAfterHeader = response.headers.get("Retry-After");
|
|
228
|
+
let headerRetryAfter;
|
|
229
|
+
if (retryAfterHeader) {
|
|
230
|
+
headerRetryAfter = parseRetryAfterHeader(retryAfterHeader);
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
parseErrorResponse(response.status, body);
|
|
234
|
+
} catch (error) {
|
|
235
|
+
if (error instanceof AIGatewayError && error.retryAfter == null && headerRetryAfter != null) {
|
|
236
|
+
throw createTypedError(
|
|
237
|
+
error.message,
|
|
238
|
+
error.code,
|
|
239
|
+
error.statusCode,
|
|
240
|
+
{ ...error.metadata, retryAfter: headerRetryAfter },
|
|
241
|
+
error.cause != null ? { cause: error.cause } : void 0
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
throw error;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
function parseErrorResponse(statusCode, body) {
|
|
248
|
+
const meta = {};
|
|
249
|
+
if (body && typeof body === "object") {
|
|
250
|
+
if ("request_id" in body && typeof body.request_id === "string") {
|
|
251
|
+
meta.requestId = body.request_id;
|
|
252
|
+
}
|
|
253
|
+
if ("path" in body && typeof body.path === "string") {
|
|
254
|
+
meta.path = body.path;
|
|
255
|
+
}
|
|
256
|
+
if ("timestamp" in body && typeof body.timestamp === "string") {
|
|
257
|
+
meta.timestamp = body.timestamp;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
const gatewayBody = body;
|
|
261
|
+
if (gatewayBody?.statusCode != null && typeof gatewayBody.message === "string" && gatewayBody.code) {
|
|
262
|
+
const code = mapGatewayApiCodeToNormalized(gatewayBody.code, gatewayBody.statusCode);
|
|
263
|
+
if (gatewayBody.errors?.length) meta.errors = gatewayBody.errors;
|
|
264
|
+
const firstError = gatewayBody.errors?.[0];
|
|
265
|
+
if (firstError?.metadata) {
|
|
266
|
+
if (typeof firstError.metadata.paymentUrl === "string") meta.paymentUrl = firstError.metadata.paymentUrl;
|
|
267
|
+
if (typeof firstError.metadata.retryAfter === "number") meta.retryAfter = firstError.metadata.retryAfter;
|
|
268
|
+
}
|
|
269
|
+
throw createTypedError(gatewayBody.message, code, gatewayBody.statusCode, meta);
|
|
270
|
+
}
|
|
271
|
+
const oai = body;
|
|
272
|
+
if (oai?.error?.message) {
|
|
273
|
+
const code = mapOpenAIErrorToNormalized(oai.error.type, statusCode);
|
|
274
|
+
if (oai.request_id) meta.requestId = oai.request_id;
|
|
275
|
+
throw createTypedError(oai.error.message, code, statusCode, meta);
|
|
276
|
+
}
|
|
277
|
+
const message = typeof body?.message === "string" ? body.message : `Request failed with status ${statusCode}`;
|
|
278
|
+
let fallbackCode;
|
|
279
|
+
if (statusCode === 401) fallbackCode = ErrorCode.AuthRequired;
|
|
280
|
+
else if (statusCode === 403) fallbackCode = ErrorCode.Forbidden;
|
|
281
|
+
else if (statusCode === 429) fallbackCode = ErrorCode.RateLimited;
|
|
282
|
+
else if (statusCode >= 500) fallbackCode = ErrorCode.InternalServerError;
|
|
283
|
+
else fallbackCode = ErrorCode.BadRequest;
|
|
284
|
+
throw createTypedError(message, fallbackCode, statusCode, meta);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
exports.AIGatewayError = AIGatewayError;
|
|
288
|
+
exports.AuthError = AuthError;
|
|
289
|
+
exports.CreditsError = CreditsError;
|
|
290
|
+
exports.ErrorCode = ErrorCode;
|
|
291
|
+
exports.GatewayApiCode = GatewayApiCode;
|
|
292
|
+
exports.GatewayValidationError = GatewayValidationError;
|
|
293
|
+
exports.ModelNotAllowedError = ModelNotAllowedError;
|
|
294
|
+
exports.RateLimitError = RateLimitError;
|
|
295
|
+
exports.__decorateElement = __decorateElement;
|
|
296
|
+
exports.__decoratorStart = __decoratorStart;
|
|
297
|
+
exports.__runInitializers = __runInitializers;
|
|
298
|
+
exports.isAIGatewayError = isAIGatewayError;
|
|
299
|
+
exports.parseErrorResponse = parseErrorResponse;
|
|
300
|
+
exports.parseErrorResponseFromResponse = parseErrorResponseFromResponse;
|
|
301
|
+
//# sourceMappingURL=chunk-N26BDEG5.cjs.map
|
|
302
|
+
//# sourceMappingURL=chunk-N26BDEG5.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/gateway-errors.ts"],"names":[],"mappings":"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","file":"chunk-N26BDEG5.cjs","sourcesContent":["/**\n * Error types for the AI Gateway SDK.\n *\n * Combines error classes, API codes, and response shapes in one place.\n * parseErrorResponse throws the SPECIFIC subclass (AuthError, CreditsError, etc.)\n * so that `instanceof` checks work correctly in consumer code.\n */\n\n// ─── API Codes ────────────────────────────────────────────────────────────────\n\ntype ObjectValues<T> = T[keyof T];\n\n/** Raw error codes returned by the AI Gateway HTTP API. */\nexport const GatewayApiCode = {\n BadRequest: 'BAD_REQUEST',\n Unauthorized: 'UNAUTHORIZED',\n InsufficientCredits: 'INSUFFICIENT_CREDITS',\n Forbidden: 'FORBIDDEN',\n Validation: 'VALIDATION',\n RateLimitExceeded: 'RATE_LIMIT_EXCEEDED',\n InternalServerError: 'INTERNAL_SERVER_ERROR',\n ServiceUnavailable: 'SERVICE_UNAVAILABLE',\n Timeout: 'TIMEOUT',\n NotFound: 'NOT_FOUND',\n Conflict: 'CONFLICT',\n} as const;\nexport type GatewayApiCode = ObjectValues<typeof GatewayApiCode>;\n\n/** Normalized error codes for app handling. */\nexport const ErrorCode = {\n AuthRequired: 'AUTH_REQUIRED',\n InsufficientCredits: 'INSUFFICIENT_CREDITS',\n SubscriptionExpired: 'SUBSCRIPTION_EXPIRED',\n ModelNotAllowed: 'MODEL_NOT_ALLOWED',\n RateLimited: 'RATE_LIMITED',\n BadRequest: 'BAD_REQUEST',\n Validation: 'VALIDATION',\n Forbidden: 'FORBIDDEN',\n InternalServerError: 'INTERNAL_SERVER_ERROR',\n ServiceUnavailable: 'SERVICE_UNAVAILABLE',\n Timeout: 'TIMEOUT',\n NotFound: 'NOT_FOUND',\n Conflict: 'CONFLICT',\n} as const;\nexport type ErrorCode = ObjectValues<typeof ErrorCode>;\n\n// ─── Error Shapes ─────────────────────────────────────────────────────────────\n\nexport interface GatewayApiErrorItem {\n target?: string;\n property?: string;\n constraints?: string[];\n message?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface GatewayApiErrorResponse {\n statusCode: number;\n message: string;\n timestamp: string;\n code: GatewayApiCode;\n path?: string;\n errors?: GatewayApiErrorItem[];\n request_id?: string;\n}\n\nexport interface OpenAIErrorResponse {\n error: {\n message: string;\n type?: string | null;\n code?: string | null;\n param?: string | null;\n };\n request_id?: string;\n}\n\n// ─── Error Classes ────────────────────────────────────────────────────────────\n\nexport interface NormalizedErrorMetadata {\n paymentUrl?: string;\n /** Suggested delay before retrying, in seconds (from server's `Retry-After`). */\n retryAfter?: number;\n requestId?: string;\n path?: string;\n timestamp?: string;\n errors?: GatewayApiErrorItem[];\n}\n\nexport class AIGatewayError extends Error {\n readonly code: ErrorCode;\n readonly statusCode: number;\n readonly metadata: NormalizedErrorMetadata;\n\n constructor(\n message: string,\n code: ErrorCode,\n statusCode: number,\n metadata: NormalizedErrorMetadata = {},\n options?: { cause?: unknown },\n ) {\n super(message);\n this.name = 'AIGatewayError';\n this.code = code;\n this.statusCode = statusCode;\n this.metadata = metadata;\n if (options?.cause !== undefined) {\n (this as Error & { cause?: unknown }).cause = options.cause;\n }\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n get paymentUrl(): string | undefined {\n return this.metadata.paymentUrl;\n }\n\n /** Suggested delay before retrying, in seconds. `undefined` if not provided by the server. */\n get retryAfter(): number | undefined {\n return this.metadata.retryAfter;\n }\n\n get requestId(): string | undefined {\n return this.metadata.requestId;\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n statusCode: this.statusCode,\n metadata: this.metadata,\n };\n }\n}\n\nexport class AuthError extends AIGatewayError {\n constructor(message: string, statusCode: number, metadata?: NormalizedErrorMetadata, options?: { cause?: unknown }) {\n super(message, ErrorCode.AuthRequired, statusCode, metadata, options);\n this.name = 'AuthError';\n }\n}\n\nexport class CreditsError extends AIGatewayError {\n constructor(\n message: string,\n statusCode: number,\n code: typeof ErrorCode.InsufficientCredits | typeof ErrorCode.SubscriptionExpired,\n metadata?: NormalizedErrorMetadata,\n options?: { cause?: unknown },\n ) {\n super(message, code, statusCode, metadata, options);\n this.name = 'CreditsError';\n }\n}\n\nexport class RateLimitError extends AIGatewayError {\n constructor(message: string, statusCode: number, metadata?: NormalizedErrorMetadata, options?: { cause?: unknown }) {\n super(message, ErrorCode.RateLimited, statusCode, metadata, options);\n this.name = 'RateLimitError';\n }\n}\n\nexport class ModelNotAllowedError extends AIGatewayError {\n constructor(message: string, statusCode: number, metadata?: NormalizedErrorMetadata, options?: { cause?: unknown }) {\n super(message, ErrorCode.ModelNotAllowed, statusCode, metadata, options);\n this.name = 'ModelNotAllowedError';\n }\n}\n\nexport class GatewayValidationError extends AIGatewayError {\n constructor(message: string, statusCode: number, metadata?: NormalizedErrorMetadata, options?: { cause?: unknown }) {\n super(message, ErrorCode.Validation, statusCode, metadata, options);\n this.name = 'GatewayValidationError';\n }\n}\n\n/** Type guard: returns true if the value is an AIGatewayError (or any subclass). */\nexport function isAIGatewayError(value: unknown): value is AIGatewayError {\n return value instanceof AIGatewayError;\n}\n\n// ─── Internal error factories ─────────────────────────────────────────────────\n\nfunction mapGatewayApiCodeToNormalized(code: string, statusCode: number): ErrorCode {\n switch (code) {\n case GatewayApiCode.Unauthorized:\n return ErrorCode.AuthRequired;\n case GatewayApiCode.InsufficientCredits:\n return statusCode === 402 ? ErrorCode.InsufficientCredits : ErrorCode.SubscriptionExpired;\n case GatewayApiCode.Forbidden:\n return ErrorCode.ModelNotAllowed;\n case GatewayApiCode.RateLimitExceeded:\n return ErrorCode.RateLimited;\n case GatewayApiCode.BadRequest:\n return ErrorCode.BadRequest;\n case GatewayApiCode.Validation:\n return ErrorCode.Validation;\n case GatewayApiCode.InternalServerError:\n return ErrorCode.InternalServerError;\n case GatewayApiCode.ServiceUnavailable:\n return ErrorCode.ServiceUnavailable;\n case GatewayApiCode.Timeout:\n return ErrorCode.Timeout;\n case GatewayApiCode.NotFound:\n return ErrorCode.NotFound;\n case GatewayApiCode.Conflict:\n return ErrorCode.Conflict;\n default:\n return statusCode >= 500 ? ErrorCode.InternalServerError : ErrorCode.BadRequest;\n }\n}\n\nfunction mapOpenAIErrorToNormalized(type?: string | null, statusCode?: number): ErrorCode {\n if (type === 'authentication_error') return ErrorCode.AuthRequired;\n if (type === 'rate_limit_error') return ErrorCode.RateLimited;\n if (type === 'team_model_access_denied') return ErrorCode.ModelNotAllowed;\n if (type === 'api_error') return ErrorCode.InternalServerError;\n if (type === 'invalid_request_error') return ErrorCode.BadRequest;\n if (statusCode === 401) return ErrorCode.AuthRequired;\n if (statusCode === 429) return ErrorCode.RateLimited;\n if (statusCode === 403) return ErrorCode.ModelNotAllowed;\n // Unknown OpenAI error.type: map by status category rather than defaulting to 5xx.\n return statusCode !== undefined && statusCode >= 400 && statusCode < 500\n ? ErrorCode.BadRequest\n : ErrorCode.InternalServerError;\n}\n\nfunction parseRetryAfterHeader(value: string): number | undefined {\n const seconds = Number(value);\n if (!Number.isNaN(seconds) && seconds >= 0) return seconds;\n const date = Date.parse(value);\n if (!Number.isNaN(date)) {\n const delta = Math.ceil((date - Date.now()) / 1000);\n return delta > 0 ? delta : 0;\n }\n return undefined;\n}\n\nfunction createTypedError(\n message: string,\n code: ErrorCode,\n statusCode: number,\n meta: NormalizedErrorMetadata,\n options?: { cause?: unknown },\n): AIGatewayError {\n switch (code) {\n case ErrorCode.AuthRequired:\n return new AuthError(message, statusCode, meta, options);\n case ErrorCode.InsufficientCredits:\n case ErrorCode.SubscriptionExpired:\n return new CreditsError(message, statusCode, code, meta, options);\n case ErrorCode.RateLimited:\n return new RateLimitError(message, statusCode, meta, options);\n case ErrorCode.ModelNotAllowed:\n return new ModelNotAllowedError(message, statusCode, meta, options);\n case ErrorCode.Validation:\n return new GatewayValidationError(message, statusCode, meta, options);\n default:\n return new AIGatewayError(message, code, statusCode, meta, options);\n }\n}\n\n// ─── Parse functions ──────────────────────────────────────────────────────────\n\nexport async function parseErrorResponseFromResponse(response: Response): Promise<never> {\n const contentType = response.headers.get('Content-Type') ?? '';\n let body: unknown;\n\n if (contentType.includes('application/json')) {\n try {\n body = await response.json();\n } catch {\n body = { message: response.statusText };\n }\n } else {\n body = { message: await response.text().catch(() => response.statusText) };\n }\n\n const retryAfterHeader = response.headers.get('Retry-After');\n let headerRetryAfter: number | undefined;\n if (retryAfterHeader) {\n headerRetryAfter = parseRetryAfterHeader(retryAfterHeader);\n }\n\n try {\n parseErrorResponse(response.status, body);\n } catch (error) {\n if (error instanceof AIGatewayError && error.retryAfter == null && headerRetryAfter != null) {\n throw createTypedError(\n error.message,\n error.code,\n error.statusCode,\n { ...error.metadata, retryAfter: headerRetryAfter },\n error.cause != null ? { cause: error.cause } : undefined,\n );\n }\n throw error;\n }\n}\n\n/**\n * Normalize an SSE `event: error` payload into a typed AIGatewayError subclass.\n */\nexport function parseStreamErrorPayload(payload: {\n message?: string;\n code?: string;\n statusCode?: number;\n metadata?: Record<string, unknown>;\n}): AIGatewayError {\n const statusCode = payload.statusCode ?? 500;\n const rawCode = payload.code ?? 'INTERNAL_SERVER_ERROR';\n const message = payload.message ?? 'Stream error';\n const meta: NormalizedErrorMetadata = {};\n if (payload.metadata) {\n if (typeof payload.metadata.paymentUrl === 'string') meta.paymentUrl = payload.metadata.paymentUrl;\n if (typeof payload.metadata.retryAfter === 'number') meta.retryAfter = payload.metadata.retryAfter;\n if (typeof payload.metadata.requestId === 'string') meta.requestId = payload.metadata.requestId;\n }\n const normalizedCode = mapGatewayApiCodeToNormalized(rawCode, statusCode);\n return createTypedError(message, normalizedCode, statusCode, meta);\n}\n\n/**\n * Parse error response body and throw appropriate AIGatewayError subclass.\n * Handles both Gateway API format and OpenAI proxy format.\n */\nexport function parseErrorResponse(statusCode: number, body: unknown): never {\n const meta: NormalizedErrorMetadata = {};\n\n if (body && typeof body === 'object') {\n if ('request_id' in body && typeof (body as { request_id?: string }).request_id === 'string') {\n meta.requestId = (body as { request_id: string }).request_id;\n }\n if ('path' in body && typeof (body as { path?: string }).path === 'string') {\n meta.path = (body as { path: string }).path;\n }\n if ('timestamp' in body && typeof (body as { timestamp?: string }).timestamp === 'string') {\n meta.timestamp = (body as { timestamp: string }).timestamp;\n }\n }\n\n const gatewayBody = body as GatewayApiErrorResponse | undefined;\n if (gatewayBody?.statusCode != null && typeof gatewayBody.message === 'string' && gatewayBody.code) {\n const code = mapGatewayApiCodeToNormalized(gatewayBody.code, gatewayBody.statusCode);\n if (gatewayBody.errors?.length) meta.errors = gatewayBody.errors;\n const firstError = gatewayBody.errors?.[0];\n if (firstError?.metadata) {\n if (typeof firstError.metadata.paymentUrl === 'string') meta.paymentUrl = firstError.metadata.paymentUrl;\n if (typeof firstError.metadata.retryAfter === 'number') meta.retryAfter = firstError.metadata.retryAfter;\n }\n throw createTypedError(gatewayBody.message, code, gatewayBody.statusCode, meta);\n }\n\n const oai = body as OpenAIErrorResponse | undefined;\n if (oai?.error?.message) {\n const code = mapOpenAIErrorToNormalized(oai.error.type, statusCode);\n if (oai.request_id) meta.requestId = oai.request_id;\n throw createTypedError(oai.error.message, code, statusCode, meta);\n }\n\n const message =\n typeof (body as { message?: string })?.message === 'string'\n ? (body as { message: string }).message\n : `Request failed with status ${statusCode}`;\n\n let fallbackCode: ErrorCode;\n if (statusCode === 401) fallbackCode = ErrorCode.AuthRequired;\n else if (statusCode === 403) fallbackCode = ErrorCode.Forbidden;\n else if (statusCode === 429) fallbackCode = ErrorCode.RateLimited;\n else if (statusCode >= 500) fallbackCode = ErrorCode.InternalServerError;\n else fallbackCode = ErrorCode.BadRequest;\n\n throw createTypedError(message, fallbackCode, statusCode, meta);\n}\n"]}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration types and resolver for the AI Gateway SDK.
|
|
3
|
+
*
|
|
4
|
+
* GatewayProviderSettings is the public API — 8 fields.
|
|
5
|
+
* ResolvedConfig is the internal resolved form used by the request pipeline.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Supported gateway environments.
|
|
9
|
+
* Only 'production' is exposed — non-production setups use a direct `baseURL`
|
|
10
|
+
* instead, keeping env-specific URL management out of this library.
|
|
11
|
+
*/
|
|
12
|
+
type Environment = 'production';
|
|
13
|
+
interface RetryConfig {
|
|
14
|
+
/** Max number of attempts (including first). Default 3. */
|
|
15
|
+
maxAttempts?: number;
|
|
16
|
+
/** Initial delay in ms. Default 1000. */
|
|
17
|
+
initialDelayMs?: number;
|
|
18
|
+
/** Max delay in ms. Default 30000. */
|
|
19
|
+
maxDelayMs?: number;
|
|
20
|
+
/** Retry only on these status codes (and network errors). Default: 429, 5xx. */
|
|
21
|
+
retryableStatuses?: number[];
|
|
22
|
+
}
|
|
23
|
+
interface RequestConfig {
|
|
24
|
+
url: string;
|
|
25
|
+
method: string;
|
|
26
|
+
headers: Record<string, string>;
|
|
27
|
+
body?: RequestInit['body'];
|
|
28
|
+
signal?: AbortSignal | undefined;
|
|
29
|
+
}
|
|
30
|
+
type Middleware = (config: RequestConfig, next: (config: RequestConfig) => Promise<Response>) => Promise<Response>;
|
|
31
|
+
/**
|
|
32
|
+
* Configuration for AI Gateway providers and NestJS module.
|
|
33
|
+
*
|
|
34
|
+
* Exactly 8 fields — covers auth, routing, request behaviour and middleware.
|
|
35
|
+
*/
|
|
36
|
+
interface GatewayProviderSettings {
|
|
37
|
+
/** Gateway base URL. Required if env is not set. */
|
|
38
|
+
baseURL?: string;
|
|
39
|
+
/** 'production' uses the default MacPaw Gateway URL. */
|
|
40
|
+
env?: Environment;
|
|
41
|
+
/**
|
|
42
|
+
* Returns Bearer token for auth.
|
|
43
|
+
* Called with `forceRefresh=true` after 401 — provide a fresh token.
|
|
44
|
+
*/
|
|
45
|
+
getAuthToken: (forceRefresh?: boolean) => Promise<string | null>;
|
|
46
|
+
/** Extra headers sent with every request. Do not set Authorization here. */
|
|
47
|
+
headers?: Record<string, string>;
|
|
48
|
+
/** Retry policy. Set to false to disable. */
|
|
49
|
+
retry?: RetryConfig | false;
|
|
50
|
+
/** Request timeout in ms. Default: 60000. */
|
|
51
|
+
timeout?: number;
|
|
52
|
+
/** Request interceptors. Run in order before each request. */
|
|
53
|
+
middleware?: Middleware[];
|
|
54
|
+
/**
|
|
55
|
+
* Custom fetch implementation.
|
|
56
|
+
* Use for testing or low-level request customization.
|
|
57
|
+
*/
|
|
58
|
+
fetch?: typeof fetch;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Error types for the AI Gateway SDK.
|
|
63
|
+
*
|
|
64
|
+
* Combines error classes, API codes, and response shapes in one place.
|
|
65
|
+
* parseErrorResponse throws the SPECIFIC subclass (AuthError, CreditsError, etc.)
|
|
66
|
+
* so that `instanceof` checks work correctly in consumer code.
|
|
67
|
+
*/
|
|
68
|
+
type ObjectValues<T> = T[keyof T];
|
|
69
|
+
/** Raw error codes returned by the AI Gateway HTTP API. */
|
|
70
|
+
declare const GatewayApiCode: {
|
|
71
|
+
readonly BadRequest: "BAD_REQUEST";
|
|
72
|
+
readonly Unauthorized: "UNAUTHORIZED";
|
|
73
|
+
readonly InsufficientCredits: "INSUFFICIENT_CREDITS";
|
|
74
|
+
readonly Forbidden: "FORBIDDEN";
|
|
75
|
+
readonly Validation: "VALIDATION";
|
|
76
|
+
readonly RateLimitExceeded: "RATE_LIMIT_EXCEEDED";
|
|
77
|
+
readonly InternalServerError: "INTERNAL_SERVER_ERROR";
|
|
78
|
+
readonly ServiceUnavailable: "SERVICE_UNAVAILABLE";
|
|
79
|
+
readonly Timeout: "TIMEOUT";
|
|
80
|
+
readonly NotFound: "NOT_FOUND";
|
|
81
|
+
readonly Conflict: "CONFLICT";
|
|
82
|
+
};
|
|
83
|
+
type GatewayApiCode = ObjectValues<typeof GatewayApiCode>;
|
|
84
|
+
/** Normalized error codes for app handling. */
|
|
85
|
+
declare const ErrorCode: {
|
|
86
|
+
readonly AuthRequired: "AUTH_REQUIRED";
|
|
87
|
+
readonly InsufficientCredits: "INSUFFICIENT_CREDITS";
|
|
88
|
+
readonly SubscriptionExpired: "SUBSCRIPTION_EXPIRED";
|
|
89
|
+
readonly ModelNotAllowed: "MODEL_NOT_ALLOWED";
|
|
90
|
+
readonly RateLimited: "RATE_LIMITED";
|
|
91
|
+
readonly BadRequest: "BAD_REQUEST";
|
|
92
|
+
readonly Validation: "VALIDATION";
|
|
93
|
+
readonly Forbidden: "FORBIDDEN";
|
|
94
|
+
readonly InternalServerError: "INTERNAL_SERVER_ERROR";
|
|
95
|
+
readonly ServiceUnavailable: "SERVICE_UNAVAILABLE";
|
|
96
|
+
readonly Timeout: "TIMEOUT";
|
|
97
|
+
readonly NotFound: "NOT_FOUND";
|
|
98
|
+
readonly Conflict: "CONFLICT";
|
|
99
|
+
};
|
|
100
|
+
type ErrorCode = ObjectValues<typeof ErrorCode>;
|
|
101
|
+
interface GatewayApiErrorItem {
|
|
102
|
+
target?: string;
|
|
103
|
+
property?: string;
|
|
104
|
+
constraints?: string[];
|
|
105
|
+
message?: string;
|
|
106
|
+
metadata?: Record<string, unknown>;
|
|
107
|
+
}
|
|
108
|
+
interface GatewayApiErrorResponse {
|
|
109
|
+
statusCode: number;
|
|
110
|
+
message: string;
|
|
111
|
+
timestamp: string;
|
|
112
|
+
code: GatewayApiCode;
|
|
113
|
+
path?: string;
|
|
114
|
+
errors?: GatewayApiErrorItem[];
|
|
115
|
+
request_id?: string;
|
|
116
|
+
}
|
|
117
|
+
interface OpenAIErrorResponse {
|
|
118
|
+
error: {
|
|
119
|
+
message: string;
|
|
120
|
+
type?: string | null;
|
|
121
|
+
code?: string | null;
|
|
122
|
+
param?: string | null;
|
|
123
|
+
};
|
|
124
|
+
request_id?: string;
|
|
125
|
+
}
|
|
126
|
+
interface NormalizedErrorMetadata {
|
|
127
|
+
paymentUrl?: string;
|
|
128
|
+
/** Suggested delay before retrying, in seconds (from server's `Retry-After`). */
|
|
129
|
+
retryAfter?: number;
|
|
130
|
+
requestId?: string;
|
|
131
|
+
path?: string;
|
|
132
|
+
timestamp?: string;
|
|
133
|
+
errors?: GatewayApiErrorItem[];
|
|
134
|
+
}
|
|
135
|
+
declare class AIGatewayError extends Error {
|
|
136
|
+
readonly code: ErrorCode;
|
|
137
|
+
readonly statusCode: number;
|
|
138
|
+
readonly metadata: NormalizedErrorMetadata;
|
|
139
|
+
constructor(message: string, code: ErrorCode, statusCode: number, metadata?: NormalizedErrorMetadata, options?: {
|
|
140
|
+
cause?: unknown;
|
|
141
|
+
});
|
|
142
|
+
get paymentUrl(): string | undefined;
|
|
143
|
+
/** Suggested delay before retrying, in seconds. `undefined` if not provided by the server. */
|
|
144
|
+
get retryAfter(): number | undefined;
|
|
145
|
+
get requestId(): string | undefined;
|
|
146
|
+
toJSON(): Record<string, unknown>;
|
|
147
|
+
}
|
|
148
|
+
declare class AuthError extends AIGatewayError {
|
|
149
|
+
constructor(message: string, statusCode: number, metadata?: NormalizedErrorMetadata, options?: {
|
|
150
|
+
cause?: unknown;
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
declare class CreditsError extends AIGatewayError {
|
|
154
|
+
constructor(message: string, statusCode: number, code: typeof ErrorCode.InsufficientCredits | typeof ErrorCode.SubscriptionExpired, metadata?: NormalizedErrorMetadata, options?: {
|
|
155
|
+
cause?: unknown;
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
declare class RateLimitError extends AIGatewayError {
|
|
159
|
+
constructor(message: string, statusCode: number, metadata?: NormalizedErrorMetadata, options?: {
|
|
160
|
+
cause?: unknown;
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
declare class ModelNotAllowedError extends AIGatewayError {
|
|
164
|
+
constructor(message: string, statusCode: number, metadata?: NormalizedErrorMetadata, options?: {
|
|
165
|
+
cause?: unknown;
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
declare class GatewayValidationError extends AIGatewayError {
|
|
169
|
+
constructor(message: string, statusCode: number, metadata?: NormalizedErrorMetadata, options?: {
|
|
170
|
+
cause?: unknown;
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
/** Type guard: returns true if the value is an AIGatewayError (or any subclass). */
|
|
174
|
+
declare function isAIGatewayError(value: unknown): value is AIGatewayError;
|
|
175
|
+
/**
|
|
176
|
+
* Parse error response body and throw appropriate AIGatewayError subclass.
|
|
177
|
+
* Handles both Gateway API format and OpenAI proxy format.
|
|
178
|
+
*/
|
|
179
|
+
declare function parseErrorResponse(statusCode: number, body: unknown): never;
|
|
180
|
+
|
|
181
|
+
export { AIGatewayError as A, CreditsError as C, ErrorCode as E, type GatewayProviderSettings as G, type Middleware as M, type NormalizedErrorMetadata as N, type OpenAIErrorResponse as O, RateLimitError as R, AuthError as a, GatewayApiCode as b, type GatewayApiErrorItem as c, type GatewayApiErrorResponse as d, GatewayValidationError as e, ModelNotAllowedError as f, type RetryConfig as g, isAIGatewayError as i, parseErrorResponse as p };
|