Browse Source

Merge branch 'feat/153989-implement-openai-client-delegator' into feat/154030-rebuild-vector-store-when-updating-page

Shun Miyazawa 1 year ago
parent
commit
b12a4c39f2

+ 1 - 0
apps/app/package.json

@@ -64,6 +64,7 @@
     "@aws-sdk/client-s3": "3.454.0",
     "@aws-sdk/client-s3": "3.454.0",
     "@aws-sdk/s3-request-presigner": "3.454.0",
     "@aws-sdk/s3-request-presigner": "3.454.0",
     "@azure/identity": "^4.4.1",
     "@azure/identity": "^4.4.1",
+    "@azure/openai": "^2.0.0-beta.2",
     "@azure/storage-blob": "^12.16.0",
     "@azure/storage-blob": "^12.16.0",
     "@browser-bunyan/console-formatted-stream": "^1.8.0",
     "@browser-bunyan/console-formatted-stream": "^1.8.0",
     "@elastic/elasticsearch7": "npm:@elastic/elasticsearch@^7.17.0",
     "@elastic/elasticsearch7": "npm:@elastic/elasticsearch@^7.17.0",

+ 5 - 4
apps/app/src/interfaces/ai.ts

@@ -1,5 +1,6 @@
-export const aiServiceType = {
-  OPEN_AI: 'openai',
+export const OpenaiServiceType = {
+  OPENAI: 'openai',
+  AZURE_OPENAI: 'azure-openai',
 } as const;
 } as const;
-
-export const aiServiceTypes = Object.values(aiServiceType);
+export type OpenaiServiceType = typeof OpenaiServiceType[keyof typeof OpenaiServiceType];
+export const OpenaiServiceTypes = Object.values(OpenaiServiceType);

+ 3 - 3
apps/app/src/server/middlewares/certify-ai-service.ts

@@ -1,6 +1,6 @@
 import type { NextFunction, Request, Response } from 'express';
 import type { NextFunction, Request, Response } from 'express';
 
 
-import { aiServiceTypes } from '~/interfaces/ai';
+import { OpenaiServiceTypes } from '~/interfaces/ai';
 import { configManager } from '~/server/service/config-manager';
 import { configManager } from '~/server/service/config-manager';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 
 
