diff --git a/.changeset/neat-roses-wait.md b/.changeset/neat-roses-wait.md new file mode 100644 index 000000000..c43197b01 --- /dev/null +++ b/.changeset/neat-roses-wait.md @@ -0,0 +1,5 @@ +--- +"@trigger.dev/openai": patch +--- + +#344 Upgrading the openai package to v4 diff --git a/examples/job-catalog/src/openai.ts b/examples/job-catalog/src/openai.ts index 016da4e6e..35be1fa49 100644 --- a/examples/job-catalog/src/openai.ts +++ b/examples/job-catalog/src/openai.ts @@ -28,9 +28,9 @@ client.defineJob({ run: async (payload, io, ctx) => { const models = await io.openai.listModels("list-models"); - if (models.data.length > 0) { + if (models.length > 0) { await io.openai.retrieveModel("get-model", { - model: models.data[0].id, + model: models[0].id, }); } diff --git a/integrations/openai/package.json b/integrations/openai/package.json index 04c716786..612a7774e 100644 --- a/integrations/openai/package.json +++ b/integrations/openai/package.json @@ -24,12 +24,11 @@ "build:tsup": "tsup" }, "dependencies": { - "openai": "^3.3.0", + "openai": "^4.2.0", "@trigger.dev/sdk": "workspace:^2.0.10", - "@trigger.dev/integration-kit": "workspace:^2.0.10", - "zod": "3.21.4" + "@trigger.dev/integration-kit": "workspace:^2.0.10" }, "engines": { "node": ">=16.8.0" } -} +} \ No newline at end of file diff --git a/integrations/openai/src/index.ts b/integrations/openai/src/index.ts index fc9dd3a50..94094ae8a 100644 --- a/integrations/openai/src/index.ts +++ b/integrations/openai/src/index.ts @@ -1,5 +1,5 @@ import type { IntegrationClient, TriggerIntegration } from "@trigger.dev/sdk"; -import { Configuration, OpenAIApi } from "openai"; +import OpenAIApi from "openai"; import * as tasks from "./tasks"; import { OpenAIIntegrationOptions } from "./types"; @@ -28,12 +28,10 @@ export class OpenAI implements TriggerIntegration; - -type RetrieveModelRequest = { - model: string; -}; - -type RetrieveModelResponseData = Prettify< - Awaited>["data"] ->; +type OpenAIClientType = InstanceType; export const retrieveModel: AuthenticatedTask< OpenAIClientType, - Prettify, - RetrieveModelResponseData + { model: string }, + OpenAI.Models.Model > = { onError: onTaskError, run: async (params, client) => { - return client.retrieveModel(params.model).then((res) => res.data); + return await client.models.retrieve(params.model); }, init: (params) => { return { @@ -47,16 +31,12 @@ export const retrieveModel: AuthenticatedTask< }, }; -type ListModelsResponseData = Awaited>["data"]; - -export const listModels: AuthenticatedTask< - OpenAIClientType, - void, - Prettify -> = { +export const listModels: AuthenticatedTask = { onError: onTaskError, run: async (params, client) => { - return client.listModels().then((res) => res.data); + const response = await client.models.list(); + + return response.data; }, init: (params) => { return { @@ -70,15 +50,15 @@ export const listModels: AuthenticatedTask< export const createCompletion: AuthenticatedTask< OpenAIClientType, - Prettify, - Prettify>["data"]> + Prettify, + OpenAI.Completion > = { run: async (params, client, task) => { - const response = await client.createCompletion(params); + const response = await client.completions.create(params); - task.outputProperties = createTaskUsageProperties(response.data.usage); + task.outputProperties = createTaskUsageProperties(response.usage); - return response.data; + return response; }, init: (params) => { return { @@ -95,18 +75,14 @@ export const createCompletion: AuthenticatedTask< }, }; -type CreateCompletionResponseData = Awaited< - ReturnType ->["data"]; - export const backgroundCreateCompletion: AuthenticatedTask< OpenAIClientType, - Prettify, - Prettify, + Prettify, + Prettify, OpenAIIntegrationAuth > = { run: async (params, client, task, io, auth) => { - const response = await io.backgroundFetch( + const response = await io.backgroundFetch( "background", "https://api.openai.com/v1/completions", { @@ -139,22 +115,18 @@ export const backgroundCreateCompletion: AuthenticatedTask< }, }; -type CreateChatCompetionResponseData = Awaited< - ReturnType ->["data"]; - export const createChatCompletion: AuthenticatedTask< OpenAIClientType, - Prettify, - Prettify + Prettify, + Prettify > = { onError: onTaskError, run: async (params, client, task) => { - const response = await client.createChatCompletion(params); + const response = await client.chat.completions.create(params); - task.outputProperties = createTaskUsageProperties(response.data.usage); + task.outputProperties = createTaskUsageProperties(response.usage); - return response.data; + return response; }, init: (params) => { return { @@ -173,12 +145,12 @@ export const createChatCompletion: AuthenticatedTask< export const backgroundCreateChatCompletion: AuthenticatedTask< OpenAIClientType, - Prettify, - Prettify, + Prettify, + Prettify, OpenAIIntegrationAuth > = { run: async (params, client, task, io, auth) => { - const response = await io.backgroundFetch( + const response = await io.backgroundFetch( "background", "https://api.openai.com/v1/chat/completions", { @@ -229,20 +201,21 @@ export const backgroundCreateChatCompletion: AuthenticatedTask< }, }; -type CreateEditResponseData = Prettify>["data"]>; - +/** + * @deprecated The Edits API is deprecated; please use Chat Completions instead. + */ export const createEdit: AuthenticatedTask< OpenAIClientType, - Prettify, - CreateEditResponseData + Prettify, + OpenAI.Edit > = { onError: onTaskError, run: async (params, client, task) => { - const response = await client.createEdit(params); + const response = await client.edits.create(params); - task.outputProperties = createTaskUsageProperties(response.data.usage); + task.outputProperties = createTaskUsageProperties(response.usage); - return response.data; + return response; }, init: (params) => { let properties = [ @@ -273,20 +246,16 @@ export const createEdit: AuthenticatedTask< }, }; -type CreateImageResponseData = Prettify< - Awaited>["data"] ->; - -export const createImage: AuthenticatedTask< +export const generateImage: AuthenticatedTask< OpenAIClientType, - Prettify, - CreateImageResponseData + Prettify, + OpenAI.Images.ImagesResponse > = { onError: onTaskError, run: async (params, client, task) => { - const response = await client.createImage(params); + const response = await client.images.generate(params); - return response.data; + return response; }, init: (params) => { let properties = [ @@ -326,6 +295,8 @@ export const createImage: AuthenticatedTask< }, }; +export const createImage = generateImage; + export type CreateImageEditRequest = { image: string | File; prompt: string; @@ -336,31 +307,27 @@ export type CreateImageEditRequest = { user?: string; }; -type CreateImageEditResponseData = Prettify< - Awaited>["data"] ->; - export const createImageEdit: AuthenticatedTask< OpenAIClientType, Prettify, - CreateImageEditResponseData + OpenAI.Images.ImagesResponse > = { onError: onTaskError, run: async (params, client, task) => { const file = typeof params.image === "string" ? await fileFromUrl(params.image) : params.image; const mask = typeof params.mask === "string" ? await fileFromUrl(params.mask) : params.mask; - const response = await client.createImageEdit( - file, - params.prompt, - mask, - params.n, - params.size, - params.response_format, - params.user - ); + const response = await client.images.edit({ + image: file, + prompt: params.prompt, + mask: mask, + n: params.n, + size: params.size, + response_format: params.response_format, + user: params.user, + }); - return response.data; + return response; }, init: (params) => { let properties = []; @@ -408,10 +375,6 @@ export const createImageEdit: AuthenticatedTask< }, }; -type CreateImageVariationResponseData = Prettify< - Awaited>["data"] ->; - export type CreateImageVariationRequest = { image: string | File; n?: number; @@ -423,15 +386,19 @@ export type CreateImageVariationRequest = { export const createImageVariation: AuthenticatedTask< OpenAIClientType, Prettify, - CreateImageVariationResponseData + OpenAI.Images.ImagesResponse > = { onError: onTaskError, run: async (params, client, task) => { const file = typeof params.image === "string" ? await fileFromUrl(params.image) : params.image; - const response = await client - .createImageVariation(file, params.n, params.size, params.response_format, params.user) - .then((res) => res.data); + const response = await client.images.createVariation({ + image: file, + n: params.n, + size: params.size, + response_format: params.response_format, + user: params.user, + }); return response; }, @@ -476,22 +443,18 @@ export const createImageVariation: AuthenticatedTask< }, }; -type CreateEmbeddingResponseData = Prettify< - Awaited>["data"] ->; - export const createEmbedding: AuthenticatedTask< OpenAIClientType, - Prettify, - CreateEmbeddingResponseData + Prettify, + OpenAI.Embeddings.CreateEmbeddingResponse > = { onError: onTaskError, run: async (params, client, task) => { - const response = await client.createEmbedding(params); + const response = await client.embeddings.create(params); - task.outputProperties = createTaskUsageProperties(response.data.usage); + task.outputProperties = createTaskUsageProperties(response.usage); - return response.data; + return response; }, init: (params) => { return { @@ -503,20 +466,11 @@ export const createEmbedding: AuthenticatedTask< label: "Model", text: params.model, }, - { - label: "Input", - text: - typeof params.input === "string" - ? truncate(params.input, 40) - : truncate(params.input.at(0) ?? "none", 40), - }, ], }; }, }; -type CreateFileResponseData = Awaited>["data"]; - type CreateFileRequest = { file: string | File; fileName?: string; @@ -526,7 +480,7 @@ type CreateFileRequest = { export const createFile: AuthenticatedTask< OpenAIClientType, Prettify, - Prettify + Prettify > = { onError: onTaskError, run: async (params, client) => { @@ -538,7 +492,7 @@ export const createFile: AuthenticatedTask< file = params.file; } - return client.createFile(file, params.purpose).then((res) => res.data); + return client.files.create({ file, purpose: params.purpose }); }, init: (params) => { return { @@ -559,12 +513,12 @@ export const createFile: AuthenticatedTask< }, }; -type ListFilesResponseData = Prettify>["data"]>; - -export const listFiles: AuthenticatedTask = { +export const listFiles: AuthenticatedTask = { onError: onTaskError, run: async (params, client) => { - return client.listFiles().then((res) => res.data); + const response = await client.files.list(); + + return response.data; }, init: (params) => { return { @@ -587,7 +541,7 @@ type CreateFineTuneFileRequest = { export const createFineTuneFile: AuthenticatedTask< OpenAIClientType, Prettify, - Prettify + Prettify > = { onError: onTaskError, run: async (params, client) => { @@ -596,7 +550,7 @@ export const createFineTuneFile: AuthenticatedTask< params.fileName ); - return client.createFile(file, "fine-tune").then((res) => res.data); + return client.files.create({ file, purpose: "fine-tune" }); }, init: (params) => { return { @@ -613,18 +567,14 @@ export const createFineTuneFile: AuthenticatedTask< }, }; -type CreateFineTuneResponseData = Prettify< - Awaited>["data"] ->; - export const createFineTune: AuthenticatedTask< OpenAIClientType, - Prettify, - CreateFineTuneResponseData + Prettify, + OpenAI.FineTunes.FineTune > = { onError: onTaskError, run: async (params, client) => { - return client.createFineTune(params).then((res) => res.data); + return client.fineTunes.create(params); }, init: (params) => { let properties = [ @@ -657,41 +607,36 @@ export const createFineTune: AuthenticatedTask< }, }; -type ListFineTunesResponseData = Prettify< - Awaited>["data"] ->; +export const listFineTunes: AuthenticatedTask = + { + onError: onTaskError, + run: async (params, client) => { + const response = await client.fineTunes.list(); -export const listFineTunes: AuthenticatedTask = { - onError: onTaskError, - run: async (params, client) => { - return client.listFineTunes().then((res) => res.data); - }, - init: (params) => { - return { - name: "List fine tunes", - params, - icon: "openai", - properties: [], - }; - }, -}; + return response.data; + }, + init: (params) => { + return { + name: "List fine tunes", + params, + icon: "openai", + properties: [], + }; + }, + }; type SpecificFineTuneRequest = { fineTuneId: string; }; -type RetrieveFineTuneResponseData = Prettify< - Awaited>["data"] ->; - export const retrieveFineTune: AuthenticatedTask< OpenAIClientType, Prettify, - RetrieveFineTuneResponseData + OpenAI.FineTunes.FineTune > = { onError: onTaskError, run: async (params, client) => { - return client.retrieveFineTune(params.fineTuneId).then((res) => res.data); + return client.fineTunes.retrieve(params.fineTuneId); }, init: (params) => { return { @@ -708,18 +653,14 @@ export const retrieveFineTune: AuthenticatedTask< }, }; -type CancelFineTuneResponseData = Prettify< - Awaited>["data"] ->; - export const cancelFineTune: AuthenticatedTask< OpenAIClientType, Prettify, - CancelFineTuneResponseData + OpenAI.FineTunes.FineTune > = { onError: onTaskError, run: async (params, client) => { - return client.cancelFineTune(params.fineTuneId).then((res) => res.data); + return client.fineTunes.cancel(params.fineTuneId); }, init: (params) => { return { @@ -736,18 +677,14 @@ export const cancelFineTune: AuthenticatedTask< }, }; -type ListFineTuneEventsResponseData = Prettify< - Awaited>["data"] ->; - export const listFineTuneEvents: AuthenticatedTask< OpenAIClientType, Prettify, - ListFineTuneEventsResponseData + OpenAI.FineTuneEventsListResponse > = { onError: onTaskError, run: async (params, client) => { - return client.listFineTuneEvents(params.fineTuneId, false).then((res) => res.data); + return client.fineTunes.listEvents(params.fineTuneId, { stream: false }); }, init: (params) => { return { @@ -768,18 +705,14 @@ type DeleteFineTunedModelRequest = { fineTunedModelId: string; }; -type DeleteFineTuneResponseData = Prettify< - Awaited>["data"] ->; - export const deleteFineTune: AuthenticatedTask< OpenAIClientType, Prettify, - DeleteFineTuneResponseData + OpenAI.Models.ModelDeleted > = { onError: onTaskError, run: async (params, client) => { - return client.deleteModel(params.fineTunedModelId).then((res) => res.data); + return client.models.del(params.fineTunedModelId); }, init: (params) => { return { @@ -795,3 +728,154 @@ export const deleteFineTune: AuthenticatedTask< }; }, }; + +/** + * Creates a job that fine-tunes a specified model from a given dataset. + * + * Response includes details of the enqueued job including job status and the name + * of the fine-tuned models once complete. + * + * [Learn more about fine-tuning](https://platform.openai.com/docs/guides/fine-tuning) + */ +export const createFineTuningJob: AuthenticatedTask< + OpenAIClientType, + Prettify, + OpenAI.FineTuning.FineTuningJob +> = { + onError: onTaskError, + run: async (params, client) => { + return client.fineTuning.jobs.create(params); + }, + init: (params) => { + let properties = [ + { + label: "File ID", + text: params.training_file, + }, + ]; + + if (params.model) { + properties.push({ + label: "Model", + text: params.model, + }); + } + + if (params.validation_file) { + properties.push({ + label: "Validation file", + text: params.validation_file, + }); + } + + return { + name: "Create Fine Tuning Job", + params, + icon: "openai", + properties, + }; + }, +}; + +/** + * Get info about a fine-tuning job. + * + * [Learn more about fine-tuning](https://platform.openai.com/docs/guides/fine-tuning) + */ +export const retrieveFineTuningJob: AuthenticatedTask< + OpenAIClientType, + { id: string }, + OpenAI.FineTuning.FineTuningJob +> = { + onError: onTaskError, + run: async (params, client) => { + return client.fineTuning.jobs.retrieve(params.id); + }, + init: (params) => { + return { + name: "Retrieve Fine Tuning Job", + params, + icon: "openai", + properties: [ + { + label: "Job ID", + text: params.id, + }, + ], + }; + }, +}; + +export const cancelFineTuningJob: AuthenticatedTask< + OpenAIClientType, + { id: string }, + OpenAI.FineTuning.FineTuningJob +> = { + onError: onTaskError, + run: async (params, client) => { + return client.fineTuning.jobs.cancel(params.id); + }, + init: (params) => { + return { + name: "Cancel Fine Tuning Job", + params, + icon: "openai", + properties: [ + { + label: "Job ID", + text: params.id, + }, + ], + }; + }, +}; + +export const listFineTuningJobEvents: AuthenticatedTask< + OpenAIClientType, + { id: string }, + OpenAI.FineTuning.FineTuningJobEvent[] +> = { + onError: onTaskError, + run: async (params, client) => { + const response = await client.fineTuning.jobs.listEvents(params.id); + + return response.data; + }, + init: (params) => { + return { + name: "List Fine Tuning Job Events", + params, + icon: "openai", + properties: [ + { + label: "Job ID", + text: params.id, + }, + ], + }; + }, +}; + +/** + * List your organization's fine-tuning jobs + */ +export const listFineTuningJobs: AuthenticatedTask< + OpenAIClientType, + OpenAI.FineTuning.JobListParams, + OpenAI.FineTuning.FineTuningJob[] +> = { + onError: onTaskError, + run: async (params, client) => { + const response = await client.fineTuning.jobs.list(params); + + return response.data; + }, + init: (params) => { + return { + name: "List Fine Tuning Jobs", + params, + icon: "openai", + properties: [], + }; + }, +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 421a9eeee..6639c6cf9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -344,7 +344,7 @@ importers: devDependencies: eslint: 8.31.0 eslint-config-prettier: 8.6.0_eslint@8.31.0 - eslint-config-turbo: 1.10.12_eslint@8.31.0 + eslint-config-turbo: 1.10.13_eslint@8.31.0 eslint-plugin-react: 7.31.8_eslint@8.31.0 typescript: 4.9.4 @@ -644,15 +644,13 @@ importers: '@trigger.dev/sdk': workspace:^2.0.10 '@trigger.dev/tsconfig': workspace:* '@types/node': '18' - openai: ^3.3.0 + openai: ^4.2.0 rimraf: ^3.0.2 tsup: ^6.5.0 - zod: 3.21.4 dependencies: '@trigger.dev/integration-kit': link:../../packages/integration-kit '@trigger.dev/sdk': link:../../packages/trigger-sdk - openai: 3.3.0 - zod: 3.21.4 + openai: 4.2.0 devDependencies: '@trigger.dev/tsconfig': link:../../config-packages/tsconfig '@types/node': 18.15.13 @@ -802,6 +800,9 @@ importers: tsup: 7.1.0_typescript@4.9.4 typescript: 4.9.4 + packages/astro: + specifiers: {} + packages/cli: specifiers: '@gmrchk/cli-testing-library': ^0.1.2 @@ -5210,7 +5211,7 @@ packages: engines: {node: ^8.13.0 || >=10.10.0} dependencies: '@grpc/proto-loader': 0.7.7 - '@types/node': 20.5.0 + '@types/node': 20.5.2 dev: false /@grpc/proto-loader/0.7.7: @@ -5420,7 +5421,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.1 - '@types/node': 20.5.0 + '@types/node': 20.5.2 chalk: 4.1.2 jest-message-util: 29.6.2 jest-util: 29.6.2 @@ -5441,14 +5442,14 @@ packages: '@jest/test-result': 29.6.2 '@jest/transform': 29.6.2 '@jest/types': 29.6.1 - '@types/node': 20.5.0 + '@types/node': 20.5.2 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.7.1 exit: 0.1.2 graceful-fs: 4.2.10 jest-changed-files: 29.5.0 - jest-config: 29.6.2_@types+node@20.5.0 + jest-config: 29.6.2_@types+node@20.5.2 jest-haste-map: 29.6.2 jest-message-util: 29.6.2 jest-regex-util: 29.4.3 @@ -5476,7 +5477,7 @@ packages: dependencies: '@jest/fake-timers': 29.6.2 '@jest/types': 29.6.1 - '@types/node': 20.5.0 + '@types/node': 20.5.2 jest-mock: 29.6.2 dev: true @@ -5536,7 +5537,7 @@ packages: '@jest/transform': 29.6.2 '@jest/types': 29.6.1 '@jridgewell/trace-mapping': 0.3.19 - '@types/node': 20.5.0 + '@types/node': 20.5.2 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -5646,7 +5647,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.5.0 + '@types/node': 20.5.2 '@types/yargs': 16.0.5 chalk: 4.1.2 dev: true @@ -5658,7 +5659,7 @@ packages: '@jest/schemas': 29.6.0 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.5.0 + '@types/node': 20.5.2 '@types/yargs': 17.0.19 chalk: 4.1.2 dev: true @@ -9093,7 +9094,7 @@ packages: resolution: {integrity: sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==} engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} dependencies: - '@types/node': 20.5.0 + '@types/node': 20.5.2 dev: false /@slack/types/2.8.0: @@ -9920,7 +9921,7 @@ packages: '@storybook/types': 7.0.9 '@types/detect-port': 1.3.2 '@types/node': 16.18.11 - '@types/node-fetch': 2.6.2 + '@types/node-fetch': 2.6.4 '@types/pretty-hrtime': 1.0.1 '@types/semver': 7.3.13 better-opn: 2.1.1 @@ -10943,7 +10944,7 @@ packages: /@types/bunyan/1.8.7: resolution: {integrity: sha512-jaNt6xX5poSmXuDAkQrSqx2zkR66OrdRDuVnU8ldvn3k/Ci/7Sf5nooKspQWimDnw337Bzt/yirqSThTjvrHkg==} dependencies: - '@types/node': 20.5.0 + '@types/node': 20.5.2 dev: false /@types/cacheable-request/6.0.3: @@ -10951,7 +10952,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 20.5.0 + '@types/node': 20.5.2 '@types/responselike': 1.0.0 /@types/chai-subset/1.3.3: @@ -10973,7 +10974,7 @@ packages: /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.5.0 + '@types/node': 20.5.2 /@types/content-disposition/0.5.5: resolution: {integrity: sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==} @@ -11089,19 +11090,19 @@ packages: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.5.0 + '@types/node': 20.5.2 /@types/glob/8.1.0: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.5.0 + '@types/node': 20.5.2 dev: true /@types/graceful-fs/4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 20.5.0 + '@types/node': 20.5.2 dev: true /@types/gradient-string/1.1.2: @@ -11123,7 +11124,7 @@ packages: '@types/hapi__catbox': 10.2.4 '@types/hapi__mimos': 4.1.4 '@types/hapi__shot': 4.1.2 - '@types/node': 20.5.0 + '@types/node': 20.5.2 joi: 17.7.0 dev: false @@ -11186,7 +11187,7 @@ packages: /@types/is-stream/1.1.0: resolution: {integrity: sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg==} dependencies: - '@types/node': 20.5.0 + '@types/node': 20.5.2 dev: false /@types/istanbul-lib-coverage/2.0.4: @@ -11262,7 +11263,7 @@ packages: '@types/http-errors': 2.0.1 '@types/keygrip': 1.0.2 '@types/koa-compose': 3.2.5 - '@types/node': 20.5.0 + '@types/node': 20.5.2 dev: false /@types/koa__router/8.0.7: @@ -11310,7 +11311,7 @@ packages: /@types/memcached/2.2.7: resolution: {integrity: sha512-ImJbz1i8pl+OnyhYdIDnHe8jAuM8TOwM/7VsciqhYX3IL0jPPUToAtVxklfcWFGYckahEYZxhd9FS0z3MM1dpA==} dependencies: - '@types/node': 20.5.0 + '@types/node': 20.5.2 dev: false /@types/mime-db/1.43.1: @@ -11343,7 +11344,7 @@ packages: /@types/mysql/2.15.19: resolution: {integrity: sha512-wSRg2QZv14CWcZXkgdvHbbV2ACufNy5EgI8mBBxnJIptchv7DBy/h53VMa2jDhyo0C9MO4iowE6z9vF8Ja1DkQ==} dependencies: - '@types/node': 20.5.0 + '@types/node': 20.5.2 dev: false /@types/node-fetch/2.6.2: @@ -11353,6 +11354,12 @@ packages: form-data: 3.0.1 dev: true + /@types/node-fetch/2.6.4: + resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} + dependencies: + '@types/node': 20.5.2 + form-data: 3.0.1 + /@types/node/12.20.55: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} @@ -11372,7 +11379,6 @@ packages: /@types/node/18.17.1: resolution: {integrity: sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw==} - dev: true /@types/node/20.4.2: resolution: {integrity: sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==} @@ -11386,6 +11392,7 @@ packages: /@types/node/20.5.0: resolution: {integrity: sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==} + dev: true /@types/node/20.5.2: resolution: {integrity: sha512-5j/lXt7unfPOUlrKC34HIaedONleyLtwkKggiD/0uuMfT8gg2EOpg0dz4lCD15Ga7muC+1WzJZAjIB9simWd6Q==} @@ -11409,7 +11416,7 @@ packages: /@types/pg/8.6.1: resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==} dependencies: - '@types/node': 20.5.0 + '@types/node': 20.5.2 pg-protocol: 1.6.0 pg-types: 2.2.0 dev: false @@ -11417,7 +11424,7 @@ packages: /@types/pg/8.6.6: resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} dependencies: - '@types/node': 20.5.0 + '@types/node': 20.5.2 pg-protocol: 1.6.0 pg-types: 2.2.0 dev: false @@ -11458,7 +11465,7 @@ packages: /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 20.5.0 + '@types/node': 20.5.2 /@types/retry/0.12.0: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} @@ -11483,7 +11490,7 @@ packages: /@types/set-cookie-parser/2.4.2: resolution: {integrity: sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w==} dependencies: - '@types/node': 20.5.0 + '@types/node': 20.5.2 dev: true /@types/shimmer/1.0.2: @@ -11512,13 +11519,13 @@ packages: /@types/tedious/4.0.9: resolution: {integrity: sha512-ipwFvfy9b2m0gjHsIX0D6NAAwGCKokzf5zJqUZHUGt+7uWVlBIy6n2eyMgiKQ8ChLFVxic/zwQUhjLYNzbHDRA==} dependencies: - '@types/node': 20.5.0 + '@types/node': 20.5.2 dev: false /@types/through/0.0.30: resolution: {integrity: sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==} dependencies: - '@types/node': 20.5.0 + '@types/node': 20.5.2 dev: true /@types/tinycolor2/1.4.3: @@ -11539,7 +11546,7 @@ packages: /@types/websocket/1.0.5: resolution: {integrity: sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==} dependencies: - '@types/node': 20.5.0 + '@types/node': 20.5.2 dev: false /@types/ws/8.5.4: @@ -11568,7 +11575,7 @@ packages: resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} requiresBuild: true dependencies: - '@types/node': 20.5.0 + '@types/node': 20.5.2 dev: false optional: true @@ -12710,7 +12717,7 @@ packages: /axios/0.26.1: resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} dependencies: - follow-redirects: 1.15.2_debug@4.3.2 + follow-redirects: 1.15.2 transitivePeerDependencies: - debug dev: false @@ -12718,7 +12725,7 @@ packages: /axios/0.27.2: resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} dependencies: - follow-redirects: 1.15.2_debug@4.3.2 + follow-redirects: 1.15.2 form-data: 4.0.0 transitivePeerDependencies: - debug @@ -12726,7 +12733,7 @@ packages: /axios/1.4.0: resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} dependencies: - follow-redirects: 1.15.2_debug@4.3.2 + follow-redirects: 1.15.2 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -12928,6 +12935,10 @@ packages: /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /base-64/0.1.0: + resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==} + dev: false + /base/0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} engines: {node: '>=0.10.0'} @@ -13579,6 +13590,10 @@ packages: /chardet/0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + /charenc/0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + dev: false + /check-error/1.0.2: resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} dev: true @@ -14108,6 +14123,10 @@ packages: shebang-command: 2.0.0 which: 2.0.2 + /crypt/0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + dev: false + /crypto-js/4.1.1: resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==} dev: false @@ -14308,6 +14327,7 @@ packages: optional: true dependencies: ms: 2.1.2 + dev: false /debug/4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -14611,6 +14631,13 @@ packages: engines: {node: '>=0.3.1'} dev: true + /digest-fetch/1.3.0: + resolution: {integrity: sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==} + dependencies: + base-64: 0.1.0 + md5: 2.3.0 + dev: false + /dir-glob/2.2.2: resolution: {integrity: sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==} engines: {node: '>=4'} @@ -15575,13 +15602,13 @@ packages: eslint: 8.31.0 dev: true - /eslint-config-turbo/1.10.12_eslint@8.31.0: - resolution: {integrity: sha512-z3jfh+D7UGYlzMWGh+Kqz++hf8LOE96q3o5R8X4HTjmxaBWlLAWG+0Ounr38h+JLR2TJno0hU9zfzoPNkR9BdA==} + /eslint-config-turbo/1.10.13_eslint@8.31.0: + resolution: {integrity: sha512-Ffa0SxkRCPMtfUX/HDanEqsWoLwZTQTAXO9W4IsOtycb2MzJDrVcLmoFW5sMwCrg7gjqbrC4ZJoD+1SPPzIVqg==} peerDependencies: eslint: '>6.6.0' dependencies: eslint: 8.31.0 - eslint-plugin-turbo: 1.10.12_eslint@8.31.0 + eslint-plugin-turbo: 1.10.13_eslint@8.31.0 dev: true /eslint-doc-generator/1.4.3_eslint@8.45.0: @@ -16324,8 +16351,8 @@ packages: - typescript dev: true - /eslint-plugin-turbo/1.10.12_eslint@8.31.0: - resolution: {integrity: sha512-uNbdj+ohZaYo4tFJ6dStRXu2FZigwulR1b3URPXe0Q8YaE7thuekKNP+54CHtZPH9Zey9dmDx5btAQl9mfzGOw==} + /eslint-plugin-turbo/1.10.13_eslint@8.31.0: + resolution: {integrity: sha512-el4AAmn0zXmvHEyp1h0IQMfse10Vy8g5Vbg4IU3+vD9CSj5sDbX07iFVt8sCKg7og9Q5FAa9mXzlCf7t4vYgzg==} peerDependencies: eslint: '>6.6.0' dependencies: @@ -16800,7 +16827,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/expect-utils': 29.6.2 - '@types/node': 20.5.0 + '@types/node': 20.5.2 jest-get-type: 29.4.3 jest-matcher-utils: 29.6.2 jest-message-util: 29.6.2 @@ -17198,7 +17225,6 @@ packages: peerDependenciesMeta: debug: optional: true - dev: false /follow-redirects/1.15.2_debug@4.3.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} @@ -17210,6 +17236,7 @@ packages: optional: true dependencies: debug: 4.3.2 + dev: false /for-each/0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -17276,6 +17303,10 @@ packages: webpack: 5.80.0_uhpfu7q6noim4yjdo6qt2aajgu dev: true + /form-data-encoder/1.7.2: + resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + dev: false + /form-data-encoder/2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} @@ -17297,7 +17328,6 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true /form-data/4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} @@ -17312,6 +17342,14 @@ packages: engines: {node: '>=0.4.x'} dev: true + /formdata-node/4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + dev: false + /formdata-polyfill/4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} @@ -19054,7 +19092,7 @@ packages: '@jest/expect': 29.6.2 '@jest/test-result': 29.6.2 '@jest/types': 29.6.1 - '@types/node': 20.5.0 + '@types/node': 20.5.2 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 @@ -19144,7 +19182,7 @@ packages: - supports-color dev: true - /jest-config/29.6.2_@types+node@20.5.0: + /jest-config/29.6.2_@types+node@20.5.2: resolution: {integrity: sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -19159,7 +19197,7 @@ packages: '@babel/core': 7.21.8 '@jest/test-sequencer': 29.6.2 '@jest/types': 29.6.1 - '@types/node': 20.5.0 + '@types/node': 20.5.2 babel-jest: 29.6.2_@babel+core@7.21.8 chalk: 4.1.2 ci-info: 3.7.1 @@ -19219,7 +19257,7 @@ packages: '@jest/environment': 29.6.2 '@jest/fake-timers': 29.6.2 '@jest/types': 29.6.1 - '@types/node': 20.5.0 + '@types/node': 20.5.2 jest-mock: 29.6.2 jest-util: 29.6.2 dev: true @@ -19235,7 +19273,7 @@ packages: dependencies: '@jest/types': 29.6.1 '@types/graceful-fs': 4.1.6 - '@types/node': 20.5.0 + '@types/node': 20.5.2 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.10 @@ -19254,7 +19292,7 @@ packages: dependencies: '@jest/types': 29.6.1 '@types/graceful-fs': 4.1.6 - '@types/node': 20.5.0 + '@types/node': 20.5.2 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.10 @@ -19368,7 +19406,7 @@ packages: '@jest/test-result': 29.6.2 '@jest/transform': 29.6.2 '@jest/types': 29.6.1 - '@types/node': 20.5.0 + '@types/node': 20.5.2 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.10 @@ -19399,7 +19437,7 @@ packages: '@jest/test-result': 29.6.2 '@jest/transform': 29.6.2 '@jest/types': 29.6.1 - '@types/node': 20.5.0 + '@types/node': 20.5.2 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 @@ -19451,7 +19489,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.1 - '@types/node': 20.5.0 + '@types/node': 20.5.2 chalk: 4.1.2 ci-info: 3.7.1 graceful-fs: 4.2.10 @@ -19476,7 +19514,7 @@ packages: dependencies: '@jest/test-result': 29.6.2 '@jest/types': 29.6.1 - '@types/node': 20.5.0 + '@types/node': 20.5.2 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -19488,7 +19526,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.5.0 + '@types/node': 20.5.2 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -19497,7 +19535,7 @@ packages: resolution: {integrity: sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.5.0 + '@types/node': 20.5.2 jest-util: 29.6.2 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -20281,6 +20319,14 @@ packages: remove-accents: 0.4.2 dev: false + /md5/2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + dev: false + /mdast-util-definitions/4.0.0: resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} dependencies: @@ -21972,6 +22018,22 @@ packages: - debug dev: false + /openai/4.2.0: + resolution: {integrity: sha512-zfvpO2eITIxIjTG8T6Cek7NB2dMvP/LW0TRUJ4P9E8+qbBNKw00DrtfF64b+fAV2+wUYCVyynT6iSycJ//TtbA==} + hasBin: true + dependencies: + '@types/node': 18.17.1 + '@types/node-fetch': 2.6.4 + abort-controller: 3.0.0 + agentkeepalive: 4.5.0 + digest-fetch: 1.3.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.6.12 + transitivePeerDependencies: + - encoding + dev: false + /openapi-fetch/0.6.2: resolution: {integrity: sha512-Faj29Kzh7oCbt1bz6vAGNKtRJlV/GolOQTx87eYUnfCK7eVXdN9jQVojroc7tcJ5OQgyhbeOqD7LS/8UtGBnMQ==} dev: false @@ -27202,6 +27264,11 @@ packages: resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} engines: {node: '>= 8'} + /web-streams-polyfill/4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + dev: false + /webidl-conversions/3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}