modelfusion 0.92.0 → 0.92.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/core/api/ApiCallError.cjs +9 -1
  2. package/core/api/ApiCallError.d.ts +4 -1
  3. package/core/api/ApiCallError.js +9 -1
  4. package/model-provider/ollama/OllamaError.cjs +25 -24
  5. package/model-provider/ollama/OllamaError.d.ts +1 -11
  6. package/model-provider/ollama/OllamaError.js +24 -22
  7. package/model-provider/ollama/OllamaTextGenerationModel.cjs +38 -1
  8. package/model-provider/ollama/OllamaTextGenerationModel.d.ts +5 -1
  9. package/model-provider/ollama/OllamaTextGenerationModel.js +39 -2
  10. package/model-provider/ollama/OllamaTextGenerationModel.test.cjs +63 -0
  11. package/model-provider/ollama/OllamaTextGenerationModel.test.d.ts +1 -0
  12. package/model-provider/ollama/OllamaTextGenerationModel.test.js +61 -0
  13. package/model-provider/ollama/index.cjs +1 -3
  14. package/model-provider/ollama/index.d.ts +1 -1
  15. package/model-provider/ollama/index.js +0 -1
  16. package/model-provider/openai/OpenAIError.cjs +13 -29
  17. package/model-provider/openai/OpenAIError.d.ts +2 -11
  18. package/model-provider/openai/OpenAIError.js +11 -26
  19. package/model-provider/openai/index.cjs +1 -3
  20. package/model-provider/openai/index.d.ts +1 -1
  21. package/model-provider/openai/index.js +0 -1
  22. package/model-provider/whispercpp/WhisperCppTranscriptionModel.cjs +5 -8
  23. package/model-provider/whispercpp/WhisperCppTranscriptionModel.js +5 -8
  24. package/package.json +5 -4
  25. package/util/AsyncQueue.test.cjs +20 -21
  26. package/util/AsyncQueue.test.js +9 -10
  27. package/util/isDeepEqualData.test.cjs +14 -15
  28. package/util/isDeepEqualData.test.js +14 -15
  29. package/util/runSafe.test.cjs +12 -13
  30. package/util/runSafe.test.js +6 -7
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ApiCallError = void 0;
4
4
  class ApiCallError extends Error {
5
5
  constructor({ message, url, requestBodyValues, statusCode, responseBody, cause, isRetryable = statusCode != null &&
6
- (statusCode === 429 || statusCode >= 500), }) {
6
+ (statusCode === 429 || statusCode >= 500), data, }) {
7
7
  super(message);
8
8
  Object.defineProperty(this, "url", {
9
9
  enumerable: true,
@@ -41,6 +41,12 @@ class ApiCallError extends Error {
41
41
  writable: true,
42
42
  value: void 0
43
43
  });
44
+ Object.defineProperty(this, "data", {
45
+ enumerable: true,
46
+ configurable: true,
47
+ writable: true,
48
+ value: void 0
49
+ });
44
50
  this.name = "ApiCallError";
45
51
  this.url = url;
46
52
  this.requestBodyValues = requestBodyValues;
@@ -48,6 +54,7 @@ class ApiCallError extends Error {
48
54
  this.responseBody = responseBody;
49
55
  this.cause = cause;
50
56
  this.isRetryable = isRetryable;
57
+ this.data = data;
51
58
  }
52
59
  toJSON() {
53
60
  return {
@@ -59,6 +66,7 @@ class ApiCallError extends Error {
59
66
  responseBody: this.responseBody,
60
67
  cause: this.cause,
61
68
  isRetryable: this.isRetryable,
69
+ data: this.data,
62
70
  };
63
71
  }
64
72
  }
@@ -5,7 +5,8 @@ export declare class ApiCallError extends Error {
5
5
  readonly responseBody?: string;
6
6
  readonly cause?: unknown;
7
7
  readonly isRetryable: boolean;
8
- constructor({ message, url, requestBodyValues, statusCode, responseBody, cause, isRetryable, }: {
8
+ readonly data?: unknown;
9
+ constructor({ message, url, requestBodyValues, statusCode, responseBody, cause, isRetryable, data, }: {
9
10
  message: string;
10
11
  url: string;
11
12
  requestBodyValues: unknown;
@@ -13,6 +14,7 @@ export declare class ApiCallError extends Error {
13
14
  responseBody?: string;
14
15
  cause?: unknown;
15
16
  isRetryable?: boolean;
17
+ data?: unknown;
16
18
  });
17
19
  toJSON(): {
18
20
  name: string;
@@ -23,5 +25,6 @@ export declare class ApiCallError extends Error {
23
25
  responseBody: string | undefined;
24
26
  cause: unknown;
25
27
  isRetryable: boolean;
28
+ data: unknown;
26
29
  };
27
30
  }
@@ -1,6 +1,6 @@
1
1
  export class ApiCallError extends Error {
2
2
  constructor({ message, url, requestBodyValues, statusCode, responseBody, cause, isRetryable = statusCode != null &&
3
- (statusCode === 429 || statusCode >= 500), }) {
3
+ (statusCode === 429 || statusCode >= 500), data, }) {
4
4
  super(message);
5
5
  Object.defineProperty(this, "url", {
6
6
  enumerable: true,
@@ -38,6 +38,12 @@ export class ApiCallError extends Error {
38
38
  writable: true,
39
39
  value: void 0
40
40
  });
41
+ Object.defineProperty(this, "data", {
42
+ enumerable: true,
43
+ configurable: true,
44
+ writable: true,
45
+ value: void 0
46
+ });
41
47
  this.name = "ApiCallError";
42
48
  this.url = url;
43
49
  this.requestBodyValues = requestBodyValues;
@@ -45,6 +51,7 @@ export class ApiCallError extends Error {
45
51
  this.responseBody = responseBody;
46
52
  this.cause = cause;
47
53
  this.isRetryable = isRetryable;
54
+ this.data = data;
48
55
  }
49
56
  toJSON() {
50
57
  return {
@@ -56,6 +63,7 @@ export class ApiCallError extends Error {
56
63
  responseBody: this.responseBody,
57
64
  cause: this.cause,
58
65
  isRetryable: this.isRetryable,
66
+ data: this.data,
59
67
  };
60
68
  }
61
69
  }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.failedOllamaCallResponseHandler = exports.OllamaError = void 0;
3
+ exports.failedOllamaCallResponseHandler = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const ApiCallError_js_1 = require("../../core/api/ApiCallError.cjs");
6
6
  const ZodSchema_js_1 = require("../../core/schema/ZodSchema.cjs");
@@ -8,30 +8,31 @@ const parseJSON_js_1 = require("../../core/schema/parseJSON.cjs");
8
8
  const ollamaErrorDataSchema = new ZodSchema_js_1.ZodSchema(zod_1.z.object({
9
9
  error: zod_1.z.string(),
10
10
  }));
11
- class OllamaError extends ApiCallError_js_1.ApiCallError {
12
- constructor({ statusCode, url, requestBodyValues, data, message = data.error, }) {
13
- super({ message, statusCode, requestBodyValues, url });
14
- Object.defineProperty(this, "data", {
15
- enumerable: true,
16
- configurable: true,
17
- writable: true,
18
- value: void 0
19
- });
20
- this.data = data;
21
- }
22
- }
23
- exports.OllamaError = OllamaError;
24
11
  const failedOllamaCallResponseHandler = async ({ response, url, requestBodyValues }) => {
25
12
  const responseBody = await response.text();
26
- const parsedError = (0, parseJSON_js_1.parseJSON)({
27
- text: responseBody,
28
- schema: ollamaErrorDataSchema,
29
- });
30
- return new OllamaError({
31
- url,
32
- requestBodyValues,
33
- statusCode: response.status,
34
- data: parsedError,
35
- });
13
+ // resilient parsing in case the response is not JSON or does not match the schema:
14
+ try {
15
+ const parsedError = (0, parseJSON_js_1.parseJSON)({
16
+ text: responseBody,
17
+ schema: ollamaErrorDataSchema,
18
+ });
19
+ return new ApiCallError_js_1.ApiCallError({
20
+ message: parsedError.error,
21
+ url,
22
+ requestBodyValues,
23
+ statusCode: response.status,
24
+ responseBody,
25
+ data: parsedError,
26
+ });
27
+ }
28
+ catch (parseError) {
29
+ return new ApiCallError_js_1.ApiCallError({
30
+ message: responseBody.trim() !== "" ? responseBody : response.statusText,
31
+ url,
32
+ requestBodyValues,
33
+ statusCode: response.status,
34
+ responseBody,
35
+ });
36
+ }
36
37
  };
37
38
  exports.failedOllamaCallResponseHandler = failedOllamaCallResponseHandler;
@@ -4,16 +4,6 @@ import { ZodSchema } from "../../core/schema/ZodSchema.js";
4
4
  declare const ollamaErrorDataSchema: ZodSchema<{
5
5
  error: string;
6
6
  }>;
7
- type OllamaErrorData = (typeof ollamaErrorDataSchema)["_type"];
8
- export declare class OllamaError extends ApiCallError {
9
- readonly data: OllamaErrorData;
10
- constructor({ statusCode, url, requestBodyValues, data, message, }: {
11
- message?: string;
12
- statusCode: number;
13
- url: string;
14
- requestBodyValues: unknown;
15
- data: OllamaErrorData;
16
- });
17
- }
7
+ export type OllamaErrorData = (typeof ollamaErrorDataSchema)["_type"];
18
8
  export declare const failedOllamaCallResponseHandler: ResponseHandler<ApiCallError>;
19
9
  export {};
@@ -5,28 +5,30 @@ import { parseJSON } from "../../core/schema/parseJSON.js";
5
5
  const ollamaErrorDataSchema = new ZodSchema(z.object({
6
6
  error: z.string(),
7
7
  }));
8
- export class OllamaError extends ApiCallError {
9
- constructor({ statusCode, url, requestBodyValues, data, message = data.error, }) {
10
- super({ message, statusCode, requestBodyValues, url });
11
- Object.defineProperty(this, "data", {
12
- enumerable: true,
13
- configurable: true,
14
- writable: true,
15
- value: void 0
16
- });
17
- this.data = data;
18
- }
19
- }
20
8
  export const failedOllamaCallResponseHandler = async ({ response, url, requestBodyValues }) => {
21
9
  const responseBody = await response.text();
22
- const parsedError = parseJSON({
23
- text: responseBody,
24
- schema: ollamaErrorDataSchema,
25
- });
26
- return new OllamaError({
27
- url,
28
- requestBodyValues,
29
- statusCode: response.status,
30
- data: parsedError,
31
- });
10
+ // resilient parsing in case the response is not JSON or does not match the schema:
11
+ try {
12
+ const parsedError = parseJSON({
13
+ text: responseBody,
14
+ schema: ollamaErrorDataSchema,
15
+ });
16
+ return new ApiCallError({
17
+ message: parsedError.error,
18
+ url,
19
+ requestBodyValues,
20
+ statusCode: response.status,
21
+ responseBody,
22
+ data: parsedError,
23
+ });
24
+ }
25
+ catch (parseError) {
26
+ return new ApiCallError({
27
+ message: responseBody.trim() !== "" ? responseBody : response.statusText,
28
+ url,
29
+ requestBodyValues,
30
+ statusCode: response.status,
31
+ responseBody,
32
+ });
33
+ }
32
34
  };
@@ -2,9 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.OllamaTextGenerationResponseFormat = exports.OllamaTextGenerationModel = void 0;
4
4
  const zod_1 = require("zod");
5
+ const ApiCallError_js_1 = require("../../core/api/ApiCallError.cjs");
5
6
  const callWithRetryAndThrottle_js_1 = require("../../core/api/callWithRetryAndThrottle.cjs");
6
7
  const postToApi_js_1 = require("../../core/api/postToApi.cjs");
7
8
  const ZodSchema_js_1 = require("../../core/schema/ZodSchema.cjs");
9
+ const parseJSON_js_1 = require("../../core/schema/parseJSON.cjs");
8
10
  const AbstractModel_js_1 = require("../../model-function/AbstractModel.cjs");
9
11
  const PromptFormatTextStreamingModel_js_1 = require("../../model-function/generate-text/PromptFormatTextStreamingModel.cjs");
10
12
  const TextGenerationToolCallModel_js_1 = require("../../tool/generate-tool-call/TextGenerationToolCallModel.cjs");
@@ -238,7 +240,42 @@ exports.OllamaTextGenerationResponseFormat = {
238
240
  */
239
241
  json: {
240
242
  stream: false,
241
- handler: (0, postToApi_js_1.createJsonResponseHandler)(ollamaTextGenerationResponseSchema),
243
+ handler: (async ({ response, url, requestBodyValues }) => {
244
+ const responseBody = await response.text();
245
+ const parsedResult = (0, parseJSON_js_1.safeParseJSON)({
246
+ text: responseBody,
247
+ schema: new ZodSchema_js_1.ZodSchema(zod_1.z.union([
248
+ ollamaTextGenerationResponseSchema,
249
+ zod_1.z.object({
250
+ done: zod_1.z.literal(false),
251
+ model: zod_1.z.string(),
252
+ created_at: zod_1.z.string(),
253
+ response: zod_1.z.string(),
254
+ }),
255
+ ])),
256
+ });
257
+ if (!parsedResult.success) {
258
+ throw new ApiCallError_js_1.ApiCallError({
259
+ message: "Invalid JSON response",
260
+ cause: parsedResult.error,
261
+ statusCode: response.status,
262
+ responseBody,
263
+ url,
264
+ requestBodyValues,
265
+ });
266
+ }
267
+ if (parsedResult.data.done === false) {
268
+ throw new ApiCallError_js_1.ApiCallError({
269
+ message: "Incomplete Ollama response received",
270
+ statusCode: response.status,
271
+ responseBody,
272
+ url,
273
+ requestBodyValues,
274
+ isRetryable: true,
275
+ });
276
+ }
277
+ return parsedResult.data;
278
+ }),
242
279
  },
243
280
  /**
244
281
  * Returns an async iterable over the full deltas (all choices, including full current state at time of event)
@@ -189,7 +189,11 @@ export declare const OllamaTextGenerationResponseFormat: {
189
189
  */
190
190
  json: {
191
191
  stream: false;
192
- handler: ResponseHandler<{
192
+ handler: ({ response, url, requestBodyValues }: {
193
+ url: string;
194
+ requestBodyValues: unknown;
195
+ response: Response;
196
+ }) => Promise<{
193
197
  response: string;
194
198
  model: string;
195
199
  done: true;
@@ -1,7 +1,9 @@
1
1
  import { z } from "zod";
2
+ import { ApiCallError } from "../../core/api/ApiCallError.js";
2
3
  import { callWithRetryAndThrottle } from "../../core/api/callWithRetryAndThrottle.js";
3
- import { createJsonResponseHandler, postJsonToApi, } from "../../core/api/postToApi.js";
4
+ import { postJsonToApi } from "../../core/api/postToApi.js";
4
5
  import { ZodSchema } from "../../core/schema/ZodSchema.js";
6
+ import { safeParseJSON } from "../../core/schema/parseJSON.js";
5
7
  import { AbstractModel } from "../../model-function/AbstractModel.js";
6
8
  import { PromptFormatTextStreamingModel } from "../../model-function/generate-text/PromptFormatTextStreamingModel.js";
7
9
  import { TextGenerationToolCallModel, } from "../../tool/generate-tool-call/TextGenerationToolCallModel.js";
@@ -234,7 +236,42 @@ export const OllamaTextGenerationResponseFormat = {
234
236
  */
235
237
  json: {
236
238
  stream: false,
237
- handler: createJsonResponseHandler(ollamaTextGenerationResponseSchema),
239
+ handler: (async ({ response, url, requestBodyValues }) => {
240
+ const responseBody = await response.text();
241
+ const parsedResult = safeParseJSON({
242
+ text: responseBody,
243
+ schema: new ZodSchema(z.union([
244
+ ollamaTextGenerationResponseSchema,
245
+ z.object({
246
+ done: z.literal(false),
247
+ model: z.string(),
248
+ created_at: z.string(),
249
+ response: z.string(),
250
+ }),
251
+ ])),
252
+ });
253
+ if (!parsedResult.success) {
254
+ throw new ApiCallError({
255
+ message: "Invalid JSON response",
256
+ cause: parsedResult.error,
257
+ statusCode: response.status,
258
+ responseBody,
259
+ url,
260
+ requestBodyValues,
261
+ });
262
+ }
263
+ if (parsedResult.data.done === false) {
264
+ throw new ApiCallError({
265
+ message: "Incomplete Ollama response received",
266
+ statusCode: response.status,
267
+ responseBody,
268
+ url,
269
+ requestBodyValues,
270
+ isRetryable: true,
271
+ });
272
+ }
273
+ return parsedResult.data;
274
+ }),
238
275
  },
239
276
  /**
240
277
  * Returns an async iterable over the full deltas (all choices, including full current state at time of event)
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const assert_1 = require("assert");
4
+ const msw_1 = require("msw");
5
+ const node_1 = require("msw/node");
6
+ const ApiCallError_js_1 = require("../../core/api/ApiCallError.cjs");
7
+ const retryNever_js_1 = require("../../core/api/retryNever.cjs");
8
+ const generateText_js_1 = require("../../model-function/generate-text/generateText.cjs");
9
+ const OllamaApiConfiguration_js_1 = require("./OllamaApiConfiguration.cjs");
10
+ const OllamaTextGenerationModel_js_1 = require("./OllamaTextGenerationModel.cjs");
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ let responseBodyJson = {};
13
+ const server = (0, node_1.setupServer)(msw_1.http.post("http://127.0.0.1:11434/api/generate", () => msw_1.HttpResponse.json(responseBodyJson)));
14
+ beforeAll(() => server.listen());
15
+ beforeEach(() => {
16
+ responseBodyJson = {};
17
+ });
18
+ afterEach(() => server.resetHandlers());
19
+ afterAll(() => server.close());
20
+ describe("generateText", () => {
21
+ it("should return the generated text", async () => {
22
+ responseBodyJson = {
23
+ model: "test-model",
24
+ created_at: "2023-08-04T19:22:45.499127Z",
25
+ response: "test response",
26
+ context: [1, 2, 3],
27
+ done: true,
28
+ total_duration: 5589157167,
29
+ load_duration: 3013701500,
30
+ sample_count: 114,
31
+ sample_duration: 81442000,
32
+ prompt_eval_count: 46,
33
+ prompt_eval_duration: 1160282000,
34
+ eval_count: 113,
35
+ eval_duration: 1325948000,
36
+ };
37
+ const result = await (0, generateText_js_1.generateText)(new OllamaTextGenerationModel_js_1.OllamaTextGenerationModel({
38
+ model: "test-model",
39
+ }), "test prompt");
40
+ expect(result).toEqual("test response");
41
+ });
42
+ it("should throw retryable ApiCallError when Ollama is overloaded", async () => {
43
+ responseBodyJson = {
44
+ model: "",
45
+ created_at: "0001-01-01T00:00:00Z",
46
+ response: "",
47
+ done: false,
48
+ };
49
+ try {
50
+ await (0, generateText_js_1.generateText)(new OllamaTextGenerationModel_js_1.OllamaTextGenerationModel({
51
+ api: new OllamaApiConfiguration_js_1.OllamaApiConfiguration({
52
+ retry: (0, retryNever_js_1.retryNever)(),
53
+ }),
54
+ model: "test-model",
55
+ }), "test prompt");
56
+ (0, assert_1.fail)("Should have thrown ApiCallError");
57
+ }
58
+ catch (expectedError) {
59
+ expect(expectedError).toBeInstanceOf(ApiCallError_js_1.ApiCallError);
60
+ expect(expectedError.isRetryable).toBe(true);
61
+ }
62
+ });
63
+ });
@@ -0,0 +1,61 @@
1
+ import { fail } from "assert";
2
+ import { HttpResponse, http } from "msw";
3
+ import { setupServer } from "msw/node";
4
+ import { ApiCallError } from "../../core/api/ApiCallError.js";
5
+ import { retryNever } from "../../core/api/retryNever.js";
6
+ import { generateText } from "../../model-function/generate-text/generateText.js";
7
+ import { OllamaApiConfiguration } from "./OllamaApiConfiguration.js";
8
+ import { OllamaTextGenerationModel } from "./OllamaTextGenerationModel.js";
9
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
+ let responseBodyJson = {};
11
+ const server = setupServer(http.post("http://127.0.0.1:11434/api/generate", () => HttpResponse.json(responseBodyJson)));
12
+ beforeAll(() => server.listen());
13
+ beforeEach(() => {
14
+ responseBodyJson = {};
15
+ });
16
+ afterEach(() => server.resetHandlers());
17
+ afterAll(() => server.close());
18
+ describe("generateText", () => {
19
+ it("should return the generated text", async () => {
20
+ responseBodyJson = {
21
+ model: "test-model",
22
+ created_at: "2023-08-04T19:22:45.499127Z",
23
+ response: "test response",
24
+ context: [1, 2, 3],
25
+ done: true,
26
+ total_duration: 5589157167,
27
+ load_duration: 3013701500,
28
+ sample_count: 114,
29
+ sample_duration: 81442000,
30
+ prompt_eval_count: 46,
31
+ prompt_eval_duration: 1160282000,
32
+ eval_count: 113,
33
+ eval_duration: 1325948000,
34
+ };
35
+ const result = await generateText(new OllamaTextGenerationModel({
36
+ model: "test-model",
37
+ }), "test prompt");
38
+ expect(result).toEqual("test response");
39
+ });
40
+ it("should throw retryable ApiCallError when Ollama is overloaded", async () => {
41
+ responseBodyJson = {
42
+ model: "",
43
+ created_at: "0001-01-01T00:00:00Z",
44
+ response: "",
45
+ done: false,
46
+ };
47
+ try {
48
+ await generateText(new OllamaTextGenerationModel({
49
+ api: new OllamaApiConfiguration({
50
+ retry: retryNever(),
51
+ }),
52
+ model: "test-model",
53
+ }), "test prompt");
54
+ fail("Should have thrown ApiCallError");
55
+ }
56
+ catch (expectedError) {
57
+ expect(expectedError).toBeInstanceOf(ApiCallError);
58
+ expect(expectedError.isRetryable).toBe(true);
59
+ }
60
+ });
61
+ });
@@ -26,10 +26,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
26
26
  return result;
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.ollama = exports.OllamaError = void 0;
29
+ exports.ollama = void 0;
30
30
  __exportStar(require("./OllamaApiConfiguration.cjs"), exports);
31
- var OllamaError_js_1 = require("./OllamaError.cjs");
32
- Object.defineProperty(exports, "OllamaError", { enumerable: true, get: function () { return OllamaError_js_1.OllamaError; } });
33
31
  exports.ollama = __importStar(require("./OllamaFacade.cjs"));
34
32
  __exportStar(require("./OllamaTextEmbeddingModel.cjs"), exports);
35
33
  __exportStar(require("./OllamaTextGenerationModel.cjs"), exports);
@@ -1,5 +1,5 @@
1
1
  export * from "./OllamaApiConfiguration.js";
2
- export { OllamaError } from "./OllamaError.js";
2
+ export { OllamaErrorData } from "./OllamaError.js";
3
3
  export * as ollama from "./OllamaFacade.js";
4
4
  export * from "./OllamaTextEmbeddingModel.js";
5
5
  export * from "./OllamaTextGenerationModel.js";
@@ -1,5 +1,4 @@
1
1
  export * from "./OllamaApiConfiguration.js";
2
- export { OllamaError } from "./OllamaError.js";
3
2
  export * as ollama from "./OllamaFacade.js";
4
3
  export * from "./OllamaTextEmbeddingModel.js";
5
4
  export * from "./OllamaTextGenerationModel.js";
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.failedOpenAICallResponseHandler = exports.OpenAIError = exports.openAIErrorDataSchema = void 0;
3
+ exports.failedOpenAICallResponseHandler = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const ApiCallError_js_1 = require("../../core/api/ApiCallError.cjs");
6
6
  const ZodSchema_js_1 = require("../../core/schema/ZodSchema.cjs");
7
7
  const parseJSON_js_1 = require("../../core/schema/parseJSON.cjs");
8
- exports.openAIErrorDataSchema = new ZodSchema_js_1.ZodSchema(zod_1.z.object({
8
+ const openAIErrorDataSchema = new ZodSchema_js_1.ZodSchema(zod_1.z.object({
9
9
  error: zod_1.z.object({
10
10
  message: zod_1.z.string(),
11
11
  type: zod_1.z.string(),
@@ -13,50 +13,34 @@ exports.openAIErrorDataSchema = new ZodSchema_js_1.ZodSchema(zod_1.z.object({
13
13
  code: zod_1.z.string().nullable(),
14
14
  }),
15
15
  }));
16
- class OpenAIError extends ApiCallError_js_1.ApiCallError {
17
- constructor({ data, statusCode, url, requestBodyValues, message, }) {
18
- super({
19
- message,
20
- statusCode,
21
- requestBodyValues,
22
- url,
23
- isRetryable: (statusCode === 429 &&
24
- // insufficient_quota is also reported as a 429, but it's not retryable:
25
- data?.error.type !== "insufficient_quota") ||
26
- statusCode >= 500,
27
- });
28
- Object.defineProperty(this, "data", {
29
- enumerable: true,
30
- configurable: true,
31
- writable: true,
32
- value: void 0
33
- });
34
- this.data = data;
35
- }
36
- }
37
- exports.OpenAIError = OpenAIError;
38
16
  const failedOpenAICallResponseHandler = async ({ response, url, requestBodyValues }) => {
39
17
  const responseBody = await response.text();
40
18
  // resilient parsing in case the response is not JSON or does not match the schema:
41
19
  try {
42
20
  const parsedError = (0, parseJSON_js_1.parseJSON)({
43
21
  text: responseBody,
44
- schema: exports.openAIErrorDataSchema,
22
+ schema: openAIErrorDataSchema,
45
23
  });
46
- return new OpenAIError({
24
+ return new ApiCallError_js_1.ApiCallError({
25
+ message: parsedError.error.message,
47
26
  url,
48
27
  requestBodyValues,
49
28
  statusCode: response.status,
50
- message: parsedError.error.message,
29
+ responseBody,
51
30
  data: parsedError,
31
+ isRetryable: (response.status === 429 &&
32
+ // insufficient_quota is also reported as a 429, but it's not retryable:
33
+ parsedError?.error.type !== "insufficient_quota") ||
34
+ response.status >= 500,
52
35
  });
53
36
  }
54
37
  catch (parseError) {
55
- return new OpenAIError({
38
+ return new ApiCallError_js_1.ApiCallError({
39
+ message: responseBody.trim() !== "" ? responseBody : response.statusText,
56
40
  url,
57
41
  requestBodyValues,
58
42
  statusCode: response.status,
59
- message: responseBody.trim() !== "" ? responseBody : response.statusText,
43
+ responseBody,
60
44
  });
61
45
  }
62
46
  };
@@ -1,7 +1,7 @@
1
1
  import { ApiCallError } from "../../core/api/ApiCallError.js";
2
2
  import { ResponseHandler } from "../../core/api/postToApi.js";
3
3
  import { ZodSchema } from "../../core/schema/ZodSchema.js";
4
- export declare const openAIErrorDataSchema: ZodSchema<{
4
+ declare const openAIErrorDataSchema: ZodSchema<{
5
5
  error: {
6
6
  message: string;
7
7
  code: string | null;
@@ -10,14 +10,5 @@ export declare const openAIErrorDataSchema: ZodSchema<{
10
10
  };
11
11
  }>;
12
12
  export type OpenAIErrorData = (typeof openAIErrorDataSchema)["_type"];
13
- export declare class OpenAIError extends ApiCallError {
14
- readonly data?: OpenAIErrorData;
15
- constructor({ data, statusCode, url, requestBodyValues, message, }: {
16
- message: string;
17
- statusCode: number;
18
- url: string;
19
- requestBodyValues: unknown;
20
- data?: OpenAIErrorData;
21
- });
22
- }
23
13
  export declare const failedOpenAICallResponseHandler: ResponseHandler<ApiCallError>;
14
+ export {};