@@ -8,7 +8,7 @@ const logger = loggerFactory('growi:middlewares:certify-ai-service');
 
 
 export const certifyAiService = (req: Request, res: Response & { apiv3Err }, next: NextFunction): void => {
 export const certifyAiService = (req: Request, res: Response & { apiv3Err }, next: NextFunction): void => {
   const aiEnabled = configManager.getConfig('crowi', 'app:aiEnabled');
   const aiEnabled = configManager.getConfig('crowi', 'app:aiEnabled');
-  const aiServiceType = configManager.getConfig('crowi', 'app:aiServiceType');
+  const openaiServiceType = configManager.getConfig('crowi', 'app:openaiServiceType');
 
 
   if (!aiEnabled) {
   if (!aiEnabled) {
     const message = 'AI_ENABLED is not true';
     const message = 'AI_ENABLED is not true';
@@ -16,7 +16,7 @@ export const certifyAiService = (req: Request, res: Response & { apiv3Err }, nex
     return res.apiv3Err(message, 403);
     return res.apiv3Err(message, 403);
   }
   }
 
 
-  if (aiServiceType == null || !aiServiceTypes.includes(aiServiceType)) {
+  if (openaiServiceType == null || !OpenaiServiceTypes.includes(openaiServiceType)) {
     const message = 'AI_SERVICE_TYPE is missing or contains an invalid value';
     const message = 'AI_SERVICE_TYPE is missing or contains an invalid value';
     logger.error(message);
     logger.error(message);
     return res.apiv3Err(message, 403);
     return res.apiv3Err(message, 403);

+ 2 - 2
apps/app/src/server/service/config-loader.ts

@@ -742,9 +742,9 @@ const ENV_VAR_NAME_TO_CONFIG_INFO = {
     type: ValueType.BOOLEAN,
     type: ValueType.BOOLEAN,
     default: false,
     default: false,
   },
   },
-  AI_SERVICE_TYPE: {
+  OPENAI_SERVICE_TYPE: {
     ns: 'crowi',
     ns: 'crowi',
-    key: 'app:aiServiceType',
+    key: 'app:openaiServiceType',
     type: ValueType.STRING,
     type: ValueType.STRING,
     default: null,
     default: null,
   },
   },

+ 41 - 0
apps/app/src/server/service/openai/client-delegator/azure-openai-client-delegator.ts

@@ -0,0 +1,41 @@
+import { DefaultAzureCredential, getBearerTokenProvider } from '@azure/identity';
+import type OpenAI from 'openai';
+import { AzureOpenAI } from 'openai';
+import { type Uploadable } from 'openai/uploads';
+
+import type { IOpenaiClientDelegator } from './interfaces';
+
+
+export class AzureOpenaiClientDelegator implements IOpenaiClientDelegator {
+
+  private client: AzureOpenAI;
+
+  private openaiVectorStoreId: string;
+
+  constructor() {
+    // Retrieve Azure OpenAI related values from environment variables
+    const credential = new DefaultAzureCredential();
+    const scope = 'https://cognitiveservices.azure.com/.default';
+    const azureADTokenProvider = getBearerTokenProvider(credential, scope);
+    this.client = new AzureOpenAI({ azureADTokenProvider });
+
+    // TODO: initialize openaiVectorStoreId property
+  }
+
+  async getVectorStoreFiles(): Promise<OpenAI.Beta.VectorStores.Files.VectorStoreFilesPage> {
+    return this.client.beta.vectorStores.files.list(this.openaiVectorStoreId);
+  }
+
+  async deleteVectorStoreFiles(fileId: string): Promise<OpenAI.Beta.VectorStores.Files.VectorStoreFileDeleted> {
+    return this.client.beta.vectorStores.files.del(this.openaiVectorStoreId, fileId);
+  }
+
+  async deleteFile(fileId: string): Promise<OpenAI.Files.FileDeleted> {
+    return this.client.files.del(fileId);
+  }
+
+  async uploadAndPoll(files: Uploadable[]): Promise<OpenAI.Beta.VectorStores.FileBatches.VectorStoreFileBatch> {
+    return this.client.beta.vectorStores.fileBatches.uploadAndPoll(this.openaiVectorStoreId, { files });
+  }
+
+}

+ 33 - 0
apps/app/src/server/service/openai/client-delegator/get-client.ts

@@ -0,0 +1,33 @@
+import { OpenaiServiceType } from '~/interfaces/ai';
+
+import { AzureOpenaiClientDelegator } from './azure-openai-client-delegator';
+import type { IOpenaiClientDelegator } from './interfaces';
+import { OpenaiClientDelegator } from './openai-client-delegator';
+
+type GetDelegatorOptions = {
+  openaiServiceType: OpenaiServiceType;
+}
+
+type IsAny<T> = 'dummy' extends (T & 'dummy') ? true : false;
+type Delegator<Opts extends GetDelegatorOptions> =
+  IsAny<Opts> extends true
+    ? IOpenaiClientDelegator
+    : Opts extends { openaiServiceType: 'openai' }
+      ? OpenaiClientDelegator
+      : Opts extends { openaiServiceType: 'azure-openai' }
+        ? AzureOpenaiClientDelegator
+        : IOpenaiClientDelegator;
+
+let instance;
+
+export const getClient = <Opts extends GetDelegatorOptions>(opts: Opts): Delegator<Opts> => {
+  // instanciate the client based on the service type
+  if (instance == null) {
+    if (opts.openaiServiceType === OpenaiServiceType.AZURE_OPENAI) {
+      instance = new AzureOpenaiClientDelegator();
+    }
+    instance = new OpenaiClientDelegator();
+  }
+
+  return instance;
+};

+ 1 - 0
apps/app/src/server/service/openai/client-delegator/index.ts

@@ -0,0 +1 @@
+export * from './get-client';

+ 9 - 0
apps/app/src/server/service/openai/client-delegator/interfaces.ts

@@ -0,0 +1,9 @@
+import type OpenAI from 'openai';
+import type { Uploadable } from 'openai/uploads';
+
+export interface IOpenaiClientDelegator {
+  getVectorStoreFiles(): Promise<OpenAI.Beta.VectorStores.Files.VectorStoreFilesPage>;
+  deleteVectorStoreFiles(fileId: string): Promise<OpenAI.Beta.VectorStores.Files.VectorStoreFileDeleted>;
+  deleteFile(fileId: string): Promise<OpenAI.Files.FileDeleted>;
+  uploadAndPoll(files: Uploadable[]): Promise<OpenAI.Beta.VectorStores.FileBatches.VectorStoreFileBatch>;
+}

+ 47 - 0
apps/app/src/server/service/openai/client-delegator/openai-client-delegator.ts

@@ -0,0 +1,47 @@
+import OpenAI from 'openai';
+import { type Uploadable } from 'openai/uploads';
+
+import { configManager } from '~/server/service/config-manager';
+
+import type { IOpenaiClientDelegator } from './interfaces';
+
+
+export class OpenaiClientDelegator implements IOpenaiClientDelegator {
+
+  private client: OpenAI;
+
+  private openaiVectorStoreId: string;
+
+  constructor() {
+    // Retrieve OpenAI related values from environment variables
+    const apiKey = configManager.getConfig('crowi', 'app:openaiApiKey');
+    const vectorStoreId = configManager.getConfig('crowi', 'app:openaiVectorStoreId');
+
+    const isValid = [apiKey, vectorStoreId].every(value => value != null);
+    if (!isValid) {
+      throw new Error("Environment variables required to use OpenAI's API are not set");
+    }
+
+    this.openaiVectorStoreId = vectorStoreId;
+
+    // initialize client
+    this.client = new OpenAI({ apiKey });
+  }
+
+  async getVectorStoreFiles(): Promise<OpenAI.Beta.VectorStores.Files.VectorStoreFilesPage> {
+    return this.client.beta.vectorStores.files.list(this.openaiVectorStoreId);
+  }
+
+  async deleteVectorStoreFiles(fileId: string): Promise<OpenAI.Beta.VectorStores.Files.VectorStoreFileDeleted> {
+    return this.client.beta.vectorStores.files.del(this.openaiVectorStoreId, fileId);
+  }
+
+  async deleteFile(fileId: string): Promise<OpenAI.Files.FileDeleted> {
+    return this.client.files.del(fileId);
+  }
+
+  async uploadAndPoll(files: Uploadable[]): Promise<OpenAI.Beta.VectorStores.FileBatches.VectorStoreFileBatch> {
+    return this.client.beta.vectorStores.fileBatches.uploadAndPoll(this.openaiVectorStoreId, { files });
+  }
+
+}

+ 0 - 73
apps/app/src/server/service/openai/openai-client-delegator.ts

@@ -1,73 +0,0 @@
-import { DefaultAzureCredential, getBearerTokenProvider } from '@azure/identity';
-import OpenAI, { AzureOpenAI } from 'openai';
-import { type Uploadable } from 'openai/uploads';
-
-import { aiServiceType as serviceType, aiServiceTypes } from '~/interfaces/ai';
-import { configManager } from '~/server/service/config-manager';
-
-type Client<isOpenai = boolean> = isOpenai extends true ? OpenAI : AzureOpenAI;
-
-export default class OpenaiClient {
-
-  private client: Client<boolean>;
-
-  private openaiVectorStoreId: string;
-
-  constructor() {
-    const aiEnabled = configManager.getConfig('crowi', 'app:aiEnabled');
-    const aiServiceType = configManager.getConfig('crowi', 'app:aiServiceType');
-
-    if (!aiEnabled) {
-      throw new Error('AI_ENABLED is not true');
-    }
-
-    if (aiServiceType == null || !aiServiceTypes.includes(aiServiceType)) {
-      throw new Error('AI_SERVICE_TYPE is missing or contains an invalid value');
-    }
-
-    // Retrieve OpenAI related values from environment variables
-    if (aiServiceType === serviceType.OPEN_AI) {
-      const apiKey = configManager.getConfig('crowi', 'app:openaiApiKey');
-      const vectorStoreId = configManager.getConfig('crowi', 'app:openaiVectorStoreId');
-
-      const isValid = [apiKey, vectorStoreId].every(value => value != null);
-      if (!isValid) {
-        throw new Error("Environment variables required to use OpenAI's API are not set");
-      }
-
-      this.openaiVectorStoreId = vectorStoreId;
-
-      // initialize client
-      this.client = new OpenAI({ apiKey }) as Client<true>;
-    }
-
-    // Retrieve Azure OpenAI related values from environment variables
-    else {
-      const credential = new DefaultAzureCredential();
-      const scope = 'https://cognitiveservices.azure.com/.default';
-      const azureADTokenProvider = getBearerTokenProvider(credential, scope);
-      this.client = new AzureOpenAI({ azureADTokenProvider }) as Client<false>;
-    }
-  }
-
-  async getFileList(): Promise<OpenAI.Files.FileObjectsPage> {
-    return this.client.files.list();
-  }
-
-  async getVectorStoreFiles(): Promise<OpenAI.Beta.VectorStores.Files.VectorStoreFilesPage> {
-    return this.client.beta.vectorStores.files.list(this.openaiVectorStoreId);
-  }
-
-  async deleteVectorStoreFiles(fileId: string): Promise<OpenAI.Beta.VectorStores.Files.VectorStoreFileDeleted> {
-    return this.client.beta.vectorStores.files.del(this.openaiVectorStoreId, fileId);
-  }
-
-  async deleteFile(fileId: string): Promise<OpenAI.Files.FileDeleted> {
-    return this.client.files.del(fileId);
-  }
-
-  async uploadAndPoll(files: Uploadable[]): Promise<OpenAI.Beta.VectorStores.FileBatches.VectorStoreFileBatch> {
-    return this.client.beta.vectorStores.fileBatches.uploadAndPoll(this.openaiVectorStoreId, { files });
-  }
-
-}

+ 6 - 4
apps/app/src/server/service/openai/openai.ts

@@ -9,7 +9,7 @@ import type { PageDocument, PageModel } from '~/server/models/page';
 import { configManager } from '~/server/service/config-manager';
 import { configManager } from '~/server/service/config-manager';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 
 
-import OpenaiClient from './openai-client-delegator';
+import { getClient } from './client-delegator';
 
 
 const logger = loggerFactory('growi:service:openai');
 const logger = loggerFactory('growi:service:openai');
 
 
@@ -19,14 +19,16 @@ export interface IOpenaiService {
 }
 }
 class OpenaiService implements IOpenaiService {
 class OpenaiService implements IOpenaiService {
 
 
-  private client: OpenaiClient;
-
   constructor() {
   constructor() {
     const aiEnabled = configManager.getConfig('crowi', 'app:aiEnabled');
     const aiEnabled = configManager.getConfig('crowi', 'app:aiEnabled');
     if (!aiEnabled) {
     if (!aiEnabled) {
       return;
       return;
     }
     }
-    this.client = new OpenaiClient();
+  }
+
+  private get client() {
+    const openaiServiceType = configManager.getConfig('crowi', 'app:openaiServiceType');
+    return getClient({ openaiServiceType });
   }
   }
 
 
   async rebuildVectorStoreAll() {
   async rebuildVectorStoreAll() {

+ 79 - 0
yarn.lock

@@ -740,6 +740,18 @@
   dependencies:
   dependencies:
     tslib "^2.5.0"
     tslib "^2.5.0"
 
 
+"@azure-rest/core-client@^2.2.0":
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/@azure-rest/core-client/-/core-client-2.2.0.tgz#53d23db3a490c52a6958e396ca606e7adef1ad32"
+  integrity sha512-2uPSZPRb2TRyYONl5IcsWhX7C1xbm6Gof/tcLlDnYg7fCVcEfASfySKZ9OTHxhNeFgo79LhrT6juEoxTHvrXkQ==
+  dependencies:
+    "@azure/abort-controller" "^2.0.0"
+    "@azure/core-auth" "^1.3.0"
+    "@azure/core-rest-pipeline" "^1.5.0"
+    "@azure/core-tracing" "^1.0.1"
+    "@azure/core-util" "^1.0.0"
+    tslib "^2.6.2"
+
 "@azure/abort-controller@^1.0.0":
 "@azure/abort-controller@^1.0.0":
   version "1.1.0"
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-1.1.0.tgz#788ee78457a55af8a1ad342acb182383d2119249"
   resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-1.1.0.tgz#788ee78457a55af8a1ad342acb182383d2119249"
@@ -763,6 +775,15 @@
     "@azure/core-util" "^1.1.0"
     "@azure/core-util" "^1.1.0"
     tslib "^2.2.0"
     tslib "^2.2.0"
 
 
+"@azure/core-auth@^1.8.0":
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.8.0.tgz#281b4a6d3309c3e7b15bcd967f01d4c79ae4a1d6"
+  integrity sha512-YvFMowkXzLbXNM11yZtVLhUCmuG0ex7JKOH366ipjmHBhL3vpDcPAeWF+jf0X+jVXwFqo3UhsWUq4kH0ZPdu/g==
+  dependencies:
+    "@azure/abort-controller" "^2.0.0"
+    "@azure/core-util" "^1.1.0"
+    tslib "^2.6.2"
+
 "@azure/core-client@^1.9.2":
 "@azure/core-client@^1.9.2":
   version "1.9.2"
   version "1.9.2"
   resolved "https://registry.yarnpkg.com/@azure/core-client/-/core-client-1.9.2.tgz#6fc69cee2816883ab6c5cdd653ee4f2ff9774f74"
   resolved "https://registry.yarnpkg.com/@azure/core-client/-/core-client-1.9.2.tgz#6fc69cee2816883ab6c5cdd653ee4f2ff9774f74"
@@ -828,6 +849,20 @@
     https-proxy-agent "^5.0.0"
     https-proxy-agent "^5.0.0"
     tslib "^2.2.0"
     tslib "^2.2.0"
 
 
+"@azure/core-rest-pipeline@^1.5.0":
+  version "1.17.0"
+  resolved "https://registry.yarnpkg.com/@azure/core-rest-pipeline/-/core-rest-pipeline-1.17.0.tgz#55dafa1093553c549ed6d8dbca69aa505c7b3aa3"
+  integrity sha512-62Vv8nC+uPId3j86XJ0WI+sBf0jlqTqPUFCBNrGtlaUeQUIXWV/D8GE5A1d+Qx8H7OQojn2WguC8kChD6v0shA==
+  dependencies:
+    "@azure/abort-controller" "^2.0.0"
+    "@azure/core-auth" "^1.8.0"
+    "@azure/core-tracing" "^1.0.1"
+    "@azure/core-util" "^1.9.0"
+    "@azure/logger" "^1.0.0"
+    http-proxy-agent "^7.0.0"
+    https-proxy-agent "^7.0.0"
+    tslib "^2.6.2"
+
 "@azure/core-tracing@1.0.0-preview.13":
 "@azure/core-tracing@1.0.0-preview.13":
   version "1.0.0-preview.13"
   version "1.0.0-preview.13"
   resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz#55883d40ae2042f6f1e12b17dd0c0d34c536d644"
   resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz#55883d40ae2042f6f1e12b17dd0c0d34c536d644"
@@ -843,6 +878,14 @@
   dependencies:
   dependencies:
     tslib "^2.2.0"
     tslib "^2.2.0"
 
 
+"@azure/core-util@^1.0.0", "@azure/core-util@^1.9.0":
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/@azure/core-util/-/core-util-1.10.0.tgz#cf3163382d40343972848c914869864df5d44bdb"
+  integrity sha512-dqLWQsh9Nro1YQU+405POVtXnwrIVqPyfUzc4zXCbThTg7+vNNaiMkwbX9AMXKyoFYFClxmB3s25ZFr3+jZkww==
+  dependencies:
+    "@azure/abort-controller" "^2.0.0"
+    tslib "^2.6.2"
+
 "@azure/core-util@^1.1.0", "@azure/core-util@^1.1.1", "@azure/core-util@^1.2.0", "@azure/core-util@^1.3.0", "@azure/core-util@^1.6.1":
 "@azure/core-util@^1.1.0", "@azure/core-util@^1.1.1", "@azure/core-util@^1.2.0", "@azure/core-util@^1.3.0", "@azure/core-util@^1.6.1":
   version "1.9.0"
   version "1.9.0"
   resolved "https://registry.yarnpkg.com/@azure/core-util/-/core-util-1.9.0.tgz#469afd7e6452d5388b189f90d33f7756b0b210d1"
   resolved "https://registry.yarnpkg.com/@azure/core-util/-/core-util-1.9.0.tgz#469afd7e6452d5388b189f90d33f7756b0b210d1"
@@ -904,6 +947,14 @@
     jsonwebtoken "^9.0.0"
     jsonwebtoken "^9.0.0"
     uuid "^8.3.0"
     uuid "^8.3.0"
 
 
+"@azure/openai@^2.0.0-beta.2":
+  version "2.0.0-beta.2"
+  resolved "https://registry.yarnpkg.com/@azure/openai/-/openai-2.0.0-beta.2.tgz#67a475b5b84358e2950fa4259b33ebc73f1fa6cf"
+  integrity sha512-cElfZcBno4h3OWxZPvqqqtDUQ7jcGANlzF1oC9bigRiKe/0bAfBmOSYqPyb6Gaf+ngBVo9IWJs/5ZWNAVSvkqQ==
+  dependencies:
+    "@azure-rest/core-client" "^2.2.0"
+    tslib "^2.6.3"
+
 "@azure/storage-blob@^12.16.0":
 "@azure/storage-blob@^12.16.0":
   version "12.16.0"
   version "12.16.0"
   resolved "https://registry.yarnpkg.com/@azure/storage-blob/-/storage-blob-12.16.0.tgz#c41fb1e538d6f6e2a6756bfcc69382eededf4fa1"
   resolved "https://registry.yarnpkg.com/@azure/storage-blob/-/storage-blob-12.16.0.tgz#c41fb1e538d6f6e2a6756bfcc69382eededf4fa1"
@@ -5141,6 +5192,13 @@ agent-base@^7.0.2:
   dependencies:
   dependencies:
     debug "^4.3.4"
     debug "^4.3.4"
 
 
+agent-base@^7.1.0:
+  version "7.1.1"
+  resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317"
+  integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==
+  dependencies:
+    debug "^4.3.4"
+
 agentkeepalive@^4.2.1:
 agentkeepalive@^4.2.1:
   version "4.5.0"
   version "4.5.0"
   resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923"
   resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923"
@@ -10252,6 +10310,14 @@ http-proxy-agent@^5.0.0:
     agent-base "6"
     agent-base "6"
     debug "4"
     debug "4"
 
 
+http-proxy-agent@^7.0.0:
+  version "7.0.2"
+  resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e"
+  integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==
+  dependencies:
+    agent-base "^7.1.0"
+    debug "^4.3.4"
+
 http-signature@~1.2.0:
 http-signature@~1.2.0:
   version "1.2.0"
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
   resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
@@ -10274,6 +10340,14 @@ https-proxy-agent@^5.0.0:
     agent-base "6"
     agent-base "6"
     debug "4"
     debug "4"
 
 
+https-proxy-agent@^7.0.0:
+  version "7.0.5"
+  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2"
+  integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==
+  dependencies:
+    agent-base "^7.0.2"
+    debug "4"
+
 https-proxy-agent@^7.0.2:
 https-proxy-agent@^7.0.2:
   version "7.0.2"
   version "7.0.2"
   resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b"
   resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b"
@@ -17958,6 +18032,11 @@ tslib@^1.11.1, tslib@^1.8.1:
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
   integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
   integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
 
 
+tslib@^2.6.3:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01"
+  integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==
+
 tsscmp@1.0.6:
 tsscmp@1.0.6:
   version "1.0.6"
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb"
   resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb"